diff options
Diffstat (limited to 'arch/arm/mach-versatile/core.c')
| -rw-r--r-- | arch/arm/mach-versatile/core.c | 52 | 
1 files changed, 30 insertions, 22 deletions
diff --git a/arch/arm/mach-versatile/core.c b/arch/arm/mach-versatile/core.c index 5d592945036..54bb80b012a 100644 --- a/arch/arm/mach-versatile/core.c +++ b/arch/arm/mach-versatile/core.c @@ -32,15 +32,16 @@  #include <linux/amba/mmci.h>  #include <linux/amba/pl022.h>  #include <linux/io.h> +#include <linux/irqchip/arm-vic.h>  #include <linux/irqchip/versatile-fpga.h>  #include <linux/gfp.h>  #include <linux/clkdev.h>  #include <linux/mtd/physmap.h> +#include <linux/bitops.h>  #include <asm/irq.h>  #include <asm/hardware/arm_timer.h>  #include <asm/hardware/icst.h> -#include <asm/hardware/vic.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> @@ -65,16 +66,28 @@  #define VA_VIC_BASE		__io_address(VERSATILE_VIC_BASE)  #define VA_SIC_BASE		__io_address(VERSATILE_SIC_BASE) +/* These PIC IRQs are valid in each configuration */ +#define PIC_VALID_ALL	BIT(SIC_INT_KMI0) | BIT(SIC_INT_KMI1) | \ +			BIT(SIC_INT_SCI3) | BIT(SIC_INT_UART3) | \ +			BIT(SIC_INT_CLCD) | BIT(SIC_INT_TOUCH) | \ +			BIT(SIC_INT_KEYPAD) | BIT(SIC_INT_DoC) | \ +			BIT(SIC_INT_USB) | BIT(SIC_INT_PCI0) | \ +			BIT(SIC_INT_PCI1) | BIT(SIC_INT_PCI2) | \ +			BIT(SIC_INT_PCI3)  #if 1  #define IRQ_MMCI0A	IRQ_VICSOURCE22  #define IRQ_AACI	IRQ_VICSOURCE24  #define IRQ_ETH		IRQ_VICSOURCE25  #define PIC_MASK	0xFFD00000 +#define PIC_VALID	PIC_VALID_ALL  #else  #define IRQ_MMCI0A	IRQ_SIC_MMCI0A  #define IRQ_AACI	IRQ_SIC_AACI  #define IRQ_ETH		IRQ_SIC_ETH  #define PIC_MASK	0 +#define PIC_VALID	PIC_VALID_ALL | BIT(SIC_INT_MMCI0A) | \ +			BIT(SIC_INT_MMCI1A) | BIT(SIC_INT_AACI) | \ +			BIT(SIC_INT_ETH)  #endif  /* Lookup table for finding a DT node that represents the vic instance */ @@ -102,7 +115,7 @@ void __init versatile_init_irq(void)  					      VERSATILE_SIC_BASE);  	fpga_irq_init(VA_SIC_BASE, "SIC", IRQ_SIC_START, -		IRQ_VICSOURCE31, ~PIC_MASK, np); +		IRQ_VICSOURCE31, PIC_VALID, np);  	/*  	 * Interrupts on secondary controller from 0 to 8 are routed to @@ -114,7 +127,7 @@ void __init versatile_init_irq(void)  	writel(PIC_MASK, VA_SIC_BASE + SIC_INT_PIC_ENABLE);  } -static struct map_desc versatile_io_desc[] __initdata = { +static struct map_desc versatile_io_desc[] __initdata __maybe_unused = {  	{  		.virtual	=  IO_ADDRESS(VERSATILE_SYS_BASE),  		.pfn		= __phys_to_pfn(VERSATILE_SYS_BASE), @@ -736,12 +749,25 @@ void versatile_restart(char mode, const char *cmd)  /* Early initializations */  void __init versatile_init_early(void)  { +	u32 val;  	void __iomem *sys = __io_address(VERSATILE_SYS_BASE);  	osc4_clk.vcoreg	= sys + VERSATILE_SYS_OSCCLCD_OFFSET;  	clkdev_add_table(lookups, ARRAY_SIZE(lookups));  	versatile_sched_clock_init(sys + VERSATILE_SYS_24MHz_OFFSET, 24000000); + +	/* +	 * set clock frequency: +	 *	VERSATILE_REFCLK is 32KHz +	 *	VERSATILE_TIMCLK is 1MHz +	 */ +	val = readl(__io_address(VERSATILE_SCTL_BASE)); +	writel((VERSATILE_TIMCLK << VERSATILE_TIMER1_EnSel) | +	       (VERSATILE_TIMCLK << VERSATILE_TIMER2_EnSel) | +	       (VERSATILE_TIMCLK << VERSATILE_TIMER3_EnSel) | +	       (VERSATILE_TIMCLK << VERSATILE_TIMER4_EnSel) | val, +	       __io_address(VERSATILE_SCTL_BASE));  }  void __init versatile_init(void) @@ -770,21 +796,8 @@ void __init versatile_init(void)  /*   * Set up timer interrupt, and return the current time in seconds.   */ -static void __init versatile_timer_init(void) +void __init versatile_timer_init(void)  { -	u32 val; - -	/*  -	 * set clock frequency:  -	 *	VERSATILE_REFCLK is 32KHz -	 *	VERSATILE_TIMCLK is 1MHz -	 */ -	val = readl(__io_address(VERSATILE_SCTL_BASE)); -	writel((VERSATILE_TIMCLK << VERSATILE_TIMER1_EnSel) | -	       (VERSATILE_TIMCLK << VERSATILE_TIMER2_EnSel) |  -	       (VERSATILE_TIMCLK << VERSATILE_TIMER3_EnSel) | -	       (VERSATILE_TIMCLK << VERSATILE_TIMER4_EnSel) | val, -	       __io_address(VERSATILE_SCTL_BASE));  	/*  	 * Initialise to a known state (all timers off) @@ -797,8 +810,3 @@ static void __init versatile_timer_init(void)  	sp804_clocksource_init(TIMER3_VA_BASE, "timer3");  	sp804_clockevents_init(TIMER0_VA_BASE, IRQ_TIMERINT0_1, "timer0");  } - -struct sys_timer versatile_timer = { -	.init		= versatile_timer_init, -}; -  |