From patchwork Thu Jan 21 20:24:11 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Brown X-Patchwork-Id: 105023 Delivered-To: patch@linaro.org Received: by 10.112.130.2 with SMTP id oa2csp225417lbb; Thu, 21 Jan 2016 12:24:43 -0800 (PST) X-Received: by 10.66.149.7 with SMTP id tw7mr63981710pab.72.1453407880629; Thu, 21 Jan 2016 12:24:40 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id or3si4002823pac.233.2016.01.21.12.24.40; Thu, 21 Jan 2016 12:24:40 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759975AbcAUUYe (ORCPT + 30 others); 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 Received: from debutante.sirena.org.uk ([2a01:348:6:8808:fab::3] helo=debutante) by mezzanine.sirena.org.uk with esmtpsa (TLS1.2:RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from ) id 1aMLmG-0004be-85; Thu, 21 Jan 2016 20:24:20 +0000 Received: from broonie by debutante with local (Exim 4.86) (envelope-from ) id 1aMLmD-00026S-Fi; Thu, 21 Jan 2016 20:24:17 +0000 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 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on mezzanine.sirena.org.uk X-Spam-Level: X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 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 Precedence: bulk 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(-) -- 2.7.0.rc3 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;