Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9faf28ca authored by Guenter Roeck's avatar Guenter Roeck
Browse files

hwmon: (it87) Add feature flags for fans count and 16-bit fan configuration



Fans 4-5 are not supported on all chips and revisions. Also, 16-bit fan
counters are always enabled on some chips. Provide feature flags to
simplify adding support for new chips.

Reviewed-by: default avatarJean Delvare <jdelvare@suse.de>
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent fd044868
Loading
Loading
Loading
Loading
+36 −33
Original line number Diff line number Diff line
@@ -252,6 +252,8 @@ struct it87_devices {
#define FEAT_TEMP_OFFSET	(1 << 4)
#define FEAT_TEMP_PECI		(1 << 5)
#define FEAT_TEMP_OLD_PECI	(1 << 6)
#define FEAT_FAN16_CONFIG	(1 << 7)	/* Need to enable 16-bit fans */
#define FEAT_FIVE_FANS		(1 << 8)	/* Supports five fans */

static const struct it87_devices it87_devices[] = {
	[it87] = {
@@ -264,31 +266,33 @@ static const struct it87_devices it87_devices[] = {
	},
	[it8716] = {
		.name = "it8716",
		.features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET,
		.features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET
		  | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS,
	},
	[it8718] = {
		.name = "it8718",
		.features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET
		  | FEAT_TEMP_OLD_PECI,
		  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS,
		.old_peci_mask = 0x4,
	},
	[it8720] = {
		.name = "it8720",
		.features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET
		  | FEAT_TEMP_OLD_PECI,
		  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS,
		.old_peci_mask = 0x4,
	},
	[it8721] = {
		.name = "it8721",
		.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
		  | FEAT_TEMP_OFFSET | FEAT_TEMP_OLD_PECI | FEAT_TEMP_PECI,
		  | FEAT_TEMP_OFFSET | FEAT_TEMP_OLD_PECI | FEAT_TEMP_PECI
		  | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS,
		.peci_mask = 0x05,
		.old_peci_mask = 0x02,	/* Actually reports PCH */
	},
	[it8728] = {
		.name = "it8728",
		.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
		  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI,
		  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_FIVE_FANS,
		.peci_mask = 0x07,
	},
	[it8771] = {
@@ -298,6 +302,7 @@ static const struct it87_devices it87_devices[] = {
				/* PECI: guesswork */
				/* 12mV ADC (OHM) */
				/* 16 bit fans (OHM) */
				/* three fans, always 16 bit (guesswork) */
		.peci_mask = 0x07,
	},
	[it8772] = {
@@ -307,24 +312,25 @@ static const struct it87_devices it87_devices[] = {
				/* PECI (coreboot) */
				/* 12mV ADC (HWSensors4, OHM) */
				/* 16 bit fans (HWSensors4, OHM) */
				/* three fans, always 16 bit (datasheet) */
		.peci_mask = 0x07,
	},
	[it8781] = {
		.name = "it8781",
		.features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET
		  | FEAT_TEMP_OLD_PECI,
		  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG,
		.old_peci_mask = 0x4,
	},
	[it8782] = {
		.name = "it8782",
		.features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET
		  | FEAT_TEMP_OLD_PECI,
		  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG,
		.old_peci_mask = 0x4,
	},
	[it8783] = {
		.name = "it8783",
		.features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET
		  | FEAT_TEMP_OLD_PECI,
		  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG,
		.old_peci_mask = 0x4,
	},
	[it8603] = {
@@ -345,6 +351,8 @@ static const struct it87_devices it87_devices[] = {
#define has_temp_old_peci(data, nr) \
				(((data)->features & FEAT_TEMP_OLD_PECI) && \
				 ((data)->old_peci_mask & (1 << nr)))
#define has_fan16_config(data)	((data)->features & FEAT_FAN16_CONFIG)
#define has_five_fans(data)	((data)->features & FEAT_FIVE_FANS)

struct it87_sio_data {
	enum chips type;
@@ -2124,13 +2132,14 @@ static int it87_probe(struct platform_device *pdev)
	case it87:
		if (sio_data->revision >= 0x03) {
			data->features &= ~FEAT_OLD_AUTOPWM;
			data->features |= FEAT_16BIT_FANS;
			data->features |= FEAT_FAN16_CONFIG | FEAT_16BIT_FANS;
		}
		break;
	case it8712:
		if (sio_data->revision >= 0x08) {
			data->features &= ~FEAT_OLD_AUTOPWM;
			data->features |= FEAT_16BIT_FANS;
			data->features |= FEAT_FAN16_CONFIG | FEAT_16BIT_FANS |
					  FEAT_FIVE_FANS;
		}
		break;
	default:
@@ -2463,12 +2472,8 @@ static void it87_init_device(struct platform_device *pdev)
	}
	data->has_fan = (data->fan_main_ctrl >> 4) & 0x07;

	/*
	 * Set tachometers to 16-bit mode if needed. IT8603E, IT8728F,
	 * IT8771E (guesswork), and IT8772E have it by default.
	 */
	if (has_16bit_fans(data) && data->type != it8603 && data->type != it8728
	    && data->type != it8771 && data->type != it8772) {
	/* Set tachometers to 16-bit mode if needed */
	if (has_fan16_config(data)) {
		tmp = it87_read_value(data, IT87_REG_FAN_16BIT);
		if (~tmp & 0x07 & data->has_fan) {
			dev_dbg(&pdev->dev,
@@ -2476,18 +2481,16 @@ static void it87_init_device(struct platform_device *pdev)
			it87_write_value(data, IT87_REG_FAN_16BIT,
					 tmp | 0x07);
		}
		/*
		 * IT8705F, IT8781F, IT8782F, and IT8783E/F only support
		 * three fans.
		 */
		if (data->type != it87 && data->type != it8781 &&
		    data->type != it8782 && data->type != it8783) {
	}

	/* Check for additional fans */
	if (has_five_fans(data)) {
		tmp = it87_read_value(data, IT87_REG_FAN_16BIT);
		if (tmp & (1 << 4))
			data->has_fan |= (1 << 3); /* fan4 enabled */
		if (tmp & (1 << 5))
			data->has_fan |= (1 << 4); /* fan5 enabled */
	}
	}

	/* Fan input pins may be used for alternative functions */
	data->has_fan &= ~sio_data->skip_fan;