[PATCH] drm/bridge: adv7511: Do not merge adv7511_mode_set() with atomic_enable()
Biju Das
biju.das.jz at bp.renesas.com
Mon May 26 09:24:04 UTC 2025
Hi Tommaso,
Thanks for the patch.
> -----Original Message-----
> From: Tommaso Merciai <tommaso.merciai.xr at bp.renesas.com>
> Sent: 26 May 2025 09:55
> Subject: [PATCH] drm/bridge: adv7511: Do not merge adv7511_mode_set() with atomic_enable()
>
> After adv7511_mode_set() was merged into .atomic_enable(), only the native resolution is working when
> using modetest.
>
> This is caused by incorrect timings: adv7511_mode_set() must not be merged into .atomic_enable().
>
> Move adv7511_mode_set() back to the .mode_set() callback in drm_bridge_funcs to restore correct
> behavior.
>
> Fixes: 0a9e2f0a6466 ("drm/bridge: adv7511: switch to the HDMI connector helpers")
> Reported-by: Biju Das <biju.das.jz at bp.renesas.com>
> Closes: https://lore.kernel.org/all/aDB8bD6cF7qiSpKd@tom-desktop/
> Signed-off-by: Tommaso Merciai <tommaso.merciai.xr at bp.renesas.com>
Reviewed-by: Biju Das <biju.das.jz at bp.renesas.com>
The modetest started working again on RZ/V2L SMARC EVK connected to ADV7535.
So,
Tested-by: Biju Das <biju.das.jz at bp.renesas.com>
Cheers,
Biju
> ---
> drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 22 ++++++++++++++------
> 1 file changed, 16 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
> b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
> index 8b7548448615..7a874bf645af 100644
> --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
> +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
> @@ -647,6 +647,7 @@ adv7511_detect(struct adv7511 *adv7511) }
>
> static void adv7511_mode_set(struct adv7511 *adv7511,
> + const struct drm_display_mode *mode,
> const struct drm_display_mode *adj_mode) {
> unsigned int low_refresh_rate;
> @@ -717,11 +718,11 @@ static void adv7511_mode_set(struct adv7511 *adv7511,
> vsync_polarity = 1;
> }
>
> - if (drm_mode_vrefresh(adj_mode) <= 24)
> + if (drm_mode_vrefresh(mode) <= 24)
> low_refresh_rate = ADV7511_LOW_REFRESH_RATE_24HZ;
> - else if (drm_mode_vrefresh(adj_mode) <= 25)
> + else if (drm_mode_vrefresh(mode) <= 25)
> low_refresh_rate = ADV7511_LOW_REFRESH_RATE_25HZ;
> - else if (drm_mode_vrefresh(adj_mode) <= 30)
> + else if (drm_mode_vrefresh(mode) <= 30)
> low_refresh_rate = ADV7511_LOW_REFRESH_RATE_30HZ;
> else
> low_refresh_rate = ADV7511_LOW_REFRESH_RATE_NONE; @@ -743,7 +744,7 @@ static void
> adv7511_mode_set(struct adv7511 *adv7511,
> * supposed to give better results.
> */
>
> - adv7511->f_tmds = adj_mode->clock;
> + adv7511->f_tmds = mode->clock;
> }
>
> static int adv7511_connector_init(struct adv7511 *adv) @@ -795,8 +796,6 @@ static void
> adv7511_bridge_atomic_enable(struct drm_bridge *bridge,
>
> adv7511_set_config_csc(adv, connector, adv->rgb);
>
> - adv7511_mode_set(adv, &crtc_state->adjusted_mode);
> -
> drm_atomic_helper_connector_hdmi_update_infoframes(connector, state); }
>
> @@ -821,6 +820,16 @@ adv7511_bridge_hdmi_tmds_char_rate_valid(const struct drm_bridge *bridge,
> return MODE_OK;
> }
>
> +static void adv7511_bridge_mode_set(struct drm_bridge *bridge,
> + const struct drm_display_mode *mode,
> + const struct drm_display_mode *adj_mode) {
> + struct adv7511 *adv = bridge_to_adv7511(bridge);
> +
> + /* should not be merged into atomic_enable() */
> + adv7511_mode_set(adv, mode, adj_mode); }
> +
> static enum drm_mode_status adv7511_bridge_mode_valid(struct drm_bridge *bridge,
> const struct drm_display_info *info,
> const struct drm_display_mode *mode)
> @@ -917,6 +926,7 @@ static int adv7511_bridge_hdmi_write_infoframe(struct drm_bridge *bridge, }
>
> static const struct drm_bridge_funcs adv7511_bridge_funcs = {
> + .mode_set = adv7511_bridge_mode_set,
> .mode_valid = adv7511_bridge_mode_valid,
> .attach = adv7511_bridge_attach,
> .detect = adv7511_bridge_detect,
> --
> 2.43.0
More information about the dri-devel
mailing list