forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 cde9070d9970eef1f7ec2360586c802a16230ad8
kernel/drivers/tty/serial/8250/8250_dma.c
....@@ -11,10 +11,11 @@
1111
1212 #include "8250.h"
1313
14
-#ifdef CONFIG_ARCH_ROCKCHIP
14
+#if defined(CONFIG_ARCH_ROCKCHIP) && defined(CONFIG_NO_GKI)
1515 #define MAX_TX_BYTES 64
1616 #define MAX_FIFO_SIZE 64
1717 #define UART_RFL_16550A 0x21
18
+#define DW_UART_DMASA 0x2a
1819 #endif
1920
2021 static void __dma_tx_complete(void *param)
....@@ -40,18 +41,13 @@
4041 uart_write_wakeup(&p->port);
4142
4243 ret = serial8250_tx_dma(p);
43
- if (ret) {
44
- p->ier |= UART_IER_THRI;
45
-#ifdef CONFIG_ARCH_ROCKCHIP
46
- p->ier |= UART_IER_PTIME;
47
-#endif
48
- serial_port_out(&p->port, UART_IER, p->ier);
49
- }
44
+ if (ret)
45
+ serial8250_set_THRI(p);
5046
5147 spin_unlock_irqrestore(&p->port.lock, flags);
5248 }
5349
54
-#ifdef CONFIG_ARCH_ROCKCHIP
50
+#if defined(CONFIG_ARCH_ROCKCHIP) && defined(CONFIG_NO_GKI)
5551
5652 static void __dma_rx_complete(void *param)
5753 {
....@@ -90,19 +86,38 @@
9086 struct uart_8250_dma *dma = p->dma;
9187 struct tty_port *tty_port = &p->port.state->port;
9288 struct dma_tx_state state;
89
+ enum dma_status dma_status;
9390 int count;
9491
95
- dma->rx_running = 0;
96
- dmaengine_tx_status(dma->rxchan, dma->rx_cookie, &state);
92
+ /*
93
+ * New DMA Rx can be started during the completion handler before it
94
+ * could acquire port's lock and it might still be ongoing. Don't to
95
+ * anything in such case.
96
+ */
97
+ dma_status = dmaengine_tx_status(dma->rxchan, dma->rx_cookie, &state);
98
+ if (dma_status == DMA_IN_PROGRESS)
99
+ return;
97100
98101 count = dma->rx_size - state.residue;
99102
100103 tty_insert_flip_string(tty_port, dma->rx_buf, count);
101104 p->port.icount.rx += count;
105
+ dma->rx_running = 0;
102106
103107 tty_flip_buffer_push(tty_port);
104108 }
105109
110
+static void dma_rx_complete(void *param)
111
+{
112
+ struct uart_8250_port *p = param;
113
+ struct uart_8250_dma *dma = p->dma;
114
+ unsigned long flags;
115
+
116
+ spin_lock_irqsave(&p->port.lock, flags);
117
+ if (dma->rx_running)
118
+ __dma_rx_complete(p);
119
+ spin_unlock_irqrestore(&p->port.lock, flags);
120
+}
106121 #endif
107122
108123 int serial8250_tx_dma(struct uart_8250_port *p)
....@@ -110,10 +125,19 @@
110125 struct uart_8250_dma *dma = p->dma;
111126 struct circ_buf *xmit = &p->port.state->xmit;
112127 struct dma_async_tx_descriptor *desc;
128
+ struct uart_port *up = &p->port;
113129 int ret;
114130
115
- if (dma->tx_running)
131
+ if (dma->tx_running) {
132
+ if (up->x_char) {
133
+ dmaengine_pause(dma->txchan);
134
+ uart_xchar_out(up, UART_TX);
135
+ dmaengine_resume(dma->txchan);
136
+ }
116137 return 0;
138
+ } else if (up->x_char) {
139
+ uart_xchar_out(up, UART_TX);
140
+ }
117141
118142 if (uart_tx_stopped(&p->port) || uart_circ_empty(xmit)) {
119143 /* We have been called from __dma_tx_complete() */
....@@ -122,7 +146,7 @@
122146 }
123147
124148 dma->tx_size = CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE);
125
-#ifdef CONFIG_ARCH_ROCKCHIP
149
+#if defined(CONFIG_ARCH_ROCKCHIP) && defined(CONFIG_NO_GKI)
126150 if (dma->tx_size < MAX_TX_BYTES) {
127151 ret = -EBUSY;
128152 goto err;
....@@ -146,16 +170,14 @@
146170 dma_sync_single_for_device(dma->txchan->device->dev, dma->tx_addr,
147171 UART_XMIT_SIZE, DMA_TO_DEVICE);
148172
173
+#if defined(CONFIG_ARCH_ROCKCHIP) && defined(CONFIG_NO_GKI)
174
+ /* Clear uart dma request before start dma */
175
+ serial_port_out(&p->port, DW_UART_DMASA, 0x1);
176
+#endif
149177 dma_async_issue_pending(dma->txchan);
150178 if (dma->tx_err) {
151179 dma->tx_err = 0;
152
- if (p->ier & UART_IER_THRI) {
153
- p->ier &= ~UART_IER_THRI;
154
-#ifdef CONFIG_ARCH_ROCKCHIP
155
- p->ier &= ~UART_IER_PTIME;
156
-#endif
157
- serial_out(p, UART_IER, p->ier);
158
- }
180
+ serial8250_clear_THRI(p);
159181 }
160182 return 0;
161183 err:
....@@ -163,7 +185,7 @@
163185 return ret;
164186 }
165187
166
-#ifdef CONFIG_ARCH_ROCKCHIP
188
+#if defined(CONFIG_ARCH_ROCKCHIP) && defined(CONFIG_NO_GKI)
167189
168190 int serial8250_rx_dma(struct uart_8250_port *p)
169191 {
....@@ -236,7 +258,7 @@
236258 return -EBUSY;
237259
238260 dma->rx_running = 1;
239
- desc->callback = __dma_rx_complete;
261
+ desc->callback = dma_rx_complete;
240262 desc->callback_param = p;
241263
242264 dma->rx_cookie = dmaengine_submit(desc);
....@@ -275,7 +297,7 @@
275297 dma->rxconf.direction = DMA_DEV_TO_MEM;
276298 dma->rxconf.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
277299 dma->rxconf.src_addr = rx_dma_addr + UART_RX;
278
-#ifdef CONFIG_ARCH_ROCKCHIP
300
+#if defined(CONFIG_ARCH_ROCKCHIP) && defined(CONFIG_NO_GKI)
279301 if ((p->port.fifosize / 4) < 16)
280302 dma->rxconf.src_maxburst = p->port.fifosize / 4;
281303 else
....@@ -285,7 +307,7 @@
285307 dma->txconf.direction = DMA_MEM_TO_DEV;
286308 dma->txconf.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
287309 dma->txconf.dst_addr = tx_dma_addr + UART_TX;
288
-#ifdef CONFIG_ARCH_ROCKCHIP
310
+#if defined(CONFIG_ARCH_ROCKCHIP) && defined(CONFIG_NO_GKI)
289311 dma->txconf.dst_maxburst = 16;
290312 #endif
291313 dma_cap_zero(mask);
....@@ -301,17 +323,17 @@
301323 /* 8250 rx dma requires dmaengine driver to support pause/terminate */
302324 ret = dma_get_slave_caps(dma->rxchan, &caps);
303325 if (ret)
304
- goto err_rx;
326
+ goto release_rx;
305327 if (!caps.cmd_pause || !caps.cmd_terminate ||
306328 caps.residue_granularity == DMA_RESIDUE_GRANULARITY_DESCRIPTOR) {
307329 ret = -EINVAL;
308
- goto err_rx;
330
+ goto release_rx;
309331 }
310332
311333 dmaengine_slave_config(dma->rxchan, &dma->rxconf);
312334
313335 /* RX buffer */
314
-#ifdef CONFIG_ARCH_ROCKCHIP
336
+#if defined(CONFIG_ARCH_ROCKCHIP) && defined(CONFIG_NO_GKI)
315337 if (!dma->rx_size)
316338 dma->rx_size = PAGE_SIZE * 2;
317339 #else
....@@ -321,10 +343,9 @@
321343
322344 dma->rx_buf = dma_alloc_coherent(dma->rxchan->device->dev, dma->rx_size,
323345 &dma->rx_addr, GFP_KERNEL);
324
-
325346 if (!dma->rx_buf) {
326347 ret = -ENOMEM;
327
- goto err_rx;
348
+ goto release_rx;
328349 }
329350
330351 /* Get a channel for TX */
....@@ -352,13 +373,12 @@
352373 dev_info_ratelimited(p->port.dev, "got rx dma channels only\n");
353374 }
354375
355
-#ifdef CONFIG_ARCH_ROCKCHIP
376
+#if defined(CONFIG_ARCH_ROCKCHIP) && defined(CONFIG_NO_GKI)
356377 /* start dma for rx*/
357378 serial8250_start_rx_dma(p);
358379 #endif
359380 return 0;
360
-
361
-err_rx:
381
+release_rx:
362382 dma_release_channel(dma->rxchan);
363383 return ret;
364384 }
....@@ -377,7 +397,7 @@
377397 dma->rx_addr);
378398 dma_release_channel(dma->rxchan);
379399 dma->rxchan = NULL;
380
-#ifdef CONFIG_ARCH_ROCKCHIP
400
+#if defined(CONFIG_ARCH_ROCKCHIP) && defined(CONFIG_NO_GKI)
381401 dma->rx_running = 0;
382402 #endif
383403 /* Release TX resources */