Skip to content

Commit 569ed6a

Browse files
osamakadergregkh
authored andcommitted
drm/bridge: synopsys: dw-dp: fix error paths of dw_dp_bind
commit 1a0f69e upstream. Fix several issues in dw_dp_bind() error handling: 1. Missing return after drm_bridge_attach() failure - the function continued execution instead of returning an error. 2. Resource leak: drm_dp_aux_register() is not a devm function, so drm_dp_aux_unregister() must be called on all error paths after aux registration succeeds. This affects errors from: - drm_bridge_attach() - phy_init() - devm_add_action_or_reset() - platform_get_irq() - devm_request_threaded_irq() 3. Bug fix: platform_get_irq() returns the IRQ number or a negative error code, but the error path was returning ERR_PTR(ret) instead of ERR_PTR(dp->irq). Use a goto label for cleanup to ensure consistent error handling. Fixes: 86eecc3 ("drm/bridge: synopsys: Add DW DPTX Controller support library") Cc: stable@vger.kernel.org Signed-off-by: Osama Abdelkader <osama.abdelkader@gmail.com> Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com> Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com> Link: https://patch.msgid.link/20260102155553.13243-1-osama.abdelkader@gmail.com Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent ce2cca8 commit 569ed6a

1 file changed

Lines changed: 14 additions & 6 deletions

File tree

  • drivers/gpu/drm/bridge/synopsys

drivers/gpu/drm/bridge/synopsys/dw-dp.c

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2060,33 +2060,41 @@ struct dw_dp *dw_dp_bind(struct device *dev, struct drm_encoder *encoder,
20602060
}
20612061

20622062
ret = drm_bridge_attach(encoder, bridge, NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR);
2063-
if (ret)
2063+
if (ret) {
20642064
dev_err_probe(dev, ret, "Failed to attach bridge\n");
2065+
goto unregister_aux;
2066+
}
20652067

20662068
dw_dp_init_hw(dp);
20672069

20682070
ret = phy_init(dp->phy);
20692071
if (ret) {
20702072
dev_err_probe(dev, ret, "phy init failed\n");
2071-
return ERR_PTR(ret);
2073+
goto unregister_aux;
20722074
}
20732075

20742076
ret = devm_add_action_or_reset(dev, dw_dp_phy_exit, dp);
20752077
if (ret)
2076-
return ERR_PTR(ret);
2078+
goto unregister_aux;
20772079

20782080
dp->irq = platform_get_irq(pdev, 0);
2079-
if (dp->irq < 0)
2080-
return ERR_PTR(ret);
2081+
if (dp->irq < 0) {
2082+
ret = dp->irq;
2083+
goto unregister_aux;
2084+
}
20812085

20822086
ret = devm_request_threaded_irq(dev, dp->irq, NULL, dw_dp_irq,
20832087
IRQF_ONESHOT, dev_name(dev), dp);
20842088
if (ret) {
20852089
dev_err_probe(dev, ret, "failed to request irq\n");
2086-
return ERR_PTR(ret);
2090+
goto unregister_aux;
20872091
}
20882092

20892093
return dp;
2094+
2095+
unregister_aux:
2096+
drm_dp_aux_unregister(&dp->aux);
2097+
return ERR_PTR(ret);
20902098
}
20912099
EXPORT_SYMBOL_GPL(dw_dp_bind);
20922100

0 commit comments

Comments
 (0)