if (mux < 0)
                return;
 
-       pm_runtime_get_sync(dsi->dev);
-       if (dsi->slave)
-               pm_runtime_get_sync(dsi->slave->dev);
-
        /*
         * For the RK3399, the clk of grf must be enabled before writing grf
         * register. And for RK3288 or other soc, this grf_clk must be NULL,
        clk_disable_unprepare(dsi->grf_clk);
 }
 
-static void dw_mipi_dsi_encoder_disable(struct drm_encoder *encoder)
-{
-       struct dw_mipi_dsi_rockchip *dsi = to_dsi(encoder);
-
-       if (dsi->slave)
-               pm_runtime_put(dsi->slave->dev);
-       pm_runtime_put(dsi->dev);
-}
-
 static const struct drm_encoder_helper_funcs
 dw_mipi_dsi_encoder_helper_funcs = {
        .atomic_check = dw_mipi_dsi_encoder_atomic_check,
        .enable = dw_mipi_dsi_encoder_enable,
-       .disable = dw_mipi_dsi_encoder_disable,
 };
 
 static int rockchip_dsi_drm_create_encoder(struct dw_mipi_dsi_rockchip *dsi,
                put_device(second);
        }
 
+       pm_runtime_get_sync(dsi->dev);
+       if (dsi->slave)
+               pm_runtime_get_sync(dsi->slave->dev);
+
        ret = clk_prepare_enable(dsi->pllref_clk);
        if (ret) {
                DRM_DEV_ERROR(dev, "Failed to enable pllref_clk: %d\n", ret);
-               return ret;
+               goto out_pm_runtime;
        }
 
        /*
        ret = clk_prepare_enable(dsi->grf_clk);
        if (ret) {
                DRM_DEV_ERROR(dsi->dev, "Failed to enable grf_clk: %d\n", ret);
-               return ret;
+               goto out_pm_runtime;
        }
 
        dw_mipi_dsi_rockchip_config(dsi);
        ret = rockchip_dsi_drm_create_encoder(dsi, drm_dev);
        if (ret) {
                DRM_DEV_ERROR(dev, "Failed to create drm encoder\n");
-               return ret;
+               goto out_pm_runtime;
        }
 
        ret = dw_mipi_dsi_bind(dsi->dmd, &dsi->encoder);
        if (ret) {
                DRM_DEV_ERROR(dev, "Failed to bind: %d\n", ret);
-               return ret;
+               goto out_pm_runtime;
        }
 
        return 0;
+
+out_pm_runtime:
+       pm_runtime_put(dsi->dev);
+       if (dsi->slave)
+               pm_runtime_put(dsi->slave->dev);
+
+       return ret;
 }
 
 static void dw_mipi_dsi_rockchip_unbind(struct device *dev,
        dw_mipi_dsi_unbind(dsi->dmd);
 
        clk_disable_unprepare(dsi->pllref_clk);
+
+       pm_runtime_put(dsi->dev);
+       if (dsi->slave)
+               pm_runtime_put(dsi->slave->dev);
 }
 
 static const struct component_ops dw_mipi_dsi_rockchip_ops = {