aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/v4l2-core/v4l2-dev.c5
-rw-r--r--drivers/media/v4l2-core/v4l2-ioctl.c34
-rw-r--r--include/media/v4l2-dev.h1
3 files changed, 6 insertions, 34 deletions
diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c
index 5923c5dfacd5..2f3fac5345db 100644
--- a/drivers/media/v4l2-core/v4l2-dev.c
+++ b/drivers/media/v4l2-core/v4l2-dev.c
@@ -675,9 +675,8 @@ static void determine_valid_ioctls(struct video_device *vdev)
675 SET_VALID_IOCTL(ops, VIDIOC_PREPARE_BUF, vidioc_prepare_buf); 675 SET_VALID_IOCTL(ops, VIDIOC_PREPARE_BUF, vidioc_prepare_buf);
676 if (ops->vidioc_s_std) 676 if (ops->vidioc_s_std)
677 set_bit(_IOC_NR(VIDIOC_ENUMSTD), valid_ioctls); 677 set_bit(_IOC_NR(VIDIOC_ENUMSTD), valid_ioctls);
678 if (ops->vidioc_g_std || vdev->current_norm)
679 set_bit(_IOC_NR(VIDIOC_G_STD), valid_ioctls);
680 SET_VALID_IOCTL(ops, VIDIOC_S_STD, vidioc_s_std); 678 SET_VALID_IOCTL(ops, VIDIOC_S_STD, vidioc_s_std);
679 SET_VALID_IOCTL(ops, VIDIOC_G_STD, vidioc_g_std);
681 if (is_rx) { 680 if (is_rx) {
682 SET_VALID_IOCTL(ops, VIDIOC_QUERYSTD, vidioc_querystd); 681 SET_VALID_IOCTL(ops, VIDIOC_QUERYSTD, vidioc_querystd);
683 SET_VALID_IOCTL(ops, VIDIOC_ENUMINPUT, vidioc_enum_input); 682 SET_VALID_IOCTL(ops, VIDIOC_ENUMINPUT, vidioc_enum_input);
@@ -705,7 +704,7 @@ static void determine_valid_ioctls(struct video_device *vdev)
705 if (ops->vidioc_cropcap || ops->vidioc_g_selection) 704 if (ops->vidioc_cropcap || ops->vidioc_g_selection)
706 set_bit(_IOC_NR(VIDIOC_CROPCAP), valid_ioctls); 705 set_bit(_IOC_NR(VIDIOC_CROPCAP), valid_ioctls);
707 if (ops->vidioc_g_parm || (vdev->vfl_type == VFL_TYPE_GRABBER && 706 if (ops->vidioc_g_parm || (vdev->vfl_type == VFL_TYPE_GRABBER &&
708 (ops->vidioc_g_std || vdev->current_norm))) 707 ops->vidioc_g_std))
709 set_bit(_IOC_NR(VIDIOC_G_PARM), valid_ioctls); 708 set_bit(_IOC_NR(VIDIOC_G_PARM), valid_ioctls);
710 SET_VALID_IOCTL(ops, VIDIOC_S_PARM, vidioc_s_parm); 709 SET_VALID_IOCTL(ops, VIDIOC_S_PARM, vidioc_s_parm);
711 SET_VALID_IOCTL(ops, VIDIOC_S_DV_TIMINGS, vidioc_s_dv_timings); 710 SET_VALID_IOCTL(ops, VIDIOC_S_DV_TIMINGS, vidioc_s_dv_timings);
diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
index 60b8c259da96..67745438e6ff 100644
--- a/drivers/media/v4l2-core/v4l2-ioctl.c
+++ b/drivers/media/v4l2-core/v4l2-ioctl.c
@@ -1364,40 +1364,18 @@ static int v4l_enumstd(const struct v4l2_ioctl_ops *ops,
1364 return 0; 1364 return 0;
1365} 1365}
1366 1366
1367static int v4l_g_std(const struct v4l2_ioctl_ops *ops,
1368 struct file *file, void *fh, void *arg)
1369{
1370 struct video_device *vfd = video_devdata(file);
1371 v4l2_std_id *id = arg;
1372
1373 /* Calls the specific handler */
1374 if (ops->vidioc_g_std)
1375 return ops->vidioc_g_std(file, fh, arg);
1376 if (vfd->current_norm) {
1377 *id = vfd->current_norm;
1378 return 0;
1379 }
1380 return -ENOTTY;
1381}
1382
1383static int v4l_s_std(const struct v4l2_ioctl_ops *ops, 1367static int v4l_s_std(const struct v4l2_ioctl_ops *ops,
1384 struct file *file, void *fh, void *arg) 1368 struct file *file, void *fh, void *arg)
1385{ 1369{
1386 struct video_device *vfd = video_devdata(file); 1370 struct video_device *vfd = video_devdata(file);
1387 v4l2_std_id id = *(v4l2_std_id *)arg, norm; 1371 v4l2_std_id id = *(v4l2_std_id *)arg, norm;
1388 int ret;
1389 1372
1390 norm = id & vfd->tvnorms; 1373 norm = id & vfd->tvnorms;
1391 if (vfd->tvnorms && !norm) /* Check if std is supported */ 1374 if (vfd->tvnorms && !norm) /* Check if std is supported */
1392 return -EINVAL; 1375 return -EINVAL;
1393 1376
1394 /* Calls the specific handler */ 1377 /* Calls the specific handler */
1395 ret = ops->vidioc_s_std(file, fh, norm); 1378 return ops->vidioc_s_std(file, fh, norm);
1396
1397 /* Updates standard information */
1398 if (ret >= 0)
1399 vfd->current_norm = norm;
1400 return ret;
1401} 1379}
1402 1380
1403static int v4l_querystd(const struct v4l2_ioctl_ops *ops, 1381static int v4l_querystd(const struct v4l2_ioctl_ops *ops,
@@ -1500,7 +1478,6 @@ static int v4l_prepare_buf(const struct v4l2_ioctl_ops *ops,
1500static int v4l_g_parm(const struct v4l2_ioctl_ops *ops, 1478static int v4l_g_parm(const struct v4l2_ioctl_ops *ops,
1501 struct file *file, void *fh, void *arg) 1479 struct file *file, void *fh, void *arg)
1502{ 1480{
1503 struct video_device *vfd = video_devdata(file);
1504 struct v4l2_streamparm *p = arg; 1481 struct v4l2_streamparm *p = arg;
1505 v4l2_std_id std; 1482 v4l2_std_id std;
1506 int ret = check_fmt(file, p->type); 1483 int ret = check_fmt(file, p->type);
@@ -1509,16 +1486,13 @@ static int v4l_g_parm(const struct v4l2_ioctl_ops *ops,
1509 return ret; 1486 return ret;
1510 if (ops->vidioc_g_parm) 1487 if (ops->vidioc_g_parm)
1511 return ops->vidioc_g_parm(file, fh, p); 1488 return ops->vidioc_g_parm(file, fh, p);
1512 std = vfd->current_norm;
1513 if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE && 1489 if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
1514 p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) 1490 p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
1515 return -EINVAL; 1491 return -EINVAL;
1516 p->parm.capture.readbuffers = 2; 1492 p->parm.capture.readbuffers = 2;
1517 if (is_valid_ioctl(vfd, VIDIOC_G_STD) && ops->vidioc_g_std) 1493 ret = ops->vidioc_g_std(file, fh, &std);
1518 ret = ops->vidioc_g_std(file, fh, &std);
1519 if (ret == 0) 1494 if (ret == 0)
1520 v4l2_video_std_frame_period(std, 1495 v4l2_video_std_frame_period(std, &p->parm.capture.timeperframe);
1521 &p->parm.capture.timeperframe);
1522 return ret; 1496 return ret;
1523} 1497}
1524 1498
@@ -2055,7 +2029,7 @@ static struct v4l2_ioctl_info v4l2_ioctls[] = {
2055 IOCTL_INFO_FNC(VIDIOC_STREAMOFF, v4l_streamoff, v4l_print_buftype, INFO_FL_PRIO | INFO_FL_QUEUE), 2029 IOCTL_INFO_FNC(VIDIOC_STREAMOFF, v4l_streamoff, v4l_print_buftype, INFO_FL_PRIO | INFO_FL_QUEUE),
2056 IOCTL_INFO_FNC(VIDIOC_G_PARM, v4l_g_parm, v4l_print_streamparm, INFO_FL_CLEAR(v4l2_streamparm, type)), 2030 IOCTL_INFO_FNC(VIDIOC_G_PARM, v4l_g_parm, v4l_print_streamparm, INFO_FL_CLEAR(v4l2_streamparm, type)),
2057 IOCTL_INFO_FNC(VIDIOC_S_PARM, v4l_s_parm, v4l_print_streamparm, INFO_FL_PRIO), 2031 IOCTL_INFO_FNC(VIDIOC_S_PARM, v4l_s_parm, v4l_print_streamparm, INFO_FL_PRIO),
2058 IOCTL_INFO_FNC(VIDIOC_G_STD, v4l_g_std, v4l_print_std, 0), 2032 IOCTL_INFO_STD(VIDIOC_G_STD, vidioc_g_std, v4l_print_std, 0),
2059 IOCTL_INFO_FNC(VIDIOC_S_STD, v4l_s_std, v4l_print_std, INFO_FL_PRIO), 2033 IOCTL_INFO_FNC(VIDIOC_S_STD, v4l_s_std, v4l_print_std, INFO_FL_PRIO),
2060 IOCTL_INFO_FNC(VIDIOC_ENUMSTD, v4l_enumstd, v4l_print_standard, INFO_FL_CLEAR(v4l2_standard, index)), 2034 IOCTL_INFO_FNC(VIDIOC_ENUMSTD, v4l_enumstd, v4l_print_standard, INFO_FL_CLEAR(v4l2_standard, index)),
2061 IOCTL_INFO_FNC(VIDIOC_ENUMINPUT, v4l_enuminput, v4l_print_enuminput, INFO_FL_CLEAR(v4l2_input, index)), 2035 IOCTL_INFO_FNC(VIDIOC_ENUMINPUT, v4l_enuminput, v4l_print_enuminput, INFO_FL_CLEAR(v4l2_input, index)),
diff --git a/include/media/v4l2-dev.h b/include/media/v4l2-dev.h
index 95d1c91770f4..b2c3776a1cff 100644
--- a/include/media/v4l2-dev.h
+++ b/include/media/v4l2-dev.h
@@ -129,7 +129,6 @@ struct video_device
129 129
130 /* Video standard vars */ 130 /* Video standard vars */
131 v4l2_std_id tvnorms; /* Supported tv norms */ 131 v4l2_std_id tvnorms; /* Supported tv norms */
132 v4l2_std_id current_norm; /* Current tvnorm */
133 132
134 /* callbacks */ 133 /* callbacks */
135 void (*release)(struct video_device *vdev); 134 void (*release)(struct video_device *vdev);