[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <1393309301-28337-3-git-send-email-wni@nvidia.com>
Date: Tue, 25 Feb 2014 14:21:41 +0800
From: Wei Ni <wni@...dia.com>
To: <khali@...ux-fr.org>, <linux@...ck-us.net>
CC: <lm-sensors@...sensors.org>, <linux-kernel@...r.kernel.org>,
Wei Ni <wni@...dia.com>
Subject: [PATCH 2/2] hwmon: lm90: expose to thermal fw via DT nodes
This patch adds to lm90 temperature sensor the possibility
to expose itself as thermal zone device, registered on the
thermal framework.
The thermal zone is built only if a device tree node
describing a thermal zone for this sensor is present
inside the lm90 DT node. Otherwise, the driver behavior
will be the same.
Signed-off-by: Wei Ni <wni@...dia.com>
---
drivers/hwmon/lm90.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 58 insertions(+)
diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
index fb9e224..8f52269 100644
--- a/drivers/hwmon/lm90.c
+++ b/drivers/hwmon/lm90.c
@@ -96,6 +96,8 @@
#include <linux/sysfs.h>
#include <linux/interrupt.h>
#include <linux/regulator/consumer.h>
+#include <linux/of.h>
+#include <linux/thermal.h>
/*
* Addresses to scan
@@ -119,6 +121,13 @@ static const unsigned short normal_i2c[] = {
enum chips { lm90, adm1032, lm99, lm86, max6657, max6659, adt7461, max6680,
max6646, w83l771, max6696, sa56004, g781, tmp451 };
+enum sensor_id {
+ LOCAL = 0,
+ REMOTE,
+ REMOTE2,
+ SENSOR_ID_END,
+};
+
/*
* The LM90 registers
*/
@@ -368,6 +377,7 @@ struct lm90_data {
struct i2c_client *client;
struct device *hwmon_dev;
const struct attribute_group *groups[6];
+ struct thermal_zone_device *tz[SENSOR_ID_END];
struct mutex update_lock;
struct regulator *regulator;
char valid; /* zero until following fields are valid */
@@ -880,6 +890,24 @@ static ssize_t show_temp11(struct device *dev, struct device_attribute *devattr,
return sprintf(buf, "%d\n", read_temp11(dev, attr->index));
}
+static int lm90_read_local_temp(void *dev, long *temp)
+{
+ *temp = read_temp11(dev, LOCAL_TEMP);
+ return 0;
+}
+
+static int lm90_read_remote_temp(void *dev, long *temp)
+{
+ *temp = read_temp11(dev, REMOTE_TEMP);
+ return 0;
+}
+
+static int lm90_read_remote2_temp(void *dev, long *temp)
+{
+ *temp = read_temp11(dev, REMOTE2_TEMP);
+ return 0;
+}
+
static int write_temp11(struct device *dev, int nr, int index, long val)
{
struct {
@@ -1659,6 +1687,33 @@ static int lm90_probe(struct i2c_client *client,
}
}
+ data->tz[LOCAL] = thermal_zone_of_sensor_register(&client->dev,
+ LOCAL,
+ &client->dev,
+ lm90_read_local_temp,
+ NULL);
+ if (IS_ERR(data->tz[LOCAL]))
+ data->tz[LOCAL] = NULL;
+
+ data->tz[REMOTE] = thermal_zone_of_sensor_register(&client->dev,
+ REMOTE,
+ &client->dev,
+ lm90_read_remote_temp,
+ NULL);
+ if (IS_ERR(data->tz[REMOTE]))
+ data->tz[REMOTE] = NULL;
+
+ if (data->flags & LM90_HAVE_TEMP3) {
+ data->tz[REMOTE2] = thermal_zone_of_sensor_register(
+ &client->dev,
+ REMOTE2,
+ &client->dev,
+ lm90_read_remote2_temp,
+ NULL);
+ if (IS_ERR(data->tz[REMOTE2]))
+ data->tz[REMOTE2] = NULL;
+ }
+
return 0;
exit_unregister:
@@ -1674,8 +1729,11 @@ exit_restore:
static int lm90_remove(struct i2c_client *client)
{
+ int i;
struct lm90_data *data = i2c_get_clientdata(client);
+ for (i = 0; i < SENSOR_ID_END; i++)
+ thermal_zone_of_sensor_unregister(&client->dev, data->tz[i]);
hwmon_device_unregister(data->hwmon_dev);
device_remove_file(&client->dev, &dev_attr_pec);
lm90_restore_conf(client, data);
--
1.7.9.5
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists