[PATCH 1/2] drm/panel: visionox-rm69299: Split DSI commands out into enable/disable
From: Guido Günther
Date: Mon Apr 27 2026 - 10:10:55 EST
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 <agx@xxxxxxxxxxx>
---
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