diff options
author | Solomon Peachy <pizza@shaftnet.org> | 2020-08-29 23:38:56 -0400 |
---|---|---|
committer | Solomon Peachy <pizza@shaftnet.org> | 2020-08-30 01:45:15 -0400 |
commit | cc5b0439a8f05afbb48a868e97ca9f196f5a8404 (patch) | |
tree | 1d7d192d2a926f7c748a4bcd1b917c1b09f70d5e | |
parent | b01e9295e4b5ae2680dc4a8acaf9349250cd6b8d (diff) | |
download | rockbox-cc5b043.tar.gz rockbox-cc5b043.zip |
jz4760: Prioritize Audio DMA and TCU0 (systick) above all others
(And loop in the IRQ handler to make sure we catch everything!)
Change-Id: I813272c69e981fdc214ec28448ced403ad366ea0
-rw-r--r-- | firmware/target/mips/ingenic_jz47xx/system-jz4760.c | 44 | ||||
-rw-r--r-- | firmware/target/mips/ingenic_jz47xx/system-target.h | 16 |
2 files changed, 21 insertions, 39 deletions
diff --git a/firmware/target/mips/ingenic_jz47xx/system-jz4760.c b/firmware/target/mips/ingenic_jz47xx/system-jz4760.c index 01d6d8d93e..4489212ccc 100644 --- a/firmware/target/mips/ingenic_jz47xx/system-jz4760.c +++ b/firmware/target/mips/ingenic_jz47xx/system-jz4760.c @@ -244,41 +244,20 @@ static int get_irq_number(void) if (UNLIKELY(irq0 < 0) && UNLIKELY(irq1 < 0)) return -1; -#if 1 - // Prioritze AIC and SADC, then everything on ipl1 (ie MSC mostly) - if (ipl1 & 1<<(IRQ_AIC-32)) { - irq = IRQ_AIC; - ipl1 &= ~(1<<(IRQ_AIC-32)); - } else if (ipl0 & 1<<IRQ_SADC) { - irq = IRQ_SADC; - ipl0 &= ~(1<<IRQ_SADC); + // Prioritze DMA0 (audio) and TCU0 (systick), then everything on ipl1 (ie MSC mostly) + if (ipl0 & 1<<IRQ_DMAC0) { + irq = IRQ_DMAC0; + ipl0 &= ~(1<<IRQ_DMAC0); + } else if (ipl0 & 1<<IRQ_TCU0) { + irq = IRQ_TCU0; + ipl0 &= ~(1<<IRQ_TCU0); } else if (ipl1) { irq = irq1 + 32; - ipl1 &= ~(1<<irq1); + ipl1 &= ~(1<<irq1); } else { irq = irq0; - ipl0 &= ~(1<<irq0); + ipl0 &= ~(1<<irq0); } -#else - // Prioritize I2C0, I2C1, IPL0, and finally IPL1 - if (!(ipl0 & 3)) { - if (ipl0) { - irq = irq0; - ipl0 &= ~(1<<irq0); - } else { - irq = irq1 + 32; - ipl1 &= ~(1<<irq1); - } - } else { - if (ipl0 & 2) { - irq = 1; - ipl0 &= ~(1<<irq); - } else { - irq = 0; - ipl0 &= ~(1<<irq); - } - } -#endif switch (irq) { @@ -307,13 +286,16 @@ static int get_irq_number(void) void intr_handler(void) { - register int irq = get_irq_number(); + register int irq; +top: + irq = get_irq_number(); if(UNLIKELY(irq < 0)) return; ack_irq(irq); if(LIKELY(irq >= 0)) irqvector[irq](); + goto top; } #define EXC(x,y) case (x): return (y); diff --git a/firmware/target/mips/ingenic_jz47xx/system-target.h b/firmware/target/mips/ingenic_jz47xx/system-target.h index b6e779ea53..dd42fac633 100644 --- a/firmware/target/mips/ingenic_jz47xx/system-target.h +++ b/firmware/target/mips/ingenic_jz47xx/system-target.h @@ -95,15 +95,15 @@ void dma_disable(void); #define DMA_LCD_CHANNEL 3 #elif CONFIG_CPU == JZ4760B #define DMA_AIC_TX_CHANNEL 0 -#define DMA_NAND_CHANNEL 1 -#define DMA_USB_CHANNEL 2 -#define DMA_SD_RX_CHANNEL0 3 -#define DMA_SD_RX_CHANNEL1 4 +#define DMA_USB_CHANNEL 1 // Note: channel 5 and 11 cannot be used! -#define DMA_SD_TX_CHANNEL0 6 -#define DMA_SD_TX_CHANNEL1 7 -#define DMA_SD_RX_CHANNEL(n) 3+n -#define DMA_SD_TX_CHANNEL(n) 6+n +#define DMA_SD_RX_CHANNEL0 6 +#define DMA_SD_RX_CHANNEL1 7 +#define DMA_SD_TX_CHANNEL0 8 +#define DMA_SD_TX_CHANNEL1 9 +#define DMA_NAND_CHANNEL 10 +#define DMA_SD_RX_CHANNEL(n) 6+n +#define DMA_SD_TX_CHANNEL(n) 8+n #endif #define XDMA_CALLBACK(n) DMA ## n |