]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/gpu/drm/rockchip/rockchip_drm_vop.c
drm/rockchip: vop: split out core clock enablement into separate functions
[linux.git] / drivers / gpu / drm / rockchip / rockchip_drm_vop.c
index 45847d4a2e142b54cfb4b463bbc2d6b5235bd5ef..b55156b8ba3b8acef61c1ec06fedb50d020286aa 100644 (file)
@@ -486,6 +486,31 @@ static void vop_line_flag_irq_disable(struct vop *vop)
        spin_unlock_irqrestore(&vop->irq_lock, flags);
 }
 
+static int vop_core_clks_enable(struct vop *vop)
+{
+       int ret;
+
+       ret = clk_enable(vop->hclk);
+       if (ret < 0)
+               return ret;
+
+       ret = clk_enable(vop->aclk);
+       if (ret < 0)
+               goto err_disable_hclk;
+
+       return 0;
+
+err_disable_hclk:
+       clk_disable(vop->hclk);
+       return ret;
+}
+
+static void vop_core_clks_disable(struct vop *vop)
+{
+       clk_disable(vop->aclk);
+       clk_disable(vop->hclk);
+}
+
 static int vop_enable(struct drm_crtc *crtc)
 {
        struct vop *vop = to_vop(crtc);
@@ -497,17 +522,13 @@ static int vop_enable(struct drm_crtc *crtc)
                return ret;
        }
 
-       ret = clk_enable(vop->hclk);
+       ret = vop_core_clks_enable(vop);
        if (WARN_ON(ret < 0))
                goto err_put_pm_runtime;
 
        ret = clk_enable(vop->dclk);
        if (WARN_ON(ret < 0))
-               goto err_disable_hclk;
-
-       ret = clk_enable(vop->aclk);
-       if (WARN_ON(ret < 0))
-               goto err_disable_dclk;
+               goto err_disable_core;
 
        /*
         * Slave iommu shares power, irq and clock with vop.  It was associated
@@ -519,7 +540,7 @@ static int vop_enable(struct drm_crtc *crtc)
        if (ret) {
                DRM_DEV_ERROR(vop->dev,
                              "failed to attach dma mapping, %d\n", ret);
-               goto err_disable_aclk;
+               goto err_disable_dclk;
        }
 
        spin_lock(&vop->reg_lock);
@@ -558,12 +579,10 @@ static int vop_enable(struct drm_crtc *crtc)
 
        return 0;
 
-err_disable_aclk:
-       clk_disable(vop->aclk);
 err_disable_dclk:
        clk_disable(vop->dclk);
-err_disable_hclk:
-       clk_disable(vop->hclk);
+err_disable_core:
+       vop_core_clks_disable(vop);
 err_put_pm_runtime:
        pm_runtime_put_sync(vop->dev);
        return ret;
@@ -609,8 +628,7 @@ static void vop_crtc_atomic_disable(struct drm_crtc *crtc,
        rockchip_drm_dma_detach_device(vop->drm_dev, vop->dev);
 
        clk_disable(vop->dclk);
-       clk_disable(vop->aclk);
-       clk_disable(vop->hclk);
+       vop_core_clks_disable(vop);
        pm_runtime_put(vop->dev);
        mutex_unlock(&vop->vop_lock);