diff options
author | Chanho Min <chanho.min@lge.com> | 2013-03-27 18:38:11 +0900 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-03-29 09:20:05 -0700 |
commit | cb06ff102e2d79a82cf780aa5e6947b2e0529ac0 (patch) | |
tree | d911b0dff244219c60a7b94391f7c47bc0e9e758 /include/linux/amba | |
parent | e302cd932094fa59463b5891814d2a5ace56cfc1 (diff) | |
download | op-kernel-dev-cb06ff102e2d79a82cf780aa5e6947b2e0529ac0.zip op-kernel-dev-cb06ff102e2d79a82cf780aa5e6947b2e0529ac0.tar.gz |
ARM: PL011: Add support for Rx DMA buffer polling.
In DMA support, The received data is not pushed to tty until the DMA buffer
is filled. But some megabyte rate chips such as BT expect fast response and
data should be pushed immediately. In order to fix this issue, We suggest
the use of the timer for polling DMA buffer.
In our test, no data loss occurred at high-baudrate as compared with interrupt-
driven (We tested with 3Mbps).
We changes:
- We add timer for polling. If we set poll_timer to 10, every 10ms,
timer handler checks the residue in the dma buffer and transfer data
to the tty. Also, last_residue is updated for the next polling.
- poll_timeout is used to prevent the timer's system cost.
If poll_timeout is set to 3000 and no data is received in 3 seconds,
we inactivate poll timer and driver falls back to interrupt-driven.
When data is received again in FIFO and UART irq is occurred, we switch
back to DMA mode and start polling.
- We use consistent DMA mappings to avoid from the frequent cache operation
of the timer function for default.
- pl011_dma_rx_chars is modified. the pending size is recalculated because
data can be taken by polling.
- the polling time is adjusted if dma rx poll is enabled but no rate is
specified. Ideal polling interval to push 1 character at every interval
is the reciprocal of 'baud rate / 10 line bits per character / 1000 ms
per sec'. But It is very aggressive to system. Experimentally,
'10000000 / baud' is suitable to receive dozens of characters. the poll rate
can be specified statically by dma_rx_poll_rate of the platform data as well.
Changes compared to v1:
- Use of consistent DMA mappings.
- Added dma_rx_poll_rate in platform data to specify the polling interval.
- Added dma_rx_poll_timeout in platform data to specify the polling timeout.
Changes compared to v2:
- Use of consistent DMA mappings for default.
- Added dma_rx_poll_enable in platform data to adjust the polling time
according to the baud rate.
- remove unnecessary lock from the polling function.
Signed-off-by: Chanho Min <chanho.min@lge.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'include/linux/amba')
-rw-r--r-- | include/linux/amba/serial.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/include/linux/amba/serial.h b/include/linux/amba/serial.h index f612c78..62d9303 100644 --- a/include/linux/amba/serial.h +++ b/include/linux/amba/serial.h @@ -203,6 +203,9 @@ struct amba_pl011_data { bool (*dma_filter)(struct dma_chan *chan, void *filter_param); void *dma_rx_param; void *dma_tx_param; + bool dma_rx_poll_enable; + unsigned int dma_rx_poll_rate; + unsigned int dma_rx_poll_timeout; void (*init) (void); void (*exit) (void); }; |