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