.read_raw = lpc18xx_adc_read_raw,
 };
 
+static void lpc18xx_clear_cr_reg(void *data)
+{
+       struct lpc18xx_adc *adc = data;
+
+       writel(0, adc->base + LPC18XX_ADC_CR);
+}
+
+static void lpc18xx_clk_disable(void *clk)
+{
+       clk_disable_unprepare(clk);
+}
+
+static void lpc18xx_regulator_disable(void *vref)
+{
+       regulator_disable(vref);
+}
+
 static int lpc18xx_adc_probe(struct platform_device *pdev)
 {
        struct iio_dev *indio_dev;
        if (!indio_dev)
                return -ENOMEM;
 
-       platform_set_drvdata(pdev, indio_dev);
        adc = iio_priv(indio_dev);
        adc->dev = &pdev->dev;
        mutex_init(&adc->lock);
                return ret;
        }
 
+       ret = devm_add_action_or_reset(&pdev->dev, lpc18xx_regulator_disable, adc->vref);
+       if (ret)
+               return ret;
+
        ret = clk_prepare_enable(adc->clk);
        if (ret) {
                dev_err(&pdev->dev, "unable to enable clock\n");
-               goto dis_reg;
+               return ret;
        }
 
+       ret = devm_add_action_or_reset(&pdev->dev, lpc18xx_clk_disable,
+                                      adc->clk);
+       if (ret)
+               return ret;
+
        adc->cr_reg = (clkdiv << LPC18XX_ADC_CR_CLKDIV_SHIFT) |
                        LPC18XX_ADC_CR_PDN;
        writel(adc->cr_reg, adc->base + LPC18XX_ADC_CR);
 
-       ret = iio_device_register(indio_dev);
-       if (ret) {
-               dev_err(&pdev->dev, "unable to register device\n");
-               goto dis_clk;
-       }
-
-       return 0;
-
-dis_clk:
-       writel(0, adc->base + LPC18XX_ADC_CR);
-       clk_disable_unprepare(adc->clk);
-dis_reg:
-       regulator_disable(adc->vref);
-       return ret;
-}
-
-static int lpc18xx_adc_remove(struct platform_device *pdev)
-{
-       struct iio_dev *indio_dev = platform_get_drvdata(pdev);
-       struct lpc18xx_adc *adc = iio_priv(indio_dev);
-
-       iio_device_unregister(indio_dev);
-
-       writel(0, adc->base + LPC18XX_ADC_CR);
-       clk_disable_unprepare(adc->clk);
-       regulator_disable(adc->vref);
+       ret = devm_add_action_or_reset(&pdev->dev, lpc18xx_clear_cr_reg, adc);
+       if (ret)
+               return ret;
 
-       return 0;
+       return devm_iio_device_register(&pdev->dev, indio_dev);
 }
 
 static const struct of_device_id lpc18xx_adc_match[] = {
 
 static struct platform_driver lpc18xx_adc_driver = {
        .probe  = lpc18xx_adc_probe,
-       .remove = lpc18xx_adc_remove,
        .driver = {
                .name = "lpc18xx-adc",
                .of_match_table = lpc18xx_adc_match,