return vidioc_s_fmt_vid_cap(file, priv, f);
 }
 
+static int vivid_g_fmt_cap_mplane(struct file *file, void *priv,
+                                 struct v4l2_format *f)
+{
+       struct video_device *vdev = video_devdata(file);
+
+       if (vdev->vfl_type == VFL_TYPE_TOUCH)
+               return vivid_g_fmt_tch_mplane(file, priv, f);
+       return vidioc_g_fmt_vid_cap_mplane(file, priv, f);
+}
+
+static int vivid_try_fmt_cap_mplane(struct file *file, void *priv,
+                                   struct v4l2_format *f)
+{
+       struct video_device *vdev = video_devdata(file);
+
+       if (vdev->vfl_type == VFL_TYPE_TOUCH)
+               return vivid_g_fmt_tch_mplane(file, priv, f);
+       return vidioc_try_fmt_vid_cap_mplane(file, priv, f);
+}
+
+static int vivid_s_fmt_cap_mplane(struct file *file, void *priv,
+                                 struct v4l2_format *f)
+{
+       struct video_device *vdev = video_devdata(file);
+
+       if (vdev->vfl_type == VFL_TYPE_TOUCH)
+               return vivid_g_fmt_tch_mplane(file, priv, f);
+       return vidioc_s_fmt_vid_cap_mplane(file, priv, f);
+}
+
 static bool vivid_is_in_use(struct video_device *vdev)
 {
        unsigned long flags;
        .vidioc_g_fmt_vid_cap           = vivid_g_fmt_cap,
        .vidioc_try_fmt_vid_cap         = vivid_try_fmt_cap,
        .vidioc_s_fmt_vid_cap           = vivid_s_fmt_cap,
-       .vidioc_g_fmt_vid_cap_mplane    = vidioc_g_fmt_vid_cap_mplane,
-       .vidioc_try_fmt_vid_cap_mplane  = vidioc_try_fmt_vid_cap_mplane,
-       .vidioc_s_fmt_vid_cap_mplane    = vidioc_s_fmt_vid_cap_mplane,
+       .vidioc_g_fmt_vid_cap_mplane    = vivid_g_fmt_cap_mplane,
+       .vidioc_try_fmt_vid_cap_mplane  = vivid_try_fmt_cap_mplane,
+       .vidioc_s_fmt_vid_cap_mplane    = vivid_s_fmt_cap_mplane,
 
        .vidioc_enum_fmt_vid_out        = vivid_enum_fmt_vid,
        .vidioc_g_fmt_vid_out           = vidioc_g_fmt_vid_out,
                        dev->meta_out_caps |= V4L2_CAP_AUDIO;
        }
        /* set up the capabilities of the touch capture device */
-       if (dev->has_touch_cap)
-               dev->touch_cap_caps = V4L2_CAP_TOUCH | V4L2_CAP_VIDEO_CAPTURE |
-                                     V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;
+       if (dev->has_touch_cap) {
+               dev->touch_cap_caps = V4L2_CAP_TOUCH | V4L2_CAP_STREAMING |
+                                     V4L2_CAP_READWRITE;
+               dev->touch_cap_caps |= dev->multiplanar ?
+                       V4L2_CAP_VIDEO_CAPTURE_MPLANE : V4L2_CAP_VIDEO_CAPTURE;
+       }
 
        ret = -ENOMEM;
        /* initialize the test pattern generator */
 
 
 #include "vivid-core.h"
 #include "vivid-kthread-touch.h"
+#include "vivid-vid-common.h"
 #include "vivid-touch-cap.h"
 
 static int touch_cap_queue_setup(struct vb2_queue *vq, unsigned int *nbuffers,
 {
        struct vivid_dev *dev = video_drvdata(file);
 
+       if (dev->multiplanar)
+               return -ENOTTY;
        f->fmt.pix = dev->tch_format;
        return 0;
 }
 
+int vivid_g_fmt_tch_mplane(struct file *file, void *priv, struct v4l2_format *f)
+{
+       struct vivid_dev *dev = video_drvdata(file);
+       struct v4l2_format sp_fmt;
+
+       if (!dev->multiplanar)
+               return -ENOTTY;
+       sp_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+       sp_fmt.fmt.pix = dev->tch_format;
+       fmt_sp2mp(&sp_fmt, f);
+       return 0;
+}
+
 int vivid_g_parm_tch(struct file *file, void *priv,
                     struct v4l2_streamparm *parm)
 {
        struct vivid_dev *dev = video_drvdata(file);
 
-       if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+       if (parm->type != (dev->multiplanar ?
+                          V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE :
+                          V4L2_BUF_TYPE_VIDEO_CAPTURE))
                return -EINVAL;
 
        parm->parm.capture.capability   = V4L2_CAP_TIMEPERFRAME;
 
 
 int vivid_enum_fmt_tch(struct file *file, void  *priv, struct v4l2_fmtdesc *f);
 int vivid_g_fmt_tch(struct file *file, void *priv, struct v4l2_format *f);
+int vivid_g_fmt_tch_mplane(struct file *file, void *priv, struct v4l2_format *f);
 int vivid_enum_input_tch(struct file *file, void *priv, struct v4l2_input *inp);
 int vivid_g_input_tch(struct file *file, void *priv, unsigned int *i);
 int vivid_s_input_tch(struct file *file, void *priv, unsigned int i);