Since LARBs (Local ARBiter) have to be powered on before its users,
to ensure the power-on sequence, we created a device link between
RDMA and its LARB, and when pm_runtime_get_sync is called in RDMA,
system will guarantee the LARB is powered on before the RDMA.

Signed-off-by: Hsiao Chien Sung <shawn.s...@mediatek.com>
---
 drivers/gpu/drm/mediatek/mtk_mdp_rdma.c | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c 
b/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c
index c3adaeefd551..fce6fbb534b1 100644
--- a/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c
+++ b/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c
@@ -244,10 +244,23 @@ size_t mtk_mdp_rdma_get_num_formats(struct device *dev)

 int mtk_mdp_rdma_clk_enable(struct device *dev)
 {
+       int ret;
        struct mtk_mdp_rdma *rdma = dev_get_drvdata(dev);

-       clk_prepare_enable(rdma->clk);
-       return 0;
+       /*
+        * Since LARBs (Local ARBiter) have to be powered on before its users,
+        * to ensure the power-on sequence, we created a device link between
+        * RDMA and its LARB, and when pm_runtime_get_sync is called in RDMA,
+        * system will make sure the LARB is powered on before the RDMA
+        */
+       ret = pm_runtime_get_sync(dev);
+
+       if (ret < 0)
+               dev_err(dev, "pm_runtime_get_sync failed: %d\n", ret);
+       else
+               ret = clk_prepare_enable(rdma->clk);
+
+       return ret;
 }

 void mtk_mdp_rdma_clk_disable(struct device *dev)
@@ -255,6 +268,9 @@ void mtk_mdp_rdma_clk_disable(struct device *dev)
        struct mtk_mdp_rdma *rdma = dev_get_drvdata(dev);

        clk_disable_unprepare(rdma->clk);
+
+       /* Same reason as when enabling clock, turn the LARB off */
+       pm_runtime_put(dev);
 }

 static int mtk_mdp_rdma_bind(struct device *dev, struct device *master,
--
2.18.0

Reply via email to