summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcin Bukat <marcin.bukat@gmail.com>2013-01-11 13:31:57 +0100
committerMarcin Bukat <marcin.bukat@gmail.com>2013-01-11 15:41:11 +0100
commit2ef7a549d57c984fee2cd26fbaa70bbfa054dfb4 (patch)
tree9936fc8a99d40c534b6d25bee4d1be924e3051db
parentefe104275960deccee71ff44c1bba38c997553f3 (diff)
downloadrockbox-2ef7a549d57c984fee2cd26fbaa70bbfa054dfb4.tar.gz
rockbox-2ef7a549d57c984fee2cd26fbaa70bbfa054dfb4.zip
rk27xx: optimize irq_handler()
Change-Id: Idd3141e57b70e9b28b91748bc71208d9afffcd57 Reviewed-on: http://gerrit.rockbox.org/381 Reviewed-by: Marcin Bukat <marcin.bukat@gmail.com> Tested-by: Marcin Bukat <marcin.bukat@gmail.com>
-rw-r--r--firmware/target/arm/rk27xx/system-rk27xx.c31
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);
65default_interrupt(INT_SW_INT2); 65default_interrupt(INT_SW_INT2);
66default_interrupt(INT_SW_INT3); 66default_interrupt(INT_SW_INT3);
67 67
68static void (* const irqvector[])(void) = 68static 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
90void irq_handler(void) 90void 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
111void fiq_dummy(void) 106void fiq_dummy(void)