This is the new API for allocating DRM bridges.

This driver embeds an array of channels in the main struct, and each
channel embeds a drm_bridge. This prevents dynamic, refcount-based
deallocation of the bridges.

To make the new, dynamic bridge allocation possible:

 * change the array of channels into an array of channel pointers
 * allocate each channel using devm_drm_bridge_alloc()
 * adapt the code wherever using the channels

Signed-off-by: Luca Ceresoli <luca.ceres...@bootlin.com>

---

Cc: Liu Ying <victor....@nxp.com>
---
 drivers/gpu/drm/bridge/imx/imx8qxp-pixel-combiner.c | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-combiner.c 
b/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-combiner.c
index 
1f6fd488e7039e943351006d3373009f0c15cb08..40a8a5a53a781137e722309ff91692cf90d881da
 100644
--- a/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-combiner.c
+++ b/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-combiner.c
@@ -68,7 +68,7 @@ struct imx8qxp_pc_channel {
 
 struct imx8qxp_pc {
        struct device *dev;
-       struct imx8qxp_pc_channel ch[2];
+       struct imx8qxp_pc_channel *ch[2];
        struct clk *clk_apb;
        void __iomem *base;
 };
@@ -307,7 +307,14 @@ static int imx8qxp_pc_bridge_probe(struct platform_device 
*pdev)
                        goto free_child;
                }
 
-               ch = &pc->ch[i];
+               ch = devm_drm_bridge_alloc(dev, struct imx8qxp_pc_channel, 
bridge,
+                                          &imx8qxp_pc_bridge_funcs);
+               if (IS_ERR(ch)) {
+                       ret = PTR_ERR(ch);
+                       goto free_child;
+               }
+
+               pc->ch[i] = ch;
                ch->pc = pc;
                ch->stream_id = i;
 
@@ -333,7 +340,6 @@ static int imx8qxp_pc_bridge_probe(struct platform_device 
*pdev)
                of_node_put(remote);
 
                ch->bridge.driver_private = ch;
-               ch->bridge.funcs = &imx8qxp_pc_bridge_funcs;
                ch->bridge.of_node = child;
                ch->is_available = true;
 
@@ -345,8 +351,8 @@ static int imx8qxp_pc_bridge_probe(struct platform_device 
*pdev)
 free_child:
        of_node_put(child);
 
-       if (i == 1 && pc->ch[0].next_bridge)
-               drm_bridge_remove(&pc->ch[0].bridge);
+       if (i == 1 && pc->ch[0]->next_bridge)
+               drm_bridge_remove(&pc->ch[0]->bridge);
 
        pm_runtime_disable(dev);
        return ret;
@@ -359,7 +365,7 @@ static void imx8qxp_pc_bridge_remove(struct platform_device 
*pdev)
        int i;
 
        for (i = 0; i < 2; i++) {
-               ch = &pc->ch[i];
+               ch = pc->ch[i];
 
                if (!ch->is_available)
                        continue;

-- 
2.49.0

Reply via email to