aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-ak88/include/mach/entry-macro.S
blob: 43c5c824236bbe54fcb9c6cd389771433f691448 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/*
 * 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.
*/

/* 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
*/

#include <mach/hardware.h>
#include <asm/irq.h>

#define	AK88_IRQ_INTMASK		(AK88_VA_SYSCTRL + 0x34)
#define	AK88_FIQ_INTMASK		(AK88_VA_SYSCTRL + 0x38)
#define	AK88_INT_STATUS		(AK88_VA_SYSCTRL + 0xCC)

	.macro  get_irqnr_preamble, base, tmp
	.endm

	.macro  arch_ret_to_user, tmp1, tmp2
	.endm

	.macro	get_irqnr_and_base, irqnr, irqstat, base, tmp

		ldr	\base, =AK88_INT_STATUS
		ldr	\irqstat, [\base]		@ get interrupts status
		teq	\irqstat, #0x0
		beq	1002f
		
		ldr	\base, =AK88_IRQ_INTMASK	@ get interrupts mask
		ldr	\base, [\base]
		and	\irqstat, \irqstat, \base

		tst	\irqstat, #(1<<IRQ_DISPLAY_CTRL)
		bicne	\irqstat, \irqstat, #(1<<IRQ_DISPLAY_CTRL)
		movne	\irqnr, #IRQ_DISPLAY_CTRL
		bne	1001f

		tst	\irqstat, #(1<<IRQ_CAMERA_IF)
		bicne	\irqstat, \irqstat, #(1<<IRQ_CAMERA_IF)
		movne	\irqnr, #IRQ_CAMERA_IF
		bne	1001f

		tst	\irqstat, #(1<<IRQ_MOTIONESTIMATION)
		bicne	\irqstat, \irqstat, #(1<<IRQ_MOTIONESTIMATION)
		movne	\irqnr, #IRQ_MOTIONESTIMATION
		bne	1001f

		tst	\irqstat, #(1<<IRQ_IMG_MPEG4)
		bicne	\irqstat, \irqstat, #(1<<IRQ_IMG_MPEG4)
		movne	\irqnr, #IRQ_IMG_MPEG4
		bne	1001f

		tst	\irqstat, #(1<<IRQ_AUDIO)
		bicne	\irqstat, \irqstat, #(1<<IRQ_AUDIO)
		movne	\irqnr, #IRQ_AUDIO
		bne	1001f

		tst	\irqstat, #(1<<IRQ_H264_DECODER)
		bicne	\irqstat, \irqstat, #(1<<IRQ_H264_DECODER)
		movne	\irqnr, #IRQ_H264_DECODER
		bne	1001f

		tst	\irqstat, #(1<<IRQ_DAC)
		bicne	\irqstat, \irqstat, #(1<<IRQ_DAC)
		movne	\irqnr, #IRQ_DAC
		bne	1001f

		tst	\irqstat, #(1<<IRQ_L2MEM)
		bicne	\irqstat, \irqstat, #(1<<IRQ_L2MEM)
		movne	\irqnr, #IRQ_L2MEM
		bne	1001f

		tst	\irqstat, #(1<<IRQ_NF_ECC)
		bicne	\irqstat, \irqstat, #(1<<IRQ_NF_ECC)
		movne	\irqnr, #IRQ_NF_ECC
		bne	1001f

		tst	\irqstat, #(1<<IRQ_NF_CTRL)
		bicne	\irqstat, \irqstat, #(1<<IRQ_NF_CTRL)
		movne	\irqnr, #IRQ_NF_CTRL
		bne	1001f

		tst	\irqstat, #(1<<IRQ_UART3)
		bicne	\irqstat, \irqstat, #(1<<IRQ_UART3)
		movne	\irqnr, #IRQ_UART3
		bne	1001f

		tst	\irqstat, #(1<<IRQ_UART2)
		bicne	\irqstat, \irqstat, #(1<<IRQ_UART2)
		movne	\irqnr, #IRQ_UART2
		bne	1001f

		tst	\irqstat, #(1<<IRQ_UART1)
		bicne	\irqstat, \irqstat, #(1<<IRQ_UART1)
		movne	\irqnr, #IRQ_UART1
		bne	1001f

		tst	\irqstat, #(1<<IRQ_UART0)
		bicne	\irqstat, \irqstat, #(1<<IRQ_UART0)
		movne	\irqnr, #IRQ_UART0
		bne	1001f

		tst	\irqstat, #(1<<IRQ_SPI2)
		bicne	\irqstat, \irqstat, #(1<<IRQ_SPI2)
		movne	\irqnr, #IRQ_SPI2
		bne	1001f

		tst	\irqstat, #(1<<IRQ_SPI1)
		bicne	\irqstat, \irqstat, #(1<<IRQ_SPI1)
		movne	\irqnr, #IRQ_SPI1
		bne	1001f

		tst	\irqstat, #(1<<IRQ_2D_ACC)
		bicne	\irqstat, \irqstat, #(1<<IRQ_2D_ACC)
		movne	\irqnr, #IRQ_2D_ACC
		bne	1001f

		tst	\irqstat, #(1<<IRQ_SDIO)
		bicne	\irqstat, \irqstat, #(1<<IRQ_SDIO)
		movne	\irqnr, #IRQ_SDIO
		bne	1001f
	
		tst	\irqstat, #(1<<IRQ_MMC_SD)
		bicne	\irqstat, \irqstat, #(1<<IRQ_MMC_SD)
		movne	\irqnr, #IRQ_MMC_SD
		bne	1001f
		
		tst	\irqstat, #(1<<IRQ_USBHOST_MCU)
		bicne	\irqstat, \irqstat, #(1<<IRQ_USBHOST_MCU)
		movne	\irqnr, #IRQ_USBHOST_MCU
		bne	1001f
	
		tst	\irqstat, #(1<<IRQ_USBHOST_DMA)
		bicne	\irqstat, \irqstat, #(1<<IRQ_USBHOST_DMA)
		movne	\irqnr, #IRQ_USBHOST_DMA
		bne	1001f
	
		tst	\irqstat, #(1<<IRQ_USBOTG_MCU)
		bicne	\irqstat, \irqstat, #(1<<IRQ_USBOTG_MCU)
		movne	\irqnr, #IRQ_USBOTG_MCU
		bne	1001f
	
		tst	\irqstat, #(1<<IRQ_USBOTG_DMA)
		bicne	\irqstat, \irqstat, #(1<<IRQ_USBOTG_DMA)
		movne	\irqnr, #IRQ_USBOTG_DMA
		bne	1001f
	
		tst	\irqstat, #(1<<IRQ_SYSCTRL)
		bicne	\irqstat, \irqstat, #(1<<IRQ_SYSCTRL)
		movne	\irqnr, #IRQ_SYSCTRL
		bne	1001f

	1001:
		@ got irqnr
	1002:
		@ exit here
	.endm
	
	/* currently don't need an disable_fiq macro */
	.macro	disable_fiq
	.endm