On 4/26/19 9:51 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 v5: none > > Changes in v4: none > > Changes in v3: none > > 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 652d3d08bc50..a7dafc601033 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) > > +/** Just use /* instead of /** This is a regular comment, not something that has to end up in documentation. > + * 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; > @@ -156,13 +173,26 @@ static int vimc_cap_try_fmt_vid_cap_mp(struct file *file, void *priv, > format->width, format->height); > } > > +/** Ditto. Because of this I get these smatch warnings: /home/hans/work/build/media-git/drivers/media/platform/vimc/vimc-capture.c:43: warning: cannot understand function prototype: 'const u32 vimc_cap_supported_pixfmt[] = ' /home/hans/work/build/media-git/drivers/media/platform/vimc/vimc-capture.c:199: warning: Function parameter or member 'file' not described in 'vimc_cap_enum_fmt_vid_cap' /home/hans/work/build/media-git/drivers/media/platform/vimc/vimc-capture.c:199: warning: Function parameter or member 'priv' not described in 'vimc_cap_enum_fmt_vid_cap' /home/hans/work/build/media-git/drivers/media/platform/vimc/vimc-capture.c:199: warning: Function parameter or member 'f' not described in 'vimc_cap_enum_fmt_vid_cap' Regards, Hans > + * 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; > } >