The mipi_dsi_dcs_*() functions used by this driver are deprecated in favor of their _multi() counterparts, as noted in Documentation/gpu/todo.rst. The _multi() variants record the first error in a context structure and skip every later call once an error is set, so the return value no longer has to be checked after each command. They also log their own failures, which makes the per-call dev_err() calls redundant.
Convert prepare() and unprepare(), using mipi_dsi_msleep() and mipi_dsi_usleep_range() for the delays between DSI commands. The delays in the GPIO reset sequence stay as plain msleep() and usleep_range(), since they run before any DSI transaction. unprepare() now disables the regulator unconditionally and returns 0. Previously a failure of enter_sleep_mode() returned early, leaving the regulator enabled. drm_panel_unprepare() skips panel->prepared = false when the callback returns an error, and drm_panel_prepare() returns early when prepared is already set, so that path left the panel powered and unable to be brought back up. Both functions return void, so the error was never propagated to a caller in any case. Signed-off-by: Akash Sukhavasi <[email protected]> --- Compile tested only, no hardware available. checkpatch and a W=1 build are clean. Changes in v2: - unprepare() disables the regulator unconditionally and returns 0, per Sashiko's review on v1. Returning an error left panel->prepared set, so the panel could not be prepared again. - Link to v1: https://lore.kernel.org/r/[email protected] --- drivers/gpu/drm/panel/panel-tdo-tl070wsh30.c | 40 ++++++++++------------------ 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/drivers/gpu/drm/panel/panel-tdo-tl070wsh30.c b/drivers/gpu/drm/panel/panel-tdo-tl070wsh30.c index 13cfe252a838..cd846e5ab2e7 100644 --- a/drivers/gpu/drm/panel/panel-tdo-tl070wsh30.c +++ b/drivers/gpu/drm/panel/panel-tdo-tl070wsh30.c @@ -35,6 +35,7 @@ struct tdo_tl070wsh30_panel *to_tdo_tl070wsh30_panel(struct drm_panel *panel) static int tdo_tl070wsh30_panel_prepare(struct drm_panel *panel) { struct tdo_tl070wsh30_panel *tdo_tl070wsh30 = to_tdo_tl070wsh30_panel(panel); + struct mipi_dsi_multi_context dsi_ctx = { .dsi = tdo_tl070wsh30->link }; int err; err = regulator_enable(tdo_tl070wsh30->supply); @@ -51,45 +52,32 @@ static int tdo_tl070wsh30_panel_prepare(struct drm_panel *panel) msleep(200); - err = mipi_dsi_dcs_exit_sleep_mode(tdo_tl070wsh30->link); - if (err < 0) { - dev_err(panel->dev, "failed to exit sleep mode: %d\n", err); - regulator_disable(tdo_tl070wsh30->supply); - return err; - } + mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx); - msleep(200); + mipi_dsi_msleep(&dsi_ctx, 200); - err = mipi_dsi_dcs_set_display_on(tdo_tl070wsh30->link); - if (err < 0) { - dev_err(panel->dev, "failed to set display on: %d\n", err); - regulator_disable(tdo_tl070wsh30->supply); - return err; - } + mipi_dsi_dcs_set_display_on_multi(&dsi_ctx); - msleep(20); + mipi_dsi_msleep(&dsi_ctx, 20); - return 0; + if (dsi_ctx.accum_err) + regulator_disable(tdo_tl070wsh30->supply); + + return dsi_ctx.accum_err; } static int tdo_tl070wsh30_panel_unprepare(struct drm_panel *panel) { struct tdo_tl070wsh30_panel *tdo_tl070wsh30 = to_tdo_tl070wsh30_panel(panel); - int err; + struct mipi_dsi_multi_context dsi_ctx = { .dsi = tdo_tl070wsh30->link }; - err = mipi_dsi_dcs_set_display_off(tdo_tl070wsh30->link); - if (err < 0) - dev_err(panel->dev, "failed to set display off: %d\n", err); + mipi_dsi_dcs_set_display_off_multi(&dsi_ctx); - usleep_range(10000, 11000); + mipi_dsi_usleep_range(&dsi_ctx, 10000, 11000); - err = mipi_dsi_dcs_enter_sleep_mode(tdo_tl070wsh30->link); - if (err < 0) { - dev_err(panel->dev, "failed to enter sleep mode: %d\n", err); - return err; - } + mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx); - usleep_range(10000, 11000); + mipi_dsi_usleep_range(&dsi_ctx, 10000, 11000); regulator_disable(tdo_tl070wsh30->supply); --- base-commit: 62cc90241548d5570ee68e01aaba6506964e9811 change-id: 20260722-mipi-dsi-tl070wsh30-multi-2095299d5b12 Best regards, -- Akash Sukhavasi <[email protected]>
