mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-13 10:07:38 -04:00
s5l8702: Clean up the IRQ handler code slightly
* move all state into IRAM * eliminate dummy variables * get rid of 'naked' attribute and (slightly wasteful) hand-written asm in favor of auto-created 'interrupt' code Change-Id: Ie6a2e12a4c1a0faa6ae89504cf931657044bd457
This commit is contained in:
parent
fb8b52eaf1
commit
da02b5921f
1 changed files with 14 additions and 12 deletions
|
@ -33,10 +33,6 @@
|
|||
#define default_interrupt(name) \
|
||||
extern __attribute__((weak,alias("UIRQ"))) void name (void)
|
||||
|
||||
void irq_handler(void) __attribute__((interrupt ("IRQ"), naked));
|
||||
void fiq_handler(void) __attribute__((interrupt ("FIQ"), naked, \
|
||||
weak, alias("fiq_dummy")));
|
||||
|
||||
default_interrupt(INT_EXT0); /* GPIOIC group 6 (GPIO 0..31) */
|
||||
default_interrupt(INT_EXT1); /* GPIOIC group 5 (GPIO 32..63) */
|
||||
default_interrupt(INT_EXT2); /* GPIOIC group 4 (GPIO 64..95) */
|
||||
|
@ -108,7 +104,7 @@ default_interrupt(INT_IRQ61);
|
|||
default_interrupt(INT_IRQ62);
|
||||
default_interrupt(INT_IRQ63);
|
||||
|
||||
static int current_irq;
|
||||
static int current_irq IBSS_ATTR;
|
||||
|
||||
static const struct clocking_mode clk_modes[] =
|
||||
{
|
||||
|
@ -162,19 +158,22 @@ static void UIRQ(void)
|
|||
panicf("Unhandled IRQ %d!", current_irq);
|
||||
}
|
||||
|
||||
#ifdef NAKED
|
||||
void irq_handler(void) __attribute__((interrupt ("IRQ"), naked));
|
||||
#else
|
||||
void irq_handler(void) __attribute__((interrupt ("IRQ")));
|
||||
#endif
|
||||
void irq_handler(void)
|
||||
{
|
||||
/*
|
||||
* Based on: linux/arch/arm/kernel/entry-armv.S and system-meg-fx.c
|
||||
*/
|
||||
|
||||
#ifdef NAKED
|
||||
asm volatile( "stmfd sp!, {r0-r7, ip, lr} \n" /* Store context */
|
||||
"sub sp, sp, #8 \n"); /* Reserve stack */
|
||||
|
||||
const void* dummy0 = VIC0ADDRESS;
|
||||
(void)dummy0;
|
||||
const void* dummy1 = VIC1ADDRESS;
|
||||
(void)dummy1;
|
||||
#endif
|
||||
(void)VIC0ADDRESS;
|
||||
(void)VIC1ADDRESS;
|
||||
uint32_t irqs0 = VIC0IRQSTATUS;
|
||||
uint32_t irqs1 = VIC1IRQSTATUS;
|
||||
for (current_irq = 0; irqs0; current_irq++, irqs0 >>= 1)
|
||||
|
@ -185,12 +184,15 @@ void irq_handler(void)
|
|||
irqvector[current_irq]();
|
||||
VIC0ADDRESS = NULL;
|
||||
VIC1ADDRESS = NULL;
|
||||
|
||||
#ifdef NAKED
|
||||
asm volatile( "add sp, sp, #8 \n" /* Cleanup stack */
|
||||
"ldmfd sp!, {r0-r7, ip, lr} \n" /* Restore context */
|
||||
"subs pc, lr, #4 \n"); /* Return from IRQ */
|
||||
#endif
|
||||
}
|
||||
|
||||
void fiq_handler(void) __attribute__((interrupt ("FIQ"), naked, \
|
||||
weak, alias("fiq_dummy")));
|
||||
void fiq_dummy(void)
|
||||
{
|
||||
asm volatile (
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue