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

