[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