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

Collapse All | Expand All

(-)a/drivers/hwmon/Kconfig (-1 / +1 lines)
Lines 1507-1513 config SENSORS_NCT6775_CORE Link Here
1507
config SENSORS_NCT6775
1507
config SENSORS_NCT6775
1508
	tristate "Platform driver for Nuvoton NCT6775F and compatibles"
1508
	tristate "Platform driver for Nuvoton NCT6775F and compatibles"
1509
	depends on !PPC
1509
	depends on !PPC
1510
	depends on ACPI_WMI || ACPI_WMI=n
1510
	depends on ACPI || ACPI=n
1511
	select HWMON_VID
1511
	select HWMON_VID
1512
	select SENSORS_NCT6775_CORE
1512
	select SENSORS_NCT6775_CORE
1513
	help
1513
	help
(-)a/drivers/hwmon/nct6775-core.c (-49 / +209 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 1150-1156 static int nct6775_write_fan_div(struct nct6775_data *data, int nr) Link Here
1150
	if (err)
1192
	if (err)
1151
		return err;
1193
		return err;
1152
	reg &= 0x70 >> oddshift;
1194
	reg &= 0x70 >> oddshift;
1153
	reg |= data->fan_div[nr] & (0x7 << oddshift);
1195
	reg |= (data->fan_div[nr] & 0x7) << oddshift;
1154
	return nct6775_write_value(data, fandiv_reg, reg);
1196
	return nct6775_write_value(data, fandiv_reg, reg);
1155
}
1197
}
1156
1198
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 (-46 / +332 lines)
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);
(-)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