public inbox for linux-acpi@vger.kernel.org
 help / color / mirror / Atom feed
From: Randy Dunlap <randy.dunlap@oracle.com>
To: Len Brown <lenb@kernel.org>
Cc: linux-acpi@vger.kernel.org, Zhang Rui <rui.zhang@intel.com>,
	Thomas Sujith <sujith.thomas@intel.com>,
	Len Brown <len.brown@intel.com>
Subject: Re: [PATCH 053/112] the generic thermal sysfs driver
Date: Thu, 7 Feb 2008 08:46:45 -0800	[thread overview]
Message-ID: <20080207084645.c6e67aad.randy.dunlap@oracle.com> (raw)
In-Reply-To: <203d3d4aa482339b4816f131f713e1b8ee37f6dd.1202376824.git.len.brown@intel.com>

On Thu,  7 Feb 2008 04:34:15 -0500 Len Brown wrote:

> From: Zhang Rui <rui.zhang@intel.com>
> 
> The Generic Thermal sysfs driver for thermal management.
> 
> Signed-off-by: Zhang Rui <rui.zhang@intel.com>
> Signed-off-by: Thomas Sujith <sujith.thomas@intel.com>
> Signed-off-by: Len Brown <len.brown@intel.com>
> ---
>  Documentation/thermal/sysfs-api.txt |  246 ++++++++++++
>  drivers/Kconfig                     |    2 +
>  drivers/Makefile                    |    1 +
>  drivers/thermal/Kconfig             |   15 +
>  drivers/thermal/Makefile            |    5 +
>  drivers/thermal/thermal.c           |  714 +++++++++++++++++++++++++++++++++++
>  include/linux/thermal.h             |   90 +++++
>  7 files changed, 1073 insertions(+), 0 deletions(-)
>  create mode 100644 Documentation/thermal/sysfs-api.txt
>  create mode 100644 drivers/thermal/Kconfig
>  create mode 100644 drivers/thermal/Makefile
>  create mode 100644 drivers/thermal/thermal.c
>  create mode 100644 include/linux/thermal.h
> 
> diff --git a/Documentation/thermal/sysfs-api.txt b/Documentation/thermal/sysfs-api.txt
> new file mode 100644
> index 0000000..5776e09
> --- /dev/null
> +++ b/Documentation/thermal/sysfs-api.txt

Nice doc.  Thanks.

> @@ -0,0 +1,246 @@
> +Generic Thermal Sysfs driver How To
> +=========================
> +
> +Written by Sujith Thomas <sujith.thomas@intel.com>, Zhang Rui <rui.zhang@intel.com>
> +
> +Updated: 2 January 2008
> +
> +Copyright (c)  2008 Intel Corporation
> +
> +
> +0. Introduction
> +
> +The generic thermal sysfs provides a set of interfaces for thermal zone devices (sensors)
> +and thermal cooling devices (fan, processor...) to register with the thermal management
> +solution and to be a part of it.
> +
> +This how-to focusses on enabling new thermal zone and cooling devices to participate

s/focusses/focuses/

> +in thermal management.
> +This solution is platform independent and any type of thermal zone devices and
> +cooling devices should be able to make use of the infrastructure.
> +
> +The main task of the thermal sysfs driver is to expose thermal zone attributes as well
> +as cooling device attributes to the user space.
> +An intelligent thermal management application can make decisions based on inputs
> +from thermal zone attributes (the current temperature and trip point temperature)
> +and throttle appropriate devices.
> +
> +[0-*]	denotes any positive number starting from 0
> +[1-*]	denotes any positive number starting from 1
> +
...

> +2. sysfs attributes structure
> +
> +RO	read only value
> +RW	read/write value
> +
> +All thermal sysfs attributes will be represented under /sys/class/thermal
> +/sys/class/thermal/

Is that a duplicated path?  or what?

> +
> +Thermal zone device sys I/F, created once it's registered:
> +|thermal_zone[0-*]:
> +	|-----type:			Type of the thermal zone
> +	|-----temp:			Current temperature
> +	|-----mode:			Working mode of the thermal zone
> +	|-----trip_point_[0-*]_temp:	Trip point temperature
> +	|-----trip_point_[0-*]_type:	Trip point type
> +
> +Thermal cooling device sys I/F, created once it's registered:
> +|cooling_device[0-*]:
> +	|-----type :			Type of the cooling device(processor/fan/...)
> +	|-----max_state:		Maximum cooling state of the cooling device
> +	|-----cur_state:		Current cooling state of the cooling device
> +
> +
> +These two dynamic attributes are created/removed in pairs.
> +They represent the relationship between a thermal zone and its associated cooling device.
> +They are created/removed for each
> +thermal_zone_bind_cooling_device/thermal_zone_unbind_cooling_device successful exection.
> +
> +|thermal_zone[0-*]
> +	|-----cdev[0-*]:		The [0-*]th cooling device in the current thermal zone
> +	|-----cdev[0-*]_trip_point:	Trip point that cdev[0-*] is associated with
> +
> +
> +***************************
> +* Thermal zone attributes *
> +***************************
> +
> +type				Strings which represent the thermal zone type.
> +				This is given by thermal zone driver as part of registration.
> +				Eg: "ACPI thermal zone" indicates it's a ACPI thermal device
> +				RO
> +				Optional
> +
> +temp				Current temperature as reported by thermal zone (sensor)
> +				Unit: degree celsius
> +				RO
> +				Required
> +
> +mode				One of the predifned values in [kernel, user]

                                           predefined

> +				This file gives information about the algorithm
> +				that is currently managing the thermal zone.
> +				It can be either default kernel based algorithm
> +				or user space application.
> +				RW
> +				Optional
> +				kernel	= Thermal management in kernel thermal zone driver.
> +				user	= Preventing kernel thermal zone driver actions upon
> +					  trip points so that user application can take full
> +					  charge of the thermal management.
> +
> +trip_point_[0-*]_temp		The temperature above which trip point will be fired
> +				Unit: degree celsius
> +				RO
> +				Optional
> +
> +trip_point_[0-*]_type 		Strings which indicate the type of the trip point
> +				Eg. it can be one of critical, hot, passive,

                                E.g.

> +				    active[0-*] for ACPI thermal zone.
> +				RO
> +				Optional
> +
> +cdev[0-*]			Sysfs link to the thermal cooling device node where the sys I/F
> +				for cooling device throttling control represents.
> +				RO
> +				Optional
> +
> +cdev[0-*]_trip_point		The trip point with which cdev[0-*] is assocated in this thermal zone
> +				-1 means the cooling device is not associated with any trip point.
> +				RO
> +				Optional
> +
> +******************************
> +* Cooling device  attributes *
> +******************************
> +
> +type				String which represents the type of device
> +				eg: For generic ACPI: this should be "Fan",
> +				"Processor" or "LCD"
> +				eg. For memory controller device on intel_menlow platform:
> +				this should be "Memory controller"
> +				RO
> +				Optional
> +
> +max_state			The maximum permissible cooling state of this cooling device.
> +				RO
> +				Required
> +
> +cur_state			The current cooling state of this cooling device.
> +				the value can any integer numbers between 0 and max_state,
> +				cur_state == 0 means no cooling
> +				cur_state == max_state means the maximum cooling.
> +				RW
> +				Required
> +
> +3. A simple implementation
> +
> +ACPI thermal zone may support multiple trip points like critical/hot/passive/active.
> +If an ACPI thermal zone supports critical, passive, active[0] and active[1] at the same time,
> +it may register itself as a thermale_zone_device (thermal_zone1) with 4 trip points in all.

                               thermale ?

> +It has one processor and one fan, which are both registered as thermal_cooling_device.
> +If the processor is listed in _PSL method, and the fan is listed in _AL0 method,
> +the sys I/F structure will be built like this:
> +
> +/sys/class/thermal:
> +
> +|thermal_zone1:
> +	|-----type:			ACPI thermal zone
> +	|-----temp:			37
> +	|-----mode:			kernel
> +	|-----trip_point_0_temp:	100
> +	|-----trip_point_0_type:	critical
> +	|-----trip_point_1_temp:	80
> +	|-----trip_point_1_type:	passive
> +	|-----trip_point_2_temp:	70
> +	|-----trip_point_2_type:	active[0]
> +	|-----trip_point_3_temp:	60
> +	|-----trip_point_3_type:	active[1]
> +	|-----cdev0:			--->/sys/class/thermal/cooling_device0
> +	|-----cdev0_trip_point:		1	/* cdev0 can be used for passive */
> +	|-----cdev1:			--->/sys/class/thermal/cooling_device3
> +	|-----cdev1_trip_point:		2	/* cdev1 can be used for active[0]*/
> +
> +|cooling_device0:
> +	|-----type:			Processor
> +	|-----max_state:		8
> +	|-----cur_state:		0
> +
> +|cooling_device3:
> +	|-----type:			Fan
> +	|-----max_state:		2
> +	|-----cur_state:		0

> diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig
> new file mode 100644
> index 0000000..9b3f612
> --- /dev/null
> +++ b/drivers/thermal/Kconfig
> @@ -0,0 +1,15 @@
> +#
> +# Generic thermal sysfs drivers configuration
> +#
> +
> +menuconfig THERMAL
> +	bool "Generic Thermal sysfs driver"
> +	default y
> +	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,

          Each

> +	  cooling devices.
> +	  All platforms with ACPI thermal support can use this driver.
> +	  If you want this support, you should say Y here

                                                     here.

> diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile
> new file mode 100644
> index 0000000..8ef1232
> --- /dev/null
> +++ b/drivers/thermal/Makefile
> @@ -0,0 +1,5 @@
> +#
> +# Makefile for sensor chip drivers.
> +#
> +
> +obj-$(CONFIG_THERMAL)		+= thermal.o
> diff --git a/drivers/thermal/thermal.c b/drivers/thermal/thermal.c
> new file mode 100644
> index 0000000..3273e34
> --- /dev/null
> +++ b/drivers/thermal/thermal.c
> @@ -0,0 +1,714 @@
> +/*
> + *  thermal.c - Generic Thermal Management Sysfs support.
> + *
> + *  Copyright (C) 2008 Intel Corp
> + *  Copyright (C) 2008 Zhang Rui <rui.zhang@intel.com>
> + *  Copyright (C) 2008 Sujith Thomas <sujith.thomas@intel.com>
> + *
> + *  
> + */
> +
> +#include <linux/module.h>
> +#include <linux/device.h>
> +#include <linux/err.h>
> +#include <linux/kdev_t.h>
> +#include <linux/idr.h>
> +#include <linux/thermal.h>
> +#include <linux/spinlock.h>
> +
> +MODULE_AUTHOR("Zhang Rui")
> +MODULE_DESCRIPTION("Generic thermal management sysfs support");
> +MODULE_LICENSE("GPL");
> +
> +#define PREFIX "Thermal: "
> +
> +struct thermal_cooling_device_instance {
> +	int id;
> +	char name[THERMAL_NAME_LENGTH];
> +	struct thermal_zone_device *tz;
> +	struct thermal_cooling_device *cdev;
> +	int trip;
> +	char attr_name[THERMAL_NAME_LENGTH];
> +	struct device_attribute attr;
> +	struct list_head node;
> +};
> +
> +static DEFINE_IDR(thermal_tz_idr);
> +static DEFINE_IDR(thermal_cdev_idr);
> +static DEFINE_MUTEX(thermal_idr_lock);
> +
> +static LIST_HEAD(thermal_tz_list);
> +static LIST_HEAD(thermal_cdev_list);
> +static DEFINE_MUTEX(thermal_list_lock);
> +
> +static int get_idr(struct idr *idr, struct mutex *lock, int *id)
> +{
> +	int err;
> +
> +      again:

Don't indent labels so much (just 0 or 1 spaces).  When they are
indented so much, it's difficult to see them (they are close to
hidden).


> +	if (unlikely(idr_pre_get(idr, GFP_KERNEL) == 0))
> +		return -ENOMEM;
> +
> +	if (lock)
> +		mutex_lock(lock);
> +	err = idr_get_new(idr, NULL, id);
> +	if (lock)
> +		mutex_unlock(lock);
> +	if (unlikely(err == -EAGAIN))
> +		goto again;
> +	else if (unlikely(err))
> +		return err;
> +
> +	*id = *id & MAX_ID_MASK;
> +	return 0;
> +}
> +
> +/* Device management */
> +
> +/**
> + * thermal_zone_bind_cooling_device - bind a cooling device to a thermal zone
> + * this function is usually called in the thermal zone device .bind callback.
> + * @tz:		thermal zone device
> + * @trip:	indicates which trip point the cooling devices is
> + *		associated with in this thermal zone.
> + * @cdev:	thermal cooling device
> + */

Please see Documentation/kernel-doc-nano-HOWTO.txt for info on
kernel-doc format.  The second line above ("this function...")
is out of place.  It should be moved to follow the function
parameters and separated from them by one "blank" (actually
" *") line.

> +int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz,
> +				     int trip,
> +				     struct thermal_cooling_device *cdev)
> +{
> +	struct thermal_cooling_device_instance *dev;
> +	struct thermal_cooling_device_instance *pos;
> +	int result;
> +
> +	if (trip >= tz->trips ||
> +	    (trip < 0 && trip != THERMAL_TRIPS_NONE))
> +		return -EINVAL;
> +
> +	if (!tz || !cdev)
> +		return -EINVAL;
> +
> +	dev =
> +	    kzalloc(sizeof(struct thermal_cooling_device_instance), GFP_KERNEL);
> +	if (!dev)
> +		return -ENOMEM;
> +	dev->tz = tz;
> +	dev->cdev = cdev;
> +	dev->trip = trip;
> +	result = get_idr(&tz->idr, &tz->lock, &dev->id);
> +	if (result)
> +		goto free_mem;
> +
> +	sprintf(dev->name, "cdev%d", dev->id);
> +	result =
> +	    sysfs_create_link(&tz->device.kobj, &cdev->device.kobj, dev->name);
> +	if (result)
> +		goto release_idr;
> +
> +	sprintf(dev->attr_name, "cdev%d_trip_point", dev->id);
> +	dev->attr.attr.name = dev->attr_name;
> +	dev->attr.attr.mode = 0444;
> +	dev->attr.show = thermal_cooling_device_trip_point_show;
> +	result = device_create_file(&tz->device, &dev->attr);
> +	if (result)
> +		goto remove_symbol_link;
> +
> +	mutex_lock(&tz->lock);
> +	list_for_each_entry(pos, &tz->cooling_devices, node)
> +	    if (pos->tz == tz && pos->trip == trip && pos->cdev == cdev) {
> +		result = -EEXIST;
> +		break;
> +	}
> +	if (!result)
> +		list_add_tail(&dev->node, &tz->cooling_devices);
> +	mutex_unlock(&tz->lock);
> +
> +	if (!result)
> +		return 0;
> +
> +	device_remove_file(&tz->device, &dev->attr);
> +      remove_symbol_link:
> +	sysfs_remove_link(&tz->device.kobj, dev->name);
> +      release_idr:
> +	release_idr(&tz->idr, &tz->lock, dev->id);
> +      free_mem:
> +	kfree(dev);
> +	return result;
> +}
> +EXPORT_SYMBOL(thermal_zone_bind_cooling_device);
> +
> +/**
> + * thermal_zone_unbind_cooling_device - unbind a cooling device from a thermal zone
> + * this function is usually called in the thermal zone device .unbind callback.
> + * @tz:		thermal zone device
> + * @trip:	indicates which trip point the cooling devices is
> + *		associated with in this thermal zone.
> + * @cdev:	thermal cooling device
> + */

Ditto.

> +int thermal_zone_unbind_cooling_device(struct thermal_zone_device *tz,
> +				       int trip,
> +				       struct thermal_cooling_device *cdev)
> +{
> +	struct thermal_cooling_device_instance *pos, *next;
> +
> +	mutex_lock(&tz->lock);
> +	list_for_each_entry_safe(pos, next, &tz->cooling_devices, node) {
> +		if (pos->tz == tz && pos->trip == trip
> +		    && pos->cdev == cdev) {
> +			list_del(&pos->node);
> +			mutex_unlock(&tz->lock);
> +			goto unbind;
> +		}
> +	}
> +	mutex_unlock(&tz->lock);
> +
> +	return -ENODEV;
> +
> +      unbind:
> +	device_remove_file(&tz->device, &pos->attr);
> +	sysfs_remove_link(&tz->device.kobj, pos->name);
> +	release_idr(&tz->idr, &tz->lock, pos->id);
> +	kfree(pos);
> +	return 0;
> +}
> +EXPORT_SYMBOL(thermal_zone_unbind_cooling_device);
> +
> +/**
> + * thermal_cooling_device_register - register a new thermal cooling device
> + * @type:	the thermal cooling device type.
> + * @devdata:	device private data.
> + * @ops:		standard thermal cooling devices callbacks.
> + */
> +struct thermal_cooling_device *thermal_cooling_device_register(char *type,
> +		       void *devdata, struct thermal_cooling_device_ops *ops)
> +{
> +	struct thermal_cooling_device *cdev;
> +	struct thermal_zone_device *pos;
> +	int result;
> +
> +	if (strlen(type) >= THERMAL_NAME_LENGTH)
> +		return NULL;
> +
> +	if (!ops || !ops->get_max_state || !ops->get_cur_state ||
> +		!ops->set_cur_state)
> +		return NULL;
> +
> +	cdev = kzalloc(sizeof(struct thermal_cooling_device), GFP_KERNEL);
> +	if (!cdev)
> +		return NULL;
> +
> +	result = get_idr(&thermal_cdev_idr, &thermal_idr_lock, &cdev->id);
> +	if (result) {
> +		kfree(cdev);
> +		return NULL;
> +	}
> +
> +	strcpy(cdev->type, type);
> +	cdev->ops = ops;
> +	cdev->device.class = &thermal_class;
> +	cdev->devdata = devdata;
> +	sprintf(cdev->device.bus_id, "cooling_device%d", cdev->id);
> +	result = device_register(&cdev->device);
> +	if (result) {
> +		release_idr(&thermal_cdev_idr, &thermal_idr_lock, cdev->id);
> +		kfree(cdev);
> +		return NULL;
> +	}
> +
> +	/* sys I/F */
> +	if (type) {
> +		result = device_create_file(&cdev->device,
> +					    &dev_attr_cdev_type);
> +		if (result)
> +			goto unregister;
> +	}
> +
> +	result = device_create_file(&cdev->device, &dev_attr_max_state);
> +	if (result)
> +		goto unregister;
> +
> +	result = device_create_file(&cdev->device, &dev_attr_cur_state);
> +	if (result)
> +		goto unregister;
> +
> +	mutex_lock(&thermal_list_lock);
> +	list_add(&cdev->node, &thermal_cdev_list);
> +	list_for_each_entry(pos, &thermal_tz_list, node) {
> +		if (!pos->ops->bind)
> +			continue;
> +		result = pos->ops->bind(pos, cdev);
> +		if (result)
> +			break;
> +
> +	}
> +	mutex_unlock(&thermal_list_lock);
> +
> +	if (!result)
> +		return cdev;
> +
> +      unregister:

Hidden label placement.  Please check all labels.


> +	release_idr(&thermal_cdev_idr, &thermal_idr_lock, cdev->id);
> +	device_unregister(&cdev->device);
> +	return NULL;
> +}
> +EXPORT_SYMBOL(thermal_cooling_device_register);
> +
> +/**
> + * thermal_cooling_device_unregister - removes the registered thermal cooling device
> + *

No "blank" (" *") line allowed between function name-description and the
function parameters.

> + * @cdev:	the thermal cooling device to remove.
> + *
> + * thermal_cooling_device_unregister() must be called when the device is no
> + * longer needed.
> + */
> +void thermal_cooling_device_unregister(struct
> +				       thermal_cooling_device
> +				       *cdev)
> +{
...
> +}
> +EXPORT_SYMBOL(thermal_cooling_device_unregister);
> +
> +/**
> + * thermal_zone_device_register - register a new thermal zone device
> + * @type:	the thermal zone device type
> + * @trips:	the number of trip points the thermal zone support
> + * @devdata:	private device data
> + * @ops:	standard thermal zone device callbacks
> + *
> + * thermal_zone_device_unregister() must be called when the device is no
> + * longer needed.
> + */
> +struct thermal_zone_device *thermal_zone_device_register(char *type,
> +					int trips, void *devdata,
> +					struct thermal_zone_device_ops *ops)
> +{
> +	struct thermal_zone_device *tz;
> +	struct thermal_cooling_device *pos;
> +	int result;
> +	int count;
> +
> +	if (strlen(type) >= THERMAL_NAME_LENGTH)
> +		return NULL;
> +
> +	if (trips > THERMAL_MAX_TRIPS || trips < 0)
> +		return NULL;
> +
> +	if (!ops || !ops->get_temp)
> +		return NULL;
> +
> +	tz = kzalloc(sizeof(struct thermal_zone_device), GFP_KERNEL);
> +	if (!tz)
> +		return NULL;
> +
> +	INIT_LIST_HEAD(&tz->cooling_devices);
> +	idr_init(&tz->idr);
> +	mutex_init(&tz->lock);
> +	result = get_idr(&thermal_tz_idr, &thermal_idr_lock, &tz->id);
> +	if (result) {
> +		kfree(tz);
> +		return NULL;
> +	}
> +
> +	strcpy(tz->type, type);
> +	tz->ops = ops;
> +	tz->device.class = &thermal_class;
> +	tz->devdata = devdata;
> +	tz->trips = trips;
> +	sprintf(tz->device.bus_id, "thermal_zone%d", tz->id);
> +	result = device_register(&tz->device);
> +	if (result) {
> +		release_idr(&thermal_tz_idr, &thermal_idr_lock, tz->id);
> +		kfree(tz);
> +		return NULL;
> +	}
> +
> +	/* sys I/F */
> +	if (type) {
> +		result = device_create_file(&tz->device, &dev_attr_type);
> +		if (result)
> +			goto unregister;
> +	}
> +
> +	result = device_create_file(&tz->device, &dev_attr_temp);
> +	if (result)
> +		goto unregister;
> +
> +	if (ops->get_mode) {
> +		result = device_create_file(&tz->device, &dev_attr_mode);
> +		if (result)
> +			goto unregister;
> +	}
> +
> +	for (count = 0; count < trips; count++) {
> +		TRIP_POINT_ATTR_ADD(&tz->device, count, result);
> +		if (result)
> +			goto unregister;
> +	}
> +
> +	mutex_lock(&thermal_list_lock);
> +	list_add_tail(&tz->node, &thermal_tz_list);
> +	if (ops->bind)
> +		list_for_each_entry(pos, &thermal_cdev_list, node) {
> +			result = ops->bind(tz, pos);
> +			if (result)
> +				break;
> +		}
> +	mutex_unlock(&thermal_list_lock);
> +
> +	if (!result)
> +		return tz;
> +
> +      unregister:

Hidden label.

> +	release_idr(&thermal_tz_idr, &thermal_idr_lock, tz->id);
> +	device_unregister(&tz->device);
> +	return NULL;
> +}
> +EXPORT_SYMBOL(thermal_zone_device_register);
> +
> +/**
> + * thermal_device_unregister - removes the registered thermal zone device
> + *

No "blank" line here.

> + * @tz: the thermal zone device to remove
> + */
> +void thermal_zone_device_unregister(struct thermal_zone_device *tz)
> +{
> +	struct thermal_cooling_device *cdev;
> +	struct thermal_zone_device *pos = NULL;
> +	int count;
> +
> +	if (!tz)
> +		return;
> +
> +	mutex_lock(&thermal_list_lock);
> +	list_for_each_entry(pos, &thermal_tz_list, node)
> +	    if (pos == tz)
> +		break;
> +	if (pos != tz) {
> +		/* thermal zone device not found */
> +		mutex_unlock(&thermal_list_lock);
> +		return;
> +	}
> +	list_del(&tz->node);
> +	if (tz->ops->unbind)
> +		list_for_each_entry(cdev, &thermal_cdev_list, node)
> +		    tz->ops->unbind(tz, cdev);
> +	mutex_unlock(&thermal_list_lock);
> +
> +	if (tz->type[0])
> +		device_remove_file(&tz->device, &dev_attr_type);
> +	device_remove_file(&tz->device, &dev_attr_temp);
> +	if (tz->ops->get_mode)
> +		device_remove_file(&tz->device, &dev_attr_mode);
> +
> +	for (count = 0; count < tz->trips; count++)
> +		TRIP_POINT_ATTR_REMOVE(&tz->device, count);
> +
> +	release_idr(&thermal_tz_idr, &thermal_idr_lock, tz->id);
> +	idr_destroy(&tz->idr);
> +	mutex_destroy(&tz->lock);
> +	device_unregister(&tz->device);
> +	return;
> +}
> +EXPORT_SYMBOL(thermal_zone_device_unregister);


---
~Randy

  reply	other threads:[~2008-02-07 16:48 UTC|newest]

Thread overview: 123+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-02-07  9:33 ACPI patches for 2.6.25-rc0 Len Brown
2008-02-07  9:33 ` [PATCH 001/112] ACPI: add control method tracing support Len Brown
2008-02-07  9:33   ` [PATCH 002/112] ACPI: document method tracing hooks Len Brown
2008-02-07  9:33   ` [PATCH 003/112] ACPI: CONFIG_CPU_IDLE=ACPI by default Len Brown
2008-02-07  9:33   ` [PATCH 004/112] ACPI: disable stray GPE, prevent ACPI interrupt storm Len Brown
2008-02-07  9:33   ` [PATCH 005/112] Revert "speedstep-lib.c: fix frequency multiplier for Pentium4 models 0&1" Len Brown
2008-02-07  9:33   ` [PATCH 006/112] ACPI: Defer enabling of level GPE until all pending notifies done Len Brown
2008-02-07  9:33   ` [PATCH 007/112] export thermal notification to userspace when nocrt is set Len Brown
2008-02-07  9:33   ` [PATCH 008/112] ACPI: Fix autloading of dock, video, bay and all linux specific HID drivers Len Brown
2008-02-07  9:33   ` [PATCH 009/112] ACPI: Add autoload info to dock driver Len Brown
2008-02-07  9:33   ` [PATCH 010/112] ACPI: Also autoload the bay driver, was forgotten Len Brown
2008-02-07  9:33   ` [PATCH 011/112] acpi: make __acpi_map_table() and __init function Len Brown
2008-02-07  9:33   ` [PATCH 012/112] cpuidle: create processor.latency_factor tunable Len Brown
2008-02-07  9:33   ` [PATCH 013/112] cpuidle: default processor.latency_factor=2 Len Brown
2008-02-07  9:33   ` [PATCH 014/112] ACPI: tables: complete searching upon RSDP w/ bad checksum Len Brown
2008-02-07  9:33   ` [PATCH 015/112] ACPI: /proc/acpi/alarm parsing: handle large numbers properly Len Brown
2008-02-07  9:33   ` [PATCH 016/112] ACPI: detect invalid argument written to /proc/acpi/alarm Len Brown
2008-02-07  9:33   ` [PATCH 017/112] ACPI: add "processor.ignore_ppc" hook to workaround BIOS _PPC weirdness Len Brown
2008-02-07  9:33   ` [PATCH 018/112] ACPI: ACPI Exception (): AE_NOT_FOUND, Processor Device is not present Len Brown
2008-02-07  9:33   ` [PATCH 019/112] ACPI: EC: Do the byte access with a fast path Len Brown
2008-02-07  9:33   ` [PATCH 020/112] ACPI: EC: Some hardware requires burst mode to operate properly Len Brown
2008-02-07  9:33   ` [PATCH 021/112] ACPI: Fix acpi_pm_device_sleep_state() Len Brown
2008-02-07  9:33   ` [PATCH 022/112] ACPI: remove P2B-S from blacklist Len Brown
2008-02-07  9:33   ` [PATCH 023/112] pnp: Failed to activate device 00:0a - Samsung P35 XVM 1600 III Len Brown
2008-02-07  9:33   ` [PATCH 024/112] ACPI: Check for any matching CID when walking namespace Len Brown
2008-02-07  9:33   ` [PATCH 025/112] sony-laptop: printk more info in sony_pic_call[123] Len Brown
2008-02-07  9:33   ` [PATCH 026/112] sony-laptop: Add Vaio N series to the special init sequence to enable Fn keys Len Brown
2008-02-07  9:33   ` [PATCH 027/112] sony-laptop: refactor model types Len Brown
2008-02-07  9:33   ` [PATCH 028/112] sony-laptop: bump version to 0.6 Len Brown
2008-02-07  9:33   ` [PATCH 029/112] sony-laptop: add Type4 model Len Brown
2008-02-07  9:33   ` [PATCH 030/112] sony-laptop: fix scancode decode Len Brown
2008-02-07  9:33   ` [PATCH 031/112] cpuidle: build fix for non-x86 Len Brown
2008-02-07  9:33   ` [PATCH 032/112] ACPI: thinkpad-acpi: document keymap gotcha's (v2) Len Brown
2008-02-07  9:33   ` [PATCH 033/112] ACPI: thinkpad-acpi: refactor hotkey_get and hotkey_set (v2) Len Brown
2008-02-07  9:33   ` [PATCH 034/112] ACPI: thinkpad-acpi: prepare for NVRAM polling support Len Brown
2008-02-07  9:33   ` [PATCH 035/112] ACPI: thinkpad-acpi: add CMOS NVRAM polling for hot keys (v9) Len Brown
2008-02-07  9:33   ` [PATCH 036/112] ACPI: thinkpad-acpi: bump up version to 0.18 Len Brown
2008-02-07  9:33   ` [PATCH 037/112] ACPI: thinkpad-acpi: spring cleanup part 1 Len Brown
2008-02-07  9:34   ` [PATCH 038/112] ACPI: thinkpad-acpi: spring cleanup part 2 Len Brown
2008-02-07  9:34   ` [PATCH 039/112] ACPI: thinkpad-acpi: spring cleanup part 3 Len Brown
2008-02-07  9:34   ` [PATCH 040/112] ACPI: thinkpad-acpi: spring cleanup part 4 Len Brown
2008-02-07  9:34   ` [PATCH 041/112] ACPI: thinkpad-acpi: module glue cleanups Len Brown
2008-02-07  9:34   ` [PATCH 042/112] ACPI: thinkpad-acpi: rename IBM in defines Len Brown
2008-02-07  9:34   ` [PATCH 043/112] ACPI: thinkpad-acpi: some checkpatch.pl fluff Len Brown
2008-02-07  9:34   ` [PATCH 044/112] ACPI: thinkpad-acpi: add suspend handler Len Brown
2008-02-07  9:34   ` [PATCH 045/112] ACPI: thinkpad-acpi: cleanup hotkey_notify and HKEY log messages Len Brown
2008-02-07  9:34   ` [PATCH 046/112] ACPI: thinkpad-acpi: wakeup on hotunplug reporting Len Brown
2008-02-07  9:34   ` [PATCH 047/112] ACPI: thinkpad-acpi: add X61t HKEY events Len Brown
2008-02-07  9:34   ` [PATCH 048/112] ACPI: thinkpad-acpi: silence _sta warning Len Brown
2008-02-07  9:34   ` [PATCH 049/112] ACPI: thinkpad-acpi: add poll() support to some sysfs attributes Len Brown
2008-02-07  9:34   ` [PATCH 050/112] ACPI: thinkpad-acpi: update copyright dates to 2008 Len Brown
2008-02-07  9:34   ` [PATCH 051/112] ACPI: thinkpad-acpi: bump up version to 0.19 Len Brown
2008-02-07  9:34   ` [PATCH 052/112] ACPI: video: Rationalise ACPI backlight implementation Len Brown
2008-02-07  9:34   ` [PATCH 053/112] the generic thermal sysfs driver Len Brown
2008-02-07 16:46     ` Randy Dunlap [this message]
2008-02-07 22:05       ` Len Brown
2008-02-07 22:10         ` Randy Dunlap
2008-02-07 22:32           ` Len Brown
2008-02-07 20:09     ` Matthew Garrett
2008-02-07 21:38       ` Len Brown
2008-02-07 21:48         ` Matthew Garrett
2008-02-07  9:34   ` [PATCH 054/112] ACPI: register ACPI thermal zone as generic thermal zone devices Len Brown
2008-02-07  9:34   ` [PATCH 055/112] ACPI: ACPI thermal zone handle notification correctly Len Brown
2008-02-07  9:34   ` [PATCH 056/112] ACPI: register ACPI Fan as generic thermal cooling device Len Brown
2008-02-07  9:34   ` [PATCH 057/112] ACPI: register ACPI Processor " Len Brown
2008-02-12  8:14     ` Thomas Renninger
2008-02-07  9:34   ` [PATCH 058/112] ACPI: register ACPI Video LCD " Len Brown
2008-02-07  9:34   ` [PATCH 059/112] ACPI: attach thermal zone info Len Brown
2008-02-07  9:34   ` [PATCH 060/112] ACPI: CELSIUS_TO_KELVIN fixup Len Brown
2008-02-07  9:34   ` [PATCH 061/112] intel_menlo: introduce new platform specific driver Len Brown
2008-02-07  9:34   ` [PATCH 062/112] ACPI: thermal fixup Len Brown
2008-02-07  9:34   ` [PATCH 063/112] ACPI: video: Ignore devices that aren't present in hardware Len Brown
2008-02-07  9:34   ` [PATCH 064/112] ACPI: Set _PSD ACPI_PDC_SMP_T_SWCOORD Len Brown
2008-02-07  9:34   ` [PATCH 065/112] ACPI : Check parameter when calling acpi_processor_get/set_throttling Len Brown
2008-02-07  9:34   ` [PATCH 066/112] ACPI : Update T-state coordination after getting _TSD info Len Brown
2008-02-07  9:34   ` [PATCH 067/112] ACPI : Add T-state event notifier function Len Brown
2008-02-07  9:34   ` [PATCH 068/112] ACPI: Update the t-state for every affected cpu when t-state is changed Len Brown
2008-02-07  9:34   ` [PATCH 069/112] ACPI: throttling: fix build warning Len Brown
2008-02-07  9:34   ` [PATCH 070/112] ACPI: fan: build fix for CONFIG_ACPI_PROCFS=n Len Brown
2008-02-07  9:34   ` [PATCH 071/112] ACPI: remove redundant Acer blacklist entry Len Brown
2008-02-07  9:34   ` [PATCH 072/112] DMI: remove duplicate helper routine Len Brown
2008-02-07  9:34   ` [PATCH 073/112] ACPI: update blacklist comments Len Brown
2008-02-07  9:34   ` [PATCH 074/112] ACPI: make acpi_dmi_dump() static Len Brown
2008-02-07  9:34   ` [PATCH 075/112] ACPI: make struct osi_linux static Len Brown
2008-02-07  9:34   ` [PATCH 076/112] ACPI: blacklist update Len Brown
2008-02-07  9:34   ` [PATCH 077/112] ACPI: WMI: Add ACPI-WMI mapping driver Len Brown
2008-02-07  9:34   ` [PATCH 078/112] acer-wmi: Add driver for newer Acer laptops Len Brown
2008-02-07  9:34   ` [PATCH 079/112] tc1100-wmi: Add driver for HP Compaq TC1100 Tablets Len Brown
2008-02-07  9:34   ` [PATCH 080/112] ACPI: battery: add sysfs serial number Len Brown
2008-02-07  9:34   ` [PATCH 081/112] ACPI: basic initramfs DSDT override support Len Brown
2008-02-07  9:34   ` [PATCH 082/112] ACPI: Taint kernel on ACPI table override (format corrected) Len Brown
2008-02-07  9:34   ` [PATCH 083/112] ACPI: create /sys/firmware/acpi/interrupts Len Brown
2008-02-07  9:34   ` [PATCH 084/112] asus-laptop new write_acpi_int Len Brown
2008-02-07  9:34   ` [PATCH 085/112] asus-laptop: add parentheses Len Brown
2008-02-07  9:34   ` [PATCH 086/112] asus_acpi: add support for F3Sa Len Brown
2008-02-07  9:34   ` [PATCH 087/112] ACPI: remove duplicated warning message Len Brown
2008-02-07  9:34   ` [PATCH 088/112] ACPI: acpi_pci_irq_find_prt_entry(): use list_for_each_entry() instead of list_for_each() Len Brown
2008-02-07  9:34   ` [PATCH 089/112] ACPI: track opregion names to avoid driver resource conflicts Len Brown
2008-02-07  9:34   ` [PATCH 090/112] ACPI: Export acpi_check_resource_conflict Len Brown
2008-02-07  9:34   ` [PATCH 091/112] ACPI: thinkpad-acpi: second TP_EC_FAN_FULLSPEED should be TP_EC_FAN_AUTO Len Brown
2008-02-07  9:34   ` [PATCH 092/112] PM: documentation cleanups Len Brown
2008-02-07  9:34   ` [PATCH 093/112] ACPI: idle: Fix acpi_safe_halt usages and interrupt enabling/disabling Len Brown
2008-02-07  9:34   ` [PATCH 094/112] ACPI: enable MWAIT for C1 idle Len Brown
2008-02-07  9:34   ` [PATCH 095/112] ACPI: cpuidle: Support C1 idle time accounting Len Brown
2008-02-07  9:34   ` [PATCH 096/112] cpuidle: Add a poll_idle method Len Brown
2008-02-07  9:34   ` [PATCH 097/112] ACPI: video: create "brightness_switch_enabled" modparam Len Brown
2008-02-07  9:35   ` [PATCH 098/112] ACPI: video: delete unused display switch on hotkey event code Len Brown
2008-02-07  9:35   ` [PATCH 099/112] ACPI: create notifier chain to get hotkey events to graphics driver Len Brown
2008-02-07  9:35   ` [PATCH 100/112] ACPI: video: call ACPI notifier chain for ACPI video notifications Len Brown
2008-02-07  9:35   ` [PATCH 101/112] ACPI: video: reset brightness on resume Len Brown
2008-02-07  9:35   ` [PATCH 102/112] ACPI: video: Ignore ACPI video devices that aren't present in hardware Len Brown
2008-02-07  9:35   ` [PATCH 103/112] ACPICA: fix CONFIG_ACPI_DEBUG_FUNC_TRACE build Len Brown
2008-02-07  9:35   ` [PATCH 104/112] ACPI: cleanup acpi.h Len Brown
2008-02-07  9:35   ` [PATCH 105/112] ACPI: add missing prink prefix strings Len Brown
2008-02-07  9:35   ` [PATCH 106/112] ACPI: misc cleanups Len Brown
2008-02-07  9:35   ` [PATCH 107/112] ACPI: its a directory not a folder Len Brown
2008-02-07  9:35   ` [PATCH 108/112] ACPI: Add "acpi_no_initrd_override" kernel parameter Len Brown
2008-02-07  9:35   ` [PATCH 109/112] ACPI: update DSDT override documentation Len Brown
2008-02-07  9:35   ` [PATCH 110/112] ACPI: update intrd DSDT override console messages Len Brown
2008-02-07  9:35   ` [PATCH 111/112] Revert "cpuidle: build fix for non-x86" Len Brown
2008-02-07 10:27     ` Ingo Molnar
2008-02-07 18:47       ` Len Brown
2008-02-07  9:35   ` [PATCH 112/112] ACPI: fix build warning Len Brown

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080207084645.c6e67aad.randy.dunlap@oracle.com \
    --to=randy.dunlap@oracle.com \
    --cc=len.brown@intel.com \
    --cc=lenb@kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=rui.zhang@intel.com \
    --cc=sujith.thomas@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox