struct ad7192_state {
        const struct ad7192_chip_info   *chip_info;
        struct regulator                *avdd;
+       struct regulator                *vref;
        struct clk                      *mclk;
        u16                             int_vref_mv;
        u32                             fclk;
        if (ret)
                return dev_err_probe(&spi->dev, ret, "Failed to enable specified DVdd supply\n");
 
-       ret = regulator_get_voltage(st->avdd);
-       if (ret < 0) {
-               dev_err(&spi->dev, "Device tree error, reference voltage undefined\n");
-               return ret;
+       st->vref = devm_regulator_get_optional(&spi->dev, "vref");
+       if (IS_ERR(st->vref)) {
+               if (PTR_ERR(st->vref) != -ENODEV)
+                       return PTR_ERR(st->vref);
+
+               ret = regulator_get_voltage(st->avdd);
+               if (ret < 0)
+                       return dev_err_probe(&spi->dev, ret,
+                                            "Device tree error, AVdd voltage undefined\n");
+       } else {
+               ret = regulator_enable(st->vref);
+               if (ret) {
+                       dev_err(&spi->dev, "Failed to enable specified Vref supply\n");
+                       return ret;
+               }
+
+               ret = devm_add_action_or_reset(&spi->dev, ad7192_reg_disable, st->vref);
+               if (ret)
+                       return ret;
+
+               ret = regulator_get_voltage(st->vref);
+               if (ret < 0)
+                       return dev_err_probe(&spi->dev, ret,
+                                            "Device tree error, Vref voltage undefined\n");
        }
        st->int_vref_mv = ret / 1000;