media: tegra-video: Use zero crop settings if subdev has no get_selection
authorSowjanya Komatineni <skomatineni@nvidia.com>
Fri, 11 Dec 2020 17:02:30 +0000 (18:02 +0100)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Mon, 4 Jan 2021 11:53:14 +0000 (12:53 +0100)
Currently try format implementation doesn't check if subdevice has
get_selection ops implemented and returns -EINVAL on error from
direct v4l2_subdev_call of get_selection.

Selection API's are not mandatory for all V4L2 subdevices.

This patch fixes it by adding v4l2_subdev_has_ops check prior to
calling get_selection ops and continues with try or set format with
zero crop settings for subdevices that don't have get_selection and
returns -EINVAL only for subdevices that has get_selection ops.

Signed-off-by: Sowjanya Komatineni <skomatineni@nvidia.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/staging/media/tegra-video/vi.c

index 560d8b3..7edd35c 100644 (file)
@@ -533,11 +533,18 @@ static int __tegra_channel_try_format(struct tegra_vi_channel *chan,
        fse.code = fmtinfo->code;
        ret = v4l2_subdev_call(subdev, pad, enum_frame_size, pad_cfg, &fse);
        if (ret) {
-               ret = v4l2_subdev_call(subdev, pad, get_selection, NULL, &sdsel);
-               if (ret)
-                       return -EINVAL;
-               pad_cfg->try_crop.width = sdsel.r.width;
-               pad_cfg->try_crop.height = sdsel.r.height;
+               if (!v4l2_subdev_has_op(subdev, pad, get_selection)) {
+                       pad_cfg->try_crop.width = 0;
+                       pad_cfg->try_crop.height = 0;
+               } else {
+                       ret = v4l2_subdev_call(subdev, pad, get_selection,
+                                              NULL, &sdsel);
+                       if (ret)
+                               return -EINVAL;
+
+                       pad_cfg->try_crop.width = sdsel.r.width;
+                       pad_cfg->try_crop.height = sdsel.r.height;
+               }
        } else {
                pad_cfg->try_crop.width = fse.max_width;
                pad_cfg->try_crop.height = fse.max_height;