hwmon: (lm95241) Fix overflow problems, write conversion rate to chip
[cascardo/linux.git] / drivers / hwmon / lm95241.c
1 /*
2  * Copyright (C) 2008, 2010 Davide Rizzo <elpa.rizzo@gmail.com>
3  *
4  * The LM95241 is a sensor chip made by National Semiconductors.
5  * It reports up to three temperatures (its own plus up to two external ones).
6  * Complete datasheet can be obtained from National's website at:
7  *   http://www.national.com/ds.cgi/LM/LM95241.pdf
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22  */
23
24 #include <linux/module.h>
25 #include <linux/init.h>
26 #include <linux/slab.h>
27 #include <linux/jiffies.h>
28 #include <linux/i2c.h>
29 #include <linux/hwmon.h>
30 #include <linux/hwmon-sysfs.h>
31 #include <linux/err.h>
32 #include <linux/mutex.h>
33 #include <linux/sysfs.h>
34
35 #define DEVNAME "lm95241"
36
37 static const unsigned short normal_i2c[] = {
38         0x19, 0x2a, 0x2b, I2C_CLIENT_END };
39
40 /* LM95241 registers */
41 #define LM95241_REG_R_MAN_ID            0xFE
42 #define LM95241_REG_R_CHIP_ID           0xFF
43 #define LM95241_REG_R_STATUS            0x02
44 #define LM95241_REG_RW_CONFIG           0x03
45 #define LM95241_REG_RW_REM_FILTER       0x06
46 #define LM95241_REG_RW_TRUTHERM         0x07
47 #define LM95241_REG_W_ONE_SHOT          0x0F
48 #define LM95241_REG_R_LOCAL_TEMPH       0x10
49 #define LM95241_REG_R_REMOTE1_TEMPH     0x11
50 #define LM95241_REG_R_REMOTE2_TEMPH     0x12
51 #define LM95241_REG_R_LOCAL_TEMPL       0x20
52 #define LM95241_REG_R_REMOTE1_TEMPL     0x21
53 #define LM95241_REG_R_REMOTE2_TEMPL     0x22
54 #define LM95241_REG_RW_REMOTE_MODEL     0x30
55
56 /* LM95241 specific bitfields */
57 #define CFG_STOP 0x40
58 #define CFG_CR0076 0x00
59 #define CFG_CR0182 0x10
60 #define CFG_CR1000 0x20
61 #define CFG_CR2700 0x30
62 #define CFG_CRMASK 0x30
63 #define R1MS_SHIFT 0
64 #define R2MS_SHIFT 2
65 #define R1MS_MASK (0x01 << (R1MS_SHIFT))
66 #define R2MS_MASK (0x01 << (R2MS_SHIFT))
67 #define R1DF_SHIFT 1
68 #define R2DF_SHIFT 2
69 #define R1DF_MASK (0x01 << (R1DF_SHIFT))
70 #define R2DF_MASK (0x01 << (R2DF_SHIFT))
71 #define R1FE_MASK 0x01
72 #define R2FE_MASK 0x05
73 #define TT1_SHIFT 0
74 #define TT2_SHIFT 4
75 #define TT_OFF 0
76 #define TT_ON 1
77 #define TT_MASK 7
78 #define NATSEMI_MAN_ID  0x01
79 #define LM95231_CHIP_ID 0xA1
80 #define LM95241_CHIP_ID 0xA4
81
82 static const u8 lm95241_reg_address[] = {
83         LM95241_REG_R_LOCAL_TEMPH,
84         LM95241_REG_R_LOCAL_TEMPL,
85         LM95241_REG_R_REMOTE1_TEMPH,
86         LM95241_REG_R_REMOTE1_TEMPL,
87         LM95241_REG_R_REMOTE2_TEMPH,
88         LM95241_REG_R_REMOTE2_TEMPL
89 };
90
91 /* Client data (each client gets its own) */
92 struct lm95241_data {
93         struct i2c_client *client;
94         struct mutex update_lock;
95         unsigned long last_updated;     /* in jiffies */
96         unsigned long interval;         /* in milli-seconds */
97         char valid;             /* zero until following fields are valid */
98         /* registers values */
99         u8 temp[ARRAY_SIZE(lm95241_reg_address)];
100         u8 config, model, trutherm;
101 };
102
103 /* Conversions */
104 static int temp_from_reg_signed(u8 val_h, u8 val_l)
105 {
106         s16 val_hl = (val_h << 8) | val_l;
107         return val_hl * 1000 / 256;
108 }
109
110 static int temp_from_reg_unsigned(u8 val_h, u8 val_l)
111 {
112         u16 val_hl = (val_h << 8) | val_l;
113         return val_hl * 1000 / 256;
114 }
115
116 static struct lm95241_data *lm95241_update_device(struct device *dev)
117 {
118         struct lm95241_data *data = dev_get_drvdata(dev);
119         struct i2c_client *client = data->client;
120
121         mutex_lock(&data->update_lock);
122
123         if (time_after(jiffies, data->last_updated
124                        + msecs_to_jiffies(data->interval)) ||
125             !data->valid) {
126                 int i;
127
128                 dev_dbg(dev, "Updating lm95241 data.\n");
129                 for (i = 0; i < ARRAY_SIZE(lm95241_reg_address); i++)
130                         data->temp[i]
131                           = i2c_smbus_read_byte_data(client,
132                                                      lm95241_reg_address[i]);
133                 data->last_updated = jiffies;
134                 data->valid = 1;
135         }
136
137         mutex_unlock(&data->update_lock);
138
139         return data;
140 }
141
142 /* Sysfs stuff */
143 static ssize_t show_input(struct device *dev, struct device_attribute *attr,
144                           char *buf)
145 {
146         struct lm95241_data *data = lm95241_update_device(dev);
147         int index = to_sensor_dev_attr(attr)->index;
148
149         return snprintf(buf, PAGE_SIZE - 1, "%d\n",
150                         index == 0 || (data->config & (1 << (index / 2))) ?
151                 temp_from_reg_signed(data->temp[index], data->temp[index + 1]) :
152                 temp_from_reg_unsigned(data->temp[index],
153                                        data->temp[index + 1]));
154 }
155
156 static ssize_t show_type(struct device *dev, struct device_attribute *attr,
157                          char *buf)
158 {
159         struct lm95241_data *data = dev_get_drvdata(dev);
160
161         return snprintf(buf, PAGE_SIZE - 1,
162                 data->model & to_sensor_dev_attr(attr)->index ? "1\n" : "2\n");
163 }
164
165 static ssize_t set_type(struct device *dev, struct device_attribute *attr,
166                         const char *buf, size_t count)
167 {
168         struct lm95241_data *data = dev_get_drvdata(dev);
169         struct i2c_client *client = data->client;
170         unsigned long val;
171         int shift;
172         u8 mask = to_sensor_dev_attr(attr)->index;
173
174         if (kstrtoul(buf, 10, &val) < 0)
175                 return -EINVAL;
176         if (val != 1 && val != 2)
177                 return -EINVAL;
178
179         shift = mask == R1MS_MASK ? TT1_SHIFT : TT2_SHIFT;
180
181         mutex_lock(&data->update_lock);
182
183         data->trutherm &= ~(TT_MASK << shift);
184         if (val == 1) {
185                 data->model |= mask;
186                 data->trutherm |= (TT_ON << shift);
187         } else {
188                 data->model &= ~mask;
189                 data->trutherm |= (TT_OFF << shift);
190         }
191         data->valid = 0;
192
193         i2c_smbus_write_byte_data(client, LM95241_REG_RW_REMOTE_MODEL,
194                                   data->model);
195         i2c_smbus_write_byte_data(client, LM95241_REG_RW_TRUTHERM,
196                                   data->trutherm);
197
198         mutex_unlock(&data->update_lock);
199
200         return count;
201 }
202
203 static ssize_t show_min(struct device *dev, struct device_attribute *attr,
204                         char *buf)
205 {
206         struct lm95241_data *data = dev_get_drvdata(dev);
207
208         return snprintf(buf, PAGE_SIZE - 1,
209                         data->config & to_sensor_dev_attr(attr)->index ?
210                         "-127000\n" : "0\n");
211 }
212
213 static ssize_t set_min(struct device *dev, struct device_attribute *attr,
214                        const char *buf, size_t count)
215 {
216         struct lm95241_data *data = dev_get_drvdata(dev);
217         long val;
218
219         if (kstrtol(buf, 10, &val) < 0)
220                 return -EINVAL;
221         if (val < -128000)
222                 return -EINVAL;
223
224         mutex_lock(&data->update_lock);
225
226         if (val < 0)
227                 data->config |= to_sensor_dev_attr(attr)->index;
228         else
229                 data->config &= ~to_sensor_dev_attr(attr)->index;
230         data->valid = 0;
231
232         i2c_smbus_write_byte_data(data->client, LM95241_REG_RW_CONFIG,
233                                   data->config);
234
235         mutex_unlock(&data->update_lock);
236
237         return count;
238 }
239
240 static ssize_t show_max(struct device *dev, struct device_attribute *attr,
241                         char *buf)
242 {
243         struct lm95241_data *data = dev_get_drvdata(dev);
244
245         return snprintf(buf, PAGE_SIZE - 1,
246                         data->config & to_sensor_dev_attr(attr)->index ?
247                         "127000\n" : "255000\n");
248 }
249
250 static ssize_t set_max(struct device *dev, struct device_attribute *attr,
251                        const char *buf, size_t count)
252 {
253         struct lm95241_data *data = dev_get_drvdata(dev);
254         long val;
255
256         if (kstrtol(buf, 10, &val) < 0)
257                 return -EINVAL;
258         if (val >= 256000)
259                 return -EINVAL;
260
261         mutex_lock(&data->update_lock);
262
263         if (val <= 127000)
264                 data->config |= to_sensor_dev_attr(attr)->index;
265         else
266                 data->config &= ~to_sensor_dev_attr(attr)->index;
267         data->valid = 0;
268
269         i2c_smbus_write_byte_data(data->client, LM95241_REG_RW_CONFIG,
270                                   data->config);
271
272         mutex_unlock(&data->update_lock);
273
274         return count;
275 }
276
277 static ssize_t show_interval(struct device *dev, struct device_attribute *attr,
278                              char *buf)
279 {
280         struct lm95241_data *data = lm95241_update_device(dev);
281
282         return snprintf(buf, PAGE_SIZE - 1, "%lu\n", data->interval);
283 }
284
285 static ssize_t set_interval(struct device *dev, struct device_attribute *attr,
286                             const char *buf, size_t count)
287 {
288         struct lm95241_data *data = dev_get_drvdata(dev);
289         unsigned long val;
290         int convrate;
291         u8 config;
292
293         if (kstrtoul(buf, 10, &val) < 0)
294                 return -EINVAL;
295
296         mutex_lock(&data->update_lock);
297
298         config = data->config & ~CFG_CRMASK;
299
300         if (val < 130) {
301                 convrate = 76;
302                 config |= CFG_CR0076;
303         } else if (val < 590) {
304                 convrate = 182;
305                 config |= CFG_CR0182;
306         } else if (val < 1850) {
307                 convrate = 1000;
308                 config |= CFG_CR1000;
309         } else {
310                 convrate = 2700;
311                 config |= CFG_CR2700;
312         }
313
314         data->interval = convrate;
315         data->config = config;
316         i2c_smbus_write_byte_data(data->client, LM95241_REG_RW_CONFIG,
317                                   config);
318         mutex_unlock(&data->update_lock);
319
320         return count;
321 }
322
323 static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_input, NULL, 0);
324 static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_input, NULL, 2);
325 static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_input, NULL, 4);
326 static SENSOR_DEVICE_ATTR(temp2_type, S_IWUSR | S_IRUGO, show_type, set_type,
327                           R1MS_MASK);
328 static SENSOR_DEVICE_ATTR(temp3_type, S_IWUSR | S_IRUGO, show_type, set_type,
329                           R2MS_MASK);
330 static SENSOR_DEVICE_ATTR(temp2_min, S_IWUSR | S_IRUGO, show_min, set_min,
331                           R1DF_MASK);
332 static SENSOR_DEVICE_ATTR(temp3_min, S_IWUSR | S_IRUGO, show_min, set_min,
333                           R2DF_MASK);
334 static SENSOR_DEVICE_ATTR(temp2_max, S_IWUSR | S_IRUGO, show_max, set_max,
335                           R1DF_MASK);
336 static SENSOR_DEVICE_ATTR(temp3_max, S_IWUSR | S_IRUGO, show_max, set_max,
337                           R2DF_MASK);
338 static DEVICE_ATTR(update_interval, S_IWUSR | S_IRUGO, show_interval,
339                    set_interval);
340
341 static struct attribute *lm95241_attrs[] = {
342         &sensor_dev_attr_temp1_input.dev_attr.attr,
343         &sensor_dev_attr_temp2_input.dev_attr.attr,
344         &sensor_dev_attr_temp3_input.dev_attr.attr,
345         &sensor_dev_attr_temp2_type.dev_attr.attr,
346         &sensor_dev_attr_temp3_type.dev_attr.attr,
347         &sensor_dev_attr_temp2_min.dev_attr.attr,
348         &sensor_dev_attr_temp3_min.dev_attr.attr,
349         &sensor_dev_attr_temp2_max.dev_attr.attr,
350         &sensor_dev_attr_temp3_max.dev_attr.attr,
351         &dev_attr_update_interval.attr,
352         NULL
353 };
354 ATTRIBUTE_GROUPS(lm95241);
355
356 /* Return 0 if detection is successful, -ENODEV otherwise */
357 static int lm95241_detect(struct i2c_client *new_client,
358                           struct i2c_board_info *info)
359 {
360         struct i2c_adapter *adapter = new_client->adapter;
361         const char *name;
362         int mfg_id, chip_id;
363
364         if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
365                 return -ENODEV;
366
367         mfg_id = i2c_smbus_read_byte_data(new_client, LM95241_REG_R_MAN_ID);
368         if (mfg_id != NATSEMI_MAN_ID)
369                 return -ENODEV;
370
371         chip_id = i2c_smbus_read_byte_data(new_client, LM95241_REG_R_CHIP_ID);
372         switch (chip_id) {
373         case LM95231_CHIP_ID:
374                 name = "lm95231";
375                 break;
376         case LM95241_CHIP_ID:
377                 name = "lm95241";
378                 break;
379         default:
380                 return -ENODEV;
381         }
382
383         /* Fill the i2c board info */
384         strlcpy(info->type, name, I2C_NAME_SIZE);
385         return 0;
386 }
387
388 static void lm95241_init_client(struct i2c_client *client,
389                                 struct lm95241_data *data)
390 {
391         data->interval = 1000;
392         data->config = CFG_CR1000;
393         data->trutherm = (TT_OFF << TT1_SHIFT) | (TT_OFF << TT2_SHIFT);
394
395         i2c_smbus_write_byte_data(client, LM95241_REG_RW_CONFIG, data->config);
396         i2c_smbus_write_byte_data(client, LM95241_REG_RW_REM_FILTER,
397                                   R1FE_MASK | R2FE_MASK);
398         i2c_smbus_write_byte_data(client, LM95241_REG_RW_TRUTHERM,
399                                   data->trutherm);
400         i2c_smbus_write_byte_data(client, LM95241_REG_RW_REMOTE_MODEL,
401                                   data->model);
402 }
403
404 static int lm95241_probe(struct i2c_client *client,
405                          const struct i2c_device_id *id)
406 {
407         struct device *dev = &client->dev;
408         struct lm95241_data *data;
409         struct device *hwmon_dev;
410
411         data = devm_kzalloc(dev, sizeof(struct lm95241_data), GFP_KERNEL);
412         if (!data)
413                 return -ENOMEM;
414
415         data->client = client;
416         mutex_init(&data->update_lock);
417
418         /* Initialize the LM95241 chip */
419         lm95241_init_client(client, data);
420
421         hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
422                                                            data,
423                                                            lm95241_groups);
424         return PTR_ERR_OR_ZERO(hwmon_dev);
425 }
426
427 /* Driver data (common to all clients) */
428 static const struct i2c_device_id lm95241_id[] = {
429         { "lm95231", 0 },
430         { "lm95241", 0 },
431         { }
432 };
433 MODULE_DEVICE_TABLE(i2c, lm95241_id);
434
435 static struct i2c_driver lm95241_driver = {
436         .class          = I2C_CLASS_HWMON,
437         .driver = {
438                 .name   = DEVNAME,
439         },
440         .probe          = lm95241_probe,
441         .id_table       = lm95241_id,
442         .detect         = lm95241_detect,
443         .address_list   = normal_i2c,
444 };
445
446 module_i2c_driver(lm95241_driver);
447
448 MODULE_AUTHOR("Davide Rizzo <elpa.rizzo@gmail.com>");
449 MODULE_DESCRIPTION("LM95241 sensor driver");
450 MODULE_LICENSE("GPL");