View | Details | Raw Unified | Return to bug 204807 | Differences between
and this patch

Collapse All | Expand All

(-)a/drivers/hwmon/nct6775-core.c (-48 / +208 lines)
Lines 33-38 Link Here
33
 *                                           (0xd451)
33
 *                                           (0xd451)
34
 * nct6798d    14      7       7       2+6    0xd428 0xc1    0x5ca3
34
 * nct6798d    14      7       7       2+6    0xd428 0xc1    0x5ca3
35
 *                                           (0xd429)
35
 *                                           (0xd429)
36
 * nct6799d    14      7       7       2+6    0xd802 0xc1    0x5ca3
36
 *
37
 *
37
 * #temp lists the number of monitored temperature sources (first value) plus
38
 * #temp lists the number of monitored temperature sources (first value) plus
38
 * the number of directly connectable temperature sensors (second value).
39
 * the number of directly connectable temperature sensors (second value).
Lines 40-45 Link Here
40
41
41
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
42
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
42
43
44
#include <linux/acpi.h>
43
#include <linux/module.h>
45
#include <linux/module.h>
44
#include <linux/init.h>
46
#include <linux/init.h>
45
#include <linux/slab.h>
47
#include <linux/slab.h>
Lines 73-78 static const char * const nct6775_device_names[] = { Link Here
73
	"nct6796",
75
	"nct6796",
74
	"nct6797",
76
	"nct6797",
75
	"nct6798",
77
	"nct6798",
78
	"nct6799",
76
};
79
};
77
80
78
/* Common and NCT6775 specific data */
81
/* Common and NCT6775 specific data */
Lines 381-387 static const u16 NCT6779_REG_TEMP_OVER[ARRAY_SIZE(NCT6779_REG_TEMP)] = { Link Here
381
	0x39, 0x155 };
384
	0x39, 0x155 };
382
385
383
static const u16 NCT6779_REG_TEMP_OFFSET[] = {
386
static const u16 NCT6779_REG_TEMP_OFFSET[] = {
384
	0x454, 0x455, 0x456, 0x44a, 0x44b, 0x44c };
387
	0x454, 0x455, 0x456, 0x44a, 0x44b, 0x44c, 0x44d, 0x449 };
385
388
386
static const char *const nct6779_temp_label[] = {
389
static const char *const nct6779_temp_label[] = {
387
	"",
390
	"",
Lines 654-659 static const char *const nct6798_temp_label[] = { Link Here
654
#define NCT6798_TEMP_MASK	0xbfff0ffe
657
#define NCT6798_TEMP_MASK	0xbfff0ffe
655
#define NCT6798_VIRT_TEMP_MASK	0x80000c00
658
#define NCT6798_VIRT_TEMP_MASK	0x80000c00
656
659
660
static const char *const nct6799_temp_label[] = {
661
	"",
662
	"SYSTIN",
663
	"CPUTIN",
664
	"AUXTIN0",
665
	"AUXTIN1",
666
	"AUXTIN2",
667
	"AUXTIN3",
668
	"AUXTIN4",
669
	"SMBUSMASTER 0",
670
	"SMBUSMASTER 1",
671
	"Virtual_TEMP",
672
	"Virtual_TEMP",
673
	"",
674
	"AUXTIN5",
675
	"",
676
	"",
677
	"PECI Agent 0",
678
	"PECI Agent 1",
679
	"PCH_CHIP_CPU_MAX_TEMP",
680
	"PCH_CHIP_TEMP",
681
	"PCH_CPU_TEMP",
682
	"PCH_MCH_TEMP",
683
	"Agent0 Dimm0",
684
	"Agent0 Dimm1",
685
	"Agent1 Dimm0",
686
	"Agent1 Dimm1",
687
	"BYTE_TEMP0",
688
	"BYTE_TEMP1",
689
	"PECI Agent 0 Calibration",	/* undocumented */
690
	"PECI Agent 1 Calibration",	/* undocumented */
691
	"",
692
	"Virtual_TEMP"
693
};
694
695
#define NCT6799_TEMP_MASK	0xbfff2ffe
696
#define NCT6799_VIRT_TEMP_MASK	0x80000c00
697
657
/* NCT6102D/NCT6106D specific data */
698
/* NCT6102D/NCT6106D specific data */
658
699
659
#define NCT6106_REG_VBAT	0x318
700
#define NCT6106_REG_VBAT	0x318
Lines 1109-1114 bool nct6775_reg_is_word_sized(struct nct6775_data *data, u16 reg) Link Here
1109
	case nct6796:
1150
	case nct6796:
1110
	case nct6797:
1151
	case nct6797:
1111
	case nct6798:
1152
	case nct6798:
1153
	case nct6799:
1112
		return reg == 0x150 || reg == 0x153 || reg == 0x155 ||
1154
		return reg == 0x150 || reg == 0x153 || reg == 0x155 ||
1113
		  (reg & 0xfff0) == 0x4c0 ||
1155
		  (reg & 0xfff0) == 0x4c0 ||
1114
		  reg == 0x402 ||
1156
		  reg == 0x402 ||
Lines 1462-1467 static int nct6775_update_pwm_limits(struct device *dev) Link Here
1462
		case nct6796:
1504
		case nct6796:
1463
		case nct6797:
1505
		case nct6797:
1464
		case nct6798:
1506
		case nct6798:
1507
		case nct6799:
1465
			err = nct6775_read_value(data, data->REG_CRITICAL_PWM_ENABLE[i], &reg);
1508
			err = nct6775_read_value(data, data->REG_CRITICAL_PWM_ENABLE[i], &reg);
1466
			if (err)
1509
			if (err)
1467
				return err;
1510
				return err;
Lines 1480-1492 static int nct6775_update_pwm_limits(struct device *dev) Link Here
1480
	return 0;
1523
	return 0;
1481
}
1524
}
1482
1525
1526
static int nct6775_lock(struct nct6775_data *data)
1527
{
1528
	mutex_lock(&data->update_lock);
1529
1530
	return 0;
1531
}
1532
1533
static void nct6775_unlock(struct nct6775_data *data, struct device *dev)
1534
{
1535
	mutex_unlock(&data->update_lock);
1536
}
1537
1483
struct nct6775_data *nct6775_update_device(struct device *dev)
1538
struct nct6775_data *nct6775_update_device(struct device *dev)
1484
{
1539
{
1485
	struct nct6775_data *data = dev_get_drvdata(dev);
1540
	struct nct6775_data *data = dev_get_drvdata(dev);
1486
	int i, j, err = 0;
1541
	int i, j, err;
1487
	u16 reg;
1542
	u16 reg;
1488
1543
1489
	mutex_lock(&data->update_lock);
1544
	err = data->lock(data);
1545
	if (err)
1546
		return data;
1490
1547
1491
	if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
1548
	if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
1492
	    || !data->valid) {
1549
	    || !data->valid) {
Lines 1612-1618 struct nct6775_data *nct6775_update_device(struct device *dev) Link Here
1612
		data->valid = true;
1669
		data->valid = true;
1613
	}
1670
	}
1614
out:
1671
out:
1615
	mutex_unlock(&data->update_lock);
1672
	data->unlock(data, dev);
1616
	return err ? ERR_PTR(err) : data;
1673
	return err ? ERR_PTR(err) : data;
1617
}
1674
}
1618
EXPORT_SYMBOL_GPL(nct6775_update_device);
1675
EXPORT_SYMBOL_GPL(nct6775_update_device);
Lines 1648-1657 store_in_reg(struct device *dev, struct device_attribute *attr, const char *buf, Link Here
1648
	err = kstrtoul(buf, 10, &val);
1705
	err = kstrtoul(buf, 10, &val);
1649
	if (err < 0)
1706
	if (err < 0)
1650
		return err;
1707
		return err;
1651
	mutex_lock(&data->update_lock);
1708
1709
	err = data->lock(data);
1710
	if (err)
1711
		return err;
1712
1652
	data->in[nr][index] = in_to_reg(val, nr);
1713
	data->in[nr][index] = in_to_reg(val, nr);
1653
	err = nct6775_write_value(data, data->REG_IN_MINMAX[index - 1][nr], data->in[nr][index]);
1714
	err = nct6775_write_value(data, data->REG_IN_MINMAX[index - 1][nr], data->in[nr][index]);
1654
	mutex_unlock(&data->update_lock);
1715
	data->unlock(data, dev);
1655
	return err ? : count;
1716
	return err ? : count;
1656
}
1717
}
1657
1718
Lines 1745-1758 nct6775_store_beep(struct device *dev, struct device_attribute *attr, const char Link Here
1745
	if (val > 1)
1806
	if (val > 1)
1746
		return -EINVAL;
1807
		return -EINVAL;
1747
1808
1748
	mutex_lock(&data->update_lock);
1809
	err = data->lock(data);
1810
	if (err)
1811
		return err;
1812
1749
	if (val)
1813
	if (val)
1750
		data->beeps |= (1ULL << nr);
1814
		data->beeps |= (1ULL << nr);
1751
	else
1815
	else
1752
		data->beeps &= ~(1ULL << nr);
1816
		data->beeps &= ~(1ULL << nr);
1753
	err = nct6775_write_value(data, data->REG_BEEP[regindex],
1817
	err = nct6775_write_value(data, data->REG_BEEP[regindex],
1754
				  (data->beeps >> (regindex << 3)) & 0xff);
1818
				  (data->beeps >> (regindex << 3)) & 0xff);
1755
	mutex_unlock(&data->update_lock);
1819
	data->unlock(data, dev);
1756
	return err ? : count;
1820
	return err ? : count;
1757
}
1821
}
1758
EXPORT_SYMBOL_GPL(nct6775_store_beep);
1822
EXPORT_SYMBOL_GPL(nct6775_store_beep);
Lines 1805-1818 store_temp_beep(struct device *dev, struct device_attribute *attr, Link Here
1805
	bit = data->BEEP_BITS[nr + TEMP_ALARM_BASE];
1869
	bit = data->BEEP_BITS[nr + TEMP_ALARM_BASE];
1806
	regindex = bit >> 3;
1870
	regindex = bit >> 3;
1807
1871
1808
	mutex_lock(&data->update_lock);
1872
	err = data->lock(data);
1873
	if (err)
1874
		return err;
1875
1809
	if (val)
1876
	if (val)
1810
		data->beeps |= (1ULL << bit);
1877
		data->beeps |= (1ULL << bit);
1811
	else
1878
	else
1812
		data->beeps &= ~(1ULL << bit);
1879
		data->beeps &= ~(1ULL << bit);
1813
	err = nct6775_write_value(data, data->REG_BEEP[regindex],
1880
	err = nct6775_write_value(data, data->REG_BEEP[regindex],
1814
				  (data->beeps >> (regindex << 3)) & 0xff);
1881
				  (data->beeps >> (regindex << 3)) & 0xff);
1815
	mutex_unlock(&data->update_lock);
1882
	data->unlock(data, dev);
1816
1883
1817
	return err ? : count;
1884
	return err ? : count;
1818
}
1885
}
Lines 1912-1918 store_fan_min(struct device *dev, struct device_attribute *attr, Link Here
1912
	if (err < 0)
1979
	if (err < 0)
1913
		return err;
1980
		return err;
1914
1981
1915
	mutex_lock(&data->update_lock);
1982
	err = data->lock(data);
1983
	if (err)
1984
		return err;
1985
1916
	if (!data->has_fan_div) {
1986
	if (!data->has_fan_div) {
1917
		/* NCT6776F or NCT6779D; we know this is a 13 bit register */
1987
		/* NCT6776F or NCT6779D; we know this is a 13 bit register */
1918
		if (!val) {
1988
		if (!val) {
Lines 1987-1993 store_fan_min(struct device *dev, struct device_attribute *attr, Link Here
1987
2057
1988
write_min:
2058
write_min:
1989
	err = nct6775_write_value(data, data->REG_FAN_MIN[nr], data->fan_min[nr]);
2059
	err = nct6775_write_value(data, data->REG_FAN_MIN[nr], data->fan_min[nr]);
1990
	mutex_unlock(&data->update_lock);
2060
	data->unlock(data, dev);
1991
2061
1992
	return err ? : count;
2062
	return err ? : count;
1993
}
2063
}
Lines 2024-2030 store_fan_pulses(struct device *dev, struct device_attribute *attr, Link Here
2024
	if (val > 4)
2094
	if (val > 4)
2025
		return -EINVAL;
2095
		return -EINVAL;
2026
2096
2027
	mutex_lock(&data->update_lock);
2097
	err = data->lock(data);
2098
	if (err)
2099
		return err;
2100
2028
	data->fan_pulses[nr] = val & 3;
2101
	data->fan_pulses[nr] = val & 3;
2029
	err = nct6775_read_value(data, data->REG_FAN_PULSES[nr], &reg);
2102
	err = nct6775_read_value(data, data->REG_FAN_PULSES[nr], &reg);
2030
	if (err)
2103
	if (err)
Lines 2033-2039 store_fan_pulses(struct device *dev, struct device_attribute *attr, Link Here
2033
	reg |= (val & 3) << data->FAN_PULSE_SHIFT[nr];
2106
	reg |= (val & 3) << data->FAN_PULSE_SHIFT[nr];
2034
	err = nct6775_write_value(data, data->REG_FAN_PULSES[nr], reg);
2107
	err = nct6775_write_value(data, data->REG_FAN_PULSES[nr], reg);
2035
out:
2108
out:
2036
	mutex_unlock(&data->update_lock);
2109
	data->unlock(data, dev);
2037
2110
2038
	return err ? : count;
2111
	return err ? : count;
2039
}
2112
}
Lines 2134-2143 store_temp(struct device *dev, struct device_attribute *attr, const char *buf, Link Here
2134
	if (err < 0)
2207
	if (err < 0)
2135
		return err;
2208
		return err;
2136
2209
2137
	mutex_lock(&data->update_lock);
2210
	err = data->lock(data);
2211
	if (err)
2212
		return err;
2213
2138
	data->temp[index][nr] = LM75_TEMP_TO_REG(val);
2214
	data->temp[index][nr] = LM75_TEMP_TO_REG(val);
2139
	err = nct6775_write_temp(data, data->reg_temp[index][nr], data->temp[index][nr]);
2215
	err = nct6775_write_temp(data, data->reg_temp[index][nr], data->temp[index][nr]);
2140
	mutex_unlock(&data->update_lock);
2216
	data->unlock(data, dev);
2141
	return err ? : count;
2217
	return err ? : count;
2142
}
2218
}
2143
2219
Lines 2169-2178 store_temp_offset(struct device *dev, struct device_attribute *attr, Link Here
2169
2245
2170
	val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), -128, 127);
2246
	val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), -128, 127);
2171
2247
2172
	mutex_lock(&data->update_lock);
2248
	err = data->lock(data);
2249
	if (err)
2250
		return err;
2251
2173
	data->temp_offset[nr] = val;
2252
	data->temp_offset[nr] = val;
2174
	err = nct6775_write_value(data, data->REG_TEMP_OFFSET[nr], val);
2253
	err = nct6775_write_value(data, data->REG_TEMP_OFFSET[nr], val);
2175
	mutex_unlock(&data->update_lock);
2254
	data->unlock(data, dev);
2176
2255
2177
	return err ? : count;
2256
	return err ? : count;
2178
}
2257
}
Lines 2212-2218 store_temp_type(struct device *dev, struct device_attribute *attr, Link Here
2212
	if (val != 1 && val != 3 && val != 4)
2291
	if (val != 1 && val != 3 && val != 4)
2213
		return -EINVAL;
2292
		return -EINVAL;
2214
2293
2215
	mutex_lock(&data->update_lock);
2294
	err = data->lock(data);
2295
	if (err)
2296
		return err;
2216
2297
2217
	data->temp_type[nr] = val;
2298
	data->temp_type[nr] = val;
2218
	vbit = 0x02 << nr;
2299
	vbit = 0x02 << nr;
Lines 2244-2250 store_temp_type(struct device *dev, struct device_attribute *attr, Link Here
2244
		goto out;
2325
		goto out;
2245
	err = nct6775_write_value(data, data->REG_DIODE, diode);
2326
	err = nct6775_write_value(data, data->REG_DIODE, diode);
2246
out:
2327
out:
2247
	mutex_unlock(&data->update_lock);
2328
	data->unlock(data, dev);
2248
	return err ? : count;
2329
	return err ? : count;
2249
}
2330
}
2250
2331
Lines 2401-2407 store_pwm_mode(struct device *dev, struct device_attribute *attr, Link Here
2401
		return count;
2482
		return count;
2402
	}
2483
	}
2403
2484
2404
	mutex_lock(&data->update_lock);
2485
	err = data->lock(data);
2486
	if (err)
2487
		return err;
2488
2405
	data->pwm_mode[nr] = val;
2489
	data->pwm_mode[nr] = val;
2406
	err = nct6775_read_value(data, data->REG_PWM_MODE[nr], &reg);
2490
	err = nct6775_read_value(data, data->REG_PWM_MODE[nr], &reg);
2407
	if (err)
2491
	if (err)
Lines 2411-2417 store_pwm_mode(struct device *dev, struct device_attribute *attr, Link Here
2411
		reg |= data->PWM_MODE_MASK[nr];
2495
		reg |= data->PWM_MODE_MASK[nr];
2412
	err = nct6775_write_value(data, data->REG_PWM_MODE[nr], reg);
2496
	err = nct6775_write_value(data, data->REG_PWM_MODE[nr], reg);
2413
out:
2497
out:
2414
	mutex_unlock(&data->update_lock);
2498
	data->unlock(data, dev);
2415
	return err ? : count;
2499
	return err ? : count;
2416
}
2500
}
2417
2501
Lines 2463-2469 store_pwm(struct device *dev, struct device_attribute *attr, const char *buf, Link Here
2463
		return err;
2547
		return err;
2464
	val = clamp_val(val, minval[index], maxval[index]);
2548
	val = clamp_val(val, minval[index], maxval[index]);
2465
2549
2466
	mutex_lock(&data->update_lock);
2550
	err = data->lock(data);
2551
	if (err)
2552
		return err;
2553
2467
	data->pwm[index][nr] = val;
2554
	data->pwm[index][nr] = val;
2468
	err = nct6775_write_value(data, data->REG_PWM[index][nr], val);
2555
	err = nct6775_write_value(data, data->REG_PWM[index][nr], val);
2469
	if (err)
2556
	if (err)
Lines 2478-2484 store_pwm(struct device *dev, struct device_attribute *attr, const char *buf, Link Here
2478
		err = nct6775_write_value(data, data->REG_TEMP_SEL[nr], reg);
2565
		err = nct6775_write_value(data, data->REG_TEMP_SEL[nr], reg);
2479
	}
2566
	}
2480
out:
2567
out:
2481
	mutex_unlock(&data->update_lock);
2568
	data->unlock(data, dev);
2482
	return err ? : count;
2569
	return err ? : count;
2483
}
2570
}
2484
2571
Lines 2595-2601 store_pwm_enable(struct device *dev, struct device_attribute *attr, Link Here
2595
		return -EINVAL;
2682
		return -EINVAL;
2596
	}
2683
	}
2597
2684
2598
	mutex_lock(&data->update_lock);
2685
	err = data->lock(data);
2686
	if (err)
2687
		return err;
2688
2599
	data->pwm_enable[nr] = val;
2689
	data->pwm_enable[nr] = val;
2600
	if (val == off) {
2690
	if (val == off) {
2601
		/*
2691
		/*
Lines 2616-2622 store_pwm_enable(struct device *dev, struct device_attribute *attr, Link Here
2616
	reg |= pwm_enable_to_reg(val) << 4;
2706
	reg |= pwm_enable_to_reg(val) << 4;
2617
	err = nct6775_write_value(data, data->REG_FAN_MODE[nr], reg);
2707
	err = nct6775_write_value(data, data->REG_FAN_MODE[nr], reg);
2618
out:
2708
out:
2619
	mutex_unlock(&data->update_lock);
2709
	data->unlock(data, dev);
2620
	return err ? : count;
2710
	return err ? : count;
2621
}
2711
}
2622
2712
Lines 2672-2678 store_pwm_temp_sel(struct device *dev, struct device_attribute *attr, Link Here
2672
	if (!(data->have_temp & BIT(val - 1)) || !data->temp_src[val - 1])
2762
	if (!(data->have_temp & BIT(val - 1)) || !data->temp_src[val - 1])
2673
		return -EINVAL;
2763
		return -EINVAL;
2674
2764
2675
	mutex_lock(&data->update_lock);
2765
	err = data->lock(data);
2766
	if (err)
2767
		return err;
2768
2676
	src = data->temp_src[val - 1];
2769
	src = data->temp_src[val - 1];
2677
	data->pwm_temp_sel[nr] = src;
2770
	data->pwm_temp_sel[nr] = src;
2678
	err = nct6775_read_value(data, data->REG_TEMP_SEL[nr], &reg);
2771
	err = nct6775_read_value(data, data->REG_TEMP_SEL[nr], &reg);
Lines 2682-2688 store_pwm_temp_sel(struct device *dev, struct device_attribute *attr, Link Here
2682
	reg |= src;
2775
	reg |= src;
2683
	err = nct6775_write_value(data, data->REG_TEMP_SEL[nr], reg);
2776
	err = nct6775_write_value(data, data->REG_TEMP_SEL[nr], reg);
2684
out:
2777
out:
2685
	mutex_unlock(&data->update_lock);
2778
	data->unlock(data, dev);
2686
2779
2687
	return err ? : count;
2780
	return err ? : count;
2688
}
2781
}
Lines 2726-2732 store_pwm_weight_temp_sel(struct device *dev, struct device_attribute *attr, Link Here
2726
		    !data->temp_src[val - 1]))
2819
		    !data->temp_src[val - 1]))
2727
		return -EINVAL;
2820
		return -EINVAL;
2728
2821
2729
	mutex_lock(&data->update_lock);
2822
	err = data->lock(data);
2823
	if (err)
2824
		return err;
2825
2730
	if (val) {
2826
	if (val) {
2731
		src = data->temp_src[val - 1];
2827
		src = data->temp_src[val - 1];
2732
		data->pwm_weight_temp_sel[nr] = src;
2828
		data->pwm_weight_temp_sel[nr] = src;
Lines 2745-2751 store_pwm_weight_temp_sel(struct device *dev, struct device_attribute *attr, Link Here
2745
		err = nct6775_write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg);
2841
		err = nct6775_write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg);
2746
	}
2842
	}
2747
out:
2843
out:
2748
	mutex_unlock(&data->update_lock);
2844
	data->unlock(data, dev);
2749
2845
2750
	return err ? : count;
2846
	return err ? : count;
2751
}
2847
}
Lines 2779-2788 store_target_temp(struct device *dev, struct device_attribute *attr, Link Here
2779
	val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0,
2875
	val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0,
2780
			data->target_temp_mask);
2876
			data->target_temp_mask);
2781
2877
2782
	mutex_lock(&data->update_lock);
2878
	err = data->lock(data);
2879
	if (err)
2880
		return err;
2881
2783
	data->target_temp[nr] = val;
2882
	data->target_temp[nr] = val;
2784
	err = pwm_update_registers(data, nr);
2883
	err = pwm_update_registers(data, nr);
2785
	mutex_unlock(&data->update_lock);
2884
	data->unlock(data, dev);
2786
	return err ? : count;
2885
	return err ? : count;
2787
}
2886
}
2788
2887
Lines 2819-2828 store_target_speed(struct device *dev, struct device_attribute *attr, Link Here
2819
	val = clamp_val(val, 0, 1350000U);
2918
	val = clamp_val(val, 0, 1350000U);
2820
	speed = fan_to_reg(val, data->fan_div[nr]);
2919
	speed = fan_to_reg(val, data->fan_div[nr]);
2821
2920
2822
	mutex_lock(&data->update_lock);
2921
	err = data->lock(data);
2922
	if (err)
2923
		return err;
2924
2823
	data->target_speed[nr] = speed;
2925
	data->target_speed[nr] = speed;
2824
	err = pwm_update_registers(data, nr);
2926
	err = pwm_update_registers(data, nr);
2825
	mutex_unlock(&data->update_lock);
2927
	data->unlock(data, dev);
2826
	return err ? : count;
2928
	return err ? : count;
2827
}
2929
}
2828
2930
Lines 2859-2871 store_temp_tolerance(struct device *dev, struct device_attribute *attr, Link Here
2859
	/* Limit tolerance as needed */
2961
	/* Limit tolerance as needed */
2860
	val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, data->tolerance_mask);
2962
	val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, data->tolerance_mask);
2861
2963
2862
	mutex_lock(&data->update_lock);
2964
	err = data->lock(data);
2965
	if (err)
2966
		return err;
2967
2863
	data->temp_tolerance[index][nr] = val;
2968
	data->temp_tolerance[index][nr] = val;
2864
	if (index)
2969
	if (index)
2865
		err = pwm_update_registers(data, nr);
2970
		err = pwm_update_registers(data, nr);
2866
	else
2971
	else
2867
		err = nct6775_write_value(data, data->REG_CRITICAL_TEMP_TOLERANCE[nr], val);
2972
		err = nct6775_write_value(data, data->REG_CRITICAL_TEMP_TOLERANCE[nr], val);
2868
	mutex_unlock(&data->update_lock);
2973
	data->unlock(data, dev);
2869
	return err ? : count;
2974
	return err ? : count;
2870
}
2975
}
2871
2976
Lines 2936-2945 store_speed_tolerance(struct device *dev, struct device_attribute *attr, Link Here
2936
	/* Limit tolerance as needed */
3041
	/* Limit tolerance as needed */
2937
	val = clamp_val(val, 0, data->speed_tolerance_limit);
3042
	val = clamp_val(val, 0, data->speed_tolerance_limit);
2938
3043
2939
	mutex_lock(&data->update_lock);
3044
	err = data->lock(data);
3045
	if (err)
3046
		return err;
3047
2940
	data->target_speed_tolerance[nr] = val;
3048
	data->target_speed_tolerance[nr] = val;
2941
	err = pwm_update_registers(data, nr);
3049
	err = pwm_update_registers(data, nr);
2942
	mutex_unlock(&data->update_lock);
3050
	data->unlock(data, dev);
2943
	return err ? : count;
3051
	return err ? : count;
2944
}
3052
}
2945
3053
Lines 2985-2994 store_weight_temp(struct device *dev, struct device_attribute *attr, Link Here
2985
3093
2986
	val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, 255);
3094
	val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, 255);
2987
3095
2988
	mutex_lock(&data->update_lock);
3096
	err = data->lock(data);
3097
	if (err)
3098
		return err;
3099
2989
	data->weight_temp[index][nr] = val;
3100
	data->weight_temp[index][nr] = val;
2990
	err = nct6775_write_value(data, data->REG_WEIGHT_TEMP[index][nr], val);
3101
	err = nct6775_write_value(data, data->REG_WEIGHT_TEMP[index][nr], val);
2991
	mutex_unlock(&data->update_lock);
3102
	data->unlock(data, dev);
2992
	return err ? : count;
3103
	return err ? : count;
2993
}
3104
}
2994
3105
Lines 3035-3044 store_fan_time(struct device *dev, struct device_attribute *attr, Link Here
3035
		return err;
3146
		return err;
3036
3147
3037
	val = step_time_to_reg(val, data->pwm_mode[nr]);
3148
	val = step_time_to_reg(val, data->pwm_mode[nr]);
3038
	mutex_lock(&data->update_lock);
3149
	err = data->lock(data);
3150
	if (err)
3151
		return err;
3152
3039
	data->fan_time[index][nr] = val;
3153
	data->fan_time[index][nr] = val;
3040
	err = nct6775_write_value(data, data->REG_FAN_TIME[index][nr], val);
3154
	err = nct6775_write_value(data, data->REG_FAN_TIME[index][nr], val);
3041
	mutex_unlock(&data->update_lock);
3155
	data->unlock(data, dev);
3042
	return err ? : count;
3156
	return err ? : count;
3043
}
3157
}
3044
3158
Lines 3079-3085 store_auto_pwm(struct device *dev, struct device_attribute *attr, Link Here
3079
			val = 0xff;
3193
			val = 0xff;
3080
	}
3194
	}
3081
3195
3082
	mutex_lock(&data->update_lock);
3196
	err = data->lock(data);
3197
	if (err)
3198
		return err;
3199
3083
	data->auto_pwm[nr][point] = val;
3200
	data->auto_pwm[nr][point] = val;
3084
	if (point < data->auto_pwm_num) {
3201
	if (point < data->auto_pwm_num) {
3085
		err = nct6775_write_value(data, NCT6775_AUTO_PWM(data, nr, point),
3202
		err = nct6775_write_value(data, NCT6775_AUTO_PWM(data, nr, point),
Lines 3109-3114 store_auto_pwm(struct device *dev, struct device_attribute *attr, Link Here
3109
		case nct6796:
3226
		case nct6796:
3110
		case nct6797:
3227
		case nct6797:
3111
		case nct6798:
3228
		case nct6798:
3229
		case nct6799:
3112
			err = nct6775_write_value(data, data->REG_CRITICAL_PWM[nr], val);
3230
			err = nct6775_write_value(data, data->REG_CRITICAL_PWM[nr], val);
3113
			if (err)
3231
			if (err)
3114
				break;
3232
				break;
Lines 3123-3129 store_auto_pwm(struct device *dev, struct device_attribute *attr, Link Here
3123
			break;
3241
			break;
3124
		}
3242
		}
3125
	}
3243
	}
3126
	mutex_unlock(&data->update_lock);
3244
	data->unlock(data, dev);
3127
	return err ? : count;
3245
	return err ? : count;
3128
}
3246
}
3129
3247
Lines 3162-3168 store_auto_temp(struct device *dev, struct device_attribute *attr, Link Here
3162
	if (val > 255000)
3280
	if (val > 255000)
3163
		return -EINVAL;
3281
		return -EINVAL;
3164
3282
3165
	mutex_lock(&data->update_lock);
3283
	err = data->lock(data);
3284
	if (err)
3285
		return err;
3286
3166
	data->auto_temp[nr][point] = DIV_ROUND_CLOSEST(val, 1000);
3287
	data->auto_temp[nr][point] = DIV_ROUND_CLOSEST(val, 1000);
3167
	if (point < data->auto_pwm_num) {
3288
	if (point < data->auto_pwm_num) {
3168
		err = nct6775_write_value(data, NCT6775_AUTO_TEMP(data, nr, point),
3289
		err = nct6775_write_value(data, NCT6775_AUTO_TEMP(data, nr, point),
Lines 3171-3177 store_auto_temp(struct device *dev, struct device_attribute *attr, Link Here
3171
		err = nct6775_write_value(data, data->REG_CRITICAL_TEMP[nr],
3292
		err = nct6775_write_value(data, data->REG_CRITICAL_TEMP[nr],
3172
					  data->auto_temp[nr][point]);
3293
					  data->auto_temp[nr][point]);
3173
	}
3294
	}
3174
	mutex_unlock(&data->update_lock);
3295
	data->unlock(data, dev);
3175
	return err ? : count;
3296
	return err ? : count;
3176
}
3297
}
3177
3298
Lines 3399-3404 static int add_temp_sensors(struct nct6775_data *data, const u16 *regp, Link Here
3399
	return 0;
3520
	return 0;
3400
}
3521
}
3401
3522
3523
/* Wait for up to 0.5 s to acquire the lock */
3524
#define ASUSWMI_LOCK_TIMEOUT_MS		500
3525
3526
static int nct6775_wmi_lock(struct nct6775_data *data)
3527
{
3528
	acpi_status status;
3529
3530
	status = acpi_acquire_mutex(data->acpi_wmi_mutex, NULL, ASUSWMI_LOCK_TIMEOUT_MS);
3531
	if (ACPI_FAILURE(status))
3532
		return -EIO;
3533
3534
	return 0;
3535
}
3536
3537
static void nct6775_wmi_unlock(struct nct6775_data *data, struct device *dev)
3538
{
3539
	acpi_status status;
3540
3541
	status = acpi_release_mutex(data->acpi_wmi_mutex, NULL);
3542
	if (ACPI_FAILURE(status))
3543
		dev_err(dev, "Failed to release mutex.");
3544
}
3545
3402
int nct6775_probe(struct device *dev, struct nct6775_data *data,
3546
int nct6775_probe(struct device *dev, struct nct6775_data *data,
3403
		  const struct regmap_config *regmapcfg)
3547
		  const struct regmap_config *regmapcfg)
3404
{
3548
{
Lines 3416-3422 int nct6775_probe(struct device *dev, struct nct6775_data *data, Link Here
3416
	if (IS_ERR(data->regmap))
3560
	if (IS_ERR(data->regmap))
3417
		return PTR_ERR(data->regmap);
3561
		return PTR_ERR(data->regmap);
3418
3562
3419
	mutex_init(&data->update_lock);
3563
	if (data->acpi_wmi_mutex) {
3564
		data->lock = nct6775_wmi_lock;
3565
		data->unlock = nct6775_wmi_unlock;
3566
	} else {
3567
		mutex_init(&data->update_lock);
3568
		data->lock = nct6775_lock;
3569
		data->unlock = nct6775_unlock;
3570
	}
3571
3420
	data->name = nct6775_device_names[data->kind];
3572
	data->name = nct6775_device_names[data->kind];
3421
	data->bank = 0xff;		/* Force initial bank selection */
3573
	data->bank = 0xff;		/* Force initial bank selection */
3422
3574
Lines 3807-3816 int nct6775_probe(struct device *dev, struct nct6775_data *data, Link Here
3807
	case nct6796:
3959
	case nct6796:
3808
	case nct6797:
3960
	case nct6797:
3809
	case nct6798:
3961
	case nct6798:
3962
	case nct6799:
3810
		data->in_num = 15;
3963
		data->in_num = 15;
3811
		data->pwm_num = (data->kind == nct6796 ||
3964
		data->pwm_num = (data->kind == nct6796 ||
3812
				 data->kind == nct6797 ||
3965
				 data->kind == nct6797 ||
3813
				 data->kind == nct6798) ? 7 : 6;
3966
				 data->kind == nct6798 ||
3967
				 data->kind == nct6799) ? 7 : 6;
3814
		data->auto_pwm_num = 4;
3968
		data->auto_pwm_num = 4;
3815
		data->has_fan_div = false;
3969
		data->has_fan_div = false;
3816
		data->temp_fixed_num = 6;
3970
		data->temp_fixed_num = 6;
Lines 3859-3864 int nct6775_probe(struct device *dev, struct nct6775_data *data, Link Here
3859
			data->temp_mask = NCT6798_TEMP_MASK;
4013
			data->temp_mask = NCT6798_TEMP_MASK;
3860
			data->virt_temp_mask = NCT6798_VIRT_TEMP_MASK;
4014
			data->virt_temp_mask = NCT6798_VIRT_TEMP_MASK;
3861
			break;
4015
			break;
4016
		case nct6799:
4017
			data->temp_label = nct6799_temp_label;
4018
			data->temp_mask = NCT6799_TEMP_MASK;
4019
			data->virt_temp_mask = NCT6799_VIRT_TEMP_MASK;
4020
			break;
3862
		}
4021
		}
3863
4022
3864
		data->REG_CONFIG = NCT6775_REG_CONFIG;
4023
		data->REG_CONFIG = NCT6775_REG_CONFIG;
Lines 3918-3923 int nct6775_probe(struct device *dev, struct nct6775_data *data, Link Here
3918
		case nct6796:
4077
		case nct6796:
3919
		case nct6797:
4078
		case nct6797:
3920
		case nct6798:
4079
		case nct6798:
4080
		case nct6799:
3921
			data->REG_TSI_TEMP = NCT6796_REG_TSI_TEMP;
4081
			data->REG_TSI_TEMP = NCT6796_REG_TSI_TEMP;
3922
			num_reg_tsi_temp = ARRAY_SIZE(NCT6796_REG_TSI_TEMP);
4082
			num_reg_tsi_temp = ARRAY_SIZE(NCT6796_REG_TSI_TEMP);
3923
			break;
4083
			break;
(-)a/drivers/hwmon/nct6775-i2c.c (+2 lines)
Lines 87-92 static const struct of_device_id __maybe_unused nct6775_i2c_of_match[] = { Link Here
87
	{ .compatible = "nuvoton,nct6796", .data = (void *)nct6796, },
87
	{ .compatible = "nuvoton,nct6796", .data = (void *)nct6796, },
88
	{ .compatible = "nuvoton,nct6797", .data = (void *)nct6797, },
88
	{ .compatible = "nuvoton,nct6797", .data = (void *)nct6797, },
89
	{ .compatible = "nuvoton,nct6798", .data = (void *)nct6798, },
89
	{ .compatible = "nuvoton,nct6798", .data = (void *)nct6798, },
90
	{ .compatible = "nuvoton,nct6799", .data = (void *)nct6799, },
90
	{ },
91
	{ },
91
};
92
};
92
MODULE_DEVICE_TABLE(of, nct6775_i2c_of_match);
93
MODULE_DEVICE_TABLE(of, nct6775_i2c_of_match);
Lines 104-109 static const struct i2c_device_id nct6775_i2c_id[] = { Link Here
104
	{ "nct6796", nct6796 },
105
	{ "nct6796", nct6796 },
105
	{ "nct6797", nct6797 },
106
	{ "nct6797", nct6797 },
106
	{ "nct6798", nct6798 },
107
	{ "nct6798", nct6798 },
108
	{ "nct6799", nct6799 },
107
	{ }
109
	{ }
108
};
110
};
109
MODULE_DEVICE_TABLE(i2c, nct6775_i2c_id);
111
MODULE_DEVICE_TABLE(i2c, nct6775_i2c_id);
(-)a/drivers/hwmon/nct6775-platform.c (-27 / +492 lines)
Lines 35-40 static const char * const nct6775_sio_names[] __initconst = { Link Here
35
	"NCT6796D",
35
	"NCT6796D",
36
	"NCT6797D",
36
	"NCT6797D",
37
	"NCT6798D",
37
	"NCT6798D",
38
	"NCT6799D",
38
};
39
};
39
40
40
static unsigned short force_id;
41
static unsigned short force_id;
Lines 85-90 MODULE_PARM_DESC(fan_debounce, "Enable debouncing for fan RPM signal"); Link Here
85
#define SIO_NCT6796_ID		0xd420
86
#define SIO_NCT6796_ID		0xd420
86
#define SIO_NCT6797_ID		0xd450
87
#define SIO_NCT6797_ID		0xd450
87
#define SIO_NCT6798_ID		0xd428
88
#define SIO_NCT6798_ID		0xd428
89
#define SIO_NCT6799_ID		0xd800
88
#define SIO_ID_MASK		0xFFF8
90
#define SIO_ID_MASK		0xFFF8
89
91
90
/*
92
/*
Lines 97-102 struct nct6775_sio_data { Link Here
97
	int ld;
99
	int ld;
98
	enum kinds kind;
100
	enum kinds kind;
99
	enum sensor_access access;
101
	enum sensor_access access;
102
	acpi_handle acpi_wmi_mutex;
100
103
101
	/* superio_() callbacks  */
104
	/* superio_() callbacks  */
102
	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 149-155 static int nct6775_asuswmi_evaluate_method(u32 method_id, u8 bank, u8 reg, u8 va Link Here
149
		return -EIO;
152
		return -EIO;
150
153
151
	if (retval)
154
	if (retval)
152
		*retval = (u32)result & 0xFFFFFFFF;
155
		*retval = result;
153
156
154
	return 0;
157
	return 0;
155
#else
158
#else
Lines 374-380 static int nct6775_suspend(struct device *dev) Link Here
374
	if (IS_ERR(data))
377
	if (IS_ERR(data))
375
		return PTR_ERR(data);
378
		return PTR_ERR(data);
376
379
377
	mutex_lock(&data->update_lock);
380
	err = data->lock(data);
381
	if (err)
382
		return err;
383
378
	err = nct6775_read_value(data, data->REG_VBAT, &tmp);
384
	err = nct6775_read_value(data, data->REG_VBAT, &tmp);
379
	if (err)
385
	if (err)
380
		goto out;
386
		goto out;
Lines 391-397 static int nct6775_suspend(struct device *dev) Link Here
391
		data->fandiv2 = tmp;
397
		data->fandiv2 = tmp;
392
	}
398
	}
393
out:
399
out:
394
	mutex_unlock(&data->update_lock);
400
	data->unlock(data, dev);
395
401
396
	return err;
402
	return err;
397
}
403
}
Lines 403-409 static int nct6775_resume(struct device *dev) Link Here
403
	int i, j, err = 0;
409
	int i, j, err = 0;
404
	u8 reg;
410
	u8 reg;
405
411
406
	mutex_lock(&data->update_lock);
412
	err = data->lock(data);
413
	if (err)
414
		return err;
415
407
	data->bank = 0xff;		/* Force initial bank selection */
416
	data->bank = 0xff;		/* Force initial bank selection */
408
417
409
	err = sio_data->sio_enter(sio_data);
418
	err = sio_data->sio_enter(sio_data);
Lines 418-424 static int nct6775_resume(struct device *dev) Link Here
418
	if (data->kind == nct6791 || data->kind == nct6792 ||
427
	if (data->kind == nct6791 || data->kind == nct6792 ||
419
	    data->kind == nct6793 || data->kind == nct6795 ||
428
	    data->kind == nct6793 || data->kind == nct6795 ||
420
	    data->kind == nct6796 || data->kind == nct6797 ||
429
	    data->kind == nct6796 || data->kind == nct6797 ||
421
	    data->kind == nct6798)
430
	    data->kind == nct6798 || data->kind == nct6799)
422
		nct6791_enable_io_mapping(sio_data);
431
		nct6791_enable_io_mapping(sio_data);
423
432
424
	sio_data->sio_exit(sio_data);
433
	sio_data->sio_exit(sio_data);
Lines 472-478 static int nct6775_resume(struct device *dev) Link Here
472
abort:
481
abort:
473
	/* Force re-reading all values */
482
	/* Force re-reading all values */
474
	data->valid = false;
483
	data->valid = false;
475
	mutex_unlock(&data->update_lock);
484
	data->unlock(data, dev);
476
485
477
	return err;
486
	return err;
478
}
487
}
Lines 565-571 nct6775_check_fan_inputs(struct nct6775_data *data, struct nct6775_sio_data *sio Link Here
565
	} else {
574
	} else {
566
		/*
575
		/*
567
		 * NCT6779D, NCT6791D, NCT6792D, NCT6793D, NCT6795D, NCT6796D,
576
		 * NCT6779D, NCT6791D, NCT6792D, NCT6793D, NCT6795D, NCT6796D,
568
		 * NCT6797D, NCT6798D
577
		 * NCT6797D, NCT6798D, NCT6799D
569
		 */
578
		 */
570
		int cr1a = sio_data->sio_inb(sio_data, 0x1a);
579
		int cr1a = sio_data->sio_inb(sio_data, 0x1a);
571
		int cr1b = sio_data->sio_inb(sio_data, 0x1b);
580
		int cr1b = sio_data->sio_inb(sio_data, 0x1b);
Lines 575-586 nct6775_check_fan_inputs(struct nct6775_data *data, struct nct6775_sio_data *sio Link Here
575
		int cr2b = sio_data->sio_inb(sio_data, 0x2b);
584
		int cr2b = sio_data->sio_inb(sio_data, 0x2b);
576
		int cr2d = sio_data->sio_inb(sio_data, 0x2d);
585
		int cr2d = sio_data->sio_inb(sio_data, 0x2d);
577
		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);
578
		bool dsw_en = cr2f & BIT(3);
588
		bool dsw_en = cr2f & BIT(3);
579
		bool ddr4_en = cr2f & BIT(4);
589
		bool ddr4_en = cr2f & BIT(4);
590
		bool as_seq1_en = cr2f & BIT(7);
580
		int cre0;
591
		int cre0;
592
		int cre6;
581
		int creb;
593
		int creb;
582
		int cred;
594
		int cred;
583
595
596
			cre6 = sio_data->sio_inb(sio_data, 0xe0);
597
584
		sio_data->sio_select(sio_data, NCT6775_LD_12);
598
		sio_data->sio_select(sio_data, NCT6775_LD_12);
585
		cre0 = sio_data->sio_inb(sio_data, 0xe0);
599
		cre0 = sio_data->sio_inb(sio_data, 0xe0);
586
		creb = sio_data->sio_inb(sio_data, 0xeb);
600
		creb = sio_data->sio_inb(sio_data, 0xeb);
Lines 683-688 nct6775_check_fan_inputs(struct nct6775_data *data, struct nct6775_sio_data *sio Link Here
683
			pwm7pin = !(cr1d & (BIT(2) | BIT(3)));
697
			pwm7pin = !(cr1d & (BIT(2) | BIT(3)));
684
			pwm7pin |= cr2d & BIT(7);
698
			pwm7pin |= cr2d & BIT(7);
685
			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
686
			break;
723
			break;
687
		default:	/* NCT6779D */
724
		default:	/* NCT6779D */
688
			break;
725
			break;
Lines 729-735 clear_caseopen(struct device *dev, struct device_attribute *attr, Link Here
729
	if (kstrtoul(buf, 10, &val) || val != 0)
766
	if (kstrtoul(buf, 10, &val) || val != 0)
730
		return -EINVAL;
767
		return -EINVAL;
731
768
732
	mutex_lock(&data->update_lock);
769
	ret = data->lock(data);
770
	if (ret)
771
		return ret;
733
772
734
	/*
773
	/*
735
	 * Use CR registers to clear caseopen status.
774
	 * Use CR registers to clear caseopen status.
Lines 752-758 clear_caseopen(struct device *dev, struct device_attribute *attr, Link Here
752
791
753
	data->valid = false;	/* Force cache refresh */
792
	data->valid = false;	/* Force cache refresh */
754
error:
793
error:
755
	mutex_unlock(&data->update_lock);
794
	data->unlock(data, dev);
756
	return count;
795
	return count;
757
}
796
}
758
797
Lines 838-843 static int nct6775_platform_probe_init(struct nct6775_data *data) Link Here
838
	case nct6796:
877
	case nct6796:
839
	case nct6797:
878
	case nct6797:
840
	case nct6798:
879
	case nct6798:
880
	case nct6799:
841
		break;
881
		break;
842
	}
882
	}
843
883
Lines 876-881 static int nct6775_platform_probe_init(struct nct6775_data *data) Link Here
876
		case nct6796:
916
		case nct6796:
877
		case nct6797:
917
		case nct6797:
878
		case nct6798:
918
		case nct6798:
919
		case nct6799:
879
			tmp |= 0x7e;
920
			tmp |= 0x7e;
880
			break;
921
			break;
881
		}
922
		}
Lines 923-928 static int nct6775_platform_probe(struct platform_device *pdev) Link Here
923
	if (!data)
964
	if (!data)
924
		return -ENOMEM;
965
		return -ENOMEM;
925
966
967
	data->acpi_wmi_mutex = sio_data->acpi_wmi_mutex;
926
	data->kind = sio_data->kind;
968
	data->kind = sio_data->kind;
927
	data->sioreg = sio_data->sioreg;
969
	data->sioreg = sio_data->sioreg;
928
970
Lines 1005-1010 static int __init nct6775_find(int sioaddr, struct nct6775_sio_data *sio_data) Link Here
1005
	case SIO_NCT6798_ID:
1047
	case SIO_NCT6798_ID:
1006
		sio_data->kind = nct6798;
1048
		sio_data->kind = nct6798;
1007
		break;
1049
		break;
1050
	case SIO_NCT6799_ID:
1051
		sio_data->kind = nct6799;
1052
		break;
1008
	default:
1053
	default:
1009
		if (val != 0xffff)
1054
		if (val != 0xffff)
1010
			pr_debug("unsupported chip ID: 0x%04x\n", val);
1055
			pr_debug("unsupported chip ID: 0x%04x\n", val);
Lines 1033-1039 static int __init nct6775_find(int sioaddr, struct nct6775_sio_data *sio_data) Link Here
1033
	if (sio_data->kind == nct6791 || sio_data->kind == nct6792 ||
1078
	if (sio_data->kind == nct6791 || sio_data->kind == nct6792 ||
1034
	    sio_data->kind == nct6793 || sio_data->kind == nct6795 ||
1079
	    sio_data->kind == nct6793 || sio_data->kind == nct6795 ||
1035
	    sio_data->kind == nct6796 || sio_data->kind == nct6797 ||
1080
	    sio_data->kind == nct6796 || sio_data->kind == nct6797 ||
1036
	    sio_data->kind == nct6798)
1081
	    sio_data->kind == nct6798 || sio_data->kind == nct6799)
1037
		nct6791_enable_io_mapping(sio_data);
1082
		nct6791_enable_io_mapping(sio_data);
1038
1083
1039
	sio_data->sio_exit(sio_data);
1084
	sio_data->sio_exit(sio_data);
Lines 1052-1084 static int __init nct6775_find(int sioaddr, struct nct6775_sio_data *sio_data) Link Here
1052
static struct platform_device *pdev[2];
1097
static struct platform_device *pdev[2];
1053
1098
1054
static const char * const asus_wmi_boards[] = {
1099
static const char * const asus_wmi_boards[] = {
1055
	"PRO H410T",
1100
	"B360M-BASALT",
1056
	"ProArt B550-CREATOR",
1101
	"B360M-D3H",
1057
	"ProArt X570-CREATOR WIFI",
1102
	"EX-B360M-V",
1058
	"ProArt Z490-CREATOR 10G",
1103
	"EX-B360M-V3",
1059
	"Pro B550M-C",
1104
	"EX-B360M-V5",
1060
	"Pro WS X570-ACE",
1105
	"EX-B460M-V5",
1106
	"EX-H410M-V3",
1107
	"PRIME A520M-A",
1108
	"PRIME A520M-A II",
1109
	"PRIME A520M-E",
1110
	"PRIME A520M-K",
1061
	"PRIME B360-PLUS",
1111
	"PRIME B360-PLUS",
1112
	"PRIME B360M-A",
1113
	"PRIME B360M-C",
1114
	"PRIME B360M-D",
1115
	"PRIME B360M-K",
1062
	"PRIME B460-PLUS",
1116
	"PRIME B460-PLUS",
1117
	"PRIME B460I-PLUS",
1118
	"PRIME B460M-A",
1119
	"PRIME B460M-A R2.0",
1120
	"PRIME B460M-K",
1063
	"PRIME B550-PLUS",
1121
	"PRIME B550-PLUS",
1122
	"PRIME B550-PLUS AC-HES",
1064
	"PRIME B550M-A",
1123
	"PRIME B550M-A",
1065
	"PRIME B550M-A (WI-FI)",
1124
	"PRIME B550M-A (WI-FI)",
1125
	"PRIME B550M-A AC",
1126
	"PRIME B550M-A WIFI II",
1127
	"PRIME B550M-K",
1128
	"PRIME H310-PLUS",
1129
	"PRIME H310I-PLUS",
1130
	"PRIME H310M-A",
1131
	"PRIME H310M-C",
1132
	"PRIME H310M-D",
1133
	"PRIME H310M-DASH",
1134
	"PRIME H310M-E",
1135
	"PRIME H310M-E/BR",
1136
	"PRIME H310M-F",
1137
	"PRIME H310M-K",
1138
	"PRIME H310T",
1139
	"PRIME H370-A",
1140
	"PRIME H370-PLUS",
1141
	"PRIME H370M-PLUS",
1142
	"PRIME H410I-PLUS",
1143
	"PRIME H410M-A",
1144
	"PRIME H410M-D",
1145
	"PRIME H410M-E",
1146
	"PRIME H410M-F",
1147
	"PRIME H410M-K",
1148
	"PRIME H410M-K R2.0",
1066
	"PRIME H410M-R",
1149
	"PRIME H410M-R",
1150
	"PRIME H470-PLUS",
1151
	"PRIME H470M-PLUS",
1152
	"PRIME H510M-K R2.0",
1153
	"PRIME Q370M-C",
1067
	"PRIME X570-P",
1154
	"PRIME X570-P",
1068
	"PRIME X570-PRO",
1155
	"PRIME X570-PRO",
1156
	"PRIME Z390-A",
1157
	"PRIME Z390-A/H10",
1158
	"PRIME Z390-P",
1159
	"PRIME Z390M-PLUS",
1160
	"PRIME Z490-A",
1161
	"PRIME Z490-P",
1162
	"PRIME Z490-V",
1163
	"PRIME Z490M-PLUS",
1164
	"PRO B460M-C",
1165
	"PRO H410M-C",
1166
	"PRO H410T",
1167
	"PRO Q470M-C",
1168
	"Pro A520M-C",
1169
	"Pro A520M-C II",
1170
	"Pro B550M-C",
1171
	"Pro WS X570-ACE",
1172
	"ProArt B550-CREATOR",
1173
	"ProArt X570-CREATOR WIFI",
1174
	"ProArt Z490-CREATOR 10G",
1069
	"ROG CROSSHAIR VIII DARK HERO",
1175
	"ROG CROSSHAIR VIII DARK HERO",
1070
	"ROG CROSSHAIR VIII EXTREME",
1176
	"ROG CROSSHAIR VIII EXTREME",
1071
	"ROG CROSSHAIR VIII FORMULA",
1177
	"ROG CROSSHAIR VIII FORMULA",
1072
	"ROG CROSSHAIR VIII HERO",
1178
	"ROG CROSSHAIR VIII HERO",
1073
	"ROG CROSSHAIR VIII HERO (WI-FI)",
1179
	"ROG CROSSHAIR VIII HERO (WI-FI)",
1074
	"ROG CROSSHAIR VIII IMPACT",
1180
	"ROG CROSSHAIR VIII IMPACT",
1181
	"ROG MAXIMUS XI APEX",
1182
	"ROG MAXIMUS XI CODE",
1183
	"ROG MAXIMUS XI EXTREME",
1184
	"ROG MAXIMUS XI FORMULA",
1185
	"ROG MAXIMUS XI GENE",
1186
	"ROG MAXIMUS XI HERO",
1187
	"ROG MAXIMUS XI HERO (WI-FI)",
1188
	"ROG MAXIMUS XII APEX",
1189
	"ROG MAXIMUS XII EXTREME",
1190
	"ROG MAXIMUS XII FORMULA",
1191
	"ROG MAXIMUS XII HERO (WI-FI)",
1192
	"ROG STRIX B360-F GAMING",
1193
	"ROG STRIX B360-G GAMING",
1194
	"ROG STRIX B360-H GAMING",
1195
	"ROG STRIX B360-H GAMING/OPTANE",
1196
	"ROG STRIX B360-I GAMING",
1197
	"ROG STRIX B460-F GAMING",
1198
	"ROG STRIX B460-G GAMING",
1199
	"ROG STRIX B460-H GAMING",
1200
	"ROG STRIX B460-I GAMING",
1075
	"ROG STRIX B550-A GAMING",
1201
	"ROG STRIX B550-A GAMING",
1076
	"ROG STRIX B550-E GAMING",
1202
	"ROG STRIX B550-E GAMING",
1077
	"ROG STRIX B550-F GAMING",
1203
	"ROG STRIX B550-F GAMING",
1078
	"ROG STRIX B550-F GAMING (WI-FI)",
1204
	"ROG STRIX B550-F GAMING (WI-FI)",
1079
	"ROG STRIX B550-F GAMING WIFI II",
1205
	"ROG STRIX B550-F GAMING WIFI II",
1080
	"ROG STRIX B550-I GAMING",
1206
	"ROG STRIX B550-I GAMING",
1081
	"ROG STRIX B550-XE GAMING (WI-FI)",
1207
	"ROG STRIX B550-XE GAMING WIFI",
1208
	"ROG STRIX H370-F GAMING",
1209
	"ROG STRIX H370-I GAMING",
1210
	"ROG STRIX H470-I GAMING",
1082
	"ROG STRIX X570-E GAMING",
1211
	"ROG STRIX X570-E GAMING",
1083
	"ROG STRIX X570-E GAMING WIFI II",
1212
	"ROG STRIX X570-E GAMING WIFI II",
1084
	"ROG STRIX X570-F GAMING",
1213
	"ROG STRIX X570-F GAMING",
Lines 1094-1158 static const char * const asus_wmi_boards[] = { Link Here
1094
	"ROG STRIX Z490-G GAMING (WI-FI)",
1223
	"ROG STRIX Z490-G GAMING (WI-FI)",
1095
	"ROG STRIX Z490-H GAMING",
1224
	"ROG STRIX Z490-H GAMING",
1096
	"ROG STRIX Z490-I GAMING",
1225
	"ROG STRIX Z490-I GAMING",
1226
	"TUF B360-PLUS GAMING",
1227
	"TUF B360-PRO GAMING",
1228
	"TUF B360-PRO GAMING (WI-FI)",
1229
	"TUF B360M-E GAMING",
1230
	"TUF B360M-PLUS GAMING",
1231
	"TUF B360M-PLUS GAMING S",
1232
	"TUF B360M-PLUS GAMING/BR",
1233
	"TUF GAMING A520M-PLUS",
1234
	"TUF GAMING A520M-PLUS II",
1235
	"TUF GAMING A520M-PLUS WIFI",
1236
	"TUF GAMING B460-PLUS",
1237
	"TUF GAMING B460-PRO (WI-FI)",
1238
	"TUF GAMING B460M-PLUS",
1239
	"TUF GAMING B460M-PLUS (WI-FI)",
1240
	"TUF GAMING B460M-PRO",
1241
	"TUF GAMING B550-PLUS",
1242
	"TUF GAMING B550-PLUS (WI-FI)",
1243
	"TUF GAMING B550-PLUS WIFI II",
1244
	"TUF GAMING B550-PRO",
1245
	"TUF GAMING B550M ZAKU (WI-FI)",
1097
	"TUF GAMING B550M-E",
1246
	"TUF GAMING B550M-E",
1098
	"TUF GAMING B550M-E (WI-FI)",
1247
	"TUF GAMING B550M-E WIFI",
1099
	"TUF GAMING B550M-PLUS",
1248
	"TUF GAMING B550M-PLUS",
1100
	"TUF GAMING B550M-PLUS (WI-FI)",
1249
	"TUF GAMING B550M-PLUS (WI-FI)",
1101
	"TUF GAMING B550M-PLUS WIFI II",
1250
	"TUF GAMING B550M-PLUS WIFI II",
1102
	"TUF GAMING B550-PLUS",
1251
	"TUF GAMING H470-PRO",
1103
	"TUF GAMING B550-PLUS WIFI II",
1252
	"TUF GAMING H470-PRO (WI-FI)",
1104
	"TUF GAMING B550-PRO",
1105
	"TUF GAMING X570-PLUS",
1253
	"TUF GAMING X570-PLUS",
1106
	"TUF GAMING X570-PLUS (WI-FI)",
1254
	"TUF GAMING X570-PLUS (WI-FI)",
1255
	"TUF GAMING X570-PLUS_BR",
1107
	"TUF GAMING X570-PRO (WI-FI)",
1256
	"TUF GAMING X570-PRO (WI-FI)",
1257
	"TUF GAMING X570-PRO WIFI II",
1108
	"TUF GAMING Z490-PLUS",
1258
	"TUF GAMING Z490-PLUS",
1109
	"TUF GAMING Z490-PLUS (WI-FI)",
1259
	"TUF GAMING Z490-PLUS (WI-FI)",
1260
	"TUF H310-PLUS GAMING",
1261
	"TUF H310M-PLUS GAMING",
1262
	"TUF H310M-PLUS GAMING/BR",
1263
	"TUF H370-PRO GAMING",
1264
	"TUF H370-PRO GAMING (WI-FI)",
1265
	"TUF Z390-PLUS GAMING",
1266
	"TUF Z390-PLUS GAMING (WI-FI)",
1267
	"TUF Z390-PRO GAMING",
1268
	"TUF Z390M-PRO GAMING",
1269
	"TUF Z390M-PRO GAMING (WI-FI)",
1270
	"WS Z390 PRO",
1271
	"Z490-GUNDAM (WI-FI)",
1110
};
1272
};
1111
1273
1112
static const char * const asus_msi_boards[] = {
1274
static const char * const asus_msi_boards[] = {
1275
	"B560M-P",
1276
	"EX-B560M-V5",
1277
	"EX-B660M-V5 D4",
1113
	"EX-B660M-V5 PRO D4",
1278
	"EX-B660M-V5 PRO D4",
1279
	"EX-B760M-V5 D4",
1280
	"EX-H510M-V3",
1281
	"EX-H610M-V3 D4",
1282
	"PRIME A620M-A",
1283
	"PRIME B560-PLUS",
1284
	"PRIME B560-PLUS AC-HES",
1285
	"PRIME B560M-A",
1286
	"PRIME B560M-A AC",
1287
	"PRIME B560M-K",
1114
	"PRIME B650-PLUS",
1288
	"PRIME B650-PLUS",
1115
	"PRIME B650M-A",
1289
	"PRIME B650M-A",
1116
	"PRIME B650M-A AX",
1290
	"PRIME B650M-A AX",
1291
	"PRIME B650M-A AX II",
1117
	"PRIME B650M-A II",
1292
	"PRIME B650M-A II",
1118
	"PRIME B650M-A WIFI",
1293
	"PRIME B650M-A WIFI",
1119
	"PRIME B650M-A WIFI II",
1294
	"PRIME B650M-A WIFI II",
1295
	"PRIME B660-PLUS D4",
1296
	"PRIME B660M-A AC D4",
1120
	"PRIME B660M-A D4",
1297
	"PRIME B660M-A D4",
1121
	"PRIME B660M-A WIFI D4",
1298
	"PRIME B660M-A WIFI D4",
1299
	"PRIME B760-PLUS",
1300
	"PRIME B760-PLUS D4",
1301
	"PRIME B760M-A",
1302
	"PRIME B760M-A AX D4",
1303
	"PRIME B760M-A D4",
1304
	"PRIME B760M-A WIFI",
1305
	"PRIME B760M-A WIFI D4",
1306
	"PRIME B760M-AJ D4",
1307
	"PRIME B760M-K D4",
1308
	"PRIME H510M-A",
1309
	"PRIME H510M-A WIFI",
1310
	"PRIME H510M-D",
1311
	"PRIME H510M-E",
1312
	"PRIME H510M-F",
1313
	"PRIME H510M-K",
1314
	"PRIME H510M-R",
1315
	"PRIME H510T2/CSM",
1316
	"PRIME H570-PLUS",
1317
	"PRIME H570M-PLUS",
1318
	"PRIME H610I-PLUS D4",
1319
	"PRIME H610M-A D4",
1320
	"PRIME H610M-A WIFI D4",
1321
	"PRIME H610M-D D4",
1322
	"PRIME H610M-E D4",
1323
	"PRIME H610M-F D4",
1324
	"PRIME H610M-K D4",
1325
	"PRIME H610M-R D4",
1326
	"PRIME H670-PLUS D4",
1327
	"PRIME H770-PLUS D4",
1122
	"PRIME X670-P",
1328
	"PRIME X670-P",
1123
	"PRIME X670-P WIFI",
1329
	"PRIME X670-P WIFI",
1124
	"PRIME X670E-PRO WIFI",
1330
	"PRIME X670E-PRO WIFI",
1125
	"Pro B660M-C-D4",
1331
	"PRIME Z590-A",
1332
	"PRIME Z590-P",
1333
	"PRIME Z590-P WIFI",
1334
	"PRIME Z590-V",
1335
	"PRIME Z590M-PLUS",
1336
	"PRIME Z690-A",
1337
	"PRIME Z690-P",
1338
	"PRIME Z690-P D4",
1339
	"PRIME Z690-P WIFI",
1340
	"PRIME Z690-P WIFI D4",
1341
	"PRIME Z690M-PLUS D4",
1342
	"PRIME Z790-A WIFI",
1343
	"PRIME Z790-P",
1344
	"PRIME Z790-P D4",
1345
	"PRIME Z790-P WIFI",
1346
	"PRIME Z790-P WIFI D4",
1347
	"PRIME Z790M-PLUS",
1348
	"PRIME Z790M-PLUS D4",
1349
	"Pro B560M-C",
1350
	"Pro B560M-CT",
1351
	"Pro B660M-C",
1352
	"Pro B660M-C D4",
1353
	"Pro B760M-C",
1354
	"Pro B760M-CT",
1355
	"Pro H510M-C",
1356
	"Pro H510M-CT",
1357
	"Pro H610M-C",
1358
	"Pro H610M-C D4",
1359
	"Pro H610M-CT D4",
1360
	"Pro H610T D4",
1361
	"Pro Q670M-C",
1362
	"Pro WS W680-ACE",
1363
	"Pro WS W680-ACE IPMI",
1364
	"Pro WS W790-ACE",
1365
	"Pro WS W790E-SAGE SE",
1366
	"ProArt B650-CREATOR",
1126
	"ProArt B660-CREATOR D4",
1367
	"ProArt B660-CREATOR D4",
1368
	"ProArt B760-CREATOR D4",
1127
	"ProArt X670E-CREATOR WIFI",
1369
	"ProArt X670E-CREATOR WIFI",
1370
	"ProArt Z690-CREATOR WIFI",
1371
	"ProArt Z790-CREATOR WIFI",
1128
	"ROG CROSSHAIR X670E EXTREME",
1372
	"ROG CROSSHAIR X670E EXTREME",
1129
	"ROG CROSSHAIR X670E GENE",
1373
	"ROG CROSSHAIR X670E GENE",
1130
	"ROG CROSSHAIR X670E HERO",
1374
	"ROG CROSSHAIR X670E HERO",
1375
	"ROG MAXIMUS XIII APEX",
1376
	"ROG MAXIMUS XIII EXTREME",
1131
	"ROG MAXIMUS XIII EXTREME GLACIAL",
1377
	"ROG MAXIMUS XIII EXTREME GLACIAL",
1378
	"ROG MAXIMUS XIII HERO",
1379
	"ROG MAXIMUS Z690 APEX",
1132
	"ROG MAXIMUS Z690 EXTREME",
1380
	"ROG MAXIMUS Z690 EXTREME",
1133
	"ROG MAXIMUS Z690 EXTREME GLACIAL",
1381
	"ROG MAXIMUS Z690 EXTREME GLACIAL",
1382
	"ROG MAXIMUS Z690 FORMULA",
1383
	"ROG MAXIMUS Z690 HERO",
1384
	"ROG MAXIMUS Z690 HERO EVA",
1385
	"ROG MAXIMUS Z790 APEX",
1386
	"ROG MAXIMUS Z790 EXTREME",
1387
	"ROG MAXIMUS Z790 HERO",
1388
	"ROG STRIX B560-A GAMING WIFI",
1389
	"ROG STRIX B560-E GAMING WIFI",
1390
	"ROG STRIX B560-F GAMING WIFI",
1391
	"ROG STRIX B560-G GAMING WIFI",
1392
	"ROG STRIX B560-I GAMING WIFI",
1134
	"ROG STRIX B650-A GAMING WIFI",
1393
	"ROG STRIX B650-A GAMING WIFI",
1135
	"ROG STRIX B650E-E GAMING WIFI",
1394
	"ROG STRIX B650E-E GAMING WIFI",
1136
	"ROG STRIX B650E-F GAMING WIFI",
1395
	"ROG STRIX B650E-F GAMING WIFI",
1137
	"ROG STRIX B650E-I GAMING WIFI",
1396
	"ROG STRIX B650E-I GAMING WIFI",
1397
	"ROG STRIX B660-A GAMING WIFI",
1138
	"ROG STRIX B660-A GAMING WIFI D4",
1398
	"ROG STRIX B660-A GAMING WIFI D4",
1139
	"ROG STRIX B660-F GAMING WIFI",
1399
	"ROG STRIX B660-F GAMING WIFI",
1140
	"ROG STRIX B660-G GAMING WIFI",
1400
	"ROG STRIX B660-G GAMING WIFI",
1141
	"ROG STRIX B660-I GAMING WIFI",
1401
	"ROG STRIX B660-I GAMING WIFI",
1402
	"ROG STRIX B760-A GAMING WIFI",
1403
	"ROG STRIX B760-A GAMING WIFI D4",
1404
	"ROG STRIX B760-F GAMING WIFI",
1405
	"ROG STRIX B760-G GAMING WIFI",
1406
	"ROG STRIX B760-G GAMING WIFI D4",
1407
	"ROG STRIX B760-I GAMING WIFI",
1142
	"ROG STRIX X670E-A GAMING WIFI",
1408
	"ROG STRIX X670E-A GAMING WIFI",
1143
	"ROG STRIX X670E-E GAMING WIFI",
1409
	"ROG STRIX X670E-E GAMING WIFI",
1144
	"ROG STRIX X670E-F GAMING WIFI",
1410
	"ROG STRIX X670E-F GAMING WIFI",
1145
	"ROG STRIX X670E-I GAMING WIFI",
1411
	"ROG STRIX X670E-I GAMING WIFI",
1412
	"ROG STRIX Z590-A GAMING WIFI",
1146
	"ROG STRIX Z590-A GAMING WIFI II",
1413
	"ROG STRIX Z590-A GAMING WIFI II",
1414
	"ROG STRIX Z590-E GAMING WIFI",
1415
	"ROG STRIX Z590-F GAMING WIFI",
1416
	"ROG STRIX Z590-I GAMING WIFI",
1417
	"ROG STRIX Z690-A GAMING WIFI",
1147
	"ROG STRIX Z690-A GAMING WIFI D4",
1418
	"ROG STRIX Z690-A GAMING WIFI D4",
1419
	"ROG STRIX Z690-E GAMING WIFI",
1420
	"ROG STRIX Z690-F GAMING WIFI",
1421
	"ROG STRIX Z690-G GAMING WIFI",
1422
	"ROG STRIX Z690-I GAMING WIFI",
1423
	"ROG STRIX Z790-A GAMING WIFI",
1424
	"ROG STRIX Z790-A GAMING WIFI D4",
1425
	"ROG STRIX Z790-E GAMING WIFI",
1426
	"ROG STRIX Z790-F GAMING WIFI",
1427
	"ROG STRIX Z790-H GAMING WIFI",
1428
	"ROG STRIX Z790-I GAMING WIFI",
1429
	"TUF GAMING A620M-PLUS",
1430
	"TUF GAMING A620M-PLUS WIFI",
1431
	"TUF GAMING B560-PLUS WIFI",
1432
	"TUF GAMING B560M-E",
1433
	"TUF GAMING B560M-PLUS",
1434
	"TUF GAMING B560M-PLUS WIFI",
1148
	"TUF GAMING B650-PLUS",
1435
	"TUF GAMING B650-PLUS",
1149
	"TUF GAMING B650-PLUS WIFI",
1436
	"TUF GAMING B650-PLUS WIFI",
1150
	"TUF GAMING B650M-PLUS",
1437
	"TUF GAMING B650M-PLUS",
1151
	"TUF GAMING B650M-PLUS WIFI",
1438
	"TUF GAMING B650M-PLUS WIFI",
1439
	"TUF GAMING B660-PLUS WIFI D4",
1440
	"TUF GAMING B660M-E D4",
1441
	"TUF GAMING B660M-PLUS D4",
1152
	"TUF GAMING B660M-PLUS WIFI",
1442
	"TUF GAMING B660M-PLUS WIFI",
1443
	"TUF GAMING B660M-PLUS WIFI D4",
1444
	"TUF GAMING B760-PLUS WIFI",
1445
	"TUF GAMING B760-PLUS WIFI D4",
1446
	"TUF GAMING B760M-BTF WIFI D4",
1447
	"TUF GAMING B760M-E D4",
1448
	"TUF GAMING B760M-PLUS",
1449
	"TUF GAMING B760M-PLUS D4",
1450
	"TUF GAMING B760M-PLUS WIFI",
1451
	"TUF GAMING B760M-PLUS WIFI D4",
1452
	"TUF GAMING H570-PRO",
1453
	"TUF GAMING H570-PRO WIFI",
1454
	"TUF GAMING H670-PRO WIFI D4",
1455
	"TUF GAMING H770-PRO WIFI",
1153
	"TUF GAMING X670E-PLUS",
1456
	"TUF GAMING X670E-PLUS",
1154
	"TUF GAMING X670E-PLUS WIFI",
1457
	"TUF GAMING X670E-PLUS WIFI",
1458
	"TUF GAMING Z590-PLUS",
1155
	"TUF GAMING Z590-PLUS WIFI",
1459
	"TUF GAMING Z590-PLUS WIFI",
1460
	"TUF GAMING Z690-PLUS",
1461
	"TUF GAMING Z690-PLUS D4",
1462
	"TUF GAMING Z690-PLUS WIFI",
1463
	"TUF GAMING Z690-PLUS WIFI D4",
1464
	"TUF GAMING Z790-PLUS D4",
1465
	"TUF GAMING Z790-PLUS WIFI",
1466
	"TUF GAMING Z790-PLUS WIFI D4",
1467
	"Z590 WIFI GUNDAM EDITION",
1156
};
1468
};
1157
1469
1158
#if IS_ENABLED(CONFIG_ACPI)
1470
#if IS_ENABLED(CONFIG_ACPI)
Lines 1194-1199 static enum sensor_access nct6775_determine_access(const char *device_uid) Link Here
1194
	return access_direct;
1506
	return access_direct;
1195
}
1507
}
1196
1508
1509
struct acpi_board_info {
1510
	char *acpi_mutex_path;
1511
};
1512
1513
#define DMI_ASUS_BOARD_INFO(name, mutex_path)			\
1514
static struct acpi_board_info name = {				\
1515
	.acpi_mutex_path = mutex_path,				\
1516
}
1517
1518
DMI_ASUS_BOARD_INFO(acpi_board_ILPC_MUTEX, "\\_SB.PCI0.LPCB.SIO1.MUT0");
1519
DMI_ASUS_BOARD_INFO(acpi_board_SBRG_MUTEX, "\\_SB.PCI0.SBRG.SIO1.MUT0");
1520
DMI_ASUS_BOARD_INFO(acpi_board_LPC0_MUTEX, "\\_SB_.PCI0.LPC0.SIO1.MUT0");
1521
1522
#define DMI_MATCH_ASUS_WMI_BOARD(name, info) {					\
1523
	.matches = {								\
1524
		DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."),	\
1525
		DMI_EXACT_MATCH(DMI_BOARD_NAME, name),				\
1526
	},									\
1527
	.driver_data = info,							\
1528
}
1529
1530
#define DMI_MATCH_ASUS_NONWMI_BOARD(name, info) {				\
1531
	.matches = {								\
1532
		DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),	\
1533
		DMI_EXACT_MATCH(DMI_BOARD_NAME, name),				\
1534
	},									\
1535
	.driver_data = info,							\
1536
}
1537
1538
#define DMI_MATCH_ASROCK_WMI_BOARD(name, info) {					\
1539
	.matches = {								\
1540
		DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "ASRock"),	\
1541
		DMI_EXACT_MATCH(DMI_BOARD_NAME, name),				\
1542
	},									\
1543
	.driver_data = info,							\
1544
}
1545
1546
static const struct dmi_system_id asus_wmi_info_table[] = {
1547
	DMI_MATCH_ASUS_WMI_BOARD("B150 PRO GAMING", &acpi_board_ILPC_MUTEX),
1548
	DMI_MATCH_ASUS_WMI_BOARD("B150 PRO GAMING D3", &acpi_board_ILPC_MUTEX),
1549
	DMI_MATCH_ASUS_WMI_BOARD("B150M PRO GAMING", &acpi_board_ILPC_MUTEX),
1550
	DMI_MATCH_ASROCK_WMI_BOARD("B365M Pro4-F", &acpi_board_ILPC_MUTEX),
1551
	DMI_MATCH_ASROCK_WMI_BOARD("B450M Pro4", &acpi_board_SBRG_MUTEX),
1552
	DMI_MATCH_ASROCK_WMI_BOARD("B650E PG Riptide WiFi", &acpi_board_SBRG_MUTEX),
1553
	DMI_MATCH_ASUS_WMI_BOARD("EX-B365M-V", &acpi_board_ILPC_MUTEX),
1554
	DMI_MATCH_ASUS_WMI_BOARD("EX-B365M-V5", &acpi_board_ILPC_MUTEX),
1555
	DMI_MATCH_ASUS_WMI_BOARD("EX-H310M-V3 R2.0", &acpi_board_ILPC_MUTEX),
1556
	DMI_MATCH_ASUS_WMI_BOARD("H81M-R", &acpi_board_ILPC_MUTEX),
1557
	DMI_MATCH_ASUS_WMI_BOARD("K30AD_M31AD_M51AD_M32AD", &acpi_board_ILPC_MUTEX),
1558
	DMI_MATCH_ASUS_WMI_BOARD("MAXIMUS IX APEX", &acpi_board_ILPC_MUTEX),
1559
	DMI_MATCH_ASUS_WMI_BOARD("MAXIMUS IX CODE", &acpi_board_ILPC_MUTEX),
1560
	DMI_MATCH_ASUS_WMI_BOARD("MAXIMUS IX EXTREME", &acpi_board_ILPC_MUTEX),
1561
	DMI_MATCH_ASUS_WMI_BOARD("MAXIMUS IX FORMULA", &acpi_board_ILPC_MUTEX),
1562
	DMI_MATCH_ASUS_WMI_BOARD("MAXIMUS IX HERO", &acpi_board_ILPC_MUTEX),
1563
	DMI_MATCH_ASUS_WMI_BOARD("MAXIMUS VII HERO", &acpi_board_ILPC_MUTEX),
1564
	DMI_MATCH_ASUS_WMI_BOARD("MAXIMUS VIII FORMULA", &acpi_board_ILPC_MUTEX),
1565
	DMI_MATCH_ASUS_WMI_BOARD("P8H61-M LX R2.0", &acpi_board_ILPC_MUTEX),
1566
	DMI_MATCH_ASUS_WMI_BOARD("P8H67", &acpi_board_ILPC_MUTEX),
1567
	DMI_MATCH_ASUS_NONWMI_BOARD("P8Z68-V LX", &acpi_board_ILPC_MUTEX),
1568
	DMI_MATCH_ASUS_WMI_BOARD("PRIME B250M-C", &acpi_board_ILPC_MUTEX),
1569
	DMI_MATCH_ASUS_WMI_BOARD("PRIME B365-PLUS", &acpi_board_ILPC_MUTEX),
1570
	DMI_MATCH_ASUS_WMI_BOARD("PRIME B365M-A", &acpi_board_ILPC_MUTEX),
1571
	DMI_MATCH_ASUS_WMI_BOARD("PRIME B365M-C", &acpi_board_ILPC_MUTEX),
1572
	DMI_MATCH_ASUS_WMI_BOARD("PRIME B365M-K", &acpi_board_ILPC_MUTEX),
1573
	DMI_MATCH_ASUS_WMI_BOARD("PRIME H310-PLUS R2.0", &acpi_board_ILPC_MUTEX),
1574
	DMI_MATCH_ASUS_WMI_BOARD("PRIME H310I-PLUS R2.0", &acpi_board_ILPC_MUTEX),
1575
	DMI_MATCH_ASUS_WMI_BOARD("PRIME H310M-A R2.0", &acpi_board_ILPC_MUTEX),
1576
	DMI_MATCH_ASUS_WMI_BOARD("PRIME H310M-C R2.0", &acpi_board_ILPC_MUTEX),
1577
	DMI_MATCH_ASUS_WMI_BOARD("PRIME H310M-C/PS R2.0", &acpi_board_ILPC_MUTEX),
1578
	DMI_MATCH_ASUS_WMI_BOARD("PRIME H310M-CS R2.0", &acpi_board_ILPC_MUTEX),
1579
	DMI_MATCH_ASUS_WMI_BOARD("PRIME H310M-D R2.0", &acpi_board_ILPC_MUTEX),
1580
	DMI_MATCH_ASUS_WMI_BOARD("PRIME H310M-DASH R2.0", &acpi_board_ILPC_MUTEX),
1581
	DMI_MATCH_ASUS_WMI_BOARD("PRIME H310M-E R2.0", &acpi_board_ILPC_MUTEX),
1582
	DMI_MATCH_ASUS_WMI_BOARD("PRIME H310M-E R2.0/BR", &acpi_board_ILPC_MUTEX),
1583
	DMI_MATCH_ASUS_WMI_BOARD("PRIME H310M-F R2.0", &acpi_board_ILPC_MUTEX),
1584
	DMI_MATCH_ASUS_WMI_BOARD("PRIME H310M-K R2.0", &acpi_board_ILPC_MUTEX),
1585
	DMI_MATCH_ASUS_WMI_BOARD("PRIME H310M-R R2.0", &acpi_board_ILPC_MUTEX),
1586
	DMI_MATCH_ASUS_WMI_BOARD("PRIME X399-A", &acpi_board_SBRG_MUTEX),
1587
	DMI_MATCH_ASUS_WMI_BOARD("PRIME Z270-A", &acpi_board_ILPC_MUTEX),
1588
	DMI_MATCH_ASUS_WMI_BOARD("PRO H310M-R R2.0 WI-FI", &acpi_board_ILPC_MUTEX),
1589
	DMI_MATCH_ASUS_WMI_BOARD("Pro WS C422-ACE", &acpi_board_ILPC_MUTEX),
1590
	DMI_MATCH_ASUS_WMI_BOARD("Pro WS WRX80E-SAGE SE WIFI", &acpi_board_SBRG_MUTEX),
1591
	DMI_MATCH_ASUS_WMI_BOARD("Pro WS WRX80E-SAGE SE WIFI II", &acpi_board_SBRG_MUTEX),
1592
	DMI_MATCH_ASUS_WMI_BOARD("ROG MAXIMUS X HERO", &acpi_board_ILPC_MUTEX),
1593
	DMI_MATCH_ASUS_WMI_BOARD("ROG RAMPAGE VI EXTREME ENCORE", &acpi_board_ILPC_MUTEX),
1594
	DMI_MATCH_ASUS_WMI_BOARD("ROG STRIX B365-F GAMING", &acpi_board_ILPC_MUTEX),
1595
	DMI_MATCH_ASUS_WMI_BOARD("ROG STRIX B365-G GAMING", &acpi_board_ILPC_MUTEX),
1596
	DMI_MATCH_ASUS_WMI_BOARD("ROG STRIX TRX40-E GAMING", &acpi_board_SBRG_MUTEX),
1597
	DMI_MATCH_ASUS_WMI_BOARD("ROG STRIX TRX40-XE GAMING", &acpi_board_SBRG_MUTEX),
1598
	DMI_MATCH_ASUS_WMI_BOARD("ROG STRIX Z370-H GAMING", &acpi_board_ILPC_MUTEX),
1599
	DMI_MATCH_ASUS_WMI_BOARD("ROG ZENITH II EXTREME", &acpi_board_SBRG_MUTEX),
1600
	DMI_MATCH_ASUS_WMI_BOARD("ROG ZENITH II EXTREME ALPHA", &acpi_board_SBRG_MUTEX),
1601
	DMI_MATCH_ASUS_WMI_BOARD("STRIX Z270E GAMING", &acpi_board_ILPC_MUTEX),
1602
	DMI_MATCH_ASUS_WMI_BOARD("STRIX Z270F GAMING", &acpi_board_ILPC_MUTEX),
1603
	DMI_MATCH_ASUS_WMI_BOARD("STRIX Z270G GAMING", &acpi_board_ILPC_MUTEX),
1604
	DMI_MATCH_ASUS_WMI_BOARD("STRIX Z270H GAMING", &acpi_board_ILPC_MUTEX),
1605
	DMI_MATCH_ASUS_WMI_BOARD("TUF B365-PLUS GAMING", &acpi_board_ILPC_MUTEX),
1606
	DMI_MATCH_ASUS_WMI_BOARD("TUF B365M-PLUS GAMING", &acpi_board_ILPC_MUTEX),
1607
	DMI_MATCH_ASUS_WMI_BOARD("TUF H310M-PLUS GAMING R2.0", &acpi_board_ILPC_MUTEX),
1608
	DMI_MATCH_ASUS_WMI_BOARD("TUF Z270 MARK 1", &acpi_board_ILPC_MUTEX),
1609
	DMI_MATCH_ASROCK_WMI_BOARD("X370 Gaming X", &acpi_board_SBRG_MUTEX),
1610
	DMI_MATCH_ASROCK_WMI_BOARD("X399 Taichi", &acpi_board_SBRG_MUTEX),
1611
	DMI_MATCH_ASROCK_WMI_BOARD("X570 Steel Legend", &acpi_board_SBRG_MUTEX),
1612
	DMI_MATCH_ASROCK_WMI_BOARD("X570 Taichi", &acpi_board_SBRG_MUTEX),
1613
	DMI_MATCH_ASUS_WMI_BOARD("X99-E WS/USB 3.1", &acpi_board_LPC0_MUTEX),
1614
	DMI_MATCH_ASROCK_WMI_BOARD("Z170 Extreme4", &acpi_board_ILPC_MUTEX),
1615
	DMI_MATCH_ASUS_WMI_BOARD("Z170 PRO GAMING", &acpi_board_ILPC_MUTEX),
1616
	DMI_MATCH_ASUS_WMI_BOARD("Z170 PRO GAMING/AURA", &acpi_board_ILPC_MUTEX),
1617
	DMI_MATCH_ASUS_WMI_BOARD("Z170-A", &acpi_board_ILPC_MUTEX),
1618
	DMI_MATCH_ASUS_WMI_BOARD("Z170-DELUXE", &acpi_board_ILPC_MUTEX),
1619
	DMI_MATCH_ASUS_WMI_BOARD("Z170M-PLUS", &acpi_board_ILPC_MUTEX),
1620
	DMI_MATCH_ASUS_WMI_BOARD("Z270-WS", &acpi_board_ILPC_MUTEX),
1621
	{}
1622
};
1623
MODULE_DEVICE_TABLE(dmi, asus_wmi_info_table);
1624
1625
static const char * const asus_nonconflict_boards[] = {
1626
	"H97-PRO GAMER",
1627
};
1628
1197
static int __init sensors_nct6775_platform_init(void)
1629
static int __init sensors_nct6775_platform_init(void)
1198
{
1630
{
1199
	int i, err;
1631
	int i, err;
Lines 1204-1209 static int __init sensors_nct6775_platform_init(void) Link Here
1204
	int sioaddr[2] = { 0x2e, 0x4e };
1636
	int sioaddr[2] = { 0x2e, 0x4e };
1205
	enum sensor_access access = access_direct;
1637
	enum sensor_access access = access_direct;
1206
	const char *board_vendor, *board_name;
1638
	const char *board_vendor, *board_name;
1639
	const struct dmi_system_id *dmi_id;
1640
	struct acpi_board_info *board_info;
1641
	acpi_handle acpi_wmi_mutex = NULL;
1642
	acpi_status status;
1207
1643
1208
	err = platform_driver_register(&nct6775_driver);
1644
	err = platform_driver_register(&nct6775_driver);
1209
	if (err)
1645
	if (err)
Lines 1225-1230 static int __init sensors_nct6775_platform_init(void) Link Here
1225
			access = nct6775_determine_access(ASUSMSI_DEVICE_UID);
1661
			access = nct6775_determine_access(ASUSMSI_DEVICE_UID);
1226
	}
1662
	}
1227
1663
1664
	if (access == access_direct) {
1665
		/* Mutext access check */
1666
		dmi_id = dmi_first_match(asus_wmi_info_table);
1667
		if (dmi_id && dmi_id->driver_data) {
1668
			board_info = dmi_id->driver_data;
1669
			if (board_info->acpi_mutex_path) {
1670
				status = acpi_get_handle(NULL, board_info->acpi_mutex_path,
1671
							 &acpi_wmi_mutex);
1672
				if (!ACPI_FAILURE(status)) {
1673
					pr_info("Using Asus WMI mutex: %s\n",
1674
						board_info->acpi_mutex_path);
1675
					access = access_direct;
1676
				} else {
1677
					pr_info("No such ASUS mutex: %s\n",
1678
						board_info->acpi_mutex_path);
1679
				}
1680
			} else {
1681
				pr_info("No mutex path\n");
1682
			}
1683
		} else {
1684
			pr_info("No dmi definition `%s`:`%s`\n", board_name, board_vendor);
1685
		}
1686
	}
1687
1228
	/*
1688
	/*
1229
	 * initialize sio_data->kind and sio_data->sioreg.
1689
	 * initialize sio_data->kind and sio_data->sioreg.
1230
	 *
1690
	 *
Lines 1246-1251 static int __init sensors_nct6775_platform_init(void) Link Here
1246
		found = true;
1706
		found = true;
1247
1707
1248
		sio_data.access = access;
1708
		sio_data.access = access;
1709
		sio_data.acpi_wmi_mutex = acpi_wmi_mutex;
1249
1710
1250
		if (access == access_asuswmi) {
1711
		if (access == access_asuswmi) {
1251
			sio_data.sio_outb = superio_wmi_outb;
1712
			sio_data.sio_outb = superio_wmi_outb;
Lines 1273-1283 static int __init sensors_nct6775_platform_init(void) Link Here
1273
			res.end = address + IOREGION_OFFSET + IOREGION_LENGTH - 1;
1734
			res.end = address + IOREGION_OFFSET + IOREGION_LENGTH - 1;
1274
			res.flags = IORESOURCE_IO;
1735
			res.flags = IORESOURCE_IO;
1275
1736
1276
			err = acpi_check_resource_conflict(&res);
1737
			err = match_string(asus_nonconflict_boards, ARRAY_SIZE(asus_nonconflict_boards),
1277
			if (err) {
1738
					   board_name);
1278
				platform_device_put(pdev[i]);
1739
			if (!acpi_wmi_mutex && err < 0) {
1279
				pdev[i] = NULL;
1740
				err = acpi_check_resource_conflict(&res);
1280
				continue;
1741
				if (err) {
1742
					platform_device_put(pdev[i]);
1743
					pdev[i] = NULL;
1744
					continue;
1745
				}
1281
			}
1746
			}
1282
1747
1283
			err = platform_device_add_resources(pdev[i], &res, 1);
1748
			err = platform_device_add_resources(pdev[i], &res, 1);
(-)a/drivers/hwmon/nct6775.h (-2 / +7 lines)
Lines 5-11 Link Here
5
#include <linux/types.h>
5
#include <linux/types.h>
6
6
7
enum kinds { nct6106, nct6116, nct6775, nct6776, nct6779, nct6791, nct6792,
7
enum kinds { nct6106, nct6116, nct6775, nct6776, nct6779, nct6791, nct6792,
8
	     nct6793, nct6795, nct6796, nct6797, nct6798 };
8
	     nct6793, nct6795, nct6796, nct6797, nct6798, nct6799 };
9
enum pwm_enable { off, manual, thermal_cruise, speed_cruise, sf3, sf4 };
9
enum pwm_enable { off, manual, thermal_cruise, speed_cruise, sf3, sf4 };
10
10
11
#define NUM_TEMP	10	/* Max number of temp attribute sets w/ limits*/
11
#define NUM_TEMP	10	/* Max number of temp attribute sets w/ limits*/
Lines 90-99 struct nct6775_data { Link Here
90
	unsigned int (*fan_from_reg)(u16 reg, unsigned int divreg);
90
	unsigned int (*fan_from_reg)(u16 reg, unsigned int divreg);
91
	unsigned int (*fan_from_reg_min)(u16 reg, unsigned int divreg);
91
	unsigned int (*fan_from_reg_min)(u16 reg, unsigned int divreg);
92
92
93
	struct mutex update_lock;
93
	struct mutex update_lock;	/* non ACPI lock */
94
	acpi_handle acpi_wmi_mutex;	/* ACPI lock */
95
94
	bool valid;		/* true if following fields are valid */
96
	bool valid;		/* true if following fields are valid */
95
	unsigned long last_updated;	/* In jiffies */
97
	unsigned long last_updated;	/* In jiffies */
96
98
99
	int (*lock)(struct nct6775_data *data);
100
	void (*unlock)(struct nct6775_data *data, struct device *dev);
101
97
	/* Register values */
102
	/* Register values */
98
	u8 bank;		/* current register bank */
103
	u8 bank;		/* current register bank */
99
	u8 in_num;		/* number of in inputs we have */
104
	u8 in_num;		/* number of in inputs we have */

Return to bug 204807