Commit 317840cf authored by Frank Crawford's avatar Frank Crawford Committed by Guenter Roeck
Browse files

hwmon: (it87) Generalise support for FAN_CTL ON/OFF



Support for FAN_CTL ON/OFF is currently disabled only for IT8603E but
there are severl chips that don't support the configuration bits to turn
off fan control entirely.  Generalise this support for any chip.

Add feature flag FEAT_FANCTL_ONOFF for chips that support configuration
bits for management of fan control off and assign all chips that support
the configuration.

Signed-off-by: default avatarFrank Crawford <frank@crawford.emu.id.au>
Link: https://lore.kernel.org/r/20230527094756.3464256-1-frank@crawford.emu.id.au


Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent a1b6f135
Loading
Loading
Loading
Loading
+37 −26
Original line number Diff line number Diff line
@@ -320,31 +320,34 @@ struct it87_devices {
#define FEAT_FOUR_FANS		BIT(20)	/* Supports four fans */
#define FEAT_FOUR_PWM		BIT(21)	/* Supports four fan controls */
#define FEAT_FOUR_TEMP		BIT(22)
#define FEAT_FANCTL_ONOFF	BIT(23)	/* chip has FAN_CTL ON/OFF */

static const struct it87_devices it87_devices[] = {
	[it87] = {
		.name = "it87",
		.model = "IT87F",
		.features = FEAT_OLD_AUTOPWM,	/* may need to overwrite */
		.features = FEAT_OLD_AUTOPWM | FEAT_FANCTL_ONOFF,
		/* may need to overwrite */
	},
	[it8712] = {
		.name = "it8712",
		.model = "IT8712F",
		.features = FEAT_OLD_AUTOPWM | FEAT_VID,
		.features = FEAT_OLD_AUTOPWM | FEAT_VID | FEAT_FANCTL_ONOFF,
		/* may need to overwrite */
	},
	[it8716] = {
		.name = "it8716",
		.model = "IT8716F",
		.features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_VID
		  | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS | FEAT_PWM_FREQ2,
		  | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS | FEAT_PWM_FREQ2
		  | FEAT_FANCTL_ONOFF,
	},
	[it8718] = {
		.name = "it8718",
		.model = "IT8718F",
		.features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_VID
		  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS
		  | FEAT_PWM_FREQ2,
		  | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF,
		.old_peci_mask = 0x4,
	},
	[it8720] = {
@@ -352,7 +355,7 @@ static const struct it87_devices it87_devices[] = {
		.model = "IT8720F",
		.features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_VID
		  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS
		  | FEAT_PWM_FREQ2,
		  | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF,
		.old_peci_mask = 0x4,
	},
	[it8721] = {
@@ -361,7 +364,7 @@ static const struct it87_devices it87_devices[] = {
		.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
		  | FEAT_TEMP_OFFSET | FEAT_TEMP_OLD_PECI | FEAT_TEMP_PECI
		  | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS | FEAT_IN7_INTERNAL
		  | FEAT_PWM_FREQ2,
		  | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF,
		.peci_mask = 0x05,
		.old_peci_mask = 0x02,	/* Actually reports PCH */
	},
@@ -370,7 +373,8 @@ static const struct it87_devices it87_devices[] = {
		.model = "IT8728F",
		.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
		  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_FIVE_FANS
		  | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2,
		  | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2
		  | FEAT_FANCTL_ONOFF,
		.peci_mask = 0x07,
	},
	[it8732] = {
@@ -379,7 +383,7 @@ static const struct it87_devices it87_devices[] = {
		.features = FEAT_NEWER_AUTOPWM | FEAT_16BIT_FANS
		  | FEAT_TEMP_OFFSET | FEAT_TEMP_OLD_PECI | FEAT_TEMP_PECI
		  | FEAT_10_9MV_ADC | FEAT_IN7_INTERNAL | FEAT_FOUR_FANS
		  | FEAT_FOUR_PWM,
		  | FEAT_FOUR_PWM | FEAT_FANCTL_ONOFF,
		.peci_mask = 0x07,
		.old_peci_mask = 0x02,	/* Actually reports PCH */
	},
@@ -388,7 +392,7 @@ static const struct it87_devices it87_devices[] = {
		.model = "IT8771E",
		.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
		  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL
		  | FEAT_PWM_FREQ2,
		  | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF,
				/* PECI: guesswork */
				/* 12mV ADC (OHM) */
				/* 16 bit fans (OHM) */
@@ -400,7 +404,7 @@ static const struct it87_devices it87_devices[] = {
		.model = "IT8772E",
		.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
		  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL
		  | FEAT_PWM_FREQ2,
		  | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF,
				/* PECI (coreboot) */
				/* 12mV ADC (HWSensors4, OHM) */
				/* 16 bit fans (HWSensors4, OHM) */
@@ -411,21 +415,24 @@ static const struct it87_devices it87_devices[] = {
		.name = "it8781",
		.model = "IT8781F",
		.features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET
		  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_PWM_FREQ2,
		  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_PWM_FREQ2
		  | FEAT_FANCTL_ONOFF,
		.old_peci_mask = 0x4,
	},
	[it8782] = {
		.name = "it8782",
		.model = "IT8782F",
		.features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET
		  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_PWM_FREQ2,
		  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_PWM_FREQ2
		  | FEAT_FANCTL_ONOFF,
		.old_peci_mask = 0x4,
	},
	[it8783] = {
		.name = "it8783",
		.model = "IT8783E/F",
		.features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET
		  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_PWM_FREQ2,
		  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_PWM_FREQ2
		  | FEAT_FANCTL_ONOFF,
		.old_peci_mask = 0x4,
	},
	[it8786] = {
@@ -433,7 +440,7 @@ static const struct it87_devices it87_devices[] = {
		.model = "IT8786E",
		.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
		  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL
		  | FEAT_PWM_FREQ2,
		  | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF,
		.peci_mask = 0x07,
	},
	[it8790] = {
@@ -441,7 +448,7 @@ static const struct it87_devices it87_devices[] = {
		.model = "IT8790E",
		.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
		  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL
		  | FEAT_PWM_FREQ2 | FEAT_CONF_NOEXIT,
		  | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF | FEAT_CONF_NOEXIT,
		.peci_mask = 0x07,
	},
	[it8792] = {
@@ -449,7 +456,8 @@ static const struct it87_devices it87_devices[] = {
		.model = "IT8792E/IT8795E",
		.features = FEAT_NEWER_AUTOPWM | FEAT_16BIT_FANS
		  | FEAT_TEMP_OFFSET | FEAT_TEMP_OLD_PECI | FEAT_TEMP_PECI
		  | FEAT_10_9MV_ADC | FEAT_IN7_INTERNAL | FEAT_CONF_NOEXIT,
		  | FEAT_10_9MV_ADC | FEAT_IN7_INTERNAL | FEAT_FANCTL_ONOFF
		  | FEAT_CONF_NOEXIT,
		.peci_mask = 0x07,
		.old_peci_mask = 0x02,	/* Actually reports PCH */
	},
@@ -467,7 +475,7 @@ static const struct it87_devices it87_devices[] = {
		.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
		  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_SIX_FANS
		  | FEAT_IN7_INTERNAL | FEAT_SIX_PWM | FEAT_PWM_FREQ2
		  | FEAT_SIX_TEMP | FEAT_VIN3_5V,
		  | FEAT_SIX_TEMP | FEAT_VIN3_5V | FEAT_FANCTL_ONOFF,
		.peci_mask = 0x07,
	},
	[it8622] = {
@@ -486,7 +494,7 @@ static const struct it87_devices it87_devices[] = {
		.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
		  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_SIX_FANS
		  | FEAT_IN7_INTERNAL | FEAT_SIX_PWM | FEAT_PWM_FREQ2
		  | FEAT_SIX_TEMP | FEAT_VIN3_5V,
		  | FEAT_SIX_TEMP | FEAT_VIN3_5V | FEAT_FANCTL_ONOFF,
		.peci_mask = 0x07,
	},
	[it87952] = {
@@ -494,7 +502,8 @@ static const struct it87_devices it87_devices[] = {
		.model = "IT87952E",
		.features = FEAT_NEWER_AUTOPWM | FEAT_16BIT_FANS
		  | FEAT_TEMP_OFFSET | FEAT_TEMP_OLD_PECI | FEAT_TEMP_PECI
		  | FEAT_10_9MV_ADC | FEAT_IN7_INTERNAL | FEAT_CONF_NOEXIT,
		  | FEAT_10_9MV_ADC | FEAT_IN7_INTERNAL | FEAT_FANCTL_ONOFF
		  | FEAT_CONF_NOEXIT,
		.peci_mask = 0x07,
		.old_peci_mask = 0x02,	/* Actually reports PCH */
	},
@@ -534,6 +543,7 @@ static const struct it87_devices it87_devices[] = {
#define has_conf_noexit(data)	((data)->features & FEAT_CONF_NOEXIT)
#define has_scaling(data)	((data)->features & (FEAT_12MV_ADC | \
						     FEAT_10_9MV_ADC))
#define has_fanctl_onoff(data)	((data)->features & FEAT_FANCTL_ONOFF)

struct it87_sio_data {
	int sioaddr;
@@ -1240,11 +1250,12 @@ static SENSOR_DEVICE_ATTR(temp3_type, S_IRUGO | S_IWUSR, show_temp_type,

static int pwm_mode(const struct it87_data *data, int nr)
{
	if (data->type != it8603 && nr < 3 && !(data->fan_main_ctrl & BIT(nr)))
	if (has_fanctl_onoff(data) && nr < 3 &&
	    !(data->fan_main_ctrl & BIT(nr)))
		return 0;			/* Full speed */
	if (data->pwm_ctrl[nr] & 0x80)
		return 2;			/* Automatic mode */
	if ((data->type == it8603 || nr >= 3) &&
	if ((!has_fanctl_onoff(data) || nr >= 3) &&
	    data->pwm_duty[nr] == pwm_to_reg(data, 0xff))
		return 0;			/* Full speed */

@@ -1481,7 +1492,7 @@ static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *attr,
		return err;

	if (val == 0) {
		if (nr < 3 && data->type != it8603) {
		if (nr < 3 && has_fanctl_onoff(data)) {
			int tmp;
			/* make sure the fan is on when in on/off mode */
			tmp = it87_read_value(data, IT87_REG_FAN_CTL);
@@ -1521,7 +1532,7 @@ static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *attr,
		data->pwm_ctrl[nr] = ctrl;
		it87_write_value(data, IT87_REG_PWM[nr], ctrl);

		if (data->type != it8603 && nr < 3) {
		if (has_fanctl_onoff(data) && nr < 3) {
			/* set SmartGuardian mode */
			data->fan_main_ctrl |= BIT(nr);
			it87_write_value(data, IT87_REG_FAN_MAIN_CTRL,