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

Reply via email to