aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAntti Palosaari <crope@iki.fi>2015-10-10 12:51:00 -0400
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2015-10-20 13:40:50 -0400
commit9effc72fd71b6e8fd2676bcb57fac3f05ab93043 (patch)
treeb39342339730a075de69d780fce77921df064d46 /drivers
parentb2411b93cdcb5cb154827b8fcd2f436dd0ddab73 (diff)
[media] v4l2: add support for SDR transmitter
New IOCTL ops: vidioc_enum_fmt_sdr_out vidioc_g_fmt_sdr_out vidioc_s_fmt_sdr_out vidioc_try_fmt_sdr_out New vb2 buffertype: V4L2_BUF_TYPE_SDR_OUTPUT New v4l2 capability: V4L2_CAP_SDR_OUTPUT Signed-off-by: Antti Palosaari <crope@iki.fi> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/v4l2-core/v4l2-compat-ioctl32.c2
-rw-r--r--drivers/media/v4l2-core/v4l2-dev.c14
-rw-r--r--drivers/media/v4l2-core/v4l2-ioctl.c25
-rw-r--r--drivers/media/v4l2-core/videobuf-core.c4
4 files changed, 42 insertions, 3 deletions
diff --git a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c
index d032e9a2b212..327e83ac2469 100644
--- a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c
+++ b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c
@@ -214,6 +214,7 @@ static int __get_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __us
214 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: 214 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
215 return get_v4l2_sliced_vbi_format(&kp->fmt.sliced, &up->fmt.sliced); 215 return get_v4l2_sliced_vbi_format(&kp->fmt.sliced, &up->fmt.sliced);
216 case V4L2_BUF_TYPE_SDR_CAPTURE: 216 case V4L2_BUF_TYPE_SDR_CAPTURE:
217 case V4L2_BUF_TYPE_SDR_OUTPUT:
217 return get_v4l2_sdr_format(&kp->fmt.sdr, &up->fmt.sdr); 218 return get_v4l2_sdr_format(&kp->fmt.sdr, &up->fmt.sdr);
218 default: 219 default:
219 pr_info("compat_ioctl32: unexpected VIDIOC_FMT type %d\n", 220 pr_info("compat_ioctl32: unexpected VIDIOC_FMT type %d\n",
@@ -260,6 +261,7 @@ static int __put_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __us
260 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: 261 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
261 return put_v4l2_sliced_vbi_format(&kp->fmt.sliced, &up->fmt.sliced); 262 return put_v4l2_sliced_vbi_format(&kp->fmt.sliced, &up->fmt.sliced);
262 case V4L2_BUF_TYPE_SDR_CAPTURE: 263 case V4L2_BUF_TYPE_SDR_CAPTURE:
264 case V4L2_BUF_TYPE_SDR_OUTPUT:
263 return put_v4l2_sdr_format(&kp->fmt.sdr, &up->fmt.sdr); 265 return put_v4l2_sdr_format(&kp->fmt.sdr, &up->fmt.sdr);
264 default: 266 default:
265 pr_info("compat_ioctl32: unexpected VIDIOC_FMT type %d\n", 267 pr_info("compat_ioctl32: unexpected VIDIOC_FMT type %d\n",
diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c
index 71a1b93b0790..6b1eaeddbdb3 100644
--- a/drivers/media/v4l2-core/v4l2-dev.c
+++ b/drivers/media/v4l2-core/v4l2-dev.c
@@ -637,8 +637,8 @@ static void determine_valid_ioctls(struct video_device *vdev)
637 ops->vidioc_try_fmt_sliced_vbi_out))) 637 ops->vidioc_try_fmt_sliced_vbi_out)))
638 set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls); 638 set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls);
639 SET_VALID_IOCTL(ops, VIDIOC_G_SLICED_VBI_CAP, vidioc_g_sliced_vbi_cap); 639 SET_VALID_IOCTL(ops, VIDIOC_G_SLICED_VBI_CAP, vidioc_g_sliced_vbi_cap);
640 } else if (is_sdr) { 640 } else if (is_sdr && is_rx) {
641 /* SDR specific ioctls */ 641 /* SDR receiver specific ioctls */
642 if (ops->vidioc_enum_fmt_sdr_cap) 642 if (ops->vidioc_enum_fmt_sdr_cap)
643 set_bit(_IOC_NR(VIDIOC_ENUM_FMT), valid_ioctls); 643 set_bit(_IOC_NR(VIDIOC_ENUM_FMT), valid_ioctls);
644 if (ops->vidioc_g_fmt_sdr_cap) 644 if (ops->vidioc_g_fmt_sdr_cap)
@@ -647,6 +647,16 @@ static void determine_valid_ioctls(struct video_device *vdev)
647 set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls); 647 set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls);
648 if (ops->vidioc_try_fmt_sdr_cap) 648 if (ops->vidioc_try_fmt_sdr_cap)
649 set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls); 649 set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls);
650 } else if (is_sdr && is_tx) {
651 /* SDR transmitter specific ioctls */
652 if (ops->vidioc_enum_fmt_sdr_out)
653 set_bit(_IOC_NR(VIDIOC_ENUM_FMT), valid_ioctls);
654 if (ops->vidioc_g_fmt_sdr_out)
655 set_bit(_IOC_NR(VIDIOC_G_FMT), valid_ioctls);
656 if (ops->vidioc_s_fmt_sdr_out)
657 set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls);
658 if (ops->vidioc_try_fmt_sdr_out)
659 set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls);
650 } 660 }
651 661
652 if (is_vid || is_vbi || is_sdr) { 662 if (is_vid || is_vbi || is_sdr) {
diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
index 056a5ade5870..073ab36b880a 100644
--- a/drivers/media/v4l2-core/v4l2-ioctl.c
+++ b/drivers/media/v4l2-core/v4l2-ioctl.c
@@ -153,6 +153,7 @@ const char *v4l2_type_names[] = {
153 [V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE] = "vid-cap-mplane", 153 [V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE] = "vid-cap-mplane",
154 [V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE] = "vid-out-mplane", 154 [V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE] = "vid-out-mplane",
155 [V4L2_BUF_TYPE_SDR_CAPTURE] = "sdr-cap", 155 [V4L2_BUF_TYPE_SDR_CAPTURE] = "sdr-cap",
156 [V4L2_BUF_TYPE_SDR_OUTPUT] = "sdr-out",
156}; 157};
157EXPORT_SYMBOL(v4l2_type_names); 158EXPORT_SYMBOL(v4l2_type_names);
158 159
@@ -326,6 +327,7 @@ static void v4l_print_format(const void *arg, bool write_only)
326 sliced->service_lines[1][i]); 327 sliced->service_lines[1][i]);
327 break; 328 break;
328 case V4L2_BUF_TYPE_SDR_CAPTURE: 329 case V4L2_BUF_TYPE_SDR_CAPTURE:
330 case V4L2_BUF_TYPE_SDR_OUTPUT:
329 sdr = &p->fmt.sdr; 331 sdr = &p->fmt.sdr;
330 pr_cont(", pixelformat=%c%c%c%c\n", 332 pr_cont(", pixelformat=%c%c%c%c\n",
331 (sdr->pixelformat >> 0) & 0xff, 333 (sdr->pixelformat >> 0) & 0xff,
@@ -974,6 +976,10 @@ static int check_fmt(struct file *file, enum v4l2_buf_type type)
974 if (is_sdr && is_rx && ops->vidioc_g_fmt_sdr_cap) 976 if (is_sdr && is_rx && ops->vidioc_g_fmt_sdr_cap)
975 return 0; 977 return 0;
976 break; 978 break;
979 case V4L2_BUF_TYPE_SDR_OUTPUT:
980 if (is_sdr && is_tx && ops->vidioc_g_fmt_sdr_out)
981 return 0;
982 break;
977 default: 983 default:
978 break; 984 break;
979 } 985 }
@@ -1324,6 +1330,11 @@ static int v4l_enum_fmt(const struct v4l2_ioctl_ops *ops,
1324 break; 1330 break;
1325 ret = ops->vidioc_enum_fmt_sdr_cap(file, fh, arg); 1331 ret = ops->vidioc_enum_fmt_sdr_cap(file, fh, arg);
1326 break; 1332 break;
1333 case V4L2_BUF_TYPE_SDR_OUTPUT:
1334 if (unlikely(!is_tx || !is_sdr || !ops->vidioc_enum_fmt_sdr_out))
1335 break;
1336 ret = ops->vidioc_enum_fmt_sdr_out(file, fh, arg);
1337 break;
1327 } 1338 }
1328 if (ret == 0) 1339 if (ret == 0)
1329 v4l_fill_fmtdesc(p); 1340 v4l_fill_fmtdesc(p);
@@ -1418,6 +1429,10 @@ static int v4l_g_fmt(const struct v4l2_ioctl_ops *ops,
1418 if (unlikely(!is_rx || !is_sdr || !ops->vidioc_g_fmt_sdr_cap)) 1429 if (unlikely(!is_rx || !is_sdr || !ops->vidioc_g_fmt_sdr_cap))
1419 break; 1430 break;
1420 return ops->vidioc_g_fmt_sdr_cap(file, fh, arg); 1431 return ops->vidioc_g_fmt_sdr_cap(file, fh, arg);
1432 case V4L2_BUF_TYPE_SDR_OUTPUT:
1433 if (unlikely(!is_tx || !is_sdr || !ops->vidioc_g_fmt_sdr_out))
1434 break;
1435 return ops->vidioc_g_fmt_sdr_out(file, fh, arg);
1421 } 1436 }
1422 return -EINVAL; 1437 return -EINVAL;
1423} 1438}
@@ -1497,6 +1512,11 @@ static int v4l_s_fmt(const struct v4l2_ioctl_ops *ops,
1497 break; 1512 break;
1498 CLEAR_AFTER_FIELD(p, fmt.sdr); 1513 CLEAR_AFTER_FIELD(p, fmt.sdr);
1499 return ops->vidioc_s_fmt_sdr_cap(file, fh, arg); 1514 return ops->vidioc_s_fmt_sdr_cap(file, fh, arg);
1515 case V4L2_BUF_TYPE_SDR_OUTPUT:
1516 if (unlikely(!is_tx || !is_sdr || !ops->vidioc_s_fmt_sdr_out))
1517 break;
1518 CLEAR_AFTER_FIELD(p, fmt.sdr);
1519 return ops->vidioc_s_fmt_sdr_out(file, fh, arg);
1500 } 1520 }
1501 return -EINVAL; 1521 return -EINVAL;
1502} 1522}
@@ -1576,6 +1596,11 @@ static int v4l_try_fmt(const struct v4l2_ioctl_ops *ops,
1576 break; 1596 break;
1577 CLEAR_AFTER_FIELD(p, fmt.sdr); 1597 CLEAR_AFTER_FIELD(p, fmt.sdr);
1578 return ops->vidioc_try_fmt_sdr_cap(file, fh, arg); 1598 return ops->vidioc_try_fmt_sdr_cap(file, fh, arg);
1599 case V4L2_BUF_TYPE_SDR_OUTPUT:
1600 if (unlikely(!is_tx || !is_sdr || !ops->vidioc_try_fmt_sdr_out))
1601 break;
1602 CLEAR_AFTER_FIELD(p, fmt.sdr);
1603 return ops->vidioc_try_fmt_sdr_out(file, fh, arg);
1579 } 1604 }
1580 return -EINVAL; 1605 return -EINVAL;
1581} 1606}
diff --git a/drivers/media/v4l2-core/videobuf-core.c b/drivers/media/v4l2-core/videobuf-core.c
index 926836d1813a..6c02989ee33f 100644
--- a/drivers/media/v4l2-core/videobuf-core.c
+++ b/drivers/media/v4l2-core/videobuf-core.c
@@ -576,7 +576,8 @@ int videobuf_qbuf(struct videobuf_queue *q, struct v4l2_buffer *b)
576 } 576 }
577 if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT 577 if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT
578 || q->type == V4L2_BUF_TYPE_VBI_OUTPUT 578 || q->type == V4L2_BUF_TYPE_VBI_OUTPUT
579 || q->type == V4L2_BUF_TYPE_SLICED_VBI_OUTPUT) { 579 || q->type == V4L2_BUF_TYPE_SLICED_VBI_OUTPUT
580 || q->type == V4L2_BUF_TYPE_SDR_OUTPUT) {
580 buf->size = b->bytesused; 581 buf->size = b->bytesused;
581 buf->field = b->field; 582 buf->field = b->field;
582 buf->ts = b->timestamp; 583 buf->ts = b->timestamp;
@@ -1154,6 +1155,7 @@ unsigned int videobuf_poll_stream(struct file *file,
1154 case V4L2_BUF_TYPE_VIDEO_OUTPUT: 1155 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
1155 case V4L2_BUF_TYPE_VBI_OUTPUT: 1156 case V4L2_BUF_TYPE_VBI_OUTPUT:
1156 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: 1157 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
1158 case V4L2_BUF_TYPE_SDR_OUTPUT:
1157 rc = POLLOUT | POLLWRNORM; 1159 rc = POLLOUT | POLLWRNORM;
1158 break; 1160 break;
1159 default: 1161 default: