/*
 * include/asm-arm/arch-feroceon-kw/entry-macro.S
 *
 * Low-level IRQ helper macros for Integrator 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.
 */
#include <mach/hardware.h>
#include <mach/irqs.h>


        .macro  disable_fiq
        .endm
        
        .macro  get_irqnr_preamble, base, tmp
        .endm

         .macro  arch_ret_to_user, tmp1, tmp2
         .endm

#if defined(CONFIG_CPU_BIG_ENDIAN)
        	.macro	HTOLL sr, tt		@ sr   = A  ,B  ,C  ,D    
        	eor \tt, \sr, \sr, ror #16 ;    @ temp = A^C,B^	  
        	bic \tt, \tt, #0xff0000 ;       @ temp = A^C,0  ,C^A,D^B
        	mov \sr, \sr, ror #8 ;          @ sr   = D  ,A  ,B  ,C
        	eor \sr, \sr, \tt, lsr #8       @ sr   = D  ,C  ,B  ,A
        	.endm
#else		
        	.macro	HTOLL sr, tt	
        	.endm
#endif

                /*
                 * This macro should return the follows:
                 *      irqnr - the number of the received irq
                 *      eq flag - not set if succeed and set if fail.
                 */

                .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
                ldr     \base, =MV_ASM_IRQ_MASK_LOW_REG
                ldr     \tmp, [\base]    			        @ get low mask
                ldr	\base, =MV_ASM_IRQ_CAUSE_LOW_REG
                ldr     \irqstat, [\base]                		@ get low cause
                ands    \irqstat, \irqstat, \tmp                        @ and mask and cause
		beq     1001f
		HTOLL	\irqstat, \tmp
		clz     \irqnr, \irqstat
		mov     \base, #31
		subs    \irqnr, \base, \irqnr
                beq     1001f                                           @ bit0 is set - jump to 1001
		teq     \irqnr, #32                                     @ if irq isn't 32 unset the flag
		b 	1006f
1001:
		ldr     \base, =MV_ASM_IRQ_MASK_HIGH_REG
                ldr     \tmp, [\base]    			        @ get mask
                ldr	\base, =MV_ASM_IRQ_CAUSE_HIGH_REG
                ldr     \irqstat, [\base]                		@ get cause
                ands    \irqstat, \irqstat, \tmp                        @ and mask and cause
		beq	1002f						@ no bit is set - jump to 1002
		HTOLL	\irqstat, \tmp
		clz     \irqnr, \irqstat
		mov     \base, #31
		subs    \irqnr, \base, \irqnr
		cmp	\irqnr, #4					@ GPP LOW 0-7
		beq	1003f
		cmp	\irqnr, #5					@ GPP LOW 8-15
		beq	1003f
		cmp	\irqnr, #6					@ GPP LOW 16-23
		beq	1003f
		cmp	\irqnr, #7					@ GPP LOW 24-31
		beq	1003f
		cmp	\irqnr, #8					@ GPP MID 0-7
		beq	1004f
		cmp	\irqnr, #9					@ GPP MID 8-15
		beq	1004f
		cmp	\irqnr, #10					@ GPP MID 16-23
		beq	1004f
		cmp	\irqnr, #11					@ GPP MID 24-31
		beq	1004f
		cmp	\irqnr, #12					@ GPP HIGH 0-7
		beq	1005f
		cmp	\irqnr, #13					@ GPP HIGH 8-15
		beq	1005f
		cmp	\irqnr, #14					@ GPP HIGH 16-23
		beq	1005f
		cmp	\irqnr, #15					@ GPP HIGH 24
		beq	1005f
		add	\irqnr,\irqnr,#32				@ add 32 so (32 <= irqnr < 64)
		teq     \irqnr, #64                                     @ if irq isn't 64 unset the flag
		b	1006f						@ update irqnr and return
1002:
		ldr     \base, =MV_ASM_IRQ_MASK_ERROR_REG
                ldr     \tmp, [\base]    				@ get error mask
                ldr	\base, =MV_ASM_IRQ_CAUSE_ERROR_REG
                ldr     \irqstat, [\base]                		@ get error cause
                ands    \irqstat, \irqstat, \tmp                        @ and mask and cause
		beq	1006f						@ if eq to 0 jump to 1006
		HTOLL	\irqstat, \tmp
		clz     \irqnr, \irqstat
		mov     \base, #31
		subs    \irqnr, \base, \irqnr
		add	\irqnr,\irqnr, #64
		teq     \irqnr, #96                                     @ if irq isn't 96 unset the flag
		b	1006f						@ update irqnr and return
1003:
		ldr     \base, =MV_ASM_GPP_IRQ_MASK_REG
                ldr     \tmp, [\base]    				@ get gpp mask
                ldr	\base, =MV_ASM_GPP_IRQ_CAUSE_REG
                ldr     \irqstat, [\base]                		@ get gpp data in (cause)
                ands    \irqstat, \irqstat, \tmp                        @ and mask and cause
		beq	1006f						@ if eq to 0 jump to 1006
		HTOLL	\irqstat, \tmp
		clz     \irqnr, \irqstat
		mov     \base, #31
		subs    \irqnr, \base, \irqnr
		add	\irqnr,\irqnr, #96
		teq     \irqnr, #128                                    @ if irq isn't 128 unset the flag
		b	1006f						@ update irqnr and return 
1004:
		ldr     \base, =MV_ASM_GPP_IRQ_MID_MASK_REG
                ldr     \tmp, [\base]    				@ get gpp mask
                ldr	\base, =MV_ASM_GPP_IRQ_MID_CAUSE_REG
                ldr     \irqstat, [\base]                		@ get gpp data in (cause)
                ands    \irqstat, \irqstat, \tmp                        @ and mask and cause
		beq	1006f						@ if eq to 0 jump to 1006
		HTOLL	\irqstat, \tmp
		clz     \irqnr, \irqstat
		mov     \base, #31
		subs    \irqnr, \base, \irqnr
		add	\irqnr,\irqnr, #128
		teq     \irqnr, #160					@ if irq isn't 160 unset the flag
		b	1006f						@ update irqnr and return	
1005:
		ldr     \base, =MV_ASM_GPP_IRQ_HIGH_MASK_REG
                ldr     \tmp, [\base]    				@ get gpp mask
                ldr	\base, =MV_ASM_GPP_IRQ_HIGH_CAUSE_REG
                ldr     \irqstat, [\base]                		@ get gpp data in (cause)
                ands    \irqstat, \irqstat, \tmp                        @ and mask and cause
		beq	1006f						@ if eq to 0 jump to 1006
		HTOLL	\irqstat, \tmp
		clz     \irqnr, \irqstat
		mov     \base, #31
		subs    \irqnr, \base, \irqnr
		add	\irqnr,\irqnr, #160
		teq     \irqnr, #192					@ if irq isn't 192 unset the flag
		b	1006f						@ update irqnr and return	
1006:
                .endm
