asus-laptop: version bump
[pandora-kernel.git] / include / asm-arm / arch-lh7a40x / entry-macro.S
1 /*
2  * include/asm-arm/arch-lh7a40x/entry-macro.S
3  *
4  * Low-level IRQ helper macros for LH7A40x platforms
5  *
6  * This file is licensed under  the terms of the GNU General Public
7  * License version 2. This program is licensed "as is" without any
8  * warranty of any kind, whether express or implied.
9  */
10 #include <asm/hardware.h>
11 #include <asm/arch/irqs.h>
12
13 /* In order to allow there to be support for both of the processor
14    classes at the same time, we make a hack here that isn't very
15    pretty.  At startup, the link pointed to with the
16    branch_irq_lh7a400 symbol is replaced with a NOP when the CPU is
17    detected as a lh7a404.
18
19    *** FIXME: we should clean this up so that there is only one
20               implementation for each CPU's design.
21
22 */
23
24 #if defined (CONFIG_ARCH_LH7A400) && defined (CONFIG_ARCH_LH7A404)
25
26                 .macro  disable_fiq
27                 .endm
28
29                 .macro  get_irqnr_preamble, base, tmp
30                 .endm
31
32                 .macro  arch_ret_to_user, tmp1, tmp2
33                 .endm
34
35                 .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
36
37 branch_irq_lh7a400: b 1000f
38
39 @ Implementation of the LH7A404 get_irqnr_and_base.
40
41                 mov     \irqnr, #0                      @ VIC1 irq base
42                 mov     \base, #io_p2v(0x80000000)      @ APB registers
43                 add     \base, \base, #0x8000
44                 ldr     \tmp, [\base, #0x0030]          @ VIC1_VECTADDR
45                 tst     \tmp, #VA_VECTORED              @ Direct vectored
46                 bne     1002f
47                 tst     \tmp, #VA_VIC1DEFAULT           @ Default vectored VIC1
48                 ldrne   \irqstat, [\base, #0]           @ VIC1_IRQSTATUS
49                 bne     1001f
50                 add     \base, \base, #(0xa000 - 0x8000)
51                 ldr     \tmp, [\base, #0x0030]          @ VIC2_VECTADDR
52                 tst     \tmp, #VA_VECTORED              @ Direct vectored
53                 bne     1002f
54                 ldr     \irqstat, [\base, #0]           @ VIC2_IRQSTATUS
55                 mov     \irqnr, #32                     @ VIC2 irq base
56
57 1001:           movs    \irqstat, \irqstat, lsr #1      @ Shift into carry
58                 bcs     1008f                           @ Bit set; irq found
59                 add     \irqnr, \irqnr, #1
60                 bne     1001b                           @ Until no bits
61                 b       1009f                           @ Nothing?  Hmm.
62 1002:           and     \irqnr, \tmp, #0x3f             @ Mask for valid bits
63 1008:           movs    \irqstat, #1                    @ Force !Z
64                 str     \tmp, [\base, #0x0030]          @ Clear vector
65                 b       1009f
66
67 @ Implementation of the LH7A400 get_irqnr_and_base.
68
69 1000:           mov     \irqnr, #0
70                 mov     \base, #io_p2v(0x80000000)      @ APB registers
71                 ldr     \irqstat, [\base, #0x500]       @ PIC INTSR
72
73 1001:           movs    \irqstat, \irqstat, lsr #1      @ Shift into carry
74                 bcs     1008f                           @ Bit set; irq found
75                 add     \irqnr, \irqnr, #1
76                 bne     1001b                           @ Until no bits
77                 b       1009f                           @ Nothing?  Hmm.
78 1008:           movs    \irqstat, #1                    @ Force !Z
79
80 1009:
81                .endm
82
83
84
85 #elif defined (CONFIG_ARCH_LH7A400)
86                 .macro  disable_fiq
87                 .endm
88
89                 .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
90                 mov     \irqnr, #0
91                 mov     \base, #io_p2v(0x80000000)      @ APB registers
92                 ldr     \irqstat, [\base, #0x500]       @ PIC INTSR
93
94 1001:           movs    \irqstat, \irqstat, lsr #1      @ Shift into carry
95                 bcs     1008f                           @ Bit set; irq found
96                 add     \irqnr, \irqnr, #1
97                 bne     1001b                           @ Until no bits
98                 b       1009f                           @ Nothing?  Hmm.
99 1008:           movs    \irqstat, #1                    @ Force !Z
100 1009:
101                .endm
102
103 #elif defined(CONFIG_ARCH_LH7A404)
104
105                 .macro  disable_fiq
106                 .endm
107
108                 .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
109                 mov     \irqnr, #0                      @ VIC1 irq base
110                 mov     \base, #io_p2v(0x80000000)      @ APB registers
111                 add     \base, \base, #0x8000
112                 ldr     \tmp, [\base, #0x0030]          @ VIC1_VECTADDR
113                 tst     \tmp, #VA_VECTORED              @ Direct vectored
114                 bne     1002f
115                 tst     \tmp, #VA_VIC1DEFAULT           @ Default vectored VIC1
116                 ldrne   \irqstat, [\base, #0]           @ VIC1_IRQSTATUS
117                 bne     1001f
118                 add     \base, \base, #(0xa000 - 0x8000)
119                 ldr     \tmp, [\base, #0x0030]          @ VIC2_VECTADDR
120                 tst     \tmp, #VA_VECTORED              @ Direct vectored
121                 bne     1002f
122                 ldr     \irqstat, [\base, #0]           @ VIC2_IRQSTATUS
123                 mov     \irqnr, #32                     @ VIC2 irq base
124
125 1001:           movs    \irqstat, \irqstat, lsr #1      @ Shift into carry
126                 bcs     1008f                           @ Bit set; irq found
127                 add     \irqnr, \irqnr, #1
128                 bne     1001b                           @ Until no bits
129                 b       1009f                           @ Nothing?  Hmm.
130 1002:           and     \irqnr, \tmp, #0x3f             @ Mask for valid bits
131 1008:           movs    \irqstat, #1                    @ Force !Z
132                 str     \tmp, [\base, #0x0030]          @ Clear vector
133 1009:
134                .endm
135 #endif
136
137