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@redhat.com> (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_G_CHIP_IDENT)] = "VIDIOC_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 inode *inode, struct file *file,
397 unsigned int cmd, unsigned long arg,
398 int (*func)(struct inode *inode, struct file *file,
399 unsigned int cmd, void *arg))
406 size_t ctrls_size = 0;
407 void __user *user_ptr = NULL;
410 cmd = video_fix_command(cmd);
412 is_ext_ctrl = (cmd == VIDIOC_S_EXT_CTRLS || cmd == VIDIOC_G_EXT_CTRLS ||
413 cmd == VIDIOC_TRY_EXT_CTRLS);
415 /* Copy arguments into temp kernel buffer */
416 switch (_IOC_DIR(cmd)) {
422 case (_IOC_WRITE | _IOC_READ):
423 if (_IOC_SIZE(cmd) <= sizeof(sbuf)) {
426 /* too big to allocate from stack */
427 mbuf = kmalloc(_IOC_SIZE(cmd), GFP_KERNEL);
434 if (_IOC_DIR(cmd) & _IOC_WRITE)
435 if (copy_from_user(parg, (void __user *)arg, _IOC_SIZE(cmd)))
440 struct v4l2_ext_controls *p = parg;
442 /* In case of an error, tell the caller that it wasn't
443 a specific control that caused it. */
444 p->error_idx = p->count;
445 user_ptr = (void __user *)p->controls;
447 ctrls_size = sizeof(struct v4l2_ext_control) * p->count;
448 /* Note: v4l2_ext_controls fits in sbuf[] so mbuf is still NULL. */
449 mbuf = kmalloc(ctrls_size, GFP_KERNEL);
454 if (copy_from_user(mbuf, user_ptr, ctrls_size))
461 err = func(inode, file, cmd, parg);
462 if (err == -ENOIOCTLCMD)
465 struct v4l2_ext_controls *p = parg;
467 p->controls = (void *)user_ptr;
468 if (p->count && err == 0 && copy_to_user(user_ptr, mbuf, ctrls_size))
476 /* Copy results into user buffer */
477 switch (_IOC_DIR(cmd)) {
479 case (_IOC_WRITE | _IOC_READ):
480 if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd)))
489 EXPORT_SYMBOL(video_usercopy);
491 static void dbgbuf(unsigned int cmd, struct video_device *vfd,
492 struct v4l2_buffer *p)
494 struct v4l2_timecode *tc = &p->timecode;
496 dbgarg(cmd, "%02ld:%02d:%02d.%08ld index=%d, type=%s, "
497 "bytesused=%d, flags=0x%08d, "
498 "field=%0d, sequence=%d, memory=%s, offset/userptr=0x%08lx, length=%d\n",
499 p->timestamp.tv_sec / 3600,
500 (int)(p->timestamp.tv_sec / 60) % 60,
501 (int)(p->timestamp.tv_sec % 60),
502 (long)p->timestamp.tv_usec,
504 prt_names(p->type, v4l2_type_names),
505 p->bytesused, p->flags,
506 p->field, p->sequence,
507 prt_names(p->memory, v4l2_memory_names),
508 p->m.userptr, p->length);
509 dbgarg2("timecode=%02d:%02d:%02d type=%d, "
510 "flags=0x%08d, frames=%d, userbits=0x%08x\n",
511 tc->hours, tc->minutes, tc->seconds,
512 tc->type, tc->flags, tc->frames, *(__u32 *)tc->userbits);
515 static inline void dbgrect(struct video_device *vfd, char *s,
518 dbgarg2("%sRect start at %dx%d, size=%dx%d\n", s, r->left, r->top,
519 r->width, r->height);
522 static inline void v4l_print_pix_fmt(struct video_device *vfd,
523 struct v4l2_pix_format *fmt)
525 dbgarg2("width=%d, height=%d, format=%c%c%c%c, field=%s, "
526 "bytesperline=%d sizeimage=%d, colorspace=%d\n",
527 fmt->width, fmt->height,
528 (fmt->pixelformat & 0xff),
529 (fmt->pixelformat >> 8) & 0xff,
530 (fmt->pixelformat >> 16) & 0xff,
531 (fmt->pixelformat >> 24) & 0xff,
532 prt_names(fmt->field, v4l2_field_names),
533 fmt->bytesperline, fmt->sizeimage, fmt->colorspace);
536 static inline void v4l_print_ext_ctrls(unsigned int cmd,
537 struct video_device *vfd, struct v4l2_ext_controls *c, int show_vals)
541 if (!(vfd->debug & V4L2_DEBUG_IOCTL_ARG))
544 printk(KERN_CONT "class=0x%x", c->ctrl_class);
545 for (i = 0; i < c->count; i++) {
547 printk(KERN_CONT " id/val=0x%x/0x%x",
548 c->controls[i].id, c->controls[i].value);
550 printk(KERN_CONT " id=0x%x", c->controls[i].id);
552 printk(KERN_CONT "\n");
555 static inline int check_ext_ctrls(struct v4l2_ext_controls *c, int allow_priv)
559 /* zero the reserved fields */
560 c->reserved[0] = c->reserved[1] = 0;
561 for (i = 0; i < c->count; i++) {
562 c->controls[i].reserved2[0] = 0;
563 c->controls[i].reserved2[1] = 0;
565 /* V4L2_CID_PRIVATE_BASE cannot be used as control class
566 when using extended controls.
567 Only when passed in through VIDIOC_G_CTRL and VIDIOC_S_CTRL
568 is it allowed for backwards compatibility.
570 if (!allow_priv && c->ctrl_class == V4L2_CID_PRIVATE_BASE)
572 /* Check that all controls are from the same control class. */
573 for (i = 0; i < c->count; i++) {
574 if (V4L2_CTRL_ID2CLASS(c->controls[i].id) != c->ctrl_class) {
582 static int check_fmt(const struct v4l2_ioctl_ops *ops, enum v4l2_buf_type type)
588 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
589 if (ops->vidioc_try_fmt_vid_cap)
592 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
593 if (ops->vidioc_try_fmt_vid_overlay)
596 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
597 if (ops->vidioc_try_fmt_vid_out)
600 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
601 if (ops->vidioc_try_fmt_vid_out_overlay)
604 case V4L2_BUF_TYPE_VBI_CAPTURE:
605 if (ops->vidioc_try_fmt_vbi_cap)
608 case V4L2_BUF_TYPE_VBI_OUTPUT:
609 if (ops->vidioc_try_fmt_vbi_out)
612 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
613 if (ops->vidioc_try_fmt_sliced_vbi_cap)
616 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
617 if (ops->vidioc_try_fmt_sliced_vbi_out)
620 case V4L2_BUF_TYPE_PRIVATE:
621 if (ops->vidioc_try_fmt_type_private)
628 static int __video_do_ioctl(struct file *file,
629 unsigned int cmd, void *arg)
631 struct video_device *vfd = video_devdata(file);
632 const struct v4l2_ioctl_ops *ops = vfd->ioctl_ops;
633 void *fh = file->private_data;
636 if ((vfd->debug & V4L2_DEBUG_IOCTL) &&
637 !(vfd->debug & V4L2_DEBUG_IOCTL_ARG)) {
638 v4l_print_ioctl(vfd->name, cmd);
639 printk(KERN_CONT "\n");
643 printk(KERN_WARNING "videodev: \"%s\" has no ioctl_ops.\n",
648 #ifdef CONFIG_VIDEO_V4L1_COMPAT
649 /***********************************************************
650 Handles calls to the obsoleted V4L1 API
651 Due to the nature of VIDIOCGMBUF, each driver that supports
652 V4L1 should implement its own handler for this ioctl.
653 ***********************************************************/
655 /* --- streaming capture ------------------------------------- */
656 if (cmd == VIDIOCGMBUF) {
657 struct video_mbuf *p = arg;
659 memset(p, 0, sizeof(*p));
661 if (!ops->vidiocgmbuf)
663 ret = ops->vidiocgmbuf(file, fh, p);
665 dbgarg(cmd, "size=%d, frames=%d, offsets=0x%08lx\n",
667 (unsigned long)p->offsets);
671 /********************************************************
672 All other V4L1 calls are handled by v4l1_compat module.
673 Those calls will be translated into V4L2 calls, and
674 __video_do_ioctl will be called again, with one or more
676 ********************************************************/
677 if (_IOC_TYPE(cmd) == 'v' && _IOC_NR(cmd) < BASE_VIDIOCPRIVATE)
678 return v4l_compat_translate_ioctl(file, cmd, arg,
683 /* --- capabilities ------------------------------------------ */
684 case VIDIOC_QUERYCAP:
686 struct v4l2_capability *cap = (struct v4l2_capability *)arg;
687 memset(cap, 0, sizeof(*cap));
689 if (!ops->vidioc_querycap)
692 ret = ops->vidioc_querycap(file, fh, cap);
694 dbgarg(cmd, "driver=%s, card=%s, bus=%s, "
696 "capabilities=0x%08x\n",
697 cap->driver, cap->card, cap->bus_info,
703 /* --- priority ------------------------------------------ */
704 case VIDIOC_G_PRIORITY:
706 enum v4l2_priority *p = arg;
708 if (!ops->vidioc_g_priority)
710 ret = ops->vidioc_g_priority(file, fh, p);
712 dbgarg(cmd, "priority is %d\n", *p);
715 case VIDIOC_S_PRIORITY:
717 enum v4l2_priority *p = arg;
719 if (!ops->vidioc_s_priority)
721 dbgarg(cmd, "setting priority to %d\n", *p);
722 ret = ops->vidioc_s_priority(file, fh, *p);
726 /* --- capture ioctls ---------------------------------------- */
727 case VIDIOC_ENUM_FMT:
729 struct v4l2_fmtdesc *f = arg;
730 enum v4l2_buf_type type;
735 memset(f, 0, sizeof(*f));
740 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
741 if (ops->vidioc_enum_fmt_vid_cap)
742 ret = ops->vidioc_enum_fmt_vid_cap(file, fh, f);
744 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
745 if (ops->vidioc_enum_fmt_vid_overlay)
746 ret = ops->vidioc_enum_fmt_vid_overlay(file,
749 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
750 if (ops->vidioc_enum_fmt_vid_out)
751 ret = ops->vidioc_enum_fmt_vid_out(file, fh, f);
753 case V4L2_BUF_TYPE_PRIVATE:
754 if (ops->vidioc_enum_fmt_type_private)
755 ret = ops->vidioc_enum_fmt_type_private(file,
762 dbgarg(cmd, "index=%d, type=%d, flags=%d, "
763 "pixelformat=%c%c%c%c, description='%s'\n",
764 f->index, f->type, f->flags,
765 (f->pixelformat & 0xff),
766 (f->pixelformat >> 8) & 0xff,
767 (f->pixelformat >> 16) & 0xff,
768 (f->pixelformat >> 24) & 0xff,
774 struct v4l2_format *f = (struct v4l2_format *)arg;
776 memset(f->fmt.raw_data, 0, sizeof(f->fmt.raw_data));
778 /* FIXME: Should be one dump per type */
779 dbgarg(cmd, "type=%s\n", prt_names(f->type, v4l2_type_names));
782 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
783 if (ops->vidioc_g_fmt_vid_cap)
784 ret = ops->vidioc_g_fmt_vid_cap(file, fh, f);
786 v4l_print_pix_fmt(vfd, &f->fmt.pix);
788 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
789 if (ops->vidioc_g_fmt_vid_overlay)
790 ret = ops->vidioc_g_fmt_vid_overlay(file,
793 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
794 if (ops->vidioc_g_fmt_vid_out)
795 ret = ops->vidioc_g_fmt_vid_out(file, fh, f);
797 v4l_print_pix_fmt(vfd, &f->fmt.pix);
799 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
800 if (ops->vidioc_g_fmt_vid_out_overlay)
801 ret = ops->vidioc_g_fmt_vid_out_overlay(file,
804 case V4L2_BUF_TYPE_VBI_CAPTURE:
805 if (ops->vidioc_g_fmt_vbi_cap)
806 ret = ops->vidioc_g_fmt_vbi_cap(file, fh, f);
808 case V4L2_BUF_TYPE_VBI_OUTPUT:
809 if (ops->vidioc_g_fmt_vbi_out)
810 ret = ops->vidioc_g_fmt_vbi_out(file, fh, f);
812 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
813 if (ops->vidioc_g_fmt_sliced_vbi_cap)
814 ret = ops->vidioc_g_fmt_sliced_vbi_cap(file,
817 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
818 if (ops->vidioc_g_fmt_sliced_vbi_out)
819 ret = ops->vidioc_g_fmt_sliced_vbi_out(file,
822 case V4L2_BUF_TYPE_PRIVATE:
823 if (ops->vidioc_g_fmt_type_private)
824 ret = ops->vidioc_g_fmt_type_private(file,
833 struct v4l2_format *f = (struct v4l2_format *)arg;
835 /* FIXME: Should be one dump per type */
836 dbgarg(cmd, "type=%s\n", prt_names(f->type, v4l2_type_names));
839 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
840 v4l_print_pix_fmt(vfd, &f->fmt.pix);
841 if (ops->vidioc_s_fmt_vid_cap)
842 ret = ops->vidioc_s_fmt_vid_cap(file, fh, f);
844 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
845 if (ops->vidioc_s_fmt_vid_overlay)
846 ret = ops->vidioc_s_fmt_vid_overlay(file,
849 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
850 v4l_print_pix_fmt(vfd, &f->fmt.pix);
851 if (ops->vidioc_s_fmt_vid_out)
852 ret = ops->vidioc_s_fmt_vid_out(file, fh, f);
854 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
855 if (ops->vidioc_s_fmt_vid_out_overlay)
856 ret = ops->vidioc_s_fmt_vid_out_overlay(file,
859 case V4L2_BUF_TYPE_VBI_CAPTURE:
860 if (ops->vidioc_s_fmt_vbi_cap)
861 ret = ops->vidioc_s_fmt_vbi_cap(file, fh, f);
863 case V4L2_BUF_TYPE_VBI_OUTPUT:
864 if (ops->vidioc_s_fmt_vbi_out)
865 ret = ops->vidioc_s_fmt_vbi_out(file, fh, f);
867 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
868 if (ops->vidioc_s_fmt_sliced_vbi_cap)
869 ret = ops->vidioc_s_fmt_sliced_vbi_cap(file,
872 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
873 if (ops->vidioc_s_fmt_sliced_vbi_out)
874 ret = ops->vidioc_s_fmt_sliced_vbi_out(file,
877 case V4L2_BUF_TYPE_PRIVATE:
878 if (ops->vidioc_s_fmt_type_private)
879 ret = ops->vidioc_s_fmt_type_private(file,
887 struct v4l2_format *f = (struct v4l2_format *)arg;
889 /* FIXME: Should be one dump per type */
890 dbgarg(cmd, "type=%s\n", prt_names(f->type,
893 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
894 if (ops->vidioc_try_fmt_vid_cap)
895 ret = ops->vidioc_try_fmt_vid_cap(file, fh, f);
897 v4l_print_pix_fmt(vfd, &f->fmt.pix);
899 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
900 if (ops->vidioc_try_fmt_vid_overlay)
901 ret = ops->vidioc_try_fmt_vid_overlay(file,
904 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
905 if (ops->vidioc_try_fmt_vid_out)
906 ret = ops->vidioc_try_fmt_vid_out(file, fh, f);
908 v4l_print_pix_fmt(vfd, &f->fmt.pix);
910 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
911 if (ops->vidioc_try_fmt_vid_out_overlay)
912 ret = ops->vidioc_try_fmt_vid_out_overlay(file,
915 case V4L2_BUF_TYPE_VBI_CAPTURE:
916 if (ops->vidioc_try_fmt_vbi_cap)
917 ret = ops->vidioc_try_fmt_vbi_cap(file, fh, f);
919 case V4L2_BUF_TYPE_VBI_OUTPUT:
920 if (ops->vidioc_try_fmt_vbi_out)
921 ret = ops->vidioc_try_fmt_vbi_out(file, fh, f);
923 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
924 if (ops->vidioc_try_fmt_sliced_vbi_cap)
925 ret = ops->vidioc_try_fmt_sliced_vbi_cap(file,
928 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
929 if (ops->vidioc_try_fmt_sliced_vbi_out)
930 ret = ops->vidioc_try_fmt_sliced_vbi_out(file,
933 case V4L2_BUF_TYPE_PRIVATE:
934 if (ops->vidioc_try_fmt_type_private)
935 ret = ops->vidioc_try_fmt_type_private(file,
942 /* FIXME: Those buf reqs could be handled here,
943 with some changes on videobuf to allow its header to be included at
944 videodev2.h or being merged at videodev2.
948 struct v4l2_requestbuffers *p = arg;
950 if (!ops->vidioc_reqbufs)
952 ret = check_fmt(ops, p->type);
956 ret = ops->vidioc_reqbufs(file, fh, p);
957 dbgarg(cmd, "count=%d, type=%s, memory=%s\n",
959 prt_names(p->type, v4l2_type_names),
960 prt_names(p->memory, v4l2_memory_names));
963 case VIDIOC_QUERYBUF:
965 struct v4l2_buffer *p = arg;
967 if (!ops->vidioc_querybuf)
969 ret = check_fmt(ops, p->type);
973 ret = ops->vidioc_querybuf(file, fh, p);
980 struct v4l2_buffer *p = arg;
982 if (!ops->vidioc_qbuf)
984 ret = check_fmt(ops, p->type);
988 ret = ops->vidioc_qbuf(file, fh, p);
995 struct v4l2_buffer *p = arg;
997 if (!ops->vidioc_dqbuf)
999 ret = check_fmt(ops, p->type);
1003 ret = ops->vidioc_dqbuf(file, fh, p);
1005 dbgbuf(cmd, vfd, p);
1008 case VIDIOC_OVERLAY:
1012 if (!ops->vidioc_overlay)
1014 dbgarg(cmd, "value=%d\n", *i);
1015 ret = ops->vidioc_overlay(file, fh, *i);
1020 struct v4l2_framebuffer *p = arg;
1022 if (!ops->vidioc_g_fbuf)
1024 ret = ops->vidioc_g_fbuf(file, fh, arg);
1026 dbgarg(cmd, "capability=0x%x, flags=%d, base=0x%08lx\n",
1027 p->capability, p->flags,
1028 (unsigned long)p->base);
1029 v4l_print_pix_fmt(vfd, &p->fmt);
1035 struct v4l2_framebuffer *p = arg;
1037 if (!ops->vidioc_s_fbuf)
1039 dbgarg(cmd, "capability=0x%x, flags=%d, base=0x%08lx\n",
1040 p->capability, p->flags, (unsigned long)p->base);
1041 v4l_print_pix_fmt(vfd, &p->fmt);
1042 ret = ops->vidioc_s_fbuf(file, fh, arg);
1045 case VIDIOC_STREAMON:
1047 enum v4l2_buf_type i = *(int *)arg;
1049 if (!ops->vidioc_streamon)
1051 dbgarg(cmd, "type=%s\n", prt_names(i, v4l2_type_names));
1052 ret = ops->vidioc_streamon(file, fh, i);
1055 case VIDIOC_STREAMOFF:
1057 enum v4l2_buf_type i = *(int *)arg;
1059 if (!ops->vidioc_streamoff)
1061 dbgarg(cmd, "type=%s\n", prt_names(i, v4l2_type_names));
1062 ret = ops->vidioc_streamoff(file, fh, i);
1065 /* ---------- tv norms ---------- */
1066 case VIDIOC_ENUMSTD:
1068 struct v4l2_standard *p = arg;
1069 v4l2_std_id id = vfd->tvnorms, curr_id = 0;
1070 unsigned int index = p->index, i, j = 0;
1071 const char *descr = "";
1073 /* Return norm array in a canonical way */
1074 for (i = 0; i <= index && id; i++) {
1075 /* last std value in the standards array is 0, so this
1076 while always ends there since (id & 0) == 0. */
1077 while ((id & standards[j].std) != standards[j].std)
1079 curr_id = standards[j].std;
1080 descr = standards[j].descr;
1084 if (curr_id != V4L2_STD_PAL &&
1085 curr_id != V4L2_STD_SECAM &&
1086 curr_id != V4L2_STD_NTSC)
1092 v4l2_video_std_construct(p, curr_id, descr);
1095 dbgarg(cmd, "index=%d, id=0x%Lx, name=%s, fps=%d/%d, "
1096 "framelines=%d\n", p->index,
1097 (unsigned long long)p->id, p->name,
1098 p->frameperiod.numerator,
1099 p->frameperiod.denominator,
1107 v4l2_std_id *id = arg;
1110 /* Calls the specific handler */
1111 if (ops->vidioc_g_std)
1112 ret = ops->vidioc_g_std(file, fh, id);
1114 *id = vfd->current_norm;
1117 dbgarg(cmd, "std=0x%08Lx\n", (long long unsigned)*id);
1122 v4l2_std_id *id = arg, norm;
1124 dbgarg(cmd, "std=%08Lx\n", (long long unsigned)*id);
1126 norm = (*id) & vfd->tvnorms;
1127 if (vfd->tvnorms && !norm) /* Check if std is supported */
1130 /* Calls the specific handler */
1131 if (ops->vidioc_s_std)
1132 ret = ops->vidioc_s_std(file, fh, &norm);
1136 /* Updates standard information */
1138 vfd->current_norm = norm;
1141 case VIDIOC_QUERYSTD:
1143 v4l2_std_id *p = arg;
1145 if (!ops->vidioc_querystd)
1147 ret = ops->vidioc_querystd(file, fh, arg);
1149 dbgarg(cmd, "detected std=%08Lx\n",
1150 (unsigned long long)*p);
1153 /* ------ input switching ---------- */
1154 /* FIXME: Inputs can be handled inside videodev2 */
1155 case VIDIOC_ENUMINPUT:
1157 struct v4l2_input *p = arg;
1160 if (!ops->vidioc_enum_input)
1162 memset(p, 0, sizeof(*p));
1165 ret = ops->vidioc_enum_input(file, fh, p);
1167 dbgarg(cmd, "index=%d, name=%s, type=%d, "
1169 "tuner=%d, std=%08Lx, status=%d\n",
1170 p->index, p->name, p->type, p->audioset,
1172 (unsigned long long)p->std,
1176 case VIDIOC_G_INPUT:
1178 unsigned int *i = arg;
1180 if (!ops->vidioc_g_input)
1182 ret = ops->vidioc_g_input(file, fh, i);
1184 dbgarg(cmd, "value=%d\n", *i);
1187 case VIDIOC_S_INPUT:
1189 unsigned int *i = arg;
1191 if (!ops->vidioc_s_input)
1193 dbgarg(cmd, "value=%d\n", *i);
1194 ret = ops->vidioc_s_input(file, fh, *i);
1198 /* ------ output switching ---------- */
1199 case VIDIOC_ENUMOUTPUT:
1201 struct v4l2_output *p = arg;
1204 if (!ops->vidioc_enum_output)
1206 memset(p, 0, sizeof(*p));
1209 ret = ops->vidioc_enum_output(file, fh, p);
1211 dbgarg(cmd, "index=%d, name=%s, type=%d, "
1213 "modulator=%d, std=0x%08Lx\n",
1214 p->index, p->name, p->type, p->audioset,
1215 p->modulator, (unsigned long long)p->std);
1218 case VIDIOC_G_OUTPUT:
1220 unsigned int *i = arg;
1222 if (!ops->vidioc_g_output)
1224 ret = ops->vidioc_g_output(file, fh, i);
1226 dbgarg(cmd, "value=%d\n", *i);
1229 case VIDIOC_S_OUTPUT:
1231 unsigned int *i = arg;
1233 if (!ops->vidioc_s_output)
1235 dbgarg(cmd, "value=%d\n", *i);
1236 ret = ops->vidioc_s_output(file, fh, *i);
1240 /* --- controls ---------------------------------------------- */
1241 case VIDIOC_QUERYCTRL:
1243 struct v4l2_queryctrl *p = arg;
1245 if (!ops->vidioc_queryctrl)
1247 ret = ops->vidioc_queryctrl(file, fh, p);
1249 dbgarg(cmd, "id=0x%x, type=%d, name=%s, min/max=%d/%d, "
1250 "step=%d, default=%d, flags=0x%08x\n",
1251 p->id, p->type, p->name,
1252 p->minimum, p->maximum,
1253 p->step, p->default_value, p->flags);
1255 dbgarg(cmd, "id=0x%x\n", p->id);
1260 struct v4l2_control *p = arg;
1262 if (ops->vidioc_g_ctrl)
1263 ret = ops->vidioc_g_ctrl(file, fh, p);
1264 else if (ops->vidioc_g_ext_ctrls) {
1265 struct v4l2_ext_controls ctrls;
1266 struct v4l2_ext_control ctrl;
1268 ctrls.ctrl_class = V4L2_CTRL_ID2CLASS(p->id);
1270 ctrls.controls = &ctrl;
1272 ctrl.value = p->value;
1273 if (check_ext_ctrls(&ctrls, 1)) {
1274 ret = ops->vidioc_g_ext_ctrls(file, fh, &ctrls);
1276 p->value = ctrl.value;
1281 dbgarg(cmd, "id=0x%x, value=%d\n", p->id, p->value);
1283 dbgarg(cmd, "id=0x%x\n", p->id);
1288 struct v4l2_control *p = arg;
1289 struct v4l2_ext_controls ctrls;
1290 struct v4l2_ext_control ctrl;
1292 if (!ops->vidioc_s_ctrl && !ops->vidioc_s_ext_ctrls)
1295 dbgarg(cmd, "id=0x%x, value=%d\n", p->id, p->value);
1297 if (ops->vidioc_s_ctrl) {
1298 ret = ops->vidioc_s_ctrl(file, fh, p);
1301 if (!ops->vidioc_s_ext_ctrls)
1304 ctrls.ctrl_class = V4L2_CTRL_ID2CLASS(p->id);
1306 ctrls.controls = &ctrl;
1308 ctrl.value = p->value;
1309 if (check_ext_ctrls(&ctrls, 1))
1310 ret = ops->vidioc_s_ext_ctrls(file, fh, &ctrls);
1313 case VIDIOC_G_EXT_CTRLS:
1315 struct v4l2_ext_controls *p = arg;
1317 p->error_idx = p->count;
1318 if (!ops->vidioc_g_ext_ctrls)
1320 if (check_ext_ctrls(p, 0))
1321 ret = ops->vidioc_g_ext_ctrls(file, fh, p);
1322 v4l_print_ext_ctrls(cmd, vfd, p, !ret);
1325 case VIDIOC_S_EXT_CTRLS:
1327 struct v4l2_ext_controls *p = arg;
1329 p->error_idx = p->count;
1330 if (!ops->vidioc_s_ext_ctrls)
1332 v4l_print_ext_ctrls(cmd, vfd, p, 1);
1333 if (check_ext_ctrls(p, 0))
1334 ret = ops->vidioc_s_ext_ctrls(file, fh, p);
1337 case VIDIOC_TRY_EXT_CTRLS:
1339 struct v4l2_ext_controls *p = arg;
1341 p->error_idx = p->count;
1342 if (!ops->vidioc_try_ext_ctrls)
1344 v4l_print_ext_ctrls(cmd, vfd, p, 1);
1345 if (check_ext_ctrls(p, 0))
1346 ret = ops->vidioc_try_ext_ctrls(file, fh, p);
1349 case VIDIOC_QUERYMENU:
1351 struct v4l2_querymenu *p = arg;
1353 if (!ops->vidioc_querymenu)
1355 ret = ops->vidioc_querymenu(file, fh, p);
1357 dbgarg(cmd, "id=0x%x, index=%d, name=%s\n",
1358 p->id, p->index, p->name);
1360 dbgarg(cmd, "id=0x%x, index=%d\n",
1364 /* --- audio ---------------------------------------------- */
1365 case VIDIOC_ENUMAUDIO:
1367 struct v4l2_audio *p = arg;
1369 if (!ops->vidioc_enumaudio)
1371 ret = ops->vidioc_enumaudio(file, fh, p);
1373 dbgarg(cmd, "index=%d, name=%s, capability=0x%x, "
1374 "mode=0x%x\n", p->index, p->name,
1375 p->capability, p->mode);
1377 dbgarg(cmd, "index=%d\n", p->index);
1380 case VIDIOC_G_AUDIO:
1382 struct v4l2_audio *p = arg;
1383 __u32 index = p->index;
1385 if (!ops->vidioc_g_audio)
1388 memset(p, 0, sizeof(*p));
1390 ret = ops->vidioc_g_audio(file, fh, p);
1392 dbgarg(cmd, "index=%d, name=%s, capability=0x%x, "
1393 "mode=0x%x\n", p->index,
1394 p->name, p->capability, p->mode);
1396 dbgarg(cmd, "index=%d\n", p->index);
1399 case VIDIOC_S_AUDIO:
1401 struct v4l2_audio *p = arg;
1403 if (!ops->vidioc_s_audio)
1405 dbgarg(cmd, "index=%d, name=%s, capability=0x%x, "
1406 "mode=0x%x\n", p->index, p->name,
1407 p->capability, p->mode);
1408 ret = ops->vidioc_s_audio(file, fh, p);
1411 case VIDIOC_ENUMAUDOUT:
1413 struct v4l2_audioout *p = arg;
1415 if (!ops->vidioc_enumaudout)
1417 dbgarg(cmd, "Enum for index=%d\n", p->index);
1418 ret = ops->vidioc_enumaudout(file, fh, p);
1420 dbgarg2("index=%d, name=%s, capability=%d, "
1421 "mode=%d\n", p->index, p->name,
1422 p->capability, p->mode);
1425 case VIDIOC_G_AUDOUT:
1427 struct v4l2_audioout *p = arg;
1429 if (!ops->vidioc_g_audout)
1431 dbgarg(cmd, "Enum for index=%d\n", p->index);
1432 ret = ops->vidioc_g_audout(file, fh, p);
1434 dbgarg2("index=%d, name=%s, capability=%d, "
1435 "mode=%d\n", p->index, p->name,
1436 p->capability, p->mode);
1439 case VIDIOC_S_AUDOUT:
1441 struct v4l2_audioout *p = arg;
1443 if (!ops->vidioc_s_audout)
1445 dbgarg(cmd, "index=%d, name=%s, capability=%d, "
1446 "mode=%d\n", p->index, p->name,
1447 p->capability, p->mode);
1449 ret = ops->vidioc_s_audout(file, fh, p);
1452 case VIDIOC_G_MODULATOR:
1454 struct v4l2_modulator *p = arg;
1456 if (!ops->vidioc_g_modulator)
1458 ret = ops->vidioc_g_modulator(file, fh, p);
1460 dbgarg(cmd, "index=%d, name=%s, "
1461 "capability=%d, rangelow=%d,"
1462 " rangehigh=%d, txsubchans=%d\n",
1463 p->index, p->name, p->capability,
1464 p->rangelow, p->rangehigh,
1468 case VIDIOC_S_MODULATOR:
1470 struct v4l2_modulator *p = arg;
1472 if (!ops->vidioc_s_modulator)
1474 dbgarg(cmd, "index=%d, name=%s, capability=%d, "
1475 "rangelow=%d, rangehigh=%d, txsubchans=%d\n",
1476 p->index, p->name, p->capability, p->rangelow,
1477 p->rangehigh, p->txsubchans);
1478 ret = ops->vidioc_s_modulator(file, fh, p);
1483 struct v4l2_crop *p = arg;
1485 if (!ops->vidioc_g_crop)
1487 dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names));
1488 ret = ops->vidioc_g_crop(file, fh, p);
1490 dbgrect(vfd, "", &p->c);
1495 struct v4l2_crop *p = arg;
1497 if (!ops->vidioc_s_crop)
1499 dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names));
1500 dbgrect(vfd, "", &p->c);
1501 ret = ops->vidioc_s_crop(file, fh, p);
1504 case VIDIOC_CROPCAP:
1506 struct v4l2_cropcap *p = arg;
1508 /*FIXME: Should also show v4l2_fract pixelaspect */
1509 if (!ops->vidioc_cropcap)
1511 dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names));
1512 ret = ops->vidioc_cropcap(file, fh, p);
1514 dbgrect(vfd, "bounds ", &p->bounds);
1515 dbgrect(vfd, "defrect ", &p->defrect);
1519 case VIDIOC_G_JPEGCOMP:
1521 struct v4l2_jpegcompression *p = arg;
1523 if (!ops->vidioc_g_jpegcomp)
1525 ret = ops->vidioc_g_jpegcomp(file, fh, p);
1527 dbgarg(cmd, "quality=%d, APPn=%d, "
1528 "APP_len=%d, COM_len=%d, "
1529 "jpeg_markers=%d\n",
1530 p->quality, p->APPn, p->APP_len,
1531 p->COM_len, p->jpeg_markers);
1534 case VIDIOC_S_JPEGCOMP:
1536 struct v4l2_jpegcompression *p = arg;
1538 if (!ops->vidioc_g_jpegcomp)
1540 dbgarg(cmd, "quality=%d, APPn=%d, APP_len=%d, "
1541 "COM_len=%d, jpeg_markers=%d\n",
1542 p->quality, p->APPn, p->APP_len,
1543 p->COM_len, p->jpeg_markers);
1544 ret = ops->vidioc_s_jpegcomp(file, fh, p);
1547 case VIDIOC_G_ENC_INDEX:
1549 struct v4l2_enc_idx *p = arg;
1551 if (!ops->vidioc_g_enc_index)
1553 ret = ops->vidioc_g_enc_index(file, fh, p);
1555 dbgarg(cmd, "entries=%d, entries_cap=%d\n",
1556 p->entries, p->entries_cap);
1559 case VIDIOC_ENCODER_CMD:
1561 struct v4l2_encoder_cmd *p = arg;
1563 if (!ops->vidioc_encoder_cmd)
1565 memset(&p->raw, 0, sizeof(p->raw));
1566 ret = ops->vidioc_encoder_cmd(file, fh, p);
1568 dbgarg(cmd, "cmd=%d, flags=%x\n", p->cmd, p->flags);
1571 case VIDIOC_TRY_ENCODER_CMD:
1573 struct v4l2_encoder_cmd *p = arg;
1575 if (!ops->vidioc_try_encoder_cmd)
1577 memset(&p->raw, 0, sizeof(p->raw));
1578 ret = ops->vidioc_try_encoder_cmd(file, fh, p);
1580 dbgarg(cmd, "cmd=%d, flags=%x\n", p->cmd, p->flags);
1585 struct v4l2_streamparm *p = arg;
1586 __u32 type = p->type;
1588 memset(p, 0, sizeof(*p));
1591 if (ops->vidioc_g_parm) {
1592 ret = ops->vidioc_g_parm(file, fh, p);
1594 struct v4l2_standard s;
1596 if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1599 v4l2_video_std_construct(&s, vfd->current_norm,
1600 v4l2_norm_to_name(vfd->current_norm));
1602 p->parm.capture.timeperframe = s.frameperiod;
1606 dbgarg(cmd, "type=%d\n", p->type);
1611 struct v4l2_streamparm *p = arg;
1613 if (!ops->vidioc_s_parm)
1615 dbgarg(cmd, "type=%d\n", p->type);
1616 ret = ops->vidioc_s_parm(file, fh, p);
1619 case VIDIOC_G_TUNER:
1621 struct v4l2_tuner *p = arg;
1622 __u32 index = p->index;
1624 if (!ops->vidioc_g_tuner)
1627 memset(p, 0, sizeof(*p));
1630 ret = ops->vidioc_g_tuner(file, fh, p);
1632 dbgarg(cmd, "index=%d, name=%s, type=%d, "
1633 "capability=0x%x, rangelow=%d, "
1634 "rangehigh=%d, signal=%d, afc=%d, "
1635 "rxsubchans=0x%x, audmode=%d\n",
1636 p->index, p->name, p->type,
1637 p->capability, p->rangelow,
1638 p->rangehigh, p->signal, p->afc,
1639 p->rxsubchans, p->audmode);
1642 case VIDIOC_S_TUNER:
1644 struct v4l2_tuner *p = arg;
1646 if (!ops->vidioc_s_tuner)
1648 dbgarg(cmd, "index=%d, name=%s, type=%d, "
1649 "capability=0x%x, rangelow=%d, "
1650 "rangehigh=%d, signal=%d, afc=%d, "
1651 "rxsubchans=0x%x, audmode=%d\n",
1652 p->index, p->name, p->type,
1653 p->capability, p->rangelow,
1654 p->rangehigh, p->signal, p->afc,
1655 p->rxsubchans, p->audmode);
1656 ret = ops->vidioc_s_tuner(file, fh, p);
1659 case VIDIOC_G_FREQUENCY:
1661 struct v4l2_frequency *p = arg;
1663 if (!ops->vidioc_g_frequency)
1666 memset(p->reserved, 0, sizeof(p->reserved));
1668 ret = ops->vidioc_g_frequency(file, fh, p);
1670 dbgarg(cmd, "tuner=%d, type=%d, frequency=%d\n",
1671 p->tuner, p->type, p->frequency);
1674 case VIDIOC_S_FREQUENCY:
1676 struct v4l2_frequency *p = arg;
1678 if (!ops->vidioc_s_frequency)
1680 dbgarg(cmd, "tuner=%d, type=%d, frequency=%d\n",
1681 p->tuner, p->type, p->frequency);
1682 ret = ops->vidioc_s_frequency(file, fh, p);
1685 case VIDIOC_G_SLICED_VBI_CAP:
1687 struct v4l2_sliced_vbi_cap *p = arg;
1688 __u32 type = p->type;
1690 if (!ops->vidioc_g_sliced_vbi_cap)
1692 memset(p, 0, sizeof(*p));
1694 dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names));
1695 ret = ops->vidioc_g_sliced_vbi_cap(file, fh, p);
1697 dbgarg2("service_set=%d\n", p->service_set);
1700 case VIDIOC_LOG_STATUS:
1702 if (!ops->vidioc_log_status)
1704 ret = ops->vidioc_log_status(file, fh);
1707 #ifdef CONFIG_VIDEO_ADV_DEBUG
1708 case VIDIOC_DBG_G_REGISTER:
1710 struct v4l2_register *p = arg;
1712 if (!capable(CAP_SYS_ADMIN))
1714 else if (ops->vidioc_g_register)
1715 ret = ops->vidioc_g_register(file, fh, p);
1718 case VIDIOC_DBG_S_REGISTER:
1720 struct v4l2_register *p = arg;
1722 if (!capable(CAP_SYS_ADMIN))
1724 else if (ops->vidioc_s_register)
1725 ret = ops->vidioc_s_register(file, fh, p);
1729 case VIDIOC_G_CHIP_IDENT:
1731 struct v4l2_chip_ident *p = arg;
1733 if (!ops->vidioc_g_chip_ident)
1735 ret = ops->vidioc_g_chip_ident(file, fh, p);
1737 dbgarg(cmd, "chip_ident=%u, revision=0x%x\n", p->ident, p->revision);
1740 case VIDIOC_S_HW_FREQ_SEEK:
1742 struct v4l2_hw_freq_seek *p = arg;
1744 if (!ops->vidioc_s_hw_freq_seek)
1747 "tuner=%d, type=%d, seek_upward=%d, wrap_around=%d\n",
1748 p->tuner, p->type, p->seek_upward, p->wrap_around);
1749 ret = ops->vidioc_s_hw_freq_seek(file, fh, p);
1754 if (!ops->vidioc_default)
1756 ret = ops->vidioc_default(file, fh, cmd, arg);
1761 if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) {
1763 v4l_print_ioctl(vfd->name, cmd);
1764 printk(KERN_CONT " error %d\n", ret);
1771 int __video_ioctl2(struct file *file,
1772 unsigned int cmd, unsigned long arg)
1779 size_t ctrls_size = 0;
1780 void __user *user_ptr = NULL;
1782 #ifdef __OLD_VIDIOC_
1783 cmd = video_fix_command(cmd);
1785 is_ext_ctrl = (cmd == VIDIOC_S_EXT_CTRLS || cmd == VIDIOC_G_EXT_CTRLS ||
1786 cmd == VIDIOC_TRY_EXT_CTRLS);
1788 /* Copy arguments into temp kernel buffer */
1789 switch (_IOC_DIR(cmd)) {
1795 case (_IOC_WRITE | _IOC_READ):
1796 if (_IOC_SIZE(cmd) <= sizeof(sbuf)) {
1799 /* too big to allocate from stack */
1800 mbuf = kmalloc(_IOC_SIZE(cmd), GFP_KERNEL);
1807 if (_IOC_DIR(cmd) & _IOC_WRITE)
1808 if (copy_from_user(parg, (void __user *)arg, _IOC_SIZE(cmd)))
1814 struct v4l2_ext_controls *p = parg;
1816 /* In case of an error, tell the caller that it wasn't
1817 a specific control that caused it. */
1818 p->error_idx = p->count;
1819 user_ptr = (void __user *)p->controls;
1821 ctrls_size = sizeof(struct v4l2_ext_control) * p->count;
1822 /* Note: v4l2_ext_controls fits in sbuf[] so mbuf is still NULL. */
1823 mbuf = kmalloc(ctrls_size, GFP_KERNEL);
1828 if (copy_from_user(mbuf, user_ptr, ctrls_size))
1835 err = __video_do_ioctl(file, cmd, parg);
1836 if (err == -ENOIOCTLCMD)
1839 struct v4l2_ext_controls *p = parg;
1841 p->controls = (void *)user_ptr;
1842 if (p->count && err == 0 && copy_to_user(user_ptr, mbuf, ctrls_size))
1850 /* Copy results into user buffer */
1851 switch (_IOC_DIR(cmd)) {
1853 case (_IOC_WRITE | _IOC_READ):
1854 if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd)))
1863 EXPORT_SYMBOL(__video_ioctl2);
1865 int video_ioctl2(struct inode *inode, struct file *file,
1866 unsigned int cmd, unsigned long arg)
1868 return __video_ioctl2(file, cmd, arg);
1870 EXPORT_SYMBOL(video_ioctl2);