aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/video/v4l2-ioctl.c288
1 files changed, 144 insertions, 144 deletions
diff --git a/drivers/media/video/v4l2-ioctl.c b/drivers/media/video/v4l2-ioctl.c
index d7fa8962d8b3..46fd95327630 100644
--- a/drivers/media/video/v4l2-ioctl.c
+++ b/drivers/media/video/v4l2-ioctl.c
@@ -183,150 +183,6 @@ static const char *v4l2_memory_names[] = {
183/* ------------------------------------------------------------------ */ 183/* ------------------------------------------------------------------ */
184/* debug help functions */ 184/* debug help functions */
185 185
186struct v4l2_ioctl_info {
187 unsigned int ioctl;
188 u16 flags;
189 const char * const name;
190};
191
192/* This control needs a priority check */
193#define INFO_FL_PRIO (1 << 0)
194/* This control can be valid if the filehandle passes a control handler. */
195#define INFO_FL_CTRL (1 << 1)
196
197#define IOCTL_INFO(_ioctl, _flags) [_IOC_NR(_ioctl)] = { \
198 .ioctl = _ioctl, \
199 .flags = _flags, \
200 .name = #_ioctl, \
201}
202
203static struct v4l2_ioctl_info v4l2_ioctls[] = {
204 IOCTL_INFO(VIDIOC_QUERYCAP, 0),
205 IOCTL_INFO(VIDIOC_ENUM_FMT, 0),
206 IOCTL_INFO(VIDIOC_G_FMT, 0),
207 IOCTL_INFO(VIDIOC_S_FMT, INFO_FL_PRIO),
208 IOCTL_INFO(VIDIOC_REQBUFS, INFO_FL_PRIO),
209 IOCTL_INFO(VIDIOC_QUERYBUF, 0),
210 IOCTL_INFO(VIDIOC_G_FBUF, 0),
211 IOCTL_INFO(VIDIOC_S_FBUF, INFO_FL_PRIO),
212 IOCTL_INFO(VIDIOC_OVERLAY, INFO_FL_PRIO),
213 IOCTL_INFO(VIDIOC_QBUF, 0),
214 IOCTL_INFO(VIDIOC_DQBUF, 0),
215 IOCTL_INFO(VIDIOC_STREAMON, INFO_FL_PRIO),
216 IOCTL_INFO(VIDIOC_STREAMOFF, INFO_FL_PRIO),
217 IOCTL_INFO(VIDIOC_G_PARM, 0),
218 IOCTL_INFO(VIDIOC_S_PARM, INFO_FL_PRIO),
219 IOCTL_INFO(VIDIOC_G_STD, 0),
220 IOCTL_INFO(VIDIOC_S_STD, INFO_FL_PRIO),
221 IOCTL_INFO(VIDIOC_ENUMSTD, 0),
222 IOCTL_INFO(VIDIOC_ENUMINPUT, 0),
223 IOCTL_INFO(VIDIOC_G_CTRL, INFO_FL_CTRL),
224 IOCTL_INFO(VIDIOC_S_CTRL, INFO_FL_PRIO | INFO_FL_CTRL),
225 IOCTL_INFO(VIDIOC_G_TUNER, 0),
226 IOCTL_INFO(VIDIOC_S_TUNER, INFO_FL_PRIO),
227 IOCTL_INFO(VIDIOC_G_AUDIO, 0),
228 IOCTL_INFO(VIDIOC_S_AUDIO, INFO_FL_PRIO),
229 IOCTL_INFO(VIDIOC_QUERYCTRL, INFO_FL_CTRL),
230 IOCTL_INFO(VIDIOC_QUERYMENU, INFO_FL_CTRL),
231 IOCTL_INFO(VIDIOC_G_INPUT, 0),
232 IOCTL_INFO(VIDIOC_S_INPUT, INFO_FL_PRIO),
233 IOCTL_INFO(VIDIOC_G_OUTPUT, 0),
234 IOCTL_INFO(VIDIOC_S_OUTPUT, INFO_FL_PRIO),
235 IOCTL_INFO(VIDIOC_ENUMOUTPUT, 0),
236 IOCTL_INFO(VIDIOC_G_AUDOUT, 0),
237 IOCTL_INFO(VIDIOC_S_AUDOUT, INFO_FL_PRIO),
238 IOCTL_INFO(VIDIOC_G_MODULATOR, 0),
239 IOCTL_INFO(VIDIOC_S_MODULATOR, INFO_FL_PRIO),
240 IOCTL_INFO(VIDIOC_G_FREQUENCY, 0),
241 IOCTL_INFO(VIDIOC_S_FREQUENCY, INFO_FL_PRIO),
242 IOCTL_INFO(VIDIOC_CROPCAP, 0),
243 IOCTL_INFO(VIDIOC_G_CROP, 0),
244 IOCTL_INFO(VIDIOC_S_CROP, INFO_FL_PRIO),
245 IOCTL_INFO(VIDIOC_G_SELECTION, 0),
246 IOCTL_INFO(VIDIOC_S_SELECTION, INFO_FL_PRIO),
247 IOCTL_INFO(VIDIOC_G_JPEGCOMP, 0),
248 IOCTL_INFO(VIDIOC_S_JPEGCOMP, INFO_FL_PRIO),
249 IOCTL_INFO(VIDIOC_QUERYSTD, 0),
250 IOCTL_INFO(VIDIOC_TRY_FMT, 0),
251 IOCTL_INFO(VIDIOC_ENUMAUDIO, 0),
252 IOCTL_INFO(VIDIOC_ENUMAUDOUT, 0),
253 IOCTL_INFO(VIDIOC_G_PRIORITY, 0),
254 IOCTL_INFO(VIDIOC_S_PRIORITY, INFO_FL_PRIO),
255 IOCTL_INFO(VIDIOC_G_SLICED_VBI_CAP, 0),
256 IOCTL_INFO(VIDIOC_LOG_STATUS, 0),
257 IOCTL_INFO(VIDIOC_G_EXT_CTRLS, INFO_FL_CTRL),
258 IOCTL_INFO(VIDIOC_S_EXT_CTRLS, INFO_FL_PRIO | INFO_FL_CTRL),
259 IOCTL_INFO(VIDIOC_TRY_EXT_CTRLS, 0),
260 IOCTL_INFO(VIDIOC_ENUM_FRAMESIZES, 0),
261 IOCTL_INFO(VIDIOC_ENUM_FRAMEINTERVALS, 0),
262 IOCTL_INFO(VIDIOC_G_ENC_INDEX, 0),
263 IOCTL_INFO(VIDIOC_ENCODER_CMD, INFO_FL_PRIO),
264 IOCTL_INFO(VIDIOC_TRY_ENCODER_CMD, 0),
265 IOCTL_INFO(VIDIOC_DECODER_CMD, INFO_FL_PRIO),
266 IOCTL_INFO(VIDIOC_TRY_DECODER_CMD, 0),
267#ifdef CONFIG_VIDEO_ADV_DEBUG
268 IOCTL_INFO(VIDIOC_DBG_S_REGISTER, 0),
269 IOCTL_INFO(VIDIOC_DBG_G_REGISTER, 0),
270#endif
271 IOCTL_INFO(VIDIOC_DBG_G_CHIP_IDENT, 0),
272 IOCTL_INFO(VIDIOC_S_HW_FREQ_SEEK, INFO_FL_PRIO),
273 IOCTL_INFO(VIDIOC_ENUM_DV_PRESETS, 0),
274 IOCTL_INFO(VIDIOC_S_DV_PRESET, INFO_FL_PRIO),
275 IOCTL_INFO(VIDIOC_G_DV_PRESET, 0),
276 IOCTL_INFO(VIDIOC_QUERY_DV_PRESET, 0),
277 IOCTL_INFO(VIDIOC_S_DV_TIMINGS, INFO_FL_PRIO),
278 IOCTL_INFO(VIDIOC_G_DV_TIMINGS, 0),
279 IOCTL_INFO(VIDIOC_DQEVENT, 0),
280 IOCTL_INFO(VIDIOC_SUBSCRIBE_EVENT, 0),
281 IOCTL_INFO(VIDIOC_UNSUBSCRIBE_EVENT, 0),
282 IOCTL_INFO(VIDIOC_CREATE_BUFS, INFO_FL_PRIO),
283 IOCTL_INFO(VIDIOC_PREPARE_BUF, 0),
284 IOCTL_INFO(VIDIOC_ENUM_DV_TIMINGS, 0),
285 IOCTL_INFO(VIDIOC_QUERY_DV_TIMINGS, 0),
286 IOCTL_INFO(VIDIOC_DV_TIMINGS_CAP, 0),
287};
288#define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
289
290bool v4l2_is_known_ioctl(unsigned int cmd)
291{
292 if (_IOC_NR(cmd) >= V4L2_IOCTLS)
293 return false;
294 return v4l2_ioctls[_IOC_NR(cmd)].ioctl == cmd;
295}
296
297/* Common ioctl debug function. This function can be used by
298 external ioctl messages as well as internal V4L ioctl */
299void v4l_printk_ioctl(unsigned int cmd)
300{
301 char *dir, *type;
302
303 switch (_IOC_TYPE(cmd)) {
304 case 'd':
305 type = "v4l2_int";
306 break;
307 case 'V':
308 if (_IOC_NR(cmd) >= V4L2_IOCTLS) {
309 type = "v4l2";
310 break;
311 }
312 printk("%s", v4l2_ioctls[_IOC_NR(cmd)].name);
313 return;
314 default:
315 type = "unknown";
316 }
317
318 switch (_IOC_DIR(cmd)) {
319 case _IOC_NONE: dir = "--"; break;
320 case _IOC_READ: dir = "r-"; break;
321 case _IOC_WRITE: dir = "-w"; break;
322 case _IOC_READ | _IOC_WRITE: dir = "rw"; break;
323 default: dir = "*ERR*"; break;
324 }
325 printk("%s ioctl '%c', dir=%s, #%d (0x%08x)",
326 type, _IOC_TYPE(cmd), dir, _IOC_NR(cmd), cmd);
327}
328EXPORT_SYMBOL(v4l_printk_ioctl);
329
330static void dbgbuf(unsigned int cmd, struct video_device *vfd, 186static void dbgbuf(unsigned int cmd, struct video_device *vfd,
331 struct v4l2_buffer *p) 187 struct v4l2_buffer *p)
332{ 188{
@@ -536,6 +392,150 @@ static int check_fmt(const struct v4l2_ioctl_ops *ops, enum v4l2_buf_type type)
536 return -EINVAL; 392 return -EINVAL;
537} 393}
538 394
395struct v4l2_ioctl_info {
396 unsigned int ioctl;
397 u16 flags;
398 const char * const name;
399};
400
401/* This control needs a priority check */
402#define INFO_FL_PRIO (1 << 0)
403/* This control can be valid if the filehandle passes a control handler. */
404#define INFO_FL_CTRL (1 << 1)
405
406#define IOCTL_INFO(_ioctl, _flags) [_IOC_NR(_ioctl)] = { \
407 .ioctl = _ioctl, \
408 .flags = _flags, \
409 .name = #_ioctl, \
410}
411
412static struct v4l2_ioctl_info v4l2_ioctls[] = {
413 IOCTL_INFO(VIDIOC_QUERYCAP, 0),
414 IOCTL_INFO(VIDIOC_ENUM_FMT, 0),
415 IOCTL_INFO(VIDIOC_G_FMT, 0),
416 IOCTL_INFO(VIDIOC_S_FMT, INFO_FL_PRIO),
417 IOCTL_INFO(VIDIOC_REQBUFS, INFO_FL_PRIO),
418 IOCTL_INFO(VIDIOC_QUERYBUF, 0),
419 IOCTL_INFO(VIDIOC_G_FBUF, 0),
420 IOCTL_INFO(VIDIOC_S_FBUF, INFO_FL_PRIO),
421 IOCTL_INFO(VIDIOC_OVERLAY, INFO_FL_PRIO),
422 IOCTL_INFO(VIDIOC_QBUF, 0),
423 IOCTL_INFO(VIDIOC_DQBUF, 0),
424 IOCTL_INFO(VIDIOC_STREAMON, INFO_FL_PRIO),
425 IOCTL_INFO(VIDIOC_STREAMOFF, INFO_FL_PRIO),
426 IOCTL_INFO(VIDIOC_G_PARM, 0),
427 IOCTL_INFO(VIDIOC_S_PARM, INFO_FL_PRIO),
428 IOCTL_INFO(VIDIOC_G_STD, 0),
429 IOCTL_INFO(VIDIOC_S_STD, INFO_FL_PRIO),
430 IOCTL_INFO(VIDIOC_ENUMSTD, 0),
431 IOCTL_INFO(VIDIOC_ENUMINPUT, 0),
432 IOCTL_INFO(VIDIOC_G_CTRL, INFO_FL_CTRL),
433 IOCTL_INFO(VIDIOC_S_CTRL, INFO_FL_PRIO | INFO_FL_CTRL),
434 IOCTL_INFO(VIDIOC_G_TUNER, 0),
435 IOCTL_INFO(VIDIOC_S_TUNER, INFO_FL_PRIO),
436 IOCTL_INFO(VIDIOC_G_AUDIO, 0),
437 IOCTL_INFO(VIDIOC_S_AUDIO, INFO_FL_PRIO),
438 IOCTL_INFO(VIDIOC_QUERYCTRL, INFO_FL_CTRL),
439 IOCTL_INFO(VIDIOC_QUERYMENU, INFO_FL_CTRL),
440 IOCTL_INFO(VIDIOC_G_INPUT, 0),
441 IOCTL_INFO(VIDIOC_S_INPUT, INFO_FL_PRIO),
442 IOCTL_INFO(VIDIOC_G_OUTPUT, 0),
443 IOCTL_INFO(VIDIOC_S_OUTPUT, INFO_FL_PRIO),
444 IOCTL_INFO(VIDIOC_ENUMOUTPUT, 0),
445 IOCTL_INFO(VIDIOC_G_AUDOUT, 0),
446 IOCTL_INFO(VIDIOC_S_AUDOUT, INFO_FL_PRIO),
447 IOCTL_INFO(VIDIOC_G_MODULATOR, 0),
448 IOCTL_INFO(VIDIOC_S_MODULATOR, INFO_FL_PRIO),
449 IOCTL_INFO(VIDIOC_G_FREQUENCY, 0),
450 IOCTL_INFO(VIDIOC_S_FREQUENCY, INFO_FL_PRIO),
451 IOCTL_INFO(VIDIOC_CROPCAP, 0),
452 IOCTL_INFO(VIDIOC_G_CROP, 0),
453 IOCTL_INFO(VIDIOC_S_CROP, INFO_FL_PRIO),
454 IOCTL_INFO(VIDIOC_G_SELECTION, 0),
455 IOCTL_INFO(VIDIOC_S_SELECTION, INFO_FL_PRIO),
456 IOCTL_INFO(VIDIOC_G_JPEGCOMP, 0),
457 IOCTL_INFO(VIDIOC_S_JPEGCOMP, INFO_FL_PRIO),
458 IOCTL_INFO(VIDIOC_QUERYSTD, 0),
459 IOCTL_INFO(VIDIOC_TRY_FMT, 0),
460 IOCTL_INFO(VIDIOC_ENUMAUDIO, 0),
461 IOCTL_INFO(VIDIOC_ENUMAUDOUT, 0),
462 IOCTL_INFO(VIDIOC_G_PRIORITY, 0),
463 IOCTL_INFO(VIDIOC_S_PRIORITY, INFO_FL_PRIO),
464 IOCTL_INFO(VIDIOC_G_SLICED_VBI_CAP, 0),
465 IOCTL_INFO(VIDIOC_LOG_STATUS, 0),
466 IOCTL_INFO(VIDIOC_G_EXT_CTRLS, INFO_FL_CTRL),
467 IOCTL_INFO(VIDIOC_S_EXT_CTRLS, INFO_FL_PRIO | INFO_FL_CTRL),
468 IOCTL_INFO(VIDIOC_TRY_EXT_CTRLS, 0),
469 IOCTL_INFO(VIDIOC_ENUM_FRAMESIZES, 0),
470 IOCTL_INFO(VIDIOC_ENUM_FRAMEINTERVALS, 0),
471 IOCTL_INFO(VIDIOC_G_ENC_INDEX, 0),
472 IOCTL_INFO(VIDIOC_ENCODER_CMD, INFO_FL_PRIO),
473 IOCTL_INFO(VIDIOC_TRY_ENCODER_CMD, 0),
474 IOCTL_INFO(VIDIOC_DECODER_CMD, INFO_FL_PRIO),
475 IOCTL_INFO(VIDIOC_TRY_DECODER_CMD, 0),
476#ifdef CONFIG_VIDEO_ADV_DEBUG
477 IOCTL_INFO(VIDIOC_DBG_S_REGISTER, 0),
478 IOCTL_INFO(VIDIOC_DBG_G_REGISTER, 0),
479#endif
480 IOCTL_INFO(VIDIOC_DBG_G_CHIP_IDENT, 0),
481 IOCTL_INFO(VIDIOC_S_HW_FREQ_SEEK, INFO_FL_PRIO),
482 IOCTL_INFO(VIDIOC_ENUM_DV_PRESETS, 0),
483 IOCTL_INFO(VIDIOC_S_DV_PRESET, INFO_FL_PRIO),
484 IOCTL_INFO(VIDIOC_G_DV_PRESET, 0),
485 IOCTL_INFO(VIDIOC_QUERY_DV_PRESET, 0),
486 IOCTL_INFO(VIDIOC_S_DV_TIMINGS, INFO_FL_PRIO),
487 IOCTL_INFO(VIDIOC_G_DV_TIMINGS, 0),
488 IOCTL_INFO(VIDIOC_DQEVENT, 0),
489 IOCTL_INFO(VIDIOC_SUBSCRIBE_EVENT, 0),
490 IOCTL_INFO(VIDIOC_UNSUBSCRIBE_EVENT, 0),
491 IOCTL_INFO(VIDIOC_CREATE_BUFS, INFO_FL_PRIO),
492 IOCTL_INFO(VIDIOC_PREPARE_BUF, 0),
493 IOCTL_INFO(VIDIOC_ENUM_DV_TIMINGS, 0),
494 IOCTL_INFO(VIDIOC_QUERY_DV_TIMINGS, 0),
495 IOCTL_INFO(VIDIOC_DV_TIMINGS_CAP, 0),
496};
497#define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
498
499bool v4l2_is_known_ioctl(unsigned int cmd)
500{
501 if (_IOC_NR(cmd) >= V4L2_IOCTLS)
502 return false;
503 return v4l2_ioctls[_IOC_NR(cmd)].ioctl == cmd;
504}
505
506/* Common ioctl debug function. This function can be used by
507 external ioctl messages as well as internal V4L ioctl */
508void v4l_printk_ioctl(unsigned int cmd)
509{
510 char *dir, *type;
511
512 switch (_IOC_TYPE(cmd)) {
513 case 'd':
514 type = "v4l2_int";
515 break;
516 case 'V':
517 if (_IOC_NR(cmd) >= V4L2_IOCTLS) {
518 type = "v4l2";
519 break;
520 }
521 printk("%s", v4l2_ioctls[_IOC_NR(cmd)].name);
522 return;
523 default:
524 type = "unknown";
525 }
526
527 switch (_IOC_DIR(cmd)) {
528 case _IOC_NONE: dir = "--"; break;
529 case _IOC_READ: dir = "r-"; break;
530 case _IOC_WRITE: dir = "-w"; break;
531 case _IOC_READ | _IOC_WRITE: dir = "rw"; break;
532 default: dir = "*ERR*"; break;
533 }
534 printk("%s ioctl '%c', dir=%s, #%d (0x%08x)",
535 type, _IOC_TYPE(cmd), dir, _IOC_NR(cmd), cmd);
536}
537EXPORT_SYMBOL(v4l_printk_ioctl);
538
539static long __video_do_ioctl(struct file *file, 539static long __video_do_ioctl(struct file *file,
540 unsigned int cmd, void *arg) 540 unsigned int cmd, void *arg)
541{ 541{