diff options
Diffstat (limited to 'arch/arm/mach-clps711x/common.c')
| -rw-r--r-- | arch/arm/mach-clps711x/common.c | 207 | 
1 files changed, 6 insertions, 201 deletions
diff --git a/arch/arm/mach-clps711x/common.c b/arch/arm/mach-clps711x/common.c index 4ca2f3ca2de..aee81fa46cc 100644 --- a/arch/arm/mach-clps711x/common.c +++ b/arch/arm/mach-clps711x/common.c @@ -29,16 +29,16 @@  #include <linux/clockchips.h>  #include <linux/clocksource.h>  #include <linux/clk-provider.h> +#include <linux/sched_clock.h> -#include <asm/exception.h> -#include <asm/mach/irq.h>  #include <asm/mach/map.h>  #include <asm/mach/time.h> -#include <asm/sched_clock.h>  #include <asm/system_misc.h>  #include <mach/hardware.h> +#include "common.h" +  static struct clk *clk_pll, *clk_bus, *clk_uart, *clk_timerl, *clk_timerh,  		  *clk_tint, *clk_spi; @@ -59,207 +59,12 @@ void __init clps711x_map_io(void)  	iotable_init(clps711x_io_desc, ARRAY_SIZE(clps711x_io_desc));  } -static void int1_mask(struct irq_data *d) -{ -	u32 intmr1; - -	intmr1 = clps_readl(INTMR1); -	intmr1 &= ~(1 << d->irq); -	clps_writel(intmr1, INTMR1); -} - -static void int1_eoi(struct irq_data *d) -{ -	switch (d->irq) { -	case IRQ_CSINT:  clps_writel(0, COEOI);  break; -	case IRQ_TC1OI:  clps_writel(0, TC1EOI); break; -	case IRQ_TC2OI:  clps_writel(0, TC2EOI); break; -	case IRQ_RTCMI:  clps_writel(0, RTCEOI); break; -	case IRQ_TINT:   clps_writel(0, TEOI);   break; -	case IRQ_UMSINT: clps_writel(0, UMSEOI); break; -	} -} - -static void int1_unmask(struct irq_data *d) -{ -	u32 intmr1; - -	intmr1 = clps_readl(INTMR1); -	intmr1 |= 1 << d->irq; -	clps_writel(intmr1, INTMR1); -} - -static struct irq_chip int1_chip = { -	.name		= "Interrupt Vector 1", -	.irq_eoi	= int1_eoi, -	.irq_mask	= int1_mask, -	.irq_unmask	= int1_unmask, -}; - -static void int2_mask(struct irq_data *d) -{ -	u32 intmr2; - -	intmr2 = clps_readl(INTMR2); -	intmr2 &= ~(1 << (d->irq - 16)); -	clps_writel(intmr2, INTMR2); -} - -static void int2_eoi(struct irq_data *d) -{ -	switch (d->irq) { -	case IRQ_KBDINT: clps_writel(0, KBDEOI); break; -	} -} - -static void int2_unmask(struct irq_data *d) -{ -	u32 intmr2; - -	intmr2 = clps_readl(INTMR2); -	intmr2 |= 1 << (d->irq - 16); -	clps_writel(intmr2, INTMR2); -} - -static struct irq_chip int2_chip = { -	.name		= "Interrupt Vector 2", -	.irq_eoi	= int2_eoi, -	.irq_mask	= int2_mask, -	.irq_unmask	= int2_unmask, -}; - -static void int3_mask(struct irq_data *d) -{ -	u32 intmr3; - -	intmr3 = clps_readl(INTMR3); -	intmr3 &= ~(1 << (d->irq - 32)); -	clps_writel(intmr3, INTMR3); -} - -static void int3_unmask(struct irq_data *d) -{ -	u32 intmr3; - -	intmr3 = clps_readl(INTMR3); -	intmr3 |= 1 << (d->irq - 32); -	clps_writel(intmr3, INTMR3); -} - -static struct irq_chip int3_chip = { -	.name		= "Interrupt Vector 3", -	.irq_mask	= int3_mask, -	.irq_unmask	= int3_unmask, -}; - -static struct { -	int			nr; -	struct irq_chip		*chip; -	irq_flow_handler_t	handle; -} clps711x_irqdescs[] __initdata = { -	{ IRQ_CSINT,	&int1_chip,	handle_fasteoi_irq,	}, -	{ IRQ_EINT1,	&int1_chip,	handle_level_irq,	}, -	{ IRQ_EINT2,	&int1_chip,	handle_level_irq,	}, -	{ IRQ_EINT3,	&int1_chip,	handle_level_irq,	}, -	{ IRQ_TC1OI,	&int1_chip,	handle_fasteoi_irq,	}, -	{ IRQ_TC2OI,	&int1_chip,	handle_fasteoi_irq,	}, -	{ IRQ_RTCMI,	&int1_chip,	handle_fasteoi_irq,	}, -	{ IRQ_TINT,	&int1_chip,	handle_fasteoi_irq,	}, -	{ IRQ_UTXINT1,	&int1_chip,	handle_level_irq,	}, -	{ IRQ_URXINT1,	&int1_chip,	handle_level_irq,	}, -	{ IRQ_UMSINT,	&int1_chip,	handle_fasteoi_irq,	}, -	{ IRQ_SSEOTI,	&int1_chip,	handle_level_irq,	}, -	{ IRQ_KBDINT,	&int2_chip,	handle_fasteoi_irq,	}, -	{ IRQ_SS2RX,	&int2_chip,	handle_level_irq,	}, -	{ IRQ_SS2TX,	&int2_chip,	handle_level_irq,	}, -	{ IRQ_UTXINT2,	&int2_chip,	handle_level_irq,	}, -	{ IRQ_URXINT2,	&int2_chip,	handle_level_irq,	}, -}; -  void __init clps711x_init_irq(void)  { -	unsigned int i; - -	/* Disable interrupts */ -	clps_writel(0, INTMR1); -	clps_writel(0, INTMR2); -	clps_writel(0, INTMR3); - -	/* Clear down any pending interrupts */ -	clps_writel(0, BLEOI); -	clps_writel(0, MCEOI); -	clps_writel(0, COEOI); -	clps_writel(0, TC1EOI); -	clps_writel(0, TC2EOI); -	clps_writel(0, RTCEOI); -	clps_writel(0, TEOI); -	clps_writel(0, UMSEOI); -	clps_writel(0, KBDEOI); -	clps_writel(0, SRXEOF); -	clps_writel(0xffffffff, DAISR); - -	for (i = 0; i < ARRAY_SIZE(clps711x_irqdescs); i++) { -		irq_set_chip_and_handler(clps711x_irqdescs[i].nr, -					 clps711x_irqdescs[i].chip, -					 clps711x_irqdescs[i].handle); -		set_irq_flags(clps711x_irqdescs[i].nr, -			      IRQF_VALID | IRQF_PROBE); -	} - -	if (IS_ENABLED(CONFIG_FIQ)) { -		init_FIQ(0); -		irq_set_chip_and_handler(IRQ_DAIINT, &int3_chip, -					 handle_bad_irq); -		set_irq_flags(IRQ_DAIINT, -			      IRQF_VALID | IRQF_PROBE | IRQF_NOAUTOEN); -	} -} - -static inline u32 fls16(u32 x) -{ -	u32 r = 15; - -	if (!(x & 0xff00)) { -		x <<= 8; -		r -= 8; -	} -	if (!(x & 0xf000)) { -		x <<= 4; -		r -= 4; -	} -	if (!(x & 0xc000)) { -		x <<= 2; -		r -= 2; -	} -	if (!(x & 0x8000)) -		r--; - -	return r; -} - -asmlinkage void __exception_irq_entry clps711x_handle_irq(struct pt_regs *regs) -{ -	do { -		u32 irqstat; -		void __iomem *base = CLPS711X_VIRT_BASE; - -		irqstat = readw_relaxed(base + INTSR1) & -			  readw_relaxed(base + INTMR1); -		if (irqstat) -			handle_IRQ(fls16(irqstat), regs); - -		irqstat = readw_relaxed(base + INTSR2) & -			  readw_relaxed(base + INTMR2); -		if (irqstat) { -			handle_IRQ(fls16(irqstat) + 16, regs); -			continue; -		} - -		break; -	} while (1); +	clps711x_intc_init(CLPS711X_PHYS_BASE, SZ_16K);  } -static u32 notrace clps711x_sched_clock_read(void) +static u64 notrace clps711x_sched_clock_read(void)  {  	return ~readw_relaxed(CLPS711X_VIRT_BASE + TC1D);  } @@ -366,7 +171,7 @@ void __init clps711x_timer_init(void)  	tmp = clps_readl(SYSCON1) & ~(SYSCON1_TC1S | SYSCON1_TC1M);  	clps_writel(tmp, SYSCON1); -	setup_sched_clock(clps711x_sched_clock_read, 16, timl); +	sched_clock_register(clps711x_sched_clock_read, 16, timl);  	clocksource_mmio_init(CLPS711X_VIRT_BASE + TC1D,  			      "clps711x_clocksource", timl, 300, 16,  | 
