ARM: mxs: select MULTI_IRQ_HANDLER
authorShawn Guo <shawn.guo@linaro.org>
Mon, 20 Aug 2012 02:14:56 +0000 (10:14 +0800)
committerShawn Guo <shawn.guo@linaro.org>
Mon, 3 Sep 2012 01:31:56 +0000 (09:31 +0800)
As part of multi-platform effort, let's enable MULTI_IRQ_HANDLER for
mach-mxs and remove entry-macro.S.

Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
arch/arm/Kconfig
arch/arm/mach-mxs/icoll.c
arch/arm/mach-mxs/include/mach/common.h
arch/arm/mach-mxs/include/mach/entry-macro.S [deleted file]
arch/arm/mach-mxs/mach-mxs.c

index e91c7cdc6fe5c5ae370fa8be0f3a3c51a0b49beb..72070865a79103f97db07770e878e3df641d12fa 100644 (file)
@@ -489,6 +489,7 @@ config ARCH_MXS
        select CLKSRC_MMIO
        select COMMON_CLK
        select HAVE_CLK_PREPARE
+       select MULTI_IRQ_HANDLER
        select PINCTRL
        select USE_OF
        help
index 23ca9d083b2c09551a63e6628069a53daa4d0590..a11b6184026ee2116e1409bf4e198a4e033787a4 100644 (file)
 #include <linux/init.h>
 #include <linux/irq.h>
 #include <linux/io.h>
-
+#include <asm/exception.h>
 #include <mach/mxs.h>
 #include <mach/common.h>
 
 #define HW_ICOLL_VECTOR                                0x0000
 #define HW_ICOLL_LEVELACK                      0x0010
 #define HW_ICOLL_CTRL                          0x0020
+#define HW_ICOLL_STAT_OFFSET                   0x0070
 #define HW_ICOLL_INTERRUPTn_SET(n)             (0x0124 + (n) * 0x10)
 #define HW_ICOLL_INTERRUPTn_CLR(n)             (0x0128 + (n) * 0x10)
 #define BM_ICOLL_INTERRUPTn_ENABLE             0x00000004
@@ -63,6 +64,21 @@ static struct irq_chip mxs_icoll_chip = {
        .irq_unmask = icoll_unmask_irq,
 };
 
+asmlinkage void __exception_irq_entry icoll_handle_irq(struct pt_regs *regs)
+{
+       u32 irqnr;
+
+       do {
+               irqnr = __raw_readl(icoll_base + HW_ICOLL_STAT_OFFSET);
+               if (irqnr != 0x7f) {
+                       __raw_writel(irqnr, icoll_base + HW_ICOLL_VECTOR);
+                       handle_IRQ(irqnr, regs);
+                       continue;
+               }
+               break;
+       } while (1);
+}
+
 void __init icoll_init_irq(void)
 {
        int i;
index a7416c8a85ffa0e2044dd64e51376efd93bdfdad..10e4e12df870b98824a09dff4792e885a53f1fff 100644 (file)
@@ -28,6 +28,7 @@ extern void mx28_map_io(void);
 extern void mx28_init_irq(void);
 
 extern void icoll_init_irq(void);
+extern void icoll_handle_irq(struct pt_regs *);
 
 extern struct platform_device *mxs_add_dma(const char *devid,
                                                resource_size_t base);
diff --git a/arch/arm/mach-mxs/include/mach/entry-macro.S b/arch/arm/mach-mxs/include/mach/entry-macro.S
deleted file mode 100644 (file)
index 0c14259..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Low-level IRQ helper macros for Freescale MXS-based
- *
- * Copyright (C) 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <mach/mxs.h>
-
-#define MXS_ICOLL_VBASE                MXS_IO_ADDRESS(MXS_ICOLL_BASE_ADDR)
-#define HW_ICOLL_STAT_OFFSET   0x70
-
-       .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
-       ldr     \irqnr, [\base, #HW_ICOLL_STAT_OFFSET]
-       cmp     \irqnr, #0x7F
-       strne   \irqnr, [\base]
-       moveqs  \irqnr, #0
-       .endm
-
-       .macro  get_irqnr_preamble, base, tmp
-       ldr     \base, =MXS_ICOLL_VBASE
-       .endm
index 78bf07a8cd3c4cba3fcee5d051777e7b89ba60a4..b07af1c12cb61bcbec18275dccdb875d063005b9 100644 (file)
@@ -294,6 +294,7 @@ static const char *imx28_dt_compat[] __initdata = {
 DT_MACHINE_START(IMX23, "Freescale i.MX23 (Device Tree)")
        .map_io         = mx23_map_io,
        .init_irq       = mxs_dt_init_irq,
+       .handle_irq     = icoll_handle_irq,
        .timer          = &imx23_timer,
        .init_machine   = mxs_machine_init,
        .dt_compat      = imx23_dt_compat,
@@ -303,6 +304,7 @@ MACHINE_END
 DT_MACHINE_START(IMX28, "Freescale i.MX28 (Device Tree)")
        .map_io         = mx28_map_io,
        .init_irq       = mxs_dt_init_irq,
+       .handle_irq     = icoll_handle_irq,
        .timer          = &imx28_timer,
        .init_machine   = mxs_machine_init,
        .dt_compat      = imx28_dt_compat,
This page took 0.028549 seconds and 5 git commands to generate.