summaryrefslogtreecommitdiffstats
path: root/firmware/target/mips/ingenic_jz47xx/system-jz4760.c
diff options
context:
space:
mode:
authorSolomon Peachy <pizza@shaftnet.org>2020-08-29 23:38:56 -0400
committerSolomon Peachy <pizza@shaftnet.org>2020-08-30 01:45:15 -0400
commitcc5b0439a8f05afbb48a868e97ca9f196f5a8404 (patch)
tree1d7d192d2a926f7c748a4bcd1b917c1b09f70d5e /firmware/target/mips/ingenic_jz47xx/system-jz4760.c
parentb01e9295e4b5ae2680dc4a8acaf9349250cd6b8d (diff)
downloadrockbox-cc5b0439a8f05afbb48a868e97ca9f196f5a8404.tar.gz
rockbox-cc5b0439a8f05afbb48a868e97ca9f196f5a8404.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
Diffstat (limited to 'firmware/target/mips/ingenic_jz47xx/system-jz4760.c')
-rw-r--r--firmware/target/mips/ingenic_jz47xx/system-jz4760.c44
1 files changed, 13 insertions, 31 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);