Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 305822
b: refs/heads/master
c: dd8683e
h: refs/heads/master
v: v3
  • Loading branch information
Rafael J. Wysocki committed May 1, 2012
1 parent 4a07651 commit 830f36b
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 39 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: a5bef810ad9816a3a8e500d8832be77d52903a12
refs/heads/master: dd8683e97f12609fb3f8c4318628f0d246542f89
2 changes: 1 addition & 1 deletion trunk/drivers/base/power/domain.c
Original file line number Diff line number Diff line change
Expand Up @@ -381,6 +381,7 @@ static int pm_genpd_poweroff(struct generic_pm_domain *genpd)
return 0;
}

genpd->max_off_time_ns = -1;
if (genpd->gov && genpd->gov->power_down_ok) {
if (!genpd->gov->power_down_ok(&genpd->domain))
return -EAGAIN;
Expand Down Expand Up @@ -443,7 +444,6 @@ static int pm_genpd_poweroff(struct generic_pm_domain *genpd)
}

genpd->status = GPD_STATE_POWER_OFF;
genpd->power_off_time = ktime_get();

/* Update PM QoS information for devices in the domain. */
list_for_each_entry_reverse(pdd, &genpd->dev_list, list_node) {
Expand Down
69 changes: 34 additions & 35 deletions trunk/drivers/base/power/domain_governor.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,6 @@ static bool default_power_down_ok(struct dev_pm_domain *pd)
struct pm_domain_data *pdd;
s64 min_dev_off_time_ns;
s64 off_on_time_ns;
ktime_t time_now = ktime_get();

off_on_time_ns = genpd->power_off_latency_ns +
genpd->power_on_latency_ns;
Expand Down Expand Up @@ -118,8 +117,6 @@ static bool default_power_down_ok(struct dev_pm_domain *pd)
if (sd_max_off_ns < 0)
continue;

sd_max_off_ns -= ktime_to_ns(ktime_sub(time_now,
sd->power_off_time));
/*
* Check if the subdomain is allowed to be off long enough for
* the current domain to turn off and on (that's how much time
Expand All @@ -135,52 +132,54 @@ static bool default_power_down_ok(struct dev_pm_domain *pd)
min_dev_off_time_ns = -1;
list_for_each_entry(pdd, &genpd->dev_list, list_node) {
struct gpd_timing_data *td;
struct device *dev = pdd->dev;
s64 dev_off_time_ns;
s64 constraint_ns;

if (!dev->driver || dev->power.max_time_suspended_ns < 0)
if (!pdd->dev->driver)
continue;

/*
* Check if the device is allowed to be off long enough for the
* domain to turn off and on (that's how much time it will
* have to wait worst case).
*/
td = &to_gpd_data(pdd)->td;
dev_off_time_ns = dev->power.max_time_suspended_ns -
(td->start_latency_ns + td->restore_state_latency_ns +
ktime_to_ns(ktime_sub(time_now,
dev->power.suspend_time)));
if (dev_off_time_ns <= off_on_time_ns)
return false;

if (min_dev_off_time_ns > dev_off_time_ns
|| min_dev_off_time_ns < 0)
min_dev_off_time_ns = dev_off_time_ns;
}
constraint_ns = td->effective_constraint_ns;
/* default_stop_ok() need not be called before us. */
if (constraint_ns < 0) {
constraint_ns = dev_pm_qos_read_value(pdd->dev);
constraint_ns *= NSEC_PER_USEC;
}
if (constraint_ns == 0)
continue;

if (min_dev_off_time_ns < 0) {
/*
* There are no latency constraints, so the domain can spend
* arbitrary time in the "off" state.
* constraint_ns cannot be negative here, because the device has
* been suspended.
*/
genpd->max_off_time_ns = -1;
return true;
constraint_ns -= td->restore_state_latency_ns;
if (constraint_ns <= off_on_time_ns)
return false;

if (min_dev_off_time_ns > constraint_ns
|| min_dev_off_time_ns < 0)
min_dev_off_time_ns = constraint_ns;
}

/*
* The difference between the computed minimum delta and the time needed
* to turn the domain on is the maximum theoretical time this domain can
* spend in the "off" state.
* If the computed minimum device off time is negative, there are no
* latency constraints, so the domain can spend arbitrary time in the
* "off" state.
*/
min_dev_off_time_ns -= genpd->power_on_latency_ns;
if (min_dev_off_time_ns < 0)
return true;

/*
* If the difference between the computed minimum delta and the time
* needed to turn the domain off and back on on is smaller than the
* domain's power break even time, removing power from the domain is not
* worth it.
* The difference between the computed minimum device off time and the
* time needed to turn the domain on is the maximum theoretical time
* this domain can spend in the "off" state.
*/
if (genpd->break_even_ns >
min_dev_off_time_ns - genpd->power_off_latency_ns)
return false;

genpd->max_off_time_ns = min_dev_off_time_ns;
genpd->max_off_time_ns = min_dev_off_time_ns -
genpd->power_on_latency_ns;
return true;
}

Expand Down
2 changes: 0 additions & 2 deletions trunk/include/linux/pm_domain.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,7 @@ struct generic_pm_domain {
int (*power_on)(struct generic_pm_domain *domain);
s64 power_on_latency_ns;
struct gpd_dev_ops dev_ops;
s64 break_even_ns; /* Power break even for the entire domain. */
s64 max_off_time_ns; /* Maximum allowed "suspended" time. */
ktime_t power_off_time;
struct device_node *of_node; /* Node in device tree */
};

Expand Down

0 comments on commit 830f36b

Please sign in to comment.