devm_drm_of_get_bridge() is deprecated, switch to
of_drm_get_bridge_by_endpoint(). As of_drm_get_bridge_by_endpoint() returns
a refcounted bridge, ensure it is put by using bridge.next_bridge.
Fixes build failure when CONFIG_OF is disabled.
Fixes: aa8a8c7e4641 ("drm/bridge: panel: move all code to drm_panel.c")
Reported-by: Arnd Bergmann <[email protected]>
Closes: https://lore.kernel.org/r/[email protected]
Reported-by: kernel test robot <[email protected]>
Closes:
https://lore.kernel.org/oe-kbuild-all/[email protected]/
Signed-off-by: Luca Ceresoli <[email protected]>
---
Changes in v2:
- fix bridge reference leak on attach error and detach paths
- mention lkp report
---
drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
b/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
index 5dd475fcaacf..22d1b8cbe1d5 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
@@ -244,7 +244,6 @@ struct debugfs_entries {
struct dw_mipi_dsi {
struct drm_bridge bridge;
struct mipi_dsi_host dsi_host;
- struct drm_bridge *panel_bridge;
struct device *dev;
void __iomem *base;
@@ -333,12 +332,12 @@ static int dw_mipi_dsi_host_attach(struct mipi_dsi_host
*host,
dsi->format = device->format;
dsi->mode_flags = device->mode_flags;
- bridge = devm_drm_of_get_bridge(dsi->dev, dsi->dev->of_node, 1, 0);
+ bridge = of_drm_get_bridge_by_endpoint(dsi->dev->of_node, 1, 0);
if (IS_ERR(bridge))
return PTR_ERR(bridge);
bridge->pre_enable_prev_first = true;
- dsi->panel_bridge = bridge;
+ dsi->bridge.next_bridge = bridge;
drm_bridge_add(&dsi->bridge);
@@ -352,6 +351,7 @@ static int dw_mipi_dsi_host_attach(struct mipi_dsi_host
*host,
err_remove_bridge:
drm_bridge_remove(&dsi->bridge);
+ drm_bridge_clear_and_put(&dsi->bridge.next_bridge);
return ret;
}
@@ -368,9 +368,8 @@ static int dw_mipi_dsi_host_detach(struct mipi_dsi_host
*host,
return ret;
}
- drm_of_panel_bridge_remove(host->dev->of_node, 1, 0);
-
drm_bridge_remove(&dsi->bridge);
+ drm_bridge_clear_and_put(&dsi->bridge.next_bridge);
return 0;
}
@@ -1086,7 +1085,7 @@ static int dw_mipi_dsi_bridge_attach(struct drm_bridge
*bridge,
encoder->encoder_type = DRM_MODE_ENCODER_DSI;
/* Attach the panel-bridge to the dsi bridge */
- return drm_bridge_attach(encoder, dsi->panel_bridge, bridge,
+ return drm_bridge_attach(encoder, dsi->bridge.next_bridge, bridge,
flags);
}
--
2.55.0