From: Romain Perier <romain.perier@collabora.com>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: linux-serial@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, Nandor Han <nandor.han@ge.com>,
Romain Perier <romain.perier@collabora.com>
Subject: [PATCH 7/7] serial: imx: Fix imx_shutdown procedure
Date: Fri, 30 Jun 2017 14:04:46 +0200 [thread overview]
Message-ID: <20170630120446.13994-8-romain.perier@collabora.com> (raw)
In-Reply-To: <20170630120446.13994-1-romain.perier@collabora.com>
From: Nandor Han <nandor.han@ge.com>
In some cases, It looks that interrupts can happen after the dma was
disabled and port was not yet shutdown. This will result in interrupts
handled by imx_rxint.
This commits updates the shutdown function to ensure that underlying
components are disabled in the right order. This disables RX and TX
blocks, then it disabled interrupts. In case DMA is enabled, it disables
DMA and free corresponding resources. It disables UART port and stop
clocks.
Signed-off-by: Nandor Han <nandor.han@ge.com>
Signed-off-by: Romain Perier <romain.perier@collabora.com>
---
drivers/tty/serial/imx.c | 38 +++++++++++++++++++-------------------
1 file changed, 19 insertions(+), 19 deletions(-)
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index d5b6e09..7dc6f0c 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
@@ -1404,44 +1404,44 @@ static void imx_shutdown(struct uart_port *port)
unsigned long temp;
unsigned long flags;
- if (sport->dma_is_enabled) {
- sport->dma_is_rxing = 0;
- sport->dma_is_txing = 0;
- dmaengine_terminate_sync(sport->dma_chan_tx);
- dmaengine_terminate_sync(sport->dma_chan_rx);
-
+ if (!sport->port.suspended) {
spin_lock_irqsave(&sport->port.lock, flags);
imx_stop_tx(port);
imx_stop_rx(port);
- imx_disable_dma(sport);
spin_unlock_irqrestore(&sport->port.lock, flags);
- imx_uart_dma_exit(sport);
}
- mctrl_gpio_disable_ms(sport->gpios);
+ if (sport->dma_is_inited) {
+ if (sport->dma_is_enabled) {
+ spin_lock_irqsave(&sport->port.lock, flags);
+ imx_disable_dma(sport);
+ spin_unlock_irqrestore(&sport->port.lock, flags);
+ }
+ imx_uart_dma_exit(sport);
+ }
spin_lock_irqsave(&sport->port.lock, flags);
temp = readl(sport->port.membase + UCR2);
- temp &= ~(UCR2_TXEN);
+ temp &= ~(UCR2_TXEN | UCR2_RXEN);
writel(temp, sport->port.membase + UCR2);
+ temp = readl(sport->port.membase + UCR4);
+ temp &= ~UCR4_OREN;
+ writel(temp, sport->port.membase + UCR4);
spin_unlock_irqrestore(&sport->port.lock, flags);
- /*
- * Stop our timer.
- */
- del_timer_sync(&sport->timer);
+ mctrl_gpio_disable_ms(sport->gpios);
- /*
- * Disable all interrupts, port and break condition.
- */
+ /* Stop our timer. */
+ del_timer_sync(&sport->timer);
+ /* Disable port. */
spin_lock_irqsave(&sport->port.lock, flags);
temp = readl(sport->port.membase + UCR1);
- temp &= ~(UCR1_TXMPTYEN | UCR1_RRDYEN | UCR1_RTSDEN | UCR1_UARTEN);
-
+ temp &= ~UCR1_UARTEN;
writel(temp, sport->port.membase + UCR1);
spin_unlock_irqrestore(&sport->port.lock, flags);
+ /* Disable clocks. */
clk_disable_unprepare(sport->clk_per);
clk_disable_unprepare(sport->clk_ipg);
}
--
1.8.3.1
next prev parent reply other threads:[~2017-06-30 12:05 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-30 12:04 [PATCH 0/7] serial: imx: various improvements Romain Perier
2017-06-30 12:04 ` [PATCH 1/7] serial: imx: only set DMA rx-ing when DMA starts Romain Perier
2017-07-03 6:48 ` Uwe Kleine-König
2017-07-04 8:55 ` Romain Perier
2017-06-30 12:04 ` [PATCH 2/7] serial: imx: move log from error to debug type Romain Perier
2017-07-03 6:50 ` Uwe Kleine-König
2017-06-30 12:04 ` [PATCH 3/7] serial: imx: init dma_is_{rx|tx}ing variables Romain Perier
2017-06-30 12:13 ` Lothar Waßmann
2017-07-03 6:52 ` Uwe Kleine-König
2017-07-05 10:14 ` Romain Perier
2017-07-05 11:58 ` Uwe Kleine-König
2017-06-30 12:04 ` [PATCH 4/7] serial: imx: Simplify DMA disablement Romain Perier
2017-07-03 6:58 ` Uwe Kleine-König
2017-06-30 12:04 ` [PATCH 5/7] serial: imx: umap sg buffers when DMA channel is released Romain Perier
2017-07-03 7:01 ` Uwe Kleine-König
2017-06-30 12:04 ` [PATCH 6/7] serial: imx: update the stop rx,tx procedures Romain Perier
2017-07-03 7:03 ` Uwe Kleine-König
2017-06-30 12:04 ` Romain Perier [this message]
2017-07-03 7:08 ` [PATCH 7/7] serial: imx: Fix imx_shutdown procedure Uwe Kleine-König
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170630120446.13994-8-romain.perier@collabora.com \
--to=romain.perier@collabora.com \
--cc=gregkh@linuxfoundation.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-serial@vger.kernel.org \
--cc=nandor.han@ge.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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