Commit 5451781d authored by Douglas Anderson's avatar Douglas Anderson Committed by Mark Brown

regulator: core: Only count load for enabled consumers

In general when the consumer of a regulator requests that the
regulator be disabled it no longer will be drawing much load from the
regulator--it should just be the leakage current and that should be
very close to 0.

Up to this point the regulator framework has continued to count a
consumer's load request for disabled regulators.  This has led to code
patterns that look like this:

  enable_my_thing():
    regular_set_load(reg, load_uA)
    regulator_enable(reg)

  disable_my_thing():
    regulator_disable(reg)
    regulator_set_load(reg, 0)

Sometimes disable_my_thing() sets a nominal (<= 100 uA) load instead
of setting a 0 uA load.  I will make the assertion that nearly all (if
not all) places where we set a nominal load of 100 uA or less we end
up with a result that is the same as if we had set a load of 0 uA.
Specifically:
- The whole point of setting the load is to help set the operating
  mode of the regulator.  Higher loads may need less efficient
  operating modes.
- The only time this matters at all is if there is another consumer of
  the regulator that wants the regulator on.  If there are no other
  consumers of the regulator then the regulator will turn off and we
  don't care about the operating mode.
- If there's another consumer that actually wants the regulator on
  then presumably it is requesting a load that makes our nominal
  <= 100 uA load insignificant.

A quick survey of the existing callers to regulator_set_load() to see
how everyone uses it:
Signed-off-by: default avatarDouglas Anderson <dianders@chromium.org>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 466affa0
This diff is collapsed.
...@@ -42,6 +42,8 @@ struct regulator { ...@@ -42,6 +42,8 @@ struct regulator {
unsigned int always_on:1; unsigned int always_on:1;
unsigned int bypass:1; unsigned int bypass:1;
int uA_load; int uA_load;
unsigned int enable_count;
unsigned int deferred_disables;
struct regulator_voltage voltage[REGULATOR_STATES_NUM]; struct regulator_voltage voltage[REGULATOR_STATES_NUM];
const char *supply_name; const char *supply_name;
struct device_attribute dev_attr; struct device_attribute dev_attr;
......
...@@ -474,7 +474,6 @@ struct regulator_dev { ...@@ -474,7 +474,6 @@ struct regulator_dev {
struct regmap *regmap; struct regmap *regmap;
struct delayed_work disable_work; struct delayed_work disable_work;
int deferred_disables;
void *reg_data; /* regulator_dev data */ void *reg_data; /* regulator_dev data */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment