return 0;
 }
 
-/*
- * retrieve our pads parsed from the OF graph by the media device
- */
 static int prp_registered(struct v4l2_subdev *sd)
 {
        struct prp_priv *priv = sd_to_priv(sd);
-       int i, ret;
        u32 code;
 
-       for (i = 0; i < PRP_NUM_PADS; i++) {
-               priv->pad[i].flags = (i == PRP_SINK_PAD) ?
-                       MEDIA_PAD_FL_SINK : MEDIA_PAD_FL_SOURCE;
-       }
-
        /* init default frame interval */
        priv->frame_interval.numerator = 1;
        priv->frame_interval.denominator = 30;
 
        /* set a default mbus format  */
        imx_media_enum_ipu_format(&code, 0, CS_SEL_YUV);
-       ret = imx_media_init_mbus_fmt(&priv->format_mbus, 640, 480, code,
-                                     V4L2_FIELD_NONE, NULL);
-       if (ret)
-               return ret;
-
-       return media_entity_pads_init(&sd->entity, PRP_NUM_PADS, priv->pad);
+       return imx_media_init_mbus_fmt(&priv->format_mbus, 640, 480, code,
+                                      V4L2_FIELD_NONE, NULL);
 }
 
 static const struct v4l2_subdev_pad_ops prp_pad_ops = {
 static int prp_init(struct imx_ic_priv *ic_priv)
 {
        struct prp_priv *priv;
+       int i;
 
        priv = devm_kzalloc(ic_priv->ipu_dev, sizeof(*priv), GFP_KERNEL);
        if (!priv)
        ic_priv->task_priv = priv;
        priv->ic_priv = ic_priv;
 
-       return 0;
+       for (i = 0; i < PRP_NUM_PADS; i++)
+               priv->pad[i].flags = (i == PRP_SINK_PAD) ?
+                       MEDIA_PAD_FL_SINK : MEDIA_PAD_FL_SOURCE;
+
+       return media_entity_pads_init(&ic_priv->sd.entity, PRP_NUM_PADS,
+                                     priv->pad);
 }
 
 static void prp_remove(struct imx_ic_priv *ic_priv)
 
        return 0;
 }
 
-/*
- * retrieve our pads parsed from the OF graph by the media device
- */
 static int prp_registered(struct v4l2_subdev *sd)
 {
        struct prp_priv *priv = sd_to_priv(sd);
        int i, ret;
        u32 code;
 
+       /* set a default mbus format  */
+       imx_media_enum_ipu_format(&code, 0, CS_SEL_YUV);
        for (i = 0; i < PRPENCVF_NUM_PADS; i++) {
-               priv->pad[i].flags = (i == PRPENCVF_SINK_PAD) ?
-                       MEDIA_PAD_FL_SINK : MEDIA_PAD_FL_SOURCE;
-
-               /* set a default mbus format  */
-               imx_media_enum_ipu_format(&code, 0, CS_SEL_YUV);
                ret = imx_media_init_mbus_fmt(&priv->format_mbus[i],
                                              640, 480, code, V4L2_FIELD_NONE,
                                              &priv->cc[i]);
        priv->frame_interval.numerator = 1;
        priv->frame_interval.denominator = 30;
 
-       ret = media_entity_pads_init(&sd->entity, PRPENCVF_NUM_PADS,
-                                    priv->pad);
-       if (ret)
-               return ret;
-
        priv->vdev = imx_media_capture_device_init(ic_priv->ipu_dev,
                                                   &ic_priv->sd,
                                                   PRPENCVF_SRC_PAD);
 static int prp_init(struct imx_ic_priv *ic_priv)
 {
        struct prp_priv *priv;
+       int i, ret;
 
        priv = devm_kzalloc(ic_priv->ipu_dev, sizeof(*priv), GFP_KERNEL);
        if (!priv)
 
        mutex_init(&priv->lock);
 
-       return 0;
+       for (i = 0; i < PRPENCVF_NUM_PADS; i++) {
+               priv->pad[i].flags = (i == PRPENCVF_SINK_PAD) ?
+                       MEDIA_PAD_FL_SINK : MEDIA_PAD_FL_SOURCE;
+       }
+
+       ret = media_entity_pads_init(&ic_priv->sd.entity, PRPENCVF_NUM_PADS,
+                                    priv->pad);
+       if (ret)
+               mutex_destroy(&priv->lock);
+
+       return ret;
 }
 
 static void prp_remove(struct imx_ic_priv *ic_priv)
 
 
        INIT_LIST_HEAD(&priv->ready_q);
 
-       priv->vdev_pad.flags = MEDIA_PAD_FL_SINK;
-       ret = media_entity_pads_init(&vfd->entity, 1, &priv->vdev_pad);
-       if (ret) {
-               v4l2_err(sd, "failed to init dev pad\n");
-               goto unreg;
-       }
-
        /* create the link from the src_sd devnode pad to device node */
        ret = media_create_pad_link(&sd->entity, priv->src_sd_pad,
                                    &vfd->entity, 0, 0);
 {
        struct capture_priv *priv;
        struct video_device *vfd;
+       int ret;
 
        priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
        if (!priv)
        vfd->queue = &priv->q;
        priv->vdev.vfd = vfd;
 
+       priv->vdev_pad.flags = MEDIA_PAD_FL_SINK;
+       ret = media_entity_pads_init(&vfd->entity, 1, &priv->vdev_pad);
+       if (ret) {
+               video_device_release(vfd);
+               return ERR_PTR(ret);
+       }
+
        INIT_LIST_HEAD(&priv->vdev.list);
 
        video_set_drvdata(vfd, priv);
 
        return v4l2_event_unsubscribe(fh, sub);
 }
 
-/*
- * retrieve our pads parsed from the OF graph by the media device
- */
 static int csi_registered(struct v4l2_subdev *sd)
 {
        struct csi_priv *priv = v4l2_get_subdevdata(sd);
        priv->csi = csi;
 
        for (i = 0; i < CSI_NUM_PADS; i++) {
-               priv->pad[i].flags = (i == CSI_SINK_PAD) ?
-                       MEDIA_PAD_FL_SINK : MEDIA_PAD_FL_SOURCE;
-
                code = 0;
                if (i != CSI_SINK_PAD)
                        imx_media_enum_ipu_format(&code, 0, CS_SEL_YUV);
                goto put_csi;
        }
 
-       ret = media_entity_pads_init(&sd->entity, CSI_NUM_PADS, priv->pad);
-       if (ret)
-               goto free_fim;
-
        priv->vdev = imx_media_capture_device_init(priv->sd.dev,
                                                   &priv->sd,
                                                   CSI_SRC_PAD_IDMAC);
        struct ipu_client_platformdata *pdata;
        struct pinctrl *pinctrl;
        struct csi_priv *priv;
-       int ret;
+       int i, ret;
 
        priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
        if (!priv)
        imx_media_grp_id_to_sd_name(priv->sd.name, sizeof(priv->sd.name),
                                    priv->sd.grp_id, ipu_get_num(priv->ipu));
 
+       for (i = 0; i < CSI_NUM_PADS; i++)
+               priv->pad[i].flags = (i == CSI_SINK_PAD) ?
+                       MEDIA_PAD_FL_SINK : MEDIA_PAD_FL_SOURCE;
+
+       ret = media_entity_pads_init(&priv->sd.entity, CSI_NUM_PADS,
+                                    priv->pad);
+       if (ret)
+               return ret;
+
        mutex_init(&priv->lock);
 
        v4l2_ctrl_handler_init(&priv->ctrl_hdlr, 0);
 
        return ret;
 }
 
-/*
- * retrieve our pads parsed from the OF graph by the media device
- */
 static int vdic_registered(struct v4l2_subdev *sd)
 {
        struct vdic_priv *priv = v4l2_get_subdevdata(sd);
        u32 code;
 
        for (i = 0; i < VDIC_NUM_PADS; i++) {
-               priv->pad[i].flags = (i == VDIC_SRC_PAD_DIRECT) ?
-                       MEDIA_PAD_FL_SOURCE : MEDIA_PAD_FL_SINK;
-
                code = 0;
                if (i != VDIC_SINK_PAD_IDMAC)
                        imx_media_enum_ipu_format(&code, 0, CS_SEL_YUV);
 
        priv->active_input_pad = VDIC_SINK_PAD_DIRECT;
 
-       ret = vdic_init_controls(priv);
-       if (ret)
-               return ret;
-
-       ret = media_entity_pads_init(&sd->entity, VDIC_NUM_PADS, priv->pad);
-       if (ret)
-               v4l2_ctrl_handler_free(&priv->ctrl_hdlr);
-
-       return ret;
+       return vdic_init_controls(priv);
 }
 
 static void vdic_unregistered(struct v4l2_subdev *sd)
                                            u32 grp_id)
 {
        struct vdic_priv *priv;
-       int ret;
+       int i, ret;
 
        priv = devm_kzalloc(ipu_dev, sizeof(*priv), GFP_KERNEL);
        if (!priv)
 
        mutex_init(&priv->lock);
 
+       for (i = 0; i < VDIC_NUM_PADS; i++)
+               priv->pad[i].flags = (i == VDIC_SRC_PAD_DIRECT) ?
+                       MEDIA_PAD_FL_SOURCE : MEDIA_PAD_FL_SINK;
+
+       ret = media_entity_pads_init(&priv->sd.entity, VDIC_NUM_PADS,
+                                    priv->pad);
+       if (ret)
+               goto free;
+
        ret = v4l2_device_register_subdev(v4l2_dev, &priv->sd);
        if (ret)
                goto free;
 
        return ret;
 }
 
-/*
- * retrieve our pads parsed from the OF graph by the media device
- */
 static int csi2_registered(struct v4l2_subdev *sd)
 {
        struct csi2_dev *csi2 = sd_to_dev(sd);
-       int i, ret;
-
-       for (i = 0; i < CSI2_NUM_PADS; i++) {
-               csi2->pad[i].flags = (i == CSI2_SINK_PAD) ?
-               MEDIA_PAD_FL_SINK : MEDIA_PAD_FL_SOURCE;
-       }
 
        /* set a default mbus format  */
-       ret = imx_media_init_mbus_fmt(&csi2->format_mbus,
+       return imx_media_init_mbus_fmt(&csi2->format_mbus,
                                      640, 480, 0, V4L2_FIELD_NONE, NULL);
-       if (ret)
-               return ret;
-
-       return media_entity_pads_init(&sd->entity, CSI2_NUM_PADS, csi2->pad);
 }
 
 static const struct media_entity_operations csi2_entity_ops = {
        unsigned int sink_port = 0;
        struct csi2_dev *csi2;
        struct resource *res;
-       int ret;
+       int i, ret;
 
        csi2 = devm_kzalloc(&pdev->dev, sizeof(*csi2), GFP_KERNEL);
        if (!csi2)
        csi2->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
        csi2->sd.grp_id = IMX_MEDIA_GRP_ID_CSI2;
 
+       for (i = 0; i < CSI2_NUM_PADS; i++) {
+               csi2->pad[i].flags = (i == CSI2_SINK_PAD) ?
+               MEDIA_PAD_FL_SINK : MEDIA_PAD_FL_SOURCE;
+       }
+
+       ret = media_entity_pads_init(&csi2->sd.entity, CSI2_NUM_PADS,
+                                    csi2->pad);
+       if (ret)
+               return ret;
+
        csi2->pllref_clk = devm_clk_get(&pdev->dev, "ref");
        if (IS_ERR(csi2->pllref_clk)) {
                v4l2_err(&csi2->sd, "failed to get pll reference clock\n");
 
        int i;
 
        for (i = 0; i < IMX7_CSI_PADS_NUM; i++) {
-               csi->pad[i].flags = (i == IMX7_CSI_PAD_SINK) ?
-                       MEDIA_PAD_FL_SINK : MEDIA_PAD_FL_SOURCE;
-
                /* set a default mbus format  */
                ret = imx_media_init_mbus_fmt(&csi->format_mbus[i],
                                              800, 600, 0, V4L2_FIELD_NONE,
                csi->frame_interval[i].denominator = 30;
        }
 
-       ret = media_entity_pads_init(&sd->entity, IMX7_CSI_PADS_NUM, csi->pad);
-       if (ret < 0)
-               return ret;
-
        csi->vdev = imx_media_capture_device_init(csi->sd.dev, &csi->sd,
                                                  IMX7_CSI_PAD_SRC);
        if (IS_ERR(csi->vdev))
        struct device_node *node = dev->of_node;
        struct imx_media_dev *imxmd;
        struct imx7_csi *csi;
-       int ret;
+       int i, ret;
 
        csi = devm_kzalloc(&pdev->dev, sizeof(*csi), GFP_KERNEL);
        if (!csi)
        v4l2_ctrl_handler_init(&csi->ctrl_hdlr, 0);
        csi->sd.ctrl_handler = &csi->ctrl_hdlr;
 
+       for (i = 0; i < IMX7_CSI_PADS_NUM; i++)
+               csi->pad[i].flags = (i == IMX7_CSI_PAD_SINK) ?
+                       MEDIA_PAD_FL_SINK : MEDIA_PAD_FL_SOURCE;
+
+       ret = media_entity_pads_init(&csi->sd.entity, IMX7_CSI_PADS_NUM,
+                                    csi->pad);
+       if (ret < 0)
+               goto free;
+
        ret = v4l2_async_register_fwnode_subdev(&csi->sd,
                                                sizeof(struct v4l2_async_subdev),
                                                NULL, 0,
 
        return IRQ_HANDLED;
 }
 
-static int mipi_csis_registered(struct v4l2_subdev *mipi_sd)
-{
-       struct csi_state *state = mipi_sd_to_csis_state(mipi_sd);
-
-       state->pads[CSIS_PAD_SINK].flags = MEDIA_PAD_FL_SINK;
-       state->pads[CSIS_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE;
-
-       return media_entity_pads_init(&state->mipi_sd.entity, CSIS_PADS_NUM,
-                                     state->pads);
-}
-
 static const struct v4l2_subdev_core_ops mipi_csis_core_ops = {
        .log_status     = mipi_csis_log_status,
 };
        .pad    = &mipi_csis_pad_ops,
 };
 
-static const struct v4l2_subdev_internal_ops mipi_csis_internal_ops = {
-       .registered = mipi_csis_registered,
-};
-
 static int mipi_csis_parse_dt(struct platform_device *pdev,
                              struct csi_state *state)
 {
 
        mipi_sd->entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
        mipi_sd->entity.ops = &mipi_csis_entity_ops;
-       mipi_sd->internal_ops = &mipi_csis_internal_ops;
 
        mipi_sd->dev = &pdev->dev;
 
 
        v4l2_set_subdevdata(mipi_sd, &pdev->dev);
 
+       state->pads[CSIS_PAD_SINK].flags = MEDIA_PAD_FL_SINK;
+       state->pads[CSIS_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE;
+       ret = media_entity_pads_init(&mipi_sd->entity, CSIS_PADS_NUM,
+                                    state->pads);
+       if (ret)
+               return ret;
+
        ret = v4l2_async_register_fwnode_subdev(mipi_sd,
                                                sizeof(struct v4l2_async_subdev),
                                                &sink_port, 1,