drivers/irqchip: xtensa-mx: fix mask and unmask
xtensa_irq_mask and xtensa_irq_unmask don't do the right thing when called for the first two external IRQs. Treat these IRQs as per-CPU IRQs. Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
This commit is contained in:
parent
bb6652363b
commit
eb271710ec
|
@ -71,14 +71,17 @@ static void xtensa_mx_irq_mask(struct irq_data *d)
|
||||||
unsigned int mask = 1u << d->hwirq;
|
unsigned int mask = 1u << d->hwirq;
|
||||||
|
|
||||||
if (mask & (XCHAL_INTTYPE_MASK_EXTERN_EDGE |
|
if (mask & (XCHAL_INTTYPE_MASK_EXTERN_EDGE |
|
||||||
XCHAL_INTTYPE_MASK_EXTERN_LEVEL)) {
|
XCHAL_INTTYPE_MASK_EXTERN_LEVEL)) {
|
||||||
set_er(1u << (xtensa_get_ext_irq_no(d->hwirq) -
|
unsigned int ext_irq = xtensa_get_ext_irq_no(d->hwirq);
|
||||||
HW_IRQ_MX_BASE), MIENG);
|
|
||||||
} else {
|
if (ext_irq >= HW_IRQ_MX_BASE) {
|
||||||
mask = __this_cpu_read(cached_irq_mask) & ~mask;
|
set_er(1u << (ext_irq - HW_IRQ_MX_BASE), MIENG);
|
||||||
__this_cpu_write(cached_irq_mask, mask);
|
return;
|
||||||
xtensa_set_sr(mask, intenable);
|
}
|
||||||
}
|
}
|
||||||
|
mask = __this_cpu_read(cached_irq_mask) & ~mask;
|
||||||
|
__this_cpu_write(cached_irq_mask, mask);
|
||||||
|
xtensa_set_sr(mask, intenable);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void xtensa_mx_irq_unmask(struct irq_data *d)
|
static void xtensa_mx_irq_unmask(struct irq_data *d)
|
||||||
|
@ -86,14 +89,17 @@ static void xtensa_mx_irq_unmask(struct irq_data *d)
|
||||||
unsigned int mask = 1u << d->hwirq;
|
unsigned int mask = 1u << d->hwirq;
|
||||||
|
|
||||||
if (mask & (XCHAL_INTTYPE_MASK_EXTERN_EDGE |
|
if (mask & (XCHAL_INTTYPE_MASK_EXTERN_EDGE |
|
||||||
XCHAL_INTTYPE_MASK_EXTERN_LEVEL)) {
|
XCHAL_INTTYPE_MASK_EXTERN_LEVEL)) {
|
||||||
set_er(1u << (xtensa_get_ext_irq_no(d->hwirq) -
|
unsigned int ext_irq = xtensa_get_ext_irq_no(d->hwirq);
|
||||||
HW_IRQ_MX_BASE), MIENGSET);
|
|
||||||
} else {
|
if (ext_irq >= HW_IRQ_MX_BASE) {
|
||||||
mask |= __this_cpu_read(cached_irq_mask);
|
set_er(1u << (ext_irq - HW_IRQ_MX_BASE), MIENGSET);
|
||||||
__this_cpu_write(cached_irq_mask, mask);
|
return;
|
||||||
xtensa_set_sr(mask, intenable);
|
}
|
||||||
}
|
}
|
||||||
|
mask |= __this_cpu_read(cached_irq_mask);
|
||||||
|
__this_cpu_write(cached_irq_mask, mask);
|
||||||
|
xtensa_set_sr(mask, intenable);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void xtensa_mx_irq_enable(struct irq_data *d)
|
static void xtensa_mx_irq_enable(struct irq_data *d)
|
||||||
|
|
Loading…
Reference in New Issue