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:
Solomon Peachy 2025-09-07 09:59:45 -04:00
parent fb8b52eaf1
commit da02b5921f

View file

@ -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 (