diff --git a/arch/arm/mach-s3c/pm-s3c64xx.c b/arch/arm/mach-s3c/pm-s3c64xx.c
index 284d5f462513..89671d1439f0 100644
--- a/arch/arm/mach-s3c/pm-s3c64xx.c
+++ b/arch/arm/mach-s3c/pm-s3c64xx.c
@@ -291,10 +291,10 @@ int __init s3c64xx_pm_init(void)
 
 	for (i = 0; i < ARRAY_SIZE(s3c64xx_always_on_pm_domains); i++)
 		pm_genpd_init(&s3c64xx_always_on_pm_domains[i]->pd,
-			      &pm_domain_always_on_gov, false);
+			      &pm_domain_always_on_gov, GENPD_STATE_ON);
 
 	for (i = 0; i < ARRAY_SIZE(s3c64xx_pm_domains); i++)
-		pm_genpd_init(&s3c64xx_pm_domains[i]->pd, NULL, false);
+		pm_genpd_init(&s3c64xx_pm_domains[i]->pd, NULL, GENPD_STATE_ON);
 
 #ifdef CONFIG_S3C_DEV_FB
 	if (dev_get_platdata(&s3c_device_fb.dev))
diff --git a/arch/arm/mach-ux500/pm_domains.c b/arch/arm/mach-ux500/pm_domains.c
index 427b9ac4af6c..bf81f4354288 100644
--- a/arch/arm/mach-ux500/pm_domains.c
+++ b/arch/arm/mach-ux500/pm_domains.c
@@ -72,7 +72,7 @@ int __init ux500_pm_domains_init(void)
 	genpd_data->num_domains = ARRAY_SIZE(ux500_pm_domains);
 
 	for (i = 0; i < ARRAY_SIZE(ux500_pm_domains); ++i)
-		pm_genpd_init(ux500_pm_domains[i], NULL, false);
+		pm_genpd_init(ux500_pm_domains[i], NULL, GENPD_STATE_ON);
 
 	of_genpd_add_provider_onecell(np, genpd_data);
 	return 0;
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
index 32084e38b73d..33a3945c023e 100644
--- a/drivers/base/power/domain.c
+++ b/drivers/base/power/domain.c
@@ -2043,12 +2043,13 @@ static void genpd_lock_init(struct generic_pm_domain *genpd)
  * pm_genpd_init - Initialize a generic I/O PM domain object.
  * @genpd: PM domain object to initialize.
  * @gov: PM domain governor to associate with the domain (may be NULL).
- * @is_off: Initial value of the domain's power_is_off field.
+ * @boot_status: Initial (boot) state of the domain.
  *
  * Returns 0 on successful initialization, else a negative error code.
  */
 int pm_genpd_init(struct generic_pm_domain *genpd,
-		  struct dev_power_governor *gov, bool is_off)
+		  struct dev_power_governor *gov,
+		  enum gpd_status boot_status)
 {
 	int ret;
 
@@ -2063,7 +2064,7 @@ int pm_genpd_init(struct generic_pm_domain *genpd,
 	genpd->gov = gov;
 	INIT_WORK(&genpd->power_off_work, genpd_power_off_work_fn);
 	atomic_set(&genpd->sd_count, 0);
-	genpd->status = is_off ? GENPD_STATE_OFF : GENPD_STATE_ON;
+	genpd->status = boot_status;
 	genpd->device_count = 0;
 	genpd->provider = NULL;
 	genpd->has_provider = false;
@@ -3112,7 +3113,8 @@ static int genpd_summary_one(struct seq_file *s,
 {
 	static const char * const status_lookup[] = {
 		[GENPD_STATE_ON] = "on",
-		[GENPD_STATE_OFF] = "off"
+		[GENPD_STATE_OFF] = "off",
+		[GENPD_STATE_UNKNOWN] = "unknown"
 	};
 	struct pm_domain_data *pm_data;
 	const char *kobj_path;
@@ -3194,7 +3196,8 @@ static int status_show(struct seq_file *s, void *data)
 {
 	static const char * const status_lookup[] = {
 		[GENPD_STATE_ON] = "on",
-		[GENPD_STATE_OFF] = "off"
+		[GENPD_STATE_OFF] = "off",
+		[GENPD_STATE_UNKNOWN] = "unknown"
 	};
 
 	struct generic_pm_domain *genpd = s->private;
diff --git a/drivers/clk/davinci/psc.c b/drivers/clk/davinci/psc.c
index cd85d9f158b0..c1deacf7eb94 100644
--- a/drivers/clk/davinci/psc.c
+++ b/drivers/clk/davinci/psc.c
@@ -283,7 +283,8 @@ davinci_lpsc_clk_register(struct device *dev, const char *name,
 	lpsc->pm_domain.flags = GENPD_FLAG_PM_CLK;
 
 	is_on = davinci_lpsc_clk_is_enabled(&lpsc->hw);
-	pm_genpd_init(&lpsc->pm_domain, NULL, is_on);
+	pm_genpd_init(&lpsc->pm_domain, NULL,
+		      is_on ? GENPD_STATE_OFF : GENPD_STATE_ON);
 
 	return lpsc;
 }
diff --git a/drivers/clk/mmp/pwr-island.c b/drivers/clk/mmp/pwr-island.c
index edaa2433a472..d3d88a4124cd 100644
--- a/drivers/clk/mmp/pwr-island.c
+++ b/drivers/clk/mmp/pwr-island.c
@@ -106,7 +106,7 @@ struct generic_pm_domain *mmp_pm_domain_register(const char *name,
 	pm_domain->flags = flags;
 	pm_domain->lock = lock;
 
-	pm_genpd_init(&pm_domain->genpd, NULL, true);
+	pm_genpd_init(&pm_domain->genpd, NULL, GENPD_STATE_OFF);
 	pm_domain->genpd.name = name;
 	pm_domain->genpd.power_on = mmp_pm_domain_power_on;
 	pm_domain->genpd.power_off = mmp_pm_domain_power_off;
diff --git a/drivers/clk/qcom/gdsc.c b/drivers/clk/qcom/gdsc.c
index 5358e28122ab..1acf208cdc8e 100644
--- a/drivers/clk/qcom/gdsc.c
+++ b/drivers/clk/qcom/gdsc.c
@@ -452,7 +452,7 @@ static int gdsc_init(struct gdsc *sc)
 	if (!sc->pd.power_on)
 		sc->pd.power_on = gdsc_enable;
 
-	ret = pm_genpd_init(&sc->pd, NULL, !on);
+	ret = pm_genpd_init(&sc->pd, NULL, on ? GENPD_STATE_ON : GENPD_STATE_OFF);
 	if (ret)
 		goto err_disable_supply;
 
diff --git a/drivers/clk/renesas/clk-mstp.c b/drivers/clk/renesas/clk-mstp.c
index 90804ac06fa5..cb1a3f4f65fa 100644
--- a/drivers/clk/renesas/clk-mstp.c
+++ b/drivers/clk/renesas/clk-mstp.c
@@ -336,7 +336,7 @@ void __init cpg_mstp_add_clk_domain(struct device_node *np)
 		    GENPD_FLAG_ACTIVE_WAKEUP;
 	pd->attach_dev = cpg_mstp_attach_dev;
 	pd->detach_dev = cpg_mstp_detach_dev;
-	pm_genpd_init(pd, &pm_domain_always_on_gov, false);
+	pm_genpd_init(pd, &pm_domain_always_on_gov, GENPD_STATE_ON);
 
 	of_genpd_add_provider_simple(np, pd);
 }
diff --git a/drivers/clk/renesas/r9a06g032-clocks.c b/drivers/clk/renesas/r9a06g032-clocks.c
index 40828616f723..34a3bc4d2c2b 100644
--- a/drivers/clk/renesas/r9a06g032-clocks.c
+++ b/drivers/clk/renesas/r9a06g032-clocks.c
@@ -802,7 +802,7 @@ static int r9a06g032_add_clk_domain(struct device *dev)
 		    GENPD_FLAG_ACTIVE_WAKEUP;
 	pd->attach_dev = r9a06g032_attach_dev;
 	pd->detach_dev = r9a06g032_detach_dev;
-	pm_genpd_init(pd, &pm_domain_always_on_gov, false);
+	pm_genpd_init(pd, &pm_domain_always_on_gov, GENPD_STATE_ON);
 
 	of_genpd_add_provider_simple(np, pd);
 	return 0;
diff --git a/drivers/clk/renesas/renesas-cpg-mssr.c b/drivers/clk/renesas/renesas-cpg-mssr.c
index e9c0e341380e..14f39db296e1 100644
--- a/drivers/clk/renesas/renesas-cpg-mssr.c
+++ b/drivers/clk/renesas/renesas-cpg-mssr.c
@@ -588,7 +588,7 @@ static int __init cpg_mssr_add_clk_domain(struct device *dev,
 		       GENPD_FLAG_ACTIVE_WAKEUP;
 	genpd->attach_dev = cpg_mssr_attach_dev;
 	genpd->detach_dev = cpg_mssr_detach_dev;
-	ret = pm_genpd_init(genpd, &pm_domain_always_on_gov, false);
+	ret = pm_genpd_init(genpd, &pm_domain_always_on_gov, GENPD_STATE_ON);
 	if (ret)
 		return ret;
 
diff --git a/drivers/clk/renesas/rzg2l-cpg.c b/drivers/clk/renesas/rzg2l-cpg.c
index 93b02cdc98c2..10620998d79b 100644
--- a/drivers/clk/renesas/rzg2l-cpg.c
+++ b/drivers/clk/renesas/rzg2l-cpg.c
@@ -1322,7 +1322,7 @@ static int __init rzg2l_cpg_add_clk_domain(struct rzg2l_cpg_priv *priv)
 		       GENPD_FLAG_ACTIVE_WAKEUP;
 	genpd->attach_dev = rzg2l_cpg_attach_dev;
 	genpd->detach_dev = rzg2l_cpg_detach_dev;
-	ret = pm_genpd_init(genpd, &pm_domain_always_on_gov, false);
+	ret = pm_genpd_init(genpd, &pm_domain_always_on_gov, GENPD_STATE_ON);
 	if (ret)
 		return ret;
 
diff --git a/drivers/cpuidle/cpuidle-psci-domain.c b/drivers/cpuidle/cpuidle-psci-domain.c
index c2d6d9c3c930..5f600ab981c1 100644
--- a/drivers/cpuidle/cpuidle-psci-domain.c
+++ b/drivers/cpuidle/cpuidle-psci-domain.c
@@ -76,7 +76,7 @@ static int psci_pd_init(struct device_node *np, bool use_osi)
 	/* Use governor for CPU PM domains if it has some states to manage. */
 	pd_gov = pd->states ? &pm_domain_cpu_gov : NULL;
 
-	ret = pm_genpd_init(pd, pd_gov, false);
+	ret = pm_genpd_init(pd, pd_gov, GENPD_STATE_ON);
 	if (ret)
 		goto free_pd_prov;
 
diff --git a/drivers/cpuidle/cpuidle-riscv-sbi.c b/drivers/cpuidle/cpuidle-riscv-sbi.c
index f2ccda2c3871..ef1301a739d1 100644
--- a/drivers/cpuidle/cpuidle-riscv-sbi.c
+++ b/drivers/cpuidle/cpuidle-riscv-sbi.c
@@ -441,7 +441,7 @@ static int sbi_pd_init(struct device_node *np)
 	/* Use governor for CPU PM domains if it has some states to manage. */
 	pd_gov = pd->states ? &pm_domain_cpu_gov : NULL;
 
-	ret = pm_genpd_init(pd, pd_gov, false);
+	ret = pm_genpd_init(pd, pd_gov, GENPD_STATE_ON);
 	if (ret)
 		goto free_pd_prov;
 
diff --git a/drivers/firmware/arm_scmi/scmi_pm_domain.c b/drivers/firmware/arm_scmi/scmi_pm_domain.c
index 0e05a79de82d..fde44900fa18 100644
--- a/drivers/firmware/arm_scmi/scmi_pm_domain.c
+++ b/drivers/firmware/arm_scmi/scmi_pm_domain.c
@@ -104,7 +104,7 @@ static int scmi_pm_domain_probe(struct scmi_device *sdev)
 		scmi_pd->genpd.power_on = scmi_pd_power_on;
 
 		pm_genpd_init(&scmi_pd->genpd, NULL,
-			      state == SCMI_POWER_STATE_GENERIC_OFF);
+			      state == SCMI_POWER_STATE_GENERIC_OFF ? GENPD_STATE_OFF : GENPD_STATE_ON);
 
 		domains[i] = &scmi_pd->genpd;
 	}
diff --git a/drivers/firmware/imx/scu-pd.c b/drivers/firmware/imx/scu-pd.c
index 84b673427073..45fa546bc0a0 100644
--- a/drivers/firmware/imx/scu-pd.c
+++ b/drivers/firmware/imx/scu-pd.c
@@ -337,7 +337,8 @@ imx_scu_add_pm_domain(struct device *dev, int idx,
 		return NULL;
 	}
 
-	ret = pm_genpd_init(&sc_pd->pd, NULL, is_off);
+	ret = pm_genpd_init(&sc_pd->pd, NULL,
+			    is_off ? GENPD_STATE_OFF : GENPD_STATE_ON);
 	if (ret) {
 		dev_warn(dev, "failed to init pd %s rsrc id %d",
 			 sc_pd->name, sc_pd->rsrc);
diff --git a/drivers/firmware/scpi_pm_domain.c b/drivers/firmware/scpi_pm_domain.c
index 800673910b51..7d05d11e8dc3 100644
--- a/drivers/firmware/scpi_pm_domain.c
+++ b/drivers/firmware/scpi_pm_domain.c
@@ -125,7 +125,7 @@ static int scpi_pm_domain_probe(struct platform_device *pdev)
 		 * The SCP firmware itself may have switched on some domains,
 		 * but for reference counting purpose, keep it this way.
 		 */
-		pm_genpd_init(&scpi_pd->genpd, NULL, true);
+		pm_genpd_init(&scpi_pd->genpd, NULL, GENPD_STATE_OFF);
 	}
 
 	scpi_pd_data->domains = domains;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c
index 6d72355ac492..0f802e5dcd54 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c
@@ -261,7 +261,7 @@ static int acp_hw_init(void *handle)
 	adev->acp.acp_genpd->gpd.power_on = acp_poweron;
 	adev->acp.acp_genpd->adev = adev;
 
-	pm_genpd_init(&adev->acp.acp_genpd->gpd, NULL, false);
+	pm_genpd_init(&adev->acp.acp_genpd->gpd, NULL, GENPD_STATE_ON);
 	dmi_check_system(acp_quirk_table);
 	switch (acp_machine_id) {
 	case ST_JADEITE:
diff --git a/drivers/irqchip/irq-qcom-mpm.c b/drivers/irqchip/irq-qcom-mpm.c
index d30614661eea..1fbe52fdb315 100644
--- a/drivers/irqchip/irq-qcom-mpm.c
+++ b/drivers/irqchip/irq-qcom-mpm.c
@@ -398,7 +398,7 @@ static int qcom_mpm_init(struct device_node *np, struct device_node *parent)
 	if (!genpd->name)
 		return -ENOMEM;
 
-	ret = pm_genpd_init(genpd, NULL, false);
+	ret = pm_genpd_init(genpd, NULL, GENPD_STATE_ON);
 	if (ret) {
 		dev_err(dev, "failed to init genpd: %d\n", ret);
 		return ret;
diff --git a/drivers/soc/actions/owl-sps.c b/drivers/soc/actions/owl-sps.c
index 73a9e0bb7e8e..86a483d0afcc 100644
--- a/drivers/soc/actions/owl-sps.c
+++ b/drivers/soc/actions/owl-sps.c
@@ -87,7 +87,7 @@ static int owl_sps_init_domain(struct owl_sps *sps, int index)
 	pd->genpd.power_on = owl_sps_power_on;
 	pd->genpd.power_off = owl_sps_power_off;
 	pd->genpd.flags = pd->info->genpd_flags;
-	pm_genpd_init(&pd->genpd, NULL, false);
+	pm_genpd_init(&pd->genpd, NULL, GENPD_STATE_ON);
 
 	sps->genpd_data.domains[index] = &pd->genpd;
 
diff --git a/drivers/soc/amlogic/meson-ee-pwrc.c b/drivers/soc/amlogic/meson-ee-pwrc.c
index f54acffc83f9..9deaa5952015 100644
--- a/drivers/soc/amlogic/meson-ee-pwrc.c
+++ b/drivers/soc/amlogic/meson-ee-pwrc.c
@@ -468,13 +468,14 @@ static int meson_ee_pwrc_init_domain(struct platform_device *pdev,
 			return ret;
 
 		dom->base.flags = GENPD_FLAG_ALWAYS_ON;
-		ret = pm_genpd_init(&dom->base, NULL, false);
+		ret = pm_genpd_init(&dom->base, NULL, GENPD_STATE_ON);
 		if (ret)
 			return ret;
 	} else {
+		bool is_off = dom->desc.is_powered_off ?
+				     dom->desc.is_powered_off(dom) : true;
 		ret = pm_genpd_init(&dom->base, NULL,
-				    (dom->desc.is_powered_off ?
-				     dom->desc.is_powered_off(dom) : true));
+				    is_off ? GENPD_STATE_OFF : GENPD_STATE_ON);
 		if (ret)
 			return ret;
 	}
diff --git a/drivers/soc/amlogic/meson-gx-pwrc-vpu.c b/drivers/soc/amlogic/meson-gx-pwrc-vpu.c
index 5d4f12800d93..291dbfdb938e 100644
--- a/drivers/soc/amlogic/meson-gx-pwrc-vpu.c
+++ b/drivers/soc/amlogic/meson-gx-pwrc-vpu.c
@@ -342,7 +342,8 @@ static int meson_gx_pwrc_vpu_probe(struct platform_device *pdev)
 	}
 
 	vpu_pd->genpd.flags = GENPD_FLAG_ALWAYS_ON;
-	pm_genpd_init(&vpu_pd->genpd, NULL, powered_off);
+	pm_genpd_init(&vpu_pd->genpd, NULL,
+		      powered_off ? GENPD_STATE_OFF : GENPD_STATE_ON);
 
 	return of_genpd_add_provider_simple(pdev->dev.of_node,
 					    &vpu_pd->genpd);
diff --git a/drivers/soc/amlogic/meson-secure-pwrc.c b/drivers/soc/amlogic/meson-secure-pwrc.c
index e93518763526..6ca46e23a6cd 100644
--- a/drivers/soc/amlogic/meson-secure-pwrc.c
+++ b/drivers/soc/amlogic/meson-secure-pwrc.c
@@ -178,6 +178,7 @@ static int meson_secure_pwrc_probe(struct platform_device *pdev)
 
 	for (i = 0 ; i < match->count ; ++i) {
 		struct meson_secure_pwrc_domain *dom = &pwrc->domains[i];
+		bool is_off;
 
 		if (!match->domains[i].index)
 			continue;
@@ -189,7 +190,9 @@ static int meson_secure_pwrc_probe(struct platform_device *pdev)
 		dom->base.power_on = meson_secure_pwrc_on;
 		dom->base.power_off = meson_secure_pwrc_off;
 
-		pm_genpd_init(&dom->base, NULL, match->domains[i].is_off(dom));
+		is_off = match->domains[i].is_off(dom);
+		pm_genpd_init(&dom->base, NULL,
+			      is_off ? GENPD_STATE_OFF : GENPD_STATE_ON);
 
 		pwrc->xlate.domains[i] = &dom->base;
 	}
diff --git a/drivers/soc/apple/apple-pmgr-pwrstate.c b/drivers/soc/apple/apple-pmgr-pwrstate.c
index d62a776c89a1..81170be4bfc2 100644
--- a/drivers/soc/apple/apple-pmgr-pwrstate.c
+++ b/drivers/soc/apple/apple-pmgr-pwrstate.c
@@ -249,7 +249,7 @@ static int apple_pmgr_ps_probe(struct platform_device *pdev)
 		regmap_update_bits(regmap, ps->offset, APPLE_PMGR_FLAGS | APPLE_PMGR_AUTO_ENABLE,
 				   APPLE_PMGR_AUTO_ENABLE);
 
-	ret = pm_genpd_init(&ps->genpd, NULL, !active);
+	ret = pm_genpd_init(&ps->genpd, NULL, active ? GENPD_STATE_ON : GENPD_STATE_OFF);
 	if (ret < 0) {
 		dev_err(dev, "pm_genpd_init failed\n");
 		return ret;
diff --git a/drivers/soc/bcm/bcm2835-power.c b/drivers/soc/bcm/bcm2835-power.c
index 1a179d4e011c..90202b3f6dcc 100644
--- a/drivers/soc/bcm/bcm2835-power.c
+++ b/drivers/soc/bcm/bcm2835-power.c
@@ -527,7 +527,7 @@ bcm2835_init_power_domain(struct bcm2835_power *power,
 	dom->power = power;
 
 	/* XXX: on/off at boot? */
-	pm_genpd_init(&dom->base, NULL, true);
+	pm_genpd_init(&dom->base, NULL, GENPD_STATE_OFF);
 
 	power->pd_xlate.domains[pd_xlate_index] = &dom->base;
 
diff --git a/drivers/soc/bcm/bcm63xx/bcm-pmb.c b/drivers/soc/bcm/bcm63xx/bcm-pmb.c
index 9407cac47fdb..62a6d6330d8a 100644
--- a/drivers/soc/bcm/bcm63xx/bcm-pmb.c
+++ b/drivers/soc/bcm/bcm63xx/bcm-pmb.c
@@ -321,7 +321,7 @@ static int bcm_pmb_probe(struct platform_device *pdev)
 		pd->genpd.power_on = bcm_pmb_power_on;
 		pd->genpd.power_off = bcm_pmb_power_off;
 
-		pm_genpd_init(&pd->genpd, NULL, true);
+		pm_genpd_init(&pd->genpd, NULL, GENPD_STATE_OFF);
 		pmb->genpd_onecell_data.domains[e->id] = &pd->genpd;
 	}
 
diff --git a/drivers/soc/bcm/bcm63xx/bcm63xx-power.c b/drivers/soc/bcm/bcm63xx/bcm63xx-power.c
index aa72e13d5d0e..dcb7b9336828 100644
--- a/drivers/soc/bcm/bcm63xx/bcm63xx-power.c
+++ b/drivers/soc/bcm/bcm63xx/bcm63xx-power.c
@@ -153,7 +153,8 @@ static int bcm63xx_power_probe(struct platform_device *pdev)
 		pmd->genpd.power_on = bcm63xx_power_on;
 		pmd->genpd.power_off = bcm63xx_power_off;
 
-		pm_genpd_init(&pmd->genpd, NULL, !is_on);
+		pm_genpd_init(&pmd->genpd, NULL,
+			      is_on ? GENPD_STATE_ON : GENPD_STATE_OFF);
 		power->genpd[entry->bit] = &pmd->genpd;
 
 		ndom++;
diff --git a/drivers/soc/bcm/raspberrypi-power.c b/drivers/soc/bcm/raspberrypi-power.c
index 58175af982a0..af218e798c88 100644
--- a/drivers/soc/bcm/raspberrypi-power.c
+++ b/drivers/soc/bcm/raspberrypi-power.c
@@ -96,7 +96,7 @@ static void rpi_common_init_power_domain(struct rpi_power_domains *rpi_domains,
 	 * that we give to the firmware, and we can't ask the firmware
 	 * to turn off something that we haven't ourselves turned on.
 	 */
-	pm_genpd_init(&dom->base, NULL, true);
+	pm_genpd_init(&dom->base, NULL, GENPD_STATE_OFF);
 
 	rpi_domains->xlate.domains[xlate_index] = &dom->base;
 }
diff --git a/drivers/soc/dove/pmu.c b/drivers/soc/dove/pmu.c
index ffc5311c0ed8..6be2331bd65e 100644
--- a/drivers/soc/dove/pmu.c
+++ b/drivers/soc/dove/pmu.c
@@ -212,11 +212,13 @@ static void __pmu_domain_register(struct pmu_domain *domain,
 	struct device_node *np)
 {
 	unsigned int val = readl_relaxed(domain->pmu->pmu_base + PMU_PWR);
+	bool is_on = val & domain->pwr_mask;
 
 	domain->base.power_off = pmu_domain_power_off;
 	domain->base.power_on = pmu_domain_power_on;
 
-	pm_genpd_init(&domain->base, NULL, !(val & domain->pwr_mask));
+	pm_genpd_init(&domain->base, NULL,
+		      is_on ? GENPD_STATE_ON : GENPD_STATE_OFF);
 
 	if (np)
 		of_genpd_add_provider_simple(np, &domain->base);
diff --git a/drivers/soc/imx/gpc.c b/drivers/soc/imx/gpc.c
index 90a8b2c0676f..b452e23a2725 100644
--- a/drivers/soc/imx/gpc.c
+++ b/drivers/soc/imx/gpc.c
@@ -194,7 +194,7 @@ static int imx_pgc_power_domain_probe(struct platform_device *pdev)
 		domain->base.power_on(&domain->base);
 
 	if (IS_ENABLED(CONFIG_PM_GENERIC_DOMAINS)) {
-		pm_genpd_init(&domain->base, NULL, false);
+		pm_genpd_init(&domain->base, NULL, GENPD_STATE_ON);
 		ret = of_genpd_add_provider_simple(dev->of_node, &domain->base);
 		if (ret)
 			goto genpd_err;
@@ -382,7 +382,7 @@ static int imx_gpc_old_dt_init(struct device *dev, struct regmap *regmap,
 	}
 
 	for (i = 0; i < num_domains; i++)
-		pm_genpd_init(&imx_gpc_domains[i].base, NULL, false);
+		pm_genpd_init(&imx_gpc_domains[i].base, NULL, GENPD_STATE_ON);
 
 	if (IS_ENABLED(CONFIG_PM_GENERIC_DOMAINS)) {
 		ret = of_genpd_add_provider_onecell(dev->of_node,
diff --git a/drivers/soc/imx/gpcv2.c b/drivers/soc/imx/gpcv2.c
index 4b3300b090a8..64c1b1b8ba90 100644
--- a/drivers/soc/imx/gpcv2.c
+++ b/drivers/soc/imx/gpcv2.c
@@ -1343,7 +1343,7 @@ static int imx_pgc_domain_probe(struct platform_device *pdev)
 		regmap_update_bits(domain->regmap, domain->regs->map,
 				   domain->bits.map, domain->bits.map);
 
-	ret = pm_genpd_init(&domain->genpd, NULL, true);
+	ret = pm_genpd_init(&domain->genpd, NULL, GENPD_STATE_OFF);
 	if (ret) {
 		dev_err(domain->dev, "Failed to init power domain\n");
 		goto out_domain_unmap;
diff --git a/drivers/soc/imx/imx8m-blk-ctrl.c b/drivers/soc/imx/imx8m-blk-ctrl.c
index afbca0d48c14..bcf89895df66 100644
--- a/drivers/soc/imx/imx8m-blk-ctrl.c
+++ b/drivers/soc/imx/imx8m-blk-ctrl.c
@@ -270,7 +270,7 @@ static int imx8m_blk_ctrl_probe(struct platform_device *pdev)
 		domain->genpd.power_off = imx8m_blk_ctrl_power_off;
 		domain->bc = bc;
 
-		ret = pm_genpd_init(&domain->genpd, NULL, true);
+		ret = pm_genpd_init(&domain->genpd, NULL, GENPD_STATE_OFF);
 		if (ret) {
 			dev_err_probe(dev, ret,
 				      "failed to init power domain \"%s\"\n",
diff --git a/drivers/soc/imx/imx8mp-blk-ctrl.c b/drivers/soc/imx/imx8mp-blk-ctrl.c
index 870aecc0202a..d7137e09a263 100644
--- a/drivers/soc/imx/imx8mp-blk-ctrl.c
+++ b/drivers/soc/imx/imx8mp-blk-ctrl.c
@@ -701,7 +701,7 @@ static int imx8mp_blk_ctrl_probe(struct platform_device *pdev)
 		domain->bc = bc;
 		domain->id = i;
 
-		ret = pm_genpd_init(&domain->genpd, NULL, true);
+		ret = pm_genpd_init(&domain->genpd, NULL, GENPD_STATE_OFF);
 		if (ret) {
 			dev_err_probe(dev, ret, "failed to init power domain\n");
 			dev_pm_domain_detach(domain->power_dev, true);
diff --git a/drivers/soc/imx/imx93-blk-ctrl.c b/drivers/soc/imx/imx93-blk-ctrl.c
index 2c600329436c..ec61f2b9d6f5 100644
--- a/drivers/soc/imx/imx93-blk-ctrl.c
+++ b/drivers/soc/imx/imx93-blk-ctrl.c
@@ -263,7 +263,7 @@ static int imx93_blk_ctrl_probe(struct platform_device *pdev)
 		domain->genpd.power_off = imx93_blk_ctrl_power_off;
 		domain->bc = bc;
 
-		ret = pm_genpd_init(&domain->genpd, NULL, true);
+		ret = pm_genpd_init(&domain->genpd, NULL, GENPD_STATE_OFF);
 		if (ret) {
 			dev_err_probe(dev, ret, "failed to init power domain\n");
 			goto cleanup_pds;
diff --git a/drivers/soc/imx/imx93-pd.c b/drivers/soc/imx/imx93-pd.c
index 832deeed8fd6..b748d8cd286a 100644
--- a/drivers/soc/imx/imx93-pd.c
+++ b/drivers/soc/imx/imx93-pd.c
@@ -133,7 +133,8 @@ static int imx93_pd_probe(struct platform_device *pdev)
 		}
 	}
 
-	ret = pm_genpd_init(&domain->genpd, NULL, domain->init_off);
+	ret = pm_genpd_init(&domain->genpd, NULL,
+			    domain->init_off ? GENPD_STATE_OFF : GENPD_STATE_ON);
 	if (ret)
 		goto err_clk_unprepare;
 
diff --git a/drivers/soc/mediatek/mtk-pm-domains.c b/drivers/soc/mediatek/mtk-pm-domains.c
index 354249cc1b12..b7f01a0b2e5d 100644
--- a/drivers/soc/mediatek/mtk-pm-domains.c
+++ b/drivers/soc/mediatek/mtk-pm-domains.c
@@ -462,9 +462,9 @@ generic_pm_domain *scpsys_add_one_domain(struct scpsys *scpsys, struct device_no
 		pd->genpd.flags |= GENPD_FLAG_ACTIVE_WAKEUP;
 
 	if (MTK_SCPD_CAPS(pd, MTK_SCPD_KEEP_DEFAULT_OFF))
-		pm_genpd_init(&pd->genpd, NULL, true);
+		pm_genpd_init(&pd->genpd, NULL, GENPD_STATE_OFF);
 	else
-		pm_genpd_init(&pd->genpd, NULL, false);
+		pm_genpd_init(&pd->genpd, NULL, GENPD_STATE_ON);
 
 	scpsys->domains[id] = &pd->genpd;
 
diff --git a/drivers/soc/mediatek/mtk-scpsys.c b/drivers/soc/mediatek/mtk-scpsys.c
index 7a668888111c..f6704fc274fb 100644
--- a/drivers/soc/mediatek/mtk-scpsys.c
+++ b/drivers/soc/mediatek/mtk-scpsys.c
@@ -534,7 +534,7 @@ static void mtk_register_power_domains(struct platform_device *pdev,
 		 */
 		on = !WARN_ON(genpd->power_on(genpd) < 0);
 
-		pm_genpd_init(genpd, NULL, !on);
+		pm_genpd_init(genpd, NULL, on ? GENPD_STATE_ON : GENPD_STATE_OFF);
 	}
 
 	/*
diff --git a/drivers/soc/qcom/cpr.c b/drivers/soc/qcom/cpr.c
index 144ea68e0920..17e35090bfbc 100644
--- a/drivers/soc/qcom/cpr.c
+++ b/drivers/soc/qcom/cpr.c
@@ -1702,7 +1702,7 @@ static int cpr_probe(struct platform_device *pdev)
 	drv->pd.opp_to_performance_state = cpr_get_performance_state;
 	drv->pd.attach_dev = cpr_pd_attach_dev;
 
-	ret = pm_genpd_init(&drv->pd, NULL, true);
+	ret = pm_genpd_init(&drv->pd, NULL, GENPD_STATE_OFF);
 	if (ret)
 		return ret;
 
diff --git a/drivers/soc/qcom/rpmhpd.c b/drivers/soc/qcom/rpmhpd.c
index f20e2a49a669..f729f3a47781 100644
--- a/drivers/soc/qcom/rpmhpd.c
+++ b/drivers/soc/qcom/rpmhpd.c
@@ -789,7 +789,7 @@ static int rpmhpd_probe(struct platform_device *pdev)
 		rpmhpds[i]->pd.power_on = rpmhpd_power_on;
 		rpmhpds[i]->pd.set_performance_state = rpmhpd_set_performance_state;
 		rpmhpds[i]->pd.opp_to_performance_state = rpmhpd_get_performance_state;
-		pm_genpd_init(&rpmhpds[i]->pd, NULL, true);
+		pm_genpd_init(&rpmhpds[i]->pd, NULL, GENPD_STATE_OFF);
 
 		data->domains[i] = &rpmhpds[i]->pd;
 	}
diff --git a/drivers/soc/qcom/rpmpd.c b/drivers/soc/qcom/rpmpd.c
index f8397dcb146c..c6d9dd7db376 100644
--- a/drivers/soc/qcom/rpmpd.c
+++ b/drivers/soc/qcom/rpmpd.c
@@ -956,7 +956,7 @@ static int rpmpd_probe(struct platform_device *pdev)
 		rpmpds[i]->pd.power_on = rpmpd_power_on;
 		rpmpds[i]->pd.set_performance_state = rpmpd_set_performance;
 		rpmpds[i]->pd.opp_to_performance_state = rpmpd_get_performance;
-		pm_genpd_init(&rpmpds[i]->pd, NULL, true);
+		pm_genpd_init(&rpmpds[i]->pd, NULL, GENPD_STATE_OFF);
 
 		data->domains[i] = &rpmpds[i]->pd;
 	}
diff --git a/drivers/soc/renesas/rcar-gen4-sysc.c b/drivers/soc/renesas/rcar-gen4-sysc.c
index 9e5e6e077abc..4ecb1048db22 100644
--- a/drivers/soc/renesas/rcar-gen4-sysc.c
+++ b/drivers/soc/renesas/rcar-gen4-sysc.c
@@ -268,7 +268,7 @@ static int __init rcar_gen4_sysc_pd_setup(struct rcar_gen4_sysc_pd *pd)
 	rcar_gen4_sysc_power(pd->pdr, true);
 
 finalize:
-	error = pm_genpd_init(genpd, &simple_qos_governor, false);
+	error = pm_genpd_init(genpd, &simple_qos_governor, GENPD_STATE_ON);
 	if (error)
 		pr_err("Failed to init PM domain %s: %d\n", name, error);
 
diff --git a/drivers/soc/renesas/rcar-sysc.c b/drivers/soc/renesas/rcar-sysc.c
index eed47696e825..4b204b61d2ae 100644
--- a/drivers/soc/renesas/rcar-sysc.c
+++ b/drivers/soc/renesas/rcar-sysc.c
@@ -260,7 +260,7 @@ static int __init rcar_sysc_pd_setup(struct rcar_sysc_pd *pd)
 	rcar_sysc_power(&pd->ch, true);
 
 finalize:
-	error = pm_genpd_init(genpd, &simple_qos_governor, false);
+	error = pm_genpd_init(genpd, &simple_qos_governor, GENPD_STATE_ON);
 	if (error)
 		pr_err("Failed to init PM domain %s: %d\n", name, error);
 
diff --git a/drivers/soc/renesas/rmobile-sysc.c b/drivers/soc/renesas/rmobile-sysc.c
index 728ebac98e14..bd27e5498b59 100644
--- a/drivers/soc/renesas/rmobile-sysc.c
+++ b/drivers/soc/renesas/rmobile-sysc.c
@@ -121,7 +121,7 @@ static void rmobile_init_pm_domain(struct rmobile_pm_domain *rmobile_pd)
 		__rmobile_pd_power_up(rmobile_pd);
 	}
 
-	pm_genpd_init(genpd, gov ? : &simple_qos_governor, false);
+	pm_genpd_init(genpd, gov ? : &simple_qos_governor, GENPD_STATE_ON);
 }
 
 static int rmobile_pd_suspend_console(void)
diff --git a/drivers/soc/rockchip/pm_domains.c b/drivers/soc/rockchip/pm_domains.c
index 84bc022f9e5b..67adbfb29795 100644
--- a/drivers/soc/rockchip/pm_domains.c
+++ b/drivers/soc/rockchip/pm_domains.c
@@ -645,7 +645,8 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
 	pd->genpd.flags = GENPD_FLAG_PM_CLK;
 	if (pd_info->active_wakeup)
 		pd->genpd.flags |= GENPD_FLAG_ACTIVE_WAKEUP;
-	pm_genpd_init(&pd->genpd, NULL, !rockchip_pmu_domain_is_on(pd));
+	pm_genpd_init(&pd->genpd, NULL,
+		      rockchip_pmu_domain_is_on(pd) ? GENPD_STATE_ON : GENPD_STATE_OFF);
 
 	pmu->genpd_data.domains[id] = &pd->genpd;
 	return 0;
diff --git a/drivers/soc/samsung/pm_domains.c b/drivers/soc/samsung/pm_domains.c
index d07f3c9d6903..35c36b84b16b 100644
--- a/drivers/soc/samsung/pm_domains.c
+++ b/drivers/soc/samsung/pm_domains.c
@@ -130,7 +130,7 @@ static int exynos_pd_probe(struct platform_device *pdev)
 
 	on = readl_relaxed(pd->base + 0x4) & pd->local_pwr_cfg;
 
-	pm_genpd_init(&pd->pd, NULL, !on);
+	pm_genpd_init(&pd->pd, NULL, on ? GENPD_STATE_ON : GENPD_STATE_OFF);
 	ret = of_genpd_add_provider_simple(np, &pd->pd);
 
 	if (ret == 0 && of_parse_phandle_with_args(np, "power-domains",
diff --git a/drivers/soc/starfive/jh71xx_pmu.c b/drivers/soc/starfive/jh71xx_pmu.c
index 7d5f50d71c0d..5fd707f3cbef 100644
--- a/drivers/soc/starfive/jh71xx_pmu.c
+++ b/drivers/soc/starfive/jh71xx_pmu.c
@@ -251,7 +251,8 @@ static int jh71xx_pmu_init_domain(struct jh71xx_pmu *pmu, int index)
 
 	pmd->genpd.power_on = jh71xx_pmu_on;
 	pmd->genpd.power_off = jh71xx_pmu_off;
-	pm_genpd_init(&pmd->genpd, NULL, !is_on);
+	pm_genpd_init(&pmd->genpd, NULL,
+		      is_on ? GENPD_STATE_ON : GENPD_STATE_OFF);
 
 	pmu->genpd_data.domains[index] = &pmd->genpd;
 
diff --git a/drivers/soc/sunxi/sun20i-ppu.c b/drivers/soc/sunxi/sun20i-ppu.c
index 98cb41d36560..e78f23b222f5 100644
--- a/drivers/soc/sunxi/sun20i-ppu.c
+++ b/drivers/soc/sunxi/sun20i-ppu.c
@@ -148,13 +148,17 @@ static int sun20i_ppu_probe(struct platform_device *pdev)
 
 	for (unsigned int i = 0; i < ppu->num_domains; ++i) {
 		struct sun20i_ppu_pd *pd = &pds[i];
+		bool is_on;
 
 		pd->genpd.name		= desc->names[i];
 		pd->genpd.power_off	= sun20i_ppu_pd_power_off;
 		pd->genpd.power_on	= sun20i_ppu_pd_power_on;
 		pd->base		= base + PD_REGS_SIZE * i;
 
-		ret = pm_genpd_init(&pd->genpd, NULL, sun20i_ppu_pd_is_on(pd));
+		is_on = sun21i_ppu_pd_is_on(pd);
+
+		ret = pm_genpd_init(&pd->genpd, NULL,
+				    is_on ? GENPD_STATE_ON : GENPD_STATE_OFF);
 		if (ret) {
 			dev_warn(dev, "Failed to add '%s' domain: %d\n",
 				 pd->genpd.name, ret);
diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c
index 5d17799524c9..159f612851e4 100644
--- a/drivers/soc/tegra/pmc.c
+++ b/drivers/soc/tegra/pmc.c
@@ -1332,7 +1332,8 @@ static int tegra_powergate_add(struct tegra_pmc *pmc, struct device_node *np)
 		goto remove_resets;
 	}
 
-	err = pm_genpd_init(&pg->genpd, NULL, off);
+	err = pm_genpd_init(&pg->genpd, NULL,
+			    off ? GENPD_STATE_OFF : GENPD_STATE_ON);
 	if (err < 0) {
 		dev_err(dev, "failed to initialise PM domain %pOFn: %d\n", np,
 		       err);
@@ -1431,7 +1432,7 @@ static int tegra_pmc_core_pd_add(struct tegra_pmc *pmc, struct device_node *np)
 		return dev_err_probe(pmc->dev, err,
 				     "failed to set core OPP regulator\n");
 
-	err = pm_genpd_init(genpd, NULL, false);
+	err = pm_genpd_init(genpd, NULL, GENPD_STATE_ON);
 	if (err) {
 		dev_err(pmc->dev, "failed to init core genpd: %d\n", err);
 		return err;
diff --git a/drivers/soc/tegra/powergate-bpmp.c b/drivers/soc/tegra/powergate-bpmp.c
index 179ed895c279..9cbb5ceabd20 100644
--- a/drivers/soc/tegra/powergate-bpmp.c
+++ b/drivers/soc/tegra/powergate-bpmp.c
@@ -185,7 +185,8 @@ tegra_powergate_add(struct tegra_bpmp *bpmp,
 	powergate->genpd.power_on = tegra_powergate_power_on;
 	powergate->genpd.power_off = tegra_powergate_power_off;
 
-	err = pm_genpd_init(&powergate->genpd, NULL, off);
+	err = pm_genpd_init(&powergate->genpd, NULL,
+			    off ? GENPD_STATE_OFF : GENPD_STATE_ON);
 	if (err < 0) {
 		kfree(powergate->genpd.name);
 		return ERR_PTR(err);
diff --git a/drivers/soc/ti/omap_prm.c b/drivers/soc/ti/omap_prm.c
index ecd9a8bdd7c0..371076b85580 100644
--- a/drivers/soc/ti/omap_prm.c
+++ b/drivers/soc/ti/omap_prm.c
@@ -710,7 +710,7 @@ static int omap_prm_domain_init(struct device *dev, struct omap_prm *prm)
 	prmd->pd.detach_dev = omap_prm_domain_detach_dev;
 	prmd->pd.flags = GENPD_FLAG_PM_CLK;
 
-	pm_genpd_init(&prmd->pd, NULL, true);
+	pm_genpd_init(&prmd->pd, NULL, GENPD_STATE_OFF);
 	error = of_genpd_add_provider_simple(np, &prmd->pd);
 	if (error)
 		pm_genpd_remove(&prmd->pd);
diff --git a/drivers/soc/ti/ti_sci_pm_domains.c b/drivers/soc/ti/ti_sci_pm_domains.c
index a33ec7eaf23d..037ed4ea87b0 100644
--- a/drivers/soc/ti/ti_sci_pm_domains.c
+++ b/drivers/soc/ti/ti_sci_pm_domains.c
@@ -171,7 +171,7 @@ static int ti_sci_pm_domain_probe(struct platform_device *pdev)
 				pd->idx = args.args[0];
 				pd->parent = pd_provider;
 
-				pm_genpd_init(&pd->pd, NULL, true);
+				pm_genpd_init(&pd->pd, NULL, GENPD_STATE_OFF);
 
 				list_add(&pd->node, &pd_provider->pd_list);
 			}
diff --git a/drivers/soc/xilinx/zynqmp_pm_domains.c b/drivers/soc/xilinx/zynqmp_pm_domains.c
index 69d03ad4cf1e..bcf33b9ec697 100644
--- a/drivers/soc/xilinx/zynqmp_pm_domains.c
+++ b/drivers/soc/xilinx/zynqmp_pm_domains.c
@@ -283,7 +283,7 @@ static int zynqmp_gpd_probe(struct platform_device *pdev)
 		domains[i] = &pd->gpd;
 
 		/* Mark all PM domains as initially powered off */
-		pm_genpd_init(&pd->gpd, NULL, true);
+		pm_genpd_init(&pd->gpd, NULL, GENPD_STATE_OFF);
 	}
 
 	zynqmp_pd_data->domains = domains;
diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h
index f776fb93eaa0..c545e44ee52b 100644
--- a/include/linux/pm_domain.h
+++ b/include/linux/pm_domain.h
@@ -73,6 +73,7 @@
 enum gpd_status {
 	GENPD_STATE_ON = 0,	/* PM domain is on */
 	GENPD_STATE_OFF,	/* PM domain is off */
+	GENPD_STATE_UNKNOWN,	/* PM domain boot state is unknown */
 };
 
 enum genpd_notication {
@@ -229,7 +230,8 @@ int pm_genpd_add_subdomain(struct generic_pm_domain *genpd,
 int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd,
 			      struct generic_pm_domain *subdomain);
 int pm_genpd_init(struct generic_pm_domain *genpd,
-		  struct dev_power_governor *gov, bool is_off);
+		  struct dev_power_governor *gov,
+		  enum gpd_status boot_status);
 int pm_genpd_remove(struct generic_pm_domain *genpd);
 int dev_pm_genpd_set_performance_state(struct device *dev, unsigned int state);
 int dev_pm_genpd_add_notifier(struct device *dev, struct notifier_block *nb);
@@ -269,7 +271,8 @@ static inline int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd,
 	return -ENOSYS;
 }
 static inline int pm_genpd_init(struct generic_pm_domain *genpd,
-				struct dev_power_governor *gov, bool is_off)
+				struct dev_power_governor *gov,
+				enum gpd_status boot_status)
 {
 	return -ENOSYS;
 }
