2 * Video capture interface for Linux version 2
4 * A generic framework to process V4L2 ioctl commands.
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
11 * Authors: Alan Cox, <alan@lxorguk.ukuu.org.uk> (version 1)
12 * Mauro Carvalho Chehab <mchehab@infradead.org> (version 2)
15 #include <linux/module.h>
16 #include <linux/types.h>
17 #include <linux/kernel.h>
19 #define __OLD_VIDIOC_ /* To allow fixing old calls */
20 #include <linux/videodev2.h>
22 #ifdef CONFIG_VIDEO_V4L1
23 #include <linux/videodev.h>
25 #include <media/v4l2-common.h>
26 #include <media/v4l2-ioctl.h>
27 #include <linux/video_decoder.h>
29 #define dbgarg(cmd, fmt, arg...) \
31 if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) { \
32 printk(KERN_DEBUG "%s: ", vfd->name); \
33 v4l_printk_ioctl(cmd); \
34 printk(" " fmt, ## arg); \
38 #define dbgarg2(fmt, arg...) \
40 if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) \
41 printk(KERN_DEBUG "%s: " fmt, vfd->name, ## arg);\
49 static const struct std_descr standards[] = {
50 { V4L2_STD_NTSC, "NTSC" },
51 { V4L2_STD_NTSC_M, "NTSC-M" },
52 { V4L2_STD_NTSC_M_JP, "NTSC-M-JP" },
53 { V4L2_STD_NTSC_M_KR, "NTSC-M-KR" },
54 { V4L2_STD_NTSC_443, "NTSC-443" },
55 { V4L2_STD_PAL, "PAL" },
56 { V4L2_STD_PAL_BG, "PAL-BG" },
57 { V4L2_STD_PAL_B, "PAL-B" },
58 { V4L2_STD_PAL_B1, "PAL-B1" },
59 { V4L2_STD_PAL_G, "PAL-G" },
60 { V4L2_STD_PAL_H, "PAL-H" },
61 { V4L2_STD_PAL_I, "PAL-I" },
62 { V4L2_STD_PAL_DK, "PAL-DK" },
63 { V4L2_STD_PAL_D, "PAL-D" },
64 { V4L2_STD_PAL_D1, "PAL-D1" },
65 { V4L2_STD_PAL_K, "PAL-K" },
66 { V4L2_STD_PAL_M, "PAL-M" },
67 { V4L2_STD_PAL_N, "PAL-N" },
68 { V4L2_STD_PAL_Nc, "PAL-Nc" },
69 { V4L2_STD_PAL_60, "PAL-60" },
70 { V4L2_STD_SECAM, "SECAM" },
71 { V4L2_STD_SECAM_B, "SECAM-B" },
72 { V4L2_STD_SECAM_G, "SECAM-G" },
73 { V4L2_STD_SECAM_H, "SECAM-H" },
74 { V4L2_STD_SECAM_DK, "SECAM-DK" },
75 { V4L2_STD_SECAM_D, "SECAM-D" },
76 { V4L2_STD_SECAM_K, "SECAM-K" },
77 { V4L2_STD_SECAM_K1, "SECAM-K1" },
78 { V4L2_STD_SECAM_L, "SECAM-L" },
79 { V4L2_STD_SECAM_LC, "SECAM-Lc" },
83 /* video4linux standard ID conversion to standard name
85 const char *v4l2_norm_to_name(v4l2_std_id id)
90 /* HACK: ppc32 architecture doesn't have __ucmpdi2 function to handle
91 64 bit comparations. So, on that architecture, with some gcc
92 variants, compilation fails. Currently, the max value is 30bit wide.
96 for (i = 0; standards[i].std; i++)
97 if (myid == standards[i].std)
99 return standards[i].descr;
101 EXPORT_SYMBOL(v4l2_norm_to_name);
103 /* Fill in the fields of a v4l2_standard structure according to the
104 'id' and 'transmission' parameters. Returns negative on error. */
105 int v4l2_video_std_construct(struct v4l2_standard *vs,
106 int id, const char *name)
108 u32 index = vs->index;
110 memset(vs, 0, sizeof(struct v4l2_standard));
113 if (id & V4L2_STD_525_60) {
114 vs->frameperiod.numerator = 1001;
115 vs->frameperiod.denominator = 30000;
116 vs->framelines = 525;
118 vs->frameperiod.numerator = 1;
119 vs->frameperiod.denominator = 25;
120 vs->framelines = 625;
122 strlcpy(vs->name, name, sizeof(vs->name));
125 EXPORT_SYMBOL(v4l2_video_std_construct);
127 /* ----------------------------------------------------------------- */
128 /* some arrays for pretty-printing debug messages of enum types */
130 const char *v4l2_field_names[] = {
131 [V4L2_FIELD_ANY] = "any",
132 [V4L2_FIELD_NONE] = "none",
133 [V4L2_FIELD_TOP] = "top",
134 [V4L2_FIELD_BOTTOM] = "bottom",
135 [V4L2_FIELD_INTERLACED] = "interlaced",
136 [V4L2_FIELD_SEQ_TB] = "seq-tb",
137 [V4L2_FIELD_SEQ_BT] = "seq-bt",
138 [V4L2_FIELD_ALTERNATE] = "alternate",
139 [V4L2_FIELD_INTERLACED_TB] = "interlaced-tb",
140 [V4L2_FIELD_INTERLACED_BT] = "interlaced-bt",
142 EXPORT_SYMBOL(v4l2_field_names);
144 const char *v4l2_type_names[] = {
145 [V4L2_BUF_TYPE_VIDEO_CAPTURE] = "vid-cap",
146 [V4L2_BUF_TYPE_VIDEO_OVERLAY] = "vid-overlay",
147 [V4L2_BUF_TYPE_VIDEO_OUTPUT] = "vid-out",
148 [V4L2_BUF_TYPE_VBI_CAPTURE] = "vbi-cap",
149 [V4L2_BUF_TYPE_VBI_OUTPUT] = "vbi-out",
150 [V4L2_BUF_TYPE_SLICED_VBI_CAPTURE] = "sliced-vbi-cap",
151 [V4L2_BUF_TYPE_SLICED_VBI_OUTPUT] = "sliced-vbi-out",
152 [V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY] = "vid-out-overlay",
154 EXPORT_SYMBOL(v4l2_type_names);
156 static const char *v4l2_memory_names[] = {
157 [V4L2_MEMORY_MMAP] = "mmap",
158 [V4L2_MEMORY_USERPTR] = "userptr",
159 [V4L2_MEMORY_OVERLAY] = "overlay",
162 #define prt_names(a, arr) ((((a) >= 0) && ((a) < ARRAY_SIZE(arr))) ? \
165 /* ------------------------------------------------------------------ */
166 /* debug help functions */
168 #ifdef CONFIG_VIDEO_V4L1_COMPAT
169 static const char *v4l1_ioctls[] = {
170 [_IOC_NR(VIDIOCGCAP)] = "VIDIOCGCAP",
171 [_IOC_NR(VIDIOCGCHAN)] = "VIDIOCGCHAN",
172 [_IOC_NR(VIDIOCSCHAN)] = "VIDIOCSCHAN",
173 [_IOC_NR(VIDIOCGTUNER)] = "VIDIOCGTUNER",
174 [_IOC_NR(VIDIOCSTUNER)] = "VIDIOCSTUNER",
175 [_IOC_NR(VIDIOCGPICT)] = "VIDIOCGPICT",
176 [_IOC_NR(VIDIOCSPICT)] = "VIDIOCSPICT",
177 [_IOC_NR(VIDIOCCAPTURE)] = "VIDIOCCAPTURE",
178 [_IOC_NR(VIDIOCGWIN)] = "VIDIOCGWIN",
179 [_IOC_NR(VIDIOCSWIN)] = "VIDIOCSWIN",
180 [_IOC_NR(VIDIOCGFBUF)] = "VIDIOCGFBUF",
181 [_IOC_NR(VIDIOCSFBUF)] = "VIDIOCSFBUF",
182 [_IOC_NR(VIDIOCKEY)] = "VIDIOCKEY",
183 [_IOC_NR(VIDIOCGFREQ)] = "VIDIOCGFREQ",
184 [_IOC_NR(VIDIOCSFREQ)] = "VIDIOCSFREQ",
185 [_IOC_NR(VIDIOCGAUDIO)] = "VIDIOCGAUDIO",
186 [_IOC_NR(VIDIOCSAUDIO)] = "VIDIOCSAUDIO",
187 [_IOC_NR(VIDIOCSYNC)] = "VIDIOCSYNC",
188 [_IOC_NR(VIDIOCMCAPTURE)] = "VIDIOCMCAPTURE",
189 [_IOC_NR(VIDIOCGMBUF)] = "VIDIOCGMBUF",
190 [_IOC_NR(VIDIOCGUNIT)] = "VIDIOCGUNIT",
191 [_IOC_NR(VIDIOCGCAPTURE)] = "VIDIOCGCAPTURE",
192 [_IOC_NR(VIDIOCSCAPTURE)] = "VIDIOCSCAPTURE",
193 [_IOC_NR(VIDIOCSPLAYMODE)] = "VIDIOCSPLAYMODE",
194 [_IOC_NR(VIDIOCSWRITEMODE)] = "VIDIOCSWRITEMODE",
195 [_IOC_NR(VIDIOCGPLAYINFO)] = "VIDIOCGPLAYINFO",
196 [_IOC_NR(VIDIOCSMICROCODE)] = "VIDIOCSMICROCODE",
197 [_IOC_NR(VIDIOCGVBIFMT)] = "VIDIOCGVBIFMT",
198 [_IOC_NR(VIDIOCSVBIFMT)] = "VIDIOCSVBIFMT"
200 #define V4L1_IOCTLS ARRAY_SIZE(v4l1_ioctls)
203 static const char *v4l2_ioctls[] = {
204 [_IOC_NR(VIDIOC_QUERYCAP)] = "VIDIOC_QUERYCAP",
205 [_IOC_NR(VIDIOC_RESERVED)] = "VIDIOC_RESERVED",
206 [_IOC_NR(VIDIOC_ENUM_FMT)] = "VIDIOC_ENUM_FMT",
207 [_IOC_NR(VIDIOC_G_FMT)] = "VIDIOC_G_FMT",
208 [_IOC_NR(VIDIOC_S_FMT)] = "VIDIOC_S_FMT",
209 [_IOC_NR(VIDIOC_REQBUFS)] = "VIDIOC_REQBUFS",
210 [_IOC_NR(VIDIOC_QUERYBUF)] = "VIDIOC_QUERYBUF",
211 [_IOC_NR(VIDIOC_G_FBUF)] = "VIDIOC_G_FBUF",
212 [_IOC_NR(VIDIOC_S_FBUF)] = "VIDIOC_S_FBUF",
213 [_IOC_NR(VIDIOC_OVERLAY)] = "VIDIOC_OVERLAY",
214 [_IOC_NR(VIDIOC_QBUF)] = "VIDIOC_QBUF",
215 [_IOC_NR(VIDIOC_DQBUF)] = "VIDIOC_DQBUF",
216 [_IOC_NR(VIDIOC_STREAMON)] = "VIDIOC_STREAMON",
217 [_IOC_NR(VIDIOC_STREAMOFF)] = "VIDIOC_STREAMOFF",
218 [_IOC_NR(VIDIOC_G_PARM)] = "VIDIOC_G_PARM",
219 [_IOC_NR(VIDIOC_S_PARM)] = "VIDIOC_S_PARM",
220 [_IOC_NR(VIDIOC_G_STD)] = "VIDIOC_G_STD",
221 [_IOC_NR(VIDIOC_S_STD)] = "VIDIOC_S_STD",
222 [_IOC_NR(VIDIOC_ENUMSTD)] = "VIDIOC_ENUMSTD",
223 [_IOC_NR(VIDIOC_ENUMINPUT)] = "VIDIOC_ENUMINPUT",
224 [_IOC_NR(VIDIOC_G_CTRL)] = "VIDIOC_G_CTRL",
225 [_IOC_NR(VIDIOC_S_CTRL)] = "VIDIOC_S_CTRL",
226 [_IOC_NR(VIDIOC_G_TUNER)] = "VIDIOC_G_TUNER",
227 [_IOC_NR(VIDIOC_S_TUNER)] = "VIDIOC_S_TUNER",
228 [_IOC_NR(VIDIOC_G_AUDIO)] = "VIDIOC_G_AUDIO",
229 [_IOC_NR(VIDIOC_S_AUDIO)] = "VIDIOC_S_AUDIO",
230 [_IOC_NR(VIDIOC_QUERYCTRL)] = "VIDIOC_QUERYCTRL",
231 [_IOC_NR(VIDIOC_QUERYMENU)] = "VIDIOC_QUERYMENU",
232 [_IOC_NR(VIDIOC_G_INPUT)] = "VIDIOC_G_INPUT",
233 [_IOC_NR(VIDIOC_S_INPUT)] = "VIDIOC_S_INPUT",
234 [_IOC_NR(VIDIOC_G_OUTPUT)] = "VIDIOC_G_OUTPUT",
235 [_IOC_NR(VIDIOC_S_OUTPUT)] = "VIDIOC_S_OUTPUT",
236 [_IOC_NR(VIDIOC_ENUMOUTPUT)] = "VIDIOC_ENUMOUTPUT",
237 [_IOC_NR(VIDIOC_G_AUDOUT)] = "VIDIOC_G_AUDOUT",
238 [_IOC_NR(VIDIOC_S_AUDOUT)] = "VIDIOC_S_AUDOUT",
239 [_IOC_NR(VIDIOC_G_MODULATOR)] = "VIDIOC_G_MODULATOR",
240 [_IOC_NR(VIDIOC_S_MODULATOR)] = "VIDIOC_S_MODULATOR",
241 [_IOC_NR(VIDIOC_G_FREQUENCY)] = "VIDIOC_G_FREQUENCY",
242 [_IOC_NR(VIDIOC_S_FREQUENCY)] = "VIDIOC_S_FREQUENCY",
243 [_IOC_NR(VIDIOC_CROPCAP)] = "VIDIOC_CROPCAP",
244 [_IOC_NR(VIDIOC_G_CROP)] = "VIDIOC_G_CROP",
245 [_IOC_NR(VIDIOC_S_CROP)] = "VIDIOC_S_CROP",
246 [_IOC_NR(VIDIOC_G_JPEGCOMP)] = "VIDIOC_G_JPEGCOMP",
247 [_IOC_NR(VIDIOC_S_JPEGCOMP)] = "VIDIOC_S_JPEGCOMP",
248 [_IOC_NR(VIDIOC_QUERYSTD)] = "VIDIOC_QUERYSTD",
249 [_IOC_NR(VIDIOC_TRY_FMT)] = "VIDIOC_TRY_FMT",
250 [_IOC_NR(VIDIOC_ENUMAUDIO)] = "VIDIOC_ENUMAUDIO",
251 [_IOC_NR(VIDIOC_ENUMAUDOUT)] = "VIDIOC_ENUMAUDOUT",
252 [_IOC_NR(VIDIOC_G_PRIORITY)] = "VIDIOC_G_PRIORITY",
253 [_IOC_NR(VIDIOC_S_PRIORITY)] = "VIDIOC_S_PRIORITY",
254 [_IOC_NR(VIDIOC_G_SLICED_VBI_CAP)] = "VIDIOC_G_SLICED_VBI_CAP",
255 [_IOC_NR(VIDIOC_LOG_STATUS)] = "VIDIOC_LOG_STATUS",
256 [_IOC_NR(VIDIOC_G_EXT_CTRLS)] = "VIDIOC_G_EXT_CTRLS",
257 [_IOC_NR(VIDIOC_S_EXT_CTRLS)] = "VIDIOC_S_EXT_CTRLS",
258 [_IOC_NR(VIDIOC_TRY_EXT_CTRLS)] = "VIDIOC_TRY_EXT_CTRLS",
260 [_IOC_NR(VIDIOC_ENUM_FRAMESIZES)] = "VIDIOC_ENUM_FRAMESIZES",
261 [_IOC_NR(VIDIOC_ENUM_FRAMEINTERVALS)] = "VIDIOC_ENUM_FRAMEINTERVALS",
262 [_IOC_NR(VIDIOC_G_ENC_INDEX)] = "VIDIOC_G_ENC_INDEX",
263 [_IOC_NR(VIDIOC_ENCODER_CMD)] = "VIDIOC_ENCODER_CMD",
264 [_IOC_NR(VIDIOC_TRY_ENCODER_CMD)] = "VIDIOC_TRY_ENCODER_CMD",
266 [_IOC_NR(VIDIOC_DBG_S_REGISTER)] = "VIDIOC_DBG_S_REGISTER",
267 [_IOC_NR(VIDIOC_DBG_G_REGISTER)] = "VIDIOC_DBG_G_REGISTER",
269 [_IOC_NR(VIDIOC_DBG_G_CHIP_IDENT)] = "VIDIOC_DBG_G_CHIP_IDENT",
270 [_IOC_NR(VIDIOC_S_HW_FREQ_SEEK)] = "VIDIOC_S_HW_FREQ_SEEK",
273 #define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
275 static const char *v4l2_int_ioctls[] = {
276 #ifdef CONFIG_VIDEO_V4L1_COMPAT
277 [_IOC_NR(DECODER_GET_CAPABILITIES)] = "DECODER_GET_CAPABILITIES",
278 [_IOC_NR(DECODER_GET_STATUS)] = "DECODER_GET_STATUS",
279 [_IOC_NR(DECODER_SET_NORM)] = "DECODER_SET_NORM",
280 [_IOC_NR(DECODER_SET_INPUT)] = "DECODER_SET_INPUT",
281 [_IOC_NR(DECODER_SET_OUTPUT)] = "DECODER_SET_OUTPUT",
282 [_IOC_NR(DECODER_ENABLE_OUTPUT)] = "DECODER_ENABLE_OUTPUT",
283 [_IOC_NR(DECODER_SET_PICTURE)] = "DECODER_SET_PICTURE",
284 [_IOC_NR(DECODER_SET_GPIO)] = "DECODER_SET_GPIO",
285 [_IOC_NR(DECODER_INIT)] = "DECODER_INIT",
286 [_IOC_NR(DECODER_SET_VBI_BYPASS)] = "DECODER_SET_VBI_BYPASS",
287 [_IOC_NR(DECODER_DUMP)] = "DECODER_DUMP",
289 [_IOC_NR(AUDC_SET_RADIO)] = "AUDC_SET_RADIO",
291 [_IOC_NR(TUNER_SET_TYPE_ADDR)] = "TUNER_SET_TYPE_ADDR",
292 [_IOC_NR(TUNER_SET_STANDBY)] = "TUNER_SET_STANDBY",
293 [_IOC_NR(TUNER_SET_CONFIG)] = "TUNER_SET_CONFIG",
295 [_IOC_NR(VIDIOC_INT_S_TUNER_MODE)] = "VIDIOC_INT_S_TUNER_MODE",
296 [_IOC_NR(VIDIOC_INT_RESET)] = "VIDIOC_INT_RESET",
297 [_IOC_NR(VIDIOC_INT_AUDIO_CLOCK_FREQ)] = "VIDIOC_INT_AUDIO_CLOCK_FREQ",
298 [_IOC_NR(VIDIOC_INT_DECODE_VBI_LINE)] = "VIDIOC_INT_DECODE_VBI_LINE",
299 [_IOC_NR(VIDIOC_INT_S_VBI_DATA)] = "VIDIOC_INT_S_VBI_DATA",
300 [_IOC_NR(VIDIOC_INT_G_VBI_DATA)] = "VIDIOC_INT_G_VBI_DATA",
301 [_IOC_NR(VIDIOC_INT_I2S_CLOCK_FREQ)] = "VIDIOC_INT_I2S_CLOCK_FREQ",
302 [_IOC_NR(VIDIOC_INT_S_STANDBY)] = "VIDIOC_INT_S_STANDBY",
303 [_IOC_NR(VIDIOC_INT_S_AUDIO_ROUTING)] = "VIDIOC_INT_S_AUDIO_ROUTING",
304 [_IOC_NR(VIDIOC_INT_G_AUDIO_ROUTING)] = "VIDIOC_INT_G_AUDIO_ROUTING",
305 [_IOC_NR(VIDIOC_INT_S_VIDEO_ROUTING)] = "VIDIOC_INT_S_VIDEO_ROUTING",
306 [_IOC_NR(VIDIOC_INT_G_VIDEO_ROUTING)] = "VIDIOC_INT_G_VIDEO_ROUTING",
307 [_IOC_NR(VIDIOC_INT_S_CRYSTAL_FREQ)] = "VIDIOC_INT_S_CRYSTAL_FREQ",
308 [_IOC_NR(VIDIOC_INT_INIT)] = "VIDIOC_INT_INIT",
309 [_IOC_NR(VIDIOC_INT_G_STD_OUTPUT)] = "VIDIOC_INT_G_STD_OUTPUT",
310 [_IOC_NR(VIDIOC_INT_S_STD_OUTPUT)] = "VIDIOC_INT_S_STD_OUTPUT",
312 #define V4L2_INT_IOCTLS ARRAY_SIZE(v4l2_int_ioctls)
314 /* Common ioctl debug function. This function can be used by
315 external ioctl messages as well as internal V4L ioctl */
316 void v4l_printk_ioctl(unsigned int cmd)
320 switch (_IOC_TYPE(cmd)) {
322 if (_IOC_NR(cmd) >= V4L2_INT_IOCTLS) {
326 printk("%s", v4l2_int_ioctls[_IOC_NR(cmd)]);
328 #ifdef CONFIG_VIDEO_V4L1_COMPAT
330 if (_IOC_NR(cmd) >= V4L1_IOCTLS) {
334 printk("%s", v4l1_ioctls[_IOC_NR(cmd)]);
338 if (_IOC_NR(cmd) >= V4L2_IOCTLS) {
342 printk("%s", v4l2_ioctls[_IOC_NR(cmd)]);
348 switch (_IOC_DIR(cmd)) {
349 case _IOC_NONE: dir = "--"; break;
350 case _IOC_READ: dir = "r-"; break;
351 case _IOC_WRITE: dir = "-w"; break;
352 case _IOC_READ | _IOC_WRITE: dir = "rw"; break;
353 default: dir = "*ERR*"; break;
355 printk("%s ioctl '%c', dir=%s, #%d (0x%08x)",
356 type, _IOC_TYPE(cmd), dir, _IOC_NR(cmd), cmd);
358 EXPORT_SYMBOL(v4l_printk_ioctl);
361 * helper function -- handles userspace copying for ioctl arguments
366 video_fix_command(unsigned int cmd)
369 case VIDIOC_OVERLAY_OLD:
370 cmd = VIDIOC_OVERLAY;
372 case VIDIOC_S_PARM_OLD:
375 case VIDIOC_S_CTRL_OLD:
378 case VIDIOC_G_AUDIO_OLD:
379 cmd = VIDIOC_G_AUDIO;
381 case VIDIOC_G_AUDOUT_OLD:
382 cmd = VIDIOC_G_AUDOUT;
384 case VIDIOC_CROPCAP_OLD:
385 cmd = VIDIOC_CROPCAP;
393 * Obsolete usercopy function - Should be removed soon
396 video_usercopy(struct file *file, unsigned int cmd, unsigned long arg,
404 size_t ctrls_size = 0;
405 void __user *user_ptr = NULL;
408 cmd = video_fix_command(cmd);
410 is_ext_ctrl = (cmd == VIDIOC_S_EXT_CTRLS || cmd == VIDIOC_G_EXT_CTRLS ||
411 cmd == VIDIOC_TRY_EXT_CTRLS);
413 /* Copy arguments into temp kernel buffer */
414 switch (_IOC_DIR(cmd)) {
420 case (_IOC_WRITE | _IOC_READ):
421 if (_IOC_SIZE(cmd) <= sizeof(sbuf)) {
424 /* too big to allocate from stack */
425 mbuf = kmalloc(_IOC_SIZE(cmd), GFP_KERNEL);
432 if (_IOC_DIR(cmd) & _IOC_WRITE)
433 if (copy_from_user(parg, (void __user *)arg, _IOC_SIZE(cmd)))
438 struct v4l2_ext_controls *p = parg;
440 /* In case of an error, tell the caller that it wasn't
441 a specific control that caused it. */
442 p->error_idx = p->count;
443 user_ptr = (void __user *)p->controls;
445 ctrls_size = sizeof(struct v4l2_ext_control) * p->count;
446 /* Note: v4l2_ext_controls fits in sbuf[] so mbuf is still NULL. */
447 mbuf = kmalloc(ctrls_size, GFP_KERNEL);
452 if (copy_from_user(mbuf, user_ptr, ctrls_size))
459 err = func(file, cmd, parg);
460 if (err == -ENOIOCTLCMD)
463 struct v4l2_ext_controls *p = parg;
465 p->controls = (void *)user_ptr;
466 if (p->count && err == 0 && copy_to_user(user_ptr, mbuf, ctrls_size))
474 /* Copy results into user buffer */
475 switch (_IOC_DIR(cmd)) {
477 case (_IOC_WRITE | _IOC_READ):
478 if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd)))
487 EXPORT_SYMBOL(video_usercopy);
489 static void dbgbuf(unsigned int cmd, struct video_device *vfd,
490 struct v4l2_buffer *p)
492 struct v4l2_timecode *tc = &p->timecode;
494 dbgarg(cmd, "%02ld:%02d:%02d.%08ld index=%d, type=%s, "
495 "bytesused=%d, flags=0x%08d, "
496 "field=%0d, sequence=%d, memory=%s, offset/userptr=0x%08lx, length=%d\n",
497 p->timestamp.tv_sec / 3600,
498 (int)(p->timestamp.tv_sec / 60) % 60,
499 (int)(p->timestamp.tv_sec % 60),
500 (long)p->timestamp.tv_usec,
502 prt_names(p->type, v4l2_type_names),
503 p->bytesused, p->flags,
504 p->field, p->sequence,
505 prt_names(p->memory, v4l2_memory_names),
506 p->m.userptr, p->length);
507 dbgarg2("timecode=%02d:%02d:%02d type=%d, "
508 "flags=0x%08d, frames=%d, userbits=0x%08x\n",
509 tc->hours, tc->minutes, tc->seconds,
510 tc->type, tc->flags, tc->frames, *(__u32 *)tc->userbits);
513 static inline void dbgrect(struct video_device *vfd, char *s,
516 dbgarg2("%sRect start at %dx%d, size=%dx%d\n", s, r->left, r->top,
517 r->width, r->height);
520 static inline void v4l_print_pix_fmt(struct video_device *vfd,
521 struct v4l2_pix_format *fmt)
523 dbgarg2("width=%d, height=%d, format=%c%c%c%c, field=%s, "
524 "bytesperline=%d sizeimage=%d, colorspace=%d\n",
525 fmt->width, fmt->height,
526 (fmt->pixelformat & 0xff),
527 (fmt->pixelformat >> 8) & 0xff,
528 (fmt->pixelformat >> 16) & 0xff,
529 (fmt->pixelformat >> 24) & 0xff,
530 prt_names(fmt->field, v4l2_field_names),
531 fmt->bytesperline, fmt->sizeimage, fmt->colorspace);
534 static inline void v4l_print_ext_ctrls(unsigned int cmd,
535 struct video_device *vfd, struct v4l2_ext_controls *c, int show_vals)
539 if (!(vfd->debug & V4L2_DEBUG_IOCTL_ARG))
542 printk(KERN_CONT "class=0x%x", c->ctrl_class);
543 for (i = 0; i < c->count; i++) {
545 printk(KERN_CONT " id/val=0x%x/0x%x",
546 c->controls[i].id, c->controls[i].value);
548 printk(KERN_CONT " id=0x%x", c->controls[i].id);
550 printk(KERN_CONT "\n");
553 static inline int check_ext_ctrls(struct v4l2_ext_controls *c, int allow_priv)
557 /* zero the reserved fields */
558 c->reserved[0] = c->reserved[1] = 0;
559 for (i = 0; i < c->count; i++) {
560 c->controls[i].reserved2[0] = 0;
561 c->controls[i].reserved2[1] = 0;
563 /* V4L2_CID_PRIVATE_BASE cannot be used as control class
564 when using extended controls.
565 Only when passed in through VIDIOC_G_CTRL and VIDIOC_S_CTRL
566 is it allowed for backwards compatibility.
568 if (!allow_priv && c->ctrl_class == V4L2_CID_PRIVATE_BASE)
570 /* Check that all controls are from the same control class. */
571 for (i = 0; i < c->count; i++) {
572 if (V4L2_CTRL_ID2CLASS(c->controls[i].id) != c->ctrl_class) {
580 static int check_fmt(const struct v4l2_ioctl_ops *ops, enum v4l2_buf_type type)
586 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
587 if (ops->vidioc_try_fmt_vid_cap)
590 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
591 if (ops->vidioc_try_fmt_vid_overlay)
594 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
595 if (ops->vidioc_try_fmt_vid_out)
598 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
599 if (ops->vidioc_try_fmt_vid_out_overlay)
602 case V4L2_BUF_TYPE_VBI_CAPTURE:
603 if (ops->vidioc_try_fmt_vbi_cap)
606 case V4L2_BUF_TYPE_VBI_OUTPUT:
607 if (ops->vidioc_try_fmt_vbi_out)
610 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
611 if (ops->vidioc_try_fmt_sliced_vbi_cap)
614 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
615 if (ops->vidioc_try_fmt_sliced_vbi_out)
618 case V4L2_BUF_TYPE_PRIVATE:
619 if (ops->vidioc_try_fmt_type_private)
626 static long __video_do_ioctl(struct file *file,
627 unsigned int cmd, void *arg)
629 struct video_device *vfd = video_devdata(file);
630 const struct v4l2_ioctl_ops *ops = vfd->ioctl_ops;
631 void *fh = file->private_data;
634 if ((vfd->debug & V4L2_DEBUG_IOCTL) &&
635 !(vfd->debug & V4L2_DEBUG_IOCTL_ARG)) {
636 v4l_print_ioctl(vfd->name, cmd);
637 printk(KERN_CONT "\n");
641 printk(KERN_WARNING "videodev: \"%s\" has no ioctl_ops.\n",
646 #ifdef CONFIG_VIDEO_V4L1_COMPAT
647 /***********************************************************
648 Handles calls to the obsoleted V4L1 API
649 Due to the nature of VIDIOCGMBUF, each driver that supports
650 V4L1 should implement its own handler for this ioctl.
651 ***********************************************************/
653 /* --- streaming capture ------------------------------------- */
654 if (cmd == VIDIOCGMBUF) {
655 struct video_mbuf *p = arg;
657 memset(p, 0, sizeof(*p));
659 if (!ops->vidiocgmbuf)
661 ret = ops->vidiocgmbuf(file, fh, p);
663 dbgarg(cmd, "size=%d, frames=%d, offsets=0x%08lx\n",
665 (unsigned long)p->offsets);
669 /********************************************************
670 All other V4L1 calls are handled by v4l1_compat module.
671 Those calls will be translated into V4L2 calls, and
672 __video_do_ioctl will be called again, with one or more
674 ********************************************************/
675 if (_IOC_TYPE(cmd) == 'v' && _IOC_NR(cmd) < BASE_VIDIOCPRIVATE)
676 return v4l_compat_translate_ioctl(file, cmd, arg,
681 /* --- capabilities ------------------------------------------ */
682 case VIDIOC_QUERYCAP:
684 struct v4l2_capability *cap = (struct v4l2_capability *)arg;
685 memset(cap, 0, sizeof(*cap));
687 if (!ops->vidioc_querycap)
690 ret = ops->vidioc_querycap(file, fh, cap);
692 dbgarg(cmd, "driver=%s, card=%s, bus=%s, "
694 "capabilities=0x%08x\n",
695 cap->driver, cap->card, cap->bus_info,
701 /* --- priority ------------------------------------------ */
702 case VIDIOC_G_PRIORITY:
704 enum v4l2_priority *p = arg;
706 if (!ops->vidioc_g_priority)
708 ret = ops->vidioc_g_priority(file, fh, p);
710 dbgarg(cmd, "priority is %d\n", *p);
713 case VIDIOC_S_PRIORITY:
715 enum v4l2_priority *p = arg;
717 if (!ops->vidioc_s_priority)
719 dbgarg(cmd, "setting priority to %d\n", *p);
720 ret = ops->vidioc_s_priority(file, fh, *p);
724 /* --- capture ioctls ---------------------------------------- */
725 case VIDIOC_ENUM_FMT:
727 struct v4l2_fmtdesc *f = arg;
728 enum v4l2_buf_type type;
733 memset(f, 0, sizeof(*f));
738 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
739 if (ops->vidioc_enum_fmt_vid_cap)
740 ret = ops->vidioc_enum_fmt_vid_cap(file, fh, f);
742 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
743 if (ops->vidioc_enum_fmt_vid_overlay)
744 ret = ops->vidioc_enum_fmt_vid_overlay(file,
747 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
748 if (ops->vidioc_enum_fmt_vid_out)
749 ret = ops->vidioc_enum_fmt_vid_out(file, fh, f);
751 case V4L2_BUF_TYPE_PRIVATE:
752 if (ops->vidioc_enum_fmt_type_private)
753 ret = ops->vidioc_enum_fmt_type_private(file,
760 dbgarg(cmd, "index=%d, type=%d, flags=%d, "
761 "pixelformat=%c%c%c%c, description='%s'\n",
762 f->index, f->type, f->flags,
763 (f->pixelformat & 0xff),
764 (f->pixelformat >> 8) & 0xff,
765 (f->pixelformat >> 16) & 0xff,
766 (f->pixelformat >> 24) & 0xff,
772 struct v4l2_format *f = (struct v4l2_format *)arg;
774 memset(f->fmt.raw_data, 0, sizeof(f->fmt.raw_data));
776 /* FIXME: Should be one dump per type */
777 dbgarg(cmd, "type=%s\n", prt_names(f->type, v4l2_type_names));
780 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
781 if (ops->vidioc_g_fmt_vid_cap)
782 ret = ops->vidioc_g_fmt_vid_cap(file, fh, f);
784 v4l_print_pix_fmt(vfd, &f->fmt.pix);
786 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
787 if (ops->vidioc_g_fmt_vid_overlay)
788 ret = ops->vidioc_g_fmt_vid_overlay(file,
791 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
792 if (ops->vidioc_g_fmt_vid_out)
793 ret = ops->vidioc_g_fmt_vid_out(file, fh, f);
795 v4l_print_pix_fmt(vfd, &f->fmt.pix);
797 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
798 if (ops->vidioc_g_fmt_vid_out_overlay)
799 ret = ops->vidioc_g_fmt_vid_out_overlay(file,
802 case V4L2_BUF_TYPE_VBI_CAPTURE:
803 if (ops->vidioc_g_fmt_vbi_cap)
804 ret = ops->vidioc_g_fmt_vbi_cap(file, fh, f);
806 case V4L2_BUF_TYPE_VBI_OUTPUT:
807 if (ops->vidioc_g_fmt_vbi_out)
808 ret = ops->vidioc_g_fmt_vbi_out(file, fh, f);
810 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
811 if (ops->vidioc_g_fmt_sliced_vbi_cap)
812 ret = ops->vidioc_g_fmt_sliced_vbi_cap(file,
815 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
816 if (ops->vidioc_g_fmt_sliced_vbi_out)
817 ret = ops->vidioc_g_fmt_sliced_vbi_out(file,
820 case V4L2_BUF_TYPE_PRIVATE:
821 if (ops->vidioc_g_fmt_type_private)
822 ret = ops->vidioc_g_fmt_type_private(file,
831 struct v4l2_format *f = (struct v4l2_format *)arg;
833 /* FIXME: Should be one dump per type */
834 dbgarg(cmd, "type=%s\n", prt_names(f->type, v4l2_type_names));
837 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
838 v4l_print_pix_fmt(vfd, &f->fmt.pix);
839 if (ops->vidioc_s_fmt_vid_cap)
840 ret = ops->vidioc_s_fmt_vid_cap(file, fh, f);
842 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
843 if (ops->vidioc_s_fmt_vid_overlay)
844 ret = ops->vidioc_s_fmt_vid_overlay(file,
847 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
848 v4l_print_pix_fmt(vfd, &f->fmt.pix);
849 if (ops->vidioc_s_fmt_vid_out)
850 ret = ops->vidioc_s_fmt_vid_out(file, fh, f);
852 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
853 if (ops->vidioc_s_fmt_vid_out_overlay)
854 ret = ops->vidioc_s_fmt_vid_out_overlay(file,
857 case V4L2_BUF_TYPE_VBI_CAPTURE:
858 if (ops->vidioc_s_fmt_vbi_cap)
859 ret = ops->vidioc_s_fmt_vbi_cap(file, fh, f);
861 case V4L2_BUF_TYPE_VBI_OUTPUT:
862 if (ops->vidioc_s_fmt_vbi_out)
863 ret = ops->vidioc_s_fmt_vbi_out(file, fh, f);
865 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
866 if (ops->vidioc_s_fmt_sliced_vbi_cap)
867 ret = ops->vidioc_s_fmt_sliced_vbi_cap(file,
870 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
871 if (ops->vidioc_s_fmt_sliced_vbi_out)
872 ret = ops->vidioc_s_fmt_sliced_vbi_out(file,
875 case V4L2_BUF_TYPE_PRIVATE:
876 if (ops->vidioc_s_fmt_type_private)
877 ret = ops->vidioc_s_fmt_type_private(file,
885 struct v4l2_format *f = (struct v4l2_format *)arg;
887 /* FIXME: Should be one dump per type */
888 dbgarg(cmd, "type=%s\n", prt_names(f->type,
891 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
892 if (ops->vidioc_try_fmt_vid_cap)
893 ret = ops->vidioc_try_fmt_vid_cap(file, fh, f);
895 v4l_print_pix_fmt(vfd, &f->fmt.pix);
897 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
898 if (ops->vidioc_try_fmt_vid_overlay)
899 ret = ops->vidioc_try_fmt_vid_overlay(file,
902 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
903 if (ops->vidioc_try_fmt_vid_out)
904 ret = ops->vidioc_try_fmt_vid_out(file, fh, f);
906 v4l_print_pix_fmt(vfd, &f->fmt.pix);
908 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
909 if (ops->vidioc_try_fmt_vid_out_overlay)
910 ret = ops->vidioc_try_fmt_vid_out_overlay(file,
913 case V4L2_BUF_TYPE_VBI_CAPTURE:
914 if (ops->vidioc_try_fmt_vbi_cap)
915 ret = ops->vidioc_try_fmt_vbi_cap(file, fh, f);
917 case V4L2_BUF_TYPE_VBI_OUTPUT:
918 if (ops->vidioc_try_fmt_vbi_out)
919 ret = ops->vidioc_try_fmt_vbi_out(file, fh, f);
921 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
922 if (ops->vidioc_try_fmt_sliced_vbi_cap)
923 ret = ops->vidioc_try_fmt_sliced_vbi_cap(file,
926 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
927 if (ops->vidioc_try_fmt_sliced_vbi_out)
928 ret = ops->vidioc_try_fmt_sliced_vbi_out(file,
931 case V4L2_BUF_TYPE_PRIVATE:
932 if (ops->vidioc_try_fmt_type_private)
933 ret = ops->vidioc_try_fmt_type_private(file,
940 /* FIXME: Those buf reqs could be handled here,
941 with some changes on videobuf to allow its header to be included at
942 videodev2.h or being merged at videodev2.
946 struct v4l2_requestbuffers *p = arg;
948 if (!ops->vidioc_reqbufs)
950 ret = check_fmt(ops, p->type);
954 ret = ops->vidioc_reqbufs(file, fh, p);
955 dbgarg(cmd, "count=%d, type=%s, memory=%s\n",
957 prt_names(p->type, v4l2_type_names),
958 prt_names(p->memory, v4l2_memory_names));
961 case VIDIOC_QUERYBUF:
963 struct v4l2_buffer *p = arg;
965 if (!ops->vidioc_querybuf)
967 ret = check_fmt(ops, p->type);
971 ret = ops->vidioc_querybuf(file, fh, p);
978 struct v4l2_buffer *p = arg;
980 if (!ops->vidioc_qbuf)
982 ret = check_fmt(ops, p->type);
986 ret = ops->vidioc_qbuf(file, fh, p);
993 struct v4l2_buffer *p = arg;
995 if (!ops->vidioc_dqbuf)
997 ret = check_fmt(ops, p->type);
1001 ret = ops->vidioc_dqbuf(file, fh, p);
1003 dbgbuf(cmd, vfd, p);
1006 case VIDIOC_OVERLAY:
1010 if (!ops->vidioc_overlay)
1012 dbgarg(cmd, "value=%d\n", *i);
1013 ret = ops->vidioc_overlay(file, fh, *i);
1018 struct v4l2_framebuffer *p = arg;
1020 if (!ops->vidioc_g_fbuf)
1022 ret = ops->vidioc_g_fbuf(file, fh, arg);
1024 dbgarg(cmd, "capability=0x%x, flags=%d, base=0x%08lx\n",
1025 p->capability, p->flags,
1026 (unsigned long)p->base);
1027 v4l_print_pix_fmt(vfd, &p->fmt);
1033 struct v4l2_framebuffer *p = arg;
1035 if (!ops->vidioc_s_fbuf)
1037 dbgarg(cmd, "capability=0x%x, flags=%d, base=0x%08lx\n",
1038 p->capability, p->flags, (unsigned long)p->base);
1039 v4l_print_pix_fmt(vfd, &p->fmt);
1040 ret = ops->vidioc_s_fbuf(file, fh, arg);
1043 case VIDIOC_STREAMON:
1045 enum v4l2_buf_type i = *(int *)arg;
1047 if (!ops->vidioc_streamon)
1049 dbgarg(cmd, "type=%s\n", prt_names(i, v4l2_type_names));
1050 ret = ops->vidioc_streamon(file, fh, i);
1053 case VIDIOC_STREAMOFF:
1055 enum v4l2_buf_type i = *(int *)arg;
1057 if (!ops->vidioc_streamoff)
1059 dbgarg(cmd, "type=%s\n", prt_names(i, v4l2_type_names));
1060 ret = ops->vidioc_streamoff(file, fh, i);
1063 /* ---------- tv norms ---------- */
1064 case VIDIOC_ENUMSTD:
1066 struct v4l2_standard *p = arg;
1067 v4l2_std_id id = vfd->tvnorms, curr_id = 0;
1068 unsigned int index = p->index, i, j = 0;
1069 const char *descr = "";
1071 /* Return norm array in a canonical way */
1072 for (i = 0; i <= index && id; i++) {
1073 /* last std value in the standards array is 0, so this
1074 while always ends there since (id & 0) == 0. */
1075 while ((id & standards[j].std) != standards[j].std)
1077 curr_id = standards[j].std;
1078 descr = standards[j].descr;
1082 if (curr_id != V4L2_STD_PAL &&
1083 curr_id != V4L2_STD_SECAM &&
1084 curr_id != V4L2_STD_NTSC)
1090 v4l2_video_std_construct(p, curr_id, descr);
1093 dbgarg(cmd, "index=%d, id=0x%Lx, name=%s, fps=%d/%d, "
1094 "framelines=%d\n", p->index,
1095 (unsigned long long)p->id, p->name,
1096 p->frameperiod.numerator,
1097 p->frameperiod.denominator,
1105 v4l2_std_id *id = arg;
1108 /* Calls the specific handler */
1109 if (ops->vidioc_g_std)
1110 ret = ops->vidioc_g_std(file, fh, id);
1112 *id = vfd->current_norm;
1115 dbgarg(cmd, "std=0x%08Lx\n", (long long unsigned)*id);
1120 v4l2_std_id *id = arg, norm;
1122 dbgarg(cmd, "std=%08Lx\n", (long long unsigned)*id);
1124 norm = (*id) & vfd->tvnorms;
1125 if (vfd->tvnorms && !norm) /* Check if std is supported */
1128 /* Calls the specific handler */
1129 if (ops->vidioc_s_std)
1130 ret = ops->vidioc_s_std(file, fh, &norm);
1134 /* Updates standard information */
1136 vfd->current_norm = norm;
1139 case VIDIOC_QUERYSTD:
1141 v4l2_std_id *p = arg;
1143 if (!ops->vidioc_querystd)
1145 ret = ops->vidioc_querystd(file, fh, arg);
1147 dbgarg(cmd, "detected std=%08Lx\n",
1148 (unsigned long long)*p);
1151 /* ------ input switching ---------- */
1152 /* FIXME: Inputs can be handled inside videodev2 */
1153 case VIDIOC_ENUMINPUT:
1155 struct v4l2_input *p = arg;
1158 if (!ops->vidioc_enum_input)
1160 memset(p, 0, sizeof(*p));
1163 ret = ops->vidioc_enum_input(file, fh, p);
1165 dbgarg(cmd, "index=%d, name=%s, type=%d, "
1167 "tuner=%d, std=%08Lx, status=%d\n",
1168 p->index, p->name, p->type, p->audioset,
1170 (unsigned long long)p->std,
1174 case VIDIOC_G_INPUT:
1176 unsigned int *i = arg;
1178 if (!ops->vidioc_g_input)
1180 ret = ops->vidioc_g_input(file, fh, i);
1182 dbgarg(cmd, "value=%d\n", *i);
1185 case VIDIOC_S_INPUT:
1187 unsigned int *i = arg;
1189 if (!ops->vidioc_s_input)
1191 dbgarg(cmd, "value=%d\n", *i);
1192 ret = ops->vidioc_s_input(file, fh, *i);
1196 /* ------ output switching ---------- */
1197 case VIDIOC_ENUMOUTPUT:
1199 struct v4l2_output *p = arg;
1202 if (!ops->vidioc_enum_output)
1204 memset(p, 0, sizeof(*p));
1207 ret = ops->vidioc_enum_output(file, fh, p);
1209 dbgarg(cmd, "index=%d, name=%s, type=%d, "
1211 "modulator=%d, std=0x%08Lx\n",
1212 p->index, p->name, p->type, p->audioset,
1213 p->modulator, (unsigned long long)p->std);
1216 case VIDIOC_G_OUTPUT:
1218 unsigned int *i = arg;
1220 if (!ops->vidioc_g_output)
1222 ret = ops->vidioc_g_output(file, fh, i);
1224 dbgarg(cmd, "value=%d\n", *i);
1227 case VIDIOC_S_OUTPUT:
1229 unsigned int *i = arg;
1231 if (!ops->vidioc_s_output)
1233 dbgarg(cmd, "value=%d\n", *i);
1234 ret = ops->vidioc_s_output(file, fh, *i);
1238 /* --- controls ---------------------------------------------- */
1239 case VIDIOC_QUERYCTRL:
1241 struct v4l2_queryctrl *p = arg;
1243 if (!ops->vidioc_queryctrl)
1245 ret = ops->vidioc_queryctrl(file, fh, p);
1247 dbgarg(cmd, "id=0x%x, type=%d, name=%s, min/max=%d/%d, "
1248 "step=%d, default=%d, flags=0x%08x\n",
1249 p->id, p->type, p->name,
1250 p->minimum, p->maximum,
1251 p->step, p->default_value, p->flags);
1253 dbgarg(cmd, "id=0x%x\n", p->id);
1258 struct v4l2_control *p = arg;
1260 if (ops->vidioc_g_ctrl)
1261 ret = ops->vidioc_g_ctrl(file, fh, p);
1262 else if (ops->vidioc_g_ext_ctrls) {
1263 struct v4l2_ext_controls ctrls;
1264 struct v4l2_ext_control ctrl;
1266 ctrls.ctrl_class = V4L2_CTRL_ID2CLASS(p->id);
1268 ctrls.controls = &ctrl;
1270 ctrl.value = p->value;
1271 if (check_ext_ctrls(&ctrls, 1)) {
1272 ret = ops->vidioc_g_ext_ctrls(file, fh, &ctrls);
1274 p->value = ctrl.value;
1279 dbgarg(cmd, "id=0x%x, value=%d\n", p->id, p->value);
1281 dbgarg(cmd, "id=0x%x\n", p->id);
1286 struct v4l2_control *p = arg;
1287 struct v4l2_ext_controls ctrls;
1288 struct v4l2_ext_control ctrl;
1290 if (!ops->vidioc_s_ctrl && !ops->vidioc_s_ext_ctrls)
1293 dbgarg(cmd, "id=0x%x, value=%d\n", p->id, p->value);
1295 if (ops->vidioc_s_ctrl) {
1296 ret = ops->vidioc_s_ctrl(file, fh, p);
1299 if (!ops->vidioc_s_ext_ctrls)
1302 ctrls.ctrl_class = V4L2_CTRL_ID2CLASS(p->id);
1304 ctrls.controls = &ctrl;
1306 ctrl.value = p->value;
1307 if (check_ext_ctrls(&ctrls, 1))
1308 ret = ops->vidioc_s_ext_ctrls(file, fh, &ctrls);
1311 case VIDIOC_G_EXT_CTRLS:
1313 struct v4l2_ext_controls *p = arg;
1315 p->error_idx = p->count;
1316 if (!ops->vidioc_g_ext_ctrls)
1318 if (check_ext_ctrls(p, 0))
1319 ret = ops->vidioc_g_ext_ctrls(file, fh, p);
1320 v4l_print_ext_ctrls(cmd, vfd, p, !ret);
1323 case VIDIOC_S_EXT_CTRLS:
1325 struct v4l2_ext_controls *p = arg;
1327 p->error_idx = p->count;
1328 if (!ops->vidioc_s_ext_ctrls)
1330 v4l_print_ext_ctrls(cmd, vfd, p, 1);
1331 if (check_ext_ctrls(p, 0))
1332 ret = ops->vidioc_s_ext_ctrls(file, fh, p);
1335 case VIDIOC_TRY_EXT_CTRLS:
1337 struct v4l2_ext_controls *p = arg;
1339 p->error_idx = p->count;
1340 if (!ops->vidioc_try_ext_ctrls)
1342 v4l_print_ext_ctrls(cmd, vfd, p, 1);
1343 if (check_ext_ctrls(p, 0))
1344 ret = ops->vidioc_try_ext_ctrls(file, fh, p);
1347 case VIDIOC_QUERYMENU:
1349 struct v4l2_querymenu *p = arg;
1351 if (!ops->vidioc_querymenu)
1353 ret = ops->vidioc_querymenu(file, fh, p);
1355 dbgarg(cmd, "id=0x%x, index=%d, name=%s\n",
1356 p->id, p->index, p->name);
1358 dbgarg(cmd, "id=0x%x, index=%d\n",
1362 /* --- audio ---------------------------------------------- */
1363 case VIDIOC_ENUMAUDIO:
1365 struct v4l2_audio *p = arg;
1367 if (!ops->vidioc_enumaudio)
1369 ret = ops->vidioc_enumaudio(file, fh, p);
1371 dbgarg(cmd, "index=%d, name=%s, capability=0x%x, "
1372 "mode=0x%x\n", p->index, p->name,
1373 p->capability, p->mode);
1375 dbgarg(cmd, "index=%d\n", p->index);
1378 case VIDIOC_G_AUDIO:
1380 struct v4l2_audio *p = arg;
1381 __u32 index = p->index;
1383 if (!ops->vidioc_g_audio)
1386 memset(p, 0, sizeof(*p));
1388 ret = ops->vidioc_g_audio(file, fh, p);
1390 dbgarg(cmd, "index=%d, name=%s, capability=0x%x, "
1391 "mode=0x%x\n", p->index,
1392 p->name, p->capability, p->mode);
1394 dbgarg(cmd, "index=%d\n", p->index);
1397 case VIDIOC_S_AUDIO:
1399 struct v4l2_audio *p = arg;
1401 if (!ops->vidioc_s_audio)
1403 dbgarg(cmd, "index=%d, name=%s, capability=0x%x, "
1404 "mode=0x%x\n", p->index, p->name,
1405 p->capability, p->mode);
1406 ret = ops->vidioc_s_audio(file, fh, p);
1409 case VIDIOC_ENUMAUDOUT:
1411 struct v4l2_audioout *p = arg;
1413 if (!ops->vidioc_enumaudout)
1415 dbgarg(cmd, "Enum for index=%d\n", p->index);
1416 ret = ops->vidioc_enumaudout(file, fh, p);
1418 dbgarg2("index=%d, name=%s, capability=%d, "
1419 "mode=%d\n", p->index, p->name,
1420 p->capability, p->mode);
1423 case VIDIOC_G_AUDOUT:
1425 struct v4l2_audioout *p = arg;
1427 if (!ops->vidioc_g_audout)
1429 dbgarg(cmd, "Enum for index=%d\n", p->index);
1430 ret = ops->vidioc_g_audout(file, fh, p);
1432 dbgarg2("index=%d, name=%s, capability=%d, "
1433 "mode=%d\n", p->index, p->name,
1434 p->capability, p->mode);
1437 case VIDIOC_S_AUDOUT:
1439 struct v4l2_audioout *p = arg;
1441 if (!ops->vidioc_s_audout)
1443 dbgarg(cmd, "index=%d, name=%s, capability=%d, "
1444 "mode=%d\n", p->index, p->name,
1445 p->capability, p->mode);
1447 ret = ops->vidioc_s_audout(file, fh, p);
1450 case VIDIOC_G_MODULATOR:
1452 struct v4l2_modulator *p = arg;
1454 if (!ops->vidioc_g_modulator)
1456 ret = ops->vidioc_g_modulator(file, fh, p);
1458 dbgarg(cmd, "index=%d, name=%s, "
1459 "capability=%d, rangelow=%d,"
1460 " rangehigh=%d, txsubchans=%d\n",
1461 p->index, p->name, p->capability,
1462 p->rangelow, p->rangehigh,
1466 case VIDIOC_S_MODULATOR:
1468 struct v4l2_modulator *p = arg;
1470 if (!ops->vidioc_s_modulator)
1472 dbgarg(cmd, "index=%d, name=%s, capability=%d, "
1473 "rangelow=%d, rangehigh=%d, txsubchans=%d\n",
1474 p->index, p->name, p->capability, p->rangelow,
1475 p->rangehigh, p->txsubchans);
1476 ret = ops->vidioc_s_modulator(file, fh, p);
1481 struct v4l2_crop *p = arg;
1484 if (!ops->vidioc_g_crop)
1488 memset(p, 0, sizeof(*p));
1491 dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names));
1492 ret = ops->vidioc_g_crop(file, fh, p);
1494 dbgrect(vfd, "", &p->c);
1499 struct v4l2_crop *p = arg;
1501 if (!ops->vidioc_s_crop)
1503 dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names));
1504 dbgrect(vfd, "", &p->c);
1505 ret = ops->vidioc_s_crop(file, fh, p);
1508 case VIDIOC_CROPCAP:
1510 struct v4l2_cropcap *p = arg;
1513 /*FIXME: Should also show v4l2_fract pixelaspect */
1514 if (!ops->vidioc_cropcap)
1518 memset(p, 0, sizeof(*p));
1521 dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names));
1522 ret = ops->vidioc_cropcap(file, fh, p);
1524 dbgrect(vfd, "bounds ", &p->bounds);
1525 dbgrect(vfd, "defrect ", &p->defrect);
1529 case VIDIOC_G_JPEGCOMP:
1531 struct v4l2_jpegcompression *p = arg;
1533 if (!ops->vidioc_g_jpegcomp)
1536 memset(p, 0, sizeof(*p));
1538 ret = ops->vidioc_g_jpegcomp(file, fh, p);
1540 dbgarg(cmd, "quality=%d, APPn=%d, "
1541 "APP_len=%d, COM_len=%d, "
1542 "jpeg_markers=%d\n",
1543 p->quality, p->APPn, p->APP_len,
1544 p->COM_len, p->jpeg_markers);
1547 case VIDIOC_S_JPEGCOMP:
1549 struct v4l2_jpegcompression *p = arg;
1551 if (!ops->vidioc_g_jpegcomp)
1553 dbgarg(cmd, "quality=%d, APPn=%d, APP_len=%d, "
1554 "COM_len=%d, jpeg_markers=%d\n",
1555 p->quality, p->APPn, p->APP_len,
1556 p->COM_len, p->jpeg_markers);
1557 ret = ops->vidioc_s_jpegcomp(file, fh, p);
1560 case VIDIOC_G_ENC_INDEX:
1562 struct v4l2_enc_idx *p = arg;
1564 if (!ops->vidioc_g_enc_index)
1566 ret = ops->vidioc_g_enc_index(file, fh, p);
1568 dbgarg(cmd, "entries=%d, entries_cap=%d\n",
1569 p->entries, p->entries_cap);
1572 case VIDIOC_ENCODER_CMD:
1574 struct v4l2_encoder_cmd *p = arg;
1576 if (!ops->vidioc_encoder_cmd)
1578 memset(&p->raw, 0, sizeof(p->raw));
1579 ret = ops->vidioc_encoder_cmd(file, fh, p);
1581 dbgarg(cmd, "cmd=%d, flags=%x\n", p->cmd, p->flags);
1584 case VIDIOC_TRY_ENCODER_CMD:
1586 struct v4l2_encoder_cmd *p = arg;
1588 if (!ops->vidioc_try_encoder_cmd)
1590 memset(&p->raw, 0, sizeof(p->raw));
1591 ret = ops->vidioc_try_encoder_cmd(file, fh, p);
1593 dbgarg(cmd, "cmd=%d, flags=%x\n", p->cmd, p->flags);
1598 struct v4l2_streamparm *p = arg;
1599 __u32 type = p->type;
1601 memset(p, 0, sizeof(*p));
1604 if (ops->vidioc_g_parm) {
1605 ret = ops->vidioc_g_parm(file, fh, p);
1607 struct v4l2_standard s;
1609 if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1612 v4l2_video_std_construct(&s, vfd->current_norm,
1613 v4l2_norm_to_name(vfd->current_norm));
1615 p->parm.capture.timeperframe = s.frameperiod;
1619 dbgarg(cmd, "type=%d\n", p->type);
1624 struct v4l2_streamparm *p = arg;
1626 if (!ops->vidioc_s_parm)
1628 dbgarg(cmd, "type=%d\n", p->type);
1629 ret = ops->vidioc_s_parm(file, fh, p);
1632 case VIDIOC_G_TUNER:
1634 struct v4l2_tuner *p = arg;
1635 __u32 index = p->index;
1637 if (!ops->vidioc_g_tuner)
1640 memset(p, 0, sizeof(*p));
1643 ret = ops->vidioc_g_tuner(file, fh, p);
1645 dbgarg(cmd, "index=%d, name=%s, type=%d, "
1646 "capability=0x%x, rangelow=%d, "
1647 "rangehigh=%d, signal=%d, afc=%d, "
1648 "rxsubchans=0x%x, audmode=%d\n",
1649 p->index, p->name, p->type,
1650 p->capability, p->rangelow,
1651 p->rangehigh, p->signal, p->afc,
1652 p->rxsubchans, p->audmode);
1655 case VIDIOC_S_TUNER:
1657 struct v4l2_tuner *p = arg;
1659 if (!ops->vidioc_s_tuner)
1661 dbgarg(cmd, "index=%d, name=%s, type=%d, "
1662 "capability=0x%x, rangelow=%d, "
1663 "rangehigh=%d, signal=%d, afc=%d, "
1664 "rxsubchans=0x%x, audmode=%d\n",
1665 p->index, p->name, p->type,
1666 p->capability, p->rangelow,
1667 p->rangehigh, p->signal, p->afc,
1668 p->rxsubchans, p->audmode);
1669 ret = ops->vidioc_s_tuner(file, fh, p);
1672 case VIDIOC_G_FREQUENCY:
1674 struct v4l2_frequency *p = arg;
1676 if (!ops->vidioc_g_frequency)
1679 memset(p->reserved, 0, sizeof(p->reserved));
1681 ret = ops->vidioc_g_frequency(file, fh, p);
1683 dbgarg(cmd, "tuner=%d, type=%d, frequency=%d\n",
1684 p->tuner, p->type, p->frequency);
1687 case VIDIOC_S_FREQUENCY:
1689 struct v4l2_frequency *p = arg;
1691 if (!ops->vidioc_s_frequency)
1693 dbgarg(cmd, "tuner=%d, type=%d, frequency=%d\n",
1694 p->tuner, p->type, p->frequency);
1695 ret = ops->vidioc_s_frequency(file, fh, p);
1698 case VIDIOC_G_SLICED_VBI_CAP:
1700 struct v4l2_sliced_vbi_cap *p = arg;
1701 __u32 type = p->type;
1703 if (!ops->vidioc_g_sliced_vbi_cap)
1705 memset(p, 0, sizeof(*p));
1707 dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names));
1708 ret = ops->vidioc_g_sliced_vbi_cap(file, fh, p);
1710 dbgarg2("service_set=%d\n", p->service_set);
1713 case VIDIOC_LOG_STATUS:
1715 if (!ops->vidioc_log_status)
1717 ret = ops->vidioc_log_status(file, fh);
1720 #ifdef CONFIG_VIDEO_ADV_DEBUG
1721 case VIDIOC_DBG_G_REGISTER:
1723 struct v4l2_dbg_register *p = arg;
1725 if (!capable(CAP_SYS_ADMIN))
1727 else if (ops->vidioc_g_register)
1728 ret = ops->vidioc_g_register(file, fh, p);
1731 case VIDIOC_DBG_S_REGISTER:
1733 struct v4l2_dbg_register *p = arg;
1735 if (!capable(CAP_SYS_ADMIN))
1737 else if (ops->vidioc_s_register)
1738 ret = ops->vidioc_s_register(file, fh, p);
1742 case VIDIOC_DBG_G_CHIP_IDENT:
1744 struct v4l2_dbg_chip_ident *p = arg;
1746 if (!ops->vidioc_g_chip_ident)
1748 ret = ops->vidioc_g_chip_ident(file, fh, p);
1750 dbgarg(cmd, "chip_ident=%u, revision=0x%x\n", p->ident, p->revision);
1753 case VIDIOC_G_CHIP_IDENT_OLD:
1754 printk(KERN_ERR "VIDIOC_G_CHIP_IDENT has been deprecated and will disappear in 2.6.30.\n");
1755 printk(KERN_ERR "It is a debugging ioctl and must not be used in applications!\n");
1758 case VIDIOC_S_HW_FREQ_SEEK:
1760 struct v4l2_hw_freq_seek *p = arg;
1762 if (!ops->vidioc_s_hw_freq_seek)
1765 "tuner=%d, type=%d, seek_upward=%d, wrap_around=%d\n",
1766 p->tuner, p->type, p->seek_upward, p->wrap_around);
1767 ret = ops->vidioc_s_hw_freq_seek(file, fh, p);
1770 case VIDIOC_ENUM_FRAMESIZES:
1772 struct v4l2_frmsizeenum *p = arg;
1774 if (!ops->vidioc_enum_framesizes)
1777 memset(p, 0, sizeof(*p));
1779 ret = ops->vidioc_enum_framesizes(file, fh, p);
1781 "index=%d, pixelformat=%d, type=%d ",
1782 p->index, p->pixel_format, p->type);
1784 case V4L2_FRMSIZE_TYPE_DISCRETE:
1785 dbgarg2("width = %d, height=%d\n",
1786 p->discrete.width, p->discrete.height);
1788 case V4L2_FRMSIZE_TYPE_STEPWISE:
1789 dbgarg2("min %dx%d, max %dx%d, step %dx%d\n",
1790 p->stepwise.min_width, p->stepwise.min_height,
1791 p->stepwise.step_width, p->stepwise.step_height,
1792 p->stepwise.max_width, p->stepwise.max_height);
1794 case V4L2_FRMSIZE_TYPE_CONTINUOUS:
1795 dbgarg2("continuous\n");
1798 dbgarg2("- Unknown type!\n");
1803 case VIDIOC_ENUM_FRAMEINTERVALS:
1805 struct v4l2_frmivalenum *p = arg;
1807 if (!ops->vidioc_enum_frameintervals)
1810 memset(p, 0, sizeof(*p));
1812 ret = ops->vidioc_enum_frameintervals(file, fh, p);
1814 "index=%d, pixelformat=%d, width=%d, height=%d, type=%d ",
1815 p->index, p->pixel_format,
1816 p->width, p->height, p->type);
1818 case V4L2_FRMIVAL_TYPE_DISCRETE:
1819 dbgarg2("fps=%d/%d\n",
1820 p->discrete.numerator,
1821 p->discrete.denominator);
1823 case V4L2_FRMIVAL_TYPE_STEPWISE:
1824 dbgarg2("min=%d/%d, max=%d/%d, step=%d/%d\n",
1825 p->stepwise.min.numerator,
1826 p->stepwise.min.denominator,
1827 p->stepwise.max.numerator,
1828 p->stepwise.max.denominator,
1829 p->stepwise.step.numerator,
1830 p->stepwise.step.denominator);
1832 case V4L2_FRMIVAL_TYPE_CONTINUOUS:
1833 dbgarg2("continuous\n");
1836 dbgarg2("- Unknown type!\n");
1843 if (!ops->vidioc_default)
1845 ret = ops->vidioc_default(file, fh, cmd, arg);
1850 if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) {
1852 v4l_print_ioctl(vfd->name, cmd);
1853 printk(KERN_CONT " error %ld\n", ret);
1860 long video_ioctl2(struct file *file,
1861 unsigned int cmd, unsigned long arg)
1868 size_t ctrls_size = 0;
1869 void __user *user_ptr = NULL;
1871 #ifdef __OLD_VIDIOC_
1872 cmd = video_fix_command(cmd);
1874 is_ext_ctrl = (cmd == VIDIOC_S_EXT_CTRLS || cmd == VIDIOC_G_EXT_CTRLS ||
1875 cmd == VIDIOC_TRY_EXT_CTRLS);
1877 /* Copy arguments into temp kernel buffer */
1878 switch (_IOC_DIR(cmd)) {
1884 case (_IOC_WRITE | _IOC_READ):
1885 if (_IOC_SIZE(cmd) <= sizeof(sbuf)) {
1888 /* too big to allocate from stack */
1889 mbuf = kmalloc(_IOC_SIZE(cmd), GFP_KERNEL);
1896 if (_IOC_DIR(cmd) & _IOC_WRITE)
1897 if (copy_from_user(parg, (void __user *)arg, _IOC_SIZE(cmd)))
1903 struct v4l2_ext_controls *p = parg;
1905 /* In case of an error, tell the caller that it wasn't
1906 a specific control that caused it. */
1907 p->error_idx = p->count;
1908 user_ptr = (void __user *)p->controls;
1910 ctrls_size = sizeof(struct v4l2_ext_control) * p->count;
1911 /* Note: v4l2_ext_controls fits in sbuf[] so mbuf is still NULL. */
1912 mbuf = kmalloc(ctrls_size, GFP_KERNEL);
1917 if (copy_from_user(mbuf, user_ptr, ctrls_size))
1924 err = __video_do_ioctl(file, cmd, parg);
1925 if (err == -ENOIOCTLCMD)
1928 struct v4l2_ext_controls *p = parg;
1930 p->controls = (void *)user_ptr;
1931 if (p->count && err == 0 && copy_to_user(user_ptr, mbuf, ctrls_size))
1939 /* Copy results into user buffer */
1940 switch (_IOC_DIR(cmd)) {
1942 case (_IOC_WRITE | _IOC_READ):
1943 if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd)))
1952 EXPORT_SYMBOL(video_ioctl2);