#
# Generic thermal sysfs drivers configuration
#

menuconfig THERMAL
	tristate "Generic Thermal sysfs driver"
	help
	  Generic Thermal Sysfs driver offers a generic mechanism for
	  thermal management. Usually it's made up of one or more thermal
	  zone and cooling device.
	  Each thermal zone contains its own temperature, trip points,
	  cooling devices.
	  All platforms with ACPI thermal support can use this driver.
	  If you want this support, you should say Y or M here.

if THERMAL

config THERMAL_HWMON
	bool
	prompt "Expose thermal sensors as hwmon device"
	depends on HWMON=y || HWMON=THERMAL
	default y
	help
	  In case a sensor is registered with the thermal
	  framework, this option will also register it
	  as a hwmon. The sensor will then have the common
	  hwmon sysfs interface.

	  Say 'Y' here if you want all thermal sensors to
	  have hwmon sysfs interface too.

config THERMAL_OF
	bool
	prompt "APIs to parse thermal data out of device tree"
	depends on OF
	default y
	help
	  This options provides helpers to add the support to
	  read and parse thermal data definitions out of the
	  device tree blob.

	  Say 'Y' here if you need to build thermal infrastructure
	  based on device tree.

choice
	prompt "Default Thermal governor"
	default THERMAL_DEFAULT_GOV_STEP_WISE
	help
	  This option sets which thermal governor shall be loaded at
	  startup. If in doubt, select 'step_wise'.

config THERMAL_DEFAULT_GOV_STEP_WISE
	bool "step_wise"
	select THERMAL_GOV_STEP_WISE
	help
	  Use the step_wise governor as default. This throttles the
	  devices one step at a time.

config THERMAL_DEFAULT_GOV_FAIR_SHARE
	bool "fair_share"
	select THERMAL_GOV_FAIR_SHARE
	help
	  Use the fair_share governor as default. This throttles the
	  devices based on their 'contribution' to a zone. The
	  contribution should be provided through platform data.

config THERMAL_DEFAULT_GOV_USER_SPACE
	bool "user_space"
	select THERMAL_GOV_USER_SPACE
	help
	  Select this if you want to let the user space manage the
	  platform thermals.

endchoice

config THERMAL_GOV_FAIR_SHARE
	bool "Fair-share thermal governor"
	help
	  Enable this to manage platform thermals using fair-share governor.

config THERMAL_GOV_STEP_WISE
	bool "Step_wise thermal governor"
	help
	  Enable this to manage platform thermals using a simple linear
	  governor.

config THERMAL_GOV_USER_SPACE
	bool "User_space thermal governor"
	help
	  Enable this to let the user space manage the platform thermals.

config CPU_THERMAL
	bool "generic cpu cooling support"
	depends on CPU_FREQ
	depends on THERMAL_OF
	help
	  This implements the generic cpu cooling mechanism through frequency
	  reduction. An ACPI version of this already exists
	  (drivers/acpi/processor_thermal.c).
	  This will be useful for platforms using the generic thermal interface
	  and not the ACPI interface.

	  If you want this support, you should say Y here.

config THERMAL_EMULATION
	bool "Thermal emulation mode support"
	help
	  Enable this option to make a emul_temp sysfs node in thermal zone
	  directory to support temperature emulation. With emulation sysfs node,
	  user can manually input temperature and test the different trip
	  threshold behaviour for simulation purpose.

	  WARNING: Be careful while enabling this option on production systems,
	  because userland can easily disable the thermal policy by simply
	  flooding this sysfs node with low temperature values.

config IMX_THERMAL
	tristate "Temperature sensor driver for Freescale i.MX SoCs"
	depends on CPU_THERMAL
	depends on MFD_SYSCON
	depends on OF
	help
	  Support for Temperature Monitor (TEMPMON) found on Freescale i.MX SoCs.
	  It supports one critical trip point and one passive trip point.  The
	  cpufreq is used as the cooling device to throttle CPUs when the
	  passive trip is crossed.

config SPEAR_THERMAL
	bool "SPEAr thermal sensor driver"
	depends on PLAT_SPEAR
	depends on OF
	help
	  Enable this to plug the SPEAr thermal sensor driver into the Linux
	  thermal framework.

config RCAR_THERMAL
	tristate "Renesas R-Car thermal driver"
	depends on ARCH_SHMOBILE
	help
	  Enable this to plug the R-Car thermal sensor driver into the Linux
	  thermal framework.

config KIRKWOOD_THERMAL
	tristate "Temperature sensor on Marvell Kirkwood SoCs"
	depends on ARCH_KIRKWOOD
	depends on OF
	help
	  Support for the Kirkwood thermal sensor driver into the Linux thermal
	  framework. Only kirkwood 88F6282 and 88F6283 have this sensor.

config DOVE_THERMAL
	tristate "Temperature sensor on Marvell Dove SoCs"
	depends on ARCH_DOVE
	depends on OF
	help
	  Support for the Dove thermal sensor driver in the Linux thermal
	  framework.

config DB8500_THERMAL
	bool "DB8500 thermal management"
	depends on ARCH_U8500
	default y
	help
	  Adds DB8500 thermal management implementation according to the thermal
	  management framework. A thermal zone with several trip points will be
	  created. Cooling devices can be bound to the trip points to cool this
	  thermal zone if trip points reached.

config ARMADA_THERMAL
	tristate "Armada 370/XP thermal management"
	depends on ARCH_MVEBU
	depends on OF
	help
	  Enable this option if you want to have support for thermal management
	  controller present in Armada 370 and Armada XP SoC.

config DB8500_CPUFREQ_COOLING
	tristate "DB8500 cpufreq cooling"
	depends on ARCH_U8500
	depends on CPU_THERMAL
	default y
	help
	  Adds DB8500 cpufreq cooling devices, and these cooling devices can be
	  bound to thermal zone trip points. When a trip point reached, the
	  bound cpufreq cooling device turns active to set CPU frequency low to
	  cool down the CPU.

config INTEL_POWERCLAMP
	tristate "Intel PowerClamp idle injection driver"
	depends on THERMAL
	depends on X86
	depends on CPU_SUP_INTEL
	help
	  Enable this to enable Intel PowerClamp idle injection driver. This
	  enforce idle time which results in more package C-state residency. The
	  user interface is exposed via generic thermal framework.

config X86_PKG_TEMP_THERMAL
	tristate "X86 package temperature thermal driver"
	depends on X86_THERMAL_VECTOR
	select THERMAL_GOV_USER_SPACE
	default m
	help
	  Enable this to register CPU digital sensor for package temperature as
	  thermal zone. Each package will have its own thermal zone. There are
	  two trip points which can be set by user to get notifications via thermal
	  notification methods.

menu "Texas Instruments thermal drivers"
source "drivers/thermal/ti-soc-thermal/Kconfig"
endmenu

menu "Samsung thermal drivers"
depends on PLAT_SAMSUNG
source "drivers/thermal/samsung/Kconfig"
endmenu

endif
