aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2009-08-06 20:53:59 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2009-08-13 19:39:08 -0400
commitd96ecda63f41350dc93c17ccb72ea24511f207a9 (patch)
treeb154253bb1bd1c021ce32964f5850b2c5b0e0686 /drivers
parent83053f7fe3eb0b6b1634d24ede87f1daa01ae60c (diff)
V4L/DVB (12400): em28xx: Allow changing fps on webcams
em28xx doesn't have temporal scaling. However, on webcams, sensors are capable of changing the output rate. So, VIDIOC_[G|S]_PARM ioctls should be passed to the sensor for it to properly set frame rate. Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/video/em28xx/em28xx-video.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/drivers/media/video/em28xx/em28xx-video.c b/drivers/media/video/em28xx/em28xx-video.c
index ff37b4c15f4..92ee9c64432 100644
--- a/drivers/media/video/em28xx/em28xx-video.c
+++ b/drivers/media/video/em28xx/em28xx-video.c
@@ -846,6 +846,41 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *norm)
846 return 0; 846 return 0;
847} 847}
848 848
849static int vidioc_g_parm(struct file *file, void *priv,
850 struct v4l2_streamparm *p)
851{
852 struct em28xx_fh *fh = priv;
853 struct em28xx *dev = fh->dev;
854 int rc = 0;
855
856 if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
857 return -EINVAL;
858
859 if (dev->board.is_webcam)
860 rc = v4l2_device_call_until_err(&dev->v4l2_dev, 0,
861 video, g_parm, p);
862 else
863 v4l2_video_std_frame_period(dev->norm,
864 &p->parm.capture.timeperframe);
865
866 return rc;
867}
868
869static int vidioc_s_parm(struct file *file, void *priv,
870 struct v4l2_streamparm *p)
871{
872 struct em28xx_fh *fh = priv;
873 struct em28xx *dev = fh->dev;
874
875 if (!dev->board.is_webcam)
876 return -EINVAL;
877
878 if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
879 return -EINVAL;
880
881 return v4l2_device_call_until_err(&dev->v4l2_dev, 0, video, s_parm, p);
882}
883
849static const char *iname[] = { 884static const char *iname[] = {
850 [EM28XX_VMUX_COMPOSITE1] = "Composite1", 885 [EM28XX_VMUX_COMPOSITE1] = "Composite1",
851 [EM28XX_VMUX_COMPOSITE2] = "Composite2", 886 [EM28XX_VMUX_COMPOSITE2] = "Composite2",
@@ -1885,6 +1920,8 @@ static const struct v4l2_ioctl_ops video_ioctl_ops = {
1885 .vidioc_qbuf = vidioc_qbuf, 1920 .vidioc_qbuf = vidioc_qbuf,
1886 .vidioc_dqbuf = vidioc_dqbuf, 1921 .vidioc_dqbuf = vidioc_dqbuf,
1887 .vidioc_s_std = vidioc_s_std, 1922 .vidioc_s_std = vidioc_s_std,
1923 .vidioc_g_parm = vidioc_g_parm,
1924 .vidioc_s_parm = vidioc_s_parm,
1888 .vidioc_enum_input = vidioc_enum_input, 1925 .vidioc_enum_input = vidioc_enum_input,
1889 .vidioc_g_input = vidioc_g_input, 1926 .vidioc_g_input = vidioc_g_input,
1890 .vidioc_s_input = vidioc_s_input, 1927 .vidioc_s_input = vidioc_s_input,