]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/hwmon/adm1026.c
[PATCH] I2C: Separate non-i2c hwmon drivers from i2c-core (3/9)
[linux-2.6-omap-h63xx.git] / drivers / hwmon / adm1026.c
index 3c85fe150cd754831f989f88151a14b5e77482ae..eb55133a13ee737f3427877a9c949a232ca871eb 100644 (file)
@@ -31,6 +31,8 @@
 #include <linux/i2c-sensor.h>
 #include <linux/i2c-vid.h>
 #include <linux/hwmon-sysfs.h>
+#include <linux/hwmon.h>
+#include <linux/err.h>
 
 /* Addresses to scan */
 static unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, I2C_CLIENT_END };
@@ -259,6 +261,7 @@ struct pwm_data {
 
 struct adm1026_data {
        struct i2c_client client;
+       struct class_device *class_dev;
        struct semaphore lock;
        enum chips type;
 
@@ -324,8 +327,10 @@ int adm1026_attach_adapter(struct i2c_adapter *adapter)
 
 int adm1026_detach_client(struct i2c_client *client)
 {
+       struct adm1026_data *data = i2c_get_clientdata(client);
+       hwmon_device_unregister(data->class_dev);
        i2c_detach_client(client);
-       kfree(client);
+       kfree(data);
        return 0;
 }
 
@@ -393,7 +398,7 @@ void adm1026_init_client(struct i2c_client *client)
 
        value = data->config3;
        if (data->config3 & CFG3_GPIO16_ENABLE) {
-               dev_dbg(&client->dev, "GPIO16 enabled.  THERM"
+               dev_dbg(&client->dev, "GPIO16 enabled.  THERM "
                        "pin disabled.\n");
        } else {
                dev_dbg(&client->dev, "THERM pin enabled.  "
@@ -1555,6 +1560,12 @@ int adm1026_detect(struct i2c_adapter *adapter, int address,
        adm1026_init_client(new_client);
 
        /* Register sysfs hooks */
+       data->class_dev = hwmon_device_register(&new_client->dev);
+       if (IS_ERR(data->class_dev)) {
+               err = PTR_ERR(data->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,8 +1701,10 @@ int adm1026_detect(struct i2c_adapter *adapter, int address,
        return 0;
 
        /* Error out and cleanup code */
+exitdetach:
+       i2c_detach_client(new_client);
 exitfree:
-       kfree(new_client);
+       kfree(data);
 exit:
        return err;
 }