On Wed, 01 Sep 2021, Lee Shawn C <[email protected]> wrote:
> Driver has to swap the endian before send brightness level value
> to tcon.
>
> v2: Use __be16 instead of u16 to fix sparse warning.
> v3: Send one or two bytes brightness value depend on the precision.
>
> Reported-by: kernel test robot <[email protected]>
> Cc: Ville Syrjala <[email protected]>
> Cc: Jani Nikula <[email protected]>
> Cc: Vandita Kulkarni <[email protected]>
> Cc: Cooper Chiou <[email protected]>
> Cc: William Tseng <[email protected]>
> Signed-off-by: Lee Shawn C <[email protected]>
> ---
>  .../drm/i915/display/intel_dsi_dcs_backlight.c    | 15 +++++++++------
>  1 file changed, 9 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_dsi_dcs_backlight.c 
> b/drivers/gpu/drm/i915/display/intel_dsi_dcs_backlight.c
> index 21ab9e1acb57..722411b5cb21 100644
> --- a/drivers/gpu/drm/i915/display/intel_dsi_dcs_backlight.c
> +++ b/drivers/gpu/drm/i915/display/intel_dsi_dcs_backlight.c
> @@ -47,33 +47,36 @@ static u32 dcs_get_backlight(struct intel_connector 
> *connector, enum pipe unused
>  {
>       struct intel_encoder *encoder = intel_attached_encoder(connector);
>       struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
> +     struct intel_panel *panel = &connector->panel;
>       struct mipi_dsi_device *dsi_device;
> -     u8 data = 0;
> +     u8 data[2] = {0, 0};

        u8 data[2] = {};

>       enum port port;

        size_t len = panel->backlight.max > U8_MAX ? 2 : 1;

>  
>       /* FIXME: Need to take care of 16 bit brightness level */
>       for_each_dsi_port(port, intel_dsi->dcs_backlight_ports) {
>               dsi_device = intel_dsi->dsi_hosts[port]->device;
>               mipi_dsi_dcs_read(dsi_device, MIPI_DCS_GET_DISPLAY_BRIGHTNESS,
> -                               &data, sizeof(data));
> +                               &data,
> +                               (panel->backlight.max >> 8) ? sizeof(data) : 
> 1);
>               break;
>       }
>  
> -     return data;
> +     return ((data[1] << 8) | data[0]);

Unnecessary braces around the whole thing.

>  }
>  
>  static void dcs_set_backlight(const struct drm_connector_state *conn_state, 
> u32 level)
>  {
>       struct intel_dsi *intel_dsi = 
> enc_to_intel_dsi(to_intel_encoder(conn_state->best_encoder));
> +     struct intel_panel *panel = 
> &to_intel_connector(conn_state->connector)->panel;
>       struct mipi_dsi_device *dsi_device;
> -     u8 data = level;
> +     __be16 data = cpu_to_be16(level);

I think it's confusing to use __be16 in set and u8 data[2] in get. Let's
just use u8 data[2] in both. Especially because this one will always
write 0 for len == 1 as it's big-endian data!

You may have to do something like to keep it clear:

        size_t len = panel->backlight.max > U8_MAX ? 2 : 1;

        if (len == 1) {
                data[0] = level;
        } else {
                data[0] = level >> 8;
                data[1] = level;
        }

>       enum port port;
>  
> -     /* FIXME: Need to take care of 16 bit brightness level */
>       for_each_dsi_port(port, intel_dsi->dcs_backlight_ports) {
>               dsi_device = intel_dsi->dsi_hosts[port]->device;
>               mipi_dsi_dcs_write(dsi_device, MIPI_DCS_SET_DISPLAY_BRIGHTNESS,
> -                                &data, sizeof(data));
> +                                &data,
> +                                (panel->backlight.max >> 8) ? sizeof(data) : 
> 1);
>       }
>  }

-- 
Jani Nikula, Intel Open Source Graphics Center

Reply via email to