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>
This commit is contained in:
parent
11cabcb95e
commit
80fcdb9593
1 changed files with 18 additions and 15 deletions
|
@ -92,26 +92,29 @@ static void __init search_IAR(void)
|
|||
{
|
||||
unsigned ivg, irq_pos = 0;
|
||||
for (ivg = 0; ivg <= IVG13 - IVG7; ivg++) {
|
||||
int irqn;
|
||||
int irqN;
|
||||
|
||||
ivg7_13[ivg].istop = ivg7_13[ivg].ifirst = &ivg_table[irq_pos];
|
||||
|
||||
for (irqn = 0; irqn < NR_PERI_INTS; irqn++) {
|
||||
int iar_shift = (irqn & 7) * 4;
|
||||
if (ivg == (0xf &
|
||||
#if defined(CONFIG_BF52x) || defined(CONFIG_BF538) \
|
||||
|| defined(CONFIG_BF539) || defined(CONFIG_BF51x)
|
||||
bfin_read32((unsigned long *)SIC_IAR0 +
|
||||
((irqn % 32) >> 3) + ((irqn / 32) *
|
||||
((SIC_IAR4 - SIC_IAR0) / 4))) >> iar_shift)) {
|
||||
for (irqN = 0; irqN < NR_PERI_INTS; irqN += 4) {
|
||||
int irqn;
|
||||
u32 iar = bfin_read32((unsigned long *)SIC_IAR0 +
|
||||
#if defined(CONFIG_BF51x) || defined(CONFIG_BF52x) || \
|
||||
defined(CONFIG_BF538) || defined(CONFIG_BF539)
|
||||
((irqN % 32) >> 3) + ((irqN / 32) * ((SIC_IAR4 - SIC_IAR0) / 4))
|
||||
#else
|
||||
bfin_read32((unsigned long *)SIC_IAR0 +
|
||||
(irqn >> 3)) >> iar_shift)) {
|
||||
(irqN >> 3)
|
||||
#endif
|
||||
ivg_table[irq_pos].irqno = IVG7 + irqn;
|
||||
ivg_table[irq_pos].isrflag = 1 << (irqn % 32);
|
||||
ivg7_13[ivg].istop++;
|
||||
irq_pos++;
|
||||
);
|
||||
|
||||
for (irqn = irqN; irqn < irqN + 4; ++irqn) {
|
||||
int iar_shift = (irqn & 7) * 4;
|
||||
if (ivg == (0xf & (iar >> iar_shift))) {
|
||||
ivg_table[irq_pos].irqno = IVG7 + irqn;
|
||||
ivg_table[irq_pos].isrflag = 1 << (irqn % 32);
|
||||
ivg7_13[ivg].istop++;
|
||||
irq_pos++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue