return (manf_id == TMP007_MANUFACTURER_MAGIC && dev_id == TMP007_DEVICE_MAGIC);
 }
 
+static void tmp007_powerdown_action_cb(void *priv)
+{
+       struct tmp007_data *data = priv;
+
+       tmp007_powerdown(data);
+}
+
 static int tmp007_probe(struct i2c_client *client,
                        const struct i2c_device_id *tmp007_id)
 {
        if (ret < 0)
                return ret;
 
+       ret = devm_add_action_or_reset(&client->dev, tmp007_powerdown_action_cb, data);
+       if (ret)
+               return ret;
+
        /*
         * Only the following flags can activate ALERT pin. Data conversion/validity flags
         * flags can still be polled for getting temperature data
 
        ret = i2c_smbus_read_word_swapped(data->client, TMP007_STATUS_MASK);
        if (ret < 0)
-               goto error_powerdown;
+               return ret;
 
        data->status_mask = ret;
        data->status_mask |= (TMP007_STATUS_OHF | TMP007_STATUS_OLF
 
        ret = i2c_smbus_write_word_swapped(data->client, TMP007_STATUS_MASK, data->status_mask);
        if (ret < 0)
-               goto error_powerdown;
+               return ret;
 
        if (client->irq) {
                ret = devm_request_threaded_irq(&client->dev, client->irq,
                                tmp007_id->name, indio_dev);
                if (ret) {
                        dev_err(&client->dev, "irq request error %d\n", -ret);
-                       goto error_powerdown;
+                       return ret;
                }
        }
 
-       return iio_device_register(indio_dev);
-
-error_powerdown:
-       tmp007_powerdown(data);
-
-       return ret;
-}
-
-static int tmp007_remove(struct i2c_client *client)
-{
-       struct iio_dev *indio_dev = i2c_get_clientdata(client);
-       struct tmp007_data *data = iio_priv(indio_dev);
-
-       iio_device_unregister(indio_dev);
-       tmp007_powerdown(data);
-
-       return 0;
+       return devm_iio_device_register(&client->dev, indio_dev);
 }
 
 #ifdef CONFIG_PM_SLEEP
                .pm     = &tmp007_pm_ops,
        },
        .probe          = tmp007_probe,
-       .remove         = tmp007_remove,
        .id_table       = tmp007_id,
 };
 module_i2c_driver(tmp007_driver);