[PATCH] drm/panel: s6e63m0: Order enable/disable sequence
Sam Ravnborg
sam at ravnborg.org
Tue Aug 18 17:33:50 UTC 2020
Hi Linus.
On Mon, Aug 17, 2020 at 11:39:06PM +0200, Linus Walleij wrote:
> The upstream S6E63M0 driver has some pecularities around
> the prepare/enable disable/unprepare sequence: the screen
> is taken out of sleep in prepare() as part of
> s6e63m0_init() the put to on with MIPI_DCS_SET_DISPLAY_ON
> in enable().
>
> However it is just put into sleep mode directly in
> disable(). As disable()/enable() can be called without
> unprepare()/prepare() being called, this is unbalanced,
> we should take the display out of sleep in enable()
> then turn it off().
>
> Further MIPI_DCS_SET_DISPLAY_OFF is never called
> balanced with MIPI_DCS_SET_DISPLAY_ON.
>
> The vendor driver for Samsung GT-I8190 (Golden) does all
> of these things in strict order.
>
> Augment the driver to do exit sleep/set display on in
> enable() and set display off/enter sleep in disable().
>
> Further send an explict reset pulse in power_on() so we
> come up in a known state, and issue the MCS_ERROR_CHECK
> command after setting display on like the vendor driver
> does. Also use the timings from the vendor driver in
> the sequence.
>
> Doing all of these things makes the display much more
> stable on the Samsung GT-I8190 when enabling/disabling
> the display pipeline.
>
> Cc: Paweł Chmiel <pawel.mikolaj.chmiel at gmail.com>
> Cc: Stephan Gerhold <stephan at gerhold.net>
> Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
Browsed through this patch - looks fine.
Acked-by: Sam Ravnborg <sam at ravnborg.org>
Sam
> ---
> This is based on top of the earlier patches for s6e63m0.
> ---
> drivers/gpu/drm/panel/panel-samsung-s6e63m0.c | 18 +++++++++++++++---
> 1 file changed, 15 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
> index f1d96ec3b57f..49b0470bcccd 100644
> --- a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c
> @@ -26,6 +26,7 @@
> #define MCS_ELVSS_ON 0xb1
> #define MCS_MIECTL1 0xc0
> #define MCS_BCMODE 0xc1
> +#define MCS_ERROR_CHECK 0xd5
> #define MCS_READ_ID1 0xda
> #define MCS_READ_ID2 0xdb
> #define MCS_READ_ID3 0xdc
> @@ -281,8 +282,6 @@ static void s6e63m0_init(struct s6e63m0 *ctx)
>
> s6e63m0_dcs_write_seq_static(ctx, MCS_ELVSS_ON,
> 0x0b);
> -
> - s6e63m0_dcs_write_seq_static(ctx, MIPI_DCS_EXIT_SLEEP_MODE);
> }
>
> static int s6e63m0_power_on(struct s6e63m0 *ctx)
> @@ -295,6 +294,9 @@ static int s6e63m0_power_on(struct s6e63m0 *ctx)
>
> msleep(25);
>
> + /* Be sure to send a reset pulse */
> + gpiod_set_value(ctx->reset_gpio, 1);
> + msleep(5);
> gpiod_set_value(ctx->reset_gpio, 0);
> msleep(120);
>
> @@ -324,8 +326,10 @@ static int s6e63m0_disable(struct drm_panel *panel)
>
> backlight_disable(ctx->bl_dev);
>
> + s6e63m0_dcs_write_seq_static(ctx, MIPI_DCS_SET_DISPLAY_OFF);
> + msleep(10);
> s6e63m0_dcs_write_seq_static(ctx, MIPI_DCS_ENTER_SLEEP_MODE);
> - msleep(200);
> + msleep(120);
>
> ctx->enabled = false;
>
> @@ -391,7 +395,15 @@ static int s6e63m0_enable(struct drm_panel *panel)
> if (ctx->enabled)
> return 0;
>
> + s6e63m0_dcs_write_seq_static(ctx, MIPI_DCS_EXIT_SLEEP_MODE);
> + msleep(120);
> s6e63m0_dcs_write_seq_static(ctx, MIPI_DCS_SET_DISPLAY_ON);
> + msleep(10);
> +
> + s6e63m0_dcs_write_seq_static(ctx, MCS_ERROR_CHECK,
> + 0xE7, 0x14, 0x60, 0x17, 0x0A, 0x49, 0xC3,
> + 0x8F, 0x19, 0x64, 0x91, 0x84, 0x76, 0x20,
> + 0x0F, 0x00);
>
> backlight_enable(ctx->bl_dev);
>
> --
> 2.26.2
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
More information about the dri-devel
mailing list