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

From: CK Hu (胡俊光)
Date: Wed Sep 27 2023 - 22:32:24 EST


Hi, Hsiao-chien:

On Mon, 2023-09-11 at 15:42 +0800, Hsiao Chien Sung wrote:
> 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.

OVL is one of LARB user, but OVL have no device link with LARB, but it
works for years. If all DMA component need device link with LARB, add
to all of them not only mdp_rdma.

Regards,
CK

>
> Signed-off-by: Hsiao Chien Sung <shawn.sung@xxxxxxxxxxxx>
> ---
> 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
>