diff options
| -rw-r--r-- | drivers/gpu/drm/display/drm_bridge_connector.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/drm/display/drm_bridge_connector.c index ba8ff113cff1..d49ccf28d2b2 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -826,9 +826,19 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm, if (!bridge->ycbcr_420_allowed) connector->ycbcr_420_allowed = false; - if (bridge->ops & DRM_BRIDGE_OP_EDID) { + /* + * Ensure the last bridge declares OP_EDID or OP_MODES or both. + */ + if (bridge->ops & DRM_BRIDGE_OP_EDID || bridge->ops & DRM_BRIDGE_OP_MODES) { drm_bridge_put(bridge_connector->bridge_edid); - bridge_connector->bridge_edid = drm_bridge_get(bridge); + bridge_connector->bridge_edid = NULL; + drm_bridge_put(bridge_connector->bridge_modes); + bridge_connector->bridge_modes = NULL; + + if (bridge->ops & DRM_BRIDGE_OP_EDID) + bridge_connector->bridge_edid = drm_bridge_get(bridge); + if (bridge->ops & DRM_BRIDGE_OP_MODES) + bridge_connector->bridge_modes = drm_bridge_get(bridge); } if (bridge->ops & DRM_BRIDGE_OP_HPD) { drm_bridge_put(bridge_connector->bridge_hpd); @@ -838,10 +848,6 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm, drm_bridge_put(bridge_connector->bridge_detect); bridge_connector->bridge_detect = drm_bridge_get(bridge); } - if (bridge->ops & DRM_BRIDGE_OP_MODES) { - drm_bridge_put(bridge_connector->bridge_modes); - bridge_connector->bridge_modes = drm_bridge_get(bridge); - } if (bridge->ops & DRM_BRIDGE_OP_HDMI) { if (bridge_connector->bridge_hdmi) return ERR_PTR(-EBUSY); |
