# SPDX-License-Identifier: GPL-2.0-only
#
# X86 Platform Specific Drivers
#

menuconfig X86_PLATFORM_DEVICES
	bool "X86 Platform Specific Device Drivers"
	default y
	depends on X86
	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 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 WMI_BMOF
	tristate "WMI embedded Binary MOF driver"
	depends on ACPI_WMI
	default ACPI_WMI
	help
	  Say Y here if you want to be able to read a firmware-embedded
	  WMI Binary MOF data. Using this requires userspace tools and may be
	  rather tedious.

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

config ALIENWARE_WMI
	tristate "Alienware Special feature control"
	depends on ACPI
	depends on LEDS_CLASS
	depends on NEW_LEDS
	depends on ACPI_WMI
	help
	 This is a driver for controlling Alienware BIOS driven
	 features.  It exposes an interface for controlling the AlienFX
	 zones on Alienware machines that don't contain a dedicated AlienFX
	 USB MCU such as the X51 and X51-R2.

config HUAWEI_WMI
	tristate "Huawei WMI laptop extras driver"
	depends on ACPI_BATTERY
	depends on ACPI_WMI
	depends on INPUT
	select INPUT_SPARSEKMAP
	select LEDS_CLASS
	select LEDS_TRIGGERS
	select LEDS_TRIGGER_AUDIO
	select NEW_LEDS
	help
	  This driver provides support for Huawei WMI hotkeys, battery charge
	  control, fn-lock, mic-mute LED, and other extra features.

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

config INTEL_WMI_SBL_FW_UPDATE
	tristate "Intel WMI Slim Bootloader firmware update signaling driver"
	depends on ACPI_WMI
	help
	  Say Y here if you want to be able to use the WMI interface to signal
	  Slim Bootloader to trigger update on next reboot.

	  To compile this driver as a module, choose M here: the module will
	  be called intel-wmi-sbl-fw-update.

config INTEL_WMI_THUNDERBOLT
	tristate "Intel WMI thunderbolt force power driver"
	depends on ACPI_WMI
	help
	  Say Y here if you want to be able to use the WMI interface on select
	  systems to force the power control of Intel Thunderbolt controllers.
	  This is useful for updating the firmware when devices are not plugged
	  into the controller.

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

config MXM_WMI
       tristate "WMI support for MXM Laptop Graphics"
       depends on ACPI_WMI
	help
          MXM is a standard for laptop graphics cards, the WMI interface
	  is required for switchable nvidia graphics machines

config PEAQ_WMI
	tristate "PEAQ 2-in-1 WMI hotkey driver"
	depends on ACPI_WMI
	depends on INPUT
	help
	 Say Y here if you want to support WMI-based hotkeys on PEAQ 2-in-1s.

config XIAOMI_WMI
	tristate "Xiaomi WMI key driver"
	depends on ACPI_WMI
	depends on INPUT
	help
	  Say Y here if you want to support WMI-based keys on Xiaomi notebooks.

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

config ACERHDF
	tristate "Acer Aspire One temperature and fan driver"
	depends on ACPI && THERMAL
	select THERMAL_GOV_BANG_BANG
	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_zoneN/mode
	  where N=0,1,2... depending on the number of thermal nodes and the
	  detection order of your particular system.  The "type" parameter
	  in the same node directory will tell you if it is "acerhdf".

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

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

config ACER_WIRELESS
        tristate "Acer Wireless Radio Control Driver"
        depends on ACPI
        depends on INPUT
	help
          The Acer Wireless Radio Control handles the airplane mode hotkey
          present on new Acer laptops.

          Say Y or M here if you have an Acer notebook with an airplane mode
          hotkey.

          If you choose to compile this driver as a module the module will be
          called acer-wireless.

config ACER_WMI
	tristate "Acer WMI Laptop Extras"
	depends on ACPI
	select LEDS_CLASS
	select NEW_LEDS
	depends on BACKLIGHT_CLASS_DEVICE
	depends on SERIO_I8042
	depends on INPUT
	depends on RFKILL || RFKILL = n
	depends on ACPI_WMI
	select INPUT_SPARSEKMAP
	# Acer WMI depends on ACPI_VIDEO when ACPI is enabled
        select ACPI_VIDEO if ACPI
	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.

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

config APPLE_GMUX
	tristate "Apple Gmux Driver"
	depends on ACPI && PCI
	depends on PNP
	depends on BACKLIGHT_CLASS_DEVICE
	depends on BACKLIGHT_APPLE=n || BACKLIGHT_APPLE
	depends on ACPI_VIDEO=n || ACPI_VIDEO
	help
	  This driver provides support for the gmux device found on many
	  Apple laptops, which controls the display mux for the hybrid
	  graphics as well as the backlight. Currently only backlight
	  control is supported by the driver.

config ASUS_LAPTOP
	tristate "Asus Laptop Extras"
	depends on ACPI
	select LEDS_CLASS
	select NEW_LEDS
	depends on BACKLIGHT_CLASS_DEVICE
	depends on INPUT
	depends on RFKILL || RFKILL = n
	depends on ACPI_VIDEO || ACPI_VIDEO = n
	select INPUT_SPARSEKMAP
	help
	  This is a driver for Asus laptops, Lenovo SL and the Pegatron
	  Lucid tablet. It may also support some MEDION, JVC or VICTOR
	  laptops. It makes all the extra buttons generate standard
	  ACPI events and input events, and on the Lucid the built-in
	  accelerometer appears as an input device.  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 see <http://acpi4asus.sf.net>.

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

config ASUS_WIRELESS
	tristate "Asus Wireless Radio Control Driver"
	depends on ACPI
	depends on INPUT
	select NEW_LEDS
	select LEDS_CLASS
	help
	  The Asus Wireless Radio Control handles the airplane mode hotkey
	  present on some Asus laptops.

	  Say Y or M here if you have an ASUS notebook with an airplane mode
	  hotkey.

	  If you choose to compile this driver as a module the module will be
	  called asus-wireless.

config ASUS_WMI
	tristate "ASUS WMI Driver"
	depends on ACPI_WMI
	depends on ACPI_BATTERY
	depends on INPUT
	depends on HWMON
	depends on BACKLIGHT_CLASS_DEVICE
	depends on RFKILL || RFKILL = n
	depends on HOTPLUG_PCI
	depends on ACPI_VIDEO || ACPI_VIDEO = n
	select INPUT_SPARSEKMAP
	select LEDS_CLASS
	select NEW_LEDS
	help
	  Say Y here if you have a WMI aware Asus laptop (like Eee PCs or new
	  Asus Notebooks).

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

config ASUS_NB_WMI
	tristate "Asus Notebook WMI Driver"
	depends on ASUS_WMI
	depends on SERIO_I8042 || SERIO_I8042 = n
	help
	  This is a driver for newer Asus notebooks. It adds extra features
	  like wireless radio and bluetooth control, leds, hotkeys, backlight...

	  For more information, see
	  <file:Documentation/ABI/testing/sysfs-platform-asus-wmi>

	  If you have an ACPI-WMI compatible Asus Notebook, say Y or M
	  here.

config EEEPC_LAPTOP
	tristate "Eee PC Hotkey Driver"
	depends on ACPI
	depends on INPUT
	depends on RFKILL || RFKILL = n
	depends on ACPI_VIDEO || ACPI_VIDEO = n
	depends on HOTPLUG_PCI
	depends on BACKLIGHT_CLASS_DEVICE
	select HWMON
	select LEDS_CLASS
	select NEW_LEDS
	select INPUT_SPARSEKMAP
	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. If this driver
	  doesn't work on your Eee PC, try eeepc-wmi instead.

config EEEPC_WMI
	tristate "Eee PC WMI Driver"
	depends on ASUS_WMI
	help
	  This is a driver for newer Eee PC laptops. It adds extra features
	  like wireless radio and bluetooth control, leds, hotkeys, backlight...

	  For more information, see
	  <file:Documentation/ABI/testing/sysfs-platform-asus-wmi>

	  If you have an ACPI-WMI compatible Eee PC laptop (>= 1000), say Y or M
	  here.

config DCDBAS
	tristate "Dell Systems Management Base Driver"
	depends on X86
	help
	  The Dell Systems Management Base Driver provides a sysfs interface
	  for systems management software to perform System Management
	  Interrupts (SMIs) and Host Control Actions (system power cycle or
	  power off after OS shutdown) on certain Dell systems.

	  See <file:Documentation/driver-api/dcdbas.rst> for more details on the driver
	  and the Dell systems on which Dell systems management software makes
	  use of this driver.

	  Say Y or M here to enable the driver for use by Dell systems
	  management software such as Dell OpenManage.

#
# The DELL_SMBIOS driver depends on ACPI_WMI and/or DCDBAS if those
# backends are selected. The "depends" line prevents a configuration
# where DELL_SMBIOS=y while either of those dependencies =m.
#
config DELL_SMBIOS
	tristate "Dell SMBIOS driver"
	depends on DCDBAS || DCDBAS=n
	depends on ACPI_WMI || ACPI_WMI=n
	help
	This provides support for the Dell SMBIOS calling interface.
	If you have a Dell computer you should enable this option.

	Be sure to select at least one backend for it to work properly.

config DELL_SMBIOS_WMI
	bool "Dell SMBIOS driver WMI backend"
	default y
	depends on ACPI_WMI
	select DELL_WMI_DESCRIPTOR
	depends on DELL_SMBIOS
	help
	This provides an implementation for the Dell SMBIOS calling interface
	communicated over ACPI-WMI.

	If you have a Dell computer from >2007 you should say Y here.
	If you aren't sure and this module doesn't work for your computer
	it just won't load.

config DELL_SMBIOS_SMM
	bool "Dell SMBIOS driver SMM backend"
	default y
	depends on DCDBAS
	depends on DELL_SMBIOS
	help
	This provides an implementation for the Dell SMBIOS calling interface
	communicated over SMI/SMM.

	If you have a Dell computer from <=2017 you should say Y here.
	If you aren't sure and this module doesn't work for your computer
	it just won't load.

config DELL_LAPTOP
	tristate "Dell Laptop Extras"
	depends on DMI
	depends on BACKLIGHT_CLASS_DEVICE
	depends on ACPI_VIDEO || ACPI_VIDEO = n
	depends on RFKILL || RFKILL = n
	depends on SERIO_I8042
	depends on DELL_SMBIOS
	select POWER_SUPPLY
	select LEDS_CLASS
	select NEW_LEDS
	select LEDS_TRIGGERS
	select LEDS_TRIGGER_AUDIO
	help
	This driver adds support for rfkill and backlight control to Dell
	laptops (except for some models covered by the Compal driver).

config DELL_RBTN
	tristate "Dell Airplane Mode Switch driver"
	depends on ACPI
	depends on INPUT
	depends on RFKILL
	help
	  Say Y here if you want to support Dell Airplane Mode Switch ACPI
	  device on Dell laptops. Sometimes it has names: DELLABCE or DELRBTN.
	  This driver register rfkill device or input hotkey device depending
	  on hardware type (hw switch slider or keyboard toggle button). For
	  rfkill devices it receive HW switch events and set correct hard
	  rfkill state.

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

config DELL_RBU
	tristate "BIOS update support for DELL systems via sysfs"
	depends on X86
	select FW_LOADER
	select FW_LOADER_USER_HELPER
	help
	 Say m if you want to have the option of updating the BIOS for your
	 DELL system. Note you need a Dell OpenManage or Dell Update package (DUP)
	 supporting application to communicate with the BIOS regarding the new
	 image for the image update to take effect.
	 See <file:Documentation/admin-guide/dell_rbu.rst> for more details on the driver.

config DELL_SMO8800
	tristate "Dell Latitude freefall driver (ACPI SMO88XX)"
	depends on ACPI
	help
	  Say Y here if you want to support SMO88XX freefall devices
	  on Dell Latitude laptops.

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

config DELL_WMI
	tristate "Dell WMI notifications"
	depends on ACPI_WMI
	depends on DMI
	depends on INPUT
	depends on ACPI_VIDEO || ACPI_VIDEO = n
	depends on DELL_SMBIOS
	select DELL_WMI_DESCRIPTOR
	select INPUT_SPARSEKMAP
	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 DELL_WMI_DESCRIPTOR
	tristate
	depends on ACPI_WMI

config DELL_WMI_AIO
	tristate "WMI Hotkeys for Dell All-In-One series"
	depends on ACPI_WMI
	depends on INPUT
	select INPUT_SPARSEKMAP
	help
	  Say Y here if you want to support WMI-based hotkeys on Dell
	  All-In-One machines.

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

config DELL_WMI_LED
	tristate "External LED on Dell Business Netbooks"
	depends on LEDS_CLASS
	depends on ACPI_WMI
	help
	  This adds support for the Latitude 2100 and similar
	  notebooks that have an external LED.

config AMILO_RFKILL
	tristate "Fujitsu-Siemens Amilo rfkill support"
	depends on RFKILL
	depends on SERIO_I8042
	help
	  This is a driver for enabling wifi on some Fujitsu-Siemens Amilo
	  laptops.

config FUJITSU_LAPTOP
	tristate "Fujitsu Laptop Extras"
	depends on ACPI
	depends on INPUT
	depends on BACKLIGHT_CLASS_DEVICE
	depends on ACPI_VIDEO || ACPI_VIDEO = n
	select INPUT_SPARSEKMAP
	select NEW_LEDS
	select LEDS_CLASS
	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_TABLET
       tristate "Fujitsu Tablet Extras"
       depends on ACPI
       depends on INPUT
	help
         This is a driver for tablets built by Fujitsu:

           * Lifebook P1510/P1610/P1620/Txxxx
           * Stylistic ST5xxx
           * Possibly other Fujitsu tablet models

         It adds support for the panel buttons, docking station detection,
         tablet/notebook mode detection for convertible and
         orientation detection for docked slates.

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

config GPD_POCKET_FAN
	tristate "GPD Pocket Fan Controller support"
	depends on ACPI
	depends on THERMAL
	help
	  Driver for the GPD Pocket vendor specific FAN02501 ACPI device
	  which controls the fan speed on the GPD Pocket.

	  Without this driver the fan on the Pocket will stay off independent
	  of the CPU temperature. Say Y or M if the kernel may be used on a
	  GPD pocket.

config HP_ACCEL
	tristate "HP laptop accelerometer"
	depends on INPUT && ACPI
	depends on SERIO_I8042
	select SENSORS_LIS3LV02D
	select NEW_LEDS
	select LEDS_CLASS
	help
	  This driver provides support for the "Mobile Data Protection System 3D"
	  or "3D DriveGuard" feature of HP laptops. On such systems the driver
	  should load automatically (via ACPI alias).

	  Support for a led indicating disk protection will be provided as
	  hp::hddprotect. For more information on the feature, refer to
	  Documentation/misc-devices/lis3lv02d.rst.

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

config HP_WIRELESS
	tristate "HP wireless button"
	depends on ACPI
	depends on INPUT
	help
	 This driver provides supports for new HP wireless button for Windows 8.
	 On such systems the driver should load automatically (via ACPI alias).

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

config HP_WMI
	tristate "HP WMI extras"
	depends on ACPI_WMI
	depends on INPUT
	depends on RFKILL || RFKILL = n
	select INPUT_SPARSEKMAP
	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 TC1100_WMI
	tristate "HP Compaq TC1100 Tablet WMI Extras"
	depends on !X86_64
	depends on ACPI
	depends on ACPI_WMI
	help
	  This is a driver for the WMI extensions (wireless and bluetooth power
	  control) of the HP Compaq TC1100 tablet.

config IBM_RTL
	tristate "Device driver to enable PRTL support"
	depends on PCI
	help
	 Enable support for IBM Premium Real Time Mode (PRTM).
	 This module will allow you the enter and exit PRTM in the BIOS via
	 sysfs on platforms that support this feature.  System in PRTM will
	 not receive CPU-generated SMIs for recoverable errors.  Use of this
	 feature without proper support may void your hardware warranty.

	 If the proper BIOS support is found the driver will load and create
	 /sys/devices/system/ibm_rtl/.  The "state" variable will indicate
	 whether or not the BIOS is in PRTM.
	 state = 0 (BIOS SMIs on)
	 state = 1 (BIOS SMIs off)

config IDEAPAD_LAPTOP
	tristate "Lenovo IdeaPad Laptop Extras"
	depends on ACPI
	depends on RFKILL && INPUT
	depends on SERIO_I8042
	depends on BACKLIGHT_CLASS_DEVICE
	depends on ACPI_VIDEO || ACPI_VIDEO = n
	depends on ACPI_WMI || ACPI_WMI = n
	select INPUT_SPARSEKMAP
	help
	  This is a driver for Lenovo IdeaPad netbooks contains drivers for
	  rfkill switch, hotkey, fan control and backlight control.

config SENSORS_HDAPS
	tristate "Thinkpad Hard Drive Active Protection System (hdaps)"
	depends on INPUT
	help
	  This driver provides support for the IBM Hard Drive Active Protection
	  System (hdaps), which provides an accelerometer and other misc. data.
	  ThinkPads starting with the R50, T41, and X40 are supported.  The
	  accelerometer data is readable via sysfs.

	  This driver also provides an absolute input class device, allowing
	  the laptop to act as a pinball machine-esque joystick.

	  If your ThinkPad is not recognized by the driver, please update to latest
	  BIOS. This is especially the case for some R52 ThinkPads.

	  Say Y here if you have an applicable laptop and want to experience
	  the awesome power of hdaps.

config THINKPAD_ACPI
	tristate "ThinkPad ACPI Laptop Extras"
	depends on ACPI
	depends on ACPI_BATTERY
	depends on INPUT
	depends on RFKILL || RFKILL = n
	depends on ACPI_VIDEO || ACPI_VIDEO = n
	depends on BACKLIGHT_CLASS_DEVICE
	select HWMON
	select NVRAM
	select NEW_LEDS
	select LEDS_CLASS
	select LEDS_TRIGGERS
	select LEDS_TRIGGER_AUDIO
	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/admin-guide/laptops/thinkpad-acpi.rst> and
	  <http://ibm-acpi.sf.net/> .

	  This driver was formerly known as ibm-acpi.

	  Extra functionality will be available if the rfkill (CONFIG_RFKILL)
	  and/or ALSA (CONFIG_SND) subsystems are available in the kernel.
	  Note that if you want ThinkPad-ACPI to be built-in instead of
	  modular, ALSA and rfkill will also have to be built-in.

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

config THINKPAD_ACPI_ALSA_SUPPORT
	bool "Console audio control ALSA interface"
	depends on THINKPAD_ACPI
	depends on SND
	depends on SND = y || THINKPAD_ACPI = SND
	default y
	help
	  Enables monitoring of the built-in console audio output control
	  (headphone and speakers), which is operated by the mute and (in
	  some ThinkPad models) volume hotkeys.

	  If this option is enabled, ThinkPad-ACPI will export an ALSA card
	  with a single read-only mixer control, which should be used for
	  on-screen-display feedback purposes by the Desktop Environment.

	  Optionally, the driver will also allow software control (the
	  ALSA mixer will be made read-write).  Please refer to the driver
	  documentation for details.

	  All IBM models have both volume and mute control.  Newer Lenovo
	  models only have mute control (the volume hotkeys are just normal
	  keys and volume control is done through the main HDA mixer).

config THINKPAD_ACPI_DEBUGFACILITIES
	bool "Maintainer debug facilities"
	depends on THINKPAD_ACPI
	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
	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
	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_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 memory and avoid
	  bad interactions with X.org.

	  NOTE: access to this feature is limited to processes with the
	  CAP_SYS_ADMIN capability, to avoid local DoS issues in platforms
	  where it interacts badly with X.org.

	  If you are not sure, say Y here but do try to check if you could
	  be using X.org RandR instead.

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_ATOMISP2_LED
	tristate "Intel AtomISP2 camera LED driver"
	depends on GPIOLIB && LEDS_GPIO
	help
	  Many Bay Trail and Cherry Trail devices come with a camera attached
	  to Intel's Image Signal Processor. Linux currently does not have a
	  driver for these, so they do not work as a camera. Some of these
	  camera's have a LED which is controlled through a GPIO.

	  Some of these devices have a firmware issue where the LED gets turned
	  on at boot. This driver will turn the LED off at boot and also allows
	  controlling the LED (repurposing it) through the sysfs LED interface.

	  Which GPIO is attached to the LED is usually not described in the
	  ACPI tables, so this driver contains per-system info about the GPIO
	  inside the driver, this means that this driver only works on systems
	  the driver knows about.

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

config INTEL_ATOMISP2_PM
	tristate "Intel AtomISP2 dummy / power-management driver"
	depends on PCI && IOSF_MBI && PM
	depends on !INTEL_ATOMISP
	help
	  Power-management driver for Intel's Image Signal Processor found on
	  Bay Trail and Cherry Trail devices. This dummy driver's sole purpose
	  is to turn the ISP off (put it in D3) to save power and to allow
	  entering of S0ix modes.

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

config INTEL_CHT_INT33FE
	tristate "Intel Cherry Trail ACPI INT33FE Driver"
	depends on X86 && ACPI && I2C && REGULATOR
	depends on CHARGER_BQ24190=y || (CHARGER_BQ24190=m && m)
	depends on USB_ROLES_INTEL_XHCI=y || (USB_ROLES_INTEL_XHCI=m && m)
	depends on TYPEC_MUX_PI3USB30532=y || (TYPEC_MUX_PI3USB30532=m && m)
	help
	  This driver add support for the INT33FE ACPI device found on
	  some Intel Cherry Trail devices.

	  There are two kinds of INT33FE ACPI device possible: for hardware
	  with USB Type-C and Micro-B connectors. This driver supports both.

	  The INT33FE ACPI device has a CRS table with I2cSerialBusV2
	  resources for Fuel Gauge Controller and (in the Type-C variant)
	  FUSB302 USB Type-C Controller and PI3USB30532 USB switch.
	  This driver instantiates i2c-clients for these, so that standard
	  i2c drivers for these chips can bind to the them.

	  If you enable this driver it is advised to also select
	  CONFIG_BATTERY_BQ27XXX=m or CONFIG_BATTERY_BQ27XXX_I2C=m for Micro-B
	  device and CONFIG_TYPEC_FUSB302=m and CONFIG_BATTERY_MAX17042=m
	  for Type-C device.

config INTEL_HID_EVENT
	tristate "INTEL HID Event"
	depends on ACPI
	depends on INPUT
	select INPUT_SPARSEKMAP
	help
	  This driver provides support for the Intel HID Event hotkey interface.
	  Some laptops require this driver for hotkey support.

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

config INTEL_INT0002_VGPIO
	tristate "Intel ACPI INT0002 Virtual GPIO driver"
	depends on GPIOLIB && ACPI && PM_SLEEP
	select GPIOLIB_IRQCHIP
	help
	  Some peripherals on Bay Trail and Cherry Trail platforms signal a
	  Power Management Event (PME) to the Power Management Controller (PMC)
	  to wakeup the system. When this happens software needs to explicitly
	  clear the PME bus 0 status bit in the GPE0a_STS register to avoid an
	  IRQ storm on IRQ 9.

	  This is modelled in ACPI through the INT0002 ACPI device, which is
	  called a "Virtual GPIO controller" in ACPI because it defines the
	  event handler to call when the PME triggers through _AEI and _L02
	  methods as would be done for a real GPIO interrupt in ACPI.

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

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 INTEL_OAKTRAIL
	tristate "Intel Oaktrail Platform Extras"
	depends on ACPI
	depends on ACPI_VIDEO || ACPI_VIDEO = n
	depends on RFKILL && BACKLIGHT_CLASS_DEVICE && ACPI
	help
	  Intel Oaktrail platform need this driver to provide interfaces to
	  enable/disable the Camera, WiFi, BT etc. devices. If in doubt, say Y
	  here; it will only load on supported platforms.

config INTEL_VBTN
	tristate "INTEL VIRTUAL BUTTON"
	depends on ACPI
	depends on INPUT
	select INPUT_SPARSEKMAP
	help
	  This driver provides support for the Intel Virtual Button interface.
	  Some laptops require this driver for power button support.

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

config SURFACE3_WMI
	tristate "Surface 3 WMI Driver"
	depends on ACPI_WMI
	depends on DMI
	depends on INPUT
	depends on SPI
	help
	  Say Y here if you have a Surface 3.

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

config SURFACE_3_BUTTON
	tristate "Power/home/volume buttons driver for Microsoft Surface 3 tablet"
	depends on ACPI && KEYBOARD_GPIO && I2C
	help
	  This driver handles the power/home/volume buttons on the Microsoft Surface 3 tablet.

config SURFACE_3_POWER_OPREGION
	tristate "Surface 3 battery platform operation region support"
	depends on ACPI && I2C
	help
	  This driver provides support for ACPI operation
	  region of the Surface 3 battery platform driver.

config SURFACE_PRO3_BUTTON
	tristate "Power/home/volume buttons driver for Microsoft Surface Pro 3/4 tablet"
	depends on ACPI && INPUT
	help
	  This driver handles the power/home/volume buttons on the Microsoft Surface Pro 3/4 tablet.

config MSI_LAPTOP
	tristate "MSI Laptop Extras"
	depends on ACPI
	depends on BACKLIGHT_CLASS_DEVICE
	depends on ACPI_VIDEO || ACPI_VIDEO = n
	depends on RFKILL
	depends on INPUT && SERIO_I8042
	select INPUT_SPARSEKMAP
	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 MSI_WMI
	tristate "MSI WMI extras"
	depends on ACPI_WMI
	depends on INPUT
	depends on BACKLIGHT_CLASS_DEVICE
	depends on ACPI_VIDEO || ACPI_VIDEO = n
	select INPUT_SPARSEKMAP
	help
	 Say Y here if you want to support WMI-based hotkeys on MSI laptops.

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

config XO15_EBOOK
	tristate "OLPC XO-1.5 ebook switch"
	depends on OLPC || COMPILE_TEST
	depends on ACPI && INPUT
	help
	  Support for the ebook switch on the OLPC XO-1.5 laptop.

	  This switch is triggered as the screen is rotated and folded down to
	  convert the device into ebook form.

config XO1_RFKILL
	tristate "OLPC XO-1 software RF kill switch"
	depends on OLPC || COMPILE_TEST
	depends on RFKILL
	help
	  Support for enabling/disabling the WLAN interface on the OLPC XO-1
	  laptop.

config PCENGINES_APU2
	tristate "PC Engines APUv2/3 front button and LEDs driver"
	depends on INPUT && INPUT_KEYBOARD && GPIOLIB
	depends on LEDS_CLASS
	select GPIO_AMD_FCH
	select KEYBOARD_GPIO_POLLED
	select LEDS_GPIO
	help
	  This driver provides support for the front button and LEDs on
	  PC Engines APUv2/APUv3 board.

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

config SAMSUNG_LAPTOP
	tristate "Samsung Laptop driver"
	depends on RFKILL || RFKILL = n
	depends on ACPI_VIDEO || ACPI_VIDEO = n
	depends on BACKLIGHT_CLASS_DEVICE
	select LEDS_CLASS
	select NEW_LEDS
	help
	  This module implements a driver for a wide range of different
	  Samsung laptops.  It offers control over the different
	  function keys, wireless LED, LCD backlight level.

	  It may also provide some sysfs files described in
	  <file:Documentation/ABI/testing/sysfs-driver-samsung-laptop>

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

config SAMSUNG_Q10
	tristate "Samsung Q10 Extras"
	depends on ACPI
	select BACKLIGHT_CLASS_DEVICE
	help
	  This driver provides support for backlight control on Samsung Q10
	  and related laptops, including Dell Latitude X200.

config ACPI_TOSHIBA
	tristate "Toshiba Laptop Extras"
	depends on ACPI
	depends on ACPI_WMI
	select LEDS_CLASS
	select NEW_LEDS
	depends on BACKLIGHT_CLASS_DEVICE
	depends on INPUT
	depends on SERIO_I8042 || SERIO_I8042 = n
	depends on ACPI_VIDEO || ACPI_VIDEO = n
	depends on RFKILL || RFKILL = n
	depends on IIO
	select INPUT_SPARSEKMAP
	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 TOSHIBA_BT_RFKILL
	tristate "Toshiba Bluetooth RFKill switch support"
	depends on ACPI
	depends on RFKILL || RFKILL = n
	help
	  This driver adds support for Bluetooth events for the RFKill
	  switch on modern Toshiba laptops with full ACPI support and
	  an RFKill switch.

	  This driver handles RFKill events for the TOS6205 Bluetooth,
	  and re-enables it when the switch is set back to the 'on'
	  position.

	  If you have a modern Toshiba laptop with a Bluetooth and an
	  RFKill switch (such as the Portege R500), say Y.

config TOSHIBA_HAPS
	tristate "Toshiba HDD Active Protection Sensor"
	depends on ACPI
	help
	  This driver adds support for the built-in accelerometer
	  found on recent Toshiba laptops equipped with HID TOS620A
	  device.

	  This driver receives ACPI notify events 0x80 when the sensor
	  detects a sudden move or a harsh vibration, as well as an
	  ACPI notify event 0x81 whenever the movement or vibration has
	  been stabilized.

	  Also provides sysfs entries to get/set the desired protection
	  level and resetting the HDD protection interface.

	  If you have a recent Toshiba laptop with a built-in accelerometer
	  device, say Y.

config TOSHIBA_WMI
	tristate "Toshiba WMI Hotkeys Driver (EXPERIMENTAL)"
	depends on ACPI_WMI
	depends on INPUT
	select INPUT_SPARSEKMAP
	help
	  This driver adds hotkey monitoring support to some Toshiba models
	  that manage the hotkeys via WMI events.

	  WARNING: This driver is incomplete as it lacks a proper keymap and the
	  *notify function only prints the ACPI event type value. Be warned that
	  you will need to provide some information if you have a Toshiba model
	  with WMI event hotkeys and want to help with the development of this
	  driver.

	  If you have a WMI-based hotkeys Toshiba laptop, say Y or M here.

config ACPI_CMPC
	tristate "CMPC Laptop Extras"
	depends on ACPI && INPUT
	depends on RFKILL || RFKILL=n
	select BACKLIGHT_CLASS_DEVICE
	help
	  Support for Intel Classmate PC ACPI devices, including some
	  keys as input device, backlight device, tablet and accelerometer
	  devices.

config COMPAL_LAPTOP
	tristate "Compal (and others) Laptop Extras"
	depends on ACPI
	depends on BACKLIGHT_CLASS_DEVICE
	depends on ACPI_VIDEO || ACPI_VIDEO = n
	depends on RFKILL
	depends on HWMON
	depends on POWER_SUPPLY
	help
	  This is a driver for laptops built by Compal, and some models by
	  other brands (e.g. Dell, Toshiba).

	  It adds support for rfkill, Bluetooth, WLAN, LCD brightness, hwmon
	  and battery charging level control.

config LG_LAPTOP
	tristate "LG Laptop Extras"
	depends on ACPI
	depends on ACPI_WMI
	depends on INPUT
	select INPUT_SPARSEKMAP
	select NEW_LEDS
	select LEDS_CLASS
	help
	 This driver adds support for hotkeys as well as control of keyboard
	 backlight, battery maximum charge level and various other ACPI
	 features.

	 If you have an LG Gram laptop, say Y or M here.

config PANASONIC_LAPTOP
	tristate "Panasonic Laptop Extras"
	depends on INPUT && ACPI
	depends on BACKLIGHT_CLASS_DEVICE
	select INPUT_SPARSEKMAP
	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 SONY_LAPTOP
	tristate "Sony Laptop Extras"
	depends on ACPI
	depends on ACPI_VIDEO || ACPI_VIDEO = n
	depends on 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/admin-guide/laptops/sony-laptop.rst> 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 SYSTEM76_ACPI
	tristate "System76 ACPI Driver"
	depends on ACPI
	select NEW_LEDS
	select LEDS_CLASS
	select LEDS_TRIGGERS
	help
	  This is a driver for System76 laptops running open firmware. It adds
	  support for Fn-Fx key combinations, keyboard backlight, and airplane mode
	  LEDs.

	  If you have a System76 laptop running open firmware, say Y or M here.

config TOPSTAR_LAPTOP
	tristate "Topstar Laptop Extras"
	depends on ACPI
	depends on INPUT
	select INPUT_SPARSEKMAP
	select LEDS_CLASS
	select NEW_LEDS
	help
	  This driver adds support for hotkeys found on Topstar laptops.

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

config I2C_MULTI_INSTANTIATE
	tristate "I2C multi instantiate pseudo device driver"
	depends on I2C && ACPI
	help
	  Some ACPI-based systems list multiple i2c-devices in a single ACPI
	  firmware-node. This driver will instantiate separate i2c-clients
	  for each device in the firmware-node.

	  To compile this driver as a module, choose M here: the module
	  will be called i2c-multi-instantiate.

config MLX_PLATFORM
	tristate "Mellanox Technologies platform support"
	depends on I2C
	select REGMAP
	help
	  This option enables system support for the Mellanox Technologies
	  platform. The Mellanox systems provide data center networking
	  solutions based on Virtual Protocol Interconnect (VPI) technology
	  enable seamless connectivity to 56/100Gb/s InfiniBand or 10/40/56GbE
	  connection.

	  If you have a Mellanox system, say Y or M here.

config TOUCHSCREEN_DMI
	bool "DMI based touchscreen configuration info"
	depends on ACPI && DMI && I2C=y && TOUCHSCREEN_SILEAD
	select EFI_EMBEDDED_FIRMWARE if EFI
	help
	  Certain ACPI based tablets with e.g. Silead or Chipone touchscreens
	  do not have enough data in ACPI tables for the touchscreen driver to
	  handle the touchscreen properly, as OEMs expect the data to be baked
	  into the tablet model specific version of the driver shipped with the
	  the OS-image for the device. This option supplies the missing info.
	  Enable this for x86 tablets with Silead or Chipone touchscreens.

config INTEL_IMR
	bool "Intel Isolated Memory Region support"
	depends on X86_INTEL_QUARK && IOSF_MBI
	help
	  This option provides a means to manipulate Isolated Memory Regions.
	  IMRs are a set of registers that define read and write access masks
	  to prohibit certain system agents from accessing memory with 1 KiB
	  granularity.

	  IMRs make it possible to control read/write access to an address
	  by hardware agents inside the SoC. Read and write masks can be
	  defined for:
		- eSRAM flush
		- Dirty CPU snoop (write only)
		- RMU access
		- PCI Virtual Channel 0/Virtual Channel 1
		- SMM mode
		- Non SMM mode

	  Quark contains a set of eight IMR registers and makes use of those
	  registers during its bootup process.

	  If you are running on a Galileo/Quark say Y here.

config INTEL_IPS
	tristate "Intel Intelligent Power Sharing"
	depends on ACPI && PCI
	help
	  Intel Calpella platforms support dynamic power sharing between the
	  CPU and GPU, maximizing performance in a given TDP.  This driver,
	  along with the CPU frequency and i915 drivers, provides that
	  functionality.  If in doubt, say Y here; it will only load on
	  supported platforms.

config INTEL_RST
        tristate "Intel Rapid Start Technology Driver"
	depends on ACPI
	help
	  This driver provides support for modifying parameters on systems
	  equipped with Intel's Rapid Start Technology. When put in an ACPI
	  sleep state, these devices will wake after either a configured
	  timeout or when the system battery reaches a critical state,
	  automatically copying memory contents to disk. On resume, the
	  firmware will copy the memory contents back to RAM and resume the OS
	  as usual.

config INTEL_SMARTCONNECT
        tristate "Intel Smart Connect disabling driver"
	depends on ACPI
	help
	  Intel Smart Connect is a technology intended to permit devices to
	  update state by resuming for a short period of time at regular
	  intervals. If a user enables this functionality under Windows and
	  then reboots into Linux, the system may remain configured to resume
	  on suspend. In the absence of any userspace to support it, the system
	  will then remain awake until something triggers another suspend.

	  This driver checks to determine whether the device has Intel Smart
	  Connect enabled, and if so disables it.

source "drivers/platform/x86/intel_speed_select_if/Kconfig"

config INTEL_TURBO_MAX_3
	bool "Intel Turbo Boost Max Technology 3.0 enumeration driver"
	depends on X86_64 && SCHED_MC_PRIO
	help
	  This driver reads maximum performance ratio of each CPU and set up
	  the scheduler priority metrics. In this way scheduler can prefer
	  CPU with higher performance to schedule tasks.
	  This driver is only required when the system is not using Hardware
	  P-States (HWP). In HWP mode, priority can be read from ACPI tables.

config INTEL_UNCORE_FREQ_CONTROL
	tristate "Intel Uncore frequency control driver"
	depends on X86_64
	help
	  This driver allows control of uncore frequency limits on
	  supported server platforms.
	  Uncore frequency controls RING/LLC (last-level cache) clocks.

	  To compile this driver as a module, choose M here: the module
	  will be called intel-uncore-frequency.

config INTEL_BXTWC_PMIC_TMU
	tristate "Intel BXT Whiskey Cove TMU Driver"
	depends on REGMAP
	depends on MFD_INTEL_PMC_BXT
	depends on INTEL_SOC_PMIC_BXTWC
	help
	  Select this driver to use Intel BXT Whiskey Cove PMIC TMU feature.
	  This driver enables the alarm wakeup functionality in the TMU unit
	  of Whiskey Cove PMIC.

config INTEL_CHTDC_TI_PWRBTN
	tristate "Intel Cherry Trail Dollar Cove TI power button driver"
	depends on INTEL_SOC_PMIC_CHTDC_TI
	depends on INPUT
	help
	  This option adds a power button driver driver for Dollar Cove TI
	  PMIC on Intel Cherry Trail devices.

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

config INTEL_MFLD_THERMAL
       tristate "Thermal driver for Intel Medfield platform"
       depends on MFD_INTEL_MSIC && THERMAL
       help
         Say Y here to enable thermal driver support for the  Intel Medfield
         platform.

config INTEL_MID_POWER_BUTTON
	tristate "power button driver for Intel MID platforms"
	depends on INTEL_SCU && INPUT
	help
	  This driver handles the power button on the Intel MID platforms.

	  If unsure, say N.

config INTEL_MRFLD_PWRBTN
	tristate "Intel Merrifield Basin Cove power button driver"
	depends on INTEL_SOC_PMIC_MRFLD
	depends on INPUT
	help
	  This option adds a power button driver for Basin Cove PMIC
	  on Intel Merrifield devices.

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

config INTEL_PMC_CORE
	tristate "Intel PMC Core driver"
	depends on PCI
	help
	  The Intel Platform Controller Hub for Intel Core SoCs provides access
	  to Power Management Controller registers via a PCI interface. This
	  driver can utilize debugging capabilities and supported features as
	  exposed by the Power Management Controller.

	  Supported features:
		- SLP_S0_RESIDENCY counter
		- PCH IP Power Gating status
		- LTR Ignore
		- MPHY/PLL gating status (Sunrisepoint PCH only)

config INTEL_PUNIT_IPC
	tristate "Intel P-Unit IPC Driver"
	help
	  This driver provides support for Intel P-Unit Mailbox IPC mechanism,
	  which is used to bridge the communications between kernel and P-Unit.

config INTEL_SCU_IPC
	bool

config INTEL_SCU
	bool
	select INTEL_SCU_IPC

config INTEL_SCU_PCI
	bool "Intel SCU PCI driver"
	depends on PCI
	select INTEL_SCU
	help
	  This driver is used to bridge the communications between kernel
	  and SCU on some embedded Intel x86 platforms. It also creates
	  devices that are connected to the SoC through the SCU.
	  Platforms supported:
	    Medfield
	    Clovertrail
	    Merrifield
	    Broxton
	    Apollo Lake

config INTEL_SCU_PLATFORM
	tristate "Intel SCU platform driver"
	depends on ACPI
	select INTEL_SCU
	help
	  This driver is used to bridge the communications between kernel
	  and SCU (sometimes called PMC as well). The driver currently
	  supports Intel Elkhart Lake and compatible platforms.

config INTEL_SCU_IPC_UTIL
	tristate "Intel SCU IPC utility driver"
	depends on INTEL_SCU
	help
	  The IPC Util driver provides an interface with the SCU enabling
	  low level access for debug work and updating the firmware. Say
	  N unless you will be doing this on an Intel MID platform.

config INTEL_TELEMETRY
	tristate "Intel SoC Telemetry Driver"
	depends on X86_64
	depends on MFD_INTEL_PMC_BXT
	depends on INTEL_PUNIT_IPC
	help
	  This driver provides interfaces to configure and use
	  telemetry for INTEL SoC from APL onwards. It is also
	  used to get various SoC events and parameters
	  directly via debugfs files. Various tools may use
	  this interface for SoC state monitoring.

endif # X86_PLATFORM_DEVICES

config PMC_ATOM
       def_bool y
       depends on PCI
       select COMMON_CLK
