From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759973AbcAUUYe (ORCPT ); Thu, 21 Jan 2016 15:24:34 -0500 Received: from mezzanine.sirena.org.uk ([106.187.55.193]:38978 "EHLO mezzanine.sirena.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753414AbcAUUYY (ORCPT ); Thu, 21 Jan 2016 15:24:24 -0500 From: Mark Brown To: Paul Kocialkowski Cc: Liam Girdwood , linux-kernel@vger.kernel.org, Mark Brown Date: Thu, 21 Jan 2016 20:24:11 +0000 Message-Id: <1453407851-8039-2-git-send-email-broonie@kernel.org> X-Mailer: git-send-email 2.7.0.rc3 In-Reply-To: <1453407851-8039-1-git-send-email-broonie@kernel.org> References: <1453407851-8039-1-git-send-email-broonie@kernel.org> X-SA-Exim-Connect-IP: 2a01:348:6:8808:fab::3 X-SA-Exim-Mail-From: broonie@sirena.org.uk Subject: [PATCH 2/2] regulator: core: Provide per-regulator runtime PM support X-SA-Exim-Version: 4.2.1 (built Mon, 26 Dec 2011 16:24:06 +0000) X-SA-Exim-Scanned: Yes (on mezzanine.sirena.org.uk) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- 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(-) diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 3308c6bb83db..968ff3081e6c 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -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. */ diff --git a/include/linux/regulator/driver.h b/include/linux/regulator/driver.h index 3ac0f306f033..dccea032a143 100644 --- a/include/linux/regulator/driver.h +++ b/include/linux/regulator/driver.h @@ -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; -- 2.7.0.rc3