aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base/power/domain_governor.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/base/power/domain_governor.c')
-rw-r--r--drivers/base/power/domain_governor.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/drivers/base/power/domain_governor.c b/drivers/base/power/domain_governor.c
index 3a5c5346bc47..28dee3053f1f 100644
--- a/drivers/base/power/domain_governor.c
+++ b/drivers/base/power/domain_governor.c
@@ -105,7 +105,7 @@ static bool default_power_down_ok(struct dev_pm_domain *pd)
105 struct generic_pm_domain *genpd = pd_to_genpd(pd); 105 struct generic_pm_domain *genpd = pd_to_genpd(pd);
106 struct gpd_link *link; 106 struct gpd_link *link;
107 struct pm_domain_data *pdd; 107 struct pm_domain_data *pdd;
108 s64 min_dev_off_time_ns; 108 s64 min_off_time_ns;
109 s64 off_on_time_ns; 109 s64 off_on_time_ns;
110 110
111 if (genpd->max_off_time_changed) { 111 if (genpd->max_off_time_changed) {
@@ -142,6 +142,7 @@ static bool default_power_down_ok(struct dev_pm_domain *pd)
142 to_gpd_data(pdd)->td.save_state_latency_ns; 142 to_gpd_data(pdd)->td.save_state_latency_ns;
143 } 143 }
144 144
145 min_off_time_ns = -1;
145 /* 146 /*
146 * Check if subdomains can be off for enough time. 147 * Check if subdomains can be off for enough time.
147 * 148 *
@@ -161,12 +162,14 @@ static bool default_power_down_ok(struct dev_pm_domain *pd)
161 */ 162 */
162 if (sd_max_off_ns <= off_on_time_ns) 163 if (sd_max_off_ns <= off_on_time_ns)
163 return false; 164 return false;
165
166 if (min_off_time_ns > sd_max_off_ns || min_off_time_ns < 0)
167 min_off_time_ns = sd_max_off_ns;
164 } 168 }
165 169
166 /* 170 /*
167 * Check if the devices in the domain can be off enough time. 171 * Check if the devices in the domain can be off enough time.
168 */ 172 */
169 min_dev_off_time_ns = -1;
170 list_for_each_entry(pdd, &genpd->dev_list, list_node) { 173 list_for_each_entry(pdd, &genpd->dev_list, list_node) {
171 struct gpd_timing_data *td; 174 struct gpd_timing_data *td;
172 s64 constraint_ns; 175 s64 constraint_ns;
@@ -197,9 +200,8 @@ static bool default_power_down_ok(struct dev_pm_domain *pd)
197 if (constraint_ns <= off_on_time_ns) 200 if (constraint_ns <= off_on_time_ns)
198 return false; 201 return false;
199 202
200 if (min_dev_off_time_ns > constraint_ns 203 if (min_off_time_ns > constraint_ns || min_off_time_ns < 0)
201 || min_dev_off_time_ns < 0) 204 min_off_time_ns = constraint_ns;
202 min_dev_off_time_ns = constraint_ns;
203 } 205 }
204 206
205 genpd->cached_power_down_ok = true; 207 genpd->cached_power_down_ok = true;
@@ -209,16 +211,15 @@ static bool default_power_down_ok(struct dev_pm_domain *pd)
209 * latency constraints, so the domain can spend arbitrary time in the 211 * latency constraints, so the domain can spend arbitrary time in the
210 * "off" state. 212 * "off" state.
211 */ 213 */
212 if (min_dev_off_time_ns < 0) 214 if (min_off_time_ns < 0)
213 return true; 215 return true;
214 216
215 /* 217 /*
216 * The difference between the computed minimum device off time and the 218 * The difference between the computed minimum subdomain or device off
217 * time needed to turn the domain on is the maximum theoretical time 219 * time and the time needed to turn the domain on is the maximum
218 * this domain can spend in the "off" state. 220 * theoretical time this domain can spend in the "off" state.
219 */ 221 */
220 genpd->max_off_time_ns = min_dev_off_time_ns - 222 genpd->max_off_time_ns = min_off_time_ns - genpd->power_on_latency_ns;
221 genpd->power_on_latency_ns;
222 return true; 223 return true;
223} 224}
224 225