[RFC] thermal sensor drivers under drivers/hwmon

Amit Kucheria amit.kucheria at linaro.org
Thu Nov 25 06:57:43 UTC 2010


On 10 Nov 25, Yong Shen wrote:
> On Wed, Nov 24, 2010 at 7:02 PM, Amit Kucheria <amit.kucheria at linaro.org> wrote:
> > On 10 Nov 24, Yong Shen wrote:
> >> Hi there,
> >>
> >> In power management group, we have a working item of exposing thermal
> >> information to user space through sysfs. However, so far, the thermal
> >> sensor drivers under 'drivers/hwmon' expose their information in
> >> various nodes under sysfs, which makes information collection
> >> difficult.
> >> Intel's thermal framework is located under 'drivers/thermal', but all
> >> the thermal drivers under hwmon don't make use of it due to some
> >> reason (part of the reason for this situation may be that intel's
> >> thermal framework is comparatively new therefore when those sensor
> >> drivers were implemented they did not have a framework to register
> >> themselves.)
> >
> > It is not that new (after checking)
> >
> > $ git describe 203d3d4aa482339b4816f131f713e1b8ee37f6dd
> > v2.6.24-6482-g203d3d4
> >
> 
> I meant it is newer than drivers/hwmon which was first introduced in
> 2005, while drivers/thermal was introduced in 2008.
> >> We like to find out a simple and unified way to expose thermal related
> >> information, intel's thermal interface could be a choice. Using
> >> thermal framework is straightforward, below is a sample driver for
> >> this purpose. Thus all the information goes to /sys/class/thermal,
> >> like temperature, mode...
> >>
> >> ...
> >> #include <linux/module.h>
> >> #include <linux/device.h>
> >> #include <linux/thermal.h>
> >> #include <linux/hwmon.h>
> >> static int thermal_get_temp(struct thermal_zone_device *thermal,
> >>                                             unsigned long *temp)
> >> {
> >>         *temp = xxx;
> >>         return 0;
> >> }
> >> static struct device *hwmon;
> >> static struct thermal_zone_device *thermal;
> >> static struct thermal_zone_device_ops ops = {
> >>         .get_temp = thermal_get_temp,
> >> };
> >> static int __init sensor_init(void)
> >> {
> >> ...
> >>         thermal = thermal_zone_device_register("sample", 0, 0,
> >>                         &ops, 0, 0, 0, 0);
> >> }
> >> static void __exit sensor_cleanup(void)
> >> {
> >> ...
> >> }
> >> module_init(sensor_init);
> >> module_exit(sensor_cleanup);
> >>
> >> Are there any better ideas about this? Your comments are highly appreciated.
> >
> > What is important is not just a user-space interface (in /sys), but also a
> > in-kernel interface that drivers can call.
> >
> > I had a brief look at the thermal API. There are two types of devices:
> >  * Thermal Zone (a sensor)
> >  * Cooling device (fan, processor, perhaps even a policy manager?)
> >
> > You can bind cooling devices with thermal zones.
> >
> > Can the thermal_zone_bind_cooling_device() function be used by external
> > drivers for registering call-backs for thermal trip conditions?
> 
> Yes. If I understand right, you also want to let this thermal
> framework communicate directly with other kernel modules or drivers.
> In this case, other modules can appear as a cooling device although
> they don't have to be a real one, and register themselves with a
> thermal_cooling_device_ops. When thermal zone device updates its
> status, it will go through all the trip points and invoke related
> binding cooling devices to set their states (ops->set_cur_state).
> Correct me.


Yes that is the possibility I'm thinking of. Now the question to ask the
various SoC vendors is, is that the interface they'd prefer?

Kevin, any thoughts?

/Amit




More information about the linaro-dev mailing list