Now a panel_bridge is automatically created for every drm_panel, so calls
to devm_drm_panel_bridge_add() would lead to creating a second panel_bridge
for the same panel.

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

As of_drm_get_bridge_by_endpoint() returns a refcounted bridge, take care
of putting the bridge reference by using bridge->next_bridge.

Signed-off-by: Luca Ceresoli <[email protected]>
---
 drivers/gpu/drm/bridge/Kconfig    |  2 --
 drivers/gpu/drm/bridge/tc358767.c | 64 ++++++++++++---------------------------
 2 files changed, 20 insertions(+), 46 deletions(-)

diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig
index 0a1689f8209d..30f71654eaeb 100644
--- a/drivers/gpu/drm/bridge/Kconfig
+++ b/drivers/gpu/drm/bridge/Kconfig
@@ -402,8 +402,6 @@ config DRM_TOSHIBA_TC358767
        select DRM_KMS_HELPER
        select REGMAP_I2C
        select DRM_MIPI_DSI
-       select DRM_PANEL
-       select DRM_PANEL_BRIDGE
        help
          Toshiba TC358767 eDP bridge chip driver.
 
diff --git a/drivers/gpu/drm/bridge/tc358767.c 
b/drivers/gpu/drm/bridge/tc358767.c
index ac83af7902cd..51f4baa62a53 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -35,7 +35,6 @@
 #include <drm/drm_edid.h>
 #include <drm/drm_mipi_dsi.h>
 #include <drm/drm_of.h>
-#include <drm/drm_panel.h>
 #include <drm/drm_print.h>
 #include <drm/drm_probe_helper.h>
 
@@ -370,7 +369,6 @@ struct tc_data {
        struct drm_dp_aux       aux;
 
        struct drm_bridge       bridge;
-       struct drm_bridge       *panel_bridge;
        struct drm_connector    connector;
 
        struct mipi_dsi_device  *dsi;
@@ -1742,8 +1740,8 @@ static int tc_connector_get_modes(struct drm_connector 
*connector)
                return 0;
        }
 
-       if (tc->panel_bridge) {
-               num_modes = drm_bridge_get_modes(tc->panel_bridge, connector);
+       if (tc->bridge.next_bridge) {
+               num_modes = drm_bridge_get_modes(tc->bridge.next_bridge, 
connector);
                if (num_modes > 0)
                        return num_modes;
        }
@@ -1788,7 +1786,7 @@ tc_connector_detect(struct drm_connector *connector, bool 
force)
        if (tc->hpd_pin >= 0)
                return tc_bridge_detect(&tc->bridge, connector);
 
-       if (tc->panel_bridge)
+       if (tc->bridge.next_bridge)
                return connector_status_connected;
        else
                return connector_status_unknown;
@@ -1809,10 +1807,10 @@ static int tc_dpi_bridge_attach(struct drm_bridge 
*bridge,
 {
        struct tc_data *tc = bridge_to_tc(bridge);
 
-       if (!tc->panel_bridge)
+       if (!tc->bridge.next_bridge)
                return 0;
 
-       return drm_bridge_attach(tc->bridge.encoder, tc->panel_bridge,
+       return drm_bridge_attach(tc->bridge.encoder, tc->bridge.next_bridge,
                                 &tc->bridge, flags);
 }
 
@@ -1825,9 +1823,9 @@ static int tc_edp_bridge_attach(struct drm_bridge *bridge,
        struct drm_device *drm = bridge->dev;
        int ret;
 
-       if (tc->panel_bridge) {
+       if (tc->bridge.next_bridge) {
                /* If a connector is required then this driver shall create it 
*/
-               ret = drm_bridge_attach(tc->bridge.encoder, tc->panel_bridge,
+               ret = drm_bridge_attach(tc->bridge.encoder, 
tc->bridge.next_bridge,
                                        &tc->bridge, flags | 
DRM_BRIDGE_ATTACH_NO_CONNECTOR);
                if (ret)
                        return ret;
@@ -2318,53 +2316,31 @@ static int tc_probe_dpi_bridge_endpoint(struct tc_data 
*tc)
 {
        struct device *dev = tc->dev;
        struct drm_bridge *bridge;
-       struct drm_panel *panel;
-       int ret;
 
        /* port@1 is the DPI input/output port */
-       ret = drm_of_find_panel_or_bridge(dev->of_node, 1, 0, &panel, &bridge);
-       if (ret && ret != -ENODEV)
-               return dev_err_probe(dev, ret,
-                                    "Could not find DPI panel or bridge\n");
-
-       if (panel) {
-               bridge = devm_drm_panel_bridge_add(dev, panel);
-               drm_panel_put(panel);
-               if (IS_ERR(bridge))
-                       return PTR_ERR(bridge);
-       }
-
-       if (bridge) {
-               tc->panel_bridge = bridge;
-               tc->bridge.type = DRM_MODE_CONNECTOR_DPI;
+       bridge = of_drm_get_bridge_by_endpoint(dev->of_node, 1, 0);
+       if (IS_ERR(bridge))
+               return dev_err_probe(dev, PTR_ERR(bridge),
+                                    "Could not find DPI bridge\n");
 
-               return 0;
-       }
+       tc->bridge.next_bridge = bridge;
+       tc->bridge.type = DRM_MODE_CONNECTOR_DPI;
 
-       return ret;
+       return 0;
 }
 
 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");
-
-       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);
+       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");
 
-               tc->panel_bridge = panel_bridge;
+       if (!IS_ERR(bridge)) {
+               tc->bridge.next_bridge = bridge;
                tc->bridge.type = DRM_MODE_CONNECTOR_eDP;
        } else {
                tc->bridge.type = DRM_MODE_CONNECTOR_DisplayPort;

-- 
2.55.0

Reply via email to