Loading arch/arm/Kconfig +1 −0 Original line number Diff line number Diff line Loading @@ -371,6 +371,7 @@ config ARCH_CLPS711X select COMMON_CLK select CPU_ARM720T select GENERIC_CLOCKEVENTS select MULTI_IRQ_HANDLER select NEED_MACH_MEMORY_H select SPARSE_IRQ help Loading arch/arm/mach-clps711x/autcpu12.c +1 −0 Original line number Diff line number Diff line Loading @@ -75,6 +75,7 @@ MACHINE_START(AUTCPU12, "autronix autcpu12") .init_irq = clps711x_init_irq, .timer = &clps711x_timer, .init_machine = autcpu12_init, .handle_irq = clps711x_handle_irq, .restart = clps711x_restart, MACHINE_END arch/arm/mach-clps711x/cdb89712.c +1 −0 Original line number Diff line number Diff line Loading @@ -142,5 +142,6 @@ MACHINE_START(CDB89712, "Cirrus-CDB89712") .init_irq = clps711x_init_irq, .timer = &clps711x_timer, .init_machine = cdb89712_init, .handle_irq = clps711x_handle_irq, .restart = clps711x_restart, MACHINE_END arch/arm/mach-clps711x/clep7312.c +1 −2 Original line number Diff line number Diff line Loading @@ -33,7 +33,6 @@ fixup_clep7312(struct tag *tags, char **cmdline, struct meminfo *mi) mi->bank[0].size = 0x01000000; } MACHINE_START(CLEP7212, "Cirrus Logic 7212/7312") /* Maintainer: Nobody */ .atag_offset = 0x0100, Loading @@ -42,6 +41,6 @@ MACHINE_START(CLEP7212, "Cirrus Logic 7212/7312") .map_io = clps711x_map_io, .init_irq = clps711x_init_irq, .timer = &clps711x_timer, .handle_irq = clps711x_handle_irq, .restart = clps711x_restart, MACHINE_END arch/arm/mach-clps711x/common.c +41 −4 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ #include <linux/clockchips.h> #include <linux/clk-provider.h> #include <asm/exception.h> #include <asm/mach/map.h> #include <asm/mach/time.h> #include <asm/system_misc.h> Loading Loading @@ -134,13 +135,11 @@ static struct irq_chip int2_chip = { .irq_unmask = int2_unmask, }; struct clps711x_irqdesc { static struct { int nr; struct irq_chip *chip; irq_flow_handler_t handle; }; static struct clps711x_irqdesc clps711x_irqdescs[] __initdata = { } clps711x_irqdescs[] __initdata = { { IRQ_CSINT, &int1_chip, handle_fasteoi_irq, }, { IRQ_EINT1, &int1_chip, handle_level_irq, }, { IRQ_EINT2, &int1_chip, handle_level_irq, }, Loading Loading @@ -191,6 +190,44 @@ void __init clps711x_init_irq(void) } } 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) { u32 irqstat; void __iomem *base = CLPS711X_VIRT_BASE; irqstat = readl_relaxed(base + INTSR1) & readl_relaxed(base + INTMR1); if (irqstat) { handle_IRQ(fls16(irqstat), regs); return; } irqstat = readl_relaxed(base + INTSR2) & readl_relaxed(base + INTMR2); if (likely(irqstat)) handle_IRQ(fls16(irqstat) + 16, regs); } static void clps711x_clockevent_set_mode(enum clock_event_mode mode, struct clock_event_device *evt) { Loading Loading
arch/arm/Kconfig +1 −0 Original line number Diff line number Diff line Loading @@ -371,6 +371,7 @@ config ARCH_CLPS711X select COMMON_CLK select CPU_ARM720T select GENERIC_CLOCKEVENTS select MULTI_IRQ_HANDLER select NEED_MACH_MEMORY_H select SPARSE_IRQ help Loading
arch/arm/mach-clps711x/autcpu12.c +1 −0 Original line number Diff line number Diff line Loading @@ -75,6 +75,7 @@ MACHINE_START(AUTCPU12, "autronix autcpu12") .init_irq = clps711x_init_irq, .timer = &clps711x_timer, .init_machine = autcpu12_init, .handle_irq = clps711x_handle_irq, .restart = clps711x_restart, MACHINE_END
arch/arm/mach-clps711x/cdb89712.c +1 −0 Original line number Diff line number Diff line Loading @@ -142,5 +142,6 @@ MACHINE_START(CDB89712, "Cirrus-CDB89712") .init_irq = clps711x_init_irq, .timer = &clps711x_timer, .init_machine = cdb89712_init, .handle_irq = clps711x_handle_irq, .restart = clps711x_restart, MACHINE_END
arch/arm/mach-clps711x/clep7312.c +1 −2 Original line number Diff line number Diff line Loading @@ -33,7 +33,6 @@ fixup_clep7312(struct tag *tags, char **cmdline, struct meminfo *mi) mi->bank[0].size = 0x01000000; } MACHINE_START(CLEP7212, "Cirrus Logic 7212/7312") /* Maintainer: Nobody */ .atag_offset = 0x0100, Loading @@ -42,6 +41,6 @@ MACHINE_START(CLEP7212, "Cirrus Logic 7212/7312") .map_io = clps711x_map_io, .init_irq = clps711x_init_irq, .timer = &clps711x_timer, .handle_irq = clps711x_handle_irq, .restart = clps711x_restart, MACHINE_END
arch/arm/mach-clps711x/common.c +41 −4 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ #include <linux/clockchips.h> #include <linux/clk-provider.h> #include <asm/exception.h> #include <asm/mach/map.h> #include <asm/mach/time.h> #include <asm/system_misc.h> Loading Loading @@ -134,13 +135,11 @@ static struct irq_chip int2_chip = { .irq_unmask = int2_unmask, }; struct clps711x_irqdesc { static struct { int nr; struct irq_chip *chip; irq_flow_handler_t handle; }; static struct clps711x_irqdesc clps711x_irqdescs[] __initdata = { } clps711x_irqdescs[] __initdata = { { IRQ_CSINT, &int1_chip, handle_fasteoi_irq, }, { IRQ_EINT1, &int1_chip, handle_level_irq, }, { IRQ_EINT2, &int1_chip, handle_level_irq, }, Loading Loading @@ -191,6 +190,44 @@ void __init clps711x_init_irq(void) } } 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) { u32 irqstat; void __iomem *base = CLPS711X_VIRT_BASE; irqstat = readl_relaxed(base + INTSR1) & readl_relaxed(base + INTMR1); if (irqstat) { handle_IRQ(fls16(irqstat), regs); return; } irqstat = readl_relaxed(base + INTSR2) & readl_relaxed(base + INTMR2); if (likely(irqstat)) handle_IRQ(fls16(irqstat) + 16, regs); } static void clps711x_clockevent_set_mode(enum clock_event_mode mode, struct clock_event_device *evt) { Loading