• Chanho Min's avatar
    ARM: PL011: Add support for Rx DMA buffer polling. · cb06ff10
    Chanho Min authored
    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: default avatarChanho Min <chanho.min@lge.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    cb06ff10
amba-pl011.c 57.6 KB