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