History

[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

Antti Palosaari committed 11 years ago

Commit 9effc721 parent b2411b97 files · +55 −4Browse files

Unified · Split

7 files
  1. drivers/media/v4l2-core/v4l2-compat-ioctl32.c +2 −0
  2. drivers/media/v4l2-core/v4l2-dev.c +12 −2
  3. drivers/media/v4l2-core/v4l2-ioctl.c +25 −0
  4. drivers/media/v4l2-core/videobuf-core.c +3 −1
  5. include/media/v4l2-ioctl.h +8 −0
  6. include/trace/events/v4l2.h +1 −0
  7. include/uapi/linux/videodev2.h +4 −1
drivers/media/v4l2-core/v4l2-compat-ioctl32.c+2−0
@@ -214,6 +214,7 @@ static int __get_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __us · 213 unmodified lines
214214 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
215215 return get_v4l2_sliced_vbi_format(&kp->fmt.sliced, &up->fmt.sliced);
216216 case V4L2_BUF_TYPE_SDR_CAPTURE:
217+ case V4L2_BUF_TYPE_SDR_OUTPUT:
217218 return get_v4l2_sdr_format(&kp->fmt.sdr, &up->fmt.sdr);
218219 default:
219220 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 · 40 unmodified lines
260261 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
261262 return put_v4l2_sliced_vbi_format(&kp->fmt.sliced, &up->fmt.sliced);
262263 case V4L2_BUF_TYPE_SDR_CAPTURE:
264+ case V4L2_BUF_TYPE_SDR_OUTPUT:
263265 return put_v4l2_sdr_format(&kp->fmt.sdr, &up->fmt.sdr);
264266 default:
265267 pr_info("compat_ioctl32: unexpected VIDIOC_FMT type %d\n",
drivers/media/v4l2-core/v4l2-dev.c+12−2
@@ -637,8 +637,8 @@ static void determine_valid_ioctls(struct video_device *vdev) · 636 unmodified lines
637637 ops->vidioc_try_fmt_sliced_vbi_out)))
638638 set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls);
639639 SET_VALID_IOCTL(ops, VIDIOC_G_SLICED_VBI_CAP, vidioc_g_sliced_vbi_cap);
640− } else if (is_sdr) {
641− /* SDR specific ioctls */
640+ } else if (is_sdr && is_rx) {
641+ /* SDR receiver specific ioctls */
642642 if (ops->vidioc_enum_fmt_sdr_cap)
643643 set_bit(_IOC_NR(VIDIOC_ENUM_FMT), valid_ioctls);
644644 if (ops->vidioc_g_fmt_sdr_cap)
@@ -647,6 +647,16 @@ static void determine_valid_ioctls(struct video_device *vdev) · 2 unmodified lines
647647 set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls);
648648 if (ops->vidioc_try_fmt_sdr_cap)
649649 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);
650660 }
651661
652662 if (is_vid || is_vbi || is_sdr) {
drivers/media/v4l2-core/v4l2-ioctl.c+25−0
@@ -153,6 +153,7 @@ const char *v4l2_type_names[] = { · 152 unmodified lines
153153 [V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE] = "vid-cap-mplane",
154154 [V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE] = "vid-out-mplane",
155155 [V4L2_BUF_TYPE_SDR_CAPTURE] = "sdr-cap",
156+ [V4L2_BUF_TYPE_SDR_OUTPUT] = "sdr-out",
156157 };
157158 EXPORT_SYMBOL(v4l2_type_names);
158159
@@ -326,6 +327,7 @@ static void v4l_print_format(const void *arg, bool write_only) · 167 unmodified lines
326327 sliced->service_lines[1][i]);
327328 break;
328329 case V4L2_BUF_TYPE_SDR_CAPTURE:
330+ case V4L2_BUF_TYPE_SDR_OUTPUT:
329331 sdr = &p->fmt.sdr;
330332 pr_cont(", pixelformat=%c%c%c%c\n",
331333 (sdr->pixelformat >> 0) & 0xff,
@@ -974,6 +976,10 @@ static int check_fmt(struct file *file, enum v4l2_buf_type type) · 642 unmodified lines
974976 if (is_sdr && is_rx && ops->vidioc_g_fmt_sdr_cap)
975977 return 0;
976978 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;
977983 default:
978984 break;
979985 }
@@ -1324,6 +1330,11 @@ static int v4l_enum_fmt(const struct v4l2_ioctl_ops *ops, · 344 unmodified lines
13241330 break;
13251331 ret = ops->vidioc_enum_fmt_sdr_cap(file, fh, arg);
13261332 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;
13271338 }
13281339 if (ret == 0)
13291340 v4l_fill_fmtdesc(p);
@@ -1418,6 +1429,10 @@ static int v4l_g_fmt(const struct v4l2_ioctl_ops *ops, · 88 unmodified lines
14181429 if (unlikely(!is_rx || !is_sdr || !ops->vidioc_g_fmt_sdr_cap))
14191430 break;
14201431 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);
14211436 }
14221437 return -EINVAL;
14231438 }
@@ -1497,6 +1512,11 @@ static int v4l_s_fmt(const struct v4l2_ioctl_ops *ops, · 73 unmodified lines
14971512 break;
14981513 CLEAR_AFTER_FIELD(p, fmt.sdr);
14991514 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);
15001520 }
15011521 return -EINVAL;
15021522 }
@@ -1576,6 +1596,11 @@ static int v4l_try_fmt(const struct v4l2_ioctl_ops *ops, · 73 unmodified lines
15761596 break;
15771597 CLEAR_AFTER_FIELD(p, fmt.sdr);
15781598 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);
15791604 }
15801605 return -EINVAL;
15811606 }
drivers/media/v4l2-core/videobuf-core.c+3−1
@@ -576,7 +576,8 @@ int videobuf_qbuf(struct videobuf_queue *q, struct v4l2_buffer *b) · 575 unmodified lines
576576 }
577577 if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT
578578 || 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) {
580581 buf->size = b->bytesused;
581582 buf->field = b->field;
582583 buf->ts = b->timestamp;
@@ -1154,6 +1155,7 @@ unsigned int videobuf_poll_stream(struct file *file, · 571 unmodified lines
11541155 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
11551156 case V4L2_BUF_TYPE_VBI_OUTPUT:
11561157 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
1158+ case V4L2_BUF_TYPE_SDR_OUTPUT:
11571159 rc = POLLOUT | POLLWRNORM;
11581160 break;
11591161 default:
include/media/v4l2-ioctl.h+8−0
@@ -36,6 +36,8 @@ struct v4l2_ioctl_ops { · 35 unmodified lines
3636 struct v4l2_fmtdesc *f);
3737 int (*vidioc_enum_fmt_sdr_cap) (struct file *file, void *fh,
3838 struct v4l2_fmtdesc *f);
39+ int (*vidioc_enum_fmt_sdr_out) (struct file *file, void *fh,
40+ struct v4l2_fmtdesc *f);
3941
4042 /* VIDIOC_G_FMT handlers */
4143 int (*vidioc_g_fmt_vid_cap) (struct file *file, void *fh,
@@ -60,6 +62,8 @@ struct v4l2_ioctl_ops { · 18 unmodified lines
6062 struct v4l2_format *f);
6163 int (*vidioc_g_fmt_sdr_cap) (struct file *file, void *fh,
6264 struct v4l2_format *f);
65+ int (*vidioc_g_fmt_sdr_out) (struct file *file, void *fh,
66+ struct v4l2_format *f);
6367
6468 /* VIDIOC_S_FMT handlers */
6569 int (*vidioc_s_fmt_vid_cap) (struct file *file, void *fh,
@@ -84,6 +88,8 @@ struct v4l2_ioctl_ops { · 18 unmodified lines
8488 struct v4l2_format *f);
8589 int (*vidioc_s_fmt_sdr_cap) (struct file *file, void *fh,
8690 struct v4l2_format *f);
91+ int (*vidioc_s_fmt_sdr_out) (struct file *file, void *fh,
92+ struct v4l2_format *f);
8793
8894 /* VIDIOC_TRY_FMT handlers */
8995 int (*vidioc_try_fmt_vid_cap) (struct file *file, void *fh,
@@ -108,6 +114,8 @@ struct v4l2_ioctl_ops { · 18 unmodified lines
108114 struct v4l2_format *f);
109115 int (*vidioc_try_fmt_sdr_cap) (struct file *file, void *fh,
110116 struct v4l2_format *f);
117+ int (*vidioc_try_fmt_sdr_out) (struct file *file, void *fh,
118+ struct v4l2_format *f);
111119
112120 /* Buffer handlers */
113121 int (*vidioc_reqbufs) (struct file *file, void *fh, struct v4l2_requestbuffers *b);
include/trace/events/v4l2.h+1−0
@@ -28,6 +28,7 @@ · 27 unmodified lines
2828 EM( V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, "VIDEO_CAPTURE_MPLANE" ) \
2929 EM( V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, "VIDEO_OUTPUT_MPLANE" ) \
3030 EM( V4L2_BUF_TYPE_SDR_CAPTURE, "SDR_CAPTURE" ) \
31+ EM( V4L2_BUF_TYPE_SDR_OUTPUT, "SDR_OUTPUT" ) \
3132 EMe(V4L2_BUF_TYPE_PRIVATE, "PRIVATE" )
3233
3334 SHOW_TYPE
include/uapi/linux/videodev2.h+4−1
@@ -145,6 +145,7 @@ enum v4l2_buf_type { · 144 unmodified lines
145145 V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE = 9,
146146 V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE = 10,
147147 V4L2_BUF_TYPE_SDR_CAPTURE = 11,
148+ V4L2_BUF_TYPE_SDR_OUTPUT = 12,
148149 /* Deprecated, do not use */
149150 V4L2_BUF_TYPE_PRIVATE = 0x80,
150151 };
@@ -159,7 +160,8 @@ enum v4l2_buf_type { · 8 unmodified lines
159160 || (type) == V4L2_BUF_TYPE_VIDEO_OVERLAY \
160161 || (type) == V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY \
161162 || (type) == V4L2_BUF_TYPE_VBI_OUTPUT \
162− || (type) == V4L2_BUF_TYPE_SLICED_VBI_OUTPUT)
163+ || (type) == V4L2_BUF_TYPE_SLICED_VBI_OUTPUT \
164+ || (type) == V4L2_BUF_TYPE_SDR_OUTPUT)
163165
164166 enum v4l2_tuner_type {
165167 V4L2_TUNER_RADIO = 1,
@@ -435,6 +437,7 @@ struct v4l2_capability { · 269 unmodified lines
435437
436438 #define V4L2_CAP_SDR_CAPTURE 0x00100000 /* Is a SDR capture device */
437439 #define V4L2_CAP_EXT_PIX_FORMAT 0x00200000 /* Supports the extended pixel format */
440+#define V4L2_CAP_SDR_OUTPUT 0x00400000 /* Is a SDR output device */
438441
439442 #define V4L2_CAP_READWRITE 0x01000000 /* read/write systemcalls */
440443 #define V4L2_CAP_ASYNCIO 0x02000000 /* async I/O */