@@ -26,6 +26,7 @@
#include <linux/gpio.h>
#include <linux/gpio/consumer.h>
#include <linux/of.h>
+#include <linux/pm_runtime.h>
#include <linux/regmap.h>
#include <linux/regulator/of_regulator.h>
#include <linux/regulator/consumer.h>
@@ -2059,17 +2060,23 @@ static int _regulator_do_enable(struct regulator_dev *rdev)
}
}
+ if (rdev->desc->auto_runtime_pm) {
+ ret = pm_runtime_get_sync(rdev->dev.parent);
+ if (ret < 0)
+ goto err;
+ }
+
if (rdev->ena_pin) {
if (!rdev->ena_gpio_state) {
ret = regulator_ena_gpio_ctrl(rdev, true);
if (ret < 0)
- return ret;
+ goto err_pm;
rdev->ena_gpio_state = 1;
}
} else if (rdev->desc->ops->enable) {
ret = rdev->desc->ops->enable(rdev);
if (ret < 0)
- return ret;
+ goto err_pm;
} else {
return -EINVAL;
}
@@ -2084,6 +2091,12 @@ static int _regulator_do_enable(struct regulator_dev *rdev)
trace_regulator_enable_complete(rdev_get_name(rdev));
return 0;
+
+err_pm:
+ if (rdev->desc->auto_runtime_pm)
+ pm_runtime_put_autosuspend(rdev->dev.parent);
+err:
+ return ret;
}
/* locks held by regulator_enable() */
@@ -2177,6 +2190,9 @@ static int _regulator_do_disable(struct regulator_dev *rdev)
return ret;
}
+ if (rdev->desc->auto_runtime_pm)
+ pm_runtime_put_autosuspend(rdev->dev.parent);
+
/* cares about last_off_jiffy only if off_on_delay is required by
* device.
*/
@@ -282,6 +282,7 @@ struct regulator_desc {
struct regulator_config *);
int id;
unsigned int continuous_voltage_range:1;
+ unsigned int auto_runtime_pm:1;
unsigned n_voltages;
const struct regulator_ops *ops;
int irq;
Provide a flag auto_runtime_pm in the regulator_desc which causes the regulator core to take a runtime PM reference to a regulator while it is enabled. This helps integration with chip wide power management for auxiliary PMICs, they may be able to implement chip wide power savings if nothing on the PMIC is in use. Signed-off-by: Mark Brown <broonie@kernel.org> --- Not tested at all yet, pushing out for testing by others who have devices that could benefit from this. drivers/regulator/core.c | 20 ++++++++++++++++++-- include/linux/regulator/driver.h | 1 + 2 files changed, 19 insertions(+), 2 deletions(-) -- 2.7.0.rc3