Merge branch 'davinci-next-2' of git://git.kernel.org/pub/scm/linux/kernel/git/khilma...
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / drivers / hwmon / lm78.c
blob4cb24eafe31819bdc7932c8894463428e545edf9
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>
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 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
24 #include <linux/module.h>
25 #include <linux/init.h>
26 #include <linux/slab.h>
27 #include <linux/jiffies.h>
28 #include <linux/i2c.h>
29 #include <linux/platform_device.h>
30 #include <linux/ioport.h>
31 #include <linux/hwmon.h>
32 #include <linux/hwmon-vid.h>
33 #include <linux/hwmon-sysfs.h>
34 #include <linux/err.h>
35 #include <linux/mutex.h>
36 #include <linux/io.h>
38 /* ISA device, if found */
39 static struct platform_device *pdev;
41 /* Addresses to scan */
42 static const unsigned short normal_i2c[] = { 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d,
43 0x2e, 0x2f, I2C_CLIENT_END };
44 static unsigned short isa_address = 0x290;
46 enum chips { lm78, lm79 };
48 /* Many LM78 constants specified below */
50 /* Length of ISA address segment */
51 #define LM78_EXTENT 8
53 /* Where are the ISA address/data registers relative to the base address */
54 #define LM78_ADDR_REG_OFFSET 5
55 #define LM78_DATA_REG_OFFSET 6
57 /* The LM78 registers */
58 #define LM78_REG_IN_MAX(nr) (0x2b + (nr) * 2)
59 #define LM78_REG_IN_MIN(nr) (0x2c + (nr) * 2)
60 #define LM78_REG_IN(nr) (0x20 + (nr))
62 #define LM78_REG_FAN_MIN(nr) (0x3b + (nr))
63 #define LM78_REG_FAN(nr) (0x28 + (nr))
65 #define LM78_REG_TEMP 0x27
66 #define LM78_REG_TEMP_OVER 0x39
67 #define LM78_REG_TEMP_HYST 0x3a
69 #define LM78_REG_ALARM1 0x41
70 #define LM78_REG_ALARM2 0x42
72 #define LM78_REG_VID_FANDIV 0x47
74 #define LM78_REG_CONFIG 0x40
75 #define LM78_REG_CHIPID 0x49
76 #define LM78_REG_I2C_ADDR 0x48
79 /* Conversions. Rounding and limit checking is only done on the TO_REG
80 variants. */
82 /* IN: mV, (0V to 4.08V)
83 REG: 16mV/bit */
84 static inline u8 IN_TO_REG(unsigned long val)
86 unsigned long nval = SENSORS_LIMIT(val, 0, 4080);
87 return (nval + 8) / 16;
89 #define IN_FROM_REG(val) ((val) * 16)
91 static inline u8 FAN_TO_REG(long rpm, int div)
93 if (rpm <= 0)
94 return 255;
95 return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
98 static inline int FAN_FROM_REG(u8 val, int div)
100 return val==0 ? -1 : val==255 ? 0 : 1350000/(val*div);
103 /* TEMP: mC (-128C to +127C)
104 REG: 1C/bit, two's complement */
105 static inline s8 TEMP_TO_REG(int val)
107 int nval = SENSORS_LIMIT(val, -128000, 127000) ;
108 return nval<0 ? (nval-500)/1000 : (nval+500)/1000;
111 static inline int TEMP_FROM_REG(s8 val)
113 return val * 1000;
116 #define DIV_FROM_REG(val) (1 << (val))
118 struct lm78_data {
119 struct i2c_client *client;
120 struct device *hwmon_dev;
121 struct mutex lock;
122 enum chips type;
124 /* For ISA device only */
125 const char *name;
126 int isa_addr;
128 struct mutex update_lock;
129 char valid; /* !=0 if following fields are valid */
130 unsigned long last_updated; /* In jiffies */
132 u8 in[7]; /* Register value */
133 u8 in_max[7]; /* Register value */
134 u8 in_min[7]; /* Register value */
135 u8 fan[3]; /* Register value */
136 u8 fan_min[3]; /* Register value */
137 s8 temp; /* Register value */
138 s8 temp_over; /* Register value */
139 s8 temp_hyst; /* Register value */
140 u8 fan_div[3]; /* Register encoding, shifted right */
141 u8 vid; /* Register encoding, combined */
142 u16 alarms; /* Register encoding, combined */
146 static int lm78_i2c_detect(struct i2c_client *client,
147 struct i2c_board_info *info);
148 static int lm78_i2c_probe(struct i2c_client *client,
149 const struct i2c_device_id *id);
150 static int lm78_i2c_remove(struct i2c_client *client);
152 static int __devinit lm78_isa_probe(struct platform_device *pdev);
153 static int __devexit lm78_isa_remove(struct platform_device *pdev);
155 static int lm78_read_value(struct lm78_data *data, u8 reg);
156 static int lm78_write_value(struct lm78_data *data, u8 reg, u8 value);
157 static struct lm78_data *lm78_update_device(struct device *dev);
158 static void lm78_init_device(struct lm78_data *data);
161 static const struct i2c_device_id lm78_i2c_id[] = {
162 { "lm78", lm78 },
163 { "lm79", lm79 },
166 MODULE_DEVICE_TABLE(i2c, lm78_i2c_id);
168 static struct i2c_driver lm78_driver = {
169 .class = I2C_CLASS_HWMON,
170 .driver = {
171 .name = "lm78",
173 .probe = lm78_i2c_probe,
174 .remove = lm78_i2c_remove,
175 .id_table = lm78_i2c_id,
176 .detect = lm78_i2c_detect,
177 .address_list = normal_i2c,
180 static struct platform_driver lm78_isa_driver = {
181 .driver = {
182 .owner = THIS_MODULE,
183 .name = "lm78",
185 .probe = lm78_isa_probe,
186 .remove = __devexit_p(lm78_isa_remove),
190 /* 7 Voltages */
191 static ssize_t show_in(struct device *dev, struct device_attribute *da,
192 char *buf)
194 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
195 struct lm78_data *data = lm78_update_device(dev);
196 return sprintf(buf, "%d\n", IN_FROM_REG(data->in[attr->index]));
199 static ssize_t show_in_min(struct device *dev, struct device_attribute *da,
200 char *buf)
202 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
203 struct lm78_data *data = lm78_update_device(dev);
204 return sprintf(buf, "%d\n", IN_FROM_REG(data->in_min[attr->index]));
207 static ssize_t show_in_max(struct device *dev, struct device_attribute *da,
208 char *buf)
210 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
211 struct lm78_data *data = lm78_update_device(dev);
212 return sprintf(buf, "%d\n", IN_FROM_REG(data->in_max[attr->index]));
215 static ssize_t set_in_min(struct device *dev, struct device_attribute *da,
216 const char *buf, size_t count)
218 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
219 struct lm78_data *data = dev_get_drvdata(dev);
220 unsigned long val = simple_strtoul(buf, NULL, 10);
221 int nr = attr->index;
223 mutex_lock(&data->update_lock);
224 data->in_min[nr] = IN_TO_REG(val);
225 lm78_write_value(data, LM78_REG_IN_MIN(nr), data->in_min[nr]);
226 mutex_unlock(&data->update_lock);
227 return count;
230 static ssize_t set_in_max(struct device *dev, struct device_attribute *da,
231 const char *buf, size_t count)
233 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
234 struct lm78_data *data = dev_get_drvdata(dev);
235 unsigned long val = simple_strtoul(buf, NULL, 10);
236 int nr = attr->index;
238 mutex_lock(&data->update_lock);
239 data->in_max[nr] = IN_TO_REG(val);
240 lm78_write_value(data, LM78_REG_IN_MAX(nr), data->in_max[nr]);
241 mutex_unlock(&data->update_lock);
242 return count;
245 #define show_in_offset(offset) \
246 static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO, \
247 show_in, NULL, offset); \
248 static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \
249 show_in_min, set_in_min, offset); \
250 static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \
251 show_in_max, set_in_max, offset);
253 show_in_offset(0);
254 show_in_offset(1);
255 show_in_offset(2);
256 show_in_offset(3);
257 show_in_offset(4);
258 show_in_offset(5);
259 show_in_offset(6);
261 /* Temperature */
262 static ssize_t show_temp(struct device *dev, struct device_attribute *da,
263 char *buf)
265 struct lm78_data *data = lm78_update_device(dev);
266 return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp));
269 static ssize_t show_temp_over(struct device *dev, struct device_attribute *da,
270 char *buf)
272 struct lm78_data *data = lm78_update_device(dev);
273 return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_over));
276 static ssize_t set_temp_over(struct device *dev, struct device_attribute *da,
277 const char *buf, size_t count)
279 struct lm78_data *data = dev_get_drvdata(dev);
280 long val = simple_strtol(buf, NULL, 10);
282 mutex_lock(&data->update_lock);
283 data->temp_over = TEMP_TO_REG(val);
284 lm78_write_value(data, LM78_REG_TEMP_OVER, data->temp_over);
285 mutex_unlock(&data->update_lock);
286 return count;
289 static ssize_t show_temp_hyst(struct device *dev, struct device_attribute *da,
290 char *buf)
292 struct lm78_data *data = lm78_update_device(dev);
293 return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_hyst));
296 static ssize_t set_temp_hyst(struct device *dev, struct device_attribute *da,
297 const char *buf, size_t count)
299 struct lm78_data *data = dev_get_drvdata(dev);
300 long val = simple_strtol(buf, NULL, 10);
302 mutex_lock(&data->update_lock);
303 data->temp_hyst = TEMP_TO_REG(val);
304 lm78_write_value(data, LM78_REG_TEMP_HYST, data->temp_hyst);
305 mutex_unlock(&data->update_lock);
306 return count;
309 static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL);
310 static DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR,
311 show_temp_over, set_temp_over);
312 static DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR,
313 show_temp_hyst, set_temp_hyst);
315 /* 3 Fans */
316 static ssize_t show_fan(struct device *dev, struct device_attribute *da,
317 char *buf)
319 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
320 struct lm78_data *data = lm78_update_device(dev);
321 int nr = attr->index;
322 return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[nr],
323 DIV_FROM_REG(data->fan_div[nr])) );
326 static ssize_t show_fan_min(struct device *dev, struct device_attribute *da,
327 char *buf)
329 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
330 struct lm78_data *data = lm78_update_device(dev);
331 int nr = attr->index;
332 return sprintf(buf,"%d\n", FAN_FROM_REG(data->fan_min[nr],
333 DIV_FROM_REG(data->fan_div[nr])) );
336 static ssize_t set_fan_min(struct device *dev, struct device_attribute *da,
337 const char *buf, size_t count)
339 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
340 struct lm78_data *data = dev_get_drvdata(dev);
341 int nr = attr->index;
342 unsigned long val = simple_strtoul(buf, NULL, 10);
344 mutex_lock(&data->update_lock);
345 data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
346 lm78_write_value(data, LM78_REG_FAN_MIN(nr), data->fan_min[nr]);
347 mutex_unlock(&data->update_lock);
348 return count;
351 static ssize_t show_fan_div(struct device *dev, struct device_attribute *da,
352 char *buf)
354 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
355 struct lm78_data *data = lm78_update_device(dev);
356 return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[attr->index]));
359 /* Note: we save and restore the fan minimum here, because its value is
360 determined in part by the fan divisor. This follows the principle of
361 least surprise; the user doesn't expect the fan minimum to change just
362 because the divisor changed. */
363 static ssize_t set_fan_div(struct device *dev, struct device_attribute *da,
364 const char *buf, size_t count)
366 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
367 struct lm78_data *data = dev_get_drvdata(dev);
368 int nr = attr->index;
369 unsigned long val = simple_strtoul(buf, NULL, 10);
370 unsigned long min;
371 u8 reg;
373 mutex_lock(&data->update_lock);
374 min = FAN_FROM_REG(data->fan_min[nr],
375 DIV_FROM_REG(data->fan_div[nr]));
377 switch (val) {
378 case 1: data->fan_div[nr] = 0; break;
379 case 2: data->fan_div[nr] = 1; break;
380 case 4: data->fan_div[nr] = 2; break;
381 case 8: data->fan_div[nr] = 3; break;
382 default:
383 dev_err(dev, "fan_div value %ld not "
384 "supported. Choose one of 1, 2, 4 or 8!\n", val);
385 mutex_unlock(&data->update_lock);
386 return -EINVAL;
389 reg = lm78_read_value(data, LM78_REG_VID_FANDIV);
390 switch (nr) {
391 case 0:
392 reg = (reg & 0xcf) | (data->fan_div[nr] << 4);
393 break;
394 case 1:
395 reg = (reg & 0x3f) | (data->fan_div[nr] << 6);
396 break;
398 lm78_write_value(data, LM78_REG_VID_FANDIV, reg);
400 data->fan_min[nr] =
401 FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
402 lm78_write_value(data, LM78_REG_FAN_MIN(nr), data->fan_min[nr]);
403 mutex_unlock(&data->update_lock);
405 return count;
408 #define show_fan_offset(offset) \
409 static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO, \
410 show_fan, NULL, offset - 1); \
411 static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
412 show_fan_min, set_fan_min, offset - 1);
414 show_fan_offset(1);
415 show_fan_offset(2);
416 show_fan_offset(3);
418 /* Fan 3 divisor is locked in H/W */
419 static SENSOR_DEVICE_ATTR(fan1_div, S_IRUGO | S_IWUSR,
420 show_fan_div, set_fan_div, 0);
421 static SENSOR_DEVICE_ATTR(fan2_div, S_IRUGO | S_IWUSR,
422 show_fan_div, set_fan_div, 1);
423 static SENSOR_DEVICE_ATTR(fan3_div, S_IRUGO, show_fan_div, NULL, 2);
425 /* VID */
426 static ssize_t show_vid(struct device *dev, struct device_attribute *da,
427 char *buf)
429 struct lm78_data *data = lm78_update_device(dev);
430 return sprintf(buf, "%d\n", vid_from_reg(data->vid, 82));
432 static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
434 /* Alarms */
435 static ssize_t show_alarms(struct device *dev, struct device_attribute *da,
436 char *buf)
438 struct lm78_data *data = lm78_update_device(dev);
439 return sprintf(buf, "%u\n", data->alarms);
441 static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
443 static ssize_t show_alarm(struct device *dev, struct device_attribute *da,
444 char *buf)
446 struct lm78_data *data = lm78_update_device(dev);
447 int nr = to_sensor_dev_attr(da)->index;
448 return sprintf(buf, "%u\n", (data->alarms >> nr) & 1);
450 static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0);
451 static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1);
452 static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2);
453 static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3);
454 static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8);
455 static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 9);
456 static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 10);
457 static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6);
458 static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7);
459 static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 11);
460 static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4);
462 static struct attribute *lm78_attributes[] = {
463 &sensor_dev_attr_in0_input.dev_attr.attr,
464 &sensor_dev_attr_in0_min.dev_attr.attr,
465 &sensor_dev_attr_in0_max.dev_attr.attr,
466 &sensor_dev_attr_in0_alarm.dev_attr.attr,
467 &sensor_dev_attr_in1_input.dev_attr.attr,
468 &sensor_dev_attr_in1_min.dev_attr.attr,
469 &sensor_dev_attr_in1_max.dev_attr.attr,
470 &sensor_dev_attr_in1_alarm.dev_attr.attr,
471 &sensor_dev_attr_in2_input.dev_attr.attr,
472 &sensor_dev_attr_in2_min.dev_attr.attr,
473 &sensor_dev_attr_in2_max.dev_attr.attr,
474 &sensor_dev_attr_in2_alarm.dev_attr.attr,
475 &sensor_dev_attr_in3_input.dev_attr.attr,
476 &sensor_dev_attr_in3_min.dev_attr.attr,
477 &sensor_dev_attr_in3_max.dev_attr.attr,
478 &sensor_dev_attr_in3_alarm.dev_attr.attr,
479 &sensor_dev_attr_in4_input.dev_attr.attr,
480 &sensor_dev_attr_in4_min.dev_attr.attr,
481 &sensor_dev_attr_in4_max.dev_attr.attr,
482 &sensor_dev_attr_in4_alarm.dev_attr.attr,
483 &sensor_dev_attr_in5_input.dev_attr.attr,
484 &sensor_dev_attr_in5_min.dev_attr.attr,
485 &sensor_dev_attr_in5_max.dev_attr.attr,
486 &sensor_dev_attr_in5_alarm.dev_attr.attr,
487 &sensor_dev_attr_in6_input.dev_attr.attr,
488 &sensor_dev_attr_in6_min.dev_attr.attr,
489 &sensor_dev_attr_in6_max.dev_attr.attr,
490 &sensor_dev_attr_in6_alarm.dev_attr.attr,
491 &dev_attr_temp1_input.attr,
492 &dev_attr_temp1_max.attr,
493 &dev_attr_temp1_max_hyst.attr,
494 &sensor_dev_attr_temp1_alarm.dev_attr.attr,
495 &sensor_dev_attr_fan1_input.dev_attr.attr,
496 &sensor_dev_attr_fan1_min.dev_attr.attr,
497 &sensor_dev_attr_fan1_div.dev_attr.attr,
498 &sensor_dev_attr_fan1_alarm.dev_attr.attr,
499 &sensor_dev_attr_fan2_input.dev_attr.attr,
500 &sensor_dev_attr_fan2_min.dev_attr.attr,
501 &sensor_dev_attr_fan2_div.dev_attr.attr,
502 &sensor_dev_attr_fan2_alarm.dev_attr.attr,
503 &sensor_dev_attr_fan3_input.dev_attr.attr,
504 &sensor_dev_attr_fan3_min.dev_attr.attr,
505 &sensor_dev_attr_fan3_div.dev_attr.attr,
506 &sensor_dev_attr_fan3_alarm.dev_attr.attr,
507 &dev_attr_alarms.attr,
508 &dev_attr_cpu0_vid.attr,
510 NULL
513 static const struct attribute_group lm78_group = {
514 .attrs = lm78_attributes,
517 /* I2C devices get this name attribute automatically, but for ISA devices
518 we must create it by ourselves. */
519 static ssize_t show_name(struct device *dev, struct device_attribute
520 *devattr, char *buf)
522 struct lm78_data *data = dev_get_drvdata(dev);
524 return sprintf(buf, "%s\n", data->name);
526 static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
528 /* Returns 1 if the I2C chip appears to be an alias of the ISA chip */
529 static int lm78_alias_detect(struct i2c_client *client, u8 chipid)
531 struct lm78_data *isa;
532 int i;
534 if (!pdev) /* No ISA chip */
535 return 0;
536 isa = platform_get_drvdata(pdev);
538 if (lm78_read_value(isa, LM78_REG_I2C_ADDR) != client->addr)
539 return 0; /* Address doesn't match */
540 if ((lm78_read_value(isa, LM78_REG_CHIPID) & 0xfe) != (chipid & 0xfe))
541 return 0; /* Chip type doesn't match */
543 /* We compare all the limit registers, the config register and the
544 * interrupt mask registers */
545 for (i = 0x2b; i <= 0x3d; i++) {
546 if (lm78_read_value(isa, i) !=
547 i2c_smbus_read_byte_data(client, i))
548 return 0;
550 if (lm78_read_value(isa, LM78_REG_CONFIG) !=
551 i2c_smbus_read_byte_data(client, LM78_REG_CONFIG))
552 return 0;
553 for (i = 0x43; i <= 0x46; i++) {
554 if (lm78_read_value(isa, i) !=
555 i2c_smbus_read_byte_data(client, i))
556 return 0;
559 return 1;
562 static int lm78_i2c_detect(struct i2c_client *client,
563 struct i2c_board_info *info)
565 int i;
566 struct lm78_data *isa = pdev ? platform_get_drvdata(pdev) : NULL;
567 const char *client_name;
568 struct i2c_adapter *adapter = client->adapter;
569 int address = client->addr;
571 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
572 return -ENODEV;
574 /* We block updates of the ISA device to minimize the risk of
575 concurrent access to the same LM78 chip through different
576 interfaces. */
577 if (isa)
578 mutex_lock(&isa->update_lock);
580 if ((i2c_smbus_read_byte_data(client, LM78_REG_CONFIG) & 0x80)
581 || i2c_smbus_read_byte_data(client, LM78_REG_I2C_ADDR) != address)
582 goto err_nodev;
584 /* Explicitly prevent the misdetection of Winbond chips */
585 i = i2c_smbus_read_byte_data(client, 0x4f);
586 if (i == 0xa3 || i == 0x5c)
587 goto err_nodev;
589 /* Determine the chip type. */
590 i = i2c_smbus_read_byte_data(client, LM78_REG_CHIPID);
591 if (i == 0x00 || i == 0x20 /* LM78 */
592 || i == 0x40) /* LM78-J */
593 client_name = "lm78";
594 else if ((i & 0xfe) == 0xc0)
595 client_name = "lm79";
596 else
597 goto err_nodev;
599 if (lm78_alias_detect(client, i)) {
600 dev_dbg(&adapter->dev, "Device at 0x%02x appears to "
601 "be the same as ISA device\n", address);
602 goto err_nodev;
605 if (isa)
606 mutex_unlock(&isa->update_lock);
608 strlcpy(info->type, client_name, I2C_NAME_SIZE);
610 return 0;
612 err_nodev:
613 if (isa)
614 mutex_unlock(&isa->update_lock);
615 return -ENODEV;
618 static int lm78_i2c_probe(struct i2c_client *client,
619 const struct i2c_device_id *id)
621 struct lm78_data *data;
622 int err;
624 data = kzalloc(sizeof(struct lm78_data), GFP_KERNEL);
625 if (!data)
626 return -ENOMEM;
628 i2c_set_clientdata(client, data);
629 data->client = client;
630 data->type = id->driver_data;
632 /* Initialize the LM78 chip */
633 lm78_init_device(data);
635 /* Register sysfs hooks */
636 err = sysfs_create_group(&client->dev.kobj, &lm78_group);
637 if (err)
638 goto ERROR3;
640 data->hwmon_dev = hwmon_device_register(&client->dev);
641 if (IS_ERR(data->hwmon_dev)) {
642 err = PTR_ERR(data->hwmon_dev);
643 goto ERROR4;
646 return 0;
648 ERROR4:
649 sysfs_remove_group(&client->dev.kobj, &lm78_group);
650 ERROR3:
651 kfree(data);
652 return err;
655 static int lm78_i2c_remove(struct i2c_client *client)
657 struct lm78_data *data = i2c_get_clientdata(client);
659 hwmon_device_unregister(data->hwmon_dev);
660 sysfs_remove_group(&client->dev.kobj, &lm78_group);
661 kfree(data);
663 return 0;
666 static int __devinit lm78_isa_probe(struct platform_device *pdev)
668 int err;
669 struct lm78_data *data;
670 struct resource *res;
672 /* Reserve the ISA region */
673 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
674 if (!request_region(res->start + LM78_ADDR_REG_OFFSET, 2, "lm78")) {
675 err = -EBUSY;
676 goto exit;
679 if (!(data = kzalloc(sizeof(struct lm78_data), GFP_KERNEL))) {
680 err = -ENOMEM;
681 goto exit_release_region;
683 mutex_init(&data->lock);
684 data->isa_addr = res->start;
685 platform_set_drvdata(pdev, data);
687 if (lm78_read_value(data, LM78_REG_CHIPID) & 0x80) {
688 data->type = lm79;
689 data->name = "lm79";
690 } else {
691 data->type = lm78;
692 data->name = "lm78";
695 /* Initialize the LM78 chip */
696 lm78_init_device(data);
698 /* Register sysfs hooks */
699 if ((err = sysfs_create_group(&pdev->dev.kobj, &lm78_group))
700 || (err = device_create_file(&pdev->dev, &dev_attr_name)))
701 goto exit_remove_files;
703 data->hwmon_dev = hwmon_device_register(&pdev->dev);
704 if (IS_ERR(data->hwmon_dev)) {
705 err = PTR_ERR(data->hwmon_dev);
706 goto exit_remove_files;
709 return 0;
711 exit_remove_files:
712 sysfs_remove_group(&pdev->dev.kobj, &lm78_group);
713 device_remove_file(&pdev->dev, &dev_attr_name);
714 kfree(data);
715 exit_release_region:
716 release_region(res->start + LM78_ADDR_REG_OFFSET, 2);
717 exit:
718 return err;
721 static int __devexit lm78_isa_remove(struct platform_device *pdev)
723 struct lm78_data *data = platform_get_drvdata(pdev);
724 struct resource *res;
726 hwmon_device_unregister(data->hwmon_dev);
727 sysfs_remove_group(&pdev->dev.kobj, &lm78_group);
728 device_remove_file(&pdev->dev, &dev_attr_name);
729 kfree(data);
731 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
732 release_region(res->start + LM78_ADDR_REG_OFFSET, 2);
734 return 0;
737 /* The SMBus locks itself, but ISA access must be locked explicitly!
738 We don't want to lock the whole ISA bus, so we lock each client
739 separately.
740 We ignore the LM78 BUSY flag at this moment - it could lead to deadlocks,
741 would slow down the LM78 access and should not be necessary. */
742 static int lm78_read_value(struct lm78_data *data, u8 reg)
744 struct i2c_client *client = data->client;
746 if (!client) { /* ISA device */
747 int res;
748 mutex_lock(&data->lock);
749 outb_p(reg, data->isa_addr + LM78_ADDR_REG_OFFSET);
750 res = inb_p(data->isa_addr + LM78_DATA_REG_OFFSET);
751 mutex_unlock(&data->lock);
752 return res;
753 } else
754 return i2c_smbus_read_byte_data(client, reg);
757 /* The SMBus locks itself, but ISA access muse be locked explicitly!
758 We don't want to lock the whole ISA bus, so we lock each client
759 separately.
760 We ignore the LM78 BUSY flag at this moment - it could lead to deadlocks,
761 would slow down the LM78 access and should not be necessary.
762 There are some ugly typecasts here, but the good new is - they should
763 nowhere else be necessary! */
764 static int lm78_write_value(struct lm78_data *data, u8 reg, u8 value)
766 struct i2c_client *client = data->client;
768 if (!client) { /* ISA device */
769 mutex_lock(&data->lock);
770 outb_p(reg, data->isa_addr + LM78_ADDR_REG_OFFSET);
771 outb_p(value, data->isa_addr + LM78_DATA_REG_OFFSET);
772 mutex_unlock(&data->lock);
773 return 0;
774 } else
775 return i2c_smbus_write_byte_data(client, reg, value);
778 static void lm78_init_device(struct lm78_data *data)
780 u8 config;
781 int i;
783 /* Start monitoring */
784 config = lm78_read_value(data, LM78_REG_CONFIG);
785 if ((config & 0x09) != 0x01)
786 lm78_write_value(data, LM78_REG_CONFIG,
787 (config & 0xf7) | 0x01);
789 /* A few vars need to be filled upon startup */
790 for (i = 0; i < 3; i++) {
791 data->fan_min[i] = lm78_read_value(data,
792 LM78_REG_FAN_MIN(i));
795 mutex_init(&data->update_lock);
798 static struct lm78_data *lm78_update_device(struct device *dev)
800 struct lm78_data *data = dev_get_drvdata(dev);
801 int i;
803 mutex_lock(&data->update_lock);
805 if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
806 || !data->valid) {
808 dev_dbg(dev, "Starting lm78 update\n");
810 for (i = 0; i <= 6; i++) {
811 data->in[i] =
812 lm78_read_value(data, LM78_REG_IN(i));
813 data->in_min[i] =
814 lm78_read_value(data, LM78_REG_IN_MIN(i));
815 data->in_max[i] =
816 lm78_read_value(data, LM78_REG_IN_MAX(i));
818 for (i = 0; i < 3; i++) {
819 data->fan[i] =
820 lm78_read_value(data, LM78_REG_FAN(i));
821 data->fan_min[i] =
822 lm78_read_value(data, LM78_REG_FAN_MIN(i));
824 data->temp = lm78_read_value(data, LM78_REG_TEMP);
825 data->temp_over =
826 lm78_read_value(data, LM78_REG_TEMP_OVER);
827 data->temp_hyst =
828 lm78_read_value(data, LM78_REG_TEMP_HYST);
829 i = lm78_read_value(data, LM78_REG_VID_FANDIV);
830 data->vid = i & 0x0f;
831 if (data->type == lm79)
832 data->vid |=
833 (lm78_read_value(data, LM78_REG_CHIPID) &
834 0x01) << 4;
835 else
836 data->vid |= 0x10;
837 data->fan_div[0] = (i >> 4) & 0x03;
838 data->fan_div[1] = i >> 6;
839 data->alarms = lm78_read_value(data, LM78_REG_ALARM1) +
840 (lm78_read_value(data, LM78_REG_ALARM2) << 8);
841 data->last_updated = jiffies;
842 data->valid = 1;
844 data->fan_div[2] = 1;
847 mutex_unlock(&data->update_lock);
849 return data;
852 /* return 1 if a supported chip is found, 0 otherwise */
853 static int __init lm78_isa_found(unsigned short address)
855 int val, save, found = 0;
856 int port;
858 /* Some boards declare base+0 to base+7 as a PNP device, some base+4
859 * to base+7 and some base+5 to base+6. So we better request each port
860 * individually for the probing phase. */
861 for (port = address; port < address + LM78_EXTENT; port++) {
862 if (!request_region(port, 1, "lm78")) {
863 pr_debug("Failed to request port 0x%x\n", port);
864 goto release;
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
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;
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;
900 /* The busy flag should be clear again */
901 if (inb_p(address + LM78_ADDR_REG_OFFSET) & 0x80)
902 goto release;
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;
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;
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;
924 if (found)
925 pr_info("Found an %s chip at %#x\n",
926 val & 0x80 ? "LM79" : "LM78", (int)address);
928 release:
929 for (port--; port >= address; port--)
930 release_region(port, 1);
931 return found;
934 static int __init lm78_isa_device_add(unsigned short address)
936 struct resource res = {
937 .start = address,
938 .end = address + LM78_EXTENT - 1,
939 .name = "lm78",
940 .flags = IORESOURCE_IO,
942 int err;
944 pdev = platform_device_alloc("lm78", address);
945 if (!pdev) {
946 err = -ENOMEM;
947 pr_err("Device allocation failed\n");
948 goto exit;
951 err = platform_device_add_resources(pdev, &res, 1);
952 if (err) {
953 pr_err("Device resource addition failed (%d)\n", err);
954 goto exit_device_put;
957 err = platform_device_add(pdev);
958 if (err) {
959 pr_err("Device addition failed (%d)\n", err);
960 goto exit_device_put;
963 return 0;
965 exit_device_put:
966 platform_device_put(pdev);
967 exit:
968 pdev = NULL;
969 return err;
972 static int __init sm_lm78_init(void)
974 int res;
976 /* We register the ISA device first, so that we can skip the
977 * registration of an I2C interface to the same device. */
978 if (lm78_isa_found(isa_address)) {
979 res = platform_driver_register(&lm78_isa_driver);
980 if (res)
981 goto exit;
983 /* Sets global pdev as a side effect */
984 res = lm78_isa_device_add(isa_address);
985 if (res)
986 goto exit_unreg_isa_driver;
989 res = i2c_add_driver(&lm78_driver);
990 if (res)
991 goto exit_unreg_isa_device;
993 return 0;
995 exit_unreg_isa_device:
996 platform_device_unregister(pdev);
997 exit_unreg_isa_driver:
998 platform_driver_unregister(&lm78_isa_driver);
999 exit:
1000 return res;
1003 static void __exit sm_lm78_exit(void)
1005 if (pdev) {
1006 platform_device_unregister(pdev);
1007 platform_driver_unregister(&lm78_isa_driver);
1009 i2c_del_driver(&lm78_driver);
1014 MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>");
1015 MODULE_DESCRIPTION("LM78/LM79 driver");
1016 MODULE_LICENSE("GPL");
1018 module_init(sm_lm78_init);
1019 module_exit(sm_lm78_exit);