135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil/* 235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil * Video capture interface for Linux version 2 335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil * 435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil * A generic framework to process V4L2 ioctl commands. 535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil * 635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil * This program is free software; you can redistribute it and/or 735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil * modify it under the terms of the GNU General Public License 835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil * as published by the Free Software Foundation; either version 935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil * 2 of the License, or (at your option) any later version. 1035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil * 11d9b01449e75d1351296595e28d2af72993bcc3dcAlan Cox * Authors: Alan Cox, <alan@lxorguk.ukuu.org.uk> (version 1) 1235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil * Mauro Carvalho Chehab <mchehab@infradead.org> (version 2) 1335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil */ 1435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil#include <linux/module.h> 165a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h> 1735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil#include <linux/types.h> 1835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil#include <linux/kernel.h> 19ae6db5154671759426046c2cbc2e20a82ff0feedMauro Carvalho Chehab#include <linux/version.h> 2035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 2135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil#include <linux/videodev2.h> 2235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 2335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil#include <media/v4l2-common.h> 2435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil#include <media/v4l2-ioctl.h> 2511bbc1cadb638aaccb4764c6e16807b36b53cf19Hans Verkuil#include <media/v4l2-ctrls.h> 26d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus#include <media/v4l2-fh.h> 27d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus#include <media/v4l2-event.h> 2899cd47bc733436da282016e629eef6baa0f6047cHans Verkuil#include <media/v4l2-device.h> 2980b36e0fcfe7520ee92f648148d091ad880ae711Hans Verkuil#include <media/v4l2-chip-ident.h> 3035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 3135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil#define dbgarg(cmd, fmt, arg...) \ 3235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil do { \ 3335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) { \ 3435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil printk(KERN_DEBUG "%s: ", vfd->name); \ 3535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil v4l_printk_ioctl(cmd); \ 3635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil printk(" " fmt, ## arg); \ 3735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } \ 3835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } while (0) 3935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 4035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil#define dbgarg2(fmt, arg...) \ 4135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil do { \ 4235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) \ 4335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil printk(KERN_DEBUG "%s: " fmt, vfd->name, ## arg);\ 4435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } while (0) 4535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 46d33fbcbb21ba53358ba8a83765cfd1401e06d883Mauro Carvalho Chehab#define dbgarg3(fmt, arg...) \ 47d33fbcbb21ba53358ba8a83765cfd1401e06d883Mauro Carvalho Chehab do { \ 48d33fbcbb21ba53358ba8a83765cfd1401e06d883Mauro Carvalho Chehab if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) \ 49d33fbcbb21ba53358ba8a83765cfd1401e06d883Mauro Carvalho Chehab printk(KERN_CONT "%s: " fmt, vfd->name, ## arg);\ 50d33fbcbb21ba53358ba8a83765cfd1401e06d883Mauro Carvalho Chehab } while (0) 51d33fbcbb21ba53358ba8a83765cfd1401e06d883Mauro Carvalho Chehab 5225985edcedea6396277003854657b5f3cb31a628Lucas De Marchi/* Zero out the end of the struct pointed to by p. Everything after, but 537ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho * not including, the specified field is cleared. */ 547ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho#define CLEAR_AFTER_FIELD(p, field) \ 557ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho memset((u8 *)(p) + offsetof(typeof(*(p)), field) + sizeof((p)->field), \ 567ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho 0, sizeof(*(p)) - offsetof(typeof(*(p)), field) - sizeof((p)->field)) 577ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho 5893d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil#define have_fmt_ops(foo) ( \ 59a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab ops->vidioc_##foo##_fmt_vid_cap || \ 60a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab ops->vidioc_##foo##_fmt_vid_out || \ 61a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab ops->vidioc_##foo##_fmt_vid_cap_mplane || \ 62a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab ops->vidioc_##foo##_fmt_vid_out_mplane || \ 63a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab ops->vidioc_##foo##_fmt_vid_overlay || \ 6493d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ops->vidioc_##foo##_fmt_vbi_cap || \ 6593d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ops->vidioc_##foo##_fmt_vid_out_overlay || \ 6693d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ops->vidioc_##foo##_fmt_vbi_out || \ 6793d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ops->vidioc_##foo##_fmt_sliced_vbi_cap || \ 6893d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ops->vidioc_##foo##_fmt_sliced_vbi_out || \ 6993d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ops->vidioc_##foo##_fmt_type_private) 70a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab 7135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuilstruct std_descr { 7235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil v4l2_std_id std; 7335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil const char *descr; 7435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil}; 7535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 7635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuilstatic const struct std_descr standards[] = { 7735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_NTSC, "NTSC" }, 7835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_NTSC_M, "NTSC-M" }, 7935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_NTSC_M_JP, "NTSC-M-JP" }, 8035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_NTSC_M_KR, "NTSC-M-KR" }, 8135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_NTSC_443, "NTSC-443" }, 8235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_PAL, "PAL" }, 8335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_PAL_BG, "PAL-BG" }, 8435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_PAL_B, "PAL-B" }, 8535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_PAL_B1, "PAL-B1" }, 8635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_PAL_G, "PAL-G" }, 8735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_PAL_H, "PAL-H" }, 8835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_PAL_I, "PAL-I" }, 8935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_PAL_DK, "PAL-DK" }, 9035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_PAL_D, "PAL-D" }, 9135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_PAL_D1, "PAL-D1" }, 9235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_PAL_K, "PAL-K" }, 9335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_PAL_M, "PAL-M" }, 9435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_PAL_N, "PAL-N" }, 9535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_PAL_Nc, "PAL-Nc" }, 9635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_PAL_60, "PAL-60" }, 9735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_SECAM, "SECAM" }, 9835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_SECAM_B, "SECAM-B" }, 9935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_SECAM_G, "SECAM-G" }, 10035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_SECAM_H, "SECAM-H" }, 10135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_SECAM_DK, "SECAM-DK" }, 10235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_SECAM_D, "SECAM-D" }, 10335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_SECAM_K, "SECAM-K" }, 10435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_SECAM_K1, "SECAM-K1" }, 10535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_SECAM_L, "SECAM-L" }, 10635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { V4L2_STD_SECAM_LC, "SECAM-Lc" }, 10735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 0, "Unknown" } 10835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil}; 10935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 11035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil/* video4linux standard ID conversion to standard name 11135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil */ 11235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuilconst char *v4l2_norm_to_name(v4l2_std_id id) 11335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil{ 11435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil u32 myid = id; 11535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil int i; 11635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 11735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* HACK: ppc32 architecture doesn't have __ucmpdi2 function to handle 11835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 64 bit comparations. So, on that architecture, with some gcc 11935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil variants, compilation fails. Currently, the max value is 30bit wide. 12035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil */ 12135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil BUG_ON(myid != id); 12235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 12335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil for (i = 0; standards[i].std; i++) 12435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (myid == standards[i].std) 12535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 12635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil return standards[i].descr; 12735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil} 12835ea11ff84719b1bfab2909903a9640a86552fd1Hans VerkuilEXPORT_SYMBOL(v4l2_norm_to_name); 12935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 13051f0b8d57af501624ee55e8ca15d09d5bdc2b0ddTrent Piepho/* Returns frame period for the given standard */ 13151f0b8d57af501624ee55e8ca15d09d5bdc2b0ddTrent Piephovoid v4l2_video_std_frame_period(int id, struct v4l2_fract *frameperiod) 13251f0b8d57af501624ee55e8ca15d09d5bdc2b0ddTrent Piepho{ 13351f0b8d57af501624ee55e8ca15d09d5bdc2b0ddTrent Piepho if (id & V4L2_STD_525_60) { 13451f0b8d57af501624ee55e8ca15d09d5bdc2b0ddTrent Piepho frameperiod->numerator = 1001; 13551f0b8d57af501624ee55e8ca15d09d5bdc2b0ddTrent Piepho frameperiod->denominator = 30000; 13651f0b8d57af501624ee55e8ca15d09d5bdc2b0ddTrent Piepho } else { 13751f0b8d57af501624ee55e8ca15d09d5bdc2b0ddTrent Piepho frameperiod->numerator = 1; 13851f0b8d57af501624ee55e8ca15d09d5bdc2b0ddTrent Piepho frameperiod->denominator = 25; 13951f0b8d57af501624ee55e8ca15d09d5bdc2b0ddTrent Piepho } 14051f0b8d57af501624ee55e8ca15d09d5bdc2b0ddTrent Piepho} 14151f0b8d57af501624ee55e8ca15d09d5bdc2b0ddTrent PiephoEXPORT_SYMBOL(v4l2_video_std_frame_period); 14251f0b8d57af501624ee55e8ca15d09d5bdc2b0ddTrent Piepho 14335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil/* Fill in the fields of a v4l2_standard structure according to the 14435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 'id' and 'transmission' parameters. Returns negative on error. */ 14535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuilint v4l2_video_std_construct(struct v4l2_standard *vs, 14635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil int id, const char *name) 14735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil{ 14851f0b8d57af501624ee55e8ca15d09d5bdc2b0ddTrent Piepho vs->id = id; 14951f0b8d57af501624ee55e8ca15d09d5bdc2b0ddTrent Piepho v4l2_video_std_frame_period(id, &vs->frameperiod); 15051f0b8d57af501624ee55e8ca15d09d5bdc2b0ddTrent Piepho vs->framelines = (id & V4L2_STD_525_60) ? 525 : 625; 15135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil strlcpy(vs->name, name, sizeof(vs->name)); 15235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil return 0; 15335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil} 15435ea11ff84719b1bfab2909903a9640a86552fd1Hans VerkuilEXPORT_SYMBOL(v4l2_video_std_construct); 15535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 15635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil/* ----------------------------------------------------------------- */ 15735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil/* some arrays for pretty-printing debug messages of enum types */ 15835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 15935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuilconst char *v4l2_field_names[] = { 16035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [V4L2_FIELD_ANY] = "any", 16135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [V4L2_FIELD_NONE] = "none", 16235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [V4L2_FIELD_TOP] = "top", 16335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [V4L2_FIELD_BOTTOM] = "bottom", 16435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [V4L2_FIELD_INTERLACED] = "interlaced", 16535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [V4L2_FIELD_SEQ_TB] = "seq-tb", 16635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [V4L2_FIELD_SEQ_BT] = "seq-bt", 16735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [V4L2_FIELD_ALTERNATE] = "alternate", 16835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [V4L2_FIELD_INTERLACED_TB] = "interlaced-tb", 16935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [V4L2_FIELD_INTERLACED_BT] = "interlaced-bt", 17035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil}; 17135ea11ff84719b1bfab2909903a9640a86552fd1Hans VerkuilEXPORT_SYMBOL(v4l2_field_names); 17235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 17335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuilconst char *v4l2_type_names[] = { 17435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [V4L2_BUF_TYPE_VIDEO_CAPTURE] = "vid-cap", 17535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [V4L2_BUF_TYPE_VIDEO_OVERLAY] = "vid-overlay", 17635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [V4L2_BUF_TYPE_VIDEO_OUTPUT] = "vid-out", 17735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [V4L2_BUF_TYPE_VBI_CAPTURE] = "vbi-cap", 17835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [V4L2_BUF_TYPE_VBI_OUTPUT] = "vbi-out", 17935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [V4L2_BUF_TYPE_SLICED_VBI_CAPTURE] = "sliced-vbi-cap", 18035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [V4L2_BUF_TYPE_SLICED_VBI_OUTPUT] = "sliced-vbi-out", 18135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY] = "vid-out-overlay", 182f8f3914cf922f5f9e1d60e9e10f6fb92742907adPawel Osciak [V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE] = "vid-cap-mplane", 183f8f3914cf922f5f9e1d60e9e10f6fb92742907adPawel Osciak [V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE] = "vid-out-mplane", 18435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil}; 18535ea11ff84719b1bfab2909903a9640a86552fd1Hans VerkuilEXPORT_SYMBOL(v4l2_type_names); 18635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 18735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuilstatic const char *v4l2_memory_names[] = { 18835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [V4L2_MEMORY_MMAP] = "mmap", 18935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [V4L2_MEMORY_USERPTR] = "userptr", 19035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [V4L2_MEMORY_OVERLAY] = "overlay", 19135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil}; 19235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 19335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil#define prt_names(a, arr) ((((a) >= 0) && ((a) < ARRAY_SIZE(arr))) ? \ 19435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil arr[a] : "unknown") 19535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 19635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil/* ------------------------------------------------------------------ */ 19735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil/* debug help functions */ 19835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuilstatic const char *v4l2_ioctls[] = { 19935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_QUERYCAP)] = "VIDIOC_QUERYCAP", 20035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_RESERVED)] = "VIDIOC_RESERVED", 20135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_ENUM_FMT)] = "VIDIOC_ENUM_FMT", 20235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_G_FMT)] = "VIDIOC_G_FMT", 20335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_S_FMT)] = "VIDIOC_S_FMT", 20435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_REQBUFS)] = "VIDIOC_REQBUFS", 20535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_QUERYBUF)] = "VIDIOC_QUERYBUF", 20635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_G_FBUF)] = "VIDIOC_G_FBUF", 20735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_S_FBUF)] = "VIDIOC_S_FBUF", 20835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_OVERLAY)] = "VIDIOC_OVERLAY", 20935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_QBUF)] = "VIDIOC_QBUF", 21035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_DQBUF)] = "VIDIOC_DQBUF", 21135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_STREAMON)] = "VIDIOC_STREAMON", 21235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_STREAMOFF)] = "VIDIOC_STREAMOFF", 21335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_G_PARM)] = "VIDIOC_G_PARM", 21435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_S_PARM)] = "VIDIOC_S_PARM", 21535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_G_STD)] = "VIDIOC_G_STD", 21635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_S_STD)] = "VIDIOC_S_STD", 21735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_ENUMSTD)] = "VIDIOC_ENUMSTD", 21835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_ENUMINPUT)] = "VIDIOC_ENUMINPUT", 21935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_G_CTRL)] = "VIDIOC_G_CTRL", 22035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_S_CTRL)] = "VIDIOC_S_CTRL", 22135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_G_TUNER)] = "VIDIOC_G_TUNER", 22235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_S_TUNER)] = "VIDIOC_S_TUNER", 22335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_G_AUDIO)] = "VIDIOC_G_AUDIO", 22435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_S_AUDIO)] = "VIDIOC_S_AUDIO", 22535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_QUERYCTRL)] = "VIDIOC_QUERYCTRL", 22635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_QUERYMENU)] = "VIDIOC_QUERYMENU", 22735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_G_INPUT)] = "VIDIOC_G_INPUT", 22835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_S_INPUT)] = "VIDIOC_S_INPUT", 22935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_G_OUTPUT)] = "VIDIOC_G_OUTPUT", 23035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_S_OUTPUT)] = "VIDIOC_S_OUTPUT", 23135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_ENUMOUTPUT)] = "VIDIOC_ENUMOUTPUT", 23235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_G_AUDOUT)] = "VIDIOC_G_AUDOUT", 23335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_S_AUDOUT)] = "VIDIOC_S_AUDOUT", 23435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_G_MODULATOR)] = "VIDIOC_G_MODULATOR", 23535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_S_MODULATOR)] = "VIDIOC_S_MODULATOR", 23635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_G_FREQUENCY)] = "VIDIOC_G_FREQUENCY", 23735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_S_FREQUENCY)] = "VIDIOC_S_FREQUENCY", 23835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_CROPCAP)] = "VIDIOC_CROPCAP", 23935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_G_CROP)] = "VIDIOC_G_CROP", 24035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_S_CROP)] = "VIDIOC_S_CROP", 2410e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski [_IOC_NR(VIDIOC_G_SELECTION)] = "VIDIOC_G_SELECTION", 2420e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski [_IOC_NR(VIDIOC_S_SELECTION)] = "VIDIOC_S_SELECTION", 24335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_G_JPEGCOMP)] = "VIDIOC_G_JPEGCOMP", 24435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_S_JPEGCOMP)] = "VIDIOC_S_JPEGCOMP", 24535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_QUERYSTD)] = "VIDIOC_QUERYSTD", 24635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_TRY_FMT)] = "VIDIOC_TRY_FMT", 24735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_ENUMAUDIO)] = "VIDIOC_ENUMAUDIO", 24835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_ENUMAUDOUT)] = "VIDIOC_ENUMAUDOUT", 24935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_G_PRIORITY)] = "VIDIOC_G_PRIORITY", 25035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_S_PRIORITY)] = "VIDIOC_S_PRIORITY", 25135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_G_SLICED_VBI_CAP)] = "VIDIOC_G_SLICED_VBI_CAP", 25235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_LOG_STATUS)] = "VIDIOC_LOG_STATUS", 25335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_G_EXT_CTRLS)] = "VIDIOC_G_EXT_CTRLS", 25435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_S_EXT_CTRLS)] = "VIDIOC_S_EXT_CTRLS", 25535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_TRY_EXT_CTRLS)] = "VIDIOC_TRY_EXT_CTRLS", 25635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil#if 1 25735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_ENUM_FRAMESIZES)] = "VIDIOC_ENUM_FRAMESIZES", 25835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_ENUM_FRAMEINTERVALS)] = "VIDIOC_ENUM_FRAMEINTERVALS", 25935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_G_ENC_INDEX)] = "VIDIOC_G_ENC_INDEX", 26035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_ENCODER_CMD)] = "VIDIOC_ENCODER_CMD", 26135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_TRY_ENCODER_CMD)] = "VIDIOC_TRY_ENCODER_CMD", 26235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 263a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil [_IOC_NR(VIDIOC_DECODER_CMD)] = "VIDIOC_DECODER_CMD", 264a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil [_IOC_NR(VIDIOC_TRY_DECODER_CMD)] = "VIDIOC_TRY_DECODER_CMD", 26535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_DBG_S_REGISTER)] = "VIDIOC_DBG_S_REGISTER", 26635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_DBG_G_REGISTER)] = "VIDIOC_DBG_G_REGISTER", 26735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 268aecde8b53b8ee1330a5a8206200f0d6b8845a6e0Hans Verkuil [_IOC_NR(VIDIOC_DBG_G_CHIP_IDENT)] = "VIDIOC_DBG_G_CHIP_IDENT", 26935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil [_IOC_NR(VIDIOC_S_HW_FREQ_SEEK)] = "VIDIOC_S_HW_FREQ_SEEK", 27035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil#endif 271b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri [_IOC_NR(VIDIOC_ENUM_DV_PRESETS)] = "VIDIOC_ENUM_DV_PRESETS", 272b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri [_IOC_NR(VIDIOC_S_DV_PRESET)] = "VIDIOC_S_DV_PRESET", 273b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri [_IOC_NR(VIDIOC_G_DV_PRESET)] = "VIDIOC_G_DV_PRESET", 274b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri [_IOC_NR(VIDIOC_QUERY_DV_PRESET)] = "VIDIOC_QUERY_DV_PRESET", 275b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri [_IOC_NR(VIDIOC_S_DV_TIMINGS)] = "VIDIOC_S_DV_TIMINGS", 276b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri [_IOC_NR(VIDIOC_G_DV_TIMINGS)] = "VIDIOC_G_DV_TIMINGS", 277fda1021477b390506ebed0225eaa6d31a903e2b7Sakari Ailus [_IOC_NR(VIDIOC_DQEVENT)] = "VIDIOC_DQEVENT", 278fda1021477b390506ebed0225eaa6d31a903e2b7Sakari Ailus [_IOC_NR(VIDIOC_SUBSCRIBE_EVENT)] = "VIDIOC_SUBSCRIBE_EVENT", 279fda1021477b390506ebed0225eaa6d31a903e2b7Sakari Ailus [_IOC_NR(VIDIOC_UNSUBSCRIBE_EVENT)] = "VIDIOC_UNSUBSCRIBE_EVENT", 2802150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski [_IOC_NR(VIDIOC_CREATE_BUFS)] = "VIDIOC_CREATE_BUFS", 2812150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski [_IOC_NR(VIDIOC_PREPARE_BUF)] = "VIDIOC_PREPARE_BUF", 28235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil}; 28335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil#define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls) 28435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 28535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil/* Common ioctl debug function. This function can be used by 28635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil external ioctl messages as well as internal V4L ioctl */ 28735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuilvoid v4l_printk_ioctl(unsigned int cmd) 28835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil{ 28935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil char *dir, *type; 29035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 29135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil switch (_IOC_TYPE(cmd)) { 29235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case 'd': 29378a3b4db2e53a1903c86e2856e175d85a3849e84Hans Verkuil type = "v4l2_int"; 29478a3b4db2e53a1903c86e2856e175d85a3849e84Hans Verkuil break; 29535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case 'V': 29635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (_IOC_NR(cmd) >= V4L2_IOCTLS) { 29735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil type = "v4l2"; 29835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 29935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 30035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil printk("%s", v4l2_ioctls[_IOC_NR(cmd)]); 30135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil return; 30235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil default: 30335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil type = "unknown"; 30435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 30535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 30635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil switch (_IOC_DIR(cmd)) { 30735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case _IOC_NONE: dir = "--"; break; 30835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case _IOC_READ: dir = "r-"; break; 30935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case _IOC_WRITE: dir = "-w"; break; 31035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case _IOC_READ | _IOC_WRITE: dir = "rw"; break; 31135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil default: dir = "*ERR*"; break; 31235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 31335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil printk("%s ioctl '%c', dir=%s, #%d (0x%08x)", 31435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil type, _IOC_TYPE(cmd), dir, _IOC_NR(cmd), cmd); 31535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil} 31635ea11ff84719b1bfab2909903a9640a86552fd1Hans VerkuilEXPORT_SYMBOL(v4l_printk_ioctl); 31735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 31835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuilstatic void dbgbuf(unsigned int cmd, struct video_device *vfd, 31935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_buffer *p) 32035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil{ 32135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_timecode *tc = &p->timecode; 322d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak struct v4l2_plane *plane; 323d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak int i; 32435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 32535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "%02ld:%02d:%02d.%08ld index=%d, type=%s, " 326d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak "flags=0x%08d, field=%0d, sequence=%d, memory=%s\n", 32735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->timestamp.tv_sec / 3600, 32835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil (int)(p->timestamp.tv_sec / 60) % 60, 32935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil (int)(p->timestamp.tv_sec % 60), 330b045979d61b235cd9cc8347760fcfb44fc8ecbd6Alexander Beregalov (long)p->timestamp.tv_usec, 33135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->index, 33235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil prt_names(p->type, v4l2_type_names), 333d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak p->flags, p->field, p->sequence, 334d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak prt_names(p->memory, v4l2_memory_names)); 335d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak 336d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak if (V4L2_TYPE_IS_MULTIPLANAR(p->type) && p->m.planes) { 337d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak for (i = 0; i < p->length; ++i) { 338d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak plane = &p->m.planes[i]; 339d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak dbgarg2("plane %d: bytesused=%d, data_offset=0x%08x " 340d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak "offset/userptr=0x%08lx, length=%d\n", 341d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak i, plane->bytesused, plane->data_offset, 342d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak plane->m.userptr, plane->length); 343d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak } 344d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak } else { 345d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak dbgarg2("bytesused=%d, offset/userptr=0x%08lx, length=%d\n", 346d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak p->bytesused, p->m.userptr, p->length); 347d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak } 348d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak 34935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg2("timecode=%02d:%02d:%02d type=%d, " 35035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "flags=0x%08d, frames=%d, userbits=0x%08x\n", 35135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil tc->hours, tc->minutes, tc->seconds, 35235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil tc->type, tc->flags, tc->frames, *(__u32 *)tc->userbits); 35335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil} 35435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 35535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuilstatic inline void dbgrect(struct video_device *vfd, char *s, 35635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_rect *r) 35735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil{ 35835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg2("%sRect start at %dx%d, size=%dx%d\n", s, r->left, r->top, 35935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil r->width, r->height); 36035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil}; 36135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 36235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuilstatic inline void v4l_print_pix_fmt(struct video_device *vfd, 36335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_pix_format *fmt) 36435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil{ 36535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg2("width=%d, height=%d, format=%c%c%c%c, field=%s, " 36635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "bytesperline=%d sizeimage=%d, colorspace=%d\n", 36735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil fmt->width, fmt->height, 36835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil (fmt->pixelformat & 0xff), 36935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil (fmt->pixelformat >> 8) & 0xff, 37035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil (fmt->pixelformat >> 16) & 0xff, 37135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil (fmt->pixelformat >> 24) & 0xff, 37235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil prt_names(fmt->field, v4l2_field_names), 37335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil fmt->bytesperline, fmt->sizeimage, fmt->colorspace); 37435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil}; 37535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 376d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciakstatic inline void v4l_print_pix_fmt_mplane(struct video_device *vfd, 377d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak struct v4l2_pix_format_mplane *fmt) 378d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak{ 379d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak int i; 380d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak 381d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak dbgarg2("width=%d, height=%d, format=%c%c%c%c, field=%s, " 382d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak "colorspace=%d, num_planes=%d\n", 383d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak fmt->width, fmt->height, 384d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak (fmt->pixelformat & 0xff), 385d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak (fmt->pixelformat >> 8) & 0xff, 386d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak (fmt->pixelformat >> 16) & 0xff, 387d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak (fmt->pixelformat >> 24) & 0xff, 388d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak prt_names(fmt->field, v4l2_field_names), 389d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak fmt->colorspace, fmt->num_planes); 390d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak 391d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak for (i = 0; i < fmt->num_planes; ++i) 392d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak dbgarg2("plane %d: bytesperline=%d sizeimage=%d\n", i, 393d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak fmt->plane_fmt[i].bytesperline, 394d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak fmt->plane_fmt[i].sizeimage); 395d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak} 396d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak 39735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuilstatic inline void v4l_print_ext_ctrls(unsigned int cmd, 39835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct video_device *vfd, struct v4l2_ext_controls *c, int show_vals) 39935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil{ 40035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil __u32 i; 40135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 40235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!(vfd->debug & V4L2_DEBUG_IOCTL_ARG)) 40335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil return; 40435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, ""); 40535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil printk(KERN_CONT "class=0x%x", c->ctrl_class); 40635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil for (i = 0; i < c->count; i++) { 4076b5a9492ca0c991bab1ac495624e17520e9edf18Hans Verkuil if (show_vals && !c->controls[i].size) 40835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil printk(KERN_CONT " id/val=0x%x/0x%x", 40935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil c->controls[i].id, c->controls[i].value); 41035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil else 4116b5a9492ca0c991bab1ac495624e17520e9edf18Hans Verkuil printk(KERN_CONT " id=0x%x,size=%u", 4126b5a9492ca0c991bab1ac495624e17520e9edf18Hans Verkuil c->controls[i].id, c->controls[i].size); 41335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 41435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil printk(KERN_CONT "\n"); 41535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil}; 41635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 41735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuilstatic inline int check_ext_ctrls(struct v4l2_ext_controls *c, int allow_priv) 41835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil{ 41935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil __u32 i; 42035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 42135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* zero the reserved fields */ 42235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil c->reserved[0] = c->reserved[1] = 0; 4236b5a9492ca0c991bab1ac495624e17520e9edf18Hans Verkuil for (i = 0; i < c->count; i++) 42435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil c->controls[i].reserved2[0] = 0; 4256b5a9492ca0c991bab1ac495624e17520e9edf18Hans Verkuil 42635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* V4L2_CID_PRIVATE_BASE cannot be used as control class 42735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil when using extended controls. 42835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil Only when passed in through VIDIOC_G_CTRL and VIDIOC_S_CTRL 42935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil is it allowed for backwards compatibility. 43035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil */ 43135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!allow_priv && c->ctrl_class == V4L2_CID_PRIVATE_BASE) 43235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil return 0; 43335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* Check that all controls are from the same control class. */ 43435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil for (i = 0; i < c->count; i++) { 43535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (V4L2_CTRL_ID2CLASS(c->controls[i].id) != c->ctrl_class) { 43635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil c->error_idx = i; 43735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil return 0; 43835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 43935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 44035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil return 1; 44135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil} 44235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 443a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuilstatic int check_fmt(const struct v4l2_ioctl_ops *ops, enum v4l2_buf_type type) 44435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil{ 445a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (ops == NULL) 446a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil return -EINVAL; 447a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil 44835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil switch (type) { 44935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VIDEO_CAPTURE: 450d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak if (ops->vidioc_g_fmt_vid_cap || 451d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak ops->vidioc_g_fmt_vid_cap_mplane) 452d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak return 0; 453d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak break; 454d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: 455d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak if (ops->vidioc_g_fmt_vid_cap_mplane) 45635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil return 0; 45735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 45835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VIDEO_OVERLAY: 4591175d6131f7a89c163227169325ca77a22b18cb2Trent Piepho if (ops->vidioc_g_fmt_vid_overlay) 46035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil return 0; 46135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 46235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VIDEO_OUTPUT: 463d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak if (ops->vidioc_g_fmt_vid_out || 464d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak ops->vidioc_g_fmt_vid_out_mplane) 465d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak return 0; 466d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak break; 467d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: 468d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak if (ops->vidioc_g_fmt_vid_out_mplane) 46935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil return 0; 47035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 47135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY: 4721175d6131f7a89c163227169325ca77a22b18cb2Trent Piepho if (ops->vidioc_g_fmt_vid_out_overlay) 47335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil return 0; 47435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 47535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VBI_CAPTURE: 4761175d6131f7a89c163227169325ca77a22b18cb2Trent Piepho if (ops->vidioc_g_fmt_vbi_cap) 47735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil return 0; 47835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 47935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VBI_OUTPUT: 4801175d6131f7a89c163227169325ca77a22b18cb2Trent Piepho if (ops->vidioc_g_fmt_vbi_out) 48135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil return 0; 48235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 48335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE: 4841175d6131f7a89c163227169325ca77a22b18cb2Trent Piepho if (ops->vidioc_g_fmt_sliced_vbi_cap) 48535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil return 0; 48635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 48735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: 4881175d6131f7a89c163227169325ca77a22b18cb2Trent Piepho if (ops->vidioc_g_fmt_sliced_vbi_out) 48935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil return 0; 49035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 49135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_PRIVATE: 4921175d6131f7a89c163227169325ca77a22b18cb2Trent Piepho if (ops->vidioc_g_fmt_type_private) 49335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil return 0; 49435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 49535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 49635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil return -EINVAL; 49735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil} 49835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 499069b747931f13eda289c1d59a09ecc8162281a76Hans Verkuilstatic long __video_do_ioctl(struct file *file, 50035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil unsigned int cmd, void *arg) 50135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil{ 50235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct video_device *vfd = video_devdata(file); 503a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil const struct v4l2_ioctl_ops *ops = vfd->ioctl_ops; 504d5fbf32f381ad841d9d9537aa1b6f74796703361Hans Verkuil void *fh = file->private_data; 50599cd47bc733436da282016e629eef6baa0f6047cHans Verkuil struct v4l2_fh *vfh = NULL; 506b1a873a37b6551a214ad37d1eee7654a9d65fd6eHans Verkuil int use_fh_prio = 0; 50793d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil long ret_prio = 0; 5089190d191b1b814dfb488125b54cf0de6eedd9220Mauro Carvalho Chehab long ret = -ENOTTY; 50935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 5106a717883e720f75dec252c8af2a2d6dd049af254Hans Verkuil if (ops == NULL) { 5116a717883e720f75dec252c8af2a2d6dd049af254Hans Verkuil printk(KERN_WARNING "videodev: \"%s\" has no ioctl_ops.\n", 5126a717883e720f75dec252c8af2a2d6dd049af254Hans Verkuil vfd->name); 5139190d191b1b814dfb488125b54cf0de6eedd9220Mauro Carvalho Chehab return ret; 5146a717883e720f75dec252c8af2a2d6dd049af254Hans Verkuil } 5156a717883e720f75dec252c8af2a2d6dd049af254Hans Verkuil 51635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if ((vfd->debug & V4L2_DEBUG_IOCTL) && 51735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil !(vfd->debug & V4L2_DEBUG_IOCTL_ARG)) { 51835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil v4l_print_ioctl(vfd->name, cmd); 51935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil printk(KERN_CONT "\n"); 52035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 52135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 522b1a873a37b6551a214ad37d1eee7654a9d65fd6eHans Verkuil if (test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags)) { 52399cd47bc733436da282016e629eef6baa0f6047cHans Verkuil vfh = file->private_data; 524b1a873a37b6551a214ad37d1eee7654a9d65fd6eHans Verkuil use_fh_prio = test_bit(V4L2_FL_USE_FH_PRIO, &vfd->flags); 525b1a873a37b6551a214ad37d1eee7654a9d65fd6eHans Verkuil } 52699cd47bc733436da282016e629eef6baa0f6047cHans Verkuil 52793d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (use_fh_prio) 52893d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret_prio = v4l2_prio_check(vfd->prio, vfh->prio); 52999cd47bc733436da282016e629eef6baa0f6047cHans Verkuil 5306a717883e720f75dec252c8af2a2d6dd049af254Hans Verkuil switch (cmd) { 531a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil 53235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* --- capabilities ------------------------------------------ */ 53335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_QUERYCAP: 53435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 53535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_capability *cap = (struct v4l2_capability *)arg; 53635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 537a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_querycap) 53835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 53935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 540ae6db5154671759426046c2cbc2e20a82ff0feedMauro Carvalho Chehab cap->version = LINUX_VERSION_CODE; 541a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_querycap(file, fh, cap); 54235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 54335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "driver=%s, card=%s, bus=%s, " 54435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "version=0x%08x, " 545583aa3a9b5ca846a84f7dd87bdc4b75dca07b011Hans Verkuil "capabilities=0x%08x, " 546583aa3a9b5ca846a84f7dd87bdc4b75dca07b011Hans Verkuil "device_caps=0x%08x\n", 54735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil cap->driver, cap->card, cap->bus_info, 54835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil cap->version, 549583aa3a9b5ca846a84f7dd87bdc4b75dca07b011Hans Verkuil cap->capabilities, 550583aa3a9b5ca846a84f7dd87bdc4b75dca07b011Hans Verkuil cap->device_caps); 55135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 55235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 55335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 55435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* --- priority ------------------------------------------ */ 55535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_G_PRIORITY: 55635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 55735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil enum v4l2_priority *p = arg; 55835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 55999cd47bc733436da282016e629eef6baa0f6047cHans Verkuil if (ops->vidioc_g_priority) { 56099cd47bc733436da282016e629eef6baa0f6047cHans Verkuil ret = ops->vidioc_g_priority(file, fh, p); 561b1a873a37b6551a214ad37d1eee7654a9d65fd6eHans Verkuil } else if (use_fh_prio) { 56299cd47bc733436da282016e629eef6baa0f6047cHans Verkuil *p = v4l2_prio_max(&vfd->v4l2_dev->prio); 56399cd47bc733436da282016e629eef6baa0f6047cHans Verkuil ret = 0; 56499cd47bc733436da282016e629eef6baa0f6047cHans Verkuil } 56535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 56635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "priority is %d\n", *p); 56735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 56835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 56935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_S_PRIORITY: 57035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 57135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil enum v4l2_priority *p = arg; 57235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 573b1a873a37b6551a214ad37d1eee7654a9d65fd6eHans Verkuil if (!ops->vidioc_s_priority && !use_fh_prio) 574a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab break; 57535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "setting priority to %d\n", *p); 57699cd47bc733436da282016e629eef6baa0f6047cHans Verkuil if (ops->vidioc_s_priority) 57799cd47bc733436da282016e629eef6baa0f6047cHans Verkuil ret = ops->vidioc_s_priority(file, fh, *p); 57899cd47bc733436da282016e629eef6baa0f6047cHans Verkuil else 57993d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio ? ret_prio : 58093d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil v4l2_prio_change(&vfd->v4l2_dev->prio, 58193d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil &vfh->prio, *p); 58235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 58335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 58435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 58535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* --- capture ioctls ---------------------------------------- */ 58635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_ENUM_FMT: 58735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 58835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_fmtdesc *f = arg; 58935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 59019c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho switch (f->type) { 59135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VIDEO_CAPTURE: 592a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_enum_fmt_vid_cap)) 593a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_enum_fmt_vid_cap(file, fh, f); 59435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 595d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: 596a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_enum_fmt_vid_cap_mplane)) 597d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak ret = ops->vidioc_enum_fmt_vid_cap_mplane(file, 598d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak fh, f); 599d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak break; 60035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VIDEO_OVERLAY: 601a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_enum_fmt_vid_overlay)) 602a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_enum_fmt_vid_overlay(file, 60335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil fh, f); 60435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 60535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VIDEO_OUTPUT: 606a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_enum_fmt_vid_out)) 607a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_enum_fmt_vid_out(file, fh, f); 60835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 609d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: 610a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_enum_fmt_vid_out_mplane)) 611d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak ret = ops->vidioc_enum_fmt_vid_out_mplane(file, 612d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak fh, f); 613d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak break; 61435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_PRIVATE: 615a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_enum_fmt_type_private)) 616a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_enum_fmt_type_private(file, 61735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil fh, f); 61835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 61935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil default: 62035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 62135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 622a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely (!ret)) 62335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "index=%d, type=%d, flags=%d, " 62435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "pixelformat=%c%c%c%c, description='%s'\n", 62535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil f->index, f->type, f->flags, 62635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil (f->pixelformat & 0xff), 62735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil (f->pixelformat >> 8) & 0xff, 62835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil (f->pixelformat >> 16) & 0xff, 62935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil (f->pixelformat >> 24) & 0xff, 63035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil f->description); 63193d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil else if (ret == -ENOTTY && 63293d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil (ops->vidioc_enum_fmt_vid_cap || 63393d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ops->vidioc_enum_fmt_vid_out || 63493d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ops->vidioc_enum_fmt_vid_cap_mplane || 63593d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ops->vidioc_enum_fmt_vid_out_mplane || 63693d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ops->vidioc_enum_fmt_vid_overlay || 63793d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ops->vidioc_enum_fmt_type_private)) 63893d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = -EINVAL; 63935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 64035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 64135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_G_FMT: 64235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 64335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_format *f = (struct v4l2_format *)arg; 64435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 64535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* FIXME: Should be one dump per type */ 64635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "type=%s\n", prt_names(f->type, v4l2_type_names)); 64735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 64835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil switch (f->type) { 64935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VIDEO_CAPTURE: 6501d0c86cad38678fa42f6d048a7b9e4057c8c16fcTomasz Stanislawski if (ops->vidioc_g_fmt_vid_cap) 651a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_fmt_vid_cap(file, fh, f); 65235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 65335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil v4l_print_pix_fmt(vfd, &f->fmt.pix); 65435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 655d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: 6561d0c86cad38678fa42f6d048a7b9e4057c8c16fcTomasz Stanislawski if (ops->vidioc_g_fmt_vid_cap_mplane) 657d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak ret = ops->vidioc_g_fmt_vid_cap_mplane(file, 658d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak fh, f); 659d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak if (!ret) 660d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak v4l_print_pix_fmt_mplane(vfd, &f->fmt.pix_mp); 661d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak break; 66235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VIDEO_OVERLAY: 663a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_g_fmt_vid_overlay)) 664a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_fmt_vid_overlay(file, 66535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil fh, f); 66635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 66735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VIDEO_OUTPUT: 6681d0c86cad38678fa42f6d048a7b9e4057c8c16fcTomasz Stanislawski if (ops->vidioc_g_fmt_vid_out) 669a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_fmt_vid_out(file, fh, f); 67035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 67135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil v4l_print_pix_fmt(vfd, &f->fmt.pix); 67235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 673d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: 6741d0c86cad38678fa42f6d048a7b9e4057c8c16fcTomasz Stanislawski if (ops->vidioc_g_fmt_vid_out_mplane) 675d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak ret = ops->vidioc_g_fmt_vid_out_mplane(file, 676d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak fh, f); 677d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak if (!ret) 678d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak v4l_print_pix_fmt_mplane(vfd, &f->fmt.pix_mp); 679d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak break; 68035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY: 681a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_g_fmt_vid_out_overlay)) 682a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_fmt_vid_out_overlay(file, 68335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil fh, f); 68435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 68535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VBI_CAPTURE: 686a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_g_fmt_vbi_cap)) 687a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_fmt_vbi_cap(file, fh, f); 68835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 68935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VBI_OUTPUT: 690a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_g_fmt_vbi_out)) 691a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_fmt_vbi_out(file, fh, f); 69235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 69335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE: 694a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_g_fmt_sliced_vbi_cap)) 695a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_fmt_sliced_vbi_cap(file, 69635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil fh, f); 69735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 69835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: 699a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_g_fmt_sliced_vbi_out)) 700a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_fmt_sliced_vbi_out(file, 70135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil fh, f); 70235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 70335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_PRIVATE: 704a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_g_fmt_type_private)) 705a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_fmt_type_private(file, 70635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil fh, f); 70735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 70835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 70993d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (unlikely(ret == -ENOTTY && have_fmt_ops(g))) 71093d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = -EINVAL; 71135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 71235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 71335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 71435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_S_FMT: 71535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 71635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_format *f = (struct v4l2_format *)arg; 71735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 71893d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (!have_fmt_ops(s)) 71993d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 72093d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (ret_prio) { 72193d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio; 72293d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 72393d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil } 72493d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = -EINVAL; 72593d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil 72635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* FIXME: Should be one dump per type */ 72735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "type=%s\n", prt_names(f->type, v4l2_type_names)); 72835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 72935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil switch (f->type) { 73035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VIDEO_CAPTURE: 7317ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho CLEAR_AFTER_FIELD(f, fmt.pix); 73235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil v4l_print_pix_fmt(vfd, &f->fmt.pix); 7331d0c86cad38678fa42f6d048a7b9e4057c8c16fcTomasz Stanislawski if (ops->vidioc_s_fmt_vid_cap) 734a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_s_fmt_vid_cap(file, fh, f); 735d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak break; 736d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: 737d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak CLEAR_AFTER_FIELD(f, fmt.pix_mp); 738d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak v4l_print_pix_fmt_mplane(vfd, &f->fmt.pix_mp); 7391d0c86cad38678fa42f6d048a7b9e4057c8c16fcTomasz Stanislawski if (ops->vidioc_s_fmt_vid_cap_mplane) 740d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak ret = ops->vidioc_s_fmt_vid_cap_mplane(file, 741d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak fh, f); 74235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 74335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VIDEO_OVERLAY: 7447ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho CLEAR_AFTER_FIELD(f, fmt.win); 745a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (ops->vidioc_s_fmt_vid_overlay) 746a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_s_fmt_vid_overlay(file, 74735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil fh, f); 74835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 74935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VIDEO_OUTPUT: 7507ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho CLEAR_AFTER_FIELD(f, fmt.pix); 75135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil v4l_print_pix_fmt(vfd, &f->fmt.pix); 7521d0c86cad38678fa42f6d048a7b9e4057c8c16fcTomasz Stanislawski if (ops->vidioc_s_fmt_vid_out) 753a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_s_fmt_vid_out(file, fh, f); 754d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak break; 755d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: 756d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak CLEAR_AFTER_FIELD(f, fmt.pix_mp); 757d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak v4l_print_pix_fmt_mplane(vfd, &f->fmt.pix_mp); 7581d0c86cad38678fa42f6d048a7b9e4057c8c16fcTomasz Stanislawski if (ops->vidioc_s_fmt_vid_out_mplane) 759d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak ret = ops->vidioc_s_fmt_vid_out_mplane(file, 760d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak fh, f); 76135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 76235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY: 7637ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho CLEAR_AFTER_FIELD(f, fmt.win); 764a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (ops->vidioc_s_fmt_vid_out_overlay) 765a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_s_fmt_vid_out_overlay(file, 76635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil fh, f); 76735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 76835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VBI_CAPTURE: 7697ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho CLEAR_AFTER_FIELD(f, fmt.vbi); 770a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_s_fmt_vbi_cap)) 771a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_s_fmt_vbi_cap(file, fh, f); 77235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 77335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VBI_OUTPUT: 7747ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho CLEAR_AFTER_FIELD(f, fmt.vbi); 775a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_s_fmt_vbi_out)) 776a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_s_fmt_vbi_out(file, fh, f); 77735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 77835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE: 7797ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho CLEAR_AFTER_FIELD(f, fmt.sliced); 780a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_s_fmt_sliced_vbi_cap)) 781a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_s_fmt_sliced_vbi_cap(file, 78235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil fh, f); 78335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 78435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: 7857ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho CLEAR_AFTER_FIELD(f, fmt.sliced); 786a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_s_fmt_sliced_vbi_out)) 787a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_s_fmt_sliced_vbi_out(file, 78835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil fh, f); 789a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab 79035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 79135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_PRIVATE: 7927ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho /* CLEAR_AFTER_FIELD(f, fmt.raw_data); <- does nothing */ 793a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_s_fmt_type_private)) 794a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_s_fmt_type_private(file, 79535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil fh, f); 79635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 79735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 79835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 79935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 80035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_TRY_FMT: 80135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 80235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_format *f = (struct v4l2_format *)arg; 80335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 80435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* FIXME: Should be one dump per type */ 80535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "type=%s\n", prt_names(f->type, 80635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil v4l2_type_names)); 80735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil switch (f->type) { 80835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VIDEO_CAPTURE: 8097ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho CLEAR_AFTER_FIELD(f, fmt.pix); 8101d0c86cad38678fa42f6d048a7b9e4057c8c16fcTomasz Stanislawski if (ops->vidioc_try_fmt_vid_cap) 811a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_try_fmt_vid_cap(file, fh, f); 81235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 81335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil v4l_print_pix_fmt(vfd, &f->fmt.pix); 81435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 815d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: 816d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak CLEAR_AFTER_FIELD(f, fmt.pix_mp); 8171d0c86cad38678fa42f6d048a7b9e4057c8c16fcTomasz Stanislawski if (ops->vidioc_try_fmt_vid_cap_mplane) 818d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak ret = ops->vidioc_try_fmt_vid_cap_mplane(file, 819d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak fh, f); 820d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak if (!ret) 821d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak v4l_print_pix_fmt_mplane(vfd, &f->fmt.pix_mp); 822d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak break; 82335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VIDEO_OVERLAY: 8247ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho CLEAR_AFTER_FIELD(f, fmt.win); 825a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_try_fmt_vid_overlay)) 826a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_try_fmt_vid_overlay(file, 82735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil fh, f); 82835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 82935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VIDEO_OUTPUT: 8307ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho CLEAR_AFTER_FIELD(f, fmt.pix); 8311d0c86cad38678fa42f6d048a7b9e4057c8c16fcTomasz Stanislawski if (ops->vidioc_try_fmt_vid_out) 832a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_try_fmt_vid_out(file, fh, f); 83335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 83435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil v4l_print_pix_fmt(vfd, &f->fmt.pix); 83535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 836d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: 837d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak CLEAR_AFTER_FIELD(f, fmt.pix_mp); 8381d0c86cad38678fa42f6d048a7b9e4057c8c16fcTomasz Stanislawski if (ops->vidioc_try_fmt_vid_out_mplane) 839d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak ret = ops->vidioc_try_fmt_vid_out_mplane(file, 840d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak fh, f); 841d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak if (!ret) 842d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak v4l_print_pix_fmt_mplane(vfd, &f->fmt.pix_mp); 843d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak break; 84435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY: 8457ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho CLEAR_AFTER_FIELD(f, fmt.win); 846a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_try_fmt_vid_out_overlay)) 847a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_try_fmt_vid_out_overlay(file, 84835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil fh, f); 84935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 85035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VBI_CAPTURE: 8517ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho CLEAR_AFTER_FIELD(f, fmt.vbi); 852a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_try_fmt_vbi_cap)) 853a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_try_fmt_vbi_cap(file, fh, f); 85435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 85535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_VBI_OUTPUT: 8567ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho CLEAR_AFTER_FIELD(f, fmt.vbi); 857a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_try_fmt_vbi_out)) 858a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_try_fmt_vbi_out(file, fh, f); 85935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 86035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE: 8617ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho CLEAR_AFTER_FIELD(f, fmt.sliced); 862a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_try_fmt_sliced_vbi_cap)) 863a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_try_fmt_sliced_vbi_cap(file, 86435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil fh, f); 86535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 86635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: 8677ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho CLEAR_AFTER_FIELD(f, fmt.sliced); 868a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_try_fmt_sliced_vbi_out)) 869a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_try_fmt_sliced_vbi_out(file, 87035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil fh, f); 87135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 87235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case V4L2_BUF_TYPE_PRIVATE: 8737ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho /* CLEAR_AFTER_FIELD(f, fmt.raw_data); <- does nothing */ 874a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(ops->vidioc_try_fmt_type_private)) 875a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_try_fmt_type_private(file, 87635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil fh, f); 87735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 87835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 87993d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (unlikely(ret == -ENOTTY && have_fmt_ops(try))) 88093d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = -EINVAL; 88135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 88235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 88335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* FIXME: Those buf reqs could be handled here, 88435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil with some changes on videobuf to allow its header to be included at 88535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil videodev2.h or being merged at videodev2. 88635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil */ 88735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_REQBUFS: 88835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 88935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_requestbuffers *p = arg; 89035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 891a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_reqbufs) 89235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 89393d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (ret_prio) { 89493d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio; 89593d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 89693d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil } 897a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = check_fmt(ops, p->type); 89835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (ret) 89935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 90035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 9017ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho if (p->type < V4L2_BUF_TYPE_PRIVATE) 9027ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho CLEAR_AFTER_FIELD(p, memory); 9037ecc0cf937e97b6116db09cd13c32467b34c164aTrent Piepho 904a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_reqbufs(file, fh, p); 90535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "count=%d, type=%s, memory=%s\n", 90635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->count, 90735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil prt_names(p->type, v4l2_type_names), 90835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil prt_names(p->memory, v4l2_memory_names)); 90935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 91035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 91135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_QUERYBUF: 91235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 91335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_buffer *p = arg; 91435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 915a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_querybuf) 91635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 917a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = check_fmt(ops, p->type); 91835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (ret) 91935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 92035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 921a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_querybuf(file, fh, p); 92235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 92335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgbuf(cmd, vfd, p); 92435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 92535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 92635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_QBUF: 92735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 92835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_buffer *p = arg; 92935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 930a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_qbuf) 93135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 932a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = check_fmt(ops, p->type); 93335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (ret) 93435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 93535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 936a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_qbuf(file, fh, p); 93735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 93835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgbuf(cmd, vfd, p); 93935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 94035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 94135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_DQBUF: 94235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 94335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_buffer *p = arg; 94435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 945a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_dqbuf) 94635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 947a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = check_fmt(ops, p->type); 94835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (ret) 94935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 95035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 951a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_dqbuf(file, fh, p); 95235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 95335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgbuf(cmd, vfd, p); 95435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 95535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 95635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_OVERLAY: 95735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 95835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil int *i = arg; 95935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 960a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_overlay) 96135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 96293d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (ret_prio) { 96393d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio; 96493d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 96593d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil } 96635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "value=%d\n", *i); 967a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_overlay(file, fh, *i); 96835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 96935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 97035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_G_FBUF: 97135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 97235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_framebuffer *p = arg; 97335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 974a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_g_fbuf) 97535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 976a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_fbuf(file, fh, arg); 97735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) { 97835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "capability=0x%x, flags=%d, base=0x%08lx\n", 97935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->capability, p->flags, 98035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil (unsigned long)p->base); 98135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil v4l_print_pix_fmt(vfd, &p->fmt); 98235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 98335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 98435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 98535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_S_FBUF: 98635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 98735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_framebuffer *p = arg; 98835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 989a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_s_fbuf) 99035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 99193d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (ret_prio) { 99293d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio; 99393d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 99493d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil } 99535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "capability=0x%x, flags=%d, base=0x%08lx\n", 99635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->capability, p->flags, (unsigned long)p->base); 99735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil v4l_print_pix_fmt(vfd, &p->fmt); 998a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_s_fbuf(file, fh, arg); 99935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 100035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 100135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_STREAMON: 100235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 100335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil enum v4l2_buf_type i = *(int *)arg; 100435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1005a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_streamon) 100635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 100793d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (ret_prio) { 100893d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio; 100993d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 101093d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil } 101135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "type=%s\n", prt_names(i, v4l2_type_names)); 1012a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_streamon(file, fh, i); 101335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 101435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 101535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_STREAMOFF: 101635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 101735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil enum v4l2_buf_type i = *(int *)arg; 101835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1019a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_streamoff) 102035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 102193d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (ret_prio) { 102293d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio; 102393d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 102493d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil } 102535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "type=%s\n", prt_names(i, v4l2_type_names)); 1026a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_streamoff(file, fh, i); 102735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 102835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 102935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* ---------- tv norms ---------- */ 103035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_ENUMSTD: 103135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 103235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_standard *p = arg; 103335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil v4l2_std_id id = vfd->tvnorms, curr_id = 0; 103435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil unsigned int index = p->index, i, j = 0; 103535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil const char *descr = ""; 103635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 103793d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (id == 0) 103893d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 103993d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = -EINVAL; 104093d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil 104135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* Return norm array in a canonical way */ 104235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil for (i = 0; i <= index && id; i++) { 104335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* last std value in the standards array is 0, so this 104435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil while always ends there since (id & 0) == 0. */ 104535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil while ((id & standards[j].std) != standards[j].std) 104635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil j++; 104735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil curr_id = standards[j].std; 104835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil descr = standards[j].descr; 104935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil j++; 105035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (curr_id == 0) 105135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 105235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (curr_id != V4L2_STD_PAL && 105335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil curr_id != V4L2_STD_SECAM && 105435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil curr_id != V4L2_STD_NTSC) 105535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil id &= ~curr_id; 105635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 105735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (i <= index) 10583f5e18249ce0d71a900bfdb8df327269483e730dHans Verkuil break; 105935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 106035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil v4l2_video_std_construct(p, curr_id, descr); 106135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 106235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "index=%d, id=0x%Lx, name=%s, fps=%d/%d, " 106335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "framelines=%d\n", p->index, 106435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil (unsigned long long)p->id, p->name, 106535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->frameperiod.numerator, 106635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->frameperiod.denominator, 106735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->framelines); 106835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 106935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil ret = 0; 107035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 107135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 107235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_G_STD: 107335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 107435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil v4l2_std_id *id = arg; 107535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 107635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* Calls the specific handler */ 1077a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (ops->vidioc_g_std) 1078a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_std(file, fh, id); 1079a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab else if (vfd->current_norm) { 1080a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab ret = 0; 108135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil *id = vfd->current_norm; 1082a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab } 108335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1084a5f2db539bd2a977cdee3fecc5c15dd0941c1ab3Mauro Carvalho Chehab if (likely(!ret)) 108535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "std=0x%08Lx\n", (long long unsigned)*id); 108635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 108735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 108835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_S_STD: 108935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 109035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil v4l2_std_id *id = arg, norm; 109135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 109235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "std=%08Lx\n", (long long unsigned)*id); 109335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 109493d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (!ops->vidioc_s_std) 109593d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 109693d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil 109793d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (ret_prio) { 109893d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio; 109993d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 110093d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil } 110193d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = -EINVAL; 110235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil norm = (*id) & vfd->tvnorms; 110335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (vfd->tvnorms && !norm) /* Check if std is supported */ 110435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 110535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 110635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* Calls the specific handler */ 110793d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ops->vidioc_s_std(file, fh, &norm); 110835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 110935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* Updates standard information */ 111035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (ret >= 0) 111135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil vfd->current_norm = norm; 111235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 111335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 111435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_QUERYSTD: 111535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 111635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil v4l2_std_id *p = arg; 111735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1118a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_querystd) 111935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 11208715e6cbae2ec8b451920496a73786402a5d879dMauro Carvalho Chehab /* 11218715e6cbae2ec8b451920496a73786402a5d879dMauro Carvalho Chehab * If nothing detected, it should return all supported 11228715e6cbae2ec8b451920496a73786402a5d879dMauro Carvalho Chehab * Drivers just need to mask the std argument, in order 11238715e6cbae2ec8b451920496a73786402a5d879dMauro Carvalho Chehab * to remove the standards that don't apply from the mask. 11248715e6cbae2ec8b451920496a73786402a5d879dMauro Carvalho Chehab * This means that tuners, audio and video decoders can join 11258715e6cbae2ec8b451920496a73786402a5d879dMauro Carvalho Chehab * their efforts to improve the standards detection 11268715e6cbae2ec8b451920496a73786402a5d879dMauro Carvalho Chehab */ 11278715e6cbae2ec8b451920496a73786402a5d879dMauro Carvalho Chehab *p = vfd->tvnorms; 1128a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_querystd(file, fh, arg); 112935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 113035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "detected std=%08Lx\n", 113135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil (unsigned long long)*p); 113235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 113335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 113435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* ------ input switching ---------- */ 113535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* FIXME: Inputs can be handled inside videodev2 */ 113635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_ENUMINPUT: 113735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 113835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_input *p = arg; 113935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1140b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri /* 1141b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri * We set the flags for CAP_PRESETS, CAP_CUSTOM_TIMINGS & 1142b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri * CAP_STD here based on ioctl handler provided by the 1143b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri * driver. If the driver doesn't support these 1144b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri * for a specific input, it must override these flags. 1145b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri */ 1146b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri if (ops->vidioc_s_std) 1147b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri p->capabilities |= V4L2_IN_CAP_STD; 1148b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri if (ops->vidioc_s_dv_preset) 1149b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri p->capabilities |= V4L2_IN_CAP_PRESETS; 1150b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri if (ops->vidioc_s_dv_timings) 1151b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri p->capabilities |= V4L2_IN_CAP_CUSTOM_TIMINGS; 1152b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri 1153a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_enum_input) 115435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 115535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1156a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_enum_input(file, fh, p); 115735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 115835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "index=%d, name=%s, type=%d, " 115935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "audioset=%d, " 116035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "tuner=%d, std=%08Lx, status=%d\n", 116135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->index, p->name, p->type, p->audioset, 116235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->tuner, 116335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil (unsigned long long)p->std, 116435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->status); 116535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 116635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 116735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_G_INPUT: 116835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 116935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil unsigned int *i = arg; 117035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1171a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_g_input) 117235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 1173a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_input(file, fh, i); 117435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 117535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "value=%d\n", *i); 117635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 117735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 117835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_S_INPUT: 117935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 118035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil unsigned int *i = arg; 118135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1182a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_s_input) 118335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 118493d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (ret_prio) { 118593d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio; 118693d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 118793d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil } 118835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "value=%d\n", *i); 1189a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_s_input(file, fh, *i); 119035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 119135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 119235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 119335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* ------ output switching ---------- */ 119435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_ENUMOUTPUT: 119535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 119635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_output *p = arg; 119735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1198a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_enum_output) 119935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 120035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1201b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri /* 1202b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri * We set the flags for CAP_PRESETS, CAP_CUSTOM_TIMINGS & 1203b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri * CAP_STD here based on ioctl handler provided by the 1204b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri * driver. If the driver doesn't support these 1205b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri * for a specific output, it must override these flags. 1206b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri */ 1207b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri if (ops->vidioc_s_std) 1208b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri p->capabilities |= V4L2_OUT_CAP_STD; 1209b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri if (ops->vidioc_s_dv_preset) 1210b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri p->capabilities |= V4L2_OUT_CAP_PRESETS; 1211b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri if (ops->vidioc_s_dv_timings) 1212b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri p->capabilities |= V4L2_OUT_CAP_CUSTOM_TIMINGS; 1213b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri 1214a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_enum_output(file, fh, p); 121535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 121635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "index=%d, name=%s, type=%d, " 121735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "audioset=0x%x, " 121835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "modulator=%d, std=0x%08Lx\n", 121935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->index, p->name, p->type, p->audioset, 122035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->modulator, (unsigned long long)p->std); 122135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 122235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 122335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_G_OUTPUT: 122435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 122535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil unsigned int *i = arg; 122635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1227a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_g_output) 122835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 1229a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_output(file, fh, i); 123035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 123135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "value=%d\n", *i); 123235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 123335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 123435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_S_OUTPUT: 123535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 123635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil unsigned int *i = arg; 123735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1238a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_s_output) 123935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 124093d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (ret_prio) { 124193d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio; 124293d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 124393d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil } 124435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "value=%d\n", *i); 1245a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_s_output(file, fh, *i); 124635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 124735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 124835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 124935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* --- controls ---------------------------------------------- */ 125035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_QUERYCTRL: 125135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 125235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_queryctrl *p = arg; 125335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 12542d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil if (vfh && vfh->ctrl_handler) 12552d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil ret = v4l2_queryctrl(vfh->ctrl_handler, p); 12562d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil else if (vfd->ctrl_handler) 125711bbc1cadb638aaccb4764c6e16807b36b53cf19Hans Verkuil ret = v4l2_queryctrl(vfd->ctrl_handler, p); 125811bbc1cadb638aaccb4764c6e16807b36b53cf19Hans Verkuil else if (ops->vidioc_queryctrl) 125911bbc1cadb638aaccb4764c6e16807b36b53cf19Hans Verkuil ret = ops->vidioc_queryctrl(file, fh, p); 126011bbc1cadb638aaccb4764c6e16807b36b53cf19Hans Verkuil else 126135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 126235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 126335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "id=0x%x, type=%d, name=%s, min/max=%d/%d, " 126435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "step=%d, default=%d, flags=0x%08x\n", 126535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->id, p->type, p->name, 126635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->minimum, p->maximum, 126735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->step, p->default_value, p->flags); 126835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil else 126935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "id=0x%x\n", p->id); 127035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 127135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 127235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_G_CTRL: 127335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 127435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_control *p = arg; 127535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 12762d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil if (vfh && vfh->ctrl_handler) 12772d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil ret = v4l2_g_ctrl(vfh->ctrl_handler, p); 12782d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil else if (vfd->ctrl_handler) 127911bbc1cadb638aaccb4764c6e16807b36b53cf19Hans Verkuil ret = v4l2_g_ctrl(vfd->ctrl_handler, p); 128011bbc1cadb638aaccb4764c6e16807b36b53cf19Hans Verkuil else if (ops->vidioc_g_ctrl) 1281a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_ctrl(file, fh, p); 1282a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil else if (ops->vidioc_g_ext_ctrls) { 128335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_ext_controls ctrls; 128435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_ext_control ctrl; 128535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 128635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil ctrls.ctrl_class = V4L2_CTRL_ID2CLASS(p->id); 128735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil ctrls.count = 1; 128835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil ctrls.controls = &ctrl; 128935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil ctrl.id = p->id; 129035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil ctrl.value = p->value; 129135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (check_ext_ctrls(&ctrls, 1)) { 1292a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_ext_ctrls(file, fh, &ctrls); 129335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (ret == 0) 129435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->value = ctrl.value; 129535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 129635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } else 129735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 129835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 129935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "id=0x%x, value=%d\n", p->id, p->value); 130035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil else 130135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "id=0x%x\n", p->id); 130235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 130335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 130435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_S_CTRL: 130535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 130635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_control *p = arg; 130735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_ext_controls ctrls; 130835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_ext_control ctrl; 130935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 13102d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil if (!(vfh && vfh->ctrl_handler) && !vfd->ctrl_handler && 131111bbc1cadb638aaccb4764c6e16807b36b53cf19Hans Verkuil !ops->vidioc_s_ctrl && !ops->vidioc_s_ext_ctrls) 131235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 131393d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (ret_prio) { 131493d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio; 131593d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 131693d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil } 131735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 131835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "id=0x%x, value=%d\n", p->id, p->value); 131935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 13202d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil if (vfh && vfh->ctrl_handler) { 1321ab892bac8438c5c2ff09a60d765d9b0c14941ba9Hans Verkuil ret = v4l2_s_ctrl(vfh, vfh->ctrl_handler, p); 13222d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil break; 13232d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil } 132411bbc1cadb638aaccb4764c6e16807b36b53cf19Hans Verkuil if (vfd->ctrl_handler) { 1325ab892bac8438c5c2ff09a60d765d9b0c14941ba9Hans Verkuil ret = v4l2_s_ctrl(NULL, vfd->ctrl_handler, p); 132611bbc1cadb638aaccb4764c6e16807b36b53cf19Hans Verkuil break; 132711bbc1cadb638aaccb4764c6e16807b36b53cf19Hans Verkuil } 1328a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (ops->vidioc_s_ctrl) { 1329a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_s_ctrl(file, fh, p); 133035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 133135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 1332a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_s_ext_ctrls) 133335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 133435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 133535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil ctrls.ctrl_class = V4L2_CTRL_ID2CLASS(p->id); 133635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil ctrls.count = 1; 133735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil ctrls.controls = &ctrl; 133835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil ctrl.id = p->id; 133935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil ctrl.value = p->value; 134035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (check_ext_ctrls(&ctrls, 1)) 1341a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_s_ext_ctrls(file, fh, &ctrls); 134293d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil else 134393d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = -EINVAL; 134435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 134535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 134635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_G_EXT_CTRLS: 134735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 134835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_ext_controls *p = arg; 134935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 135035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->error_idx = p->count; 13512d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil if (vfh && vfh->ctrl_handler) 13522d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil ret = v4l2_g_ext_ctrls(vfh->ctrl_handler, p); 13532d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil else if (vfd->ctrl_handler) 135411bbc1cadb638aaccb4764c6e16807b36b53cf19Hans Verkuil ret = v4l2_g_ext_ctrls(vfd->ctrl_handler, p); 135593d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil else if (ops->vidioc_g_ext_ctrls) 135693d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = check_ext_ctrls(p, 0) ? 135793d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ops->vidioc_g_ext_ctrls(file, fh, p) : 135893d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil -EINVAL; 135911bbc1cadb638aaccb4764c6e16807b36b53cf19Hans Verkuil else 136011bbc1cadb638aaccb4764c6e16807b36b53cf19Hans Verkuil break; 136135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil v4l_print_ext_ctrls(cmd, vfd, p, !ret); 136235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 136335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 136435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_S_EXT_CTRLS: 136535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 136635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_ext_controls *p = arg; 136735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 136835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->error_idx = p->count; 13692d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil if (!(vfh && vfh->ctrl_handler) && !vfd->ctrl_handler && 13702d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil !ops->vidioc_s_ext_ctrls) 137135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 137293d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (ret_prio) { 137393d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio; 137493d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 137593d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil } 137635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil v4l_print_ext_ctrls(cmd, vfd, p, 1); 13772d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil if (vfh && vfh->ctrl_handler) 1378ab892bac8438c5c2ff09a60d765d9b0c14941ba9Hans Verkuil ret = v4l2_s_ext_ctrls(vfh, vfh->ctrl_handler, p); 13792d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil else if (vfd->ctrl_handler) 1380ab892bac8438c5c2ff09a60d765d9b0c14941ba9Hans Verkuil ret = v4l2_s_ext_ctrls(NULL, vfd->ctrl_handler, p); 138111bbc1cadb638aaccb4764c6e16807b36b53cf19Hans Verkuil else if (check_ext_ctrls(p, 0)) 1382a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_s_ext_ctrls(file, fh, p); 138393d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil else 138493d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = -EINVAL; 138535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 138635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 138735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_TRY_EXT_CTRLS: 138835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 138935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_ext_controls *p = arg; 139035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 139135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->error_idx = p->count; 13922d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil if (!(vfh && vfh->ctrl_handler) && !vfd->ctrl_handler && 13932d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil !ops->vidioc_try_ext_ctrls) 139435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 139535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil v4l_print_ext_ctrls(cmd, vfd, p, 1); 13962d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil if (vfh && vfh->ctrl_handler) 13972d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil ret = v4l2_try_ext_ctrls(vfh->ctrl_handler, p); 13982d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil else if (vfd->ctrl_handler) 139911bbc1cadb638aaccb4764c6e16807b36b53cf19Hans Verkuil ret = v4l2_try_ext_ctrls(vfd->ctrl_handler, p); 140011bbc1cadb638aaccb4764c6e16807b36b53cf19Hans Verkuil else if (check_ext_ctrls(p, 0)) 1401a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_try_ext_ctrls(file, fh, p); 140293d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil else 140393d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = -EINVAL; 140435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 140535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 140635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_QUERYMENU: 140735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 140835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_querymenu *p = arg; 140935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 14102d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil if (vfh && vfh->ctrl_handler) 14112d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil ret = v4l2_querymenu(vfh->ctrl_handler, p); 14122d28b686adc18567b388362e1f7b86658cfd81fcHans Verkuil else if (vfd->ctrl_handler) 141311bbc1cadb638aaccb4764c6e16807b36b53cf19Hans Verkuil ret = v4l2_querymenu(vfd->ctrl_handler, p); 141411bbc1cadb638aaccb4764c6e16807b36b53cf19Hans Verkuil else if (ops->vidioc_querymenu) 141511bbc1cadb638aaccb4764c6e16807b36b53cf19Hans Verkuil ret = ops->vidioc_querymenu(file, fh, p); 141611bbc1cadb638aaccb4764c6e16807b36b53cf19Hans Verkuil else 141735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 141835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 141935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "id=0x%x, index=%d, name=%s\n", 142035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->id, p->index, p->name); 142135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil else 142235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "id=0x%x, index=%d\n", 142335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->id, p->index); 142435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 142535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 142635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* --- audio ---------------------------------------------- */ 142735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_ENUMAUDIO: 142835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 142935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_audio *p = arg; 143035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1431a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_enumaudio) 143235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 1433a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_enumaudio(file, fh, p); 143435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 143535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "index=%d, name=%s, capability=0x%x, " 143635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "mode=0x%x\n", p->index, p->name, 143735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->capability, p->mode); 143835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil else 143935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "index=%d\n", p->index); 144035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 144135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 144235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_G_AUDIO: 144335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 144435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_audio *p = arg; 144535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1446a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_g_audio) 144735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 144835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1449a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_audio(file, fh, p); 145035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 145135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "index=%d, name=%s, capability=0x%x, " 145235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "mode=0x%x\n", p->index, 145335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->name, p->capability, p->mode); 145435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil else 145535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "index=%d\n", p->index); 145635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 145735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 145835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_S_AUDIO: 145935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 146035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_audio *p = arg; 146135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1462a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_s_audio) 146335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 146493d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (ret_prio) { 146593d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio; 146693d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 146793d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil } 146835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "index=%d, name=%s, capability=0x%x, " 146935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "mode=0x%x\n", p->index, p->name, 147035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->capability, p->mode); 1471a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_s_audio(file, fh, p); 147235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 147335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 147435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_ENUMAUDOUT: 147535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 147635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_audioout *p = arg; 147735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1478a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_enumaudout) 147935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 148035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "Enum for index=%d\n", p->index); 1481a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_enumaudout(file, fh, p); 148235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 148335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg2("index=%d, name=%s, capability=%d, " 148435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "mode=%d\n", p->index, p->name, 148535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->capability, p->mode); 148635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 148735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 148835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_G_AUDOUT: 148935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 149035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_audioout *p = arg; 149135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1492a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_g_audout) 149335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 1494337f9d205972bfe1cb7982384fd0f4caa4af001dTrent Piepho 1495a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_audout(file, fh, p); 149635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 149735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg2("index=%d, name=%s, capability=%d, " 149835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "mode=%d\n", p->index, p->name, 149935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->capability, p->mode); 150035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 150135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 150235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_S_AUDOUT: 150335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 150435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_audioout *p = arg; 150535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1506a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_s_audout) 150735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 150893d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (ret_prio) { 150993d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio; 151093d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 151193d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil } 151235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "index=%d, name=%s, capability=%d, " 151335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "mode=%d\n", p->index, p->name, 151435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->capability, p->mode); 151535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1516a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_s_audout(file, fh, p); 151735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 151835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 151935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_G_MODULATOR: 152035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 152135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_modulator *p = arg; 152235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1523a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_g_modulator) 152435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 1525a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_modulator(file, fh, p); 152635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 152735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "index=%d, name=%s, " 152835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "capability=%d, rangelow=%d," 152935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil " rangehigh=%d, txsubchans=%d\n", 153035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->index, p->name, p->capability, 153135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->rangelow, p->rangehigh, 153235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->txsubchans); 153335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 153435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 153535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_S_MODULATOR: 153635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 153735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_modulator *p = arg; 153835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1539a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_s_modulator) 154035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 154193d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (ret_prio) { 154293d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio; 154393d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 154493d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil } 154535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "index=%d, name=%s, capability=%d, " 154635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "rangelow=%d, rangehigh=%d, txsubchans=%d\n", 154735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->index, p->name, p->capability, p->rangelow, 154835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->rangehigh, p->txsubchans); 1549a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_s_modulator(file, fh, p); 155035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 155135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 155235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_G_CROP: 155335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 155435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_crop *p = arg; 155535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1556992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski if (!ops->vidioc_g_crop && !ops->vidioc_g_selection) 155735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 1558a56a18c3ed3442a0c049c9b5f0dda918a6e83726Mauro Carvalho Chehab 155935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names)); 1560992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski 1561992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski if (ops->vidioc_g_crop) { 1562992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski ret = ops->vidioc_g_crop(file, fh, p); 1563992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski } else { 1564992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski /* simulate capture crop using selection api */ 1565992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski struct v4l2_selection s = { 1566992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski .type = p->type, 1567992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski }; 1568992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski 1569992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski /* crop means compose for output devices */ 1570992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski if (V4L2_TYPE_IS_OUTPUT(p->type)) 1571992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski s.target = V4L2_SEL_TGT_COMPOSE_ACTIVE; 1572992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski else 1573992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski s.target = V4L2_SEL_TGT_CROP_ACTIVE; 1574992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski 1575992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski ret = ops->vidioc_g_selection(file, fh, &s); 1576992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski 1577992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski /* copying results to old structure on success */ 1578992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski if (!ret) 1579992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski p->c = s.r; 1580992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski } 1581992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski 158235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 158335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgrect(vfd, "", &p->c); 158435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 158535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 158635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_S_CROP: 158735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 158835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_crop *p = arg; 158935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1590992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski if (!ops->vidioc_s_crop && !ops->vidioc_s_selection) 159135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 1592992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski 159393d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (ret_prio) { 159493d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio; 159593d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 159693d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil } 159735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names)); 159835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgrect(vfd, "", &p->c); 1599992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski 1600992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski if (ops->vidioc_s_crop) { 1601992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski ret = ops->vidioc_s_crop(file, fh, p); 1602992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski } else { 1603992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski /* simulate capture crop using selection api */ 1604992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski struct v4l2_selection s = { 1605992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski .type = p->type, 1606992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski .r = p->c, 1607992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski }; 1608992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski 1609992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski /* crop means compose for output devices */ 1610992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski if (V4L2_TYPE_IS_OUTPUT(p->type)) 1611992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski s.target = V4L2_SEL_TGT_COMPOSE_ACTIVE; 1612992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski else 1613992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski s.target = V4L2_SEL_TGT_CROP_ACTIVE; 1614992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski 1615992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski ret = ops->vidioc_s_selection(file, fh, &s); 1616992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski } 161735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 161835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 16190e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski case VIDIOC_G_SELECTION: 16200e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski { 16210e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski struct v4l2_selection *p = arg; 16220e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski 16230e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski if (!ops->vidioc_g_selection) 16240e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski break; 16250e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski 16260e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names)); 16270e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski 16280e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski ret = ops->vidioc_g_selection(file, fh, p); 16290e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski if (!ret) 16300e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski dbgrect(vfd, "", &p->r); 16310e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski break; 16320e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski } 16330e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski case VIDIOC_S_SELECTION: 16340e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski { 16350e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski struct v4l2_selection *p = arg; 16360e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski 16370e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski if (!ops->vidioc_s_selection) 16380e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski break; 16390e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski 16400e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski if (ret_prio) { 16410e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski ret = ret_prio; 16420e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski break; 16430e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski } 16440e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski 16450e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names)); 16460e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski dbgrect(vfd, "", &p->r); 16470e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski 16480e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski ret = ops->vidioc_s_selection(file, fh, p); 16490e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski break; 16500e8caaceff160ad821c83d798fc03812cb810560Tomasz Stanislawski } 165135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_CROPCAP: 165235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 165335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_cropcap *p = arg; 165435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 165535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /*FIXME: Should also show v4l2_fract pixelaspect */ 1656992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski if (!ops->vidioc_cropcap && !ops->vidioc_g_selection) 165735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 1658a56a18c3ed3442a0c049c9b5f0dda918a6e83726Mauro Carvalho Chehab 165935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names)); 1660992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski if (ops->vidioc_cropcap) { 1661992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski ret = ops->vidioc_cropcap(file, fh, p); 1662992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski } else { 1663992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski struct v4l2_selection s = { .type = p->type }; 1664992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski 1665992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski /* obtaining bounds */ 1666992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski if (V4L2_TYPE_IS_OUTPUT(p->type)) 1667992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski s.target = V4L2_SEL_TGT_COMPOSE_BOUNDS; 1668992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski else 1669992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski s.target = V4L2_SEL_TGT_CROP_BOUNDS; 1670992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski 1671992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski ret = ops->vidioc_g_selection(file, fh, &s); 1672992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski if (ret) 1673992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski break; 1674992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski p->bounds = s.r; 1675992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski 1676992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski /* obtaining defrect */ 1677992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski if (V4L2_TYPE_IS_OUTPUT(p->type)) 1678992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski s.target = V4L2_SEL_TGT_COMPOSE_DEFAULT; 1679992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski else 1680992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski s.target = V4L2_SEL_TGT_CROP_DEFAULT; 1681992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski 1682992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski ret = ops->vidioc_g_selection(file, fh, &s); 1683992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski if (ret) 1684992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski break; 1685992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski p->defrect = s.r; 1686992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski 1687992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski /* setting trivial pixelaspect */ 1688992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski p->pixelaspect.numerator = 1; 1689992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski p->pixelaspect.denominator = 1; 1690992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski } 1691992efeff79fe8de44d4e8b7636bb2e5d9dcf698dTomasz Stanislawski 169235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) { 169335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgrect(vfd, "bounds ", &p->bounds); 169435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgrect(vfd, "defrect ", &p->defrect); 169535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 169635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 169735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 169835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_G_JPEGCOMP: 169935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 170035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_jpegcompression *p = arg; 170135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1702a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_g_jpegcomp) 170335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 1704a56a18c3ed3442a0c049c9b5f0dda918a6e83726Mauro Carvalho Chehab 1705a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_jpegcomp(file, fh, p); 170635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 170735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "quality=%d, APPn=%d, " 170835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "APP_len=%d, COM_len=%d, " 170935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "jpeg_markers=%d\n", 171035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->quality, p->APPn, p->APP_len, 171135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->COM_len, p->jpeg_markers); 171235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 171335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 171435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_S_JPEGCOMP: 171535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 171635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_jpegcompression *p = arg; 171735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1718a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_g_jpegcomp) 171935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 172093d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (ret_prio) { 172193d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio; 172293d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 172393d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil } 172435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "quality=%d, APPn=%d, APP_len=%d, " 172535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "COM_len=%d, jpeg_markers=%d\n", 172635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->quality, p->APPn, p->APP_len, 172735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->COM_len, p->jpeg_markers); 172893d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ops->vidioc_s_jpegcomp(file, fh, p); 172935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 173035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 173135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_G_ENC_INDEX: 173235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 173335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_enc_idx *p = arg; 173435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1735a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_g_enc_index) 173635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 1737a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_enc_index(file, fh, p); 173835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 173935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "entries=%d, entries_cap=%d\n", 174035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->entries, p->entries_cap); 174135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 174235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 174335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_ENCODER_CMD: 174435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 174535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_encoder_cmd *p = arg; 174635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1747a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_encoder_cmd) 174835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 174993d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (ret_prio) { 175093d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio; 175193d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 175293d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil } 1753a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_encoder_cmd(file, fh, p); 175435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 175535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "cmd=%d, flags=%x\n", p->cmd, p->flags); 175635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 175735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 175835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_TRY_ENCODER_CMD: 175935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 176035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_encoder_cmd *p = arg; 176135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1762a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_try_encoder_cmd) 176335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 1764a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_try_encoder_cmd(file, fh, p); 176535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 176635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "cmd=%d, flags=%x\n", p->cmd, p->flags); 176735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 176835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 1769a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil case VIDIOC_DECODER_CMD: 1770a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil { 1771a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil struct v4l2_decoder_cmd *p = arg; 1772a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil 1773a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil if (!ops->vidioc_decoder_cmd) 1774a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil break; 1775a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil if (ret_prio) { 1776a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil ret = ret_prio; 1777a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil break; 1778a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil } 1779a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil ret = ops->vidioc_decoder_cmd(file, fh, p); 1780a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil if (!ret) 1781a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil dbgarg(cmd, "cmd=%d, flags=%x\n", p->cmd, p->flags); 1782a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil break; 1783a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil } 1784a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil case VIDIOC_TRY_DECODER_CMD: 1785a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil { 1786a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil struct v4l2_decoder_cmd *p = arg; 1787a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil 1788a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil if (!ops->vidioc_try_decoder_cmd) 1789a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil break; 1790a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil ret = ops->vidioc_try_decoder_cmd(file, fh, p); 1791a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil if (!ret) 1792a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil dbgarg(cmd, "cmd=%d, flags=%x\n", p->cmd, p->flags); 1793a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil break; 1794a45c0ad51d344dad18c6fb67304b4f87cf0ffd59Hans Verkuil } 179535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_G_PARM: 179635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 179735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_streamparm *p = arg; 179835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 179993d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (!ops->vidioc_g_parm && !vfd->current_norm) 180093d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 1801a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (ops->vidioc_g_parm) { 180234796bc009565ea72643087b7d69c9fa748bce9bTrent Piepho ret = check_fmt(ops, p->type); 180334796bc009565ea72643087b7d69c9fa748bce9bTrent Piepho if (ret) 180434796bc009565ea72643087b7d69c9fa748bce9bTrent Piepho break; 1805a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_parm(file, fh, p); 180635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } else { 18079bedc7f7fe803c17d26b5fcf5786b50a7cf40defHans Verkuil v4l2_std_id std = vfd->current_norm; 18089bedc7f7fe803c17d26b5fcf5786b50a7cf40defHans Verkuil 180993d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = -EINVAL; 181035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) 18113f5e18249ce0d71a900bfdb8df327269483e730dHans Verkuil break; 181235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 181335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil ret = 0; 18149bedc7f7fe803c17d26b5fcf5786b50a7cf40defHans Verkuil if (ops->vidioc_g_std) 18159bedc7f7fe803c17d26b5fcf5786b50a7cf40defHans Verkuil ret = ops->vidioc_g_std(file, fh, &std); 18169bedc7f7fe803c17d26b5fcf5786b50a7cf40defHans Verkuil if (ret == 0) 18179bedc7f7fe803c17d26b5fcf5786b50a7cf40defHans Verkuil v4l2_video_std_frame_period(std, 18189bedc7f7fe803c17d26b5fcf5786b50a7cf40defHans Verkuil &p->parm.capture.timeperframe); 181935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 182035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 182135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "type=%d\n", p->type); 182235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 182335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 182435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_S_PARM: 182535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 182635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_streamparm *p = arg; 182735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1828a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_s_parm) 182935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 183093d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (ret_prio) { 183193d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio; 183293d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 183393d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil } 183434796bc009565ea72643087b7d69c9fa748bce9bTrent Piepho ret = check_fmt(ops, p->type); 183534796bc009565ea72643087b7d69c9fa748bce9bTrent Piepho if (ret) 183634796bc009565ea72643087b7d69c9fa748bce9bTrent Piepho break; 183734796bc009565ea72643087b7d69c9fa748bce9bTrent Piepho 183835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "type=%d\n", p->type); 1839a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_s_parm(file, fh, p); 184035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 184135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 184235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_G_TUNER: 184335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 184435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_tuner *p = arg; 184535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1846a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_g_tuner) 184735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 184835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1849227690df75382e46a4f6ea1bbc5df855a674b47fHans Verkuil p->type = (vfd->vfl_type == VFL_TYPE_RADIO) ? 1850227690df75382e46a4f6ea1bbc5df855a674b47fHans Verkuil V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV; 1851a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_tuner(file, fh, p); 185235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 185335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "index=%d, name=%s, type=%d, " 185435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "capability=0x%x, rangelow=%d, " 185535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "rangehigh=%d, signal=%d, afc=%d, " 185635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "rxsubchans=0x%x, audmode=%d\n", 185735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->index, p->name, p->type, 185835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->capability, p->rangelow, 185935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->rangehigh, p->signal, p->afc, 186035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->rxsubchans, p->audmode); 186135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 186235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 186335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_S_TUNER: 186435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 186535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_tuner *p = arg; 186635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1867a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_s_tuner) 186835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 186993d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (ret_prio) { 187093d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio; 187193d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 187293d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil } 1873227690df75382e46a4f6ea1bbc5df855a674b47fHans Verkuil p->type = (vfd->vfl_type == VFL_TYPE_RADIO) ? 1874227690df75382e46a4f6ea1bbc5df855a674b47fHans Verkuil V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV; 187535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "index=%d, name=%s, type=%d, " 187635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "capability=0x%x, rangelow=%d, " 187735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "rangehigh=%d, signal=%d, afc=%d, " 187835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil "rxsubchans=0x%x, audmode=%d\n", 187935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->index, p->name, p->type, 188035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->capability, p->rangelow, 188135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->rangehigh, p->signal, p->afc, 188235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->rxsubchans, p->audmode); 1883a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_s_tuner(file, fh, p); 188435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 188535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 188635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_G_FREQUENCY: 188735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 188835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_frequency *p = arg; 188935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1890a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_g_frequency) 189135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 189235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1893227690df75382e46a4f6ea1bbc5df855a674b47fHans Verkuil p->type = (vfd->vfl_type == VFL_TYPE_RADIO) ? 1894227690df75382e46a4f6ea1bbc5df855a674b47fHans Verkuil V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV; 1895a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_frequency(file, fh, p); 189635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 189735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "tuner=%d, type=%d, frequency=%d\n", 189835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->tuner, p->type, p->frequency); 189935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 190035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 190135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_S_FREQUENCY: 190235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 190335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_frequency *p = arg; 1904aa07eec5320cf1793062c03b8409e7541ca37c31Hans Verkuil enum v4l2_tuner_type type; 190535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1906a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_s_frequency) 190735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 190893d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (ret_prio) { 190993d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio; 191093d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 191193d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil } 1912aa07eec5320cf1793062c03b8409e7541ca37c31Hans Verkuil type = (vfd->vfl_type == VFL_TYPE_RADIO) ? 1913aa07eec5320cf1793062c03b8409e7541ca37c31Hans Verkuil V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV; 191435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "tuner=%d, type=%d, frequency=%d\n", 191535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil p->tuner, p->type, p->frequency); 1916aa07eec5320cf1793062c03b8409e7541ca37c31Hans Verkuil if (p->type != type) 1917aa07eec5320cf1793062c03b8409e7541ca37c31Hans Verkuil ret = -EINVAL; 1918aa07eec5320cf1793062c03b8409e7541ca37c31Hans Verkuil else 1919aa07eec5320cf1793062c03b8409e7541ca37c31Hans Verkuil ret = ops->vidioc_s_frequency(file, fh, p); 192035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 192135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 192235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_G_SLICED_VBI_CAP: 192335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 192435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_sliced_vbi_cap *p = arg; 192535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1926a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_g_sliced_vbi_cap) 192735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 192819c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho 192919c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho /* Clear up to type, everything after type is zerod already */ 193019c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho memset(p, 0, offsetof(struct v4l2_sliced_vbi_cap, type)); 193119c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho 193235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names)); 1933a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_sliced_vbi_cap(file, fh, p); 193435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 193535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg2("service_set=%d\n", p->service_set); 193635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 193735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 193835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_LOG_STATUS: 193935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 1940a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_log_status) 194135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 1942e2ecb257eebd8525029f43fcb4f922c4976dba53Hans Verkuil if (vfd->v4l2_dev) 1943e2ecb257eebd8525029f43fcb4f922c4976dba53Hans Verkuil pr_info("%s: ================= START STATUS =================\n", 1944e2ecb257eebd8525029f43fcb4f922c4976dba53Hans Verkuil vfd->v4l2_dev->name); 1945a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_log_status(file, fh); 1946e2ecb257eebd8525029f43fcb4f922c4976dba53Hans Verkuil if (vfd->v4l2_dev) 1947e2ecb257eebd8525029f43fcb4f922c4976dba53Hans Verkuil pr_info("%s: ================== END STATUS ==================\n", 1948e2ecb257eebd8525029f43fcb4f922c4976dba53Hans Verkuil vfd->v4l2_dev->name); 194935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 195035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 195135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil#ifdef CONFIG_VIDEO_ADV_DEBUG 195235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_DBG_G_REGISTER: 195335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 1954aecde8b53b8ee1330a5a8206200f0d6b8845a6e0Hans Verkuil struct v4l2_dbg_register *p = arg; 195535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1956a1198ccf9c52922e66a3372b0045ebe335a127ddHans Verkuil if (ops->vidioc_g_register) { 1957a1198ccf9c52922e66a3372b0045ebe335a127ddHans Verkuil if (!capable(CAP_SYS_ADMIN)) 1958a1198ccf9c52922e66a3372b0045ebe335a127ddHans Verkuil ret = -EPERM; 1959a1198ccf9c52922e66a3372b0045ebe335a127ddHans Verkuil else 1960a1198ccf9c52922e66a3372b0045ebe335a127ddHans Verkuil ret = ops->vidioc_g_register(file, fh, p); 1961a1198ccf9c52922e66a3372b0045ebe335a127ddHans Verkuil } 196235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 196335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 196435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_DBG_S_REGISTER: 196535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 1966aecde8b53b8ee1330a5a8206200f0d6b8845a6e0Hans Verkuil struct v4l2_dbg_register *p = arg; 196735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1968a1198ccf9c52922e66a3372b0045ebe335a127ddHans Verkuil if (ops->vidioc_s_register) { 1969a1198ccf9c52922e66a3372b0045ebe335a127ddHans Verkuil if (!capable(CAP_SYS_ADMIN)) 1970a1198ccf9c52922e66a3372b0045ebe335a127ddHans Verkuil ret = -EPERM; 1971a1198ccf9c52922e66a3372b0045ebe335a127ddHans Verkuil else 1972a1198ccf9c52922e66a3372b0045ebe335a127ddHans Verkuil ret = ops->vidioc_s_register(file, fh, p); 1973a1198ccf9c52922e66a3372b0045ebe335a127ddHans Verkuil } 197435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 197535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 197635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil#endif 1977aecde8b53b8ee1330a5a8206200f0d6b8845a6e0Hans Verkuil case VIDIOC_DBG_G_CHIP_IDENT: 197835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 1979aecde8b53b8ee1330a5a8206200f0d6b8845a6e0Hans Verkuil struct v4l2_dbg_chip_ident *p = arg; 198035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1981a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_g_chip_ident) 198235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 198380b36e0fcfe7520ee92f648148d091ad880ae711Hans Verkuil p->ident = V4L2_IDENT_NONE; 198480b36e0fcfe7520ee92f648148d091ad880ae711Hans Verkuil p->revision = 0; 1985a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil ret = ops->vidioc_g_chip_ident(file, fh, p); 198635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (!ret) 198735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, "chip_ident=%u, revision=0x%x\n", p->ident, p->revision); 198835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 198935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 199035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case VIDIOC_S_HW_FREQ_SEEK: 199135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil { 199235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil struct v4l2_hw_freq_seek *p = arg; 1993a6cf90a91551c767bed78a4418c26f41aed60cdeHans Verkuil enum v4l2_tuner_type type; 199435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 1995a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_s_hw_freq_seek) 199635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 199793d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (ret_prio) { 199893d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio; 199993d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 200093d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil } 2001a6cf90a91551c767bed78a4418c26f41aed60cdeHans Verkuil type = (vfd->vfl_type == VFL_TYPE_RADIO) ? 2002a6cf90a91551c767bed78a4418c26f41aed60cdeHans Verkuil V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV; 200335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil dbgarg(cmd, 2004a6cf90a91551c767bed78a4418c26f41aed60cdeHans Verkuil "tuner=%u, type=%u, seek_upward=%u, wrap_around=%u, spacing=%u\n", 2005a6cf90a91551c767bed78a4418c26f41aed60cdeHans Verkuil p->tuner, p->type, p->seek_upward, p->wrap_around, p->spacing); 2006a6cf90a91551c767bed78a4418c26f41aed60cdeHans Verkuil if (p->type != type) 2007a6cf90a91551c767bed78a4418c26f41aed60cdeHans Verkuil ret = -EINVAL; 2008a6cf90a91551c767bed78a4418c26f41aed60cdeHans Verkuil else 2009a6cf90a91551c767bed78a4418c26f41aed60cdeHans Verkuil ret = ops->vidioc_s_hw_freq_seek(file, fh, p); 2010a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil break; 2011a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil } 201274d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab case VIDIOC_ENUM_FRAMESIZES: 201374d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab { 201474d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab struct v4l2_frmsizeenum *p = arg; 201574d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab 201674d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab if (!ops->vidioc_enum_framesizes) 201774d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab break; 201874d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab 201974d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab ret = ops->vidioc_enum_framesizes(file, fh, p); 202074d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab dbgarg(cmd, 2021d1afe4250a0aecf7ee92fa3d563a2f2aabf6cc0bMauro Carvalho Chehab "index=%d, pixelformat=%c%c%c%c, type=%d ", 2022d1afe4250a0aecf7ee92fa3d563a2f2aabf6cc0bMauro Carvalho Chehab p->index, 2023d1afe4250a0aecf7ee92fa3d563a2f2aabf6cc0bMauro Carvalho Chehab (p->pixel_format & 0xff), 2024d1afe4250a0aecf7ee92fa3d563a2f2aabf6cc0bMauro Carvalho Chehab (p->pixel_format >> 8) & 0xff, 2025d1afe4250a0aecf7ee92fa3d563a2f2aabf6cc0bMauro Carvalho Chehab (p->pixel_format >> 16) & 0xff, 2026d1afe4250a0aecf7ee92fa3d563a2f2aabf6cc0bMauro Carvalho Chehab (p->pixel_format >> 24) & 0xff, 2027d1afe4250a0aecf7ee92fa3d563a2f2aabf6cc0bMauro Carvalho Chehab p->type); 202874d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab switch (p->type) { 202974d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab case V4L2_FRMSIZE_TYPE_DISCRETE: 2030d33fbcbb21ba53358ba8a83765cfd1401e06d883Mauro Carvalho Chehab dbgarg3("width = %d, height=%d\n", 203174d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab p->discrete.width, p->discrete.height); 203274d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab break; 203374d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab case V4L2_FRMSIZE_TYPE_STEPWISE: 2034d33fbcbb21ba53358ba8a83765cfd1401e06d883Mauro Carvalho Chehab dbgarg3("min %dx%d, max %dx%d, step %dx%d\n", 203574d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab p->stepwise.min_width, p->stepwise.min_height, 203674d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab p->stepwise.step_width, p->stepwise.step_height, 203774d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab p->stepwise.max_width, p->stepwise.max_height); 203874d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab break; 203974d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab case V4L2_FRMSIZE_TYPE_CONTINUOUS: 2040d33fbcbb21ba53358ba8a83765cfd1401e06d883Mauro Carvalho Chehab dbgarg3("continuous\n"); 204174d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab break; 204274d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab default: 2043d33fbcbb21ba53358ba8a83765cfd1401e06d883Mauro Carvalho Chehab dbgarg3("- Unknown type!\n"); 204474d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab } 204574d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab 204674d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab break; 204774d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab } 204874d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab case VIDIOC_ENUM_FRAMEINTERVALS: 204974d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab { 205074d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab struct v4l2_frmivalenum *p = arg; 205174d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab 205274d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab if (!ops->vidioc_enum_frameintervals) 205374d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab break; 205474d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab 205574d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab ret = ops->vidioc_enum_frameintervals(file, fh, p); 205674d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab dbgarg(cmd, 205774d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab "index=%d, pixelformat=%d, width=%d, height=%d, type=%d ", 205874d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab p->index, p->pixel_format, 205974d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab p->width, p->height, p->type); 206074d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab switch (p->type) { 206174d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab case V4L2_FRMIVAL_TYPE_DISCRETE: 206274d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab dbgarg2("fps=%d/%d\n", 206374d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab p->discrete.numerator, 206474d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab p->discrete.denominator); 206574d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab break; 206674d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab case V4L2_FRMIVAL_TYPE_STEPWISE: 20671958578da6f3971227fca94a62429cdf0bd3c699Mauro Carvalho Chehab dbgarg2("min=%d/%d, max=%d/%d, step=%d/%d\n", 20681958578da6f3971227fca94a62429cdf0bd3c699Mauro Carvalho Chehab p->stepwise.min.numerator, 20691958578da6f3971227fca94a62429cdf0bd3c699Mauro Carvalho Chehab p->stepwise.min.denominator, 20701958578da6f3971227fca94a62429cdf0bd3c699Mauro Carvalho Chehab p->stepwise.max.numerator, 20711958578da6f3971227fca94a62429cdf0bd3c699Mauro Carvalho Chehab p->stepwise.max.denominator, 20721958578da6f3971227fca94a62429cdf0bd3c699Mauro Carvalho Chehab p->stepwise.step.numerator, 20731958578da6f3971227fca94a62429cdf0bd3c699Mauro Carvalho Chehab p->stepwise.step.denominator); 207474d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab break; 207574d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab case V4L2_FRMIVAL_TYPE_CONTINUOUS: 207674d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab dbgarg2("continuous\n"); 207774d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab break; 207874d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab default: 207974d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab dbgarg2("- Unknown type!\n"); 208074d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab } 208174d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab break; 208274d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab } 2083b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri case VIDIOC_ENUM_DV_PRESETS: 2084b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri { 2085b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri struct v4l2_dv_enum_preset *p = arg; 2086b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri 2087b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri if (!ops->vidioc_enum_dv_presets) 2088b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri break; 2089b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri 2090b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri ret = ops->vidioc_enum_dv_presets(file, fh, p); 2091b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri if (!ret) 2092b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri dbgarg(cmd, 2093b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri "index=%d, preset=%d, name=%s, width=%d," 2094b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri " height=%d ", 2095b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri p->index, p->preset, p->name, p->width, 2096b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri p->height); 2097b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri break; 2098b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri } 2099b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri case VIDIOC_S_DV_PRESET: 2100b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri { 2101b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri struct v4l2_dv_preset *p = arg; 2102b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri 2103b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri if (!ops->vidioc_s_dv_preset) 2104b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri break; 210593d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (ret_prio) { 210693d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio; 210793d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 210893d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil } 2109b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri 2110b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri dbgarg(cmd, "preset=%d\n", p->preset); 2111b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri ret = ops->vidioc_s_dv_preset(file, fh, p); 2112b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri break; 2113b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri } 2114b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri case VIDIOC_G_DV_PRESET: 2115b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri { 2116b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri struct v4l2_dv_preset *p = arg; 2117b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri 2118b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri if (!ops->vidioc_g_dv_preset) 2119b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri break; 2120b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri 2121b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri ret = ops->vidioc_g_dv_preset(file, fh, p); 2122b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri if (!ret) 2123b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri dbgarg(cmd, "preset=%d\n", p->preset); 2124b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri break; 2125b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri } 2126b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri case VIDIOC_QUERY_DV_PRESET: 2127b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri { 2128b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri struct v4l2_dv_preset *p = arg; 2129b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri 2130b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri if (!ops->vidioc_query_dv_preset) 2131b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri break; 2132b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri 2133b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri ret = ops->vidioc_query_dv_preset(file, fh, p); 2134b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri if (!ret) 2135b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri dbgarg(cmd, "preset=%d\n", p->preset); 2136b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri break; 2137b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri } 2138b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri case VIDIOC_S_DV_TIMINGS: 2139b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri { 2140b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri struct v4l2_dv_timings *p = arg; 2141b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri 2142b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri if (!ops->vidioc_s_dv_timings) 2143b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri break; 214493d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil if (ret_prio) { 214593d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ret_prio; 214693d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil break; 214793d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil } 2148b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri 2149b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri switch (p->type) { 2150b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri case V4L2_DV_BT_656_1120: 2151b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri dbgarg2("bt-656/1120:interlaced=%d, pixelclock=%lld," 2152b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri " width=%d, height=%d, polarities=%x," 2153b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri " hfrontporch=%d, hsync=%d, hbackporch=%d," 2154b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri " vfrontporch=%d, vsync=%d, vbackporch=%d," 2155b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri " il_vfrontporch=%d, il_vsync=%d," 2156b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri " il_vbackporch=%d\n", 2157b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri p->bt.interlaced, p->bt.pixelclock, 2158b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri p->bt.width, p->bt.height, p->bt.polarities, 2159b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri p->bt.hfrontporch, p->bt.hsync, 2160b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri p->bt.hbackporch, p->bt.vfrontporch, 2161b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri p->bt.vsync, p->bt.vbackporch, 2162b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri p->bt.il_vfrontporch, p->bt.il_vsync, 2163b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri p->bt.il_vbackporch); 2164b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri ret = ops->vidioc_s_dv_timings(file, fh, p); 2165b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri break; 2166b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri default: 2167b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri dbgarg2("Unknown type %d!\n", p->type); 2168b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri break; 2169b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri } 2170b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri break; 2171b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri } 2172b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri case VIDIOC_G_DV_TIMINGS: 2173b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri { 2174b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri struct v4l2_dv_timings *p = arg; 2175b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri 2176b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri if (!ops->vidioc_g_dv_timings) 2177b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri break; 2178b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri 2179b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri ret = ops->vidioc_g_dv_timings(file, fh, p); 2180b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri if (!ret) { 2181b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri switch (p->type) { 2182b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri case V4L2_DV_BT_656_1120: 2183b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri dbgarg2("bt-656/1120:interlaced=%d," 2184b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri " pixelclock=%lld," 2185b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri " width=%d, height=%d, polarities=%x," 2186b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri " hfrontporch=%d, hsync=%d," 2187b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri " hbackporch=%d, vfrontporch=%d," 2188b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri " vsync=%d, vbackporch=%d," 2189b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri " il_vfrontporch=%d, il_vsync=%d," 2190b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri " il_vbackporch=%d\n", 2191b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri p->bt.interlaced, p->bt.pixelclock, 2192b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri p->bt.width, p->bt.height, 2193b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri p->bt.polarities, p->bt.hfrontporch, 2194b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri p->bt.hsync, p->bt.hbackporch, 2195b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri p->bt.vfrontporch, p->bt.vsync, 2196b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri p->bt.vbackporch, p->bt.il_vfrontporch, 2197b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri p->bt.il_vsync, p->bt.il_vbackporch); 2198b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri break; 2199b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri default: 2200b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri dbgarg2("Unknown type %d!\n", p->type); 2201b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri break; 2202b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri } 2203b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri } 2204b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri break; 2205b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031Muralidharan Karicheri } 2206d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus case VIDIOC_DQEVENT: 2207d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus { 2208d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus struct v4l2_event *ev = arg; 2209d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus 2210d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus if (!ops->vidioc_subscribe_event) 2211d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus break; 2212d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus 2213d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus ret = v4l2_event_dequeue(fh, ev, file->f_flags & O_NONBLOCK); 2214d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus if (ret < 0) { 2215d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus dbgarg(cmd, "no pending events?"); 2216d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus break; 2217d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus } 2218d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus dbgarg(cmd, 2219d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus "pending=%d, type=0x%8.8x, sequence=%d, " 2220d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus "timestamp=%lu.%9.9lu ", 2221d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus ev->pending, ev->type, ev->sequence, 2222d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus ev->timestamp.tv_sec, ev->timestamp.tv_nsec); 2223d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus break; 2224d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus } 2225d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus case VIDIOC_SUBSCRIBE_EVENT: 2226d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus { 2227d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus struct v4l2_event_subscription *sub = arg; 2228d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus 2229d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus if (!ops->vidioc_subscribe_event) 2230d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus break; 223174d83fa0241f603a4067f071a88ef8b9a7c415a0Mauro Carvalho Chehab 2232d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus ret = ops->vidioc_subscribe_event(fh, sub); 2233d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus if (ret < 0) { 2234d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus dbgarg(cmd, "failed, ret=%ld", ret); 2235d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus break; 2236d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus } 2237d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus dbgarg(cmd, "type=0x%8.8x", sub->type); 2238d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus break; 2239d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus } 2240d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus case VIDIOC_UNSUBSCRIBE_EVENT: 2241d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus { 2242d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus struct v4l2_event_subscription *sub = arg; 2243d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus 2244d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus if (!ops->vidioc_unsubscribe_event) 2245d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus break; 2246d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus 2247d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus ret = ops->vidioc_unsubscribe_event(fh, sub); 2248d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus if (ret < 0) { 2249d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus dbgarg(cmd, "failed, ret=%ld", ret); 2250d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus break; 2251d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus } 2252d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus dbgarg(cmd, "type=0x%8.8x", sub->type); 2253d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus break; 2254d3d7c963562adad92e968df23c425ae964fe9ce2Sakari Ailus } 22552150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski case VIDIOC_CREATE_BUFS: 22562150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski { 22572150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski struct v4l2_create_buffers *create = arg; 22582150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski 22592150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski if (!ops->vidioc_create_bufs) 22602150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski break; 22612150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski if (ret_prio) { 22622150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski ret = ret_prio; 22632150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski break; 22642150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski } 22652150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski ret = check_fmt(ops, create->format.type); 22662150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski if (ret) 22672150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski break; 22682150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski 22692150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski ret = ops->vidioc_create_bufs(file, fh, create); 22702150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski 22712150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski dbgarg(cmd, "count=%d @ %d\n", create->count, create->index); 22722150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski break; 22732150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski } 22742150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski case VIDIOC_PREPARE_BUF: 22752150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski { 22762150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski struct v4l2_buffer *b = arg; 22772150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski 22782150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski if (!ops->vidioc_prepare_buf) 22792150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski break; 22802150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski ret = check_fmt(ops, b->type); 22812150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski if (ret) 22822150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski break; 22832150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski 22842150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski ret = ops->vidioc_prepare_buf(file, fh, b); 22852150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski 22862150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski dbgarg(cmd, "index=%d", b->index); 22872150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski break; 22882150158b31a3290cc883cf6dea4f5d6803b6b811Guennadi Liakhovetski } 2289a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil default: 2290a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil if (!ops->vidioc_default) 2291a399810ca69d9d4bd30ab8c1678c7439e567f90bHans Verkuil break; 229293d5a30bcabb49a3179d68f5714d43ae1560ede8Hans Verkuil ret = ops->vidioc_default(file, fh, ret_prio >= 0, cmd, arg); 229335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 229435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } /* switch */ 229535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 229635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) { 229735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (ret < 0) { 229835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil v4l_print_ioctl(vfd->name, cmd); 2299069b747931f13eda289c1d59a09ecc8162281a76Hans Verkuil printk(KERN_CONT " error %ld\n", ret); 230035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 230135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 230235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 230335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil return ret; 230435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil} 230535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 230619c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho/* In some cases, only a few fields are used as input, i.e. when the app sets 230719c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho * "index" and then the driver fills in the rest of the structure for the thing 230819c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho * with that index. We only need to copy up the first non-input field. */ 230919c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piephostatic unsigned long cmd_input_size(unsigned int cmd) 231019c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho{ 231119c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho /* Size of structure up to and including 'field' */ 23129f1a693f76700018d921cd7af86f7c994a300613Hans Verkuil#define CMDINSIZE(cmd, type, field) \ 23139f1a693f76700018d921cd7af86f7c994a300613Hans Verkuil case VIDIOC_##cmd: \ 23149f1a693f76700018d921cd7af86f7c994a300613Hans Verkuil return offsetof(struct v4l2_##type, field) + \ 23159f1a693f76700018d921cd7af86f7c994a300613Hans Verkuil sizeof(((struct v4l2_##type *)0)->field); 231619c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho 23179f1a693f76700018d921cd7af86f7c994a300613Hans Verkuil switch (cmd) { 231819c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho CMDINSIZE(ENUM_FMT, fmtdesc, type); 231919c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho CMDINSIZE(G_FMT, format, type); 2320d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak CMDINSIZE(QUERYBUF, buffer, length); 232119c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho CMDINSIZE(G_PARM, streamparm, type); 232219c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho CMDINSIZE(ENUMSTD, standard, index); 232319c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho CMDINSIZE(ENUMINPUT, input, index); 232419c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho CMDINSIZE(G_CTRL, control, id); 232519c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho CMDINSIZE(G_TUNER, tuner, index); 232619c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho CMDINSIZE(QUERYCTRL, queryctrl, id); 232719c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho CMDINSIZE(QUERYMENU, querymenu, index); 232819c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho CMDINSIZE(ENUMOUTPUT, output, index); 232919c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho CMDINSIZE(G_MODULATOR, modulator, index); 233019c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho CMDINSIZE(G_FREQUENCY, frequency, tuner); 233119c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho CMDINSIZE(CROPCAP, cropcap, type); 233219c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho CMDINSIZE(G_CROP, crop, type); 233319c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho CMDINSIZE(ENUMAUDIO, audio, index); 233419c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho CMDINSIZE(ENUMAUDOUT, audioout, index); 233519c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho CMDINSIZE(ENCODER_CMD, encoder_cmd, flags); 233619c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho CMDINSIZE(TRY_ENCODER_CMD, encoder_cmd, flags); 233719c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho CMDINSIZE(G_SLICED_VBI_CAP, sliced_vbi_cap, type); 233819c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho CMDINSIZE(ENUM_FRAMESIZES, frmsizeenum, pixel_format); 233919c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho CMDINSIZE(ENUM_FRAMEINTERVALS, frmivalenum, height); 234019c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho default: 234119c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho return _IOC_SIZE(cmd); 234219c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho } 234319c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho} 234419c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho 2345d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciakstatic int check_array_args(unsigned int cmd, void *parg, size_t *array_size, 2346d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak void * __user *user_ptr, void ***kernel_ptr) 2347d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak{ 2348d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak int ret = 0; 2349d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak 2350d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak switch (cmd) { 2351d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak case VIDIOC_QUERYBUF: 2352d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak case VIDIOC_QBUF: 2353d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak case VIDIOC_DQBUF: { 2354d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak struct v4l2_buffer *buf = parg; 2355d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak 2356d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak if (V4L2_TYPE_IS_MULTIPLANAR(buf->type) && buf->length > 0) { 2357d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak if (buf->length > VIDEO_MAX_PLANES) { 2358d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak ret = -EINVAL; 2359d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak break; 2360d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak } 2361d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak *user_ptr = (void __user *)buf->m.planes; 23622ef403708880c6e00854fb81bbffb9a4036327e6Hans Petter Selasky *kernel_ptr = (void *)&buf->m.planes; 2363d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak *array_size = sizeof(struct v4l2_plane) * buf->length; 2364d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak ret = 1; 2365d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak } 2366d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak break; 2367d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak } 2368d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak 2369d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak case VIDIOC_S_EXT_CTRLS: 2370d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak case VIDIOC_G_EXT_CTRLS: 2371d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak case VIDIOC_TRY_EXT_CTRLS: { 2372d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak struct v4l2_ext_controls *ctrls = parg; 2373d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak 2374d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak if (ctrls->count != 0) { 23756c06108be53ca5e94d8b0e93883d534dd9079646Dan Carpenter if (ctrls->count > V4L2_CID_MAX_CTRLS) { 23766c06108be53ca5e94d8b0e93883d534dd9079646Dan Carpenter ret = -EINVAL; 23776c06108be53ca5e94d8b0e93883d534dd9079646Dan Carpenter break; 23786c06108be53ca5e94d8b0e93883d534dd9079646Dan Carpenter } 2379d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak *user_ptr = (void __user *)ctrls->controls; 23802ef403708880c6e00854fb81bbffb9a4036327e6Hans Petter Selasky *kernel_ptr = (void *)&ctrls->controls; 2381d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak *array_size = sizeof(struct v4l2_ext_control) 2382d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak * ctrls->count; 2383d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak ret = 1; 2384d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak } 2385d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak break; 2386d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak } 2387d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak } 2388d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak 2389d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak return ret; 2390d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak} 2391d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak 2392fc0a80798576f80ca10b3f6c9c7097f12fd1d64eLaurent Pinchartlong 2393fc0a80798576f80ca10b3f6c9c7097f12fd1d64eLaurent Pinchartvideo_usercopy(struct file *file, unsigned int cmd, unsigned long arg, 2394fc0a80798576f80ca10b3f6c9c7097f12fd1d64eLaurent Pinchart v4l2_kioctl func) 239535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil{ 239635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil char sbuf[128]; 239735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil void *mbuf = NULL; 23981d94aa369da073acff26fa98ad6b2168cb028ab1Hans Verkuil void *parg = (void *)arg; 2399069b747931f13eda289c1d59a09ecc8162281a76Hans Verkuil long err = -EINVAL; 2400d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak bool has_array_args; 2401d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak size_t array_size = 0; 240235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil void __user *user_ptr = NULL; 2403d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak void **kernel_ptr = NULL; 240435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 240535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* Copy arguments into temp kernel buffer */ 2406337f9d205972bfe1cb7982384fd0f4caa4af001dTrent Piepho if (_IOC_DIR(cmd) != _IOC_NONE) { 240735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (_IOC_SIZE(cmd) <= sizeof(sbuf)) { 240835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil parg = sbuf; 240935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } else { 241035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* too big to allocate from stack */ 241135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil mbuf = kmalloc(_IOC_SIZE(cmd), GFP_KERNEL); 241235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (NULL == mbuf) 241335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil return -ENOMEM; 241435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil parg = mbuf; 241535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 241635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 241735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil err = -EFAULT; 241819c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho if (_IOC_DIR(cmd) & _IOC_WRITE) { 241919c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho unsigned long n = cmd_input_size(cmd); 242019c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho 242119c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho if (copy_from_user(parg, (void __user *)arg, n)) 242235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil goto out; 242319c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho 242419c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho /* zero out anything we don't copy from userspace */ 242519c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho if (n < _IOC_SIZE(cmd)) 242619c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho memset((u8 *)parg + n, 0, _IOC_SIZE(cmd) - n); 2427337f9d205972bfe1cb7982384fd0f4caa4af001dTrent Piepho } else { 2428337f9d205972bfe1cb7982384fd0f4caa4af001dTrent Piepho /* read-only ioctl */ 2429337f9d205972bfe1cb7982384fd0f4caa4af001dTrent Piepho memset(parg, 0, _IOC_SIZE(cmd)); 243019c96e4b7d3c80071982a052e4a921c1a39875d9Trent Piepho } 243135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 243235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 2433d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak err = check_array_args(cmd, parg, &array_size, &user_ptr, &kernel_ptr); 2434d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak if (err < 0) 2435d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak goto out; 2436d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak has_array_args = err; 243735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 2438d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak if (has_array_args) { 2439d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak /* 2440d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak * When adding new types of array args, make sure that the 2441d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak * parent argument to ioctl (which contains the pointer to the 2442d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak * array) fits into sbuf (so that mbuf will still remain 2443d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak * unused up to here). 2444d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak */ 2445d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak mbuf = kmalloc(array_size, GFP_KERNEL); 2446d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak err = -ENOMEM; 2447d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak if (NULL == mbuf) 2448d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak goto out_array_args; 2449d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak err = -EFAULT; 2450d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak if (copy_from_user(mbuf, user_ptr, array_size)) 2451d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak goto out_array_args; 2452d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak *kernel_ptr = mbuf; 245335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 245435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 245535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* Handles IOCTL */ 2456fc0a80798576f80ca10b3f6c9c7097f12fd1d64eLaurent Pinchart err = func(file, cmd, parg); 245735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (err == -ENOIOCTLCMD) 245802bbb814d8db7b632458fcf8651267798eeef985Hans Verkuil err = -ENOTTY; 245935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 2460d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak if (has_array_args) { 2461d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak *kernel_ptr = user_ptr; 2462d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak if (copy_to_user(user_ptr, mbuf, array_size)) 246335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil err = -EFAULT; 2464d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciak goto out_array_args; 246535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 246635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (err < 0) 246735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil goto out; 246835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 2469d14e6d76ebf740fd0d0bd296933993a555938896Pawel Osciakout_array_args: 247035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil /* Copy results into user buffer */ 247135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil switch (_IOC_DIR(cmd)) { 247235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case _IOC_READ: 247335ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil case (_IOC_WRITE | _IOC_READ): 247435ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd))) 247535ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil err = -EFAULT; 247635ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil break; 247735ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil } 247835ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil 247935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuilout: 248035ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil kfree(mbuf); 248135ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil return err; 248235ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil} 2483fc0a80798576f80ca10b3f6c9c7097f12fd1d64eLaurent PinchartEXPORT_SYMBOL(video_usercopy); 2484fc0a80798576f80ca10b3f6c9c7097f12fd1d64eLaurent Pinchart 2485fc0a80798576f80ca10b3f6c9c7097f12fd1d64eLaurent Pinchartlong video_ioctl2(struct file *file, 2486fc0a80798576f80ca10b3f6c9c7097f12fd1d64eLaurent Pinchart unsigned int cmd, unsigned long arg) 2487fc0a80798576f80ca10b3f6c9c7097f12fd1d64eLaurent Pinchart{ 2488fc0a80798576f80ca10b3f6c9c7097f12fd1d64eLaurent Pinchart return video_usercopy(file, cmd, arg, __video_do_ioctl); 2489fc0a80798576f80ca10b3f6c9c7097f12fd1d64eLaurent Pinchart} 24908a522c916d3c3b29a38bd3c8fc3df826d22a9444Mauro Carvalho ChehabEXPORT_SYMBOL(video_ioctl2); 2491