@@ -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,
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(-) -- 2.18.0