All of lore.kernel.org
 help / color / mirror / Atom feed
From: mhoffman@lightlink.com (Mark M. Hoffman)
To: lm-sensors@vger.kernel.org
Subject: [lm-sensors] Re: [PATCH 2.6.12-rc5-mm1 3/3] i2c: modify sensors
Date: Thu, 02 Jun 2005 05:38:23 +0000	[thread overview]
Message-ID: <20050602033727.GD4906@jupiter.solarsys.private> (raw)


This patch modifies sensors chip drivers to make use of the new
sysfs class "hwmon".

Signed-off-by: Mark M. Hoffman <mhoffman@lightlink.com>

Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/adm1021.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/adm1021.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/adm1021.c
@@ -25,6 +25,8 @@
 #include <linux/jiffies.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 
 
 /* Addresses to scan */
@@ -37,6 +39,8 @@ static unsigned int normal_isa[] = { I2C
 /* Insmod parameters */
 SENSORS_INSMOD_8(adm1021, adm1023, max1617, max1617a, thmc10, lm84, gl523sm, mc1066);
 
+static int id;	/* increment once for every chip found */
+
 /* adm1021 constants specified below */
 
 /* The adm1021 registers */
@@ -295,6 +299,13 @@ static int adm1021_detect(struct i2c_ada
 		adm1021_init_client(new_client);
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto error2;
+	}
+
 	device_create_file(&new_client->dev, &dev_attr_temp1_max);
 	device_create_file(&new_client->dev, &dev_attr_temp1_min);
 	device_create_file(&new_client->dev, &dev_attr_temp1_input);
@@ -305,6 +316,8 @@ static int adm1021_detect(struct i2c_ada
 
 	return 0;
 
+error2:
+	i2c_detach_client(new_client);
 error1:
 	kfree(data);
 error0:
@@ -324,6 +337,8 @@ static int adm1021_detach_client(struct 
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev, "Client deregistration failed, client not detached.\n");
 		return err;
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/adm1025.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/adm1025.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/adm1025.c
@@ -52,6 +52,8 @@
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
 #include <linux/i2c-vid.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 
 /*
  * Addresses to scan
@@ -68,6 +70,8 @@ static unsigned int normal_isa[] = { I2C
 
 SENSORS_INSMOD_2(adm1025, ne1619);
 
+static int id;	/* increment once for every chip found */
+
 /*
  * The ADM1025 registers
  */
@@ -416,6 +420,13 @@ static int adm1025_detect(struct i2c_ada
 	adm1025_init_client(new_client);
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto exit_detach;
+	}
+
 	device_create_file(&new_client->dev, &dev_attr_in0_input);
 	device_create_file(&new_client->dev, &dev_attr_in1_input);
 	device_create_file(&new_client->dev, &dev_attr_in2_input);
@@ -452,6 +463,8 @@ static int adm1025_detect(struct i2c_ada
 
 	return 0;
 
+exit_detach:
+	i2c_detach_client(new_client);
 exit_free:
 	kfree(data);
 exit:
@@ -504,6 +517,8 @@ static int adm1025_detach_client(struct 
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev, "Client deregistration failed, "
 			"client not detached.\n");
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/adm1026.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/adm1026.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/adm1026.c
@@ -31,6 +31,8 @@
 #include <linux/i2c-sensor.h>
 #include <linux/i2c-sysfs.h>
 #include <linux/i2c-vid.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 
 /* Addresses to scan */
 static unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, I2C_CLIENT_END };
@@ -62,6 +64,8 @@ MODULE_PARM_DESC(gpio_normal,"List of GP
 module_param_array(gpio_fan,int,NULL,0);
 MODULE_PARM_DESC(gpio_fan,"List of GPIO pins (0-7) to program as fan tachs");
 
+static int id;	/* increment once for every chip found */
+
 /* Many ADM1026 constants specified below */
 
 /* The ADM1026 registers */
@@ -324,6 +328,7 @@ int adm1026_attach_adapter(struct i2c_ad
 
 int adm1026_detach_client(struct i2c_client *client)
 {
+	hwmon_device_unregister(client->class_dev);
 	i2c_detach_client(client);
 	kfree(client);
 	return 0;
@@ -1555,6 +1560,13 @@ int adm1026_detect(struct i2c_adapter *a
 	adm1026_init_client(new_client);
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto exitdetach;
+	}
+
 	device_create_file(&new_client->dev, &sensor_dev_attr_in0_input.dev_attr);
 	device_create_file(&new_client->dev, &sensor_dev_attr_in0_max.dev_attr);
 	device_create_file(&new_client->dev, &sensor_dev_attr_in0_min.dev_attr);
@@ -1690,6 +1702,8 @@ int adm1026_detect(struct i2c_adapter *a
 	return 0;
 
 	/* Error out and cleanup code */
+exitdetach:
+	i2c_detach_client(new_client);
 exitfree:
 	kfree(new_client);
 exit:
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/adm1031.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/adm1031.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/adm1031.c
@@ -27,6 +27,8 @@
 #include <linux/jiffies.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 
 /* Following macros takes channel parameter starting from 0 to 2 */
 #define ADM1031_REG_FAN_SPEED(nr)	(0x08 + (nr))
@@ -64,6 +66,8 @@ static unsigned int normal_isa[] = { I2C
 /* Insmod parameters */
 SENSORS_INSMOD_2(adm1030, adm1031);
 
+static int id;	/* increment once for every chip found */
+
 typedef u8 auto_chan_table_t[8][2];
 
 /* Each client has this additional data */
@@ -788,6 +792,13 @@ static int adm1031_detect(struct i2c_ada
 	adm1031_init_client(new_client);
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto exit_detach;
+	}
+
 	device_create_file(&new_client->dev, &dev_attr_fan1_input);
 	device_create_file(&new_client->dev, &dev_attr_fan1_div);
 	device_create_file(&new_client->dev, &dev_attr_fan1_min);
@@ -833,6 +844,8 @@ static int adm1031_detect(struct i2c_ada
 
 	return 0;
 
+exit_detach:
+	i2c_detach_client(new_client);
 exit_free:
 	kfree(new_client);
 exit:
@@ -842,6 +855,8 @@ exit:
 static int adm1031_detach_client(struct i2c_client *client)
 {
 	int ret;
+
+	hwmon_device_unregister(client->class_dev);
 	if ((ret = i2c_detach_client(client)) != 0) {
 		return ret;
 	}
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/adm9240.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/adm9240.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/adm9240.c
@@ -47,6 +47,8 @@
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
 #include <linux/i2c-vid.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 
 /* Addresses to scan */
 static unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, 0x2f,
@@ -57,6 +59,8 @@ static unsigned int normal_isa[] = { I2C
 /* Insmod parameters */
 SENSORS_INSMOD_3(adm9240, ds1780, lm81);
 
+static int id;	/* increment once for every chip found */
+
 /* ADM9240 registers */
 #define ADM9240_REG_MAN_ID		0x3e
 #define ADM9240_REG_DIE_REV		0x3f
@@ -582,6 +586,13 @@ static int adm9240_detect(struct i2c_ada
 	adm9240_init_client(new_client);
 
 	/* populate sysfs filesystem */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto exit_detach;
+	}
+
 	device_create_file(&new_client->dev, &dev_attr_in0_input);
 	device_create_file(&new_client->dev, &dev_attr_in0_min);
 	device_create_file(&new_client->dev, &dev_attr_in0_max);
@@ -615,6 +626,9 @@ static int adm9240_detect(struct i2c_ada
 	device_create_file(&new_client->dev, &dev_attr_cpu0_vid);
 
 	return 0;
+
+exit_detach:
+	i2c_detach_client(new_client);
 exit_free:
 	kfree(new_client);
 exit:
@@ -632,6 +646,8 @@ static int adm9240_detach_client(struct 
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev, "Client deregistration failed, "
 				"client not detached.\n");
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/asb100.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/asb100.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/asb100.c
@@ -41,6 +41,8 @@
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
 #include <linux/i2c-vid.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 #include <linux/init.h>
 #include <linux/jiffies.h>
 #include "lm75.h"
@@ -62,6 +64,8 @@ SENSORS_INSMOD_1(asb100);
 I2C_CLIENT_MODULE_PARM(force_subclients, "List of subclient addresses: "
 	"{bus, clientaddr, subclientaddr1, subclientaddr2}");
 
+static int id;	/* increment once for every chip found */
+
 /* Voltage IN registers 0-6 */
 #define ASB100_REG_IN(nr)	(0x20 + (nr))
 #define ASB100_REG_IN_MAX(nr)	(0x2b + (nr * 2))
@@ -821,6 +825,13 @@ static int asb100_detect(struct i2c_adap
 	data->fan_min[2] = asb100_read_value(new_client, ASB100_REG_FAN_MIN(2));
 
 	/* Register sysfs hooks */
+        new_client->class_dev = hwmon_device_register(&new_client->dev,
+                "%s-%d", new_client->name, id++);
+        if (IS_ERR(new_client->class_dev)) {
+                err = PTR_ERR(new_client->class_dev);
+                goto ERROR3;
+        }
+
 	device_create_file_in(new_client, 0);
 	device_create_file_in(new_client, 1);
 	device_create_file_in(new_client, 2);
@@ -847,6 +858,10 @@ static int asb100_detect(struct i2c_adap
 
 	return 0;
 
+ERROR3:
+	i2c_detach_client(data->lm75[0]);
+	kfree(data->lm75[1]);
+	kfree(data->lm75[0]);
 ERROR2:
 	i2c_detach_client(new_client);
 ERROR1:
@@ -859,6 +874,8 @@ static int asb100_detach_client(struct i
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev, "client deregistration failed; "
 			"client not detached.\n");
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/ds1621.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/ds1621.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/ds1621.c
@@ -27,6 +27,8 @@
 #include <linux/jiffies.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 #include "lm75.h"
 
 /* Addresses to scan */
@@ -40,6 +42,8 @@ static int polarity = -1;
 module_param(polarity, int, 0);
 MODULE_PARM_DESC(polarity, "Output's polarity: 0 = active high, 1 = active low");
 
+static int id;	/* increment once for every chip found */
+
 /* Many DS1621 constants specified below */
 /* Config register used for detection         */
 /*  7    6    5    4    3    2    1    0      */
@@ -250,6 +254,13 @@ int ds1621_detect(struct i2c_adapter *ad
 	ds1621_init_client(new_client);
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto exit_detach;
+	}
+
 	device_create_file(&new_client->dev, &dev_attr_alarms);
 	device_create_file(&new_client->dev, &dev_attr_temp1_input);
 	device_create_file(&new_client->dev, &dev_attr_temp1_min);
@@ -259,6 +270,8 @@ int ds1621_detect(struct i2c_adapter *ad
 
 /* OK, this is not exactly good programming practice, usually. But it is
    very code-efficient in this case. */
+      exit_detach:
+	i2c_detach_client(new_client);
       exit_free:
 	kfree(data);
       exit:
@@ -269,6 +282,8 @@ static int ds1621_detach_client(struct i
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev, "Client deregistration failed, "
 			"client not detached.\n");
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/fscher.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/fscher.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/fscher.c
@@ -32,6 +32,8 @@
 #include <linux/jiffies.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 
 /*
  * Addresses to scan
@@ -46,6 +48,8 @@ static unsigned int normal_isa[] = { I2C
 
 SENSORS_INSMOD_1(fscher);
 
+static int id;	/* increment once for every chip found */
+
 /*
  * The FSCHER registers
  */
@@ -341,6 +345,13 @@ static int fscher_detect(struct i2c_adap
 	fscher_init_client(new_client);
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto exit_detach;
+	}
+
 	device_create_file_revision(new_client);
 	device_create_file_alarms(new_client);
 	device_create_file_control(new_client);
@@ -360,6 +371,8 @@ static int fscher_detect(struct i2c_adap
 
 	return 0;
 
+exit_detach:
+	i2c_detach_client(new_client);
 exit_free:
 	kfree(data);
 exit:
@@ -370,6 +383,8 @@ static int fscher_detach_client(struct i
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev, "Client deregistration failed, "
 			"client not detached.\n");
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/fscpos.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/fscpos.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/fscpos.c
@@ -35,6 +35,8 @@
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
 #include <linux/init.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 
 /*
  * Addresses to scan
@@ -47,6 +49,8 @@ static unsigned int normal_isa[] = { I2C
  */
 SENSORS_INSMOD_1(fscpos);
 
+static int id;	/* increment once for every chip found */
+
 /*
  * The FSCPOS registers
  */
@@ -495,6 +499,13 @@ int fscpos_detect(struct i2c_adapter *ad
 	dev_info(&new_client->dev, "Found fscpos chip, rev %u\n", data->revision);
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto exit_detach;
+	}
+
 	device_create_file(&new_client->dev, &dev_attr_event);
 	device_create_file(&new_client->dev, &dev_attr_in0_input);
 	device_create_file(&new_client->dev, &dev_attr_in1_input);
@@ -525,6 +536,8 @@ int fscpos_detect(struct i2c_adapter *ad
 
 	return 0;
 
+exit_detach:
+	i2c_detach_client(new_client);
 exit_free:
 	kfree(data);
 exit:
@@ -535,6 +548,8 @@ static int fscpos_detach_client(struct i
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev, "Client deregistration failed, client"
 							" not detached.\n");
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/gl518sm.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/gl518sm.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/gl518sm.c
@@ -42,6 +42,8 @@
 #include <linux/jiffies.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 
 /* Addresses to scan */
 static unsigned short normal_i2c[] = { 0x2c, 0x2d, I2C_CLIENT_END };
@@ -50,6 +52,8 @@ static unsigned int normal_isa[] = { I2C
 /* Insmod parameters */
 SENSORS_INSMOD_2(gl518sm_r00, gl518sm_r80);
 
+static int id;	/* increment once for every chip found */
+
 /* Many GL518 constants specified below */
 
 /* The GL518 registers */
@@ -419,6 +423,13 @@ static int gl518_detect(struct i2c_adapt
 	gl518_init_client((struct i2c_client *) new_client);
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto exit_detach;
+	}
+
 	device_create_file(&new_client->dev, &dev_attr_in0_input);
 	device_create_file(&new_client->dev, &dev_attr_in1_input);
 	device_create_file(&new_client->dev, &dev_attr_in2_input);
@@ -450,6 +461,8 @@ static int gl518_detect(struct i2c_adapt
 /* OK, this is not exactly good programming practice, usually. But it is
    very code-efficient in this case. */
 
+exit_detach:
+	i2c_detach_client(new_client);
 exit_free:
 	kfree(data);
 exit:
@@ -479,6 +492,8 @@ static int gl518_detach_client(struct i2
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev, "Client deregistration failed, "
 			"client not detached.\n");
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/gl520sm.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/gl520sm.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/gl520sm.c
@@ -27,6 +27,8 @@
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
 #include <linux/i2c-vid.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 
 /* Type of the extra sensor */
 static unsigned short extra_sensor_type;
@@ -40,6 +42,8 @@ static unsigned int normal_isa[] = { I2C
 /* Insmod parameters */
 SENSORS_INSMOD_1(gl520sm);
 
+static int id;	/* increment once for each chip found */
+
 /* Many GL520 constants specified below 
 One of the inputs can be configured as either temp or voltage.
 That's why _TEMP2 and _IN4 access the same register 
@@ -570,6 +574,13 @@ static int gl520_detect(struct i2c_adapt
 	gl520_init_client(new_client);
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto exit_detach;
+	}
+
 	device_create_file_vid(new_client, 0);
 
 	device_create_file_in(new_client, 0);
@@ -591,6 +602,8 @@ static int gl520_detect(struct i2c_adapt
 
 	return 0;
 
+exit_detach:
+	i2c_detach_client(new_client);
 exit_free:
 	kfree(data);
 exit:
@@ -640,6 +653,8 @@ static int gl520_detach_client(struct i2
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev, "Client deregistration failed, "
 			"client not detached.\n");
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/it87.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/it87.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/it87.c
@@ -38,9 +38,10 @@
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
 #include <linux/i2c-vid.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 #include <asm/io.h>
 
-
 /* Addresses to scan */
 static unsigned short normal_i2c[] = { 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d,
 					0x2e, 0x2f, I2C_CLIENT_END };
@@ -49,6 +50,8 @@ static unsigned int normal_isa[] = { 0x0
 /* Insmod parameters */
 SENSORS_INSMOD_2(it87, it8712);
 
+static int id;	/* increment once for every chip found */
+
 #define	REG	0x2e	/* The register to read/write */
 #define	DEV	0x07	/* Register: Logical device select */
 #define	VAL	0x2f	/* The value to read/write */
@@ -861,6 +864,13 @@ int it87_detect(struct i2c_adapter *adap
 	it87_init_client(new_client, data);
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto ERROR3;
+	}
+
 	device_create_file(&new_client->dev, &dev_attr_in0_input);
 	device_create_file(&new_client->dev, &dev_attr_in1_input);
 	device_create_file(&new_client->dev, &dev_attr_in2_input);
@@ -925,6 +935,8 @@ int it87_detect(struct i2c_adapter *adap
 
 	return 0;
 
+ERROR3:
+	i2c_detach_client(new_client);
 ERROR2:
 	kfree(data);
 ERROR1:
@@ -938,6 +950,8 @@ static int it87_detach_client(struct i2c
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev,
 			"Client deregistration failed, client not detached.\n");
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/lm63.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/lm63.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/lm63.c
@@ -43,6 +43,8 @@
 #include <linux/jiffies.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 
 /*
  * Addresses to scan
@@ -58,6 +60,8 @@ static unsigned int normal_isa[] = { I2C
 
 SENSORS_INSMOD_1(lm63);
 
+static int id;	/* increment once for each chip found */
+
 /*
  * The LM63 registers
  */
@@ -428,6 +432,13 @@ static int lm63_detect(struct i2c_adapte
 	lm63_init_client(new_client);
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto exit_detach;
+	}
+
 	if (data->config & 0x04) { /* tachometer enabled */
 		device_create_file(&new_client->dev, &dev_attr_fan1_input);
 		device_create_file(&new_client->dev, &dev_attr_fan1_min);
@@ -445,6 +456,8 @@ static int lm63_detect(struct i2c_adapte
 
 	return 0;
 
+exit_detach:
+	i2c_detach_client(new_client);
 exit_free:
 	kfree(data);
 exit:
@@ -490,6 +503,8 @@ static int lm63_detach_client(struct i2c
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev, "Client deregistration failed, "
 			"client not detached\n");
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/lm75.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/lm75.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/lm75.c
@@ -24,6 +24,8 @@
 #include <linux/jiffies.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 #include "lm75.h"
 
 
@@ -35,6 +37,8 @@ static unsigned int normal_isa[] = { I2C
 /* Insmod parameters */
 SENSORS_INSMOD_1(lm75);
 
+static int id;	/* increment once for every chip found */
+
 /* Many LM75 constants specified below */
 
 /* The LM75 registers */
@@ -208,12 +212,21 @@ static int lm75_detect(struct i2c_adapte
 	lm75_init_client(new_client);
 	
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto exit_detach;
+	}
+
 	device_create_file(&new_client->dev, &dev_attr_temp1_max);
 	device_create_file(&new_client->dev, &dev_attr_temp1_max_hyst);
 	device_create_file(&new_client->dev, &dev_attr_temp1_input);
 
 	return 0;
 
+exit_detach:
+	i2c_detach_client(new_client);
 exit_free:
 	kfree(data);
 exit:
@@ -222,6 +235,7 @@ exit:
 
 static int lm75_detach_client(struct i2c_client *client)
 {
+	hwmon_device_unregister(client->class_dev);
 	i2c_detach_client(client);
 	kfree(i2c_get_clientdata(client));
 	return 0;
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/lm77.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/lm77.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/lm77.c
@@ -31,7 +31,8 @@
 #include <linux/jiffies.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
-
+#include <linux/hwmon.h>
+#include <linux/err.h>
 
 /* Addresses to scan */
 static unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b, I2C_CLIENT_END };
@@ -40,6 +41,8 @@ static unsigned int normal_isa[] = { I2C
 /* Insmod parameters */
 SENSORS_INSMOD_1(lm77);
 
+static int id;	/* increment once for every chip found */
+
 /* The LM77 registers */
 #define LM77_REG_TEMP		0x00
 #define LM77_REG_CONF		0x01
@@ -317,6 +320,13 @@ static int lm77_detect(struct i2c_adapte
 	lm77_init_client(new_client);
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto exit_detach;
+	}
+
 	device_create_file(&new_client->dev, &dev_attr_temp1_input);
 	device_create_file(&new_client->dev, &dev_attr_temp1_crit);
 	device_create_file(&new_client->dev, &dev_attr_temp1_min);
@@ -327,6 +337,8 @@ static int lm77_detect(struct i2c_adapte
 	device_create_file(&new_client->dev, &dev_attr_alarms);
 	return 0;
 
+exit_detach:
+	i2c_detach_client(new_client);
 exit_free:
 	kfree(data);
 exit:
@@ -335,6 +347,7 @@ exit:
 
 static int lm77_detach_client(struct i2c_client *client)
 {
+	hwmon_device_unregister(client->class_dev);
 	i2c_detach_client(client);
 	kfree(i2c_get_clientdata(client));
 	return 0;
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/lm78.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/lm78.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/lm78.c
@@ -24,6 +24,8 @@
 #include <linux/jiffies.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 #include <asm/io.h>
 
 /* Addresses to scan */
@@ -36,6 +38,8 @@ static unsigned int normal_isa[] = { 0x0
 /* Insmod parameters */
 SENSORS_INSMOD_3(lm78, lm78j, lm79);
 
+static int id;	/* increment once for every chip found */
+
 /* Many LM78 constants specified below */
 
 /* Length of ISA address segment */
@@ -605,6 +609,13 @@ int lm78_detect(struct i2c_adapter *adap
 	}
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto ERROR3;
+	}
+
 	device_create_file(&new_client->dev, &dev_attr_in0_input);
 	device_create_file(&new_client->dev, &dev_attr_in0_min);
 	device_create_file(&new_client->dev, &dev_attr_in0_max);
@@ -643,6 +654,8 @@ int lm78_detect(struct i2c_adapter *adap
 
 	return 0;
 
+ERROR3:
+	i2c_detach_client(new_client);
 ERROR2:
 	kfree(data);
 ERROR1:
@@ -656,6 +669,8 @@ static int lm78_detach_client(struct i2c
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev,
 		    "Client deregistration failed, client not detached.\n");
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/lm80.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/lm80.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/lm80.c
@@ -27,6 +27,8 @@
 #include <linux/jiffies.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 
 /* Addresses to scan */
 static unsigned short normal_i2c[] = { 0x28, 0x29, 0x2a, 0x2b, 0x2c,
@@ -36,6 +38,8 @@ static unsigned int normal_isa[] = { I2C
 /* Insmod parameters */
 SENSORS_INSMOD_1(lm80);
 
+static int id;	/* increment once for every chip found */
+
 /* Many LM80 constants specified below */
 
 /* The LM80 registers */
@@ -451,6 +455,13 @@ int lm80_detect(struct i2c_adapter *adap
 	data->fan_min[1] = lm80_read_value(new_client, LM80_REG_FAN_MIN(2));
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto error_detach;
+	}
+
 	device_create_file(&new_client->dev, &dev_attr_in0_min);
 	device_create_file(&new_client->dev, &dev_attr_in1_min);
 	device_create_file(&new_client->dev, &dev_attr_in2_min);
@@ -487,6 +498,8 @@ int lm80_detect(struct i2c_adapter *adap
 
 	return 0;
 
+error_detach:
+	i2c_detach_client(new_client);
 error_free:
 	kfree(data);
 exit:
@@ -497,6 +510,8 @@ static int lm80_detach_client(struct i2c
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev, "Client deregistration failed, "
 			"client not detached.\n");
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/lm83.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/lm83.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/lm83.c
@@ -33,6 +33,8 @@
 #include <linux/jiffies.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 
 /*
  * Addresses to scan
@@ -52,6 +54,8 @@ static unsigned int normal_isa[] = { I2C
 
 SENSORS_INSMOD_1(lm83);
 
+static int id;	/* increment once for every chip found */
+
 /*
  * The LM83 registers
  * Manufacturer ID is 0x01 for National Semiconductor.
@@ -322,6 +326,13 @@ static int lm83_detect(struct i2c_adapte
 	 */
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto exit_detach;
+	}
+
 	device_create_file(&new_client->dev, &dev_attr_temp1_input);
 	device_create_file(&new_client->dev, &dev_attr_temp2_input);
 	device_create_file(&new_client->dev, &dev_attr_temp3_input);
@@ -338,6 +349,8 @@ static int lm83_detect(struct i2c_adapte
 
 	return 0;
 
+exit_detach:
+	i2c_detach_client(new_client);
 exit_free:
 	kfree(data);
 exit:
@@ -348,6 +361,8 @@ static int lm83_detach_client(struct i2c
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev,
 		    "Client deregistration failed, client not detached.\n");
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/lm85.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/lm85.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/lm85.c
@@ -30,6 +30,8 @@
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
 #include <linux/i2c-vid.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 
 /* Addresses to scan */
 static unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, I2C_CLIENT_END };
@@ -38,6 +40,8 @@ static unsigned int normal_isa[] = { I2C
 /* Insmod parameters */
 SENSORS_INSMOD_6(lm85b, lm85c, adm1027, adt7463, emc6d100, emc6d102);
 
+static int id;	/* increment once for every chip found */
+
 /* The LM85 registers */
 
 #define	LM85_REG_IN(nr)			(0x20 + (nr))
@@ -1166,6 +1170,13 @@ int lm85_detect(struct i2c_adapter *adap
 	lm85_init_client(new_client);
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto ERROR2;
+	}
+
 	device_create_file(&new_client->dev, &dev_attr_fan1_input);
 	device_create_file(&new_client->dev, &dev_attr_fan2_input);
 	device_create_file(&new_client->dev, &dev_attr_fan3_input);
@@ -1235,6 +1246,8 @@ int lm85_detect(struct i2c_adapter *adap
 	return 0;
 
 	/* Error out and cleanup code */
+    ERROR2:
+	i2c_detach_client(new_client);
     ERROR1:
 	kfree(data);
     ERROR0:
@@ -1243,6 +1256,7 @@ int lm85_detect(struct i2c_adapter *adap
 
 int lm85_detach_client(struct i2c_client *client)
 {
+	hwmon_device_unregister(client->class_dev);
 	i2c_detach_client(client);
 	kfree(i2c_get_clientdata(client));
 	return 0;
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/lm87.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/lm87.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/lm87.c
@@ -59,6 +59,8 @@
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
 #include <linux/i2c-vid.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 
 /*
  * Addresses to scan
@@ -74,6 +76,8 @@ static unsigned int normal_isa[] = { I2C
 
 SENSORS_INSMOD_1(lm87);
 
+static int id;	/* increment once for every chip found */
+
 /*
  * The LM87 registers
  */
@@ -608,6 +612,13 @@ static int lm87_detect(struct i2c_adapte
 	data->in_scale[7] = 1875;
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto exit_detach;
+	}
+
 	device_create_file(&new_client->dev, &dev_attr_in1_input);
 	device_create_file(&new_client->dev, &dev_attr_in1_min);
 	device_create_file(&new_client->dev, &dev_attr_in1_max);
@@ -673,6 +684,8 @@ static int lm87_detect(struct i2c_adapte
 
 	return 0;
 
+exit_detach:
+	i2c_detach_client(new_client);
 exit_free:
 	kfree(data);
 exit:
@@ -721,6 +734,8 @@ static int lm87_detach_client(struct i2c
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev, "Client deregistration failed, "
 			"client not detached.\n");
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/lm90.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/lm90.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/lm90.c
@@ -76,6 +76,8 @@
 #include <linux/jiffies.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 
 /*
  * Addresses to scan
@@ -96,6 +98,8 @@ static unsigned int normal_isa[] = { I2C
 
 SENSORS_INSMOD_6(lm90, adm1032, lm99, lm86, max6657, adt7461);
 
+static int id;	/* increment once for every chip found */
+
 /*
  * The LM90 registers
  */
@@ -480,6 +484,13 @@ static int lm90_detect(struct i2c_adapte
 	lm90_init_client(new_client);
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto exit_detach;
+	}
+
 	device_create_file(&new_client->dev, &dev_attr_temp1_input);
 	device_create_file(&new_client->dev, &dev_attr_temp2_input);
 	device_create_file(&new_client->dev, &dev_attr_temp1_min);
@@ -494,6 +505,8 @@ static int lm90_detect(struct i2c_adapte
 
 	return 0;
 
+exit_detach:
+	i2c_detach_client(new_client);
 exit_free:
 	kfree(data);
 exit:
@@ -519,6 +532,8 @@ static int lm90_detach_client(struct i2c
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev, "Client deregistration failed, "
 			"client not detached.\n");
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/lm92.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/lm92.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/lm92.c
@@ -45,7 +45,8 @@
 #include <linux/slab.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
-
+#include <linux/hwmon.h>
+#include <linux/err.h>
 
 /* The LM92 and MAX6635 have 2 two-state pins for address selection,
    resulting in 4 possible addresses. */
@@ -56,6 +57,8 @@ static unsigned int normal_isa[] = { I2C
 /* Insmod parameters */
 SENSORS_INSMOD_1(lm92);
 
+static int id;	/* increment once for every chip found */
+
 /* The LM92 registers */
 #define LM92_REG_CONFIG			0x01 /* 8-bit, RW */
 #define LM92_REG_TEMP			0x00 /* 16-bit, RO */
@@ -359,6 +362,13 @@ static int lm92_detect(struct i2c_adapte
 	lm92_init_client(new_client);
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto exit_detach;
+	}
+
 	device_create_file(&new_client->dev, &dev_attr_temp1_input);
 	device_create_file(&new_client->dev, &dev_attr_temp1_crit);
 	device_create_file(&new_client->dev, &dev_attr_temp1_crit_hyst);
@@ -370,6 +380,8 @@ static int lm92_detect(struct i2c_adapte
 
 	return 0;
 
+exit_detach:
+	i2c_detach_client(new_client);
 exit_free:
 	kfree(data);
 exit:
@@ -387,6 +399,8 @@ static int lm92_detach_client(struct i2c
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev, "Client deregistration failed, "
 			"client not detached.\n");
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/max1619.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/max1619.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/max1619.c
@@ -32,7 +32,8 @@
 #include <linux/jiffies.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
-
+#include <linux/hwmon.h>
+#include <linux/err.h>
 
 static unsigned short normal_i2c[] = { 0x18, 0x19, 0x1a,
 					0x29, 0x2a, 0x2b,
@@ -46,6 +47,8 @@ static unsigned int normal_isa[] = { I2C
 
 SENSORS_INSMOD_1(max1619);
 
+static int id;	/* increment once for every chip found */
+
 /*
  * The MAX1619 registers
  */
@@ -275,6 +278,13 @@ static int max1619_detect(struct i2c_ada
 	max1619_init_client(new_client);
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto exit_detach;
+	}
+
 	device_create_file(&new_client->dev, &dev_attr_temp1_input);
 	device_create_file(&new_client->dev, &dev_attr_temp2_input);
 	device_create_file(&new_client->dev, &dev_attr_temp2_min);
@@ -285,6 +295,8 @@ static int max1619_detect(struct i2c_ada
 
 	return 0;
 
+exit_detach:
+	i2c_detach_client(new_client);
 exit_free:
 	kfree(data);
 exit:
@@ -310,6 +322,8 @@ static int max1619_detach_client(struct 
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev, "Client deregistration failed, "
 			"client not detached.\n");
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/pc87360.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/pc87360.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/pc87360.c
@@ -40,6 +40,8 @@
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
 #include <linux/i2c-vid.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 #include <asm/io.h>
 
 static unsigned short normal_i2c[] = { I2C_CLIENT_END };
@@ -65,6 +67,8 @@ MODULE_PARM_DESC(init,
  " 2: Forcibly enable all voltage and temperature channels, except in9\n"
  " 3: Forcibly enable all voltage and temperature channels, including in9");
 
+static int id;	/* increment once for every chip found */
+
 /*
  * Super-I/O registers and operations
  */
@@ -838,6 +842,13 @@ int pc87360_detect(struct i2c_adapter *a
 	}
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto ERROR3;
+	}
+
 	if (data->innr) {
 		device_create_file(&new_client->dev, &dev_attr_in0_input);
 		device_create_file(&new_client->dev, &dev_attr_in1_input);
@@ -974,6 +985,8 @@ int pc87360_detect(struct i2c_adapter *a
 
 	return 0;
 
+ERROR3:
+	i2c_detach_client(new_client);
 ERROR2:
 	for (i = 0; i < 3; i++) {
 		if (data->address[i]) {
@@ -990,6 +1003,8 @@ static int pc87360_detach_client(struct 
 	struct pc87360_data *data = i2c_get_clientdata(client);
 	int i;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((i = i2c_detach_client(client))) {
 		dev_err(&client->dev, "Client deregistration failed, "
 			"client not detached.\n");
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/sis5595.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/sis5595.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/sis5595.c
@@ -56,6 +56,8 @@
 #include <linux/pci.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 #include <linux/init.h>
 #include <linux/jiffies.h>
 #include <asm/io.h>
@@ -77,6 +79,8 @@ static unsigned int normal_isa[] = { 0x0
 /* Insmod parameters */
 SENSORS_INSMOD_1(sis5595);
 
+static int id;	/* increment once for every chip found */
+
 /* Many SIS5595 constants specified below */
 
 /* Length of ISA address segment */
@@ -578,6 +582,13 @@ int sis5595_detect(struct i2c_adapter *a
 	}
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto exit_detach;
+	}
+
 	device_create_file(&new_client->dev, &dev_attr_in0_input);
 	device_create_file(&new_client->dev, &dev_attr_in0_min);
 	device_create_file(&new_client->dev, &dev_attr_in0_max);
@@ -608,7 +619,9 @@ int sis5595_detect(struct i2c_adapter *a
 		device_create_file(&new_client->dev, &dev_attr_temp1_max_hyst);
 	}
 	return 0;
-	
+
+exit_detach:
+	i2c_detach_client(new_client);	
 exit_free:
 	kfree(data);
 exit_release:
@@ -621,6 +634,8 @@ static int sis5595_detach_client(struct 
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev,
 		    "Client deregistration failed, client not detached.\n");
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/smsc47b397.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/smsc47b397.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/smsc47b397.c
@@ -32,6 +32,8 @@
 #include <linux/jiffies.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 #include <linux/init.h>
 #include <asm/io.h>
 
@@ -49,6 +51,8 @@ static struct i2c_address_data addr_data
 	.forces			= forces,
 };
 
+static int id;	/* increment once for every chip found */
+
 /* Super-I/0 registers and commands */
 
 #define	REG	0x2e	/* The register to read/write */
@@ -228,6 +232,8 @@ static int smsc47b397_detach_client(stru
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev, "Client deregistration failed, "
 			"client not detached.\n");
@@ -285,6 +291,13 @@ static int smsc47b397_detect(struct i2c_
 	if ((err = i2c_attach_client(new_client)))
 		goto error_free;
 
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto error_detach;
+	}
+
 	device_create_file_temp(new_client, 1);
 	device_create_file_temp(new_client, 2);
 	device_create_file_temp(new_client, 3);
@@ -297,6 +310,8 @@ static int smsc47b397_detect(struct i2c_
 
 	return 0;
 
+error_detach:
+	i2c_detach_client(new_client);
 error_free:
 	kfree(new_client);
 error_release:
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/smsc47m1.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/smsc47m1.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/smsc47m1.c
@@ -31,6 +31,8 @@
 #include <linux/jiffies.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 #include <linux/init.h>
 #include <asm/io.h>
 
@@ -46,6 +48,8 @@ static struct i2c_address_data addr_data
 	.forces			= forces,
 };
 
+static int id;	/* increment once for every chip found */
+
 /* Super-I/0 registers and commands */
 
 #define	REG	0x2e	/* The register to read/write */
@@ -461,6 +465,14 @@ static int smsc47m1_detect(struct i2c_ad
 	   function. */
 	smsc47m1_update_device(&new_client->dev, 1);
 
+	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto error_detach;
+	}
+
 	if (fan1) {
 		device_create_file(&new_client->dev, &dev_attr_fan1_input);
 		device_create_file(&new_client->dev, &dev_attr_fan1_min);
@@ -494,6 +506,8 @@ static int smsc47m1_detect(struct i2c_ad
 
 	return 0;
 
+error_detach:
+	i2c_detach_client(new_client);
 error_free:
 	kfree(new_client);
 error_release:
@@ -505,6 +519,8 @@ static int smsc47m1_detach_client(struct
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev, "Client deregistration failed, "
 			"client not detached.\n");
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/via686a.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/via686a.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/via686a.c
@@ -36,6 +36,8 @@
 #include <linux/jiffies.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 #include <linux/init.h>
 #include <asm/io.h>
 
@@ -56,6 +58,8 @@ static unsigned int normal_isa[] = { 0x0
 /* Insmod parameters */
 SENSORS_INSMOD_1(via686a);
 
+static int id;	/* increment once for every chip found */
+
 /*
    The Via 686a southbridge has a LM78-like chip integrated on the same IC.
    This driver is a customized copy of lm78.c
@@ -637,7 +641,7 @@ static int via686a_detect(struct i2c_ada
 
 	if (!(data = kmalloc(sizeof(struct via686a_data), GFP_KERNEL))) {
 		err = -ENOMEM;
-		goto ERROR0;
+		goto exit_release;
 	}
 	memset(data, 0, sizeof(struct via686a_data));
 
@@ -655,12 +659,19 @@ static int via686a_detect(struct i2c_ada
 	init_MUTEX(&data->update_lock);
 	/* Tell the I2C layer a new client has arrived */
 	if ((err = i2c_attach_client(new_client)))
-		goto ERROR3;
+		goto exit_free;
 
 	/* Initialize the VIA686A chip */
 	via686a_init_client(new_client);
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto exit_detach;
+	}
+
 	device_create_file(&new_client->dev, &dev_attr_in0_input);
 	device_create_file(&new_client->dev, &dev_attr_in1_input);
 	device_create_file(&new_client->dev, &dev_attr_in2_input);
@@ -695,9 +706,11 @@ static int via686a_detect(struct i2c_ada
 
 	return 0;
 
-ERROR3:
+exit_detach:
+	i2c_detach_client(new_client);
+exit_free:
 	kfree(data);
-ERROR0:
+exit_release:
 	release_region(address, VIA686A_EXTENT);
 	return err;
 }
@@ -706,6 +719,8 @@ static int via686a_detach_client(struct 
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev,
 		"Client deregistration failed, client not detached.\n");
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/w83627ehf.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/w83627ehf.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/w83627ehf.c
@@ -38,6 +38,8 @@
 #include <linux/slab.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 #include <asm/io.h>
 #include "lm75.h"
 
@@ -49,6 +51,8 @@ static unsigned int normal_isa[] = { 0, 
 /* Insmod parameters */
 SENSORS_INSMOD_1(w83627ehf);
 
+static int id;	/* increment once for every chip found */
+
 /*
  * Super-I/O constants and functions
  */
@@ -720,6 +724,13 @@ static int w83627ehf_detect(struct i2c_a
 		data->has_fan |= (1 << 4);
 
 	/* Register sysfs hooks */
+	client->class_dev = hwmon_device_register(&client->dev,
+		"%s-%d", client->name, id++);
+	if (IS_ERR(client->class_dev)) {
+		err = PTR_ERR(client->class_dev);
+		goto exit_detach;
+	}
+
 	device_create_file(&client->dev, &dev_attr_fan1_input);
 	device_create_file(&client->dev, &dev_attr_fan1_min);
 	device_create_file(&client->dev, &dev_attr_fan1_div);
@@ -753,6 +764,8 @@ static int w83627ehf_detect(struct i2c_a
 
 	return 0;
 
+exit_detach:
+	i2c_detach_client(client);
 exit_free:
 	kfree(data);
 exit_release:
@@ -772,6 +785,8 @@ static int w83627ehf_detach_client(struc
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev, "Client deregistration failed, "
 			"client not detached.\n");
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/w83627hf.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/w83627hf.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/w83627hf.c
@@ -44,6 +44,8 @@
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
 #include <linux/i2c-vid.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 #include <asm/io.h>
 #include "lm75.h"
 
@@ -67,6 +69,8 @@ static int init = 1;
 module_param(init, bool, 0);
 MODULE_PARM_DESC(init, "Set to zero to bypass chip initialization");
 
+static int id;	/* increment once for every chip found */
+
 /* modified from kernel/include/traps.c */
 static int REG;		/* The register to read/write */
 #define	DEV	0x07	/* Register: Logical device select */
@@ -1102,6 +1106,13 @@ int w83627hf_detect(struct i2c_adapter *
 	data->fan_min[2] = w83627hf_read_value(new_client, W83781D_REG_FAN_MIN(3));
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto ERROR3;
+	}
+
 	device_create_file_in(new_client, 0);
 	if (kind != w83697hf)
 		device_create_file_in(new_client, 1);
@@ -1152,6 +1163,8 @@ int w83627hf_detect(struct i2c_adapter *
 
 	return 0;
 
+      ERROR3:
+	i2c_detach_client(new_client);
       ERROR2:
 	kfree(data);
       ERROR1:
@@ -1164,6 +1177,8 @@ static int w83627hf_detach_client(struct
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev,
 		       "Client deregistration failed, client not detached.\n");
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/w83781d.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/w83781d.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/w83781d.c
@@ -42,6 +42,8 @@
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
 #include <linux/i2c-vid.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 #include <asm/io.h>
 #include "lm75.h"
 
@@ -60,6 +62,8 @@ static int init = 1;
 module_param(init, bool, 0);
 MODULE_PARM_DESC(init, "Set to zero to bypass chip initialization");
 
+static int id;	/* increment once for every chip found */
+
 /* Constants specified below */
 
 /* Length of ISA address segment */
@@ -1205,6 +1209,13 @@ w83781d_detect(struct i2c_adapter *adapt
 			data->pwmenable[i] = 1;
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto ERROR4;
+	}
+
 	device_create_file_in(new_client, 0);
 	if (kind != w83783s && kind != w83697hf)
 		device_create_file_in(new_client, 1);
@@ -1262,6 +1273,15 @@ w83781d_detect(struct i2c_adapter *adapt
 
 	return 0;
 
+ERROR4:
+	if (NULL != data->lm75[1]) {
+		i2c_detach_client(data->lm75[1]);
+		kfree(data->lm75[1]);
+	}
+	if (NULL != data->lm75[0]) {
+		i2c_detach_client(data->lm75[0]);
+		kfree(data->lm75[0]);
+	}
 ERROR3:
 	i2c_detach_client(new_client);
 ERROR2:
@@ -1278,6 +1298,9 @@ w83781d_detach_client(struct i2c_client 
 {
 	int err;
 
+	if (client->class_dev)
+		hwmon_device_unregister(client->class_dev);
+
 	if (i2c_is_isa_client(client))
 		release_region(client->addr, W83781D_EXTENT);
 
Index: linux-2.6.12-rc5-mm1/drivers/i2c/chips/w83l785ts.c
=================================--- linux-2.6.12-rc5-mm1.orig/drivers/i2c/chips/w83l785ts.c
+++ linux-2.6.12-rc5-mm1/drivers/i2c/chips/w83l785ts.c
@@ -37,6 +37,8 @@
 #include <linux/jiffies.h>
 #include <linux/i2c.h>
 #include <linux/i2c-sensor.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 
 /* How many retries on register read error */
 #define MAX_RETRIES	5
@@ -55,6 +57,8 @@ static unsigned int normal_isa[] = { I2C
 
 SENSORS_INSMOD_1(w83l785ts);
 
+static int id;	/* increment once for every chip found */
+
 /*
  * The W83L785TS-S registers
  * Manufacturer ID is 0x5CA3 for Winbond.
@@ -239,11 +243,20 @@ static int w83l785ts_detect(struct i2c_a
 	 */
 
 	/* Register sysfs hooks */
+	new_client->class_dev = hwmon_device_register(&new_client->dev,
+		"%s-%d", new_client->name, id++);
+	if (IS_ERR(new_client->class_dev)) {
+		err = PTR_ERR(new_client->class_dev);
+		goto exit_detach;
+	}
+
 	device_create_file(&new_client->dev, &dev_attr_temp1_input);
 	device_create_file(&new_client->dev, &dev_attr_temp1_max);
 
 	return 0;
 
+exit_detach:
+	i2c_detach_client(new_client);
 exit_free:
 	kfree(data);
 exit:
@@ -254,6 +267,8 @@ static int w83l785ts_detach_client(struc
 {
 	int err;
 
+	hwmon_device_unregister(client->class_dev);
+
 	if ((err = i2c_detach_client(client))) {
 		dev_err(&client->dev, "Client deregistration failed, "
 			"client not detached.\n");
Index: linux-2.6.12-rc5-mm1/include/linux/i2c.h
=================================--- linux-2.6.12-rc5-mm1.orig/include/linux/i2c.h
+++ linux-2.6.12-rc5-mm1/include/linux/i2c.h
@@ -154,6 +154,7 @@ struct i2c_client {
 	int usage_count;		/* How many accesses currently  */
 					/* to the client		*/
 	struct device dev;		/* the device structure		*/
+	struct class_device *class_dev;
 	struct list_head list;
 	char name[I2C_NAME_SIZE];
 	struct completion released;

-- 
Mark M. Hoffman
mhoffman@lightlink.com


             reply	other threads:[~2005-06-02  5:38 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-06-02  5:38 Mark M. Hoffman [this message]
2005-06-02  8:03 ` [lm-sensors] Re: [PATCH 2.6.12-rc5-mm1 3/3] i2c: modify sensors Greg KH
2005-06-03  6:00 ` Mark M. Hoffman
2005-06-03  6:47 ` Greg KH
2005-06-03  8:26 ` Yani Ioannou
2005-06-03  8:53 ` Greg KH
2005-06-03 21:00 ` Yani Ioannou
2005-06-04 18:13 ` Jean Delvare
2005-06-04 18:23 ` Jean Delvare
2005-06-04 22:32 ` Yani Ioannou
2005-06-04 23:21 ` Jean Delvare
2005-06-05  1:35 ` Yani Ioannou
2005-06-05  5:42 ` Mark M. Hoffman
2005-06-05  8:06 ` Jean Delvare
2005-06-09  9:28 ` Greg KH
2005-06-09  9:58 ` Yani Ioannou
2005-06-09 10:23 ` Jean Delvare
2005-06-10  6:26 ` Mark M. Hoffman
2005-06-10  6:40 ` Greg KH
2005-06-10 18:45 ` Jean Delvare

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20050602033727.GD4906@jupiter.solarsys.private \
    --to=mhoffman@lightlink.com \
    --cc=lm-sensors@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.