mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-03 12:16:22 -04:00
drm/bridge: imx8qxp-pixel-combiner: convert to devm_drm_bridge_alloc() API
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 * remove the is_available flag, now "ch != NULL" is equivalent Reviewed-by: Liu Ying <victor.liu@nxp.com> Link: https://lore.kernel.org/r/20250509-drm-bridge-convert-to-alloc-api-v3-18-b8bc1f16d7aa@bootlin.com Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
This commit is contained in:
@@ -63,12 +63,11 @@ struct imx8qxp_pc_channel {
|
||||
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;
|
||||
};
|
||||
@@ -307,7 +306,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,9 +339,7 @@ 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;
|
||||
|
||||
drm_bridge_add(&ch->bridge);
|
||||
}
|
||||
@@ -345,8 +349,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,13 +363,10 @@ 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;
|
||||
|
||||
drm_bridge_remove(&ch->bridge);
|
||||
ch->is_available = false;
|
||||
if (ch)
|
||||
drm_bridge_remove(&ch->bridge);
|
||||
}
|
||||
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
Reference in New Issue
Block a user