提交 30c40469 编写于 作者: D dayu@datangmobile.cn 提交者: Kumar Gala

powerpc/83xx: Fix the interrupt loss problem on ipic

The interrupt pending register is write 1 clear.  If there are more than
one external interrupts pending at the same time, acking the first
interrupt by reading pending register then OR the corresponding bit and
write back to pending register will also clear other interrupt pending
bits.  That will cause loss of interrupt.
Signed-off-by: NDa Yu <dayu@datangmobile.cn>
Signed-off-by: NKumar Gala <galak@kernel.crashing.org>
上级 1ab082d7
...@@ -568,8 +568,7 @@ static void ipic_ack_irq(unsigned int virq) ...@@ -568,8 +568,7 @@ static void ipic_ack_irq(unsigned int virq)
spin_lock_irqsave(&ipic_lock, flags); spin_lock_irqsave(&ipic_lock, flags);
temp = ipic_read(ipic->regs, ipic_info[src].ack); temp = 1 << (31 - ipic_info[src].bit);
temp |= (1 << (31 - ipic_info[src].bit));
ipic_write(ipic->regs, ipic_info[src].ack, temp); ipic_write(ipic->regs, ipic_info[src].ack, temp);
/* mb() can't guarantee that ack is finished. But it does finish /* mb() can't guarantee that ack is finished. But it does finish
...@@ -592,8 +591,7 @@ static void ipic_mask_irq_and_ack(unsigned int virq) ...@@ -592,8 +591,7 @@ static void ipic_mask_irq_and_ack(unsigned int virq)
temp &= ~(1 << (31 - ipic_info[src].bit)); temp &= ~(1 << (31 - ipic_info[src].bit));
ipic_write(ipic->regs, ipic_info[src].mask, temp); ipic_write(ipic->regs, ipic_info[src].mask, temp);
temp = ipic_read(ipic->regs, ipic_info[src].ack); temp = 1 << (31 - ipic_info[src].bit);
temp |= (1 << (31 - ipic_info[src].bit));
ipic_write(ipic->regs, ipic_info[src].ack, temp); ipic_write(ipic->regs, ipic_info[src].ack, temp);
/* mb() can't guarantee that ack is finished. But it does finish /* mb() can't guarantee that ack is finished. But it does finish
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册