Now a panel_bridge is automatically created for every drm_panel, so this
panel-only call to drm_of_find_panel_or_bridge() would lead to creating a
second panel_bridge for the same panel.

Fix and simplify the code by just getting a reference to the
already-existing panel_bridge using of_drm_get_bridge_by_endpoint().

As of_drm_get_bridge_by_endpoint() returns a refcouncted bridge, take care
of putting the bridge reference on removal.

Signed-off-by: Luca Ceresoli <[email protected]>
---
 drivers/gpu/drm/bridge/tc358767.c | 22 +++++++---------------
 1 file changed, 7 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c 
b/drivers/gpu/drm/bridge/tc358767.c
index ac83af7902cd..d282db507d59 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -2347,24 +2347,15 @@ static int tc_probe_dpi_bridge_endpoint(struct tc_data 
*tc)
 static int tc_probe_edp_bridge_endpoint(struct tc_data *tc)
 {
        struct device *dev = tc->dev;
-       struct drm_panel *panel;
-       int ret;
+       struct drm_bridge *bridge;
 
        /* port@2 is the output port */
-       ret = drm_of_find_panel_or_bridge(dev->of_node, 2, 0, &panel, NULL);
-       if (ret && ret != -ENODEV)
-               return dev_err_probe(dev, ret,
-                                    "Could not find DSI panel or bridge\n");
+       bridge = of_drm_get_bridge_by_endpoint(dev->of_node, 2, 0);
+       if (IS_ERR(bridge) && PTR_ERR(bridge) != -ENODEV)
+               return dev_err_probe(dev, PTR_ERR(bridge), "Could not find DSI 
bridge\n");
 
-       if (panel) {
-               struct drm_bridge *panel_bridge;
-
-               panel_bridge = devm_drm_panel_bridge_add(dev, panel);
-               drm_panel_put(panel);
-               if (IS_ERR(panel_bridge))
-                       return PTR_ERR(panel_bridge);
-
-               tc->panel_bridge = panel_bridge;
+       if (!IS_ERR(bridge)) {
+               tc->panel_bridge = bridge;
                tc->bridge.type = DRM_MODE_CONNECTOR_eDP;
        } else {
                tc->bridge.type = DRM_MODE_CONNECTOR_DisplayPort;
@@ -2607,6 +2598,7 @@ static void tc_remove(struct i2c_client *client)
 {
        struct tc_data *tc = i2c_get_clientdata(client);
 
+       drm_bridge_put(tc->panel_bridge);
        drm_bridge_remove(&tc->bridge);
 }
 

-- 
2.55.0

Reply via email to