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
parent
85dd28204d
commit
e80c8c6bf4
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue