Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 302100
b: refs/heads/master
c: 6492bc1
h: refs/heads/master
v: v3
  • Loading branch information
Mark Brown committed Apr 20, 2012
1 parent edf20b6 commit 1b8be89
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 15 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 854ccbaee7e48734936690a3fd4817c57e98aaad
refs/heads/master: 6492bc1b1a9cb21d28cde3c70d090c7648c8b0ed
54 changes: 40 additions & 14 deletions trunk/drivers/regulator/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ struct regulator_map {
struct regulator {
struct device *dev;
struct list_head list;
unsigned int always_on:1;
int uA_load;
int min_uV;
int max_uV;
Expand Down Expand Up @@ -155,6 +156,17 @@ static struct device_node *of_get_regulator(struct device *dev, const char *supp
return regnode;
}

static int _regulator_can_change_status(struct regulator_dev *rdev)
{
if (!rdev->constraints)
return 0;

if (rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_STATUS)
return 1;
else
return 0;
}

/* Platform voltage constraint check */
static int regulator_check_voltage(struct regulator_dev *rdev,
int *min_uV, int *max_uV)
Expand Down Expand Up @@ -1141,6 +1153,15 @@ static struct regulator *create_regulator(struct regulator_dev *rdev,
&regulator->max_uV);
}

/*
* Check now if the regulator is an always on regulator - if
* it is then we don't need to do nearly so much work for
* enable/disable calls.
*/
if (!_regulator_can_change_status(rdev) &&
_regulator_is_enabled(rdev))
regulator->always_on = true;

mutex_unlock(&rdev->mutex);
return regulator;
link_name_err:
Expand Down Expand Up @@ -1443,17 +1464,6 @@ void devm_regulator_put(struct regulator *regulator)
}
EXPORT_SYMBOL_GPL(devm_regulator_put);

static int _regulator_can_change_status(struct regulator_dev *rdev)
{
if (!rdev->constraints)
return 0;

if (rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_STATUS)
return 1;
else
return 0;
}

/* locks held by regulator_enable() */
static int _regulator_enable(struct regulator_dev *rdev)
{
Expand Down Expand Up @@ -1533,6 +1543,9 @@ int regulator_enable(struct regulator *regulator)
struct regulator_dev *rdev = regulator->rdev;
int ret = 0;

if (regulator->always_on)
return 0;

if (rdev->supply) {
ret = regulator_enable(rdev->supply);
if (ret != 0)
Expand Down Expand Up @@ -1611,6 +1624,9 @@ int regulator_disable(struct regulator *regulator)
struct regulator_dev *rdev = regulator->rdev;
int ret = 0;

if (regulator->always_on)
return 0;

mutex_lock(&rdev->mutex);
ret = _regulator_disable(rdev);
mutex_unlock(&rdev->mutex);
Expand Down Expand Up @@ -1719,6 +1735,9 @@ int regulator_disable_deferred(struct regulator *regulator, int ms)
struct regulator_dev *rdev = regulator->rdev;
int ret;

if (regulator->always_on)
return 0;

mutex_lock(&rdev->mutex);
rdev->deferred_disables++;
mutex_unlock(&rdev->mutex);
Expand Down Expand Up @@ -1757,6 +1776,9 @@ int regulator_is_enabled(struct regulator *regulator)
{
int ret;

if (regulator->always_on)
return 1;

mutex_lock(&regulator->rdev->mutex);
ret = _regulator_is_enabled(regulator->rdev);
mutex_unlock(&regulator->rdev->mutex);
Expand Down Expand Up @@ -2539,9 +2561,13 @@ int regulator_bulk_enable(int num_consumers,
int i;
int ret = 0;

for (i = 0; i < num_consumers; i++)
async_schedule_domain(regulator_bulk_enable_async,
&consumers[i], &async_domain);
for (i = 0; i < num_consumers; i++) {
if (consumers[i].consumer->always_on)
consumers[i].ret = 0;
else
async_schedule_domain(regulator_bulk_enable_async,
&consumers[i], &async_domain);
}

async_synchronize_full_domain(&async_domain);

Expand Down

0 comments on commit 1b8be89

Please sign in to comment.