diff options
Diffstat (limited to 'drivers/tty')
-rw-r--r-- | drivers/tty/serial/msm_serial_hs.c | 32 | ||||
-rw-r--r-- | drivers/tty/serial/msm_serial_hs_hwreg.h | 5 |
2 files changed, 16 insertions, 21 deletions
diff --git a/drivers/tty/serial/msm_serial_hs.c b/drivers/tty/serial/msm_serial_hs.c index 5607191b3a4c..573f8e8a3353 100644 --- a/drivers/tty/serial/msm_serial_hs.c +++ b/drivers/tty/serial/msm_serial_hs.c @@ -253,7 +253,6 @@ struct msm_hs_port { struct workqueue_struct *hsuart_wq; /* hsuart workqueue */ struct mutex clk_mutex; /* mutex to guard against clock off/clock on */ struct work_struct disconnect_rx_endpoint; /* disconnect rx_endpoint */ - bool tty_flush_receive; enum uart_core_type uart_type; unsigned long bam_handle; resource_size_t bam_mem; @@ -321,6 +320,7 @@ unsigned int regmap_blsp[UART_DM_LAST] = { [UART_DM_TXFS] = 0x4c, [UART_DM_RXFS] = 0x50, [UART_DM_RX_TRANS_CTRL] = 0xcc, + [UART_DM_BCR] = 0xc8, }; static struct of_device_id msm_hs_match_table[] = { @@ -1854,12 +1854,13 @@ static void msm_serial_hs_tx_tlet(unsigned long tlet_ptr) * Do the work buffer related work in BAM * mode that is equivalent to legacy mode */ + spin_lock_irqsave(&(msm_uport->uport.lock), flags); - if (!msm_uport->tty_flush_receive) + if (!uart_circ_empty(tx_buf)) tx_buf->tail = (tx_buf->tail + tx->tx_count) & ~UART_XMIT_SIZE; else - msm_uport->tty_flush_receive = false; + MSM_HS_DBG("%s:circ buffer is empty\n", __func__); tx->dma_in_flight = 0; @@ -1876,7 +1877,6 @@ static void msm_serial_hs_tx_tlet(unsigned long tlet_ptr) if (uart_circ_chars_pending(tx_buf) < WAKEUP_CHARS) uart_write_wakeup(uport); - spin_lock_irqsave(&(msm_uport->uport.lock), flags); if (msm_uport->tx.flush == FLUSH_STOP) { msm_uport->tx.flush = FLUSH_SHUTDOWN; wake_up(&msm_uport->tx.wait); @@ -2052,14 +2052,6 @@ static void msm_hs_enable_ms_locked(struct uart_port *uport) } -static void msm_hs_flush_buffer(struct uart_port *uport) -{ - struct msm_hs_port *msm_uport = UARTDM_TO_MSM(uport); - - if (msm_uport->tx.dma_in_flight) - msm_uport->tty_flush_receive = true; -} - /* * Standard API, Break Signal * @@ -2211,7 +2203,6 @@ static int msm_hs_check_clock_off(struct uart_port *uport) */ disable_irq(uport->irq); } - disable_irq(uport->irq); wake_unlock(&msm_uport->dma_wake_lock); spin_unlock_irqrestore(&uport->lock, flags); @@ -2304,11 +2295,9 @@ static irqreturn_t msm_hs_isr(int irq, void *dev) /* Do not update tx_buf.tail if uart_flush_buffer already * called in serial core */ - if (!msm_uport->tty_flush_receive) + if (!uart_circ_empty(tx_buf)) tx_buf->tail = (tx_buf->tail + tx->tx_count) & ~UART_XMIT_SIZE; - else - msm_uport->tty_flush_receive = false; tx->dma_in_flight = 0; @@ -2406,7 +2395,6 @@ void msm_hs_request_clock_on(struct uart_port *uport) mutex_lock(&msm_uport->clk_mutex); spin_lock_irqsave(&uport->lock, flags); - enable_irq(uport->irq); if (msm_uport->clk_state == MSM_HS_CLK_REQUEST_OFF) { /* Pulling RFR line high */ @@ -2691,7 +2679,11 @@ static int msm_hs_startup(struct uart_port *uport) } } - msm_hs_write(uport, UARTDM_BCR_ADDR, 0x003F); + data = (UARTDM_BCR_TX_BREAK_DISABLE | UARTDM_BCR_STALE_IRQ_EMPTY | + UARTDM_BCR_RX_DMRX_LOW_EN | UARTDM_BCR_RX_STAL_IRQ_DMRX_EQL | + UARTDM_BCR_RX_DMRX_1BYTE_RES_EN); + msm_hs_write(uport, UART_DM_BCR, data); + /* Set auto RFR Level */ data = msm_hs_read(uport, UART_DM_MR1); data &= ~UARTDM_MR1_AUTO_RFR_LEVEL1_BMSK; @@ -2734,8 +2726,6 @@ static int msm_hs_startup(struct uart_port *uport) tx->tx_ready_int_en = 0; tx->dma_in_flight = 0; rx->rx_cmd_exec = false; - msm_uport->tty_flush_receive = false; - MSM_HS_DBG("%s: Setting tty_flush_receive to false\n", __func__); if (!is_blsp_uart(msm_uport)) { tx->xfer.complete_func = msm_hs_dmov_tx_callback; @@ -3800,7 +3790,7 @@ static struct uart_ops msm_hs_ops = { .config_port = msm_hs_config_port, .release_port = msm_hs_release_port, .request_port = msm_hs_request_port, - .flush_buffer = msm_hs_flush_buffer, + .flush_buffer = NULL, .ioctl = msm_hs_ioctl, }; diff --git a/drivers/tty/serial/msm_serial_hs_hwreg.h b/drivers/tty/serial/msm_serial_hs_hwreg.h index d912b9f2a2a2..064bbda421df 100644 --- a/drivers/tty/serial/msm_serial_hs_hwreg.h +++ b/drivers/tty/serial/msm_serial_hs_hwreg.h @@ -81,6 +81,7 @@ enum msm_hs_regs { UART_DM_TXFS, UART_DM_RXFS, UART_DM_RX_TRANS_CTRL, + UART_DM_BCR, UART_DM_LAST, }; @@ -94,7 +95,11 @@ enum msm_hs_regs { * UARTDM Core v1.4 STALE_IRQ_EMPTY bit defination * Stale interrupt will fire if bit is set when RX-FIFO is empty */ +#define UARTDM_BCR_TX_BREAK_DISABLE 0x1 #define UARTDM_BCR_STALE_IRQ_EMPTY 0x2 +#define UARTDM_BCR_RX_DMRX_LOW_EN 0x4 +#define UARTDM_BCR_RX_STAL_IRQ_DMRX_EQL 0x10 +#define UARTDM_BCR_RX_DMRX_1BYTE_RES_EN 0x20 /* TRANSFER_CONTROL Register for UARTDM Core v1.4 */ #define UARTDM_RX_TRANS_CTRL_ADDR 0xcc |