soc: rockchip: power-domain: Add always on configuration for power domain

Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
Change-Id: Ic57f7f3a564f7d71b680e3c435d0460474b5a4a0
This commit is contained in:
Finley Xiao
2022-10-12 19:25:38 +08:00
committed by Tao Huang
parent 61e4e95dc6
commit 54d4b6b301

View File

@@ -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);
}