Hi Xia, On Thu, Jul 23, 2020 at 11:04:45AM +0800, Xia Jiang wrote: > Use the generic of_property_* helpers to get the clock_nums and clocks > from device tree. > Use the generic clk_bulk_* helpers to enable and disable clocks. > > Signed-off-by: Xia Jiang <xia.jiang@xxxxxxxxxxxx> > --- > v10: new add patch > --- > .../media/platform/mtk-jpeg/mtk_jpeg_core.c | 47 +++++++++++++++---- > .../media/platform/mtk-jpeg/mtk_jpeg_core.h | 8 ++-- > 2 files changed, 42 insertions(+), 13 deletions(-) > Thank you for the patch. Please see my comments inline. > diff --git a/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c b/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c > index 7881e9c93df7..921ed21f7db3 100644 > --- a/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c > +++ b/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c > @@ -783,14 +783,15 @@ static void mtk_jpeg_clk_on(struct mtk_jpeg_dev *jpeg) > ret = mtk_smi_larb_get(jpeg->larb); > if (ret) > dev_err(jpeg->dev, "mtk_smi_larb_get larbvdec fail %d\n", ret); > - clk_prepare_enable(jpeg->clk_jdec_smi); > - clk_prepare_enable(jpeg->clk_jdec); > + > + ret = clk_bulk_prepare_enable(jpeg->num_clks, jpeg->clks); > + if (ret) > + dev_err(jpeg->dev, "Failed to open jpeg clk: %d\n", ret); > } > > static void mtk_jpeg_clk_off(struct mtk_jpeg_dev *jpeg) > { > - clk_disable_unprepare(jpeg->clk_jdec); > - clk_disable_unprepare(jpeg->clk_jdec_smi); > + clk_bulk_disable_unprepare(jpeg->num_clks, jpeg->clks); > mtk_smi_larb_put(jpeg->larb); > } > > @@ -939,6 +940,7 @@ static int mtk_jpeg_clk_init(struct mtk_jpeg_dev *jpeg) > { > struct device_node *node; > struct platform_device *pdev; > + int ret, i; > > node = of_parse_phandle(jpeg->dev->of_node, "mediatek,larb", 0); > if (!node) > @@ -952,12 +954,39 @@ static int mtk_jpeg_clk_init(struct mtk_jpeg_dev *jpeg) > > jpeg->larb = &pdev->dev; > > - jpeg->clk_jdec = devm_clk_get(jpeg->dev, "jpgdec"); > - if (IS_ERR(jpeg->clk_jdec)) > - return PTR_ERR(jpeg->clk_jdec); > + jpeg->num_clks = > + of_property_count_strings(jpeg->dev->of_node, "clock-names"); > + > + if (jpeg->num_clks > 0) { > + jpeg->clks = devm_kcalloc(jpeg->dev, jpeg->num_clks, > + sizeof(struct clk_bulk_data), > + GFP_KERNEL); > + if (!jpeg->clks) > + return -ENOMEM; > + } else { > + dev_err(&pdev->dev, "Failed to get jpeg clock count\n"); > + return -EINVAL; > + } > + > + for (i = 0; i < jpeg->num_clks; i++) { > + ret = of_property_read_string_index(jpeg->dev->of_node, > + "clock-names", i, > + &jpeg->clks->id); The names of the clocks must be explicitly specified in the driver, as per the DT bindings. Best regards, Tomasz