diff options
Diffstat (limited to 'firmware/target/arm')
-rw-r--r-- | firmware/target/arm/rk27xx/system-rk27xx.c | 31 |
1 files changed, 13 insertions, 18 deletions
diff --git a/firmware/target/arm/rk27xx/system-rk27xx.c b/firmware/target/arm/rk27xx/system-rk27xx.c index 327ef73422..20d0226892 100644 --- a/firmware/target/arm/rk27xx/system-rk27xx.c +++ b/firmware/target/arm/rk27xx/system-rk27xx.c | |||
@@ -65,7 +65,7 @@ default_interrupt(INT_SW_INT1); | |||
65 | default_interrupt(INT_SW_INT2); | 65 | default_interrupt(INT_SW_INT2); |
66 | default_interrupt(INT_SW_INT3); | 66 | default_interrupt(INT_SW_INT3); |
67 | 67 | ||
68 | static void (* const irqvector[])(void) = | 68 | static void (* const irqvector[])(void) USED_ATTR = |
69 | { | 69 | { |
70 | INT_UART0,INT_UART1,INT_TIMER0,INT_TIMER1,INT_TIMER2,INT_GPIO0,INT_SW_INT0,INT_AHB0_MAILBOX, | 70 | INT_UART0,INT_UART1,INT_TIMER0,INT_TIMER1,INT_TIMER2,INT_GPIO0,INT_SW_INT0,INT_AHB0_MAILBOX, |
71 | INT_RTC,INT_SCU,INT_SD,INT_SPI,INT_HDMA,INT_A2A_BRIDGE,INT_I2C,INT_I2S, | 71 | INT_RTC,INT_SCU,INT_SD,INT_SPI,INT_HDMA,INT_A2A_BRIDGE,INT_I2C,INT_I2S, |
@@ -89,23 +89,18 @@ static void UIRQ(void) | |||
89 | 89 | ||
90 | void irq_handler(void) | 90 | void irq_handler(void) |
91 | { | 91 | { |
92 | /* | 92 | asm volatile("stmfd sp!, {r0-r5, ip, lr} \n" /* store context */ |
93 | * Based on: linux/arch/arm/kernel/entry-armv.S and system-meg-fx.c | 93 | "ldr r4, =0x18080000 \n" /* INTC base */ |
94 | */ | 94 | "ldr r5, [r4, #0x104] \n" /* INTC_ISR */ |
95 | 95 | "and r5, r5, #0x1f \n" /* irq_no = INTC_ISR & 0x1f */ | |
96 | asm volatile( "stmfd sp!, {r0-r7, ip, lr} \n" /* Store context */ | 96 | "ldr r3, =irqvector \n" |
97 | "sub sp, sp, #8 \n"); /* Reserve stack */ | 97 | "ldr r3,[r3, r5, lsl #2] \n" |
98 | 98 | "blx r3 \n" /* irqvector[irq_no]() */ | |
99 | int irq_no = INTC_ISR & 0x1f; | 99 | "mov r3, #1 \n" |
100 | 100 | "lsl r5, r3, r5 \n" /* clear interrupt */ | |
101 | irqvector[irq_no](); | 101 | "str r5, [r4, #0x118] \n" /* INTC_ICCR = (1<<irq_no) */ |
102 | 102 | "ldmfd sp!, {r0-r5, ip, lr} \n" /* restore context */ | |
103 | /* clear interrupt */ | 103 | "subs pc, lr, #4 \n"); |
104 | INTC_ICCR = (1 << irq_no); | ||
105 | |||
106 | asm volatile( "add sp, sp, #8 \n" /* Cleanup stack */ | ||
107 | "ldmfd sp!, {r0-r7, ip, lr} \n" /* Restore context */ | ||
108 | "subs pc, lr, #4 \n"); /* Return from IRQ */ | ||
109 | } | 104 | } |
110 | 105 | ||
111 | void fiq_dummy(void) | 106 | void fiq_dummy(void) |