1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * nct6775 - Platform driver for the hardware monitoring
4 * functionality of Nuvoton NCT677x Super-I/O chips
6 * Copyright (C) 2012 Guenter Roeck <linux@roeck-us.net>
9 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
11 #include <linux/acpi.h>
12 #include <linux/dmi.h>
13 #include <linux/hwmon-sysfs.h>
14 #include <linux/hwmon-vid.h>
15 #include <linux/init.h>
17 #include <linux/module.h>
18 #include <linux/platform_device.h>
19 #include <linux/regmap.h>
23 enum sensor_access { access_direct, access_asuswmi };
25 static const char * const nct6775_sio_names[] __initconst = {
40 static unsigned short force_id;
41 module_param(force_id, ushort, 0);
42 MODULE_PARM_DESC(force_id, "Override the detected device ID");
44 static unsigned short fan_debounce;
45 module_param(fan_debounce, ushort, 0);
46 MODULE_PARM_DESC(fan_debounce, "Enable debouncing for fan RPM signal");
48 #define DRVNAME "nct6775"
50 #define NCT6775_PORT_CHIPID 0x58
56 #define IOREGION_ALIGNMENT (~7)
57 #define IOREGION_OFFSET 5
58 #define IOREGION_LENGTH 2
59 #define ADDR_REG_OFFSET 0
60 #define DATA_REG_OFFSET 1
63 * Super-I/O constants and functions
66 #define NCT6775_LD_ACPI 0x0a
67 #define NCT6775_LD_HWM 0x0b
68 #define NCT6775_LD_VID 0x0d
69 #define NCT6775_LD_12 0x12
71 #define SIO_REG_LDSEL 0x07 /* Logical device select */
72 #define SIO_REG_DEVID 0x20 /* Device ID (2 bytes) */
73 #define SIO_REG_ENABLE 0x30 /* Logical device enable */
74 #define SIO_REG_ADDR 0x60 /* Logical device address (2 bytes) */
76 #define SIO_NCT6106_ID 0xc450
77 #define SIO_NCT6116_ID 0xd280
78 #define SIO_NCT6775_ID 0xb470
79 #define SIO_NCT6776_ID 0xc330
80 #define SIO_NCT6779_ID 0xc560
81 #define SIO_NCT6791_ID 0xc800
82 #define SIO_NCT6792_ID 0xc910
83 #define SIO_NCT6793_ID 0xd120
84 #define SIO_NCT6795_ID 0xd350
85 #define SIO_NCT6796_ID 0xd420
86 #define SIO_NCT6797_ID 0xd450
87 #define SIO_NCT6798_ID 0xd428
88 #define SIO_ID_MASK 0xFFF8
93 #define NCT6775_REG_CR_FAN_DEBOUNCE 0xf0
95 struct nct6775_sio_data {
99 enum sensor_access access;
101 /* superio_() callbacks */
102 void (*sio_outb)(struct nct6775_sio_data *sio_data, int reg, int val);
103 int (*sio_inb)(struct nct6775_sio_data *sio_data, int reg);
104 void (*sio_select)(struct nct6775_sio_data *sio_data, int ld);
105 int (*sio_enter)(struct nct6775_sio_data *sio_data);
106 void (*sio_exit)(struct nct6775_sio_data *sio_data);
109 #define ASUSWMI_METHOD "WMBD"
110 #define ASUSWMI_METHODID_RSIO 0x5253494F
111 #define ASUSWMI_METHODID_WSIO 0x5753494F
112 #define ASUSWMI_METHODID_RHWM 0x5248574D
113 #define ASUSWMI_METHODID_WHWM 0x5748574D
114 #define ASUSWMI_UNSUPPORTED_METHOD 0xFFFFFFFE
115 #define ASUSWMI_DEVICE_HID "PNP0C14"
116 #define ASUSWMI_DEVICE_UID "ASUSWMI"
117 #define ASUSMSI_DEVICE_UID "AsusMbSwInterface"
119 #if IS_ENABLED(CONFIG_ACPI)
121 * ASUS boards have only one device with WMI "WMBD" method and have provided
122 * access to only one SuperIO chip at 0x0290.
124 static struct acpi_device *asus_acpi_dev;
127 static int nct6775_asuswmi_evaluate_method(u32 method_id, u8 bank, u8 reg, u8 val, u32 *retval)
129 #if IS_ENABLED(CONFIG_ACPI)
130 acpi_handle handle = acpi_device_handle(asus_acpi_dev);
131 u32 args = bank | (reg << 8) | (val << 16);
132 struct acpi_object_list input;
133 union acpi_object params[3];
134 unsigned long long result;
137 params[0].type = ACPI_TYPE_INTEGER;
138 params[0].integer.value = 0;
139 params[1].type = ACPI_TYPE_INTEGER;
140 params[1].integer.value = method_id;
141 params[2].type = ACPI_TYPE_BUFFER;
142 params[2].buffer.length = sizeof(args);
143 params[2].buffer.pointer = (void *)&args;
145 input.pointer = params;
147 status = acpi_evaluate_integer(handle, ASUSWMI_METHOD, &input, &result);
148 if (ACPI_FAILURE(status))
160 static inline int nct6775_asuswmi_write(u8 bank, u8 reg, u8 val)
162 return nct6775_asuswmi_evaluate_method(ASUSWMI_METHODID_WHWM, bank,
166 static inline int nct6775_asuswmi_read(u8 bank, u8 reg, u8 *val)
170 ret = nct6775_asuswmi_evaluate_method(ASUSWMI_METHODID_RHWM, bank,
176 static int superio_wmi_inb(struct nct6775_sio_data *sio_data, int reg)
180 nct6775_asuswmi_evaluate_method(ASUSWMI_METHODID_RSIO, sio_data->ld,
185 static void superio_wmi_outb(struct nct6775_sio_data *sio_data, int reg, int val)
187 nct6775_asuswmi_evaluate_method(ASUSWMI_METHODID_WSIO, sio_data->ld,
191 static void superio_wmi_select(struct nct6775_sio_data *sio_data, int ld)
196 static int superio_wmi_enter(struct nct6775_sio_data *sio_data)
201 static void superio_wmi_exit(struct nct6775_sio_data *sio_data)
205 static void superio_outb(struct nct6775_sio_data *sio_data, int reg, int val)
207 int ioreg = sio_data->sioreg;
210 outb(val, ioreg + 1);
213 static int superio_inb(struct nct6775_sio_data *sio_data, int reg)
215 int ioreg = sio_data->sioreg;
218 return inb(ioreg + 1);
221 static void superio_select(struct nct6775_sio_data *sio_data, int ld)
223 int ioreg = sio_data->sioreg;
225 outb(SIO_REG_LDSEL, ioreg);
229 static int superio_enter(struct nct6775_sio_data *sio_data)
231 int ioreg = sio_data->sioreg;
234 * Try to reserve <ioreg> and <ioreg + 1> for exclusive access.
236 if (!request_muxed_region(ioreg, 2, DRVNAME))
245 static void superio_exit(struct nct6775_sio_data *sio_data)
247 int ioreg = sio_data->sioreg;
251 outb(0x02, ioreg + 1);
252 release_region(ioreg, 2);
255 static inline void nct6775_wmi_set_bank(struct nct6775_data *data, u16 reg)
262 static int nct6775_wmi_reg_read(void *ctx, unsigned int reg, unsigned int *val)
264 struct nct6775_data *data = ctx;
265 int err, word_sized = nct6775_reg_is_word_sized(data, reg);
269 nct6775_wmi_set_bank(data, reg);
271 err = nct6775_asuswmi_read(data->bank, reg & 0xff, &tmp);
277 err = nct6775_asuswmi_read(data->bank, (reg & 0xff) + 1, &tmp);
281 res = (res << 8) + tmp;
287 static int nct6775_wmi_reg_write(void *ctx, unsigned int reg, unsigned int value)
289 struct nct6775_data *data = ctx;
290 int res, word_sized = nct6775_reg_is_word_sized(data, reg);
292 nct6775_wmi_set_bank(data, reg);
295 res = nct6775_asuswmi_write(data->bank, reg & 0xff, value >> 8);
299 res = nct6775_asuswmi_write(data->bank, (reg & 0xff) + 1, value);
301 res = nct6775_asuswmi_write(data->bank, reg & 0xff, value);
308 * On older chips, only registers 0x50-0x5f are banked.
309 * On more recent chips, all registers are banked.
310 * Assume that is the case and set the bank number for each access.
311 * Cache the bank number so it only needs to be set if it changes.
313 static inline void nct6775_set_bank(struct nct6775_data *data, u16 reg)
317 if (data->bank != bank) {
318 outb_p(NCT6775_REG_BANK, data->addr + ADDR_REG_OFFSET);
319 outb_p(bank, data->addr + DATA_REG_OFFSET);
324 static int nct6775_reg_read(void *ctx, unsigned int reg, unsigned int *val)
326 struct nct6775_data *data = ctx;
327 int word_sized = nct6775_reg_is_word_sized(data, reg);
329 nct6775_set_bank(data, reg);
330 outb_p(reg & 0xff, data->addr + ADDR_REG_OFFSET);
331 *val = inb_p(data->addr + DATA_REG_OFFSET);
333 outb_p((reg & 0xff) + 1,
334 data->addr + ADDR_REG_OFFSET);
335 *val = (*val << 8) + inb_p(data->addr + DATA_REG_OFFSET);
340 static int nct6775_reg_write(void *ctx, unsigned int reg, unsigned int value)
342 struct nct6775_data *data = ctx;
343 int word_sized = nct6775_reg_is_word_sized(data, reg);
345 nct6775_set_bank(data, reg);
346 outb_p(reg & 0xff, data->addr + ADDR_REG_OFFSET);
348 outb_p(value >> 8, data->addr + DATA_REG_OFFSET);
349 outb_p((reg & 0xff) + 1,
350 data->addr + ADDR_REG_OFFSET);
352 outb_p(value & 0xff, data->addr + DATA_REG_OFFSET);
356 static void nct6791_enable_io_mapping(struct nct6775_sio_data *sio_data)
360 val = sio_data->sio_inb(sio_data, NCT6791_REG_HM_IO_SPACE_LOCK_ENABLE);
362 pr_info("Enabling hardware monitor logical device mappings.\n");
363 sio_data->sio_outb(sio_data, NCT6791_REG_HM_IO_SPACE_LOCK_ENABLE,
368 static int nct6775_suspend(struct device *dev)
372 struct nct6775_data *data = nct6775_update_device(dev);
375 return PTR_ERR(data);
377 mutex_lock(&data->update_lock);
378 err = nct6775_read_value(data, data->REG_VBAT, &tmp);
382 if (data->kind == nct6775) {
383 err = nct6775_read_value(data, NCT6775_REG_FANDIV1, &tmp);
388 err = nct6775_read_value(data, NCT6775_REG_FANDIV2, &tmp);
394 mutex_unlock(&data->update_lock);
399 static int nct6775_resume(struct device *dev)
401 struct nct6775_data *data = dev_get_drvdata(dev);
402 struct nct6775_sio_data *sio_data = dev_get_platdata(dev);
406 mutex_lock(&data->update_lock);
407 data->bank = 0xff; /* Force initial bank selection */
409 err = sio_data->sio_enter(sio_data);
413 sio_data->sio_select(sio_data, NCT6775_LD_HWM);
414 reg = sio_data->sio_inb(sio_data, SIO_REG_ENABLE);
415 if (reg != data->sio_reg_enable)
416 sio_data->sio_outb(sio_data, SIO_REG_ENABLE, data->sio_reg_enable);
418 if (data->kind == nct6791 || data->kind == nct6792 ||
419 data->kind == nct6793 || data->kind == nct6795 ||
420 data->kind == nct6796 || data->kind == nct6797 ||
421 data->kind == nct6798)
422 nct6791_enable_io_mapping(sio_data);
424 sio_data->sio_exit(sio_data);
427 for (i = 0; i < data->in_num; i++) {
428 if (!(data->have_in & BIT(i)))
431 err = nct6775_write_value(data, data->REG_IN_MINMAX[0][i], data->in[i][1]);
434 err = nct6775_write_value(data, data->REG_IN_MINMAX[1][i], data->in[i][2]);
439 for (i = 0; i < ARRAY_SIZE(data->fan_min); i++) {
440 if (!(data->has_fan_min & BIT(i)))
443 err = nct6775_write_value(data, data->REG_FAN_MIN[i], data->fan_min[i]);
448 for (i = 0; i < NUM_TEMP; i++) {
449 if (!(data->have_temp & BIT(i)))
452 for (j = 1; j < ARRAY_SIZE(data->reg_temp); j++)
453 if (data->reg_temp[j][i]) {
454 err = nct6775_write_temp(data, data->reg_temp[j][i],
461 /* Restore other settings */
462 err = nct6775_write_value(data, data->REG_VBAT, data->vbat);
465 if (data->kind == nct6775) {
466 err = nct6775_write_value(data, NCT6775_REG_FANDIV1, data->fandiv1);
469 err = nct6775_write_value(data, NCT6775_REG_FANDIV2, data->fandiv2);
473 /* Force re-reading all values */
475 mutex_unlock(&data->update_lock);
480 static DEFINE_SIMPLE_DEV_PM_OPS(nct6775_dev_pm_ops, nct6775_suspend, nct6775_resume);
483 nct6775_check_fan_inputs(struct nct6775_data *data, struct nct6775_sio_data *sio_data)
485 bool fan3pin = false, fan4pin = false, fan4min = false;
486 bool fan5pin = false, fan6pin = false, fan7pin = false;
487 bool pwm3pin = false, pwm4pin = false, pwm5pin = false;
488 bool pwm6pin = false, pwm7pin = false;
490 /* Store SIO_REG_ENABLE for use during resume */
491 sio_data->sio_select(sio_data, NCT6775_LD_HWM);
492 data->sio_reg_enable = sio_data->sio_inb(sio_data, SIO_REG_ENABLE);
494 /* fan4 and fan5 share some pins with the GPIO and serial flash */
495 if (data->kind == nct6775) {
496 int cr2c = sio_data->sio_inb(sio_data, 0x2c);
498 fan3pin = cr2c & BIT(6);
499 pwm3pin = cr2c & BIT(7);
501 /* On NCT6775, fan4 shares pins with the fdc interface */
502 fan4pin = !(sio_data->sio_inb(sio_data, 0x2A) & 0x80);
503 } else if (data->kind == nct6776) {
504 bool gpok = sio_data->sio_inb(sio_data, 0x27) & 0x80;
505 const char *board_vendor, *board_name;
507 board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
508 board_name = dmi_get_system_info(DMI_BOARD_NAME);
510 if (board_name && board_vendor &&
511 !strcmp(board_vendor, "ASRock")) {
513 * Auxiliary fan monitoring is not enabled on ASRock
514 * Z77 Pro4-M if booted in UEFI Ultra-FastBoot mode.
515 * Observed with BIOS version 2.00.
517 if (!strcmp(board_name, "Z77 Pro4-M")) {
518 if ((data->sio_reg_enable & 0xe0) != 0xe0) {
519 data->sio_reg_enable |= 0xe0;
520 sio_data->sio_outb(sio_data, SIO_REG_ENABLE,
521 data->sio_reg_enable);
526 if (data->sio_reg_enable & 0x80)
529 fan3pin = !(sio_data->sio_inb(sio_data, 0x24) & 0x40);
531 if (data->sio_reg_enable & 0x40)
534 fan4pin = sio_data->sio_inb(sio_data, 0x1C) & 0x01;
536 if (data->sio_reg_enable & 0x20)
539 fan5pin = sio_data->sio_inb(sio_data, 0x1C) & 0x02;
543 } else if (data->kind == nct6106) {
544 int cr24 = sio_data->sio_inb(sio_data, 0x24);
546 fan3pin = !(cr24 & 0x80);
547 pwm3pin = cr24 & 0x08;
548 } else if (data->kind == nct6116) {
549 int cr1a = sio_data->sio_inb(sio_data, 0x1a);
550 int cr1b = sio_data->sio_inb(sio_data, 0x1b);
551 int cr24 = sio_data->sio_inb(sio_data, 0x24);
552 int cr2a = sio_data->sio_inb(sio_data, 0x2a);
553 int cr2b = sio_data->sio_inb(sio_data, 0x2b);
554 int cr2f = sio_data->sio_inb(sio_data, 0x2f);
556 fan3pin = !(cr2b & 0x10);
557 fan4pin = (cr2b & 0x80) || // pin 1(2)
558 (!(cr2f & 0x10) && (cr1a & 0x04)); // pin 65(66)
559 fan5pin = (cr2b & 0x80) || // pin 126(127)
560 (!(cr1b & 0x03) && (cr2a & 0x02)); // pin 94(96)
562 pwm3pin = fan3pin && (cr24 & 0x08);
567 * NCT6779D, NCT6791D, NCT6792D, NCT6793D, NCT6795D, NCT6796D,
570 int cr1a = sio_data->sio_inb(sio_data, 0x1a);
571 int cr1b = sio_data->sio_inb(sio_data, 0x1b);
572 int cr1c = sio_data->sio_inb(sio_data, 0x1c);
573 int cr1d = sio_data->sio_inb(sio_data, 0x1d);
574 int cr2a = sio_data->sio_inb(sio_data, 0x2a);
575 int cr2b = sio_data->sio_inb(sio_data, 0x2b);
576 int cr2d = sio_data->sio_inb(sio_data, 0x2d);
577 int cr2f = sio_data->sio_inb(sio_data, 0x2f);
578 bool dsw_en = cr2f & BIT(3);
579 bool ddr4_en = cr2f & BIT(4);
584 sio_data->sio_select(sio_data, NCT6775_LD_12);
585 cre0 = sio_data->sio_inb(sio_data, 0xe0);
586 creb = sio_data->sio_inb(sio_data, 0xeb);
587 cred = sio_data->sio_inb(sio_data, 0xed);
589 fan3pin = !(cr1c & BIT(5));
590 fan4pin = !(cr1c & BIT(6));
591 fan5pin = !(cr1c & BIT(7));
593 pwm3pin = !(cr1c & BIT(0));
594 pwm4pin = !(cr1c & BIT(1));
595 pwm5pin = !(cr1c & BIT(2));
597 switch (data->kind) {
599 fan6pin = cr2d & BIT(1);
600 pwm6pin = cr2d & BIT(0);
603 fan6pin = !dsw_en && (cr2d & BIT(1));
604 pwm6pin = !dsw_en && (cr2d & BIT(0));
607 fan5pin |= cr1b & BIT(5);
608 fan5pin |= creb & BIT(5);
610 fan6pin = !dsw_en && (cr2d & BIT(1));
611 fan6pin |= creb & BIT(3);
613 pwm5pin |= cr2d & BIT(7);
614 pwm5pin |= (creb & BIT(4)) && !(cr2a & BIT(0));
616 pwm6pin = !dsw_en && (cr2d & BIT(0));
617 pwm6pin |= creb & BIT(2);
620 fan5pin |= cr1b & BIT(5);
621 fan5pin |= creb & BIT(5);
623 fan6pin = (cr2a & BIT(4)) &&
624 (!dsw_en || (cred & BIT(4)));
625 fan6pin |= creb & BIT(3);
627 pwm5pin |= cr2d & BIT(7);
628 pwm5pin |= (creb & BIT(4)) && !(cr2a & BIT(0));
630 pwm6pin = (cr2a & BIT(3)) && (cred & BIT(2));
631 pwm6pin |= creb & BIT(2);
634 fan5pin |= cr1b & BIT(5);
635 fan5pin |= (cre0 & BIT(3)) && !(cr1b & BIT(0));
636 fan5pin |= creb & BIT(5);
638 fan6pin = (cr2a & BIT(4)) &&
639 (!dsw_en || (cred & BIT(4)));
640 fan6pin |= creb & BIT(3);
642 fan7pin = !(cr2b & BIT(2));
644 pwm5pin |= cr2d & BIT(7);
645 pwm5pin |= (cre0 & BIT(4)) && !(cr1b & BIT(0));
646 pwm5pin |= (creb & BIT(4)) && !(cr2a & BIT(0));
648 pwm6pin = (cr2a & BIT(3)) && (cred & BIT(2));
649 pwm6pin |= creb & BIT(2);
651 pwm7pin = !(cr1d & (BIT(2) | BIT(3)));
654 fan5pin |= !ddr4_en && (cr1b & BIT(5));
655 fan5pin |= creb & BIT(5);
657 fan6pin = cr2a & BIT(4);
658 fan6pin |= creb & BIT(3);
660 fan7pin = cr1a & BIT(1);
662 pwm5pin |= (creb & BIT(4)) && !(cr2a & BIT(0));
663 pwm5pin |= !ddr4_en && (cr2d & BIT(7));
665 pwm6pin = creb & BIT(2);
666 pwm6pin |= cred & BIT(2);
668 pwm7pin = cr1d & BIT(4);
671 fan6pin = !(cr1b & BIT(0)) && (cre0 & BIT(3));
672 fan6pin |= cr2a & BIT(4);
673 fan6pin |= creb & BIT(5);
675 fan7pin = cr1b & BIT(5);
676 fan7pin |= !(cr2b & BIT(2));
677 fan7pin |= creb & BIT(3);
679 pwm6pin = !(cr1b & BIT(0)) && (cre0 & BIT(4));
680 pwm6pin |= !(cred & BIT(2)) && (cr2a & BIT(3));
681 pwm6pin |= (creb & BIT(4)) && !(cr2a & BIT(0));
683 pwm7pin = !(cr1d & (BIT(2) | BIT(3)));
684 pwm7pin |= cr2d & BIT(7);
685 pwm7pin |= creb & BIT(2);
687 default: /* NCT6779D */
694 /* fan 1 and 2 (0x03) are always present */
695 data->has_fan = 0x03 | (fan3pin << 2) | (fan4pin << 3) |
696 (fan5pin << 4) | (fan6pin << 5) | (fan7pin << 6);
697 data->has_fan_min = 0x03 | (fan3pin << 2) | (fan4min << 3) |
698 (fan5pin << 4) | (fan6pin << 5) | (fan7pin << 6);
699 data->has_pwm = 0x03 | (pwm3pin << 2) | (pwm4pin << 3) |
700 (pwm5pin << 4) | (pwm6pin << 5) | (pwm7pin << 6);
704 cpu0_vid_show(struct device *dev, struct device_attribute *attr, char *buf)
706 struct nct6775_data *data = dev_get_drvdata(dev);
708 return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
711 static DEVICE_ATTR_RO(cpu0_vid);
713 /* Case open detection */
715 static const u8 NCT6775_REG_CR_CASEOPEN_CLR[] = { 0xe6, 0xee };
716 static const u8 NCT6775_CR_CASEOPEN_CLR_MASK[] = { 0x20, 0x01 };
719 clear_caseopen(struct device *dev, struct device_attribute *attr,
720 const char *buf, size_t count)
722 struct nct6775_data *data = dev_get_drvdata(dev);
723 struct nct6775_sio_data *sio_data = data->driver_data;
724 int nr = to_sensor_dev_attr(attr)->index - INTRUSION_ALARM_BASE;
729 if (kstrtoul(buf, 10, &val) || val != 0)
732 mutex_lock(&data->update_lock);
735 * Use CR registers to clear caseopen status.
736 * The CR registers are the same for all chips, and not all chips
737 * support clearing the caseopen status through "regular" registers.
739 ret = sio_data->sio_enter(sio_data);
745 sio_data->sio_select(sio_data, NCT6775_LD_ACPI);
746 reg = sio_data->sio_inb(sio_data, NCT6775_REG_CR_CASEOPEN_CLR[nr]);
747 reg |= NCT6775_CR_CASEOPEN_CLR_MASK[nr];
748 sio_data->sio_outb(sio_data, NCT6775_REG_CR_CASEOPEN_CLR[nr], reg);
749 reg &= ~NCT6775_CR_CASEOPEN_CLR_MASK[nr];
750 sio_data->sio_outb(sio_data, NCT6775_REG_CR_CASEOPEN_CLR[nr], reg);
751 sio_data->sio_exit(sio_data);
753 data->valid = false; /* Force cache refresh */
755 mutex_unlock(&data->update_lock);
759 static SENSOR_DEVICE_ATTR(intrusion0_alarm, 0644, nct6775_show_alarm,
760 clear_caseopen, INTRUSION_ALARM_BASE);
761 static SENSOR_DEVICE_ATTR(intrusion1_alarm, 0644, nct6775_show_alarm,
762 clear_caseopen, INTRUSION_ALARM_BASE + 1);
763 static SENSOR_DEVICE_ATTR(intrusion0_beep, 0644, nct6775_show_beep,
764 nct6775_store_beep, INTRUSION_ALARM_BASE);
765 static SENSOR_DEVICE_ATTR(intrusion1_beep, 0644, nct6775_show_beep,
766 nct6775_store_beep, INTRUSION_ALARM_BASE + 1);
767 static SENSOR_DEVICE_ATTR(beep_enable, 0644, nct6775_show_beep,
768 nct6775_store_beep, BEEP_ENABLE_BASE);
770 static umode_t nct6775_other_is_visible(struct kobject *kobj,
771 struct attribute *attr, int index)
773 struct device *dev = kobj_to_dev(kobj);
774 struct nct6775_data *data = dev_get_drvdata(dev);
776 if (index == 0 && !data->have_vid)
779 if (index == 1 || index == 2) {
780 if (data->ALARM_BITS[INTRUSION_ALARM_BASE + index - 1] < 0)
784 if (index == 3 || index == 4) {
785 if (data->BEEP_BITS[INTRUSION_ALARM_BASE + index - 3] < 0)
789 return nct6775_attr_mode(data, attr);
793 * nct6775_other_is_visible uses the index into the following array
794 * to determine if attributes should be created or not.
795 * Any change in order or content must be matched.
797 static struct attribute *nct6775_attributes_other[] = {
798 &dev_attr_cpu0_vid.attr, /* 0 */
799 &sensor_dev_attr_intrusion0_alarm.dev_attr.attr, /* 1 */
800 &sensor_dev_attr_intrusion1_alarm.dev_attr.attr, /* 2 */
801 &sensor_dev_attr_intrusion0_beep.dev_attr.attr, /* 3 */
802 &sensor_dev_attr_intrusion1_beep.dev_attr.attr, /* 4 */
803 &sensor_dev_attr_beep_enable.dev_attr.attr, /* 5 */
808 static const struct attribute_group nct6775_group_other = {
809 .attrs = nct6775_attributes_other,
810 .is_visible = nct6775_other_is_visible,
813 static int nct6775_platform_probe_init(struct nct6775_data *data)
817 struct nct6775_sio_data *sio_data = data->driver_data;
819 err = sio_data->sio_enter(sio_data);
823 cr2a = sio_data->sio_inb(sio_data, 0x2a);
824 switch (data->kind) {
826 data->have_vid = (cr2a & 0x40);
829 data->have_vid = (cr2a & 0x60) == 0x40;
846 * We can get the VID input values directly at logical device D 0xe3.
848 if (data->have_vid) {
849 sio_data->sio_select(sio_data, NCT6775_LD_VID);
850 data->vid = sio_data->sio_inb(sio_data, 0xe3);
851 data->vrm = vid_which_vrm();
857 sio_data->sio_select(sio_data, NCT6775_LD_HWM);
858 tmp = sio_data->sio_inb(sio_data,
859 NCT6775_REG_CR_FAN_DEBOUNCE);
860 switch (data->kind) {
882 sio_data->sio_outb(sio_data, NCT6775_REG_CR_FAN_DEBOUNCE,
884 pr_info("Enabled fan debounce for chip %s\n", data->name);
887 nct6775_check_fan_inputs(data, sio_data);
889 sio_data->sio_exit(sio_data);
891 return nct6775_add_attr_group(data, &nct6775_group_other);
894 static const struct regmap_config nct6775_regmap_config = {
897 .reg_read = nct6775_reg_read,
898 .reg_write = nct6775_reg_write,
901 static const struct regmap_config nct6775_wmi_regmap_config = {
904 .reg_read = nct6775_wmi_reg_read,
905 .reg_write = nct6775_wmi_reg_write,
908 static int nct6775_platform_probe(struct platform_device *pdev)
910 struct device *dev = &pdev->dev;
911 struct nct6775_sio_data *sio_data = dev_get_platdata(dev);
912 struct nct6775_data *data;
913 struct resource *res;
914 const struct regmap_config *regmapcfg;
916 if (sio_data->access == access_direct) {
917 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
918 if (!devm_request_region(&pdev->dev, res->start, IOREGION_LENGTH, DRVNAME))
922 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
926 data->kind = sio_data->kind;
927 data->sioreg = sio_data->sioreg;
929 if (sio_data->access == access_direct) {
930 data->addr = res->start;
931 regmapcfg = &nct6775_regmap_config;
933 regmapcfg = &nct6775_wmi_regmap_config;
936 platform_set_drvdata(pdev, data);
938 data->driver_data = sio_data;
939 data->driver_init = nct6775_platform_probe_init;
941 return nct6775_probe(&pdev->dev, data, regmapcfg);
944 static struct platform_driver nct6775_driver = {
947 .pm = pm_sleep_ptr(&nct6775_dev_pm_ops),
949 .probe = nct6775_platform_probe,
952 /* nct6775_find() looks for a '627 in the Super-I/O config space */
953 static int __init nct6775_find(int sioaddr, struct nct6775_sio_data *sio_data)
959 sio_data->access = access_direct;
960 sio_data->sioreg = sioaddr;
962 err = sio_data->sio_enter(sio_data);
966 val = (sio_data->sio_inb(sio_data, SIO_REG_DEVID) << 8) |
967 sio_data->sio_inb(sio_data, SIO_REG_DEVID + 1);
968 if (force_id && val != 0xffff)
971 switch (val & SIO_ID_MASK) {
973 sio_data->kind = nct6106;
976 sio_data->kind = nct6116;
979 sio_data->kind = nct6775;
982 sio_data->kind = nct6776;
985 sio_data->kind = nct6779;
988 sio_data->kind = nct6791;
991 sio_data->kind = nct6792;
994 sio_data->kind = nct6793;
997 sio_data->kind = nct6795;
1000 sio_data->kind = nct6796;
1002 case SIO_NCT6797_ID:
1003 sio_data->kind = nct6797;
1005 case SIO_NCT6798_ID:
1006 sio_data->kind = nct6798;
1010 pr_debug("unsupported chip ID: 0x%04x\n", val);
1011 sio_data->sio_exit(sio_data);
1015 /* We have a known chip, find the HWM I/O address */
1016 sio_data->sio_select(sio_data, NCT6775_LD_HWM);
1017 val = (sio_data->sio_inb(sio_data, SIO_REG_ADDR) << 8)
1018 | sio_data->sio_inb(sio_data, SIO_REG_ADDR + 1);
1019 addr = val & IOREGION_ALIGNMENT;
1021 pr_err("Refusing to enable a Super-I/O device with a base I/O port 0\n");
1022 sio_data->sio_exit(sio_data);
1026 /* Activate logical device if needed */
1027 val = sio_data->sio_inb(sio_data, SIO_REG_ENABLE);
1028 if (!(val & 0x01)) {
1029 pr_warn("Forcibly enabling Super-I/O. Sensor is probably unusable.\n");
1030 sio_data->sio_outb(sio_data, SIO_REG_ENABLE, val | 0x01);
1033 if (sio_data->kind == nct6791 || sio_data->kind == nct6792 ||
1034 sio_data->kind == nct6793 || sio_data->kind == nct6795 ||
1035 sio_data->kind == nct6796 || sio_data->kind == nct6797 ||
1036 sio_data->kind == nct6798)
1037 nct6791_enable_io_mapping(sio_data);
1039 sio_data->sio_exit(sio_data);
1040 pr_info("Found %s or compatible chip at %#x:%#x\n",
1041 nct6775_sio_names[sio_data->kind], sioaddr, addr);
1047 * when Super-I/O functions move to a separate file, the Super-I/O
1048 * bus will manage the lifetime of the device and this module will only keep
1049 * track of the nct6775 driver. But since we use platform_device_alloc(), we
1050 * must keep track of the device
1052 static struct platform_device *pdev[2];
1054 static const char * const asus_wmi_boards[] = {
1074 "PRIME B460M-A R2.0",
1077 "PRIME B550-PLUS AC-HES",
1079 "PRIME B550M-A (WI-FI)",
1081 "PRIME B550M-A WIFI II",
1103 "PRIME H410M-K R2.0",
1107 "PRIME H510M-K R2.0",
1127 "ProArt B550-CREATOR",
1128 "ProArt X570-CREATOR WIFI",
1129 "ProArt Z490-CREATOR 10G",
1130 "ROG CROSSHAIR VIII DARK HERO",
1131 "ROG CROSSHAIR VIII EXTREME",
1132 "ROG CROSSHAIR VIII FORMULA",
1133 "ROG CROSSHAIR VIII HERO",
1134 "ROG CROSSHAIR VIII HERO (WI-FI)",
1135 "ROG CROSSHAIR VIII IMPACT",
1136 "ROG MAXIMUS XI APEX",
1137 "ROG MAXIMUS XI CODE",
1138 "ROG MAXIMUS XI EXTREME",
1139 "ROG MAXIMUS XI FORMULA",
1140 "ROG MAXIMUS XI GENE",
1141 "ROG MAXIMUS XI HERO",
1142 "ROG MAXIMUS XI HERO (WI-FI)",
1143 "ROG MAXIMUS XII APEX",
1144 "ROG MAXIMUS XII EXTREME",
1145 "ROG MAXIMUS XII FORMULA",
1146 "ROG MAXIMUS XII HERO (WI-FI)",
1147 "ROG STRIX B360-F GAMING",
1148 "ROG STRIX B360-G GAMING",
1149 "ROG STRIX B360-H GAMING",
1150 "ROG STRIX B360-H GAMING/OPTANE",
1151 "ROG STRIX B360-I GAMING",
1152 "ROG STRIX B460-F GAMING",
1153 "ROG STRIX B460-G GAMING",
1154 "ROG STRIX B460-H GAMING",
1155 "ROG STRIX B460-I GAMING",
1156 "ROG STRIX B550-A GAMING",
1157 "ROG STRIX B550-E GAMING",
1158 "ROG STRIX B550-F GAMING",
1159 "ROG STRIX B550-F GAMING (WI-FI)",
1160 "ROG STRIX B550-F GAMING WIFI II",
1161 "ROG STRIX B550-I GAMING",
1162 "ROG STRIX B550-XE GAMING WIFI",
1163 "ROG STRIX H370-F GAMING",
1164 "ROG STRIX H370-I GAMING",
1165 "ROG STRIX H470-I GAMING",
1166 "ROG STRIX X570-E GAMING",
1167 "ROG STRIX X570-E GAMING WIFI II",
1168 "ROG STRIX X570-F GAMING",
1169 "ROG STRIX X570-I GAMING",
1170 "ROG STRIX Z390-E GAMING",
1171 "ROG STRIX Z390-F GAMING",
1172 "ROG STRIX Z390-H GAMING",
1173 "ROG STRIX Z390-I GAMING",
1174 "ROG STRIX Z490-A GAMING",
1175 "ROG STRIX Z490-E GAMING",
1176 "ROG STRIX Z490-F GAMING",
1177 "ROG STRIX Z490-G GAMING",
1178 "ROG STRIX Z490-G GAMING (WI-FI)",
1179 "ROG STRIX Z490-H GAMING",
1180 "ROG STRIX Z490-I GAMING",
1181 "TUF B360-PLUS GAMING",
1182 "TUF B360-PRO GAMING",
1183 "TUF B360-PRO GAMING (WI-FI)",
1184 "TUF B360M-E GAMING",
1185 "TUF B360M-PLUS GAMING",
1186 "TUF B360M-PLUS GAMING S",
1187 "TUF B360M-PLUS GAMING/BR",
1188 "TUF GAMING A520M-PLUS",
1189 "TUF GAMING A520M-PLUS II",
1190 "TUF GAMING A520M-PLUS WIFI",
1191 "TUF GAMING B460-PLUS",
1192 "TUF GAMING B460-PRO (WI-FI)",
1193 "TUF GAMING B460M-PLUS",
1194 "TUF GAMING B460M-PLUS (WI-FI)",
1195 "TUF GAMING B460M-PRO",
1196 "TUF GAMING B550-PLUS",
1197 "TUF GAMING B550-PLUS (WI-FI)",
1198 "TUF GAMING B550-PLUS WIFI II",
1199 "TUF GAMING B550-PRO",
1200 "TUF GAMING B550M ZAKU (WI-FI)",
1201 "TUF GAMING B550M-E",
1202 "TUF GAMING B550M-E WIFI",
1203 "TUF GAMING B550M-PLUS",
1204 "TUF GAMING B550M-PLUS (WI-FI)",
1205 "TUF GAMING B550M-PLUS WIFI II",
1206 "TUF GAMING H470-PRO",
1207 "TUF GAMING H470-PRO (WI-FI)",
1208 "TUF GAMING X570-PLUS",
1209 "TUF GAMING X570-PLUS (WI-FI)",
1210 "TUF GAMING X570-PLUS_BR",
1211 "TUF GAMING X570-PRO (WI-FI)",
1212 "TUF GAMING X570-PRO WIFI II",
1213 "TUF GAMING Z490-PLUS",
1214 "TUF GAMING Z490-PLUS (WI-FI)",
1215 "TUF H310-PLUS GAMING",
1216 "TUF H310M-PLUS GAMING",
1217 "TUF H310M-PLUS GAMING/BR",
1218 "TUF H370-PRO GAMING",
1219 "TUF H370-PRO GAMING (WI-FI)",
1220 "TUF Z390-PLUS GAMING",
1221 "TUF Z390-PLUS GAMING (WI-FI)",
1222 "TUF Z390-PRO GAMING",
1223 "TUF Z390M-PRO GAMING",
1224 "TUF Z390M-PRO GAMING (WI-FI)",
1226 "Z490-GUNDAM (WI-FI)",
1229 static const char * const asus_msi_boards[] = {
1233 "EX-B660M-V5 PRO D4",
1239 "PRIME B560-PLUS AC-HES",
1246 "PRIME B650M-A AX II",
1248 "PRIME B650M-A WIFI",
1249 "PRIME B650M-A WIFI II",
1250 "PRIME B660-PLUS D4",
1251 "PRIME B660M-A AC D4",
1253 "PRIME B660M-A WIFI D4",
1255 "PRIME B760-PLUS D4",
1257 "PRIME B760M-A AX D4",
1259 "PRIME B760M-A WIFI",
1260 "PRIME B760M-A WIFI D4",
1261 "PRIME B760M-AJ D4",
1264 "PRIME H510M-A WIFI",
1273 "PRIME H610I-PLUS D4",
1275 "PRIME H610M-A WIFI D4",
1281 "PRIME H670-PLUS D4",
1282 "PRIME H770-PLUS D4",
1284 "PRIME X670-P WIFI",
1285 "PRIME X670E-PRO WIFI",
1288 "PRIME Z590-P WIFI",
1294 "PRIME Z690-P WIFI",
1295 "PRIME Z690-P WIFI D4",
1296 "PRIME Z690M-PLUS D4",
1297 "PRIME Z790-A WIFI",
1300 "PRIME Z790-P WIFI",
1301 "PRIME Z790-P WIFI D4",
1303 "PRIME Z790M-PLUS D4",
1318 "Pro WS W680-ACE IPMI",
1320 "Pro WS W790E-SAGE SE",
1321 "ProArt B650-CREATOR",
1322 "ProArt B660-CREATOR D4",
1323 "ProArt B760-CREATOR D4",
1324 "ProArt X670E-CREATOR WIFI",
1325 "ProArt Z690-CREATOR WIFI",
1326 "ProArt Z790-CREATOR WIFI",
1327 "ROG CROSSHAIR X670E EXTREME",
1328 "ROG CROSSHAIR X670E GENE",
1329 "ROG CROSSHAIR X670E HERO",
1330 "ROG MAXIMUS XIII APEX",
1331 "ROG MAXIMUS XIII EXTREME",
1332 "ROG MAXIMUS XIII EXTREME GLACIAL",
1333 "ROG MAXIMUS XIII HERO",
1334 "ROG MAXIMUS Z690 APEX",
1335 "ROG MAXIMUS Z690 EXTREME",
1336 "ROG MAXIMUS Z690 EXTREME GLACIAL",
1337 "ROG MAXIMUS Z690 FORMULA",
1338 "ROG MAXIMUS Z690 HERO",
1339 "ROG MAXIMUS Z690 HERO EVA",
1340 "ROG MAXIMUS Z790 APEX",
1341 "ROG MAXIMUS Z790 EXTREME",
1342 "ROG MAXIMUS Z790 HERO",
1343 "ROG STRIX B560-A GAMING WIFI",
1344 "ROG STRIX B560-E GAMING WIFI",
1345 "ROG STRIX B560-F GAMING WIFI",
1346 "ROG STRIX B560-G GAMING WIFI",
1347 "ROG STRIX B560-I GAMING WIFI",
1348 "ROG STRIX B650-A GAMING WIFI",
1349 "ROG STRIX B650E-E GAMING WIFI",
1350 "ROG STRIX B650E-F GAMING WIFI",
1351 "ROG STRIX B650E-I GAMING WIFI",
1352 "ROG STRIX B660-A GAMING WIFI",
1353 "ROG STRIX B660-A GAMING WIFI D4",
1354 "ROG STRIX B660-F GAMING WIFI",
1355 "ROG STRIX B660-G GAMING WIFI",
1356 "ROG STRIX B660-I GAMING WIFI",
1357 "ROG STRIX B760-A GAMING WIFI",
1358 "ROG STRIX B760-A GAMING WIFI D4",
1359 "ROG STRIX B760-F GAMING WIFI",
1360 "ROG STRIX B760-G GAMING WIFI",
1361 "ROG STRIX B760-G GAMING WIFI D4",
1362 "ROG STRIX B760-I GAMING WIFI",
1363 "ROG STRIX X670E-A GAMING WIFI",
1364 "ROG STRIX X670E-E GAMING WIFI",
1365 "ROG STRIX X670E-F GAMING WIFI",
1366 "ROG STRIX X670E-I GAMING WIFI",
1367 "ROG STRIX Z590-A GAMING WIFI",
1368 "ROG STRIX Z590-A GAMING WIFI II",
1369 "ROG STRIX Z590-E GAMING WIFI",
1370 "ROG STRIX Z590-F GAMING WIFI",
1371 "ROG STRIX Z590-I GAMING WIFI",
1372 "ROG STRIX Z690-A GAMING WIFI",
1373 "ROG STRIX Z690-A GAMING WIFI D4",
1374 "ROG STRIX Z690-E GAMING WIFI",
1375 "ROG STRIX Z690-F GAMING WIFI",
1376 "ROG STRIX Z690-G GAMING WIFI",
1377 "ROG STRIX Z690-I GAMING WIFI",
1378 "ROG STRIX Z790-A GAMING WIFI",
1379 "ROG STRIX Z790-A GAMING WIFI D4",
1380 "ROG STRIX Z790-E GAMING WIFI",
1381 "ROG STRIX Z790-F GAMING WIFI",
1382 "ROG STRIX Z790-H GAMING WIFI",
1383 "ROG STRIX Z790-I GAMING WIFI",
1384 "TUF GAMING A620M-PLUS",
1385 "TUF GAMING A620M-PLUS WIFI",
1386 "TUF GAMING B560-PLUS WIFI",
1387 "TUF GAMING B560M-E",
1388 "TUF GAMING B560M-PLUS",
1389 "TUF GAMING B560M-PLUS WIFI",
1390 "TUF GAMING B650-PLUS",
1391 "TUF GAMING B650-PLUS WIFI",
1392 "TUF GAMING B650M-PLUS",
1393 "TUF GAMING B650M-PLUS WIFI",
1394 "TUF GAMING B660-PLUS WIFI D4",
1395 "TUF GAMING B660M-E D4",
1396 "TUF GAMING B660M-PLUS D4",
1397 "TUF GAMING B660M-PLUS WIFI",
1398 "TUF GAMING B660M-PLUS WIFI D4",
1399 "TUF GAMING B760-PLUS WIFI",
1400 "TUF GAMING B760-PLUS WIFI D4",
1401 "TUF GAMING B760M-BTF WIFI D4",
1402 "TUF GAMING B760M-E D4",
1403 "TUF GAMING B760M-PLUS",
1404 "TUF GAMING B760M-PLUS D4",
1405 "TUF GAMING B760M-PLUS WIFI",
1406 "TUF GAMING B760M-PLUS WIFI D4",
1407 "TUF GAMING H570-PRO",
1408 "TUF GAMING H570-PRO WIFI",
1409 "TUF GAMING H670-PRO WIFI D4",
1410 "TUF GAMING H770-PRO WIFI",
1411 "TUF GAMING X670E-PLUS",
1412 "TUF GAMING X670E-PLUS WIFI",
1413 "TUF GAMING Z590-PLUS",
1414 "TUF GAMING Z590-PLUS WIFI",
1415 "TUF GAMING Z690-PLUS",
1416 "TUF GAMING Z690-PLUS D4",
1417 "TUF GAMING Z690-PLUS WIFI",
1418 "TUF GAMING Z690-PLUS WIFI D4",
1419 "TUF GAMING Z790-PLUS D4",
1420 "TUF GAMING Z790-PLUS WIFI",
1421 "TUF GAMING Z790-PLUS WIFI D4",
1422 "Z590 WIFI GUNDAM EDITION",
1425 #if IS_ENABLED(CONFIG_ACPI)
1427 * Callback for acpi_bus_for_each_dev() to find the right device
1428 * by _UID and _HID and return 1 to stop iteration.
1430 static int nct6775_asuswmi_device_match(struct device *dev, void *data)
1432 struct acpi_device *adev = to_acpi_device(dev);
1433 const char *uid = acpi_device_uid(adev);
1434 const char *hid = acpi_device_hid(adev);
1436 if (hid && !strcmp(hid, ASUSWMI_DEVICE_HID) && uid && !strcmp(uid, data)) {
1437 asus_acpi_dev = adev;
1445 static enum sensor_access nct6775_determine_access(const char *device_uid)
1447 #if IS_ENABLED(CONFIG_ACPI)
1450 acpi_bus_for_each_dev(nct6775_asuswmi_device_match, (void *)device_uid);
1452 return access_direct;
1454 /* if reading chip id via ACPI succeeds, use WMI "WMBD" method for access */
1455 if (!nct6775_asuswmi_read(0, NCT6775_PORT_CHIPID, &tmp) && tmp) {
1456 pr_debug("Using Asus WMBD method of %s to access %#x chip.\n", device_uid, tmp);
1457 return access_asuswmi;
1461 return access_direct;
1464 static int __init sensors_nct6775_platform_init(void)
1469 struct resource res;
1470 struct nct6775_sio_data sio_data;
1471 int sioaddr[2] = { 0x2e, 0x4e };
1472 enum sensor_access access = access_direct;
1473 const char *board_vendor, *board_name;
1475 err = platform_driver_register(&nct6775_driver);
1479 board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
1480 board_name = dmi_get_system_info(DMI_BOARD_NAME);
1482 if (board_name && board_vendor &&
1483 !strcmp(board_vendor, "ASUSTeK COMPUTER INC.")) {
1484 err = match_string(asus_wmi_boards, ARRAY_SIZE(asus_wmi_boards),
1487 access = nct6775_determine_access(ASUSWMI_DEVICE_UID);
1489 err = match_string(asus_msi_boards, ARRAY_SIZE(asus_msi_boards),
1492 access = nct6775_determine_access(ASUSMSI_DEVICE_UID);
1496 * initialize sio_data->kind and sio_data->sioreg.
1498 * when Super-I/O functions move to a separate file, the Super-I/O
1499 * driver will probe 0x2e and 0x4e and auto-detect the presence of a
1500 * nct6775 hardware monitor, and call probe()
1502 for (i = 0; i < ARRAY_SIZE(pdev); i++) {
1503 sio_data.sio_outb = superio_outb;
1504 sio_data.sio_inb = superio_inb;
1505 sio_data.sio_select = superio_select;
1506 sio_data.sio_enter = superio_enter;
1507 sio_data.sio_exit = superio_exit;
1509 address = nct6775_find(sioaddr[i], &sio_data);
1515 sio_data.access = access;
1517 if (access == access_asuswmi) {
1518 sio_data.sio_outb = superio_wmi_outb;
1519 sio_data.sio_inb = superio_wmi_inb;
1520 sio_data.sio_select = superio_wmi_select;
1521 sio_data.sio_enter = superio_wmi_enter;
1522 sio_data.sio_exit = superio_wmi_exit;
1525 pdev[i] = platform_device_alloc(DRVNAME, address);
1528 goto exit_device_unregister;
1531 err = platform_device_add_data(pdev[i], &sio_data,
1532 sizeof(struct nct6775_sio_data));
1534 goto exit_device_put;
1536 if (sio_data.access == access_direct) {
1537 memset(&res, 0, sizeof(res));
1539 res.start = address + IOREGION_OFFSET;
1540 res.end = address + IOREGION_OFFSET + IOREGION_LENGTH - 1;
1541 res.flags = IORESOURCE_IO;
1543 err = acpi_check_resource_conflict(&res);
1545 platform_device_put(pdev[i]);
1550 err = platform_device_add_resources(pdev[i], &res, 1);
1552 goto exit_device_put;
1555 /* platform_device_add calls probe() */
1556 err = platform_device_add(pdev[i]);
1558 goto exit_device_put;
1562 goto exit_unregister;
1568 platform_device_put(pdev[i]);
1569 exit_device_unregister:
1571 platform_device_unregister(pdev[i]);
1573 platform_driver_unregister(&nct6775_driver);
1577 static void __exit sensors_nct6775_platform_exit(void)
1581 for (i = 0; i < ARRAY_SIZE(pdev); i++)
1582 platform_device_unregister(pdev[i]);
1583 platform_driver_unregister(&nct6775_driver);
1586 MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");
1587 MODULE_DESCRIPTION("Platform driver for NCT6775F and compatible chips");
1588 MODULE_LICENSE("GPL");
1589 MODULE_IMPORT_NS(HWMON_NCT6775);
1591 module_init(sensors_nct6775_platform_init);
1592 module_exit(sensors_nct6775_platform_exit);