#
# 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.

config THERMAL_HWMON
	bool
	depends on THERMAL
	depends on HWMON=y || HWMON=THERMAL
	default y

config CPU_THERMAL
	bool "generic cpu cooling support"
	depends on THERMAL && CPU_FREQ
	help
	  This implements the generic cpu cooling mechanism through frequency
	  reduction, cpu hotplug and any other ways of reducing temperature. 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 SPEAR_THERMAL
	bool "SPEAr thermal sensor driver"
	depends on THERMAL
	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 THERMAL
	depends on ARCH_SHMOBILE
	help
	  Enable this to plug the R-Car thermal sensor driver into the Linux
	  thermal framework

config EXYNOS_THERMAL
	tristate "Temperature sensor on Samsung EXYNOS"
	depends on (ARCH_EXYNOS4 || ARCH_EXYNOS5) && THERMAL
	help
	  If you say yes here you get support for TMU (Thermal Managment
	  Unit) on SAMSUNG EXYNOS series of SoC.
