#
# For a description of the syntax of this configuration file,
# see Documentation/kbuild/kconfig-language.txt.
#
# Parport configuration.
#

menuconfig PARPORT
	tristate "Parallel port support"
	depends on HAS_IOMEM
	---help---
	  If you want to use devices connected to your machine's parallel port
	  (the connector at the computer with 25 holes), e.g. printer, ZIP
	  drive, PLIP link (Parallel Line Internet Protocol is mainly used to
	  create a mini network by connecting the parallel ports of two local
	  machines) etc., then you need to say Y here; please read
	  <file:Documentation/parport.txt> and
	  <file:drivers/parport/BUGS-parport>.

	  For extensive information about drivers for many devices attaching
	  to the parallel port see <http://www.torque.net/linux-pp.html> on
	  the WWW.

	  It is possible to share a single parallel port among several devices
	  and it is safe to compile all the corresponding drivers into the
	  kernel. To compile parallel port support as a module, choose M here:
	  the module will be called parport.
	  If you have more than one parallel port and want to specify which
	  port and IRQ to be used by this driver at module load time, take a
	  look at <file:Documentation/parport.txt>.

	  If unsure, say Y.

if PARPORT

config PARPORT_PC
	tristate "PC-style hardware"
	depends on (!SPARC64 || PCI) && !SPARC32 && !M32R && !FRV && \
		(!M68K || ISA) && !MN10300 && !AVR32
	---help---
	  You should say Y here if you have a PC-style parallel port. All
	  IBM PC compatible computers and some Alphas have PC-style
	  parallel ports.  PA-RISC owners should only say Y here if they
	  have a SuperIO parallel port.

	  To compile this driver as a module, choose M here: the
	  module will be called parport_pc.

	  If unsure, say Y.

config PARPORT_SERIAL
	tristate "Multi-IO cards (parallel and serial)"
	depends on SERIAL_8250_PCI && PARPORT_PC && PCI
	help
	  This adds support for multi-IO PCI cards that have parallel and
	  serial ports.  You should say Y or M here.  If you say M, the module
	  will be called parport_serial.

config PARPORT_PC_FIFO
	bool "Use FIFO/DMA if available (EXPERIMENTAL)"
	depends on PARPORT_PC && EXPERIMENTAL
	help
	  Many parallel port chipsets provide hardware that can speed up
	  printing. Say Y here if you want to take advantage of that.

	  As well as actually having a FIFO, or DMA capability, the kernel
	  will need to know which IRQ the parallel port has.  By default,
	  parallel port interrupts will not be used, and so neither will the
	  FIFO.  See <file:Documentation/parport.txt> to find out how to
	  specify which IRQ/DMA to use.

config PARPORT_PC_SUPERIO
	bool "SuperIO chipset support (EXPERIMENTAL)"
	depends on PARPORT_PC && EXPERIMENTAL
	help
	  Saying Y here enables some probes for Super-IO chipsets in order to
	  find out things like base addresses, IRQ lines and DMA channels.  It
	  is safe to say N.

config PARPORT_PC_PCMCIA
	tristate "Support for PCMCIA management for PC-style ports"
	depends on PCMCIA && PARPORT_PC
	help
	  Say Y here if you need PCMCIA support for your PC-style parallel
	  ports. If unsure, say N.

config PARPORT_IP32
	tristate "SGI IP32 builtin port (EXPERIMENTAL)"
	depends on SGI_IP32 && EXPERIMENTAL
	select PARPORT_NOT_PC
	help
	  Say Y here if you need support for the parallel port on
	  SGI O2 machines. This code is also available as a module (say M),
	  called parport_ip32.  If in doubt, saying N is the safe plan.

config PARPORT_AMIGA
	tristate "Amiga builtin port"
	depends on AMIGA
	select PARPORT_NOT_PC
	help
	  Say Y here if you need support for the parallel port hardware on
	  Amiga machines. This code is also available as a module (say M),
	  called parport_amiga. If in doubt, saying N is the safe plan.

config PARPORT_MFC3
	tristate "Multiface III parallel port"
	depends on ZORRO
	select PARPORT_NOT_PC
	help
	  Say Y here if you need parallel port support for the MFC3 card.
	  This code is also available as a module (say M), called
	  parport_mfc3. If in doubt, saying N is the safe plan.

config PARPORT_ATARI
	tristate "Atari hardware"
	depends on ATARI
	select PARPORT_NOT_PC
	help
	  Say Y here if you need support for the parallel port hardware on
	  Atari machines. This code is also available as a module (say M),
	  called parport_atari. If in doubt, saying N is the safe plan.

config PARPORT_GSC
	tristate
	default GSC
	select PARPORT_NOT_PC

config PARPORT_SUNBPP
	tristate "Sparc hardware (EXPERIMENTAL)"
	depends on SBUS && EXPERIMENTAL
	select PARPORT_NOT_PC
	help
	  This driver provides support for the bidirectional parallel port
	  found on many Sun machines. Note that many of the newer Ultras
	  actually have pc style hardware instead.

config PARPORT_AX88796
	tristate "AX88796 Parallel Port"
	select PARPORT_NOT_PC
	help
	  Say Y here if you need support for the parallel port hardware on
	  the AX88796 network controller chip. This code is also available
	  as a module (say M), called parport_ax88796.

	  The driver is not dependant on the AX88796 network driver, and
	  should not interfere with the networking functions of the chip.

config PARPORT_1284
	bool "IEEE 1284 transfer modes"
	help
	  If you have a printer that supports status readback or device ID, or
	  want to use a device that uses enhanced parallel port transfer modes
	  such as EPP and ECP, say Y here to enable advanced IEEE 1284
	  transfer modes. Also say Y if you want device ID information to
	  appear in /proc/sys/dev/parport/*/autoprobe*. It is safe to say N.

config PARPORT_NOT_PC
	bool

endif # PARPORT
