diff options
Diffstat (limited to 'arch/arm/mach-realview/platsmp.c')
| -rw-r--r-- | arch/arm/mach-realview/platsmp.c | 53 | 
1 files changed, 19 insertions, 34 deletions
diff --git a/arch/arm/mach-realview/platsmp.c b/arch/arm/mach-realview/platsmp.c index 30a9c68591f..ac0e83f1cc3 100644 --- a/arch/arm/mach-realview/platsmp.c +++ b/arch/arm/mach-realview/platsmp.c @@ -19,10 +19,12 @@  #include <asm/cacheflush.h>  #include <mach/hardware.h>  #include <asm/mach-types.h> +#include <asm/localtimer.h>  #include <mach/board-eb.h>  #include <mach/board-pb11mp.h> -#include <mach/scu.h> +#include <mach/board-pbx.h> +#include <asm/smp_scu.h>  #include "core.h" @@ -40,35 +42,19 @@ static void __iomem *scu_base_addr(void)  		return __io_address(REALVIEW_EB11MP_SCU_BASE);  	else if (machine_is_realview_pb11mp())  		return __io_address(REALVIEW_TC11MP_SCU_BASE); +	else if (machine_is_realview_pbx() && +		 (core_tile_pbx11mp() || core_tile_pbxa9mp())) +		return __io_address(REALVIEW_PBX_TILE_SCU_BASE);  	else  		return (void __iomem *)0;  } -static unsigned int __init get_core_count(void) +static inline unsigned int get_core_count(void)  { -	unsigned int ncores;  	void __iomem *scu_base = scu_base_addr(); - -	if (scu_base) { -		ncores = __raw_readl(scu_base + SCU_CONFIG); -		ncores = (ncores & 0x03) + 1; -	} else -		ncores = 1; - -	return ncores; -} - -/* - * Setup the SCU - */ -static void scu_enable(void) -{ -	u32 scu_ctrl; -	void __iomem *scu_base = scu_base_addr(); - -	scu_ctrl = __raw_readl(scu_base + SCU_CTRL); -	scu_ctrl |= 1; -	__raw_writel(scu_ctrl, scu_base + SCU_CTRL); +	if (scu_base) +		return scu_get_core_count(scu_base); +	return 1;  }  static DEFINE_SPINLOCK(boot_lock); @@ -184,7 +170,7 @@ void __init smp_init_cpus(void)  	unsigned int i, ncores = get_core_count();  	for (i = 0; i < ncores; i++) -		cpu_set(i, cpu_possible_map); +		set_cpu_possible(i, true);  }  void __init smp_prepare_cpus(unsigned int max_cpus) @@ -217,19 +203,12 @@ void __init smp_prepare_cpus(unsigned int max_cpus)  	if (max_cpus > ncores)  		max_cpus = ncores; -#if defined(CONFIG_LOCAL_TIMERS) || defined(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) -	/* -	 * Enable the local timer or broadcast device for the boot CPU. -	 */ -	local_timer_setup(); -#endif -  	/*  	 * Initialise the present map, which describes the set of CPUs  	 * actually populated at the present time.  	 */  	for (i = 0; i < max_cpus; i++) -		cpu_set(i, cpu_present_map); +		set_cpu_present(i, true);  	/*  	 * Initialise the SCU if there are more than one CPU and let @@ -239,7 +218,13 @@ void __init smp_prepare_cpus(unsigned int max_cpus)  	 * WFI  	 */  	if (max_cpus > 1) { -		scu_enable(); +		/* +		 * Enable the local timer or broadcast device for the +		 * boot CPU, but only if we have more than one CPU. +		 */ +		percpu_timer_setup(); + +		scu_enable(scu_base_addr());  		poke_milo();  	}  }  |