diff options
-rw-r--r-- | drivers/media/video/v4l2-ioctl.c | 288 |
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 | ||
186 | struct 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 | |||
203 | static 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 | |||
290 | bool 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 */ | ||
299 | void 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 | } | ||
328 | EXPORT_SYMBOL(v4l_printk_ioctl); | ||
329 | |||
330 | static void dbgbuf(unsigned int cmd, struct video_device *vfd, | 186 | static 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 | ||
395 | struct 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 | |||
412 | static 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 | |||
499 | bool 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 */ | ||
508 | void 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 | } | ||
537 | EXPORT_SYMBOL(v4l_printk_ioctl); | ||
538 | |||
539 | static long __video_do_ioctl(struct file *file, | 539 | static long __video_do_ioctl(struct file *file, |
540 | unsigned int cmd, void *arg) | 540 | unsigned int cmd, void *arg) |
541 | { | 541 | { |