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

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'pmdomain-v6.17-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/linux-pm

Pull pmdomain fixes from Ulf Hansson:
"pmdomain core:
- Restore behaviour for disabling unused PM domains and introduce the
GENPD_FLAG_NO_STAY_ON configuration bit

pmdomain providers:
- renesas: Don't keep unused PM domains powered-on
- rockchip: Fix regulator dependency with GENPD_FLAG_NO_STAY_ON"

* tag 'pmdomain-v6.17-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/linux-pm:
pmdomain: renesas: rmobile-sysc: Don't keep unused PM domains powered-on
pmdomain: renesas: rcar-gen4-sysc: Don't keep unused PM domains powered-on
pmdomain: renesas: rcar-sysc: Don't keep unused PM domains powered-on
pmdomain: rockchip: Fix regulator dependency with GENPD_FLAG_NO_STAY_ON
pmdomain: core: Restore behaviour for disabling unused PM domains
pmdomain: renesas: rcar-sysc: Make rcar_sysc_onecell_np __initdata

+27 -9
+14 -6
drivers/pmdomain/core.c
··· 187 187 #define genpd_is_opp_table_fw(genpd) (genpd->flags & GENPD_FLAG_OPP_TABLE_FW) 188 188 #define genpd_is_dev_name_fw(genpd) (genpd->flags & GENPD_FLAG_DEV_NAME_FW) 189 189 #define genpd_is_no_sync_state(genpd) (genpd->flags & GENPD_FLAG_NO_SYNC_STATE) 190 + #define genpd_is_no_stay_on(genpd) (genpd->flags & GENPD_FLAG_NO_STAY_ON) 190 191 191 192 static inline bool irq_safe_dev_in_sleep_domain(struct device *dev, 192 193 const struct generic_pm_domain *genpd) ··· 1358 1357 return ret; 1359 1358 } 1360 1359 1361 - #ifndef CONFIG_PM_GENERIC_DOMAINS_OF 1362 1360 static bool pd_ignore_unused; 1363 1361 static int __init pd_ignore_unused_setup(char *__unused) 1364 1362 { ··· 1382 1382 mutex_lock(&gpd_list_lock); 1383 1383 1384 1384 list_for_each_entry(genpd, &gpd_list, gpd_list_node) { 1385 - genpd_lock(genpd); 1386 - genpd->stay_on = false; 1387 - genpd_unlock(genpd); 1388 1385 genpd_queue_power_off_work(genpd); 1389 1386 } 1390 1387 ··· 1390 1393 return 0; 1391 1394 } 1392 1395 late_initcall_sync(genpd_power_off_unused); 1393 - #endif 1394 1396 1395 1397 #ifdef CONFIG_PM_SLEEP 1396 1398 ··· 2363 2367 } 2364 2368 } 2365 2369 2370 + #ifdef CONFIG_PM_GENERIC_DOMAINS_OF 2371 + static void genpd_set_stay_on(struct generic_pm_domain *genpd, bool is_off) 2372 + { 2373 + genpd->stay_on = !genpd_is_no_stay_on(genpd) && !is_off; 2374 + } 2375 + #else 2376 + static void genpd_set_stay_on(struct generic_pm_domain *genpd, bool is_off) 2377 + { 2378 + genpd->stay_on = false; 2379 + } 2380 + #endif 2381 + 2366 2382 /** 2367 2383 * pm_genpd_init - Initialize a generic I/O PM domain object. 2368 2384 * @genpd: PM domain object to initialize. ··· 2400 2392 INIT_WORK(&genpd->power_off_work, genpd_power_off_work_fn); 2401 2393 atomic_set(&genpd->sd_count, 0); 2402 2394 genpd->status = is_off ? GENPD_STATE_OFF : GENPD_STATE_ON; 2403 - genpd->stay_on = !is_off; 2395 + genpd_set_stay_on(genpd, is_off); 2404 2396 genpd->sync_state = GENPD_SYNC_STATE_OFF; 2405 2397 genpd->device_count = 0; 2406 2398 genpd->provider = NULL;
+1
drivers/pmdomain/renesas/rcar-gen4-sysc.c
··· 251 251 genpd->detach_dev = cpg_mssr_detach_dev; 252 252 } 253 253 254 + genpd->flags |= GENPD_FLAG_NO_STAY_ON; 254 255 genpd->power_off = rcar_gen4_sysc_pd_power_off; 255 256 genpd->power_on = rcar_gen4_sysc_pd_power_on; 256 257
+2 -1
drivers/pmdomain/renesas/rcar-sysc.c
··· 241 241 } 242 242 } 243 243 244 + genpd->flags |= GENPD_FLAG_NO_STAY_ON; 244 245 genpd->power_off = rcar_sysc_pd_power_off; 245 246 genpd->power_on = rcar_sysc_pd_power_on; 246 247 ··· 343 342 }; 344 343 345 344 static struct genpd_onecell_data *rcar_sysc_onecell_data; 346 - static struct device_node *rcar_sysc_onecell_np; 345 + static struct device_node *rcar_sysc_onecell_np __initdata = NULL; 347 346 348 347 static int __init rcar_sysc_pd_init(void) 349 348 {
+2 -1
drivers/pmdomain/renesas/rmobile-sysc.c
··· 100 100 struct generic_pm_domain *genpd = &rmobile_pd->genpd; 101 101 struct dev_power_governor *gov = rmobile_pd->gov; 102 102 103 - genpd->flags |= GENPD_FLAG_PM_CLK | GENPD_FLAG_ACTIVE_WAKEUP; 103 + genpd->flags |= GENPD_FLAG_PM_CLK | GENPD_FLAG_ACTIVE_WAKEUP | 104 + GENPD_FLAG_NO_STAY_ON; 104 105 genpd->attach_dev = cpg_mstp_attach_dev; 105 106 genpd->detach_dev = cpg_mstp_detach_dev; 106 107
+1 -1
drivers/pmdomain/rockchip/pm-domains.c
··· 865 865 pd->genpd.power_on = rockchip_pd_power_on; 866 866 pd->genpd.attach_dev = rockchip_pd_attach_dev; 867 867 pd->genpd.detach_dev = rockchip_pd_detach_dev; 868 - pd->genpd.flags = GENPD_FLAG_PM_CLK; 868 + pd->genpd.flags = GENPD_FLAG_PM_CLK | GENPD_FLAG_NO_STAY_ON; 869 869 if (pd_info->active_wakeup) 870 870 pd->genpd.flags |= GENPD_FLAG_ACTIVE_WAKEUP; 871 871 pm_genpd_init(&pd->genpd, NULL,
+7
include/linux/pm_domain.h
··· 115 115 * genpd provider specific way, likely through a 116 116 * parent device node. This flag makes genpd to 117 117 * skip its internal support for this. 118 + * 119 + * GENPD_FLAG_NO_STAY_ON: For genpd OF providers a powered-on PM domain at 120 + * initialization is prevented from being 121 + * powered-off until the ->sync_state() callback is 122 + * invoked. This flag informs genpd to allow a 123 + * power-off without waiting for ->sync_state(). 118 124 */ 119 125 #define GENPD_FLAG_PM_CLK (1U << 0) 120 126 #define GENPD_FLAG_IRQ_SAFE (1U << 1) ··· 132 126 #define GENPD_FLAG_OPP_TABLE_FW (1U << 7) 133 127 #define GENPD_FLAG_DEV_NAME_FW (1U << 8) 134 128 #define GENPD_FLAG_NO_SYNC_STATE (1U << 9) 129 + #define GENPD_FLAG_NO_STAY_ON (1U << 10) 135 130 136 131 enum gpd_status { 137 132 GENPD_STATE_ON = 0, /* PM domain is on */