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