[PATCH 04/39] drm/imx: dc: Use bulk clock

Frank Li Frank.li at nxp.com
Mon Oct 13 09:54:12 PDT 2025


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 <marek.vasut at mailbox.org>
> ---
> Cc: Abel Vesa <abelvesa at kernel.org>
> Cc: Conor Dooley <conor+dt at kernel.org>
> Cc: Fabio Estevam <festevam at gmail.com>
> Cc: Krzysztof Kozlowski <krzk+dt at kernel.org>
> Cc: Laurent Pinchart <Laurent.pinchart at ideasonboard.com>
> Cc: Liu Ying <victor.liu at nxp.com>
> Cc: Lucas Stach <l.stach at pengutronix.de>
> Cc: Peng Fan <peng.fan at nxp.com>
> Cc: Pengutronix Kernel Team <kernel at pengutronix.de>
> Cc: Rob Herring <robh at kernel.org>
> Cc: Shawn Guo <shawnguo at kernel.org>
> Cc: Thomas Zimmermann <tzimmermann at suse.de>
> Cc: devicetree at vger.kernel.org
> Cc: dri-devel at lists.freedesktop.org
> Cc: imx at lists.linux.dev
> Cc: linux-arm-kernel at lists.infradead.org
> Cc: linux-clk at vger.kernel.org
> ---
>  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
>



More information about the linux-arm-kernel mailing list