Merge branch 'kconfig' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6
[pandora-kernel.git] / arch / arm / mach-omap2 / include / mach / entry-macro.S
1 /*
2  * arch/arm/plat-omap/include/mach/entry-macro.S
3  *
4  * Low-level IRQ helper macros for OMAP-based platforms
5  *
6  * Copyright (C) 2009 Texas Instruments
7  * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com>
8  *
9  * This file is licensed under  the terms of the GNU General Public
10  * License version 2. This program is licensed "as is" without any
11  * warranty of any kind, whether express or implied.
12  */
13 #include <mach/hardware.h>
14 #include <mach/io.h>
15 #include <mach/irqs.h>
16 #include <asm/hardware/gic.h>
17
18 #include <plat/omap24xx.h>
19 #include <plat/omap34xx.h>
20 #include <plat/omap44xx.h>
21
22 #include <plat/multi.h>
23
24 #define OMAP2_IRQ_BASE          OMAP2_L4_IO_ADDRESS(OMAP24XX_IC_BASE)
25 #define OMAP3_IRQ_BASE          OMAP2_L4_IO_ADDRESS(OMAP34XX_IC_BASE)
26 #define OMAP4_IRQ_BASE          OMAP2_L4_IO_ADDRESS(OMAP44XX_GIC_CPU_BASE)
27 #define INTCPS_SIR_IRQ_OFFSET   0x0040  /* omap2/3 active interrupt offset */
28 #define ACTIVEIRQ_MASK          0x7f    /* omap2/3 active interrupt bits */
29
30                 .macro  disable_fiq
31                 .endm
32
33                 .macro  arch_ret_to_user, tmp1, tmp2
34                 .endm
35
36 /*
37  * Unoptimized irq functions for multi-omap2, 3 and 4
38  */
39
40 #ifdef MULTI_OMAP2
41
42 /*
43  * We use __glue to avoid errors with multiple definitions of
44  * .globl omap_irq_base as it's included from entry-armv.S but not
45  * from entry-common.S.
46  */
47 #ifdef __glue
48                 .pushsection .data
49                 .globl  omap_irq_base
50 omap_irq_base:
51                 .word   0
52                 .popsection
53 #endif
54
55                 /*
56                  * Configure the interrupt base on the first interrupt.
57                  * See also omap_irq_base_init for setting omap_irq_base.
58                  */
59                 .macro  get_irqnr_preamble, base, tmp
60                 ldr     \base, =omap_irq_base   @ irq base address
61                 ldr     \base, [\base, #0]      @ irq base value
62                 .endm
63
64                 /* Check the pending interrupts. Note that base already set */
65                 .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
66                 tst     \base, #0x100           @ gic address?
67                 bne     4401f                   @ found gic
68
69                 /* Handle omap2 and omap3 */
70                 ldr     \irqnr, [\base, #0x98] /* IRQ pending reg 1 */
71                 cmp     \irqnr, #0x0
72                 bne     9998f
73                 ldr     \irqnr, [\base, #0xb8] /* IRQ pending reg 2 */
74                 cmp     \irqnr, #0x0
75                 bne     9998f
76                 ldr     \irqnr, [\base, #0xd8] /* IRQ pending reg 3 */
77                 cmp     \irqnr, #0x0
78 9998:
79                 ldrne   \irqnr, [\base, #INTCPS_SIR_IRQ_OFFSET]
80                 and     \irqnr, \irqnr, #ACTIVEIRQ_MASK /* Clear spurious bits */
81                 b       9999f
82
83                 /* Handle omap4 */
84 4401:           ldr     \irqstat, [\base, #GIC_CPU_INTACK]
85                 ldr     \tmp, =1021
86                 bic     \irqnr, \irqstat, #0x1c00
87                 cmp     \irqnr, #29
88                 cmpcc   \irqnr, \irqnr
89                 cmpne   \irqnr, \tmp
90                 cmpcs   \irqnr, \irqnr
91 9999:
92                 .endm
93
94 #ifdef CONFIG_SMP
95                 /* We assume that irqstat (the raw value of the IRQ acknowledge
96                  * register) is preserved from the macro above.
97                  * If there is an IPI, we immediately signal end of interrupt
98                  * on the controller, since this requires the original irqstat
99                  * value which we won't easily be able to recreate later.
100                  */
101
102                 .macro test_for_ipi, irqnr, irqstat, base, tmp
103                 bic     \irqnr, \irqstat, #0x1c00
104                 cmp     \irqnr, #16
105                 it      cc
106                 strcc   \irqstat, [\base, #GIC_CPU_EOI]
107                 it      cs
108                 cmpcs   \irqnr, \irqnr
109                 .endm
110
111                 /* As above, this assumes that irqstat and base are preserved */
112
113                 .macro test_for_ltirq, irqnr, irqstat, base, tmp
114                 bic     \irqnr, \irqstat, #0x1c00
115                 mov     \tmp, #0
116                 cmp     \irqnr, #29
117                 itt     eq
118                 moveq   \tmp, #1
119                 streq   \irqstat, [\base, #GIC_CPU_EOI]
120                 cmp     \tmp, #0
121                 .endm
122 #endif  /* CONFIG_SMP */
123
124 #else   /* MULTI_OMAP2 */
125
126
127 /*
128  * Optimized irq functions for omap2, 3 and 4
129  */
130
131 #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
132                 .macro  get_irqnr_preamble, base, tmp
133 #ifdef CONFIG_ARCH_OMAP2
134                 ldr     \base, =OMAP2_IRQ_BASE
135 #else
136                 ldr     \base, =OMAP3_IRQ_BASE
137 #endif
138                 .endm
139
140                 /* Check the pending interrupts. Note that base already set */
141                 .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
142                 ldr     \irqnr, [\base, #0x98] /* IRQ pending reg 1 */
143                 cmp     \irqnr, #0x0
144                 bne     9999f
145                 ldr     \irqnr, [\base, #0xb8] /* IRQ pending reg 2 */
146                 cmp     \irqnr, #0x0
147                 bne     9999f
148                 ldr     \irqnr, [\base, #0xd8] /* IRQ pending reg 3 */
149                 cmp     \irqnr, #0x0
150 9999:
151                 ldrne   \irqnr, [\base, #INTCPS_SIR_IRQ_OFFSET]
152                 and     \irqnr, \irqnr, #ACTIVEIRQ_MASK /* Clear spurious bits */
153
154                 .endm
155 #endif
156
157
158 #ifdef CONFIG_ARCH_OMAP4
159 #define HAVE_GET_IRQNR_PREAMBLE
160 #include <asm/hardware/entry-macro-gic.S>
161
162                 .macro  get_irqnr_preamble, base, tmp
163                 ldr     \base, =OMAP4_IRQ_BASE
164                 .endm
165
166 #endif
167
168 #endif  /* MULTI_OMAP2 */
169
170                 .macro  irq_prio_table
171                 .endm