On Sat, Oct 11, 2025 at 06:51:19PM +0200, Marek Vasut wrote:
> Switch to bulk clock operations, as many of the blocks present in DC

s/operations/API

> use multiple clock on i.MX95. The use of bulk clock operations allows
> the driver to seamlessly handle one or multiple clock.
>
> Signed-off-by: Marek Vasut <[email protected]>
> ---
> Cc: Abel Vesa <[email protected]>
> Cc: Conor Dooley <[email protected]>
> Cc: Fabio Estevam <[email protected]>
> Cc: Krzysztof Kozlowski <[email protected]>
> Cc: Laurent Pinchart <[email protected]>
> Cc: Liu Ying <[email protected]>
> Cc: Lucas Stach <[email protected]>
> Cc: Peng Fan <[email protected]>
> Cc: Pengutronix Kernel Team <[email protected]>
> Cc: Rob Herring <[email protected]>
> Cc: Shawn Guo <[email protected]>
> Cc: Thomas Zimmermann <[email protected]>
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> ---
>  drivers/gpu/drm/imx/dc/dc-drv.c | 14 ++++++++------
>  drivers/gpu/drm/imx/dc/dc-ic.c  | 14 ++++++++------
>  drivers/gpu/drm/imx/dc/dc-pe.c  | 12 ++++++------
>  drivers/gpu/drm/imx/dc/dc-pe.h  |  3 ++-
>  4 files changed, 24 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/gpu/drm/imx/dc/dc-drv.c b/drivers/gpu/drm/imx/dc/dc-drv.c
> index f108964bf89f4..2717c92aba6c5 100644
> --- a/drivers/gpu/drm/imx/dc/dc-drv.c
> +++ b/drivers/gpu/drm/imx/dc/dc-drv.c
> @@ -31,7 +31,8 @@
>
>  struct dc_priv {
>       struct drm_device *drm;
> -     struct clk *clk_cfg;
> +     struct clk_bulk_data *clk_cfg;
> +     int clk_cfg_count;
>  };
>
>  DEFINE_DRM_GEM_DMA_FOPS(dc_drm_driver_fops);
> @@ -163,10 +164,11 @@ static int dc_probe(struct platform_device *pdev)
>       if (!priv)
>               return -ENOMEM;
>
> -     priv->clk_cfg = devm_clk_get(&pdev->dev, NULL);
> -     if (IS_ERR(priv->clk_cfg))
> -             return dev_err_probe(&pdev->dev, PTR_ERR(priv->clk_cfg),
> +     ret = devm_clk_bulk_get_all(&pdev->dev, &priv->clk_cfg);
> +     if (ret < 0)
> +             return dev_err_probe(&pdev->dev, ret,
>                                    "failed to get cfg clock\n");
> +     priv->clk_cfg_count = ret;
>
>       dev_set_drvdata(&pdev->dev, priv);
>
> @@ -201,7 +203,7 @@ static int dc_runtime_suspend(struct device *dev)
>  {
>       struct dc_priv *priv = dev_get_drvdata(dev);
>
> -     clk_disable_unprepare(priv->clk_cfg);
> +     clk_bulk_disable_unprepare(priv->clk_cfg_count, priv->clk_cfg);
>
>       return 0;
>  }
> @@ -211,7 +213,7 @@ static int dc_runtime_resume(struct device *dev)
>       struct dc_priv *priv = dev_get_drvdata(dev);
>       int ret;
>
> -     ret = clk_prepare_enable(priv->clk_cfg);
> +     ret = clk_bulk_prepare_enable(priv->clk_cfg_count, priv->clk_cfg);
>       if (ret)
>               dev_err(dev, "failed to enable cfg clock: %d\n", ret);
>
> diff --git a/drivers/gpu/drm/imx/dc/dc-ic.c b/drivers/gpu/drm/imx/dc/dc-ic.c
> index a270ae4030cdc..67441b349a7d2 100644
> --- a/drivers/gpu/drm/imx/dc/dc-ic.c
> +++ b/drivers/gpu/drm/imx/dc/dc-ic.c
> @@ -30,7 +30,8 @@
>
>  struct dc_ic_data {
>       struct regmap           *regs;
> -     struct clk              *clk_axi;
> +     struct clk_bulk_data    *clk_axi;

I am not sure if "axi' is good name for bulk clks. Maybe use 'clks'. _axi
quite specific to special 'axi' clocks.

Frank

> +     int                     clk_axi_count;
>       int                     irq[IRQ_COUNT];
>       struct irq_domain       *domain;
>  };
> @@ -136,10 +137,11 @@ static int dc_ic_probe(struct platform_device *pdev)
>       if (IS_ERR(data->regs))
>               return PTR_ERR(data->regs);
>
> -     data->clk_axi = devm_clk_get(dev, NULL);
> -     if (IS_ERR(data->clk_axi))
> -             return dev_err_probe(dev, PTR_ERR(data->clk_axi),
> +     ret = devm_clk_bulk_get_all(dev, &data->clk_axi);
> +     if (ret < 0)
> +             return dev_err_probe(dev, ret,
>                                    "failed to get AXI clock\n");
> +     data->clk_axi_count = ret;
>
>       for (i = 0; i < IRQ_COUNT; i++) {
>               /* skip the reserved IRQ */
> @@ -242,7 +244,7 @@ static int dc_ic_runtime_suspend(struct device *dev)
>  {
>       struct dc_ic_data *data = dev_get_drvdata(dev);
>
> -     clk_disable_unprepare(data->clk_axi);
> +     clk_bulk_disable_unprepare(data->clk_axi_count, data->clk_axi);
>
>       return 0;
>  }
> @@ -252,7 +254,7 @@ static int dc_ic_runtime_resume(struct device *dev)
>       struct dc_ic_data *data = dev_get_drvdata(dev);
>       int ret;
>
> -     ret = clk_prepare_enable(data->clk_axi);
> +     ret = clk_bulk_prepare_enable(data->clk_axi_count, data->clk_axi);
>       if (ret)
>               dev_err(dev, "failed to enable AXI clock: %d\n", ret);
>
> diff --git a/drivers/gpu/drm/imx/dc/dc-pe.c b/drivers/gpu/drm/imx/dc/dc-pe.c
> index 6676c22f3f458..eb96a6206cc6d 100644
> --- a/drivers/gpu/drm/imx/dc/dc-pe.c
> +++ b/drivers/gpu/drm/imx/dc/dc-pe.c
> @@ -27,10 +27,10 @@ static int dc_pe_bind(struct device *dev, struct device 
> *master, void *data)
>       if (!pe)
>               return -ENOMEM;
>
> -     pe->clk_axi = devm_clk_get(dev, NULL);
> -     if (IS_ERR(pe->clk_axi))
> -             return dev_err_probe(dev, PTR_ERR(pe->clk_axi),
> -                                  "failed to get AXI clock\n");
> +     ret = devm_clk_bulk_get_all(dev, &pe->clk_axi);
> +     if (ret < 0)
> +             return dev_err_probe(dev, ret, "failed to get AXI clock\n");
> +     pe->clk_axi_count = ret;
>
>       pe->dev = dev;
>
> @@ -99,7 +99,7 @@ static int dc_pe_runtime_suspend(struct device *dev)
>  {
>       struct dc_pe *pe = dev_get_drvdata(dev);
>
> -     clk_disable_unprepare(pe->clk_axi);
> +     clk_bulk_disable_unprepare(pe->clk_axi_count, pe->clk_axi);
>
>       return 0;
>  }
> @@ -109,7 +109,7 @@ static int dc_pe_runtime_resume(struct device *dev)
>       struct dc_pe *pe = dev_get_drvdata(dev);
>       int i, ret;
>
> -     ret = clk_prepare_enable(pe->clk_axi);
> +     ret = clk_bulk_prepare_enable(pe->clk_axi_count, pe->clk_axi);
>       if (ret) {
>               dev_err(dev, "failed to enable AXI clock: %d\n", ret);
>               return ret;
> diff --git a/drivers/gpu/drm/imx/dc/dc-pe.h b/drivers/gpu/drm/imx/dc/dc-pe.h
> index f5e01a6eb9e91..ffeb1c7af1c9f 100644
> --- a/drivers/gpu/drm/imx/dc/dc-pe.h
> +++ b/drivers/gpu/drm/imx/dc/dc-pe.h
> @@ -67,7 +67,8 @@ struct dc_lb {
>
>  struct dc_pe {
>       struct device *dev;
> -     struct clk *clk_axi;
> +     struct clk_bulk_data *clk_axi;
> +     int clk_axi_count;
>       struct dc_cf *cf_safe[DC_DISPLAYS];
>       struct dc_cf *cf_cont[DC_DISPLAYS];
>       struct dc_ed *ed_safe[DC_DISPLAYS];
> --
> 2.51.0
>

Reply via email to