Commit d6720003 authored by Kuninori Morimoto's avatar Kuninori Morimoto Committed by Rafael J. Wysocki

ARM / mach-shmobile: sh73a0 SMP TWD boot regression fix

Fix SMP TWD boot regression on sh73a0 based platforms caused by:

4200b16d ARM: shmobile: convert to twd_local_timer_register() interface

After the merge of the above commit it has been impossible to boot
sh73a0 based SoCs with SMP enabled and CONFIG_HAVE_ARM_TWD=y. The
kernel crashes at smp_init_cpus() timing which is before the console
has been initialized, so to the user this looks like a kernel lock up
without any particular error message.

This patch fixes the regression on sh73a0 by moving the TWD
registration code from smp_init_cpus() to sys_timer->init() time.

This patch removed shmobile_twd_init() which is no longer needed
Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarMagnus Damm <damm@opensource.se>
Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
parent b759bd11
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
extern void shmobile_earlytimer_init(void); extern void shmobile_earlytimer_init(void);
extern struct sys_timer shmobile_timer; extern struct sys_timer shmobile_timer;
struct twd_local_timer; struct twd_local_timer;
void shmobile_twd_init(struct twd_local_timer *twd_local_timer);
extern void shmobile_setup_console(void); extern void shmobile_setup_console(void);
extern void shmobile_secondary_vector(void); extern void shmobile_secondary_vector(void);
extern int shmobile_platform_cpu_kill(unsigned int cpu); extern int shmobile_platform_cpu_kill(unsigned int cpu);
......
...@@ -688,10 +688,14 @@ void __init sh73a0_add_standard_devices(void) ...@@ -688,10 +688,14 @@ void __init sh73a0_add_standard_devices(void)
ARRAY_SIZE(sh73a0_late_devices)); ARRAY_SIZE(sh73a0_late_devices));
} }
/* do nothing for !CONFIG_SMP or !CONFIG_HAVE_TWD */
void __init __weak sh73a0_register_twd(void) { }
static void __init sh73a0_earlytimer_init(void) static void __init sh73a0_earlytimer_init(void)
{ {
sh73a0_clock_init(); sh73a0_clock_init();
shmobile_earlytimer_init(); shmobile_earlytimer_init();
sh73a0_register_twd();
} }
void __init sh73a0_add_early_devices(void) void __init sh73a0_add_early_devices(void)
......
...@@ -42,7 +42,13 @@ static void __iomem *scu_base_addr(void) ...@@ -42,7 +42,13 @@ static void __iomem *scu_base_addr(void)
static DEFINE_SPINLOCK(scu_lock); static DEFINE_SPINLOCK(scu_lock);
static unsigned long tmp; static unsigned long tmp;
#ifdef CONFIG_HAVE_ARM_TWD
static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, 0xf0000600, 29); static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, 0xf0000600, 29);
void __init sh73a0_register_twd(void)
{
twd_local_timer_register(&twd_local_timer);
}
#endif
static void modify_scu_cpu_psr(unsigned long set, unsigned long clr) static void modify_scu_cpu_psr(unsigned long set, unsigned long clr)
{ {
...@@ -62,7 +68,6 @@ unsigned int __init sh73a0_get_core_count(void) ...@@ -62,7 +68,6 @@ unsigned int __init sh73a0_get_core_count(void)
{ {
void __iomem *scu_base = scu_base_addr(); void __iomem *scu_base = scu_base_addr();
shmobile_twd_init(&twd_local_timer);
return scu_get_core_count(scu_base); return scu_get_core_count(scu_base);
} }
......
...@@ -46,15 +46,6 @@ static void __init shmobile_timer_init(void) ...@@ -46,15 +46,6 @@ static void __init shmobile_timer_init(void)
{ {
} }
void __init shmobile_twd_init(struct twd_local_timer *twd_local_timer)
{
#ifdef CONFIG_HAVE_ARM_TWD
int err = twd_local_timer_register(twd_local_timer);
if (err)
pr_err("twd_local_timer_register failed %d\n", err);
#endif
}
struct sys_timer shmobile_timer = { struct sys_timer shmobile_timer = {
.init = shmobile_timer_init, .init = shmobile_timer_init,
}; };
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment