lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <CAD=FV=XPX+q9wVO4h2P_4JASoFeAozLP5uDqAXj7fxZe4woj9w@mail.gmail.com>
Date: Mon, 12 Aug 2024 15:59:33 -0700
From: Doug Anderson <dianders@...omium.org>
To: Tejas Vipin <tejasvipin76@...il.com>
Cc: maarten.lankhorst@...ux.intel.com, mripard@...nel.org, tzimmermann@...e.de, 
	neil.armstrong@...aro.org, quic_jesszhan@...cinc.com, airlied@...il.com, 
	daniel@...ll.ch, dri-devel@...ts.freedesktop.org, 
	linux-kernel@...r.kernel.org
Subject: Re: [PATCH 2/2] drm/panel: jdi-fhd-r63452: transition to mipi_dsi
 wrapped functions

Hi,

On Fri, Aug 9, 2024 at 9:55 PM Tejas Vipin <tejasvipin76@...il.com> wrote:
>
> @@ -41,79 +41,41 @@ static void jdi_fhd_r63452_reset(struct jdi_fhd_r63452 *ctx)
>  static int jdi_fhd_r63452_on(struct jdi_fhd_r63452 *ctx)
>  {
>         struct mipi_dsi_device *dsi = ctx->dsi;
> -       struct device *dev = &dsi->dev;
> -       int ret;
> +       struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi };
>
>         dsi->mode_flags |= MIPI_DSI_MODE_LPM;
>
> -       mipi_dsi_generic_write_seq(dsi, 0xb0, 0x00);
> -       mipi_dsi_generic_write_seq(dsi, 0xd6, 0x01);
> -       mipi_dsi_generic_write_seq(dsi, 0xec,
> -                                  0x64, 0xdc, 0xec, 0x3b, 0x52, 0x00, 0x0b, 0x0b,
> -                                  0x13, 0x15, 0x68, 0x0b, 0xb5);
> -       mipi_dsi_generic_write_seq(dsi, 0xb0, 0x03);
> +       mipi_dsi_generic_write_seq_multi(&dsi_ctx, 0xb0, 0x00);
> +       mipi_dsi_generic_write_seq_multi(&dsi_ctx, 0xd6, 0x01);
> +       mipi_dsi_generic_write_seq_multi(&dsi_ctx, 0xec,
> +                                        0x64, 0xdc, 0xec, 0x3b, 0x52, 0x00, 0x0b, 0x0b,
> +                                        0x13, 0x15, 0x68, 0x0b, 0xb5);
> +       mipi_dsi_generic_write_seq_multi(&dsi_ctx, 0xb0, 0x03);
>
> -       ret = mipi_dsi_dcs_set_tear_on(dsi, MIPI_DSI_DCS_TEAR_MODE_VBLANK);
> -       if (ret < 0) {
> -               dev_err(dev, "Failed to set tear on: %d\n", ret);
> -               return ret;
> -       }
> +       mipi_dsi_dcs_set_tear_on_multi(&dsi_ctx, MIPI_DSI_DCS_TEAR_MODE_VBLANK);
>
> -       mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_SET_ADDRESS_MODE, 0x00);
> +       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_SET_ADDRESS_MODE, 0x00);
>
> -       ret = mipi_dsi_dcs_set_pixel_format(dsi, 0x77);
> -       if (ret < 0) {
> -               dev_err(dev, "Failed to set pixel format: %d\n", ret);
> -               return ret;
> -       }
> +       mipi_dsi_dcs_set_pixel_format_multi(&dsi_ctx, 0x77);
> +       mipi_dsi_dcs_set_column_address_multi(&dsi_ctx, 0x0000, 0x0437);
> +       mipi_dsi_dcs_set_page_address_multi(&dsi_ctx, 0x0000, 0x077f);
> +       mipi_dsi_dcs_set_tear_scanline_multi(&dsi_ctx, 0x0000);
> +       mipi_dsi_dcs_set_display_brightness_multi(&dsi_ctx, 0x00ff);
>
> -       ret = mipi_dsi_dcs_set_column_address(dsi, 0x0000, 0x0437);
> -       if (ret < 0) {
> -               dev_err(dev, "Failed to set column address: %d\n", ret);
> -               return ret;
> -       }
> +       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_WRITE_CONTROL_DISPLAY, 0x24);
> +       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_WRITE_POWER_SAVE, 0x00);
> +       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_SET_CABC_MIN_BRIGHTNESS, 0x00);
> +       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x84, 0x00);
>
> -       ret = mipi_dsi_dcs_set_page_address(dsi, 0x0000, 0x077f);
> -       if (ret < 0) {
> -               dev_err(dev, "Failed to set page address: %d\n", ret);
> -               return ret;
> -       }
> -
> -       ret = mipi_dsi_dcs_set_tear_scanline(dsi, 0x0000);
> -       if (ret < 0) {
> -               dev_err(dev, "Failed to set tear scanline: %d\n", ret);
> -               return ret;
> -       }
> +       mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
> +       mipi_dsi_msleep(&dsi_ctx, 20);
> +       mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
> +       mipi_dsi_msleep(&dsi_ctx, 80);
>
> -       ret = mipi_dsi_dcs_set_display_brightness(dsi, 0x00ff);
> -       if (ret < 0) {
> -               dev_err(dev, "Failed to set display brightness: %d\n", ret);
> -               return ret;
> -       }
> -
> -       mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_WRITE_CONTROL_DISPLAY, 0x24);
> -       mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_WRITE_POWER_SAVE, 0x00);
> -       mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_SET_CABC_MIN_BRIGHTNESS, 0x00);
> -       mipi_dsi_dcs_write_seq(dsi, 0x84, 0x00);
> -
> -       ret = mipi_dsi_dcs_set_display_on(dsi);
> -       if (ret < 0) {
> -               dev_err(dev, "Failed to set display on: %d\n", ret);
> -               return ret;
> -       }
> -       msleep(20);
> -
> -       ret = mipi_dsi_dcs_exit_sleep_mode(dsi);
> -       if (ret < 0) {
> -               dev_err(dev, "Failed to exit sleep mode: %d\n", ret);
> -               return ret;
> -       }
> -       msleep(80);
> -
> -       mipi_dsi_generic_write_seq(dsi, 0xb0, 0x04);
> -       mipi_dsi_dcs_write_seq(dsi, 0x84, 0x00);
> -       mipi_dsi_generic_write_seq(dsi, 0xc8, 0x11);
> -       mipi_dsi_generic_write_seq(dsi, 0xb0, 0x03);
> +       mipi_dsi_generic_write_seq_multi(&dsi_ctx, 0xb0, 0x04);
> +       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x84, 0x00);
> +       mipi_dsi_generic_write_seq_multi(&dsi_ctx, 0xc8, 0x11);
> +       mipi_dsi_generic_write_seq_multi(&dsi_ctx, 0xb0, 0x03);
>
>         return 0;

Whoops! Not "return 0". "return dsi_ctx.accum_err".


> @@ -121,31 +83,22 @@ static int jdi_fhd_r63452_on(struct jdi_fhd_r63452 *ctx)
>  static int jdi_fhd_r63452_off(struct jdi_fhd_r63452 *ctx)
>  {
>         struct mipi_dsi_device *dsi = ctx->dsi;
> -       struct device *dev = &dsi->dev;
> -       int ret;
> +       struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi };
>
>         dsi->mode_flags &= ~MIPI_DSI_MODE_LPM;
>
> -       mipi_dsi_generic_write_seq(dsi, 0xb0, 0x00);
> -       mipi_dsi_generic_write_seq(dsi, 0xd6, 0x01);
> -       mipi_dsi_generic_write_seq(dsi, 0xec,
> -                                  0x64, 0xdc, 0xec, 0x3b, 0x52, 0x00, 0x0b, 0x0b,
> -                                  0x13, 0x15, 0x68, 0x0b, 0x95);
> -       mipi_dsi_generic_write_seq(dsi, 0xb0, 0x03);
> -
> -       ret = mipi_dsi_dcs_set_display_off(dsi);
> -       if (ret < 0) {
> -               dev_err(dev, "Failed to set display off: %d\n", ret);
> -               return ret;
> -       }
> -       usleep_range(2000, 3000);
> -
> -       ret = mipi_dsi_dcs_enter_sleep_mode(dsi);
> -       if (ret < 0) {
> -               dev_err(dev, "Failed to enter sleep mode: %d\n", ret);
> -               return ret;
> -       }
> -       msleep(120);
> +       mipi_dsi_generic_write_seq_multi(&dsi_ctx, 0xb0, 0x00);
> +       mipi_dsi_generic_write_seq_multi(&dsi_ctx, 0xd6, 0x01);
> +       mipi_dsi_generic_write_seq_multi(&dsi_ctx, 0xec,
> +                                        0x64, 0xdc, 0xec, 0x3b, 0x52, 0x00, 0x0b, 0x0b,
> +                                        0x13, 0x15, 0x68, 0x0b, 0x95);
> +       mipi_dsi_generic_write_seq_multi(&dsi_ctx, 0xb0, 0x03);
> +
> +       mipi_dsi_dcs_set_display_off_multi(&dsi_ctx);
> +       if (!dsi_ctx.accum_err)
> +               usleep_range(2000, 3000);
> +       mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx);
> +       mipi_dsi_msleep(&dsi_ctx, 120);
>
>         return 0;

Whoops! Not "return 0". "return dsi_ctx.accum_err".

Aside from that, this looks really nice to me. The code is much more
succinct and I bet much smaller.

FWIW, I won't insist, but I wouldn't object to this patch also fixing
the callers of jdi_fhd_r63452_on() and jdi_fhd_r63452_off() so that
they no longer print error messages since the _multi functions are
always chatty and thus they're just extra double-prints. If you do
this, jdi_fhd_r63452_off() could actually be a function that returned
"void". ...then you might want to add a comment saying why
jdi_fhd_r63452_unprepare() doesn't pass on any errors. That would be
something like "NOTE: even if sending one of the poweroff commands
failed, we won't return an error here. While the panel won't have been
cleanly turned off at least we've asserted the reset signal so it
should be safe to power it back on again later". ...or something like
that.

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ