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/err.h>
32 #include <linux/mutex.h>
35 /* ISA device, if found */
36 static struct platform_device *pdev;
38 /* Addresses to scan */
39 static unsigned short normal_i2c[] = { 0x20, 0x21, 0x22, 0x23, 0x24,
40 0x25, 0x26, 0x27, 0x28, 0x29,
41 0x2a, 0x2b, 0x2c, 0x2d, 0x2e,
42 0x2f, I2C_CLIENT_END };
43 static unsigned short isa_address = 0x290;
45 /* Insmod parameters */
46 I2C_CLIENT_INSMOD_2(lm78, lm79);
48 /* Many LM78 constants specified below */
50 /* Length of ISA address segment */
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
82 /* IN: mV, (0V to 4.08V)
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)
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)
116 #define DIV_FROM_REG(val) (1 << (val))
118 /* There are some complications in a module like this. First off, LM78 chips
119 may be both present on the SMBus and the ISA bus, and we have to handle
120 those cases separately at some places. Second, there might be several
121 LM78 chips available (well, actually, that is probably never done; but
122 it is a clean illustration of how to handle a case like that). Finally,
123 a specific chip may be attached to *both* ISA and SMBus, and we would
124 not like to detect it double. Fortunately, in the case of the LM78 at
125 least, a register tells us what SMBus address we are on, so that helps
126 a bit - except if there could be more than one SMBus. Groan. No solution
129 /* For ISA chips, we abuse the i2c_client addr and name fields. We also use
130 the driver field to differentiate between I2C and ISA chips. */
132 struct i2c_client client;
133 struct class_device *class_dev;
137 struct mutex update_lock;
138 char valid; /* !=0 if following fields are valid */
139 unsigned long last_updated; /* In jiffies */
141 u8 in[7]; /* Register value */
142 u8 in_max[7]; /* Register value */
143 u8 in_min[7]; /* Register value */
144 u8 fan[3]; /* Register value */
145 u8 fan_min[3]; /* Register value */
146 s8 temp; /* Register value */
147 s8 temp_over; /* Register value */
148 s8 temp_hyst; /* Register value */
149 u8 fan_div[3]; /* Register encoding, shifted right */
150 u8 vid; /* Register encoding, combined */
151 u16 alarms; /* Register encoding, combined */
155 static int lm78_attach_adapter(struct i2c_adapter *adapter);
156 static int lm78_detect(struct i2c_adapter *adapter, int address, int kind);
157 static int lm78_detach_client(struct i2c_client *client);
159 static int __devinit lm78_isa_probe(struct platform_device *pdev);
160 static int __devexit lm78_isa_remove(struct platform_device *pdev);
162 static int lm78_read_value(struct i2c_client *client, u8 reg);
163 static int lm78_write_value(struct i2c_client *client, u8 reg, u8 value);
164 static struct lm78_data *lm78_update_device(struct device *dev);
165 static void lm78_init_client(struct i2c_client *client);
168 static struct i2c_driver lm78_driver = {
172 .id = I2C_DRIVERID_LM78,
173 .attach_adapter = lm78_attach_adapter,
174 .detach_client = lm78_detach_client,
177 static struct platform_driver lm78_isa_driver = {
179 .owner = THIS_MODULE,
182 .probe = lm78_isa_probe,
183 .remove = lm78_isa_remove,
188 static ssize_t show_in(struct device *dev, char *buf, int nr)
190 struct lm78_data *data = lm78_update_device(dev);
191 return sprintf(buf, "%d\n", IN_FROM_REG(data->in[nr]));
194 static ssize_t show_in_min(struct device *dev, char *buf, int nr)
196 struct lm78_data *data = lm78_update_device(dev);
197 return sprintf(buf, "%d\n", IN_FROM_REG(data->in_min[nr]));
200 static ssize_t show_in_max(struct device *dev, char *buf, int nr)
202 struct lm78_data *data = lm78_update_device(dev);
203 return sprintf(buf, "%d\n", IN_FROM_REG(data->in_max[nr]));
206 static ssize_t set_in_min(struct device *dev, const char *buf,
207 size_t count, int nr)
209 struct lm78_data *data = dev_get_drvdata(dev);
210 struct i2c_client *client = &data->client;
211 unsigned long val = simple_strtoul(buf, NULL, 10);
213 mutex_lock(&data->update_lock);
214 data->in_min[nr] = IN_TO_REG(val);
215 lm78_write_value(client, LM78_REG_IN_MIN(nr), data->in_min[nr]);
216 mutex_unlock(&data->update_lock);
220 static ssize_t set_in_max(struct device *dev, const char *buf,
221 size_t count, int nr)
223 struct lm78_data *data = dev_get_drvdata(dev);
224 struct i2c_client *client = &data->client;
225 unsigned long val = simple_strtoul(buf, NULL, 10);
227 mutex_lock(&data->update_lock);
228 data->in_max[nr] = IN_TO_REG(val);
229 lm78_write_value(client, LM78_REG_IN_MAX(nr), data->in_max[nr]);
230 mutex_unlock(&data->update_lock);
234 #define show_in_offset(offset) \
236 show_in##offset (struct device *dev, struct device_attribute *attr, char *buf) \
238 return show_in(dev, buf, offset); \
240 static DEVICE_ATTR(in##offset##_input, S_IRUGO, \
241 show_in##offset, NULL); \
243 show_in##offset##_min (struct device *dev, struct device_attribute *attr, char *buf) \
245 return show_in_min(dev, buf, offset); \
248 show_in##offset##_max (struct device *dev, struct device_attribute *attr, char *buf) \
250 return show_in_max(dev, buf, offset); \
252 static ssize_t set_in##offset##_min (struct device *dev, struct device_attribute *attr, \
253 const char *buf, size_t count) \
255 return set_in_min(dev, buf, count, offset); \
257 static ssize_t set_in##offset##_max (struct device *dev, struct device_attribute *attr, \
258 const char *buf, size_t count) \
260 return set_in_max(dev, buf, count, offset); \
262 static DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \
263 show_in##offset##_min, set_in##offset##_min); \
264 static DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \
265 show_in##offset##_max, set_in##offset##_max);
276 static ssize_t show_temp(struct device *dev, struct device_attribute *attr, char *buf)
278 struct lm78_data *data = lm78_update_device(dev);
279 return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp));
282 static ssize_t show_temp_over(struct device *dev, struct device_attribute *attr, char *buf)
284 struct lm78_data *data = lm78_update_device(dev);
285 return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_over));
288 static ssize_t set_temp_over(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
290 struct lm78_data *data = dev_get_drvdata(dev);
291 struct i2c_client *client = &data->client;
292 long val = simple_strtol(buf, NULL, 10);
294 mutex_lock(&data->update_lock);
295 data->temp_over = TEMP_TO_REG(val);
296 lm78_write_value(client, LM78_REG_TEMP_OVER, data->temp_over);
297 mutex_unlock(&data->update_lock);
301 static ssize_t show_temp_hyst(struct device *dev, struct device_attribute *attr, char *buf)
303 struct lm78_data *data = lm78_update_device(dev);
304 return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_hyst));
307 static ssize_t set_temp_hyst(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
309 struct lm78_data *data = dev_get_drvdata(dev);
310 struct i2c_client *client = &data->client;
311 long val = simple_strtol(buf, NULL, 10);
313 mutex_lock(&data->update_lock);
314 data->temp_hyst = TEMP_TO_REG(val);
315 lm78_write_value(client, LM78_REG_TEMP_HYST, data->temp_hyst);
316 mutex_unlock(&data->update_lock);
320 static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL);
321 static DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR,
322 show_temp_over, set_temp_over);
323 static DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR,
324 show_temp_hyst, set_temp_hyst);
327 static ssize_t show_fan(struct device *dev, char *buf, int nr)
329 struct lm78_data *data = lm78_update_device(dev);
330 return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[nr],
331 DIV_FROM_REG(data->fan_div[nr])) );
334 static ssize_t show_fan_min(struct device *dev, char *buf, int nr)
336 struct lm78_data *data = lm78_update_device(dev);
337 return sprintf(buf,"%d\n", FAN_FROM_REG(data->fan_min[nr],
338 DIV_FROM_REG(data->fan_div[nr])) );
341 static ssize_t set_fan_min(struct device *dev, const char *buf,
342 size_t count, int nr)
344 struct lm78_data *data = dev_get_drvdata(dev);
345 struct i2c_client *client = &data->client;
346 unsigned long val = simple_strtoul(buf, NULL, 10);
348 mutex_lock(&data->update_lock);
349 data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
350 lm78_write_value(client, LM78_REG_FAN_MIN(nr), data->fan_min[nr]);
351 mutex_unlock(&data->update_lock);
355 static ssize_t show_fan_div(struct device *dev, char *buf, int nr)
357 struct lm78_data *data = lm78_update_device(dev);
358 return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[nr]) );
361 /* Note: we save and restore the fan minimum here, because its value is
362 determined in part by the fan divisor. This follows the principle of
363 least surprise; the user doesn't expect the fan minimum to change just
364 because the divisor changed. */
365 static ssize_t set_fan_div(struct device *dev, const char *buf,
366 size_t count, int nr)
368 struct lm78_data *data = dev_get_drvdata(dev);
369 struct i2c_client *client = &data->client;
370 unsigned long val = simple_strtoul(buf, NULL, 10);
374 mutex_lock(&data->update_lock);
375 min = FAN_FROM_REG(data->fan_min[nr],
376 DIV_FROM_REG(data->fan_div[nr]));
379 case 1: data->fan_div[nr] = 0; break;
380 case 2: data->fan_div[nr] = 1; break;
381 case 4: data->fan_div[nr] = 2; break;
382 case 8: data->fan_div[nr] = 3; break;
384 dev_err(dev, "fan_div value %ld not "
385 "supported. Choose one of 1, 2, 4 or 8!\n", val);
386 mutex_unlock(&data->update_lock);
390 reg = lm78_read_value(client, LM78_REG_VID_FANDIV);
393 reg = (reg & 0xcf) | (data->fan_div[nr] << 4);
396 reg = (reg & 0x3f) | (data->fan_div[nr] << 6);
399 lm78_write_value(client, LM78_REG_VID_FANDIV, reg);
402 FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
403 lm78_write_value(client, LM78_REG_FAN_MIN(nr), data->fan_min[nr]);
404 mutex_unlock(&data->update_lock);
409 #define show_fan_offset(offset) \
410 static ssize_t show_fan_##offset (struct device *dev, struct device_attribute *attr, char *buf) \
412 return show_fan(dev, buf, offset - 1); \
414 static ssize_t show_fan_##offset##_min (struct device *dev, struct device_attribute *attr, char *buf) \
416 return show_fan_min(dev, buf, offset - 1); \
418 static ssize_t show_fan_##offset##_div (struct device *dev, struct device_attribute *attr, char *buf) \
420 return show_fan_div(dev, buf, offset - 1); \
422 static ssize_t set_fan_##offset##_min (struct device *dev, struct device_attribute *attr, \
423 const char *buf, size_t count) \
425 return set_fan_min(dev, buf, count, offset - 1); \
427 static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_fan_##offset, NULL);\
428 static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
429 show_fan_##offset##_min, set_fan_##offset##_min);
431 static ssize_t set_fan_1_div(struct device *dev, struct device_attribute *attr, const char *buf,
434 return set_fan_div(dev, buf, count, 0) ;
437 static ssize_t set_fan_2_div(struct device *dev, struct device_attribute *attr, const char *buf,
440 return set_fan_div(dev, buf, count, 1) ;
447 /* Fan 3 divisor is locked in H/W */
448 static DEVICE_ATTR(fan1_div, S_IRUGO | S_IWUSR,
449 show_fan_1_div, set_fan_1_div);
450 static DEVICE_ATTR(fan2_div, S_IRUGO | S_IWUSR,
451 show_fan_2_div, set_fan_2_div);
452 static DEVICE_ATTR(fan3_div, S_IRUGO, show_fan_3_div, NULL);
455 static ssize_t show_vid(struct device *dev, struct device_attribute *attr, char *buf)
457 struct lm78_data *data = lm78_update_device(dev);
458 return sprintf(buf, "%d\n", vid_from_reg(data->vid, 82));
460 static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
463 static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf)
465 struct lm78_data *data = lm78_update_device(dev);
466 return sprintf(buf, "%u\n", data->alarms);
468 static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
470 /* This function is called when:
471 * lm78_driver is inserted (when this module is loaded), for each
473 * when a new adapter is inserted (and lm78_driver is still present) */
474 static int lm78_attach_adapter(struct i2c_adapter *adapter)
476 if (!(adapter->class & I2C_CLASS_HWMON))
478 return i2c_probe(adapter, &addr_data, lm78_detect);
481 static struct attribute *lm78_attributes[] = {
482 &dev_attr_in0_input.attr,
483 &dev_attr_in0_min.attr,
484 &dev_attr_in0_max.attr,
485 &dev_attr_in1_input.attr,
486 &dev_attr_in1_min.attr,
487 &dev_attr_in1_max.attr,
488 &dev_attr_in2_input.attr,
489 &dev_attr_in2_min.attr,
490 &dev_attr_in2_max.attr,
491 &dev_attr_in3_input.attr,
492 &dev_attr_in3_min.attr,
493 &dev_attr_in3_max.attr,
494 &dev_attr_in4_input.attr,
495 &dev_attr_in4_min.attr,
496 &dev_attr_in4_max.attr,
497 &dev_attr_in5_input.attr,
498 &dev_attr_in5_min.attr,
499 &dev_attr_in5_max.attr,
500 &dev_attr_in6_input.attr,
501 &dev_attr_in6_min.attr,
502 &dev_attr_in6_max.attr,
503 &dev_attr_temp1_input.attr,
504 &dev_attr_temp1_max.attr,
505 &dev_attr_temp1_max_hyst.attr,
506 &dev_attr_fan1_input.attr,
507 &dev_attr_fan1_min.attr,
508 &dev_attr_fan1_div.attr,
509 &dev_attr_fan2_input.attr,
510 &dev_attr_fan2_min.attr,
511 &dev_attr_fan2_div.attr,
512 &dev_attr_fan3_input.attr,
513 &dev_attr_fan3_min.attr,
514 &dev_attr_fan3_div.attr,
515 &dev_attr_alarms.attr,
516 &dev_attr_cpu0_vid.attr,
521 static const struct attribute_group lm78_group = {
522 .attrs = lm78_attributes,
525 /* I2C devices get this name attribute automatically, but for ISA devices
526 we must create it by ourselves. */
527 static ssize_t show_name(struct device *dev, struct device_attribute
530 struct lm78_data *data = dev_get_drvdata(dev);
532 return sprintf(buf, "%s\n", data->client.name);
534 static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
536 /* This function is called by i2c_probe */
537 static int lm78_detect(struct i2c_adapter *adapter, int address, int kind)
540 struct i2c_client *new_client;
541 struct lm78_data *data;
542 const char *client_name = "";
544 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
549 /* OK. For now, we presume we have a valid client. We now create the
550 client structure, even though we cannot fill it completely yet.
551 But it allows us to access lm78_{read,write}_value. */
553 if (!(data = kzalloc(sizeof(struct lm78_data), GFP_KERNEL))) {
558 new_client = &data->client;
559 i2c_set_clientdata(new_client, data);
560 new_client->addr = address;
561 new_client->adapter = adapter;
562 new_client->driver = &lm78_driver;
564 /* Now, we do the remaining detection. */
566 if (lm78_read_value(new_client, LM78_REG_CONFIG) & 0x80) {
570 if (lm78_read_value(new_client, LM78_REG_I2C_ADDR) !=
577 /* Determine the chip type. */
579 i = lm78_read_value(new_client, LM78_REG_CHIPID);
580 if (i == 0x00 || i == 0x20 /* LM78 */
581 || i == 0x40) /* LM78-J */
583 else if ((i & 0xfe) == 0xc0)
587 dev_warn(&adapter->dev, "Ignoring 'force' "
588 "parameter for unknown chip at "
589 "adapter %d, address 0x%02x\n",
590 i2c_adapter_id(adapter), address);
597 client_name = "lm78";
598 } else if (kind == lm79) {
599 client_name = "lm79";
602 /* Fill in the remaining client fields and put into the global list */
603 strlcpy(new_client->name, client_name, I2C_NAME_SIZE);
606 /* Tell the I2C layer a new client has arrived */
607 if ((err = i2c_attach_client(new_client)))
610 /* Initialize the LM78 chip */
611 lm78_init_client(new_client);
613 /* Register sysfs hooks */
614 if ((err = sysfs_create_group(&new_client->dev.kobj, &lm78_group)))
617 data->class_dev = hwmon_device_register(&new_client->dev);
618 if (IS_ERR(data->class_dev)) {
619 err = PTR_ERR(data->class_dev);
626 sysfs_remove_group(&new_client->dev.kobj, &lm78_group);
628 i2c_detach_client(new_client);
635 static int lm78_detach_client(struct i2c_client *client)
637 struct lm78_data *data = i2c_get_clientdata(client);
640 hwmon_device_unregister(data->class_dev);
641 sysfs_remove_group(&client->dev.kobj, &lm78_group);
643 if ((err = i2c_detach_client(client)))
651 static int __devinit lm78_isa_probe(struct platform_device *pdev)
654 struct lm78_data *data;
655 struct resource *res;
658 /* Reserve the ISA region */
659 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
660 if (!request_region(res->start, LM78_EXTENT, "lm78")) {
665 if (!(data = kzalloc(sizeof(struct lm78_data), GFP_KERNEL))) {
667 goto exit_release_region;
669 mutex_init(&data->lock);
670 data->client.addr = res->start;
671 i2c_set_clientdata(&data->client, data);
672 platform_set_drvdata(pdev, data);
674 if (lm78_read_value(&data->client, LM78_REG_CHIPID) & 0x80) {
681 strlcpy(data->client.name, name, I2C_NAME_SIZE);
683 /* Initialize the LM78 chip */
684 lm78_init_client(&data->client);
686 /* Register sysfs hooks */
687 if ((err = sysfs_create_group(&pdev->dev.kobj, &lm78_group))
688 || (err = device_create_file(&pdev->dev, &dev_attr_name)))
689 goto exit_remove_files;
691 data->class_dev = hwmon_device_register(&pdev->dev);
692 if (IS_ERR(data->class_dev)) {
693 err = PTR_ERR(data->class_dev);
694 goto exit_remove_files;
700 sysfs_remove_group(&pdev->dev.kobj, &lm78_group);
701 device_remove_file(&pdev->dev, &dev_attr_name);
704 release_region(res->start, LM78_EXTENT);
709 static int __devexit lm78_isa_remove(struct platform_device *pdev)
711 struct lm78_data *data = platform_get_drvdata(pdev);
713 hwmon_device_unregister(data->class_dev);
714 sysfs_remove_group(&pdev->dev.kobj, &lm78_group);
715 device_remove_file(&pdev->dev, &dev_attr_name);
716 release_region(data->client.addr, LM78_EXTENT);
722 /* The SMBus locks itself, but ISA access must be locked explicitly!
723 We don't want to lock the whole ISA bus, so we lock each client
725 We ignore the LM78 BUSY flag at this moment - it could lead to deadlocks,
726 would slow down the LM78 access and should not be necessary. */
727 static int lm78_read_value(struct i2c_client *client, u8 reg)
730 if (!client->driver) { /* ISA device */
731 struct lm78_data *data = i2c_get_clientdata(client);
732 mutex_lock(&data->lock);
733 outb_p(reg, client->addr + LM78_ADDR_REG_OFFSET);
734 res = inb_p(client->addr + LM78_DATA_REG_OFFSET);
735 mutex_unlock(&data->lock);
738 return i2c_smbus_read_byte_data(client, reg);
741 /* The SMBus locks itself, but ISA access muse be locked explicitly!
742 We don't want to lock the whole ISA bus, so we lock each client
744 We ignore the LM78 BUSY flag at this moment - it could lead to deadlocks,
745 would slow down the LM78 access and should not be necessary.
746 There are some ugly typecasts here, but the good new is - they should
747 nowhere else be necessary! */
748 static int lm78_write_value(struct i2c_client *client, u8 reg, u8 value)
750 if (!client->driver) { /* ISA device */
751 struct lm78_data *data = i2c_get_clientdata(client);
752 mutex_lock(&data->lock);
753 outb_p(reg, client->addr + LM78_ADDR_REG_OFFSET);
754 outb_p(value, client->addr + LM78_DATA_REG_OFFSET);
755 mutex_unlock(&data->lock);
758 return i2c_smbus_write_byte_data(client, reg, value);
761 static void lm78_init_client(struct i2c_client *client)
763 struct lm78_data *data = i2c_get_clientdata(client);
767 /* Start monitoring */
768 config = lm78_read_value(client, LM78_REG_CONFIG);
769 if ((config & 0x09) != 0x01)
770 lm78_write_value(client, LM78_REG_CONFIG,
771 (config & 0xf7) | 0x01);
773 /* A few vars need to be filled upon startup */
774 for (i = 0; i < 3; i++) {
775 data->fan_min[i] = lm78_read_value(client,
776 LM78_REG_FAN_MIN(i));
779 mutex_init(&data->update_lock);
782 static struct lm78_data *lm78_update_device(struct device *dev)
784 struct lm78_data *data = dev_get_drvdata(dev);
785 struct i2c_client *client = &data->client;
788 mutex_lock(&data->update_lock);
790 if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
793 dev_dbg(dev, "Starting lm78 update\n");
795 for (i = 0; i <= 6; i++) {
797 lm78_read_value(client, LM78_REG_IN(i));
799 lm78_read_value(client, LM78_REG_IN_MIN(i));
801 lm78_read_value(client, LM78_REG_IN_MAX(i));
803 for (i = 0; i < 3; i++) {
805 lm78_read_value(client, LM78_REG_FAN(i));
807 lm78_read_value(client, LM78_REG_FAN_MIN(i));
809 data->temp = lm78_read_value(client, LM78_REG_TEMP);
811 lm78_read_value(client, LM78_REG_TEMP_OVER);
813 lm78_read_value(client, LM78_REG_TEMP_HYST);
814 i = lm78_read_value(client, LM78_REG_VID_FANDIV);
815 data->vid = i & 0x0f;
816 if (data->type == lm79)
818 (lm78_read_value(client, LM78_REG_CHIPID) &
822 data->fan_div[0] = (i >> 4) & 0x03;
823 data->fan_div[1] = i >> 6;
824 data->alarms = lm78_read_value(client, LM78_REG_ALARM1) +
825 (lm78_read_value(client, LM78_REG_ALARM2) << 8);
826 data->last_updated = jiffies;
829 data->fan_div[2] = 1;
832 mutex_unlock(&data->update_lock);
837 /* return 1 if a supported chip is found, 0 otherwise */
838 static int __init lm78_isa_found(unsigned short address)
840 int val, save, found = 0;
842 if (!request_region(address, LM78_EXTENT, "lm78"))
845 #define REALLY_SLOW_IO
846 /* We need the timeouts for at least some LM78-like
847 chips. But only if we read 'undefined' registers. */
848 val = inb_p(address + 1);
849 if (inb_p(address + 2) != val
850 || inb_p(address + 3) != val
851 || inb_p(address + 7) != val)
853 #undef REALLY_SLOW_IO
855 /* We should be able to change the 7 LSB of the address port. The
856 MSB (busy flag) should be clear initially, set after the write. */
857 save = inb_p(address + LM78_ADDR_REG_OFFSET);
861 outb_p(val, address + LM78_ADDR_REG_OFFSET);
862 if (inb_p(address + LM78_ADDR_REG_OFFSET) != (val | 0x80)) {
863 outb_p(save, address + LM78_ADDR_REG_OFFSET);
867 /* We found a device, now see if it could be an LM78 */
868 outb_p(LM78_REG_CONFIG, address + LM78_ADDR_REG_OFFSET);
869 val = inb_p(address + LM78_DATA_REG_OFFSET);
872 outb_p(LM78_REG_I2C_ADDR, address + LM78_ADDR_REG_OFFSET);
873 val = inb_p(address + LM78_DATA_REG_OFFSET);
874 if (val < 0x03 || val > 0x77) /* Not a valid I2C address */
877 /* The busy flag should be clear again */
878 if (inb_p(address + LM78_ADDR_REG_OFFSET) & 0x80)
881 /* Explicitly prevent the misdetection of Winbond chips */
882 outb_p(0x4f, address + LM78_ADDR_REG_OFFSET);
883 val = inb_p(address + LM78_DATA_REG_OFFSET);
884 if (val == 0xa3 || val == 0x5c)
887 /* Explicitly prevent the misdetection of ITE chips */
888 outb_p(0x58, address + LM78_ADDR_REG_OFFSET);
889 val = inb_p(address + LM78_DATA_REG_OFFSET);
893 /* Determine the chip type */
894 outb_p(LM78_REG_CHIPID, address + LM78_ADDR_REG_OFFSET);
895 val = inb_p(address + LM78_DATA_REG_OFFSET);
896 if (val == 0x00 /* LM78 */
897 || val == 0x40 /* LM78-J */
898 || (val & 0xfe) == 0xc0) /* LM79 */
902 pr_info("lm78: Found an %s chip at %#x\n",
903 val & 0x80 ? "LM79" : "LM78", (int)address);
906 release_region(address, LM78_EXTENT);
910 static int __init lm78_isa_device_add(unsigned short address)
912 struct resource res = {
914 .end = address + LM78_EXTENT,
916 .flags = IORESOURCE_IO,
920 pdev = platform_device_alloc("lm78", address);
923 printk(KERN_ERR "lm78: Device allocation failed\n");
927 err = platform_device_add_resources(pdev, &res, 1);
929 printk(KERN_ERR "lm78: Device resource addition failed "
931 goto exit_device_put;
934 err = platform_device_add(pdev);
936 printk(KERN_ERR "lm78: Device addition failed (%d)\n",
938 goto exit_device_put;
944 platform_device_put(pdev);
950 static int __init sm_lm78_init(void)
954 res = i2c_add_driver(&lm78_driver);
958 if (lm78_isa_found(isa_address)) {
959 res = platform_driver_register(&lm78_isa_driver);
961 goto exit_unreg_i2c_driver;
963 /* Sets global pdev as a side effect */
964 res = lm78_isa_device_add(isa_address);
966 goto exit_unreg_isa_driver;
971 exit_unreg_isa_driver:
972 platform_driver_unregister(&lm78_isa_driver);
973 exit_unreg_i2c_driver:
974 i2c_del_driver(&lm78_driver);
979 static void __exit sm_lm78_exit(void)
982 platform_device_unregister(pdev);
983 platform_driver_unregister(&lm78_isa_driver);
985 i2c_del_driver(&lm78_driver);
990 MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>");
991 MODULE_DESCRIPTION("LM78/LM79 driver");
992 MODULE_LICENSE("GPL");
994 module_init(sm_lm78_init);
995 module_exit(sm_lm78_exit);