thermal: introduce clock cooling device
authorEduardo Valentin <eduardo.valentin@ti.com>
Mon, 6 Jan 2014 13:04:18 +0000 (09:04 -0400)
committerEduardo Valentin <edubezval@gmail.com>
Thu, 20 Nov 2014 14:43:16 +0000 (10:43 -0400)
commitf9df89d897ee0928aa4e03b30250e87f5d1e788a
tree8f18e403fc6ef4225b0b40c3abfcb32d7ecef888
parentfc14f9c1272f62c3e8d01300f52467c0d9af50f9
thermal: introduce clock cooling device

This patch introduces a new thermal cooling device based on common clock
framework. The original motivation to write this cooling device is to be
able to cool down thermal zones using clocks that feed co-processors, such
as GPUs, DSPs, Image Processing Co-processors, etc. But it is written
in a way that it can be used on top of any clock.

The implementation is pretty straight forward. The code creates
a thermal cooling device based on a pair of a struct device and a clock name.
The struct device is assumed to be usable by the OPP layer. The OPP layer
is used as source of the list of possible frequencies. The (cpufreq) frequency
table is then used as a map from frequencies to cooling states. Cooling
states are indexes to the frequency table.

The logic sits on top of common clock framework, specifically on clock
pre notifications. Any PRE_RATE_CHANGE is hijacked, and the transition is
only allowed when the new rate is within the thermal limit (cooling state -> freq).

When a thermal cooling device state transition is requested, the clock
is also checked to verify if the current clock rate is within the new
thermal limit.

Cc: Zhang Rui <rui.zhang@intel.com>
Cc: Mike Turquette <mturquette@linaro.org>
Cc: Nishanth Menon <nm@ti.com>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: Len Brown <len.brown@intel.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: linux-pm@vger.kernel.org
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Eduardo Valentin <eduardo.valentin@ti.com>
Signed-off-by: Eduardo Valentin <edubezval@gmail.com>
drivers/thermal/Kconfig
drivers/thermal/Makefile
drivers/thermal/clock_cooling.c [new file with mode: 0644]
include/linux/clock_cooling.h [new file with mode: 0644]