# SPDX-License-Identifier: GPL-2.0
config TTY
	bool "Enable TTY" if EXPERT
	default y
	help
	  Allows you to remove TTY support which can save space, and
	  blocks features that require TTY from inclusion in the kernel.
	  TTY is required for any text terminals or serial port
	  communication. Most users should leave this enabled.

if TTY

config VT
	bool "Virtual terminal" if EXPERT
	select INPUT
	default y if !UML
	help
	  If you say Y here, you will get support for terminal devices with
	  display and keyboard devices. These are called "virtual" because you
	  can run several virtual terminals (also called virtual consoles) on
	  one physical terminal. This is rather useful, for example one
	  virtual terminal can collect system messages and warnings, another
	  one can be used for a text-mode user session, and a third could run
	  an X session, all in parallel. Switching between virtual terminals
	  is done with certain key combinations, usually Alt-<function key>.

	  The setterm command ("man setterm") can be used to change the
	  properties (such as colors or beeping) of a virtual terminal. The
	  man page console_codes(4) ("man console_codes") contains the special
	  character sequences that can be used to change those properties
	  directly. The fonts used on virtual terminals can be changed with
	  the setfont ("man setfont") command and the key bindings are defined
	  with the loadkeys ("man loadkeys") command.

	  You need at least one virtual terminal device in order to make use
	  of your keyboard and monitor. Therefore, only people configuring an
	  embedded system would want to say N here in order to save some
	  memory; the only way to log into such a system is then via a serial
	  or network connection.

	  If unsure, say Y, or else you won't be able to do much with your new
	  shiny Linux system :-)

config CONSOLE_TRANSLATIONS
	depends on VT
	default y
	bool "Enable character translations in console" if EXPERT
	help
	  This enables support for font mapping and Unicode translation
	  on virtual consoles.

config VT_CONSOLE
	bool "Support for console on virtual terminal" if EXPERT
	depends on VT
	default y
	help
	  The system console is the device which receives all kernel messages
	  and warnings and which allows logins in single user mode. If you
	  answer Y here, a virtual terminal (the device used to interact with
	  a physical terminal) can be used as system console. This is the most
	  common mode of operations, so you should say Y here unless you want
	  the kernel messages be output only to a serial port (in which case
	  you should say Y to "Console on serial port", below).

	  If you do say Y here, by default the currently visible virtual
	  terminal (/dev/tty0) will be used as system console. You can change
	  that with a kernel command line option such as "console=tty3" which
	  would use the third virtual terminal as system console. (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.)

	  If unsure, say Y.

config VT_CONSOLE_SLEEP
	def_bool y
	depends on VT_CONSOLE && PM_SLEEP

config HW_CONSOLE
	bool
	depends on VT
	default y

config VT_HW_CONSOLE_BINDING
	bool "Support for binding and unbinding console drivers"
	depends on HW_CONSOLE
	help
	  The virtual terminal is the device that interacts with the physical
	  terminal through console drivers. On these systems, at least one
	  console driver is loaded. In other configurations, additional console
	  drivers may be enabled, such as the framebuffer console. If more than
	  1 console driver is enabled, setting this to 'y' will allow you to
	  select the console driver that will serve as the backend for the
	  virtual terminals.

	  See <file:Documentation/driver-api/console.rst> for more
	  information. For framebuffer console users, please refer to
	  <file:Documentation/fb/fbcon.rst>.

config UNIX98_PTYS
	bool "Unix98 PTY support" if EXPERT
	default y
	help
	  A pseudo terminal (PTY) is a software device consisting of two
	  halves: a master and a slave. The slave device behaves identical to
	  a physical terminal; the master device is used by a process to
	  read data from and write data to the slave, thereby emulating a
	  terminal. Typical programs for the master side are telnet servers
	  and xterms.

	  Linux has traditionally used the BSD-like names /dev/ptyxx for
	  masters and /dev/ttyxx for slaves of pseudo terminals. This scheme
	  has a number of problems. The GNU C library glibc 2.1 and later,
	  however, supports the Unix98 naming standard: in order to acquire a
	  pseudo terminal, a process opens /dev/ptmx; the number of the pseudo
	  terminal is then made available to the process and the pseudo
	  terminal slave can be accessed as /dev/pts/<number>. What was
	  traditionally /dev/ttyp2 will then be /dev/pts/2, for example.

	  All modern Linux systems use the Unix98 ptys.  Say Y unless
	  you're on an embedded system and want to conserve memory.

config LEGACY_PTYS
	bool "Legacy (BSD) PTY support"
	default y
	help
	  A pseudo terminal (PTY) is a software device consisting of two
	  halves: a master and a slave. The slave device behaves identical to
	  a physical terminal; the master device is used by a process to
	  read data from and write data to the slave, thereby emulating a
	  terminal. Typical programs for the master side are telnet servers
	  and xterms.

	  Linux has traditionally used the BSD-like names /dev/ptyxx
	  for masters and /dev/ttyxx for slaves of pseudo
	  terminals. This scheme has a number of problems, including
	  security.  This option enables these legacy devices; on most
	  systems, it is safe to say N.

config LEGACY_PTY_COUNT
	int "Maximum number of legacy PTY in use"
	depends on LEGACY_PTYS
	range 0 256
	default "256"
	help
	  The maximum number of legacy PTYs that can be used at any one time.
	  The default is 256, and should be more than enough.  Embedded
	  systems may want to reduce this to save memory.

	  When not in use, each legacy PTY occupies 12 bytes on 32-bit
	  architectures and 24 bytes on 64-bit architectures.

config LEGACY_TIOCSTI
	bool "Allow legacy TIOCSTI usage"
	default y
	help
	  Historically the kernel has allowed TIOCSTI, which will push
	  characters into a controlling TTY. This continues to be used
	  as a malicious privilege escalation mechanism, and provides no
	  meaningful real-world utility any more. Its use is considered
	  a dangerous legacy operation, and can be disabled on most
	  systems.

	  Say Y here only if you have confirmed that your system's
	  userspace depends on this functionality to continue operating
	  normally.

	  This functionality can be changed at runtime with the
	  dev.tty.legacy_tiocsti sysctl. This configuration option sets
	  the default value of the sysctl.

config LDISC_AUTOLOAD
	bool "Automatically load TTY Line Disciplines"
	default y
	help
	  Historically the kernel has always automatically loaded any
	  line discipline that is in a kernel module when a user asks
	  for it to be loaded with the TIOCSETD ioctl, or through other
	  means.  This is not always the best thing to do on systems
	  where you know you will not be using some of the more
	  "ancient" line disciplines, so prevent the kernel from doing
	  this unless the request is coming from a process with the
	  CAP_SYS_MODULE permissions.

	  Say 'Y' here if you trust your userspace users to do the right
	  thing, or if you have only provided the line disciplines that
	  you know you will be using, or if you wish to continue to use
	  the traditional method of on-demand loading of these modules
	  by any user.

	  This functionality can be changed at runtime with the
	  dev.tty.ldisc_autoload sysctl, this configuration option will
	  only set the default value of this functionality.

source "drivers/tty/serial/Kconfig"

config SERIAL_NONSTANDARD
	bool "Non-standard serial port support"
	depends on HAS_IOMEM
	help
	  Say Y here if you have any non-standard serial boards -- boards
	  which aren't supported using the standard "dumb" serial driver.
	  This includes intelligent serial boards such as
	  Digiboards, etc. These are usually used for systems that need many
	  serial ports because they serve many terminals or dial-in
	  connections.

	  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 non-standard serial boards.

	  Most people can say N here.

config MOXA_INTELLIO
	tristate "Moxa Intellio support"
	depends on SERIAL_NONSTANDARD && (ISA || EISA || PCI)
	select FW_LOADER
	help
	  Say Y here if you have a Moxa Intellio multiport serial card.

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

config MOXA_SMARTIO
	tristate "Moxa SmartIO support v. 2.0"
	depends on SERIAL_NONSTANDARD && PCI
	help
	  Say Y here if you have a Moxa SmartIO multiport serial card and/or
	  want to help develop a new version of this driver.

	  This is upgraded (1.9.1) driver from original Moxa drivers with
	  changes finally resulting in PCI probing.

	  This driver can also be built as a module. The module will be called
	  mxser. If you want to do that, say M here.

config SYNCLINK_GT
	tristate "SyncLink GT/AC support"
	depends on SERIAL_NONSTANDARD && PCI
	help
	  Support for SyncLink GT and SyncLink AC families of
	  synchronous and asynchronous serial adapters
	  manufactured by Microgate Systems, Ltd. (www.microgate.com)

config N_HDLC
	tristate "HDLC line discipline support"
	depends on SERIAL_NONSTANDARD
	help
	  Allows synchronous HDLC communications with tty device drivers that
	  support synchronous HDLC such as the Microgate SyncLink adapter.

	  This driver can be built as a module ( = code which can be
	  inserted in and removed from the running kernel whenever you want).
	  The module will be called n_hdlc. If you want to do that, say M
	  here.

config PPC_EPAPR_HV_BYTECHAN
	bool "ePAPR hypervisor byte channel driver"
	depends on PPC
	select EPAPR_PARAVIRT
	help
	  This driver creates /dev entries for each ePAPR hypervisor byte
	  channel, thereby allowing applications to communicate with byte
	  channels as if they were serial ports.

config PPC_EARLY_DEBUG_EHV_BC
	bool "Early console (udbg) support for ePAPR hypervisors"
	depends on PPC_EPAPR_HV_BYTECHAN=y
	help
	  Select this option to enable early console (a.k.a. "udbg") support
	  via an ePAPR byte channel.  You also need to choose the byte channel
	  handle below.

config PPC_EARLY_DEBUG_EHV_BC_HANDLE
	int "Byte channel handle for early console (udbg)"
	depends on PPC_EARLY_DEBUG_EHV_BC
	default 0
	help
	  If you want early console (udbg) output through a byte channel,
	  specify the handle of the byte channel to use.

	  For this to work, the byte channel driver must be compiled
	  in-kernel, not as a module.

	  Note that only one early console driver can be enabled, so don't
	  enable any others if you enable this one.

	  If the number you specify is not a valid byte channel handle, then
	  there simply will be no early console output.  This is true also
	  if you don't boot under a hypervisor at all.

config GOLDFISH_TTY
	tristate "Goldfish TTY Driver"
	depends on GOLDFISH
	select SERIAL_CORE
	select SERIAL_CORE_CONSOLE
	help
	  Console and system TTY driver for the Goldfish virtual platform.

config GOLDFISH_TTY_EARLY_CONSOLE
	bool
	default y if GOLDFISH_TTY=y
	select SERIAL_EARLYCON

config IPWIRELESS
	tristate "IPWireless 3G UMTS PCMCIA card support"
	depends on PCMCIA && NETDEVICES
	select PPP
	help
	  This is a driver for 3G UMTS PCMCIA card from IPWireless company. In
	  some countries (for example Czech Republic, T-Mobile ISP) this card
	  is shipped for service called UMTS 4G.

config N_GSM
	tristate "GSM MUX line discipline support (EXPERIMENTAL)"
	depends on NET
	help
	  This line discipline provides support for the GSM MUX protocol and
	  presents the mux as a set of 61 individual tty devices.

config NOZOMI
	tristate "HSDPA Broadband Wireless Data Card - Globe Trotter"
	depends on PCI
	help
	  If you have a HSDPA driver Broadband Wireless Data Card -
	  Globe Trotter PCMCIA card, say Y here.

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

config MIPS_EJTAG_FDC_TTY
	bool "MIPS EJTAG Fast Debug Channel TTY"
	depends on MIPS_CDMM
	help
	  This enables a TTY and console on the MIPS EJTAG Fast Debug Channels,
	  if they are present. This can be useful when working with an EJTAG
	  probe which supports it, to get console output and a login prompt via
	  EJTAG without needing to connect a serial cable.

	  TTY devices are named e.g. ttyFDC3c2 (for FDC channel 2 of the FDC on
	  CPU3).

	  The console can be enabled with console=fdc1 (for FDC channel 1 on all
	  CPUs). Do not use the console unless there is a debug probe attached
	  to drain the FDC TX FIFO.

	  If unsure, say N.

config MIPS_EJTAG_FDC_EARLYCON
	bool "Early FDC console"
	depends on MIPS_EJTAG_FDC_TTY
	help
	  This registers a console on FDC channel 1 very early during boot (from
	  MIPS arch code). This is useful for bring-up and debugging early boot
	  issues.

	  Do not enable unless there is a debug probe attached to drain the FDC
	  TX FIFO.

	  If unsure, say N.

config MIPS_EJTAG_FDC_KGDB
	bool "Use KGDB over an FDC channel"
	depends on MIPS_EJTAG_FDC_TTY && KGDB
	default y
	help
	  This enables the use of KGDB over an FDC channel, allowing KGDB to be
	  used remotely or when a serial port isn't available.

config MIPS_EJTAG_FDC_KGDB_CHAN
	int "KGDB FDC channel"
	depends on MIPS_EJTAG_FDC_KGDB
	range 2 15
	default 3
	help
	  FDC channel number to use for KGDB.

config NULL_TTY
	tristate "NULL TTY driver"
	help
	  Say Y here if you want a NULL TTY which simply discards messages.

	  This is useful to allow userspace applications which expect a console
	  device to work without modifications even when no console is
	  available or desired.

	  In order to use this driver, you should redirect the console to this
	  TTY, or boot the kernel with console=ttynull.

	  If unsure, say N.

config VCC
	tristate "Sun Virtual Console Concentrator"
	depends on SUN_LDOMS
	help
	  Support for Sun logical domain consoles.

source "drivers/tty/hvc/Kconfig"

config RPMSG_TTY
	tristate "RPMSG tty driver"
	depends on RPMSG
	help
	  Say y here to export rpmsg endpoints as tty devices, usually found
	  in /dev/ttyRPMSGx.
	  This makes it possible for user-space programs to send and receive
	  rpmsg messages as a standard tty protocol.

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

endif # TTY

source "drivers/tty/serdev/Kconfig"
