lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAPDyKFqNE2_s5K-DUGJLQnH1OR3tDhkk1j+fOkyAdzOhBThr4Q@mail.gmail.com>
Date:   Tue, 9 May 2023 15:35:40 +0200
From:   Ulf Hansson <ulf.hansson@...aro.org>
To:     Abel Vesa <abel.vesa@...aro.org>
Cc:     "Rafael J . Wysocki" <rafael@...nel.org>,
        Kevin Hilman <khilman@...nel.org>, Pavel Machek <pavel@....cz>,
        Len Brown <len.brown@...el.com>,
        Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
        Bjorn Andersson <andersson@...nel.org>,
        Andy Gross <agross@...nel.org>,
        Konrad Dybcio <konrad.dybcio@...aro.org>,
        Mike Turquette <mturquette@...libre.com>,
        Stephen Boyd <sboyd@...nel.org>,
        Saravana Kannan <saravanak@...gle.com>,
        Matthias Kaehlcke <mka@...omium.org>, linux-pm@...r.kernel.org,
        linux-kernel@...r.kernel.org, linux-arm-msm@...r.kernel.org,
        Doug Anderson <dianders@...omium.org>
Subject: Re: [RFC PATCH v4 1/2] PM: domains: Expand initial state of domain to
 support unknown state

On Fri, 5 May 2023 at 17:02, Abel Vesa <abel.vesa@...aro.org> wrote:
>
> Sometimes, a genpd provider has no way of reading the state from HW.
> Best it can do is make assumptions of the state the domain was left
> in by the bootloader. Let the genpd core know of such situations by
> allowing the providers to specify the state as 'unknown' when the
> domain gets initialized. Make use of the already exposed enum by
> adding the 'unknown' option. Then, make all the calls to pm_genpd_init
> use one of those values. This represents the HW state more accurately
> and will be helpful for figuring out which unused domain needs to stay
> powered on until later on.

In principle what you suggest seems reasonable to me. However, there
doesn't seem to be any users of the new GENPD_STATE_UNKNOWN state,
which makes me wonder if it's really needed?

A provider can still synchronize its state into a suitable state, by
doing either a power-on or a power-off operation, before it calls
pm_genpd_init().

Or do you plan to add a user of GENPD_STATE_UNKNOWN?

Kind regards
Uffe

>
> Signed-off-by: Abel Vesa <abel.vesa@...aro.org>
> ---
>  arch/arm/mach-s3c/pm-s3c64xx.c             |  4 ++--
>  arch/arm/mach-ux500/pm_domains.c           |  2 +-
>  drivers/base/power/domain.c                | 13 ++++++++-----
>  drivers/clk/davinci/psc.c                  |  3 ++-
>  drivers/clk/mmp/pwr-island.c               |  2 +-
>  drivers/clk/qcom/gdsc.c                    |  2 +-
>  drivers/clk/renesas/clk-mstp.c             |  2 +-
>  drivers/clk/renesas/r9a06g032-clocks.c     |  2 +-
>  drivers/clk/renesas/renesas-cpg-mssr.c     |  2 +-
>  drivers/clk/renesas/rzg2l-cpg.c            |  2 +-
>  drivers/cpuidle/cpuidle-psci-domain.c      |  2 +-
>  drivers/cpuidle/cpuidle-riscv-sbi.c        |  2 +-
>  drivers/firmware/arm_scmi/scmi_pm_domain.c |  2 +-
>  drivers/firmware/imx/scu-pd.c              |  3 ++-
>  drivers/firmware/scpi_pm_domain.c          |  2 +-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c    |  2 +-
>  drivers/irqchip/irq-qcom-mpm.c             |  2 +-
>  drivers/soc/actions/owl-sps.c              |  2 +-
>  drivers/soc/amlogic/meson-ee-pwrc.c        |  7 ++++---
>  drivers/soc/amlogic/meson-gx-pwrc-vpu.c    |  3 ++-
>  drivers/soc/amlogic/meson-secure-pwrc.c    |  5 ++++-
>  drivers/soc/apple/apple-pmgr-pwrstate.c    |  2 +-
>  drivers/soc/bcm/bcm2835-power.c            |  2 +-
>  drivers/soc/bcm/bcm63xx/bcm-pmb.c          |  2 +-
>  drivers/soc/bcm/bcm63xx/bcm63xx-power.c    |  3 ++-
>  drivers/soc/bcm/raspberrypi-power.c        |  2 +-
>  drivers/soc/dove/pmu.c                     |  4 +++-
>  drivers/soc/imx/gpc.c                      |  4 ++--
>  drivers/soc/imx/gpcv2.c                    |  2 +-
>  drivers/soc/imx/imx8m-blk-ctrl.c           |  2 +-
>  drivers/soc/imx/imx8mp-blk-ctrl.c          |  2 +-
>  drivers/soc/imx/imx93-blk-ctrl.c           |  2 +-
>  drivers/soc/imx/imx93-pd.c                 |  3 ++-
>  drivers/soc/mediatek/mtk-pm-domains.c      |  4 ++--
>  drivers/soc/mediatek/mtk-scpsys.c          |  2 +-
>  drivers/soc/qcom/cpr.c                     |  2 +-
>  drivers/soc/qcom/rpmhpd.c                  |  2 +-
>  drivers/soc/qcom/rpmpd.c                   |  2 +-
>  drivers/soc/renesas/rcar-gen4-sysc.c       |  2 +-
>  drivers/soc/renesas/rcar-sysc.c            |  2 +-
>  drivers/soc/renesas/rmobile-sysc.c         |  2 +-
>  drivers/soc/rockchip/pm_domains.c          |  3 ++-
>  drivers/soc/samsung/pm_domains.c           |  2 +-
>  drivers/soc/starfive/jh71xx_pmu.c          |  3 ++-
>  drivers/soc/sunxi/sun20i-ppu.c             |  6 +++++-
>  drivers/soc/tegra/pmc.c                    |  5 +++--
>  drivers/soc/tegra/powergate-bpmp.c         |  3 ++-
>  drivers/soc/ti/omap_prm.c                  |  2 +-
>  drivers/soc/ti/ti_sci_pm_domains.c         |  2 +-
>  drivers/soc/xilinx/zynqmp_pm_domains.c     |  2 +-
>  include/linux/pm_domain.h                  |  7 +++++--
>  51 files changed, 87 insertions(+), 62 deletions(-)
>
> 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;
>  }
> --
> 2.34.1
>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ