i2c: Remove all i2c_set_clientdata(client, NULL) in drivers
[pandora-kernel.git] / drivers / hwmon / tmp102.c
index 0da695d..93187c3 100644 (file)
@@ -50,6 +50,7 @@
 struct tmp102 {
        struct device *hwmon_dev;
        struct mutex lock;
+       u16 config_orig;
        unsigned long last_update;
        int temp[3];
 };
@@ -177,21 +178,27 @@ static int __devinit tmp102_probe(struct i2c_client *client,
        }
        i2c_set_clientdata(client, tmp102);
 
+       status = tmp102_read_reg(client, TMP102_CONF_REG);
+       if (status < 0) {
+               dev_err(&client->dev, "error reading config register\n");
+               goto fail_free;
+       }
+       tmp102->config_orig = status;
        status = tmp102_write_reg(client, TMP102_CONF_REG, TMP102_CONFIG);
        if (status < 0) {
                dev_err(&client->dev, "error writing config register\n");
-               goto fail0;
+               goto fail_restore_config;
        }
        status = tmp102_read_reg(client, TMP102_CONF_REG);
        if (status < 0) {
                dev_err(&client->dev, "error reading config register\n");
-               goto fail0;
+               goto fail_restore_config;
        }
        status &= ~TMP102_CONFIG_RD_ONLY;
        if (status != TMP102_CONFIG) {
                dev_err(&client->dev, "config settings did not stick\n");
                status = -ENODEV;
-               goto fail0;
+               goto fail_restore_config;
        }
        tmp102->last_update = jiffies - HZ;
        mutex_init(&tmp102->lock);
@@ -199,22 +206,24 @@ static int __devinit tmp102_probe(struct i2c_client *client,
        status = sysfs_create_group(&client->dev.kobj, &tmp102_attr_group);
        if (status) {
                dev_dbg(&client->dev, "could not create sysfs files\n");
-               goto fail0;
+               goto fail_restore_config;
        }
        tmp102->hwmon_dev = hwmon_device_register(&client->dev);
        if (IS_ERR(tmp102->hwmon_dev)) {
                dev_dbg(&client->dev, "unable to register hwmon device\n");
                status = PTR_ERR(tmp102->hwmon_dev);
-               goto fail1;
+               goto fail_remove_sysfs;
        }
 
        dev_info(&client->dev, "initialized\n");
 
        return 0;
-fail1:
+
+fail_remove_sysfs:
        sysfs_remove_group(&client->dev.kobj, &tmp102_attr_group);
-fail0:
-       i2c_set_clientdata(client, NULL);
+fail_restore_config:
+       tmp102_write_reg(client, TMP102_CONF_REG, tmp102->config_orig);
+fail_free:
        kfree(tmp102);
 
        return status;
@@ -224,12 +233,19 @@ static int __devexit tmp102_remove(struct i2c_client *client)
 {
        struct tmp102 *tmp102 = i2c_get_clientdata(client);
 
-       /* shutdown the chip */
-       tmp102_write_reg(client, TMP102_CONF_REG, TMP102_CONF_SD);
-
        hwmon_device_unregister(tmp102->hwmon_dev);
        sysfs_remove_group(&client->dev.kobj, &tmp102_attr_group);
-       i2c_set_clientdata(client, NULL);
+
+       /* Stop monitoring if device was stopped originally */
+       if (tmp102->config_orig & TMP102_CONF_SD) {
+               int config;
+
+               config = tmp102_read_reg(client, TMP102_CONF_REG);
+               if (config >= 0)
+                       tmp102_write_reg(client, TMP102_CONF_REG,
+                                        config | TMP102_CONF_SD);
+       }
+
        kfree(tmp102);
 
        return 0;