.early_unregister = dpu_encoder_early_unregister,
 };
 
-int dpu_encoder_setup(struct drm_device *dev, struct drm_encoder *enc,
+struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
+               int drm_enc_mode,
                struct msm_display_info *disp_info)
 {
        struct msm_drm_private *priv = dev->dev_private;
        struct dpu_encoder_virt *dpu_enc = NULL;
        int ret = 0;
 
-       dpu_enc = to_dpu_encoder_virt(enc);
+       dpu_enc = devm_kzalloc(dev->dev, sizeof(*dpu_enc), GFP_KERNEL);
+       if (!dpu_enc)
+               return ERR_PTR(-ENOMEM);
+
+       ret = drm_encoder_init(dev, &dpu_enc->base, &dpu_encoder_funcs,
+                              drm_enc_mode, NULL);
+       if (ret) {
+               devm_kfree(dev->dev, dpu_enc);
+               return ERR_PTR(ret);
+       }
+
+       drm_encoder_helper_add(&dpu_enc->base, &dpu_encoder_helper_funcs);
+
+       spin_lock_init(&dpu_enc->enc_spinlock);
+       dpu_enc->enabled = false;
+       mutex_init(&dpu_enc->enc_lock);
+       mutex_init(&dpu_enc->rc_lock);
 
        ret = dpu_encoder_setup_display(dpu_enc, dpu_kms, disp_info);
        if (ret)
 
        DPU_DEBUG_ENC(dpu_enc, "created\n");
 
-       return ret;
+       return &dpu_enc->base;
 
 fail:
        DPU_ERROR("failed to create encoder\n");
        if (drm_enc)
                dpu_encoder_destroy(drm_enc);
 
-       return ret;
-
-
-}
-
-struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
-               int drm_enc_mode)
-{
-       struct dpu_encoder_virt *dpu_enc = NULL;
-       int rc = 0;
-
-       dpu_enc = devm_kzalloc(dev->dev, sizeof(*dpu_enc), GFP_KERNEL);
-       if (!dpu_enc)
-               return ERR_PTR(-ENOMEM);
-
-
-       rc = drm_encoder_init(dev, &dpu_enc->base, &dpu_encoder_funcs,
-                                                         drm_enc_mode, NULL);
-       if (rc) {
-               devm_kfree(dev->dev, dpu_enc);
-               return ERR_PTR(rc);
-       }
-
-       drm_encoder_helper_add(&dpu_enc->base, &dpu_encoder_helper_funcs);
-
-       spin_lock_init(&dpu_enc->enc_spinlock);
-       dpu_enc->enabled = false;
-       mutex_init(&dpu_enc->enc_lock);
-       mutex_init(&dpu_enc->rc_lock);
-
-       return &dpu_enc->base;
+       return ERR_PTR(ret);
 }
 
 int dpu_encoder_wait_for_event(struct drm_encoder *drm_enc,
 
                    !msm_dsi_is_master_dsi(priv->dsi[i]))
                        continue;
 
-               encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_DSI);
+               memset(&info, 0, sizeof(info));
+               info.intf_type = INTF_DSI;
+
+               info.h_tile_instance[info.num_of_h_tiles++] = i;
+               if (msm_dsi_is_bonded_dsi(priv->dsi[i]))
+                       info.h_tile_instance[info.num_of_h_tiles++] = other;
+
+               info.is_cmd_mode = msm_dsi_is_cmd_mode(priv->dsi[i]);
+
+               info.dsc = msm_dsi_get_dsc_config(priv->dsi[i]);
+
+               encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_DSI, &info);
                if (IS_ERR(encoder)) {
                        DPU_ERROR("encoder init failed for dsi display\n");
                        return PTR_ERR(encoder);
                }
 
-               memset(&info, 0, sizeof(info));
-               info.intf_type = INTF_DSI;
-
                rc = msm_dsi_modeset_init(priv->dsi[i], dev, encoder);
                if (rc) {
                        DPU_ERROR("modeset_init failed for dsi[%d], rc = %d\n",
                        break;
                }
 
-               info.h_tile_instance[info.num_of_h_tiles++] = i;
-               info.is_cmd_mode = msm_dsi_is_cmd_mode(priv->dsi[i]);
-
-               info.dsc = msm_dsi_get_dsc_config(priv->dsi[i]);
-
                if (msm_dsi_is_bonded_dsi(priv->dsi[i]) && priv->dsi[other]) {
                        rc = msm_dsi_modeset_init(priv->dsi[other], dev, encoder);
                        if (rc) {
                                        other, rc);
                                break;
                        }
-
-                       info.h_tile_instance[info.num_of_h_tiles++] = other;
                }
-
-               rc = dpu_encoder_setup(dev, encoder, &info);
-               if (rc)
-                       DPU_ERROR("failed to setup DPU encoder %d: rc:%d\n",
-                                 encoder->base.id, rc);
        }
 
        return rc;
                if (!priv->dp[i])
                        continue;
 
-               encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_TMDS);
+               memset(&info, 0, sizeof(info));
+               info.num_of_h_tiles = 1;
+               info.h_tile_instance[0] = i;
+               info.intf_type = INTF_DP;
+
+               encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_TMDS, &info);
                if (IS_ERR(encoder)) {
                        DPU_ERROR("encoder init failed for dsi display\n");
                        return PTR_ERR(encoder);
                }
 
-               memset(&info, 0, sizeof(info));
                rc = msm_dp_modeset_init(priv->dp[i], dev, encoder);
                if (rc) {
                        DPU_ERROR("modeset_init failed for DP, rc = %d\n", rc);
                        drm_encoder_cleanup(encoder);
                        return rc;
                }
-
-               info.num_of_h_tiles = 1;
-               info.h_tile_instance[0] = i;
-               info.intf_type = INTF_DP;
-               rc = dpu_encoder_setup(dev, encoder, &info);
-               if (rc) {
-                       DPU_ERROR("failed to setup DPU encoder %d: rc:%d\n",
-                                 encoder->base.id, rc);
-                       return rc;
-               }
        }
 
        return 0;
        if (!priv->hdmi)
                return 0;
 
-       encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_TMDS);
+       memset(&info, 0, sizeof(info));
+       info.num_of_h_tiles = 1;
+       info.h_tile_instance[0] = 0;
+       info.intf_type = INTF_HDMI;
+
+       encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_TMDS, &info);
        if (IS_ERR(encoder)) {
                DPU_ERROR("encoder init failed for HDMI display\n");
                return PTR_ERR(encoder);
        }
 
-       memset(&info, 0, sizeof(info));
        rc = msm_hdmi_modeset_init(priv->hdmi, dev, encoder);
        if (rc) {
                DPU_ERROR("modeset_init failed for DP, rc = %d\n", rc);
                return rc;
        }
 
-       info.num_of_h_tiles = 1;
-       info.h_tile_instance[0] = 0;
-       info.intf_type = INTF_HDMI;
-       rc = dpu_encoder_setup(dev, encoder, &info);
-       if (rc) {
-               DPU_ERROR("failed to setup DPU encoder %d: rc:%d\n",
-                         encoder->base.id, rc);
-               return rc;
-       }
-
        return 0;
 }
 
        struct msm_display_info info;
        int rc;
 
-       encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_VIRTUAL);
+       memset(&info, 0, sizeof(info));
+
+       info.num_of_h_tiles = 1;
+       /* use only WB idx 2 instance for DPU */
+       info.h_tile_instance[0] = WB_2;
+       info.intf_type = INTF_WB;
+
+       encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_VIRTUAL, &info);
        if (IS_ERR(encoder)) {
                DPU_ERROR("encoder init failed for dsi display\n");
                return PTR_ERR(encoder);
        }
 
-       memset(&info, 0, sizeof(info));
-
        rc = dpu_writeback_init(dev, encoder, wb_formats,
                        n_formats);
        if (rc) {
                return rc;
        }
 
-       info.num_of_h_tiles = 1;
-       /* use only WB idx 2 instance for DPU */
-       info.h_tile_instance[0] = WB_2;
-       info.intf_type = INTF_WB;
-
-       rc = dpu_encoder_setup(dev, encoder, &info);
-       if (rc) {
-               DPU_ERROR("failed to setup DPU encoder %d: rc:%d\n",
-                                 encoder->base.id, rc);
-               return rc;
-       }
-
        return 0;
 }