RE: [PATCH 3/8] Thermal: Add APIs to bind cdev to new zone structure
From: R, Durgadoss <hidden>
Date: 2012-12-26 03:30:50
Also in:
lkml
-----Original Message----- From: linux-pm-owner@vger.kernel.org [mailto:linux-pm- owner@vger.kernel.org] On Behalf Of Wei Ni Sent: Tuesday, December 25, 2012 2:01 PM To: R, Durgadoss Cc: Zhang, Rui; linux-pm@vger.kernel.org; linux-kernel@vger.kernel.org; hongbo.zhang@linaro.org Subject: Re: [PATCH 3/8] Thermal: Add APIs to bind cdev to new zone structure On 12/18/2012 05:29 PM, Durgadoss R wrote:quoted
This patch creates new APIs to add/remove a cdev to/from a zone. This patch does not change the old cooling device implementation. Signed-off-by: Durgadoss R <redacted> --- drivers/thermal/thermal_sys.c | 80+++++++++++++++++++++++++++++++++++++++++quoted
include/linux/thermal.h | 8 +++++ 2 files changed, 88 insertions(+)diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c index 06d5a12..b39bf97 100644 --- a/drivers/thermal/thermal_sys.c +++ b/drivers/thermal/thermal_sys.c@@ -58,6 +58,7 @@ static LIST_HEAD(thermal_governor_list); static DEFINE_MUTEX(thermal_list_lock); static DEFINE_MUTEX(sensor_list_lock); static DEFINE_MUTEX(zone_list_lock); +static DEFINE_MUTEX(cdev_list_lock); static DEFINE_MUTEX(thermal_governor_lock); #define for_each_thermal_sensor(pos) \@@ -82,6 +83,9 @@ static DEFINE_MUTEX(thermal_governor_lock); mutex_unlock(&type##_list_lock); \ } while (0) +#define for_each_cdev(pos) \ + list_for_each_entry(pos, &thermal_cdev_list, node) + static struct thermal_governor *__find_governor(const char *name) { struct thermal_governor *pos;@@ -462,6 +466,24 @@ static void remove_sensor_from_zone(structthermal_zone *tz,quoted
tz->sensor_indx--; } +static void remove_cdev_from_zone(struct thermal_zone *tz, + struct thermal_cooling_device *cdev) +{ + int j, indx; + + GET_INDEX(tz, cdev, indx, cdev); + if (indx < 0) + return; + + sysfs_remove_link(&tz->device.kobj, kobject_name(&cdev- device.kobj)); + + /* Shift the entries in the tz->cdevs array */ + for (j = indx; j < MAX_CDEVS_PER_ZONE - 1; j++) + tz->cdevs[j] = tz->cdevs[j + 1]; + + tz->cdev_indx--; +} + /* sys I/F for thermal zone */ #define to_thermal_zone(_dev) \@@ -1458,6 +1480,7 @@ void thermal_cooling_device_unregister(structthermal_cooling_device *cdev)quoted
int i; const struct thermal_zone_params *tzp; struct thermal_zone_device *tz; + struct thermal_zone *tmp_tz; struct thermal_cooling_device *pos = NULL; if (!cdev)@@ -1495,6 +1518,13 @@ void thermal_cooling_device_unregister(structthermal_cooling_device *cdev)quoted
mutex_unlock(&thermal_list_lock); + mutex_lock(&zone_list_lock); + + for_each_thermal_zone(tmp_tz) + remove_cdev_from_zone(tmp_tz, cdev); + + mutex_unlock(&zone_list_lock); + if (cdev->type[0]) device_remove_file(&cdev->device, &dev_attr_cdev_type); device_remove_file(&cdev->device, &dev_attr_max_state);@@ -1790,6 +1820,23 @@ exit: } EXPORT_SYMBOL(remove_thermal_zone); +struct thermal_cooling_device *get_cdev_by_name(const char *name) +{ + struct thermal_cooling_device *pos; + struct thermal_cooling_device *cdev = NULL; + + mutex_lock(&cdev_list_lock); + for_each_cdev(pos) { + if (!strnicmp(pos->type, name, THERMAL_NAME_LENGTH)) { + cdev = pos; + break; + } + } + mutex_unlock(&cdev_list_lock); + return cdev; +} +EXPORT_SYMBOL(get_cdev_by_name);It seems you forgot to add get_cdev_by_name() and get_sensor_by_name() to the include file.
Thanks.. Will take care of this in v2. Regards, Durga