Loading msm/dsi/dsi_catalog.c +1 −0 Original line number Diff line number Diff line Loading @@ -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 = Loading msm/dsi/dsi_catalog.h +1 −0 Original line number Diff line number Diff line Loading @@ -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); Loading msm/dsi/dsi_ctrl.c +36 −0 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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) ? Loading msm/dsi/dsi_ctrl_hw.h +6 −0 Original line number Diff line number Diff line Loading @@ -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. Loading msm/dsi/dsi_ctrl_hw_cmn.c +27 −0 Original line number Diff line number Diff line Loading @@ -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. Loading Loading
msm/dsi/dsi_catalog.c +1 −0 Original line number Diff line number Diff line Loading @@ -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 = Loading
msm/dsi/dsi_catalog.h +1 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
msm/dsi/dsi_ctrl.c +36 −0 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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) ? Loading
msm/dsi/dsi_ctrl_hw.h +6 −0 Original line number Diff line number Diff line Loading @@ -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. Loading
msm/dsi/dsi_ctrl_hw_cmn.c +27 −0 Original line number Diff line number Diff line Loading @@ -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. Loading