[PATCH v6 16/20] drm/mediatek: Make sure the power-on sequence of LARB and RDMA

Hsiao Chien Sung
2023-09-11T03:17:10Z

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.sung@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