[lm-sensors] W83627EHF driver enhancements

David Hubbard david.c.hubbard at gmail.com
Wed Apr 12 03:04:36 CEST 2006


Hi Rudolf,

> You need the file I sent to you plus the fancrt patch on the top of it. This will create
> the file with all alarms voltages EHF driver, then when fancrt is applied you have the
> current base to start on it.
>
> Do your changes and when done just diff to same file but with your changes (so simply the ehf driver that I sent to you plus the fancrt patch)
>
> > I'll send a patch that has these things:
> > 1. switch DC 0 PWM 1
> > 2. new RPM cruise modes
>
> Good that is what I want to see.

Okay, first patch:
1. changes W83627EHF_PWM_ENALE_SHIFT to W83627EHF_PWM_ENABLE_SHIFT
2. changes to 0->DC and 1->PWM

Second patch:
1. Fix pwmN_enable = 0 (disabled) mode.
2. Comment pwmN_enable = 1 (manual) and pwmN_enable = 2 (thermal
cruise or SmartFan I)

And the regression test script (no changes) works with this new patch.
Please look these over. I'm getting the other patches ready.

Thanks,
David
-------------- next part --------------
Change W83627EHF_PWM_ENALE_SHIFT to W83627EHF_PWM_ENABLE_SHIFT
pwm_mode = 0->DC mode->1 stored in register
pwm_mode = 1->PWM mode->0 stored in register

diff -ur linux-2.6.16-rc5-mm/drivers/hwmon/w83627ehf.c linux-2.6.16-rc5-mm/drivers/hwmon/w83627ehf.c
--- linux-2.6.16-rc5-mm-rudolf/drivers/hwmon/w83627ehf.c	2006-03-23 22:02:09.000000000 -0800
+++ linux-2.6.16-rc5-mm/drivers/hwmon/w83627ehf.c	2006-04-11 17:12:31.000000000 -0700
@@ -160,7 +160,7 @@
 static const u8 W83627EHF_PWM_MODE_USER_MAP[] = { 0, 0, 1, 3 };
 static const u8 W83627EHF_PWM_MODE_CHIP_MAP[] = { 1, 2, 4, 3 };
 static const u8 W83627EHF_PWM_MODE_SHIFT[] = { 0, 1, 0, 6 };
-static const u8 W83627EHF_PWM_ENALE_SHIFT[] = { 2, 4, 1, 4 };
+static const u8 W83627EHF_PWM_ENABLE_SHIFT[] = { 2, 4, 1, 4 };
 
 /* FAN Duty Cycle, be used to control */
 static const u8 W83627EHF_REG_PWM[] = { 0x01, 0x03, 0x11, 0x61 };
@@ -265,7 +265,12 @@
 	s16 temp_max_hyst[2];
 	u32 alarms;
  
- 	u8 pwm_mode[4]; /* 1 is fan speed cruise */
+	u8 pwm_mode[4]; /* 0->DC variable voltage, 1->PWM variable duty cycle
+			 * Note that this is backward from the datasheet, but
+			 * consistent with the w83792d driver. Hopefully, any
+			 * new drivers which have PWM and DC modes will also
+			 * follow this convention for the sysfs pwmN_mode file.
+			 */
  	u8 pwm_enable[4];
  	u8 pwm[4];
  	u8 target_temp[4];
@@ -475,9 +480,10 @@
 				tmp = w83627ehf_read_value(client,
 						W83627EHF_REG_PWM_ENABLE[i]);
 			data->pwm_mode[i] =
-				(tmp >> W83627EHF_PWM_MODE_SHIFT[i]) & 1;
+				((tmp >> W83627EHF_PWM_MODE_SHIFT[i]) & 1)
+				?0:1;
 			data->pwm_enable[i] = W83627EHF_PWM_MODE_CHIP_MAP[
-						(tmp >> W83627EHF_PWM_ENALE_SHIFT[i]) & 3];
+						(tmp >> W83627EHF_PWM_ENABLE_SHIFT[i]) & 3];
 			data->pwm[i] = w83627ehf_read_value(client,
 						W83627EHF_REG_PWM[i]);
 			data->fan_min_output[i] = w83627ehf_read_value(client,
@@ -892,7 +898,7 @@
 	if (data->pwm_mode[nr] != val) {
 		data->pwm_mode[nr] = val;
 		reg = (reg & ~(1 << W83627EHF_PWM_MODE_SHIFT[nr]));
-		if (val)
+		if (!val)
 			reg |= 1 << W83627EHF_PWM_MODE_SHIFT[nr];
 		w83627ehf_write_value(client, W83627EHF_REG_PWM_ENABLE[nr],
 					reg);
@@ -915,8 +921,8 @@
 		if (!val)
 			data->pwm[nr] = 0xff;
 		data->pwm_enable[nr] = val;
-		reg = (reg & ~(11 << W83627EHF_PWM_ENALE_SHIFT[nr]));
-		reg |= W83627EHF_PWM_MODE_USER_MAP[val] << W83627EHF_PWM_ENALE_SHIFT[nr];
+		reg = (reg & ~(11 << W83627EHF_PWM_ENABLE_SHIFT[nr]));
+		reg |= W83627EHF_PWM_MODE_USER_MAP[val] << W83627EHF_PWM_ENABLE_SHIFT[nr];
 		w83627ehf_write_value(client, W83627EHF_REG_PWM_ENABLE[nr],
 					reg);
 	}
@@ -1225,13 +1231,15 @@
 	for (i = 0; i < 10; i++)
 		device_create_file_in(dev, i);
 
-	for (i = 0; i < 5; i++) {
+	for (i = 0; i < 5; i++)
 		if (data->has_fan & (1 << i))
 			device_create_file_fan(dev, i);
-//this condition needs to be fixed
-  		if (i != 4)
-  			device_create_file_pwm(dev, i);
+
+	for (i = 0; i < 4; i++) {
+		device_create_file_pwm(dev, i);
+		data->pwm_mode[i] = 1; /* initialize in PWM mode */
 	}
+
 	for (i = 0; i < ARRAY_SIZE(sda_temp); i++)
 		device_create_file(dev, &sda_temp[i].dev_attr);
 


-------------- next part --------------
pwmN_enable = 0 (disabled) locks pwmN at 255
pwmN_enable = 1 (manual) commented
pwmN_enable = 2 (thermal cruise or SmartFan I) commented

diff -ur linux-2.6.16-rc5-mm/drivers/hwmon/w83627ehf.c linux-2.6.16-rc5-mm/drivers/hwmon/w83627ehf.c
--- linux-2.6.16-rc5-mm-01/drivers/hwmon/w83627ehf.c	2006-04-11 17:45:54.000000000 -0700
+++ linux-2.6.16-rc5-mm/drivers/hwmon/w83627ehf.c	2006-04-11 18:30:11.000000000 -0700
@@ -157,8 +157,6 @@
 };
 
 /* maps the user modes to chip modes */
-static const u8 W83627EHF_PWM_MODE_USER_MAP[] = { 0, 0, 1, 3 };
-static const u8 W83627EHF_PWM_MODE_CHIP_MAP[] = { 1, 2, 4, 3 };
 static const u8 W83627EHF_PWM_MODE_SHIFT[] = { 0, 1, 0, 6 };
 static const u8 W83627EHF_PWM_ENABLE_SHIFT[] = { 2, 4, 1, 4 };
 
@@ -271,7 +269,10 @@
 			 * new drivers which have PWM and DC modes will also
 			 * follow this convention for the sysfs pwmN_mode file.
 			 */
- 	u8 pwm_enable[4];
+	u8 pwm_enable[4]; /* 0->disabled
+			   * 1->manual
+			   * 2->thermal cruise (also called SmartFan I)
+			   */
  	u8 pwm[4];
  	u8 target_temp[4];
  	u8 tolerance[4];
@@ -482,8 +483,11 @@
 			data->pwm_mode[i] =
 				((tmp >> W83627EHF_PWM_MODE_SHIFT[i]) & 1)
 				?0:1;
-			data->pwm_enable[i] = W83627EHF_PWM_MODE_CHIP_MAP[
-						(tmp >> W83627EHF_PWM_ENABLE_SHIFT[i]) & 3];
+			if (data->pwm_enable[i] != 0 ||
+			    ((tmp >> W83627EHF_PWM_ENABLE_SHIFT[i]) & 3) != 0)
+				data->pwm_enable[i] = 
+					((tmp >> W83627EHF_PWM_ENABLE_SHIFT[i])
+						& 3)+1;
 			data->pwm[i] = w83627ehf_read_value(client,
 						W83627EHF_REG_PWM[i]);
 			data->fan_min_output[i] = w83627ehf_read_value(client,
@@ -907,42 +911,47 @@
 }
 
 static ssize_t
-store_pwm_enable(struct device *dev, struct device_attribute *attr,
+store_pwm(struct device *dev, struct device_attribute *attr,
 			const char *buf, size_t count)
 {
 	struct w83627ehf_data *data = w83627ehf_update_device(dev);
 	struct i2c_client *client = to_i2c_client(dev);
 	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 	int nr = sensor_attr->index;
-	u32 val = SENSORS_LIMIT(simple_strtoul(buf, NULL, 10), 0, 3);
-	u16 reg = w83627ehf_read_value(client, W83627EHF_REG_PWM_ENABLE[nr]);
+	u32 val = SENSORS_LIMIT(simple_strtoul(buf, NULL, 10), 0, 255);
 
-	if (data->pwm_enable[nr] != val) {
-		if (!val)
-			data->pwm[nr] = 0xff;
-		data->pwm_enable[nr] = val;
-		reg = (reg & ~(11 << W83627EHF_PWM_ENABLE_SHIFT[nr]));
-		reg |= W83627EHF_PWM_MODE_USER_MAP[val] << W83627EHF_PWM_ENABLE_SHIFT[nr];
-		w83627ehf_write_value(client, W83627EHF_REG_PWM_ENABLE[nr],
-					reg);
+	if (data->pwm_enable[nr] != 0 && data->pwm[nr] != val) {
+		data->pwm[nr] = val;
+		w83627ehf_write_value(client, W83627EHF_REG_PWM[nr],
+					val);
 	}
 	return count;
 }
 
 static ssize_t
-store_pwm(struct device *dev, struct device_attribute *attr,
+store_pwm_enable(struct device *dev, struct device_attribute *attr,
 			const char *buf, size_t count)
 {
 	struct w83627ehf_data *data = w83627ehf_update_device(dev);
 	struct i2c_client *client = to_i2c_client(dev);
 	struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
 	int nr = sensor_attr->index;
-	u32 val = SENSORS_LIMIT(simple_strtoul(buf, NULL, 10), 0, 255);
+	u32 val = SENSORS_LIMIT(simple_strtoul(buf, NULL, 10), 0, 3);
+	u16 reg = w83627ehf_read_value(client, W83627EHF_REG_PWM_ENABLE[nr]);
 
-	if (data->pwm[nr] != val) {
-		data->pwm[nr] = val;
-		w83627ehf_write_value(client, W83627EHF_REG_PWM[nr],
-					val);
+	if (data->pwm_enable[nr] != val) {
+		if (!val) {
+			store_pwm(dev, attr, "255", 3);
+			data->pwm_enable[nr] = val;
+		}
+		else {
+			data->pwm_enable[nr] = val;
+			val--;
+		}
+		reg = (reg & ~(11 << W83627EHF_PWM_ENABLE_SHIFT[nr]));
+		reg |= val << W83627EHF_PWM_ENABLE_SHIFT[nr];
+		w83627ehf_write_value(client, W83627EHF_REG_PWM_ENABLE[nr],
+					reg);
 	}
 	return count;
 }

-------------- next part --------------
A non-text attachment was scrubbed...
Name: w83627ehf_regression.sh
Type: application/x-sh
Size: 14767 bytes
Desc: not available
URL: <http://lists.lm-sensors.org/pipermail/lm-sensors/attachments/20060411/47706ed4/attachment.sh>


More information about the lm-sensors mailing list