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

Commit 7c7a5304 authored by Jean Delvare's avatar Jean Delvare Committed by Greg Kroah-Hartman
Browse files

[PATCH] I2C: w83781d: remove non-i2c sensor chips



This patch removes the support for the W83697HF and W83627THF chips from
the w83781d driver. These chips have no I2C/SMBus interface and are
better supported by the Super-I/O-based w83627hf driver. Documentation
was updated to reflect the support drop.

Signed-off-by: default avatarGrant Coady <gcoady@gmail.com>
Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent a45cfe2c
Loading
Loading
Loading
Loading
+3 −13
Original line number Original line Diff line number Diff line
@@ -18,14 +18,6 @@ Supported chips:
    Prefix: 'w83627hf'
    Prefix: 'w83627hf'
    Addresses scanned: I2C 0x20 - 0x2f, ISA 0x290 (8 I/O ports)
    Addresses scanned: I2C 0x20 - 0x2f, ISA 0x290 (8 I/O ports)
    Datasheet: http://www.winbond.com/PDF/sheet/w83627hf.pdf
    Datasheet: http://www.winbond.com/PDF/sheet/w83627hf.pdf
  * Winbond W83627THF
    Prefix: 'w83627thf'
    Addresses scanned: ISA address 0x290 (8 I/O ports)
    Datasheet: http://www.winbond.com/PDF/sheet/w83627thf.pdf
  * Winbond W83697HF
    Prefix: 'w83697hf'
    Addresses scanned: ISA 0x290 (8 I/O ports)
    Datasheet: http://www.winbond-usa.com/products/winbond_products/pdfs/PCIC/w83697hf.pdf
  * Asus AS99127F
  * Asus AS99127F
    Prefix: 'as99127f'
    Prefix: 'as99127f'
    Addresses scanned: I2C 0x28 - 0x2f
    Addresses scanned: I2C 0x28 - 0x2f
@@ -53,9 +45,9 @@ force_subclients=bus,caddr,saddr,saddr
Description
Description
-----------
-----------


This driver implements support for the Winbond W83627HF, W83627THF, W83781D,
This driver implements support for the Winbond W83781D, W83782D, W83783S,
W83782D, W83783S, W83697HF chips, and the Asus AS99127F chips. We will refer
W83627HF chips, and the Asus AS99127F chips. We will refer to them
to them collectively as W8378* chips.
collectively as W8378* chips.


There is quite some difference between these chips, but they are similar
There is quite some difference between these chips, but they are similar
enough that it was sensible to put them together in one driver.
enough that it was sensible to put them together in one driver.
@@ -67,10 +59,8 @@ as99127f 7 3 0 3 0x31 0x12c3 yes no
as99127f rev.2 (type_name = as99127f)       0x31    0x5ca3  yes     no
as99127f rev.2 (type_name = as99127f)       0x31    0x5ca3  yes     no
w83781d     7       3       0       3       0x10-1  0x5ca3  yes     yes
w83781d     7       3       0       3       0x10-1  0x5ca3  yes     yes
w83627hf    9       3       2       3       0x21    0x5ca3  yes     yes(LPC)
w83627hf    9       3       2       3       0x21    0x5ca3  yes     yes(LPC)
w83627thf   9       3       2       3       0x90    0x5ca3  no      yes(LPC)
w83782d     9       3       2-4     3       0x30    0x5ca3  yes     yes
w83782d     9       3       2-4     3       0x30    0x5ca3  yes     yes
w83783s     5-6     3       2       1-2     0x40    0x5ca3  yes     no
w83783s     5-6     3       2       1-2     0x40    0x5ca3  yes     no
w83697hf    8       2       2       2       0x60    0x5ca3  no      yes(LPC)


Detection of these chips can sometimes be foiled because they can be in
Detection of these chips can sometimes be foiled because they can be in
an internal state that allows no clean access. If you know the address
an internal state that allows no clean access. If you know the address
+21 −51
Original line number Original line Diff line number Diff line
@@ -28,10 +28,8 @@
    as99127f rev.2 (type_name = as99127f)	0x31	0x5ca3	yes	no
    as99127f rev.2 (type_name = as99127f)	0x31	0x5ca3	yes	no
    w83781d	7	3	0	3	0x10-1	0x5ca3	yes	yes
    w83781d	7	3	0	3	0x10-1	0x5ca3	yes	yes
    w83627hf	9	3	2	3	0x21	0x5ca3	yes	yes(LPC)
    w83627hf	9	3	2	3	0x21	0x5ca3	yes	yes(LPC)
    w83627thf	9	3	2	3	0x90	0x5ca3	no	yes(LPC)
    w83782d	9	3	2-4	3	0x30	0x5ca3	yes	yes
    w83782d	9	3	2-4	3	0x30	0x5ca3	yes	yes
    w83783s	5-6	3	2	1-2	0x40	0x5ca3	yes	no
    w83783s	5-6	3	2	1-2	0x40	0x5ca3	yes	no
    w83697hf	8	2	2	2	0x60	0x5ca3	no	yes(LPC)


*/
*/


@@ -52,7 +50,7 @@ static unsigned short normal_i2c[] = { 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
static unsigned int normal_isa[] = { 0x0290, I2C_CLIENT_ISA_END };
static unsigned int normal_isa[] = { 0x0290, I2C_CLIENT_ISA_END };


/* Insmod parameters */
/* Insmod parameters */
SENSORS_INSMOD_6(w83781d, w83782d, w83783s, w83627hf, as99127f, w83697hf);
SENSORS_INSMOD_5(w83781d, w83782d, w83783s, w83627hf, as99127f);
I2C_CLIENT_MODULE_PARM(force_subclients, "List of subclient addresses: "
I2C_CLIENT_MODULE_PARM(force_subclients, "List of subclient addresses: "
		    "{bus, clientaddr, subclientaddr1, subclientaddr2}");
		    "{bus, clientaddr, subclientaddr1, subclientaddr2}");


@@ -998,13 +996,6 @@ w83781d_detect(struct i2c_adapter *adapter, int address, int kind)
		err = -EINVAL;
		err = -EINVAL;
		goto ERROR0;
		goto ERROR0;
	}
	}
	if (!is_isa && kind == w83697hf) {
		dev_err(&adapter->dev,
			"Cannot force ISA-only chip for I2C address 0x%02x.\n",
			address);
		err = -EINVAL;
		goto ERROR0;
	}
	
	
	if (is_isa)
	if (is_isa)
		if (!request_region(address, W83781D_EXTENT,
		if (!request_region(address, W83781D_EXTENT,
@@ -1137,12 +1128,10 @@ w83781d_detect(struct i2c_adapter *adapter, int address, int kind)
		else if (val1 == 0x40 && vendid == winbond && !is_isa
		else if (val1 == 0x40 && vendid == winbond && !is_isa
				&& address == 0x2d)
				&& address == 0x2d)
			kind = w83783s;
			kind = w83783s;
		else if ((val1 == 0x21 || val1 == 0x90) && vendid == winbond)
		else if (val1 == 0x21 && vendid == winbond)
			kind = w83627hf;
			kind = w83627hf;
		else if (val1 == 0x31 && !is_isa && address >= 0x28)
		else if (val1 == 0x31 && !is_isa && address >= 0x28)
			kind = as99127f;
			kind = as99127f;
		else if (val1 == 0x60 && vendid == winbond && is_isa)
			kind = w83697hf;
		else {
		else {
			if (kind == 0)
			if (kind == 0)
				dev_warn(&new_client->dev, "Ignoring 'force' "
				dev_warn(&new_client->dev, "Ignoring 'force' "
@@ -1161,14 +1150,9 @@ w83781d_detect(struct i2c_adapter *adapter, int address, int kind)
	} else if (kind == w83783s) {
	} else if (kind == w83783s) {
		client_name = "w83783s";
		client_name = "w83783s";
	} else if (kind == w83627hf) {
	} else if (kind == w83627hf) {
		if (val1 == 0x90)
			client_name = "w83627thf";
		else
		client_name = "w83627hf";
		client_name = "w83627hf";
	} else if (kind == as99127f) {
	} else if (kind == as99127f) {
		client_name = "as99127f";
		client_name = "as99127f";
	} else if (kind == w83697hf) {
		client_name = "w83697hf";
	}
	}


	/* Fill in the remaining client fields and put into the global list */
	/* Fill in the remaining client fields and put into the global list */
@@ -1206,7 +1190,7 @@ w83781d_detect(struct i2c_adapter *adapter, int address, int kind)


	/* Register sysfs hooks */
	/* Register sysfs hooks */
	device_create_file_in(new_client, 0);
	device_create_file_in(new_client, 0);
	if (kind != w83783s && kind != w83697hf)
	if (kind != w83783s)
		device_create_file_in(new_client, 1);
		device_create_file_in(new_client, 1);
	device_create_file_in(new_client, 2);
	device_create_file_in(new_client, 2);
	device_create_file_in(new_client, 3);
	device_create_file_in(new_client, 3);
@@ -1220,23 +1204,18 @@ w83781d_detect(struct i2c_adapter *adapter, int address, int kind)


	device_create_file_fan(new_client, 1);
	device_create_file_fan(new_client, 1);
	device_create_file_fan(new_client, 2);
	device_create_file_fan(new_client, 2);
	if (kind != w83697hf)
	device_create_file_fan(new_client, 3);
	device_create_file_fan(new_client, 3);


	device_create_file_temp(new_client, 1);
	device_create_file_temp(new_client, 1);
	device_create_file_temp(new_client, 2);
	device_create_file_temp(new_client, 2);
	if (kind != w83783s && kind != w83697hf)
	if (kind != w83783s)
		device_create_file_temp(new_client, 3);
		device_create_file_temp(new_client, 3);


	if (kind != w83697hf)
	device_create_file_vid(new_client);
	device_create_file_vid(new_client);

	if (kind != w83697hf)
	device_create_file_vrm(new_client);
	device_create_file_vrm(new_client);


	device_create_file_fan_div(new_client, 1);
	device_create_file_fan_div(new_client, 1);
	device_create_file_fan_div(new_client, 2);
	device_create_file_fan_div(new_client, 2);
	if (kind != w83697hf)
	device_create_file_fan_div(new_client, 3);
	device_create_file_fan_div(new_client, 3);


	device_create_file_alarms(new_client);
	device_create_file_alarms(new_client);
@@ -1256,7 +1235,7 @@ w83781d_detect(struct i2c_adapter *adapter, int address, int kind)
	if (kind != as99127f && kind != w83781d) {
	if (kind != as99127f && kind != w83781d) {
		device_create_file_sensor(new_client, 1);
		device_create_file_sensor(new_client, 1);
		device_create_file_sensor(new_client, 2);
		device_create_file_sensor(new_client, 2);
		if (kind != w83783s && kind != w83697hf)
		if (kind != w83783s)
			device_create_file_sensor(new_client, 3);
			device_create_file_sensor(new_client, 3);
	}
	}


@@ -1479,7 +1458,7 @@ w83781d_init_client(struct i2c_client *client)
				else
				else
					data->sens[i - 1] = 2;
					data->sens[i - 1] = 2;
			}
			}
			if ((type == w83783s || type == w83697hf) && (i == 2))
			if (type == w83783s && i == 2)
				break;
				break;
		}
		}
	}
	}
@@ -1495,7 +1474,7 @@ w83781d_init_client(struct i2c_client *client)
		}
		}


		/* Enable temp3 */
		/* Enable temp3 */
		if (type != w83783s && type != w83697hf) {
		if (type != w83783s) {
			tmp = w83781d_read_value(client,
			tmp = w83781d_read_value(client,
				W83781D_REG_TEMP3_CONFIG);
				W83781D_REG_TEMP3_CONFIG);
			if (tmp & 0x01) {
			if (tmp & 0x01) {
@@ -1536,8 +1515,7 @@ static struct w83781d_data *w83781d_update_device(struct device *dev)
		dev_dbg(dev, "Starting device update\n");
		dev_dbg(dev, "Starting device update\n");


		for (i = 0; i <= 8; i++) {
		for (i = 0; i <= 8; i++) {
			if ((data->type == w83783s || data->type == w83697hf)
			if (data->type == w83783s && i == 1)
			    && (i == 1))
				continue;	/* 783S has no in1 */
				continue;	/* 783S has no in1 */
			data->in[i] =
			data->in[i] =
			    w83781d_read_value(client, W83781D_REG_IN(i));
			    w83781d_read_value(client, W83781D_REG_IN(i));
@@ -1545,7 +1523,7 @@ static struct w83781d_data *w83781d_update_device(struct device *dev)
			    w83781d_read_value(client, W83781D_REG_IN_MIN(i));
			    w83781d_read_value(client, W83781D_REG_IN_MIN(i));
			data->in_max[i] =
			data->in_max[i] =
			    w83781d_read_value(client, W83781D_REG_IN_MAX(i));
			    w83781d_read_value(client, W83781D_REG_IN_MAX(i));
			if ((data->type != w83782d) && (data->type != w83697hf)
			if ((data->type != w83782d)
			    && (data->type != w83627hf) && (i == 6))
			    && (data->type != w83627hf) && (i == 6))
				break;
				break;
		}
		}
@@ -1581,7 +1559,7 @@ static struct w83781d_data *w83781d_update_device(struct device *dev)
		    w83781d_read_value(client, W83781D_REG_TEMP_OVER(2));
		    w83781d_read_value(client, W83781D_REG_TEMP_OVER(2));
		data->temp_max_hyst_add[0] =
		data->temp_max_hyst_add[0] =
		    w83781d_read_value(client, W83781D_REG_TEMP_HYST(2));
		    w83781d_read_value(client, W83781D_REG_TEMP_HYST(2));
		if (data->type != w83783s && data->type != w83697hf) {
		if (data->type != w83783s) {
			data->temp_add[1] =
			data->temp_add[1] =
			    w83781d_read_value(client, W83781D_REG_TEMP(3));
			    w83781d_read_value(client, W83781D_REG_TEMP(3));
			data->temp_max_add[1] =
			data->temp_max_add[1] =
@@ -1592,25 +1570,17 @@ static struct w83781d_data *w83781d_update_device(struct device *dev)
					       W83781D_REG_TEMP_HYST(3));
					       W83781D_REG_TEMP_HYST(3));
		}
		}
		i = w83781d_read_value(client, W83781D_REG_VID_FANDIV);
		i = w83781d_read_value(client, W83781D_REG_VID_FANDIV);
		if (data->type != w83697hf) {
		data->vid = i & 0x0f;
		data->vid = i & 0x0f;
			data->vid |=
		data->vid |= (w83781d_read_value(client,
			    (w83781d_read_value(client, W83781D_REG_CHIPID) &
					W83781D_REG_CHIPID) & 0x01) << 4;
			     0x01)
			    << 4;
		}
		data->fan_div[0] = (i >> 4) & 0x03;
		data->fan_div[0] = (i >> 4) & 0x03;
		data->fan_div[1] = (i >> 6) & 0x03;
		data->fan_div[1] = (i >> 6) & 0x03;
		if (data->type != w83697hf) {
		data->fan_div[2] = (w83781d_read_value(client,
		data->fan_div[2] = (w83781d_read_value(client,
							       W83781D_REG_PIN)
					W83781D_REG_PIN) >> 6) & 0x03;
					    >> 6) & 0x03;
		}
		if ((data->type != w83781d) && (data->type != as99127f)) {
		if ((data->type != w83781d) && (data->type != as99127f)) {
			i = w83781d_read_value(client, W83781D_REG_VBAT);
			i = w83781d_read_value(client, W83781D_REG_VBAT);
			data->fan_div[0] |= (i >> 3) & 0x04;
			data->fan_div[0] |= (i >> 3) & 0x04;
			data->fan_div[1] |= (i >> 4) & 0x04;
			data->fan_div[1] |= (i >> 4) & 0x04;
			if (data->type != w83697hf)
			data->fan_div[2] |= (i >> 5) & 0x04;
			data->fan_div[2] |= (i >> 5) & 0x04;
		}
		}
		data->alarms =
		data->alarms =