Switch to bulk clock operations, as many of the blocks present in DC
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;
+       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