Signed-off-by: Jyri Sarha <jsarha at ti.com>
---
 drivers/gpu/drm/tilcdc/tilcdc_external.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/tilcdc/tilcdc_external.c 
b/drivers/gpu/drm/tilcdc/tilcdc_external.c
index 80184f0..31c6092 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_external.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_external.c
@@ -154,8 +154,10 @@ void tilcdc_remove_external_device(struct drm_device *dev)
                drm_connector_helper_add(priv->external_connector,
                                         priv->connector_funcs);

-       if (priv->external_encoder && priv->external_encoder->bridge)
+       if (priv->external_encoder && priv->external_encoder->bridge) {
                drm_bridge_detach(priv->external_encoder->bridge);
+               drm_bridge_put(priv->external_encoder->bridge);
+       }
 }

 static const struct drm_encoder_funcs tilcdc_external_encoder_funcs = {
@@ -234,7 +236,7 @@ int tilcdc_attach_external_device(struct drm_device *ddev)
        if (!remote_node)
                return 0;

-       bridge = of_drm_find_bridge(remote_node);
+       bridge = of_drm_get_bridge(remote_node);
        of_node_put(remote_node);
        if (!bridge)
                return -EPROBE_DEFER;
@@ -242,20 +244,25 @@ int tilcdc_attach_external_device(struct drm_device *ddev)
        priv->external_encoder = devm_kzalloc(ddev->dev,
                                              sizeof(*priv->external_encoder),
                                              GFP_KERNEL);
-       if (!priv->external_encoder)
+       if (!priv->external_encoder) {
+               drm_bridge_put(bridge);
                return -ENOMEM;
+       }

        ret = drm_encoder_init(ddev, priv->external_encoder,
                               &tilcdc_external_encoder_funcs,
                               DRM_MODE_ENCODER_NONE, NULL);
        if (ret) {
                dev_err(ddev->dev, "drm_encoder_init() failed %d\n", ret);
+               drm_bridge_put(bridge);
                return ret;
        }

        ret = tilcdc_attach_bridge(ddev, bridge);
-       if (ret)
+       if (ret) {
                drm_encoder_cleanup(priv->external_encoder);
+               drm_bridge_put(bridge);
+       }

        return ret;
 }
-- 
1.9.1

Reply via email to