static int prp_registered(struct v4l2_subdev *sd)
 {
        struct prp_priv *priv = sd_to_priv(sd);
+       struct imx_ic_priv *ic_priv = priv->ic_priv;
        int i, ret;
        u32 code;
 
        if (ret)
                return ret;
 
+       priv->vdev = imx_media_capture_device_init(ic_priv->ipu_dev,
+                                                  &ic_priv->sd,
+                                                  PRPENCVF_SRC_PAD);
+       if (IS_ERR(priv->vdev))
+               return PTR_ERR(priv->vdev);
+
        ret = imx_media_capture_device_register(priv->vdev);
        if (ret)
-               return ret;
+               goto remove_vdev;
 
        ret = prp_init_controls(priv);
        if (ret)
-               goto unreg;
+               goto unreg_vdev;
 
        return 0;
-unreg:
+
+unreg_vdev:
        imx_media_capture_device_unregister(priv->vdev);
+remove_vdev:
+       imx_media_capture_device_remove(priv->vdev);
        return ret;
 }
 
        struct prp_priv *priv = sd_to_priv(sd);
 
        imx_media_capture_device_unregister(priv->vdev);
+       imx_media_capture_device_remove(priv->vdev);
+
        v4l2_ctrl_handler_free(&priv->ctrl_hdlr);
 }
 
        spin_lock_init(&priv->irqlock);
        timer_setup(&priv->eof_timeout_timer, prp_eof_timeout, 0);
 
-       priv->vdev = imx_media_capture_device_init(ic_priv->ipu_dev,
-                                                  &ic_priv->sd,
-                                                  PRPENCVF_SRC_PAD);
-       if (IS_ERR(priv->vdev))
-               return PTR_ERR(priv->vdev);
-
        mutex_init(&priv->lock);
 
        return 0;
        struct prp_priv *priv = ic_priv->task_priv;
 
        mutex_destroy(&priv->lock);
-       imx_media_capture_device_remove(priv->vdev);
 }
 
 struct imx_ic_ops imx_ic_prpencvf_ops = {
 
        if (ret)
                goto free_fim;
 
+       priv->vdev = imx_media_capture_device_init(priv->sd.dev,
+                                                  &priv->sd,
+                                                  CSI_SRC_PAD_IDMAC);
+       if (IS_ERR(priv->vdev)) {
+               ret = PTR_ERR(priv->vdev);
+               goto free_fim;
+       }
+
        ret = imx_media_capture_device_register(priv->vdev);
        if (ret)
-               goto free_fim;
+               goto remove_vdev;
 
        return 0;
 
+remove_vdev:
+       imx_media_capture_device_remove(priv->vdev);
 free_fim:
        if (priv->fim)
                imx_media_fim_free(priv->fim);
        struct csi_priv *priv = v4l2_get_subdevdata(sd);
 
        imx_media_capture_device_unregister(priv->vdev);
+       imx_media_capture_device_remove(priv->vdev);
 
        if (priv->fim)
                imx_media_fim_free(priv->fim);
        imx_media_grp_id_to_sd_name(priv->sd.name, sizeof(priv->sd.name),
                                    priv->sd.grp_id, ipu_get_num(priv->ipu));
 
-       priv->vdev = imx_media_capture_device_init(priv->sd.dev, &priv->sd,
-                                                  CSI_SRC_PAD_IDMAC);
-       if (IS_ERR(priv->vdev))
-               return PTR_ERR(priv->vdev);
-
        mutex_init(&priv->lock);
 
        v4l2_ctrl_handler_init(&priv->ctrl_hdlr, 0);
 free:
        v4l2_ctrl_handler_free(&priv->ctrl_hdlr);
        mutex_destroy(&priv->lock);
-       imx_media_capture_device_remove(priv->vdev);
        return ret;
 }
 
 
        v4l2_ctrl_handler_free(&priv->ctrl_hdlr);
        mutex_destroy(&priv->lock);
-       imx_media_capture_device_remove(priv->vdev);
        v4l2_async_unregister_subdev(sd);
        media_entity_cleanup(&sd->entity);
 
 
        if (ret < 0)
                return ret;
 
-       return imx_media_capture_device_register(csi->vdev);
+       csi->vdev = imx_media_capture_device_init(csi->sd.dev, &csi->sd,
+                                                 IMX7_CSI_PAD_SRC);
+       if (IS_ERR(csi->vdev))
+               return PTR_ERR(csi->vdev);
+
+       ret = imx_media_capture_device_register(csi->vdev);
+       if (ret)
+               imx_media_capture_device_remove(csi->vdev);
+
+       return ret;
 }
 
 static void imx7_csi_unregistered(struct v4l2_subdev *sd)
        struct imx7_csi *csi = v4l2_get_subdevdata(sd);
 
        imx_media_capture_device_unregister(csi->vdev);
+       imx_media_capture_device_remove(csi->vdev);
 }
 
 static int imx7_csi_init_cfg(struct v4l2_subdev *sd,
        csi->sd.grp_id = IMX_MEDIA_GRP_ID_CSI;
        snprintf(csi->sd.name, sizeof(csi->sd.name), "csi");
 
-       csi->vdev = imx_media_capture_device_init(csi->sd.dev, &csi->sd,
-                                                 IMX7_CSI_PAD_SRC);
-       if (IS_ERR(csi->vdev))
-               return PTR_ERR(csi->vdev);
-
        v4l2_ctrl_handler_init(&csi->ctrl_hdlr, 0);
        csi->sd.ctrl_handler = &csi->ctrl_hdlr;
 
        return 0;
 
 free:
-       imx_media_capture_device_unregister(csi->vdev);
-       imx_media_capture_device_remove(csi->vdev);
        v4l2_ctrl_handler_free(&csi->ctrl_hdlr);
 
 cleanup:
        v4l2_device_unregister(&imxmd->v4l2_dev);
        media_device_cleanup(&imxmd->md);
 
-       imx_media_capture_device_unregister(csi->vdev);
-       imx_media_capture_device_remove(csi->vdev);
-
        v4l2_async_unregister_subdev(sd);
        v4l2_ctrl_handler_free(&csi->ctrl_hdlr);