struct tmp102 {
        struct device *hwmon_dev;
        struct mutex lock;
+       u16 config_orig;
        unsigned long last_update;
        int temp[3];
 };
        }
        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);
        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:
+fail_restore_config:
+       tmp102_write_reg(client, TMP102_CONF_REG, tmp102->config_orig);
+fail_free:
        i2c_set_clientdata(client, NULL);
        kfree(tmp102);
 
 {
        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);
+
+       /* 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);
+       }
+
        i2c_set_clientdata(client, NULL);
        kfree(tmp102);