1 /***************************************************************************
2 * Copyright (C) 2010-2011 Hans de Goede <hdegoede@redhat.com> *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
18 ***************************************************************************/
20 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
22 #include <linux/module.h>
23 #include <linux/init.h>
24 #include <linux/slab.h>
25 #include <linux/jiffies.h>
26 #include <linux/platform_device.h>
27 #include <linux/hwmon.h>
28 #include <linux/hwmon-sysfs.h>
29 #include <linux/err.h>
30 #include <linux/mutex.h>
32 #include <linux/acpi.h>
33 #include <linux/delay.h>
35 #define DRVNAME "sch5627"
36 #define DEVNAME DRVNAME /* We only support one model */
38 #define SIO_SCH5627_EM_LD 0x0C /* Embedded Microcontroller LD */
39 #define SIO_UNLOCK_KEY 0x55 /* Key to enable Super-I/O */
40 #define SIO_LOCK_KEY 0xAA /* Key to disable Super-I/O */
42 #define SIO_REG_LDSEL 0x07 /* Logical device select */
43 #define SIO_REG_DEVID 0x20 /* Device ID */
44 #define SIO_REG_ENABLE 0x30 /* Logical device enable */
45 #define SIO_REG_ADDR 0x66 /* Logical device address (2 bytes) */
47 #define SIO_SCH5627_ID 0xC6 /* Chipset ID */
49 #define REGION_LENGTH 9
51 #define SCH5627_HWMON_ID 0xa5
52 #define SCH5627_COMPANY_ID 0x5c
53 #define SCH5627_PRIMARY_ID 0xa0
55 #define SCH5627_REG_BUILD_CODE 0x39
56 #define SCH5627_REG_BUILD_ID 0x3a
57 #define SCH5627_REG_HWMON_ID 0x3c
58 #define SCH5627_REG_HWMON_REV 0x3d
59 #define SCH5627_REG_COMPANY_ID 0x3e
60 #define SCH5627_REG_PRIMARY_ID 0x3f
61 #define SCH5627_REG_CTRL 0x40
63 #define SCH5627_NO_TEMPS 8
64 #define SCH5627_NO_FANS 4
65 #define SCH5627_NO_IN 5
67 static const u16 SCH5627_REG_TEMP_MSB
[SCH5627_NO_TEMPS
] = {
68 0x2B, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x180, 0x181 };
69 static const u16 SCH5627_REG_TEMP_LSN
[SCH5627_NO_TEMPS
] = {
70 0xE2, 0xE1, 0xE1, 0xE5, 0xE5, 0xE6, 0x182, 0x182 };
71 static const u16 SCH5627_REG_TEMP_HIGH_NIBBLE
[SCH5627_NO_TEMPS
] = {
72 0, 0, 1, 1, 0, 0, 0, 1 };
73 static const u16 SCH5627_REG_TEMP_HIGH
[SCH5627_NO_TEMPS
] = {
74 0x61, 0x57, 0x59, 0x5B, 0x5D, 0x5F, 0x184, 0x186 };
75 static const u16 SCH5627_REG_TEMP_ABS
[SCH5627_NO_TEMPS
] = {
76 0x9B, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x1A8, 0x1A9 };
78 static const u16 SCH5627_REG_FAN
[SCH5627_NO_FANS
] = {
79 0x2C, 0x2E, 0x30, 0x32 };
80 static const u16 SCH5627_REG_FAN_MIN
[SCH5627_NO_FANS
] = {
81 0x62, 0x64, 0x66, 0x68 };
83 static const u16 SCH5627_REG_IN_MSB
[SCH5627_NO_IN
] = {
84 0x22, 0x23, 0x24, 0x25, 0x189 };
85 static const u16 SCH5627_REG_IN_LSN
[SCH5627_NO_IN
] = {
86 0xE4, 0xE4, 0xE3, 0xE3, 0x18A };
87 static const u16 SCH5627_REG_IN_HIGH_NIBBLE
[SCH5627_NO_IN
] = {
89 static const u16 SCH5627_REG_IN_FACTOR
[SCH5627_NO_IN
] = {
90 10745, 3660, 9765, 10745, 3660 };
91 static const char * const SCH5627_IN_LABELS
[SCH5627_NO_IN
] = {
92 "VCC", "VTT", "VBAT", "VTR", "V_IN" };
96 struct device
*hwmon_dev
;
97 u8 temp_max
[SCH5627_NO_TEMPS
];
98 u8 temp_crit
[SCH5627_NO_TEMPS
];
99 u16 fan_min
[SCH5627_NO_FANS
];
101 struct mutex update_lock
;
102 char valid
; /* !=0 if following fields are valid */
103 unsigned long last_updated
; /* In jiffies */
104 u16 temp
[SCH5627_NO_TEMPS
];
105 u16 fan
[SCH5627_NO_FANS
];
106 u16 in
[SCH5627_NO_IN
];
109 static struct platform_device
*sch5627_pdev
;
111 /* Super I/O functions */
112 static inline int superio_inb(int base
, int reg
)
115 return inb(base
+ 1);
118 static inline int superio_enter(int base
)
120 /* Don't step on other drivers' I/O space by accident */
121 if (!request_muxed_region(base
, 2, DRVNAME
)) {
122 pr_err("I/O address 0x%04x already in use\n", base
);
126 outb(SIO_UNLOCK_KEY
, base
);
131 static inline void superio_select(int base
, int ld
)
133 outb(SIO_REG_LDSEL
, base
);
137 static inline void superio_exit(int base
)
139 outb(SIO_LOCK_KEY
, base
);
140 release_region(base
, 2);
143 static int sch5627_read_virtual_reg(struct sch5627_data
*data
, u16 reg
)
148 * According to SMSC for the commands we use the maximum time for
149 * the EM to respond is 15 ms, but testing shows in practice it
150 * responds within 15-32 reads, so we first busy poll, and if
151 * that fails sleep a bit and try again until we are way past
152 * the 15 ms maximum response time.
154 const int max_busy_polls
= 64;
155 const int max_lazy_polls
= 32;
157 /* (Optional) Write-Clear the EC to Host Mailbox Register */
158 val
= inb(data
->addr
+ 1);
159 outb(val
, data
->addr
+ 1);
161 /* Set Mailbox Address Pointer to first location in Region 1 */
162 outb(0x00, data
->addr
+ 2);
163 outb(0x80, data
->addr
+ 3);
165 /* Write Request Packet Header */
166 outb(0x02, data
->addr
+ 4); /* Access Type: VREG read */
167 outb(0x01, data
->addr
+ 5); /* # of Entries: 1 Byte (8-bit) */
168 outb(0x04, data
->addr
+ 2); /* Mailbox AP to first data entry loc. */
170 /* Write Address field */
171 outb(reg
& 0xff, data
->addr
+ 6);
172 outb(reg
>> 8, data
->addr
+ 7);
174 /* Execute the Random Access Command */
175 outb(0x01, data
->addr
); /* Write 01h to the Host-to-EC register */
177 /* EM Interface Polling "Algorithm" */
178 for (i
= 0; i
< max_busy_polls
+ max_lazy_polls
; i
++) {
179 if (i
>= max_busy_polls
)
181 /* Read Interrupt source Register */
182 val
= inb(data
->addr
+ 8);
183 /* Write Clear the interrupt source bits */
185 outb(val
, data
->addr
+ 8);
186 /* Command Completed ? */
190 if (i
== max_busy_polls
+ max_lazy_polls
) {
191 pr_err("Max retries exceeded reading virtual "
192 "register 0x%04hx (%d)\n", reg
, 1);
197 * According to SMSC we may need to retry this, but sofar I've always
198 * seen this succeed in 1 try.
200 for (i
= 0; i
< max_busy_polls
; i
++) {
201 /* Read EC-to-Host Register */
202 val
= inb(data
->addr
+ 1);
203 /* Command Completed ? */
208 pr_warn("EC reports: 0x%02x reading virtual register "
209 "0x%04hx\n", (unsigned int)val
, reg
);
211 if (i
== max_busy_polls
) {
212 pr_err("Max retries exceeded reading virtual "
213 "register 0x%04hx (%d)\n", reg
, 2);
218 * According to the SMSC app note we should now do:
220 * Set Mailbox Address Pointer to first location in Region 1 *
221 * outb(0x00, data->addr + 2);
222 * outb(0x80, data->addr + 3);
224 * But if we do that things don't work, so let's not.
227 /* Read Data from Mailbox */
228 return inb(data
->addr
+ 4);
231 static int sch5627_read_virtual_reg16(struct sch5627_data
*data
, u16 reg
)
235 /* Read LSB first, this will cause the matching MSB to be latched */
236 lsb
= sch5627_read_virtual_reg(data
, reg
);
240 msb
= sch5627_read_virtual_reg(data
, reg
+ 1);
244 return lsb
| (msb
<< 8);
247 static int sch5627_read_virtual_reg12(struct sch5627_data
*data
, u16 msb_reg
,
248 u16 lsn_reg
, int high_nibble
)
252 /* Read MSB first, this will cause the matching LSN to be latched */
253 msb
= sch5627_read_virtual_reg(data
, msb_reg
);
257 lsn
= sch5627_read_virtual_reg(data
, lsn_reg
);
262 return (msb
<< 4) | (lsn
>> 4);
264 return (msb
<< 4) | (lsn
& 0x0f);
267 static struct sch5627_data
*sch5627_update_device(struct device
*dev
)
269 struct sch5627_data
*data
= dev_get_drvdata(dev
);
270 struct sch5627_data
*ret
= data
;
273 mutex_lock(&data
->update_lock
);
275 /* Cache the values for 1 second */
276 if (time_after(jiffies
, data
->last_updated
+ HZ
) || !data
->valid
) {
277 for (i
= 0; i
< SCH5627_NO_TEMPS
; i
++) {
278 val
= sch5627_read_virtual_reg12(data
,
279 SCH5627_REG_TEMP_MSB
[i
],
280 SCH5627_REG_TEMP_LSN
[i
],
281 SCH5627_REG_TEMP_HIGH_NIBBLE
[i
]);
282 if (unlikely(val
< 0)) {
289 for (i
= 0; i
< SCH5627_NO_FANS
; i
++) {
290 val
= sch5627_read_virtual_reg16(data
,
292 if (unlikely(val
< 0)) {
299 for (i
= 0; i
< SCH5627_NO_IN
; i
++) {
300 val
= sch5627_read_virtual_reg12(data
,
301 SCH5627_REG_IN_MSB
[i
],
302 SCH5627_REG_IN_LSN
[i
],
303 SCH5627_REG_IN_HIGH_NIBBLE
[i
]);
304 if (unlikely(val
< 0)) {
311 data
->last_updated
= jiffies
;
315 mutex_unlock(&data
->update_lock
);
319 static int __devinit
sch5627_read_limits(struct sch5627_data
*data
)
323 for (i
= 0; i
< SCH5627_NO_TEMPS
; i
++) {
325 * Note what SMSC calls ABS, is what lm_sensors calls max
326 * (aka high), and HIGH is what lm_sensors calls crit.
328 val
= sch5627_read_virtual_reg(data
, SCH5627_REG_TEMP_ABS
[i
]);
331 data
->temp_max
[i
] = val
;
333 val
= sch5627_read_virtual_reg(data
, SCH5627_REG_TEMP_HIGH
[i
]);
336 data
->temp_crit
[i
] = val
;
338 for (i
= 0; i
< SCH5627_NO_FANS
; i
++) {
339 val
= sch5627_read_virtual_reg16(data
, SCH5627_REG_FAN_MIN
[i
]);
342 data
->fan_min
[i
] = val
;
348 static int reg_to_temp(u16 reg
)
350 return (reg
* 625) / 10 - 64000;
353 static int reg_to_temp_limit(u8 reg
)
355 return (reg
- 64) * 1000;
358 static int reg_to_rpm(u16 reg
)
365 return 5400540 / reg
;
368 static ssize_t
show_name(struct device
*dev
, struct device_attribute
*devattr
,
371 return snprintf(buf
, PAGE_SIZE
, "%s\n", DEVNAME
);
374 static ssize_t
show_temp(struct device
*dev
, struct device_attribute
377 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
378 struct sch5627_data
*data
= sch5627_update_device(dev
);
382 return PTR_ERR(data
);
384 val
= reg_to_temp(data
->temp
[attr
->index
]);
385 return snprintf(buf
, PAGE_SIZE
, "%d\n", val
);
388 static ssize_t
show_temp_fault(struct device
*dev
, struct device_attribute
391 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
392 struct sch5627_data
*data
= sch5627_update_device(dev
);
395 return PTR_ERR(data
);
397 return snprintf(buf
, PAGE_SIZE
, "%d\n", data
->temp
[attr
->index
] == 0);
400 static ssize_t
show_temp_max(struct device
*dev
, struct device_attribute
403 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
404 struct sch5627_data
*data
= dev_get_drvdata(dev
);
407 val
= reg_to_temp_limit(data
->temp_max
[attr
->index
]);
408 return snprintf(buf
, PAGE_SIZE
, "%d\n", val
);
411 static ssize_t
show_temp_crit(struct device
*dev
, struct device_attribute
414 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
415 struct sch5627_data
*data
= dev_get_drvdata(dev
);
418 val
= reg_to_temp_limit(data
->temp_crit
[attr
->index
]);
419 return snprintf(buf
, PAGE_SIZE
, "%d\n", val
);
422 static ssize_t
show_fan(struct device
*dev
, struct device_attribute
425 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
426 struct sch5627_data
*data
= sch5627_update_device(dev
);
430 return PTR_ERR(data
);
432 val
= reg_to_rpm(data
->fan
[attr
->index
]);
436 return snprintf(buf
, PAGE_SIZE
, "%d\n", val
);
439 static ssize_t
show_fan_fault(struct device
*dev
, struct device_attribute
442 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
443 struct sch5627_data
*data
= sch5627_update_device(dev
);
446 return PTR_ERR(data
);
448 return snprintf(buf
, PAGE_SIZE
, "%d\n",
449 data
->fan
[attr
->index
] == 0xffff);
452 static ssize_t
show_fan_min(struct device
*dev
, struct device_attribute
455 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
456 struct sch5627_data
*data
= dev_get_drvdata(dev
);
457 int val
= reg_to_rpm(data
->fan_min
[attr
->index
]);
461 return snprintf(buf
, PAGE_SIZE
, "%d\n", val
);
464 static ssize_t
show_in(struct device
*dev
, struct device_attribute
467 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
468 struct sch5627_data
*data
= sch5627_update_device(dev
);
472 return PTR_ERR(data
);
474 val
= DIV_ROUND_CLOSEST(
475 data
->in
[attr
->index
] * SCH5627_REG_IN_FACTOR
[attr
->index
],
477 return snprintf(buf
, PAGE_SIZE
, "%d\n", val
);
480 static ssize_t
show_in_label(struct device
*dev
, struct device_attribute
483 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
485 return snprintf(buf
, PAGE_SIZE
, "%s\n",
486 SCH5627_IN_LABELS
[attr
->index
]);
489 static DEVICE_ATTR(name
, S_IRUGO
, show_name
, NULL
);
490 static SENSOR_DEVICE_ATTR(temp1_input
, S_IRUGO
, show_temp
, NULL
, 0);
491 static SENSOR_DEVICE_ATTR(temp2_input
, S_IRUGO
, show_temp
, NULL
, 1);
492 static SENSOR_DEVICE_ATTR(temp3_input
, S_IRUGO
, show_temp
, NULL
, 2);
493 static SENSOR_DEVICE_ATTR(temp4_input
, S_IRUGO
, show_temp
, NULL
, 3);
494 static SENSOR_DEVICE_ATTR(temp5_input
, S_IRUGO
, show_temp
, NULL
, 4);
495 static SENSOR_DEVICE_ATTR(temp6_input
, S_IRUGO
, show_temp
, NULL
, 5);
496 static SENSOR_DEVICE_ATTR(temp7_input
, S_IRUGO
, show_temp
, NULL
, 6);
497 static SENSOR_DEVICE_ATTR(temp8_input
, S_IRUGO
, show_temp
, NULL
, 7);
498 static SENSOR_DEVICE_ATTR(temp1_fault
, S_IRUGO
, show_temp_fault
, NULL
, 0);
499 static SENSOR_DEVICE_ATTR(temp2_fault
, S_IRUGO
, show_temp_fault
, NULL
, 1);
500 static SENSOR_DEVICE_ATTR(temp3_fault
, S_IRUGO
, show_temp_fault
, NULL
, 2);
501 static SENSOR_DEVICE_ATTR(temp4_fault
, S_IRUGO
, show_temp_fault
, NULL
, 3);
502 static SENSOR_DEVICE_ATTR(temp5_fault
, S_IRUGO
, show_temp_fault
, NULL
, 4);
503 static SENSOR_DEVICE_ATTR(temp6_fault
, S_IRUGO
, show_temp_fault
, NULL
, 5);
504 static SENSOR_DEVICE_ATTR(temp7_fault
, S_IRUGO
, show_temp_fault
, NULL
, 6);
505 static SENSOR_DEVICE_ATTR(temp8_fault
, S_IRUGO
, show_temp_fault
, NULL
, 7);
506 static SENSOR_DEVICE_ATTR(temp1_max
, S_IRUGO
, show_temp_max
, NULL
, 0);
507 static SENSOR_DEVICE_ATTR(temp2_max
, S_IRUGO
, show_temp_max
, NULL
, 1);
508 static SENSOR_DEVICE_ATTR(temp3_max
, S_IRUGO
, show_temp_max
, NULL
, 2);
509 static SENSOR_DEVICE_ATTR(temp4_max
, S_IRUGO
, show_temp_max
, NULL
, 3);
510 static SENSOR_DEVICE_ATTR(temp5_max
, S_IRUGO
, show_temp_max
, NULL
, 4);
511 static SENSOR_DEVICE_ATTR(temp6_max
, S_IRUGO
, show_temp_max
, NULL
, 5);
512 static SENSOR_DEVICE_ATTR(temp7_max
, S_IRUGO
, show_temp_max
, NULL
, 6);
513 static SENSOR_DEVICE_ATTR(temp8_max
, S_IRUGO
, show_temp_max
, NULL
, 7);
514 static SENSOR_DEVICE_ATTR(temp1_crit
, S_IRUGO
, show_temp_crit
, NULL
, 0);
515 static SENSOR_DEVICE_ATTR(temp2_crit
, S_IRUGO
, show_temp_crit
, NULL
, 1);
516 static SENSOR_DEVICE_ATTR(temp3_crit
, S_IRUGO
, show_temp_crit
, NULL
, 2);
517 static SENSOR_DEVICE_ATTR(temp4_crit
, S_IRUGO
, show_temp_crit
, NULL
, 3);
518 static SENSOR_DEVICE_ATTR(temp5_crit
, S_IRUGO
, show_temp_crit
, NULL
, 4);
519 static SENSOR_DEVICE_ATTR(temp6_crit
, S_IRUGO
, show_temp_crit
, NULL
, 5);
520 static SENSOR_DEVICE_ATTR(temp7_crit
, S_IRUGO
, show_temp_crit
, NULL
, 6);
521 static SENSOR_DEVICE_ATTR(temp8_crit
, S_IRUGO
, show_temp_crit
, NULL
, 7);
523 static SENSOR_DEVICE_ATTR(fan1_input
, S_IRUGO
, show_fan
, NULL
, 0);
524 static SENSOR_DEVICE_ATTR(fan2_input
, S_IRUGO
, show_fan
, NULL
, 1);
525 static SENSOR_DEVICE_ATTR(fan3_input
, S_IRUGO
, show_fan
, NULL
, 2);
526 static SENSOR_DEVICE_ATTR(fan4_input
, S_IRUGO
, show_fan
, NULL
, 3);
527 static SENSOR_DEVICE_ATTR(fan1_fault
, S_IRUGO
, show_fan_fault
, NULL
, 0);
528 static SENSOR_DEVICE_ATTR(fan2_fault
, S_IRUGO
, show_fan_fault
, NULL
, 1);
529 static SENSOR_DEVICE_ATTR(fan3_fault
, S_IRUGO
, show_fan_fault
, NULL
, 2);
530 static SENSOR_DEVICE_ATTR(fan4_fault
, S_IRUGO
, show_fan_fault
, NULL
, 3);
531 static SENSOR_DEVICE_ATTR(fan1_min
, S_IRUGO
, show_fan_min
, NULL
, 0);
532 static SENSOR_DEVICE_ATTR(fan2_min
, S_IRUGO
, show_fan_min
, NULL
, 1);
533 static SENSOR_DEVICE_ATTR(fan3_min
, S_IRUGO
, show_fan_min
, NULL
, 2);
534 static SENSOR_DEVICE_ATTR(fan4_min
, S_IRUGO
, show_fan_min
, NULL
, 3);
536 static SENSOR_DEVICE_ATTR(in0_input
, S_IRUGO
, show_in
, NULL
, 0);
537 static SENSOR_DEVICE_ATTR(in1_input
, S_IRUGO
, show_in
, NULL
, 1);
538 static SENSOR_DEVICE_ATTR(in2_input
, S_IRUGO
, show_in
, NULL
, 2);
539 static SENSOR_DEVICE_ATTR(in3_input
, S_IRUGO
, show_in
, NULL
, 3);
540 static SENSOR_DEVICE_ATTR(in4_input
, S_IRUGO
, show_in
, NULL
, 4);
541 static SENSOR_DEVICE_ATTR(in0_label
, S_IRUGO
, show_in_label
, NULL
, 0);
542 static SENSOR_DEVICE_ATTR(in1_label
, S_IRUGO
, show_in_label
, NULL
, 1);
543 static SENSOR_DEVICE_ATTR(in2_label
, S_IRUGO
, show_in_label
, NULL
, 2);
544 static SENSOR_DEVICE_ATTR(in3_label
, S_IRUGO
, show_in_label
, NULL
, 3);
546 static struct attribute
*sch5627_attributes
[] = {
549 &sensor_dev_attr_temp1_input
.dev_attr
.attr
,
550 &sensor_dev_attr_temp2_input
.dev_attr
.attr
,
551 &sensor_dev_attr_temp3_input
.dev_attr
.attr
,
552 &sensor_dev_attr_temp4_input
.dev_attr
.attr
,
553 &sensor_dev_attr_temp5_input
.dev_attr
.attr
,
554 &sensor_dev_attr_temp6_input
.dev_attr
.attr
,
555 &sensor_dev_attr_temp7_input
.dev_attr
.attr
,
556 &sensor_dev_attr_temp8_input
.dev_attr
.attr
,
557 &sensor_dev_attr_temp1_fault
.dev_attr
.attr
,
558 &sensor_dev_attr_temp2_fault
.dev_attr
.attr
,
559 &sensor_dev_attr_temp3_fault
.dev_attr
.attr
,
560 &sensor_dev_attr_temp4_fault
.dev_attr
.attr
,
561 &sensor_dev_attr_temp5_fault
.dev_attr
.attr
,
562 &sensor_dev_attr_temp6_fault
.dev_attr
.attr
,
563 &sensor_dev_attr_temp7_fault
.dev_attr
.attr
,
564 &sensor_dev_attr_temp8_fault
.dev_attr
.attr
,
565 &sensor_dev_attr_temp1_max
.dev_attr
.attr
,
566 &sensor_dev_attr_temp2_max
.dev_attr
.attr
,
567 &sensor_dev_attr_temp3_max
.dev_attr
.attr
,
568 &sensor_dev_attr_temp4_max
.dev_attr
.attr
,
569 &sensor_dev_attr_temp5_max
.dev_attr
.attr
,
570 &sensor_dev_attr_temp6_max
.dev_attr
.attr
,
571 &sensor_dev_attr_temp7_max
.dev_attr
.attr
,
572 &sensor_dev_attr_temp8_max
.dev_attr
.attr
,
573 &sensor_dev_attr_temp1_crit
.dev_attr
.attr
,
574 &sensor_dev_attr_temp2_crit
.dev_attr
.attr
,
575 &sensor_dev_attr_temp3_crit
.dev_attr
.attr
,
576 &sensor_dev_attr_temp4_crit
.dev_attr
.attr
,
577 &sensor_dev_attr_temp5_crit
.dev_attr
.attr
,
578 &sensor_dev_attr_temp6_crit
.dev_attr
.attr
,
579 &sensor_dev_attr_temp7_crit
.dev_attr
.attr
,
580 &sensor_dev_attr_temp8_crit
.dev_attr
.attr
,
582 &sensor_dev_attr_fan1_input
.dev_attr
.attr
,
583 &sensor_dev_attr_fan2_input
.dev_attr
.attr
,
584 &sensor_dev_attr_fan3_input
.dev_attr
.attr
,
585 &sensor_dev_attr_fan4_input
.dev_attr
.attr
,
586 &sensor_dev_attr_fan1_fault
.dev_attr
.attr
,
587 &sensor_dev_attr_fan2_fault
.dev_attr
.attr
,
588 &sensor_dev_attr_fan3_fault
.dev_attr
.attr
,
589 &sensor_dev_attr_fan4_fault
.dev_attr
.attr
,
590 &sensor_dev_attr_fan1_min
.dev_attr
.attr
,
591 &sensor_dev_attr_fan2_min
.dev_attr
.attr
,
592 &sensor_dev_attr_fan3_min
.dev_attr
.attr
,
593 &sensor_dev_attr_fan4_min
.dev_attr
.attr
,
595 &sensor_dev_attr_in0_input
.dev_attr
.attr
,
596 &sensor_dev_attr_in1_input
.dev_attr
.attr
,
597 &sensor_dev_attr_in2_input
.dev_attr
.attr
,
598 &sensor_dev_attr_in3_input
.dev_attr
.attr
,
599 &sensor_dev_attr_in4_input
.dev_attr
.attr
,
600 &sensor_dev_attr_in0_label
.dev_attr
.attr
,
601 &sensor_dev_attr_in1_label
.dev_attr
.attr
,
602 &sensor_dev_attr_in2_label
.dev_attr
.attr
,
603 &sensor_dev_attr_in3_label
.dev_attr
.attr
,
604 /* No in4_label as in4 is a generic input pin */
609 static const struct attribute_group sch5627_group
= {
610 .attrs
= sch5627_attributes
,
613 static int sch5627_remove(struct platform_device
*pdev
)
615 struct sch5627_data
*data
= platform_get_drvdata(pdev
);
618 hwmon_device_unregister(data
->hwmon_dev
);
620 sysfs_remove_group(&pdev
->dev
.kobj
, &sch5627_group
);
621 platform_set_drvdata(pdev
, NULL
);
627 static int __devinit
sch5627_probe(struct platform_device
*pdev
)
629 struct sch5627_data
*data
;
630 int err
, build_code
, build_id
, hwmon_rev
, val
;
632 data
= kzalloc(sizeof(struct sch5627_data
), GFP_KERNEL
);
636 data
->addr
= platform_get_resource(pdev
, IORESOURCE_IO
, 0)->start
;
637 mutex_init(&data
->update_lock
);
638 platform_set_drvdata(pdev
, data
);
640 val
= sch5627_read_virtual_reg(data
, SCH5627_REG_HWMON_ID
);
645 if (val
!= SCH5627_HWMON_ID
) {
646 pr_err("invalid %s id: 0x%02X (expected 0x%02X)\n", "hwmon",
647 val
, SCH5627_HWMON_ID
);
652 val
= sch5627_read_virtual_reg(data
, SCH5627_REG_COMPANY_ID
);
657 if (val
!= SCH5627_COMPANY_ID
) {
658 pr_err("invalid %s id: 0x%02X (expected 0x%02X)\n", "company",
659 val
, SCH5627_COMPANY_ID
);
664 val
= sch5627_read_virtual_reg(data
, SCH5627_REG_PRIMARY_ID
);
669 if (val
!= SCH5627_PRIMARY_ID
) {
670 pr_err("invalid %s id: 0x%02X (expected 0x%02X)\n", "primary",
671 val
, SCH5627_PRIMARY_ID
);
676 build_code
= sch5627_read_virtual_reg(data
, SCH5627_REG_BUILD_CODE
);
677 if (build_code
< 0) {
682 build_id
= sch5627_read_virtual_reg16(data
, SCH5627_REG_BUILD_ID
);
688 hwmon_rev
= sch5627_read_virtual_reg(data
, SCH5627_REG_HWMON_REV
);
694 val
= sch5627_read_virtual_reg(data
, SCH5627_REG_CTRL
);
700 pr_err("hardware monitoring not enabled\n");
706 * Read limits, we do this only once as reading a register on
707 * the sch5627 is quite expensive (and they don't change).
709 err
= sch5627_read_limits(data
);
713 pr_info("firmware build: code 0x%02X, id 0x%04X, hwmon: rev 0x%02X\n",
714 build_code
, build_id
, hwmon_rev
);
716 /* Register sysfs interface files */
717 err
= sysfs_create_group(&pdev
->dev
.kobj
, &sch5627_group
);
721 data
->hwmon_dev
= hwmon_device_register(&pdev
->dev
);
722 if (IS_ERR(data
->hwmon_dev
)) {
723 err
= PTR_ERR(data
->hwmon_dev
);
724 data
->hwmon_dev
= NULL
;
731 sch5627_remove(pdev
);
735 static int __init
sch5627_find(int sioaddr
, unsigned short *address
)
738 int err
= superio_enter(sioaddr
);
742 devid
= superio_inb(sioaddr
, SIO_REG_DEVID
);
743 if (devid
!= SIO_SCH5627_ID
) {
744 pr_debug("Unsupported device id: 0x%02x\n",
745 (unsigned int)devid
);
750 superio_select(sioaddr
, SIO_SCH5627_EM_LD
);
752 if (!(superio_inb(sioaddr
, SIO_REG_ENABLE
) & 0x01)) {
753 pr_warn("Device not activated\n");
759 * Warning the order of the low / high byte is the other way around
760 * as on most other superio devices!!
762 *address
= superio_inb(sioaddr
, SIO_REG_ADDR
) |
763 superio_inb(sioaddr
, SIO_REG_ADDR
+ 1) << 8;
765 pr_warn("Base address not set\n");
770 pr_info("Found %s chip at %#hx\n", DEVNAME
, *address
);
772 superio_exit(sioaddr
);
776 static int __init
sch5627_device_add(unsigned short address
)
778 struct resource res
= {
780 .end
= address
+ REGION_LENGTH
- 1,
781 .flags
= IORESOURCE_IO
,
785 sch5627_pdev
= platform_device_alloc(DRVNAME
, address
);
789 res
.name
= sch5627_pdev
->name
;
790 err
= acpi_check_resource_conflict(&res
);
792 goto exit_device_put
;
794 err
= platform_device_add_resources(sch5627_pdev
, &res
, 1);
796 pr_err("Device resource addition failed\n");
797 goto exit_device_put
;
800 err
= platform_device_add(sch5627_pdev
);
802 pr_err("Device addition failed\n");
803 goto exit_device_put
;
809 platform_device_put(sch5627_pdev
);
814 static struct platform_driver sch5627_driver
= {
816 .owner
= THIS_MODULE
,
819 .probe
= sch5627_probe
,
820 .remove
= sch5627_remove
,
823 static int __init
sch5627_init(void)
826 unsigned short address
;
828 if (sch5627_find(0x4e, &address
) && sch5627_find(0x2e, &address
))
831 err
= platform_driver_register(&sch5627_driver
);
835 err
= sch5627_device_add(address
);
842 platform_driver_unregister(&sch5627_driver
);
847 static void __exit
sch5627_exit(void)
849 platform_device_unregister(sch5627_pdev
);
850 platform_driver_unregister(&sch5627_driver
);
853 MODULE_DESCRIPTION("SMSC SCH5627 Hardware Monitoring Driver");
854 MODULE_AUTHOR("Hans de Goede (hdegoede@redhat.com)");
855 MODULE_LICENSE("GPL");
857 module_init(sch5627_init
);
858 module_exit(sch5627_exit
);