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