From mboxrd@z Thu Jan 1 00:00:00 1970 From: santosh.shilimkar@ti.com (Santosh Shilimkar) Date: Fri, 1 Feb 2013 11:11:24 +0530 Subject: [PATCH v3 07/15] ARM: vexpress: Select the correct SMP operations at run-time In-Reply-To: <1359445870-18925-8-git-send-email-nicolas.pitre@linaro.org> References: <1359445870-18925-1-git-send-email-nicolas.pitre@linaro.org> <1359445870-18925-8-git-send-email-nicolas.pitre@linaro.org> Message-ID: <510B5584.6020800@ti.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Tuesday 29 January 2013 01:21 PM, Nicolas Pitre wrote: > From: Jon Medhurst > The patch deserves couple of lines of description here. > Signed-off-by: Jon Medhurst > --- > arch/arm/include/asm/mach/arch.h | 3 +++ > arch/arm/kernel/setup.c | 5 ++++- > arch/arm/mach-vexpress/core.h | 2 ++ > arch/arm/mach-vexpress/platsmp.c | 12 ++++++++++++ > arch/arm/mach-vexpress/v2m.c | 2 +- > 5 files changed, 22 insertions(+), 2 deletions(-) > > diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h > index 917d4fcfd9..3d01c6d6c3 100644 > --- a/arch/arm/include/asm/mach/arch.h > +++ b/arch/arm/include/asm/mach/arch.h > @@ -17,8 +17,10 @@ struct pt_regs; > struct smp_operations; > #ifdef CONFIG_SMP > #define smp_ops(ops) (&(ops)) > +#define smp_init_ops(ops) (&(ops)) > #else > #define smp_ops(ops) (struct smp_operations *)NULL > +#define smp_init_ops(ops) (void (*)(void))NULL > #endif > > struct machine_desc { > @@ -42,6 +44,7 @@ struct machine_desc { > unsigned char reserve_lp2 :1; /* never has lp2 */ > char restart_mode; /* default restart mode */ > struct smp_operations *smp; /* SMP operations */ > + void (*smp_init)(void); > void (*fixup)(struct tag *, char **, > struct meminfo *); > void (*reserve)(void);/* reserve mem blocks */ > diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c > index 3f6cbb2e3e..41edca8582 100644 > --- a/arch/arm/kernel/setup.c > +++ b/arch/arm/kernel/setup.c > @@ -768,7 +768,10 @@ void __init setup_arch(char **cmdline_p) > arm_dt_init_cpu_maps(); > #ifdef CONFIG_SMP > if (is_smp()) { > - smp_set_ops(mdesc->smp); > + if(mdesc->smp_init) > + (*mdesc->smp_init)(); > + else > + smp_set_ops(mdesc->smp); > smp_init_cpus(); > } > #endif > diff --git a/arch/arm/mach-vexpress/core.h b/arch/arm/mach-vexpress/core.h > index f134cd4a85..3a761fd76c 100644 > --- a/arch/arm/mach-vexpress/core.h > +++ b/arch/arm/mach-vexpress/core.h > @@ -6,6 +6,8 @@ > > void vexpress_dt_smp_map_io(void); > > +void vexpress_smp_init_ops(void); > + > extern struct smp_operations vexpress_smp_ops; > > extern void vexpress_cpu_die(unsigned int cpu); > diff --git a/arch/arm/mach-vexpress/platsmp.c b/arch/arm/mach-vexpress/platsmp.c > index c5d70de9bb..667344b479 100644 > --- a/arch/arm/mach-vexpress/platsmp.c > +++ b/arch/arm/mach-vexpress/platsmp.c > @@ -12,6 +12,7 @@ > #include > #include > #include > +#include > #include > #include > > @@ -206,3 +207,14 @@ struct smp_operations __initdata vexpress_smp_ops = { > .cpu_die = vexpress_cpu_die, > #endif > }; > + > +void __init vexpress_smp_init_ops(void) > +{ > + struct smp_operations *ops = &vexpress_smp_ops; > +#ifdef CONFIG_CLUSTER_PM See if you can avoid this #ifdef in the middle of function. Reviewed-by: Santosh Shilimkar