Due to semantic changes in the bridge core, panels cannot send any DSI commands in the prepare/unprepare callbacks: there is no guarantee that the DSI transmitter is available at this point.
This will affect also SPI-based S6E63M0 displays, but that should be fine. Tested on the Samsung Golden (GT-I8190). Cc: Aradhya Bhatia <[email protected]> Fixes: c9b1150a68d9 ("drm/atomic-helper: Re-order bridge chain pre-enable and post-disable") Signed-off-by: Linus Walleij <[email protected]> --- drivers/gpu/drm/panel/panel-samsung-s6e63m0.c | 31 +++++++++++---------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c index ea241c89593b..7e000f30b124 100644 --- a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c +++ b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c @@ -508,32 +508,30 @@ static int s6e63m0_disable(struct drm_panel *panel) s6e63m0_dcs_write_seq_static(ctx, MIPI_DCS_ENTER_SLEEP_MODE); msleep(120); + s6e63m0_clear_error(ctx); + return 0; } static int s6e63m0_unprepare(struct drm_panel *panel) { struct s6e63m0 *ctx = panel_to_s6e63m0(panel); - int ret; - s6e63m0_clear_error(ctx); + return s6e63m0_power_off(ctx); +} - ret = s6e63m0_power_off(ctx); - if (ret < 0) - return ret; +static int s6e63m0_prepare(struct drm_panel *panel) +{ + struct s6e63m0 *ctx = panel_to_s6e63m0(panel); - return 0; + return s6e63m0_power_on(ctx); } -static int s6e63m0_prepare(struct drm_panel *panel) +static int s6e63m0_enable(struct drm_panel *panel) { struct s6e63m0 *ctx = panel_to_s6e63m0(panel); int ret; - ret = s6e63m0_power_on(ctx); - if (ret < 0) - return ret; - /* Magic to unlock level 2 control of the display */ s6e63m0_dcs_write_seq_static(ctx, MCS_LEVEL_2_KEY, 0x5a, 0x5a); /* Magic to unlock MTP reading */ @@ -547,15 +545,10 @@ static int s6e63m0_prepare(struct drm_panel *panel) ret = s6e63m0_clear_error(ctx); - if (ret < 0) + if (ret < 0) { s6e63m0_unprepare(panel); - - return ret; -} - -static int s6e63m0_enable(struct drm_panel *panel) -{ - struct s6e63m0 *ctx = panel_to_s6e63m0(panel); + return ret; + } s6e63m0_dcs_write_seq_static(ctx, MIPI_DCS_EXIT_SLEEP_MODE); msleep(120); -- 2.51.0
