From 3fdf77eb6f1526de2d69445cc2b9f54f334e418f Mon Sep 17 00:00:00 2001 From: Wyon Bi Date: Tue, 23 Nov 2021 18:32:29 +0800 Subject: [PATCH] drm/rockchip: vop2: Add pclk support Signed-off-by: Wyon Bi Change-Id: If35f3ce459a9e36df562fa015e47d2ecf2d740d2 --- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 23 ++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index c89a5ccb8909..0a475c11ecd8 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -690,6 +690,7 @@ struct vop2 { unsigned int enable_count; struct clk *hclk; struct clk *aclk; + struct clk *pclk; /* list_head of internal clk */ struct list_head clk_list_head; @@ -2391,8 +2392,14 @@ static int vop2_core_clks_enable(struct vop2 *vop2) if (ret < 0) goto err_disable_hclk; + ret = clk_enable(vop2->pclk); + if (ret < 0) + goto err_disable_aclk; + return 0; +err_disable_aclk: + clk_disable(vop2->aclk); err_disable_hclk: clk_disable(vop2->hclk); return ret; @@ -2400,6 +2407,7 @@ err_disable_hclk: static void vop2_core_clks_disable(struct vop2 *vop2) { + clk_disable(vop2->pclk); clk_disable(vop2->aclk); clk_disable(vop2->hclk); } @@ -2925,7 +2933,15 @@ static int vop2_core_clks_prepare_enable(struct vop2 *vop2) goto err; } + ret = clk_prepare_enable(vop2->pclk); + if (ret < 0) { + dev_err(vop2->dev, "failed to enable pclk - %d\n", ret); + goto err1; + } + return 0; +err1: + clk_disable_unprepare(vop2->aclk); err: clk_disable_unprepare(vop2->hclk); @@ -3135,6 +3151,7 @@ static void vop2_disable(struct drm_crtc *crtc) pm_runtime_put_sync(vop2->dev); + clk_disable_unprepare(vop2->pclk); clk_disable_unprepare(vop2->aclk); clk_disable_unprepare(vop2->hclk); } @@ -8218,6 +8235,12 @@ static int vop2_bind(struct device *dev, struct device *master, void *data) return PTR_ERR(vop2->aclk); } + vop2->pclk = devm_clk_get_optional(vop2->dev, "pclk_vop"); + if (IS_ERR(vop2->pclk)) { + DRM_DEV_ERROR(vop2->dev, "failed to get pclk source\n"); + return PTR_ERR(vop2->pclk); + } + vop2->irq = platform_get_irq(pdev, 0); if (vop2->irq < 0) { DRM_DEV_ERROR(dev, "cannot find irq for vop2\n");