hwmon: (lm92) Drop FSF mailing address
[cascardo/linux.git] / drivers / hwmon / lm92.c
1 /*
2  * lm92 - Hardware monitoring driver
3  * Copyright (C) 2005-2008  Jean Delvare <jdelvare@suse.de>
4  *
5  * Based on the lm90 driver, with some ideas taken from the lm_sensors
6  * lm92 driver as well.
7  *
8  * The LM92 is a sensor chip made by National Semiconductor. It reports
9  * its own temperature with a 0.0625 deg resolution and a 0.33 deg
10  * accuracy. Complete datasheet can be obtained from National's website
11  * at:
12  *   http://www.national.com/pf/LM/LM92.html
13  *
14  * This driver also supports the MAX6635 sensor chip made by Maxim.
15  * This chip is compatible with the LM92, but has a lesser accuracy
16  * (1.0 deg). Complete datasheet can be obtained from Maxim's website
17  * at:
18  *   http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3074
19  *
20  * Since the LM92 was the first chipset supported by this driver, most
21  * comments will refer to this chipset, but are actually general and
22  * concern all supported chipsets, unless mentioned otherwise.
23  *
24  * Support could easily be added for the National Semiconductor LM76
25  * and Maxim MAX6633 and MAX6634 chips, which are mostly compatible
26  * with the LM92.
27  *
28  * This program is free software; you can redistribute it and/or modify
29  * it under the terms of the GNU General Public License as published by
30  * the Free Software Foundation; either version 2 of the License, or
31  * (at your option) any later version.
32  *
33  * This program is distributed in the hope that it will be useful,
34  * but WITHOUT ANY WARRANTY; without even the implied warranty of
35  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
36  * GNU General Public License for more details.
37  */
38
39 #include <linux/module.h>
40 #include <linux/init.h>
41 #include <linux/slab.h>
42 #include <linux/i2c.h>
43 #include <linux/hwmon.h>
44 #include <linux/hwmon-sysfs.h>
45 #include <linux/err.h>
46 #include <linux/mutex.h>
47 #include <linux/jiffies.h>
48
49 /*
50  * The LM92 and MAX6635 have 2 two-state pins for address selection,
51  * resulting in 4 possible addresses.
52  */
53 static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b,
54                                                 I2C_CLIENT_END };
55
56 /* The LM92 registers */
57 #define LM92_REG_CONFIG                 0x01 /* 8-bit, RW */
58 #define LM92_REG_TEMP                   0x00 /* 16-bit, RO */
59 #define LM92_REG_TEMP_HYST              0x02 /* 16-bit, RW */
60 #define LM92_REG_TEMP_CRIT              0x03 /* 16-bit, RW */
61 #define LM92_REG_TEMP_LOW               0x04 /* 16-bit, RW */
62 #define LM92_REG_TEMP_HIGH              0x05 /* 16-bit, RW */
63 #define LM92_REG_MAN_ID                 0x07 /* 16-bit, RO, LM92 only */
64
65 /*
66  * The LM92 uses signed 13-bit values with LSB = 0.0625 degree Celsius,
67  * left-justified in 16-bit registers. No rounding is done, with such
68  * a resolution it's just not worth it. Note that the MAX6635 doesn't
69  * make use of the 4 lower bits for limits (i.e. effective resolution
70  * for limits is 1 degree Celsius).
71  */
72 static inline int TEMP_FROM_REG(s16 reg)
73 {
74         return reg / 8 * 625 / 10;
75 }
76
77 static inline s16 TEMP_TO_REG(int val)
78 {
79         if (val <= -60000)
80                 return -60000 * 10 / 625 * 8;
81         if (val >= 160000)
82                 return 160000 * 10 / 625 * 8;
83         return val * 10 / 625 * 8;
84 }
85
86 /* Alarm flags are stored in the 3 LSB of the temperature register */
87 static inline u8 ALARMS_FROM_REG(s16 reg)
88 {
89         return reg & 0x0007;
90 }
91
92 /* Client data (each client gets its own) */
93 struct lm92_data {
94         struct device *hwmon_dev;
95         struct mutex update_lock;
96         char valid; /* zero until following fields are valid */
97         unsigned long last_updated; /* in jiffies */
98
99         /* registers values */
100         s16 temp1_input, temp1_crit, temp1_min, temp1_max, temp1_hyst;
101 };
102
103
104 /*
105  * Sysfs attributes and callback functions
106  */
107
108 static struct lm92_data *lm92_update_device(struct device *dev)
109 {
110         struct i2c_client *client = to_i2c_client(dev);
111         struct lm92_data *data = i2c_get_clientdata(client);
112
113         mutex_lock(&data->update_lock);
114
115         if (time_after(jiffies, data->last_updated + HZ)
116          || !data->valid) {
117                 dev_dbg(&client->dev, "Updating lm92 data\n");
118                 data->temp1_input = i2c_smbus_read_word_swapped(client,
119                                     LM92_REG_TEMP);
120                 data->temp1_hyst = i2c_smbus_read_word_swapped(client,
121                                     LM92_REG_TEMP_HYST);
122                 data->temp1_crit = i2c_smbus_read_word_swapped(client,
123                                     LM92_REG_TEMP_CRIT);
124                 data->temp1_min = i2c_smbus_read_word_swapped(client,
125                                     LM92_REG_TEMP_LOW);
126                 data->temp1_max = i2c_smbus_read_word_swapped(client,
127                                     LM92_REG_TEMP_HIGH);
128
129                 data->last_updated = jiffies;
130                 data->valid = 1;
131         }
132
133         mutex_unlock(&data->update_lock);
134
135         return data;
136 }
137
138 #define show_temp(value) \
139 static ssize_t show_##value(struct device *dev, struct device_attribute *attr, \
140                             char *buf) \
141 { \
142         struct lm92_data *data = lm92_update_device(dev); \
143         return sprintf(buf, "%d\n", TEMP_FROM_REG(data->value)); \
144 }
145 show_temp(temp1_input);
146 show_temp(temp1_crit);
147 show_temp(temp1_min);
148 show_temp(temp1_max);
149
150 #define set_temp(value, reg) \
151 static ssize_t set_##value(struct device *dev, struct device_attribute *attr, \
152                            const char *buf, \
153         size_t count) \
154 { \
155         struct i2c_client *client = to_i2c_client(dev); \
156         struct lm92_data *data = i2c_get_clientdata(client); \
157         long val; \
158         int err = kstrtol(buf, 10, &val); \
159         if (err) \
160                 return err; \
161 \
162         mutex_lock(&data->update_lock); \
163         data->value = TEMP_TO_REG(val); \
164         i2c_smbus_write_word_swapped(client, reg, data->value); \
165         mutex_unlock(&data->update_lock); \
166         return count; \
167 }
168 set_temp(temp1_crit, LM92_REG_TEMP_CRIT);
169 set_temp(temp1_min, LM92_REG_TEMP_LOW);
170 set_temp(temp1_max, LM92_REG_TEMP_HIGH);
171
172 static ssize_t show_temp1_crit_hyst(struct device *dev,
173                                     struct device_attribute *attr, char *buf)
174 {
175         struct lm92_data *data = lm92_update_device(dev);
176         return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp1_crit)
177                        - TEMP_FROM_REG(data->temp1_hyst));
178 }
179 static ssize_t show_temp1_max_hyst(struct device *dev,
180                                    struct device_attribute *attr, char *buf)
181 {
182         struct lm92_data *data = lm92_update_device(dev);
183         return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp1_max)
184                        - TEMP_FROM_REG(data->temp1_hyst));
185 }
186 static ssize_t show_temp1_min_hyst(struct device *dev,
187                                    struct device_attribute *attr, char *buf)
188 {
189         struct lm92_data *data = lm92_update_device(dev);
190         return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp1_min)
191                        + TEMP_FROM_REG(data->temp1_hyst));
192 }
193
194 static ssize_t set_temp1_crit_hyst(struct device *dev,
195                                    struct device_attribute *attr,
196                                    const char *buf, size_t count)
197 {
198         struct i2c_client *client = to_i2c_client(dev);
199         struct lm92_data *data = i2c_get_clientdata(client);
200         long val;
201         int err;
202
203         err = kstrtol(buf, 10, &val);
204         if (err)
205                 return err;
206
207         mutex_lock(&data->update_lock);
208         data->temp1_hyst = TEMP_FROM_REG(data->temp1_crit) - val;
209         i2c_smbus_write_word_swapped(client, LM92_REG_TEMP_HYST,
210                                      TEMP_TO_REG(data->temp1_hyst));
211         mutex_unlock(&data->update_lock);
212         return count;
213 }
214
215 static ssize_t show_alarms(struct device *dev, struct device_attribute *attr,
216                            char *buf)
217 {
218         struct lm92_data *data = lm92_update_device(dev);
219         return sprintf(buf, "%d\n", ALARMS_FROM_REG(data->temp1_input));
220 }
221
222 static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
223                           char *buf)
224 {
225         int bitnr = to_sensor_dev_attr(attr)->index;
226         struct lm92_data *data = lm92_update_device(dev);
227         return sprintf(buf, "%d\n", (data->temp1_input >> bitnr) & 1);
228 }
229
230 static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp1_input, NULL);
231 static DEVICE_ATTR(temp1_crit, S_IWUSR | S_IRUGO, show_temp1_crit,
232         set_temp1_crit);
233 static DEVICE_ATTR(temp1_crit_hyst, S_IWUSR | S_IRUGO, show_temp1_crit_hyst,
234         set_temp1_crit_hyst);
235 static DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, show_temp1_min,
236         set_temp1_min);
237 static DEVICE_ATTR(temp1_min_hyst, S_IRUGO, show_temp1_min_hyst, NULL);
238 static DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp1_max,
239         set_temp1_max);
240 static DEVICE_ATTR(temp1_max_hyst, S_IRUGO, show_temp1_max_hyst, NULL);
241 static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
242 static SENSOR_DEVICE_ATTR(temp1_crit_alarm, S_IRUGO, show_alarm, NULL, 2);
243 static SENSOR_DEVICE_ATTR(temp1_min_alarm, S_IRUGO, show_alarm, NULL, 0);
244 static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, show_alarm, NULL, 1);
245
246
247 /*
248  * Detection and registration
249  */
250
251 static void lm92_init_client(struct i2c_client *client)
252 {
253         u8 config;
254
255         /* Start the conversions if needed */
256         config = i2c_smbus_read_byte_data(client, LM92_REG_CONFIG);
257         if (config & 0x01)
258                 i2c_smbus_write_byte_data(client, LM92_REG_CONFIG,
259                                           config & 0xFE);
260 }
261
262 /*
263  * The MAX6635 has no identification register, so we have to use tricks
264  * to identify it reliably. This is somewhat slow.
265  * Note that we do NOT rely on the 2 MSB of the configuration register
266  * always reading 0, as suggested by the datasheet, because it was once
267  * reported not to be true.
268  */
269 static int max6635_check(struct i2c_client *client)
270 {
271         u16 temp_low, temp_high, temp_hyst, temp_crit;
272         u8 conf;
273         int i;
274
275         /*
276          * No manufacturer ID register, so a read from this address will
277          * always return the last read value.
278          */
279         temp_low = i2c_smbus_read_word_data(client, LM92_REG_TEMP_LOW);
280         if (i2c_smbus_read_word_data(client, LM92_REG_MAN_ID) != temp_low)
281                 return 0;
282         temp_high = i2c_smbus_read_word_data(client, LM92_REG_TEMP_HIGH);
283         if (i2c_smbus_read_word_data(client, LM92_REG_MAN_ID) != temp_high)
284                 return 0;
285
286         /* Limits are stored as integer values (signed, 9-bit). */
287         if ((temp_low & 0x7f00) || (temp_high & 0x7f00))
288                 return 0;
289         temp_hyst = i2c_smbus_read_word_data(client, LM92_REG_TEMP_HYST);
290         temp_crit = i2c_smbus_read_word_data(client, LM92_REG_TEMP_CRIT);
291         if ((temp_hyst & 0x7f00) || (temp_crit & 0x7f00))
292                 return 0;
293
294         /*
295          * Registers addresses were found to cycle over 16-byte boundaries.
296          * We don't test all registers with all offsets so as to save some
297          * reads and time, but this should still be sufficient to dismiss
298          * non-MAX6635 chips.
299          */
300         conf = i2c_smbus_read_byte_data(client, LM92_REG_CONFIG);
301         for (i = 16; i < 96; i *= 2) {
302                 if (temp_hyst != i2c_smbus_read_word_data(client,
303                                  LM92_REG_TEMP_HYST + i - 16)
304                  || temp_crit != i2c_smbus_read_word_data(client,
305                                  LM92_REG_TEMP_CRIT + i)
306                  || temp_low != i2c_smbus_read_word_data(client,
307                                 LM92_REG_TEMP_LOW + i + 16)
308                  || temp_high != i2c_smbus_read_word_data(client,
309                                  LM92_REG_TEMP_HIGH + i + 32)
310                  || conf != i2c_smbus_read_byte_data(client,
311                             LM92_REG_CONFIG + i))
312                         return 0;
313         }
314
315         return 1;
316 }
317
318 static struct attribute *lm92_attributes[] = {
319         &dev_attr_temp1_input.attr,
320         &dev_attr_temp1_crit.attr,
321         &dev_attr_temp1_crit_hyst.attr,
322         &dev_attr_temp1_min.attr,
323         &dev_attr_temp1_min_hyst.attr,
324         &dev_attr_temp1_max.attr,
325         &dev_attr_temp1_max_hyst.attr,
326         &dev_attr_alarms.attr,
327         &sensor_dev_attr_temp1_crit_alarm.dev_attr.attr,
328         &sensor_dev_attr_temp1_min_alarm.dev_attr.attr,
329         &sensor_dev_attr_temp1_max_alarm.dev_attr.attr,
330         NULL
331 };
332
333 static const struct attribute_group lm92_group = {
334         .attrs = lm92_attributes,
335 };
336
337 /* Return 0 if detection is successful, -ENODEV otherwise */
338 static int lm92_detect(struct i2c_client *new_client,
339                        struct i2c_board_info *info)
340 {
341         struct i2c_adapter *adapter = new_client->adapter;
342         u8 config;
343         u16 man_id;
344
345         if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA
346                                             | I2C_FUNC_SMBUS_WORD_DATA))
347                 return -ENODEV;
348
349         config = i2c_smbus_read_byte_data(new_client, LM92_REG_CONFIG);
350         man_id = i2c_smbus_read_word_data(new_client, LM92_REG_MAN_ID);
351
352         if ((config & 0xe0) == 0x00 && man_id == 0x0180)
353                 pr_info("lm92: Found National Semiconductor LM92 chip\n");
354         else if (max6635_check(new_client))
355                 pr_info("lm92: Found Maxim MAX6635 chip\n");
356         else
357                 return -ENODEV;
358
359         strlcpy(info->type, "lm92", I2C_NAME_SIZE);
360
361         return 0;
362 }
363
364 static int lm92_probe(struct i2c_client *new_client,
365                       const struct i2c_device_id *id)
366 {
367         struct lm92_data *data;
368         int err;
369
370         data = devm_kzalloc(&new_client->dev, sizeof(struct lm92_data),
371                             GFP_KERNEL);
372         if (!data)
373                 return -ENOMEM;
374
375         i2c_set_clientdata(new_client, data);
376         mutex_init(&data->update_lock);
377
378         /* Initialize the chipset */
379         lm92_init_client(new_client);
380
381         /* Register sysfs hooks */
382         err = sysfs_create_group(&new_client->dev.kobj, &lm92_group);
383         if (err)
384                 return err;
385
386         data->hwmon_dev = hwmon_device_register(&new_client->dev);
387         if (IS_ERR(data->hwmon_dev)) {
388                 err = PTR_ERR(data->hwmon_dev);
389                 goto exit_remove;
390         }
391
392         return 0;
393
394 exit_remove:
395         sysfs_remove_group(&new_client->dev.kobj, &lm92_group);
396         return err;
397 }
398
399 static int lm92_remove(struct i2c_client *client)
400 {
401         struct lm92_data *data = i2c_get_clientdata(client);
402
403         hwmon_device_unregister(data->hwmon_dev);
404         sysfs_remove_group(&client->dev.kobj, &lm92_group);
405
406         return 0;
407 }
408
409
410 /*
411  * Module and driver stuff
412  */
413
414 static const struct i2c_device_id lm92_id[] = {
415         { "lm92", 0 },
416         /* max6635 could be added here */
417         { }
418 };
419 MODULE_DEVICE_TABLE(i2c, lm92_id);
420
421 static struct i2c_driver lm92_driver = {
422         .class          = I2C_CLASS_HWMON,
423         .driver = {
424                 .name   = "lm92",
425         },
426         .probe          = lm92_probe,
427         .remove         = lm92_remove,
428         .id_table       = lm92_id,
429         .detect         = lm92_detect,
430         .address_list   = normal_i2c,
431 };
432
433 module_i2c_driver(lm92_driver);
434
435 MODULE_AUTHOR("Jean Delvare <jdelvare@suse.de>");
436 MODULE_DESCRIPTION("LM92/MAX6635 driver");
437 MODULE_LICENSE("GPL");