Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1678749
| From | Romain Perier <romain.perier@collabora.com> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH 6/7] serial: imx: update the stop rx,tx procedures |
| Date | 2017-06-30 14:10 +0200 |
| Message-ID | <tY2Ui-5iT-37@gated-at.bofh.it> (permalink) |
| References | <tY2Ui-5iT-17@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
From: Nandor Han <nandor.han@ge.com>
According to "Documentation/serial/driver" both procedures should stop
receiving or sending data. Based on this the procedures should stop the
activity regardless if DMA is enabled or not.
This commit updates both imx_stop_{rx|tx} procedures to stop the
activity and disable the interrupts related to that. In case DMA is used
the sg buffers are also un-maped.
Signed-off-by: Nandor Han <nandor.han@ge.com>
Signed-off-by: Romain Perier <romain.perier@collabora.com>
---
drivers/tty/serial/imx.c | 39 ++++++++++++++++++++-------------------
1 file changed, 20 insertions(+), 19 deletions(-)
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index 58d6b1c..d5b6e09 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
@@ -360,6 +360,9 @@ static void imx_port_rts_auto(struct imx_port *sport, unsigned long *ucr2)
*ucr2 |= UCR2_CTSC;
}
+static void imx_stop_rx_dma(struct imx_port *sport);
+static void imx_stop_tx_dma(struct imx_port *sport);
+
/*
* interrupts disabled on entry
*/
@@ -368,15 +371,14 @@ static void imx_stop_tx(struct uart_port *port)
struct imx_port *sport = (struct imx_port *)port;
unsigned long temp;
- /*
- * We are maybe in the SMP context, so if the DMA TX thread is running
- * on other cpu, we have to wait for it to finish.
- */
- if (sport->dma_is_enabled && sport->dma_is_txing)
- return;
+ sport->tx_bytes = 0;
+
+ if (sport->dma_is_enabled)
+ imx_stop_tx_dma(sport);
temp = readl(port->membase + UCR1);
- writel(temp & ~UCR1_TXMPTYEN, port->membase + UCR1);
+ temp &= ~(UCR1_TXMPTYEN | UCR1_TRDYEN | UCR1_RTSDEN);
+ writel(temp, port->membase + UCR1);
/* in rs485 mode disable transmitter if shifter is empty */
if (port->rs485.flags & SER_RS485_ENABLED &&
@@ -403,21 +405,20 @@ static void imx_stop_rx(struct uart_port *port)
struct imx_port *sport = (struct imx_port *)port;
unsigned long temp;
- if (sport->dma_is_enabled && sport->dma_is_rxing) {
- if (sport->port.suspended) {
- dmaengine_terminate_all(sport->dma_chan_rx);
- sport->dma_is_rxing = 0;
- } else {
- return;
- }
- }
+ if (sport->dma_is_enabled)
+ imx_stop_rx_dma(sport);
+
+ temp = readl(sport->port.membase + UCR1);
+ temp &= ~UCR1_RRDYEN;
+ writel(temp, sport->port.membase + UCR1);
temp = readl(sport->port.membase + UCR2);
- writel(temp & ~UCR2_RXEN, sport->port.membase + UCR2);
+ temp &= ~UCR2_ATEN;
+ writel(temp, sport->port.membase + UCR2);
- /* disable the `Receiver Ready Interrrupt` */
- temp = readl(sport->port.membase + UCR1);
- writel(temp & ~UCR1_RRDYEN, sport->port.membase + UCR1);
+ temp = readl(sport->port.membase + UCR3);
+ temp &= ~UCR3_AWAKEN;
+ writel(temp, sport->port.membase + UCR3);
}
/*
--
1.8.3.1
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[PATCH 0/7] serial: imx: various improvements Romain Perier <romain.perier@collabora.com> - 2017-06-30 14:10 +0200
[PATCH 2/7] serial: imx: move log from error to debug type Romain Perier <romain.perier@collabora.com> - 2017-06-30 14:10 +0200
Re: [PATCH 2/7] serial: imx: move log from error to debug type Uwe Kleine-König <u.kleine-koenig@pengutronix.de> - 2017-07-03 09:00 +0200
[PATCH 7/7] serial: imx: Fix imx_shutdown procedure Romain Perier <romain.perier@collabora.com> - 2017-06-30 14:10 +0200
Re: [PATCH 7/7] serial: imx: Fix imx_shutdown procedure Uwe Kleine-König <u.kleine-koenig@pengutronix.de> - 2017-07-03 09:10 +0200
[PATCH 1/7] serial: imx: only set DMA rx-ing when DMA starts Romain Perier <romain.perier@collabora.com> - 2017-06-30 14:10 +0200
Re: [PATCH 1/7] serial: imx: only set DMA rx-ing when DMA starts Uwe Kleine-König <u.kleine-koenig@pengutronix.de> - 2017-07-03 08:50 +0200
[PATCH 3/7] serial: imx: init dma_is_{rx|tx}ing variables Romain Perier <romain.perier@collabora.com> - 2017-06-30 14:10 +0200
Re: [PATCH 3/7] serial: imx: init dma_is_{rx|tx}ing variables Lothar Waßmann <LW@KARO-electronics.de> - 2017-06-30 14:20 +0200
Re: [PATCH 3/7] serial: imx: init dma_is_{rx|tx}ing variables Uwe Kleine-König <u.kleine-koenig@pengutronix.de> - 2017-07-03 09:00 +0200
[PATCH 5/7] serial: imx: umap sg buffers when DMA channel is released Romain Perier <romain.perier@collabora.com> - 2017-06-30 14:10 +0200
Re: [PATCH 5/7] serial: imx: umap sg buffers when DMA channel is released Uwe Kleine-König <u.kleine-koenig@pengutronix.de> - 2017-07-03 09:10 +0200
[PATCH 6/7] serial: imx: update the stop rx,tx procedures Romain Perier <romain.perier@collabora.com> - 2017-06-30 14:10 +0200
Re: [PATCH 6/7] serial: imx: update the stop rx,tx procedures Uwe Kleine-König <u.kleine-koenig@pengutronix.de> - 2017-07-03 09:10 +0200
csiph-web