1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * pc87360.c - Part of lm_sensors, Linux kernel modules
4 * for hardware monitoring
5 * Copyright (C) 2004, 2007 Jean Delvare <jdelvare@suse.de>
7 * Copied from smsc47m1.c:
8 * Copyright (C) 2002 Mark D. Studebaker <mdsxyz123@yahoo.com>
10 * Supports the following chips:
12 * Chip #vin #fan #pwm #temp devid
13 * PC87360 - 2 2 - 0xE1
14 * PC87363 - 2 2 - 0xE8
15 * PC87364 - 3 3 - 0xE4
16 * PC87365 11 3 3 2 0xE5
17 * PC87366 11 3 3 3-4 0xE9
19 * This driver assumes that no more than one chip is present, and one of
20 * the standard Super-I/O addresses is used (0x2E/0x2F or 0x4E/0x4F).
23 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
25 #include <linux/module.h>
26 #include <linux/init.h>
27 #include <linux/slab.h>
28 #include <linux/jiffies.h>
29 #include <linux/platform_device.h>
30 #include <linux/hwmon.h>
31 #include <linux/hwmon-sysfs.h>
32 #include <linux/hwmon-vid.h>
33 #include <linux/err.h>
34 #include <linux/mutex.h>
35 #include <linux/acpi.h>
38 #define DRIVER_NAME "pc87360"
40 /* (temp & vin) channel conversion status register flags (pdf sec.11.5.12) */
41 #define CHAN_CNVRTD 0x80 /* new data ready */
42 #define CHAN_ENA 0x01 /* enabled channel (temp or vin) */
43 #define CHAN_ALM_ENA 0x10 /* propagate to alarms-reg ?? (chk val!) */
44 #define CHAN_READY (CHAN_ENA|CHAN_CNVRTD) /* sample ready mask */
46 #define TEMP_OTS_OE 0x20 /* OTS Output Enable */
47 #define VIN_RW1C_MASK (CHAN_READY|CHAN_ALM_MAX|CHAN_ALM_MIN) /* 0x87 */
48 #define TEMP_RW1C_MASK (VIN_RW1C_MASK|TEMP_ALM_CRIT|TEMP_FAULT) /* 0xCF */
51 static struct platform_device
*pdev
;
52 static unsigned short extra_isa
[3];
56 module_param(init
, int, 0);
57 MODULE_PARM_DESC(init
,
58 "Chip initialization level:\n"
60 "*1: Forcibly enable internal voltage and temperature channels, except in9\n"
61 " 2: Forcibly enable all voltage and temperature channels, except in9\n"
62 " 3: Forcibly enable all voltage and temperature channels, including in9");
64 static unsigned short force_id
;
65 module_param(force_id
, ushort
, 0);
66 MODULE_PARM_DESC(force_id
, "Override the detected device ID");
69 * Super-I/O registers and operations
72 #define DEV 0x07 /* Register: Logical device select */
73 #define DEVID 0x20 /* Register: Device ID */
74 #define ACT 0x30 /* Register: Device activation */
75 #define BASE 0x60 /* Register: Base address */
77 #define FSCM 0x09 /* Logical device: fans */
78 #define VLM 0x0d /* Logical device: voltages */
79 #define TMS 0x0e /* Logical device: temperatures */
81 static const u8 logdev
[LDNI_MAX
] = { FSCM
, VLM
, TMS
};
87 static inline void superio_outb(int sioaddr
, int reg
, int val
)
90 outb(val
, sioaddr
+ 1);
93 static inline int superio_inb(int sioaddr
, int reg
)
96 return inb(sioaddr
+ 1);
99 static inline void superio_exit(int sioaddr
)
102 outb(0x02, sioaddr
+ 1);
109 #define PC87360_EXTENT 0x10
110 #define PC87365_REG_BANK 0x09
114 * Fan registers and conversions
117 /* nr has to be 0 or 1 (PC87360/87363) or 2 (PC87364/87365/87366) */
118 #define PC87360_REG_PRESCALE(nr) (0x00 + 2 * (nr))
119 #define PC87360_REG_PWM(nr) (0x01 + 2 * (nr))
120 #define PC87360_REG_FAN_MIN(nr) (0x06 + 3 * (nr))
121 #define PC87360_REG_FAN(nr) (0x07 + 3 * (nr))
122 #define PC87360_REG_FAN_STATUS(nr) (0x08 + 3 * (nr))
124 #define FAN_FROM_REG(val, div) ((val) == 0 ? 0 : \
125 480000 / ((val) * (div)))
126 #define FAN_TO_REG(val, div) ((val) <= 100 ? 0 : \
127 480000 / ((val) * (div)))
128 #define FAN_DIV_FROM_REG(val) (1 << (((val) >> 5) & 0x03))
129 #define FAN_STATUS_FROM_REG(val) ((val) & 0x07)
131 #define FAN_CONFIG_MONITOR(val, nr) (((val) >> (2 + (nr) * 3)) & 1)
132 #define FAN_CONFIG_CONTROL(val, nr) (((val) >> (3 + (nr) * 3)) & 1)
133 #define FAN_CONFIG_INVERT(val, nr) (((val) >> (4 + (nr) * 3)) & 1)
135 #define PWM_FROM_REG(val, inv) ((inv) ? 255 - (val) : (val))
136 static inline u8
PWM_TO_REG(int val
, int inv
)
148 * Voltage registers and conversions
151 #define PC87365_REG_IN_CONVRATE 0x07
152 #define PC87365_REG_IN_CONFIG 0x08
153 #define PC87365_REG_IN 0x0B
154 #define PC87365_REG_IN_MIN 0x0D
155 #define PC87365_REG_IN_MAX 0x0C
156 #define PC87365_REG_IN_STATUS 0x0A
157 #define PC87365_REG_IN_ALARMS1 0x00
158 #define PC87365_REG_IN_ALARMS2 0x01
159 #define PC87365_REG_VID 0x06
161 #define IN_FROM_REG(val, ref) (((val) * (ref) + 128) / 256)
162 #define IN_TO_REG(val, ref) ((val) < 0 ? 0 : \
163 (val) * 256 >= (ref) * 255 ? 255 : \
164 ((val) * 256 + (ref) / 2) / (ref))
167 * Temperature registers and conversions
170 #define PC87365_REG_TEMP_CONFIG 0x08
171 #define PC87365_REG_TEMP 0x0B
172 #define PC87365_REG_TEMP_MIN 0x0D
173 #define PC87365_REG_TEMP_MAX 0x0C
174 #define PC87365_REG_TEMP_CRIT 0x0E
175 #define PC87365_REG_TEMP_STATUS 0x0A
176 #define PC87365_REG_TEMP_ALARMS 0x00
178 #define TEMP_FROM_REG(val) ((val) * 1000)
179 #define TEMP_TO_REG(val) ((val) < -55000 ? -55 : \
180 (val) > 127000 ? 127 : \
181 (val) < 0 ? ((val) - 500) / 1000 : \
182 ((val) + 500) / 1000)
188 struct pc87360_data
{
190 struct device
*hwmon_dev
;
192 struct mutex update_lock
;
193 bool valid
; /* true if following fields are valid */
194 unsigned long last_updated
; /* In jiffies */
198 u8 fannr
, innr
, tempnr
;
200 u8 fan
[3]; /* Register value */
201 u8 fan_min
[3]; /* Register value */
202 u8 fan_status
[3]; /* Register value */
203 u8 pwm
[3]; /* Register value */
204 u16 fan_conf
; /* Configuration register values, combined */
206 u16 in_vref
; /* 1 mV/bit */
207 u8 in
[14]; /* Register value */
208 u8 in_min
[14]; /* Register value */
209 u8 in_max
[14]; /* Register value */
210 u8 in_crit
[3]; /* Register value */
211 u8 in_status
[14]; /* Register value */
212 u16 in_alarms
; /* Register values, combined, masked */
213 u8 vid_conf
; /* Configuration register value */
215 u8 vid
; /* Register value */
217 s8 temp
[3]; /* Register value */
218 s8 temp_min
[3]; /* Register value */
219 s8 temp_max
[3]; /* Register value */
220 s8 temp_crit
[3]; /* Register value */
221 u8 temp_status
[3]; /* Register value */
222 u8 temp_alarms
; /* Register value, masked */
226 * ldi is the logical device index
227 * bank is for voltages and temperatures only
229 static int pc87360_read_value(struct pc87360_data
*data
, u8 ldi
, u8 bank
,
234 mutex_lock(&(data
->lock
));
236 outb_p(bank
, data
->address
[ldi
] + PC87365_REG_BANK
);
237 res
= inb_p(data
->address
[ldi
] + reg
);
238 mutex_unlock(&(data
->lock
));
243 static void pc87360_write_value(struct pc87360_data
*data
, u8 ldi
, u8 bank
,
246 mutex_lock(&(data
->lock
));
248 outb_p(bank
, data
->address
[ldi
] + PC87365_REG_BANK
);
249 outb_p(value
, data
->address
[ldi
] + reg
);
250 mutex_unlock(&(data
->lock
));
253 static void pc87360_autodiv(struct device
*dev
, int nr
)
255 struct pc87360_data
*data
= dev_get_drvdata(dev
);
256 u8 old_min
= data
->fan_min
[nr
];
258 /* Increase clock divider if needed and possible */
259 if ((data
->fan_status
[nr
] & 0x04) /* overflow flag */
260 || (data
->fan
[nr
] >= 224)) { /* next to overflow */
261 if ((data
->fan_status
[nr
] & 0x60) != 0x60) {
262 data
->fan_status
[nr
] += 0x20;
263 data
->fan_min
[nr
] >>= 1;
266 "Increasing clock divider to %d for fan %d\n",
267 FAN_DIV_FROM_REG(data
->fan_status
[nr
]), nr
+ 1);
270 /* Decrease clock divider if possible */
271 while (!(data
->fan_min
[nr
] & 0x80) /* min "nails" divider */
272 && data
->fan
[nr
] < 85 /* bad accuracy */
273 && (data
->fan_status
[nr
] & 0x60) != 0x00) {
274 data
->fan_status
[nr
] -= 0x20;
275 data
->fan_min
[nr
] <<= 1;
278 "Decreasing clock divider to %d for fan %d\n",
279 FAN_DIV_FROM_REG(data
->fan_status
[nr
]),
284 /* Write new fan min if it changed */
285 if (old_min
!= data
->fan_min
[nr
]) {
286 pc87360_write_value(data
, LD_FAN
, NO_BANK
,
287 PC87360_REG_FAN_MIN(nr
),
292 static struct pc87360_data
*pc87360_update_device(struct device
*dev
)
294 struct pc87360_data
*data
= dev_get_drvdata(dev
);
297 mutex_lock(&data
->update_lock
);
299 if (time_after(jiffies
, data
->last_updated
+ HZ
* 2) || !data
->valid
) {
300 dev_dbg(dev
, "Data update\n");
303 for (i
= 0; i
< data
->fannr
; i
++) {
304 if (FAN_CONFIG_MONITOR(data
->fan_conf
, i
)) {
305 data
->fan_status
[i
] =
306 pc87360_read_value(data
, LD_FAN
,
307 NO_BANK
, PC87360_REG_FAN_STATUS(i
));
308 data
->fan
[i
] = pc87360_read_value(data
, LD_FAN
,
309 NO_BANK
, PC87360_REG_FAN(i
));
310 data
->fan_min
[i
] = pc87360_read_value(data
,
312 PC87360_REG_FAN_MIN(i
));
313 /* Change clock divider if needed */
314 pc87360_autodiv(dev
, i
);
315 /* Clear bits and write new divider */
316 pc87360_write_value(data
, LD_FAN
, NO_BANK
,
317 PC87360_REG_FAN_STATUS(i
),
318 data
->fan_status
[i
]);
320 if (FAN_CONFIG_CONTROL(data
->fan_conf
, i
))
321 data
->pwm
[i
] = pc87360_read_value(data
, LD_FAN
,
322 NO_BANK
, PC87360_REG_PWM(i
));
327 * The min() below does not have any practical meaning and is
328 * only needed to silence a warning observed with gcc 12+.
330 for (i
= 0; i
< min(data
->innr
, ARRAY_SIZE(data
->in
)); i
++) {
331 data
->in_status
[i
] = pc87360_read_value(data
, LD_IN
, i
,
332 PC87365_REG_IN_STATUS
);
334 pc87360_write_value(data
, LD_IN
, i
,
335 PC87365_REG_IN_STATUS
,
337 if ((data
->in_status
[i
] & CHAN_READY
) == CHAN_READY
) {
338 data
->in
[i
] = pc87360_read_value(data
, LD_IN
,
341 if (data
->in_status
[i
] & CHAN_ENA
) {
342 data
->in_min
[i
] = pc87360_read_value(data
,
345 data
->in_max
[i
] = pc87360_read_value(data
,
349 data
->in_crit
[i
-11] =
350 pc87360_read_value(data
, LD_IN
,
351 i
, PC87365_REG_TEMP_CRIT
);
355 data
->in_alarms
= pc87360_read_value(data
, LD_IN
,
356 NO_BANK
, PC87365_REG_IN_ALARMS1
)
357 | ((pc87360_read_value(data
, LD_IN
,
358 NO_BANK
, PC87365_REG_IN_ALARMS2
)
360 data
->vid
= (data
->vid_conf
& 0xE0) ?
361 pc87360_read_value(data
, LD_IN
,
362 NO_BANK
, PC87365_REG_VID
) : 0x1F;
366 for (i
= 0; i
< data
->tempnr
; i
++) {
367 data
->temp_status
[i
] = pc87360_read_value(data
,
369 PC87365_REG_TEMP_STATUS
);
371 pc87360_write_value(data
, LD_TEMP
, i
,
372 PC87365_REG_TEMP_STATUS
,
373 data
->temp_status
[i
]);
374 if ((data
->temp_status
[i
] & CHAN_READY
) == CHAN_READY
) {
375 data
->temp
[i
] = pc87360_read_value(data
,
379 if (data
->temp_status
[i
] & CHAN_ENA
) {
380 data
->temp_min
[i
] = pc87360_read_value(data
,
382 PC87365_REG_TEMP_MIN
);
383 data
->temp_max
[i
] = pc87360_read_value(data
,
385 PC87365_REG_TEMP_MAX
);
386 data
->temp_crit
[i
] = pc87360_read_value(data
,
388 PC87365_REG_TEMP_CRIT
);
392 data
->temp_alarms
= pc87360_read_value(data
, LD_TEMP
,
393 NO_BANK
, PC87365_REG_TEMP_ALARMS
)
397 data
->last_updated
= jiffies
;
401 mutex_unlock(&data
->update_lock
);
406 static ssize_t
in_input_show(struct device
*dev
,
407 struct device_attribute
*devattr
, char *buf
)
409 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
410 struct pc87360_data
*data
= pc87360_update_device(dev
);
411 return sprintf(buf
, "%u\n", IN_FROM_REG(data
->in
[attr
->index
],
415 static struct sensor_device_attribute in_input
[] = {
416 SENSOR_ATTR_RO(in0_input
, in_input
, 0),
417 SENSOR_ATTR_RO(in1_input
, in_input
, 1),
418 SENSOR_ATTR_RO(in2_input
, in_input
, 2),
419 SENSOR_ATTR_RO(in3_input
, in_input
, 3),
420 SENSOR_ATTR_RO(in4_input
, in_input
, 4),
421 SENSOR_ATTR_RO(in5_input
, in_input
, 5),
422 SENSOR_ATTR_RO(in6_input
, in_input
, 6),
423 SENSOR_ATTR_RO(in7_input
, in_input
, 7),
424 SENSOR_ATTR_RO(in8_input
, in_input
, 8),
425 SENSOR_ATTR_RO(in9_input
, in_input
, 9),
426 SENSOR_ATTR_RO(in10_input
, in_input
, 10),
429 static ssize_t
in_status_show(struct device
*dev
,
430 struct device_attribute
*devattr
, char *buf
)
432 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
433 struct pc87360_data
*data
= pc87360_update_device(dev
);
434 return sprintf(buf
, "%u\n", data
->in_status
[attr
->index
]);
437 static struct sensor_device_attribute in_status
[] = {
438 SENSOR_ATTR_RO(in0_status
, in_status
, 0),
439 SENSOR_ATTR_RO(in1_status
, in_status
, 1),
440 SENSOR_ATTR_RO(in2_status
, in_status
, 2),
441 SENSOR_ATTR_RO(in3_status
, in_status
, 3),
442 SENSOR_ATTR_RO(in4_status
, in_status
, 4),
443 SENSOR_ATTR_RO(in5_status
, in_status
, 5),
444 SENSOR_ATTR_RO(in6_status
, in_status
, 6),
445 SENSOR_ATTR_RO(in7_status
, in_status
, 7),
446 SENSOR_ATTR_RO(in8_status
, in_status
, 8),
447 SENSOR_ATTR_RO(in9_status
, in_status
, 9),
448 SENSOR_ATTR_RO(in10_status
, in_status
, 10),
451 static ssize_t
in_min_show(struct device
*dev
,
452 struct device_attribute
*devattr
, char *buf
)
454 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
455 struct pc87360_data
*data
= pc87360_update_device(dev
);
456 return sprintf(buf
, "%u\n", IN_FROM_REG(data
->in_min
[attr
->index
],
460 static ssize_t
in_min_store(struct device
*dev
,
461 struct device_attribute
*devattr
, const char *buf
,
464 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
465 struct pc87360_data
*data
= dev_get_drvdata(dev
);
469 err
= kstrtol(buf
, 10, &val
);
473 mutex_lock(&data
->update_lock
);
474 data
->in_min
[attr
->index
] = IN_TO_REG(val
, data
->in_vref
);
475 pc87360_write_value(data
, LD_IN
, attr
->index
, PC87365_REG_IN_MIN
,
476 data
->in_min
[attr
->index
]);
477 mutex_unlock(&data
->update_lock
);
481 static struct sensor_device_attribute in_min
[] = {
482 SENSOR_ATTR_RW(in0_min
, in_min
, 0),
483 SENSOR_ATTR_RW(in1_min
, in_min
, 1),
484 SENSOR_ATTR_RW(in2_min
, in_min
, 2),
485 SENSOR_ATTR_RW(in3_min
, in_min
, 3),
486 SENSOR_ATTR_RW(in4_min
, in_min
, 4),
487 SENSOR_ATTR_RW(in5_min
, in_min
, 5),
488 SENSOR_ATTR_RW(in6_min
, in_min
, 6),
489 SENSOR_ATTR_RW(in7_min
, in_min
, 7),
490 SENSOR_ATTR_RW(in8_min
, in_min
, 8),
491 SENSOR_ATTR_RW(in9_min
, in_min
, 9),
492 SENSOR_ATTR_RW(in10_min
, in_min
, 10),
495 static ssize_t
in_max_show(struct device
*dev
,
496 struct device_attribute
*devattr
, char *buf
)
498 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
499 struct pc87360_data
*data
= pc87360_update_device(dev
);
500 return sprintf(buf
, "%u\n", IN_FROM_REG(data
->in_max
[attr
->index
],
504 static ssize_t
in_max_store(struct device
*dev
,
505 struct device_attribute
*devattr
, const char *buf
,
508 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
509 struct pc87360_data
*data
= dev_get_drvdata(dev
);
513 err
= kstrtol(buf
, 10, &val
);
517 mutex_lock(&data
->update_lock
);
518 data
->in_max
[attr
->index
] = IN_TO_REG(val
,
520 pc87360_write_value(data
, LD_IN
, attr
->index
, PC87365_REG_IN_MAX
,
521 data
->in_max
[attr
->index
]);
522 mutex_unlock(&data
->update_lock
);
526 static struct sensor_device_attribute in_max
[] = {
527 SENSOR_ATTR_RW(in0_max
, in_max
, 0),
528 SENSOR_ATTR_RW(in1_max
, in_max
, 1),
529 SENSOR_ATTR_RW(in2_max
, in_max
, 2),
530 SENSOR_ATTR_RW(in3_max
, in_max
, 3),
531 SENSOR_ATTR_RW(in4_max
, in_max
, 4),
532 SENSOR_ATTR_RW(in5_max
, in_max
, 5),
533 SENSOR_ATTR_RW(in6_max
, in_max
, 6),
534 SENSOR_ATTR_RW(in7_max
, in_max
, 7),
535 SENSOR_ATTR_RW(in8_max
, in_max
, 8),
536 SENSOR_ATTR_RW(in9_max
, in_max
, 9),
537 SENSOR_ATTR_RW(in10_max
, in_max
, 10),
540 /* (temp & vin) channel status register alarm bits (pdf sec.11.5.12) */
541 #define CHAN_ALM_MIN 0x02 /* min limit crossed */
542 #define CHAN_ALM_MAX 0x04 /* max limit exceeded */
543 #define TEMP_ALM_CRIT 0x08 /* temp crit exceeded (temp only) */
546 * show_in_min/max_alarm() reads data from the per-channel status
547 * register (sec 11.5.12), not the vin event status registers (sec
548 * 11.5.2) that (legacy) show_in_alarm() resds (via data->in_alarms)
551 static ssize_t
in_min_alarm_show(struct device
*dev
,
552 struct device_attribute
*devattr
, char *buf
)
554 struct pc87360_data
*data
= pc87360_update_device(dev
);
555 unsigned nr
= to_sensor_dev_attr(devattr
)->index
;
557 return sprintf(buf
, "%u\n", !!(data
->in_status
[nr
] & CHAN_ALM_MIN
));
560 static struct sensor_device_attribute in_min_alarm
[] = {
561 SENSOR_ATTR_RO(in0_min_alarm
, in_min_alarm
, 0),
562 SENSOR_ATTR_RO(in1_min_alarm
, in_min_alarm
, 1),
563 SENSOR_ATTR_RO(in2_min_alarm
, in_min_alarm
, 2),
564 SENSOR_ATTR_RO(in3_min_alarm
, in_min_alarm
, 3),
565 SENSOR_ATTR_RO(in4_min_alarm
, in_min_alarm
, 4),
566 SENSOR_ATTR_RO(in5_min_alarm
, in_min_alarm
, 5),
567 SENSOR_ATTR_RO(in6_min_alarm
, in_min_alarm
, 6),
568 SENSOR_ATTR_RO(in7_min_alarm
, in_min_alarm
, 7),
569 SENSOR_ATTR_RO(in8_min_alarm
, in_min_alarm
, 8),
570 SENSOR_ATTR_RO(in9_min_alarm
, in_min_alarm
, 9),
571 SENSOR_ATTR_RO(in10_min_alarm
, in_min_alarm
, 10),
574 static ssize_t
in_max_alarm_show(struct device
*dev
,
575 struct device_attribute
*devattr
, char *buf
)
577 struct pc87360_data
*data
= pc87360_update_device(dev
);
578 unsigned nr
= to_sensor_dev_attr(devattr
)->index
;
580 return sprintf(buf
, "%u\n", !!(data
->in_status
[nr
] & CHAN_ALM_MAX
));
583 static struct sensor_device_attribute in_max_alarm
[] = {
584 SENSOR_ATTR_RO(in0_max_alarm
, in_max_alarm
, 0),
585 SENSOR_ATTR_RO(in1_max_alarm
, in_max_alarm
, 1),
586 SENSOR_ATTR_RO(in2_max_alarm
, in_max_alarm
, 2),
587 SENSOR_ATTR_RO(in3_max_alarm
, in_max_alarm
, 3),
588 SENSOR_ATTR_RO(in4_max_alarm
, in_max_alarm
, 4),
589 SENSOR_ATTR_RO(in5_max_alarm
, in_max_alarm
, 5),
590 SENSOR_ATTR_RO(in6_max_alarm
, in_max_alarm
, 6),
591 SENSOR_ATTR_RO(in7_max_alarm
, in_max_alarm
, 7),
592 SENSOR_ATTR_RO(in8_max_alarm
, in_max_alarm
, 8),
593 SENSOR_ATTR_RO(in9_max_alarm
, in_max_alarm
, 9),
594 SENSOR_ATTR_RO(in10_max_alarm
, in_max_alarm
, 10),
597 #define VIN_UNIT_ATTRS(X) \
598 &in_input[X].dev_attr.attr, \
599 &in_status[X].dev_attr.attr, \
600 &in_min[X].dev_attr.attr, \
601 &in_max[X].dev_attr.attr, \
602 &in_min_alarm[X].dev_attr.attr, \
603 &in_max_alarm[X].dev_attr.attr
605 static ssize_t
cpu0_vid_show(struct device
*dev
,
606 struct device_attribute
*attr
, char *buf
)
608 struct pc87360_data
*data
= pc87360_update_device(dev
);
609 return sprintf(buf
, "%u\n", vid_from_reg(data
->vid
, data
->vrm
));
611 static DEVICE_ATTR_RO(cpu0_vid
);
613 static ssize_t
vrm_show(struct device
*dev
, struct device_attribute
*attr
,
616 struct pc87360_data
*data
= dev_get_drvdata(dev
);
617 return sprintf(buf
, "%u\n", data
->vrm
);
620 static ssize_t
vrm_store(struct device
*dev
, struct device_attribute
*attr
,
621 const char *buf
, size_t count
)
623 struct pc87360_data
*data
= dev_get_drvdata(dev
);
627 err
= kstrtoul(buf
, 10, &val
);
637 static DEVICE_ATTR_RW(vrm
);
639 static ssize_t
alarms_in_show(struct device
*dev
,
640 struct device_attribute
*attr
, char *buf
)
642 struct pc87360_data
*data
= pc87360_update_device(dev
);
643 return sprintf(buf
, "%u\n", data
->in_alarms
);
645 static DEVICE_ATTR_RO(alarms_in
);
647 static struct attribute
*pc8736x_vin_attr_array
[] = {
659 &dev_attr_cpu0_vid
.attr
,
661 &dev_attr_alarms_in
.attr
,
664 static const struct attribute_group pc8736x_vin_group
= {
665 .attrs
= pc8736x_vin_attr_array
,
668 static ssize_t
therm_input_show(struct device
*dev
,
669 struct device_attribute
*devattr
, char *buf
)
671 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
672 struct pc87360_data
*data
= pc87360_update_device(dev
);
673 return sprintf(buf
, "%u\n", IN_FROM_REG(data
->in
[attr
->index
],
678 * the +11 term below reflects the fact that VLM units 11,12,13 are
679 * used in the chip to measure voltage across the thermistors
681 static struct sensor_device_attribute therm_input
[] = {
682 SENSOR_ATTR_RO(temp4_input
, therm_input
, 0 + 11),
683 SENSOR_ATTR_RO(temp5_input
, therm_input
, 1 + 11),
684 SENSOR_ATTR_RO(temp6_input
, therm_input
, 2 + 11),
687 static ssize_t
therm_status_show(struct device
*dev
,
688 struct device_attribute
*devattr
, char *buf
)
690 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
691 struct pc87360_data
*data
= pc87360_update_device(dev
);
692 return sprintf(buf
, "%u\n", data
->in_status
[attr
->index
]);
695 static struct sensor_device_attribute therm_status
[] = {
696 SENSOR_ATTR_RO(temp4_status
, therm_status
, 0 + 11),
697 SENSOR_ATTR_RO(temp5_status
, therm_status
, 1 + 11),
698 SENSOR_ATTR_RO(temp6_status
, therm_status
, 2 + 11),
701 static ssize_t
therm_min_show(struct device
*dev
,
702 struct device_attribute
*devattr
, char *buf
)
704 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
705 struct pc87360_data
*data
= pc87360_update_device(dev
);
706 return sprintf(buf
, "%u\n", IN_FROM_REG(data
->in_min
[attr
->index
],
710 static ssize_t
therm_min_store(struct device
*dev
,
711 struct device_attribute
*devattr
,
712 const char *buf
, size_t count
)
714 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
715 struct pc87360_data
*data
= dev_get_drvdata(dev
);
719 err
= kstrtol(buf
, 10, &val
);
723 mutex_lock(&data
->update_lock
);
724 data
->in_min
[attr
->index
] = IN_TO_REG(val
, data
->in_vref
);
725 pc87360_write_value(data
, LD_IN
, attr
->index
, PC87365_REG_TEMP_MIN
,
726 data
->in_min
[attr
->index
]);
727 mutex_unlock(&data
->update_lock
);
731 static struct sensor_device_attribute therm_min
[] = {
732 SENSOR_ATTR_RW(temp4_min
, therm_min
, 0 + 11),
733 SENSOR_ATTR_RW(temp5_min
, therm_min
, 1 + 11),
734 SENSOR_ATTR_RW(temp6_min
, therm_min
, 2 + 11),
737 static ssize_t
therm_max_show(struct device
*dev
,
738 struct device_attribute
*devattr
, char *buf
)
740 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
741 struct pc87360_data
*data
= pc87360_update_device(dev
);
742 return sprintf(buf
, "%u\n", IN_FROM_REG(data
->in_max
[attr
->index
],
746 static ssize_t
therm_max_store(struct device
*dev
,
747 struct device_attribute
*devattr
,
748 const char *buf
, size_t count
)
750 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
751 struct pc87360_data
*data
= dev_get_drvdata(dev
);
755 err
= kstrtol(buf
, 10, &val
);
759 mutex_lock(&data
->update_lock
);
760 data
->in_max
[attr
->index
] = IN_TO_REG(val
, data
->in_vref
);
761 pc87360_write_value(data
, LD_IN
, attr
->index
, PC87365_REG_TEMP_MAX
,
762 data
->in_max
[attr
->index
]);
763 mutex_unlock(&data
->update_lock
);
767 static struct sensor_device_attribute therm_max
[] = {
768 SENSOR_ATTR_RW(temp4_max
, therm_max
, 0 + 11),
769 SENSOR_ATTR_RW(temp5_max
, therm_max
, 1 + 11),
770 SENSOR_ATTR_RW(temp6_max
, therm_max
, 2 + 11),
773 static ssize_t
therm_crit_show(struct device
*dev
,
774 struct device_attribute
*devattr
, char *buf
)
776 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
777 struct pc87360_data
*data
= pc87360_update_device(dev
);
778 return sprintf(buf
, "%u\n", IN_FROM_REG(data
->in_crit
[attr
->index
-11],
782 static ssize_t
therm_crit_store(struct device
*dev
,
783 struct device_attribute
*devattr
,
784 const char *buf
, size_t count
)
786 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
787 struct pc87360_data
*data
= dev_get_drvdata(dev
);
791 err
= kstrtol(buf
, 10, &val
);
795 mutex_lock(&data
->update_lock
);
796 data
->in_crit
[attr
->index
-11] = IN_TO_REG(val
, data
->in_vref
);
797 pc87360_write_value(data
, LD_IN
, attr
->index
, PC87365_REG_TEMP_CRIT
,
798 data
->in_crit
[attr
->index
-11]);
799 mutex_unlock(&data
->update_lock
);
803 static struct sensor_device_attribute therm_crit
[] = {
804 SENSOR_ATTR_RW(temp4_crit
, therm_crit
, 0 + 11),
805 SENSOR_ATTR_RW(temp5_crit
, therm_crit
, 1 + 11),
806 SENSOR_ATTR_RW(temp6_crit
, therm_crit
, 2 + 11),
810 * show_therm_min/max_alarm() reads data from the per-channel voltage
811 * status register (sec 11.5.12)
813 static ssize_t
therm_min_alarm_show(struct device
*dev
,
814 struct device_attribute
*devattr
,
817 struct pc87360_data
*data
= pc87360_update_device(dev
);
818 unsigned nr
= to_sensor_dev_attr(devattr
)->index
;
820 return sprintf(buf
, "%u\n", !!(data
->in_status
[nr
] & CHAN_ALM_MIN
));
823 static struct sensor_device_attribute therm_min_alarm
[] = {
824 SENSOR_ATTR_RO(temp4_min_alarm
, therm_min_alarm
, 0 + 11),
825 SENSOR_ATTR_RO(temp5_min_alarm
, therm_min_alarm
, 1 + 11),
826 SENSOR_ATTR_RO(temp6_min_alarm
, therm_min_alarm
, 2 + 11),
829 static ssize_t
therm_max_alarm_show(struct device
*dev
,
830 struct device_attribute
*devattr
,
833 struct pc87360_data
*data
= pc87360_update_device(dev
);
834 unsigned nr
= to_sensor_dev_attr(devattr
)->index
;
836 return sprintf(buf
, "%u\n", !!(data
->in_status
[nr
] & CHAN_ALM_MAX
));
839 static struct sensor_device_attribute therm_max_alarm
[] = {
840 SENSOR_ATTR_RO(temp4_max_alarm
, therm_max_alarm
, 0 + 11),
841 SENSOR_ATTR_RO(temp5_max_alarm
, therm_max_alarm
, 1 + 11),
842 SENSOR_ATTR_RO(temp6_max_alarm
, therm_max_alarm
, 2 + 11),
845 static ssize_t
therm_crit_alarm_show(struct device
*dev
,
846 struct device_attribute
*devattr
,
849 struct pc87360_data
*data
= pc87360_update_device(dev
);
850 unsigned nr
= to_sensor_dev_attr(devattr
)->index
;
852 return sprintf(buf
, "%u\n", !!(data
->in_status
[nr
] & TEMP_ALM_CRIT
));
855 static struct sensor_device_attribute therm_crit_alarm
[] = {
856 SENSOR_ATTR_RO(temp4_crit_alarm
, therm_crit_alarm
, 0 + 11),
857 SENSOR_ATTR_RO(temp5_crit_alarm
, therm_crit_alarm
, 1 + 11),
858 SENSOR_ATTR_RO(temp6_crit_alarm
, therm_crit_alarm
, 2 + 11),
861 #define THERM_UNIT_ATTRS(X) \
862 &therm_input[X].dev_attr.attr, \
863 &therm_status[X].dev_attr.attr, \
864 &therm_min[X].dev_attr.attr, \
865 &therm_max[X].dev_attr.attr, \
866 &therm_crit[X].dev_attr.attr, \
867 &therm_min_alarm[X].dev_attr.attr, \
868 &therm_max_alarm[X].dev_attr.attr, \
869 &therm_crit_alarm[X].dev_attr.attr
871 static struct attribute
*pc8736x_therm_attr_array
[] = {
877 static const struct attribute_group pc8736x_therm_group
= {
878 .attrs
= pc8736x_therm_attr_array
,
881 static ssize_t
temp_input_show(struct device
*dev
,
882 struct device_attribute
*devattr
, char *buf
)
884 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
885 struct pc87360_data
*data
= pc87360_update_device(dev
);
886 return sprintf(buf
, "%d\n", TEMP_FROM_REG(data
->temp
[attr
->index
]));
889 static struct sensor_device_attribute temp_input
[] = {
890 SENSOR_ATTR_RO(temp1_input
, temp_input
, 0),
891 SENSOR_ATTR_RO(temp2_input
, temp_input
, 1),
892 SENSOR_ATTR_RO(temp3_input
, temp_input
, 2),
895 static ssize_t
temp_status_show(struct device
*dev
,
896 struct device_attribute
*devattr
, char *buf
)
898 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
899 struct pc87360_data
*data
= pc87360_update_device(dev
);
900 return sprintf(buf
, "%d\n", data
->temp_status
[attr
->index
]);
903 static struct sensor_device_attribute temp_status
[] = {
904 SENSOR_ATTR_RO(temp1_status
, temp_status
, 0),
905 SENSOR_ATTR_RO(temp2_status
, temp_status
, 1),
906 SENSOR_ATTR_RO(temp3_status
, temp_status
, 2),
909 static ssize_t
temp_min_show(struct device
*dev
,
910 struct device_attribute
*devattr
, char *buf
)
912 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
913 struct pc87360_data
*data
= pc87360_update_device(dev
);
914 return sprintf(buf
, "%d\n", TEMP_FROM_REG(data
->temp_min
[attr
->index
]));
917 static ssize_t
temp_min_store(struct device
*dev
,
918 struct device_attribute
*devattr
,
919 const char *buf
, size_t count
)
921 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
922 struct pc87360_data
*data
= dev_get_drvdata(dev
);
926 err
= kstrtol(buf
, 10, &val
);
930 mutex_lock(&data
->update_lock
);
931 data
->temp_min
[attr
->index
] = TEMP_TO_REG(val
);
932 pc87360_write_value(data
, LD_TEMP
, attr
->index
, PC87365_REG_TEMP_MIN
,
933 data
->temp_min
[attr
->index
]);
934 mutex_unlock(&data
->update_lock
);
938 static struct sensor_device_attribute temp_min
[] = {
939 SENSOR_ATTR_RW(temp1_min
, temp_min
, 0),
940 SENSOR_ATTR_RW(temp2_min
, temp_min
, 1),
941 SENSOR_ATTR_RW(temp3_min
, temp_min
, 2),
944 static ssize_t
temp_max_show(struct device
*dev
,
945 struct device_attribute
*devattr
, char *buf
)
947 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
948 struct pc87360_data
*data
= pc87360_update_device(dev
);
949 return sprintf(buf
, "%d\n", TEMP_FROM_REG(data
->temp_max
[attr
->index
]));
952 static ssize_t
temp_max_store(struct device
*dev
,
953 struct device_attribute
*devattr
,
954 const char *buf
, size_t count
)
956 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
957 struct pc87360_data
*data
= dev_get_drvdata(dev
);
961 err
= kstrtol(buf
, 10, &val
);
965 mutex_lock(&data
->update_lock
);
966 data
->temp_max
[attr
->index
] = TEMP_TO_REG(val
);
967 pc87360_write_value(data
, LD_TEMP
, attr
->index
, PC87365_REG_TEMP_MAX
,
968 data
->temp_max
[attr
->index
]);
969 mutex_unlock(&data
->update_lock
);
973 static struct sensor_device_attribute temp_max
[] = {
974 SENSOR_ATTR_RW(temp1_max
, temp_max
, 0),
975 SENSOR_ATTR_RW(temp2_max
, temp_max
, 1),
976 SENSOR_ATTR_RW(temp3_max
, temp_max
, 2),
979 static ssize_t
temp_crit_show(struct device
*dev
,
980 struct device_attribute
*devattr
, char *buf
)
982 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
983 struct pc87360_data
*data
= pc87360_update_device(dev
);
984 return sprintf(buf
, "%d\n",
985 TEMP_FROM_REG(data
->temp_crit
[attr
->index
]));
988 static ssize_t
temp_crit_store(struct device
*dev
,
989 struct device_attribute
*devattr
,
990 const char *buf
, size_t count
)
992 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
993 struct pc87360_data
*data
= dev_get_drvdata(dev
);
997 err
= kstrtol(buf
, 10, &val
);
1001 mutex_lock(&data
->update_lock
);
1002 data
->temp_crit
[attr
->index
] = TEMP_TO_REG(val
);
1003 pc87360_write_value(data
, LD_TEMP
, attr
->index
, PC87365_REG_TEMP_CRIT
,
1004 data
->temp_crit
[attr
->index
]);
1005 mutex_unlock(&data
->update_lock
);
1009 static struct sensor_device_attribute temp_crit
[] = {
1010 SENSOR_ATTR_RW(temp1_crit
, temp_crit
, 0),
1011 SENSOR_ATTR_RW(temp2_crit
, temp_crit
, 1),
1012 SENSOR_ATTR_RW(temp3_crit
, temp_crit
, 2),
1016 * temp_min/max_alarm_show() reads data from the per-channel status
1017 * register (sec 12.3.7), not the temp event status registers (sec
1018 * 12.3.2) that show_temp_alarm() reads (via data->temp_alarms)
1020 static ssize_t
temp_min_alarm_show(struct device
*dev
,
1021 struct device_attribute
*devattr
,
1024 struct pc87360_data
*data
= pc87360_update_device(dev
);
1025 unsigned nr
= to_sensor_dev_attr(devattr
)->index
;
1027 return sprintf(buf
, "%u\n", !!(data
->temp_status
[nr
] & CHAN_ALM_MIN
));
1030 static struct sensor_device_attribute temp_min_alarm
[] = {
1031 SENSOR_ATTR_RO(temp1_min_alarm
, temp_min_alarm
, 0),
1032 SENSOR_ATTR_RO(temp2_min_alarm
, temp_min_alarm
, 1),
1033 SENSOR_ATTR_RO(temp3_min_alarm
, temp_min_alarm
, 2),
1036 static ssize_t
temp_max_alarm_show(struct device
*dev
,
1037 struct device_attribute
*devattr
,
1040 struct pc87360_data
*data
= pc87360_update_device(dev
);
1041 unsigned nr
= to_sensor_dev_attr(devattr
)->index
;
1043 return sprintf(buf
, "%u\n", !!(data
->temp_status
[nr
] & CHAN_ALM_MAX
));
1046 static struct sensor_device_attribute temp_max_alarm
[] = {
1047 SENSOR_ATTR_RO(temp1_max_alarm
, temp_max_alarm
, 0),
1048 SENSOR_ATTR_RO(temp2_max_alarm
, temp_max_alarm
, 1),
1049 SENSOR_ATTR_RO(temp3_max_alarm
, temp_max_alarm
, 2),
1052 static ssize_t
temp_crit_alarm_show(struct device
*dev
,
1053 struct device_attribute
*devattr
,
1056 struct pc87360_data
*data
= pc87360_update_device(dev
);
1057 unsigned nr
= to_sensor_dev_attr(devattr
)->index
;
1059 return sprintf(buf
, "%u\n", !!(data
->temp_status
[nr
] & TEMP_ALM_CRIT
));
1062 static struct sensor_device_attribute temp_crit_alarm
[] = {
1063 SENSOR_ATTR_RO(temp1_crit_alarm
, temp_crit_alarm
, 0),
1064 SENSOR_ATTR_RO(temp2_crit_alarm
, temp_crit_alarm
, 1),
1065 SENSOR_ATTR_RO(temp3_crit_alarm
, temp_crit_alarm
, 2),
1068 #define TEMP_FAULT 0x40 /* open diode */
1069 static ssize_t
temp_fault_show(struct device
*dev
,
1070 struct device_attribute
*devattr
, char *buf
)
1072 struct pc87360_data
*data
= pc87360_update_device(dev
);
1073 unsigned nr
= to_sensor_dev_attr(devattr
)->index
;
1075 return sprintf(buf
, "%u\n", !!(data
->temp_status
[nr
] & TEMP_FAULT
));
1078 static struct sensor_device_attribute temp_fault
[] = {
1079 SENSOR_ATTR_RO(temp1_fault
, temp_fault
, 0),
1080 SENSOR_ATTR_RO(temp2_fault
, temp_fault
, 1),
1081 SENSOR_ATTR_RO(temp3_fault
, temp_fault
, 2),
1084 #define TEMP_UNIT_ATTRS(X) \
1085 { &temp_input[X].dev_attr.attr, \
1086 &temp_status[X].dev_attr.attr, \
1087 &temp_min[X].dev_attr.attr, \
1088 &temp_max[X].dev_attr.attr, \
1089 &temp_crit[X].dev_attr.attr, \
1090 &temp_min_alarm[X].dev_attr.attr, \
1091 &temp_max_alarm[X].dev_attr.attr, \
1092 &temp_crit_alarm[X].dev_attr.attr, \
1093 &temp_fault[X].dev_attr.attr, \
1097 static struct attribute
*pc8736x_temp_attr
[][10] = {
1103 static const struct attribute_group pc8736x_temp_attr_group
[] = {
1104 { .attrs
= pc8736x_temp_attr
[0] },
1105 { .attrs
= pc8736x_temp_attr
[1] },
1106 { .attrs
= pc8736x_temp_attr
[2] }
1109 static ssize_t
alarms_temp_show(struct device
*dev
,
1110 struct device_attribute
*attr
, char *buf
)
1112 struct pc87360_data
*data
= pc87360_update_device(dev
);
1113 return sprintf(buf
, "%u\n", data
->temp_alarms
);
1116 static DEVICE_ATTR_RO(alarms_temp
);
1118 static ssize_t
fan_input_show(struct device
*dev
,
1119 struct device_attribute
*devattr
, char *buf
)
1121 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
1122 struct pc87360_data
*data
= pc87360_update_device(dev
);
1123 return sprintf(buf
, "%u\n", FAN_FROM_REG(data
->fan
[attr
->index
],
1124 FAN_DIV_FROM_REG(data
->fan_status
[attr
->index
])));
1127 static struct sensor_device_attribute fan_input
[] = {
1128 SENSOR_ATTR_RO(fan1_input
, fan_input
, 0),
1129 SENSOR_ATTR_RO(fan2_input
, fan_input
, 1),
1130 SENSOR_ATTR_RO(fan3_input
, fan_input
, 2),
1133 static ssize_t
fan_status_show(struct device
*dev
,
1134 struct device_attribute
*devattr
, char *buf
)
1136 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
1137 struct pc87360_data
*data
= pc87360_update_device(dev
);
1138 return sprintf(buf
, "%u\n",
1139 FAN_STATUS_FROM_REG(data
->fan_status
[attr
->index
]));
1142 static struct sensor_device_attribute fan_status
[] = {
1143 SENSOR_ATTR_RO(fan1_status
, fan_status
, 0),
1144 SENSOR_ATTR_RO(fan2_status
, fan_status
, 1),
1145 SENSOR_ATTR_RO(fan3_status
, fan_status
, 2),
1148 static ssize_t
fan_div_show(struct device
*dev
,
1149 struct device_attribute
*devattr
, char *buf
)
1151 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
1152 struct pc87360_data
*data
= pc87360_update_device(dev
);
1153 return sprintf(buf
, "%u\n",
1154 FAN_DIV_FROM_REG(data
->fan_status
[attr
->index
]));
1157 static struct sensor_device_attribute fan_div
[] = {
1158 SENSOR_ATTR_RO(fan1_div
, fan_div
, 0),
1159 SENSOR_ATTR_RO(fan2_div
, fan_div
, 1),
1160 SENSOR_ATTR_RO(fan3_div
, fan_div
, 2),
1163 static ssize_t
fan_min_show(struct device
*dev
,
1164 struct device_attribute
*devattr
, char *buf
)
1166 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
1167 struct pc87360_data
*data
= pc87360_update_device(dev
);
1168 return sprintf(buf
, "%u\n", FAN_FROM_REG(data
->fan_min
[attr
->index
],
1169 FAN_DIV_FROM_REG(data
->fan_status
[attr
->index
])));
1172 static ssize_t
fan_min_store(struct device
*dev
,
1173 struct device_attribute
*devattr
,
1174 const char *buf
, size_t count
)
1176 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
1177 struct pc87360_data
*data
= dev_get_drvdata(dev
);
1181 err
= kstrtol(buf
, 10, &fan_min
);
1185 mutex_lock(&data
->update_lock
);
1186 fan_min
= FAN_TO_REG(fan_min
,
1187 FAN_DIV_FROM_REG(data
->fan_status
[attr
->index
]));
1189 /* If it wouldn't fit, change clock divisor */
1190 while (fan_min
> 255
1191 && (data
->fan_status
[attr
->index
] & 0x60) != 0x60) {
1193 data
->fan
[attr
->index
] >>= 1;
1194 data
->fan_status
[attr
->index
] += 0x20;
1196 data
->fan_min
[attr
->index
] = fan_min
> 255 ? 255 : fan_min
;
1197 pc87360_write_value(data
, LD_FAN
, NO_BANK
,
1198 PC87360_REG_FAN_MIN(attr
->index
),
1199 data
->fan_min
[attr
->index
]);
1201 /* Write new divider, preserve alarm bits */
1202 pc87360_write_value(data
, LD_FAN
, NO_BANK
,
1203 PC87360_REG_FAN_STATUS(attr
->index
),
1204 data
->fan_status
[attr
->index
] & 0xF9);
1205 mutex_unlock(&data
->update_lock
);
1210 static struct sensor_device_attribute fan_min
[] = {
1211 SENSOR_ATTR_RW(fan1_min
, fan_min
, 0),
1212 SENSOR_ATTR_RW(fan2_min
, fan_min
, 1),
1213 SENSOR_ATTR_RW(fan3_min
, fan_min
, 2),
1216 #define FAN_UNIT_ATTRS(X) \
1217 { &fan_input[X].dev_attr.attr, \
1218 &fan_status[X].dev_attr.attr, \
1219 &fan_div[X].dev_attr.attr, \
1220 &fan_min[X].dev_attr.attr, \
1224 static struct attribute
*pc8736x_fan_attr
[][5] = {
1230 static const struct attribute_group pc8736x_fan_attr_group
[] = {
1231 { .attrs
= pc8736x_fan_attr
[0], },
1232 { .attrs
= pc8736x_fan_attr
[1], },
1233 { .attrs
= pc8736x_fan_attr
[2], },
1236 static ssize_t
pwm_show(struct device
*dev
, struct device_attribute
*devattr
,
1239 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
1240 struct pc87360_data
*data
= pc87360_update_device(dev
);
1241 return sprintf(buf
, "%u\n",
1242 PWM_FROM_REG(data
->pwm
[attr
->index
],
1243 FAN_CONFIG_INVERT(data
->fan_conf
,
1247 static ssize_t
pwm_store(struct device
*dev
, struct device_attribute
*devattr
,
1248 const char *buf
, size_t count
)
1250 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
1251 struct pc87360_data
*data
= dev_get_drvdata(dev
);
1255 err
= kstrtol(buf
, 10, &val
);
1259 mutex_lock(&data
->update_lock
);
1260 data
->pwm
[attr
->index
] = PWM_TO_REG(val
,
1261 FAN_CONFIG_INVERT(data
->fan_conf
, attr
->index
));
1262 pc87360_write_value(data
, LD_FAN
, NO_BANK
, PC87360_REG_PWM(attr
->index
),
1263 data
->pwm
[attr
->index
]);
1264 mutex_unlock(&data
->update_lock
);
1268 static struct sensor_device_attribute pwm
[] = {
1269 SENSOR_ATTR_RW(pwm1
, pwm
, 0),
1270 SENSOR_ATTR_RW(pwm2
, pwm
, 1),
1271 SENSOR_ATTR_RW(pwm3
, pwm
, 2),
1274 static ssize_t
name_show(struct device
*dev
,
1275 struct device_attribute
*devattr
, char *buf
)
1277 struct pc87360_data
*data
= dev_get_drvdata(dev
);
1278 return sprintf(buf
, "%s\n", data
->name
);
1281 static DEVICE_ATTR_RO(name
);
1283 static void pc87360_remove_files(struct device
*dev
)
1287 device_remove_file(dev
, &dev_attr_name
);
1288 device_remove_file(dev
, &dev_attr_alarms_temp
);
1289 for (i
= 0; i
< ARRAY_SIZE(pc8736x_temp_attr_group
); i
++)
1290 sysfs_remove_group(&dev
->kobj
, &pc8736x_temp_attr_group
[i
]);
1291 for (i
= 0; i
< ARRAY_SIZE(pc8736x_fan_attr_group
); i
++) {
1292 sysfs_remove_group(&pdev
->dev
.kobj
, &pc8736x_fan_attr_group
[i
]);
1293 device_remove_file(dev
, &pwm
[i
].dev_attr
);
1295 sysfs_remove_group(&dev
->kobj
, &pc8736x_therm_group
);
1296 sysfs_remove_group(&dev
->kobj
, &pc8736x_vin_group
);
1299 static void pc87360_init_device(struct platform_device
*pdev
,
1300 int use_thermistors
)
1302 struct pc87360_data
*data
= platform_get_drvdata(pdev
);
1304 const u8 init_in
[14] = { 2, 2, 2, 2, 2, 2, 2, 1, 1, 3, 1, 2, 2, 2 };
1305 const u8 init_temp
[3] = { 2, 2, 1 };
1308 if (init
>= 2 && data
->innr
) {
1309 reg
= pc87360_read_value(data
, LD_IN
, NO_BANK
,
1310 PC87365_REG_IN_CONVRATE
);
1311 dev_info(&pdev
->dev
,
1312 "VLM conversion set to 1s period, 160us delay\n");
1313 pc87360_write_value(data
, LD_IN
, NO_BANK
,
1314 PC87365_REG_IN_CONVRATE
,
1315 (reg
& 0xC0) | 0x11);
1318 nr
= min(data
->innr
, 11);
1319 for (i
= 0; i
< nr
; i
++) {
1320 reg
= pc87360_read_value(data
, LD_IN
, i
,
1321 PC87365_REG_IN_STATUS
);
1322 dev_dbg(&pdev
->dev
, "bios in%d status:0x%02x\n", i
, reg
);
1323 if (init
>= init_in
[i
]) {
1324 /* Forcibly enable voltage channel */
1325 if (!(reg
& CHAN_ENA
)) {
1326 dev_dbg(&pdev
->dev
, "Forcibly enabling in%d\n",
1328 pc87360_write_value(data
, LD_IN
, i
,
1329 PC87365_REG_IN_STATUS
,
1330 (reg
& 0x68) | 0x87);
1336 * We can't blindly trust the Super-I/O space configuration bit,
1337 * most BIOS won't set it properly
1339 dev_dbg(&pdev
->dev
, "bios thermistors:%d\n", use_thermistors
);
1340 for (i
= 11; i
< data
->innr
; i
++) {
1341 reg
= pc87360_read_value(data
, LD_IN
, i
,
1342 PC87365_REG_TEMP_STATUS
);
1343 use_thermistors
= use_thermistors
|| (reg
& CHAN_ENA
);
1344 /* thermistors are temp[4-6], measured on vin[11-14] */
1345 dev_dbg(&pdev
->dev
, "bios temp%d_status:0x%02x\n", i
-7, reg
);
1347 dev_dbg(&pdev
->dev
, "using thermistors:%d\n", use_thermistors
);
1349 i
= use_thermistors
? 2 : 0;
1350 for (; i
< data
->tempnr
; i
++) {
1351 reg
= pc87360_read_value(data
, LD_TEMP
, i
,
1352 PC87365_REG_TEMP_STATUS
);
1353 dev_dbg(&pdev
->dev
, "bios temp%d_status:0x%02x\n", i
+ 1, reg
);
1354 if (init
>= init_temp
[i
]) {
1355 /* Forcibly enable temperature channel */
1356 if (!(reg
& CHAN_ENA
)) {
1358 "Forcibly enabling temp%d\n", i
+ 1);
1359 pc87360_write_value(data
, LD_TEMP
, i
,
1360 PC87365_REG_TEMP_STATUS
,
1366 if (use_thermistors
) {
1367 for (i
= 11; i
< data
->innr
; i
++) {
1368 if (init
>= init_in
[i
]) {
1370 * The pin may already be used by thermal
1373 reg
= pc87360_read_value(data
, LD_TEMP
,
1374 (i
- 11) / 2, PC87365_REG_TEMP_STATUS
);
1375 if (reg
& CHAN_ENA
) {
1377 "Skipping temp%d, pin already in use by temp%d\n",
1378 i
- 7, (i
- 11) / 2);
1382 /* Forcibly enable thermistor channel */
1383 reg
= pc87360_read_value(data
, LD_IN
, i
,
1384 PC87365_REG_IN_STATUS
);
1385 if (!(reg
& CHAN_ENA
)) {
1387 "Forcibly enabling temp%d\n",
1389 pc87360_write_value(data
, LD_IN
, i
,
1390 PC87365_REG_TEMP_STATUS
,
1391 (reg
& 0x60) | 0x8F);
1398 reg
= pc87360_read_value(data
, LD_IN
, NO_BANK
,
1399 PC87365_REG_IN_CONFIG
);
1400 dev_dbg(&pdev
->dev
, "bios vin-cfg:0x%02x\n", reg
);
1401 if (reg
& CHAN_ENA
) {
1403 "Forcibly enabling monitoring (VLM)\n");
1404 pc87360_write_value(data
, LD_IN
, NO_BANK
,
1405 PC87365_REG_IN_CONFIG
,
1411 reg
= pc87360_read_value(data
, LD_TEMP
, NO_BANK
,
1412 PC87365_REG_TEMP_CONFIG
);
1413 dev_dbg(&pdev
->dev
, "bios temp-cfg:0x%02x\n", reg
);
1414 if (reg
& CHAN_ENA
) {
1416 "Forcibly enabling monitoring (TMS)\n");
1417 pc87360_write_value(data
, LD_TEMP
, NO_BANK
,
1418 PC87365_REG_TEMP_CONFIG
,
1423 /* Chip config as documented by National Semi. */
1424 pc87360_write_value(data
, LD_TEMP
, 0xF, 0xA, 0x08);
1426 * We voluntarily omit the bank here, in case the
1427 * sequence itself matters. It shouldn't be a problem,
1428 * since nobody else is supposed to access the
1429 * device at that point.
1431 pc87360_write_value(data
, LD_TEMP
, NO_BANK
, 0xB, 0x04);
1432 pc87360_write_value(data
, LD_TEMP
, NO_BANK
, 0xC, 0x35);
1433 pc87360_write_value(data
, LD_TEMP
, NO_BANK
, 0xD, 0x05);
1434 pc87360_write_value(data
, LD_TEMP
, NO_BANK
, 0xE, 0x05);
1439 static int pc87360_probe(struct platform_device
*pdev
)
1442 struct pc87360_data
*data
;
1445 int use_thermistors
= 0;
1446 struct device
*dev
= &pdev
->dev
;
1448 data
= devm_kzalloc(dev
, sizeof(struct pc87360_data
), GFP_KERNEL
);
1467 data
->fannr
= extra_isa
[0] ? 3 : 0;
1468 data
->innr
= extra_isa
[1] ? 11 : 0;
1469 data
->tempnr
= extra_isa
[2] ? 2 : 0;
1473 data
->fannr
= extra_isa
[0] ? 3 : 0;
1474 data
->innr
= extra_isa
[1] ? 14 : 0;
1475 data
->tempnr
= extra_isa
[2] ? 3 : 0;
1480 mutex_init(&data
->lock
);
1481 mutex_init(&data
->update_lock
);
1482 platform_set_drvdata(pdev
, data
);
1484 for (i
= 0; i
< LDNI_MAX
; i
++) {
1485 data
->address
[i
] = extra_isa
[i
];
1486 if (data
->address
[i
]
1487 && !devm_request_region(dev
, extra_isa
[i
], PC87360_EXTENT
,
1490 "Region 0x%x-0x%x already in use!\n",
1491 extra_isa
[i
], extra_isa
[i
]+PC87360_EXTENT
-1);
1496 /* Retrieve the fans configuration from Super-I/O space */
1498 data
->fan_conf
= confreg
[0] | (confreg
[1] << 8);
1501 * Use the correct reference voltage
1502 * Unless both the VLM and the TMS logical devices agree to
1503 * use an external Vref, the internal one is used.
1506 i
= pc87360_read_value(data
, LD_IN
, NO_BANK
,
1507 PC87365_REG_IN_CONFIG
);
1509 i
&= pc87360_read_value(data
, LD_TEMP
, NO_BANK
,
1510 PC87365_REG_TEMP_CONFIG
);
1512 data
->in_vref
= (i
&0x02) ? 3025 : 2966;
1513 dev_dbg(dev
, "Using %s reference voltage\n",
1514 (i
&0x02) ? "external" : "internal");
1516 data
->vid_conf
= confreg
[3];
1517 data
->vrm
= vid_which_vrm();
1520 /* Fan clock dividers may be needed before any data is read */
1521 for (i
= 0; i
< data
->fannr
; i
++) {
1522 if (FAN_CONFIG_MONITOR(data
->fan_conf
, i
))
1523 data
->fan_status
[i
] = pc87360_read_value(data
,
1525 PC87360_REG_FAN_STATUS(i
));
1529 if (devid
== 0xe9 && data
->address
[1]) /* PC87366 */
1530 use_thermistors
= confreg
[2] & 0x40;
1532 pc87360_init_device(pdev
, use_thermistors
);
1535 /* Register all-or-nothing sysfs groups */
1538 err
= sysfs_create_group(&dev
->kobj
, &pc8736x_vin_group
);
1543 if (data
->innr
== 14) {
1544 err
= sysfs_create_group(&dev
->kobj
, &pc8736x_therm_group
);
1549 /* create device attr-files for varying sysfs groups */
1552 for (i
= 0; i
< data
->tempnr
; i
++) {
1553 err
= sysfs_create_group(&dev
->kobj
,
1554 &pc8736x_temp_attr_group
[i
]);
1558 err
= device_create_file(dev
, &dev_attr_alarms_temp
);
1563 for (i
= 0; i
< data
->fannr
; i
++) {
1564 if (FAN_CONFIG_MONITOR(data
->fan_conf
, i
)) {
1565 err
= sysfs_create_group(&dev
->kobj
,
1566 &pc8736x_fan_attr_group
[i
]);
1570 if (FAN_CONFIG_CONTROL(data
->fan_conf
, i
)) {
1571 err
= device_create_file(dev
, &pwm
[i
].dev_attr
);
1577 err
= device_create_file(dev
, &dev_attr_name
);
1581 data
->hwmon_dev
= hwmon_device_register(dev
);
1582 if (IS_ERR(data
->hwmon_dev
)) {
1583 err
= PTR_ERR(data
->hwmon_dev
);
1589 pc87360_remove_files(dev
);
1593 static void pc87360_remove(struct platform_device
*pdev
)
1595 struct pc87360_data
*data
= platform_get_drvdata(pdev
);
1597 hwmon_device_unregister(data
->hwmon_dev
);
1598 pc87360_remove_files(&pdev
->dev
);
1604 static struct platform_driver pc87360_driver
= {
1606 .name
= DRIVER_NAME
,
1608 .probe
= pc87360_probe
,
1609 .remove
= pc87360_remove
,
1613 * Device detection, registration and update
1616 static int __init
pc87360_find(int sioaddr
, u8
*devid
,
1617 unsigned short *addresses
)
1621 int nrdev
; /* logical device count */
1623 /* No superio_enter */
1625 /* Identify device */
1626 val
= force_id
? force_id
: superio_inb(sioaddr
, DEVID
);
1628 case 0xE1: /* PC87360 */
1629 case 0xE8: /* PC87363 */
1630 case 0xE4: /* PC87364 */
1633 case 0xE5: /* PC87365 */
1634 case 0xE9: /* PC87366 */
1638 superio_exit(sioaddr
);
1641 /* Remember the device id */
1644 for (i
= 0; i
< nrdev
; i
++) {
1645 /* select logical device */
1646 superio_outb(sioaddr
, DEV
, logdev
[i
]);
1648 val
= superio_inb(sioaddr
, ACT
);
1649 if (!(val
& 0x01)) {
1650 pr_info("Device 0x%02x not activated\n", logdev
[i
]);
1654 val
= (superio_inb(sioaddr
, BASE
) << 8)
1655 | superio_inb(sioaddr
, BASE
+ 1);
1657 pr_info("Base address not set for device 0x%02x\n",
1664 if (i
== 0) { /* Fans */
1665 confreg
[0] = superio_inb(sioaddr
, 0xF0);
1666 confreg
[1] = superio_inb(sioaddr
, 0xF1);
1668 pr_debug("Fan %d: mon=%d ctrl=%d inv=%d\n", 1,
1669 (confreg
[0] >> 2) & 1, (confreg
[0] >> 3) & 1,
1670 (confreg
[0] >> 4) & 1);
1671 pr_debug("Fan %d: mon=%d ctrl=%d inv=%d\n", 2,
1672 (confreg
[0] >> 5) & 1, (confreg
[0] >> 6) & 1,
1673 (confreg
[0] >> 7) & 1);
1674 pr_debug("Fan %d: mon=%d ctrl=%d inv=%d\n", 3,
1675 confreg
[1] & 1, (confreg
[1] >> 1) & 1,
1676 (confreg
[1] >> 2) & 1);
1677 } else if (i
== 1) { /* Voltages */
1678 /* Are we using thermistors? */
1679 if (*devid
== 0xE9) { /* PC87366 */
1681 * These registers are not logical-device
1682 * specific, just that we won't need them if
1683 * we don't use the VLM device
1685 confreg
[2] = superio_inb(sioaddr
, 0x2B);
1686 confreg
[3] = superio_inb(sioaddr
, 0x25);
1688 if (confreg
[2] & 0x40) {
1689 pr_info("Using thermistors for temperature monitoring\n");
1691 if (confreg
[3] & 0xE0) {
1692 pr_info("VID inputs routed (mode %u)\n",
1699 superio_exit(sioaddr
);
1703 static int __init
pc87360_device_add(unsigned short address
)
1705 struct resource res
[3];
1706 int err
, i
, res_count
;
1708 pdev
= platform_device_alloc("pc87360", address
);
1711 pr_err("Device allocation failed\n");
1715 memset(res
, 0, 3 * sizeof(struct resource
));
1717 for (i
= 0; i
< 3; i
++) {
1720 res
[res_count
].start
= extra_isa
[i
];
1721 res
[res_count
].end
= extra_isa
[i
] + PC87360_EXTENT
- 1;
1722 res
[res_count
].name
= "pc87360";
1723 res
[res_count
].flags
= IORESOURCE_IO
;
1725 err
= acpi_check_resource_conflict(&res
[res_count
]);
1727 goto exit_device_put
;
1732 err
= platform_device_add_resources(pdev
, res
, res_count
);
1734 pr_err("Device resources addition failed (%d)\n", err
);
1735 goto exit_device_put
;
1738 err
= platform_device_add(pdev
);
1740 pr_err("Device addition failed (%d)\n", err
);
1741 goto exit_device_put
;
1747 platform_device_put(pdev
);
1752 static int __init
pc87360_init(void)
1755 unsigned short address
= 0;
1757 if (pc87360_find(0x2e, &devid
, extra_isa
)
1758 && pc87360_find(0x4e, &devid
, extra_isa
)) {
1759 pr_warn("PC8736x not detected, module not inserted\n");
1763 /* Arbitrarily pick one of the addresses */
1764 for (i
= 0; i
< 3; i
++) {
1765 if (extra_isa
[i
] != 0x0000) {
1766 address
= extra_isa
[i
];
1771 if (address
== 0x0000) {
1772 pr_warn("No active logical device, module not inserted\n");
1776 err
= platform_driver_register(&pc87360_driver
);
1780 /* Sets global pdev as a side effect */
1781 err
= pc87360_device_add(address
);
1788 platform_driver_unregister(&pc87360_driver
);
1793 static void __exit
pc87360_exit(void)
1795 platform_device_unregister(pdev
);
1796 platform_driver_unregister(&pc87360_driver
);
1799 MODULE_AUTHOR("Jean Delvare <jdelvare@suse.de>");
1800 MODULE_DESCRIPTION("PC8736x hardware monitor");
1801 MODULE_LICENSE("GPL");
1802 MODULE_ALIAS("platform:" DRIVER_NAME
);
1804 module_init(pc87360_init
);
1805 module_exit(pc87360_exit
);