Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/shaggy...
[linux-2.6] / include / asm-arm / arch-s3c2410 / entry-macro.S
1 /*
2  * include/asm-arm/arch-s3c2410/entry-macro.S
3  *
4  * Low-level IRQ helper macros for S3C2410-based 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
11 /* We have a problem that the INTOFFSET register does not always
12  * show one interrupt. Occasionally we get two interrupts through
13  * the prioritiser, and this causes the INTOFFSET register to show
14  * what looks like the logical-or of the two interrupt numbers.
15  *
16  * Thanks to Klaus, Shannon, et al for helping to debug this problem
17 */
18
19 #define INTPND          (0x10)
20 #define INTOFFSET       (0x14)
21
22 #include <asm/hardware.h>
23 #include <asm/arch/irqs.h>
24
25         .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
26
27                 mov     \base, #S3C24XX_VA_IRQ
28
29                 @@ try the interrupt offset register, since it is there
30
31                 ldr     \irqstat, [ \base, #INTPND ]
32                 teq     \irqstat, #0
33                 beq     1002f
34                 ldr     \irqnr, [ \base, #INTOFFSET ]
35                 mov     \tmp, #1
36                 tst     \irqstat, \tmp, lsl \irqnr
37                 bne     1001f
38
39                 @@ the number specified is not a valid irq, so try
40                 @@ and work it out for ourselves
41
42                 mov     \irqnr, #0              @@ start here
43
44                 @@ work out which irq (if any) we got
45
46                 movs    \tmp, \irqstat, lsl#16
47                 addeq   \irqnr, \irqnr, #16
48                 moveq   \irqstat, \irqstat, lsr#16
49                 tst     \irqstat, #0xff
50                 addeq   \irqnr, \irqnr, #8
51                 moveq   \irqstat, \irqstat, lsr#8
52                 tst     \irqstat, #0xf
53                 addeq   \irqnr, \irqnr, #4
54                 moveq   \irqstat, \irqstat, lsr#4
55                 tst     \irqstat, #0x3
56                 addeq   \irqnr, \irqnr, #2
57                 moveq   \irqstat, \irqstat, lsr#2
58                 tst     \irqstat, #0x1
59                 addeq   \irqnr, \irqnr, #1
60
61                 @@ we have the value
62 1001:
63                 adds    \irqnr, \irqnr, #IRQ_EINT0
64 1002:
65                 @@ exit here, Z flag unset if IRQ
66
67         .endm
68
69                 /* currently don't need an disable_fiq macro */
70
71                 .macro  disable_fiq
72                 .endm