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