static void mtk_drm_crtc_destroy(struct drm_crtc *crtc)
 {
        struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
-       int i;
-
-       for (i = 0; i < mtk_crtc->ddp_comp_nr; i++)
-               clk_unprepare(mtk_crtc->ddp_comp[i]->clk);
 
        mtk_disp_mutex_put(mtk_crtc->mutex);
 
 
        DRM_DEBUG_DRIVER("%s\n", __func__);
        for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) {
-               ret = clk_enable(mtk_crtc->ddp_comp[i]->clk);
+               ret = clk_prepare_enable(mtk_crtc->ddp_comp[i]->clk);
                if (ret) {
                        DRM_ERROR("Failed to enable clock %d: %d\n", i, ret);
                        goto err;
        return 0;
 err:
        while (--i >= 0)
-               clk_disable(mtk_crtc->ddp_comp[i]->clk);
+               clk_disable_unprepare(mtk_crtc->ddp_comp[i]->clk);
        return ret;
 }
 
 
        DRM_DEBUG_DRIVER("%s\n", __func__);
        for (i = 0; i < mtk_crtc->ddp_comp_nr; i++)
-               clk_disable(mtk_crtc->ddp_comp[i]->clk);
+               clk_disable_unprepare(mtk_crtc->ddp_comp[i]->clk);
 }
 
 static int mtk_crtc_ddp_hw_init(struct mtk_drm_crtc *mtk_crtc)
                if (!comp) {
                        dev_err(dev, "Component %pOF not initialized\n", node);
                        ret = -ENODEV;
-                       goto unprepare;
-               }
-
-               ret = clk_prepare(comp->clk);
-               if (ret) {
-                       dev_err(dev,
-                               "Failed to prepare clock for component %pOF: %d\n",
-                               node, ret);
-                       goto unprepare;
+                       return ret;
                }
 
                mtk_crtc->ddp_comp[i] = comp;
                ret = mtk_plane_init(drm_dev, &mtk_crtc->planes[zpos],
                                     BIT(pipe), type);
                if (ret)
-                       goto unprepare;
+                       return ret;
        }
 
        ret = mtk_drm_crtc_init(drm_dev, mtk_crtc, &mtk_crtc->planes[0],
                                mtk_crtc->layer_nr > 1 ? &mtk_crtc->planes[1] :
                                NULL, pipe);
        if (ret < 0)
-               goto unprepare;
+               return ret;
        drm_mode_crtc_set_gamma_size(&mtk_crtc->base, MTK_LUT_SIZE);
        drm_crtc_enable_color_mgmt(&mtk_crtc->base, 0, false, MTK_LUT_SIZE);
        priv->num_pipes++;
 
        return 0;
-
-unprepare:
-       while (--i >= 0)
-               clk_unprepare(mtk_crtc->ddp_comp[i]->clk);
-
-       return ret;
 }