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

source "drivers/platform/x86/intel/atomisp2/Kconfig"
source "drivers/platform/x86/intel/ifs/Kconfig"
source "drivers/platform/x86/intel/int1092/Kconfig"
source "drivers/platform/x86/intel/int3472/Kconfig"
source "drivers/platform/x86/intel/pmc/Kconfig"
source "drivers/platform/x86/intel/pmt/Kconfig"
source "drivers/platform/x86/intel/speed_select_if/Kconfig"
source "drivers/platform/x86/intel/telemetry/Kconfig"
source "drivers/platform/x86/intel/wmi/Kconfig"
source "drivers/platform/x86/intel/uncore-frequency/Kconfig"


config INTEL_HID_EVENT
	tristate "Intel HID Event"
	depends on ACPI
	depends on INPUT
	depends on I2C
	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_VBTN
	tristate "Intel Virtual Button"
	depends on ACPI
	depends on INPUT
	depends on I2C
	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 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_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_BXTWC_PMIC_TMU
	tristate "Intel Broxton Whiskey Cove TMU Driver"
	depends on INTEL_SOC_PMIC_BXTWC
	depends on MFD_INTEL_PMC_BXT
	select REGMAP
	help
	  Select this driver to use Intel Broxton 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 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_CHTWC_INT33FE
	tristate "Intel Cherry Trail Whiskey Cove 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 Intel Cherry Trail Whiskey Cove
	  INT33FE ACPI device found on the GPD win and the GPD pocket.

	  The INT33FE ACPI device on these mini laptops contains I2cSerialBusV2
	  resources for a MAX17042 Fuel Gauge, 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_TYPEC_FUSB302=m, CONFIG_TYPEC_MUX_PI3USB30532=m and
	  CONFIG_BATTERY_MAX17042=m.

config INTEL_ISHTP_ECLITE
	tristate "Intel ISHTP eclite controller Driver"
	depends on INTEL_ISH_HID
	depends on ACPI
	help
	  This driver is for accessing the PSE (Programmable Service Engine) -
	  an Embedded Controller like IP - using ISHTP (Integrated Sensor Hub
	  Transport Protocol) to get battery, thermal and UCSI (USB Type-C
	  Connector System Software Interface) related data from the platform.
	  Users who don't want to use discrete Embedded Controller on Intel's
	  Elkhartlake platform can leverage this integrated solution of
	  ECLite which is part of PSE subsystem.

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

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_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_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_SDSI
	tristate "Intel Software Defined Silicon Driver"
	depends on INTEL_VSEC
	depends on X86_64
	help
	  This driver enables access to the Intel Software Defined Silicon
	  interface used to provision silicon features with an authentication
	  certificate and capability license.

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

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.

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_VSEC
	tristate "Intel Vendor Specific Extended Capabilities Driver"
	depends on PCI
	select AUXILIARY_BUS
	help
	  Adds support for feature drivers exposed using Intel PCIe VSEC and
	  DVSEC.

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