mirror of
https://github.com/nxp-imx/linux-imx.git
synced 2025-07-08 10:25:20 +02:00
pmdomain: imx: wait SSAR when i.MX93 power domain on
commit52dd070c62
upstream. With "quiet" set in bootargs, there is power domain failure: "imx93_power_domain 44462400.power-domain: pd_off timeout: name: 44462400.power-domain, stat: 4" The current power on opertation takes ISO state as power on finished flag, but it is wrong. Before powering on operation really finishes, powering off comes and powering off will never finish because the last powering on still not finishes, so the following powering off actually not trigger hardware state machine to run. SSAR is the last step when powering on a domain, so need to wait SSAR done when powering on. Since EdgeLock Enclave(ELE) handshake is involved in the flow, enlarge the waiting time to 10ms for both on and off to avoid timeout. Cc: stable@vger.kernel.org Fixes:0a0f7cc25d
("soc: imx: add i.MX93 SRC power domain driver") Reviewed-by: Jacky Bai <ping.bai@nxp.com> Signed-off-by: Peng Fan <peng.fan@nxp.com> Link: https://lore.kernel.org/r/20240814124740.2778952-1-peng.fan@oss.nxp.com Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
e6d49dd41e
commit
d25fd6eb26
|
@ -20,6 +20,7 @@
|
||||||
#define FUNC_STAT_PSW_STAT_MASK BIT(0)
|
#define FUNC_STAT_PSW_STAT_MASK BIT(0)
|
||||||
#define FUNC_STAT_RST_STAT_MASK BIT(2)
|
#define FUNC_STAT_RST_STAT_MASK BIT(2)
|
||||||
#define FUNC_STAT_ISO_STAT_MASK BIT(4)
|
#define FUNC_STAT_ISO_STAT_MASK BIT(4)
|
||||||
|
#define FUNC_STAT_SSAR_STAT_MASK BIT(8)
|
||||||
|
|
||||||
struct imx93_power_domain {
|
struct imx93_power_domain {
|
||||||
struct generic_pm_domain genpd;
|
struct generic_pm_domain genpd;
|
||||||
|
@ -50,7 +51,7 @@ static int imx93_pd_on(struct generic_pm_domain *genpd)
|
||||||
writel(val, addr + MIX_SLICE_SW_CTRL_OFF);
|
writel(val, addr + MIX_SLICE_SW_CTRL_OFF);
|
||||||
|
|
||||||
ret = readl_poll_timeout(addr + MIX_FUNC_STAT_OFF, val,
|
ret = readl_poll_timeout(addr + MIX_FUNC_STAT_OFF, val,
|
||||||
!(val & FUNC_STAT_ISO_STAT_MASK), 1, 10000);
|
!(val & FUNC_STAT_SSAR_STAT_MASK), 1, 10000);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(domain->dev, "pd_on timeout: name: %s, stat: %x\n", genpd->name, val);
|
dev_err(domain->dev, "pd_on timeout: name: %s, stat: %x\n", genpd->name, val);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -72,7 +73,7 @@ static int imx93_pd_off(struct generic_pm_domain *genpd)
|
||||||
writel(val, addr + MIX_SLICE_SW_CTRL_OFF);
|
writel(val, addr + MIX_SLICE_SW_CTRL_OFF);
|
||||||
|
|
||||||
ret = readl_poll_timeout(addr + MIX_FUNC_STAT_OFF, val,
|
ret = readl_poll_timeout(addr + MIX_FUNC_STAT_OFF, val,
|
||||||
val & FUNC_STAT_PSW_STAT_MASK, 1, 1000);
|
val & FUNC_STAT_PSW_STAT_MASK, 1, 10000);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(domain->dev, "pd_off timeout: name: %s, stat: %x\n", genpd->name, val);
|
dev_err(domain->dev, "pd_off timeout: name: %s, stat: %x\n", genpd->name, val);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user