2 * nct6683 - Driver for the hardware monitoring functionality of
3 * Nuvoton NCT6683D eSIO
5 * Copyright (C) 2013 Guenter Roeck <linux@roeck-us.net>
7 * Derived from nct6775 driver
8 * Copyright (C) 2012, 2013 Guenter Roeck <linux@roeck-us.net>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * Supports the following chips:
22 * Chip #vin #fan #pwm #temp chip ID
23 * nct6683d 21(1) 16 8 32(1) 0xc730
26 * (1) Total number of vin and temp inputs is 32.
29 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
31 #include <linux/acpi.h>
32 #include <linux/delay.h>
33 #include <linux/err.h>
34 #include <linux/init.h>
36 #include <linux/jiffies.h>
37 #include <linux/hwmon.h>
38 #include <linux/hwmon-sysfs.h>
39 #include <linux/module.h>
40 #include <linux/mutex.h>
41 #include <linux/platform_device.h>
42 #include <linux/slab.h>
44 enum kinds
{ nct6683
};
47 module_param(force
, bool, 0);
48 MODULE_PARM_DESC(force
, "Set to one to enable support for unknown vendors");
50 static const char * const nct6683_device_names
[] = {
54 static const char * const nct6683_chip_names
[] = {
58 #define DRVNAME "nct6683"
61 * Super-I/O constants and functions
64 #define NCT6683_LD_ACPI 0x0a
65 #define NCT6683_LD_HWM 0x0b
66 #define NCT6683_LD_VID 0x0d
68 #define SIO_REG_LDSEL 0x07 /* Logical device select */
69 #define SIO_REG_DEVID 0x20 /* Device ID (2 bytes) */
70 #define SIO_REG_ENABLE 0x30 /* Logical device enable */
71 #define SIO_REG_ADDR 0x60 /* Logical device address (2 bytes) */
73 #define SIO_NCT6681_ID 0xb270 /* for later */
74 #define SIO_NCT6683_ID 0xc730
75 #define SIO_ID_MASK 0xFFF0
78 superio_outb(int ioreg
, int reg
, int val
)
85 superio_inb(int ioreg
, int reg
)
88 return inb(ioreg
+ 1);
92 superio_select(int ioreg
, int ld
)
94 outb(SIO_REG_LDSEL
, ioreg
);
99 superio_enter(int ioreg
)
102 * Try to reserve <ioreg> and <ioreg + 1> for exclusive access.
104 if (!request_muxed_region(ioreg
, 2, DRVNAME
))
114 superio_exit(int ioreg
)
118 outb(0x02, ioreg
+ 1);
119 release_region(ioreg
, 2);
126 #define IOREGION_ALIGNMENT (~7)
127 #define IOREGION_OFFSET 4 /* Use EC port 1 */
128 #define IOREGION_LENGTH 4
130 #define EC_PAGE_REG 0
131 #define EC_INDEX_REG 1
132 #define EC_DATA_REG 2
133 #define EC_EVENT_REG 3
135 /* Common and NCT6683 specific data */
137 #define NCT6683_NUM_REG_MON 32
138 #define NCT6683_NUM_REG_FAN 16
139 #define NCT6683_NUM_REG_PWM 8
141 #define NCT6683_REG_MON(x) (0x100 + (x) * 2)
142 #define NCT6683_REG_FAN_RPM(x) (0x140 + (x) * 2)
143 #define NCT6683_REG_PWM(x) (0x160 + (x))
144 #define NCT6683_REG_PWM_WRITE(x) (0xa28 + (x))
146 #define NCT6683_REG_MON_STS(x) (0x174 + (x))
147 #define NCT6683_REG_IDLE(x) (0x178 + (x))
149 #define NCT6683_REG_FAN_STS(x) (0x17c + (x))
150 #define NCT6683_REG_FAN_ERRSTS 0x17e
151 #define NCT6683_REG_FAN_INITSTS 0x17f
153 #define NCT6683_HWM_CFG 0x180
155 #define NCT6683_REG_MON_CFG(x) (0x1a0 + (x))
156 #define NCT6683_REG_FANIN_CFG(x) (0x1c0 + (x))
157 #define NCT6683_REG_FANOUT_CFG(x) (0x1d0 + (x))
159 #define NCT6683_REG_INTEL_TEMP_MAX(x) (0x901 + (x) * 16)
160 #define NCT6683_REG_INTEL_TEMP_CRIT(x) (0x90d + (x) * 16)
162 #define NCT6683_REG_TEMP_HYST(x) (0x330 + (x)) /* 8 bit */
163 #define NCT6683_REG_TEMP_MAX(x) (0x350 + (x)) /* 8 bit */
164 #define NCT6683_REG_MON_HIGH(x) (0x370 + (x) * 2) /* 8 bit */
165 #define NCT6683_REG_MON_LOW(x) (0x371 + (x) * 2) /* 8 bit */
167 #define NCT6683_REG_FAN_MIN(x) (0x3b8 + (x) * 2) /* 16 bit */
169 #define NCT6683_REG_FAN_CFG_CTRL 0xa01
170 #define NCT6683_FAN_CFG_REQ 0x80
171 #define NCT6683_FAN_CFG_DONE 0x40
173 #define NCT6683_REG_CUSTOMER_ID 0x602
174 #define NCT6683_CUSTOMER_ID_INTEL 0x805
175 #define NCT6683_CUSTOMER_ID_MITAC 0xa0e
177 #define NCT6683_REG_BUILD_YEAR 0x604
178 #define NCT6683_REG_BUILD_MONTH 0x605
179 #define NCT6683_REG_BUILD_DAY 0x606
180 #define NCT6683_REG_SERIAL 0x607
181 #define NCT6683_REG_VERSION_HI 0x608
182 #define NCT6683_REG_VERSION_LO 0x609
184 #define NCT6683_REG_CR_CASEOPEN 0xe8
185 #define NCT6683_CR_CASEOPEN_MASK (1 << 7)
187 #define NCT6683_REG_CR_BEEP 0xe0
188 #define NCT6683_CR_BEEP_MASK (1 << 6)
190 static const char *const nct6683_mon_label
[] = {
207 "Thermistor 5", /* 0x10 */
216 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
217 "PECI 0.0", /* 0x20 */
229 NULL
, NULL
, NULL
, NULL
,
230 "PCH CPU", /* 0x30 */
256 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
257 "Virtual 0", /* 0x50 */
265 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
266 "VCC", /* 0x60 voltage sensors */
291 #define NUM_MON_LABELS ARRAY_SIZE(nct6683_mon_label)
292 #define MON_VOLTAGE_START 0x60
294 /* ------------------------------------------------------- */
296 struct nct6683_data
{
297 int addr
; /* IO base of EC space */
298 int sioreg
; /* SIO register */
302 struct device
*hwmon_dev
;
303 const struct attribute_group
*groups
[6];
305 int temp_num
; /* number of temperature attributes */
306 u8 temp_index
[NCT6683_NUM_REG_MON
];
307 u8 temp_src
[NCT6683_NUM_REG_MON
];
309 u8 in_num
; /* number of voltage attributes */
310 u8 in_index
[NCT6683_NUM_REG_MON
];
311 u8 in_src
[NCT6683_NUM_REG_MON
];
313 struct mutex update_lock
; /* used to protect sensor updates */
314 bool valid
; /* true if following fields are valid */
315 unsigned long last_updated
; /* In jiffies */
317 /* Voltage attribute values */
318 u8 in
[3][NCT6683_NUM_REG_MON
]; /* [0]=in, [1]=in_max, [2]=in_min */
320 /* Temperature attribute values */
321 s16 temp_in
[NCT6683_NUM_REG_MON
];
322 s8 temp
[4][NCT6683_NUM_REG_MON
];/* [0]=min, [1]=max, [2]=hyst,
326 /* Fan attribute values */
327 unsigned int rpm
[NCT6683_NUM_REG_FAN
];
328 u16 fan_min
[NCT6683_NUM_REG_FAN
];
329 u8 fanin_cfg
[NCT6683_NUM_REG_FAN
];
330 u8 fanout_cfg
[NCT6683_NUM_REG_FAN
];
331 u16 have_fan
; /* some fan inputs can be disabled */
334 u8 pwm
[NCT6683_NUM_REG_PWM
];
337 /* Remember extra register values over suspend/resume */
342 struct nct6683_sio_data
{
347 struct sensor_device_template
{
348 struct device_attribute dev_attr
;
356 bool s2
; /* true if both index and nr are used */
359 struct sensor_device_attr_u
{
361 struct sensor_device_attribute a1
;
362 struct sensor_device_attribute_2 a2
;
367 #define __TEMPLATE_ATTR(_template, _mode, _show, _store) { \
368 .attr = {.name = _template, .mode = _mode }, \
373 #define SENSOR_DEVICE_TEMPLATE(_template, _mode, _show, _store, _index) \
374 { .dev_attr = __TEMPLATE_ATTR(_template, _mode, _show, _store), \
378 #define SENSOR_DEVICE_TEMPLATE_2(_template, _mode, _show, _store, \
380 { .dev_attr = __TEMPLATE_ATTR(_template, _mode, _show, _store), \
381 .u.s.index = _index, \
385 #define SENSOR_TEMPLATE(_name, _template, _mode, _show, _store, _index) \
386 static struct sensor_device_template sensor_dev_template_##_name \
387 = SENSOR_DEVICE_TEMPLATE(_template, _mode, _show, _store, \
390 #define SENSOR_TEMPLATE_2(_name, _template, _mode, _show, _store, \
392 static struct sensor_device_template sensor_dev_template_##_name \
393 = SENSOR_DEVICE_TEMPLATE_2(_template, _mode, _show, _store, \
396 struct sensor_template_group
{
397 struct sensor_device_template
**templates
;
398 umode_t (*is_visible
)(struct kobject
*, struct attribute
*, int);
402 static struct attribute_group
*
403 nct6683_create_attr_group(struct device
*dev
,
404 const struct sensor_template_group
*tg
,
407 struct sensor_device_attribute_2
*a2
;
408 struct sensor_device_attribute
*a
;
409 struct sensor_device_template
**t
;
410 struct sensor_device_attr_u
*su
;
411 struct attribute_group
*group
;
412 struct attribute
**attrs
;
416 return ERR_PTR(-EINVAL
);
419 for (count
= 0; *t
; t
++, count
++)
423 return ERR_PTR(-EINVAL
);
425 group
= devm_kzalloc(dev
, sizeof(*group
), GFP_KERNEL
);
427 return ERR_PTR(-ENOMEM
);
429 attrs
= devm_kzalloc(dev
, sizeof(*attrs
) * (repeat
* count
+ 1),
432 return ERR_PTR(-ENOMEM
);
434 su
= devm_kzalloc(dev
, sizeof(*su
) * repeat
* count
,
437 return ERR_PTR(-ENOMEM
);
439 group
->attrs
= attrs
;
440 group
->is_visible
= tg
->is_visible
;
442 for (i
= 0; i
< repeat
; i
++) {
444 for (j
= 0; *t
!= NULL
; j
++) {
445 snprintf(su
->name
, sizeof(su
->name
),
446 (*t
)->dev_attr
.attr
.name
, tg
->base
+ i
);
449 sysfs_attr_init(&a2
->dev_attr
.attr
);
450 a2
->dev_attr
.attr
.name
= su
->name
;
451 a2
->nr
= (*t
)->u
.s
.nr
+ i
;
452 a2
->index
= (*t
)->u
.s
.index
;
453 a2
->dev_attr
.attr
.mode
=
454 (*t
)->dev_attr
.attr
.mode
;
455 a2
->dev_attr
.show
= (*t
)->dev_attr
.show
;
456 a2
->dev_attr
.store
= (*t
)->dev_attr
.store
;
457 *attrs
= &a2
->dev_attr
.attr
;
460 sysfs_attr_init(&a
->dev_attr
.attr
);
461 a
->dev_attr
.attr
.name
= su
->name
;
462 a
->index
= (*t
)->u
.index
+ i
;
463 a
->dev_attr
.attr
.mode
=
464 (*t
)->dev_attr
.attr
.mode
;
465 a
->dev_attr
.show
= (*t
)->dev_attr
.show
;
466 a
->dev_attr
.store
= (*t
)->dev_attr
.store
;
467 *attrs
= &a
->dev_attr
.attr
;
478 /* LSB is 16 mV, except for the following sources, where it is 32 mV */
479 #define MON_SRC_VCC 0x60
480 #define MON_SRC_VSB 0x61
481 #define MON_SRC_AVSB 0x62
482 #define MON_SRC_VBAT 0x64
484 static inline long in_from_reg(u16 reg
, u8 src
)
488 if (src
== MON_SRC_VCC
|| src
== MON_SRC_VSB
|| src
== MON_SRC_AVSB
||
494 static inline u16
in_to_reg(u32 val
, u8 src
)
498 if (src
== MON_SRC_VCC
|| src
== MON_SRC_VSB
|| src
== MON_SRC_AVSB
||
502 return clamp_val(DIV_ROUND_CLOSEST(val
, scale
), 0, 127);
505 static u16
nct6683_read(struct nct6683_data
*data
, u16 reg
)
509 outb_p(0xff, data
->addr
+ EC_PAGE_REG
); /* unlock */
510 outb_p(reg
>> 8, data
->addr
+ EC_PAGE_REG
);
511 outb_p(reg
& 0xff, data
->addr
+ EC_INDEX_REG
);
512 res
= inb_p(data
->addr
+ EC_DATA_REG
);
516 static u16
nct6683_read16(struct nct6683_data
*data
, u16 reg
)
518 return (nct6683_read(data
, reg
) << 8) | nct6683_read(data
, reg
+ 1);
521 static void nct6683_write(struct nct6683_data
*data
, u16 reg
, u16 value
)
523 outb_p(0xff, data
->addr
+ EC_PAGE_REG
); /* unlock */
524 outb_p(reg
>> 8, data
->addr
+ EC_PAGE_REG
);
525 outb_p(reg
& 0xff, data
->addr
+ EC_INDEX_REG
);
526 outb_p(value
& 0xff, data
->addr
+ EC_DATA_REG
);
529 static int get_in_reg(struct nct6683_data
*data
, int nr
, int index
)
531 int ch
= data
->in_index
[index
];
536 reg
= NCT6683_REG_MON(ch
);
539 if (data
->customer_id
!= NCT6683_CUSTOMER_ID_INTEL
)
540 reg
= NCT6683_REG_MON_LOW(ch
);
543 if (data
->customer_id
!= NCT6683_CUSTOMER_ID_INTEL
)
544 reg
= NCT6683_REG_MON_HIGH(ch
);
552 static int get_temp_reg(struct nct6683_data
*data
, int nr
, int index
)
554 int ch
= data
->temp_index
[index
];
557 switch (data
->customer_id
) {
558 case NCT6683_CUSTOMER_ID_INTEL
:
562 reg
= NCT6683_REG_INTEL_TEMP_MAX(ch
);
565 reg
= NCT6683_REG_INTEL_TEMP_CRIT(ch
);
569 case NCT6683_CUSTOMER_ID_MITAC
:
574 reg
= NCT6683_REG_MON_LOW(ch
);
577 reg
= NCT6683_REG_TEMP_MAX(ch
);
580 reg
= NCT6683_REG_TEMP_HYST(ch
);
583 reg
= NCT6683_REG_MON_HIGH(ch
);
591 static void nct6683_update_pwm(struct device
*dev
)
593 struct nct6683_data
*data
= dev_get_drvdata(dev
);
596 for (i
= 0; i
< NCT6683_NUM_REG_PWM
; i
++) {
597 if (!(data
->have_pwm
& (1 << i
)))
599 data
->pwm
[i
] = nct6683_read(data
, NCT6683_REG_PWM(i
));
603 static struct nct6683_data
*nct6683_update_device(struct device
*dev
)
605 struct nct6683_data
*data
= dev_get_drvdata(dev
);
608 mutex_lock(&data
->update_lock
);
610 if (time_after(jiffies
, data
->last_updated
+ HZ
) || !data
->valid
) {
611 /* Measured voltages and limits */
612 for (i
= 0; i
< data
->in_num
; i
++) {
613 for (j
= 0; j
< 3; j
++) {
614 int reg
= get_in_reg(data
, j
, i
);
618 nct6683_read(data
, reg
);
622 /* Measured temperatures and limits */
623 for (i
= 0; i
< data
->temp_num
; i
++) {
624 u8 ch
= data
->temp_index
[i
];
626 data
->temp_in
[i
] = nct6683_read16(data
,
627 NCT6683_REG_MON(ch
));
628 for (j
= 0; j
< 4; j
++) {
629 int reg
= get_temp_reg(data
, j
, i
);
633 nct6683_read(data
, reg
);
637 /* Measured fan speeds and limits */
638 for (i
= 0; i
< ARRAY_SIZE(data
->rpm
); i
++) {
639 if (!(data
->have_fan
& (1 << i
)))
642 data
->rpm
[i
] = nct6683_read16(data
,
643 NCT6683_REG_FAN_RPM(i
));
644 data
->fan_min
[i
] = nct6683_read16(data
,
645 NCT6683_REG_FAN_MIN(i
));
648 nct6683_update_pwm(dev
);
650 data
->last_updated
= jiffies
;
654 mutex_unlock(&data
->update_lock
);
659 * Sysfs callback functions
662 show_in_label(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
664 struct sensor_device_attribute
*sattr
= to_sensor_dev_attr(attr
);
665 struct nct6683_data
*data
= nct6683_update_device(dev
);
666 int nr
= sattr
->index
;
668 return sprintf(buf
, "%s\n", nct6683_mon_label
[data
->in_src
[nr
]]);
672 show_in_reg(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
674 struct sensor_device_attribute_2
*sattr
= to_sensor_dev_attr_2(attr
);
675 struct nct6683_data
*data
= nct6683_update_device(dev
);
676 int index
= sattr
->index
;
679 return sprintf(buf
, "%ld\n",
680 in_from_reg(data
->in
[index
][nr
], data
->in_index
[index
]));
683 static umode_t
nct6683_in_is_visible(struct kobject
*kobj
,
684 struct attribute
*attr
, int index
)
686 struct device
*dev
= container_of(kobj
, struct device
, kobj
);
687 struct nct6683_data
*data
= dev_get_drvdata(dev
);
688 int nr
= index
% 4; /* attribute */
691 * Voltage limits exist for Intel boards,
692 * but register location and encoding is unknown
694 if ((nr
== 2 || nr
== 3) &&
695 data
->customer_id
== NCT6683_CUSTOMER_ID_INTEL
)
701 SENSOR_TEMPLATE(in_label
, "in%d_label", S_IRUGO
, show_in_label
, NULL
, 0);
702 SENSOR_TEMPLATE_2(in_input
, "in%d_input", S_IRUGO
, show_in_reg
, NULL
, 0, 0);
703 SENSOR_TEMPLATE_2(in_min
, "in%d_min", S_IRUGO
, show_in_reg
, NULL
, 0, 1);
704 SENSOR_TEMPLATE_2(in_max
, "in%d_max", S_IRUGO
, show_in_reg
, NULL
, 0, 2);
706 static struct sensor_device_template
*nct6683_attributes_in_template
[] = {
707 &sensor_dev_template_in_label
,
708 &sensor_dev_template_in_input
,
709 &sensor_dev_template_in_min
,
710 &sensor_dev_template_in_max
,
714 static const struct sensor_template_group nct6683_in_template_group
= {
715 .templates
= nct6683_attributes_in_template
,
716 .is_visible
= nct6683_in_is_visible
,
720 show_fan(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
722 struct sensor_device_attribute
*sattr
= to_sensor_dev_attr(attr
);
723 struct nct6683_data
*data
= nct6683_update_device(dev
);
725 return sprintf(buf
, "%d\n", data
->rpm
[sattr
->index
]);
729 show_fan_min(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
731 struct nct6683_data
*data
= nct6683_update_device(dev
);
732 struct sensor_device_attribute
*sattr
= to_sensor_dev_attr(attr
);
733 int nr
= sattr
->index
;
735 return sprintf(buf
, "%d\n", data
->fan_min
[nr
]);
739 show_fan_pulses(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
741 struct sensor_device_attribute
*sattr
= to_sensor_dev_attr(attr
);
742 struct nct6683_data
*data
= nct6683_update_device(dev
);
744 return sprintf(buf
, "%d\n",
745 ((data
->fanin_cfg
[sattr
->index
] >> 5) & 0x03) + 1);
748 static umode_t
nct6683_fan_is_visible(struct kobject
*kobj
,
749 struct attribute
*attr
, int index
)
751 struct device
*dev
= container_of(kobj
, struct device
, kobj
);
752 struct nct6683_data
*data
= dev_get_drvdata(dev
);
753 int fan
= index
/ 3; /* fan index */
754 int nr
= index
% 3; /* attribute index */
756 if (!(data
->have_fan
& (1 << fan
)))
760 * Intel may have minimum fan speed limits,
761 * but register location and encoding are unknown.
763 if (nr
== 2 && data
->customer_id
== NCT6683_CUSTOMER_ID_INTEL
)
769 SENSOR_TEMPLATE(fan_input
, "fan%d_input", S_IRUGO
, show_fan
, NULL
, 0);
770 SENSOR_TEMPLATE(fan_pulses
, "fan%d_pulses", S_IRUGO
, show_fan_pulses
, NULL
, 0);
771 SENSOR_TEMPLATE(fan_min
, "fan%d_min", S_IRUGO
, show_fan_min
, NULL
, 0);
774 * nct6683_fan_is_visible uses the index into the following array
775 * to determine if attributes should be created or not.
776 * Any change in order or content must be matched.
778 static struct sensor_device_template
*nct6683_attributes_fan_template
[] = {
779 &sensor_dev_template_fan_input
,
780 &sensor_dev_template_fan_pulses
,
781 &sensor_dev_template_fan_min
,
785 static const struct sensor_template_group nct6683_fan_template_group
= {
786 .templates
= nct6683_attributes_fan_template
,
787 .is_visible
= nct6683_fan_is_visible
,
792 show_temp_label(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
794 struct sensor_device_attribute
*sattr
= to_sensor_dev_attr(attr
);
795 struct nct6683_data
*data
= nct6683_update_device(dev
);
796 int nr
= sattr
->index
;
798 return sprintf(buf
, "%s\n", nct6683_mon_label
[data
->temp_src
[nr
]]);
802 show_temp8(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
804 struct sensor_device_attribute_2
*sattr
= to_sensor_dev_attr_2(attr
);
805 struct nct6683_data
*data
= nct6683_update_device(dev
);
806 int index
= sattr
->index
;
809 return sprintf(buf
, "%d\n", data
->temp
[index
][nr
] * 1000);
813 show_temp_hyst(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
815 struct sensor_device_attribute
*sattr
= to_sensor_dev_attr(attr
);
816 struct nct6683_data
*data
= nct6683_update_device(dev
);
817 int nr
= sattr
->index
;
818 int temp
= data
->temp
[1][nr
] - data
->temp
[2][nr
];
820 return sprintf(buf
, "%d\n", temp
* 1000);
824 show_temp16(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
826 struct sensor_device_attribute
*sattr
= to_sensor_dev_attr(attr
);
827 struct nct6683_data
*data
= nct6683_update_device(dev
);
828 int index
= sattr
->index
;
830 return sprintf(buf
, "%d\n", (data
->temp_in
[index
] / 128) * 500);
834 * Temperature sensor type is determined by temperature source
835 * and can not be modified.
836 * 0x02..0x07: Thermal diode
837 * 0x08..0x18: Thermistor
838 * 0x20..0x2b: Intel PECI
839 * 0x42..0x49: AMD TSI
840 * Others are unspecified (not visible)
843 static int get_temp_type(u8 src
)
845 if (src
>= 0x02 && src
<= 0x07)
846 return 3; /* thermal diode */
847 else if (src
>= 0x08 && src
<= 0x18)
848 return 4; /* thermistor */
849 else if (src
>= 0x20 && src
<= 0x2b)
851 else if (src
>= 0x42 && src
<= 0x49)
858 show_temp_type(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
860 struct nct6683_data
*data
= nct6683_update_device(dev
);
861 struct sensor_device_attribute
*sattr
= to_sensor_dev_attr(attr
);
862 int nr
= sattr
->index
;
863 return sprintf(buf
, "%d\n", get_temp_type(data
->temp_src
[nr
]));
866 static umode_t
nct6683_temp_is_visible(struct kobject
*kobj
,
867 struct attribute
*attr
, int index
)
869 struct device
*dev
= container_of(kobj
, struct device
, kobj
);
870 struct nct6683_data
*data
= dev_get_drvdata(dev
);
871 int temp
= index
/ 7; /* temp index */
872 int nr
= index
% 7; /* attribute index */
875 * Intel does not have low temperature limits or temperature hysteresis
876 * registers, or at least register location and encoding is unknown.
878 if ((nr
== 2 || nr
== 4) &&
879 data
->customer_id
== NCT6683_CUSTOMER_ID_INTEL
)
882 if (nr
== 6 && get_temp_type(data
->temp_src
[temp
]) == 0)
888 SENSOR_TEMPLATE(temp_input
, "temp%d_input", S_IRUGO
, show_temp16
, NULL
, 0);
889 SENSOR_TEMPLATE(temp_label
, "temp%d_label", S_IRUGO
, show_temp_label
, NULL
, 0);
890 SENSOR_TEMPLATE_2(temp_min
, "temp%d_min", S_IRUGO
, show_temp8
, NULL
, 0, 0);
891 SENSOR_TEMPLATE_2(temp_max
, "temp%d_max", S_IRUGO
, show_temp8
, NULL
, 0, 1);
892 SENSOR_TEMPLATE(temp_max_hyst
, "temp%d_max_hyst", S_IRUGO
, show_temp_hyst
, NULL
,
894 SENSOR_TEMPLATE_2(temp_crit
, "temp%d_crit", S_IRUGO
, show_temp8
, NULL
, 0, 3);
895 SENSOR_TEMPLATE(temp_type
, "temp%d_type", S_IRUGO
, show_temp_type
, NULL
, 0);
898 * nct6683_temp_is_visible uses the index into the following array
899 * to determine if attributes should be created or not.
900 * Any change in order or content must be matched.
902 static struct sensor_device_template
*nct6683_attributes_temp_template
[] = {
903 &sensor_dev_template_temp_input
,
904 &sensor_dev_template_temp_label
,
905 &sensor_dev_template_temp_min
, /* 2 */
906 &sensor_dev_template_temp_max
, /* 3 */
907 &sensor_dev_template_temp_max_hyst
, /* 4 */
908 &sensor_dev_template_temp_crit
, /* 5 */
909 &sensor_dev_template_temp_type
, /* 6 */
913 static const struct sensor_template_group nct6683_temp_template_group
= {
914 .templates
= nct6683_attributes_temp_template
,
915 .is_visible
= nct6683_temp_is_visible
,
920 show_pwm(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
922 struct nct6683_data
*data
= nct6683_update_device(dev
);
923 struct sensor_device_attribute_2
*sattr
= to_sensor_dev_attr_2(attr
);
924 int index
= sattr
->index
;
926 return sprintf(buf
, "%d\n", data
->pwm
[index
]);
930 store_pwm(struct device
*dev
, struct device_attribute
*attr
, const char *buf
,
933 struct sensor_device_attribute_2
*sattr
= to_sensor_dev_attr_2(attr
);
934 struct nct6683_data
*data
= dev_get_drvdata(dev
);
935 int index
= sattr
->index
;
938 if (kstrtoul(buf
, 10, &val
) || val
> 255)
941 mutex_lock(&data
->update_lock
);
942 nct6683_write(data
, NCT6683_REG_FAN_CFG_CTRL
, NCT6683_FAN_CFG_REQ
);
943 usleep_range(1000, 2000);
944 nct6683_write(data
, NCT6683_REG_PWM_WRITE(index
), val
);
945 nct6683_write(data
, NCT6683_REG_FAN_CFG_CTRL
, NCT6683_FAN_CFG_DONE
);
946 mutex_unlock(&data
->update_lock
);
951 SENSOR_TEMPLATE(pwm
, "pwm%d", S_IRUGO
, show_pwm
, store_pwm
, 0);
953 static umode_t
nct6683_pwm_is_visible(struct kobject
*kobj
,
954 struct attribute
*attr
, int index
)
956 struct device
*dev
= container_of(kobj
, struct device
, kobj
);
957 struct nct6683_data
*data
= dev_get_drvdata(dev
);
958 int pwm
= index
; /* pwm index */
960 if (!(data
->have_pwm
& (1 << pwm
)))
963 /* Only update pwm values for Mitac boards */
964 if (data
->customer_id
== NCT6683_CUSTOMER_ID_MITAC
)
965 return attr
->mode
| S_IWUSR
;
970 static struct sensor_device_template
*nct6683_attributes_pwm_template
[] = {
971 &sensor_dev_template_pwm
,
975 static const struct sensor_template_group nct6683_pwm_template_group
= {
976 .templates
= nct6683_attributes_pwm_template
,
977 .is_visible
= nct6683_pwm_is_visible
,
982 show_global_beep(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
984 struct nct6683_data
*data
= dev_get_drvdata(dev
);
988 mutex_lock(&data
->update_lock
);
990 ret
= superio_enter(data
->sioreg
);
993 superio_select(data
->sioreg
, NCT6683_LD_HWM
);
994 reg
= superio_inb(data
->sioreg
, NCT6683_REG_CR_BEEP
);
995 superio_exit(data
->sioreg
);
997 mutex_unlock(&data
->update_lock
);
999 return sprintf(buf
, "%u\n", !!(reg
& NCT6683_CR_BEEP_MASK
));
1002 mutex_unlock(&data
->update_lock
);
1007 store_global_beep(struct device
*dev
, struct device_attribute
*attr
,
1008 const char *buf
, size_t count
)
1010 struct nct6683_data
*data
= dev_get_drvdata(dev
);
1015 if (kstrtoul(buf
, 10, &val
) || (val
!= 0 && val
!= 1))
1018 mutex_lock(&data
->update_lock
);
1020 ret
= superio_enter(data
->sioreg
);
1026 superio_select(data
->sioreg
, NCT6683_LD_HWM
);
1027 reg
= superio_inb(data
->sioreg
, NCT6683_REG_CR_BEEP
);
1029 reg
|= NCT6683_CR_BEEP_MASK
;
1031 reg
&= ~NCT6683_CR_BEEP_MASK
;
1032 superio_outb(data
->sioreg
, NCT6683_REG_CR_BEEP
, reg
);
1033 superio_exit(data
->sioreg
);
1035 mutex_unlock(&data
->update_lock
);
1039 /* Case open detection */
1042 show_caseopen(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
1044 struct nct6683_data
*data
= dev_get_drvdata(dev
);
1048 mutex_lock(&data
->update_lock
);
1050 ret
= superio_enter(data
->sioreg
);
1053 superio_select(data
->sioreg
, NCT6683_LD_ACPI
);
1054 reg
= superio_inb(data
->sioreg
, NCT6683_REG_CR_CASEOPEN
);
1055 superio_exit(data
->sioreg
);
1057 mutex_unlock(&data
->update_lock
);
1059 return sprintf(buf
, "%u\n", !(reg
& NCT6683_CR_CASEOPEN_MASK
));
1062 mutex_unlock(&data
->update_lock
);
1067 clear_caseopen(struct device
*dev
, struct device_attribute
*attr
,
1068 const char *buf
, size_t count
)
1070 struct nct6683_data
*data
= dev_get_drvdata(dev
);
1075 if (kstrtoul(buf
, 10, &val
) || val
!= 0)
1078 mutex_lock(&data
->update_lock
);
1081 * Use CR registers to clear caseopen status.
1082 * Caseopen is activ low, clear by writing 1 into the register.
1085 ret
= superio_enter(data
->sioreg
);
1091 superio_select(data
->sioreg
, NCT6683_LD_ACPI
);
1092 reg
= superio_inb(data
->sioreg
, NCT6683_REG_CR_CASEOPEN
);
1093 reg
|= NCT6683_CR_CASEOPEN_MASK
;
1094 superio_outb(data
->sioreg
, NCT6683_REG_CR_CASEOPEN
, reg
);
1095 reg
&= ~NCT6683_CR_CASEOPEN_MASK
;
1096 superio_outb(data
->sioreg
, NCT6683_REG_CR_CASEOPEN
, reg
);
1097 superio_exit(data
->sioreg
);
1099 data
->valid
= false; /* Force cache refresh */
1101 mutex_unlock(&data
->update_lock
);
1105 static DEVICE_ATTR(intrusion0_alarm
, S_IWUSR
| S_IRUGO
, show_caseopen
,
1107 static DEVICE_ATTR(beep_enable
, S_IWUSR
| S_IRUGO
, show_global_beep
,
1110 static struct attribute
*nct6683_attributes_other
[] = {
1111 &dev_attr_intrusion0_alarm
.attr
,
1112 &dev_attr_beep_enable
.attr
,
1116 static const struct attribute_group nct6683_group_other
= {
1117 .attrs
= nct6683_attributes_other
,
1120 /* Get the monitoring functions started */
1121 static inline void nct6683_init_device(struct nct6683_data
*data
)
1125 /* Start hardware monitoring if needed */
1126 tmp
= nct6683_read(data
, NCT6683_HWM_CFG
);
1128 nct6683_write(data
, NCT6683_HWM_CFG
, tmp
| 0x80);
1132 * There are a total of 24 fan inputs. Each can be configured as input
1133 * or as output. A maximum of 16 inputs and 8 outputs is configurable.
1136 nct6683_setup_fans(struct nct6683_data
*data
)
1141 for (i
= 0; i
< NCT6683_NUM_REG_FAN
; i
++) {
1142 reg
= nct6683_read(data
, NCT6683_REG_FANIN_CFG(i
));
1144 data
->have_fan
|= 1 << i
;
1145 data
->fanin_cfg
[i
] = reg
;
1147 for (i
= 0; i
< NCT6683_NUM_REG_PWM
; i
++) {
1148 reg
= nct6683_read(data
, NCT6683_REG_FANOUT_CFG(i
));
1150 data
->have_pwm
|= 1 << i
;
1151 data
->fanout_cfg
[i
] = reg
;
1156 * Translation from monitoring register to temperature and voltage attributes
1157 * ==========================================================================
1159 * There are a total of 32 monitoring registers. Each can be assigned to either
1160 * a temperature or voltage monitoring source.
1161 * NCT6683_REG_MON_CFG(x) defines assignment for each monitoring source.
1163 * Temperature and voltage attribute mapping is determined by walking through
1164 * the NCT6683_REG_MON_CFG registers. If the assigned source is
1165 * a temperature, temp_index[n] is set to the monitor register index, and
1166 * temp_src[n] is set to the temperature source. If the assigned source is
1167 * a voltage, the respective values are stored in in_index[] and in_src[],
1171 static void nct6683_setup_sensors(struct nct6683_data
*data
)
1178 for (i
= 0; i
< NCT6683_NUM_REG_MON
; i
++) {
1179 reg
= nct6683_read(data
, NCT6683_REG_MON_CFG(i
)) & 0x7f;
1180 /* Ignore invalid assignments */
1181 if (reg
>= NUM_MON_LABELS
)
1183 /* Skip if disabled or reserved */
1184 if (nct6683_mon_label
[reg
] == NULL
)
1186 if (reg
< MON_VOLTAGE_START
) {
1187 data
->temp_index
[data
->temp_num
] = i
;
1188 data
->temp_src
[data
->temp_num
] = reg
;
1191 data
->in_index
[data
->in_num
] = i
;
1192 data
->in_src
[data
->in_num
] = reg
;
1198 static int nct6683_probe(struct platform_device
*pdev
)
1200 struct device
*dev
= &pdev
->dev
;
1201 struct nct6683_sio_data
*sio_data
= dev
->platform_data
;
1202 struct attribute_group
*group
;
1203 struct nct6683_data
*data
;
1204 struct device
*hwmon_dev
;
1205 struct resource
*res
;
1209 res
= platform_get_resource(pdev
, IORESOURCE_IO
, 0);
1210 if (!devm_request_region(dev
, res
->start
, IOREGION_LENGTH
, DRVNAME
))
1213 data
= devm_kzalloc(dev
, sizeof(struct nct6683_data
), GFP_KERNEL
);
1217 data
->kind
= sio_data
->kind
;
1218 data
->sioreg
= sio_data
->sioreg
;
1219 data
->addr
= res
->start
;
1220 mutex_init(&data
->update_lock
);
1221 platform_set_drvdata(pdev
, data
);
1223 data
->customer_id
= nct6683_read16(data
, NCT6683_REG_CUSTOMER_ID
);
1225 /* By default only instantiate driver if the customer ID is known */
1226 switch (data
->customer_id
) {
1227 case NCT6683_CUSTOMER_ID_INTEL
:
1229 case NCT6683_CUSTOMER_ID_MITAC
:
1236 nct6683_init_device(data
);
1237 nct6683_setup_fans(data
);
1238 nct6683_setup_sensors(data
);
1240 /* Register sysfs hooks */
1242 if (data
->have_pwm
) {
1243 group
= nct6683_create_attr_group(dev
,
1244 &nct6683_pwm_template_group
,
1245 fls(data
->have_pwm
));
1247 return PTR_ERR(group
);
1248 data
->groups
[groups
++] = group
;
1252 group
= nct6683_create_attr_group(dev
,
1253 &nct6683_in_template_group
,
1256 return PTR_ERR(group
);
1257 data
->groups
[groups
++] = group
;
1260 if (data
->have_fan
) {
1261 group
= nct6683_create_attr_group(dev
,
1262 &nct6683_fan_template_group
,
1263 fls(data
->have_fan
));
1265 return PTR_ERR(group
);
1266 data
->groups
[groups
++] = group
;
1269 if (data
->temp_num
) {
1270 group
= nct6683_create_attr_group(dev
,
1271 &nct6683_temp_template_group
,
1274 return PTR_ERR(group
);
1275 data
->groups
[groups
++] = group
;
1277 data
->groups
[groups
++] = &nct6683_group_other
;
1279 if (data
->customer_id
== NCT6683_CUSTOMER_ID_INTEL
)
1280 scnprintf(build
, sizeof(build
), "%02x/%02x/%02x",
1281 nct6683_read(data
, NCT6683_REG_BUILD_MONTH
),
1282 nct6683_read(data
, NCT6683_REG_BUILD_DAY
),
1283 nct6683_read(data
, NCT6683_REG_BUILD_YEAR
));
1285 scnprintf(build
, sizeof(build
), "%02d/%02d/%02d",
1286 nct6683_read(data
, NCT6683_REG_BUILD_MONTH
),
1287 nct6683_read(data
, NCT6683_REG_BUILD_DAY
),
1288 nct6683_read(data
, NCT6683_REG_BUILD_YEAR
));
1290 dev_info(dev
, "%s EC firmware version %d.%d build %s\n",
1291 nct6683_chip_names
[data
->kind
],
1292 nct6683_read(data
, NCT6683_REG_VERSION_HI
),
1293 nct6683_read(data
, NCT6683_REG_VERSION_LO
),
1296 hwmon_dev
= devm_hwmon_device_register_with_groups(dev
,
1297 nct6683_device_names
[data
->kind
], data
, data
->groups
);
1298 return PTR_ERR_OR_ZERO(hwmon_dev
);
1302 static int nct6683_suspend(struct device
*dev
)
1304 struct nct6683_data
*data
= nct6683_update_device(dev
);
1306 mutex_lock(&data
->update_lock
);
1307 data
->hwm_cfg
= nct6683_read(data
, NCT6683_HWM_CFG
);
1308 mutex_unlock(&data
->update_lock
);
1313 static int nct6683_resume(struct device
*dev
)
1315 struct nct6683_data
*data
= dev_get_drvdata(dev
);
1317 mutex_lock(&data
->update_lock
);
1319 nct6683_write(data
, NCT6683_HWM_CFG
, data
->hwm_cfg
);
1321 /* Force re-reading all values */
1322 data
->valid
= false;
1323 mutex_unlock(&data
->update_lock
);
1328 static const struct dev_pm_ops nct6683_dev_pm_ops
= {
1329 .suspend
= nct6683_suspend
,
1330 .resume
= nct6683_resume
,
1331 .freeze
= nct6683_suspend
,
1332 .restore
= nct6683_resume
,
1335 #define NCT6683_DEV_PM_OPS (&nct6683_dev_pm_ops)
1337 #define NCT6683_DEV_PM_OPS NULL
1338 #endif /* CONFIG_PM */
1340 static struct platform_driver nct6683_driver
= {
1343 .pm
= NCT6683_DEV_PM_OPS
,
1345 .probe
= nct6683_probe
,
1348 static int __init
nct6683_find(int sioaddr
, struct nct6683_sio_data
*sio_data
)
1354 err
= superio_enter(sioaddr
);
1358 val
= (superio_inb(sioaddr
, SIO_REG_DEVID
) << 8)
1359 | superio_inb(sioaddr
, SIO_REG_DEVID
+ 1);
1361 switch (val
& SIO_ID_MASK
) {
1362 case SIO_NCT6683_ID
:
1363 sio_data
->kind
= nct6683
;
1367 pr_debug("unsupported chip ID: 0x%04x\n", val
);
1371 /* We have a known chip, find the HWM I/O address */
1372 superio_select(sioaddr
, NCT6683_LD_HWM
);
1373 val
= (superio_inb(sioaddr
, SIO_REG_ADDR
) << 8)
1374 | superio_inb(sioaddr
, SIO_REG_ADDR
+ 1);
1375 addr
= val
& IOREGION_ALIGNMENT
;
1377 pr_err("EC base I/O port unconfigured\n");
1381 /* Activate logical device if needed */
1382 val
= superio_inb(sioaddr
, SIO_REG_ENABLE
);
1383 if (!(val
& 0x01)) {
1384 pr_err("EC is disabled\n");
1388 superio_exit(sioaddr
);
1389 pr_info("Found %s or compatible chip at %#x:%#x\n",
1390 nct6683_chip_names
[sio_data
->kind
], sioaddr
, addr
);
1391 sio_data
->sioreg
= sioaddr
;
1396 superio_exit(sioaddr
);
1401 * when Super-I/O functions move to a separate file, the Super-I/O
1402 * bus will manage the lifetime of the device and this module will only keep
1403 * track of the nct6683 driver. But since we use platform_device_alloc(), we
1404 * must keep track of the device
1406 static struct platform_device
*pdev
[2];
1408 static int __init
sensors_nct6683_init(void)
1410 struct nct6683_sio_data sio_data
;
1411 int sioaddr
[2] = { 0x2e, 0x4e };
1412 struct resource res
;
1417 err
= platform_driver_register(&nct6683_driver
);
1422 * initialize sio_data->kind and sio_data->sioreg.
1424 * when Super-I/O functions move to a separate file, the Super-I/O
1425 * driver will probe 0x2e and 0x4e and auto-detect the presence of a
1426 * nct6683 hardware monitor, and call probe()
1428 for (i
= 0; i
< ARRAY_SIZE(pdev
); i
++) {
1429 address
= nct6683_find(sioaddr
[i
], &sio_data
);
1435 pdev
[i
] = platform_device_alloc(DRVNAME
, address
);
1438 goto exit_device_unregister
;
1441 err
= platform_device_add_data(pdev
[i
], &sio_data
,
1442 sizeof(struct nct6683_sio_data
));
1444 goto exit_device_put
;
1446 memset(&res
, 0, sizeof(res
));
1448 res
.start
= address
+ IOREGION_OFFSET
;
1449 res
.end
= address
+ IOREGION_OFFSET
+ IOREGION_LENGTH
- 1;
1450 res
.flags
= IORESOURCE_IO
;
1452 err
= acpi_check_resource_conflict(&res
);
1454 platform_device_put(pdev
[i
]);
1459 err
= platform_device_add_resources(pdev
[i
], &res
, 1);
1461 goto exit_device_put
;
1463 /* platform_device_add calls probe() */
1464 err
= platform_device_add(pdev
[i
]);
1466 goto exit_device_put
;
1470 goto exit_unregister
;
1476 platform_device_put(pdev
[i
]);
1477 exit_device_unregister
:
1480 platform_device_unregister(pdev
[i
]);
1483 platform_driver_unregister(&nct6683_driver
);
1487 static void __exit
sensors_nct6683_exit(void)
1491 for (i
= 0; i
< ARRAY_SIZE(pdev
); i
++) {
1493 platform_device_unregister(pdev
[i
]);
1495 platform_driver_unregister(&nct6683_driver
);
1498 MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");
1499 MODULE_DESCRIPTION("NCT6683D driver");
1500 MODULE_LICENSE("GPL");
1502 module_init(sensors_nct6683_init
);
1503 module_exit(sensors_nct6683_exit
);