It's when DSI commands should be sent and it also fixes these DSI errors
on every screen blank/unblank on the SHIFT6mq:

dmesg:
  msm_dsi ae94000.dsi: [drm:dsi_cmds2buf_tx] *ERROR* wait for video done timed 
out
  dsi_cmds2buf_tx: cmd dma tx failed, type=0x5, data0=0x28, len=4, ret=-110
  panel-visionox-rm69299 ae94000.dsi.0: sending DCS SET_DISPLAY_OFF failed: -110

Signed-off-by: Guido Günther <[email protected]>
---
 drivers/gpu/drm/panel/panel-visionox-rm69299.c | 77 +++++++++++++++-----------
 1 file changed, 44 insertions(+), 33 deletions(-)

diff --git a/drivers/gpu/drm/panel/panel-visionox-rm69299.c 
b/drivers/gpu/drm/panel/panel-visionox-rm69299.c
index f1430370ff94..3c92a6ceb8df 100644
--- a/drivers/gpu/drm/panel/panel-visionox-rm69299.c
+++ b/drivers/gpu/drm/panel/panel-visionox-rm69299.c
@@ -158,6 +158,46 @@ static inline struct visionox_rm69299 *panel_to_ctx(struct 
drm_panel *panel)
        return container_of(panel, struct visionox_rm69299, panel);
 }
 
+static int visionox_rm69299_enable(struct drm_panel *panel)
+{
+       struct visionox_rm69299 *ctx = panel_to_ctx(panel);
+       struct mipi_dsi_multi_context dsi_ctx = { .dsi = ctx->dsi };
+
+       ctx->dsi->mode_flags |= MIPI_DSI_MODE_LPM;
+
+       for (int i = 0; i < ctx->desc->init_seq_len; i++)
+               mipi_dsi_dcs_write_buffer_multi(&dsi_ctx, 
&ctx->desc->init_seq[i * 2], 2);
+
+       mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
+
+       /* Per DSI spec wait 120ms after sending exit sleep DCS command */
+       mipi_dsi_msleep(&dsi_ctx, 120);
+
+       mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
+
+       /* Per DSI spec wait 120ms after sending set_display_on DCS command */
+       mipi_dsi_msleep(&dsi_ctx, 120);
+
+       return dsi_ctx.accum_err;
+}
+
+static int visionox_rm69299_disable(struct drm_panel *panel)
+{
+       struct visionox_rm69299 *ctx = panel_to_ctx(panel);
+       struct mipi_dsi_multi_context dsi_ctx = { .dsi = ctx->dsi };
+
+       ctx->dsi->mode_flags &= ~MIPI_DSI_MODE_LPM;
+
+       mipi_dsi_dcs_set_display_off_multi(&dsi_ctx);
+
+       /* 120ms delay required here as per DCS spec */
+       mipi_dsi_msleep(&dsi_ctx, 120);
+
+       mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx);
+
+       return dsi_ctx.accum_err;
+}
+
 static int visionox_rm69299_power_on(struct visionox_rm69299 *ctx)
 {
        int ret;
@@ -193,16 +233,6 @@ static int visionox_rm69299_power_off(struct 
visionox_rm69299 *ctx)
 static int visionox_rm69299_unprepare(struct drm_panel *panel)
 {
        struct visionox_rm69299 *ctx = panel_to_ctx(panel);
-       struct mipi_dsi_multi_context dsi_ctx = { .dsi = ctx->dsi };
-
-       ctx->dsi->mode_flags &= ~MIPI_DSI_MODE_LPM;
-
-       mipi_dsi_dcs_set_display_off_multi(&dsi_ctx);
-
-       /* 120ms delay required here as per DCS spec */
-       mipi_dsi_msleep(&dsi_ctx, 120);
-
-       mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx);
 
        return visionox_rm69299_power_off(ctx);
 }
@@ -210,29 +240,8 @@ static int visionox_rm69299_unprepare(struct drm_panel 
*panel)
 static int visionox_rm69299_prepare(struct drm_panel *panel)
 {
        struct visionox_rm69299 *ctx = panel_to_ctx(panel);
-       struct mipi_dsi_multi_context dsi_ctx = { .dsi = ctx->dsi };
-       int ret, i;
 
-       ret = visionox_rm69299_power_on(ctx);
-       if (ret < 0)
-               return ret;
-
-       ctx->dsi->mode_flags |= MIPI_DSI_MODE_LPM;
-
-       for (i = 0; i < ctx->desc->init_seq_len; i++)
-               mipi_dsi_dcs_write_buffer_multi(&dsi_ctx, 
&ctx->desc->init_seq[i * 2], 2);
-
-       mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
-
-       /* Per DSI spec wait 120ms after sending exit sleep DCS command */
-       mipi_dsi_msleep(&dsi_ctx, 120);
-
-       mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
-
-       /* Per DSI spec wait 120ms after sending set_display_on DCS command */
-       mipi_dsi_msleep(&dsi_ctx, 120);
-
-       return dsi_ctx.accum_err;
+       return visionox_rm69299_power_on(ctx);
 }
 
 static const struct drm_display_mode visionox_rm69299_1080x2248_60hz = {
@@ -284,7 +293,9 @@ static int visionox_rm69299_get_modes(struct drm_panel 
*panel,
 
 static const struct drm_panel_funcs visionox_rm69299_drm_funcs = {
        .unprepare = visionox_rm69299_unprepare,
-       .prepare = visionox_rm69299_prepare,
+       .disable   = visionox_rm69299_disable,
+       .prepare   = visionox_rm69299_prepare,
+       .enable    = visionox_rm69299_enable,
        .get_modes = visionox_rm69299_get_modes,
 };
 

-- 
2.53.0


Reply via email to