struct v4l2_subdev subdev;
        struct v4l2_async_notifier notifier;
        struct media_pad *pads;
-       struct v4l2_mbus_framefmt *format_mbus;
        struct mux_control *mux;
        struct mutex lock;
        int active;
        mutex_lock(&vmux->lock);
 
        if (flags & MEDIA_LNK_FL_ENABLED) {
+               struct v4l2_subdev_state *sd_state;
+               struct v4l2_mbus_framefmt *source_mbusformat;
+
                if (vmux->active == local->index)
                        goto out;
 
                vmux->active = local->index;
 
                /* Propagate the active format to the source */
-               vmux->format_mbus[source_pad] = vmux->format_mbus[vmux->active];
+               sd_state = v4l2_subdev_lock_and_get_active_state(sd);
+               source_mbusformat = v4l2_subdev_get_pad_format(sd, sd_state,
+                                                              source_pad);
+               *source_mbusformat = *v4l2_subdev_get_pad_format(sd, sd_state,
+                                                                vmux->active);
+               v4l2_subdev_unlock_state(sd_state);
        } else {
                if (vmux->active != local->index)
                        goto out;
        .s_stream = video_mux_s_stream,
 };
 
-static struct v4l2_mbus_framefmt *
-__video_mux_get_pad_format(struct v4l2_subdev *sd,
-                          struct v4l2_subdev_state *sd_state,
-                          unsigned int pad, u32 which)
-{
-       struct video_mux *vmux = v4l2_subdev_to_video_mux(sd);
-
-       switch (which) {
-       case V4L2_SUBDEV_FORMAT_TRY:
-               return v4l2_subdev_get_try_format(sd, sd_state, pad);
-       case V4L2_SUBDEV_FORMAT_ACTIVE:
-               return &vmux->format_mbus[pad];
-       default:
-               return NULL;
-       }
-}
-
-static int video_mux_get_format(struct v4l2_subdev *sd,
-                           struct v4l2_subdev_state *sd_state,
-                           struct v4l2_subdev_format *sdformat)
-{
-       struct video_mux *vmux = v4l2_subdev_to_video_mux(sd);
-
-       mutex_lock(&vmux->lock);
-
-       sdformat->format = *__video_mux_get_pad_format(sd, sd_state,
-                                                      sdformat->pad,
-                                                      sdformat->which);
-
-       mutex_unlock(&vmux->lock);
-
-       return 0;
-}
-
 static int video_mux_set_format(struct v4l2_subdev *sd,
                            struct v4l2_subdev_state *sd_state,
                            struct v4l2_subdev_format *sdformat)
        struct media_pad *pad = &vmux->pads[sdformat->pad];
        u16 source_pad = sd->entity.num_pads - 1;
 
-       mbusformat = __video_mux_get_pad_format(sd, sd_state, sdformat->pad,
-                                               sdformat->which);
+       mbusformat = v4l2_subdev_get_pad_format(sd, sd_state, sdformat->pad);
        if (!mbusformat)
                return -EINVAL;
 
-       source_mbusformat = __video_mux_get_pad_format(sd, sd_state,
-                                                      source_pad,
-                                                      sdformat->which);
+       source_mbusformat = v4l2_subdev_get_pad_format(sd, sd_state, source_pad);
        if (!source_mbusformat)
                return -EINVAL;
 
 
        /* Source pad mirrors active sink pad, no limitations on sink pads */
        if ((pad->flags & MEDIA_PAD_FL_SOURCE) && vmux->active >= 0)
-               sdformat->format = vmux->format_mbus[vmux->active];
+               sdformat->format = *v4l2_subdev_get_pad_format(sd, sd_state,
+                                                              vmux->active);
 
        *mbusformat = sdformat->format;
 
        mutex_lock(&vmux->lock);
 
        for (i = 0; i < sd->entity.num_pads; i++) {
-               mbusformat = v4l2_subdev_get_try_format(sd, sd_state, i);
+               mbusformat = v4l2_subdev_get_pad_format(sd, sd_state, i);
                *mbusformat = video_mux_format_mbus_default;
        }
 
 
 static const struct v4l2_subdev_pad_ops video_mux_pad_ops = {
        .init_cfg = video_mux_init_cfg,
-       .get_fmt = video_mux_get_format,
+       .get_fmt = v4l2_subdev_get_fmt,
        .set_fmt = video_mux_set_format,
 };
 
        if (!vmux->pads)
                return -ENOMEM;
 
-       vmux->format_mbus = devm_kcalloc(dev, num_pads,
-                                        sizeof(*vmux->format_mbus),
-                                        GFP_KERNEL);
-       if (!vmux->format_mbus)
-               return -ENOMEM;
-
-       for (i = 0; i < num_pads; i++) {
+       for (i = 0; i < num_pads; i++)
                vmux->pads[i].flags = (i < num_pads - 1) ? MEDIA_PAD_FL_SINK
                                                         : MEDIA_PAD_FL_SOURCE;
-               vmux->format_mbus[i] = video_mux_format_mbus_default;
-       }
 
        vmux->subdev.entity.function = MEDIA_ENT_F_VID_MUX;
        ret = media_entity_pads_init(&vmux->subdev.entity, num_pads,
 
        vmux->subdev.entity.ops = &video_mux_ops;
 
+       ret = v4l2_subdev_init_finalize(&vmux->subdev);
+       if (ret < 0)
+               goto err_entity_cleanup;
+
        ret = video_mux_async_register(vmux, num_pads - 1);
        if (ret)
-               goto err_entity_cleanup;
+               goto err_subdev_cleanup;
 
        return 0;
 
+err_subdev_cleanup:
+       v4l2_subdev_cleanup(&vmux->subdev);
 err_entity_cleanup:
        media_entity_cleanup(&vmux->subdev.entity);
        return ret;
        v4l2_async_nf_unregister(&vmux->notifier);
        v4l2_async_nf_cleanup(&vmux->notifier);
        v4l2_async_unregister_subdev(sd);
+       v4l2_subdev_cleanup(sd);
        media_entity_cleanup(&sd->entity);
 }