#
# Video configuration
#

menu "Console display driver support"

config VGA_CONSOLE
	bool "VGA text console" if EXPERT || !X86
	depends on !4xx && !PPC_8xx && !SPARC && !M68K && !PARISC &&  !SUPERH && \
		(!ARM || ARCH_FOOTBRIDGE || ARCH_INTEGRATOR || ARCH_NETWINDER) && \
		!ARM64 && !ARC && !MICROBLAZE && !OPENRISC && !NDS32 && !S390
	default y
	help
	  Saying Y here will allow you to use Linux in text mode through a
	  display that complies with the generic VGA standard. Virtually
	  everyone wants that.

	  The program SVGATextMode can be used to utilize SVGA video cards to
	  their full potential in text mode. Download it from
	  <ftp://ibiblio.org/pub/Linux/utils/console/>.

	  Say Y.

config MDA_CONSOLE
	depends on !M68K && !PARISC && ISA
	tristate "MDA text console (dual-headed)"
	---help---
	  Say Y here if you have an old MDA or monochrome Hercules graphics
	  adapter in your system acting as a second head ( = video card). You
	  will then be able to use two monitors with your Linux system. Do not
	  say Y here if your MDA card is the primary card in your system; the
	  normal VGA driver will handle it.

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

	  If unsure, say N.

config SGI_NEWPORT_CONSOLE
        tristate "SGI Newport Console support"
	depends on SGI_IP22 && HAS_IOMEM
        select FONT_SUPPORT
        help
          Say Y here if you want the console on the Newport aka XL graphics
          card of your Indy.  Most people say Y here.

config DUMMY_CONSOLE
	bool
	depends on VGA_CONSOLE!=y || SGI_NEWPORT_CONSOLE!=y 
	default y

config DUMMY_CONSOLE_COLUMNS
        int "Initial number of console screen columns"
        depends on DUMMY_CONSOLE && !ARM
        default 160 if PARISC
        default 80
        help
          On PA-RISC, the default value is 160, which should fit a 1280x1024
          monitor.
          Select 80 if you use a 640x480 resolution by default.

config DUMMY_CONSOLE_ROWS
        int "Initial number of console screen rows"
        depends on DUMMY_CONSOLE && !ARM
        default 64 if PARISC
        default 25
        help
          On PA-RISC, the default value is 64, which should fit a 1280x1024
          monitor.
          Select 25 if you use a 640x480 resolution by default.

config FRAMEBUFFER_CONSOLE
	bool "Framebuffer Console support"
	depends on FB && !UML
	select VT_HW_CONSOLE_BINDING
	select CRC32
	select FONT_SUPPORT
	help
	  Low-level framebuffer-based console driver.

config FRAMEBUFFER_CONSOLE_DETECT_PRIMARY
       bool "Map the console to the primary display device"
       depends on FRAMEBUFFER_CONSOLE
       default n
       ---help---
         If this option is selected, the framebuffer console will
         automatically select the primary display device (if the architecture
	 supports this feature).  Otherwise, the framebuffer console will
         always select the first framebuffer driver that is loaded. The latter
         is the default behavior.

	 You can always override the automatic selection of the primary device
	 by using the fbcon=map: boot option.

	 If unsure, select n.

config FRAMEBUFFER_CONSOLE_ROTATION
       bool "Framebuffer Console Rotation"
       depends on FRAMEBUFFER_CONSOLE
       help
         Enable display rotation for the framebuffer console.  This is done
         in software and may be significantly slower than a normally oriented
         display.  Note that the rotation is done at the console level only
         such that other users of the framebuffer will remain normally
         oriented.

config FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER
	bool "Framebuffer Console Deferred Takeover"
	depends on FB=y && FRAMEBUFFER_CONSOLE && DUMMY_CONSOLE
	help
	  If enabled this defers the framebuffer console taking over the
	  console from the dummy console until the first text is displayed on
	  the console. This is useful in combination with the "quiet" kernel
	  commandline option to keep the framebuffer contents initially put up
	  by the firmware in place, rather then replacing the contents with a
	  black screen as soon as fbcon loads.

config STI_CONSOLE
        bool "STI text console"
	depends on PARISC && HAS_IOMEM
        select FONT_SUPPORT
        default y
        help
          The STI console is the builtin display/keyboard on HP-PARISC
          machines.  Say Y here to build support for it into your kernel.
          The alternative is to use your primary serial port as a console.

endmenu

