#
# ACPI Configuration
#

menu "ACPI (Advanced Configuration and Power Interface) Support"
	depends on !X86_NUMAQ
	depends on !X86_VISWS
	depends on !IA64_HP_SIM
	depends on IA64 || X86

config ACPI
	bool "ACPI Support"
	depends on IA64 || X86
	depends on PCI
	depends on PM
	select PNP
	default y
	---help---
	  Advanced Configuration and Power Interface (ACPI) support for 
	  Linux requires an ACPI compliant platform (hardware/firmware),
	  and assumes the presence of OS-directed configuration and power
	  management (OSPM) software.  This option will enlarge your 
	  kernel by about 70K.

	  Linux ACPI provides a robust functional replacement for several 
	  legacy configuration and power management interfaces, including
	  the Plug-and-Play BIOS specification (PnP BIOS), the 
	  MultiProcessor Specification (MPS), and the Advanced Power 
	  Management (APM) specification.  If both ACPI and APM support 
	  are configured, whichever is loaded first shall be used.

	  The ACPI SourceForge project contains the latest source code, 
	  documentation, tools, mailing list subscription, and other 
	  information.  This project is available at:
	  <http://sourceforge.net/projects/acpi>

	  Linux support for ACPI is based on Intel Corporation's ACPI
	  Component Architecture (ACPI CA).  For more information see:
	  <http://developer.intel.com/technology/iapc/acpi>

	  ACPI is an open industry specification co-developed by Compaq, 
	  Intel, Microsoft, Phoenix, and Toshiba.  The specification is 
	  available at:
	  <http://www.acpi.info>

if ACPI

config ACPI_SLEEP
	bool "Sleep States"
	depends on X86 && (!SMP || SUSPEND_SMP)
	depends on PM
	default y
	---help---
	  This option adds support for ACPI suspend states. 

	  With this option, you will be able to put the system "to sleep". 
	  Sleep states are low power states for the system and devices. All
	  of the system operating state is saved to either memory or disk
	  (depending on the state), to allow the system to resume operation
	  quickly at your request.

	  Although this option sounds really nifty, barely any of the device
	  drivers have been converted to the new driver model and hence few
	  have proper power management support. 

	  This option is not recommended for anyone except those doing driver
	  power management development.

config ACPI_SLEEP_PROC_FS
	bool
	depends on ACPI_SLEEP && PROC_FS
	default y

config ACPI_SLEEP_PROC_SLEEP
	bool "/proc/acpi/sleep (deprecated)"
	depends on ACPI_SLEEP_PROC_FS
	default n
	---help---
	  Create /proc/acpi/sleep
	  Deprecated by /sys/power/state

config ACPI_PROCFS
	bool "Procfs interface (deprecated)"
	depends on ACPI
	default y
	---help---
	  Procfs interface for ACPI is made optional for back-compatible.
	  As the same functions are duplicated in sysfs interface
	  and this proc interface will be removed some time later,
	  it's marked as deprecated.
	  ( /proc/acpi/debug_layer && debug_level are deprecated by
	    /sys/module/acpi/parameters/debug_layer && debug_level.
	    /proc/acpi/info is deprecated by
	    /sys/module/acpi/parameters/acpica_version )

config ACPI_AC
	tristate "AC Adapter"
	depends on X86
	default y
	help
	  This driver adds support for the AC Adapter object, which indicates
	  whether a system is on AC, or not. If you have a system that can
	  switch between A/C and battery, say Y.

config ACPI_BATTERY
	tristate "Battery"
	depends on X86
	default y
	help
	  This driver adds support for battery information through
	  /proc/acpi/battery. If you have a mobile system with a battery, 
	  say Y.

config ACPI_BUTTON
	tristate "Button"
	depends on INPUT
	default y
	help
	  This driver handles events on the power, sleep and lid buttons.
	  A daemon reads /proc/acpi/event and perform user-defined actions
	  such as shutting down the system.  This is necessary for
	  software controlled poweroff.

config ACPI_VIDEO
	tristate "Video"
	depends on X86 && BACKLIGHT_CLASS_DEVICE
	help
	  This driver implement the ACPI Extensions For Display Adapters
	  for integrated graphics devices on motherboard, as specified in
	  ACPI 2.0 Specification, Appendix B, allowing to perform some basic
	  control like defining the video POST device, retrieving EDID information
	  or to setup a video output, etc.
	  Note that this is an ref. implementation only.  It may or may not work
	  for your integrated video device.

config ACPI_FAN
	tristate "Fan"
	default y
	help
	  This driver adds support for ACPI fan devices, allowing user-mode 
	  applications to perform basic fan control (on, off, status).

config ACPI_DOCK
	tristate "Dock"
	depends on EXPERIMENTAL
	help
	  This driver adds support for ACPI controlled docking stations

config ACPI_BAY
	tristate "Removable Drive Bay (EXPERIMENTAL)"
	depends on EXPERIMENTAL
	help
	  This driver adds support for ACPI controlled removable drive
	  bays such as the IBM ultrabay or the Dell Module Bay.

config ACPI_PROCESSOR
	tristate "Processor"
	default y
	help
	  This driver installs ACPI as the idle handler for Linux, and uses
	  ACPI C2 and C3 processor states to save power, on systems that
	  support it.  It is required by several flavors of cpufreq
	  Performance-state drivers.

config ACPI_HOTPLUG_CPU
	bool
	depends on ACPI_PROCESSOR && HOTPLUG_CPU
	select ACPI_CONTAINER
	default y

config ACPI_THERMAL
	tristate "Thermal Zone"
	depends on ACPI_PROCESSOR
	default y
	help
	  This driver adds support for ACPI thermal zones.  Most mobile and
	  some desktop systems support ACPI thermal zones.  It is HIGHLY
	  recommended that this option be enabled, as your processor(s)
	  may be damaged without it.

config ACPI_NUMA
	bool "NUMA support"
	depends on NUMA
	depends on (X86 || IA64)
	default y if IA64_GENERIC || IA64_SGI_SN2

config ACPI_ASUS
        tristate "ASUS/Medion Laptop Extras"
	depends on X86
	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://sourceforge.net/projects/acpi4asus/>.

          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_IBM
	tristate "IBM ThinkPad Laptop Extras"
	depends on X86
	select BACKLIGHT_CLASS_DEVICE
	---help---
	  This is a Linux ACPI driver for the IBM 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/ibm-acpi.txt>
	  and <http://ibm-acpi.sf.net/> .

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

config ACPI_IBM_DOCK
	bool "Legacy Docking Station Support"
	depends on ACPI_IBM
	depends on ACPI_DOCK=n
	default n
	---help---
	  Allows the ibm_acpi driver to handle docking station events.
	  This support is obsoleted by CONFIG_HOTPLUG_PCI_ACPI.  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 ACPI_TOSHIBA
	tristate "Toshiba Laptop Extras"
	depends on X86
	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.

config ACPI_CUSTOM_DSDT
	bool "Include Custom DSDT"
	depends on !STANDALONE
	default n 
	help
	  This option is to load a custom ACPI DSDT
	  If you don't know what that is, say N.

config ACPI_CUSTOM_DSDT_FILE
	string "Custom DSDT Table file to include"
	depends on ACPI_CUSTOM_DSDT
	default ""
	help
	  Enter the full path name to the file which includes the AmlCode
	  declaration.

config ACPI_BLACKLIST_YEAR
	int "Disable ACPI for systems before Jan 1st this year" if X86_32
	default 0
	help
	  enter a 4-digit year, eg. 2001 to disable ACPI by default
	  on platforms with DMI BIOS date before January 1st that year.
	  "acpi=force" can be used to override this mechanism.

	  Enter 0 to disable this mechanism and allow ACPI to
	  run by default no matter what the year.  (default)

config ACPI_DEBUG
	bool "Debug Statements"
	default n
	help
	  The ACPI driver can optionally report errors with a great deal
	  of verbosity. Saying Y enables these statements. This will increase
	  your kernel size by around 50K.

config ACPI_EC
	bool
	default y
	help
	  This driver is required on some systems for the proper operation of
	  the battery and thermal drivers.  If you are compiling for a 
	  mobile system, say Y.

config ACPI_POWER
	bool
	default y

config ACPI_SYSTEM
	bool
	default y
	help
	  This driver will enable your system to shut down using ACPI, and
	  dump your ACPI DSDT table using /proc/acpi/dsdt.

config X86_PM_TIMER
	bool "Power Management Timer Support" if EMBEDDED
	depends on X86
	default y
	help
	  The Power Management Timer is available on all ACPI-capable,
	  in most cases even if ACPI is unusable or blacklisted.

	  This timing source is not affected by power management features
	  like aggressive processor idling, throttling, frequency and/or
	  voltage scaling, unlike the commonly used Time Stamp Counter
	  (TSC) timing source.

	  You should nearly always say Y here because many modern
	  systems require this timer. 

config ACPI_CONTAINER
	tristate "ACPI0004,PNP0A05 and PNP0A06 Container Driver (EXPERIMENTAL)"
	depends on EXPERIMENTAL
	default (ACPI_HOTPLUG_MEMORY || ACPI_HOTPLUG_CPU || ACPI_HOTPLUG_IO)
	 ---help---
	  This allows _physical_ insertion and removal of CPUs and memory.
	  This can be useful, for example, on NUMA machines that support
	  ACPI based physical hotplug of nodes, or non-NUMA machines that
	  support physical cpu/memory hot-plug.

	  If one selects "m", this driver can be loaded with
	  "modprobe acpi_container".

config ACPI_HOTPLUG_MEMORY
	tristate "Memory Hotplug"
	depends on ACPI
	depends on MEMORY_HOTPLUG
	default n
	help
	  This driver adds supports for ACPI Memory Hotplug.  This driver
	  provides support for fielding notifications on ACPI memory
	  devices (PNP0C80) which represent memory ranges that may be
	  onlined or offlined during runtime.  

	  Enabling this driver assumes that your platform hardware
	  and firmware have support for hot-plugging physical memory. If
	  your system does not support physically adding or ripping out 
	  memory DIMMs at some platform defined granularity (individually 
	  or as a bank) at runtime, then you need not enable this driver.

	  If one selects "m," this driver can be loaded using the following
	  command: 
		$>modprobe acpi_memhotplug 

config ACPI_SBS
	tristate "Smart Battery System (EXPERIMENTAL)"
	depends on X86 && I2C
	depends on EXPERIMENTAL
	help
	  This driver adds support for the Smart Battery System.
	  Depends on I2C (Device Drivers ---> I2C support)
	  A "Smart Battery" is quite old and quite rare compared
	  to today's ACPI "Control Method" battery.

endif	# ACPI

endmenu
