Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'pm-domains'

* pm-domains:
PM / Domains: Make it possible to add devices to inactive domains

+23 -6
+21 -6
drivers/base/power/domain.c
··· 1263 1263 1264 1264 genpd_acquire_lock(genpd); 1265 1265 1266 - if (genpd->status == GPD_STATE_POWER_OFF) { 1267 - ret = -EINVAL; 1268 - goto out; 1269 - } 1270 - 1271 1266 if (genpd->prepared_count > 0) { 1272 1267 ret = -EAGAIN; 1273 1268 goto out; ··· 1285 1290 dev->power.subsys_data->domain_data = &gpd_data->base; 1286 1291 gpd_data->base.dev = dev; 1287 1292 list_add_tail(&gpd_data->base.list_node, &genpd->dev_list); 1288 - gpd_data->need_restore = false; 1293 + gpd_data->need_restore = genpd->status == GPD_STATE_POWER_OFF; 1289 1294 if (td) 1290 1295 gpd_data->td = *td; 1291 1296 ··· 1411 1416 spin_unlock_irqrestore(&dev->power.lock, flags); 1412 1417 } 1413 1418 EXPORT_SYMBOL_GPL(pm_genpd_dev_always_on); 1419 + 1420 + /** 1421 + * pm_genpd_dev_need_restore - Set/unset the device's "need restore" flag. 1422 + * @dev: Device to set/unset the flag for. 1423 + * @val: The new value of the device's "need restore" flag. 1424 + */ 1425 + void pm_genpd_dev_need_restore(struct device *dev, bool val) 1426 + { 1427 + struct pm_subsys_data *psd; 1428 + unsigned long flags; 1429 + 1430 + spin_lock_irqsave(&dev->power.lock, flags); 1431 + 1432 + psd = dev_to_psd(dev); 1433 + if (psd && psd->domain_data) 1434 + to_gpd_data(psd->domain_data)->need_restore = val; 1435 + 1436 + spin_unlock_irqrestore(&dev->power.lock, flags); 1437 + } 1438 + EXPORT_SYMBOL_GPL(pm_genpd_dev_need_restore); 1414 1439 1415 1440 /** 1416 1441 * pm_genpd_add_subdomain - Add a subdomain to an I/O PM domain.
+2
include/linux/pm_domain.h
··· 146 146 extern int pm_genpd_remove_device(struct generic_pm_domain *genpd, 147 147 struct device *dev); 148 148 extern void pm_genpd_dev_always_on(struct device *dev, bool val); 149 + extern void pm_genpd_dev_need_restore(struct device *dev, bool val); 149 150 extern int pm_genpd_add_subdomain(struct generic_pm_domain *genpd, 150 151 struct generic_pm_domain *new_subdomain); 151 152 extern int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd, ··· 190 189 return -ENOSYS; 191 190 } 192 191 static inline void pm_genpd_dev_always_on(struct device *dev, bool val) {} 192 + static inline void pm_genpd_dev_need_restore(struct device *dev, bool val) {} 193 193 static inline int pm_genpd_add_subdomain(struct generic_pm_domain *genpd, 194 194 struct generic_pm_domain *new_sd) 195 195 {