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