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