entry-macro.S 2.1 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8
/*
 * include/asm-arm/arch-s3c2410/entry-macro.S
 *
 * 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 21 22
*/

/* 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)
#define EXTINTPEND	(0xa8)
#define EXTINTMASK	(0xa4)
L
Linus Torvalds 已提交
23

R
Russell King 已提交
24 25
#include <asm/hardware.h>
#include <asm/arch/irqs.h>
L
Linus Torvalds 已提交
26 27 28

	.macro	get_irqnr_and_base, irqnr, irqstat, base, tmp

29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
		mov	\base, #S3C24XX_VA_IRQ

		ldr	\irqstat, [ \base, #INTPND]
		bics	\irqnr, \irqstat, #3<<4		@@ only an GPIO IRQ
		beq	2000f

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

		ldr	\irqnr, [ \base, #INTOFFSET ]
		mov	\tmp, #1
		tst	\irqstat, \tmp, lsl \irqnr
		addne	\irqnr, \irqnr, #IRQ_EINT0
		bne	1001f

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

		mov	\irqnr, #IRQ_EINT0		@@ start here
		b	3000f

2000:
		@@ load the GPIO interrupt register, and check it

		add	\tmp, \base, #S3C24XX_VA_GPIO - S3C24XX_VA_IRQ
		ldr	\irqstat, [ \tmp, # EXTINTPEND ]
		ldr	\irqnr,   [ \tmp, # EXTINTMASK ]
		bics	\irqstat, \irqstat, \irqnr
		beq	1001f

		mov	\irqnr, #(IRQ_EINT4 - 4)

		@@ work out which irq (if any) we got
3000:
		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
		movs	\irqnr, \irqnr

L
Linus Torvalds 已提交
80
1001:
81
		@@ exit here, Z flag unset if IRQ
L
Linus Torvalds 已提交
82

83
	.endm
L
Linus Torvalds 已提交
84 85 86 87 88

		/* currently don't need an disable_fiq macro */

		.macro	disable_fiq
		.endm