.. | .. |
---|
11 | 11 | |
---|
12 | 12 | #include "8250.h" |
---|
13 | 13 | |
---|
14 | | -#ifdef CONFIG_ARCH_ROCKCHIP |
---|
| 14 | +#if defined(CONFIG_ARCH_ROCKCHIP) && defined(CONFIG_NO_GKI) |
---|
15 | 15 | #define MAX_TX_BYTES 64 |
---|
16 | 16 | #define MAX_FIFO_SIZE 64 |
---|
17 | 17 | #define UART_RFL_16550A 0x21 |
---|
.. | .. |
---|
40 | 40 | uart_write_wakeup(&p->port); |
---|
41 | 41 | |
---|
42 | 42 | 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 | | - } |
---|
| 43 | + if (ret) |
---|
| 44 | + serial8250_set_THRI(p); |
---|
50 | 45 | |
---|
51 | 46 | spin_unlock_irqrestore(&p->port.lock, flags); |
---|
52 | 47 | } |
---|
53 | 48 | |
---|
54 | | -#ifdef CONFIG_ARCH_ROCKCHIP |
---|
| 49 | +#if defined(CONFIG_ARCH_ROCKCHIP) && defined(CONFIG_NO_GKI) |
---|
55 | 50 | |
---|
56 | 51 | static void __dma_rx_complete(void *param) |
---|
57 | 52 | { |
---|
.. | .. |
---|
110 | 105 | struct uart_8250_dma *dma = p->dma; |
---|
111 | 106 | struct circ_buf *xmit = &p->port.state->xmit; |
---|
112 | 107 | struct dma_async_tx_descriptor *desc; |
---|
| 108 | + struct uart_port *up = &p->port; |
---|
113 | 109 | int ret; |
---|
114 | 110 | |
---|
115 | | - if (dma->tx_running) |
---|
| 111 | + if (dma->tx_running) { |
---|
| 112 | + if (up->x_char) { |
---|
| 113 | + dmaengine_pause(dma->txchan); |
---|
| 114 | + uart_xchar_out(up, UART_TX); |
---|
| 115 | + dmaengine_resume(dma->txchan); |
---|
| 116 | + } |
---|
116 | 117 | return 0; |
---|
| 118 | + } else if (up->x_char) { |
---|
| 119 | + uart_xchar_out(up, UART_TX); |
---|
| 120 | + } |
---|
117 | 121 | |
---|
118 | 122 | if (uart_tx_stopped(&p->port) || uart_circ_empty(xmit)) { |
---|
119 | 123 | /* We have been called from __dma_tx_complete() */ |
---|
.. | .. |
---|
122 | 126 | } |
---|
123 | 127 | |
---|
124 | 128 | dma->tx_size = CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE); |
---|
125 | | -#ifdef CONFIG_ARCH_ROCKCHIP |
---|
| 129 | +#if defined(CONFIG_ARCH_ROCKCHIP) && defined(CONFIG_NO_GKI) |
---|
126 | 130 | if (dma->tx_size < MAX_TX_BYTES) { |
---|
127 | 131 | ret = -EBUSY; |
---|
128 | 132 | goto err; |
---|
.. | .. |
---|
149 | 153 | dma_async_issue_pending(dma->txchan); |
---|
150 | 154 | if (dma->tx_err) { |
---|
151 | 155 | 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 | | - } |
---|
| 156 | + serial8250_clear_THRI(p); |
---|
159 | 157 | } |
---|
160 | 158 | return 0; |
---|
161 | 159 | err: |
---|
.. | .. |
---|
163 | 161 | return ret; |
---|
164 | 162 | } |
---|
165 | 163 | |
---|
166 | | -#ifdef CONFIG_ARCH_ROCKCHIP |
---|
| 164 | +#if defined(CONFIG_ARCH_ROCKCHIP) && defined(CONFIG_NO_GKI) |
---|
167 | 165 | |
---|
168 | 166 | int serial8250_rx_dma(struct uart_8250_port *p) |
---|
169 | 167 | { |
---|
.. | .. |
---|
275 | 273 | dma->rxconf.direction = DMA_DEV_TO_MEM; |
---|
276 | 274 | dma->rxconf.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; |
---|
277 | 275 | dma->rxconf.src_addr = rx_dma_addr + UART_RX; |
---|
278 | | -#ifdef CONFIG_ARCH_ROCKCHIP |
---|
| 276 | +#if defined(CONFIG_ARCH_ROCKCHIP) && defined(CONFIG_NO_GKI) |
---|
279 | 277 | if ((p->port.fifosize / 4) < 16) |
---|
280 | 278 | dma->rxconf.src_maxburst = p->port.fifosize / 4; |
---|
281 | 279 | else |
---|
.. | .. |
---|
285 | 283 | dma->txconf.direction = DMA_MEM_TO_DEV; |
---|
286 | 284 | dma->txconf.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; |
---|
287 | 285 | dma->txconf.dst_addr = tx_dma_addr + UART_TX; |
---|
288 | | -#ifdef CONFIG_ARCH_ROCKCHIP |
---|
| 286 | +#if defined(CONFIG_ARCH_ROCKCHIP) && defined(CONFIG_NO_GKI) |
---|
289 | 287 | dma->txconf.dst_maxburst = 16; |
---|
290 | 288 | #endif |
---|
291 | 289 | dma_cap_zero(mask); |
---|
.. | .. |
---|
301 | 299 | /* 8250 rx dma requires dmaengine driver to support pause/terminate */ |
---|
302 | 300 | ret = dma_get_slave_caps(dma->rxchan, &caps); |
---|
303 | 301 | if (ret) |
---|
304 | | - goto err_rx; |
---|
| 302 | + goto release_rx; |
---|
305 | 303 | if (!caps.cmd_pause || !caps.cmd_terminate || |
---|
306 | 304 | caps.residue_granularity == DMA_RESIDUE_GRANULARITY_DESCRIPTOR) { |
---|
307 | 305 | ret = -EINVAL; |
---|
308 | | - goto err_rx; |
---|
| 306 | + goto release_rx; |
---|
309 | 307 | } |
---|
310 | 308 | |
---|
311 | 309 | dmaengine_slave_config(dma->rxchan, &dma->rxconf); |
---|
312 | 310 | |
---|
313 | 311 | /* RX buffer */ |
---|
314 | | -#ifdef CONFIG_ARCH_ROCKCHIP |
---|
| 312 | +#if defined(CONFIG_ARCH_ROCKCHIP) && defined(CONFIG_NO_GKI) |
---|
315 | 313 | if (!dma->rx_size) |
---|
316 | 314 | dma->rx_size = PAGE_SIZE * 2; |
---|
317 | 315 | #else |
---|
.. | .. |
---|
321 | 319 | |
---|
322 | 320 | dma->rx_buf = dma_alloc_coherent(dma->rxchan->device->dev, dma->rx_size, |
---|
323 | 321 | &dma->rx_addr, GFP_KERNEL); |
---|
324 | | - |
---|
325 | 322 | if (!dma->rx_buf) { |
---|
326 | 323 | ret = -ENOMEM; |
---|
327 | | - goto err_rx; |
---|
| 324 | + goto release_rx; |
---|
328 | 325 | } |
---|
329 | 326 | |
---|
330 | 327 | /* Get a channel for TX */ |
---|
.. | .. |
---|
352 | 349 | dev_info_ratelimited(p->port.dev, "got rx dma channels only\n"); |
---|
353 | 350 | } |
---|
354 | 351 | |
---|
355 | | -#ifdef CONFIG_ARCH_ROCKCHIP |
---|
| 352 | +#if defined(CONFIG_ARCH_ROCKCHIP) && defined(CONFIG_NO_GKI) |
---|
356 | 353 | /* start dma for rx*/ |
---|
357 | 354 | serial8250_start_rx_dma(p); |
---|
358 | 355 | #endif |
---|
359 | 356 | return 0; |
---|
360 | | - |
---|
361 | | -err_rx: |
---|
| 357 | +release_rx: |
---|
362 | 358 | dma_release_channel(dma->rxchan); |
---|
363 | 359 | return ret; |
---|
364 | 360 | } |
---|
.. | .. |
---|
377 | 373 | dma->rx_addr); |
---|
378 | 374 | dma_release_channel(dma->rxchan); |
---|
379 | 375 | dma->rxchan = NULL; |
---|
380 | | -#ifdef CONFIG_ARCH_ROCKCHIP |
---|
| 376 | +#if defined(CONFIG_ARCH_ROCKCHIP) && defined(CONFIG_NO_GKI) |
---|
381 | 377 | dma->rx_running = 0; |
---|
382 | 378 | #endif |
---|
383 | 379 | /* Release TX resources */ |
---|