2 lm78.c - Part of lm_sensors, Linux kernel modules for hardware
4 Copyright (c) 1998, 1999 Frodo Looijaard <frodol@dds.nl>
5 Copyright (c) 2007 Jean Delvare <khali@linux-fr.org>
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.
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.
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.
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>
36 /* ISA device, if found */
37 static struct platform_device
*pdev
;
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;
44 enum chips
{ lm78
, lm79
};
46 /* Many LM78 constants specified below */
48 /* Length of ISA address segment */
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
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))
60 #define LM78_REG_FAN_MIN(nr) (0x3b + (nr))
61 #define LM78_REG_FAN(nr) (0x28 + (nr))
63 #define LM78_REG_TEMP 0x27
64 #define LM78_REG_TEMP_OVER 0x39
65 #define LM78_REG_TEMP_HYST 0x3a
67 #define LM78_REG_ALARM1 0x41
68 #define LM78_REG_ALARM2 0x42
70 #define LM78_REG_VID_FANDIV 0x47
72 #define LM78_REG_CONFIG 0x40
73 #define LM78_REG_CHIPID 0x49
74 #define LM78_REG_I2C_ADDR 0x48
77 /* Conversions. Rounding and limit checking is only done on the TO_REG
80 /* IN: mV, (0V to 4.08V)
82 static inline u8
IN_TO_REG(unsigned long val
)
84 unsigned long nval
= SENSORS_LIMIT(val
, 0, 4080);
85 return (nval
+ 8) / 16;
87 #define IN_FROM_REG(val) ((val) * 16)
89 static inline u8
FAN_TO_REG(long rpm
, int div
)
93 return SENSORS_LIMIT((1350000 + rpm
* div
/ 2) / (rpm
* div
), 1, 254);
96 static inline int FAN_FROM_REG(u8 val
, int div
)
98 return val
==0 ? -1 : val
==255 ? 0 : 1350000/(val
*div
);
101 /* TEMP: mC (-128C to +127C)
102 REG: 1C/bit, two's complement */
103 static inline s8
TEMP_TO_REG(int val
)
105 int nval
= SENSORS_LIMIT(val
, -128000, 127000) ;
106 return nval
<0 ? (nval
-500)/1000 : (nval
+500)/1000;
109 static inline int TEMP_FROM_REG(s8 val
)
114 #define DIV_FROM_REG(val) (1 << (val))
117 struct i2c_client
*client
;
118 struct device
*hwmon_dev
;
122 /* For ISA device only */
126 struct mutex update_lock
;
127 char valid
; /* !=0 if following fields are valid */
128 unsigned long last_updated
; /* In jiffies */
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 */
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
);
150 static int __devinit
lm78_isa_probe(struct platform_device
*pdev
);
151 static int __devexit
lm78_isa_remove(struct platform_device
*pdev
);
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
);
159 static const struct i2c_device_id lm78_i2c_id
[] = {
164 MODULE_DEVICE_TABLE(i2c
, lm78_i2c_id
);
166 static struct i2c_driver lm78_driver
= {
167 .class = I2C_CLASS_HWMON
,
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
,
178 static struct platform_driver lm78_isa_driver
= {
180 .owner
= THIS_MODULE
,
183 .probe
= lm78_isa_probe
,
184 .remove
= __devexit_p(lm78_isa_remove
),
189 static ssize_t
show_in(struct device
*dev
, struct device_attribute
*da
,
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
]));
197 static ssize_t
show_in_min(struct device
*dev
, struct device_attribute
*da
,
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
]));
205 static ssize_t
show_in_max(struct device
*dev
, struct device_attribute
*da
,
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
]));
213 static ssize_t
set_in_min(struct device
*dev
, struct device_attribute
*da
,
214 const char *buf
, size_t count
)
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
;
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
);
228 static ssize_t
set_in_max(struct device
*dev
, struct device_attribute
*da
,
229 const char *buf
, size_t count
)
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
;
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
);
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);
260 static ssize_t
show_temp(struct device
*dev
, struct device_attribute
*da
,
263 struct lm78_data
*data
= lm78_update_device(dev
);
264 return sprintf(buf
, "%d\n", TEMP_FROM_REG(data
->temp
));
267 static ssize_t
show_temp_over(struct device
*dev
, struct device_attribute
*da
,
270 struct lm78_data
*data
= lm78_update_device(dev
);
271 return sprintf(buf
, "%d\n", TEMP_FROM_REG(data
->temp_over
));
274 static ssize_t
set_temp_over(struct device
*dev
, struct device_attribute
*da
,
275 const char *buf
, size_t count
)
277 struct lm78_data
*data
= dev_get_drvdata(dev
);
278 long val
= simple_strtol(buf
, NULL
, 10);
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
);
287 static ssize_t
show_temp_hyst(struct device
*dev
, struct device_attribute
*da
,
290 struct lm78_data
*data
= lm78_update_device(dev
);
291 return sprintf(buf
, "%d\n", TEMP_FROM_REG(data
->temp_hyst
));
294 static ssize_t
set_temp_hyst(struct device
*dev
, struct device_attribute
*da
,
295 const char *buf
, size_t count
)
297 struct lm78_data
*data
= dev_get_drvdata(dev
);
298 long val
= simple_strtol(buf
, NULL
, 10);
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
);
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
);
314 static ssize_t
show_fan(struct device
*dev
, struct device_attribute
*da
,
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
])) );
324 static ssize_t
show_fan_min(struct device
*dev
, struct device_attribute
*da
,
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
])) );
334 static ssize_t
set_fan_min(struct device
*dev
, struct device_attribute
*da
,
335 const char *buf
, size_t count
)
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);
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
);
349 static ssize_t
show_fan_div(struct device
*dev
, struct device_attribute
*da
,
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
]));
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
)
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);
371 mutex_lock(&data
->update_lock
);
372 min
= FAN_FROM_REG(data
->fan_min
[nr
],
373 DIV_FROM_REG(data
->fan_div
[nr
]));
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;
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
);
387 reg
= lm78_read_value(data
, LM78_REG_VID_FANDIV
);
390 reg
= (reg
& 0xcf) | (data
->fan_div
[nr
] << 4);
393 reg
= (reg
& 0x3f) | (data
->fan_div
[nr
] << 6);
396 lm78_write_value(data
, LM78_REG_VID_FANDIV
, reg
);
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
);
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);
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);
424 static ssize_t
show_vid(struct device
*dev
, struct device_attribute
*da
,
427 struct lm78_data
*data
= lm78_update_device(dev
);
428 return sprintf(buf
, "%d\n", vid_from_reg(data
->vid
, 82));
430 static DEVICE_ATTR(cpu0_vid
, S_IRUGO
, show_vid
, NULL
);
433 static ssize_t
show_alarms(struct device
*dev
, struct device_attribute
*da
,
436 struct lm78_data
*data
= lm78_update_device(dev
);
437 return sprintf(buf
, "%u\n", data
->alarms
);
439 static DEVICE_ATTR(alarms
, S_IRUGO
, show_alarms
, NULL
);
441 static ssize_t
show_alarm(struct device
*dev
, struct device_attribute
*da
,
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);
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);
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
,
511 static const struct attribute_group lm78_group
= {
512 .attrs
= lm78_attributes
,
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
520 struct lm78_data
*data
= dev_get_drvdata(dev
);
522 return sprintf(buf
, "%s\n", data
->name
);
524 static DEVICE_ATTR(name
, S_IRUGO
, show_name
, NULL
);
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
)
529 struct lm78_data
*isa
;
532 if (!pdev
) /* No ISA chip */
534 isa
= platform_get_drvdata(pdev
);
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 */
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
))
548 if (lm78_read_value(isa
, LM78_REG_CONFIG
) !=
549 i2c_smbus_read_byte_data(client
, LM78_REG_CONFIG
))
551 for (i
= 0x43; i
<= 0x46; i
++) {
552 if (lm78_read_value(isa
, i
) !=
553 i2c_smbus_read_byte_data(client
, i
))
560 static int lm78_i2c_detect(struct i2c_client
*client
,
561 struct i2c_board_info
*info
)
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
;
569 if (!i2c_check_functionality(adapter
, I2C_FUNC_SMBUS_BYTE_DATA
))
572 /* We block updates of the ISA device to minimize the risk of
573 concurrent access to the same LM78 chip through different
576 mutex_lock(&isa
->update_lock
);
578 if ((i2c_smbus_read_byte_data(client
, LM78_REG_CONFIG
) & 0x80)
579 || i2c_smbus_read_byte_data(client
, LM78_REG_I2C_ADDR
) != address
)
582 /* Explicitly prevent the misdetection of Winbond chips */
583 i
= i2c_smbus_read_byte_data(client
, 0x4f);
584 if (i
== 0xa3 || i
== 0x5c)
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";
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
);
604 mutex_unlock(&isa
->update_lock
);
606 strlcpy(info
->type
, client_name
, I2C_NAME_SIZE
);
612 mutex_unlock(&isa
->update_lock
);
616 static int lm78_i2c_probe(struct i2c_client
*client
,
617 const struct i2c_device_id
*id
)
619 struct lm78_data
*data
;
622 data
= kzalloc(sizeof(struct lm78_data
), GFP_KERNEL
);
626 i2c_set_clientdata(client
, data
);
627 data
->client
= client
;
628 data
->type
= id
->driver_data
;
630 /* Initialize the LM78 chip */
631 lm78_init_device(data
);
633 /* Register sysfs hooks */
634 err
= sysfs_create_group(&client
->dev
.kobj
, &lm78_group
);
638 data
->hwmon_dev
= hwmon_device_register(&client
->dev
);
639 if (IS_ERR(data
->hwmon_dev
)) {
640 err
= PTR_ERR(data
->hwmon_dev
);
647 sysfs_remove_group(&client
->dev
.kobj
, &lm78_group
);
653 static int lm78_i2c_remove(struct i2c_client
*client
)
655 struct lm78_data
*data
= i2c_get_clientdata(client
);
657 hwmon_device_unregister(data
->hwmon_dev
);
658 sysfs_remove_group(&client
->dev
.kobj
, &lm78_group
);
664 static int __devinit
lm78_isa_probe(struct platform_device
*pdev
)
667 struct lm78_data
*data
;
668 struct resource
*res
;
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")) {
677 if (!(data
= kzalloc(sizeof(struct lm78_data
), GFP_KERNEL
))) {
679 goto exit_release_region
;
681 mutex_init(&data
->lock
);
682 data
->isa_addr
= res
->start
;
683 platform_set_drvdata(pdev
, data
);
685 if (lm78_read_value(data
, LM78_REG_CHIPID
) & 0x80) {
693 /* Initialize the LM78 chip */
694 lm78_init_device(data
);
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
;
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
;
710 sysfs_remove_group(&pdev
->dev
.kobj
, &lm78_group
);
711 device_remove_file(&pdev
->dev
, &dev_attr_name
);
714 release_region(res
->start
+ LM78_ADDR_REG_OFFSET
, 2);
719 static int __devexit
lm78_isa_remove(struct platform_device
*pdev
)
721 struct lm78_data
*data
= platform_get_drvdata(pdev
);
722 struct resource
*res
;
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
);
729 res
= platform_get_resource(pdev
, IORESOURCE_IO
, 0);
730 release_region(res
->start
+ LM78_ADDR_REG_OFFSET
, 2);
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
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
)
742 struct i2c_client
*client
= data
->client
;
744 if (!client
) { /* ISA device */
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
);
752 return i2c_smbus_read_byte_data(client
, reg
);
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
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
)
764 struct i2c_client
*client
= data
->client
;
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
);
773 return i2c_smbus_write_byte_data(client
, reg
, value
);
776 static void lm78_init_device(struct lm78_data
*data
)
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);
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
));
793 mutex_init(&data
->update_lock
);
796 static struct lm78_data
*lm78_update_device(struct device
*dev
)
798 struct lm78_data
*data
= dev_get_drvdata(dev
);
801 mutex_lock(&data
->update_lock
);
803 if (time_after(jiffies
, data
->last_updated
+ HZ
+ HZ
/ 2)
806 dev_dbg(dev
, "Starting lm78 update\n");
808 for (i
= 0; i
<= 6; i
++) {
810 lm78_read_value(data
, LM78_REG_IN(i
));
812 lm78_read_value(data
, LM78_REG_IN_MIN(i
));
814 lm78_read_value(data
, LM78_REG_IN_MAX(i
));
816 for (i
= 0; i
< 3; i
++) {
818 lm78_read_value(data
, LM78_REG_FAN(i
));
820 lm78_read_value(data
, LM78_REG_FAN_MIN(i
));
822 data
->temp
= lm78_read_value(data
, LM78_REG_TEMP
);
824 lm78_read_value(data
, LM78_REG_TEMP_OVER
);
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
)
831 (lm78_read_value(data
, LM78_REG_CHIPID
) &
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
;
842 data
->fan_div
[2] = 1;
845 mutex_unlock(&data
->update_lock
);
850 /* return 1 if a supported chip is found, 0 otherwise */
851 static int __init
lm78_isa_found(unsigned short address
)
853 int val
, save
, found
= 0;
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");
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);
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
)
875 #undef REALLY_SLOW_IO
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
);
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
);
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
);
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 */
899 /* The busy flag should be clear again */
900 if (inb_p(address
+ LM78_ADDR_REG_OFFSET
) & 0x80)
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)
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
);
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 */
924 pr_info("lm78: Found an %s chip at %#x\n",
925 val
& 0x80 ? "LM79" : "LM78", (int)address
);
928 release_region(address
+ 4, 4);
929 release_region(address
, 4);
933 static int __init
lm78_isa_device_add(unsigned short address
)
935 struct resource res
= {
937 .end
= address
+ LM78_EXTENT
- 1,
939 .flags
= IORESOURCE_IO
,
943 pdev
= platform_device_alloc("lm78", address
);
946 printk(KERN_ERR
"lm78: Device allocation failed\n");
950 err
= platform_device_add_resources(pdev
, &res
, 1);
952 printk(KERN_ERR
"lm78: Device resource addition failed "
954 goto exit_device_put
;
957 err
= platform_device_add(pdev
);
959 printk(KERN_ERR
"lm78: Device addition failed (%d)\n",
961 goto exit_device_put
;
967 platform_device_put(pdev
);
973 static int __init
sm_lm78_init(void)
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
);
984 /* Sets global pdev as a side effect */
985 res
= lm78_isa_device_add(isa_address
);
987 goto exit_unreg_isa_driver
;
990 res
= i2c_add_driver(&lm78_driver
);
992 goto exit_unreg_isa_device
;
996 exit_unreg_isa_device
:
997 platform_device_unregister(pdev
);
998 exit_unreg_isa_driver
:
999 platform_driver_unregister(&lm78_isa_driver
);
1004 static void __exit
sm_lm78_exit(void)
1007 platform_device_unregister(pdev
);
1008 platform_driver_unregister(&lm78_isa_driver
);
1010 i2c_del_driver(&lm78_driver
);
1015 MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>");
1016 MODULE_DESCRIPTION("LM78/LM79 driver");
1017 MODULE_LICENSE("GPL");
1019 module_init(sm_lm78_init
);
1020 module_exit(sm_lm78_exit
);