Commit 86698b95 authored by Eizan Miyamoto's avatar Eizan Miyamoto Committed by Mauro Carvalho Chehab
Browse files

media: mtk-mdp: convert mtk_mdp_dev.comp array to list



The functions mtk_mdp_register/unregister_component have been created to
add / remove items from the list of components.

This will eventually enable us to specify a list of components in the
device tree instead of hardcoding them into this driver.

The list is modified by a single thread at driver probe time, and will
not be traversed by another thread until the call to pm_runtime_enable
at the end of probing.

Signed-off-by: default avatarEizan Miyamoto <eizan@chromium.org>
Reviewed-by: default avatarEnric Balletbo I Serra <enric.balletbo@collabora.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent ee18fc7b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -103,6 +103,7 @@ int mtk_mdp_comp_init(struct device *dev, struct device_node *node,
		return -EINVAL;
	}

	INIT_LIST_HEAD(&comp->node);
	comp->dev_node = of_node_get(node);
	comp->id = comp_id;
	comp->type = mtk_mdp_matches[comp_id].type;
+2 −0
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ enum mtk_mdp_comp_id {

/**
 * struct mtk_mdp_comp - the MDP's function component data
 * @node:	list node to track sibing MDP components
 * @dev_node:	component device node
 * @clk:	clocks required for component
 * @larb_dev:	SMI device required for component
@@ -43,6 +44,7 @@ enum mtk_mdp_comp_id {
 * @id:		component ID
 */
struct mtk_mdp_comp {
	struct list_head	node;
	struct device_node	*dev_node;
	struct clk		*clk[2];
	struct device		*larb_dev;
+32 −14
Original line number Diff line number Diff line
@@ -55,19 +55,19 @@ MODULE_DEVICE_TABLE(of, mtk_mdp_of_ids);
static void mtk_mdp_clock_on(struct mtk_mdp_dev *mdp)
{
	struct device *dev = &mdp->pdev->dev;
	int i;
	struct mtk_mdp_comp *comp_node;

	for (i = 0; i < ARRAY_SIZE(mdp->comp); i++)
		mtk_mdp_comp_clock_on(dev, mdp->comp[i]);
	list_for_each_entry(comp_node, &mdp->comp_list, node)
		mtk_mdp_comp_clock_on(dev, comp_node);
}

static void mtk_mdp_clock_off(struct mtk_mdp_dev *mdp)
{
	struct device *dev = &mdp->pdev->dev;
	int i;
	struct mtk_mdp_comp *comp_node;

	for (i = 0; i < ARRAY_SIZE(mdp->comp); i++)
		mtk_mdp_comp_clock_off(dev, mdp->comp[i]);
	list_for_each_entry(comp_node, &mdp->comp_list, node)
		mtk_mdp_comp_clock_off(dev, comp_node);
}

static void mtk_mdp_wdt_worker(struct work_struct *work)
@@ -91,12 +91,25 @@ static void mtk_mdp_reset_handler(void *priv)
	queue_work(mdp->wdt_wq, &mdp->wdt_work);
}

void mtk_mdp_register_component(struct mtk_mdp_dev *mdp,
				struct mtk_mdp_comp *comp)
{
	list_add(&mdp->comp_list, &comp->node);
}

void mtk_mdp_unregister_component(struct mtk_mdp_dev *mdp,
				  struct mtk_mdp_comp *comp)
{
	list_del(&comp->node);
}

static int mtk_mdp_probe(struct platform_device *pdev)
{
	struct mtk_mdp_dev *mdp;
	struct device *dev = &pdev->dev;
	struct device_node *node, *parent;
	int i, ret = 0;
	struct mtk_mdp_comp *comp, *comp_temp;
	int ret = 0;

	mdp = devm_kzalloc(dev, sizeof(*mdp), GFP_KERNEL);
	if (!mdp)
@@ -104,6 +117,7 @@ static int mtk_mdp_probe(struct platform_device *pdev)

	mdp->id = pdev->id;
	mdp->pdev = pdev;
	INIT_LIST_HEAD(&mdp->comp_list);
	INIT_LIST_HEAD(&mdp->ctx_list);

	mutex_init(&mdp->lock);
@@ -124,7 +138,6 @@ static int mtk_mdp_probe(struct platform_device *pdev)
		const struct of_device_id *of_id;
		enum mtk_mdp_comp_type comp_type;
		int comp_id;
		struct mtk_mdp_comp *comp;

		of_id = of_match_node(mtk_mdp_comp_dt_ids, node);
		if (!of_id)
@@ -150,13 +163,14 @@ static int mtk_mdp_probe(struct platform_device *pdev)
			of_node_put(node);
			goto err_comp;
		}
		mdp->comp[comp_id] = comp;

		ret = mtk_mdp_comp_init(dev, node, comp, comp_id);
		if (ret) {
			of_node_put(node);
			goto err_comp;
		}

		mtk_mdp_register_component(mdp, comp);
	}

	mdp->job_wq = create_singlethread_workqueue(MTK_MDP_MODULE_NAME);
@@ -220,8 +234,10 @@ err_alloc_wdt_wq:
err_alloc_job_wq:

err_comp:
	for (i = 0; i < ARRAY_SIZE(mdp->comp); i++)
		mtk_mdp_comp_deinit(dev, mdp->comp[i]);
	list_for_each_entry_safe(comp, comp_temp, &mdp->comp_list, node) {
		mtk_mdp_unregister_component(mdp, comp);
		mtk_mdp_comp_deinit(dev, comp);
	}

	dev_dbg(dev, "err %d\n", ret);
	return ret;
@@ -230,7 +246,7 @@ err_comp:
static int mtk_mdp_remove(struct platform_device *pdev)
{
	struct mtk_mdp_dev *mdp = platform_get_drvdata(pdev);
	int i;
	struct mtk_mdp_comp *comp, *comp_temp;

	pm_runtime_disable(&pdev->dev);
	vb2_dma_contig_clear_max_seg_size(&pdev->dev);
@@ -243,8 +259,10 @@ static int mtk_mdp_remove(struct platform_device *pdev)
	flush_workqueue(mdp->job_wq);
	destroy_workqueue(mdp->job_wq);

	for (i = 0; i < ARRAY_SIZE(mdp->comp); i++)
		mtk_mdp_comp_deinit(&pdev->dev, mdp->comp[i]);
	list_for_each_entry_safe(comp, comp_temp, &mdp->comp_list, node) {
		mtk_mdp_unregister_component(mdp, comp);
		mtk_mdp_comp_deinit(&pdev->dev, comp);
	}

	dev_dbg(&pdev->dev, "%s driver unloaded\n", pdev->name);
	return 0;
+8 −2
Original line number Diff line number Diff line
@@ -136,7 +136,7 @@ struct mtk_mdp_variant {
 * @pdev:	pointer to the image processor platform device
 * @variant:	the IP variant information
 * @id:		image processor device index (0..MTK_MDP_MAX_DEVS)
 * @comp:	MDP function components
 * @comp_list:	list of MDP function components
 * @m2m_dev:	v4l2 memory-to-memory device data
 * @ctx_list:	list of struct mtk_mdp_ctx
 * @vdev:	video device for image processor driver
@@ -154,7 +154,7 @@ struct mtk_mdp_dev {
	struct platform_device		*pdev;
	struct mtk_mdp_variant		*variant;
	u16				id;
	struct mtk_mdp_comp		*comp[MTK_MDP_COMP_ID_MAX];
	struct list_head		comp_list;
	struct v4l2_m2m_dev		*m2m_dev;
	struct list_head		ctx_list;
	struct video_device		*vdev;
@@ -221,6 +221,12 @@ struct mtk_mdp_ctx {

extern int mtk_mdp_dbg_level;

void mtk_mdp_register_component(struct mtk_mdp_dev *mdp,
				struct mtk_mdp_comp *comp);

void mtk_mdp_unregister_component(struct mtk_mdp_dev *mdp,
				  struct mtk_mdp_comp *comp);

#if defined(DEBUG)

#define mtk_mdp_dbg(level, fmt, args...)				 \