On Tue, 2013-02-05 at 16:16 +0530, Durgadoss R wrote:
> This patch creates sensor level APIs, in the
> generic thermal framework.
> 
> A Thermal sensor is a piece of hardware that can report
> temperature of the spot in which it is placed. A thermal
> sensor driver reads the temperature from this sensor
> and reports it out. This kind of driver can be in
> any subsystem. If the sensor needs to participate
> in platform thermal management, the corresponding
> driver can use the APIs introduced in this patch, to
> register(or unregister) with the thermal framework.
> 
> Signed-off-by: Durgadoss R <durgados...@intel.com>
> ---
>  drivers/thermal/thermal_sys.c |  280 
> +++++++++++++++++++++++++++++++++++++++++
>  include/linux/thermal.h       |   29 +++++
>  2 files changed, 309 insertions(+)
> 
> diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c
> index 0a1bf6b..cb94497 100644
> --- a/drivers/thermal/thermal_sys.c
> +++ b/drivers/thermal/thermal_sys.c
> @@ -44,13 +44,16 @@ MODULE_LICENSE("GPL");
>  
>  static DEFINE_IDR(thermal_tz_idr);
>  static DEFINE_IDR(thermal_cdev_idr);
> +static DEFINE_IDR(thermal_sensor_idr);
>  static DEFINE_MUTEX(thermal_idr_lock);
>  
>  static LIST_HEAD(thermal_tz_list);
> +static LIST_HEAD(thermal_sensor_list);
>  static LIST_HEAD(thermal_cdev_list);
>  static LIST_HEAD(thermal_governor_list);
>  
>  static DEFINE_MUTEX(thermal_list_lock);
> +static DEFINE_MUTEX(sensor_list_lock);
>  static DEFINE_MUTEX(thermal_governor_lock);
>  
>  static struct thermal_governor *__find_governor(const char *name)
> @@ -423,6 +426,103 @@ static void thermal_zone_device_check(struct 
> work_struct *work)
>  #define to_thermal_zone(_dev) \
>       container_of(_dev, struct thermal_zone_device, device)
>  
> +#define to_thermal_sensor(_dev) \
> +     container_of(_dev, struct thermal_sensor, device)
> +
> +static ssize_t
> +sensor_name_show(struct device *dev, struct device_attribute *attr, char 
> *buf)
> +{
> +     struct thermal_sensor *ts = to_thermal_sensor(dev);
> +
> +     return sprintf(buf, "%s\n", ts->name);
> +}
> +
> +static ssize_t
> +sensor_temp_show(struct device *dev, struct device_attribute *attr, char 
> *buf)
> +{
> +     int ret;
> +     long val;
> +     struct thermal_sensor *ts = to_thermal_sensor(dev);
> +
> +     ret = ts->ops->get_temp(ts, &val);
> +
> +     return ret ? ret : sprintf(buf, "%ld\n", val);
> +}
> +
> +static ssize_t
> +hyst_show(struct device *dev, struct device_attribute *attr, char *buf)
> +{
> +     int indx, ret;
> +     long val;
> +     struct thermal_sensor *ts = to_thermal_sensor(dev);
> +
> +     if (!sscanf(attr->attr.name, "threshold%d_hyst", &indx))
> +             return -EINVAL;
> +
> +     ret = ts->ops->get_hyst(ts, indx, &val);
> +
> +     return ret ? ret : sprintf(buf, "%ld\n", val);
> +}
> +
> +static ssize_t
> +hyst_store(struct device *dev, struct device_attribute *attr,
> +                                const char *buf, size_t count)
> +{
> +     int indx, ret;
> +     long val;
> +     struct thermal_sensor *ts = to_thermal_sensor(dev);
> +
> +     if (!ts->ops->set_hyst)
> +             return -EPERM;
> +
> +     if (!sscanf(attr->attr.name, "threshold%d_hyst", &indx))
> +             return -EINVAL;
> +
> +     if (kstrtol(buf, 10, &val))
> +             return -EINVAL;
> +
> +     ret = ts->ops->set_hyst(ts, indx, val);
> +
> +     return ret ? ret : count;
> +}
> +
> +static ssize_t
> +threshold_show(struct device *dev, struct device_attribute *attr, char *buf)
> +{
> +     int indx, ret;
> +     long val;
> +     struct thermal_sensor *ts = to_thermal_sensor(dev);
> +
> +     if (!sscanf(attr->attr.name, "threshold%d", &indx))
> +             return -EINVAL;
> +
> +     ret = ts->ops->get_threshold(ts, indx, &val);
> +
> +     return ret ? ret : sprintf(buf, "%ld\n", val);
> +}
> +
> +static ssize_t
> +threshold_store(struct device *dev, struct device_attribute *attr,
> +                                const char *buf, size_t count)
> +{
> +     int indx, ret;
> +     long val;
> +     struct thermal_sensor *ts = to_thermal_sensor(dev);
> +
> +     if (!ts->ops->set_threshold)
> +             return -EPERM;
> +
> +     if (!sscanf(attr->attr.name, "threshold%d", &indx))
> +             return -EINVAL;
> +
> +     if (kstrtol(buf, 10, &val))
> +             return -EINVAL;
> +
> +     ret = ts->ops->set_threshold(ts, indx, val);
> +
> +     return ret ? ret : count;
> +}
> +
>  static ssize_t
>  type_show(struct device *dev, struct device_attribute *attr, char *buf)
>  {
> @@ -707,6 +807,10 @@ static DEVICE_ATTR(mode, 0644, mode_show, mode_store);
>  static DEVICE_ATTR(passive, S_IRUGO | S_IWUSR, passive_show, passive_store);
>  static DEVICE_ATTR(policy, S_IRUGO | S_IWUSR, policy_show, policy_store);
>  
> +/* Thermal sensor attributes */
> +static DEVICE_ATTR(sensor_name, 0444, sensor_name_show, NULL);
> +static DEVICE_ATTR(temp_input, 0444, sensor_temp_show, NULL);
> +
>  /* sys I/F for cooling device */
>  #define to_cooling_device(_dev)      \
>       container_of(_dev, struct thermal_cooling_device, device)
> @@ -1493,6 +1597,182 @@ static void remove_trip_attrs(struct 
> thermal_zone_device *tz)
>  }
>  
>  /**
> + * enable_sensor_thresholds - create sysfs nodes for thresholdX

this is a little confusing.
I'd prefer
thermal_sensor_sysfs_add() and create sensor_name and temp_input
attribute in this function as well, and thermal_sensor_sysfs_remove()
to remove the sysfs I/F.
And further more, we can do this for thermal zones and cooling devices.

others look okay to me.

thanks,
rui

--
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/

Reply via email to