diff --git a/drivers/soc/rockchip/pm_domains.c b/drivers/soc/rockchip/pm_domains.c index 474f05629457..e17fa041612a 100644 --- a/drivers/soc/rockchip/pm_domains.c +++ b/drivers/soc/rockchip/pm_domains.c @@ -52,6 +52,7 @@ struct rockchip_domain_info { int mem_status_mask; int repair_status_mask; bool keepon_startup; + bool always_on; u32 pwr_offset; u32 mem_offset; u32 req_offset; @@ -847,6 +848,26 @@ static void rockchip_pd_qos_init(struct rockchip_pm_domain *pd) } } +static int rockchip_pd_add_alwasy_on_flag(struct rockchip_pm_domain *pd) +{ + int error; + + if (pd->genpd.flags & GENPD_FLAG_ALWAYS_ON) + return 0; + pd->genpd.flags |= GENPD_FLAG_ALWAYS_ON; + if (!rockchip_pmu_domain_is_on(pd)) { + error = rockchip_pd_power(pd, true); + if (error) { + dev_err(pd->pmu->dev, + "failed to power on domain '%s': %d\n", + pd->genpd.name, error); + return error; + } + } + + return 0; +} + static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu, struct device_node *node) { @@ -1033,18 +1054,16 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu, pd->genpd.detach_dev = rockchip_pd_detach_dev; if (pd_info->active_wakeup) pd->genpd.flags |= GENPD_FLAG_ACTIVE_WAKEUP; + if (pd_info->always_on) { + error = rockchip_pd_add_alwasy_on_flag(pd); + if (error) + goto err_unprepare_clocks; + } #ifndef MODULE if (pd_info->keepon_startup) { - pd->genpd.flags |= GENPD_FLAG_ALWAYS_ON; - if (!rockchip_pmu_domain_is_on(pd)) { - error = rockchip_pd_power(pd, true); - if (error) { - dev_err(pmu->dev, - "failed to power on domain '%s': %d\n", - node->name, error); - goto err_unprepare_clocks; - } - } + error = rockchip_pd_add_alwasy_on_flag(pd); + if (error) + goto err_unprepare_clocks; } #endif rockchip_pd_qos_init(pd); @@ -1217,6 +1236,8 @@ static int __init rockchip_pd_keepon_release(void) genpd = g_pmu->genpd_data.domains[i]; if (genpd) { pd = to_rockchip_pd(genpd); + if (pd->info->always_on) + continue; if (pd->info->keepon_startup) rockchip_pd_keepon_do_release(genpd, pd); }