unsigned int i;
        int ret;
 
-       indio_dev = iio_device_alloc(sizeof(*st));
+       indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
        if (indio_dev == NULL)
                return  -ENOMEM;
 
        for (i = 0; i < ad5064_num_vref(st); ++i)
                st->vref_reg[i].supply = ad5064_vref_name(st, i);
 
-       ret = regulator_bulk_get(dev, ad5064_num_vref(st),
+       ret = devm_regulator_bulk_get(dev, ad5064_num_vref(st),
                st->vref_reg);
        if (ret) {
                if (!st->chip_info->internal_vref)
-                       goto error_free;
+                       return ret;
                st->use_internal_vref = true;
                ret = ad5064_write(st, AD5064_CMD_CONFIG, 0,
                        AD5064_CONFIG_INT_VREF_ENABLE, 0);
                if (ret) {
                        dev_err(dev, "Failed to enable internal vref: %d\n",
                                ret);
-                       goto error_free;
+                       return ret;
                }
        } else {
                ret = regulator_bulk_enable(ad5064_num_vref(st), st->vref_reg);
                if (ret)
-                       goto error_free_reg;
+                       return ret;
        }
 
        indio_dev->dev.parent = dev;
 error_disable_reg:
        if (!st->use_internal_vref)
                regulator_bulk_disable(ad5064_num_vref(st), st->vref_reg);
-error_free_reg:
-       if (!st->use_internal_vref)
-               regulator_bulk_free(ad5064_num_vref(st), st->vref_reg);
-error_free:
-       iio_device_free(indio_dev);
 
        return ret;
 }
 
        iio_device_unregister(indio_dev);
 
-       if (!st->use_internal_vref) {
+       if (!st->use_internal_vref)
                regulator_bulk_disable(ad5064_num_vref(st), st->vref_reg);
-               regulator_bulk_free(ad5064_num_vref(st), st->vref_reg);
-       }
-
-       iio_device_free(indio_dev);
 
        return 0;
 }