Hi Eizan, Thank you for your patch. Missatge de Eizan Miyamoto <eizan@xxxxxxxxxxxx> del dia dt., 5 de maig 2020 a les 6:02: > > 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: eizan@xxxxxxxxxxxx > Signed-off-by: Eizan Miyamoto <eizan@xxxxxxxxxx> Ditto. Other than that. Reviewed-by: Enric Balletbo i Serra <enric.balletbo@xxxxxxxxxxxxx> > --- > > drivers/media/platform/mtk-mdp/mtk_mdp_comp.c | 1 + > drivers/media/platform/mtk-mdp/mtk_mdp_comp.h | 2 + > drivers/media/platform/mtk-mdp/mtk_mdp_core.c | 46 +++++++++++++------ > drivers/media/platform/mtk-mdp/mtk_mdp_core.h | 10 +++- > 4 files changed, 43 insertions(+), 16 deletions(-) > > diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c > index facc6104b91f..d4afed1363d5 100644 > --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c > +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c > @@ -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; > diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h > index 3b83bd6e0d8b..1f745891c6c3 100644 > --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h > +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h > @@ -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; > diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c > index f974242663dc..e6e702d9cb69 100644 > --- a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c > +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c > @@ -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); > @@ -224,8 +238,10 @@ static int mtk_mdp_probe(struct platform_device *pdev) > 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; > @@ -234,7 +250,7 @@ static int mtk_mdp_probe(struct platform_device *pdev) > 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); > @@ -247,8 +263,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; > diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_core.h b/drivers/media/platform/mtk-mdp/mtk_mdp_core.h > index dd130cc218c9..a7da14b97077 100644 > --- a/drivers/media/platform/mtk-mdp/mtk_mdp_core.h > +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_core.h > @@ -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...) \ > -- > 2.26.2.526.g744177e7f7-goog > > > _______________________________________________ > Linux-mediatek mailing list > Linux-mediatek@xxxxxxxxxxxxxxxxxxx > http://lists.infradead.org/mailman/listinfo/linux-mediatek