On 4/27/26 15:56, Guido Günther wrote:
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

This error is un unprepare, the link should be in LP11 so the command should 
still work,
but you can move them to disable(), but in the other way you should still keep 
the
power on commands in prepare() since the link is in LP11 and video is not 
flowing.

Neil


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


Reply via email to