mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] amba-pl011: clear previous interrupts before request_irq
@ 2012-01-17 10:34 Shreshtha Kumar SAHU
  2012-01-18 10:04 ` Shreshtha Kumar SAHU
  0 siblings, 1 reply; 7+ messages in thread
From: Shreshtha Kumar SAHU @ 2012-01-17 10:34 UTC (permalink / raw)
  To: gregkh, linux-serial, rmk+kernel; +Cc: linux-kernel, Shreshtha Kumar Sahu

From: Shreshtha Kumar Sahu <shreshthakumar.sahu@stericsson.com>

All previous interrupts should be cleared before installing
interrupt handler i.e. before request_irq. pl011_shutdown
clears the interrupt register but there may be case where
bootloader transfers control to kernel and there are some
pending interrupts. In this case interrupt handler will get
called even before interrupt mask is enabled.

Change-Id: Ie58ca0a36dec76ac38babc057ce1d66b3129d8f9
Acked-by: Linus Walleij <linus.walleij@linaro.org>
---
 drivers/tty/serial/amba-pl011.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c
index 6958594..6dafaa2 100644
--- a/drivers/tty/serial/amba-pl011.c
+++ b/drivers/tty/serial/amba-pl011.c
@@ -1381,6 +1381,15 @@ static int pl011_startup(struct uart_port *port)
 	uap->port.uartclk = clk_get_rate(uap->clk);
 
 	/*
+	 * Clear previous interrupts before installing interrupt handler
+	 */
+	spin_lock_irq(&uap->port.lock);
+	uap->im = 0;
+	writew(uap->im, uap->port.membase + UART011_IMSC);
+	writew(0xffff, uap->port.membase + UART011_ICR);
+	spin_unlock_irq(&uap->port.lock);
+
+	/*
 	 * Allocate the IRQ
 	 */
 	retval = request_irq(uap->port.irq, pl011_int, 0, "uart-pl011", uap);
-- 
1.7.4.3


^ permalink raw reply	[flat|nested] 7+ messages in thread
* Re: [PATCH] amba-pl011: clear previous interrupts before request_irq
@ 2012-01-31  7:27 Chanho Min
  0 siblings, 0 replies; 7+ messages in thread
From: Chanho Min @ 2012-01-31  7:27 UTC (permalink / raw)
  To: Shreshtha Kumar Sahu; +Cc: Linus Walleij, Russell King, Alan Cox, linux-kernel

> Sorry for late reply and missing sign-off.
> In the setup where console is disabled and logs are diverted to buffer, it is
> observed that, continuous uart interrupts are coming. Even before IMSC
> (Interrupt mask set/clear register) is enabled for TX or RX interrupts,
> it is seen that interrupt handler getting called just after request_irq.
> It was found that this situation happens when RIS (raw interrupt register)
> has some pending interrupts (e.g. RI, CTS, DCD, RX etc. but IMO RX is main)
> when control gets transferred to kernel from bootloader. This refers that
> GIC (global interrupt controller) is providing interrupt even if interrupts
> for UART are masked/disabled in IMSC register.
> In this state problem elivated when cpu is looping in interrupt handler
> because of Rx interrupt set but Rx fifo is empty (hence rx_char is simply
> returning). How UART goes in to this state is still not completely
> understood.
Hi,
This is my analsys.
RXFE is set by 'writew(0, uap->port.membase + uap->lcrh_rx)'
UART can not get any data from DR because of the below break condtion.
pl011_fifo_to_tty
 while (max_count--) {
   if (status & UART01x_FR_RXFE)
	break;
Rx interrupt is never cleared. cpu is looping in ISR.

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2012-01-31  7:27 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-01-17 10:34 [PATCH] amba-pl011: clear previous interrupts before request_irq Shreshtha Kumar SAHU
2012-01-18 10:04 ` Shreshtha Kumar SAHU
2012-01-18 10:15   ` Russell King
2012-01-19 11:07     ` Shreshtha Kumar SAHU
2012-01-18 11:41   ` Alan Cox
2012-01-19 11:15     ` Shreshtha Kumar SAHU
2012-01-31  7:27 Chanho Min

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome