regulator: rohm-regulator: linear voltage support
authorMatti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
Mon, 5 Apr 2021 11:43:26 +0000 (14:43 +0300)
committerLee Jones <lee.jones@linaro.org>
Wed, 14 Apr 2021 09:19:36 +0000 (10:19 +0100)
The helper for obtaining HW-state based DVS voltage levels currently only
works for regulators using linear-ranges. Extend support to regulators with
simple linear mappings and add also proper error path if pickable-ranges
regulators call this.

Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
Acked-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
drivers/regulator/rohm-regulator.c

index 5c558b153d55eaca7f0ad48a06f30a798131fef2..63aabb8c77860f04f9ff751ba1bdeeb4a90c4b89 100644 (file)
@@ -22,13 +22,26 @@ static int set_dvs_level(const struct regulator_desc *desc,
                        return ret;
                return 0;
        }
-
+       /* If voltage is set to 0 => disable */
        if (uv == 0) {
                if (omask)
                        return regmap_update_bits(regmap, oreg, omask, 0);
        }
+       /* Some setups don't allow setting own voltage but do allow enabling */
+       if (!mask) {
+               if (omask)
+                       return regmap_update_bits(regmap, oreg, omask, omask);
+
+               return -EINVAL;
+       }
        for (i = 0; i < desc->n_voltages; i++) {
-               ret = regulator_desc_list_voltage_linear_range(desc, i);
+               /* NOTE to next hacker - Does not support pickable ranges */
+               if (desc->linear_range_selectors)
+                       return -EINVAL;
+               if (desc->n_linear_ranges)
+                       ret = regulator_desc_list_voltage_linear_range(desc, i);
+               else
+                       ret = regulator_desc_list_voltage_linear(desc, i);
                if (ret < 0)
                        continue;
                if (ret == uv) {