#
# 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
	---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
