Blackfin: SIC: cut down on IAR MMR reads a bit

Tweak the for loops that operate on the SIC IAR system MMRs to avoid
re-reading them multiple times in a row. System MMRs are a little
slower to access, so avoid the penalty when possible.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>

+18 -15
+18 -15
arch/blackfin/mach-common/ints-priority.c
··· 92 { 93 unsigned ivg, irq_pos = 0; 94 for (ivg = 0; ivg <= IVG13 - IVG7; ivg++) { 95 - int irqn; 96 97 ivg7_13[ivg].istop = ivg7_13[ivg].ifirst = &ivg_table[irq_pos]; 98 99 - for (irqn = 0; irqn < NR_PERI_INTS; irqn++) { 100 - int iar_shift = (irqn & 7) * 4; 101 - if (ivg == (0xf & 102 - #if defined(CONFIG_BF52x) || defined(CONFIG_BF538) \ 103 - || defined(CONFIG_BF539) || defined(CONFIG_BF51x) 104 - bfin_read32((unsigned long *)SIC_IAR0 + 105 - ((irqn % 32) >> 3) + ((irqn / 32) * 106 - ((SIC_IAR4 - SIC_IAR0) / 4))) >> iar_shift)) { 107 #else 108 - bfin_read32((unsigned long *)SIC_IAR0 + 109 - (irqn >> 3)) >> iar_shift)) { 110 #endif 111 - ivg_table[irq_pos].irqno = IVG7 + irqn; 112 - ivg_table[irq_pos].isrflag = 1 << (irqn % 32); 113 - ivg7_13[ivg].istop++; 114 - irq_pos++; 115 } 116 } 117 }
··· 92 { 93 unsigned ivg, irq_pos = 0; 94 for (ivg = 0; ivg <= IVG13 - IVG7; ivg++) { 95 + int irqN; 96 97 ivg7_13[ivg].istop = ivg7_13[ivg].ifirst = &ivg_table[irq_pos]; 98 99 + for (irqN = 0; irqN < NR_PERI_INTS; irqN += 4) { 100 + int irqn; 101 + u32 iar = bfin_read32((unsigned long *)SIC_IAR0 + 102 + #if defined(CONFIG_BF51x) || defined(CONFIG_BF52x) || \ 103 + defined(CONFIG_BF538) || defined(CONFIG_BF539) 104 + ((irqN % 32) >> 3) + ((irqN / 32) * ((SIC_IAR4 - SIC_IAR0) / 4)) 105 #else 106 + (irqN >> 3) 107 #endif 108 + ); 109 + 110 + for (irqn = irqN; irqn < irqN + 4; ++irqn) { 111 + int iar_shift = (irqn & 7) * 4; 112 + if (ivg == (0xf & (iar >> iar_shift))) { 113 + ivg_table[irq_pos].irqno = IVG7 + irqn; 114 + ivg_table[irq_pos].isrflag = 1 << (irqn % 32); 115 + ivg7_13[ivg].istop++; 116 + irq_pos++; 117 + } 118 } 119 } 120 }