#
# Serial device configuration
#

menu "Serial drivers"
	depends on HAS_IOMEM

#
# The new 8250/16550 serial drivers
config SERIAL_8250
	tristate "8250/16550 and compatible serial support"
	select SERIAL_CORE
	---help---
	  This selects whether you want to include the driver for the standard
	  serial ports.  The standard answer is Y.  People who might say N
	  here are those that are setting up dedicated Ethernet WWW/FTP
	  servers, or users that have one of the various bus mice instead of a
	  serial mouse and don't intend to use their machine's standard serial
	  port for anything.  (Note that the Cyclades and Stallion multi
	  serial port drivers do not need this driver built in for them to
	  work.)

	  To compile this driver as a module, choose M here: the
	  module will be called 8250.
	  [WARNING: Do not compile this driver as a module if you are using
	  non-standard serial ports, since the configuration information will
	  be lost when the driver is unloaded.  This limitation may be lifted
	  in the future.]

	  BTW1: If you have a mouseman serial mouse which is not recognized by
	  the X window system, try running gpm first.

	  BTW2: If you intend to use a software modem (also called Winmodem)
	  under Linux, forget it.  These modems are crippled and require
	  proprietary drivers which are only available under Windows.

	  Most people will say Y or M here, so that they can use serial mice,
	  modems and similar devices connecting to the standard serial ports.

config SERIAL_8250_CONSOLE
	bool "Console on 8250/16550 and compatible serial port"
	depends on SERIAL_8250=y
	select SERIAL_CORE_CONSOLE
	---help---
	  If you say Y here, it will be possible to use a serial port as the
	  system console (the system console is the device which receives all
	  kernel messages and warnings and which allows logins in single user
	  mode). This could be useful if some terminal or printer is connected
	  to that serial port.

	  Even if you say Y here, the currently visible virtual console
	  (/dev/tty0) will still be used as the system console by default, but
	  you can alter that using a kernel command line option such as
	  "console=ttyS1". (Try "man bootparam" or see the documentation of
	  your boot loader (grub or lilo or loadlin) about how to pass options
	  to the kernel at boot time.)

	  If you don't have a VGA card installed and you say Y here, the
	  kernel will automatically use the first serial line, /dev/ttyS0, as
	  system console.

	  You can set that using a kernel command line option such as
	  "console=uart8250,io,0x3f8,9600n8"
	  "console=uart8250,mmio,0xff5e0000,115200n8".
	  and it will switch to normal serial console when the corresponding 
	  port is ready.
	  "earlycon=uart8250,io,0x3f8,9600n8"
	  "earlycon=uart8250,mmio,0xff5e0000,115200n8".
	  it will not only setup early console.

	  If unsure, say N.

config FIX_EARLYCON_MEM
	bool
	depends on X86
	default y

config SERIAL_8250_GSC
	tristate
	depends on SERIAL_8250 && GSC
	default SERIAL_8250

config SERIAL_8250_PCI
	tristate "8250/16550 PCI device support" if EMBEDDED
	depends on SERIAL_8250 && PCI
	default SERIAL_8250
	help
	  This builds standard PCI serial support. You may be able to
	  disable this feature if you only need legacy serial support.
	  Saves about 9K.

config SERIAL_8250_PNP
	tristate "8250/16550 PNP device support" if EMBEDDED
	depends on SERIAL_8250 && PNP
	default SERIAL_8250
	help
	  This builds standard PNP serial support. You may be able to
	  disable this feature if you only need legacy serial support.

config SERIAL_8250_HP300
	tristate
	depends on SERIAL_8250 && HP300
	default SERIAL_8250

config SERIAL_8250_CS
	tristate "8250/16550 PCMCIA device support"
	depends on PCMCIA && SERIAL_8250
	---help---
	  Say Y here to enable support for 16-bit PCMCIA serial devices,
	  including serial port cards, modems, and the modem functions of
	  multi-function Ethernet/modem cards. (PCMCIA- or PC-cards are
	  credit-card size devices often used with laptops.)

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

	  If unsure, say N.

config SERIAL_8250_NR_UARTS
	int "Maximum number of 8250/16550 serial ports"
	depends on SERIAL_8250
	default "4"
	help
	  Set this to the number of serial ports you want the driver
	  to support.  This includes any ports discovered via ACPI or
	  PCI enumeration and any ports that may be added at run-time
	  via hot-plug, or any ISA multi-port serial cards.

config SERIAL_8250_RUNTIME_UARTS
	int "Number of 8250/16550 serial ports to register at runtime"
	depends on SERIAL_8250
	range 0 SERIAL_8250_NR_UARTS
	default "4"
	help
	  Set this to the maximum number of serial ports you want
	  the kernel to register at boot time.  This can be overridden
	  with the module parameter "nr_uarts", or boot-time parameter
	  8250.nr_uarts

config SERIAL_8250_EXTENDED
	bool "Extended 8250/16550 serial driver options"
	depends on SERIAL_8250
	help
	  If you wish to use any non-standard features of the standard "dumb"
	  driver, say Y here. This includes HUB6 support, shared serial
	  interrupts, special multiport support, support for more than the
	  four COM 1/2/3/4 boards, etc.

	  Note that the answer to this question won't directly affect the
	  kernel: saying N will just cause the configurator to skip all
	  the questions about serial driver options. If unsure, say N.

config SERIAL_8250_MANY_PORTS
	bool "Support more than 4 legacy serial ports"
	depends on SERIAL_8250_EXTENDED && !IA64
	help
	  Say Y here if you have dumb serial boards other than the four
	  standard COM 1/2/3/4 ports. This may happen if you have an AST
	  FourPort, Accent Async, Boca (read the Boca mini-HOWTO, available
	  from <http://www.tldp.org/docs.html#howto>), or other custom
	  serial port hardware which acts similar to standard serial port
	  hardware. If you only use the standard COM 1/2/3/4 ports, you can
	  say N here to save some memory. You can also say Y if you have an
	  "intelligent" multiport card such as Cyclades, Digiboards, etc.

#
# Multi-port serial cards
#

config SERIAL_8250_FOURPORT
	tristate "Support Fourport cards"
	depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS
	help
	  Say Y here if you have an AST FourPort serial board.

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

config SERIAL_8250_ACCENT
	tristate "Support Accent cards"
	depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS
	help
	  Say Y here if you have an Accent Async serial board.

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

config SERIAL_8250_BOCA
	tristate "Support Boca cards"
	depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS
	help
	  Say Y here if you have a Boca serial board.  Please read the Boca
	  mini-HOWTO, available from <http://www.tldp.org/docs.html#howto>

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

config SERIAL_8250_EXAR_ST16C554
	tristate "Support Exar ST16C554/554D Quad UART"
	depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS
	help
	  The Uplogix Envoy TU301 uses this Exar Quad UART.  If you are
	  tinkering with your Envoy TU301, or have a machine with this UART,
	  say Y here.

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

config SERIAL_8250_HUB6
	tristate "Support Hub6 cards"
	depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS
	help
	  Say Y here if you have a HUB6 serial board.

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

config SERIAL_8250_SHARE_IRQ
	bool "Support for sharing serial interrupts"
	depends on SERIAL_8250_EXTENDED
	help
	  Some serial boards have hardware support which allows multiple dumb
	  serial ports on the same board to share a single IRQ. To enable
	  support for this in the serial driver, say Y here.

config SERIAL_8250_DETECT_IRQ
	bool "Autodetect IRQ on standard ports (unsafe)"
	depends on SERIAL_8250_EXTENDED
	help
	  Say Y here if you want the kernel to try to guess which IRQ
	  to use for your serial port.

	  This is considered unsafe; it is far better to configure the IRQ in
	  a boot script using the setserial command.

	  If unsure, say N.

config SERIAL_8250_RSA
	bool "Support RSA serial ports"
	depends on SERIAL_8250_EXTENDED
	help
	  ::: To be written :::

config SERIAL_8250_MCA
	tristate "Support 8250-type ports on MCA buses"
	depends on SERIAL_8250 != n && MCA
	help
	  Say Y here if you have a MCA serial ports.

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

config SERIAL_8250_ACORN
	tristate "Acorn expansion card serial port support"
	depends on ARCH_ACORN && SERIAL_8250
	help
	  If you have an Atomwide Serial card or Serial Port card for an Acorn
	  system, say Y to this option.  The driver can handle 1, 2, or 3 port
	  cards.  If unsure, say N.

config SERIAL_8250_AU1X00
	bool "Au1x00 serial port support"
	depends on SERIAL_8250 != n && SOC_AU1X00
	help
	  If you have an Au1x00 SOC based board and want to use the serial port,
	  say Y to this option. The driver can handle up to 4 serial ports,
	  depending on the SOC. If unsure, say N.

config SERIAL_8250_RM9K
	bool "Support for MIPS RM9xxx integrated serial port"
	depends on SERIAL_8250 != n && SERIAL_RM9000
	select SERIAL_8250_SHARE_IRQ
	help
	  Selecting this option will add support for the integrated serial
	  port hardware found on MIPS RM9122 and similar processors.
	  If unsure, say N.

comment "Non-8250 serial port support"

config SERIAL_AMBA_PL010
	tristate "ARM AMBA PL010 serial port support"
	depends on ARM_AMBA && (BROKEN || !ARCH_VERSATILE)
	select SERIAL_CORE
	help
	  This selects the ARM(R) AMBA(R) PrimeCell PL010 UART.  If you have
	  an Integrator/AP or Integrator/PP2 platform, or if you have a
	  Cirrus Logic EP93xx CPU, say Y or M here.

	  If unsure, say N.

config SERIAL_AMBA_PL010_CONSOLE
	bool "Support for console on AMBA serial port"
	depends on SERIAL_AMBA_PL010=y
	select SERIAL_CORE_CONSOLE
	---help---
	  Say Y here if you wish to use an AMBA PrimeCell UART as the system
	  console (the system console is the device which receives all kernel
	  messages and warnings and which allows logins in single user mode).

	  Even if you say Y here, the currently visible framebuffer console
	  (/dev/tty0) will still be used as the system console by default, but
	  you can alter that using a kernel command line option such as
	  "console=ttyAM0". (Try "man bootparam" or see the documentation of
	  your boot loader (lilo or loadlin) about how to pass options to the
	  kernel at boot time.)

config SERIAL_AMBA_PL011
	tristate "ARM AMBA PL011 serial port support"
	depends on ARM_AMBA
	select SERIAL_CORE
	help
	  This selects the ARM(R) AMBA(R) PrimeCell PL011 UART.  If you have
	  an Integrator/PP2, Integrator/CP or Versatile platform, say Y or M
	  here.

	  If unsure, say N.

config SERIAL_AMBA_PL011_CONSOLE
	bool "Support for console on AMBA serial port"
	depends on SERIAL_AMBA_PL011=y
	select SERIAL_CORE_CONSOLE
	---help---
	  Say Y here if you wish to use an AMBA PrimeCell UART as the system
	  console (the system console is the device which receives all kernel
	  messages and warnings and which allows logins in single user mode).

	  Even if you say Y here, the currently visible framebuffer console
	  (/dev/tty0) will still be used as the system console by default, but
	  you can alter that using a kernel command line option such as
	  "console=ttyAMA0". (Try "man bootparam" or see the documentation of
	  your boot loader (lilo or loadlin) about how to pass options to the
	  kernel at boot time.)

config SERIAL_SB1250_DUART
	tristate "BCM1xxx on-chip DUART serial support"
	depends on SIBYTE_SB1xxx_SOC=y
	select SERIAL_CORE
	default y
	---help---
	  Support for the asynchronous serial interface (DUART) included in
	  the BCM1250 and derived System-On-a-Chip (SOC) devices.  Note that
	  the letter D in DUART stands for "dual", which is how the device
	  is implemented.  Depending on the SOC configuration there may be
	  one or more DUARTs available of which all are handled.

	  If unsure, say Y.  To compile this driver as a module, choose M here:
	  the module will be called sb1250-duart.

config SERIAL_SB1250_DUART_CONSOLE
	bool "Support for console on a BCM1xxx DUART serial port"
	depends on SERIAL_SB1250_DUART=y
	select SERIAL_CORE_CONSOLE
	default y
	---help---
	  If you say Y here, it will be possible to use a serial port as the
	  system console (the system console is the device which receives all
	  kernel messages and warnings and which allows logins in single user
	  mode).

	  If unsure, say Y.

config SERIAL_ATMEL
	bool "AT91 / AT32 on-chip serial port support"
	depends on (ARM && ARCH_AT91) || AVR32
	select SERIAL_CORE
	help
	  This enables the driver for the on-chip UARTs of the Atmel
	  AT91 and AT32 processors.

config SERIAL_ATMEL_CONSOLE
	bool "Support for console on AT91 / AT32 serial port"
	depends on SERIAL_ATMEL=y
	select SERIAL_CORE_CONSOLE
	help
	  Say Y here if you wish to use an on-chip UART on a Atmel
	  AT91 or AT32 processor as the system console (the system
	  console is the device which receives all kernel messages and
	  warnings and which allows logins in single user mode).

config SERIAL_ATMEL_PDC
	bool "Support DMA transfers on AT91 / AT32 serial port"
	depends on SERIAL_ATMEL
	default y
	help
	  Say Y here if you wish to use the PDC to do DMA transfers to
	  and from the Atmel AT91 / AT32 serial port. In order to
	  actually use DMA transfers, make sure that the use_dma_tx
	  and use_dma_rx members in the atmel_uart_data struct is set
	  appropriately for each port.

	  Note that break and error handling currently doesn't work
	  properly when DMA is enabled. Make sure that ports where
	  this matters don't use DMA.

config SERIAL_ATMEL_TTYAT
	bool "Install as device ttyATn instead of ttySn"
	depends on SERIAL_ATMEL=y
	help
	  Say Y here if you wish to have the internal AT91 / AT32 UARTs
	  appear as /dev/ttyATn (major 204, minor starting at 154)
	  instead of the normal /dev/ttySn (major 4, minor starting at
	  64). This is necessary if you also want other UARTs, such as
	  external 8250/16C550 compatible UARTs.
	  The ttySn nodes are legally reserved for the 8250 serial driver
	  but are often misused by other serial drivers.

	  To use this, you should create suitable ttyATn device nodes in
	  /dev/, and pass "console=ttyATn" to the kernel.

	  Say Y if you have an external 8250/16C550 UART.  If unsure, say N.

config SERIAL_KS8695
	bool "Micrel KS8695 (Centaur) serial port support"
	depends on ARCH_KS8695
	select SERIAL_CORE
	help
	  This selects the Micrel Centaur KS8695 UART.  Say Y here.

config SERIAL_KS8695_CONSOLE
	bool "Support for console on KS8695 (Centaur) serial port"
	depends on SERIAL_KS8695=y
	select SERIAL_CORE_CONSOLE
	help
	  Say Y here if you wish to use a KS8695 (Centaur) UART as the
	  system console (the system console is the device which
	  receives all kernel messages and warnings and which allows
	  logins in single user mode).

config SERIAL_CLPS711X
	tristate "CLPS711X serial port support"
	depends on ARM && ARCH_CLPS711X
	select SERIAL_CORE
	help
	  ::: To be written :::

config SERIAL_CLPS711X_CONSOLE
	bool "Support for console on CLPS711X serial port"
	depends on SERIAL_CLPS711X=y
	select SERIAL_CORE_CONSOLE
	help
	  Even if you say Y here, the currently visible virtual console
	  (/dev/tty0) will still be used as the system console by default, but
	  you can alter that using a kernel command line option such as
	  "console=ttyCL1". (Try "man bootparam" or see the documentation of
	  your boot loader (lilo or loadlin) about how to pass options to the
	  kernel at boot time.)

config SERIAL_SAMSUNG
	tristate "Samsung SoC serial support"
	depends on ARM && PLAT_S3C24XX
	select SERIAL_CORE
	help
	  Support for the on-chip UARTs on the Samsung S3C24XX series CPUs,
	  providing /dev/ttySAC0, 1 and 2 (note, some machines may not
	  provide all of these ports, depending on how the serial port
	  pins are configured.

config SERIAL_SAMSUNG_DEBUG
	bool "Samsung SoC serial debug"
	depends on SERIAL_SAMSUNG && DEBUG_LL
	help
	  Add support for debugging the serial driver. Since this is
	  generally being used as a console, we use our own output
	  routines that go via the low-level debug printascii()
	  function.

config SERIAL_SAMSUNG_CONSOLE
	bool "Support for console on Samsung SoC serial port"
	depends on SERIAL_SAMSUNG=y
	select SERIAL_CORE_CONSOLE
	help
	  Allow selection of the S3C24XX on-board serial ports for use as
	  an virtual console.

	  Even if you say Y here, the currently visible virtual console
	  (/dev/tty0) will still be used as the system console by default, but
	  you can alter that using a kernel command line option such as
	  "console=ttySACx". (Try "man bootparam" or see the documentation of
	  your boot loader about how to pass options to the kernel at
	  boot time.)

config SERIAL_S3C2400
	tristate "Samsung S3C2410 Serial port support"
	depends on ARM && SERIAL_SAMSUNG && CPU_S3C2400
	default y if CPU_S3C2400
	help
	  Serial port support for the Samsung S3C2400 SoC

config SERIAL_S3C2410
	tristate "Samsung S3C2410 Serial port support"
	depends on SERIAL_SAMSUNG && CPU_S3C2410
	default y if CPU_S3C2410
	help
	  Serial port support for the Samsung S3C2410 SoC

config SERIAL_S3C2412
	tristate "Samsung S3C2412/S3C2413 Serial port support"
	depends on SERIAL_SAMSUNG && CPU_S3C2412
	default y if CPU_S3C2412
	help
	  Serial port support for the Samsung S3C2412 and S3C2413 SoC

config SERIAL_S3C2440
	tristate "Samsung S3C2440/S3C2442 Serial port support"
	depends on SERIAL_SAMSUNG && (CPU_S3C2440 || CPU_S3C2442)
	default y if CPU_S3C2440
	default y if CPU_S3C2442
	help
	  Serial port support for the Samsung S3C2440 and S3C2442 SoC

config SERIAL_S3C24A0
	tristate "Samsung S3C24A0 Serial port support"
	depends on SERIAL_SAMSUNG && CPU_S3C24A0
	default y if CPU_S3C24A0
	help
	  Serial port support for the Samsung S3C24A0 SoC

config SERIAL_DZ
	bool "DECstation DZ serial driver"
	depends on MACH_DECSTATION && 32BIT
	select SERIAL_CORE
	default y
	---help---
	  DZ11-family serial controllers for DECstations and VAXstations,
	  including the DC7085, M7814, and M7819.

config SERIAL_DZ_CONSOLE
	bool "Support console on DECstation DZ serial driver"
	depends on SERIAL_DZ=y
	select SERIAL_CORE_CONSOLE
	default y
	---help---
	  If you say Y here, it will be possible to use a serial port as the
	  system console (the system console is the device which receives all
	  kernel messages and warnings and which allows logins in single user
	  mode).

	  Note that the firmware uses ttyS3 as the serial console on
	  DECstations that use this driver.

	  If unsure, say Y.

config SERIAL_ZS
	tristate "DECstation Z85C30 serial support"
	depends on MACH_DECSTATION
	select SERIAL_CORE
	default y
	---help---
	  Support for the Zilog 85C350 serial communications controller used
	  for serial ports in newer DECstation systems.  These include the
	  DECsystem 5900 and all models of the DECstation and DECsystem 5000
	  systems except from model 200.

	  If unsure, say Y.  To compile this driver as a module, choose M here:
	  the module will be called zs.

config SERIAL_ZS_CONSOLE
	bool "Support for console on a DECstation Z85C30 serial port"
	depends on SERIAL_ZS=y
	select SERIAL_CORE_CONSOLE
	default y
	---help---
	  If you say Y here, it will be possible to use a serial port as the
	  system console (the system console is the device which receives all
	  kernel messages and warnings and which allows logins in single user
	  mode).

	  Note that the firmware uses ttyS1 as the serial console on the
	  Maxine and ttyS3 on the others using this driver.

	  If unsure, say Y.

config SERIAL_21285
	tristate "DC21285 serial port support"
	depends on ARM && FOOTBRIDGE
	select SERIAL_CORE
	help
	  If you have a machine based on a 21285 (Footbridge) StrongARM(R)/
	  PCI bridge you can enable its onboard serial port by enabling this
	  option.

config SERIAL_21285_CONSOLE
	bool "Console on DC21285 serial port"
	depends on SERIAL_21285=y
	select SERIAL_CORE_CONSOLE
	help
	  If you have enabled the serial port on the 21285 footbridge you can
	  make it the console by answering Y to this option.

	  Even if you say Y here, the currently visible virtual console
	  (/dev/tty0) will still be used as the system console by default, but
	  you can alter that using a kernel command line option such as
	  "console=ttyFB". (Try "man bootparam" or see the documentation of
	  your boot loader (lilo or loadlin) about how to pass options to the
	  kernel at boot time.)

config SERIAL_MPSC
	bool "Marvell MPSC serial port support"
	depends on PPC32 && MV64X60
	select SERIAL_CORE
	help
	  Say Y here if you want to use the Marvell MPSC serial controller.

config SERIAL_MPSC_CONSOLE
	bool "Support for console on Marvell MPSC serial port"
	depends on SERIAL_MPSC
	select SERIAL_CORE_CONSOLE
	help
	  Say Y here if you want to support a serial console on a Marvell MPSC.

config SERIAL_PXA
	bool "PXA serial port support"
	depends on ARM && ARCH_PXA
	select SERIAL_CORE
	help
	  If you have a machine based on an Intel XScale PXA2xx CPU you
	  can enable its onboard serial ports by enabling this option.

config SERIAL_PXA_CONSOLE
	bool "Console on PXA serial port"
	depends on SERIAL_PXA
	select SERIAL_CORE_CONSOLE
	help
	  If you have enabled the serial port on the Intel XScale PXA
	  CPU you can make it the console by answering Y to this option.

	  Even if you say Y here, the currently visible virtual console
	  (/dev/tty0) will still be used as the system console by default, but
	  you can alter that using a kernel command line option such as
	  "console=ttySA0". (Try "man bootparam" or see the documentation of
	  your boot loader (lilo or loadlin) about how to pass options to the
	  kernel at boot time.)

config SERIAL_SA1100
	bool "SA1100 serial port support"
	depends on ARM && ARCH_SA1100
	select SERIAL_CORE
	help
	  If you have a machine based on a SA1100/SA1110 StrongARM(R) CPU you
	  can enable its onboard serial port by enabling this option.
	  Please read <file:Documentation/arm/SA1100/serial_UART> for further
	  info.

config SERIAL_SA1100_CONSOLE
	bool "Console on SA1100 serial port"
	depends on SERIAL_SA1100
	select SERIAL_CORE_CONSOLE
	help
	  If you have enabled the serial port on the SA1100/SA1110 StrongARM
	  CPU you can make it the console by answering Y to this option.

	  Even if you say Y here, the currently visible virtual console
	  (/dev/tty0) will still be used as the system console by default, but
	  you can alter that using a kernel command line option such as
	  "console=ttySA0". (Try "man bootparam" or see the documentation of
	  your boot loader (lilo or loadlin) about how to pass options to the
	  kernel at boot time.)

config SERIAL_BFIN
	tristate "Blackfin serial port support"
	depends on BLACKFIN
	select SERIAL_CORE
	select SERIAL_BFIN_UART0 if (BF531 || BF532 || BF533 || BF561)
	help
	  Add support for the built-in UARTs on the Blackfin.

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

config SERIAL_BFIN_CONSOLE
	bool "Console on Blackfin serial port"
	depends on SERIAL_BFIN=y
	select SERIAL_CORE_CONSOLE

choice
	prompt "UART Mode"
	depends on SERIAL_BFIN
	default SERIAL_BFIN_DMA
	help
	  This driver supports the built-in serial ports of the Blackfin family
	  of CPUs

config SERIAL_BFIN_DMA
	bool "DMA mode"
	depends on !DMA_UNCACHED_NONE && !KGDB_UART
	help
	  This driver works under DMA mode. If this option is selected, the
	  blackfin simple dma driver is also enabled.

config SERIAL_BFIN_PIO
	bool "PIO mode"
	help
	  This driver works under PIO mode.

endchoice

config SERIAL_BFIN_UART0
	bool "Enable UART0"
	depends on SERIAL_BFIN
	help
	  Enable UART0

config BFIN_UART0_CTSRTS
	bool "Enable UART0 hardware flow control"
	depends on SERIAL_BFIN_UART0
	help
	  Enable hardware flow control in the driver. Using GPIO emulate the CTS/RTS
	  signal.

config UART0_CTS_PIN
	int "UART0 CTS pin"
	depends on BFIN_UART0_CTSRTS
	default 23
	help
	  The default pin is GPIO_GP7.
	  Refer to ./include/asm-blackfin/gpio.h to see the GPIO map.

config UART0_RTS_PIN
	int "UART0 RTS pin"
	depends on BFIN_UART0_CTSRTS
	default 22
	help
	  The default pin is GPIO_GP6.
	  Refer to ./include/asm-blackfin/gpio.h to see the GPIO map.

config SERIAL_BFIN_UART1
	bool "Enable UART1"
	depends on SERIAL_BFIN && (!BF531 && !BF532 && !BF533 && !BF561)
	help
	  Enable UART1

config BFIN_UART1_CTSRTS
	bool "Enable UART1 hardware flow control"
	depends on SERIAL_BFIN_UART1
	help
	  Enable hardware flow control in the driver. Using GPIO emulate the CTS/RTS
	  signal.

config UART1_CTS_PIN
	int "UART1 CTS pin"
	depends on BFIN_UART1_CTSRTS && !BF54x
	default -1
	help
	  Refer to ./include/asm-blackfin/gpio.h to see the GPIO map.

config UART1_RTS_PIN
	int "UART1 RTS pin"
	depends on BFIN_UART1_CTSRTS && !BF54x
	default -1
	help
	  Refer to ./include/asm-blackfin/gpio.h to see the GPIO map.

config SERIAL_BFIN_UART2
	bool "Enable UART2"
	depends on SERIAL_BFIN && (BF54x)
	help
	  Enable UART2

config BFIN_UART2_CTSRTS
	bool "Enable UART2 hardware flow control"
	depends on SERIAL_BFIN_UART2
	help
	  Enable hardware flow control in the driver. Using GPIO emulate the CTS/RTS
	  signal.

config UART2_CTS_PIN
	int "UART2 CTS pin"
	depends on BFIN_UART2_CTSRTS
	default -1
	help
	  Refer to ./include/asm-blackfin/gpio.h to see the GPIO map.

config UART2_RTS_PIN
	int "UART2 RTS pin"
	depends on BFIN_UART2_CTSRTS
	default -1
	help
	  Refer to ./include/asm-blackfin/gpio.h to see the GPIO map.

config SERIAL_BFIN_UART3
	bool "Enable UART3"
	depends on SERIAL_BFIN && (BF54x)
	help
	  Enable UART3

config BFIN_UART3_CTSRTS
	bool "Enable UART3 hardware flow control"
	depends on SERIAL_BFIN_UART3
	help
	  Enable hardware flow control in the driver. Using GPIO emulate the CTS/RTS
	  signal.

config SERIAL_IMX
	bool "IMX serial port support"
	depends on ARM && (ARCH_IMX || ARCH_MXC)
	select SERIAL_CORE
	help
	  If you have a machine based on a Motorola IMX CPU you
	  can enable its onboard serial port by enabling this option.

config SERIAL_IMX_CONSOLE
	bool "Console on IMX serial port"
	depends on SERIAL_IMX
	select SERIAL_CORE_CONSOLE
	help
	  If you have enabled the serial port on the Motorola IMX
	  CPU you can make it the console by answering Y to this option.

	  Even if you say Y here, the currently visible virtual console
	  (/dev/tty0) will still be used as the system console by default, but
	  you can alter that using a kernel command line option such as
	  "console=ttySA0". (Try "man bootparam" or see the documentation of
	  your boot loader (lilo or loadlin) about how to pass options to the
	  kernel at boot time.)

config SERIAL_UARTLITE
	tristate "Xilinx uartlite serial port support"
	depends on PPC32
	select SERIAL_CORE
	help
	  Say Y here if you want to use the Xilinx uartlite serial controller.

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

config SERIAL_UARTLITE_CONSOLE
	bool "Support for console on Xilinx uartlite serial port"
	depends on SERIAL_UARTLITE=y
	select SERIAL_CORE_CONSOLE
	help
	  Say Y here if you wish to use a Xilinx uartlite as the system
	  console (the system console is the device which receives all kernel
	  messages and warnings and which allows logins in single user mode).

config SERIAL_SUNCORE
	bool
	depends on SPARC
	select SERIAL_CORE
	select SERIAL_CORE_CONSOLE
	default y

config SERIAL_SUNZILOG
	tristate "Sun Zilog8530 serial support"
	depends on SPARC
	help
	  This driver supports the Zilog8530 serial ports found on many Sparc
	  systems.  Say Y or M if you want to be able to these serial ports.

config SERIAL_SUNZILOG_CONSOLE
	bool "Console on Sun Zilog8530 serial port"
	depends on SERIAL_SUNZILOG=y
	help
	  If you would like to be able to use the Zilog8530 serial port
	  on your Sparc system as the console, you can do so by answering
	  Y to this option.

config SERIAL_SUNSU
	tristate "Sun SU serial support"
	depends on SPARC && PCI
	help
	  This driver supports the 8250 serial ports that run the keyboard and
	  mouse on (PCI) UltraSPARC systems.  Say Y or M if you want to be able
	  to these serial ports.

config SERIAL_SUNSU_CONSOLE
	bool "Console on Sun SU serial port"
	depends on SERIAL_SUNSU=y
	help
	  If you would like to be able to use the SU serial port
	  on your Sparc system as the console, you can do so by answering
	  Y to this option.

config SERIAL_MUX
	tristate "Serial MUX support"
	depends on GSC
	select SERIAL_CORE
	default y
	---help---
	  Saying Y here will enable the hardware MUX serial driver for
	  the Nova, K class systems and D class with a 'remote control card'.
	  The hardware MUX is not 8250/16550 compatible therefore the
	  /dev/ttyB0 device is shared between the Serial MUX and the PDC
	  software console. The following steps need to be completed to use
	  the Serial MUX:

	    1. create the device entry (mknod /dev/ttyB0 c 11 0)
	    2. Edit the /etc/inittab to start a getty listening on /dev/ttyB0
	    3. Add device ttyB0 to /etc/securetty (if you want to log on as
		 root on this console.)
	    4. Change the kernel command console parameter to: console=ttyB0

config SERIAL_MUX_CONSOLE
	bool "Support for console on serial MUX"
	depends on SERIAL_MUX=y
	select SERIAL_CORE_CONSOLE
	default y

config PDC_CONSOLE
	bool "PDC software console support"
	depends on PARISC && !SERIAL_MUX && VT
	default n
	help
	  Saying Y here will enable the software based PDC console to be 
	  used as the system console.  This is useful for machines in 
	  which the hardware based console has not been written yet.  The
	  following steps must be competed to use the PDC console:

	    1. create the device entry (mknod /dev/ttyB0 c 11 0)
	    2. Edit the /etc/inittab to start a getty listening on /dev/ttyB0
	    3. Add device ttyB0 to /etc/securetty (if you want to log on as
		 root on this console.)
	    4. Change the kernel command console parameter to: console=ttyB0

config SERIAL_SUNSAB
	tristate "Sun Siemens SAB82532 serial support"
	depends on SPARC && PCI
	help
	  This driver supports the Siemens SAB82532 DUSCC serial ports on newer
	  (PCI) UltraSPARC systems.  Say Y or M if you want to be able to these
	  serial ports.

config SERIAL_SUNSAB_CONSOLE
	bool "Console on Sun Siemens SAB82532 serial port"
	depends on SERIAL_SUNSAB=y
	help
	  If you would like to be able to use the SAB82532 serial port
	  on your Sparc system as the console, you can do so by answering
	  Y to this option.

config SERIAL_SUNHV
	bool "Sun4v Hypervisor Console support"
	depends on SPARC64
	help
	  This driver supports the console device found on SUN4V Sparc
	  systems.  Say Y if you want to be able to use this device.

config SERIAL_IP22_ZILOG
	tristate "SGI Zilog8530 serial support"
	depends on SGI_HAS_ZILOG
	select SERIAL_CORE
	help
	  This driver supports the Zilog8530 serial ports found on SGI
	  systems.  Say Y or M if you want to be able to these serial ports.

config SERIAL_IP22_ZILOG_CONSOLE
	bool "Console on SGI Zilog8530 serial port"
	depends on SERIAL_IP22_ZILOG=y
	select SERIAL_CORE_CONSOLE

config SERIAL_SH_SCI
	tristate "SuperH SCI(F) serial port support"
	depends on SUPERH || H8300
	select SERIAL_CORE

config SERIAL_SH_SCI_NR_UARTS
	int "Maximum number of SCI(F) serial ports"
	depends on SERIAL_SH_SCI
	default "2"

config SERIAL_SH_SCI_CONSOLE
	bool "Support for console on SuperH SCI(F)"
	depends on SERIAL_SH_SCI=y
	select SERIAL_CORE_CONSOLE

config SERIAL_PNX8XXX
	bool "Enable PNX8XXX SoCs' UART Support"
	depends on MIPS && SOC_PNX8550
	select SERIAL_CORE
	help
	  If you have a MIPS-based Philips SoC such as PNX8550 or PNX8330
	  and you want to use serial ports, say Y.  Otherwise, say N.

config SERIAL_PNX8XXX_CONSOLE
	bool "Enable PNX8XX0 serial console"
	depends on SERIAL_PNX8XXX
	select SERIAL_CORE_CONSOLE
	help
	  If you have a MIPS-based Philips SoC such as PNX8550 or PNX8330
	  and you want to use serial console, say Y. Otherwise, say N.

config SERIAL_CORE
	tristate

config SERIAL_CORE_CONSOLE
	bool

config CONSOLE_POLL
	bool

config SERIAL_68328
	bool "68328 serial support"
	depends on M68328 || M68EZ328 || M68VZ328
	help
	  This driver supports the built-in serial port of the Motorola 68328
	  (standard, EZ and VZ varieties).

config SERIAL_68328_RTS_CTS
	bool "Support RTS/CTS on 68328 serial port"
	depends on SERIAL_68328

config SERIAL_MCF
	bool "Coldfire serial support"
	depends on COLDFIRE
	select SERIAL_CORE
	help
	  This serial driver supports the Freescale Coldfire serial ports.

config SERIAL_MCF_BAUDRATE
	int "Default baudrate for Coldfire serial ports"
	depends on SERIAL_MCF
	default 19200
	help
	  This setting lets you define what the default baudrate is for the
	  ColdFire serial ports. The usual default varies from board to board,
	  and this setting is a way of catering for that.

config SERIAL_MCF_CONSOLE
	bool "Coldfire serial console support"
	depends on SERIAL_MCF
	select SERIAL_CORE_CONSOLE
	help
	  Enable a ColdFire internal serial port to be the system console.

config SERIAL_68360_SMC
	bool "68360 SMC uart support"
	depends on M68360
	help
	  This driver supports the SMC serial ports of the Motorola 68360 CPU.

config SERIAL_68360_SCC
	bool "68360 SCC uart support"
	depends on M68360
	help
	  This driver supports the SCC serial ports of the Motorola 68360 CPU.

config SERIAL_68360
	bool
	depends on SERIAL_68360_SMC || SERIAL_68360_SCC
	default y

config SERIAL_PMACZILOG
	tristate "PowerMac z85c30 ESCC support"
	depends on PPC_OF && PPC_PMAC
	select SERIAL_CORE
	help
	  This driver supports the Zilog z85C30 serial ports found on
	  PowerMac machines.
	  Say Y or M if you want to be able to these serial ports.

config SERIAL_PMACZILOG_TTYS
	bool "Use ttySn device nodes for Zilog z85c30"
	depends on SERIAL_PMACZILOG
	help
	  The pmac_zilog driver for the z85C30 chip on many powermacs
	  historically used the device numbers for /dev/ttySn.  The
	  8250 serial port driver also uses these numbers, which means
	  the two drivers being unable to coexist; you could not use
	  both z85C30 and 8250 type ports at the same time.

	  If this option is not selected, the pmac_zilog driver will
	  use the device numbers allocated for /dev/ttyPZn.  This allows
	  the pmac_zilog and 8250 drivers to co-exist, but may cause
	  existing userspace setups to break.  Programs that need to
	  access the built-in serial ports on powermacs will need to
	  be reconfigured to use /dev/ttyPZn instead of /dev/ttySn.

	  If you enable this option, any z85c30 ports in the system will
	  be registered as ttyS0 onwards as in the past, and you will be
	  unable to use the 8250 module for PCMCIA or other 16C550-style
	  UARTs.

	  Say N unless you need the z85c30 ports on your powermac
	  to appear as /dev/ttySn.

config SERIAL_PMACZILOG_CONSOLE
	bool "Console on PowerMac z85c30 serial port"
	depends on SERIAL_PMACZILOG=y
	select SERIAL_CORE_CONSOLE
	help
	  If you would like to be able to use the z85c30 serial port
	  on your PowerMac as the console, you can do so by answering
	  Y to this option.

config SERIAL_LH7A40X
	tristate "Sharp LH7A40X embedded UART support"
	depends on ARM && ARCH_LH7A40X
	select SERIAL_CORE
	help
	  This enables support for the three on-board UARTs of the
	  Sharp LH7A40X series CPUs.  Choose Y or M.

config SERIAL_LH7A40X_CONSOLE
	bool "Support for console on Sharp LH7A40X serial port"
	depends on SERIAL_LH7A40X=y
	select SERIAL_CORE_CONSOLE
	help
	  Say Y here if you wish to use one of the serial ports as the
	  system console--the system console is the device which
	  receives all kernel messages and warnings and which allows
	  logins in single user mode.

	  Even if you say Y here, the currently visible framebuffer console
	  (/dev/tty0) will still be used as the default system console, but
	  you can alter that using a kernel command line, for example
	  "console=ttyAM1".

config SERIAL_CPM
	tristate "CPM SCC/SMC serial port support"
	depends on CPM2 || 8xx
	select SERIAL_CORE
	help
	  This driver supports the SCC and SMC serial ports on Motorola 
	  embedded PowerPC that contain a CPM1 (8xx) or CPM2 (8xxx)

config SERIAL_CPM_CONSOLE
	bool "Support for console on CPM SCC/SMC serial port"
	depends on SERIAL_CPM=y
	select SERIAL_CORE_CONSOLE
	help
	  Say Y here if you wish to use a SCC or SMC CPM UART as the system
	  console (the system console is the device which receives all kernel
	  messages and warnings and which allows logins in single user mode).

	  Even if you say Y here, the currently visible framebuffer console
	  (/dev/tty0) will still be used as the system console by default, but
	  you can alter that using a kernel command line option such as
	  "console=ttyCPM0". (Try "man bootparam" or see the documentation of
	  your boot loader (lilo or loadlin) about how to pass options to the
	  kernel at boot time.)

config SERIAL_SGI_L1_CONSOLE
	bool "SGI Altix L1 serial console support"
	depends on IA64_GENERIC || IA64_SGI_SN2
	select SERIAL_CORE
	select SERIAL_CORE_CONSOLE
	help
		If you have an SGI Altix and you would like to use the system
		controller serial port as your console (you want this!),
		say Y.  Otherwise, say N.

config SERIAL_MPC52xx
	tristate "Freescale MPC52xx/MPC512x family PSC serial support"
	depends on PPC_MPC52xx || PPC_MPC512x
	select SERIAL_CORE
	help
	  This driver supports MPC52xx and MPC512x PSC serial ports. If you would
	  like to use them, you must answer Y or M to this option. Note that
	  for use as console, it must be included in kernel and not as a
	  module.

config SERIAL_MPC52xx_CONSOLE
	bool "Console on a Freescale MPC52xx/MPC512x family PSC serial port"
	depends on SERIAL_MPC52xx=y
	select SERIAL_CORE_CONSOLE
	help
	  Select this options if you'd like to use one of the PSC serial port
	  of the Freescale MPC52xx family as a console.

config SERIAL_MPC52xx_CONSOLE_BAUD
	int "Freescale MPC52xx/MPC512x family PSC serial port baud"
	depends on SERIAL_MPC52xx_CONSOLE=y
	default "9600"
	help
	  Select the MPC52xx console baud rate.
	  This value is only used if the bootloader doesn't pass in the
	  console baudrate

config SERIAL_ICOM
	tristate "IBM Multiport Serial Adapter"
	depends on PCI && (PPC_ISERIES || PPC_PSERIES)
	select SERIAL_CORE
	select FW_LOADER
	help
	  This driver is for a family of multiport serial adapters
	  including 2 port RVX, 2 port internal modem, 4 port internal
	  modem and a split 1 port RVX and 1 port internal modem.

	  This driver can also be built as a module.  If so, the module
	  will be called icom.

config SERIAL_M32R_SIO
	bool "M32R SIO I/F"
	depends on M32R
	default y
	select SERIAL_CORE
	help
	  Say Y here if you want to use the M32R serial controller.

config SERIAL_M32R_SIO_CONSOLE
	bool "use SIO console"
	depends on SERIAL_M32R_SIO=y
	select SERIAL_CORE_CONSOLE
	help
	  Say Y here if you want to support a serial console.

	  If you use an M3T-M32700UT or an OPSPUT platform,
	  please say also y for SERIAL_M32R_PLDSIO.

config SERIAL_M32R_PLDSIO
	bool "M32R SIO I/F on a PLD"
	depends on SERIAL_M32R_SIO=y && (PLAT_OPSPUT || PLAT_USRV || PLAT_M32700UT)
	default n
	help
	  Say Y here if you want to use the M32R serial controller
	  on a PLD (Programmable Logic Device).

	  If you use an M3T-M32700UT or an OPSPUT platform,
	  please say Y.

config SERIAL_TXX9
	bool "TMPTX39XX/49XX SIO support"
	depends on HAS_TXX9_SERIAL
	select SERIAL_CORE
	default y

config HAS_TXX9_SERIAL
	bool

config SERIAL_TXX9_NR_UARTS
	int "Maximum number of TMPTX39XX/49XX SIO ports"
	depends on SERIAL_TXX9
	default "6"

config SERIAL_TXX9_CONSOLE
	bool "TMPTX39XX/49XX SIO Console support"
	depends on SERIAL_TXX9=y
	select SERIAL_CORE_CONSOLE

config SERIAL_TXX9_STDSERIAL
	bool "TX39XX/49XX SIO act as standard serial"
	depends on !SERIAL_8250 && SERIAL_TXX9

config SERIAL_VR41XX
	tristate "NEC VR4100 series Serial Interface Unit support"
	depends on CPU_VR41XX
	select SERIAL_CORE
	help
	  If you have a NEC VR4100 series processor and you want to use
	  Serial Interface Unit(SIU) or Debug Serial Interface Unit(DSIU)
	  (not include VR4111/VR4121 DSIU), say Y.  Otherwise, say N.

config SERIAL_VR41XX_CONSOLE
	bool "Enable NEC VR4100 series Serial Interface Unit console"
	depends on SERIAL_VR41XX=y
	select SERIAL_CORE_CONSOLE
	help
	  If you have a NEC VR4100 series processor and you want to use
	  a console on a serial port, say Y.  Otherwise, say N.

config SERIAL_JSM
	tristate "Digi International NEO PCI Support"
	depends on PCI
	select SERIAL_CORE
	help
	  This is a driver for Digi International's Neo series
	  of cards which provide multiple serial ports. You would need
	  something like this to connect more than two modems to your Linux
	  box, for instance in order to become a dial-in server. This driver
	  supports PCI boards only.

	  If you have a card like this, say Y here, otherwise say N.

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

config SERIAL_SGI_IOC4
	tristate "SGI IOC4 controller serial support"
	depends on (IA64_GENERIC || IA64_SGI_SN2) && SGI_IOC4
	select SERIAL_CORE
	help
		If you have an SGI Altix with an IOC4 based Base IO card
		and wish to use the serial ports on this card, say Y.
		Otherwise, say N.

config SERIAL_SGI_IOC3
	tristate "SGI Altix IOC3 serial support"
	depends on (IA64_GENERIC || IA64_SGI_SN2) && SGI_IOC3
	select SERIAL_CORE
	help
	  If you have an SGI Altix with an IOC3 serial card,
	  say Y or M.  Otherwise, say N.

config SERIAL_NETX
	tristate "NetX serial port support"
	depends on ARM && ARCH_NETX
	select SERIAL_CORE
	help
	  If you have a machine based on a Hilscher NetX SoC you
	  can enable its onboard serial port by enabling this option.

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

config SERIAL_NETX_CONSOLE
	bool "Console on NetX serial port"
	depends on SERIAL_NETX=y
	select SERIAL_CORE_CONSOLE
	help
	  If you have enabled the serial port on the Hilscher NetX SoC
	  you can make it the console by answering Y to this option.

config SERIAL_OF_PLATFORM
	tristate "Serial port on Open Firmware platform bus"
	depends on PPC_OF
	depends on SERIAL_8250
	help
	  If you have a PowerPC based system that has serial ports
	  on a platform specific bus, you should enable this option.
	  Currently, only 8250 compatible ports are supported, but
	  others can easily be added.

config SERIAL_QE
	tristate "Freescale QUICC Engine serial port support"
	depends on QUICC_ENGINE
	select SERIAL_CORE
	select FW_LOADER
	default n
	help
	  This driver supports the QE serial ports on Freescale embedded
	  PowerPC that contain a QUICC Engine.

config SERIAL_SC26XX
	tristate "SC2681/SC2692 serial port support"
	depends on SNI_RM
	select SERIAL_CORE
	help
	  This is a driver for the onboard serial ports of
	  older RM400 machines.

config SERIAL_SC26XX_CONSOLE
	bool "Console on SC2681/SC2692 serial port"
	depends on SERIAL_SC26XX
	select SERIAL_CORE_CONSOLE
	help
	  Support for Console on SC2681/SC2692 serial ports.

config SERIAL_BFIN_SPORT
	tristate "Blackfin SPORT emulate UART (EXPERIMENTAL)"
	depends on BLACKFIN && EXPERIMENTAL
	select SERIAL_CORE
	help
	  Enble support SPORT emulate UART on Blackfin series.

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

choice
	prompt "Baud rate for Blackfin SPORT UART"
	depends on SERIAL_BFIN_SPORT
	default SERIAL_SPORT_BAUD_RATE_57600
	help
	  Choose a baud rate for the SPORT UART, other uart settings are
	  8 bit, 1 stop bit, no parity, no flow control.

config SERIAL_SPORT_BAUD_RATE_115200
	bool "115200"

config SERIAL_SPORT_BAUD_RATE_57600
	bool "57600"

config SERIAL_SPORT_BAUD_RATE_38400
	bool "38400"

config SERIAL_SPORT_BAUD_RATE_19200
	bool "19200"

config SERIAL_SPORT_BAUD_RATE_9600
	bool "9600"
endchoice

config SPORT_BAUD_RATE
	int
	depends on SERIAL_BFIN_SPORT
	default 115200 if (SERIAL_SPORT_BAUD_RATE_115200)
	default 57600 if (SERIAL_SPORT_BAUD_RATE_57600)
	default 38400 if (SERIAL_SPORT_BAUD_RATE_38400)
	default 19200 if (SERIAL_SPORT_BAUD_RATE_19200)
	default 9600 if (SERIAL_SPORT_BAUD_RATE_9600)

endmenu
