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

menuconfig X86_PLATFORM_DRIVERS_DELL
	bool "Dell X86 Platform Specific Device Drivers"
	help
	  Say Y here to get to see options for device drivers for various
	  Dell 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_DRIVERS_DELL

config ALIENWARE_WMI
	tristate "Alienware Special feature control"
	default m
	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 DCDBAS
	tristate "Dell Systems Management Base Driver"
	default m
	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/userspace-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.

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

config DELL_RBU
	tristate "BIOS update support for DELL systems via sysfs"
	default m
	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_RBTN
	tristate "Dell Airplane Mode Switch driver"
	default m
	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_PC
	tristate "Dell PC Extras"
	default m
	depends on ACPI
	depends on DMI
	depends on DELL_SMBIOS
	select ACPI_PLATFORM_PROFILE
	help
	This driver adds support for controlling the fan modes via platform_profile
	on supported Dell systems regardless of formfactor.
	Module will simply do nothing if thermal management commands are not
	supported.

#
# 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"
	default m
	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_SMO8800
	tristate "Dell Latitude freefall driver (ACPI SMO88XX)"
	default m
	depends on ACPI || COMPILE_TEST
	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_UART_BACKLIGHT
	tristate "Dell AIO UART Backlight driver"
	depends on ACPI
	depends on ACPI_VIDEO
	depends on BACKLIGHT_CLASS_DEVICE
	depends on SERIAL_DEV_BUS
	help
	  Say Y here if you want to support Dell AIO UART backlight interface.
	  The Dell AIO machines released after 2017 come with a UART interface
	  to communicate with the backlight scalar board. This driver creates
	  a standard backlight interface and talks to the scalar board through
	  UART to adjust the AIO screen brightness.

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

config DELL_WMI
	tristate "Dell WMI notifications"
	default m
	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_PRIVACY
	bool "Dell WMI Hardware Privacy Support"
	depends on DELL_WMI
	help
	  This option adds integration with the "Dell Hardware Privacy"
	  feature of Dell laptops to the dell-wmi driver.

config DELL_WMI_AIO
	tristate "WMI Hotkeys for Dell All-In-One series"
	default m
	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_DESCRIPTOR
	tristate
	default n
	depends on ACPI_WMI

config DELL_WMI_DDV
	tristate "Dell WMI sensors Support"
	default m
	depends on ACPI_WMI
	depends on ACPI_BATTERY || HWMON
	help
	  This option adds support for WMI-based fan and thermal sensors
	  found on some Dell notebooks. It also supports various WMI-based battery
	  extras like reading of the battery temperature and ePPID.

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

config DELL_WMI_LED
	tristate "External LED on Dell Business Netbooks"
	default m
	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 DELL_WMI_SYSMAN
	tristate "Dell WMI-based Systems management driver"
	default m
	depends on ACPI_WMI
	depends on DMI
	select NLS
	select FW_ATTR_CLASS
	help
	  This driver allows changing BIOS settings on many Dell machines from
	  2018 and newer without the use of any additional software.

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

endif # X86_PLATFORM_DRIVERS_DELL
