1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * nct6683 - Driver for the hardware monitoring functionality of
4 * Nuvoton NCT6683D/NCT6687D eSIO
8 * Derived from nct6775 driver
11 * Supports the following chips:
13 * Chip #vin #fan #pwm #temp chip ID
14 * nct6683d 21(1) 16 8 32(1) 0xc730
15 * nct6687d 21(1) 16 8 32(1) 0xd590
18 * (1) Total number of vin and temp inputs is 32.
21 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
23 #include <linux/acpi.h>
24 #include <linux/delay.h>
25 #include <linux/err.h>
26 #include <linux/init.h>
28 #include <linux/jiffies.h>
29 #include <linux/hwmon.h>
30 #include <linux/hwmon-sysfs.h>
31 #include <linux/module.h>
32 #include <linux/mutex.h>
33 #include <linux/platform_device.h>
34 #include <linux/slab.h>
36 enum kinds { nct6683, nct6687 };
39 module_param(force, bool, 0);
40 MODULE_PARM_DESC(force, "Set to one to enable support for unknown vendors");
42 static const char * const nct6683_device_names[] = {
47 static const char * const nct6683_chip_names[] = {
52 #define DRVNAME "nct6683"
55 * Super-I/O constants and functions
58 #define NCT6683_LD_ACPI 0x0a
59 #define NCT6683_LD_HWM 0x0b
60 #define NCT6683_LD_VID 0x0d
62 #define SIO_REG_LDSEL 0x07 /* Logical device select */
63 #define SIO_REG_DEVID 0x20 /* Device ID (2 bytes) */
64 #define SIO_REG_ENABLE 0x30 /* Logical device enable */
65 #define SIO_REG_ADDR 0x60 /* Logical device address (2 bytes) */
67 #define SIO_NCT6681_ID 0xb270 /* for later */
68 #define SIO_NCT6683_ID 0xc730
69 #define SIO_NCT6687_ID 0xd590
70 #define SIO_ID_MASK 0xFFF0
73 superio_outb(int ioreg, int reg, int val)
80 superio_inb(int ioreg, int reg)
83 return inb(ioreg + 1);
87 superio_select(int ioreg, int ld)
89 outb(SIO_REG_LDSEL, ioreg);
94 superio_enter(int ioreg)
97 * Try to reserve <ioreg> and <ioreg + 1> for exclusive access.
99 if (!request_muxed_region(ioreg, 2, DRVNAME))
109 superio_exit(int ioreg)
113 outb(0x02, ioreg + 1);
114 release_region(ioreg, 2);
121 #define IOREGION_ALIGNMENT (~7)
122 #define IOREGION_OFFSET 4 /* Use EC port 1 */
123 #define IOREGION_LENGTH 4
125 #define EC_PAGE_REG 0
126 #define EC_INDEX_REG 1
127 #define EC_DATA_REG 2
128 #define EC_EVENT_REG 3
130 /* Common and NCT6683 specific data */
132 #define NCT6683_NUM_REG_MON 32
133 #define NCT6683_NUM_REG_FAN 16
134 #define NCT6683_NUM_REG_PWM 8
136 #define NCT6683_REG_MON(x) (0x100 + (x) * 2)
137 #define NCT6683_REG_FAN_RPM(x) (0x140 + (x) * 2)
138 #define NCT6683_REG_PWM(x) (0x160 + (x))
139 #define NCT6683_REG_PWM_WRITE(x) (0xa28 + (x))
141 #define NCT6683_REG_MON_STS(x) (0x174 + (x))
142 #define NCT6683_REG_IDLE(x) (0x178 + (x))
144 #define NCT6683_REG_FAN_STS(x) (0x17c + (x))
145 #define NCT6683_REG_FAN_ERRSTS 0x17e
146 #define NCT6683_REG_FAN_INITSTS 0x17f
148 #define NCT6683_HWM_CFG 0x180
150 #define NCT6683_REG_MON_CFG(x) (0x1a0 + (x))
151 #define NCT6683_REG_FANIN_CFG(x) (0x1c0 + (x))
152 #define NCT6683_REG_FANOUT_CFG(x) (0x1d0 + (x))
154 #define NCT6683_REG_INTEL_TEMP_MAX(x) (0x901 + (x) * 16)
155 #define NCT6683_REG_INTEL_TEMP_CRIT(x) (0x90d + (x) * 16)
157 #define NCT6683_REG_TEMP_HYST(x) (0x330 + (x)) /* 8 bit */
158 #define NCT6683_REG_TEMP_MAX(x) (0x350 + (x)) /* 8 bit */
159 #define NCT6683_REG_MON_HIGH(x) (0x370 + (x) * 2) /* 8 bit */
160 #define NCT6683_REG_MON_LOW(x) (0x371 + (x) * 2) /* 8 bit */
162 #define NCT6683_REG_FAN_MIN(x) (0x3b8 + (x) * 2) /* 16 bit */
164 #define NCT6683_REG_FAN_CFG_CTRL 0xa01
165 #define NCT6683_FAN_CFG_REQ 0x80
166 #define NCT6683_FAN_CFG_DONE 0x40
168 #define NCT6683_REG_CUSTOMER_ID 0x602
169 #define NCT6683_CUSTOMER_ID_INTEL 0x805
170 #define NCT6683_CUSTOMER_ID_MITAC 0xa0e
171 #define NCT6683_CUSTOMER_ID_MSI 0x201
172 #define NCT6683_CUSTOMER_ID_ASROCK 0xe2c
174 #define NCT6683_REG_BUILD_YEAR 0x604
175 #define NCT6683_REG_BUILD_MONTH 0x605
176 #define NCT6683_REG_BUILD_DAY 0x606
177 #define NCT6683_REG_SERIAL 0x607
178 #define NCT6683_REG_VERSION_HI 0x608
179 #define NCT6683_REG_VERSION_LO 0x609
181 #define NCT6683_REG_CR_CASEOPEN 0xe8
182 #define NCT6683_CR_CASEOPEN_MASK (1 << 7)
184 #define NCT6683_REG_CR_BEEP 0xe0
185 #define NCT6683_CR_BEEP_MASK (1 << 6)
187 static const char *const nct6683_mon_label[] = {
204 "Thermistor 5", /* 0x10 */
213 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
214 "PECI 0.0", /* 0x20 */
226 NULL, NULL, NULL, NULL,
227 "PCH CPU", /* 0x30 */
253 NULL, NULL, NULL, NULL, NULL, NULL,
254 "Virtual 0", /* 0x50 */
262 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
263 "VCC", /* 0x60 voltage sensors */
288 #define NUM_MON_LABELS ARRAY_SIZE(nct6683_mon_label)
289 #define MON_VOLTAGE_START 0x60
291 /* ------------------------------------------------------- */
293 struct nct6683_data {
294 int addr; /* IO base of EC space */
295 int sioreg; /* SIO register */
299 struct device *hwmon_dev;
300 const struct attribute_group *groups[6];
302 int temp_num; /* number of temperature attributes */
303 u8 temp_index[NCT6683_NUM_REG_MON];
304 u8 temp_src[NCT6683_NUM_REG_MON];
306 u8 in_num; /* number of voltage attributes */
307 u8 in_index[NCT6683_NUM_REG_MON];
308 u8 in_src[NCT6683_NUM_REG_MON];
310 struct mutex update_lock; /* used to protect sensor updates */
311 bool valid; /* true if following fields are valid */
312 unsigned long last_updated; /* In jiffies */
314 /* Voltage attribute values */
315 u8 in[3][NCT6683_NUM_REG_MON]; /* [0]=in, [1]=in_max, [2]=in_min */
317 /* Temperature attribute values */
318 s16 temp_in[NCT6683_NUM_REG_MON];
319 s8 temp[4][NCT6683_NUM_REG_MON];/* [0]=min, [1]=max, [2]=hyst,
323 /* Fan attribute values */
324 unsigned int rpm[NCT6683_NUM_REG_FAN];
325 u16 fan_min[NCT6683_NUM_REG_FAN];
326 u8 fanin_cfg[NCT6683_NUM_REG_FAN];
327 u8 fanout_cfg[NCT6683_NUM_REG_FAN];
328 u16 have_fan; /* some fan inputs can be disabled */
331 u8 pwm[NCT6683_NUM_REG_PWM];
334 /* Remember extra register values over suspend/resume */
339 struct nct6683_sio_data {
344 struct sensor_device_template {
345 struct device_attribute dev_attr;
353 bool s2; /* true if both index and nr are used */
356 struct sensor_device_attr_u {
358 struct sensor_device_attribute a1;
359 struct sensor_device_attribute_2 a2;
364 #define __TEMPLATE_ATTR(_template, _mode, _show, _store) { \
365 .attr = {.name = _template, .mode = _mode }, \
370 #define SENSOR_DEVICE_TEMPLATE(_template, _mode, _show, _store, _index) \
371 { .dev_attr = __TEMPLATE_ATTR(_template, _mode, _show, _store), \
375 #define SENSOR_DEVICE_TEMPLATE_2(_template, _mode, _show, _store, \
377 { .dev_attr = __TEMPLATE_ATTR(_template, _mode, _show, _store), \
378 .u.s.index = _index, \
382 #define SENSOR_TEMPLATE(_name, _template, _mode, _show, _store, _index) \
383 static struct sensor_device_template sensor_dev_template_##_name \
384 = SENSOR_DEVICE_TEMPLATE(_template, _mode, _show, _store, \
387 #define SENSOR_TEMPLATE_2(_name, _template, _mode, _show, _store, \
389 static struct sensor_device_template sensor_dev_template_##_name \
390 = SENSOR_DEVICE_TEMPLATE_2(_template, _mode, _show, _store, \
393 struct sensor_template_group {
394 struct sensor_device_template **templates;
395 umode_t (*is_visible)(struct kobject *, struct attribute *, int);
399 static struct attribute_group *
400 nct6683_create_attr_group(struct device *dev,
401 const struct sensor_template_group *tg,
404 struct sensor_device_attribute_2 *a2;
405 struct sensor_device_attribute *a;
406 struct sensor_device_template **t;
407 struct sensor_device_attr_u *su;
408 struct attribute_group *group;
409 struct attribute **attrs;
413 return ERR_PTR(-EINVAL);
416 for (count = 0; *t; t++, count++)
420 return ERR_PTR(-EINVAL);
422 group = devm_kzalloc(dev, sizeof(*group), GFP_KERNEL);
424 return ERR_PTR(-ENOMEM);
426 attrs = devm_kcalloc(dev, repeat * count + 1, sizeof(*attrs),
429 return ERR_PTR(-ENOMEM);
431 su = devm_kzalloc(dev, array3_size(repeat, count, sizeof(*su)),
434 return ERR_PTR(-ENOMEM);
436 group->attrs = attrs;
437 group->is_visible = tg->is_visible;
439 for (i = 0; i < repeat; i++) {
441 for (j = 0; *t != NULL; j++) {
442 snprintf(su->name, sizeof(su->name),
443 (*t)->dev_attr.attr.name, tg->base + i);
446 sysfs_attr_init(&a2->dev_attr.attr);
447 a2->dev_attr.attr.name = su->name;
448 a2->nr = (*t)->u.s.nr + i;
449 a2->index = (*t)->u.s.index;
450 a2->dev_attr.attr.mode =
451 (*t)->dev_attr.attr.mode;
452 a2->dev_attr.show = (*t)->dev_attr.show;
453 a2->dev_attr.store = (*t)->dev_attr.store;
454 *attrs = &a2->dev_attr.attr;
457 sysfs_attr_init(&a->dev_attr.attr);
458 a->dev_attr.attr.name = su->name;
459 a->index = (*t)->u.index + i;
460 a->dev_attr.attr.mode =
461 (*t)->dev_attr.attr.mode;
462 a->dev_attr.show = (*t)->dev_attr.show;
463 a->dev_attr.store = (*t)->dev_attr.store;
464 *attrs = &a->dev_attr.attr;
475 /* LSB is 16 mV, except for the following sources, where it is 32 mV */
476 #define MON_SRC_VCC 0x60
477 #define MON_SRC_VSB 0x61
478 #define MON_SRC_AVSB 0x62
479 #define MON_SRC_VBAT 0x64
481 static inline long in_from_reg(u16 reg, u8 src)
485 if (src == MON_SRC_VCC || src == MON_SRC_VSB || src == MON_SRC_AVSB ||
491 static inline u16 in_to_reg(u32 val, u8 src)
495 if (src == MON_SRC_VCC || src == MON_SRC_VSB || src == MON_SRC_AVSB ||
499 return clamp_val(DIV_ROUND_CLOSEST(val, scale), 0, 127);
502 static u16 nct6683_read(struct nct6683_data *data, u16 reg)
506 outb_p(0xff, data->addr + EC_PAGE_REG); /* unlock */
507 outb_p(reg >> 8, data->addr + EC_PAGE_REG);
508 outb_p(reg & 0xff, data->addr + EC_INDEX_REG);
509 res = inb_p(data->addr + EC_DATA_REG);
513 static u16 nct6683_read16(struct nct6683_data *data, u16 reg)
515 return (nct6683_read(data, reg) << 8) | nct6683_read(data, reg + 1);
518 static void nct6683_write(struct nct6683_data *data, u16 reg, u16 value)
520 outb_p(0xff, data->addr + EC_PAGE_REG); /* unlock */
521 outb_p(reg >> 8, data->addr + EC_PAGE_REG);
522 outb_p(reg & 0xff, data->addr + EC_INDEX_REG);
523 outb_p(value & 0xff, data->addr + EC_DATA_REG);
526 static int get_in_reg(struct nct6683_data *data, int nr, int index)
528 int ch = data->in_index[index];
533 reg = NCT6683_REG_MON(ch);
536 if (data->customer_id != NCT6683_CUSTOMER_ID_INTEL)
537 reg = NCT6683_REG_MON_LOW(ch);
540 if (data->customer_id != NCT6683_CUSTOMER_ID_INTEL)
541 reg = NCT6683_REG_MON_HIGH(ch);
549 static int get_temp_reg(struct nct6683_data *data, int nr, int index)
551 int ch = data->temp_index[index];
554 switch (data->customer_id) {
555 case NCT6683_CUSTOMER_ID_INTEL:
559 reg = NCT6683_REG_INTEL_TEMP_MAX(ch);
562 reg = NCT6683_REG_INTEL_TEMP_CRIT(ch);
566 case NCT6683_CUSTOMER_ID_MITAC:
571 reg = NCT6683_REG_MON_LOW(ch);
574 reg = NCT6683_REG_TEMP_MAX(ch);
577 reg = NCT6683_REG_TEMP_HYST(ch);
580 reg = NCT6683_REG_MON_HIGH(ch);
588 static void nct6683_update_pwm(struct device *dev)
590 struct nct6683_data *data = dev_get_drvdata(dev);
593 for (i = 0; i < NCT6683_NUM_REG_PWM; i++) {
594 if (!(data->have_pwm & (1 << i)))
596 data->pwm[i] = nct6683_read(data, NCT6683_REG_PWM(i));
600 static struct nct6683_data *nct6683_update_device(struct device *dev)
602 struct nct6683_data *data = dev_get_drvdata(dev);
605 mutex_lock(&data->update_lock);
607 if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
608 /* Measured voltages and limits */
609 for (i = 0; i < data->in_num; i++) {
610 for (j = 0; j < 3; j++) {
611 int reg = get_in_reg(data, j, i);
615 nct6683_read(data, reg);
619 /* Measured temperatures and limits */
620 for (i = 0; i < data->temp_num; i++) {
621 u8 ch = data->temp_index[i];
623 data->temp_in[i] = nct6683_read16(data,
624 NCT6683_REG_MON(ch));
625 for (j = 0; j < 4; j++) {
626 int reg = get_temp_reg(data, j, i);
630 nct6683_read(data, reg);
634 /* Measured fan speeds and limits */
635 for (i = 0; i < ARRAY_SIZE(data->rpm); i++) {
636 if (!(data->have_fan & (1 << i)))
639 data->rpm[i] = nct6683_read16(data,
640 NCT6683_REG_FAN_RPM(i));
641 data->fan_min[i] = nct6683_read16(data,
642 NCT6683_REG_FAN_MIN(i));
645 nct6683_update_pwm(dev);
647 data->last_updated = jiffies;
651 mutex_unlock(&data->update_lock);
656 * Sysfs callback functions
659 show_in_label(struct device *dev, struct device_attribute *attr, char *buf)
661 struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
662 struct nct6683_data *data = nct6683_update_device(dev);
663 int nr = sattr->index;
665 return sprintf(buf, "%s\n", nct6683_mon_label[data->in_src[nr]]);
669 show_in_reg(struct device *dev, struct device_attribute *attr, char *buf)
671 struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
672 struct nct6683_data *data = nct6683_update_device(dev);
673 int index = sattr->index;
676 return sprintf(buf, "%ld\n",
677 in_from_reg(data->in[index][nr], data->in_index[index]));
680 static umode_t nct6683_in_is_visible(struct kobject *kobj,
681 struct attribute *attr, int index)
683 struct device *dev = kobj_to_dev(kobj);
684 struct nct6683_data *data = dev_get_drvdata(dev);
685 int nr = index % 4; /* attribute */
688 * Voltage limits exist for Intel boards,
689 * but register location and encoding is unknown
691 if ((nr == 2 || nr == 3) &&
692 data->customer_id == NCT6683_CUSTOMER_ID_INTEL)
698 SENSOR_TEMPLATE(in_label, "in%d_label", S_IRUGO, show_in_label, NULL, 0);
699 SENSOR_TEMPLATE_2(in_input, "in%d_input", S_IRUGO, show_in_reg, NULL, 0, 0);
700 SENSOR_TEMPLATE_2(in_min, "in%d_min", S_IRUGO, show_in_reg, NULL, 0, 1);
701 SENSOR_TEMPLATE_2(in_max, "in%d_max", S_IRUGO, show_in_reg, NULL, 0, 2);
703 static struct sensor_device_template *nct6683_attributes_in_template[] = {
704 &sensor_dev_template_in_label,
705 &sensor_dev_template_in_input,
706 &sensor_dev_template_in_min,
707 &sensor_dev_template_in_max,
711 static const struct sensor_template_group nct6683_in_template_group = {
712 .templates = nct6683_attributes_in_template,
713 .is_visible = nct6683_in_is_visible,
717 show_fan(struct device *dev, struct device_attribute *attr, char *buf)
719 struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
720 struct nct6683_data *data = nct6683_update_device(dev);
722 return sprintf(buf, "%d\n", data->rpm[sattr->index]);
726 show_fan_min(struct device *dev, struct device_attribute *attr, char *buf)
728 struct nct6683_data *data = nct6683_update_device(dev);
729 struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
730 int nr = sattr->index;
732 return sprintf(buf, "%d\n", data->fan_min[nr]);
736 show_fan_pulses(struct device *dev, struct device_attribute *attr, char *buf)
738 struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
739 struct nct6683_data *data = nct6683_update_device(dev);
741 return sprintf(buf, "%d\n",
742 ((data->fanin_cfg[sattr->index] >> 5) & 0x03) + 1);
745 static umode_t nct6683_fan_is_visible(struct kobject *kobj,
746 struct attribute *attr, int index)
748 struct device *dev = kobj_to_dev(kobj);
749 struct nct6683_data *data = dev_get_drvdata(dev);
750 int fan = index / 3; /* fan index */
751 int nr = index % 3; /* attribute index */
753 if (!(data->have_fan & (1 << fan)))
757 * Intel may have minimum fan speed limits,
758 * but register location and encoding are unknown.
760 if (nr == 2 && data->customer_id == NCT6683_CUSTOMER_ID_INTEL)
766 SENSOR_TEMPLATE(fan_input, "fan%d_input", S_IRUGO, show_fan, NULL, 0);
767 SENSOR_TEMPLATE(fan_pulses, "fan%d_pulses", S_IRUGO, show_fan_pulses, NULL, 0);
768 SENSOR_TEMPLATE(fan_min, "fan%d_min", S_IRUGO, show_fan_min, NULL, 0);
771 * nct6683_fan_is_visible uses the index into the following array
772 * to determine if attributes should be created or not.
773 * Any change in order or content must be matched.
775 static struct sensor_device_template *nct6683_attributes_fan_template[] = {
776 &sensor_dev_template_fan_input,
777 &sensor_dev_template_fan_pulses,
778 &sensor_dev_template_fan_min,
782 static const struct sensor_template_group nct6683_fan_template_group = {
783 .templates = nct6683_attributes_fan_template,
784 .is_visible = nct6683_fan_is_visible,
789 show_temp_label(struct device *dev, struct device_attribute *attr, char *buf)
791 struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
792 struct nct6683_data *data = nct6683_update_device(dev);
793 int nr = sattr->index;
795 return sprintf(buf, "%s\n", nct6683_mon_label[data->temp_src[nr]]);
799 show_temp8(struct device *dev, struct device_attribute *attr, char *buf)
801 struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
802 struct nct6683_data *data = nct6683_update_device(dev);
803 int index = sattr->index;
806 return sprintf(buf, "%d\n", data->temp[index][nr] * 1000);
810 show_temp_hyst(struct device *dev, struct device_attribute *attr, char *buf)
812 struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
813 struct nct6683_data *data = nct6683_update_device(dev);
814 int nr = sattr->index;
815 int temp = data->temp[1][nr] - data->temp[2][nr];
817 return sprintf(buf, "%d\n", temp * 1000);
821 show_temp16(struct device *dev, struct device_attribute *attr, char *buf)
823 struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
824 struct nct6683_data *data = nct6683_update_device(dev);
825 int index = sattr->index;
827 return sprintf(buf, "%d\n", (data->temp_in[index] / 128) * 500);
831 * Temperature sensor type is determined by temperature source
832 * and can not be modified.
833 * 0x02..0x07: Thermal diode
834 * 0x08..0x18: Thermistor
835 * 0x20..0x2b: Intel PECI
836 * 0x42..0x49: AMD TSI
837 * Others are unspecified (not visible)
840 static int get_temp_type(u8 src)
842 if (src >= 0x02 && src <= 0x07)
843 return 3; /* thermal diode */
844 else if (src >= 0x08 && src <= 0x18)
845 return 4; /* thermistor */
846 else if (src >= 0x20 && src <= 0x2b)
848 else if (src >= 0x42 && src <= 0x49)
855 show_temp_type(struct device *dev, struct device_attribute *attr, char *buf)
857 struct nct6683_data *data = nct6683_update_device(dev);
858 struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
859 int nr = sattr->index;
860 return sprintf(buf, "%d\n", get_temp_type(data->temp_src[nr]));
863 static umode_t nct6683_temp_is_visible(struct kobject *kobj,
864 struct attribute *attr, int index)
866 struct device *dev = kobj_to_dev(kobj);
867 struct nct6683_data *data = dev_get_drvdata(dev);
868 int temp = index / 7; /* temp index */
869 int nr = index % 7; /* attribute index */
872 * Intel does not have low temperature limits or temperature hysteresis
873 * registers, or at least register location and encoding is unknown.
875 if ((nr == 2 || nr == 4) &&
876 data->customer_id == NCT6683_CUSTOMER_ID_INTEL)
879 if (nr == 6 && get_temp_type(data->temp_src[temp]) == 0)
885 SENSOR_TEMPLATE(temp_input, "temp%d_input", S_IRUGO, show_temp16, NULL, 0);
886 SENSOR_TEMPLATE(temp_label, "temp%d_label", S_IRUGO, show_temp_label, NULL, 0);
887 SENSOR_TEMPLATE_2(temp_min, "temp%d_min", S_IRUGO, show_temp8, NULL, 0, 0);
888 SENSOR_TEMPLATE_2(temp_max, "temp%d_max", S_IRUGO, show_temp8, NULL, 0, 1);
889 SENSOR_TEMPLATE(temp_max_hyst, "temp%d_max_hyst", S_IRUGO, show_temp_hyst, NULL,
891 SENSOR_TEMPLATE_2(temp_crit, "temp%d_crit", S_IRUGO, show_temp8, NULL, 0, 3);
892 SENSOR_TEMPLATE(temp_type, "temp%d_type", S_IRUGO, show_temp_type, NULL, 0);
895 * nct6683_temp_is_visible uses the index into the following array
896 * to determine if attributes should be created or not.
897 * Any change in order or content must be matched.
899 static struct sensor_device_template *nct6683_attributes_temp_template[] = {
900 &sensor_dev_template_temp_input,
901 &sensor_dev_template_temp_label,
902 &sensor_dev_template_temp_min, /* 2 */
903 &sensor_dev_template_temp_max, /* 3 */
904 &sensor_dev_template_temp_max_hyst, /* 4 */
905 &sensor_dev_template_temp_crit, /* 5 */
906 &sensor_dev_template_temp_type, /* 6 */
910 static const struct sensor_template_group nct6683_temp_template_group = {
911 .templates = nct6683_attributes_temp_template,
912 .is_visible = nct6683_temp_is_visible,
917 show_pwm(struct device *dev, struct device_attribute *attr, char *buf)
919 struct nct6683_data *data = nct6683_update_device(dev);
920 struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
921 int index = sattr->index;
923 return sprintf(buf, "%d\n", data->pwm[index]);
927 store_pwm(struct device *dev, struct device_attribute *attr, const char *buf,
930 struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
931 struct nct6683_data *data = dev_get_drvdata(dev);
932 int index = sattr->index;
935 if (kstrtoul(buf, 10, &val) || val > 255)
938 mutex_lock(&data->update_lock);
939 nct6683_write(data, NCT6683_REG_FAN_CFG_CTRL, NCT6683_FAN_CFG_REQ);
940 usleep_range(1000, 2000);
941 nct6683_write(data, NCT6683_REG_PWM_WRITE(index), val);
942 nct6683_write(data, NCT6683_REG_FAN_CFG_CTRL, NCT6683_FAN_CFG_DONE);
943 mutex_unlock(&data->update_lock);
948 SENSOR_TEMPLATE(pwm, "pwm%d", S_IRUGO, show_pwm, store_pwm, 0);
950 static umode_t nct6683_pwm_is_visible(struct kobject *kobj,
951 struct attribute *attr, int index)
953 struct device *dev = kobj_to_dev(kobj);
954 struct nct6683_data *data = dev_get_drvdata(dev);
955 int pwm = index; /* pwm index */
957 if (!(data->have_pwm & (1 << pwm)))
960 /* Only update pwm values for Mitac boards */
961 if (data->customer_id == NCT6683_CUSTOMER_ID_MITAC)
962 return attr->mode | S_IWUSR;
967 static struct sensor_device_template *nct6683_attributes_pwm_template[] = {
968 &sensor_dev_template_pwm,
972 static const struct sensor_template_group nct6683_pwm_template_group = {
973 .templates = nct6683_attributes_pwm_template,
974 .is_visible = nct6683_pwm_is_visible,
979 beep_enable_show(struct device *dev, struct device_attribute *attr, char *buf)
981 struct nct6683_data *data = dev_get_drvdata(dev);
985 mutex_lock(&data->update_lock);
987 ret = superio_enter(data->sioreg);
990 superio_select(data->sioreg, NCT6683_LD_HWM);
991 reg = superio_inb(data->sioreg, NCT6683_REG_CR_BEEP);
992 superio_exit(data->sioreg);
994 mutex_unlock(&data->update_lock);
996 return sprintf(buf, "%u\n", !!(reg & NCT6683_CR_BEEP_MASK));
999 mutex_unlock(&data->update_lock);
1004 beep_enable_store(struct device *dev, struct device_attribute *attr,
1005 const char *buf, size_t count)
1007 struct nct6683_data *data = dev_get_drvdata(dev);
1012 if (kstrtoul(buf, 10, &val) || (val != 0 && val != 1))
1015 mutex_lock(&data->update_lock);
1017 ret = superio_enter(data->sioreg);
1023 superio_select(data->sioreg, NCT6683_LD_HWM);
1024 reg = superio_inb(data->sioreg, NCT6683_REG_CR_BEEP);
1026 reg |= NCT6683_CR_BEEP_MASK;
1028 reg &= ~NCT6683_CR_BEEP_MASK;
1029 superio_outb(data->sioreg, NCT6683_REG_CR_BEEP, reg);
1030 superio_exit(data->sioreg);
1032 mutex_unlock(&data->update_lock);
1036 /* Case open detection */
1039 intrusion0_alarm_show(struct device *dev, struct device_attribute *attr,
1042 struct nct6683_data *data = dev_get_drvdata(dev);
1046 mutex_lock(&data->update_lock);
1048 ret = superio_enter(data->sioreg);
1051 superio_select(data->sioreg, NCT6683_LD_ACPI);
1052 reg = superio_inb(data->sioreg, NCT6683_REG_CR_CASEOPEN);
1053 superio_exit(data->sioreg);
1055 mutex_unlock(&data->update_lock);
1057 return sprintf(buf, "%u\n", !(reg & NCT6683_CR_CASEOPEN_MASK));
1060 mutex_unlock(&data->update_lock);
1065 intrusion0_alarm_store(struct device *dev, struct device_attribute *attr,
1066 const char *buf, size_t count)
1068 struct nct6683_data *data = dev_get_drvdata(dev);
1073 if (kstrtoul(buf, 10, &val) || val != 0)
1076 mutex_lock(&data->update_lock);
1079 * Use CR registers to clear caseopen status.
1080 * Caseopen is activ low, clear by writing 1 into the register.
1083 ret = superio_enter(data->sioreg);
1089 superio_select(data->sioreg, NCT6683_LD_ACPI);
1090 reg = superio_inb(data->sioreg, NCT6683_REG_CR_CASEOPEN);
1091 reg |= NCT6683_CR_CASEOPEN_MASK;
1092 superio_outb(data->sioreg, NCT6683_REG_CR_CASEOPEN, reg);
1093 reg &= ~NCT6683_CR_CASEOPEN_MASK;
1094 superio_outb(data->sioreg, NCT6683_REG_CR_CASEOPEN, reg);
1095 superio_exit(data->sioreg);
1097 data->valid = false; /* Force cache refresh */
1099 mutex_unlock(&data->update_lock);
1103 static DEVICE_ATTR_RW(intrusion0_alarm);
1104 static DEVICE_ATTR_RW(beep_enable);
1106 static struct attribute *nct6683_attributes_other[] = {
1107 &dev_attr_intrusion0_alarm.attr,
1108 &dev_attr_beep_enable.attr,
1112 static const struct attribute_group nct6683_group_other = {
1113 .attrs = nct6683_attributes_other,
1116 /* Get the monitoring functions started */
1117 static inline void nct6683_init_device(struct nct6683_data *data)
1121 /* Start hardware monitoring if needed */
1122 tmp = nct6683_read(data, NCT6683_HWM_CFG);
1124 nct6683_write(data, NCT6683_HWM_CFG, tmp | 0x80);
1128 * There are a total of 24 fan inputs. Each can be configured as input
1129 * or as output. A maximum of 16 inputs and 8 outputs is configurable.
1132 nct6683_setup_fans(struct nct6683_data *data)
1137 for (i = 0; i < NCT6683_NUM_REG_FAN; i++) {
1138 reg = nct6683_read(data, NCT6683_REG_FANIN_CFG(i));
1140 data->have_fan |= 1 << i;
1141 data->fanin_cfg[i] = reg;
1143 for (i = 0; i < NCT6683_NUM_REG_PWM; i++) {
1144 reg = nct6683_read(data, NCT6683_REG_FANOUT_CFG(i));
1146 data->have_pwm |= 1 << i;
1147 data->fanout_cfg[i] = reg;
1152 * Translation from monitoring register to temperature and voltage attributes
1153 * ==========================================================================
1155 * There are a total of 32 monitoring registers. Each can be assigned to either
1156 * a temperature or voltage monitoring source.
1157 * NCT6683_REG_MON_CFG(x) defines assignment for each monitoring source.
1159 * Temperature and voltage attribute mapping is determined by walking through
1160 * the NCT6683_REG_MON_CFG registers. If the assigned source is
1161 * a temperature, temp_index[n] is set to the monitor register index, and
1162 * temp_src[n] is set to the temperature source. If the assigned source is
1163 * a voltage, the respective values are stored in in_index[] and in_src[],
1167 static void nct6683_setup_sensors(struct nct6683_data *data)
1174 for (i = 0; i < NCT6683_NUM_REG_MON; i++) {
1175 reg = nct6683_read(data, NCT6683_REG_MON_CFG(i)) & 0x7f;
1176 /* Ignore invalid assignments */
1177 if (reg >= NUM_MON_LABELS)
1179 /* Skip if disabled or reserved */
1180 if (nct6683_mon_label[reg] == NULL)
1182 if (reg < MON_VOLTAGE_START) {
1183 data->temp_index[data->temp_num] = i;
1184 data->temp_src[data->temp_num] = reg;
1187 data->in_index[data->in_num] = i;
1188 data->in_src[data->in_num] = reg;
1194 static int nct6683_probe(struct platform_device *pdev)
1196 struct device *dev = &pdev->dev;
1197 struct nct6683_sio_data *sio_data = dev->platform_data;
1198 struct attribute_group *group;
1199 struct nct6683_data *data;
1200 struct device *hwmon_dev;
1201 struct resource *res;
1205 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
1206 if (!devm_request_region(dev, res->start, IOREGION_LENGTH, DRVNAME))
1209 data = devm_kzalloc(dev, sizeof(struct nct6683_data), GFP_KERNEL);
1213 data->kind = sio_data->kind;
1214 data->sioreg = sio_data->sioreg;
1215 data->addr = res->start;
1216 mutex_init(&data->update_lock);
1217 platform_set_drvdata(pdev, data);
1219 data->customer_id = nct6683_read16(data, NCT6683_REG_CUSTOMER_ID);
1221 /* By default only instantiate driver if the customer ID is known */
1222 switch (data->customer_id) {
1223 case NCT6683_CUSTOMER_ID_INTEL:
1225 case NCT6683_CUSTOMER_ID_MITAC:
1227 case NCT6683_CUSTOMER_ID_MSI:
1229 case NCT6683_CUSTOMER_ID_ASROCK:
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;
1365 case SIO_NCT6687_ID:
1366 sio_data->kind = nct6687;
1370 pr_debug("unsupported chip ID: 0x%04x\n", val);
1374 /* We have a known chip, find the HWM I/O address */
1375 superio_select(sioaddr, NCT6683_LD_HWM);
1376 val = (superio_inb(sioaddr, SIO_REG_ADDR) << 8)
1377 | superio_inb(sioaddr, SIO_REG_ADDR + 1);
1378 addr = val & IOREGION_ALIGNMENT;
1380 pr_err("EC base I/O port unconfigured\n");
1384 /* Activate logical device if needed */
1385 val = superio_inb(sioaddr, SIO_REG_ENABLE);
1386 if (!(val & 0x01)) {
1387 pr_warn("Forcibly enabling EC access. Data may be unusable.\n");
1388 superio_outb(sioaddr, SIO_REG_ENABLE, val | 0x01);
1391 superio_exit(sioaddr);
1392 pr_info("Found %s or compatible chip at %#x:%#x\n",
1393 nct6683_chip_names[sio_data->kind], sioaddr, addr);
1394 sio_data->sioreg = sioaddr;
1399 superio_exit(sioaddr);
1404 * when Super-I/O functions move to a separate file, the Super-I/O
1405 * bus will manage the lifetime of the device and this module will only keep
1406 * track of the nct6683 driver. But since we use platform_device_alloc(), we
1407 * must keep track of the device
1409 static struct platform_device *pdev[2];
1411 static int __init sensors_nct6683_init(void)
1413 struct nct6683_sio_data sio_data;
1414 int sioaddr[2] = { 0x2e, 0x4e };
1415 struct resource res;
1420 err = platform_driver_register(&nct6683_driver);
1425 * initialize sio_data->kind and sio_data->sioreg.
1427 * when Super-I/O functions move to a separate file, the Super-I/O
1428 * driver will probe 0x2e and 0x4e and auto-detect the presence of a
1429 * nct6683 hardware monitor, and call probe()
1431 for (i = 0; i < ARRAY_SIZE(pdev); i++) {
1432 address = nct6683_find(sioaddr[i], &sio_data);
1438 pdev[i] = platform_device_alloc(DRVNAME, address);
1441 goto exit_device_unregister;
1444 err = platform_device_add_data(pdev[i], &sio_data,
1445 sizeof(struct nct6683_sio_data));
1447 goto exit_device_put;
1449 memset(&res, 0, sizeof(res));
1451 res.start = address + IOREGION_OFFSET;
1452 res.end = address + IOREGION_OFFSET + IOREGION_LENGTH - 1;
1453 res.flags = IORESOURCE_IO;
1455 err = acpi_check_resource_conflict(&res);
1457 platform_device_put(pdev[i]);
1462 err = platform_device_add_resources(pdev[i], &res, 1);
1464 goto exit_device_put;
1466 /* platform_device_add calls probe() */
1467 err = platform_device_add(pdev[i]);
1469 goto exit_device_put;
1473 goto exit_unregister;
1479 platform_device_put(pdev[i]);
1480 exit_device_unregister:
1483 platform_device_unregister(pdev[i]);
1486 platform_driver_unregister(&nct6683_driver);
1490 static void __exit sensors_nct6683_exit(void)
1494 for (i = 0; i < ARRAY_SIZE(pdev); i++) {
1496 platform_device_unregister(pdev[i]);
1498 platform_driver_unregister(&nct6683_driver);
1502 MODULE_DESCRIPTION("NCT6683D driver");
1503 MODULE_LICENSE("GPL");
1505 module_init(sensors_nct6683_init);
1506 module_exit(sensors_nct6683_exit);