From 25b6a3e7d1d9a816d93aa39decb045a4152fd268 Mon Sep 17 00:00:00 2001 From: Harigovindan P Date: Wed, 20 May 2020 11:40:44 +0530 Subject: [PATCH] disp: msm: dsi: Mask overflow error for Broadcast command Currently, for Dual DSI Broadcast command, Overflow error is masked only for master controller. This changes add support to mask overflow error for slave controller as well. Change-Id: Ida73c4166e996fcf2c8c936d0c76d0a89a220d89 Signed-off-by: Harigovindan P Signed-off-by: Ritesh Kumar Signed-off-by: Steve Cohen --- msm/dsi/dsi_ctrl.c | 39 +++++++++++++++++++++++++-------------- msm/dsi/dsi_ctrl.h | 7 +++++++ msm/dsi/dsi_display.c | 19 +++++++++++++++++++ 3 files changed, 51 insertions(+), 14 deletions(-) diff --git a/msm/dsi/dsi_ctrl.c b/msm/dsi/dsi_ctrl.c index a3e568889e..188455b26c 100644 --- a/msm/dsi/dsi_ctrl.c +++ b/msm/dsi/dsi_ctrl.c @@ -1361,9 +1361,7 @@ static void dsi_kickoff_msg_tx(struct dsi_ctrl *dsi_ctrl, if (!(flags & DSI_CTRL_CMD_DEFER_TRIGGER)) { dsi_ctrl_wait_for_video_done(dsi_ctrl); - if (dsi_hw_ops.mask_error_intr) - dsi_hw_ops.mask_error_intr(&dsi_ctrl->hw, - BIT(DSI_FIFO_OVERFLOW), true); + dsi_ctrl_mask_overflow(dsi_ctrl, true); atomic_set(&dsi_ctrl->dma_irq_trig, 0); dsi_ctrl_enable_status_interrupt(dsi_ctrl, @@ -1407,9 +1405,8 @@ static void dsi_kickoff_msg_tx(struct dsi_ctrl *dsi_ctrl, dsi_ctrl_dma_cmd_wait_for_done(&dsi_ctrl->dma_cmd_wait); } - if (dsi_hw_ops.mask_error_intr && !dsi_ctrl->esd_check_underway) - dsi_hw_ops.mask_error_intr(&dsi_ctrl->hw, - BIT(DSI_FIFO_OVERFLOW), false); + dsi_ctrl_mask_overflow(dsi_ctrl, false); + dsi_hw_ops.reset_cmd_fifo(&dsi_ctrl->hw); /* @@ -3316,6 +3313,28 @@ error: return rc; } +/** + * dsi_ctrl_mask_overflow() - API to mask/unmask overflow error. + * @dsi_ctrl: DSI controller handle. + * @enable: variable to control masking/unmasking. + */ +void dsi_ctrl_mask_overflow(struct dsi_ctrl *dsi_ctrl, bool enable) +{ + struct dsi_ctrl_hw_ops dsi_hw_ops; + + dsi_hw_ops = dsi_ctrl->hw.ops; + + if (enable) { + if (dsi_hw_ops.mask_error_intr) + dsi_hw_ops.mask_error_intr(&dsi_ctrl->hw, + BIT(DSI_FIFO_OVERFLOW), true); + } else { + if (dsi_hw_ops.mask_error_intr && !dsi_ctrl->esd_check_underway) + dsi_hw_ops.mask_error_intr(&dsi_ctrl->hw, + BIT(DSI_FIFO_OVERFLOW), false); + } +} + /** * dsi_ctrl_cmd_tx_trigger() - Trigger a deferred command. * @dsi_ctrl: DSI controller handle. @@ -3358,9 +3377,6 @@ int dsi_ctrl_cmd_tx_trigger(struct dsi_ctrl *dsi_ctrl, u32 flags) if ((flags & DSI_CTRL_CMD_BROADCAST) && (flags & DSI_CTRL_CMD_BROADCAST_MASTER)) { dsi_ctrl_wait_for_video_done(dsi_ctrl); - if (dsi_hw_ops.mask_error_intr) - dsi_hw_ops.mask_error_intr(&dsi_ctrl->hw, - BIT(DSI_FIFO_OVERFLOW), true); atomic_set(&dsi_ctrl->dma_irq_trig, 0); dsi_ctrl_enable_status_interrupt(dsi_ctrl, DSI_SINT_CMD_MODE_DMA_DONE, NULL); @@ -3388,11 +3404,6 @@ int dsi_ctrl_cmd_tx_trigger(struct dsi_ctrl *dsi_ctrl, u32 flags) dsi_ctrl_dma_cmd_wait_for_done(&dsi_ctrl->dma_cmd_wait); } - if (dsi_hw_ops.mask_error_intr && - !dsi_ctrl->esd_check_underway) - dsi_hw_ops.mask_error_intr(&dsi_ctrl->hw, - BIT(DSI_FIFO_OVERFLOW), false); - if (flags & DSI_CTRL_CMD_NON_EMBEDDED_MODE) { if (dsi_ctrl->version < DSI_CTRL_VERSION_2_4) dsi_hw_ops.soft_reset(&dsi_ctrl->hw); diff --git a/msm/dsi/dsi_ctrl.h b/msm/dsi/dsi_ctrl.h index 8f26332ea1..d07c8f8321 100644 --- a/msm/dsi/dsi_ctrl.h +++ b/msm/dsi/dsi_ctrl.h @@ -876,4 +876,11 @@ int dsi_ctrl_wait4dynamic_refresh_done(struct dsi_ctrl *ctrl); */ int dsi_ctrl_get_io_resources(struct msm_io_res *io_res); +/** + * dsi_ctrl_mask_overflow() - API to mask/unmask overflow errors. + * @dsi_ctrl: DSI controller handle. + * @enable: variable to control masking/unmasking. + */ +void dsi_ctrl_mask_overflow(struct dsi_ctrl *dsi_ctrl, bool enable); + #endif /* _DSI_CTRL_H_ */ diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c index 120445b887..f96de6f47a 100644 --- a/msm/dsi/dsi_display.c +++ b/msm/dsi/dsi_display.c @@ -2969,6 +2969,23 @@ static int dsi_display_wake_up(struct dsi_display *display) return 0; } +static void dsi_display_mask_overflow(struct dsi_display *display, u32 flags, + bool enable) +{ + struct dsi_display_ctrl *ctrl; + int i; + + if (!(flags & DSI_CTRL_CMD_LAST_COMMAND)) + return; + + display_for_each_ctrl(i, display) { + ctrl = &display->ctrl[i]; + if (!ctrl) + continue; + dsi_ctrl_mask_overflow(ctrl->ctrl, enable); + } +} + static int dsi_display_broadcast_cmd(struct dsi_display *display, const struct mipi_dsi_msg *msg) { @@ -3004,6 +3021,7 @@ static int dsi_display_broadcast_cmd(struct dsi_display *display, * 2. Trigger commands */ m_ctrl = &display->ctrl[display->cmd_master_idx]; + dsi_display_mask_overflow(display, m_flags, true); rc = dsi_ctrl_cmd_transfer(m_ctrl->ctrl, msg, &m_flags); if (rc) { DSI_ERR("[%s] cmd transfer failed on master,rc=%d\n", @@ -3039,6 +3057,7 @@ static int dsi_display_broadcast_cmd(struct dsi_display *display, } error: + dsi_display_mask_overflow(display, m_flags, false); return rc; }