Loading drivers/tty/serial/msm_geni_serial.c +82 −29 Original line number Diff line number Diff line Loading @@ -115,7 +115,7 @@ #define WAIT_XFER_MIN_TIMEOUT_US (9000) #define IPC_LOG_PWR_PAGES (6) #define IPC_LOG_MISC_PAGES (10) #define IPC_LOG_TX_RX_PAGES (8) #define IPC_LOG_TX_RX_PAGES (10) #define DATA_BYTES_PER_LINE (32) #define IPC_LOG_MSG(ctx, x...) do { \ Loading Loading @@ -913,6 +913,8 @@ static int msm_geni_serial_prep_dma_tx(struct uart_port *uport) struct msm_geni_serial_port *msm_port = GET_DEV_PORT(uport); struct circ_buf *xmit = &uport->state->xmit; unsigned int xmit_size; u32 geni_status; bool done = false; int ret = 0; xmit_size = uart_circ_chars_pending(xmit); Loading @@ -932,25 +934,39 @@ static int msm_geni_serial_prep_dma_tx(struct uart_port *uport) &xmit->buf[xmit->tail], xmit_size, &msm_port->tx_dma); if (!ret) { msm_port->xmit_size = xmit_size; } else { return ret; } IPC_LOG_MSG(msm_port->ipc_log_misc, "%s: TX DMA map Fail %d\n", __func__, ret); geni_write_reg_nolog(0, uport->membase, SE_UART_TX_TRANS_LEN); geni_cancel_m_cmd(uport->membase); if (!msm_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, M_CMD_CANCEL_EN, true)) { geni_status = geni_read_reg_nolog(uport->membase, SE_GENI_STATUS); IPC_LOG_MSG(msm_port->ipc_log_misc, "%s: TX Cancel Fail 0x%x\n", __func__, geni_status); geni_abort_m_cmd(uport->membase); msm_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, M_CMD_ABORT_EN, true); done = msm_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, M_CMD_ABORT_EN, true); if (!done) { geni_status = geni_read_reg_nolog(uport->membase, SE_GENI_STATUS); IPC_LOG_MSG(msm_port->ipc_log_misc, "%s: TX Abort fail 0x%x\n", __func__, geni_status); } geni_write_reg_nolog(M_CMD_ABORT_EN, uport->membase, SE_GENI_M_IRQ_CLEAR); } geni_write_reg_nolog(M_CMD_CANCEL_EN, uport->membase, SE_GENI_M_IRQ_CLEAR); IPC_LOG_MSG(msm_port->ipc_log_tx, "%s: DMA map failure %d\n", __func__, ret); msm_port->tx_dma = (dma_addr_t)NULL; msm_port->xmit_size = 0; } return ret; } Loading Loading @@ -1037,6 +1053,7 @@ static void stop_tx_sequencer(struct uart_port *uport) unsigned int geni_m_irq_en; unsigned int geni_status; struct msm_geni_serial_port *port = GET_DEV_PORT(uport); bool done = false; geni_m_irq_en = geni_read_reg_nolog(uport->membase, SE_GENI_M_IRQ_EN); geni_m_irq_en &= ~M_CMD_DONE_EN; Loading @@ -1060,12 +1077,26 @@ static void stop_tx_sequencer(struct uart_port *uport) if (!(geni_status & M_GENI_CMD_ACTIVE)) return; IPC_LOG_MSG(port->ipc_log_misc, "%s: Start GENI: 0x%x\n", __func__, geni_status); geni_cancel_m_cmd(uport->membase); if (!msm_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, M_CMD_CANCEL_EN, true)) { geni_status = geni_read_reg_nolog(uport->membase, SE_GENI_STATUS); IPC_LOG_MSG(port->ipc_log_misc, "%s: TX Cancel Fail 0x%x\n", __func__, geni_status); geni_abort_m_cmd(uport->membase); msm_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, done = msm_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, M_CMD_ABORT_EN, true); if (!done) { geni_status = geni_read_reg_nolog(uport->membase, SE_GENI_STATUS); IPC_LOG_MSG(port->ipc_log_misc, "%s TX Abort fail 0x%x\n", __func__, geni_status); } geni_write_reg_nolog(M_CMD_ABORT_EN, uport->membase, SE_GENI_M_IRQ_CLEAR); } Loading @@ -1082,7 +1113,9 @@ static void stop_tx_sequencer(struct uart_port *uport) IPC_LOG_MSG(port->ipc_log_misc, "%s:Removing vote\n", __func__); msm_geni_serial_power_off(uport); } IPC_LOG_MSG(port->ipc_log_misc, "%s:\n", __func__); geni_status = geni_read_reg_nolog(uport->membase, SE_GENI_STATUS); IPC_LOG_MSG(port->ipc_log_misc, "%s: End GENI:0x%x\n", __func__, geni_status); } static void msm_geni_serial_stop_tx(struct uart_port *uport) Loading Loading @@ -1110,6 +1143,9 @@ static void start_rx_sequencer(struct uart_port *uport) return; geni_status = geni_read_reg_nolog(uport->membase, SE_GENI_STATUS); IPC_LOG_MSG(port->ipc_log_misc, "%s: 0x%x\n", __func__, geni_status); if (geni_status & S_GENI_CMD_ACTIVE) { if (port->xfer_mode == SE_DMA) { IPC_LOG_MSG(port->ipc_log_misc, Loading Loading @@ -1203,14 +1239,14 @@ static void msm_geni_serial_set_manual_flow(bool enable, * doing a stop_rx. */ mb(); IPC_LOG_MSG(port->ipc_log_pwr, IPC_LOG_MSG(port->ipc_log_misc, "%s: Manual Flow Enabled, HW Flow OFF\n", __func__); } else { geni_write_reg_nolog(0, port->uport.membase, SE_UART_MANUAL_RFR); /* Ensure that the manual flow off writes go through */ mb(); IPC_LOG_MSG(port->ipc_log_pwr, IPC_LOG_MSG(port->ipc_log_misc, "%s: Manual Flow Disabled, HW Flow ON\n", __func__); } } Loading @@ -1224,7 +1260,6 @@ static void stop_rx_sequencer(struct uart_port *uport) u32 irq_clear = S_CMD_CANCEL_EN; bool done; IPC_LOG_MSG(port->ipc_log_misc, "%s\n", __func__); if (port->xfer_mode == FIFO_MODE) { geni_s_irq_en = geni_read_reg_nolog(uport->membase, SE_GENI_S_IRQ_EN); Loading @@ -1244,6 +1279,8 @@ static void stop_rx_sequencer(struct uart_port *uport) if (!(geni_status & S_GENI_CMD_ACTIVE)) goto exit_rx_seq; IPC_LOG_MSG(port->ipc_log_misc, "%s: Start 0x%x\n", __func__, geni_status); geni_cancel_s_cmd(uport->membase); /* * Ensure that the cancel goes through before polling for the Loading Loading @@ -1275,7 +1312,8 @@ static void stop_rx_sequencer(struct uart_port *uport) msm_geni_serial_rx_fsm_rst(uport); geni_status = geni_read_reg_nolog(uport->membase, SE_GENI_STATUS); IPC_LOG_MSG(port->ipc_log_misc, "%s: 0x%x\n", __func__, geni_status); IPC_LOG_MSG(port->ipc_log_misc, "%s: End 0x%x\n", __func__, geni_status); } static void msm_geni_serial_stop_rx(struct uart_port *uport) Loading Loading @@ -1460,8 +1498,11 @@ static int msm_geni_serial_handle_dma_rx(struct uart_port *uport, bool drop_rx) geni_status = geni_read_reg_nolog(uport->membase, SE_GENI_STATUS); /* Possible stop rx is called */ if (!(geni_status & S_GENI_CMD_ACTIVE)) if (!(geni_status & S_GENI_CMD_ACTIVE)) { IPC_LOG_MSG(msm_port->ipc_log_misc, "%s: GENI: 0x%x\n", __func__, geni_status); return 0; } if (unlikely(!msm_port->rx_buf)) { IPC_LOG_MSG(msm_port->ipc_log_rx, "%s: NULL Rx_buf\n", Loading Loading @@ -1730,6 +1771,7 @@ static void msm_geni_serial_shutdown(struct uart_port *uport) unsigned long flags; int ret; IPC_LOG_MSG(msm_port->ipc_log_misc, "%s:\n", __func__); /* Stop the console before stopping the current tx */ if (uart_console(uport)) { console_stop(uport->cons); Loading Loading @@ -1770,7 +1812,7 @@ static void msm_geni_serial_shutdown(struct uart_port *uport) free_irq(msm_port->wakeup_irq, uport); } } IPC_LOG_MSG(msm_port->ipc_log_misc, "%s\n", __func__); IPC_LOG_MSG(msm_port->ipc_log_misc, "%s: End\n", __func__); } static int msm_geni_serial_port_setup(struct uart_port *uport) Loading Loading @@ -1864,6 +1906,7 @@ static int msm_geni_serial_startup(struct uart_port *uport) int ret = 0; struct msm_geni_serial_port *msm_port = GET_DEV_PORT(uport); IPC_LOG_MSG(msm_port->ipc_log_misc, "%s:\n", __func__); scnprintf(msm_port->name, sizeof(msm_port->name), "msm_serial_geni%d", uport->line); Loading @@ -1880,9 +1923,14 @@ static int msm_geni_serial_startup(struct uart_port *uport) get_tx_fifo_size(msm_port); if (!msm_port->port_setup) { if (msm_geni_serial_port_setup(uport)) ret = msm_geni_serial_port_setup(uport); if (ret) { IPC_LOG_MSG(msm_port->ipc_log_misc, "%s: port_setup Fail ret:%d\n", __func__, ret); goto exit_startup; } } /* * Ensure that all the port configuration writes complete Loading Loading @@ -1914,11 +1962,11 @@ static int msm_geni_serial_startup(struct uart_port *uport) goto exit_startup; } } IPC_LOG_MSG(msm_port->ipc_log_misc, "%s\n", __func__); exit_startup: if (likely(!uart_console(uport))) msm_geni_serial_power_off(&msm_port->uport); msm_port->startup_in_progress = false; IPC_LOG_MSG(msm_port->ipc_log_misc, "%s: ret:%d\n", __func__, ret); return ret; } Loading Loading @@ -2850,9 +2898,14 @@ static int msm_geni_serial_probe(struct platform_device *pdev) ret = msm_geni_serial_get_ver_info(uport); if (ret) goto exit_geni_serial_probe; IPC_LOG_MSG(dev_port->ipc_log_misc, "%s: port:%s irq:%d\n", __func__, uport->name, uport->irq); return uart_add_one_port(drv, uport); exit_geni_serial_probe: IPC_LOG_MSG(dev_port->ipc_log_misc, "%s: fail port:%s ret:%d\n", __func__, uport->name, ret); return ret; } Loading Loading
drivers/tty/serial/msm_geni_serial.c +82 −29 Original line number Diff line number Diff line Loading @@ -115,7 +115,7 @@ #define WAIT_XFER_MIN_TIMEOUT_US (9000) #define IPC_LOG_PWR_PAGES (6) #define IPC_LOG_MISC_PAGES (10) #define IPC_LOG_TX_RX_PAGES (8) #define IPC_LOG_TX_RX_PAGES (10) #define DATA_BYTES_PER_LINE (32) #define IPC_LOG_MSG(ctx, x...) do { \ Loading Loading @@ -913,6 +913,8 @@ static int msm_geni_serial_prep_dma_tx(struct uart_port *uport) struct msm_geni_serial_port *msm_port = GET_DEV_PORT(uport); struct circ_buf *xmit = &uport->state->xmit; unsigned int xmit_size; u32 geni_status; bool done = false; int ret = 0; xmit_size = uart_circ_chars_pending(xmit); Loading @@ -932,25 +934,39 @@ static int msm_geni_serial_prep_dma_tx(struct uart_port *uport) &xmit->buf[xmit->tail], xmit_size, &msm_port->tx_dma); if (!ret) { msm_port->xmit_size = xmit_size; } else { return ret; } IPC_LOG_MSG(msm_port->ipc_log_misc, "%s: TX DMA map Fail %d\n", __func__, ret); geni_write_reg_nolog(0, uport->membase, SE_UART_TX_TRANS_LEN); geni_cancel_m_cmd(uport->membase); if (!msm_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, M_CMD_CANCEL_EN, true)) { geni_status = geni_read_reg_nolog(uport->membase, SE_GENI_STATUS); IPC_LOG_MSG(msm_port->ipc_log_misc, "%s: TX Cancel Fail 0x%x\n", __func__, geni_status); geni_abort_m_cmd(uport->membase); msm_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, M_CMD_ABORT_EN, true); done = msm_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, M_CMD_ABORT_EN, true); if (!done) { geni_status = geni_read_reg_nolog(uport->membase, SE_GENI_STATUS); IPC_LOG_MSG(msm_port->ipc_log_misc, "%s: TX Abort fail 0x%x\n", __func__, geni_status); } geni_write_reg_nolog(M_CMD_ABORT_EN, uport->membase, SE_GENI_M_IRQ_CLEAR); } geni_write_reg_nolog(M_CMD_CANCEL_EN, uport->membase, SE_GENI_M_IRQ_CLEAR); IPC_LOG_MSG(msm_port->ipc_log_tx, "%s: DMA map failure %d\n", __func__, ret); msm_port->tx_dma = (dma_addr_t)NULL; msm_port->xmit_size = 0; } return ret; } Loading Loading @@ -1037,6 +1053,7 @@ static void stop_tx_sequencer(struct uart_port *uport) unsigned int geni_m_irq_en; unsigned int geni_status; struct msm_geni_serial_port *port = GET_DEV_PORT(uport); bool done = false; geni_m_irq_en = geni_read_reg_nolog(uport->membase, SE_GENI_M_IRQ_EN); geni_m_irq_en &= ~M_CMD_DONE_EN; Loading @@ -1060,12 +1077,26 @@ static void stop_tx_sequencer(struct uart_port *uport) if (!(geni_status & M_GENI_CMD_ACTIVE)) return; IPC_LOG_MSG(port->ipc_log_misc, "%s: Start GENI: 0x%x\n", __func__, geni_status); geni_cancel_m_cmd(uport->membase); if (!msm_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, M_CMD_CANCEL_EN, true)) { geni_status = geni_read_reg_nolog(uport->membase, SE_GENI_STATUS); IPC_LOG_MSG(port->ipc_log_misc, "%s: TX Cancel Fail 0x%x\n", __func__, geni_status); geni_abort_m_cmd(uport->membase); msm_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, done = msm_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, M_CMD_ABORT_EN, true); if (!done) { geni_status = geni_read_reg_nolog(uport->membase, SE_GENI_STATUS); IPC_LOG_MSG(port->ipc_log_misc, "%s TX Abort fail 0x%x\n", __func__, geni_status); } geni_write_reg_nolog(M_CMD_ABORT_EN, uport->membase, SE_GENI_M_IRQ_CLEAR); } Loading @@ -1082,7 +1113,9 @@ static void stop_tx_sequencer(struct uart_port *uport) IPC_LOG_MSG(port->ipc_log_misc, "%s:Removing vote\n", __func__); msm_geni_serial_power_off(uport); } IPC_LOG_MSG(port->ipc_log_misc, "%s:\n", __func__); geni_status = geni_read_reg_nolog(uport->membase, SE_GENI_STATUS); IPC_LOG_MSG(port->ipc_log_misc, "%s: End GENI:0x%x\n", __func__, geni_status); } static void msm_geni_serial_stop_tx(struct uart_port *uport) Loading Loading @@ -1110,6 +1143,9 @@ static void start_rx_sequencer(struct uart_port *uport) return; geni_status = geni_read_reg_nolog(uport->membase, SE_GENI_STATUS); IPC_LOG_MSG(port->ipc_log_misc, "%s: 0x%x\n", __func__, geni_status); if (geni_status & S_GENI_CMD_ACTIVE) { if (port->xfer_mode == SE_DMA) { IPC_LOG_MSG(port->ipc_log_misc, Loading Loading @@ -1203,14 +1239,14 @@ static void msm_geni_serial_set_manual_flow(bool enable, * doing a stop_rx. */ mb(); IPC_LOG_MSG(port->ipc_log_pwr, IPC_LOG_MSG(port->ipc_log_misc, "%s: Manual Flow Enabled, HW Flow OFF\n", __func__); } else { geni_write_reg_nolog(0, port->uport.membase, SE_UART_MANUAL_RFR); /* Ensure that the manual flow off writes go through */ mb(); IPC_LOG_MSG(port->ipc_log_pwr, IPC_LOG_MSG(port->ipc_log_misc, "%s: Manual Flow Disabled, HW Flow ON\n", __func__); } } Loading @@ -1224,7 +1260,6 @@ static void stop_rx_sequencer(struct uart_port *uport) u32 irq_clear = S_CMD_CANCEL_EN; bool done; IPC_LOG_MSG(port->ipc_log_misc, "%s\n", __func__); if (port->xfer_mode == FIFO_MODE) { geni_s_irq_en = geni_read_reg_nolog(uport->membase, SE_GENI_S_IRQ_EN); Loading @@ -1244,6 +1279,8 @@ static void stop_rx_sequencer(struct uart_port *uport) if (!(geni_status & S_GENI_CMD_ACTIVE)) goto exit_rx_seq; IPC_LOG_MSG(port->ipc_log_misc, "%s: Start 0x%x\n", __func__, geni_status); geni_cancel_s_cmd(uport->membase); /* * Ensure that the cancel goes through before polling for the Loading Loading @@ -1275,7 +1312,8 @@ static void stop_rx_sequencer(struct uart_port *uport) msm_geni_serial_rx_fsm_rst(uport); geni_status = geni_read_reg_nolog(uport->membase, SE_GENI_STATUS); IPC_LOG_MSG(port->ipc_log_misc, "%s: 0x%x\n", __func__, geni_status); IPC_LOG_MSG(port->ipc_log_misc, "%s: End 0x%x\n", __func__, geni_status); } static void msm_geni_serial_stop_rx(struct uart_port *uport) Loading Loading @@ -1460,8 +1498,11 @@ static int msm_geni_serial_handle_dma_rx(struct uart_port *uport, bool drop_rx) geni_status = geni_read_reg_nolog(uport->membase, SE_GENI_STATUS); /* Possible stop rx is called */ if (!(geni_status & S_GENI_CMD_ACTIVE)) if (!(geni_status & S_GENI_CMD_ACTIVE)) { IPC_LOG_MSG(msm_port->ipc_log_misc, "%s: GENI: 0x%x\n", __func__, geni_status); return 0; } if (unlikely(!msm_port->rx_buf)) { IPC_LOG_MSG(msm_port->ipc_log_rx, "%s: NULL Rx_buf\n", Loading Loading @@ -1730,6 +1771,7 @@ static void msm_geni_serial_shutdown(struct uart_port *uport) unsigned long flags; int ret; IPC_LOG_MSG(msm_port->ipc_log_misc, "%s:\n", __func__); /* Stop the console before stopping the current tx */ if (uart_console(uport)) { console_stop(uport->cons); Loading Loading @@ -1770,7 +1812,7 @@ static void msm_geni_serial_shutdown(struct uart_port *uport) free_irq(msm_port->wakeup_irq, uport); } } IPC_LOG_MSG(msm_port->ipc_log_misc, "%s\n", __func__); IPC_LOG_MSG(msm_port->ipc_log_misc, "%s: End\n", __func__); } static int msm_geni_serial_port_setup(struct uart_port *uport) Loading Loading @@ -1864,6 +1906,7 @@ static int msm_geni_serial_startup(struct uart_port *uport) int ret = 0; struct msm_geni_serial_port *msm_port = GET_DEV_PORT(uport); IPC_LOG_MSG(msm_port->ipc_log_misc, "%s:\n", __func__); scnprintf(msm_port->name, sizeof(msm_port->name), "msm_serial_geni%d", uport->line); Loading @@ -1880,9 +1923,14 @@ static int msm_geni_serial_startup(struct uart_port *uport) get_tx_fifo_size(msm_port); if (!msm_port->port_setup) { if (msm_geni_serial_port_setup(uport)) ret = msm_geni_serial_port_setup(uport); if (ret) { IPC_LOG_MSG(msm_port->ipc_log_misc, "%s: port_setup Fail ret:%d\n", __func__, ret); goto exit_startup; } } /* * Ensure that all the port configuration writes complete Loading Loading @@ -1914,11 +1962,11 @@ static int msm_geni_serial_startup(struct uart_port *uport) goto exit_startup; } } IPC_LOG_MSG(msm_port->ipc_log_misc, "%s\n", __func__); exit_startup: if (likely(!uart_console(uport))) msm_geni_serial_power_off(&msm_port->uport); msm_port->startup_in_progress = false; IPC_LOG_MSG(msm_port->ipc_log_misc, "%s: ret:%d\n", __func__, ret); return ret; } Loading Loading @@ -2850,9 +2898,14 @@ static int msm_geni_serial_probe(struct platform_device *pdev) ret = msm_geni_serial_get_ver_info(uport); if (ret) goto exit_geni_serial_probe; IPC_LOG_MSG(dev_port->ipc_log_misc, "%s: port:%s irq:%d\n", __func__, uport->name, uport->irq); return uart_add_one_port(drv, uport); exit_geni_serial_probe: IPC_LOG_MSG(dev_port->ipc_log_misc, "%s: fail port:%s ret:%d\n", __func__, uport->name, ret); return ret; } Loading