summaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-mxs
diff options
context:
space:
mode:
authorShawn Guo <shawn.guo@linaro.org>2012-08-19 22:14:56 -0400
committerShawn Guo <shawn.guo@linaro.org>2012-09-02 21:31:56 -0400
commit4e0a1b8c070fe204a406521496f01cf02c74e933 (patch)
treedf92b9a008d11710a152aa3c00167d20fc8bf773 /arch/arm/mach-mxs
parenteeca6e604032af8336baafef84144dd47f5a0f99 (diff)
ARM: mxs: select MULTI_IRQ_HANDLER
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>
Diffstat (limited to 'arch/arm/mach-mxs')
-rw-r--r--arch/arm/mach-mxs/icoll.c18
-rw-r--r--arch/arm/mach-mxs/include/mach/common.h1
-rw-r--r--arch/arm/mach-mxs/include/mach/entry-macro.S35
-rw-r--r--arch/arm/mach-mxs/mach-mxs.c2
4 files changed, 20 insertions, 36 deletions
diff --git a/arch/arm/mach-mxs/icoll.c b/arch/arm/mach-mxs/icoll.c
index 23ca9d083b2c..a11b6184026e 100644
--- a/arch/arm/mach-mxs/icoll.c
+++ b/arch/arm/mach-mxs/icoll.c
@@ -20,13 +20,14 @@
20#include <linux/init.h> 20#include <linux/init.h>
21#include <linux/irq.h> 21#include <linux/irq.h>
22#include <linux/io.h> 22#include <linux/io.h>
23 23#include <asm/exception.h>
24#include <mach/mxs.h> 24#include <mach/mxs.h>
25#include <mach/common.h> 25#include <mach/common.h>
26 26
27#define HW_ICOLL_VECTOR 0x0000 27#define HW_ICOLL_VECTOR 0x0000
28#define HW_ICOLL_LEVELACK 0x0010 28#define HW_ICOLL_LEVELACK 0x0010
29#define HW_ICOLL_CTRL 0x0020 29#define HW_ICOLL_CTRL 0x0020
30#define HW_ICOLL_STAT_OFFSET 0x0070
30#define HW_ICOLL_INTERRUPTn_SET(n) (0x0124 + (n) * 0x10) 31#define HW_ICOLL_INTERRUPTn_SET(n) (0x0124 + (n) * 0x10)
31#define HW_ICOLL_INTERRUPTn_CLR(n) (0x0128 + (n) * 0x10) 32#define HW_ICOLL_INTERRUPTn_CLR(n) (0x0128 + (n) * 0x10)
32#define BM_ICOLL_INTERRUPTn_ENABLE 0x00000004 33#define BM_ICOLL_INTERRUPTn_ENABLE 0x00000004
@@ -63,6 +64,21 @@ static struct irq_chip mxs_icoll_chip = {
63 .irq_unmask = icoll_unmask_irq, 64 .irq_unmask = icoll_unmask_irq,
64}; 65};
65 66
67asmlinkage void __exception_irq_entry icoll_handle_irq(struct pt_regs *regs)
68{
69 u32 irqnr;
70
71 do {
72 irqnr = __raw_readl(icoll_base + HW_ICOLL_STAT_OFFSET);
73 if (irqnr != 0x7f) {
74 __raw_writel(irqnr, icoll_base + HW_ICOLL_VECTOR);
75 handle_IRQ(irqnr, regs);
76 continue;
77 }
78 break;
79 } while (1);
80}
81
66void __init icoll_init_irq(void) 82void __init icoll_init_irq(void)
67{ 83{
68 int i; 84 int i;
diff --git a/arch/arm/mach-mxs/include/mach/common.h b/arch/arm/mach-mxs/include/mach/common.h
index a7416c8a85ff..10e4e12df870 100644
--- a/arch/arm/mach-mxs/include/mach/common.h
+++ b/arch/arm/mach-mxs/include/mach/common.h
@@ -28,6 +28,7 @@ extern void mx28_map_io(void);
28extern void mx28_init_irq(void); 28extern void mx28_init_irq(void);
29 29
30extern void icoll_init_irq(void); 30extern void icoll_init_irq(void);
31extern void icoll_handle_irq(struct pt_regs *);
31 32
32extern struct platform_device *mxs_add_dma(const char *devid, 33extern struct platform_device *mxs_add_dma(const char *devid,
33 resource_size_t base); 34 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
index 0c14259705b9..000000000000
--- a/arch/arm/mach-mxs/include/mach/entry-macro.S
+++ /dev/null
@@ -1,35 +0,0 @@
1/*
2 * Low-level IRQ helper macros for Freescale MXS-based
3 *
4 * Copyright (C) 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 */
20
21#include <mach/mxs.h>
22
23#define MXS_ICOLL_VBASE MXS_IO_ADDRESS(MXS_ICOLL_BASE_ADDR)
24#define HW_ICOLL_STAT_OFFSET 0x70
25
26 .macro get_irqnr_and_base, irqnr, irqstat, base, tmp
27 ldr \irqnr, [\base, #HW_ICOLL_STAT_OFFSET]
28 cmp \irqnr, #0x7F
29 strne \irqnr, [\base]
30 moveqs \irqnr, #0
31 .endm
32
33 .macro get_irqnr_preamble, base, tmp
34 ldr \base, =MXS_ICOLL_VBASE
35 .endm
diff --git a/arch/arm/mach-mxs/mach-mxs.c b/arch/arm/mach-mxs/mach-mxs.c
index 78bf07a8cd3c..b07af1c12cb6 100644
--- a/arch/arm/mach-mxs/mach-mxs.c
+++ b/arch/arm/mach-mxs/mach-mxs.c
@@ -294,6 +294,7 @@ static const char *imx28_dt_compat[] __initdata = {
294DT_MACHINE_START(IMX23, "Freescale i.MX23 (Device Tree)") 294DT_MACHINE_START(IMX23, "Freescale i.MX23 (Device Tree)")
295 .map_io = mx23_map_io, 295 .map_io = mx23_map_io,
296 .init_irq = mxs_dt_init_irq, 296 .init_irq = mxs_dt_init_irq,
297 .handle_irq = icoll_handle_irq,
297 .timer = &imx23_timer, 298 .timer = &imx23_timer,
298 .init_machine = mxs_machine_init, 299 .init_machine = mxs_machine_init,
299 .dt_compat = imx23_dt_compat, 300 .dt_compat = imx23_dt_compat,
@@ -303,6 +304,7 @@ MACHINE_END
303DT_MACHINE_START(IMX28, "Freescale i.MX28 (Device Tree)") 304DT_MACHINE_START(IMX28, "Freescale i.MX28 (Device Tree)")
304 .map_io = mx28_map_io, 305 .map_io = mx28_map_io,
305 .init_irq = mxs_dt_init_irq, 306 .init_irq = mxs_dt_init_irq,
307 .handle_irq = icoll_handle_irq,
306 .timer = &imx28_timer, 308 .timer = &imx28_timer,
307 .init_machine = mxs_machine_init, 309 .init_machine = mxs_machine_init,
308 .dt_compat = imx28_dt_compat, 310 .dt_compat = imx28_dt_compat,