#
# X86 Platform Specific Drivers
#

menuconfig X86_PLATFORM_DEVICES
	bool "X86 Platform Specific Device Drivers"
	default y
	---help---
	  Say Y here to get to see options for device drivers for various
	  x86 platforms, including vendor-specific laptop extension drivers.
	  This option alone does not add any kernel code.

	  If you say N, all options in this submenu will be skipped and disabled.

if X86_PLATFORM_DEVICES

config ACER_WMI
	tristate "Acer WMI Laptop Extras"
	depends on ACPI
	depends on LEDS_CLASS
	depends on NEW_LEDS
	depends on BACKLIGHT_CLASS_DEVICE
	depends on SERIO_I8042
	depends on RFKILL || RFKILL = n
	select ACPI_WMI
	---help---
	  This is a driver for newer Acer (and Wistron) laptops. It adds
	  wireless radio and bluetooth control, and on some laptops,
	  exposes the mail LED and LCD backlight.

	  For more information about this driver see
	  <file:Documentation/laptops/acer-wmi.txt>

	  If you have an ACPI-WMI compatible Acer/ Wistron laptop, say Y or M
	  here.

config ACERHDF
	tristate "Acer Aspire One temperature and fan driver"
	depends on THERMAL && THERMAL_HWMON && ACPI
	---help---
	  This is a driver for Acer Aspire One netbooks. It allows to access
	  the temperature sensor and to control the fan.

	  After loading this driver the BIOS is still in control of the fan.
	  To let the kernel handle the fan, do:
	  echo -n enabled > /sys/class/thermal/thermal_zone0/mode

	  For more information about this driver see
	  <http://piie.net/files/acerhdf_README.txt>

	  If you have an Acer Aspire One netbook, say Y or M
	  here.

config ASUS_LAPTOP
	tristate "Asus Laptop Extras"
	depends on ACPI
	depends on !ACPI_ASUS
	select LEDS_CLASS
	select NEW_LEDS
	select BACKLIGHT_CLASS_DEVICE
	depends on INPUT
	---help---
	  This is the new Linux driver for Asus laptops. It may also support some
	  MEDION, JVC or VICTOR laptops. It makes all the extra buttons generate
	  standard ACPI events and input events. It also adds
	  support for video output switching, LCD backlight control, Bluetooth and
	  Wlan control, and most importantly, allows you to blink those fancy LEDs.

	  For more information and a userspace daemon for handling the extra
	  buttons see <http://acpi4asus.sf.net>.

	  If you have an ACPI-compatible ASUS laptop, say Y or M here.

config DELL_LAPTOP
	tristate "Dell Laptop Extras (EXPERIMENTAL)"
	depends on X86
	depends on DCDBAS
	depends on EXPERIMENTAL
	depends on BACKLIGHT_CLASS_DEVICE
	depends on RFKILL || RFKILL = n
	depends on POWER_SUPPLY
	default n
	---help---
	This driver adds support for rfkill and backlight control to Dell
	laptops.

config DELL_WMI
	tristate "Dell WMI extras"
	depends on ACPI_WMI
	depends on INPUT
	---help---
	  Say Y here if you want to support WMI-based hotkeys on Dell laptops.

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

config FUJITSU_LAPTOP
	tristate "Fujitsu Laptop Extras"
	depends on ACPI
	depends on INPUT
	depends on BACKLIGHT_CLASS_DEVICE
	---help---
	  This is a driver for laptops built by Fujitsu:

	    * P2xxx/P5xxx/S6xxx/S7xxx series Lifebooks
	    * Possibly other Fujitsu laptop models
	    * Tested with S6410 and S7020

	  It adds support for LCD brightness control and some hotkeys.

	  If you have a Fujitsu laptop, say Y or M here.

config FUJITSU_LAPTOP_DEBUG
	bool "Verbose debug mode for Fujitsu Laptop Extras"
	depends on FUJITSU_LAPTOP
	default n
	---help---
	  Enables extra debug output from the fujitsu extras driver, at the
	  expense of a slight increase in driver size.

	  If you are not sure, say N here.

config TC1100_WMI
	tristate "HP Compaq TC1100 Tablet WMI Extras (EXPERIMENTAL)"
	depends on !X86_64
	depends on EXPERIMENTAL
	depends on ACPI
	select ACPI_WMI
	---help---
	  This is a driver for the WMI extensions (wireless and bluetooth power
	  control) of the HP Compaq TC1100 tablet.

config HP_WMI
	tristate "HP WMI extras"
	depends on ACPI_WMI
	depends on INPUT
	depends on RFKILL || RFKILL = n
	help
	 Say Y here if you want to support WMI-based hotkeys on HP laptops and
	 to read data from WMI such as docking or ambient light sensor state.

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

config MSI_LAPTOP
	tristate "MSI Laptop Extras"
	depends on ACPI
	depends on BACKLIGHT_CLASS_DEVICE
	---help---
	  This is a driver for laptops built by MSI (MICRO-STAR
	  INTERNATIONAL):

	  MSI MegaBook S270 (MS-1013)
	  Cytron/TCM/Medion/Tchibo MD96100/SAM2000

	  It adds support for Bluetooth, WLAN and LCD brightness control.

	  More information about this driver is available at
	  <http://0pointer.de/lennart/tchibo.html>.

	  If you have an MSI S270 laptop, say Y or M here.

config PANASONIC_LAPTOP
	tristate "Panasonic Laptop Extras"
	depends on INPUT && ACPI
	depends on BACKLIGHT_CLASS_DEVICE
	---help---
	  This driver adds support for access to backlight control and hotkeys
	  on Panasonic Let's Note laptops.

	  If you have a Panasonic Let's note laptop (such as the R1(N variant),
	  R2, R3, R5, T2, W2 and Y2 series), say Y.

config COMPAL_LAPTOP
	tristate "Compal Laptop Extras"
	depends on ACPI
	depends on BACKLIGHT_CLASS_DEVICE
	---help---
	  This is a driver for laptops built by Compal:

	  Compal FL90/IFL90
	  Compal FL91/IFL91
	  Compal FL92/JFL92
	  Compal FT00/IFT00

	  It adds support for Bluetooth, WLAN and LCD brightness control.

	  If you have an Compal FL9x/IFL9x/FT00 laptop, say Y or M here.

config SONY_LAPTOP
	tristate "Sony Laptop Extras"
	depends on ACPI
	select BACKLIGHT_CLASS_DEVICE
	depends on INPUT
	depends on RFKILL
	  ---help---
	  This mini-driver drives the SNC and SPIC devices present in the ACPI
	  BIOS of the Sony Vaio laptops.

	  It gives access to some extra laptop functionalities like Bluetooth,
	  screen brightness control, Fn keys and allows powering on/off some
	  devices.

	  Read <file:Documentation/laptops/sony-laptop.txt> for more information.

config SONYPI_COMPAT
	bool "Sonypi compatibility"
	depends on SONY_LAPTOP
	  ---help---
	  Build the sonypi driver compatibility code into the sony-laptop driver.

config THINKPAD_ACPI
	tristate "ThinkPad ACPI Laptop Extras"
	depends on ACPI
	depends on INPUT
	depends on RFKILL || RFKILL = n
	select BACKLIGHT_LCD_SUPPORT
	select BACKLIGHT_CLASS_DEVICE
	select HWMON
	select NVRAM
	select NEW_LEDS
	select LEDS_CLASS
	---help---
	  This is a driver for the IBM and Lenovo ThinkPad laptops. It adds
	  support for Fn-Fx key combinations, Bluetooth control, video
	  output switching, ThinkLight control, UltraBay eject and more.
	  For more information about this driver see
	  <file:Documentation/laptops/thinkpad-acpi.txt> and
	  <http://ibm-acpi.sf.net/> .

	  This driver was formerly known as ibm-acpi.

	  If you have an IBM or Lenovo ThinkPad laptop, say Y or M here.

config THINKPAD_ACPI_DEBUGFACILITIES
	bool "Maintainer debug facilities"
	depends on THINKPAD_ACPI
	default n
	---help---
	  Enables extra stuff in the thinkpad-acpi which is completely useless
	  for normal use.  Read the driver source to find out what it does.

	  Say N here, unless you were told by a kernel maintainer to do
	  otherwise.

config THINKPAD_ACPI_DEBUG
	bool "Verbose debug mode"
	depends on THINKPAD_ACPI
	default n
	---help---
	  Enables extra debugging information, at the expense of a slightly
	  increase in driver size.

	  If you are not sure, say N here.

config THINKPAD_ACPI_UNSAFE_LEDS
	bool "Allow control of important LEDs (unsafe)"
	depends on THINKPAD_ACPI
	default n
	---help---
	  Overriding LED state on ThinkPads can mask important
	  firmware alerts (like critical battery condition), or misled
	  the user into damaging the hardware (undocking or ejecting
	  the bay while buses are still active), etc.

	  LED control on the ThinkPad is write-only (with very few
	  exceptions on very ancient models), which makes it
	  impossible to know beforehand if important information will
	  be lost when one changes LED state.

	  Users that know what they are doing can enable this option
	  and the driver will allow control of every LED, including
	  the ones on the dock stations.

	  Never enable this option on a distribution kernel.

	  Say N here, unless you are building a kernel for your own
	  use, and need to control the important firmware LEDs.

config THINKPAD_ACPI_DOCK
	bool "Legacy Docking Station Support"
	depends on THINKPAD_ACPI
	depends on ACPI_DOCK=n
	default n
	---help---
	  Allows the thinkpad_acpi driver to handle docking station events.
	  This support was made obsolete by the generic ACPI docking station
	  support (CONFIG_ACPI_DOCK).  It will allow locking and removing the
	  laptop from the docking station, but will not properly connect PCI
	  devices.

	  If you are not sure, say N here.

config THINKPAD_ACPI_BAY
	bool "Legacy Removable Bay Support"
	depends on THINKPAD_ACPI
	default y
	---help---
	  Allows the thinkpad_acpi driver to handle removable bays.  It will
	  electrically disable the device in the bay, and also generate
	  notifications when the bay lever is ejected or inserted.

	  If you are not sure, say Y here.

config THINKPAD_ACPI_VIDEO
	bool "Video output control support"
	depends on THINKPAD_ACPI
	default y
	---help---
	  Allows the thinkpad_acpi driver to provide an interface to control
	  the various video output ports.

	  This feature often won't work well, depending on ThinkPad model,
	  display state, video output devices in use, whether there is a X
	  server running, phase of the moon, and the current mood of
	  Schroedinger's cat.  If you can use X.org's RandR to control
	  your ThinkPad's video output ports instead of this feature,
	  don't think twice: do it and say N here to save some memory.

	  If you are not sure, say Y here.

config THINKPAD_ACPI_HOTKEY_POLL
	bool "Support NVRAM polling for hot keys"
	depends on THINKPAD_ACPI
	default y
	---help---
	  Some thinkpad models benefit from NVRAM polling to detect a few of
	  the hot key press events.  If you know your ThinkPad model does not
	  need to do NVRAM polling to support any of the hot keys you use,
	  unselecting this option will save about 1kB of memory.

	  ThinkPads T40 and newer, R52 and newer, and X31 and newer are
	  unlikely to need NVRAM polling in their latest BIOS versions.

	  NVRAM polling can detect at most the following keys: ThinkPad/Access
	  IBM, Zoom, Switch Display (fn+F7), ThinkLight, Volume up/down/mute,
	  Brightness up/down, Display Expand (fn+F8), Hibernate (fn+F12).

	  If you are not sure, say Y here.  The driver enables polling only if
	  it is strictly necessary to do so.

config INTEL_MENLOW
	tristate "Thermal Management driver for Intel menlow platform"
	depends on ACPI_THERMAL
	select THERMAL
	---help---
	  ACPI thermal management enhancement driver on
	  Intel Menlow platform.

	  If unsure, say N.

config EEEPC_LAPTOP
	tristate "Eee PC Hotkey Driver (EXPERIMENTAL)"
	depends on ACPI
	depends on INPUT
	depends on EXPERIMENTAL
	depends on RFKILL || RFKILL = n
	depends on HOTPLUG_PCI
	select BACKLIGHT_CLASS_DEVICE
	select HWMON
	---help---
	  This driver supports the Fn-Fx keys on Eee PC laptops.

	  It  also gives access to some extra laptop functionalities like
	  Bluetooth, backlight and allows powering on/off some other
	  devices.

	  If you have an Eee PC laptop, say Y or M here.


config ACPI_WMI
	tristate "WMI"
	depends on ACPI
	help
	  This driver adds support for the ACPI-WMI (Windows Management
	  Instrumentation) mapper device (PNP0C14) found on some systems.

	  ACPI-WMI is a proprietary extension to ACPI to expose parts of the
	  ACPI firmware to userspace - this is done through various vendor
	  defined methods and data blocks in a PNP0C14 device, which are then
	  made available for userspace to call.

	  The implementation of this in Linux currently only exposes this to
	  other kernel space drivers.

	  This driver is a required dependency to build the firmware specific
	  drivers needed on many machines, including Acer and HP laptops.

	  It is safe to enable this driver even if your DSDT doesn't define
	  any ACPI-WMI devices.

config ACPI_ASUS
	tristate "ASUS/Medion Laptop Extras (DEPRECATED)"
	depends on ACPI
	select BACKLIGHT_CLASS_DEVICE
	---help---
	  This driver provides support for extra features of ACPI-compatible
	  ASUS laptops. As some of Medion laptops are made by ASUS, it may also
	  support some Medion laptops (such as 9675 for example).  It makes all
	  the extra buttons generate standard ACPI events that go through
	  /proc/acpi/events, and (on some models) adds support for changing the
	  display brightness and output, switching the LCD backlight on and off,
	  and most importantly, allows you to blink those fancy LEDs intended
	  for reporting mail and wireless status.

	  Note: display switching code is currently considered EXPERIMENTAL,
	  toying with these values may even lock your machine.

	  All settings are changed via /proc/acpi/asus directory entries. Owner
	  and group for these entries can be set with asus_uid and asus_gid
	  parameters.

	  More information and a userspace daemon for handling the extra buttons
	  at <http://acpi4asus.sf.net>.

	  If you have an ACPI-compatible ASUS laptop, say Y or M here. This
	  driver is still under development, so if your laptop is unsupported or
	  something works not quite as expected, please use the mailing list
	  available on the above page (acpi4asus-user@lists.sourceforge.net).

	  NOTE: This driver is deprecated and will probably be removed soon,
	  use asus-laptop instead.

config ACPI_TOSHIBA
	tristate "Toshiba Laptop Extras"
	depends on ACPI
	depends on INPUT
	depends on RFKILL || RFKILL = n
	select INPUT_POLLDEV
	select BACKLIGHT_CLASS_DEVICE
	---help---
	  This driver adds support for access to certain system settings
	  on "legacy free" Toshiba laptops.  These laptops can be recognized by
	  their lack of a BIOS setup menu and APM support.

	  On these machines, all system configuration is handled through the
	  ACPI.  This driver is required for access to controls not covered
	  by the general ACPI drivers, such as LCD brightness, video output,
	  etc.

	  This driver differs from the non-ACPI Toshiba laptop driver (located
	  under "Processor type and features") in several aspects.
	  Configuration is accessed by reading and writing text files in the
	  /proc tree instead of by program interface to /dev.  Furthermore, no
	  power management functions are exposed, as those are handled by the
	  general ACPI drivers.

	  More information about this driver is available at
	  <http://memebeam.org/toys/ToshibaAcpiDriver>.

	  If you have a legacy free Toshiba laptop (such as the Libretto L1
	  series), say Y.
endif # X86_PLATFORM_DEVICES
