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) \ #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 (