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

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
...@@ -103,6 +103,7 @@ int mtk_mdp_comp_init(struct device *dev, struct device_node *node, ...@@ -103,6 +103,7 @@ int mtk_mdp_comp_init(struct device *dev, struct device_node *node,
return -EINVAL; return -EINVAL;
} }
INIT_LIST_HEAD(&comp->node);
comp->dev_node = of_node_get(node); comp->dev_node = of_node_get(node);
comp->id = comp_id; comp->id = comp_id;
comp->type = mtk_mdp_matches[comp_id].type; comp->type = mtk_mdp_matches[comp_id].type;
......
...@@ -36,6 +36,7 @@ enum mtk_mdp_comp_id { ...@@ -36,6 +36,7 @@ enum mtk_mdp_comp_id {
/** /**
* struct mtk_mdp_comp - the MDP's function component data * struct mtk_mdp_comp - the MDP's function component data
* @node: list node to track sibing MDP components
* @dev_node: component device node * @dev_node: component device node
* @clk: clocks required for component * @clk: clocks required for component
* @larb_dev: SMI device required for component * @larb_dev: SMI device required for component
...@@ -43,6 +44,7 @@ enum mtk_mdp_comp_id { ...@@ -43,6 +44,7 @@ enum mtk_mdp_comp_id {
* @id: component ID * @id: component ID
*/ */
struct mtk_mdp_comp { struct mtk_mdp_comp {
struct list_head node;
struct device_node *dev_node; struct device_node *dev_node;
struct clk *clk[2]; struct clk *clk[2];
struct device *larb_dev; struct device *larb_dev;
......
...@@ -55,19 +55,19 @@ MODULE_DEVICE_TABLE(of, mtk_mdp_of_ids); ...@@ -55,19 +55,19 @@ MODULE_DEVICE_TABLE(of, mtk_mdp_of_ids);
static void mtk_mdp_clock_on(struct mtk_mdp_dev *mdp) static void mtk_mdp_clock_on(struct mtk_mdp_dev *mdp)
{ {
struct device *dev = &mdp->pdev->dev; struct device *dev = &mdp->pdev->dev;
int i; struct mtk_mdp_comp *comp_node;
for (i = 0; i < ARRAY_SIZE(mdp->comp); i++) list_for_each_entry(comp_node, &mdp->comp_list, node)
mtk_mdp_comp_clock_on(dev, mdp->comp[i]); mtk_mdp_comp_clock_on(dev, comp_node);
} }
static void mtk_mdp_clock_off(struct mtk_mdp_dev *mdp) static void mtk_mdp_clock_off(struct mtk_mdp_dev *mdp)
{ {
struct device *dev = &mdp->pdev->dev; struct device *dev = &mdp->pdev->dev;
int i; struct mtk_mdp_comp *comp_node;
for (i = 0; i < ARRAY_SIZE(mdp->comp); i++) list_for_each_entry(comp_node, &mdp->comp_list, node)
mtk_mdp_comp_clock_off(dev, mdp->comp[i]); mtk_mdp_comp_clock_off(dev, comp_node);
} }
static void mtk_mdp_wdt_worker(struct work_struct *work) static void mtk_mdp_wdt_worker(struct work_struct *work)
...@@ -91,12 +91,25 @@ static void mtk_mdp_reset_handler(void *priv) ...@@ -91,12 +91,25 @@ static void mtk_mdp_reset_handler(void *priv)
queue_work(mdp->wdt_wq, &mdp->wdt_work); 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) static int mtk_mdp_probe(struct platform_device *pdev)
{ {
struct mtk_mdp_dev *mdp; struct mtk_mdp_dev *mdp;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct device_node *node, *parent; 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); mdp = devm_kzalloc(dev, sizeof(*mdp), GFP_KERNEL);
if (!mdp) if (!mdp)
...@@ -104,6 +117,7 @@ static int mtk_mdp_probe(struct platform_device *pdev) ...@@ -104,6 +117,7 @@ static int mtk_mdp_probe(struct platform_device *pdev)
mdp->id = pdev->id; mdp->id = pdev->id;
mdp->pdev = pdev; mdp->pdev = pdev;
INIT_LIST_HEAD(&mdp->comp_list);
INIT_LIST_HEAD(&mdp->ctx_list); INIT_LIST_HEAD(&mdp->ctx_list);
mutex_init(&mdp->lock); mutex_init(&mdp->lock);
...@@ -124,7 +138,6 @@ static int mtk_mdp_probe(struct platform_device *pdev) ...@@ -124,7 +138,6 @@ static int mtk_mdp_probe(struct platform_device *pdev)
const struct of_device_id *of_id; const struct of_device_id *of_id;
enum mtk_mdp_comp_type comp_type; enum mtk_mdp_comp_type comp_type;
int comp_id; int comp_id;
struct mtk_mdp_comp *comp;
of_id = of_match_node(mtk_mdp_comp_dt_ids, node); of_id = of_match_node(mtk_mdp_comp_dt_ids, node);
if (!of_id) if (!of_id)
...@@ -150,13 +163,14 @@ static int mtk_mdp_probe(struct platform_device *pdev) ...@@ -150,13 +163,14 @@ static int mtk_mdp_probe(struct platform_device *pdev)
of_node_put(node); of_node_put(node);
goto err_comp; goto err_comp;
} }
mdp->comp[comp_id] = comp;
ret = mtk_mdp_comp_init(dev, node, comp, comp_id); ret = mtk_mdp_comp_init(dev, node, comp, comp_id);
if (ret) { if (ret) {
of_node_put(node); of_node_put(node);
goto err_comp; goto err_comp;
} }
mtk_mdp_register_component(mdp, comp);
} }
mdp->job_wq = create_singlethread_workqueue(MTK_MDP_MODULE_NAME); mdp->job_wq = create_singlethread_workqueue(MTK_MDP_MODULE_NAME);
...@@ -220,8 +234,10 @@ static int mtk_mdp_probe(struct platform_device *pdev) ...@@ -220,8 +234,10 @@ static int mtk_mdp_probe(struct platform_device *pdev)
err_alloc_job_wq: err_alloc_job_wq:
err_comp: err_comp:
for (i = 0; i < ARRAY_SIZE(mdp->comp); i++) list_for_each_entry_safe(comp, comp_temp, &mdp->comp_list, node) {
mtk_mdp_comp_deinit(dev, mdp->comp[i]); mtk_mdp_unregister_component(mdp, comp);
mtk_mdp_comp_deinit(dev, comp);
}
dev_dbg(dev, "err %d\n", ret); dev_dbg(dev, "err %d\n", ret);
return ret; return ret;
...@@ -230,7 +246,7 @@ static int mtk_mdp_probe(struct platform_device *pdev) ...@@ -230,7 +246,7 @@ static int mtk_mdp_probe(struct platform_device *pdev)
static int mtk_mdp_remove(struct platform_device *pdev) static int mtk_mdp_remove(struct platform_device *pdev)
{ {
struct mtk_mdp_dev *mdp = platform_get_drvdata(pdev); struct mtk_mdp_dev *mdp = platform_get_drvdata(pdev);
int i; struct mtk_mdp_comp *comp, *comp_temp;
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
vb2_dma_contig_clear_max_seg_size(&pdev->dev); vb2_dma_contig_clear_max_seg_size(&pdev->dev);
...@@ -243,8 +259,10 @@ static int mtk_mdp_remove(struct platform_device *pdev) ...@@ -243,8 +259,10 @@ static int mtk_mdp_remove(struct platform_device *pdev)
flush_workqueue(mdp->job_wq); flush_workqueue(mdp->job_wq);
destroy_workqueue(mdp->job_wq); destroy_workqueue(mdp->job_wq);
for (i = 0; i < ARRAY_SIZE(mdp->comp); i++) list_for_each_entry_safe(comp, comp_temp, &mdp->comp_list, node) {
mtk_mdp_comp_deinit(&pdev->dev, mdp->comp[i]); mtk_mdp_unregister_component(mdp, comp);
mtk_mdp_comp_deinit(&pdev->dev, comp);
}
dev_dbg(&pdev->dev, "%s driver unloaded\n", pdev->name); dev_dbg(&pdev->dev, "%s driver unloaded\n", pdev->name);
return 0; return 0;
......
...@@ -136,7 +136,7 @@ struct mtk_mdp_variant { ...@@ -136,7 +136,7 @@ struct mtk_mdp_variant {
* @pdev: pointer to the image processor platform device * @pdev: pointer to the image processor platform device
* @variant: the IP variant information * @variant: the IP variant information
* @id: image processor device index (0..MTK_MDP_MAX_DEVS) * @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 * @m2m_dev: v4l2 memory-to-memory device data
* @ctx_list: list of struct mtk_mdp_ctx * @ctx_list: list of struct mtk_mdp_ctx
* @vdev: video device for image processor driver * @vdev: video device for image processor driver
...@@ -154,7 +154,7 @@ struct mtk_mdp_dev { ...@@ -154,7 +154,7 @@ struct mtk_mdp_dev {
struct platform_device *pdev; struct platform_device *pdev;
struct mtk_mdp_variant *variant; struct mtk_mdp_variant *variant;
u16 id; u16 id;
struct mtk_mdp_comp *comp[MTK_MDP_COMP_ID_MAX]; struct list_head comp_list;
struct v4l2_m2m_dev *m2m_dev; struct v4l2_m2m_dev *m2m_dev;
struct list_head ctx_list; struct list_head ctx_list;
struct video_device *vdev; struct video_device *vdev;
...@@ -221,6 +221,12 @@ struct mtk_mdp_ctx { ...@@ -221,6 +221,12 @@ struct mtk_mdp_ctx {
extern int mtk_mdp_dbg_level; 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) #if defined(DEBUG)
#define mtk_mdp_dbg(level, fmt, args...) \ #define mtk_mdp_dbg(level, fmt, args...) \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment