1
0
Fork 0

firmware: imx: scu-pd: add multi states support

add multi states support

Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>
5.4-rM2-2.2.x-imx-squashed
Dong Aisheng 2019-03-05 20:46:33 +08:00
parent 85dd28204d
commit e80c8c6bf4
1 changed files with 18 additions and 1 deletions

View File

@ -240,7 +240,8 @@ static int imx_sc_pd_power(struct generic_pm_domain *domain, bool power_on)
hdr->size = 2;
msg.resource = pd->rsrc;
msg.mode = power_on ? IMX_SC_PM_PW_MODE_ON : IMX_SC_PM_PW_MODE_LP;
msg.mode = power_on ? IMX_SC_PM_PW_MODE_ON : pd->pd.state_idx ?
IMX_SC_PM_PW_MODE_OFF : IMX_SC_PM_PW_MODE_LP;
/* keep uart console power on for no_console_suspend */
if (imx_con_rsrc == pd->rsrc && !console_suspend_enabled && !power_on)
@ -289,6 +290,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;
struct genpd_power_state *states;
bool is_off = true;
int ret;
@ -296,9 +298,22 @@ imx_scu_add_pm_domain(struct device *dev, int idx,
if (!sc_pd)
return ERR_PTR(-ENOMEM);
states = devm_kcalloc(dev, 2, sizeof(*states), GFP_KERNEL);
if (!states) {
devm_kfree(dev, sc_pd);
return ERR_PTR(-ENOMEM);
}
sc_pd->rsrc = pd_ranges->rsrc + idx;
sc_pd->pd.power_off = imx_sc_pd_power_off;
sc_pd->pd.power_on = imx_sc_pd_power_on;
states[0].power_off_latency_ns = 25000;
states[0].power_on_latency_ns = 25000;
states[1].power_off_latency_ns = 2500000;
states[1].power_on_latency_ns = 2500000;
sc_pd->pd.states = states;
sc_pd->pd.state_count = 2;
if (pd_ranges->postfix)
snprintf(sc_pd->name, sizeof(sc_pd->name),
@ -318,6 +333,7 @@ imx_scu_add_pm_domain(struct device *dev, int idx,
sc_pd->name, sc_pd->rsrc);
devm_kfree(dev, sc_pd);
devm_kfree(dev, states);
return NULL;
}
@ -326,6 +342,7 @@ imx_scu_add_pm_domain(struct device *dev, int idx,
dev_warn(dev, "failed to init pd %s rsrc id %d",
sc_pd->name, sc_pd->rsrc);
devm_kfree(dev, sc_pd);
devm_kfree(dev, states);
return NULL;
}