struct drm_bridge *next_bridge;
        struct imx8qxp_pc *pc;
        unsigned int stream_id;
-       bool is_available;
 };
 
 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;
 };
                        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;
 
                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;
 
                drm_bridge_add(&ch->bridge);
        }
 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;
        int i;
 
        for (i = 0; i < 2; i++) {
-               ch = &pc->ch[i];
-
-               if (!ch->is_available)
-                       continue;
+               ch = pc->ch[i];
 
-               drm_bridge_remove(&ch->bridge);
-               ch->is_available = false;
+               if (ch)
+                       drm_bridge_remove(&ch->bridge);
        }
 
        pm_runtime_disable(&pdev->dev);