On 3/27/19 12:17 PM, André Almeida wrote: > Add multiplanar formats to be exposed to the userspace as > supported formats. Since we don't want to support multiplanar > formats when the driver is in singleplanar mode, we only access > the multiplanar formats array if the multiplanar mode is enabled. > > Signed-off-by: André Almeida <andrealmeid@xxxxxxxxxxxxx> Acked-by: Helen Koike <helen.koike@xxxxxxxxxxxxx> > --- > Changes in v2: > - Change line break style > - Add TODO comment > > drivers/media/platform/vimc/vimc-capture.c | 34 ++++++++++++++++++++-- > 1 file changed, 32 insertions(+), 2 deletions(-) > > diff --git a/drivers/media/platform/vimc/vimc-capture.c b/drivers/media/platform/vimc/vimc-capture.c > index 5e13c6580aff..a65611be63bb 100644 > --- a/drivers/media/platform/vimc/vimc-capture.c > +++ b/drivers/media/platform/vimc/vimc-capture.c > @@ -32,6 +32,10 @@ > #define IS_MULTIPLANAR(vcap) \ > (vcap->vdev.device_caps & V4L2_CAP_VIDEO_CAPTURE_MPLANE) > > +/** > + * TODO: capture device should only enum formats that all subdevices on > + * topology accepts > + */ > static const u32 vimc_cap_supported_pixfmt[] = { > V4L2_PIX_FMT_BGR24, > V4L2_PIX_FMT_RGB24, > @@ -58,6 +62,19 @@ static const u32 vimc_cap_supported_pixfmt[] = { > V4L2_PIX_FMT_SRGGB12, > }; > > +static const u32 vimc_cap_supported_pixfmt_mp[] = { > + V4L2_PIX_FMT_YUV420M, > + V4L2_PIX_FMT_YVU420M, > + V4L2_PIX_FMT_YUV422M, > + V4L2_PIX_FMT_YVU422M, > + V4L2_PIX_FMT_YUV444M, > + V4L2_PIX_FMT_YVU444M, > + V4L2_PIX_FMT_NV12M, > + V4L2_PIX_FMT_NV21M, > + V4L2_PIX_FMT_NV16M, > + V4L2_PIX_FMT_NV61M, > +}; > + > struct vimc_cap_device { > struct vimc_ent_device ved; > struct video_device vdev; > @@ -157,13 +174,26 @@ static int _vimc_cap_try_fmt_vid_cap_mp(struct file *file, void *priv, > format->width, format->height); > } > > +/** > + * When multiplanar is true, consider that the vimc_cap_enum_fmt_vid_cap_mp > + * is concantenate in the vimc_cap_enum_fmt_vid_cap array. Otherwise, just > + * consider the single-planar array > + */ > static int vimc_cap_enum_fmt_vid_cap(struct file *file, void *priv, > struct v4l2_fmtdesc *f) > { > - if (f->index >= ARRAY_SIZE(vimc_cap_supported_pixfmt)) > + struct vimc_cap_device *vcap = video_drvdata(file); > + const unsigned int sp_size = ARRAY_SIZE(vimc_cap_supported_pixfmt); > + const unsigned int mp_size = ARRAY_SIZE(vimc_cap_supported_pixfmt_mp); > + > + if (f->index >= sp_size + (IS_MULTIPLANAR(vcap) ? mp_size : 0)) > return -EINVAL; > > - f->pixelformat = vimc_cap_supported_pixfmt[f->index]; > + if (f->index >= sp_size) > + f->pixelformat = > + vimc_cap_supported_pixfmt_mp[f->index - sp_size]; > + else > + f->pixelformat = vimc_cap_supported_pixfmt[f->index]; > > return 0; > } >