mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 03:40:35 +09:00
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:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user