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