mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-13 18:17:39 -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) \
|
#define default_interrupt(name) \
|
||||||
extern __attribute__((weak,alias("UIRQ"))) void name (void)
|
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_EXT0); /* GPIOIC group 6 (GPIO 0..31) */
|
||||||
default_interrupt(INT_EXT1); /* GPIOIC group 5 (GPIO 32..63) */
|
default_interrupt(INT_EXT1); /* GPIOIC group 5 (GPIO 32..63) */
|
||||||
default_interrupt(INT_EXT2); /* GPIOIC group 4 (GPIO 64..95) */
|
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_IRQ62);
|
||||||
default_interrupt(INT_IRQ63);
|
default_interrupt(INT_IRQ63);
|
||||||
|
|
||||||
static int current_irq;
|
static int current_irq IBSS_ATTR;
|
||||||
|
|
||||||
static const struct clocking_mode clk_modes[] =
|
static const struct clocking_mode clk_modes[] =
|
||||||
{
|
{
|
||||||
|
@ -162,19 +158,22 @@ static void UIRQ(void)
|
||||||
panicf("Unhandled IRQ %d!", current_irq);
|
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)
|
void irq_handler(void)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Based on: linux/arch/arm/kernel/entry-armv.S and system-meg-fx.c
|
* 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 */
|
asm volatile( "stmfd sp!, {r0-r7, ip, lr} \n" /* Store context */
|
||||||
"sub sp, sp, #8 \n"); /* Reserve stack */
|
"sub sp, sp, #8 \n"); /* Reserve stack */
|
||||||
|
#endif
|
||||||
const void* dummy0 = VIC0ADDRESS;
|
(void)VIC0ADDRESS;
|
||||||
(void)dummy0;
|
(void)VIC1ADDRESS;
|
||||||
const void* dummy1 = VIC1ADDRESS;
|
|
||||||
(void)dummy1;
|
|
||||||
uint32_t irqs0 = VIC0IRQSTATUS;
|
uint32_t irqs0 = VIC0IRQSTATUS;
|
||||||
uint32_t irqs1 = VIC1IRQSTATUS;
|
uint32_t irqs1 = VIC1IRQSTATUS;
|
||||||
for (current_irq = 0; irqs0; current_irq++, irqs0 >>= 1)
|
for (current_irq = 0; irqs0; current_irq++, irqs0 >>= 1)
|
||||||
|
@ -185,12 +184,15 @@ void irq_handler(void)
|
||||||
irqvector[current_irq]();
|
irqvector[current_irq]();
|
||||||
VIC0ADDRESS = NULL;
|
VIC0ADDRESS = NULL;
|
||||||
VIC1ADDRESS = NULL;
|
VIC1ADDRESS = NULL;
|
||||||
|
#ifdef NAKED
|
||||||
asm volatile( "add sp, sp, #8 \n" /* Cleanup stack */
|
asm volatile( "add sp, sp, #8 \n" /* Cleanup stack */
|
||||||
"ldmfd sp!, {r0-r7, ip, lr} \n" /* Restore context */
|
"ldmfd sp!, {r0-r7, ip, lr} \n" /* Restore context */
|
||||||
"subs pc, lr, #4 \n"); /* Return from IRQ */
|
"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)
|
void fiq_dummy(void)
|
||||||
{
|
{
|
||||||
asm volatile (
|
asm volatile (
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue