[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug #741663 - Possible patch for therm_windtunnel driver



It seems the device names have changed for the fan and thermostat i2c devices.

This patch addresses 3 issues with the therm_windtunnel driver.

1. Fix the device names
2. Remove the deprecated attach_adapter method of loading the driver
3. Expose the fan level setting to /sys/devices/temperature (along with temperatures)

I am not a kernel developer so have no clue as to how to get this patch incorporated into the kernel tree. Hope someone on here can hall.

Regards
Bryan

--- ../therm_windtunnel.c.orig	2014-03-21 09:18:31.608173741 +1300
+++ therm_windtunnel.c	2014-03-21 09:55:39.165486409 +1300
@@ -107,8 +107,15 @@ show_case_temperature( struct device *de
 	return sprintf(buf, "%d.%d\n", x.casetemp>>8, (x.casetemp & 255)*10/256 );
 }
 
+static ssize_t
+show_fan_level( struct device *dev, struct device_attribute *attr, char *buf )
+{
+	return sprintf(buf, "%d\n", 11 - x.fan_level );
+}
+
 static DEVICE_ATTR(cpu_temperature, S_IRUGO, show_cpu_temperature, NULL );
 static DEVICE_ATTR(case_temperature, S_IRUGO, show_case_temperature, NULL );
+static DEVICE_ATTR(fan_level, S_IRUGO, show_fan_level, NULL );
 
 
 
@@ -254,6 +261,7 @@ setup_hardware( void )
 
 	err = device_create_file( &x.of_dev->dev, &dev_attr_cpu_temperature );
 	err |= device_create_file( &x.of_dev->dev, &dev_attr_case_temperature );
+	err |= device_create_file( &x.of_dev->dev, &dev_attr_fan_level );
 	if (err)
 		printk(KERN_WARNING
 			"Failed to create temperature attribute file(s).\n");
@@ -264,6 +272,7 @@ restore_regs( void )
 {
 	device_remove_file( &x.of_dev->dev, &dev_attr_cpu_temperature );
 	device_remove_file( &x.of_dev->dev, &dev_attr_case_temperature );
+	device_remove_file( &x.of_dev->dev, &dev_attr_fan_level );
 
 	write_reg( x.fan, 0x01, x.r1, 1 );
 	write_reg( x.fan, 0x20, x.r20, 1 );
@@ -301,40 +310,6 @@ static int control_loop(void *dummy)
 /************************************************************************/
 
 static int
-do_attach( struct i2c_adapter *adapter )
-{
-	/* scan 0x48-0x4f (DS1775) and 0x2c-2x2f (ADM1030) */
-	static const unsigned short scan_ds1775[] = {
-		0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
-		I2C_CLIENT_END
-	};
-	static const unsigned short scan_adm1030[] = {
-		0x2c, 0x2d, 0x2e, 0x2f,
-		I2C_CLIENT_END
-	};
-
-	if( strncmp(adapter->name, "uni-n", 5) )
-		return 0;
-
-	if( !x.running ) {
-		struct i2c_board_info info;
-
-		memset(&info, 0, sizeof(struct i2c_board_info));
-		strlcpy(info.type, "therm_ds1775", I2C_NAME_SIZE);
-		i2c_new_probed_device(adapter, &info, scan_ds1775, NULL);
-
-		strlcpy(info.type, "therm_adm1030", I2C_NAME_SIZE);
-		i2c_new_probed_device(adapter, &info, scan_adm1030, NULL);
-
-		if( x.thermostat && x.fan ) {
-			x.running = 1;
-			x.poll_task = kthread_run(control_loop, NULL, "g4fand");
-		}
-	}
-	return 0;
-}
-
-static int
 do_remove(struct i2c_client *client)
 {
 	if (x.running) {
@@ -404,8 +379,8 @@ out:
 enum chip { ds1775, adm1030 };
 
 static const struct i2c_device_id therm_windtunnel_id[] = {
-	{ "therm_ds1775", ds1775 },
-	{ "therm_adm1030", adm1030 },
+	{ "MAC,ds1775", ds1775 },
+	{ "MAC,adm1030", adm1030 },
 	{ }
 };
 
@@ -420,9 +395,15 @@ do_probe(struct i2c_client *cl, const st
 
 	switch (id->driver_data) {
 	case adm1030:
-		return attach_fan( cl );
+		attach_fan( cl );
+		break;
 	case ds1775:
-		return attach_thermostat(cl);
+		attach_thermostat(cl);
+		break;
+	}
+	if( !x.running && x.thermostat && x.fan ) {
+		x.running = 1;
+		x.poll_task = kthread_run(control_loop, NULL, "g4fand");
 	}
 	return 0;
 }
@@ -431,7 +412,6 @@ static struct i2c_driver g4fan_driver =
 	.driver = {
 		.name	= "therm_windtunnel",
 	},
-	.attach_adapter = do_attach,
 	.probe		= do_probe,
 	.remove		= do_remove,
 	.id_table	= therm_windtunnel_id,

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail


Reply to: