[PATCH/RFC] pmdomain: core: Support pd_ignore_unused with sync_state

From: Geert Uytterhoeven

Date: Mon Feb 16 2026 - 13:47:52 EST


Since the introduction of the sync_state mechanism, the
"pd_ignore_unused" kernel command line option doesn't really work
anymore. While genpd_power_off_unused() still checks for that flag
before powering down unused domains, the new sync_state callbacks lack
such checks, thus powering down unused domains regardless.

Fix this by adding checks to the sync_state helpers and callbacks.
Factor out the printing of the warning message, to make sure it is
printed only once.

Fixes: 002ebddd695a5399 ("pmdomain: core: Restore behaviour for disabling unused PM domains")
Signed-off-by: Geert Uytterhoeven <geert+renesas@xxxxxxxxx>
---
RFC as I have no need for this in upstream.
---
drivers/pmdomain/core.c | 20 +++++++++++++++++---
1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/drivers/pmdomain/core.c b/drivers/pmdomain/core.c
index 7b563757935071dd..1f7d90bcc30d12e5 100644
--- a/drivers/pmdomain/core.c
+++ b/drivers/pmdomain/core.c
@@ -1366,6 +1366,16 @@ static int __init pd_ignore_unused_setup(char *__unused)
}
__setup("pd_ignore_unused", pd_ignore_unused_setup);

+static bool genpd_ignore_unused(void)
+{
+ if (pd_ignore_unused) {
+ pr_warn_once("genpd: Not disabling unused power domains\n");
+ return true;
+ }
+
+ return false;
+}
+
/**
* genpd_power_off_unused - Power off all PM domains with no devices in use.
*/
@@ -1373,10 +1383,8 @@ static int __init genpd_power_off_unused(void)
{
struct generic_pm_domain *genpd;

- if (pd_ignore_unused) {
- pr_warn("genpd: Not disabling unused power domains\n");
+ if (genpd_ignore_unused())
return 0;
- }

pr_info("genpd: Disabling unused power domains\n");
mutex_lock(&gpd_list_lock);
@@ -3510,6 +3518,9 @@ void of_genpd_sync_state(struct device_node *np)
{
struct generic_pm_domain *genpd;

+ if (genpd_ignore_unused())
+ return;
+
if (!np)
return;

@@ -3544,6 +3555,9 @@ static void genpd_provider_sync_state(struct device *dev)
break;

case GENPD_SYNC_STATE_SIMPLE:
+ if (genpd_ignore_unused())
+ return;
+
genpd_lock(genpd);
genpd->stay_on = false;
genpd_power_off(genpd, false, 0);
--
2.43.0