提交 77bf9e38 编写于 作者: C Claudiu Beznea 提交者: Zheng Zengkai

ARM: at91: pm: do not panic if ram controllers are not enabled

stable inclusion
from stable-5.10.73
commit 14f52004bda51ce7695abada3470752a73fa6b60
bugzilla: 182983 https://gitee.com/openeuler/kernel/issues/I4I3M0

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=14f52004bda51ce7695abada3470752a73fa6b60

--------------------------------

[ Upstream commit 1605de1b ]

In case PM is enabled but there is no RAM controller information
in DT the code will panic. Avoid such scenarios by not initializing
platform specific PM code in case RAM controller is not provided
via DT.
Reported-by: NEugen Hristev <eugen.hristev@microchip.com>
Fixes: 827de1f1 ("ARM: at91: remove at91_dt_initialize and machine init_early()")
Fixes: 892e1f4a ("ARM: at91: pm: add sama7g5 ddr phy controller")
Signed-off-by: NClaudiu Beznea <claudiu.beznea@microchip.com>
Signed-off-by: NNicolas Ferre <nicolas.ferre@microchip.com>
Link: https://lore.kernel.org/r/20210823131915.23857-2-claudiu.beznea@microchip.comSigned-off-by: NSasha Levin <sashal@kernel.org>
Signed-off-by: NChen Jun <chenjun102@huawei.com>
Acked-by: NWeilong Chen <chenweilong@huawei.com>
Signed-off-by: NChen Jun <chenjun102@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 02e3527a
...@@ -517,18 +517,22 @@ static const struct of_device_id ramc_ids[] __initconst = { ...@@ -517,18 +517,22 @@ static const struct of_device_id ramc_ids[] __initconst = {
{ /*sentinel*/ } { /*sentinel*/ }
}; };
static __init void at91_dt_ramc(void) static __init int at91_dt_ramc(void)
{ {
struct device_node *np; struct device_node *np;
const struct of_device_id *of_id; const struct of_device_id *of_id;
int idx = 0; int idx = 0;
void *standby = NULL; void *standby = NULL;
const struct ramc_info *ramc; const struct ramc_info *ramc;
int ret;
for_each_matching_node_and_match(np, ramc_ids, &of_id) { for_each_matching_node_and_match(np, ramc_ids, &of_id) {
soc_pm.data.ramc[idx] = of_iomap(np, 0); soc_pm.data.ramc[idx] = of_iomap(np, 0);
if (!soc_pm.data.ramc[idx]) if (!soc_pm.data.ramc[idx]) {
panic(pr_fmt("unable to map ramc[%d] cpu registers\n"), idx); pr_err("unable to map ramc[%d] cpu registers\n", idx);
ret = -ENOMEM;
goto unmap_ramc;
}
ramc = of_id->data; ramc = of_id->data;
if (!standby) if (!standby)
...@@ -538,15 +542,26 @@ static __init void at91_dt_ramc(void) ...@@ -538,15 +542,26 @@ static __init void at91_dt_ramc(void)
idx++; idx++;
} }
if (!idx) if (!idx) {
panic(pr_fmt("unable to find compatible ram controller node in dtb\n")); pr_err("unable to find compatible ram controller node in dtb\n");
ret = -ENODEV;
goto unmap_ramc;
}
if (!standby) { if (!standby) {
pr_warn("ramc no standby function available\n"); pr_warn("ramc no standby function available\n");
return; return 0;
} }
at91_cpuidle_device.dev.platform_data = standby; at91_cpuidle_device.dev.platform_data = standby;
return 0;
unmap_ramc:
while (idx)
iounmap(soc_pm.data.ramc[--idx]);
return ret;
} }
static void at91rm9200_idle(void) static void at91rm9200_idle(void)
...@@ -869,6 +884,8 @@ static void __init at91_pm_init(void (*pm_idle)(void)) ...@@ -869,6 +884,8 @@ static void __init at91_pm_init(void (*pm_idle)(void))
void __init at91rm9200_pm_init(void) void __init at91rm9200_pm_init(void)
{ {
int ret;
if (!IS_ENABLED(CONFIG_SOC_AT91RM9200)) if (!IS_ENABLED(CONFIG_SOC_AT91RM9200))
return; return;
...@@ -880,7 +897,9 @@ void __init at91rm9200_pm_init(void) ...@@ -880,7 +897,9 @@ void __init at91rm9200_pm_init(void)
soc_pm.data.standby_mode = AT91_PM_STANDBY; soc_pm.data.standby_mode = AT91_PM_STANDBY;
soc_pm.data.suspend_mode = AT91_PM_ULP0; soc_pm.data.suspend_mode = AT91_PM_ULP0;
at91_dt_ramc(); ret = at91_dt_ramc();
if (ret)
return;
/* /*
* AT91RM9200 SDRAM low-power mode cannot be used with self-refresh. * AT91RM9200 SDRAM low-power mode cannot be used with self-refresh.
...@@ -895,13 +914,17 @@ void __init sam9x60_pm_init(void) ...@@ -895,13 +914,17 @@ void __init sam9x60_pm_init(void)
static const int modes[] __initconst = { static const int modes[] __initconst = {
AT91_PM_STANDBY, AT91_PM_ULP0, AT91_PM_ULP0_FAST, AT91_PM_ULP1, AT91_PM_STANDBY, AT91_PM_ULP0, AT91_PM_ULP0_FAST, AT91_PM_ULP1,
}; };
int ret;
if (!IS_ENABLED(CONFIG_SOC_SAM9X60)) if (!IS_ENABLED(CONFIG_SOC_SAM9X60))
return; return;
at91_pm_modes_validate(modes, ARRAY_SIZE(modes)); at91_pm_modes_validate(modes, ARRAY_SIZE(modes));
at91_pm_modes_init(); at91_pm_modes_init();
at91_dt_ramc(); ret = at91_dt_ramc();
if (ret)
return;
at91_pm_init(NULL); at91_pm_init(NULL);
soc_pm.ws_ids = sam9x60_ws_ids; soc_pm.ws_ids = sam9x60_ws_ids;
...@@ -910,6 +933,8 @@ void __init sam9x60_pm_init(void) ...@@ -910,6 +933,8 @@ void __init sam9x60_pm_init(void)
void __init at91sam9_pm_init(void) void __init at91sam9_pm_init(void)
{ {
int ret;
if (!IS_ENABLED(CONFIG_SOC_AT91SAM9)) if (!IS_ENABLED(CONFIG_SOC_AT91SAM9))
return; return;
...@@ -921,7 +946,10 @@ void __init at91sam9_pm_init(void) ...@@ -921,7 +946,10 @@ void __init at91sam9_pm_init(void)
soc_pm.data.standby_mode = AT91_PM_STANDBY; soc_pm.data.standby_mode = AT91_PM_STANDBY;
soc_pm.data.suspend_mode = AT91_PM_ULP0; soc_pm.data.suspend_mode = AT91_PM_ULP0;
at91_dt_ramc(); ret = at91_dt_ramc();
if (ret)
return;
at91_pm_init(at91sam9_idle); at91_pm_init(at91sam9_idle);
} }
...@@ -930,12 +958,16 @@ void __init sama5_pm_init(void) ...@@ -930,12 +958,16 @@ void __init sama5_pm_init(void)
static const int modes[] __initconst = { static const int modes[] __initconst = {
AT91_PM_STANDBY, AT91_PM_ULP0, AT91_PM_ULP0_FAST, AT91_PM_STANDBY, AT91_PM_ULP0, AT91_PM_ULP0_FAST,
}; };
int ret;
if (!IS_ENABLED(CONFIG_SOC_SAMA5)) if (!IS_ENABLED(CONFIG_SOC_SAMA5))
return; return;
at91_pm_modes_validate(modes, ARRAY_SIZE(modes)); at91_pm_modes_validate(modes, ARRAY_SIZE(modes));
at91_dt_ramc(); ret = at91_dt_ramc();
if (ret)
return;
at91_pm_init(NULL); at91_pm_init(NULL);
} }
...@@ -945,13 +977,17 @@ void __init sama5d2_pm_init(void) ...@@ -945,13 +977,17 @@ void __init sama5d2_pm_init(void)
AT91_PM_STANDBY, AT91_PM_ULP0, AT91_PM_ULP0_FAST, AT91_PM_ULP1, AT91_PM_STANDBY, AT91_PM_ULP0, AT91_PM_ULP0_FAST, AT91_PM_ULP1,
AT91_PM_BACKUP, AT91_PM_BACKUP,
}; };
int ret;
if (!IS_ENABLED(CONFIG_SOC_SAMA5D2)) if (!IS_ENABLED(CONFIG_SOC_SAMA5D2))
return; return;
at91_pm_modes_validate(modes, ARRAY_SIZE(modes)); at91_pm_modes_validate(modes, ARRAY_SIZE(modes));
at91_pm_modes_init(); at91_pm_modes_init();
at91_dt_ramc(); ret = at91_dt_ramc();
if (ret)
return;
at91_pm_init(NULL); at91_pm_init(NULL);
soc_pm.ws_ids = sama5d2_ws_ids; soc_pm.ws_ids = sama5d2_ws_ids;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册