2
* arch/arm/mach-s3c2410/include/mach/entry-macro.S
4
* Low-level IRQ helper macros for S3C2410-based platforms
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.
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.
16
* Thanks to Klaus, Shannon, et al for helping to debug this problem
20
#define INTOFFSET (0x14)
22
#include <mach/hardware.h>
25
.macro get_irqnr_preamble, base, tmp
28
.macro arch_ret_to_user, tmp1, tmp2
31
.macro get_irqnr_and_base, irqnr, irqstat, base, tmp
33
mov \base, #S3C24XX_VA_IRQ
35
@@ try the interrupt offset register, since it is there
37
ldr \irqstat, [ \base, #INTPND ]
40
ldr \irqnr, [ \base, #INTOFFSET ]
42
tst \irqstat, \tmp, lsl \irqnr
45
@@ the number specified is not a valid irq, so try
46
@@ and work it out for ourselves
48
mov \irqnr, #0 @@ start here
50
@@ work out which irq (if any) we got
52
movs \tmp, \irqstat, lsl#16
53
addeq \irqnr, \irqnr, #16
54
moveq \irqstat, \irqstat, lsr#16
56
addeq \irqnr, \irqnr, #8
57
moveq \irqstat, \irqstat, lsr#8
59
addeq \irqnr, \irqnr, #4
60
moveq \irqstat, \irqstat, lsr#4
62
addeq \irqnr, \irqnr, #2
63
moveq \irqstat, \irqstat, lsr#2
65
addeq \irqnr, \irqnr, #1
69
adds \irqnr, \irqnr, #IRQ_EINT0
71
@@ exit here, Z flag unset if IRQ
75
/* currently don't need an disable_fiq macro */