Commit 99764593 authored by Luca Ceresoli's avatar Luca Ceresoli
Browse files

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: default avatarLiu 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: default avatarLuca Ceresoli <luca.ceresoli@bootlin.com>
parent a3f7d26d
Loading
Loading
Loading
Loading
+14 −13
Original line number Diff line number Diff line
@@ -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];

		if (!ch->is_available)
			continue;
		ch = pc->ch[i];

		if (ch)
			drm_bridge_remove(&ch->bridge);
		ch->is_available = false;
	}

	pm_runtime_disable(&pdev->dev);