All of lore.kernel.org
 help / color / mirror / Atom feed
From: Douglas Anderson <dianders@chromium.org>
To: Mark Brown <broonie@kernel.org>
Cc: Bjorn Andersson <bjorn.andersson@linaro.org>,
	evgreen@chromium.org, swboyd@chromium.org,
	Dmitry Osipenko <digetx@gmail.com>,
	ryandcase@chromium.org, David Collins <collinsd@codeaurora.org>,
	linux-arm-msm@vger.kernel.org,
	Douglas Anderson <dianders@chromium.org>,
	Liam Girdwood <lgirdwood@gmail.com>,
	linux-kernel@vger.kernel.org
Subject: [PATCH 6/7] regulator: core: Avoid propagating to supplies when possible
Date: Mon, 19 Nov 2018 16:26:53 -0800	[thread overview]
Message-ID: <20181120002654.1891-6-dianders@chromium.org> (raw)
In-Reply-To: <20181120002654.1891-1-dianders@chromium.org>

When we called regulator_enable() on a regulator we'd end up
propagating that call all the way up the chain every time.  This is a
bit of a waste of time.  A child regulator already refcounts its own
enables so it should avoid passing on to its parent unless the
refcount transitioned between 0 and 1.

Historically this hasn't been a huge problem since we skipped dealing
with enable for always-on regulators.  In a previous patch, however,
we removed the always-on optimization.  On one system, the debugfs
regulator_summary was now showing a "use_count" of 33 for a top-level
regulator.

Let's implement this optimization.  This turns out to be fairly
trivial with the recent reorganization of the regulator core.

NOTE: as part of this patch I'll make "always-on" regulators start
with a use count of 1.  This keeps the counts clean when recursively
resolving regulators.

Signed-off-by: Douglas Anderson <dianders@chromium.org>
---

 drivers/regulator/core.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 23e852d38b88..2eda87520832 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -1822,6 +1822,7 @@ static int regulator_resolve_supply(struct regulator_dev *rdev)
 			rdev->supply = NULL;
 			return ret;
 		}
+		rdev->use_count = 1;
 	}
 
 	return 0;
@@ -2491,7 +2492,7 @@ static int _regulator_enable(struct regulator *regulator)
 
 	lockdep_assert_held_once(&rdev->mutex.base);
 
-	if (rdev->supply) {
+	if (rdev->use_count == 0 && rdev->supply) {
 		ret = _regulator_enable(rdev->supply);
 		if (ret < 0)
 			return ret;
@@ -2539,7 +2540,7 @@ static int _regulator_enable(struct regulator *regulator)
 	_regulator_handle_consumer_disable(regulator);
 
 err_disable_supply:
-	if (rdev->supply)
+	if (rdev->use_count == 0 && rdev->supply)
 		_regulator_disable(rdev->supply);
 
 	return ret;
@@ -2648,7 +2649,7 @@ static int _regulator_disable(struct regulator *regulator)
 	if (ret == 0 && rdev->coupling_desc.n_coupled > 1)
 		ret = regulator_balance_voltage(rdev, PM_SUSPEND_ON);
 
-	if (ret == 0 && rdev->supply)
+	if (ret == 0 && rdev->use_count == 0 && rdev->supply)
 		ret = _regulator_disable(rdev->supply);
 
 	return ret;
-- 
2.19.1.1215.g8438c0b245-goog

  parent reply	other threads:[~2018-11-20  0:26 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-20  0:26 [PATCH 1/7] regulator: core: Properly expose requested_microamps in sysfs Douglas Anderson
2018-11-20  0:26 ` [PATCH 2/7] regulator: core: Don't assume always_on when is_enabled returns err Douglas Anderson
2018-11-20 16:00   ` Mark Brown
2018-11-20 18:17     ` Doug Anderson
2018-11-20  0:26 ` [PATCH 3/7] regulator: core: Don't double-disable supplies in regulator_disable_deferred() Douglas Anderson
2018-11-20  0:45   ` Dmitry Osipenko
2018-11-20  0:26 ` [PATCH 4/7] regulator: core: Only count load for enabled consumers Douglas Anderson
2018-11-20  0:26 ` [PATCH 5/7] regulator: core: add enable_count for consumers to debug fs Douglas Anderson
2018-11-20 16:10   ` Mark Brown
2018-11-20 16:52     ` Doug Anderson
2018-11-20 16:58       ` Mark Brown
2018-11-20 17:05         ` Doug Anderson
2018-11-20 17:57   ` Doug Anderson
2018-11-20  0:26 ` Douglas Anderson [this message]
2018-11-20  0:26 ` [PATCH 7/7] regulator: core: Remove loop disabling supplies in regulator_force_disable() Douglas Anderson
2018-11-20  0:58   ` Dmitry Osipenko
2018-11-20  2:05     ` Doug Anderson
2018-11-20 15:54   ` Mark Brown
2018-11-20 16:04     ` Doug Anderson
2018-11-20 16:25       ` Mark Brown
2018-11-20 16:57         ` Doug Anderson
2018-11-20 16:59           ` Mark Brown
2018-11-20 17:00           ` Mark Brown
2018-11-20 17:55   ` Doug Anderson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181120002654.1891-6-dianders@chromium.org \
    --to=dianders@chromium.org \
    --cc=bjorn.andersson@linaro.org \
    --cc=broonie@kernel.org \
    --cc=collinsd@codeaurora.org \
    --cc=digetx@gmail.com \
    --cc=evgreen@chromium.org \
    --cc=lgirdwood@gmail.com \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=ryandcase@chromium.org \
    --cc=swboyd@chromium.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.