RE: [PATCH 3/8] Thermal: Add APIs to bind cdev to new zone structure

2013-03-01 Thread R, Durgadoss

> -Original Message-
> From: Eduardo Valentin [mailto:eduardo.valen...@ti.com]
> Sent: Friday, March 01, 2013 1:06 AM
> To: R, Durgadoss
> Cc: Zhang, Rui; linux...@vger.kernel.org; linux-kernel@vger.kernel.org;
> hongbo.zh...@linaro.org; w...@nvidia.com
> Subject: Re: [PATCH 3/8] Thermal: Add APIs to bind cdev to new zone
> structure
> 
> Durga,
> 
> On 05-02-2013 06:46, Durgadoss R wrote:
> > This patch creates new APIs to add/remove a
> > cdev to/from a zone. This patch does not change
> > the old cooling device implementation.
> 
> Same comments on patch 02/08 I want to rise here:
> 
> - Consider using linked list
> - You may have contention on your index/cdevs array
> - overflow on your buffer (carefully check your implementation)
> - zone removal condition. can we remove zones with cdevs registered?

Yes, as I said in 02/08.

> - get_by_name, why do we need it? (at least not on this patch)

The platform drivers need this API to query the pointer for cdevs,
sensors.

Thanks,
Durga

> - Minors on strlcpy, snprintf, devm_ helpers
> - documentation in the code for these helper functions and also better
> naming..
> 
> >
> > Signed-off-by: Durgadoss R 
> > ---
> >   drivers/thermal/thermal_sys.c |   80
> +
> >   include/linux/thermal.h   |9 +
> >   2 files changed, 89 insertions(+)
> >
> > diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c
> > index 838d4fb..bf703b1 100644
> > --- a/drivers/thermal/thermal_sys.c
> > +++ b/drivers/thermal/thermal_sys.c
> > @@ -57,6 +57,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) \
> > @@ -83,6 +84,9 @@ static DEFINE_MUTEX(thermal_governor_lock);
> > ret;\
> >   })
> >
> > +#define for_each_cdev(pos) \
> > +   list_for_each_entry(pos, _cdev_list, node)
> > +
> >   static struct thermal_governor *__find_governor(const char *name)
> >   {
> > struct thermal_governor *pos;
> > @@ -466,6 +470,24 @@ static void remove_sensor_from_zone(struct
> thermal_zone *tz,
> > tz->sensor_indx--;
> >   }
> >
> > +static void remove_cdev_from_zone(struct thermal_zone *tz,
> > +   struct thermal_cooling_device *cdev)
> > +{
> > +   int j, indx;
> > +
> > +   indx = GET_INDEX(tz, cdev, cdev);
> > +   if (indx < 0)
> > +   return;
> > +
> > +   sysfs_remove_link(>device.kobj, kobject_name(
> >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) \
> > @@ -1462,6 +1484,7 @@ void thermal_cooling_device_unregister(struct
> thermal_cooling_device *cdev)
> > 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)
> > @@ -1499,6 +1522,13 @@ void thermal_cooling_device_unregister(struct
> thermal_cooling_device *cdev)
> >
> > mutex_unlock(_list_lock);
> >
> > +   mutex_lock(_list_lock);
> > +
> > +   for_each_thermal_zone(tmp_tz)
> > +   remove_cdev_from_zone(tmp_tz, cdev);
> > +
> > +   mutex_unlock(_list_lock);
> > +
> > if (cdev->type[0])
> > device_remove_file(>device, _attr_cdev_type);
> > device_remove_file(>device, _attr_max_state);
> > @@ -1794,6 +1824,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(_list_lock);
> > +   for_each_cdev(pos) {
> > +   if (!strnicmp(pos->type, name, THERMAL_NAME_LENGTH)) {
> > +   cdev = pos;
> > +   break;
> > +   }
> > +   }
> > +   mutex_unlock(_list

RE: [PATCH 3/8] Thermal: Add APIs to bind cdev to new zone structure

2013-03-01 Thread R, Durgadoss

 -Original Message-
 From: Eduardo Valentin [mailto:eduardo.valen...@ti.com]
 Sent: Friday, March 01, 2013 1:06 AM
 To: R, Durgadoss
 Cc: Zhang, Rui; linux...@vger.kernel.org; linux-kernel@vger.kernel.org;
 hongbo.zh...@linaro.org; w...@nvidia.com
 Subject: Re: [PATCH 3/8] Thermal: Add APIs to bind cdev to new zone
 structure
 
 Durga,
 
 On 05-02-2013 06:46, Durgadoss R wrote:
  This patch creates new APIs to add/remove a
  cdev to/from a zone. This patch does not change
  the old cooling device implementation.
 
 Same comments on patch 02/08 I want to rise here:
 
 - Consider using linked list
 - You may have contention on your index/cdevs array
 - overflow on your buffer (carefully check your implementation)
 - zone removal condition. can we remove zones with cdevs registered?

Yes, as I said in 02/08.

 - get_by_name, why do we need it? (at least not on this patch)

The platform drivers need this API to query the pointer for cdevs,
sensors.

Thanks,
Durga

 - Minors on strlcpy, snprintf, devm_ helpers
 - documentation in the code for these helper functions and also better
 naming..
 
 
  Signed-off-by: Durgadoss R durgados...@intel.com
  ---
drivers/thermal/thermal_sys.c |   80
 +
include/linux/thermal.h   |9 +
2 files changed, 89 insertions(+)
 
  diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c
  index 838d4fb..bf703b1 100644
  --- a/drivers/thermal/thermal_sys.c
  +++ b/drivers/thermal/thermal_sys.c
  @@ -57,6 +57,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) \
  @@ -83,6 +84,9 @@ static DEFINE_MUTEX(thermal_governor_lock);
  ret;\
})
 
  +#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;
  @@ -466,6 +470,24 @@ static void remove_sensor_from_zone(struct
 thermal_zone *tz,
  tz-sensor_indx--;
}
 
  +static void remove_cdev_from_zone(struct thermal_zone *tz,
  +   struct thermal_cooling_device *cdev)
  +{
  +   int j, indx;
  +
  +   indx = GET_INDEX(tz, cdev, 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) \
  @@ -1462,6 +1484,7 @@ void thermal_cooling_device_unregister(struct
 thermal_cooling_device *cdev)
  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)
  @@ -1499,6 +1522,13 @@ void thermal_cooling_device_unregister(struct
 thermal_cooling_device *cdev)
 
  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);
  @@ -1794,6 +1824,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);
  +
struct thermal_sensor *get_sensor_by_name(const char *name)
{
  struct thermal_sensor *pos;
  @@ -1844,6 +1891,39 @@ exit_zone:
}
EXPORT_SYMBOL(add_sensor_to_zone);
 
  +int add_cdev_to_zone(struct thermal_zone *tz,
  +   struct thermal_cooling_device *cdev)
  +{
  +   int ret;
  +
  +   if (!tz || !cdev)
  +   return -EINVAL;
  +
  +   mutex_lock(zone_list_lock);
  +
  +   /* Ensure we are not adding the same cdev again!! */
  +   ret = GET_INDEX(tz, cdev, cdev);
  +   if (ret = 0) {
  +   ret = -EEXIST;
  +   goto exit_zone;
  +   }
  +
  +   mutex_lock(cdev_list_lock);
  +   ret = sysfs_create_link(tz-device.kobj, cdev-device.kobj,
  +   kobject_name(cdev-device.kobj));
  +   if (ret

Re: [PATCH 3/8] Thermal: Add APIs to bind cdev to new zone structure

2013-02-28 Thread Eduardo Valentin

Durga,

On 05-02-2013 06:46, Durgadoss R wrote:

This patch creates new APIs to add/remove a
cdev to/from a zone. This patch does not change
the old cooling device implementation.


Same comments on patch 02/08 I want to rise here:

- Consider using linked list
- You may have contention on your index/cdevs array
- overflow on your buffer (carefully check your implementation)
- zone removal condition. can we remove zones with cdevs registered?
- get_by_name, why do we need it? (at least not on this patch)
- Minors on strlcpy, snprintf, devm_ helpers
- documentation in the code for these helper functions and also better 
naming..




Signed-off-by: Durgadoss R 
---
  drivers/thermal/thermal_sys.c |   80 +
  include/linux/thermal.h   |9 +
  2 files changed, 89 insertions(+)

diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c
index 838d4fb..bf703b1 100644
--- a/drivers/thermal/thermal_sys.c
+++ b/drivers/thermal/thermal_sys.c
@@ -57,6 +57,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) \
@@ -83,6 +84,9 @@ static DEFINE_MUTEX(thermal_governor_lock);
ret;\
  })

+#define for_each_cdev(pos) \
+   list_for_each_entry(pos, _cdev_list, node)
+
  static struct thermal_governor *__find_governor(const char *name)
  {
struct thermal_governor *pos;
@@ -466,6 +470,24 @@ static void remove_sensor_from_zone(struct thermal_zone 
*tz,
tz->sensor_indx--;
  }

+static void remove_cdev_from_zone(struct thermal_zone *tz,
+   struct thermal_cooling_device *cdev)
+{
+   int j, indx;
+
+   indx = GET_INDEX(tz, cdev, cdev);
+   if (indx < 0)
+   return;
+
+   sysfs_remove_link(>device.kobj, kobject_name(>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) \
@@ -1462,6 +1484,7 @@ void thermal_cooling_device_unregister(struct 
thermal_cooling_device *cdev)
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)
@@ -1499,6 +1522,13 @@ void thermal_cooling_device_unregister(struct 
thermal_cooling_device *cdev)

mutex_unlock(_list_lock);

+   mutex_lock(_list_lock);
+
+   for_each_thermal_zone(tmp_tz)
+   remove_cdev_from_zone(tmp_tz, cdev);
+
+   mutex_unlock(_list_lock);
+
if (cdev->type[0])
device_remove_file(>device, _attr_cdev_type);
device_remove_file(>device, _attr_max_state);
@@ -1794,6 +1824,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(_list_lock);
+   for_each_cdev(pos) {
+   if (!strnicmp(pos->type, name, THERMAL_NAME_LENGTH)) {
+   cdev = pos;
+   break;
+   }
+   }
+   mutex_unlock(_list_lock);
+   return cdev;
+}
+EXPORT_SYMBOL(get_cdev_by_name);
+
  struct thermal_sensor *get_sensor_by_name(const char *name)
  {
struct thermal_sensor *pos;
@@ -1844,6 +1891,39 @@ exit_zone:
  }
  EXPORT_SYMBOL(add_sensor_to_zone);

+int add_cdev_to_zone(struct thermal_zone *tz,
+   struct thermal_cooling_device *cdev)
+{
+   int ret;
+
+   if (!tz || !cdev)
+   return -EINVAL;
+
+   mutex_lock(_list_lock);
+
+   /* Ensure we are not adding the same cdev again!! */
+   ret = GET_INDEX(tz, cdev, cdev);
+   if (ret >= 0) {
+   ret = -EEXIST;
+   goto exit_zone;
+   }
+
+   mutex_lock(_list_lock);
+   ret = sysfs_create_link(>device.kobj, >device.kobj,
+   kobject_name(>device.kobj));
+   if (ret)
+   goto exit_cdev;
+
+   tz->cdevs[tz->cdev_indx++] = cdev;
+
+exit_cdev:
+   mutex_unlock(_list_lock);
+exit_zone:
+   mutex_unlock(_list_lock);
+   return ret;
+}
+EXPORT_SYMBOL(add_cdev_to_zone);
+
  /**
   * thermal_sensor_register - register a new thermal sensor
   * @name: name of the thermal sensor
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index 2194519..c841414 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -57,6 +57,8 @@

  #define MAX_SENSORS_PER_ZONE  5

+#define MAX_CDEVS_PER_ZONE  

Re: [PATCH 3/8] Thermal: Add APIs to bind cdev to new zone structure

2013-02-28 Thread Eduardo Valentin

Durga,

On 05-02-2013 06:46, Durgadoss R wrote:

This patch creates new APIs to add/remove a
cdev to/from a zone. This patch does not change
the old cooling device implementation.


Same comments on patch 02/08 I want to rise here:

- Consider using linked list
- You may have contention on your index/cdevs array
- overflow on your buffer (carefully check your implementation)
- zone removal condition. can we remove zones with cdevs registered?
- get_by_name, why do we need it? (at least not on this patch)
- Minors on strlcpy, snprintf, devm_ helpers
- documentation in the code for these helper functions and also better 
naming..




Signed-off-by: Durgadoss R durgados...@intel.com
---
  drivers/thermal/thermal_sys.c |   80 +
  include/linux/thermal.h   |9 +
  2 files changed, 89 insertions(+)

diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c
index 838d4fb..bf703b1 100644
--- a/drivers/thermal/thermal_sys.c
+++ b/drivers/thermal/thermal_sys.c
@@ -57,6 +57,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) \
@@ -83,6 +84,9 @@ static DEFINE_MUTEX(thermal_governor_lock);
ret;\
  })

+#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;
@@ -466,6 +470,24 @@ static void remove_sensor_from_zone(struct thermal_zone 
*tz,
tz-sensor_indx--;
  }

+static void remove_cdev_from_zone(struct thermal_zone *tz,
+   struct thermal_cooling_device *cdev)
+{
+   int j, indx;
+
+   indx = GET_INDEX(tz, cdev, 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) \
@@ -1462,6 +1484,7 @@ void thermal_cooling_device_unregister(struct 
thermal_cooling_device *cdev)
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)
@@ -1499,6 +1522,13 @@ void thermal_cooling_device_unregister(struct 
thermal_cooling_device *cdev)

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);
@@ -1794,6 +1824,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);
+
  struct thermal_sensor *get_sensor_by_name(const char *name)
  {
struct thermal_sensor *pos;
@@ -1844,6 +1891,39 @@ exit_zone:
  }
  EXPORT_SYMBOL(add_sensor_to_zone);

+int add_cdev_to_zone(struct thermal_zone *tz,
+   struct thermal_cooling_device *cdev)
+{
+   int ret;
+
+   if (!tz || !cdev)
+   return -EINVAL;
+
+   mutex_lock(zone_list_lock);
+
+   /* Ensure we are not adding the same cdev again!! */
+   ret = GET_INDEX(tz, cdev, cdev);
+   if (ret = 0) {
+   ret = -EEXIST;
+   goto exit_zone;
+   }
+
+   mutex_lock(cdev_list_lock);
+   ret = sysfs_create_link(tz-device.kobj, cdev-device.kobj,
+   kobject_name(cdev-device.kobj));
+   if (ret)
+   goto exit_cdev;
+
+   tz-cdevs[tz-cdev_indx++] = cdev;
+
+exit_cdev:
+   mutex_unlock(cdev_list_lock);
+exit_zone:
+   mutex_unlock(zone_list_lock);
+   return ret;
+}
+EXPORT_SYMBOL(add_cdev_to_zone);
+
  /**
   * thermal_sensor_register - register a new thermal sensor
   * @name: name of the thermal sensor
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index 2194519..c841414 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ 

Re: [PATCH 3/8] Thermal: Add APIs to bind cdev to new zone structure

2013-02-08 Thread Zhang Rui
On Tue, 2013-02-05 at 16:16 +0530, Durgadoss R wrote:
> 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 
> ---
>  drivers/thermal/thermal_sys.c |   80 
> +
>  include/linux/thermal.h   |9 +
>  2 files changed, 89 insertions(+)
> 
> diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c
> index 838d4fb..bf703b1 100644
> --- a/drivers/thermal/thermal_sys.c
> +++ b/drivers/thermal/thermal_sys.c
> @@ -57,6 +57,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) \
> @@ -83,6 +84,9 @@ static DEFINE_MUTEX(thermal_governor_lock);
>   ret;\
>  })
>  
> +#define for_each_cdev(pos) \
> + list_for_each_entry(pos, _cdev_list, node)
> +
>  static struct thermal_governor *__find_governor(const char *name)
>  {
>   struct thermal_governor *pos;
> @@ -466,6 +470,24 @@ static void remove_sensor_from_zone(struct thermal_zone 
> *tz,
>   tz->sensor_indx--;
>  }
>  
> +static void remove_cdev_from_zone(struct thermal_zone *tz,
> + struct thermal_cooling_device *cdev)
> +{
> + int j, indx;
> +
> + indx = GET_INDEX(tz, cdev, cdev);
> + if (indx < 0)
> + return;
> +
> + sysfs_remove_link(>device.kobj, kobject_name(>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) \
> @@ -1462,6 +1484,7 @@ void thermal_cooling_device_unregister(struct 
> thermal_cooling_device *cdev)
>   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)
> @@ -1499,6 +1522,13 @@ void thermal_cooling_device_unregister(struct 
> thermal_cooling_device *cdev)
>  
>   mutex_unlock(_list_lock);
>  
> + mutex_lock(_list_lock);
> +
> + for_each_thermal_zone(tmp_tz)
> + remove_cdev_from_zone(tmp_tz, cdev);
> +
> + mutex_unlock(_list_lock);
> +
>   if (cdev->type[0])
>   device_remove_file(>device, _attr_cdev_type);
>   device_remove_file(>device, _attr_max_state);
> @@ -1794,6 +1824,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(_list_lock);
> + for_each_cdev(pos) {
> + if (!strnicmp(pos->type, name, THERMAL_NAME_LENGTH)) {
> + cdev = pos;
> + break;
the same comments as the Patch 2/8.

> + }
> + }
> + mutex_unlock(_list_lock);
> + return cdev;
> +}
> +EXPORT_SYMBOL(get_cdev_by_name);
> +
>  struct thermal_sensor *get_sensor_by_name(const char *name)
>  {
>   struct thermal_sensor *pos;
> @@ -1844,6 +1891,39 @@ exit_zone:
>  }
>  EXPORT_SYMBOL(add_sensor_to_zone);
>  
> +int add_cdev_to_zone(struct thermal_zone *tz,
> + struct thermal_cooling_device *cdev)
> +{
> + int ret;
> +
> + if (!tz || !cdev)
> + return -EINVAL;
> +
> + mutex_lock(_list_lock);
> +
> + /* Ensure we are not adding the same cdev again!! */
> + ret = GET_INDEX(tz, cdev, cdev);
> + if (ret >= 0) {
> + ret = -EEXIST;
> + goto exit_zone;
> + }
> +
> + mutex_lock(_list_lock);
> + ret = sysfs_create_link(>device.kobj, >device.kobj,
> + kobject_name(>device.kobj));
> + if (ret)
> + goto exit_cdev;
> +
> + tz->cdevs[tz->cdev_indx++] = cdev;
> +
> +exit_cdev:
> + mutex_unlock(_list_lock);
> +exit_zone:
> + mutex_unlock(_list_lock);
> + return ret;
> +}
> +EXPORT_SYMBOL(add_cdev_to_zone);
> +
Hmmm,
I'd prefer to see the code organized in this way:
/* thermal zone APIs/
thermal_zone_device_register()
thermal_zone_device_unregister()
add_thermal_zone()
remove_thermal_zone()

/* sensor APIs */
thermal_sensor_register()
thermal_sensor_unregister()
add_sensor_to_zone()
remove_sensor_from_zone()

/* cdev APIs */
thermal_cooling_device_register()
thermal_cooling_device_unregister()
add_cdev_to_zone()
remove_cdev_from_zone()

/* helper APIs */
get_sensor_by_name()
get_cdev_by_name()

but if this makes your rebase MUCH more difficult, I think we can
generate an incremental cleanup patch instead.


Re: [PATCH 3/8] Thermal: Add APIs to bind cdev to new zone structure

2013-02-08 Thread Zhang Rui
On Tue, 2013-02-05 at 16:16 +0530, Durgadoss R wrote:
 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 durgados...@intel.com
 ---
  drivers/thermal/thermal_sys.c |   80 
 +
  include/linux/thermal.h   |9 +
  2 files changed, 89 insertions(+)
 
 diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c
 index 838d4fb..bf703b1 100644
 --- a/drivers/thermal/thermal_sys.c
 +++ b/drivers/thermal/thermal_sys.c
 @@ -57,6 +57,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) \
 @@ -83,6 +84,9 @@ static DEFINE_MUTEX(thermal_governor_lock);
   ret;\
  })
  
 +#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;
 @@ -466,6 +470,24 @@ static void remove_sensor_from_zone(struct thermal_zone 
 *tz,
   tz-sensor_indx--;
  }
  
 +static void remove_cdev_from_zone(struct thermal_zone *tz,
 + struct thermal_cooling_device *cdev)
 +{
 + int j, indx;
 +
 + indx = GET_INDEX(tz, cdev, 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) \
 @@ -1462,6 +1484,7 @@ void thermal_cooling_device_unregister(struct 
 thermal_cooling_device *cdev)
   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)
 @@ -1499,6 +1522,13 @@ void thermal_cooling_device_unregister(struct 
 thermal_cooling_device *cdev)
  
   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);
 @@ -1794,6 +1824,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;
the same comments as the Patch 2/8.

 + }
 + }
 + mutex_unlock(cdev_list_lock);
 + return cdev;
 +}
 +EXPORT_SYMBOL(get_cdev_by_name);
 +
  struct thermal_sensor *get_sensor_by_name(const char *name)
  {
   struct thermal_sensor *pos;
 @@ -1844,6 +1891,39 @@ exit_zone:
  }
  EXPORT_SYMBOL(add_sensor_to_zone);
  
 +int add_cdev_to_zone(struct thermal_zone *tz,
 + struct thermal_cooling_device *cdev)
 +{
 + int ret;
 +
 + if (!tz || !cdev)
 + return -EINVAL;
 +
 + mutex_lock(zone_list_lock);
 +
 + /* Ensure we are not adding the same cdev again!! */
 + ret = GET_INDEX(tz, cdev, cdev);
 + if (ret = 0) {
 + ret = -EEXIST;
 + goto exit_zone;
 + }
 +
 + mutex_lock(cdev_list_lock);
 + ret = sysfs_create_link(tz-device.kobj, cdev-device.kobj,
 + kobject_name(cdev-device.kobj));
 + if (ret)
 + goto exit_cdev;
 +
 + tz-cdevs[tz-cdev_indx++] = cdev;
 +
 +exit_cdev:
 + mutex_unlock(cdev_list_lock);
 +exit_zone:
 + mutex_unlock(zone_list_lock);
 + return ret;
 +}
 +EXPORT_SYMBOL(add_cdev_to_zone);
 +
Hmmm,
I'd prefer to see the code organized in this way:
/* thermal zone APIs/
thermal_zone_device_register()
thermal_zone_device_unregister()
add_thermal_zone()
remove_thermal_zone()

/* sensor APIs */
thermal_sensor_register()
thermal_sensor_unregister()
add_sensor_to_zone()
remove_sensor_from_zone()

/* cdev APIs */
thermal_cooling_device_register()
thermal_cooling_device_unregister()
add_cdev_to_zone()
remove_cdev_from_zone()

/* helper APIs */
get_sensor_by_name()
get_cdev_by_name()

but if this makes your rebase MUCH more difficult, I think we can
generate an incremental cleanup patch instead.

thanks,
rui


--
To unsubscribe from this list: send the line 

[PATCH 3/8] Thermal: Add APIs to bind cdev to new zone structure

2013-02-05 Thread Durgadoss R
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 
---
 drivers/thermal/thermal_sys.c |   80 +
 include/linux/thermal.h   |9 +
 2 files changed, 89 insertions(+)

diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c
index 838d4fb..bf703b1 100644
--- a/drivers/thermal/thermal_sys.c
+++ b/drivers/thermal/thermal_sys.c
@@ -57,6 +57,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) \
@@ -83,6 +84,9 @@ static DEFINE_MUTEX(thermal_governor_lock);
ret;\
 })
 
+#define for_each_cdev(pos) \
+   list_for_each_entry(pos, _cdev_list, node)
+
 static struct thermal_governor *__find_governor(const char *name)
 {
struct thermal_governor *pos;
@@ -466,6 +470,24 @@ static void remove_sensor_from_zone(struct thermal_zone 
*tz,
tz->sensor_indx--;
 }
 
+static void remove_cdev_from_zone(struct thermal_zone *tz,
+   struct thermal_cooling_device *cdev)
+{
+   int j, indx;
+
+   indx = GET_INDEX(tz, cdev, cdev);
+   if (indx < 0)
+   return;
+
+   sysfs_remove_link(>device.kobj, kobject_name(>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) \
@@ -1462,6 +1484,7 @@ void thermal_cooling_device_unregister(struct 
thermal_cooling_device *cdev)
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)
@@ -1499,6 +1522,13 @@ void thermal_cooling_device_unregister(struct 
thermal_cooling_device *cdev)
 
mutex_unlock(_list_lock);
 
+   mutex_lock(_list_lock);
+
+   for_each_thermal_zone(tmp_tz)
+   remove_cdev_from_zone(tmp_tz, cdev);
+
+   mutex_unlock(_list_lock);
+
if (cdev->type[0])
device_remove_file(>device, _attr_cdev_type);
device_remove_file(>device, _attr_max_state);
@@ -1794,6 +1824,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(_list_lock);
+   for_each_cdev(pos) {
+   if (!strnicmp(pos->type, name, THERMAL_NAME_LENGTH)) {
+   cdev = pos;
+   break;
+   }
+   }
+   mutex_unlock(_list_lock);
+   return cdev;
+}
+EXPORT_SYMBOL(get_cdev_by_name);
+
 struct thermal_sensor *get_sensor_by_name(const char *name)
 {
struct thermal_sensor *pos;
@@ -1844,6 +1891,39 @@ exit_zone:
 }
 EXPORT_SYMBOL(add_sensor_to_zone);
 
+int add_cdev_to_zone(struct thermal_zone *tz,
+   struct thermal_cooling_device *cdev)
+{
+   int ret;
+
+   if (!tz || !cdev)
+   return -EINVAL;
+
+   mutex_lock(_list_lock);
+
+   /* Ensure we are not adding the same cdev again!! */
+   ret = GET_INDEX(tz, cdev, cdev);
+   if (ret >= 0) {
+   ret = -EEXIST;
+   goto exit_zone;
+   }
+
+   mutex_lock(_list_lock);
+   ret = sysfs_create_link(>device.kobj, >device.kobj,
+   kobject_name(>device.kobj));
+   if (ret)
+   goto exit_cdev;
+
+   tz->cdevs[tz->cdev_indx++] = cdev;
+
+exit_cdev:
+   mutex_unlock(_list_lock);
+exit_zone:
+   mutex_unlock(_list_lock);
+   return ret;
+}
+EXPORT_SYMBOL(add_cdev_to_zone);
+
 /**
  * thermal_sensor_register - register a new thermal sensor
  * @name:  name of the thermal sensor
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index 2194519..c841414 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -57,6 +57,8 @@
 
 #define MAX_SENSORS_PER_ZONE   5
 
+#define MAX_CDEVS_PER_ZONE 5
+
 struct thermal_sensor;
 struct thermal_zone_device;
 struct thermal_cooling_device;
@@ -217,6 +219,10 @@ struct thermal_zone {
/* Sensor level information */
int sensor_indx; /* index into 'sensors' array */
struct thermal_sensor *sensors[MAX_SENSORS_PER_ZONE];
+
+   /* cdev level information */
+   int cdev_indx; /* index into 'cdevs' array */
+   struct thermal_cooling_device *cdevs[MAX_CDEVS_PER_ZONE];
 };
 
 /* Structure that holds thermal governor 

[PATCH 3/8] Thermal: Add APIs to bind cdev to new zone structure

2013-02-05 Thread Durgadoss R
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 durgados...@intel.com
---
 drivers/thermal/thermal_sys.c |   80 +
 include/linux/thermal.h   |9 +
 2 files changed, 89 insertions(+)

diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c
index 838d4fb..bf703b1 100644
--- a/drivers/thermal/thermal_sys.c
+++ b/drivers/thermal/thermal_sys.c
@@ -57,6 +57,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) \
@@ -83,6 +84,9 @@ static DEFINE_MUTEX(thermal_governor_lock);
ret;\
 })
 
+#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;
@@ -466,6 +470,24 @@ static void remove_sensor_from_zone(struct thermal_zone 
*tz,
tz-sensor_indx--;
 }
 
+static void remove_cdev_from_zone(struct thermal_zone *tz,
+   struct thermal_cooling_device *cdev)
+{
+   int j, indx;
+
+   indx = GET_INDEX(tz, cdev, 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) \
@@ -1462,6 +1484,7 @@ void thermal_cooling_device_unregister(struct 
thermal_cooling_device *cdev)
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)
@@ -1499,6 +1522,13 @@ void thermal_cooling_device_unregister(struct 
thermal_cooling_device *cdev)
 
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);
@@ -1794,6 +1824,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);
+
 struct thermal_sensor *get_sensor_by_name(const char *name)
 {
struct thermal_sensor *pos;
@@ -1844,6 +1891,39 @@ exit_zone:
 }
 EXPORT_SYMBOL(add_sensor_to_zone);
 
+int add_cdev_to_zone(struct thermal_zone *tz,
+   struct thermal_cooling_device *cdev)
+{
+   int ret;
+
+   if (!tz || !cdev)
+   return -EINVAL;
+
+   mutex_lock(zone_list_lock);
+
+   /* Ensure we are not adding the same cdev again!! */
+   ret = GET_INDEX(tz, cdev, cdev);
+   if (ret = 0) {
+   ret = -EEXIST;
+   goto exit_zone;
+   }
+
+   mutex_lock(cdev_list_lock);
+   ret = sysfs_create_link(tz-device.kobj, cdev-device.kobj,
+   kobject_name(cdev-device.kobj));
+   if (ret)
+   goto exit_cdev;
+
+   tz-cdevs[tz-cdev_indx++] = cdev;
+
+exit_cdev:
+   mutex_unlock(cdev_list_lock);
+exit_zone:
+   mutex_unlock(zone_list_lock);
+   return ret;
+}
+EXPORT_SYMBOL(add_cdev_to_zone);
+
 /**
  * thermal_sensor_register - register a new thermal sensor
  * @name:  name of the thermal sensor
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index 2194519..c841414 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -57,6 +57,8 @@
 
 #define MAX_SENSORS_PER_ZONE   5
 
+#define MAX_CDEVS_PER_ZONE 5
+
 struct thermal_sensor;
 struct thermal_zone_device;
 struct thermal_cooling_device;
@@ -217,6 +219,10 @@ struct thermal_zone {
/* Sensor level information */
int sensor_indx; /* index into 'sensors' array */
struct thermal_sensor *sensors[MAX_SENSORS_PER_ZONE];
+
+   /* cdev level information */
+   int cdev_indx; /* index into 'cdevs' array */
+   struct thermal_cooling_device 

RE: [PATCH 3/8] Thermal: Add APIs to bind cdev to new zone structure

2012-12-25 Thread R, Durgadoss


> -Original Message-
> From: linux-pm-ow...@vger.kernel.org [mailto:linux-pm-
> ow...@vger.kernel.org] On Behalf Of Wei Ni
> Sent: Tuesday, December 25, 2012 2:01 PM
> To: R, Durgadoss
> Cc: Zhang, Rui; linux...@vger.kernel.org; linux-kernel@vger.kernel.org;
> hongbo.zh...@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:
> > 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 
> > ---
> >  drivers/thermal/thermal_sys.c |   80
> +
> >  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(##_list_lock);\
> > } while (0)
> >
> > +#define for_each_cdev(pos) \
> > +   list_for_each_entry(pos, _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(struct
> thermal_zone *tz,
> > 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(>device.kobj, kobject_name(
> >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(struct
> thermal_cooling_device *cdev)
> > 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(struct
> thermal_cooling_device *cdev)
> >
> > mutex_unlock(_list_lock);
> >
> > +   mutex_lock(_list_lock);
> > +
> > +   for_each_thermal_zone(tmp_tz)
> > +   remove_cdev_from_zone(tmp_tz, cdev);
> > +
> > +   mutex_unlock(_list_lock);
> > +
> > if (cdev->type[0])
> > device_remove_file(>device, _attr_cdev_type);
> > device_remove_file(>device, _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(_list_lock);
> > +   for_each_cdev(pos) {
> > +   if (!strnicmp(pos->type, name, THERMAL_NAME_LENGTH)) {
> > +   cdev = pos;
> > +   break;
> > +   }
> > +   }
> > +   mutex_unlock(_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
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 3/8] Thermal: Add APIs to bind cdev to new zone structure

2012-12-25 Thread Wei Ni
On 12/18/2012 05:29 PM, Durgadoss R wrote:
> 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 
> ---
>  drivers/thermal/thermal_sys.c |   80 
> +
>  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(##_list_lock);\
>   } while (0)
>  
> +#define for_each_cdev(pos) \
> + list_for_each_entry(pos, _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(struct thermal_zone 
> *tz,
>   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(>device.kobj, kobject_name(>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(struct 
> thermal_cooling_device *cdev)
>   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(struct 
> thermal_cooling_device *cdev)
>  
>   mutex_unlock(_list_lock);
>  
> + mutex_lock(_list_lock);
> +
> + for_each_thermal_zone(tmp_tz)
> + remove_cdev_from_zone(tmp_tz, cdev);
> +
> + mutex_unlock(_list_lock);
> +
>   if (cdev->type[0])
>   device_remove_file(>device, _attr_cdev_type);
>   device_remove_file(>device, _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(_list_lock);
> + for_each_cdev(pos) {
> + if (!strnicmp(pos->type, name, THERMAL_NAME_LENGTH)) {
> + cdev = pos;
> + break;
> + }
> + }
> + mutex_unlock(_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.

> +
>  struct thermal_sensor *get_sensor_by_name(const char *name)
>  {
>   struct thermal_sensor *pos;
> @@ -1840,6 +1887,39 @@ exit_zone:
>  }
>  EXPORT_SYMBOL(add_sensor_to_zone);
>  
> +int add_cdev_to_zone(struct thermal_zone *tz,
> + struct thermal_cooling_device *cdev)
> +{
> + int ret;
> +
> + if (!tz || !cdev)
> + return -EINVAL;
> +
> + mutex_lock(_list_lock);
> +
> + /* Ensure we are not adding the same cdev again!! */
> + GET_INDEX(tz, cdev, ret, cdev);
> + if (ret >= 0) {
> + ret = -EEXIST;
> + goto exit_zone;
> + }
> +
> + mutex_lock(_list_lock);
> + ret = sysfs_create_link(>device.kobj, >device.kobj,
> + kobject_name(>device.kobj));
> + if (ret)
> + goto exit_cdev;
> +
> + tz->cdevs[tz->cdev_indx++] = cdev;
> +
> +exit_cdev:
> + mutex_unlock(_list_lock);
> +exit_zone:
> + mutex_unlock(_list_lock);
> + return ret;
> +}
> +EXPORT_SYMBOL(add_cdev_to_zone);
> +
>  /**
>   * thermal_sensor_register - register a new thermal sensor
>   * @name:name of the thermal sensor
> diff --git a/include/linux/thermal.h b/include/linux/thermal.h
> index f08f774..c4e45c7 100644
> --- a/include/linux/thermal.h
> +++ b/include/linux/thermal.h
> @@ -51,6 +51,8 @@
>  
>  #define MAX_SENSORS_PER_ZONE 5
>  
> +#define MAX_CDEVS_PER_ZONE   5
> +
>  struct thermal_sensor;
>  struct thermal_zone_device;
>  struct thermal_cooling_device;
> @@ -209,6 +211,10 @@ struct thermal_zone {
>   /* Sensor level information 

Re: [PATCH 3/8] Thermal: Add APIs to bind cdev to new zone structure

2012-12-25 Thread Wei Ni
On 12/18/2012 05:29 PM, Durgadoss R wrote:
 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 durgados...@intel.com
 ---
  drivers/thermal/thermal_sys.c |   80 
 +
  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(struct thermal_zone 
 *tz,
   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(struct 
 thermal_cooling_device *cdev)
   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(struct 
 thermal_cooling_device *cdev)
  
   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.

 +
  struct thermal_sensor *get_sensor_by_name(const char *name)
  {
   struct thermal_sensor *pos;
 @@ -1840,6 +1887,39 @@ exit_zone:
  }
  EXPORT_SYMBOL(add_sensor_to_zone);
  
 +int add_cdev_to_zone(struct thermal_zone *tz,
 + struct thermal_cooling_device *cdev)
 +{
 + int ret;
 +
 + if (!tz || !cdev)
 + return -EINVAL;
 +
 + mutex_lock(zone_list_lock);
 +
 + /* Ensure we are not adding the same cdev again!! */
 + GET_INDEX(tz, cdev, ret, cdev);
 + if (ret = 0) {
 + ret = -EEXIST;
 + goto exit_zone;
 + }
 +
 + mutex_lock(cdev_list_lock);
 + ret = sysfs_create_link(tz-device.kobj, cdev-device.kobj,
 + kobject_name(cdev-device.kobj));
 + if (ret)
 + goto exit_cdev;
 +
 + tz-cdevs[tz-cdev_indx++] = cdev;
 +
 +exit_cdev:
 + mutex_unlock(cdev_list_lock);
 +exit_zone:
 + mutex_unlock(zone_list_lock);
 + return ret;
 +}
 +EXPORT_SYMBOL(add_cdev_to_zone);
 +
  /**
   * thermal_sensor_register - register a new thermal sensor
   * @name:name of the thermal sensor
 diff --git a/include/linux/thermal.h b/include/linux/thermal.h
 index f08f774..c4e45c7 100644
 --- a/include/linux/thermal.h
 +++ b/include/linux/thermal.h
 @@ -51,6 +51,8 @@
  
  #define MAX_SENSORS_PER_ZONE 5
  
 +#define MAX_CDEVS_PER_ZONE   5
 +
  struct thermal_sensor;
  struct thermal_zone_device;
  struct thermal_cooling_device;
 @@ -209,6 +211,10 @@ struct thermal_zone {
   /* Sensor level information */
   int sensor_indx; /* index into 'sensors' array */
   

RE: [PATCH 3/8] Thermal: Add APIs to bind cdev to new zone structure

2012-12-25 Thread R, Durgadoss


 -Original Message-
 From: linux-pm-ow...@vger.kernel.org [mailto:linux-pm-
 ow...@vger.kernel.org] On Behalf Of Wei Ni
 Sent: Tuesday, December 25, 2012 2:01 PM
 To: R, Durgadoss
 Cc: Zhang, Rui; linux...@vger.kernel.org; linux-kernel@vger.kernel.org;
 hongbo.zh...@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:
  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 durgados...@intel.com
  ---
   drivers/thermal/thermal_sys.c |   80
 +
   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(struct
 thermal_zone *tz,
  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(struct
 thermal_cooling_device *cdev)
  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(struct
 thermal_cooling_device *cdev)
 
  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
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 3/8] Thermal: Add APIs to bind cdev to new zone structure

2012-12-18 Thread Durgadoss R
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 
---
 drivers/thermal/thermal_sys.c |   80 +
 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(##_list_lock);\
} while (0)
 
+#define for_each_cdev(pos) \
+   list_for_each_entry(pos, _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(struct thermal_zone 
*tz,
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(>device.kobj, kobject_name(>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(struct 
thermal_cooling_device *cdev)
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(struct 
thermal_cooling_device *cdev)
 
mutex_unlock(_list_lock);
 
+   mutex_lock(_list_lock);
+
+   for_each_thermal_zone(tmp_tz)
+   remove_cdev_from_zone(tmp_tz, cdev);
+
+   mutex_unlock(_list_lock);
+
if (cdev->type[0])
device_remove_file(>device, _attr_cdev_type);
device_remove_file(>device, _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(_list_lock);
+   for_each_cdev(pos) {
+   if (!strnicmp(pos->type, name, THERMAL_NAME_LENGTH)) {
+   cdev = pos;
+   break;
+   }
+   }
+   mutex_unlock(_list_lock);
+   return cdev;
+}
+EXPORT_SYMBOL(get_cdev_by_name);
+
 struct thermal_sensor *get_sensor_by_name(const char *name)
 {
struct thermal_sensor *pos;
@@ -1840,6 +1887,39 @@ exit_zone:
 }
 EXPORT_SYMBOL(add_sensor_to_zone);
 
+int add_cdev_to_zone(struct thermal_zone *tz,
+   struct thermal_cooling_device *cdev)
+{
+   int ret;
+
+   if (!tz || !cdev)
+   return -EINVAL;
+
+   mutex_lock(_list_lock);
+
+   /* Ensure we are not adding the same cdev again!! */
+   GET_INDEX(tz, cdev, ret, cdev);
+   if (ret >= 0) {
+   ret = -EEXIST;
+   goto exit_zone;
+   }
+
+   mutex_lock(_list_lock);
+   ret = sysfs_create_link(>device.kobj, >device.kobj,
+   kobject_name(>device.kobj));
+   if (ret)
+   goto exit_cdev;
+
+   tz->cdevs[tz->cdev_indx++] = cdev;
+
+exit_cdev:
+   mutex_unlock(_list_lock);
+exit_zone:
+   mutex_unlock(_list_lock);
+   return ret;
+}
+EXPORT_SYMBOL(add_cdev_to_zone);
+
 /**
  * thermal_sensor_register - register a new thermal sensor
  * @name:  name of the thermal sensor
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index f08f774..c4e45c7 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -51,6 +51,8 @@
 
 #define MAX_SENSORS_PER_ZONE   5
 
+#define MAX_CDEVS_PER_ZONE 5
+
 struct thermal_sensor;
 struct thermal_zone_device;
 struct thermal_cooling_device;
@@ -209,6 +211,10 @@ struct thermal_zone {
/* Sensor level information */
int sensor_indx; /* index into 'sensors' array */
struct thermal_sensor *sensors[MAX_SENSORS_PER_ZONE];
+
+   /* cdev level information */
+   int cdev_indx; /* index into 'cdevs' array */
+   struct thermal_cooling_device *cdevs[MAX_CDEVS_PER_ZONE];
 };
 
 /* Structure that holds thermal governor 

[PATCH 3/8] Thermal: Add APIs to bind cdev to new zone structure

2012-12-18 Thread Durgadoss R
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 durgados...@intel.com
---
 drivers/thermal/thermal_sys.c |   80 +
 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(struct thermal_zone 
*tz,
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(struct 
thermal_cooling_device *cdev)
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(struct 
thermal_cooling_device *cdev)
 
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);
+
 struct thermal_sensor *get_sensor_by_name(const char *name)
 {
struct thermal_sensor *pos;
@@ -1840,6 +1887,39 @@ exit_zone:
 }
 EXPORT_SYMBOL(add_sensor_to_zone);
 
+int add_cdev_to_zone(struct thermal_zone *tz,
+   struct thermal_cooling_device *cdev)
+{
+   int ret;
+
+   if (!tz || !cdev)
+   return -EINVAL;
+
+   mutex_lock(zone_list_lock);
+
+   /* Ensure we are not adding the same cdev again!! */
+   GET_INDEX(tz, cdev, ret, cdev);
+   if (ret = 0) {
+   ret = -EEXIST;
+   goto exit_zone;
+   }
+
+   mutex_lock(cdev_list_lock);
+   ret = sysfs_create_link(tz-device.kobj, cdev-device.kobj,
+   kobject_name(cdev-device.kobj));
+   if (ret)
+   goto exit_cdev;
+
+   tz-cdevs[tz-cdev_indx++] = cdev;
+
+exit_cdev:
+   mutex_unlock(cdev_list_lock);
+exit_zone:
+   mutex_unlock(zone_list_lock);
+   return ret;
+}
+EXPORT_SYMBOL(add_cdev_to_zone);
+
 /**
  * thermal_sensor_register - register a new thermal sensor
  * @name:  name of the thermal sensor
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index f08f774..c4e45c7 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -51,6 +51,8 @@
 
 #define MAX_SENSORS_PER_ZONE   5
 
+#define MAX_CDEVS_PER_ZONE 5
+
 struct thermal_sensor;
 struct thermal_zone_device;
 struct thermal_cooling_device;
@@ -209,6 +211,10 @@ struct thermal_zone {
/* Sensor level information */
int sensor_indx; /* index into 'sensors' array */
struct thermal_sensor *sensors[MAX_SENSORS_PER_ZONE];
+
+   /* cdev level information */
+   int cdev_indx; /* index into 'cdevs' array */
+   struct