power: regulator: Introduce regulator_set_enable_if_allowed api
authorLokesh Vutla <lokeshvutla@ti.com>
Fri, 11 Jan 2019 09:45:51 +0000 (15:15 +0530)
committerSimon Glass <sjg@chromium.org>
Sat, 9 Feb 2019 19:50:22 +0000 (12:50 -0700)
regulator_set_enable() api throws an error in the following three cases:
- when requested to disable an always-on regulator
- when set_enable() ops not provided by regulator driver
- when enabling is actually failed.(Error returned by the regulator driver)

Sometimes consumer drivers doesn't want to track the first two scenarios
and just need to worry about the case where enabling is actually failed.
But it is also a good practice to have an error value returned in the
first two cases.

So introduce an api regulator_set_enable_if_allowed() which ignores the
first two error cases and returns an error as given by regulator driver.
Consumer drivers can use this api need not worry about the first two
error conditions.

Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
drivers/power/regulator/regulator-uclass.c
include/power/regulator.h
test/dm/regulator.c

index 4511625ff25133330e4eeab96169c28b7113c671..6f355b969a6d1353727a47bcbbf1c7a3ef33cf64 100644 (file)
@@ -118,6 +118,17 @@ int regulator_set_enable(struct udevice *dev, bool enable)
        return ops->set_enable(dev, enable);
 }
 
+int regulator_set_enable_if_allowed(struct udevice *dev, bool enable)
+{
+       int ret;
+
+       ret = regulator_set_enable(dev, enable);
+       if (ret == -ENOSYS || ret == -EACCES)
+               return 0;
+
+       return ret;
+}
+
 int regulator_get_mode(struct udevice *dev)
 {
        const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
index 5318ab3aceced510d89fc28be24ac00005103f07..314160a894b7281248c97f7ac1d10ff8c16c96fd 100644 (file)
@@ -303,6 +303,17 @@ int regulator_get_enable(struct udevice *dev);
  */
 int regulator_set_enable(struct udevice *dev, bool enable);
 
+/**
+ * regulator_set_enable_if_allowed: set regulator enable state if allowed by
+ *                                     regulator
+ *
+ * @dev    - pointer to the regulator device
+ * @enable - set true or false
+ * @return - 0 on success or if enabling is not supported
+ *          -errno val if fails.
+ */
+int regulator_set_enable_if_allowed(struct udevice *dev, bool enable);
+
 /**
  * regulator_get_mode: get active operation mode id of a given regulator
  *
index 5d11e946b29284a816cac394e2066ccc5c9559ac..e510539542b60b7a22416c060f83712939d93ad8 100644 (file)
@@ -175,6 +175,27 @@ static int dm_test_power_regulator_set_get_enable(struct unit_test_state *uts)
 }
 DM_TEST(dm_test_power_regulator_set_get_enable, DM_TESTF_SCAN_FDT);
 
+/* Test regulator set and get enable if allowed method */
+static
+int dm_test_power_regulator_set_enable_if_allowed(struct unit_test_state *uts)
+{
+       const char *platname;
+       struct udevice *dev, *dev_autoset;
+       bool val_set = false;
+
+       /* Get BUCK1 - always on regulator */
+       platname = regulator_names[BUCK1][PLATNAME];
+       ut_assertok(regulator_autoset_by_name(platname, &dev_autoset));
+       ut_assertok(regulator_get_by_platname(platname, &dev));
+
+       /* Try disabling always-on regulator */
+       ut_assertok(regulator_set_enable_if_allowed(dev, val_set));
+       ut_asserteq(regulator_get_enable(dev), !val_set);
+
+       return 0;
+}
+DM_TEST(dm_test_power_regulator_set_enable_if_allowed, DM_TESTF_SCAN_FDT);
+
 /* Test regulator set and get mode method */
 static int dm_test_power_regulator_set_get_mode(struct unit_test_state *uts)
 {