firmware: imx: scu-pd: do not power off console domain
authorDong Aisheng <aisheng.dong@nxp.com>
Fri, 5 Mar 2021 13:17:48 +0000 (21:17 +0800)
committerShawn Guo <shawnguo@kernel.org>
Mon, 15 Mar 2021 04:21:48 +0000 (12:21 +0800)
Do not power off console domain in runtime pm.

Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>
Signed-off-by: Shawn Guo <shawnguo@kernel.org>
drivers/firmware/imx/scu-pd.c

index 08533ee..338800d 100644 (file)
@@ -86,6 +86,8 @@ struct imx_sc_pd_soc {
        u8 num_ranges;
 };
 
+static int imx_con_rsrc;
+
 static const struct imx_sc_pd_range imx8qxp_scu_pd_ranges[] = {
        /* LSIO SS */
        { "pwm", IMX_SC_R_PWM_0, 8, true, 0 },
@@ -207,6 +209,23 @@ to_imx_sc_pd(struct generic_pm_domain *genpd)
        return container_of(genpd, struct imx_sc_pm_domain, pd);
 }
 
+static void imx_sc_pd_get_console_rsrc(void)
+{
+       struct of_phandle_args specs;
+       int ret;
+
+       if (!of_stdout)
+               return;
+
+       ret = of_parse_phandle_with_args(of_stdout, "power-domains",
+                                        "#power-domain-cells",
+                                        0, &specs);
+       if (ret)
+               return;
+
+       imx_con_rsrc = specs.args[0];
+}
+
 static int imx_sc_pd_power(struct generic_pm_domain *domain, bool power_on)
 {
        struct imx_sc_msg_req_set_resource_power_mode msg;
@@ -267,6 +286,7 @@ imx_scu_add_pm_domain(struct device *dev, int idx,
                      const struct imx_sc_pd_range *pd_ranges)
 {
        struct imx_sc_pm_domain *sc_pd;
+       bool is_off = true;
        int ret;
 
        if (!imx_sc_rm_is_resource_owned(pm_ipc_handle, pd_ranges->rsrc + idx))
@@ -288,6 +308,10 @@ imx_scu_add_pm_domain(struct device *dev, int idx,
                         "%s", pd_ranges->name);
 
        sc_pd->pd.name = sc_pd->name;
+       if (imx_con_rsrc == sc_pd->rsrc) {
+               sc_pd->pd.flags = GENPD_FLAG_RPM_ALWAYS_ON;
+               is_off = false;
+       }
 
        if (sc_pd->rsrc >= IMX_SC_R_LAST) {
                dev_warn(dev, "invalid pd %s rsrc id %d found",
@@ -297,7 +321,7 @@ imx_scu_add_pm_domain(struct device *dev, int idx,
                return NULL;
        }
 
-       ret = pm_genpd_init(&sc_pd->pd, NULL, true);
+       ret = pm_genpd_init(&sc_pd->pd, NULL, is_off);
        if (ret) {
                dev_warn(dev, "failed to init pd %s rsrc id %d",
                         sc_pd->name, sc_pd->rsrc);
@@ -363,6 +387,8 @@ static int imx_sc_pd_probe(struct platform_device *pdev)
        if (!pd_soc)
                return -ENODEV;
 
+       imx_sc_pd_get_console_rsrc();
+
        return imx_scu_init_pm_domains(&pdev->dev, pd_soc);
 }