Lines 17-23
Link Here
|
17 |
#include <linux/module.h> |
17 |
#include <linux/module.h> |
18 |
#include <linux/platform_device.h> |
18 |
#include <linux/platform_device.h> |
19 |
#include <linux/regmap.h> |
19 |
#include <linux/regmap.h> |
20 |
#include <linux/wmi.h> |
|
|
21 |
|
20 |
|
22 |
#include "nct6775.h" |
21 |
#include "nct6775.h" |
23 |
|
22 |
|
Lines 36-41
static const char * const nct6775_sio_names[] __initconst = {
Link Here
|
36 |
"NCT6796D", |
35 |
"NCT6796D", |
37 |
"NCT6797D", |
36 |
"NCT6797D", |
38 |
"NCT6798D", |
37 |
"NCT6798D", |
|
|
38 |
"NCT6799D", |
39 |
}; |
39 |
}; |
40 |
|
40 |
|
41 |
static unsigned short force_id; |
41 |
static unsigned short force_id; |
Lines 86-91
MODULE_PARM_DESC(fan_debounce, "Enable debouncing for fan RPM signal");
Link Here
|
86 |
#define SIO_NCT6796_ID 0xd420 |
86 |
#define SIO_NCT6796_ID 0xd420 |
87 |
#define SIO_NCT6797_ID 0xd450 |
87 |
#define SIO_NCT6797_ID 0xd450 |
88 |
#define SIO_NCT6798_ID 0xd428 |
88 |
#define SIO_NCT6798_ID 0xd428 |
|
|
89 |
#define SIO_NCT6799_ID 0xd800 |
89 |
#define SIO_ID_MASK 0xFFF8 |
90 |
#define SIO_ID_MASK 0xFFF8 |
90 |
|
91 |
|
91 |
/* |
92 |
/* |
Lines 98-103
struct nct6775_sio_data {
Link Here
|
98 |
int ld; |
99 |
int ld; |
99 |
enum kinds kind; |
100 |
enum kinds kind; |
100 |
enum sensor_access access; |
101 |
enum sensor_access access; |
|
|
102 |
acpi_handle acpi_wmi_mutex; |
101 |
|
103 |
|
102 |
/* superio_() callbacks */ |
104 |
/* superio_() callbacks */ |
103 |
void (*sio_outb)(struct nct6775_sio_data *sio_data, int reg, int val); |
105 |
void (*sio_outb)(struct nct6775_sio_data *sio_data, int reg, int val); |
Lines 107-146
struct nct6775_sio_data {
Link Here
|
107 |
void (*sio_exit)(struct nct6775_sio_data *sio_data); |
109 |
void (*sio_exit)(struct nct6775_sio_data *sio_data); |
108 |
}; |
110 |
}; |
109 |
|
111 |
|
110 |
#define ASUSWMI_MONITORING_GUID "466747A0-70EC-11DE-8A39-0800200C9A66" |
112 |
#define ASUSWMI_METHOD "WMBD" |
111 |
#define ASUSWMI_METHODID_RSIO 0x5253494F |
113 |
#define ASUSWMI_METHODID_RSIO 0x5253494F |
112 |
#define ASUSWMI_METHODID_WSIO 0x5753494F |
114 |
#define ASUSWMI_METHODID_WSIO 0x5753494F |
113 |
#define ASUSWMI_METHODID_RHWM 0x5248574D |
115 |
#define ASUSWMI_METHODID_RHWM 0x5248574D |
114 |
#define ASUSWMI_METHODID_WHWM 0x5748574D |
116 |
#define ASUSWMI_METHODID_WHWM 0x5748574D |
115 |
#define ASUSWMI_UNSUPPORTED_METHOD 0xFFFFFFFE |
117 |
#define ASUSWMI_UNSUPPORTED_METHOD 0xFFFFFFFE |
|
|
118 |
#define ASUSWMI_DEVICE_HID "PNP0C14" |
119 |
#define ASUSWMI_DEVICE_UID "ASUSWMI" |
120 |
#define ASUSMSI_DEVICE_UID "AsusMbSwInterface" |
121 |
|
122 |
#if IS_ENABLED(CONFIG_ACPI) |
123 |
/* |
124 |
* ASUS boards have only one device with WMI "WMBD" method and have provided |
125 |
* access to only one SuperIO chip at 0x0290. |
126 |
*/ |
127 |
static struct acpi_device *asus_acpi_dev; |
128 |
#endif |
116 |
|
129 |
|
117 |
static int nct6775_asuswmi_evaluate_method(u32 method_id, u8 bank, u8 reg, u8 val, u32 *retval) |
130 |
static int nct6775_asuswmi_evaluate_method(u32 method_id, u8 bank, u8 reg, u8 val, u32 *retval) |
118 |
{ |
131 |
{ |
119 |
#if IS_ENABLED(CONFIG_ACPI_WMI) |
132 |
#if IS_ENABLED(CONFIG_ACPI) |
|
|
133 |
acpi_handle handle = acpi_device_handle(asus_acpi_dev); |
120 |
u32 args = bank | (reg << 8) | (val << 16); |
134 |
u32 args = bank | (reg << 8) | (val << 16); |
121 |
struct acpi_buffer input = { (acpi_size) sizeof(args), &args }; |
135 |
struct acpi_object_list input; |
122 |
struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL }; |
136 |
union acpi_object params[3]; |
|
|
137 |
unsigned long long result; |
123 |
acpi_status status; |
138 |
acpi_status status; |
124 |
union acpi_object *obj; |
|
|
125 |
u32 tmp = ASUSWMI_UNSUPPORTED_METHOD; |
126 |
|
127 |
status = wmi_evaluate_method(ASUSWMI_MONITORING_GUID, 0, |
128 |
method_id, &input, &output); |
129 |
|
139 |
|
|
|
140 |
params[0].type = ACPI_TYPE_INTEGER; |
141 |
params[0].integer.value = 0; |
142 |
params[1].type = ACPI_TYPE_INTEGER; |
143 |
params[1].integer.value = method_id; |
144 |
params[2].type = ACPI_TYPE_BUFFER; |
145 |
params[2].buffer.length = sizeof(args); |
146 |
params[2].buffer.pointer = (void *)&args; |
147 |
input.count = 3; |
148 |
input.pointer = params; |
149 |
|
150 |
status = acpi_evaluate_integer(handle, ASUSWMI_METHOD, &input, &result); |
130 |
if (ACPI_FAILURE(status)) |
151 |
if (ACPI_FAILURE(status)) |
131 |
return -EIO; |
152 |
return -EIO; |
132 |
|
153 |
|
133 |
obj = output.pointer; |
|
|
134 |
if (obj && obj->type == ACPI_TYPE_INTEGER) |
135 |
tmp = obj->integer.value; |
136 |
|
137 |
if (retval) |
154 |
if (retval) |
138 |
*retval = tmp; |
155 |
*retval = (u32)result & 0xFFFFFFFF; |
139 |
|
156 |
|
140 |
kfree(obj); |
|
|
141 |
|
142 |
if (tmp == ASUSWMI_UNSUPPORTED_METHOD) |
143 |
return -ENODEV; |
144 |
return 0; |
157 |
return 0; |
145 |
#else |
158 |
#else |
146 |
return -EOPNOTSUPP; |
159 |
return -EOPNOTSUPP; |
Lines 364-370
static int nct6775_suspend(struct device *dev)
Link Here
|
364 |
if (IS_ERR(data)) |
377 |
if (IS_ERR(data)) |
365 |
return PTR_ERR(data); |
378 |
return PTR_ERR(data); |
366 |
|
379 |
|
367 |
mutex_lock(&data->update_lock); |
380 |
err = data->lock(data); |
|
|
381 |
if (err) |
382 |
return err; |
383 |
|
368 |
err = nct6775_read_value(data, data->REG_VBAT, &tmp); |
384 |
err = nct6775_read_value(data, data->REG_VBAT, &tmp); |
369 |
if (err) |
385 |
if (err) |
370 |
goto out; |
386 |
goto out; |
Lines 381-387
static int nct6775_suspend(struct device *dev)
Link Here
|
381 |
data->fandiv2 = tmp; |
397 |
data->fandiv2 = tmp; |
382 |
} |
398 |
} |
383 |
out: |
399 |
out: |
384 |
mutex_unlock(&data->update_lock); |
400 |
data->unlock(data, dev); |
385 |
|
401 |
|
386 |
return err; |
402 |
return err; |
387 |
} |
403 |
} |
Lines 393-399
static int nct6775_resume(struct device *dev)
Link Here
|
393 |
int i, j, err = 0; |
409 |
int i, j, err = 0; |
394 |
u8 reg; |
410 |
u8 reg; |
395 |
|
411 |
|
396 |
mutex_lock(&data->update_lock); |
412 |
err = data->lock(data); |
|
|
413 |
if (err) |
414 |
return err; |
415 |
|
397 |
data->bank = 0xff; /* Force initial bank selection */ |
416 |
data->bank = 0xff; /* Force initial bank selection */ |
398 |
|
417 |
|
399 |
err = sio_data->sio_enter(sio_data); |
418 |
err = sio_data->sio_enter(sio_data); |
Lines 408-414
static int nct6775_resume(struct device *dev)
Link Here
|
408 |
if (data->kind == nct6791 || data->kind == nct6792 || |
427 |
if (data->kind == nct6791 || data->kind == nct6792 || |
409 |
data->kind == nct6793 || data->kind == nct6795 || |
428 |
data->kind == nct6793 || data->kind == nct6795 || |
410 |
data->kind == nct6796 || data->kind == nct6797 || |
429 |
data->kind == nct6796 || data->kind == nct6797 || |
411 |
data->kind == nct6798) |
430 |
data->kind == nct6798 || data->kind == nct6799) |
412 |
nct6791_enable_io_mapping(sio_data); |
431 |
nct6791_enable_io_mapping(sio_data); |
413 |
|
432 |
|
414 |
sio_data->sio_exit(sio_data); |
433 |
sio_data->sio_exit(sio_data); |
Lines 462-468
static int nct6775_resume(struct device *dev)
Link Here
|
462 |
abort: |
481 |
abort: |
463 |
/* Force re-reading all values */ |
482 |
/* Force re-reading all values */ |
464 |
data->valid = false; |
483 |
data->valid = false; |
465 |
mutex_unlock(&data->update_lock); |
484 |
data->unlock(data, dev); |
466 |
|
485 |
|
467 |
return err; |
486 |
return err; |
468 |
} |
487 |
} |
Lines 555-561
nct6775_check_fan_inputs(struct nct6775_data *data, struct nct6775_sio_data *sio
Link Here
|
555 |
} else { |
574 |
} else { |
556 |
/* |
575 |
/* |
557 |
* NCT6779D, NCT6791D, NCT6792D, NCT6793D, NCT6795D, NCT6796D, |
576 |
* NCT6779D, NCT6791D, NCT6792D, NCT6793D, NCT6795D, NCT6796D, |
558 |
* NCT6797D, NCT6798D |
577 |
* NCT6797D, NCT6798D, NCT6799D |
559 |
*/ |
578 |
*/ |
560 |
int cr1a = sio_data->sio_inb(sio_data, 0x1a); |
579 |
int cr1a = sio_data->sio_inb(sio_data, 0x1a); |
561 |
int cr1b = sio_data->sio_inb(sio_data, 0x1b); |
580 |
int cr1b = sio_data->sio_inb(sio_data, 0x1b); |
Lines 565-576
nct6775_check_fan_inputs(struct nct6775_data *data, struct nct6775_sio_data *sio
Link Here
|
565 |
int cr2b = sio_data->sio_inb(sio_data, 0x2b); |
584 |
int cr2b = sio_data->sio_inb(sio_data, 0x2b); |
566 |
int cr2d = sio_data->sio_inb(sio_data, 0x2d); |
585 |
int cr2d = sio_data->sio_inb(sio_data, 0x2d); |
567 |
int cr2f = sio_data->sio_inb(sio_data, 0x2f); |
586 |
int cr2f = sio_data->sio_inb(sio_data, 0x2f); |
|
|
587 |
bool vsb_ctl_en = cr2f & BIT(0); |
568 |
bool dsw_en = cr2f & BIT(3); |
588 |
bool dsw_en = cr2f & BIT(3); |
569 |
bool ddr4_en = cr2f & BIT(4); |
589 |
bool ddr4_en = cr2f & BIT(4); |
|
|
590 |
bool as_seq1_en = cr2f & BIT(7); |
570 |
int cre0; |
591 |
int cre0; |
|
|
592 |
int cre6; |
571 |
int creb; |
593 |
int creb; |
572 |
int cred; |
594 |
int cred; |
573 |
|
595 |
|
|
|
596 |
cre6 = sio_data->sio_inb(sio_data, 0xe0); |
597 |
|
574 |
sio_data->sio_select(sio_data, NCT6775_LD_12); |
598 |
sio_data->sio_select(sio_data, NCT6775_LD_12); |
575 |
cre0 = sio_data->sio_inb(sio_data, 0xe0); |
599 |
cre0 = sio_data->sio_inb(sio_data, 0xe0); |
576 |
creb = sio_data->sio_inb(sio_data, 0xeb); |
600 |
creb = sio_data->sio_inb(sio_data, 0xeb); |
Lines 673-678
nct6775_check_fan_inputs(struct nct6775_data *data, struct nct6775_sio_data *sio
Link Here
|
673 |
pwm7pin = !(cr1d & (BIT(2) | BIT(3))); |
697 |
pwm7pin = !(cr1d & (BIT(2) | BIT(3))); |
674 |
pwm7pin |= cr2d & BIT(7); |
698 |
pwm7pin |= cr2d & BIT(7); |
675 |
pwm7pin |= creb & BIT(2); |
699 |
pwm7pin |= creb & BIT(2); |
|
|
700 |
break; |
701 |
case nct6799: |
702 |
fan4pin = cr1c & BIT(6); |
703 |
fan5pin = cr1c & BIT(7); |
704 |
|
705 |
fan6pin = !(cr1b & BIT(0)) && (cre0 & BIT(3)); |
706 |
fan6pin |= cre6 & BIT(5); |
707 |
fan6pin |= creb & BIT(5); |
708 |
fan6pin |= !as_seq1_en && (cr2a & BIT(4)); |
709 |
|
710 |
fan7pin = cr1b & BIT(5); |
711 |
fan7pin |= !vsb_ctl_en && !(cr2b & BIT(2)); |
712 |
fan7pin |= creb & BIT(3); |
713 |
|
714 |
pwm6pin = !(cr1b & BIT(0)) && (cre0 & BIT(4)); |
715 |
pwm6pin |= !as_seq1_en && !(cred & BIT(2)) && (cr2a & BIT(3)); |
716 |
pwm6pin |= (creb & BIT(4)) && !(cr2a & BIT(0)); |
717 |
pwm6pin |= cre6 & BIT(3); |
718 |
|
719 |
pwm7pin = !vsb_ctl_en && !(cr1d & (BIT(2) | BIT(3))); |
720 |
pwm7pin |= creb & BIT(2); |
721 |
pwm7pin |= cr2d & BIT(7); |
722 |
|
676 |
break; |
723 |
break; |
677 |
default: /* NCT6779D */ |
724 |
default: /* NCT6779D */ |
678 |
break; |
725 |
break; |
Lines 719-725
clear_caseopen(struct device *dev, struct device_attribute *attr,
Link Here
|
719 |
if (kstrtoul(buf, 10, &val) || val != 0) |
766 |
if (kstrtoul(buf, 10, &val) || val != 0) |
720 |
return -EINVAL; |
767 |
return -EINVAL; |
721 |
|
768 |
|
722 |
mutex_lock(&data->update_lock); |
769 |
ret = data->lock(data); |
|
|
770 |
if (ret) |
771 |
return ret; |
723 |
|
772 |
|
724 |
/* |
773 |
/* |
725 |
* Use CR registers to clear caseopen status. |
774 |
* Use CR registers to clear caseopen status. |
Lines 742-748
clear_caseopen(struct device *dev, struct device_attribute *attr,
Link Here
|
742 |
|
791 |
|
743 |
data->valid = false; /* Force cache refresh */ |
792 |
data->valid = false; /* Force cache refresh */ |
744 |
error: |
793 |
error: |
745 |
mutex_unlock(&data->update_lock); |
794 |
data->unlock(data, dev); |
746 |
return count; |
795 |
return count; |
747 |
} |
796 |
} |
748 |
|
797 |
|
Lines 828-833
static int nct6775_platform_probe_init(struct nct6775_data *data)
Link Here
|
828 |
case nct6796: |
877 |
case nct6796: |
829 |
case nct6797: |
878 |
case nct6797: |
830 |
case nct6798: |
879 |
case nct6798: |
|
|
880 |
case nct6799: |
831 |
break; |
881 |
break; |
832 |
} |
882 |
} |
833 |
|
883 |
|
Lines 866-871
static int nct6775_platform_probe_init(struct nct6775_data *data)
Link Here
|
866 |
case nct6796: |
916 |
case nct6796: |
867 |
case nct6797: |
917 |
case nct6797: |
868 |
case nct6798: |
918 |
case nct6798: |
|
|
919 |
case nct6799: |
869 |
tmp |= 0x7e; |
920 |
tmp |= 0x7e; |
870 |
break; |
921 |
break; |
871 |
} |
922 |
} |
Lines 913-918
static int nct6775_platform_probe(struct platform_device *pdev)
Link Here
|
913 |
if (!data) |
964 |
if (!data) |
914 |
return -ENOMEM; |
965 |
return -ENOMEM; |
915 |
|
966 |
|
|
|
967 |
data->acpi_wmi_mutex = sio_data->acpi_wmi_mutex; |
916 |
data->kind = sio_data->kind; |
968 |
data->kind = sio_data->kind; |
917 |
data->sioreg = sio_data->sioreg; |
969 |
data->sioreg = sio_data->sioreg; |
918 |
|
970 |
|
Lines 995-1000
static int __init nct6775_find(int sioaddr, struct nct6775_sio_data *sio_data)
Link Here
|
995 |
case SIO_NCT6798_ID: |
1047 |
case SIO_NCT6798_ID: |
996 |
sio_data->kind = nct6798; |
1048 |
sio_data->kind = nct6798; |
997 |
break; |
1049 |
break; |
|
|
1050 |
case SIO_NCT6799_ID: |
1051 |
sio_data->kind = nct6799; |
1052 |
break; |
998 |
default: |
1053 |
default: |
999 |
if (val != 0xffff) |
1054 |
if (val != 0xffff) |
1000 |
pr_debug("unsupported chip ID: 0x%04x\n", val); |
1055 |
pr_debug("unsupported chip ID: 0x%04x\n", val); |
Lines 1023-1029
static int __init nct6775_find(int sioaddr, struct nct6775_sio_data *sio_data)
Link Here
|
1023 |
if (sio_data->kind == nct6791 || sio_data->kind == nct6792 || |
1078 |
if (sio_data->kind == nct6791 || sio_data->kind == nct6792 || |
1024 |
sio_data->kind == nct6793 || sio_data->kind == nct6795 || |
1079 |
sio_data->kind == nct6793 || sio_data->kind == nct6795 || |
1025 |
sio_data->kind == nct6796 || sio_data->kind == nct6797 || |
1080 |
sio_data->kind == nct6796 || sio_data->kind == nct6797 || |
1026 |
sio_data->kind == nct6798) |
1081 |
sio_data->kind == nct6798 || sio_data->kind == nct6799) |
1027 |
nct6791_enable_io_mapping(sio_data); |
1082 |
nct6791_enable_io_mapping(sio_data); |
1028 |
|
1083 |
|
1029 |
sio_data->sio_exit(sio_data); |
1084 |
sio_data->sio_exit(sio_data); |
Lines 1042-1063
static int __init nct6775_find(int sioaddr, struct nct6775_sio_data *sio_data)
Link Here
|
1042 |
static struct platform_device *pdev[2]; |
1097 |
static struct platform_device *pdev[2]; |
1043 |
|
1098 |
|
1044 |
static const char * const asus_wmi_boards[] = { |
1099 |
static const char * const asus_wmi_boards[] = { |
1045 |
"PRO H410T", |
1100 |
"CROSSHAIR VI HERO", // use custom port definition |
1046 |
"ProArt X570-CREATOR WIFI", |
|
|
1047 |
"Pro B550M-C", |
1048 |
"Pro WS X570-ACE", |
1049 |
"PRIME B360-PLUS", |
1101 |
"PRIME B360-PLUS", |
|
|
1102 |
"PRIME B450-PLUS", // use custom port definition |
1103 |
"PRIME B450M-GAMING II", // use custom port definition |
1104 |
"PRIME B450M-GAMING/BR", // use custom port definition |
1050 |
"PRIME B460-PLUS", |
1105 |
"PRIME B460-PLUS", |
1051 |
"PRIME B550-PLUS", |
1106 |
"PRIME B550-PLUS", |
1052 |
"PRIME B550M-A", |
1107 |
"PRIME B550M-A", |
1053 |
"PRIME B550M-A (WI-FI)", |
1108 |
"PRIME B550M-A (WI-FI)", |
|
|
1109 |
"PRIME B550M-A AC", |
1110 |
"PRIME B550M-A WIFI II", |
1111 |
"PRIME B550M-K", |
1054 |
"PRIME H410M-R", |
1112 |
"PRIME H410M-R", |
|
|
1113 |
"PRIME X370-PRO", // use custom port definition |
1114 |
"PRIME X470-PRO", // use custom port definition |
1055 |
"PRIME X570-P", |
1115 |
"PRIME X570-P", |
1056 |
"PRIME X570-PRO", |
1116 |
"PRIME X570-PRO", |
|
|
1117 |
"PRO H410T", |
1118 |
"Pro B550M-C", |
1119 |
"Pro WS X570-ACE", |
1120 |
"ProArt B550-CREATOR", |
1121 |
"ProArt X570-CREATOR WIFI", |
1122 |
"ProArt Z490-CREATOR 10G", |
1123 |
"ROG CROSSHAIR VI EXTREME", // use custom port definition |
1124 |
"ROG CROSSHAIR VI HERO (WI-FI AC)", // use custom port definition |
1125 |
"ROG CROSSHAIR VII HERO", // use custom port definition |
1126 |
"ROG CROSSHAIR VII HERO (WI-FI)", // use custom port definition |
1057 |
"ROG CROSSHAIR VIII DARK HERO", |
1127 |
"ROG CROSSHAIR VIII DARK HERO", |
|
|
1128 |
"ROG CROSSHAIR VIII EXTREME", |
1058 |
"ROG CROSSHAIR VIII FORMULA", |
1129 |
"ROG CROSSHAIR VIII FORMULA", |
1059 |
"ROG CROSSHAIR VIII HERO", |
1130 |
"ROG CROSSHAIR VIII HERO", |
|
|
1131 |
"ROG CROSSHAIR VIII HERO (WI-FI)", |
1060 |
"ROG CROSSHAIR VIII IMPACT", |
1132 |
"ROG CROSSHAIR VIII IMPACT", |
|
|
1133 |
"ROG MAXIMUS XI HERO", |
1134 |
"ROG MAXIMUS XI HERO (WI-FI)", |
1135 |
"ROG STRIX B350-F GAMING", // use custom port definition |
1136 |
"ROG STRIX B350-I GAMING", // use custom port definition |
1137 |
"ROG STRIX B450-E GAMING", // use custom port definition |
1138 |
"ROG STRIX B450-F GAMING", // use custom port definition |
1139 |
"ROG STRIX B450-F GAMING II", // use custom port definition |
1140 |
"ROG STRIX B450-I GAMING", // use custom port definition |
1061 |
"ROG STRIX B550-A GAMING", |
1141 |
"ROG STRIX B550-A GAMING", |
1062 |
"ROG STRIX B550-E GAMING", |
1142 |
"ROG STRIX B550-E GAMING", |
1063 |
"ROG STRIX B550-F GAMING", |
1143 |
"ROG STRIX B550-F GAMING", |
Lines 1065-1070
static const char * const asus_wmi_boards[] = {
Link Here
|
1065 |
"ROG STRIX B550-F GAMING WIFI II", |
1145 |
"ROG STRIX B550-F GAMING WIFI II", |
1066 |
"ROG STRIX B550-I GAMING", |
1146 |
"ROG STRIX B550-I GAMING", |
1067 |
"ROG STRIX B550-XE GAMING (WI-FI)", |
1147 |
"ROG STRIX B550-XE GAMING (WI-FI)", |
|
|
1148 |
"ROG STRIX X370-F GAMING", // use custom port definition |
1149 |
"ROG STRIX X370-I GAMING", // use custom port definition |
1150 |
"ROG STRIX X470-F GAMING", // use custom port definition |
1151 |
"ROG STRIX X470-I GAMING", // use custom port definition |
1068 |
"ROG STRIX X570-E GAMING", |
1152 |
"ROG STRIX X570-E GAMING", |
1069 |
"ROG STRIX X570-E GAMING WIFI II", |
1153 |
"ROG STRIX X570-E GAMING WIFI II", |
1070 |
"ROG STRIX X570-F GAMING", |
1154 |
"ROG STRIX X570-F GAMING", |
Lines 1080-1096
static const char * const asus_wmi_boards[] = {
Link Here
|
1080 |
"ROG STRIX Z490-G GAMING (WI-FI)", |
1164 |
"ROG STRIX Z490-G GAMING (WI-FI)", |
1081 |
"ROG STRIX Z490-H GAMING", |
1165 |
"ROG STRIX Z490-H GAMING", |
1082 |
"ROG STRIX Z490-I GAMING", |
1166 |
"ROG STRIX Z490-I GAMING", |
1083 |
"TUF GAMING B550M-PLUS", |
1167 |
"TUF B450 PLUS GAMING", // use custom port definition |
1084 |
"TUF GAMING B550M-PLUS (WI-FI)", |
1168 |
"TUF GAMING B450-PLUS II", // use custom port definition |
1085 |
"TUF GAMING B550-PLUS", |
1169 |
"TUF GAMING B550-PLUS", |
1086 |
"TUF GAMING B550-PLUS WIFI II", |
1170 |
"TUF GAMING B550-PLUS WIFI II", |
1087 |
"TUF GAMING B550-PRO", |
1171 |
"TUF GAMING B550-PRO", |
|
|
1172 |
"TUF GAMING B550M-E", |
1173 |
"TUF GAMING B550M-E (WI-FI)", |
1174 |
"TUF GAMING B550M-PLUS", |
1175 |
"TUF GAMING B550M-PLUS (WI-FI)", |
1176 |
"TUF GAMING B550M-PLUS WIFI II", |
1088 |
"TUF GAMING X570-PLUS", |
1177 |
"TUF GAMING X570-PLUS", |
1089 |
"TUF GAMING X570-PLUS (WI-FI)", |
1178 |
"TUF GAMING X570-PLUS (WI-FI)", |
1090 |
"TUF GAMING X570-PRO (WI-FI)", |
1179 |
"TUF GAMING X570-PRO (WI-FI)", |
1091 |
"TUF GAMING Z490-PLUS", |
1180 |
"TUF GAMING Z490-PLUS", |
1092 |
"TUF GAMING Z490-PLUS (WI-FI)", |
1181 |
"TUF GAMING Z490-PLUS (WI-FI)", |
|
|
1182 |
"Z490-GUNDAM (WI-FI)", |
1183 |
}; |
1184 |
|
1185 |
static const char * const asus_msi_boards[] = { |
1186 |
"EX-B660M-V5 PRO D4", |
1187 |
"PRIME B650-PLUS", |
1188 |
"PRIME B650M-A", |
1189 |
"PRIME B650M-A AX", |
1190 |
"PRIME B650M-A II", |
1191 |
"PRIME B650M-A WIFI", |
1192 |
"PRIME B650M-A WIFI II", |
1193 |
"PRIME B660M-A D4", |
1194 |
"PRIME B660M-A WIFI D4", |
1195 |
"PRIME X670-P", |
1196 |
"PRIME X670-P WIFI", |
1197 |
"PRIME X670E-PRO WIFI", |
1198 |
"Pro B660M-C-D4", |
1199 |
"Pro WS W680-ACE IPMI", |
1200 |
"ProArt B660-CREATOR D4", |
1201 |
"ProArt X670E-CREATOR WIFI", |
1202 |
"ProArt Z790-CREATOR WIFI", // use custom port definition |
1203 |
"ROG CROSSHAIR X670E EXTREME", |
1204 |
"ROG CROSSHAIR X670E GENE", |
1205 |
"ROG CROSSHAIR X670E HERO", |
1206 |
"ROG MAXIMUS XIII EXTREME GLACIAL", |
1207 |
"ROG MAXIMUS Z690 EXTREME", |
1208 |
"ROG MAXIMUS Z690 EXTREME GLACIAL", |
1209 |
"ROG MAXIMUS Z790 EXTREME", // use custom port definition |
1210 |
"ROG STRIX B650-A GAMING WIFI", |
1211 |
"ROG STRIX B650E-E GAMING WIFI", |
1212 |
"ROG STRIX B650E-F GAMING WIFI", |
1213 |
"ROG STRIX B650E-I GAMING WIFI", |
1214 |
"ROG STRIX B660-A GAMING WIFI D4", |
1215 |
"ROG STRIX B660-F GAMING WIFI", |
1216 |
"ROG STRIX B660-G GAMING WIFI", |
1217 |
"ROG STRIX B660-I GAMING WIFI", |
1218 |
"ROG STRIX X670E-A GAMING WIFI", |
1219 |
"ROG STRIX X670E-E GAMING WIFI", |
1220 |
"ROG STRIX X670E-F GAMING WIFI", |
1221 |
"ROG STRIX X670E-I GAMING WIFI", |
1222 |
"ROG STRIX Z590-A GAMING WIFI II", |
1223 |
"ROG STRIX Z690-A GAMING WIFI D4", |
1224 |
"TUF GAMING B650-PLUS", |
1225 |
"TUF GAMING B650-PLUS WIFI", |
1226 |
"TUF GAMING B650M-PLUS", |
1227 |
"TUF GAMING B650M-PLUS WIFI", |
1228 |
"TUF GAMING B660M-PLUS WIFI", |
1229 |
"TUF GAMING X670E-PLUS", |
1230 |
"TUF GAMING X670E-PLUS WIFI", |
1231 |
"TUF GAMING Z590-PLUS WIFI", |
1232 |
}; |
1233 |
|
1234 |
#if IS_ENABLED(CONFIG_ACPI) |
1235 |
/* |
1236 |
* Callback for acpi_bus_for_each_dev() to find the right device |
1237 |
* by _UID and _HID and return 1 to stop iteration. |
1238 |
*/ |
1239 |
static int nct6775_asuswmi_device_match(struct device *dev, void *data) |
1240 |
{ |
1241 |
struct acpi_device *adev = to_acpi_device(dev); |
1242 |
const char *uid = acpi_device_uid(adev); |
1243 |
const char *hid = acpi_device_hid(adev); |
1244 |
|
1245 |
if (hid && !strcmp(hid, ASUSWMI_DEVICE_HID) && |
1246 |
uid && !strcmp(uid, data)) { |
1247 |
asus_acpi_dev = adev; |
1248 |
return 1; |
1249 |
} |
1250 |
|
1251 |
return 0; |
1252 |
} |
1253 |
#endif |
1254 |
|
1255 |
static enum sensor_access nct6775_determine_access(const char *device_uid) |
1256 |
{ |
1257 |
#if IS_ENABLED(CONFIG_ACPI) |
1258 |
u8 tmp; |
1259 |
|
1260 |
acpi_bus_for_each_dev(nct6775_asuswmi_device_match, (void *)device_uid); |
1261 |
if (!asus_acpi_dev) |
1262 |
return access_direct; |
1263 |
|
1264 |
/* if reading chip id via ACPI succeeds, use WMI "WMBD" method for access */ |
1265 |
if (!nct6775_asuswmi_read(0, NCT6775_PORT_CHIPID, &tmp) && tmp) { |
1266 |
pr_debug("Using Asus WMBD method of %s to access %#x chip.\n", device_uid, tmp); |
1267 |
return access_asuswmi; |
1268 |
} |
1269 |
#endif |
1270 |
|
1271 |
return access_direct; |
1272 |
} |
1273 |
|
1274 |
struct acpi_board_info { |
1275 |
char *acpi_mutex_path; |
1276 |
}; |
1277 |
|
1278 |
#define DMI_ASUS_BOARD_INFO(name, mutex_path) \ |
1279 |
static struct acpi_board_info name = { \ |
1280 |
.acpi_mutex_path = mutex_path, \ |
1281 |
} |
1282 |
|
1283 |
DMI_ASUS_BOARD_INFO(acpi_board_GPEM_MUTEX, "\\_GPE.MUT0"); |
1284 |
DMI_ASUS_BOARD_INFO(acpi_board_LPCB_MUTEX, "\\_SB_.PCI0.LPCB.SIO1.MUT0"); |
1285 |
DMI_ASUS_BOARD_INFO(acpi_board_0LPC_MUTEX, "\\_SB.PC00.LPCB.SIO1.MUT0"); |
1286 |
DMI_ASUS_BOARD_INFO(acpi_board_SBRG_MUTEX, "\\_SB.PCI0.SBRG.SIO1.MUT0"); |
1287 |
|
1288 |
#define DMI_MATCH_ASUS_WMI_BOARD(name, info) { \ |
1289 |
.matches = { \ |
1290 |
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."), \ |
1291 |
DMI_EXACT_MATCH(DMI_BOARD_NAME, name), \ |
1292 |
}, \ |
1293 |
.driver_data = info, \ |
1294 |
} |
1295 |
|
1296 |
#define DMI_MATCH_ASUS_NONWMI_BOARD(name, info) { \ |
1297 |
.matches = { \ |
1298 |
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), \ |
1299 |
DMI_EXACT_MATCH(DMI_BOARD_NAME, name), \ |
1300 |
}, \ |
1301 |
.driver_data = info, \ |
1302 |
} |
1303 |
|
1304 |
|
1305 |
static const struct dmi_system_id asus_wmi_info_table[] = { |
1306 |
DMI_MATCH_ASUS_NONWMI_BOARD("P8Z68-V LX", &acpi_board_LPCB_MUTEX), |
1307 |
DMI_MATCH_ASUS_WMI_BOARD("CROSSHAIR VI HERO", &acpi_board_SBRG_MUTEX), |
1308 |
DMI_MATCH_ASUS_WMI_BOARD("MAXIMUS IX APEX", &acpi_board_GPEM_MUTEX), |
1309 |
DMI_MATCH_ASUS_WMI_BOARD("MAXIMUS IX CODE", &acpi_board_GPEM_MUTEX), |
1310 |
DMI_MATCH_ASUS_WMI_BOARD("MAXIMUS IX EXTREME", &acpi_board_GPEM_MUTEX), |
1311 |
DMI_MATCH_ASUS_WMI_BOARD("MAXIMUS IX FORMULA", &acpi_board_GPEM_MUTEX), |
1312 |
DMI_MATCH_ASUS_WMI_BOARD("MAXIMUS IX HERO", &acpi_board_GPEM_MUTEX), |
1313 |
DMI_MATCH_ASUS_WMI_BOARD("MAXIMUS VII HERO", &acpi_board_GPEM_MUTEX), |
1314 |
DMI_MATCH_ASUS_WMI_BOARD("P8H67", &acpi_board_LPCB_MUTEX), |
1315 |
DMI_MATCH_ASUS_WMI_BOARD("PRIME B450M-GAMING/BR", &acpi_board_SBRG_MUTEX), |
1316 |
DMI_MATCH_ASUS_WMI_BOARD("PRIME B450M-GAMING II", &acpi_board_SBRG_MUTEX), |
1317 |
DMI_MATCH_ASUS_WMI_BOARD("PRIME B450-PLUS", &acpi_board_SBRG_MUTEX), |
1318 |
DMI_MATCH_ASUS_WMI_BOARD("PRIME X370-PRO", &acpi_board_SBRG_MUTEX), |
1319 |
DMI_MATCH_ASUS_WMI_BOARD("PRIME X470-PRO", &acpi_board_SBRG_MUTEX), |
1320 |
DMI_MATCH_ASUS_WMI_BOARD("PRIME Z270-A", &acpi_board_GPEM_MUTEX), |
1321 |
DMI_MATCH_ASUS_WMI_BOARD("ProArt Z790-CREATOR WIFI", &acpi_board_0LPC_MUTEX), |
1322 |
DMI_MATCH_ASUS_WMI_BOARD("ROG CROSSHAIR VI EXTREME", &acpi_board_SBRG_MUTEX), |
1323 |
DMI_MATCH_ASUS_WMI_BOARD("ROG CROSSHAIR VI HERO (WI-FI AC)", &acpi_board_SBRG_MUTEX), |
1324 |
DMI_MATCH_ASUS_WMI_BOARD("ROG CROSSHAIR VII HERO", &acpi_board_SBRG_MUTEX), |
1325 |
DMI_MATCH_ASUS_WMI_BOARD("ROG CROSSHAIR VII HERO (WI-FI)", &acpi_board_SBRG_MUTEX), |
1326 |
DMI_MATCH_ASUS_WMI_BOARD("ROG MAXIMUS X HERO", &acpi_board_GPEM_MUTEX), |
1327 |
DMI_MATCH_ASUS_WMI_BOARD("ROG MAXIMUS Z790 EXTREME", &acpi_board_0LPC_MUTEX), |
1328 |
DMI_MATCH_ASUS_WMI_BOARD("ROG STRIX B350-F GAMING", &acpi_board_SBRG_MUTEX), |
1329 |
DMI_MATCH_ASUS_WMI_BOARD("ROG STRIX B350-I GAMING", &acpi_board_SBRG_MUTEX), |
1330 |
DMI_MATCH_ASUS_WMI_BOARD("ROG STRIX B450-E GAMING", &acpi_board_SBRG_MUTEX), |
1331 |
DMI_MATCH_ASUS_WMI_BOARD("ROG STRIX B450-F GAMING", &acpi_board_SBRG_MUTEX), |
1332 |
DMI_MATCH_ASUS_WMI_BOARD("ROG STRIX B450-F GAMING II", &acpi_board_SBRG_MUTEX), |
1333 |
DMI_MATCH_ASUS_WMI_BOARD("ROG STRIX B450-I GAMING", &acpi_board_SBRG_MUTEX), |
1334 |
DMI_MATCH_ASUS_WMI_BOARD("ROG STRIX X370-F GAMING", &acpi_board_SBRG_MUTEX), |
1335 |
DMI_MATCH_ASUS_WMI_BOARD("ROG STRIX X370-I GAMING", &acpi_board_SBRG_MUTEX), |
1336 |
DMI_MATCH_ASUS_WMI_BOARD("ROG STRIX X470-F GAMING", &acpi_board_SBRG_MUTEX), |
1337 |
DMI_MATCH_ASUS_WMI_BOARD("ROG STRIX X470-I GAMING", &acpi_board_SBRG_MUTEX), |
1338 |
DMI_MATCH_ASUS_WMI_BOARD("ROG STRIX Z370-H GAMING", &acpi_board_GPEM_MUTEX), |
1339 |
DMI_MATCH_ASUS_WMI_BOARD("STRIX-Z270E-GAMING", &acpi_board_GPEM_MUTEX), |
1340 |
DMI_MATCH_ASUS_WMI_BOARD("STRIX-Z270F-GAMING", &acpi_board_GPEM_MUTEX), |
1341 |
DMI_MATCH_ASUS_WMI_BOARD("STRIX-Z270G-GAMING", &acpi_board_GPEM_MUTEX), |
1342 |
DMI_MATCH_ASUS_WMI_BOARD("STRIX-Z270H-GAMING", &acpi_board_GPEM_MUTEX), |
1343 |
DMI_MATCH_ASUS_WMI_BOARD("TUF B450 PLUS GAMING", &acpi_board_SBRG_MUTEX), |
1344 |
DMI_MATCH_ASUS_WMI_BOARD("TUF GAMING B450-PLUS II", &acpi_board_SBRG_MUTEX), |
1345 |
DMI_MATCH_ASUS_WMI_BOARD("TUF Z270 MARK 1", &acpi_board_GPEM_MUTEX), |
1346 |
DMI_MATCH_ASUS_WMI_BOARD("Z170-DELUXE", &acpi_board_GPEM_MUTEX), |
1347 |
DMI_MATCH_ASUS_WMI_BOARD("Z170M-PLUS", &acpi_board_GPEM_MUTEX), |
1348 |
DMI_MATCH_ASUS_WMI_BOARD("Z270-WS", &acpi_board_GPEM_MUTEX), |
1349 |
{} |
1093 |
}; |
1350 |
}; |
|
|
1351 |
MODULE_DEVICE_TABLE(dmi, asus_wmi_info_table); |
1094 |
|
1352 |
|
1095 |
static int __init sensors_nct6775_platform_init(void) |
1353 |
static int __init sensors_nct6775_platform_init(void) |
1096 |
{ |
1354 |
{ |
Lines 1102-1108
static int __init sensors_nct6775_platform_init(void)
Link Here
|
1102 |
int sioaddr[2] = { 0x2e, 0x4e }; |
1360 |
int sioaddr[2] = { 0x2e, 0x4e }; |
1103 |
enum sensor_access access = access_direct; |
1361 |
enum sensor_access access = access_direct; |
1104 |
const char *board_vendor, *board_name; |
1362 |
const char *board_vendor, *board_name; |
1105 |
u8 tmp; |
1363 |
const struct dmi_system_id *dmi_id; |
|
|
1364 |
struct acpi_board_info *board_info; |
1365 |
acpi_handle acpi_wmi_mutex = NULL; |
1366 |
acpi_status status; |
1106 |
|
1367 |
|
1107 |
err = platform_driver_register(&nct6775_driver); |
1368 |
err = platform_driver_register(&nct6775_driver); |
1108 |
if (err) |
1369 |
if (err) |
Lines 1115-1128
static int __init sensors_nct6775_platform_init(void)
Link Here
|
1115 |
!strcmp(board_vendor, "ASUSTeK COMPUTER INC.")) { |
1376 |
!strcmp(board_vendor, "ASUSTeK COMPUTER INC.")) { |
1116 |
err = match_string(asus_wmi_boards, ARRAY_SIZE(asus_wmi_boards), |
1377 |
err = match_string(asus_wmi_boards, ARRAY_SIZE(asus_wmi_boards), |
1117 |
board_name); |
1378 |
board_name); |
1118 |
if (err >= 0) { |
1379 |
if (err >= 0) |
1119 |
/* if reading chip id via WMI succeeds, use WMI */ |
1380 |
access = nct6775_determine_access(ASUSWMI_DEVICE_UID); |
1120 |
if (!nct6775_asuswmi_read(0, NCT6775_PORT_CHIPID, &tmp) && tmp) { |
1381 |
|
1121 |
pr_info("Using Asus WMI to access %#x chip.\n", tmp); |
1382 |
err = match_string(asus_msi_boards, ARRAY_SIZE(asus_msi_boards), |
1122 |
access = access_asuswmi; |
1383 |
board_name); |
|
|
1384 |
if (err >= 0) |
1385 |
access = nct6775_determine_access(ASUSMSI_DEVICE_UID); |
1386 |
} |
1387 |
|
1388 |
if (access == access_direct) { |
1389 |
/* Mutext access check */ |
1390 |
dmi_id = dmi_first_match(asus_wmi_info_table); |
1391 |
if (dmi_id && dmi_id->driver_data) { |
1392 |
board_info = dmi_id->driver_data; |
1393 |
if (board_info->acpi_mutex_path) { |
1394 |
status = acpi_get_handle(NULL, board_info->acpi_mutex_path, |
1395 |
&acpi_wmi_mutex); |
1396 |
if (!ACPI_FAILURE(status)) { |
1397 |
pr_info("Using Asus WMI mutex: %s\n", |
1398 |
board_info->acpi_mutex_path); |
1399 |
access = access_direct; |
1400 |
} else { |
1401 |
pr_info("No such ASUS mutex: %s\n", |
1402 |
board_info->acpi_mutex_path); |
1403 |
} |
1123 |
} else { |
1404 |
} else { |
1124 |
pr_err("Can't read ChipID by Asus WMI.\n"); |
1405 |
pr_info("No mutex path\n"); |
1125 |
} |
1406 |
} |
|
|
1407 |
} else { |
1408 |
pr_info("No dmi definition `%s`:`%s`\n", board_name, board_vendor); |
1126 |
} |
1409 |
} |
1127 |
} |
1410 |
} |
1128 |
|
1411 |
|
Lines 1147-1152
static int __init sensors_nct6775_platform_init(void)
Link Here
|
1147 |
found = true; |
1430 |
found = true; |
1148 |
|
1431 |
|
1149 |
sio_data.access = access; |
1432 |
sio_data.access = access; |
|
|
1433 |
sio_data.acpi_wmi_mutex = acpi_wmi_mutex; |
1150 |
|
1434 |
|
1151 |
if (access == access_asuswmi) { |
1435 |
if (access == access_asuswmi) { |
1152 |
sio_data.sio_outb = superio_wmi_outb; |
1436 |
sio_data.sio_outb = superio_wmi_outb; |
Lines 1174-1184
static int __init sensors_nct6775_platform_init(void)
Link Here
|
1174 |
res.end = address + IOREGION_OFFSET + IOREGION_LENGTH - 1; |
1458 |
res.end = address + IOREGION_OFFSET + IOREGION_LENGTH - 1; |
1175 |
res.flags = IORESOURCE_IO; |
1459 |
res.flags = IORESOURCE_IO; |
1176 |
|
1460 |
|
1177 |
err = acpi_check_resource_conflict(&res); |
1461 |
if (!acpi_wmi_mutex) { |
1178 |
if (err) { |
1462 |
err = acpi_check_resource_conflict(&res); |
1179 |
platform_device_put(pdev[i]); |
1463 |
if (err) { |
1180 |
pdev[i] = NULL; |
1464 |
platform_device_put(pdev[i]); |
1181 |
continue; |
1465 |
pdev[i] = NULL; |
|
|
1466 |
continue; |
1467 |
} |
1182 |
} |
1468 |
} |
1183 |
|
1469 |
|
1184 |
err = platform_device_add_resources(pdev[i], &res, 1); |
1470 |
err = platform_device_add_resources(pdev[i], &res, 1); |