Merge tag 'platform-drivers-x86-v6.7-1' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-block.git] / drivers / hwmon / sis5595.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * sis5595.c - Part of lm_sensors, Linux kernel modules
4  *             for hardware monitoring
5  *
6  * Copyright (C) 1998 - 2001 Frodo Looijaard <frodol@dds.nl>,
7  *                           Kyösti Mälkki <kmalkki@cc.hut.fi>, and
8  *                           Mark D. Studebaker <mdsxyz123@yahoo.com>
9  * Ported to Linux 2.6 by Aurelien Jarno <aurelien@aurel32.net> with
10  * the help of Jean Delvare <jdelvare@suse.de>
11  */
12
13 /*
14  * SiS southbridge has a LM78-like chip integrated on the same IC.
15  * This driver is a customized copy of lm78.c
16  *
17  * Supports following revisions:
18  *      Version         PCI ID          PCI Revision
19  *      1               1039/0008       AF or less
20  *      2               1039/0008       B0 or greater
21  *
22  *  Note: these chips contain a 0008 device which is incompatible with the
23  *       5595. We recognize these by the presence of the listed
24  *       "blacklist" PCI ID and refuse to load.
25  *
26  * NOT SUPPORTED        PCI ID          BLACKLIST PCI ID
27  *       540            0008            0540
28  *       550            0008            0550
29  *      5513            0008            5511
30  *      5581            0008            5597
31  *      5582            0008            5597
32  *      5597            0008            5597
33  *      5598            0008            5597/5598
34  *       630            0008            0630
35  *       645            0008            0645
36  *       730            0008            0730
37  *       735            0008            0735
38  */
39
40 #define DRIVER_NAME "sis5595"
41 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
42
43 #include <linux/module.h>
44 #include <linux/slab.h>
45 #include <linux/ioport.h>
46 #include <linux/pci.h>
47 #include <linux/platform_device.h>
48 #include <linux/hwmon.h>
49 #include <linux/hwmon-sysfs.h>
50 #include <linux/err.h>
51 #include <linux/init.h>
52 #include <linux/jiffies.h>
53 #include <linux/mutex.h>
54 #include <linux/sysfs.h>
55 #include <linux/acpi.h>
56 #include <linux/io.h>
57
58 /*
59  * If force_addr is set to anything different from 0, we forcibly enable
60  * the device at the given address.
61  */
62 static u16 force_addr;
63 module_param(force_addr, ushort, 0);
64 MODULE_PARM_DESC(force_addr,
65                  "Initialize the base address of the sensors");
66
67 static struct platform_device *pdev;
68
69 /* Many SIS5595 constants specified below */
70
71 /* Length of ISA address segment */
72 #define SIS5595_EXTENT 8
73 /* PCI Config Registers */
74 #define SIS5595_BASE_REG 0x68
75 #define SIS5595_PIN_REG 0x7A
76 #define SIS5595_ENABLE_REG 0x7B
77
78 /* Where are the ISA address/data registers relative to the base address */
79 #define SIS5595_ADDR_REG_OFFSET 5
80 #define SIS5595_DATA_REG_OFFSET 6
81
82 /* The SIS5595 registers */
83 #define SIS5595_REG_IN_MAX(nr) (0x2b + (nr) * 2)
84 #define SIS5595_REG_IN_MIN(nr) (0x2c + (nr) * 2)
85 #define SIS5595_REG_IN(nr) (0x20 + (nr))
86
87 #define SIS5595_REG_FAN_MIN(nr) (0x3b + (nr))
88 #define SIS5595_REG_FAN(nr) (0x28 + (nr))
89
90 /*
91  * On the first version of the chip, the temp registers are separate.
92  * On the second version,
93  * TEMP pin is shared with IN4, configured in PCI register 0x7A.
94  * The registers are the same as well.
95  * OVER and HYST are really MAX and MIN.
96  */
97
98 #define REV2MIN 0xb0
99 #define SIS5595_REG_TEMP        (((data->revision) >= REV2MIN) ? \
100                                         SIS5595_REG_IN(4) : 0x27)
101 #define SIS5595_REG_TEMP_OVER   (((data->revision) >= REV2MIN) ? \
102                                         SIS5595_REG_IN_MAX(4) : 0x39)
103 #define SIS5595_REG_TEMP_HYST   (((data->revision) >= REV2MIN) ? \
104                                         SIS5595_REG_IN_MIN(4) : 0x3a)
105
106 #define SIS5595_REG_CONFIG 0x40
107 #define SIS5595_REG_ALARM1 0x41
108 #define SIS5595_REG_ALARM2 0x42
109 #define SIS5595_REG_FANDIV 0x47
110
111 /*
112  * Conversions. Limit checking is only done on the TO_REG
113  * variants.
114  */
115
116 /*
117  * IN: mV, (0V to 4.08V)
118  * REG: 16mV/bit
119  */
120 static inline u8 IN_TO_REG(unsigned long val)
121 {
122         unsigned long nval = clamp_val(val, 0, 4080);
123         return (nval + 8) / 16;
124 }
125 #define IN_FROM_REG(val) ((val) *  16)
126
127 static inline u8 FAN_TO_REG(long rpm, int div)
128 {
129         if (rpm <= 0)
130                 return 255;
131         if (rpm > 1350000)
132                 return 1;
133         return clamp_val((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
134 }
135
136 static inline int FAN_FROM_REG(u8 val, int div)
137 {
138         return val == 0 ? -1 : val == 255 ? 0 : 1350000 / (val * div);
139 }
140
141 /*
142  * TEMP: mC (-54.12C to +157.53C)
143  * REG: 0.83C/bit + 52.12, two's complement
144  */
145 static inline int TEMP_FROM_REG(s8 val)
146 {
147         return val * 830 + 52120;
148 }
149 static inline s8 TEMP_TO_REG(long val)
150 {
151         int nval = clamp_val(val, -54120, 157530) ;
152         return nval < 0 ? (nval - 5212 - 415) / 830 : (nval - 5212 + 415) / 830;
153 }
154
155 /*
156  * FAN DIV: 1, 2, 4, or 8 (defaults to 2)
157  * REG: 0, 1, 2, or 3 (respectively) (defaults to 1)
158  */
159 static inline u8 DIV_TO_REG(int val)
160 {
161         return val == 8 ? 3 : val == 4 ? 2 : val == 1 ? 0 : 1;
162 }
163 #define DIV_FROM_REG(val) (1 << (val))
164
165 /*
166  * For each registered chip, we need to keep some data in memory.
167  * The structure is dynamically allocated.
168  */
169 struct sis5595_data {
170         unsigned short addr;
171         const char *name;
172         struct device *hwmon_dev;
173         struct mutex lock;
174
175         struct mutex update_lock;
176         bool valid;             /* true if following fields are valid */
177         unsigned long last_updated;     /* In jiffies */
178         char maxins;            /* == 3 if temp enabled, otherwise == 4 */
179         u8 revision;            /* Reg. value */
180
181         u8 in[5];               /* Register value */
182         u8 in_max[5];           /* Register value */
183         u8 in_min[5];           /* Register value */
184         u8 fan[2];              /* Register value */
185         u8 fan_min[2];          /* Register value */
186         s8 temp;                /* Register value */
187         s8 temp_over;           /* Register value */
188         s8 temp_hyst;           /* Register value */
189         u8 fan_div[2];          /* Register encoding, shifted right */
190         u16 alarms;             /* Register encoding, combined */
191 };
192
193 static struct pci_dev *s_bridge;        /* pointer to the (only) sis5595 */
194
195 /* ISA access must be locked explicitly. */
196 static int sis5595_read_value(struct sis5595_data *data, u8 reg)
197 {
198         int res;
199
200         mutex_lock(&data->lock);
201         outb_p(reg, data->addr + SIS5595_ADDR_REG_OFFSET);
202         res = inb_p(data->addr + SIS5595_DATA_REG_OFFSET);
203         mutex_unlock(&data->lock);
204         return res;
205 }
206
207 static void sis5595_write_value(struct sis5595_data *data, u8 reg, u8 value)
208 {
209         mutex_lock(&data->lock);
210         outb_p(reg, data->addr + SIS5595_ADDR_REG_OFFSET);
211         outb_p(value, data->addr + SIS5595_DATA_REG_OFFSET);
212         mutex_unlock(&data->lock);
213 }
214
215 static struct sis5595_data *sis5595_update_device(struct device *dev)
216 {
217         struct sis5595_data *data = dev_get_drvdata(dev);
218         int i;
219
220         mutex_lock(&data->update_lock);
221
222         if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
223             || !data->valid) {
224
225                 for (i = 0; i <= data->maxins; i++) {
226                         data->in[i] =
227                             sis5595_read_value(data, SIS5595_REG_IN(i));
228                         data->in_min[i] =
229                             sis5595_read_value(data,
230                                                SIS5595_REG_IN_MIN(i));
231                         data->in_max[i] =
232                             sis5595_read_value(data,
233                                                SIS5595_REG_IN_MAX(i));
234                 }
235                 for (i = 0; i < 2; i++) {
236                         data->fan[i] =
237                             sis5595_read_value(data, SIS5595_REG_FAN(i));
238                         data->fan_min[i] =
239                             sis5595_read_value(data,
240                                                SIS5595_REG_FAN_MIN(i));
241                 }
242                 if (data->maxins == 3) {
243                         data->temp =
244                             sis5595_read_value(data, SIS5595_REG_TEMP);
245                         data->temp_over =
246                             sis5595_read_value(data, SIS5595_REG_TEMP_OVER);
247                         data->temp_hyst =
248                             sis5595_read_value(data, SIS5595_REG_TEMP_HYST);
249                 }
250                 i = sis5595_read_value(data, SIS5595_REG_FANDIV);
251                 data->fan_div[0] = (i >> 4) & 0x03;
252                 data->fan_div[1] = i >> 6;
253                 data->alarms =
254                     sis5595_read_value(data, SIS5595_REG_ALARM1) |
255                     (sis5595_read_value(data, SIS5595_REG_ALARM2) << 8);
256                 data->last_updated = jiffies;
257                 data->valid = true;
258         }
259
260         mutex_unlock(&data->update_lock);
261
262         return data;
263 }
264
265 /* 4 Voltages */
266 static ssize_t in_show(struct device *dev, struct device_attribute *da,
267                        char *buf)
268 {
269         struct sis5595_data *data = sis5595_update_device(dev);
270         struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
271         int nr = attr->index;
272         return sprintf(buf, "%d\n", IN_FROM_REG(data->in[nr]));
273 }
274
275 static ssize_t in_min_show(struct device *dev, struct device_attribute *da,
276                            char *buf)
277 {
278         struct sis5595_data *data = sis5595_update_device(dev);
279         struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
280         int nr = attr->index;
281         return sprintf(buf, "%d\n", IN_FROM_REG(data->in_min[nr]));
282 }
283
284 static ssize_t in_max_show(struct device *dev, struct device_attribute *da,
285                            char *buf)
286 {
287         struct sis5595_data *data = sis5595_update_device(dev);
288         struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
289         int nr = attr->index;
290         return sprintf(buf, "%d\n", IN_FROM_REG(data->in_max[nr]));
291 }
292
293 static ssize_t in_min_store(struct device *dev, struct device_attribute *da,
294                             const char *buf, size_t count)
295 {
296         struct sis5595_data *data = dev_get_drvdata(dev);
297         struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
298         int nr = attr->index;
299         unsigned long val;
300         int err;
301
302         err = kstrtoul(buf, 10, &val);
303         if (err)
304                 return err;
305
306         mutex_lock(&data->update_lock);
307         data->in_min[nr] = IN_TO_REG(val);
308         sis5595_write_value(data, SIS5595_REG_IN_MIN(nr), data->in_min[nr]);
309         mutex_unlock(&data->update_lock);
310         return count;
311 }
312
313 static ssize_t in_max_store(struct device *dev, struct device_attribute *da,
314                             const char *buf, size_t count)
315 {
316         struct sis5595_data *data = dev_get_drvdata(dev);
317         struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
318         int nr = attr->index;
319         unsigned long val;
320         int err;
321
322         err = kstrtoul(buf, 10, &val);
323         if (err)
324                 return err;
325
326         mutex_lock(&data->update_lock);
327         data->in_max[nr] = IN_TO_REG(val);
328         sis5595_write_value(data, SIS5595_REG_IN_MAX(nr), data->in_max[nr]);
329         mutex_unlock(&data->update_lock);
330         return count;
331 }
332
333 static SENSOR_DEVICE_ATTR_RO(in0_input, in, 0);
334 static SENSOR_DEVICE_ATTR_RW(in0_min, in_min, 0);
335 static SENSOR_DEVICE_ATTR_RW(in0_max, in_max, 0);
336 static SENSOR_DEVICE_ATTR_RO(in1_input, in, 1);
337 static SENSOR_DEVICE_ATTR_RW(in1_min, in_min, 1);
338 static SENSOR_DEVICE_ATTR_RW(in1_max, in_max, 1);
339 static SENSOR_DEVICE_ATTR_RO(in2_input, in, 2);
340 static SENSOR_DEVICE_ATTR_RW(in2_min, in_min, 2);
341 static SENSOR_DEVICE_ATTR_RW(in2_max, in_max, 2);
342 static SENSOR_DEVICE_ATTR_RO(in3_input, in, 3);
343 static SENSOR_DEVICE_ATTR_RW(in3_min, in_min, 3);
344 static SENSOR_DEVICE_ATTR_RW(in3_max, in_max, 3);
345 static SENSOR_DEVICE_ATTR_RO(in4_input, in, 4);
346 static SENSOR_DEVICE_ATTR_RW(in4_min, in_min, 4);
347 static SENSOR_DEVICE_ATTR_RW(in4_max, in_max, 4);
348
349 /* Temperature */
350 static ssize_t temp1_input_show(struct device *dev,
351                                 struct device_attribute *attr, char *buf)
352 {
353         struct sis5595_data *data = sis5595_update_device(dev);
354         return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp));
355 }
356
357 static ssize_t temp1_max_show(struct device *dev, struct device_attribute *attr,
358                               char *buf)
359 {
360         struct sis5595_data *data = sis5595_update_device(dev);
361         return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_over));
362 }
363
364 static ssize_t temp1_max_store(struct device *dev,
365                                struct device_attribute *attr, const char *buf,
366                                size_t count)
367 {
368         struct sis5595_data *data = dev_get_drvdata(dev);
369         long val;
370         int err;
371
372         err = kstrtol(buf, 10, &val);
373         if (err)
374                 return err;
375
376         mutex_lock(&data->update_lock);
377         data->temp_over = TEMP_TO_REG(val);
378         sis5595_write_value(data, SIS5595_REG_TEMP_OVER, data->temp_over);
379         mutex_unlock(&data->update_lock);
380         return count;
381 }
382
383 static ssize_t temp1_max_hyst_show(struct device *dev,
384                                    struct device_attribute *attr, char *buf)
385 {
386         struct sis5595_data *data = sis5595_update_device(dev);
387         return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_hyst));
388 }
389
390 static ssize_t temp1_max_hyst_store(struct device *dev,
391                                     struct device_attribute *attr,
392                                     const char *buf, size_t count)
393 {
394         struct sis5595_data *data = dev_get_drvdata(dev);
395         long val;
396         int err;
397
398         err = kstrtol(buf, 10, &val);
399         if (err)
400                 return err;
401
402         mutex_lock(&data->update_lock);
403         data->temp_hyst = TEMP_TO_REG(val);
404         sis5595_write_value(data, SIS5595_REG_TEMP_HYST, data->temp_hyst);
405         mutex_unlock(&data->update_lock);
406         return count;
407 }
408
409 static DEVICE_ATTR_RO(temp1_input);
410 static DEVICE_ATTR_RW(temp1_max);
411 static DEVICE_ATTR_RW(temp1_max_hyst);
412
413 /* 2 Fans */
414 static ssize_t fan_show(struct device *dev, struct device_attribute *da,
415                         char *buf)
416 {
417         struct sis5595_data *data = sis5595_update_device(dev);
418         struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
419         int nr = attr->index;
420         return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[nr],
421                 DIV_FROM_REG(data->fan_div[nr])));
422 }
423
424 static ssize_t fan_min_show(struct device *dev, struct device_attribute *da,
425                             char *buf)
426 {
427         struct sis5595_data *data = sis5595_update_device(dev);
428         struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
429         int nr = attr->index;
430         return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan_min[nr],
431                 DIV_FROM_REG(data->fan_div[nr])));
432 }
433
434 static ssize_t fan_min_store(struct device *dev, struct device_attribute *da,
435                              const char *buf, size_t count)
436 {
437         struct sis5595_data *data = dev_get_drvdata(dev);
438         struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
439         int nr = attr->index;
440         unsigned long val;
441         int err;
442
443         err = kstrtoul(buf, 10, &val);
444         if (err)
445                 return err;
446
447         mutex_lock(&data->update_lock);
448         data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
449         sis5595_write_value(data, SIS5595_REG_FAN_MIN(nr), data->fan_min[nr]);
450         mutex_unlock(&data->update_lock);
451         return count;
452 }
453
454 static ssize_t fan_div_show(struct device *dev, struct device_attribute *da,
455                             char *buf)
456 {
457         struct sis5595_data *data = sis5595_update_device(dev);
458         struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
459         int nr = attr->index;
460         return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[nr]));
461 }
462
463 /*
464  * Note: we save and restore the fan minimum here, because its value is
465  * determined in part by the fan divisor.  This follows the principle of
466  * least surprise; the user doesn't expect the fan minimum to change just
467  * because the divisor changed.
468  */
469 static ssize_t fan_div_store(struct device *dev, struct device_attribute *da,
470                              const char *buf, size_t count)
471 {
472         struct sis5595_data *data = dev_get_drvdata(dev);
473         struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
474         int nr = attr->index;
475         unsigned long min;
476         int reg;
477         unsigned long val;
478         int err;
479
480         err = kstrtoul(buf, 10, &val);
481         if (err)
482                 return err;
483
484         mutex_lock(&data->update_lock);
485         min = FAN_FROM_REG(data->fan_min[nr],
486                         DIV_FROM_REG(data->fan_div[nr]));
487         reg = sis5595_read_value(data, SIS5595_REG_FANDIV);
488
489         switch (val) {
490         case 1:
491                 data->fan_div[nr] = 0;
492                 break;
493         case 2:
494                 data->fan_div[nr] = 1;
495                 break;
496         case 4:
497                 data->fan_div[nr] = 2;
498                 break;
499         case 8:
500                 data->fan_div[nr] = 3;
501                 break;
502         default:
503                 dev_err(dev,
504                         "fan_div value %ld not supported. Choose one of 1, 2, 4 or 8!\n",
505                         val);
506                 mutex_unlock(&data->update_lock);
507                 return -EINVAL;
508         }
509
510         switch (nr) {
511         case 0:
512                 reg = (reg & 0xcf) | (data->fan_div[nr] << 4);
513                 break;
514         case 1:
515                 reg = (reg & 0x3f) | (data->fan_div[nr] << 6);
516                 break;
517         }
518         sis5595_write_value(data, SIS5595_REG_FANDIV, reg);
519         data->fan_min[nr] =
520                 FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
521         sis5595_write_value(data, SIS5595_REG_FAN_MIN(nr), data->fan_min[nr]);
522         mutex_unlock(&data->update_lock);
523         return count;
524 }
525
526 static SENSOR_DEVICE_ATTR_RO(fan1_input, fan, 0);
527 static SENSOR_DEVICE_ATTR_RW(fan1_min, fan_min, 0);
528 static SENSOR_DEVICE_ATTR_RW(fan1_div, fan_div, 0);
529 static SENSOR_DEVICE_ATTR_RO(fan2_input, fan, 1);
530 static SENSOR_DEVICE_ATTR_RW(fan2_min, fan_min, 1);
531 static SENSOR_DEVICE_ATTR_RW(fan2_div, fan_div, 1);
532
533 /* Alarms */
534 static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
535                            char *buf)
536 {
537         struct sis5595_data *data = sis5595_update_device(dev);
538         return sprintf(buf, "%d\n", data->alarms);
539 }
540 static DEVICE_ATTR_RO(alarms);
541
542 static ssize_t alarm_show(struct device *dev, struct device_attribute *da,
543                           char *buf)
544 {
545         struct sis5595_data *data = sis5595_update_device(dev);
546         int nr = to_sensor_dev_attr(da)->index;
547         return sprintf(buf, "%u\n", (data->alarms >> nr) & 1);
548 }
549 static SENSOR_DEVICE_ATTR_RO(in0_alarm, alarm, 0);
550 static SENSOR_DEVICE_ATTR_RO(in1_alarm, alarm, 1);
551 static SENSOR_DEVICE_ATTR_RO(in2_alarm, alarm, 2);
552 static SENSOR_DEVICE_ATTR_RO(in3_alarm, alarm, 3);
553 static SENSOR_DEVICE_ATTR_RO(in4_alarm, alarm, 15);
554 static SENSOR_DEVICE_ATTR_RO(fan1_alarm, alarm, 6);
555 static SENSOR_DEVICE_ATTR_RO(fan2_alarm, alarm, 7);
556 static SENSOR_DEVICE_ATTR_RO(temp1_alarm, alarm, 15);
557
558 static ssize_t name_show(struct device *dev, struct device_attribute *attr,
559                          char *buf)
560 {
561         struct sis5595_data *data = dev_get_drvdata(dev);
562         return sprintf(buf, "%s\n", data->name);
563 }
564 static DEVICE_ATTR_RO(name);
565
566 static struct attribute *sis5595_attributes[] = {
567         &sensor_dev_attr_in0_input.dev_attr.attr,
568         &sensor_dev_attr_in0_min.dev_attr.attr,
569         &sensor_dev_attr_in0_max.dev_attr.attr,
570         &sensor_dev_attr_in0_alarm.dev_attr.attr,
571         &sensor_dev_attr_in1_input.dev_attr.attr,
572         &sensor_dev_attr_in1_min.dev_attr.attr,
573         &sensor_dev_attr_in1_max.dev_attr.attr,
574         &sensor_dev_attr_in1_alarm.dev_attr.attr,
575         &sensor_dev_attr_in2_input.dev_attr.attr,
576         &sensor_dev_attr_in2_min.dev_attr.attr,
577         &sensor_dev_attr_in2_max.dev_attr.attr,
578         &sensor_dev_attr_in2_alarm.dev_attr.attr,
579         &sensor_dev_attr_in3_input.dev_attr.attr,
580         &sensor_dev_attr_in3_min.dev_attr.attr,
581         &sensor_dev_attr_in3_max.dev_attr.attr,
582         &sensor_dev_attr_in3_alarm.dev_attr.attr,
583
584         &sensor_dev_attr_fan1_input.dev_attr.attr,
585         &sensor_dev_attr_fan1_min.dev_attr.attr,
586         &sensor_dev_attr_fan1_div.dev_attr.attr,
587         &sensor_dev_attr_fan1_alarm.dev_attr.attr,
588         &sensor_dev_attr_fan2_input.dev_attr.attr,
589         &sensor_dev_attr_fan2_min.dev_attr.attr,
590         &sensor_dev_attr_fan2_div.dev_attr.attr,
591         &sensor_dev_attr_fan2_alarm.dev_attr.attr,
592
593         &dev_attr_alarms.attr,
594         &dev_attr_name.attr,
595         NULL
596 };
597
598 static const struct attribute_group sis5595_group = {
599         .attrs = sis5595_attributes,
600 };
601
602 static struct attribute *sis5595_attributes_in4[] = {
603         &sensor_dev_attr_in4_input.dev_attr.attr,
604         &sensor_dev_attr_in4_min.dev_attr.attr,
605         &sensor_dev_attr_in4_max.dev_attr.attr,
606         &sensor_dev_attr_in4_alarm.dev_attr.attr,
607         NULL
608 };
609
610 static const struct attribute_group sis5595_group_in4 = {
611         .attrs = sis5595_attributes_in4,
612 };
613
614 static struct attribute *sis5595_attributes_temp1[] = {
615         &dev_attr_temp1_input.attr,
616         &dev_attr_temp1_max.attr,
617         &dev_attr_temp1_max_hyst.attr,
618         &sensor_dev_attr_temp1_alarm.dev_attr.attr,
619         NULL
620 };
621
622 static const struct attribute_group sis5595_group_temp1 = {
623         .attrs = sis5595_attributes_temp1,
624 };
625
626 /* Called when we have found a new SIS5595. */
627 static void sis5595_init_device(struct sis5595_data *data)
628 {
629         u8 config = sis5595_read_value(data, SIS5595_REG_CONFIG);
630         if (!(config & 0x01))
631                 sis5595_write_value(data, SIS5595_REG_CONFIG,
632                                 (config & 0xf7) | 0x01);
633 }
634
635 /* This is called when the module is loaded */
636 static int sis5595_probe(struct platform_device *pdev)
637 {
638         int err = 0;
639         int i;
640         struct sis5595_data *data;
641         struct resource *res;
642         char val;
643
644         /* Reserve the ISA region */
645         res = platform_get_resource(pdev, IORESOURCE_IO, 0);
646         if (!devm_request_region(&pdev->dev, res->start, SIS5595_EXTENT,
647                                  DRIVER_NAME))
648                 return -EBUSY;
649
650         data = devm_kzalloc(&pdev->dev, sizeof(struct sis5595_data),
651                             GFP_KERNEL);
652         if (!data)
653                 return -ENOMEM;
654
655         mutex_init(&data->lock);
656         mutex_init(&data->update_lock);
657         data->addr = res->start;
658         data->name = DRIVER_NAME;
659         platform_set_drvdata(pdev, data);
660
661         /*
662          * Check revision and pin registers to determine whether 4 or 5 voltages
663          */
664         data->revision = s_bridge->revision;
665         /* 4 voltages, 1 temp */
666         data->maxins = 3;
667         if (data->revision >= REV2MIN) {
668                 pci_read_config_byte(s_bridge, SIS5595_PIN_REG, &val);
669                 if (!(val & 0x80))
670                         /* 5 voltages, no temps */
671                         data->maxins = 4;
672         }
673
674         /* Initialize the SIS5595 chip */
675         sis5595_init_device(data);
676
677         /* A few vars need to be filled upon startup */
678         for (i = 0; i < 2; i++) {
679                 data->fan_min[i] = sis5595_read_value(data,
680                                         SIS5595_REG_FAN_MIN(i));
681         }
682
683         /* Register sysfs hooks */
684         err = sysfs_create_group(&pdev->dev.kobj, &sis5595_group);
685         if (err)
686                 return err;
687         if (data->maxins == 4) {
688                 err = sysfs_create_group(&pdev->dev.kobj, &sis5595_group_in4);
689                 if (err)
690                         goto exit_remove_files;
691         } else {
692                 err = sysfs_create_group(&pdev->dev.kobj, &sis5595_group_temp1);
693                 if (err)
694                         goto exit_remove_files;
695         }
696
697         data->hwmon_dev = hwmon_device_register(&pdev->dev);
698         if (IS_ERR(data->hwmon_dev)) {
699                 err = PTR_ERR(data->hwmon_dev);
700                 goto exit_remove_files;
701         }
702
703         return 0;
704
705 exit_remove_files:
706         sysfs_remove_group(&pdev->dev.kobj, &sis5595_group);
707         sysfs_remove_group(&pdev->dev.kobj, &sis5595_group_in4);
708         sysfs_remove_group(&pdev->dev.kobj, &sis5595_group_temp1);
709         return err;
710 }
711
712 static void sis5595_remove(struct platform_device *pdev)
713 {
714         struct sis5595_data *data = platform_get_drvdata(pdev);
715
716         hwmon_device_unregister(data->hwmon_dev);
717         sysfs_remove_group(&pdev->dev.kobj, &sis5595_group);
718         sysfs_remove_group(&pdev->dev.kobj, &sis5595_group_in4);
719         sysfs_remove_group(&pdev->dev.kobj, &sis5595_group_temp1);
720 }
721
722 static const struct pci_device_id sis5595_pci_ids[] = {
723         { PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_503) },
724         { 0, }
725 };
726
727 MODULE_DEVICE_TABLE(pci, sis5595_pci_ids);
728
729 static int blacklist[] = {
730         PCI_DEVICE_ID_SI_540,
731         PCI_DEVICE_ID_SI_550,
732         PCI_DEVICE_ID_SI_630,
733         PCI_DEVICE_ID_SI_645,
734         PCI_DEVICE_ID_SI_730,
735         PCI_DEVICE_ID_SI_735,
736         PCI_DEVICE_ID_SI_5511, /*
737                                 * 5513 chip has the 0008 device but
738                                 * that ID shows up in other chips so we
739                                 * use the 5511 ID for recognition
740                                 */
741         PCI_DEVICE_ID_SI_5597,
742         PCI_DEVICE_ID_SI_5598,
743         0 };
744
745 static int sis5595_device_add(unsigned short address)
746 {
747         struct resource res = {
748                 .start  = address,
749                 .end    = address + SIS5595_EXTENT - 1,
750                 .name   = DRIVER_NAME,
751                 .flags  = IORESOURCE_IO,
752         };
753         int err;
754
755         err = acpi_check_resource_conflict(&res);
756         if (err)
757                 goto exit;
758
759         pdev = platform_device_alloc(DRIVER_NAME, address);
760         if (!pdev) {
761                 err = -ENOMEM;
762                 pr_err("Device allocation failed\n");
763                 goto exit;
764         }
765
766         err = platform_device_add_resources(pdev, &res, 1);
767         if (err) {
768                 pr_err("Device resource addition failed (%d)\n", err);
769                 goto exit_device_put;
770         }
771
772         err = platform_device_add(pdev);
773         if (err) {
774                 pr_err("Device addition failed (%d)\n", err);
775                 goto exit_device_put;
776         }
777
778         return 0;
779
780 exit_device_put:
781         platform_device_put(pdev);
782 exit:
783         return err;
784 }
785
786 static struct platform_driver sis5595_driver = {
787         .driver = {
788                 .name   = DRIVER_NAME,
789         },
790         .probe          = sis5595_probe,
791         .remove_new     = sis5595_remove,
792 };
793
794 static int sis5595_pci_probe(struct pci_dev *dev,
795                                        const struct pci_device_id *id)
796 {
797         u16 address;
798         u8 enable;
799         int *i, err;
800
801         for (i = blacklist; *i != 0; i++) {
802                 struct pci_dev *d;
803                 d = pci_get_device(PCI_VENDOR_ID_SI, *i, NULL);
804                 if (d) {
805                         dev_err(&d->dev,
806                                 "Looked for SIS5595 but found unsupported device %.4x\n",
807                                 *i);
808                         pci_dev_put(d);
809                         return -ENODEV;
810                 }
811         }
812
813         force_addr &= ~(SIS5595_EXTENT - 1);
814         if (force_addr) {
815                 dev_warn(&dev->dev, "Forcing ISA address 0x%x\n", force_addr);
816                 pci_write_config_word(dev, SIS5595_BASE_REG, force_addr);
817         }
818
819         err = pci_read_config_word(dev, SIS5595_BASE_REG, &address);
820         if (err != PCIBIOS_SUCCESSFUL) {
821                 dev_err(&dev->dev, "Failed to read ISA address\n");
822                 return -ENODEV;
823         }
824
825         address &= ~(SIS5595_EXTENT - 1);
826         if (!address) {
827                 dev_err(&dev->dev,
828                         "Base address not set - upgrade BIOS or use force_addr=0xaddr\n");
829                 return -ENODEV;
830         }
831         if (force_addr && address != force_addr) {
832                 /* doesn't work for some chips? */
833                 dev_err(&dev->dev, "Failed to force ISA address\n");
834                 return -ENODEV;
835         }
836
837         err = pci_read_config_byte(dev, SIS5595_ENABLE_REG, &enable);
838         if (err != PCIBIOS_SUCCESSFUL) {
839                 dev_err(&dev->dev, "Failed to read enable register\n");
840                 return -ENODEV;
841         }
842         if (!(enable & 0x80)) {
843                 err = pci_write_config_byte(dev, SIS5595_ENABLE_REG, enable | 0x80);
844                 if (err != PCIBIOS_SUCCESSFUL)
845                         goto enable_fail;
846
847                 err = pci_read_config_byte(dev, SIS5595_ENABLE_REG, &enable);
848                 if (err != PCIBIOS_SUCCESSFUL)
849                         goto enable_fail;
850
851                 /* doesn't work for some chips! */
852                 if (!(enable & 0x80))
853                         goto enable_fail;
854         }
855
856         if (platform_driver_register(&sis5595_driver)) {
857                 dev_dbg(&dev->dev, "Failed to register sis5595 driver\n");
858                 goto exit;
859         }
860
861         s_bridge = pci_dev_get(dev);
862         /* Sets global pdev as a side effect */
863         if (sis5595_device_add(address))
864                 goto exit_unregister;
865
866         /*
867          * Always return failure here.  This is to allow other drivers to bind
868          * to this pci device.  We don't really want to have control over the
869          * pci device, we only wanted to read as few register values from it.
870          */
871         return -ENODEV;
872
873 enable_fail:
874         dev_err(&dev->dev, "Failed to enable HWM device\n");
875         goto exit;
876
877 exit_unregister:
878         pci_dev_put(dev);
879         platform_driver_unregister(&sis5595_driver);
880 exit:
881         return -ENODEV;
882 }
883
884 static struct pci_driver sis5595_pci_driver = {
885         .name            = DRIVER_NAME,
886         .id_table        = sis5595_pci_ids,
887         .probe           = sis5595_pci_probe,
888 };
889
890 static int __init sm_sis5595_init(void)
891 {
892         return pci_register_driver(&sis5595_pci_driver);
893 }
894
895 static void __exit sm_sis5595_exit(void)
896 {
897         pci_unregister_driver(&sis5595_pci_driver);
898         if (s_bridge != NULL) {
899                 platform_device_unregister(pdev);
900                 platform_driver_unregister(&sis5595_driver);
901                 pci_dev_put(s_bridge);
902                 s_bridge = NULL;
903         }
904 }
905
906 MODULE_AUTHOR("Aurelien Jarno <aurelien@aurel32.net>");
907 MODULE_DESCRIPTION("SiS 5595 Sensor device");
908 MODULE_LICENSE("GPL");
909
910 module_init(sm_sis5595_init);
911 module_exit(sm_sis5595_exit);