dw-hdmi export two similar pair of functions to probe()/remove() and bind()/unbind(), update to use dw_hdmi_remove() for consistency.
dw_hdmi_probe() will drm_bridge_add() the dw-hdmi bridge, so it is expected that of_drm_find_and_get_bridge() always return the dw-hdmi bridge. Regardless, validate that the dw-hdmi can be found for consistent error handling. Also always ensure the IRQ handler and bridge is released before dw_hdmi_remove() is called. Signed-off-by: Jonas Karlman <[email protected]> --- drivers/gpu/drm/meson/meson_dw_hdmi.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c index eafe7daf6ff1..9aafdc768f2b 100644 --- a/drivers/gpu/drm/meson/meson_dw_hdmi.c +++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c @@ -775,10 +775,17 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master, platform_set_drvdata(pdev, meson_dw_hdmi); meson_dw_hdmi->hdmi = dw_hdmi_probe(pdev, &meson_dw_hdmi->dw_plat_data); - if (IS_ERR(meson_dw_hdmi->hdmi)) + if (IS_ERR(meson_dw_hdmi->hdmi)) { + devm_free_irq(dev, irq, meson_dw_hdmi); return PTR_ERR(meson_dw_hdmi->hdmi); + } meson_dw_hdmi->bridge = of_drm_find_and_get_bridge(pdev->dev.of_node); + if (!meson_dw_hdmi->bridge) { + devm_free_irq(dev, irq, meson_dw_hdmi); + dw_hdmi_remove(meson_dw_hdmi->hdmi); + return -ENODEV; + } DRM_DEBUG_DRIVER("HDMI controller initialized\n"); @@ -793,8 +800,8 @@ static void meson_dw_hdmi_unbind(struct device *dev, struct device *master, int irq = platform_get_irq(pdev, 0); devm_free_irq(dev, irq, meson_dw_hdmi); - dw_hdmi_unbind(meson_dw_hdmi->hdmi); drm_bridge_put(meson_dw_hdmi->bridge); + dw_hdmi_remove(meson_dw_hdmi->hdmi); } static const struct component_ops meson_dw_hdmi_ops = { -- 2.54.0
