From: Sergio Aguirre <saaguirre@xxxxxx> Signed-off-by: Sergio Aguirre <saaguirre@xxxxxx> --- drivers/media/video/soc_camera.c | 37 +++++++++++++++++++++++++++++++++++++ include/media/soc_camera.h | 1 + 2 files changed, 38 insertions(+), 0 deletions(-) diff --git a/drivers/media/video/soc_camera.c b/drivers/media/video/soc_camera.c index eb25756..62c8956 100644 --- a/drivers/media/video/soc_camera.c +++ b/drivers/media/video/soc_camera.c @@ -266,6 +266,15 @@ static int soc_camera_enum_fsizes(struct file *file, void *fh, return ici->ops->enum_fsizes(icd, fsize); } +static int soc_camera_enum_fivals(struct file *file, void *fh, + struct v4l2_frmivalenum *fival) +{ + struct soc_camera_device *icd = file->private_data; + struct soc_camera_host *ici = to_soc_camera_host(icd->parent); + + return ici->ops->enum_fivals(icd, fival); +} + static int soc_camera_reqbufs(struct file *file, void *priv, struct v4l2_requestbuffers *p) { @@ -1266,6 +1275,31 @@ static int default_enum_fsizes(struct soc_camera_device *icd, return 0; } +static int default_enum_fivals(struct soc_camera_device *icd, + struct v4l2_frmivalenum *fival) +{ + int ret; + struct v4l2_subdev *sd = soc_camera_to_subdev(icd); + const struct soc_camera_format_xlate *xlate; + __u32 pixfmt = fival->pixel_format; + struct v4l2_frmivalenum fival_sd = *fival; + + xlate = soc_camera_xlate_by_fourcc(icd, pixfmt); + if (!xlate) + return -EINVAL; + /* map xlate-code to pixel_format, sensor only handle xlate-code*/ + fival_sd.pixel_format = xlate->code; + + ret = v4l2_subdev_call(sd, video, enum_frameintervals, &fival_sd); + if (ret < 0) + return ret; + + *fival = fival_sd; + fival->pixel_format = pixfmt; + + return 0; +} + int soc_camera_host_register(struct soc_camera_host *ici) { struct soc_camera_host *ix; @@ -1297,6 +1331,8 @@ int soc_camera_host_register(struct soc_camera_host *ici) ici->ops->get_parm = default_g_parm; if (!ici->ops->enum_fsizes) ici->ops->enum_fsizes = default_enum_fsizes; + if (!ici->ops->enum_fivals) + ici->ops->enum_fivals = default_enum_fivals; mutex_lock(&list_lock); list_for_each_entry(ix, &hosts, list) { @@ -1387,6 +1423,7 @@ static const struct v4l2_ioctl_ops soc_camera_ioctl_ops = { .vidioc_s_std = soc_camera_s_std, .vidioc_g_std = soc_camera_g_std, .vidioc_enum_framesizes = soc_camera_enum_fsizes, + .vidioc_enum_frameintervals = soc_camera_enum_fivals, .vidioc_reqbufs = soc_camera_reqbufs, .vidioc_querybuf = soc_camera_querybuf, .vidioc_qbuf = soc_camera_qbuf, diff --git a/include/media/soc_camera.h b/include/media/soc_camera.h index b5c2b6c..0a3ac07 100644 --- a/include/media/soc_camera.h +++ b/include/media/soc_camera.h @@ -98,6 +98,7 @@ struct soc_camera_host_ops { int (*get_parm)(struct soc_camera_device *, struct v4l2_streamparm *); int (*set_parm)(struct soc_camera_device *, struct v4l2_streamparm *); int (*enum_fsizes)(struct soc_camera_device *, struct v4l2_frmsizeenum *); + int (*enum_fivals)(struct soc_camera_device *, struct v4l2_frmivalenum *); unsigned int (*poll)(struct file *, poll_table *); }; -- 1.7.5.4 -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html