Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1cbaaa15 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "serial: msm_geni_serial: Improve IPC logging in UART driver"

parents 84ee2f8e 8a3e1237
Loading
Loading
Loading
Loading
+82 −29
Original line number Diff line number Diff line
@@ -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 { \
@@ -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);
@@ -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;
}

@@ -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;
@@ -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);
	}
@@ -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)
@@ -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,
@@ -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__);
	}
}
@@ -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);
@@ -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
@@ -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)
@@ -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",
@@ -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);
@@ -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)
@@ -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);

@@ -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
@@ -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;
}
@@ -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;
}