entry-macro.S 1.7 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2
 * arch/arm/mach-s3c2410/include/mach/entry-macro.S
L
Linus Torvalds 已提交
3 4 5 6 7 8
 *
 * Low-level IRQ helper macros for S3C2410-based platforms
 *
 * This file is licensed under  the terms of the GNU General Public
 * License version 2. This program is licensed "as is" without any
 * warranty of any kind, whether express or implied.
9 10 11 12 13 14 15 16 17 18 19 20
*/

/* We have a problem that the INTOFFSET register does not always
 * show one interrupt. Occasionally we get two interrupts through
 * the prioritiser, and this causes the INTOFFSET register to show
 * what looks like the logical-or of the two interrupt numbers.
 *
 * Thanks to Klaus, Shannon, et al for helping to debug this problem
*/

#define INTPND		(0x10)
#define INTOFFSET	(0x14)
L
Linus Torvalds 已提交
21

22
#include <mach/hardware.h>
23
#include <asm/irq.h>
L
Linus Torvalds 已提交
24

25 26 27
	.macro  get_irqnr_preamble, base, tmp
	.endm

L
Linus Torvalds 已提交
28 29
	.macro	get_irqnr_and_base, irqnr, irqstat, base, tmp

30 31 32 33
		mov	\base, #S3C24XX_VA_IRQ

		@@ try the interrupt offset register, since it is there

34
		ldr	\irqstat, [\base, #INTPND ]
35 36
		teq	\irqstat, #0
		beq	1002f
37
		ldr	\irqnr, [\base, #INTOFFSET ]
38 39 40 41 42 43 44
		mov	\tmp, #1
		tst	\irqstat, \tmp, lsl \irqnr
		bne	1001f

		@@ the number specified is not a valid irq, so try
		@@ and work it out for ourselves

45
		mov	\irqnr, #0		@@ start here
46 47

		@@ work out which irq (if any) we got
48

49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
		movs	\tmp, \irqstat, lsl#16
		addeq	\irqnr, \irqnr, #16
		moveq	\irqstat, \irqstat, lsr#16
		tst	\irqstat, #0xff
		addeq	\irqnr, \irqnr, #8
		moveq	\irqstat, \irqstat, lsr#8
		tst	\irqstat, #0xf
		addeq	\irqnr, \irqnr, #4
		moveq	\irqstat, \irqstat, lsr#4
		tst	\irqstat, #0x3
		addeq	\irqnr, \irqnr, #2
		moveq	\irqstat, \irqstat, lsr#2
		tst	\irqstat, #0x1
		addeq	\irqnr, \irqnr, #1

		@@ we have the value
L
Linus Torvalds 已提交
65
1001:
66 67
		adds	\irqnr, \irqnr, #IRQ_EINT0
1002:
68
		@@ exit here, Z flag unset if IRQ
L
Linus Torvalds 已提交
69

70
	.endm