mfd: ab8500-core: Ignore masked out interrupts
AB8500 asserts LATCH bits for masked out interrupts. This patch explicitly masks those out using the cached mask value to prevent handle_nested_irq() being called for masked IRQ on the same register as unmasked ones. Acked-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Fabio Baltieri <fabio.baltieri@linaro.org> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
This commit is contained in:
parent
d95c785500
commit
7a93fb3754
@ -458,22 +458,23 @@ static void update_latch_offset(u8 *offset, int i)
|
||||
static int ab8500_handle_hierarchical_line(struct ab8500 *ab8500,
|
||||
int latch_offset, u8 latch_val)
|
||||
{
|
||||
int int_bit = __ffs(latch_val);
|
||||
int line, i;
|
||||
int int_bit, line, i;
|
||||
|
||||
do {
|
||||
for (i = 0; i < ab8500->mask_size; i++)
|
||||
if (ab8500->irq_reg_offset[i] == latch_offset)
|
||||
break;
|
||||
|
||||
if (i >= ab8500->mask_size) {
|
||||
dev_err(ab8500->dev, "Register offset 0x%2x not declared\n",
|
||||
latch_offset);
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
/* ignore masked out interrupts */
|
||||
latch_val &= ~ab8500->mask[i];
|
||||
|
||||
while (latch_val) {
|
||||
int_bit = __ffs(latch_val);
|
||||
|
||||
for (i = 0; i < ab8500->mask_size; i++)
|
||||
if (ab8500->irq_reg_offset[i] == latch_offset)
|
||||
break;
|
||||
|
||||
if (i >= ab8500->mask_size) {
|
||||
dev_err(ab8500->dev, "Register offset 0x%2x not declared\n",
|
||||
latch_offset);
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
line = (i << 3) + int_bit;
|
||||
latch_val &= ~(1 << int_bit);
|
||||
|
||||
@ -491,7 +492,7 @@ static int ab8500_handle_hierarchical_line(struct ab8500 *ab8500,
|
||||
line += 1;
|
||||
|
||||
handle_nested_irq(ab8500->irq_base + line);
|
||||
} while (latch_val);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user