[PATCH] drm/bridge: adv7511: Do not merge adv7511_mode_set() with atomic_enable()

Tommaso Merciai tommaso.merciai.xr at bp.renesas.com
Mon May 26 08:54:52 UTC 2025


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>
---
 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