]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/hwmon/lm78.c
Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelv...
[karo-tx-linux.git] / drivers / hwmon / lm78.c
1 /*
2     lm78.c - Part of lm_sensors, Linux kernel modules for hardware
3              monitoring
4     Copyright (c) 1998, 1999  Frodo Looijaard <frodol@dds.nl> 
5     Copyright (c) 2007        Jean Delvare <khali@linux-fr.org>
6
7     This program is free software; you can redistribute it and/or modify
8     it under the terms of the GNU General Public License as published by
9     the Free Software Foundation; either version 2 of the License, or
10     (at your option) any later version.
11
12     This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15     GNU General Public License for more details.
16
17     You should have received a copy of the GNU General Public License
18     along with this program; if not, write to the Free Software
19     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
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/platform_device.h>
30 #include <linux/ioport.h>
31 #include <linux/hwmon.h>
32 #include <linux/hwmon-vid.h>
33 #include <linux/hwmon-sysfs.h>
34 #include <linux/err.h>
35 #include <linux/mutex.h>
36 #include <linux/io.h>
37
38 /* ISA device, if found */
39 static struct platform_device *pdev;
40
41 /* Addresses to scan */
42 static const unsigned short normal_i2c[] = { 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d,
43                                                 0x2e, 0x2f, I2C_CLIENT_END };
44 static unsigned short isa_address = 0x290;
45
46 enum chips { lm78, lm79 };
47
48 /* Many LM78 constants specified below */
49
50 /* Length of ISA address segment */
51 #define LM78_EXTENT 8
52
53 /* Where are the ISA address/data registers relative to the base address */
54 #define LM78_ADDR_REG_OFFSET 5
55 #define LM78_DATA_REG_OFFSET 6
56
57 /* The LM78 registers */
58 #define LM78_REG_IN_MAX(nr) (0x2b + (nr) * 2)
59 #define LM78_REG_IN_MIN(nr) (0x2c + (nr) * 2)
60 #define LM78_REG_IN(nr) (0x20 + (nr))
61
62 #define LM78_REG_FAN_MIN(nr) (0x3b + (nr))
63 #define LM78_REG_FAN(nr) (0x28 + (nr))
64
65 #define LM78_REG_TEMP 0x27
66 #define LM78_REG_TEMP_OVER 0x39
67 #define LM78_REG_TEMP_HYST 0x3a
68
69 #define LM78_REG_ALARM1 0x41
70 #define LM78_REG_ALARM2 0x42
71
72 #define LM78_REG_VID_FANDIV 0x47
73
74 #define LM78_REG_CONFIG 0x40
75 #define LM78_REG_CHIPID 0x49
76 #define LM78_REG_I2C_ADDR 0x48
77
78
79 /* Conversions. Rounding and limit checking is only done on the TO_REG 
80    variants. */
81
82 /* IN: mV, (0V to 4.08V)
83    REG: 16mV/bit */
84 static inline u8 IN_TO_REG(unsigned long val)
85 {
86         unsigned long nval = SENSORS_LIMIT(val, 0, 4080);
87         return (nval + 8) / 16;
88 }
89 #define IN_FROM_REG(val) ((val) *  16)
90
91 static inline u8 FAN_TO_REG(long rpm, int div)
92 {
93         if (rpm <= 0)
94                 return 255;
95         return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
96 }
97
98 static inline int FAN_FROM_REG(u8 val, int div)
99 {
100         return val==0 ? -1 : val==255 ? 0 : 1350000/(val*div);
101 }
102
103 /* TEMP: mC (-128C to +127C)
104    REG: 1C/bit, two's complement */
105 static inline s8 TEMP_TO_REG(int val)
106 {
107         int nval = SENSORS_LIMIT(val, -128000, 127000) ;
108         return nval<0 ? (nval-500)/1000 : (nval+500)/1000;
109 }
110
111 static inline int TEMP_FROM_REG(s8 val)
112 {
113         return val * 1000;
114 }
115
116 #define DIV_FROM_REG(val) (1 << (val))
117
118 struct lm78_data {
119         struct i2c_client *client;
120         struct device *hwmon_dev;
121         struct mutex lock;
122         enum chips type;
123
124         /* For ISA device only */
125         const char *name;
126         int isa_addr;
127
128         struct mutex update_lock;
129         char valid;             /* !=0 if following fields are valid */
130         unsigned long last_updated;     /* In jiffies */
131
132         u8 in[7];               /* Register value */
133         u8 in_max[7];           /* Register value */
134         u8 in_min[7];           /* Register value */
135         u8 fan[3];              /* Register value */
136         u8 fan_min[3];          /* Register value */
137         s8 temp;                /* Register value */
138         s8 temp_over;           /* Register value */
139         s8 temp_hyst;           /* Register value */
140         u8 fan_div[3];          /* Register encoding, shifted right */
141         u8 vid;                 /* Register encoding, combined */
142         u16 alarms;             /* Register encoding, combined */
143 };
144
145
146 static int lm78_i2c_detect(struct i2c_client *client,
147                            struct i2c_board_info *info);
148 static int lm78_i2c_probe(struct i2c_client *client,
149                           const struct i2c_device_id *id);
150 static int lm78_i2c_remove(struct i2c_client *client);
151
152 static int __devinit lm78_isa_probe(struct platform_device *pdev);
153 static int __devexit lm78_isa_remove(struct platform_device *pdev);
154
155 static int lm78_read_value(struct lm78_data *data, u8 reg);
156 static int lm78_write_value(struct lm78_data *data, u8 reg, u8 value);
157 static struct lm78_data *lm78_update_device(struct device *dev);
158 static void lm78_init_device(struct lm78_data *data);
159
160
161 static const struct i2c_device_id lm78_i2c_id[] = {
162         { "lm78", lm78 },
163         { "lm79", lm79 },
164         { }
165 };
166 MODULE_DEVICE_TABLE(i2c, lm78_i2c_id);
167
168 static struct i2c_driver lm78_driver = {
169         .class          = I2C_CLASS_HWMON,
170         .driver = {
171                 .name   = "lm78",
172         },
173         .probe          = lm78_i2c_probe,
174         .remove         = lm78_i2c_remove,
175         .id_table       = lm78_i2c_id,
176         .detect         = lm78_i2c_detect,
177         .address_list   = normal_i2c,
178 };
179
180 static struct platform_driver lm78_isa_driver = {
181         .driver = {
182                 .owner  = THIS_MODULE,
183                 .name   = "lm78",
184         },
185         .probe          = lm78_isa_probe,
186         .remove         = __devexit_p(lm78_isa_remove),
187 };
188
189
190 /* 7 Voltages */
191 static ssize_t show_in(struct device *dev, struct device_attribute *da,
192                        char *buf)
193 {
194         struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
195         struct lm78_data *data = lm78_update_device(dev);
196         return sprintf(buf, "%d\n", IN_FROM_REG(data->in[attr->index]));
197 }
198
199 static ssize_t show_in_min(struct device *dev, struct device_attribute *da,
200                            char *buf)
201 {
202         struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
203         struct lm78_data *data = lm78_update_device(dev);
204         return sprintf(buf, "%d\n", IN_FROM_REG(data->in_min[attr->index]));
205 }
206
207 static ssize_t show_in_max(struct device *dev, struct device_attribute *da,
208                            char *buf)
209 {
210         struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
211         struct lm78_data *data = lm78_update_device(dev);
212         return sprintf(buf, "%d\n", IN_FROM_REG(data->in_max[attr->index]));
213 }
214
215 static ssize_t set_in_min(struct device *dev, struct device_attribute *da,
216                           const char *buf, size_t count)
217 {
218         struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
219         struct lm78_data *data = dev_get_drvdata(dev);
220         unsigned long val = simple_strtoul(buf, NULL, 10);
221         int nr = attr->index;
222
223         mutex_lock(&data->update_lock);
224         data->in_min[nr] = IN_TO_REG(val);
225         lm78_write_value(data, LM78_REG_IN_MIN(nr), data->in_min[nr]);
226         mutex_unlock(&data->update_lock);
227         return count;
228 }
229
230 static ssize_t set_in_max(struct device *dev, struct device_attribute *da,
231                           const char *buf, size_t count)
232 {
233         struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
234         struct lm78_data *data = dev_get_drvdata(dev);
235         unsigned long val = simple_strtoul(buf, NULL, 10);
236         int nr = attr->index;
237
238         mutex_lock(&data->update_lock);
239         data->in_max[nr] = IN_TO_REG(val);
240         lm78_write_value(data, LM78_REG_IN_MAX(nr), data->in_max[nr]);
241         mutex_unlock(&data->update_lock);
242         return count;
243 }
244         
245 #define show_in_offset(offset)                                  \
246 static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO,          \
247                 show_in, NULL, offset);                         \
248 static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR,  \
249                 show_in_min, set_in_min, offset);               \
250 static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR,  \
251                 show_in_max, set_in_max, offset);
252
253 show_in_offset(0);
254 show_in_offset(1);
255 show_in_offset(2);
256 show_in_offset(3);
257 show_in_offset(4);
258 show_in_offset(5);
259 show_in_offset(6);
260
261 /* Temperature */
262 static ssize_t show_temp(struct device *dev, struct device_attribute *da,
263                          char *buf)
264 {
265         struct lm78_data *data = lm78_update_device(dev);
266         return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp));
267 }
268
269 static ssize_t show_temp_over(struct device *dev, struct device_attribute *da,
270                               char *buf)
271 {
272         struct lm78_data *data = lm78_update_device(dev);
273         return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_over));
274 }
275
276 static ssize_t set_temp_over(struct device *dev, struct device_attribute *da,
277                              const char *buf, size_t count)
278 {
279         struct lm78_data *data = dev_get_drvdata(dev);
280         long val = simple_strtol(buf, NULL, 10);
281
282         mutex_lock(&data->update_lock);
283         data->temp_over = TEMP_TO_REG(val);
284         lm78_write_value(data, LM78_REG_TEMP_OVER, data->temp_over);
285         mutex_unlock(&data->update_lock);
286         return count;
287 }
288
289 static ssize_t show_temp_hyst(struct device *dev, struct device_attribute *da,
290                               char *buf)
291 {
292         struct lm78_data *data = lm78_update_device(dev);
293         return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_hyst));
294 }
295
296 static ssize_t set_temp_hyst(struct device *dev, struct device_attribute *da,
297                              const char *buf, size_t count)
298 {
299         struct lm78_data *data = dev_get_drvdata(dev);
300         long val = simple_strtol(buf, NULL, 10);
301
302         mutex_lock(&data->update_lock);
303         data->temp_hyst = TEMP_TO_REG(val);
304         lm78_write_value(data, LM78_REG_TEMP_HYST, data->temp_hyst);
305         mutex_unlock(&data->update_lock);
306         return count;
307 }
308
309 static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL);
310 static DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR,
311                 show_temp_over, set_temp_over);
312 static DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR,
313                 show_temp_hyst, set_temp_hyst);
314
315 /* 3 Fans */
316 static ssize_t show_fan(struct device *dev, struct device_attribute *da,
317                         char *buf)
318 {
319         struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
320         struct lm78_data *data = lm78_update_device(dev);
321         int nr = attr->index;
322         return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[nr],
323                 DIV_FROM_REG(data->fan_div[nr])) );
324 }
325
326 static ssize_t show_fan_min(struct device *dev, struct device_attribute *da,
327                             char *buf)
328 {
329         struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
330         struct lm78_data *data = lm78_update_device(dev);
331         int nr = attr->index;
332         return sprintf(buf,"%d\n", FAN_FROM_REG(data->fan_min[nr],
333                 DIV_FROM_REG(data->fan_div[nr])) );
334 }
335
336 static ssize_t set_fan_min(struct device *dev, struct device_attribute *da,
337                            const char *buf, size_t count)
338 {
339         struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
340         struct lm78_data *data = dev_get_drvdata(dev);
341         int nr = attr->index;
342         unsigned long val = simple_strtoul(buf, NULL, 10);
343
344         mutex_lock(&data->update_lock);
345         data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
346         lm78_write_value(data, LM78_REG_FAN_MIN(nr), data->fan_min[nr]);
347         mutex_unlock(&data->update_lock);
348         return count;
349 }
350
351 static ssize_t show_fan_div(struct device *dev, struct device_attribute *da,
352                             char *buf)
353 {
354         struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
355         struct lm78_data *data = lm78_update_device(dev);
356         return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[attr->index]));
357 }
358
359 /* Note: we save and restore the fan minimum here, because its value is
360    determined in part by the fan divisor.  This follows the principle of
361    least surprise; the user doesn't expect the fan minimum to change just
362    because the divisor changed. */
363 static ssize_t set_fan_div(struct device *dev, struct device_attribute *da,
364                            const char *buf, size_t count)
365 {
366         struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
367         struct lm78_data *data = dev_get_drvdata(dev);
368         int nr = attr->index;
369         unsigned long val = simple_strtoul(buf, NULL, 10);
370         unsigned long min;
371         u8 reg;
372
373         mutex_lock(&data->update_lock);
374         min = FAN_FROM_REG(data->fan_min[nr],
375                            DIV_FROM_REG(data->fan_div[nr]));
376
377         switch (val) {
378         case 1: data->fan_div[nr] = 0; break;
379         case 2: data->fan_div[nr] = 1; break;
380         case 4: data->fan_div[nr] = 2; break;
381         case 8: data->fan_div[nr] = 3; break;
382         default:
383                 dev_err(dev, "fan_div value %ld not "
384                         "supported. Choose one of 1, 2, 4 or 8!\n", val);
385                 mutex_unlock(&data->update_lock);
386                 return -EINVAL;
387         }
388
389         reg = lm78_read_value(data, LM78_REG_VID_FANDIV);
390         switch (nr) {
391         case 0:
392                 reg = (reg & 0xcf) | (data->fan_div[nr] << 4);
393                 break;
394         case 1:
395                 reg = (reg & 0x3f) | (data->fan_div[nr] << 6);
396                 break;
397         }
398         lm78_write_value(data, LM78_REG_VID_FANDIV, reg);
399
400         data->fan_min[nr] =
401                 FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
402         lm78_write_value(data, LM78_REG_FAN_MIN(nr), data->fan_min[nr]);
403         mutex_unlock(&data->update_lock);
404
405         return count;
406 }
407
408 #define show_fan_offset(offset)                         \
409 static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO,         \
410                 show_fan, NULL, offset - 1);                    \
411 static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
412                 show_fan_min, set_fan_min, offset - 1);
413
414 show_fan_offset(1);
415 show_fan_offset(2);
416 show_fan_offset(3);
417
418 /* Fan 3 divisor is locked in H/W */
419 static SENSOR_DEVICE_ATTR(fan1_div, S_IRUGO | S_IWUSR,
420                 show_fan_div, set_fan_div, 0);
421 static SENSOR_DEVICE_ATTR(fan2_div, S_IRUGO | S_IWUSR,
422                 show_fan_div, set_fan_div, 1);
423 static SENSOR_DEVICE_ATTR(fan3_div, S_IRUGO, show_fan_div, NULL, 2);
424
425 /* VID */
426 static ssize_t show_vid(struct device *dev, struct device_attribute *da,
427                         char *buf)
428 {
429         struct lm78_data *data = lm78_update_device(dev);
430         return sprintf(buf, "%d\n", vid_from_reg(data->vid, 82));
431 }
432 static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
433
434 /* Alarms */
435 static ssize_t show_alarms(struct device *dev, struct device_attribute *da,
436                            char *buf)
437 {
438         struct lm78_data *data = lm78_update_device(dev);
439         return sprintf(buf, "%u\n", data->alarms);
440 }
441 static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
442
443 static ssize_t show_alarm(struct device *dev, struct device_attribute *da,
444                           char *buf)
445 {
446         struct lm78_data *data = lm78_update_device(dev);
447         int nr = to_sensor_dev_attr(da)->index;
448         return sprintf(buf, "%u\n", (data->alarms >> nr) & 1);
449 }
450 static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0);
451 static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1);
452 static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2);
453 static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3);
454 static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8);
455 static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 9);
456 static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 10);
457 static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6);
458 static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7);
459 static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 11);
460 static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4);
461
462 static struct attribute *lm78_attributes[] = {
463         &sensor_dev_attr_in0_input.dev_attr.attr,
464         &sensor_dev_attr_in0_min.dev_attr.attr,
465         &sensor_dev_attr_in0_max.dev_attr.attr,
466         &sensor_dev_attr_in0_alarm.dev_attr.attr,
467         &sensor_dev_attr_in1_input.dev_attr.attr,
468         &sensor_dev_attr_in1_min.dev_attr.attr,
469         &sensor_dev_attr_in1_max.dev_attr.attr,
470         &sensor_dev_attr_in1_alarm.dev_attr.attr,
471         &sensor_dev_attr_in2_input.dev_attr.attr,
472         &sensor_dev_attr_in2_min.dev_attr.attr,
473         &sensor_dev_attr_in2_max.dev_attr.attr,
474         &sensor_dev_attr_in2_alarm.dev_attr.attr,
475         &sensor_dev_attr_in3_input.dev_attr.attr,
476         &sensor_dev_attr_in3_min.dev_attr.attr,
477         &sensor_dev_attr_in3_max.dev_attr.attr,
478         &sensor_dev_attr_in3_alarm.dev_attr.attr,
479         &sensor_dev_attr_in4_input.dev_attr.attr,
480         &sensor_dev_attr_in4_min.dev_attr.attr,
481         &sensor_dev_attr_in4_max.dev_attr.attr,
482         &sensor_dev_attr_in4_alarm.dev_attr.attr,
483         &sensor_dev_attr_in5_input.dev_attr.attr,
484         &sensor_dev_attr_in5_min.dev_attr.attr,
485         &sensor_dev_attr_in5_max.dev_attr.attr,
486         &sensor_dev_attr_in5_alarm.dev_attr.attr,
487         &sensor_dev_attr_in6_input.dev_attr.attr,
488         &sensor_dev_attr_in6_min.dev_attr.attr,
489         &sensor_dev_attr_in6_max.dev_attr.attr,
490         &sensor_dev_attr_in6_alarm.dev_attr.attr,
491         &dev_attr_temp1_input.attr,
492         &dev_attr_temp1_max.attr,
493         &dev_attr_temp1_max_hyst.attr,
494         &sensor_dev_attr_temp1_alarm.dev_attr.attr,
495         &sensor_dev_attr_fan1_input.dev_attr.attr,
496         &sensor_dev_attr_fan1_min.dev_attr.attr,
497         &sensor_dev_attr_fan1_div.dev_attr.attr,
498         &sensor_dev_attr_fan1_alarm.dev_attr.attr,
499         &sensor_dev_attr_fan2_input.dev_attr.attr,
500         &sensor_dev_attr_fan2_min.dev_attr.attr,
501         &sensor_dev_attr_fan2_div.dev_attr.attr,
502         &sensor_dev_attr_fan2_alarm.dev_attr.attr,
503         &sensor_dev_attr_fan3_input.dev_attr.attr,
504         &sensor_dev_attr_fan3_min.dev_attr.attr,
505         &sensor_dev_attr_fan3_div.dev_attr.attr,
506         &sensor_dev_attr_fan3_alarm.dev_attr.attr,
507         &dev_attr_alarms.attr,
508         &dev_attr_cpu0_vid.attr,
509
510         NULL
511 };
512
513 static const struct attribute_group lm78_group = {
514         .attrs = lm78_attributes,
515 };
516
517 /* I2C devices get this name attribute automatically, but for ISA devices
518    we must create it by ourselves. */
519 static ssize_t show_name(struct device *dev, struct device_attribute
520                          *devattr, char *buf)
521 {
522         struct lm78_data *data = dev_get_drvdata(dev);
523
524         return sprintf(buf, "%s\n", data->name);
525 }
526 static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
527
528 /* Returns 1 if the I2C chip appears to be an alias of the ISA chip */
529 static int lm78_alias_detect(struct i2c_client *client, u8 chipid)
530 {
531         struct lm78_data *isa;
532         int i;
533
534         if (!pdev)      /* No ISA chip */
535                 return 0;
536         isa = platform_get_drvdata(pdev);
537
538         if (lm78_read_value(isa, LM78_REG_I2C_ADDR) != client->addr)
539                 return 0;       /* Address doesn't match */
540         if ((lm78_read_value(isa, LM78_REG_CHIPID) & 0xfe) != (chipid & 0xfe))
541                 return 0;       /* Chip type doesn't match */
542
543         /* We compare all the limit registers, the config register and the
544          * interrupt mask registers */
545         for (i = 0x2b; i <= 0x3d; i++) {
546                 if (lm78_read_value(isa, i) !=
547                     i2c_smbus_read_byte_data(client, i))
548                         return 0;
549         }
550         if (lm78_read_value(isa, LM78_REG_CONFIG) !=
551             i2c_smbus_read_byte_data(client, LM78_REG_CONFIG))
552                 return 0;
553         for (i = 0x43; i <= 0x46; i++) {
554                 if (lm78_read_value(isa, i) !=
555                     i2c_smbus_read_byte_data(client, i))
556                         return 0;
557         }
558
559         return 1;
560 }
561
562 static int lm78_i2c_detect(struct i2c_client *client,
563                            struct i2c_board_info *info)
564 {
565         int i;
566         struct lm78_data *isa = pdev ? platform_get_drvdata(pdev) : NULL;
567         const char *client_name;
568         struct i2c_adapter *adapter = client->adapter;
569         int address = client->addr;
570
571         if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
572                 return -ENODEV;
573
574         /* We block updates of the ISA device to minimize the risk of
575            concurrent access to the same LM78 chip through different
576            interfaces. */
577         if (isa)
578                 mutex_lock(&isa->update_lock);
579
580         if ((i2c_smbus_read_byte_data(client, LM78_REG_CONFIG) & 0x80)
581          || i2c_smbus_read_byte_data(client, LM78_REG_I2C_ADDR) != address)
582                 goto err_nodev;
583
584         /* Explicitly prevent the misdetection of Winbond chips */
585         i = i2c_smbus_read_byte_data(client, 0x4f);
586         if (i == 0xa3 || i == 0x5c)
587                 goto err_nodev;
588
589         /* Determine the chip type. */
590         i = i2c_smbus_read_byte_data(client, LM78_REG_CHIPID);
591         if (i == 0x00 || i == 0x20      /* LM78 */
592          || i == 0x40)                  /* LM78-J */
593                 client_name = "lm78";
594         else if ((i & 0xfe) == 0xc0)
595                 client_name = "lm79";
596         else
597                 goto err_nodev;
598
599         if (lm78_alias_detect(client, i)) {
600                 dev_dbg(&adapter->dev, "Device at 0x%02x appears to "
601                         "be the same as ISA device\n", address);
602                 goto err_nodev;
603         }
604
605         if (isa)
606                 mutex_unlock(&isa->update_lock);
607
608         strlcpy(info->type, client_name, I2C_NAME_SIZE);
609
610         return 0;
611
612  err_nodev:
613         if (isa)
614                 mutex_unlock(&isa->update_lock);
615         return -ENODEV;
616 }
617
618 static int lm78_i2c_probe(struct i2c_client *client,
619                           const struct i2c_device_id *id)
620 {
621         struct lm78_data *data;
622         int err;
623
624         data = kzalloc(sizeof(struct lm78_data), GFP_KERNEL);
625         if (!data)
626                 return -ENOMEM;
627
628         i2c_set_clientdata(client, data);
629         data->client = client;
630         data->type = id->driver_data;
631
632         /* Initialize the LM78 chip */
633         lm78_init_device(data);
634
635         /* Register sysfs hooks */
636         err = sysfs_create_group(&client->dev.kobj, &lm78_group);
637         if (err)
638                 goto ERROR3;
639
640         data->hwmon_dev = hwmon_device_register(&client->dev);
641         if (IS_ERR(data->hwmon_dev)) {
642                 err = PTR_ERR(data->hwmon_dev);
643                 goto ERROR4;
644         }
645
646         return 0;
647
648 ERROR4:
649         sysfs_remove_group(&client->dev.kobj, &lm78_group);
650 ERROR3:
651         kfree(data);
652         return err;
653 }
654
655 static int lm78_i2c_remove(struct i2c_client *client)
656 {
657         struct lm78_data *data = i2c_get_clientdata(client);
658
659         hwmon_device_unregister(data->hwmon_dev);
660         sysfs_remove_group(&client->dev.kobj, &lm78_group);
661         kfree(data);
662
663         return 0;
664 }
665
666 static int __devinit lm78_isa_probe(struct platform_device *pdev)
667 {
668         int err;
669         struct lm78_data *data;
670         struct resource *res;
671
672         /* Reserve the ISA region */
673         res = platform_get_resource(pdev, IORESOURCE_IO, 0);
674         if (!request_region(res->start + LM78_ADDR_REG_OFFSET, 2, "lm78")) {
675                 err = -EBUSY;
676                 goto exit;
677         }
678
679         if (!(data = kzalloc(sizeof(struct lm78_data), GFP_KERNEL))) {
680                 err = -ENOMEM;
681                 goto exit_release_region;
682         }
683         mutex_init(&data->lock);
684         data->isa_addr = res->start;
685         platform_set_drvdata(pdev, data);
686
687         if (lm78_read_value(data, LM78_REG_CHIPID) & 0x80) {
688                 data->type = lm79;
689                 data->name = "lm79";
690         } else {
691                 data->type = lm78;
692                 data->name = "lm78";
693         }
694
695         /* Initialize the LM78 chip */
696         lm78_init_device(data);
697
698         /* Register sysfs hooks */
699         if ((err = sysfs_create_group(&pdev->dev.kobj, &lm78_group))
700          || (err = device_create_file(&pdev->dev, &dev_attr_name)))
701                 goto exit_remove_files;
702
703         data->hwmon_dev = hwmon_device_register(&pdev->dev);
704         if (IS_ERR(data->hwmon_dev)) {
705                 err = PTR_ERR(data->hwmon_dev);
706                 goto exit_remove_files;
707         }
708
709         return 0;
710
711  exit_remove_files:
712         sysfs_remove_group(&pdev->dev.kobj, &lm78_group);
713         device_remove_file(&pdev->dev, &dev_attr_name);
714         kfree(data);
715  exit_release_region:
716         release_region(res->start + LM78_ADDR_REG_OFFSET, 2);
717  exit:
718         return err;
719 }
720
721 static int __devexit lm78_isa_remove(struct platform_device *pdev)
722 {
723         struct lm78_data *data = platform_get_drvdata(pdev);
724         struct resource *res;
725
726         hwmon_device_unregister(data->hwmon_dev);
727         sysfs_remove_group(&pdev->dev.kobj, &lm78_group);
728         device_remove_file(&pdev->dev, &dev_attr_name);
729         kfree(data);
730
731         res = platform_get_resource(pdev, IORESOURCE_IO, 0);
732         release_region(res->start + LM78_ADDR_REG_OFFSET, 2);
733
734         return 0;
735 }
736
737 /* The SMBus locks itself, but ISA access must be locked explicitly! 
738    We don't want to lock the whole ISA bus, so we lock each client
739    separately.
740    We ignore the LM78 BUSY flag at this moment - it could lead to deadlocks,
741    would slow down the LM78 access and should not be necessary.  */
742 static int lm78_read_value(struct lm78_data *data, u8 reg)
743 {
744         struct i2c_client *client = data->client;
745
746         if (!client) { /* ISA device */
747                 int res;
748                 mutex_lock(&data->lock);
749                 outb_p(reg, data->isa_addr + LM78_ADDR_REG_OFFSET);
750                 res = inb_p(data->isa_addr + LM78_DATA_REG_OFFSET);
751                 mutex_unlock(&data->lock);
752                 return res;
753         } else
754                 return i2c_smbus_read_byte_data(client, reg);
755 }
756
757 /* The SMBus locks itself, but ISA access muse be locked explicitly! 
758    We don't want to lock the whole ISA bus, so we lock each client
759    separately.
760    We ignore the LM78 BUSY flag at this moment - it could lead to deadlocks,
761    would slow down the LM78 access and should not be necessary. 
762    There are some ugly typecasts here, but the good new is - they should
763    nowhere else be necessary! */
764 static int lm78_write_value(struct lm78_data *data, u8 reg, u8 value)
765 {
766         struct i2c_client *client = data->client;
767
768         if (!client) { /* ISA device */
769                 mutex_lock(&data->lock);
770                 outb_p(reg, data->isa_addr + LM78_ADDR_REG_OFFSET);
771                 outb_p(value, data->isa_addr + LM78_DATA_REG_OFFSET);
772                 mutex_unlock(&data->lock);
773                 return 0;
774         } else
775                 return i2c_smbus_write_byte_data(client, reg, value);
776 }
777
778 static void lm78_init_device(struct lm78_data *data)
779 {
780         u8 config;
781         int i;
782
783         /* Start monitoring */
784         config = lm78_read_value(data, LM78_REG_CONFIG);
785         if ((config & 0x09) != 0x01)
786                 lm78_write_value(data, LM78_REG_CONFIG,
787                                  (config & 0xf7) | 0x01);
788
789         /* A few vars need to be filled upon startup */
790         for (i = 0; i < 3; i++) {
791                 data->fan_min[i] = lm78_read_value(data,
792                                         LM78_REG_FAN_MIN(i));
793         }
794
795         mutex_init(&data->update_lock);
796 }
797
798 static struct lm78_data *lm78_update_device(struct device *dev)
799 {
800         struct lm78_data *data = dev_get_drvdata(dev);
801         int i;
802
803         mutex_lock(&data->update_lock);
804
805         if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
806             || !data->valid) {
807
808                 dev_dbg(dev, "Starting lm78 update\n");
809
810                 for (i = 0; i <= 6; i++) {
811                         data->in[i] =
812                             lm78_read_value(data, LM78_REG_IN(i));
813                         data->in_min[i] =
814                             lm78_read_value(data, LM78_REG_IN_MIN(i));
815                         data->in_max[i] =
816                             lm78_read_value(data, LM78_REG_IN_MAX(i));
817                 }
818                 for (i = 0; i < 3; i++) {
819                         data->fan[i] =
820                             lm78_read_value(data, LM78_REG_FAN(i));
821                         data->fan_min[i] =
822                             lm78_read_value(data, LM78_REG_FAN_MIN(i));
823                 }
824                 data->temp = lm78_read_value(data, LM78_REG_TEMP);
825                 data->temp_over =
826                     lm78_read_value(data, LM78_REG_TEMP_OVER);
827                 data->temp_hyst =
828                     lm78_read_value(data, LM78_REG_TEMP_HYST);
829                 i = lm78_read_value(data, LM78_REG_VID_FANDIV);
830                 data->vid = i & 0x0f;
831                 if (data->type == lm79)
832                         data->vid |=
833                             (lm78_read_value(data, LM78_REG_CHIPID) &
834                              0x01) << 4;
835                 else
836                         data->vid |= 0x10;
837                 data->fan_div[0] = (i >> 4) & 0x03;
838                 data->fan_div[1] = i >> 6;
839                 data->alarms = lm78_read_value(data, LM78_REG_ALARM1) +
840                     (lm78_read_value(data, LM78_REG_ALARM2) << 8);
841                 data->last_updated = jiffies;
842                 data->valid = 1;
843
844                 data->fan_div[2] = 1;
845         }
846
847         mutex_unlock(&data->update_lock);
848
849         return data;
850 }
851
852 /* return 1 if a supported chip is found, 0 otherwise */
853 static int __init lm78_isa_found(unsigned short address)
854 {
855         int val, save, found = 0;
856         int port;
857
858         /* Some boards declare base+0 to base+7 as a PNP device, some base+4
859          * to base+7 and some base+5 to base+6. So we better request each port
860          * individually for the probing phase. */
861         for (port = address; port < address + LM78_EXTENT; port++) {
862                 if (!request_region(port, 1, "lm78")) {
863                         pr_debug("Failed to request port 0x%x\n", port);
864                         goto release;
865                 }
866         }
867
868 #define REALLY_SLOW_IO
869         /* We need the timeouts for at least some LM78-like
870            chips. But only if we read 'undefined' registers. */
871         val = inb_p(address + 1);
872         if (inb_p(address + 2) != val
873          || inb_p(address + 3) != val
874          || inb_p(address + 7) != val)
875                 goto release;
876 #undef REALLY_SLOW_IO
877
878         /* We should be able to change the 7 LSB of the address port. The
879            MSB (busy flag) should be clear initially, set after the write. */
880         save = inb_p(address + LM78_ADDR_REG_OFFSET);
881         if (save & 0x80)
882                 goto release;
883         val = ~save & 0x7f;
884         outb_p(val, address + LM78_ADDR_REG_OFFSET);
885         if (inb_p(address + LM78_ADDR_REG_OFFSET) != (val | 0x80)) {
886                 outb_p(save, address + LM78_ADDR_REG_OFFSET);
887                 goto release;
888         }
889
890         /* We found a device, now see if it could be an LM78 */
891         outb_p(LM78_REG_CONFIG, address + LM78_ADDR_REG_OFFSET);
892         val = inb_p(address + LM78_DATA_REG_OFFSET);
893         if (val & 0x80)
894                 goto release;
895         outb_p(LM78_REG_I2C_ADDR, address + LM78_ADDR_REG_OFFSET);
896         val = inb_p(address + LM78_DATA_REG_OFFSET);
897         if (val < 0x03 || val > 0x77)   /* Not a valid I2C address */
898                 goto release;
899
900         /* The busy flag should be clear again */
901         if (inb_p(address + LM78_ADDR_REG_OFFSET) & 0x80)
902                 goto release;
903
904         /* Explicitly prevent the misdetection of Winbond chips */
905         outb_p(0x4f, address + LM78_ADDR_REG_OFFSET);
906         val = inb_p(address + LM78_DATA_REG_OFFSET);
907         if (val == 0xa3 || val == 0x5c)
908                 goto release;
909
910         /* Explicitly prevent the misdetection of ITE chips */
911         outb_p(0x58, address + LM78_ADDR_REG_OFFSET);
912         val = inb_p(address + LM78_DATA_REG_OFFSET);
913         if (val == 0x90)
914                 goto release;
915
916         /* Determine the chip type */
917         outb_p(LM78_REG_CHIPID, address + LM78_ADDR_REG_OFFSET);
918         val = inb_p(address + LM78_DATA_REG_OFFSET);
919         if (val == 0x00 || val == 0x20  /* LM78 */
920          || val == 0x40                 /* LM78-J */
921          || (val & 0xfe) == 0xc0)       /* LM79 */
922                 found = 1;
923
924         if (found)
925                 pr_info("Found an %s chip at %#x\n",
926                         val & 0x80 ? "LM79" : "LM78", (int)address);
927
928  release:
929         for (port--; port >= address; port--)
930                 release_region(port, 1);
931         return found;
932 }
933
934 static int __init lm78_isa_device_add(unsigned short address)
935 {
936         struct resource res = {
937                 .start  = address,
938                 .end    = address + LM78_EXTENT - 1,
939                 .name   = "lm78",
940                 .flags  = IORESOURCE_IO,
941         };
942         int err;
943
944         pdev = platform_device_alloc("lm78", address);
945         if (!pdev) {
946                 err = -ENOMEM;
947                 pr_err("Device allocation failed\n");
948                 goto exit;
949         }
950
951         err = platform_device_add_resources(pdev, &res, 1);
952         if (err) {
953                 pr_err("Device resource addition failed (%d)\n", err);
954                 goto exit_device_put;
955         }
956
957         err = platform_device_add(pdev);
958         if (err) {
959                 pr_err("Device addition failed (%d)\n", err);
960                 goto exit_device_put;
961         }
962
963         return 0;
964
965  exit_device_put:
966         platform_device_put(pdev);
967  exit:
968         pdev = NULL;
969         return err;
970 }
971
972 static int __init sm_lm78_init(void)
973 {
974         int res;
975
976         /* We register the ISA device first, so that we can skip the
977          * registration of an I2C interface to the same device. */
978         if (lm78_isa_found(isa_address)) {
979                 res = platform_driver_register(&lm78_isa_driver);
980                 if (res)
981                         goto exit;
982
983                 /* Sets global pdev as a side effect */
984                 res = lm78_isa_device_add(isa_address);
985                 if (res)
986                         goto exit_unreg_isa_driver;
987         }
988
989         res = i2c_add_driver(&lm78_driver);
990         if (res)
991                 goto exit_unreg_isa_device;
992
993         return 0;
994
995  exit_unreg_isa_device:
996         platform_device_unregister(pdev);
997  exit_unreg_isa_driver:
998         platform_driver_unregister(&lm78_isa_driver);
999  exit:
1000         return res;
1001 }
1002
1003 static void __exit sm_lm78_exit(void)
1004 {
1005         if (pdev) {
1006                 platform_device_unregister(pdev);
1007                 platform_driver_unregister(&lm78_isa_driver);
1008         }
1009         i2c_del_driver(&lm78_driver);
1010 }
1011
1012
1013
1014 MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>");
1015 MODULE_DESCRIPTION("LM78/LM79 driver");
1016 MODULE_LICENSE("GPL");
1017
1018 module_init(sm_lm78_init);
1019 module_exit(sm_lm78_exit);