Linux 2.6.20.13
[linux/fpc-iii.git] / include / asm-arm / arch-s3c2410 / entry-macro.S
blob1eb4e6b8d249c70ed2a53be4c7252aed5dbaf23c
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 */
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
19 #define INTPND          (0x10)
20 #define INTOFFSET       (0x14)
22 #include <asm/hardware.h>
23 #include <asm/irq.h>
25         .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
27                 mov     \base, #S3C24XX_VA_IRQ
29                 @@ try the interrupt offset register, since it is there
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
39                 @@ the number specified is not a valid irq, so try
40                 @@ and work it out for ourselves
42                 mov     \irqnr, #0              @@ start here
44                 @@ work out which irq (if any) we got
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
61                 @@ we have the value
62 1001:
63                 adds    \irqnr, \irqnr, #IRQ_EINT0
64 1002:
65                 @@ exit here, Z flag unset if IRQ
67         .endm
69                 /* currently don't need an disable_fiq macro */
71                 .macro  disable_fiq
72                 .endm