#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/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;
 
        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 u64 notrace clps711x_sched_clock_read(void)