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

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

Merge "disp: msm: clear dma done interrupt status for slave controller"

parents 93f543c0 1b9d7657
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ static void dsi_catalog_cmn_init(struct dsi_ctrl_hw *ctrl,
	ctrl->ops.reset_cmd_fifo         = dsi_ctrl_hw_cmn_reset_cmd_fifo;
	ctrl->ops.trigger_command_dma    = dsi_ctrl_hw_cmn_trigger_command_dma;
	ctrl->ops.get_interrupt_status   = dsi_ctrl_hw_cmn_get_interrupt_status;
	ctrl->ops.poll_slave_dma_status  = dsi_ctrl_hw_cmn_poll_slave_dma_status;
	ctrl->ops.get_error_status       = dsi_ctrl_hw_cmn_get_error_status;
	ctrl->ops.clear_error_status     = dsi_ctrl_hw_cmn_clear_error_status;
	ctrl->ops.clear_interrupt_status =
+1 −0
Original line number Diff line number Diff line
@@ -128,6 +128,7 @@ void dsi_phy_hw_v4_0_commit_phy_timing(struct dsi_phy_hw *phy,

/* DSI controller common ops */
u32 dsi_ctrl_hw_cmn_get_interrupt_status(struct dsi_ctrl_hw *ctrl);
u32 dsi_ctrl_hw_cmn_poll_slave_dma_status(struct dsi_ctrl_hw *ctrl);
void dsi_ctrl_hw_cmn_clear_interrupt_status(struct dsi_ctrl_hw *ctrl, u32 ints);
void dsi_ctrl_hw_cmn_enable_status_interrupts(struct dsi_ctrl_hw *ctrl,
					     u32 ints);
+36 −0
Original line number Diff line number Diff line
@@ -1505,6 +1505,39 @@ static void dsi_ctrl_validate_msg_flags(struct dsi_ctrl *dsi_ctrl,
		*flags &= ~DSI_CTRL_CMD_ASYNC_WAIT;
}

/**
 * dsi_ctrl_clear_slave_dma_status -   API to clear slave DMA status
 * @dsi_ctrl:                   DSI controller handle.
 * @flags:                      Modifiers
 */
static void dsi_ctrl_clear_slave_dma_status(struct dsi_ctrl *dsi_ctrl, u32 flags)
{
	struct dsi_ctrl_hw_ops dsi_hw_ops;
	u32 status = 0;

	if (!dsi_ctrl) {
		DSI_CTRL_ERR(dsi_ctrl, "Invalid params\n");
		return;
	}

	/* Return if this is not the last command */
	if (!(flags & DSI_CTRL_CMD_LAST_COMMAND))
		return;

	SDE_EVT32(dsi_ctrl->cell_index, SDE_EVTLOG_FUNC_ENTRY);

	dsi_hw_ops = dsi_ctrl->hw.ops;

	status = dsi_hw_ops.poll_slave_dma_status(&dsi_ctrl->hw);

	if (status) {
		status |= (DSI_CMD_MODE_DMA_DONE | DSI_BTA_DONE);
		dsi_hw_ops.clear_interrupt_status(&dsi_ctrl->hw,
						status);
		SDE_EVT32(dsi_ctrl->cell_index, status);
	}
}

static int dsi_message_tx(struct dsi_ctrl *dsi_ctrl,
			  const struct mipi_dsi_msg *msg,
			  u32 *flags)
@@ -1537,6 +1570,9 @@ static int dsi_message_tx(struct dsi_ctrl *dsi_ctrl,
	if (dsi_ctrl->dma_wait_queued)
		dsi_ctrl_flush_cmd_dma_queue(dsi_ctrl);

	if (!(*flags & DSI_CTRL_CMD_BROADCAST_MASTER))
		dsi_ctrl_clear_slave_dma_status(dsi_ctrl, *flags);

	if (*flags & DSI_CTRL_CMD_NON_EMBEDDED_MODE) {
		cmd_mem.offset = dsi_ctrl->cmd_buffer_iova;
		cmd_mem.en_broadcast = (*flags & DSI_CTRL_CMD_BROADCAST) ?
+6 −0
Original line number Diff line number Diff line
@@ -641,6 +641,12 @@ struct dsi_ctrl_hw_ops {
	 */
	void (*clear_interrupt_status)(struct dsi_ctrl_hw *ctrl, u32 ints);

	/**
	 * poll_slave_dma_status()- API to poll slave DMA status
	 * @ctrl:                 Pointer to the controller host hardware.
	 */
	u32 (*poll_slave_dma_status)(struct dsi_ctrl_hw *ctrl);

	/**
	 * enable_status_interrupts() - enable the specified interrupts
	 * @ctrl:          Pointer to the controller host hardware.
+27 −0
Original line number Diff line number Diff line
@@ -937,6 +937,33 @@ u32 dsi_ctrl_hw_cmn_get_cmd_read_data(struct dsi_ctrl_hw *ctrl,
	return rx_byte;
}

/**
 * poll_slave_dma_status() - API to clear poll DMA status
 * @ctrl:          Pointer to the controller host hardware.
 *
 * Return: DMA status.
 */
u32 dsi_ctrl_hw_cmn_poll_slave_dma_status(struct dsi_ctrl_hw *ctrl)
{
	int rc = 0;
	u32 status;
	u32 const delay_us = 10;
	u32 const timeout_us = 5000;

	rc = readl_poll_timeout_atomic(ctrl->base + DSI_INT_CTRL,
				      status,
				      ((status & DSI_CMD_MODE_DMA_DONE)
					> 0),
				      delay_us,
				      timeout_us);
	if (rc) {
		DSI_CTRL_HW_DBG(ctrl, "DSI1 CMD_MODE_DMA_DONE failed\n");
		status = 0;
	}

	return status;
}

/**
 * get_interrupt_status() - returns the interrupt status
 * @ctrl:          Pointer to the controller host hardware.