struct ad5791_state *st;
        int ret, pos_voltage_uv = 0, neg_voltage_uv = 0;
 
-       indio_dev = iio_device_alloc(sizeof(*st));
-       if (indio_dev == NULL) {
-               ret = -ENOMEM;
-               goto error_ret;
-       }
+       indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
+       if (!indio_dev)
+               return -ENOMEM;
        st = iio_priv(indio_dev);
-       st->reg_vdd = regulator_get(&spi->dev, "vdd");
+       st->reg_vdd = devm_regulator_get(&spi->dev, "vdd");
        if (!IS_ERR(st->reg_vdd)) {
                ret = regulator_enable(st->reg_vdd);
                if (ret)
-                       goto error_put_reg_pos;
+                       return ret;
 
                ret = regulator_get_voltage(st->reg_vdd);
                if (ret < 0)
                pos_voltage_uv = ret;
        }
 
-       st->reg_vss = regulator_get(&spi->dev, "vss");
+       st->reg_vss = devm_regulator_get(&spi->dev, "vss");
        if (!IS_ERR(st->reg_vss)) {
                ret = regulator_enable(st->reg_vss);
                if (ret)
-                       goto error_put_reg_neg;
+                       goto error_disable_reg_pos;
 
                ret = regulator_get_voltage(st->reg_vss);
                if (ret < 0)
 error_disable_reg_neg:
        if (!IS_ERR(st->reg_vss))
                regulator_disable(st->reg_vss);
-error_put_reg_neg:
-       if (!IS_ERR(st->reg_vss))
-               regulator_put(st->reg_vss);
-
 error_disable_reg_pos:
        if (!IS_ERR(st->reg_vdd))
                regulator_disable(st->reg_vdd);
-error_put_reg_pos:
-       if (!IS_ERR(st->reg_vdd))
-               regulator_put(st->reg_vdd);
-       iio_device_free(indio_dev);
-error_ret:
-
        return ret;
 }
 
        struct ad5791_state *st = iio_priv(indio_dev);
 
        iio_device_unregister(indio_dev);
-       if (!IS_ERR(st->reg_vdd)) {
+       if (!IS_ERR(st->reg_vdd))
                regulator_disable(st->reg_vdd);
-               regulator_put(st->reg_vdd);
-       }
 
-       if (!IS_ERR(st->reg_vss)) {
+       if (!IS_ERR(st->reg_vss))
                regulator_disable(st->reg_vss);
-               regulator_put(st->reg_vss);
-       }
-       iio_device_free(indio_dev);
 
        return 0;
 }