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 unsigned short normal_i2c[] = { 0x20, 0x21, 0x22, 0x23, 0x24,
41 0x25, 0x26, 0x27, 0x28, 0x29,
42 0x2a, 0x2b, 0x2c, 0x2d, 0x2e,
43 0x2f, I2C_CLIENT_END };
44 static unsigned short isa_address = 0x290;
46 /* Insmod parameters */
47 I2C_CLIENT_INSMOD_2(lm78, lm79);
49 /* Many LM78 constants specified below */
51 /* Length of ISA address segment */
54 /* Where are the ISA address/data registers relative to the base address */
55 #define LM78_ADDR_REG_OFFSET 5
56 #define LM78_DATA_REG_OFFSET 6
58 /* The LM78 registers */
59 #define LM78_REG_IN_MAX(nr) (0x2b + (nr) * 2)
60 #define LM78_REG_IN_MIN(nr) (0x2c + (nr) * 2)
61 #define LM78_REG_IN(nr) (0x20 + (nr))
63 #define LM78_REG_FAN_MIN(nr) (0x3b + (nr))
64 #define LM78_REG_FAN(nr) (0x28 + (nr))
66 #define LM78_REG_TEMP 0x27
67 #define LM78_REG_TEMP_OVER 0x39
68 #define LM78_REG_TEMP_HYST 0x3a
70 #define LM78_REG_ALARM1 0x41
71 #define LM78_REG_ALARM2 0x42
73 #define LM78_REG_VID_FANDIV 0x47
75 #define LM78_REG_CONFIG 0x40
76 #define LM78_REG_CHIPID 0x49
77 #define LM78_REG_I2C_ADDR 0x48
80 /* Conversions. Rounding and limit checking is only done on the TO_REG
83 /* IN: mV, (0V to 4.08V)
85 static inline u8 IN_TO_REG(unsigned long val)
87 unsigned long nval = SENSORS_LIMIT(val, 0, 4080);
88 return (nval + 8) / 16;
90 #define IN_FROM_REG(val) ((val) * 16)
92 static inline u8 FAN_TO_REG(long rpm, int div)
96 return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
99 static inline int FAN_FROM_REG(u8 val, int div)
101 return val==0 ? -1 : val==255 ? 0 : 1350000/(val*div);
104 /* TEMP: mC (-128C to +127C)
105 REG: 1C/bit, two's complement */
106 static inline s8 TEMP_TO_REG(int val)
108 int nval = SENSORS_LIMIT(val, -128000, 127000) ;
109 return nval<0 ? (nval-500)/1000 : (nval+500)/1000;
112 static inline int TEMP_FROM_REG(s8 val)
117 #define DIV_FROM_REG(val) (1 << (val))
119 /* There are some complications in a module like this. First off, LM78 chips
120 may be both present on the SMBus and the ISA bus, and we have to handle
121 those cases separately at some places. Second, there might be several
122 LM78 chips available (well, actually, that is probably never done; but
123 it is a clean illustration of how to handle a case like that). Finally,
124 a specific chip may be attached to *both* ISA and SMBus, and we would
125 not like to detect it double. Fortunately, in the case of the LM78 at
126 least, a register tells us what SMBus address we are on, so that helps
127 a bit - except if there could be more than one SMBus. Groan. No solution
130 /* For ISA chips, we abuse the i2c_client addr and name fields. We also use
131 the driver field to differentiate between I2C and ISA chips. */
133 struct i2c_client client;
134 struct device *hwmon_dev;
138 struct mutex update_lock;
139 char valid; /* !=0 if following fields are valid */
140 unsigned long last_updated; /* In jiffies */
142 u8 in[7]; /* Register value */
143 u8 in_max[7]; /* Register value */
144 u8 in_min[7]; /* Register value */
145 u8 fan[3]; /* Register value */
146 u8 fan_min[3]; /* Register value */
147 s8 temp; /* Register value */
148 s8 temp_over; /* Register value */
149 s8 temp_hyst; /* Register value */
150 u8 fan_div[3]; /* Register encoding, shifted right */
151 u8 vid; /* Register encoding, combined */
152 u16 alarms; /* Register encoding, combined */
156 static int lm78_attach_adapter(struct i2c_adapter *adapter);
157 static int lm78_detect(struct i2c_adapter *adapter, int address, int kind);
158 static int lm78_detach_client(struct i2c_client *client);
160 static int __devinit lm78_isa_probe(struct platform_device *pdev);
161 static int __devexit lm78_isa_remove(struct platform_device *pdev);
163 static int lm78_read_value(struct lm78_data *data, u8 reg);
164 static int lm78_write_value(struct lm78_data *data, u8 reg, u8 value);
165 static struct lm78_data *lm78_update_device(struct device *dev);
166 static void lm78_init_device(struct lm78_data *data);
169 static struct i2c_driver lm78_driver = {
173 .id = I2C_DRIVERID_LM78,
174 .attach_adapter = lm78_attach_adapter,
175 .detach_client = lm78_detach_client,
178 static struct platform_driver lm78_isa_driver = {
180 .owner = THIS_MODULE,
183 .probe = lm78_isa_probe,
184 .remove = 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 /* This function is called when:
461 * lm78_driver is inserted (when this module is loaded), for each
463 * when a new adapter is inserted (and lm78_driver is still present) */
464 static int lm78_attach_adapter(struct i2c_adapter *adapter)
466 if (!(adapter->class & I2C_CLASS_HWMON))
468 return i2c_probe(adapter, &addr_data, lm78_detect);
471 static struct attribute *lm78_attributes[] = {
472 &sensor_dev_attr_in0_input.dev_attr.attr,
473 &sensor_dev_attr_in0_min.dev_attr.attr,
474 &sensor_dev_attr_in0_max.dev_attr.attr,
475 &sensor_dev_attr_in0_alarm.dev_attr.attr,
476 &sensor_dev_attr_in1_input.dev_attr.attr,
477 &sensor_dev_attr_in1_min.dev_attr.attr,
478 &sensor_dev_attr_in1_max.dev_attr.attr,
479 &sensor_dev_attr_in1_alarm.dev_attr.attr,
480 &sensor_dev_attr_in2_input.dev_attr.attr,
481 &sensor_dev_attr_in2_min.dev_attr.attr,
482 &sensor_dev_attr_in2_max.dev_attr.attr,
483 &sensor_dev_attr_in2_alarm.dev_attr.attr,
484 &sensor_dev_attr_in3_input.dev_attr.attr,
485 &sensor_dev_attr_in3_min.dev_attr.attr,
486 &sensor_dev_attr_in3_max.dev_attr.attr,
487 &sensor_dev_attr_in3_alarm.dev_attr.attr,
488 &sensor_dev_attr_in4_input.dev_attr.attr,
489 &sensor_dev_attr_in4_min.dev_attr.attr,
490 &sensor_dev_attr_in4_max.dev_attr.attr,
491 &sensor_dev_attr_in4_alarm.dev_attr.attr,
492 &sensor_dev_attr_in5_input.dev_attr.attr,
493 &sensor_dev_attr_in5_min.dev_attr.attr,
494 &sensor_dev_attr_in5_max.dev_attr.attr,
495 &sensor_dev_attr_in5_alarm.dev_attr.attr,
496 &sensor_dev_attr_in6_input.dev_attr.attr,
497 &sensor_dev_attr_in6_min.dev_attr.attr,
498 &sensor_dev_attr_in6_max.dev_attr.attr,
499 &sensor_dev_attr_in6_alarm.dev_attr.attr,
500 &dev_attr_temp1_input.attr,
501 &dev_attr_temp1_max.attr,
502 &dev_attr_temp1_max_hyst.attr,
503 &sensor_dev_attr_temp1_alarm.dev_attr.attr,
504 &sensor_dev_attr_fan1_input.dev_attr.attr,
505 &sensor_dev_attr_fan1_min.dev_attr.attr,
506 &sensor_dev_attr_fan1_div.dev_attr.attr,
507 &sensor_dev_attr_fan1_alarm.dev_attr.attr,
508 &sensor_dev_attr_fan2_input.dev_attr.attr,
509 &sensor_dev_attr_fan2_min.dev_attr.attr,
510 &sensor_dev_attr_fan2_div.dev_attr.attr,
511 &sensor_dev_attr_fan2_alarm.dev_attr.attr,
512 &sensor_dev_attr_fan3_input.dev_attr.attr,
513 &sensor_dev_attr_fan3_min.dev_attr.attr,
514 &sensor_dev_attr_fan3_div.dev_attr.attr,
515 &sensor_dev_attr_fan3_alarm.dev_attr.attr,
516 &dev_attr_alarms.attr,
517 &dev_attr_cpu0_vid.attr,
522 static const struct attribute_group lm78_group = {
523 .attrs = lm78_attributes,
526 /* I2C devices get this name attribute automatically, but for ISA devices
527 we must create it by ourselves. */
528 static ssize_t show_name(struct device *dev, struct device_attribute
531 struct lm78_data *data = dev_get_drvdata(dev);
533 return sprintf(buf, "%s\n", data->client.name);
535 static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
537 /* This function is called by i2c_probe */
538 static int lm78_detect(struct i2c_adapter *adapter, int address, int kind)
541 struct i2c_client *new_client;
542 struct lm78_data *data;
543 const char *client_name = "";
545 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
550 /* OK. For now, we presume we have a valid client. We now create the
551 client structure, even though we cannot fill it completely yet.
552 But it allows us to access lm78_{read,write}_value. */
554 if (!(data = kzalloc(sizeof(struct lm78_data), GFP_KERNEL))) {
559 new_client = &data->client;
560 i2c_set_clientdata(new_client, data);
561 new_client->addr = address;
562 new_client->adapter = adapter;
563 new_client->driver = &lm78_driver;
565 /* Now, we do the remaining detection. */
567 if (lm78_read_value(data, LM78_REG_CONFIG) & 0x80) {
571 if (lm78_read_value(data, LM78_REG_I2C_ADDR) !=
578 /* Determine the chip type. */
580 i = lm78_read_value(data, LM78_REG_CHIPID);
581 if (i == 0x00 || i == 0x20 /* LM78 */
582 || i == 0x40) /* LM78-J */
584 else if ((i & 0xfe) == 0xc0)
588 dev_warn(&adapter->dev, "Ignoring 'force' "
589 "parameter for unknown chip at "
590 "adapter %d, address 0x%02x\n",
591 i2c_adapter_id(adapter), address);
598 client_name = "lm78";
599 } else if (kind == lm79) {
600 client_name = "lm79";
603 /* Fill in the remaining client fields and put into the global list */
604 strlcpy(new_client->name, client_name, I2C_NAME_SIZE);
607 /* Tell the I2C layer a new client has arrived */
608 if ((err = i2c_attach_client(new_client)))
611 /* Initialize the LM78 chip */
612 lm78_init_device(data);
614 /* Register sysfs hooks */
615 if ((err = sysfs_create_group(&new_client->dev.kobj, &lm78_group)))
618 data->hwmon_dev = hwmon_device_register(&new_client->dev);
619 if (IS_ERR(data->hwmon_dev)) {
620 err = PTR_ERR(data->hwmon_dev);
627 sysfs_remove_group(&new_client->dev.kobj, &lm78_group);
629 i2c_detach_client(new_client);
636 static int lm78_detach_client(struct i2c_client *client)
638 struct lm78_data *data = i2c_get_clientdata(client);
641 hwmon_device_unregister(data->hwmon_dev);
642 sysfs_remove_group(&client->dev.kobj, &lm78_group);
644 if ((err = i2c_detach_client(client)))
652 static int __devinit lm78_isa_probe(struct platform_device *pdev)
655 struct lm78_data *data;
656 struct resource *res;
659 /* Reserve the ISA region */
660 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
661 if (!request_region(res->start, LM78_EXTENT, "lm78")) {
666 if (!(data = kzalloc(sizeof(struct lm78_data), GFP_KERNEL))) {
668 goto exit_release_region;
670 mutex_init(&data->lock);
671 data->client.addr = res->start;
672 i2c_set_clientdata(&data->client, data);
673 platform_set_drvdata(pdev, data);
675 if (lm78_read_value(data, LM78_REG_CHIPID) & 0x80) {
682 strlcpy(data->client.name, name, I2C_NAME_SIZE);
684 /* Initialize the LM78 chip */
685 lm78_init_device(data);
687 /* Register sysfs hooks */
688 if ((err = sysfs_create_group(&pdev->dev.kobj, &lm78_group))
689 || (err = device_create_file(&pdev->dev, &dev_attr_name)))
690 goto exit_remove_files;
692 data->hwmon_dev = hwmon_device_register(&pdev->dev);
693 if (IS_ERR(data->hwmon_dev)) {
694 err = PTR_ERR(data->hwmon_dev);
695 goto exit_remove_files;
701 sysfs_remove_group(&pdev->dev.kobj, &lm78_group);
702 device_remove_file(&pdev->dev, &dev_attr_name);
705 release_region(res->start, LM78_EXTENT);
710 static int __devexit lm78_isa_remove(struct platform_device *pdev)
712 struct lm78_data *data = platform_get_drvdata(pdev);
714 hwmon_device_unregister(data->hwmon_dev);
715 sysfs_remove_group(&pdev->dev.kobj, &lm78_group);
716 device_remove_file(&pdev->dev, &dev_attr_name);
717 release_region(data->client.addr, LM78_EXTENT);
723 /* The SMBus locks itself, but ISA access must be locked explicitly!
724 We don't want to lock the whole ISA bus, so we lock each client
726 We ignore the LM78 BUSY flag at this moment - it could lead to deadlocks,
727 would slow down the LM78 access and should not be necessary. */
728 static int lm78_read_value(struct lm78_data *data, u8 reg)
730 struct i2c_client *client = &data->client;
732 if (!client->driver) { /* ISA device */
734 mutex_lock(&data->lock);
735 outb_p(reg, client->addr + LM78_ADDR_REG_OFFSET);
736 res = inb_p(client->addr + LM78_DATA_REG_OFFSET);
737 mutex_unlock(&data->lock);
740 return i2c_smbus_read_byte_data(client, reg);
743 /* The SMBus locks itself, but ISA access muse be locked explicitly!
744 We don't want to lock the whole ISA bus, so we lock each client
746 We ignore the LM78 BUSY flag at this moment - it could lead to deadlocks,
747 would slow down the LM78 access and should not be necessary.
748 There are some ugly typecasts here, but the good new is - they should
749 nowhere else be necessary! */
750 static int lm78_write_value(struct lm78_data *data, u8 reg, u8 value)
752 struct i2c_client *client = &data->client;
754 if (!client->driver) { /* ISA device */
755 mutex_lock(&data->lock);
756 outb_p(reg, client->addr + LM78_ADDR_REG_OFFSET);
757 outb_p(value, client->addr + LM78_DATA_REG_OFFSET);
758 mutex_unlock(&data->lock);
761 return i2c_smbus_write_byte_data(client, reg, value);
764 static void lm78_init_device(struct lm78_data *data)
769 /* Start monitoring */
770 config = lm78_read_value(data, LM78_REG_CONFIG);
771 if ((config & 0x09) != 0x01)
772 lm78_write_value(data, LM78_REG_CONFIG,
773 (config & 0xf7) | 0x01);
775 /* A few vars need to be filled upon startup */
776 for (i = 0; i < 3; i++) {
777 data->fan_min[i] = lm78_read_value(data,
778 LM78_REG_FAN_MIN(i));
781 mutex_init(&data->update_lock);
784 static struct lm78_data *lm78_update_device(struct device *dev)
786 struct lm78_data *data = dev_get_drvdata(dev);
789 mutex_lock(&data->update_lock);
791 if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
794 dev_dbg(dev, "Starting lm78 update\n");
796 for (i = 0; i <= 6; i++) {
798 lm78_read_value(data, LM78_REG_IN(i));
800 lm78_read_value(data, LM78_REG_IN_MIN(i));
802 lm78_read_value(data, LM78_REG_IN_MAX(i));
804 for (i = 0; i < 3; i++) {
806 lm78_read_value(data, LM78_REG_FAN(i));
808 lm78_read_value(data, LM78_REG_FAN_MIN(i));
810 data->temp = lm78_read_value(data, LM78_REG_TEMP);
812 lm78_read_value(data, LM78_REG_TEMP_OVER);
814 lm78_read_value(data, LM78_REG_TEMP_HYST);
815 i = lm78_read_value(data, LM78_REG_VID_FANDIV);
816 data->vid = i & 0x0f;
817 if (data->type == lm79)
819 (lm78_read_value(data, LM78_REG_CHIPID) &
823 data->fan_div[0] = (i >> 4) & 0x03;
824 data->fan_div[1] = i >> 6;
825 data->alarms = lm78_read_value(data, LM78_REG_ALARM1) +
826 (lm78_read_value(data, LM78_REG_ALARM2) << 8);
827 data->last_updated = jiffies;
830 data->fan_div[2] = 1;
833 mutex_unlock(&data->update_lock);
838 /* return 1 if a supported chip is found, 0 otherwise */
839 static int __init lm78_isa_found(unsigned short address)
841 int val, save, found = 0;
843 if (!request_region(address, LM78_EXTENT, "lm78"))
846 #define REALLY_SLOW_IO
847 /* We need the timeouts for at least some LM78-like
848 chips. But only if we read 'undefined' registers. */
849 val = inb_p(address + 1);
850 if (inb_p(address + 2) != val
851 || inb_p(address + 3) != val
852 || inb_p(address + 7) != val)
854 #undef REALLY_SLOW_IO
856 /* We should be able to change the 7 LSB of the address port. The
857 MSB (busy flag) should be clear initially, set after the write. */
858 save = inb_p(address + LM78_ADDR_REG_OFFSET);
862 outb_p(val, address + LM78_ADDR_REG_OFFSET);
863 if (inb_p(address + LM78_ADDR_REG_OFFSET) != (val | 0x80)) {
864 outb_p(save, address + LM78_ADDR_REG_OFFSET);
868 /* We found a device, now see if it could be an LM78 */
869 outb_p(LM78_REG_CONFIG, address + LM78_ADDR_REG_OFFSET);
870 val = inb_p(address + LM78_DATA_REG_OFFSET);
873 outb_p(LM78_REG_I2C_ADDR, address + LM78_ADDR_REG_OFFSET);
874 val = inb_p(address + LM78_DATA_REG_OFFSET);
875 if (val < 0x03 || val > 0x77) /* Not a valid I2C address */
878 /* The busy flag should be clear again */
879 if (inb_p(address + LM78_ADDR_REG_OFFSET) & 0x80)
882 /* Explicitly prevent the misdetection of Winbond chips */
883 outb_p(0x4f, address + LM78_ADDR_REG_OFFSET);
884 val = inb_p(address + LM78_DATA_REG_OFFSET);
885 if (val == 0xa3 || val == 0x5c)
888 /* Explicitly prevent the misdetection of ITE chips */
889 outb_p(0x58, address + LM78_ADDR_REG_OFFSET);
890 val = inb_p(address + LM78_DATA_REG_OFFSET);
894 /* Determine the chip type */
895 outb_p(LM78_REG_CHIPID, address + LM78_ADDR_REG_OFFSET);
896 val = inb_p(address + LM78_DATA_REG_OFFSET);
897 if (val == 0x00 || val == 0x20 /* LM78 */
898 || val == 0x40 /* LM78-J */
899 || (val & 0xfe) == 0xc0) /* LM79 */
903 pr_info("lm78: Found an %s chip at %#x\n",
904 val & 0x80 ? "LM79" : "LM78", (int)address);
907 release_region(address, LM78_EXTENT);
911 static int __init lm78_isa_device_add(unsigned short address)
913 struct resource res = {
915 .end = address + LM78_EXTENT - 1,
917 .flags = IORESOURCE_IO,
921 pdev = platform_device_alloc("lm78", address);
924 printk(KERN_ERR "lm78: Device allocation failed\n");
928 err = platform_device_add_resources(pdev, &res, 1);
930 printk(KERN_ERR "lm78: Device resource addition failed "
932 goto exit_device_put;
935 err = platform_device_add(pdev);
937 printk(KERN_ERR "lm78: Device addition failed (%d)\n",
939 goto exit_device_put;
945 platform_device_put(pdev);
951 static int __init sm_lm78_init(void)
955 res = i2c_add_driver(&lm78_driver);
959 if (lm78_isa_found(isa_address)) {
960 res = platform_driver_register(&lm78_isa_driver);
962 goto exit_unreg_i2c_driver;
964 /* Sets global pdev as a side effect */
965 res = lm78_isa_device_add(isa_address);
967 goto exit_unreg_isa_driver;
972 exit_unreg_isa_driver:
973 platform_driver_unregister(&lm78_isa_driver);
974 exit_unreg_i2c_driver:
975 i2c_del_driver(&lm78_driver);
980 static void __exit sm_lm78_exit(void)
983 platform_device_unregister(pdev);
984 platform_driver_unregister(&lm78_isa_driver);
986 i2c_del_driver(&lm78_driver);
991 MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>");
992 MODULE_DESCRIPTION("LM78/LM79 driver");
993 MODULE_LICENSE("GPL");
995 module_init(sm_lm78_init);
996 module_exit(sm_lm78_exit);