]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
iio: dac: mcp47feb02: Fix passing uninitialized vref1_uV for no Vref1 case
authorAriana Lazar <ariana.lazar@microchip.com>
Thu, 4 Jun 2026 13:46:47 +0000 (16:46 +0300)
committerJonathan Cameron <jic23@kernel.org>
Mon, 29 Jun 2026 22:24:45 +0000 (23:24 +0100)
Ensure that if a device has Vref1 but reading the regulator returns an
error, mcp47feb02_init_ctrl_regs() is not called with an uninitialized
vref1_uV value. Also add a device_property_present() check for the Vref1
supply before reading the regulator.

Fixes: dd154646d292 ("iio: dac: mcp47feb02: Fix Vref validation [1-999] case")
Reported-by: Dan Carpenter <error27@gmail.com>
Closes: https://lore.kernel.org/all/adiPnla0M5EzvgD-@stanley.mountain/
Signed-off-by: Ariana Lazar <ariana.lazar@microchip.com>
Reviewed-by: David Lechner <dlechner@baylibre.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/iio/dac/mcp47feb02.c

index 217f78e44af12d92ae0b23d2d243d1d36db65405..a823c2a673a26d70e5829cb587034da435af0451 100644 (file)
@@ -1136,26 +1136,33 @@ static int mcp47feb02_probe(struct i2c_client *client)
 
        vdd_uV = ret;
 
-       ret = devm_regulator_get_enable_read_voltage(dev, "vref");
-       if (ret > 0) {
-               vref_uV = ret;
+       if (device_property_present(dev, "vref-supply")) {
+               vref_uV = devm_regulator_get_enable_read_voltage(dev, "vref");
+               if (vref_uV < 0)
+                       return vref_uV;
+
+               if (vref_uV == 0)
+                       return dev_err_probe(dev, -EINVAL, "Vref is 0 uV.\n");
+
                data->use_vref = true;
        } else {
                vref_uV = 0;
-               dev_dbg(dev, "using internal band gap as voltage reference.\n");
-               dev_dbg(dev, "Vref is unavailable.\n");
+               dev_dbg(dev, "Using internal band gap as voltage reference.\n");
        }
 
-       if (chip_features->have_ext_vref1) {
-               ret = devm_regulator_get_enable_read_voltage(dev, "vref1");
-               if (ret > 0) {
-                       vref1_uV = ret;
-                       data->use_vref1 = true;
-               } else {
-                       vref1_uV = 0;
-                       dev_dbg(dev, "using internal band gap as voltage reference 1.\n");
-                       dev_dbg(dev, "Vref1 is unavailable.\n");
-               }
+       if (chip_features->have_ext_vref1 &&
+           device_property_present(dev, "vref1-supply")) {
+               vref1_uV = devm_regulator_get_enable_read_voltage(dev, "vref1");
+               if (vref1_uV < 0)
+                       return vref1_uV;
+
+               if (vref1_uV == 0)
+                       return dev_err_probe(dev, -EINVAL, "Vref1 is 0 uV.\n");
+
+               data->use_vref1 = true;
+       } else {
+               vref1_uV = 0;
+               dev_dbg(dev, "Using internal band gap as voltage reference 1.\n");
        }
 
        ret = mcp47feb02_init_ctrl_regs(data);