638dd0586e3f4f51360ab2124f4ef7ee9643db2d
[firefly-linux-kernel-4.4.55.git] / drivers / hwmon / lm75.c
1 /*
2  * lm75.c - Part of lm_sensors, Linux kernel modules for hardware
3  *       monitoring
4  * Copyright (c) 1998, 1999  Frodo Looijaard <frodol@dds.nl>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19  */
20
21 #include <linux/module.h>
22 #include <linux/init.h>
23 #include <linux/slab.h>
24 #include <linux/jiffies.h>
25 #include <linux/i2c.h>
26 #include <linux/hwmon.h>
27 #include <linux/hwmon-sysfs.h>
28 #include <linux/err.h>
29 #include <linux/mutex.h>
30 #include "lm75.h"
31
32
33 /*
34  * This driver handles the LM75 and compatible digital temperature sensors.
35  */
36
37 enum lm75_type {                /* keep sorted in alphabetical order */
38         ds1775,
39         ds75,
40         lm75,
41         lm75a,
42         max6625,
43         max6626,
44         mcp980x,
45         stds75,
46         tcn75,
47         tmp100,
48         tmp101,
49         tmp105,
50         tmp175,
51         tmp275,
52         tmp75,
53 };
54
55 /* Addresses scanned */
56 static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b, 0x4c,
57                                         0x4d, 0x4e, 0x4f, I2C_CLIENT_END };
58
59
60 /* The LM75 registers */
61 #define LM75_REG_CONF           0x01
62 static const u8 LM75_REG_TEMP[3] = {
63         0x00,           /* input */
64         0x03,           /* max */
65         0x02,           /* hyst */
66 };
67
68 /* Each client has this additional data */
69 struct lm75_data {
70         struct device           *hwmon_dev;
71         struct mutex            update_lock;
72         u8                      orig_conf;
73         char                    valid;          /* !=0 if registers are valid */
74         unsigned long           last_updated;   /* In jiffies */
75         u16                     temp[3];        /* Register values,
76                                                    0 = input
77                                                    1 = max
78                                                    2 = hyst */
79 };
80
81 static int lm75_read_value(struct i2c_client *client, u8 reg);
82 static int lm75_write_value(struct i2c_client *client, u8 reg, u16 value);
83 static struct lm75_data *lm75_update_device(struct device *dev);
84
85
86 /*-----------------------------------------------------------------------*/
87
88 /* sysfs attributes for hwmon */
89
90 static ssize_t show_temp(struct device *dev, struct device_attribute *da,
91                          char *buf)
92 {
93         struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
94         struct lm75_data *data = lm75_update_device(dev);
95         return sprintf(buf, "%d\n",
96                        LM75_TEMP_FROM_REG(data->temp[attr->index]));
97 }
98
99 static ssize_t set_temp(struct device *dev, struct device_attribute *da,
100                         const char *buf, size_t count)
101 {
102         struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
103         struct i2c_client *client = to_i2c_client(dev);
104         struct lm75_data *data = i2c_get_clientdata(client);
105         int nr = attr->index;
106         long temp;
107         int error;
108
109         error = strict_strtol(buf, 10, &temp);
110         if (error)
111                 return error;
112
113         mutex_lock(&data->update_lock);
114         data->temp[nr] = LM75_TEMP_TO_REG(temp);
115         lm75_write_value(client, LM75_REG_TEMP[nr], data->temp[nr]);
116         mutex_unlock(&data->update_lock);
117         return count;
118 }
119
120 static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO,
121                         show_temp, set_temp, 1);
122 static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IWUSR | S_IRUGO,
123                         show_temp, set_temp, 2);
124 static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0);
125
126 static struct attribute *lm75_attributes[] = {
127         &sensor_dev_attr_temp1_input.dev_attr.attr,
128         &sensor_dev_attr_temp1_max.dev_attr.attr,
129         &sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
130
131         NULL
132 };
133
134 static const struct attribute_group lm75_group = {
135         .attrs = lm75_attributes,
136 };
137
138 /*-----------------------------------------------------------------------*/
139
140 /* device probe and removal */
141
142 static int
143 lm75_probe(struct i2c_client *client, const struct i2c_device_id *id)
144 {
145         struct lm75_data *data;
146         int status;
147         u8 set_mask, clr_mask;
148         int new;
149
150         if (!i2c_check_functionality(client->adapter,
151                         I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA))
152                 return -EIO;
153
154         data = kzalloc(sizeof(struct lm75_data), GFP_KERNEL);
155         if (!data)
156                 return -ENOMEM;
157
158         i2c_set_clientdata(client, data);
159         mutex_init(&data->update_lock);
160
161         /* Set to LM75 resolution (9 bits, 1/2 degree C) and range.
162          * Then tweak to be more precise when appropriate.
163          */
164         set_mask = 0;
165         clr_mask = (1 << 0)                     /* continuous conversions */
166                 | (1 << 6) | (1 << 5);          /* 9-bit mode */
167
168         /* configure as specified */
169         status = lm75_read_value(client, LM75_REG_CONF);
170         if (status < 0) {
171                 dev_dbg(&client->dev, "Can't read config? %d\n", status);
172                 goto exit_free;
173         }
174         data->orig_conf = status;
175         new = status & ~clr_mask;
176         new |= set_mask;
177         if (status != new)
178                 lm75_write_value(client, LM75_REG_CONF, new);
179         dev_dbg(&client->dev, "Config %02x\n", new);
180
181         /* Register sysfs hooks */
182         status = sysfs_create_group(&client->dev.kobj, &lm75_group);
183         if (status)
184                 goto exit_free;
185
186         data->hwmon_dev = hwmon_device_register(&client->dev);
187         if (IS_ERR(data->hwmon_dev)) {
188                 status = PTR_ERR(data->hwmon_dev);
189                 goto exit_remove;
190         }
191
192         dev_info(&client->dev, "%s: sensor '%s'\n",
193                  dev_name(data->hwmon_dev), client->name);
194
195         return 0;
196
197 exit_remove:
198         sysfs_remove_group(&client->dev.kobj, &lm75_group);
199 exit_free:
200         kfree(data);
201         return status;
202 }
203
204 static int lm75_remove(struct i2c_client *client)
205 {
206         struct lm75_data *data = i2c_get_clientdata(client);
207
208         hwmon_device_unregister(data->hwmon_dev);
209         sysfs_remove_group(&client->dev.kobj, &lm75_group);
210         lm75_write_value(client, LM75_REG_CONF, data->orig_conf);
211         kfree(data);
212         return 0;
213 }
214
215 static const struct i2c_device_id lm75_ids[] = {
216         { "ds1775", ds1775, },
217         { "ds75", ds75, },
218         { "lm75", lm75, },
219         { "lm75a", lm75a, },
220         { "max6625", max6625, },
221         { "max6626", max6626, },
222         { "mcp980x", mcp980x, },
223         { "stds75", stds75, },
224         { "tcn75", tcn75, },
225         { "tmp100", tmp100, },
226         { "tmp101", tmp101, },
227         { "tmp105", tmp105, },
228         { "tmp175", tmp175, },
229         { "tmp275", tmp275, },
230         { "tmp75", tmp75, },
231         { /* LIST END */ }
232 };
233 MODULE_DEVICE_TABLE(i2c, lm75_ids);
234
235 #define LM75A_ID 0xA1
236
237 /* Return 0 if detection is successful, -ENODEV otherwise */
238 static int lm75_detect(struct i2c_client *new_client,
239                        struct i2c_board_info *info)
240 {
241         struct i2c_adapter *adapter = new_client->adapter;
242         int i;
243         int cur, conf, hyst, os;
244         bool is_lm75a = 0;
245
246         if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA |
247                                      I2C_FUNC_SMBUS_WORD_DATA))
248                 return -ENODEV;
249
250         /* Now, we do the remaining detection. There is no identification-
251            dedicated register so we have to rely on several tricks:
252            unused bits, registers cycling over 8-address boundaries,
253            addresses 0x04-0x07 returning the last read value.
254            The cycling+unused addresses combination is not tested,
255            since it would significantly slow the detection down and would
256            hardly add any value.
257
258            The National Semiconductor LM75A is different than earlier
259            LM75s.  It has an ID byte of 0xaX (where X is the chip
260            revision, with 1 being the only revision in existence) in
261            register 7, and unused registers return 0xff rather than the
262            last read value. */
263
264         cur = i2c_smbus_read_word_data(new_client, 0);
265         conf = i2c_smbus_read_byte_data(new_client, 1);
266
267         /* First check for LM75A */
268         if (i2c_smbus_read_byte_data(new_client, 7) == LM75A_ID) {
269                 /* LM75A returns 0xff on unused registers so
270                    just to be sure we check for that too. */
271                 if (i2c_smbus_read_byte_data(new_client, 4) != 0xff
272                  || i2c_smbus_read_byte_data(new_client, 5) != 0xff
273                  || i2c_smbus_read_byte_data(new_client, 6) != 0xff)
274                         return -ENODEV;
275                 is_lm75a = 1;
276                 hyst = i2c_smbus_read_word_data(new_client, 2);
277                 os = i2c_smbus_read_word_data(new_client, 3);
278         } else { /* Traditional style LM75 detection */
279                 /* Unused addresses */
280                 hyst = i2c_smbus_read_word_data(new_client, 2);
281                 if (i2c_smbus_read_word_data(new_client, 4) != hyst
282                  || i2c_smbus_read_word_data(new_client, 5) != hyst
283                  || i2c_smbus_read_word_data(new_client, 6) != hyst
284                  || i2c_smbus_read_word_data(new_client, 7) != hyst)
285                         return -ENODEV;
286                 os = i2c_smbus_read_word_data(new_client, 3);
287                 if (i2c_smbus_read_word_data(new_client, 4) != os
288                  || i2c_smbus_read_word_data(new_client, 5) != os
289                  || i2c_smbus_read_word_data(new_client, 6) != os
290                  || i2c_smbus_read_word_data(new_client, 7) != os)
291                         return -ENODEV;
292         }
293
294         /* Unused bits */
295         if (conf & 0xe0)
296                 return -ENODEV;
297
298         /* Addresses cycling */
299         for (i = 8; i < 0xff; i += 8) {
300                 if (i2c_smbus_read_byte_data(new_client, i + 1) != conf
301                  || i2c_smbus_read_word_data(new_client, i + 2) != hyst
302                  || i2c_smbus_read_word_data(new_client, i + 3) != os)
303                         return -ENODEV;
304                 if (is_lm75a && i2c_smbus_read_byte_data(new_client, i + 7)
305                                 != LM75A_ID)
306                         return -ENODEV;
307         }
308
309         strlcpy(info->type, is_lm75a ? "lm75a" : "lm75", I2C_NAME_SIZE);
310
311         return 0;
312 }
313
314 #ifdef CONFIG_PM
315 static int lm75_suspend(struct device *dev)
316 {
317         int status;
318         struct i2c_client *client = to_i2c_client(dev);
319         status = lm75_read_value(client, LM75_REG_CONF);
320         if (status < 0) {
321                 dev_dbg(&client->dev, "Can't read config? %d\n", status);
322                 return status;
323         }
324         status = status | LM75_SHUTDOWN;
325         lm75_write_value(client, LM75_REG_CONF, status);
326         return 0;
327 }
328
329 static int lm75_resume(struct device *dev)
330 {
331         int status;
332         struct i2c_client *client = to_i2c_client(dev);
333         status = lm75_read_value(client, LM75_REG_CONF);
334         if (status < 0) {
335                 dev_dbg(&client->dev, "Can't read config? %d\n", status);
336                 return status;
337         }
338         status = status & ~LM75_SHUTDOWN;
339         lm75_write_value(client, LM75_REG_CONF, status);
340         return 0;
341 }
342
343 static const struct dev_pm_ops lm75_dev_pm_ops = {
344         .suspend        = lm75_suspend,
345         .resume         = lm75_resume,
346 };
347 #define LM75_DEV_PM_OPS (&lm75_dev_pm_ops)
348 #else
349 #define LM75_DEV_PM_OPS NULL
350 #endif /* CONFIG_PM */
351
352 static struct i2c_driver lm75_driver = {
353         .class          = I2C_CLASS_HWMON,
354         .driver = {
355                 .name   = "lm75",
356                 .pm     = LM75_DEV_PM_OPS,
357         },
358         .probe          = lm75_probe,
359         .remove         = lm75_remove,
360         .id_table       = lm75_ids,
361         .detect         = lm75_detect,
362         .address_list   = normal_i2c,
363 };
364
365 /*-----------------------------------------------------------------------*/
366
367 /* register access */
368
369 /*
370  * All registers are word-sized, except for the configuration register.
371  * LM75 uses a high-byte first convention, which is exactly opposite to
372  * the SMBus standard.
373  */
374 static int lm75_read_value(struct i2c_client *client, u8 reg)
375 {
376         int value;
377
378         if (reg == LM75_REG_CONF)
379                 return i2c_smbus_read_byte_data(client, reg);
380
381         value = i2c_smbus_read_word_data(client, reg);
382         return (value < 0) ? value : swab16(value);
383 }
384
385 static int lm75_write_value(struct i2c_client *client, u8 reg, u16 value)
386 {
387         if (reg == LM75_REG_CONF)
388                 return i2c_smbus_write_byte_data(client, reg, value);
389         else
390                 return i2c_smbus_write_word_data(client, reg, swab16(value));
391 }
392
393 static struct lm75_data *lm75_update_device(struct device *dev)
394 {
395         struct i2c_client *client = to_i2c_client(dev);
396         struct lm75_data *data = i2c_get_clientdata(client);
397
398         mutex_lock(&data->update_lock);
399
400         if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
401             || !data->valid) {
402                 int i;
403                 dev_dbg(&client->dev, "Starting lm75 update\n");
404
405                 for (i = 0; i < ARRAY_SIZE(data->temp); i++) {
406                         int status;
407
408                         status = lm75_read_value(client, LM75_REG_TEMP[i]);
409                         if (status < 0)
410                                 dev_dbg(&client->dev, "reg %d, err %d\n",
411                                                 LM75_REG_TEMP[i], status);
412                         else
413                                 data->temp[i] = status;
414                 }
415                 data->last_updated = jiffies;
416                 data->valid = 1;
417         }
418
419         mutex_unlock(&data->update_lock);
420
421         return data;
422 }
423
424 /*-----------------------------------------------------------------------*/
425
426 /* module glue */
427
428 static int __init sensors_lm75_init(void)
429 {
430         return i2c_add_driver(&lm75_driver);
431 }
432
433 static void __exit sensors_lm75_exit(void)
434 {
435         i2c_del_driver(&lm75_driver);
436 }
437
438 MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>");
439 MODULE_DESCRIPTION("LM75 driver");
440 MODULE_LICENSE("GPL");
441
442 module_init(sensors_lm75_init);
443 module_exit(sensors_lm75_exit);