]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/bridge: cadence: cdns-mhdp8546-core: Add mode_valid hook to drm_bridge_funcs
authorJayesh Choudhary <j-choudhary@ti.com>
Tue, 9 Dec 2025 12:03:28 +0000 (17:33 +0530)
committerLuca Ceresoli <luca.ceresoli@bootlin.com>
Mon, 9 Mar 2026 17:57:19 +0000 (18:57 +0100)
Add cdns_mhdp_bridge_mode_valid() to check if specific mode is valid for
this bridge or not. In the legacy usecase with
!DRM_BRIDGE_ATTACH_NO_CONNECTOR we were using the hook from
drm_connector_helper_funcs but with DRM_BRIDGE_ATTACH_NO_CONNECTOR
we need to have mode_valid() in drm_bridge_funcs.

Without this patch, when using DRM_BRIDGE_ATTACH_NO_CONNECTOR
flag, the cdns_mhdp_bandwidth_ok() function would not be called
during  mode validation, potentially allowing modes that exceed
the bridge's bandwidth capabilities to be incorrectly marked as
valid.

Fixes: c932ced6b585 ("drm/tidss: Update encoder/bridge chain connect model")
Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Signed-off-by: Jayesh Choudhary <j-choudhary@ti.com>
Signed-off-by: Harikrishna Shenoy <h-shenoy@ti.com>
Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
Link: https://patch.msgid.link/20251209120332.3559893-3-h-shenoy@ti.com
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c

index 3379194e4ea6b056346696e99585da41fe00b34b..3f5cc4e90927dc20d3b239a5936f41298bb12814 100644 (file)
@@ -2162,6 +2162,25 @@ static const struct drm_edid *cdns_mhdp_bridge_edid_read(struct drm_bridge *brid
        return cdns_mhdp_edid_read(mhdp, connector);
 }
 
+static enum drm_mode_status
+cdns_mhdp_bridge_mode_valid(struct drm_bridge *bridge,
+                           const struct drm_display_info *info,
+                           const struct drm_display_mode *mode)
+{
+       struct cdns_mhdp_device *mhdp = bridge_to_mhdp(bridge);
+
+       mutex_lock(&mhdp->link_mutex);
+
+       if (!cdns_mhdp_bandwidth_ok(mhdp, mode, mhdp->link.num_lanes,
+                                   mhdp->link.rate)) {
+               mutex_unlock(&mhdp->link_mutex);
+               return MODE_CLOCK_HIGH;
+       }
+
+       mutex_unlock(&mhdp->link_mutex);
+       return MODE_OK;
+}
+
 static const struct drm_bridge_funcs cdns_mhdp_bridge_funcs = {
        .atomic_enable = cdns_mhdp_atomic_enable,
        .atomic_disable = cdns_mhdp_atomic_disable,
@@ -2176,6 +2195,7 @@ static const struct drm_bridge_funcs cdns_mhdp_bridge_funcs = {
        .edid_read = cdns_mhdp_bridge_edid_read,
        .hpd_enable = cdns_mhdp_bridge_hpd_enable,
        .hpd_disable = cdns_mhdp_bridge_hpd_disable,
+       .mode_valid = cdns_mhdp_bridge_mode_valid,
 };
 
 static bool cdns_mhdp_detect_hpd(struct cdns_mhdp_device *mhdp, bool *hpd_pulse)