Blame view

drivers/media/video/v4l2-ioctl.c 62.2 KB
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1
2
3
4
5
6
7
8
9
10
  /*
   * Video capture interface for Linux version 2
   *
   * A generic framework to process V4L2 ioctl commands.
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License
   * as published by the Free Software Foundation; either version
   * 2 of the License, or (at your option) any later version.
   *
d9b01449e   Alan Cox   V4L/DVB (9491): r...
11
   * Authors:	Alan Cox, <alan@lxorguk.ukuu.org.uk> (version 1)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
12
13
14
15
   *              Mauro Carvalho Chehab <mchehab@infradead.org> (version 2)
   */
  
  #include <linux/module.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
16
  #include <linux/slab.h>
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
17
18
  #include <linux/types.h>
  #include <linux/kernel.h>
ae6db5154   Mauro Carvalho Chehab   [media] v4l2-ioct...
19
  #include <linux/version.h>
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
20

35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
21
  #include <linux/videodev2.h>
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
22
23
  #include <media/v4l2-common.h>
  #include <media/v4l2-ioctl.h>
11bbc1cad   Hans Verkuil   V4L/DVB: v4l2: ho...
24
  #include <media/v4l2-ctrls.h>
d3d7c9635   Sakari Ailus   V4L/DVB: V4L: Eve...
25
26
  #include <media/v4l2-fh.h>
  #include <media/v4l2-event.h>
99cd47bc7   Hans Verkuil   [media] v4l2-ioct...
27
  #include <media/v4l2-device.h>
80b36e0fc   Hans Verkuil   V4L/DVB (10490): ...
28
  #include <media/v4l2-chip-ident.h>
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
  
  #define dbgarg(cmd, fmt, arg...) \
  		do {							\
  		    if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) {		\
  			printk(KERN_DEBUG "%s: ",  vfd->name);		\
  			v4l_printk_ioctl(cmd);				\
  			printk(" " fmt,  ## arg);			\
  		    }							\
  		} while (0)
  
  #define dbgarg2(fmt, arg...) \
  		do {							\
  		    if (vfd->debug & V4L2_DEBUG_IOCTL_ARG)		\
  			printk(KERN_DEBUG "%s: " fmt, vfd->name, ## arg);\
  		} while (0)
d33fbcbb2   Mauro Carvalho Chehab   V4L/DVB (12168): ...
44
45
46
47
48
  #define dbgarg3(fmt, arg...) \
  		do {							\
  		    if (vfd->debug & V4L2_DEBUG_IOCTL_ARG)		\
  			printk(KERN_CONT "%s: " fmt, vfd->name, ## arg);\
  		} while (0)
25985edce   Lucas De Marchi   Fix common misspe...
49
  /* Zero out the end of the struct pointed to by p.  Everything after, but
7ecc0cf93   Trent Piepho   V4L/DVB (11662): ...
50
51
52
53
   * not including, the specified field is cleared. */
  #define CLEAR_AFTER_FIELD(p, field) \
  	memset((u8 *)(p) + offsetof(typeof(*(p)), field) + sizeof((p)->field), \
  	0, sizeof(*(p)) - offsetof(typeof(*(p)), field) - sizeof((p)->field))
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
54
  #define have_fmt_ops(foo) (						\
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
55
56
57
58
59
  	ops->vidioc_##foo##_fmt_vid_cap ||				\
  	ops->vidioc_##foo##_fmt_vid_out ||				\
  	ops->vidioc_##foo##_fmt_vid_cap_mplane ||			\
  	ops->vidioc_##foo##_fmt_vid_out_mplane ||			\
  	ops->vidioc_##foo##_fmt_vid_overlay ||				\
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
60
61
62
63
64
65
  	ops->vidioc_##foo##_fmt_vbi_cap ||				\
  	ops->vidioc_##foo##_fmt_vid_out_overlay ||			\
  	ops->vidioc_##foo##_fmt_vbi_out ||				\
  	ops->vidioc_##foo##_fmt_sliced_vbi_cap ||			\
  	ops->vidioc_##foo##_fmt_sliced_vbi_out ||			\
  	ops->vidioc_##foo##_fmt_type_private)
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
66

35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
  struct std_descr {
  	v4l2_std_id std;
  	const char *descr;
  };
  
  static const struct std_descr standards[] = {
  	{ V4L2_STD_NTSC, 	"NTSC"      },
  	{ V4L2_STD_NTSC_M, 	"NTSC-M"    },
  	{ V4L2_STD_NTSC_M_JP, 	"NTSC-M-JP" },
  	{ V4L2_STD_NTSC_M_KR,	"NTSC-M-KR" },
  	{ V4L2_STD_NTSC_443, 	"NTSC-443"  },
  	{ V4L2_STD_PAL, 	"PAL"       },
  	{ V4L2_STD_PAL_BG, 	"PAL-BG"    },
  	{ V4L2_STD_PAL_B, 	"PAL-B"     },
  	{ V4L2_STD_PAL_B1, 	"PAL-B1"    },
  	{ V4L2_STD_PAL_G, 	"PAL-G"     },
  	{ V4L2_STD_PAL_H, 	"PAL-H"     },
  	{ V4L2_STD_PAL_I, 	"PAL-I"     },
  	{ V4L2_STD_PAL_DK, 	"PAL-DK"    },
  	{ V4L2_STD_PAL_D, 	"PAL-D"     },
  	{ V4L2_STD_PAL_D1, 	"PAL-D1"    },
  	{ V4L2_STD_PAL_K, 	"PAL-K"     },
  	{ V4L2_STD_PAL_M, 	"PAL-M"     },
  	{ V4L2_STD_PAL_N, 	"PAL-N"     },
  	{ V4L2_STD_PAL_Nc, 	"PAL-Nc"    },
  	{ V4L2_STD_PAL_60, 	"PAL-60"    },
  	{ V4L2_STD_SECAM, 	"SECAM"     },
  	{ V4L2_STD_SECAM_B, 	"SECAM-B"   },
  	{ V4L2_STD_SECAM_G, 	"SECAM-G"   },
  	{ V4L2_STD_SECAM_H, 	"SECAM-H"   },
  	{ V4L2_STD_SECAM_DK, 	"SECAM-DK"  },
  	{ V4L2_STD_SECAM_D, 	"SECAM-D"   },
  	{ V4L2_STD_SECAM_K, 	"SECAM-K"   },
  	{ V4L2_STD_SECAM_K1, 	"SECAM-K1"  },
  	{ V4L2_STD_SECAM_L, 	"SECAM-L"   },
  	{ V4L2_STD_SECAM_LC, 	"SECAM-Lc"  },
  	{ 0, 			"Unknown"   }
  };
  
  /* video4linux standard ID conversion to standard name
   */
  const char *v4l2_norm_to_name(v4l2_std_id id)
  {
  	u32 myid = id;
  	int i;
  
  	/* HACK: ppc32 architecture doesn't have __ucmpdi2 function to handle
  	   64 bit comparations. So, on that architecture, with some gcc
  	   variants, compilation fails. Currently, the max value is 30bit wide.
  	 */
  	BUG_ON(myid != id);
  
  	for (i = 0; standards[i].std; i++)
  		if (myid == standards[i].std)
  			break;
  	return standards[i].descr;
  }
  EXPORT_SYMBOL(v4l2_norm_to_name);
51f0b8d57   Trent Piepho   V4L/DVB (10813): ...
125
126
127
128
129
130
131
132
133
134
135
136
  /* Returns frame period for the given standard */
  void v4l2_video_std_frame_period(int id, struct v4l2_fract *frameperiod)
  {
  	if (id & V4L2_STD_525_60) {
  		frameperiod->numerator = 1001;
  		frameperiod->denominator = 30000;
  	} else {
  		frameperiod->numerator = 1;
  		frameperiod->denominator = 25;
  	}
  }
  EXPORT_SYMBOL(v4l2_video_std_frame_period);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
137
138
139
140
141
  /* Fill in the fields of a v4l2_standard structure according to the
     'id' and 'transmission' parameters.  Returns negative on error.  */
  int v4l2_video_std_construct(struct v4l2_standard *vs,
  			     int id, const char *name)
  {
51f0b8d57   Trent Piepho   V4L/DVB (10813): ...
142
143
144
  	vs->id = id;
  	v4l2_video_std_frame_period(id, &vs->frameperiod);
  	vs->framelines = (id & V4L2_STD_525_60) ? 525 : 625;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
  	strlcpy(vs->name, name, sizeof(vs->name));
  	return 0;
  }
  EXPORT_SYMBOL(v4l2_video_std_construct);
  
  /* ----------------------------------------------------------------- */
  /* some arrays for pretty-printing debug messages of enum types      */
  
  const char *v4l2_field_names[] = {
  	[V4L2_FIELD_ANY]        = "any",
  	[V4L2_FIELD_NONE]       = "none",
  	[V4L2_FIELD_TOP]        = "top",
  	[V4L2_FIELD_BOTTOM]     = "bottom",
  	[V4L2_FIELD_INTERLACED] = "interlaced",
  	[V4L2_FIELD_SEQ_TB]     = "seq-tb",
  	[V4L2_FIELD_SEQ_BT]     = "seq-bt",
  	[V4L2_FIELD_ALTERNATE]  = "alternate",
  	[V4L2_FIELD_INTERLACED_TB] = "interlaced-tb",
  	[V4L2_FIELD_INTERLACED_BT] = "interlaced-bt",
  };
  EXPORT_SYMBOL(v4l2_field_names);
  
  const char *v4l2_type_names[] = {
  	[V4L2_BUF_TYPE_VIDEO_CAPTURE]      = "vid-cap",
  	[V4L2_BUF_TYPE_VIDEO_OVERLAY]      = "vid-overlay",
  	[V4L2_BUF_TYPE_VIDEO_OUTPUT]       = "vid-out",
  	[V4L2_BUF_TYPE_VBI_CAPTURE]        = "vbi-cap",
  	[V4L2_BUF_TYPE_VBI_OUTPUT]         = "vbi-out",
  	[V4L2_BUF_TYPE_SLICED_VBI_CAPTURE] = "sliced-vbi-cap",
  	[V4L2_BUF_TYPE_SLICED_VBI_OUTPUT]  = "sliced-vbi-out",
  	[V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY] = "vid-out-overlay",
f8f3914cf   Pawel Osciak   [media] v4l: Add ...
176
177
  	[V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE] = "vid-cap-mplane",
  	[V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE] = "vid-out-mplane",
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
178
179
180
181
182
183
184
185
186
187
188
189
190
191
  };
  EXPORT_SYMBOL(v4l2_type_names);
  
  static const char *v4l2_memory_names[] = {
  	[V4L2_MEMORY_MMAP]    = "mmap",
  	[V4L2_MEMORY_USERPTR] = "userptr",
  	[V4L2_MEMORY_OVERLAY] = "overlay",
  };
  
  #define prt_names(a, arr) ((((a) >= 0) && ((a) < ARRAY_SIZE(arr))) ? \
  			   arr[a] : "unknown")
  
  /* ------------------------------------------------------------------ */
  /* debug help functions                                               */
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
  static const char *v4l2_ioctls[] = {
  	[_IOC_NR(VIDIOC_QUERYCAP)]         = "VIDIOC_QUERYCAP",
  	[_IOC_NR(VIDIOC_RESERVED)]         = "VIDIOC_RESERVED",
  	[_IOC_NR(VIDIOC_ENUM_FMT)]         = "VIDIOC_ENUM_FMT",
  	[_IOC_NR(VIDIOC_G_FMT)]            = "VIDIOC_G_FMT",
  	[_IOC_NR(VIDIOC_S_FMT)]            = "VIDIOC_S_FMT",
  	[_IOC_NR(VIDIOC_REQBUFS)]          = "VIDIOC_REQBUFS",
  	[_IOC_NR(VIDIOC_QUERYBUF)]         = "VIDIOC_QUERYBUF",
  	[_IOC_NR(VIDIOC_G_FBUF)]           = "VIDIOC_G_FBUF",
  	[_IOC_NR(VIDIOC_S_FBUF)]           = "VIDIOC_S_FBUF",
  	[_IOC_NR(VIDIOC_OVERLAY)]          = "VIDIOC_OVERLAY",
  	[_IOC_NR(VIDIOC_QBUF)]             = "VIDIOC_QBUF",
  	[_IOC_NR(VIDIOC_DQBUF)]            = "VIDIOC_DQBUF",
  	[_IOC_NR(VIDIOC_STREAMON)]         = "VIDIOC_STREAMON",
  	[_IOC_NR(VIDIOC_STREAMOFF)]        = "VIDIOC_STREAMOFF",
  	[_IOC_NR(VIDIOC_G_PARM)]           = "VIDIOC_G_PARM",
  	[_IOC_NR(VIDIOC_S_PARM)]           = "VIDIOC_S_PARM",
  	[_IOC_NR(VIDIOC_G_STD)]            = "VIDIOC_G_STD",
  	[_IOC_NR(VIDIOC_S_STD)]            = "VIDIOC_S_STD",
  	[_IOC_NR(VIDIOC_ENUMSTD)]          = "VIDIOC_ENUMSTD",
  	[_IOC_NR(VIDIOC_ENUMINPUT)]        = "VIDIOC_ENUMINPUT",
  	[_IOC_NR(VIDIOC_G_CTRL)]           = "VIDIOC_G_CTRL",
  	[_IOC_NR(VIDIOC_S_CTRL)]           = "VIDIOC_S_CTRL",
  	[_IOC_NR(VIDIOC_G_TUNER)]          = "VIDIOC_G_TUNER",
  	[_IOC_NR(VIDIOC_S_TUNER)]          = "VIDIOC_S_TUNER",
  	[_IOC_NR(VIDIOC_G_AUDIO)]          = "VIDIOC_G_AUDIO",
  	[_IOC_NR(VIDIOC_S_AUDIO)]          = "VIDIOC_S_AUDIO",
  	[_IOC_NR(VIDIOC_QUERYCTRL)]        = "VIDIOC_QUERYCTRL",
  	[_IOC_NR(VIDIOC_QUERYMENU)]        = "VIDIOC_QUERYMENU",
  	[_IOC_NR(VIDIOC_G_INPUT)]          = "VIDIOC_G_INPUT",
  	[_IOC_NR(VIDIOC_S_INPUT)]          = "VIDIOC_S_INPUT",
  	[_IOC_NR(VIDIOC_G_OUTPUT)]         = "VIDIOC_G_OUTPUT",
  	[_IOC_NR(VIDIOC_S_OUTPUT)]         = "VIDIOC_S_OUTPUT",
  	[_IOC_NR(VIDIOC_ENUMOUTPUT)]       = "VIDIOC_ENUMOUTPUT",
  	[_IOC_NR(VIDIOC_G_AUDOUT)]         = "VIDIOC_G_AUDOUT",
  	[_IOC_NR(VIDIOC_S_AUDOUT)]         = "VIDIOC_S_AUDOUT",
  	[_IOC_NR(VIDIOC_G_MODULATOR)]      = "VIDIOC_G_MODULATOR",
  	[_IOC_NR(VIDIOC_S_MODULATOR)]      = "VIDIOC_S_MODULATOR",
  	[_IOC_NR(VIDIOC_G_FREQUENCY)]      = "VIDIOC_G_FREQUENCY",
  	[_IOC_NR(VIDIOC_S_FREQUENCY)]      = "VIDIOC_S_FREQUENCY",
  	[_IOC_NR(VIDIOC_CROPCAP)]          = "VIDIOC_CROPCAP",
  	[_IOC_NR(VIDIOC_G_CROP)]           = "VIDIOC_G_CROP",
  	[_IOC_NR(VIDIOC_S_CROP)]           = "VIDIOC_S_CROP",
0e8caacef   Tomasz Stanislawski   [media] v4l: add ...
235
236
  	[_IOC_NR(VIDIOC_G_SELECTION)]      = "VIDIOC_G_SELECTION",
  	[_IOC_NR(VIDIOC_S_SELECTION)]      = "VIDIOC_S_SELECTION",
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
  	[_IOC_NR(VIDIOC_G_JPEGCOMP)]       = "VIDIOC_G_JPEGCOMP",
  	[_IOC_NR(VIDIOC_S_JPEGCOMP)]       = "VIDIOC_S_JPEGCOMP",
  	[_IOC_NR(VIDIOC_QUERYSTD)]         = "VIDIOC_QUERYSTD",
  	[_IOC_NR(VIDIOC_TRY_FMT)]          = "VIDIOC_TRY_FMT",
  	[_IOC_NR(VIDIOC_ENUMAUDIO)]        = "VIDIOC_ENUMAUDIO",
  	[_IOC_NR(VIDIOC_ENUMAUDOUT)]       = "VIDIOC_ENUMAUDOUT",
  	[_IOC_NR(VIDIOC_G_PRIORITY)]       = "VIDIOC_G_PRIORITY",
  	[_IOC_NR(VIDIOC_S_PRIORITY)]       = "VIDIOC_S_PRIORITY",
  	[_IOC_NR(VIDIOC_G_SLICED_VBI_CAP)] = "VIDIOC_G_SLICED_VBI_CAP",
  	[_IOC_NR(VIDIOC_LOG_STATUS)]       = "VIDIOC_LOG_STATUS",
  	[_IOC_NR(VIDIOC_G_EXT_CTRLS)]      = "VIDIOC_G_EXT_CTRLS",
  	[_IOC_NR(VIDIOC_S_EXT_CTRLS)]      = "VIDIOC_S_EXT_CTRLS",
  	[_IOC_NR(VIDIOC_TRY_EXT_CTRLS)]    = "VIDIOC_TRY_EXT_CTRLS",
  #if 1
  	[_IOC_NR(VIDIOC_ENUM_FRAMESIZES)]  = "VIDIOC_ENUM_FRAMESIZES",
  	[_IOC_NR(VIDIOC_ENUM_FRAMEINTERVALS)] = "VIDIOC_ENUM_FRAMEINTERVALS",
  	[_IOC_NR(VIDIOC_G_ENC_INDEX)] 	   = "VIDIOC_G_ENC_INDEX",
  	[_IOC_NR(VIDIOC_ENCODER_CMD)] 	   = "VIDIOC_ENCODER_CMD",
  	[_IOC_NR(VIDIOC_TRY_ENCODER_CMD)]  = "VIDIOC_TRY_ENCODER_CMD",
  
  	[_IOC_NR(VIDIOC_DBG_S_REGISTER)]   = "VIDIOC_DBG_S_REGISTER",
  	[_IOC_NR(VIDIOC_DBG_G_REGISTER)]   = "VIDIOC_DBG_G_REGISTER",
aecde8b53   Hans Verkuil   V4L/DVB (10141): ...
259
  	[_IOC_NR(VIDIOC_DBG_G_CHIP_IDENT)] = "VIDIOC_DBG_G_CHIP_IDENT",
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
260
261
  	[_IOC_NR(VIDIOC_S_HW_FREQ_SEEK)]   = "VIDIOC_S_HW_FREQ_SEEK",
  #endif
b6456c0cf   Muralidharan Karicheri   V4L/DVB (13571): ...
262
263
264
265
266
267
  	[_IOC_NR(VIDIOC_ENUM_DV_PRESETS)]  = "VIDIOC_ENUM_DV_PRESETS",
  	[_IOC_NR(VIDIOC_S_DV_PRESET)]	   = "VIDIOC_S_DV_PRESET",
  	[_IOC_NR(VIDIOC_G_DV_PRESET)]	   = "VIDIOC_G_DV_PRESET",
  	[_IOC_NR(VIDIOC_QUERY_DV_PRESET)]  = "VIDIOC_QUERY_DV_PRESET",
  	[_IOC_NR(VIDIOC_S_DV_TIMINGS)]     = "VIDIOC_S_DV_TIMINGS",
  	[_IOC_NR(VIDIOC_G_DV_TIMINGS)]     = "VIDIOC_G_DV_TIMINGS",
fda102147   Sakari Ailus   V4L/DVB: V4L: Eve...
268
269
270
  	[_IOC_NR(VIDIOC_DQEVENT)]	   = "VIDIOC_DQEVENT",
  	[_IOC_NR(VIDIOC_SUBSCRIBE_EVENT)]  = "VIDIOC_SUBSCRIBE_EVENT",
  	[_IOC_NR(VIDIOC_UNSUBSCRIBE_EVENT)] = "VIDIOC_UNSUBSCRIBE_EVENT",
2150158b3   Guennadi Liakhovetski   [media] V4L: add ...
271
272
  	[_IOC_NR(VIDIOC_CREATE_BUFS)]      = "VIDIOC_CREATE_BUFS",
  	[_IOC_NR(VIDIOC_PREPARE_BUF)]      = "VIDIOC_PREPARE_BUF",
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
273
274
  };
  #define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
275
276
277
278
279
280
281
282
  /* Common ioctl debug function. This function can be used by
     external ioctl messages as well as internal V4L ioctl */
  void v4l_printk_ioctl(unsigned int cmd)
  {
  	char *dir, *type;
  
  	switch (_IOC_TYPE(cmd)) {
  	case 'd':
78a3b4db2   Hans Verkuil   V4L/DVB (11367): ...
283
284
  		type = "v4l2_int";
  		break;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
  	case 'V':
  		if (_IOC_NR(cmd) >= V4L2_IOCTLS) {
  			type = "v4l2";
  			break;
  		}
  		printk("%s", v4l2_ioctls[_IOC_NR(cmd)]);
  		return;
  	default:
  		type = "unknown";
  	}
  
  	switch (_IOC_DIR(cmd)) {
  	case _IOC_NONE:              dir = "--"; break;
  	case _IOC_READ:              dir = "r-"; break;
  	case _IOC_WRITE:             dir = "-w"; break;
  	case _IOC_READ | _IOC_WRITE: dir = "rw"; break;
  	default:                     dir = "*ERR*"; break;
  	}
  	printk("%s ioctl '%c', dir=%s, #%d (0x%08x)",
  		type, _IOC_TYPE(cmd), dir, _IOC_NR(cmd), cmd);
  }
  EXPORT_SYMBOL(v4l_printk_ioctl);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
307
308
309
310
  static void dbgbuf(unsigned int cmd, struct video_device *vfd,
  					struct v4l2_buffer *p)
  {
  	struct v4l2_timecode *tc = &p->timecode;
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
311
312
  	struct v4l2_plane *plane;
  	int i;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
313
314
  
  	dbgarg(cmd, "%02ld:%02d:%02d.%08ld index=%d, type=%s, "
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
315
316
  		"flags=0x%08d, field=%0d, sequence=%d, memory=%s
  ",
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
317
318
319
  			p->timestamp.tv_sec / 3600,
  			(int)(p->timestamp.tv_sec / 60) % 60,
  			(int)(p->timestamp.tv_sec % 60),
b045979d6   Alexander Beregalov   V4L/DVB (8681): v...
320
  			(long)p->timestamp.tv_usec,
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
321
322
  			p->index,
  			prt_names(p->type, v4l2_type_names),
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
  			p->flags, p->field, p->sequence,
  			prt_names(p->memory, v4l2_memory_names));
  
  	if (V4L2_TYPE_IS_MULTIPLANAR(p->type) && p->m.planes) {
  		for (i = 0; i < p->length; ++i) {
  			plane = &p->m.planes[i];
  			dbgarg2("plane %d: bytesused=%d, data_offset=0x%08x "
  				"offset/userptr=0x%08lx, length=%d
  ",
  				i, plane->bytesused, plane->data_offset,
  				plane->m.userptr, plane->length);
  		}
  	} else {
  		dbgarg2("bytesused=%d, offset/userptr=0x%08lx, length=%d
  ",
  			p->bytesused, p->m.userptr, p->length);
  	}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
  	dbgarg2("timecode=%02d:%02d:%02d type=%d, "
  		"flags=0x%08d, frames=%d, userbits=0x%08x
  ",
  			tc->hours, tc->minutes, tc->seconds,
  			tc->type, tc->flags, tc->frames, *(__u32 *)tc->userbits);
  }
  
  static inline void dbgrect(struct video_device *vfd, char *s,
  							struct v4l2_rect *r)
  {
  	dbgarg2("%sRect start at %dx%d, size=%dx%d
  ", s, r->left, r->top,
  						r->width, r->height);
  };
  
  static inline void v4l_print_pix_fmt(struct video_device *vfd,
  						struct v4l2_pix_format *fmt)
  {
  	dbgarg2("width=%d, height=%d, format=%c%c%c%c, field=%s, "
  		"bytesperline=%d sizeimage=%d, colorspace=%d
  ",
  		fmt->width, fmt->height,
  		(fmt->pixelformat & 0xff),
  		(fmt->pixelformat >>  8) & 0xff,
  		(fmt->pixelformat >> 16) & 0xff,
  		(fmt->pixelformat >> 24) & 0xff,
  		prt_names(fmt->field, v4l2_field_names),
  		fmt->bytesperline, fmt->sizeimage, fmt->colorspace);
  };
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
  static inline void v4l_print_pix_fmt_mplane(struct video_device *vfd,
  					    struct v4l2_pix_format_mplane *fmt)
  {
  	int i;
  
  	dbgarg2("width=%d, height=%d, format=%c%c%c%c, field=%s, "
  		"colorspace=%d, num_planes=%d
  ",
  		fmt->width, fmt->height,
  		(fmt->pixelformat & 0xff),
  		(fmt->pixelformat >>  8) & 0xff,
  		(fmt->pixelformat >> 16) & 0xff,
  		(fmt->pixelformat >> 24) & 0xff,
  		prt_names(fmt->field, v4l2_field_names),
  		fmt->colorspace, fmt->num_planes);
  
  	for (i = 0; i < fmt->num_planes; ++i)
  		dbgarg2("plane %d: bytesperline=%d sizeimage=%d
  ", i,
  			fmt->plane_fmt[i].bytesperline,
  			fmt->plane_fmt[i].sizeimage);
  }
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
391
392
393
394
395
396
397
398
399
400
  static inline void v4l_print_ext_ctrls(unsigned int cmd,
  	struct video_device *vfd, struct v4l2_ext_controls *c, int show_vals)
  {
  	__u32 i;
  
  	if (!(vfd->debug & V4L2_DEBUG_IOCTL_ARG))
  		return;
  	dbgarg(cmd, "");
  	printk(KERN_CONT "class=0x%x", c->ctrl_class);
  	for (i = 0; i < c->count; i++) {
6b5a9492c   Hans Verkuil   V4L/DVB (12543): ...
401
  		if (show_vals && !c->controls[i].size)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
402
403
404
  			printk(KERN_CONT " id/val=0x%x/0x%x",
  				c->controls[i].id, c->controls[i].value);
  		else
6b5a9492c   Hans Verkuil   V4L/DVB (12543): ...
405
406
  			printk(KERN_CONT " id=0x%x,size=%u",
  				c->controls[i].id, c->controls[i].size);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
407
408
409
410
411
412
413
414
415
416
417
  	}
  	printk(KERN_CONT "
  ");
  };
  
  static inline int check_ext_ctrls(struct v4l2_ext_controls *c, int allow_priv)
  {
  	__u32 i;
  
  	/* zero the reserved fields */
  	c->reserved[0] = c->reserved[1] = 0;
6b5a9492c   Hans Verkuil   V4L/DVB (12543): ...
418
  	for (i = 0; i < c->count; i++)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
419
  		c->controls[i].reserved2[0] = 0;
6b5a9492c   Hans Verkuil   V4L/DVB (12543): ...
420

35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
  	/* V4L2_CID_PRIVATE_BASE cannot be used as control class
  	   when using extended controls.
  	   Only when passed in through VIDIOC_G_CTRL and VIDIOC_S_CTRL
  	   is it allowed for backwards compatibility.
  	 */
  	if (!allow_priv && c->ctrl_class == V4L2_CID_PRIVATE_BASE)
  		return 0;
  	/* Check that all controls are from the same control class. */
  	for (i = 0; i < c->count; i++) {
  		if (V4L2_CTRL_ID2CLASS(c->controls[i].id) != c->ctrl_class) {
  			c->error_idx = i;
  			return 0;
  		}
  	}
  	return 1;
  }
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
437
  static int check_fmt(const struct v4l2_ioctl_ops *ops, enum v4l2_buf_type type)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
438
  {
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
439
440
  	if (ops == NULL)
  		return -EINVAL;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
441
442
  	switch (type) {
  	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
443
444
445
446
447
448
  		if (ops->vidioc_g_fmt_vid_cap ||
  				ops->vidioc_g_fmt_vid_cap_mplane)
  			return 0;
  		break;
  	case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
  		if (ops->vidioc_g_fmt_vid_cap_mplane)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
449
450
451
  			return 0;
  		break;
  	case V4L2_BUF_TYPE_VIDEO_OVERLAY:
1175d6131   Trent Piepho   V4L/DVB (11661): ...
452
  		if (ops->vidioc_g_fmt_vid_overlay)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
453
454
455
  			return 0;
  		break;
  	case V4L2_BUF_TYPE_VIDEO_OUTPUT:
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
456
457
458
459
460
461
  		if (ops->vidioc_g_fmt_vid_out ||
  				ops->vidioc_g_fmt_vid_out_mplane)
  			return 0;
  		break;
  	case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
  		if (ops->vidioc_g_fmt_vid_out_mplane)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
462
463
464
  			return 0;
  		break;
  	case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
1175d6131   Trent Piepho   V4L/DVB (11661): ...
465
  		if (ops->vidioc_g_fmt_vid_out_overlay)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
466
467
468
  			return 0;
  		break;
  	case V4L2_BUF_TYPE_VBI_CAPTURE:
1175d6131   Trent Piepho   V4L/DVB (11661): ...
469
  		if (ops->vidioc_g_fmt_vbi_cap)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
470
471
472
  			return 0;
  		break;
  	case V4L2_BUF_TYPE_VBI_OUTPUT:
1175d6131   Trent Piepho   V4L/DVB (11661): ...
473
  		if (ops->vidioc_g_fmt_vbi_out)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
474
475
476
  			return 0;
  		break;
  	case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
1175d6131   Trent Piepho   V4L/DVB (11661): ...
477
  		if (ops->vidioc_g_fmt_sliced_vbi_cap)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
478
479
480
  			return 0;
  		break;
  	case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
1175d6131   Trent Piepho   V4L/DVB (11661): ...
481
  		if (ops->vidioc_g_fmt_sliced_vbi_out)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
482
483
484
  			return 0;
  		break;
  	case V4L2_BUF_TYPE_PRIVATE:
1175d6131   Trent Piepho   V4L/DVB (11661): ...
485
  		if (ops->vidioc_g_fmt_type_private)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
486
487
488
489
490
  			return 0;
  		break;
  	}
  	return -EINVAL;
  }
069b74793   Hans Verkuil   V4L/DVB (10138): ...
491
  static long __video_do_ioctl(struct file *file,
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
492
493
494
  		unsigned int cmd, void *arg)
  {
  	struct video_device *vfd = video_devdata(file);
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
495
  	const struct v4l2_ioctl_ops *ops = vfd->ioctl_ops;
d5fbf32f3   Hans Verkuil   V4L/DVB (9324): v...
496
  	void *fh = file->private_data;
99cd47bc7   Hans Verkuil   [media] v4l2-ioct...
497
  	struct v4l2_fh *vfh = NULL;
b1a873a37   Hans Verkuil   [media] v4l2: use...
498
  	int use_fh_prio = 0;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
499
  	long ret_prio = 0;
9190d191b   Mauro Carvalho Chehab   [media] v4l2 core...
500
  	long ret = -ENOTTY;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
501

6a717883e   Hans Verkuil   V4L/DVB: video_io...
502
503
504
505
  	if (ops == NULL) {
  		printk(KERN_WARNING "videodev: \"%s\" has no ioctl_ops.
  ",
  				vfd->name);
9190d191b   Mauro Carvalho Chehab   [media] v4l2 core...
506
  		return ret;
6a717883e   Hans Verkuil   V4L/DVB: video_io...
507
  	}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
508
509
510
511
512
513
  	if ((vfd->debug & V4L2_DEBUG_IOCTL) &&
  				!(vfd->debug & V4L2_DEBUG_IOCTL_ARG)) {
  		v4l_print_ioctl(vfd->name, cmd);
  		printk(KERN_CONT "
  ");
  	}
b1a873a37   Hans Verkuil   [media] v4l2: use...
514
  	if (test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags)) {
99cd47bc7   Hans Verkuil   [media] v4l2-ioct...
515
  		vfh = file->private_data;
b1a873a37   Hans Verkuil   [media] v4l2: use...
516
517
  		use_fh_prio = test_bit(V4L2_FL_USE_FH_PRIO, &vfd->flags);
  	}
99cd47bc7   Hans Verkuil   [media] v4l2-ioct...
518

93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
519
520
  	if (use_fh_prio)
  		ret_prio = v4l2_prio_check(vfd->prio, vfh->prio);
99cd47bc7   Hans Verkuil   [media] v4l2-ioct...
521

6a717883e   Hans Verkuil   V4L/DVB: video_io...
522
  	switch (cmd) {
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
523

35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
524
525
526
527
  	/* --- capabilities ------------------------------------------ */
  	case VIDIOC_QUERYCAP:
  	{
  		struct v4l2_capability *cap = (struct v4l2_capability *)arg;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
528

a399810ca   Hans Verkuil   V4L/DVB (8482): v...
529
  		if (!ops->vidioc_querycap)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
530
  			break;
ae6db5154   Mauro Carvalho Chehab   [media] v4l2-ioct...
531
  		cap->version = LINUX_VERSION_CODE;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
532
  		ret = ops->vidioc_querycap(file, fh, cap);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
  		if (!ret)
  			dbgarg(cmd, "driver=%s, card=%s, bus=%s, "
  					"version=0x%08x, "
  					"capabilities=0x%08x
  ",
  					cap->driver, cap->card, cap->bus_info,
  					cap->version,
  					cap->capabilities);
  		break;
  	}
  
  	/* --- priority ------------------------------------------ */
  	case VIDIOC_G_PRIORITY:
  	{
  		enum v4l2_priority *p = arg;
99cd47bc7   Hans Verkuil   [media] v4l2-ioct...
548
549
  		if (ops->vidioc_g_priority) {
  			ret = ops->vidioc_g_priority(file, fh, p);
b1a873a37   Hans Verkuil   [media] v4l2: use...
550
  		} else if (use_fh_prio) {
99cd47bc7   Hans Verkuil   [media] v4l2-ioct...
551
552
553
  			*p = v4l2_prio_max(&vfd->v4l2_dev->prio);
  			ret = 0;
  		}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
554
555
556
557
558
559
560
561
  		if (!ret)
  			dbgarg(cmd, "priority is %d
  ", *p);
  		break;
  	}
  	case VIDIOC_S_PRIORITY:
  	{
  		enum v4l2_priority *p = arg;
b1a873a37   Hans Verkuil   [media] v4l2: use...
562
  		if (!ops->vidioc_s_priority && !use_fh_prio)
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
563
  			break;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
564
565
  		dbgarg(cmd, "setting priority to %d
  ", *p);
99cd47bc7   Hans Verkuil   [media] v4l2-ioct...
566
567
568
  		if (ops->vidioc_s_priority)
  			ret = ops->vidioc_s_priority(file, fh, *p);
  		else
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
569
570
571
  			ret = ret_prio ? ret_prio :
  				v4l2_prio_change(&vfd->v4l2_dev->prio,
  							&vfh->prio, *p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
572
573
574
575
576
577
578
  		break;
  	}
  
  	/* --- capture ioctls ---------------------------------------- */
  	case VIDIOC_ENUM_FMT:
  	{
  		struct v4l2_fmtdesc *f = arg;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
579

19c96e4b7   Trent Piepho   V4L/DVB (10811): ...
580
  		switch (f->type) {
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
581
  		case V4L2_BUF_TYPE_VIDEO_CAPTURE:
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
582
  			if (likely(ops->vidioc_enum_fmt_vid_cap))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
583
  				ret = ops->vidioc_enum_fmt_vid_cap(file, fh, f);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
584
  			break;
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
585
  		case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
586
  			if (likely(ops->vidioc_enum_fmt_vid_cap_mplane))
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
587
588
589
  				ret = ops->vidioc_enum_fmt_vid_cap_mplane(file,
  									fh, f);
  			break;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
590
  		case V4L2_BUF_TYPE_VIDEO_OVERLAY:
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
591
  			if (likely(ops->vidioc_enum_fmt_vid_overlay))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
592
  				ret = ops->vidioc_enum_fmt_vid_overlay(file,
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
593
594
  					fh, f);
  			break;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
595
  		case V4L2_BUF_TYPE_VIDEO_OUTPUT:
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
596
  			if (likely(ops->vidioc_enum_fmt_vid_out))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
597
  				ret = ops->vidioc_enum_fmt_vid_out(file, fh, f);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
598
  			break;
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
599
  		case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
600
  			if (likely(ops->vidioc_enum_fmt_vid_out_mplane))
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
601
602
603
  				ret = ops->vidioc_enum_fmt_vid_out_mplane(file,
  									fh, f);
  			break;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
604
  		case V4L2_BUF_TYPE_PRIVATE:
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
605
  			if (likely(ops->vidioc_enum_fmt_type_private))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
606
  				ret = ops->vidioc_enum_fmt_type_private(file,
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
607
608
609
610
611
  								fh, f);
  			break;
  		default:
  			break;
  		}
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
612
  		if (likely (!ret))
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
613
614
615
616
617
618
619
620
621
  			dbgarg(cmd, "index=%d, type=%d, flags=%d, "
  				"pixelformat=%c%c%c%c, description='%s'
  ",
  				f->index, f->type, f->flags,
  				(f->pixelformat & 0xff),
  				(f->pixelformat >>  8) & 0xff,
  				(f->pixelformat >> 16) & 0xff,
  				(f->pixelformat >> 24) & 0xff,
  				f->description);
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
622
623
624
625
626
627
628
629
  		else if (ret == -ENOTTY &&
  			 (ops->vidioc_enum_fmt_vid_cap ||
  			  ops->vidioc_enum_fmt_vid_out ||
  			  ops->vidioc_enum_fmt_vid_cap_mplane ||
  			  ops->vidioc_enum_fmt_vid_out_mplane ||
  			  ops->vidioc_enum_fmt_vid_overlay ||
  			  ops->vidioc_enum_fmt_type_private))
  			ret = -EINVAL;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
630
631
632
633
634
  		break;
  	}
  	case VIDIOC_G_FMT:
  	{
  		struct v4l2_format *f = (struct v4l2_format *)arg;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
635
636
637
638
639
640
  		/* FIXME: Should be one dump per type */
  		dbgarg(cmd, "type=%s
  ", prt_names(f->type, v4l2_type_names));
  
  		switch (f->type) {
  		case V4L2_BUF_TYPE_VIDEO_CAPTURE:
1d0c86cad   Tomasz Stanislawski   [media] media: v4...
641
  			if (ops->vidioc_g_fmt_vid_cap)
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
642
  				ret = ops->vidioc_g_fmt_vid_cap(file, fh, f);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
643
644
645
  			if (!ret)
  				v4l_print_pix_fmt(vfd, &f->fmt.pix);
  			break;
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
646
  		case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
1d0c86cad   Tomasz Stanislawski   [media] media: v4...
647
  			if (ops->vidioc_g_fmt_vid_cap_mplane)
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
648
649
  				ret = ops->vidioc_g_fmt_vid_cap_mplane(file,
  									fh, f);
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
650
651
652
  			if (!ret)
  				v4l_print_pix_fmt_mplane(vfd, &f->fmt.pix_mp);
  			break;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
653
  		case V4L2_BUF_TYPE_VIDEO_OVERLAY:
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
654
  			if (likely(ops->vidioc_g_fmt_vid_overlay))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
655
  				ret = ops->vidioc_g_fmt_vid_overlay(file,
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
656
657
658
  								    fh, f);
  			break;
  		case V4L2_BUF_TYPE_VIDEO_OUTPUT:
1d0c86cad   Tomasz Stanislawski   [media] media: v4...
659
  			if (ops->vidioc_g_fmt_vid_out)
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
660
  				ret = ops->vidioc_g_fmt_vid_out(file, fh, f);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
661
662
663
  			if (!ret)
  				v4l_print_pix_fmt(vfd, &f->fmt.pix);
  			break;
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
664
  		case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
1d0c86cad   Tomasz Stanislawski   [media] media: v4...
665
  			if (ops->vidioc_g_fmt_vid_out_mplane)
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
666
667
  				ret = ops->vidioc_g_fmt_vid_out_mplane(file,
  									fh, f);
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
668
669
670
  			if (!ret)
  				v4l_print_pix_fmt_mplane(vfd, &f->fmt.pix_mp);
  			break;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
671
  		case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
672
  			if (likely(ops->vidioc_g_fmt_vid_out_overlay))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
673
  				ret = ops->vidioc_g_fmt_vid_out_overlay(file,
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
674
675
676
  				       fh, f);
  			break;
  		case V4L2_BUF_TYPE_VBI_CAPTURE:
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
677
  			if (likely(ops->vidioc_g_fmt_vbi_cap))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
678
  				ret = ops->vidioc_g_fmt_vbi_cap(file, fh, f);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
679
680
  			break;
  		case V4L2_BUF_TYPE_VBI_OUTPUT:
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
681
  			if (likely(ops->vidioc_g_fmt_vbi_out))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
682
  				ret = ops->vidioc_g_fmt_vbi_out(file, fh, f);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
683
684
  			break;
  		case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
685
  			if (likely(ops->vidioc_g_fmt_sliced_vbi_cap))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
686
  				ret = ops->vidioc_g_fmt_sliced_vbi_cap(file,
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
687
688
689
  									fh, f);
  			break;
  		case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
690
  			if (likely(ops->vidioc_g_fmt_sliced_vbi_out))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
691
  				ret = ops->vidioc_g_fmt_sliced_vbi_out(file,
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
692
693
694
  									fh, f);
  			break;
  		case V4L2_BUF_TYPE_PRIVATE:
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
695
  			if (likely(ops->vidioc_g_fmt_type_private))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
696
  				ret = ops->vidioc_g_fmt_type_private(file,
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
697
698
699
  								fh, f);
  			break;
  		}
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
700
701
  		if (unlikely(ret == -ENOTTY && have_fmt_ops(g)))
  			ret = -EINVAL;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
702
703
704
705
706
707
  
  		break;
  	}
  	case VIDIOC_S_FMT:
  	{
  		struct v4l2_format *f = (struct v4l2_format *)arg;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
708
709
710
711
712
713
714
  		if (!have_fmt_ops(s))
  			break;
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
  		ret = -EINVAL;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
715
716
717
718
719
720
  		/* FIXME: Should be one dump per type */
  		dbgarg(cmd, "type=%s
  ", prt_names(f->type, v4l2_type_names));
  
  		switch (f->type) {
  		case V4L2_BUF_TYPE_VIDEO_CAPTURE:
7ecc0cf93   Trent Piepho   V4L/DVB (11662): ...
721
  			CLEAR_AFTER_FIELD(f, fmt.pix);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
722
  			v4l_print_pix_fmt(vfd, &f->fmt.pix);
1d0c86cad   Tomasz Stanislawski   [media] media: v4...
723
  			if (ops->vidioc_s_fmt_vid_cap)
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
724
  				ret = ops->vidioc_s_fmt_vid_cap(file, fh, f);
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
725
726
727
728
  			break;
  		case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
  			CLEAR_AFTER_FIELD(f, fmt.pix_mp);
  			v4l_print_pix_fmt_mplane(vfd, &f->fmt.pix_mp);
1d0c86cad   Tomasz Stanislawski   [media] media: v4...
729
  			if (ops->vidioc_s_fmt_vid_cap_mplane)
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
730
731
  				ret = ops->vidioc_s_fmt_vid_cap_mplane(file,
  									fh, f);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
732
733
  			break;
  		case V4L2_BUF_TYPE_VIDEO_OVERLAY:
7ecc0cf93   Trent Piepho   V4L/DVB (11662): ...
734
  			CLEAR_AFTER_FIELD(f, fmt.win);
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
735
736
  			if (ops->vidioc_s_fmt_vid_overlay)
  				ret = ops->vidioc_s_fmt_vid_overlay(file,
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
737
738
739
  								    fh, f);
  			break;
  		case V4L2_BUF_TYPE_VIDEO_OUTPUT:
7ecc0cf93   Trent Piepho   V4L/DVB (11662): ...
740
  			CLEAR_AFTER_FIELD(f, fmt.pix);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
741
  			v4l_print_pix_fmt(vfd, &f->fmt.pix);
1d0c86cad   Tomasz Stanislawski   [media] media: v4...
742
  			if (ops->vidioc_s_fmt_vid_out)
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
743
  				ret = ops->vidioc_s_fmt_vid_out(file, fh, f);
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
744
745
746
747
  			break;
  		case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
  			CLEAR_AFTER_FIELD(f, fmt.pix_mp);
  			v4l_print_pix_fmt_mplane(vfd, &f->fmt.pix_mp);
1d0c86cad   Tomasz Stanislawski   [media] media: v4...
748
  			if (ops->vidioc_s_fmt_vid_out_mplane)
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
749
750
  				ret = ops->vidioc_s_fmt_vid_out_mplane(file,
  									fh, f);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
751
752
  			break;
  		case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
7ecc0cf93   Trent Piepho   V4L/DVB (11662): ...
753
  			CLEAR_AFTER_FIELD(f, fmt.win);
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
754
755
  			if (ops->vidioc_s_fmt_vid_out_overlay)
  				ret = ops->vidioc_s_fmt_vid_out_overlay(file,
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
756
757
758
  					fh, f);
  			break;
  		case V4L2_BUF_TYPE_VBI_CAPTURE:
7ecc0cf93   Trent Piepho   V4L/DVB (11662): ...
759
  			CLEAR_AFTER_FIELD(f, fmt.vbi);
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
760
  			if (likely(ops->vidioc_s_fmt_vbi_cap))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
761
  				ret = ops->vidioc_s_fmt_vbi_cap(file, fh, f);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
762
763
  			break;
  		case V4L2_BUF_TYPE_VBI_OUTPUT:
7ecc0cf93   Trent Piepho   V4L/DVB (11662): ...
764
  			CLEAR_AFTER_FIELD(f, fmt.vbi);
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
765
  			if (likely(ops->vidioc_s_fmt_vbi_out))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
766
  				ret = ops->vidioc_s_fmt_vbi_out(file, fh, f);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
767
768
  			break;
  		case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
7ecc0cf93   Trent Piepho   V4L/DVB (11662): ...
769
  			CLEAR_AFTER_FIELD(f, fmt.sliced);
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
770
  			if (likely(ops->vidioc_s_fmt_sliced_vbi_cap))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
771
  				ret = ops->vidioc_s_fmt_sliced_vbi_cap(file,
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
772
773
774
  									fh, f);
  			break;
  		case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
7ecc0cf93   Trent Piepho   V4L/DVB (11662): ...
775
  			CLEAR_AFTER_FIELD(f, fmt.sliced);
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
776
  			if (likely(ops->vidioc_s_fmt_sliced_vbi_out))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
777
  				ret = ops->vidioc_s_fmt_sliced_vbi_out(file,
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
778
  									fh, f);
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
779

35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
780
781
  			break;
  		case V4L2_BUF_TYPE_PRIVATE:
7ecc0cf93   Trent Piepho   V4L/DVB (11662): ...
782
  			/* CLEAR_AFTER_FIELD(f, fmt.raw_data); <- does nothing */
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
783
  			if (likely(ops->vidioc_s_fmt_type_private))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
784
  				ret = ops->vidioc_s_fmt_type_private(file,
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
  								fh, f);
  			break;
  		}
  		break;
  	}
  	case VIDIOC_TRY_FMT:
  	{
  		struct v4l2_format *f = (struct v4l2_format *)arg;
  
  		/* FIXME: Should be one dump per type */
  		dbgarg(cmd, "type=%s
  ", prt_names(f->type,
  						v4l2_type_names));
  		switch (f->type) {
  		case V4L2_BUF_TYPE_VIDEO_CAPTURE:
7ecc0cf93   Trent Piepho   V4L/DVB (11662): ...
800
  			CLEAR_AFTER_FIELD(f, fmt.pix);
1d0c86cad   Tomasz Stanislawski   [media] media: v4...
801
  			if (ops->vidioc_try_fmt_vid_cap)
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
802
  				ret = ops->vidioc_try_fmt_vid_cap(file, fh, f);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
803
804
805
  			if (!ret)
  				v4l_print_pix_fmt(vfd, &f->fmt.pix);
  			break;
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
806
807
  		case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
  			CLEAR_AFTER_FIELD(f, fmt.pix_mp);
1d0c86cad   Tomasz Stanislawski   [media] media: v4...
808
  			if (ops->vidioc_try_fmt_vid_cap_mplane)
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
809
810
  				ret = ops->vidioc_try_fmt_vid_cap_mplane(file,
  									 fh, f);
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
811
812
813
  			if (!ret)
  				v4l_print_pix_fmt_mplane(vfd, &f->fmt.pix_mp);
  			break;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
814
  		case V4L2_BUF_TYPE_VIDEO_OVERLAY:
7ecc0cf93   Trent Piepho   V4L/DVB (11662): ...
815
  			CLEAR_AFTER_FIELD(f, fmt.win);
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
816
  			if (likely(ops->vidioc_try_fmt_vid_overlay))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
817
  				ret = ops->vidioc_try_fmt_vid_overlay(file,
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
818
819
820
  					fh, f);
  			break;
  		case V4L2_BUF_TYPE_VIDEO_OUTPUT:
7ecc0cf93   Trent Piepho   V4L/DVB (11662): ...
821
  			CLEAR_AFTER_FIELD(f, fmt.pix);
1d0c86cad   Tomasz Stanislawski   [media] media: v4...
822
  			if (ops->vidioc_try_fmt_vid_out)
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
823
  				ret = ops->vidioc_try_fmt_vid_out(file, fh, f);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
824
825
826
  			if (!ret)
  				v4l_print_pix_fmt(vfd, &f->fmt.pix);
  			break;
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
827
828
  		case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
  			CLEAR_AFTER_FIELD(f, fmt.pix_mp);
1d0c86cad   Tomasz Stanislawski   [media] media: v4...
829
  			if (ops->vidioc_try_fmt_vid_out_mplane)
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
830
831
  				ret = ops->vidioc_try_fmt_vid_out_mplane(file,
  									 fh, f);
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
832
833
834
  			if (!ret)
  				v4l_print_pix_fmt_mplane(vfd, &f->fmt.pix_mp);
  			break;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
835
  		case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
7ecc0cf93   Trent Piepho   V4L/DVB (11662): ...
836
  			CLEAR_AFTER_FIELD(f, fmt.win);
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
837
  			if (likely(ops->vidioc_try_fmt_vid_out_overlay))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
838
  				ret = ops->vidioc_try_fmt_vid_out_overlay(file,
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
839
840
841
  				       fh, f);
  			break;
  		case V4L2_BUF_TYPE_VBI_CAPTURE:
7ecc0cf93   Trent Piepho   V4L/DVB (11662): ...
842
  			CLEAR_AFTER_FIELD(f, fmt.vbi);
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
843
  			if (likely(ops->vidioc_try_fmt_vbi_cap))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
844
  				ret = ops->vidioc_try_fmt_vbi_cap(file, fh, f);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
845
846
  			break;
  		case V4L2_BUF_TYPE_VBI_OUTPUT:
7ecc0cf93   Trent Piepho   V4L/DVB (11662): ...
847
  			CLEAR_AFTER_FIELD(f, fmt.vbi);
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
848
  			if (likely(ops->vidioc_try_fmt_vbi_out))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
849
  				ret = ops->vidioc_try_fmt_vbi_out(file, fh, f);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
850
851
  			break;
  		case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
7ecc0cf93   Trent Piepho   V4L/DVB (11662): ...
852
  			CLEAR_AFTER_FIELD(f, fmt.sliced);
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
853
  			if (likely(ops->vidioc_try_fmt_sliced_vbi_cap))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
854
  				ret = ops->vidioc_try_fmt_sliced_vbi_cap(file,
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
855
856
857
  								fh, f);
  			break;
  		case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
7ecc0cf93   Trent Piepho   V4L/DVB (11662): ...
858
  			CLEAR_AFTER_FIELD(f, fmt.sliced);
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
859
  			if (likely(ops->vidioc_try_fmt_sliced_vbi_out))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
860
  				ret = ops->vidioc_try_fmt_sliced_vbi_out(file,
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
861
862
863
  								fh, f);
  			break;
  		case V4L2_BUF_TYPE_PRIVATE:
7ecc0cf93   Trent Piepho   V4L/DVB (11662): ...
864
  			/* CLEAR_AFTER_FIELD(f, fmt.raw_data); <- does nothing */
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
865
  			if (likely(ops->vidioc_try_fmt_type_private))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
866
  				ret = ops->vidioc_try_fmt_type_private(file,
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
867
868
869
  								fh, f);
  			break;
  		}
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
870
871
  		if (unlikely(ret == -ENOTTY && have_fmt_ops(try)))
  			ret = -EINVAL;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
872
873
874
875
876
877
878
879
880
  		break;
  	}
  	/* FIXME: Those buf reqs could be handled here,
  	   with some changes on videobuf to allow its header to be included at
  	   videodev2.h or being merged at videodev2.
  	 */
  	case VIDIOC_REQBUFS:
  	{
  		struct v4l2_requestbuffers *p = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
881
  		if (!ops->vidioc_reqbufs)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
882
  			break;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
883
884
885
886
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
887
  		ret = check_fmt(ops, p->type);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
888
889
  		if (ret)
  			break;
7ecc0cf93   Trent Piepho   V4L/DVB (11662): ...
890
891
  		if (p->type < V4L2_BUF_TYPE_PRIVATE)
  			CLEAR_AFTER_FIELD(p, memory);
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
892
  		ret = ops->vidioc_reqbufs(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
893
894
895
896
897
898
899
900
901
902
  		dbgarg(cmd, "count=%d, type=%s, memory=%s
  ",
  				p->count,
  				prt_names(p->type, v4l2_type_names),
  				prt_names(p->memory, v4l2_memory_names));
  		break;
  	}
  	case VIDIOC_QUERYBUF:
  	{
  		struct v4l2_buffer *p = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
903
  		if (!ops->vidioc_querybuf)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
904
  			break;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
905
  		ret = check_fmt(ops, p->type);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
906
907
  		if (ret)
  			break;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
908
  		ret = ops->vidioc_querybuf(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
909
910
911
912
913
914
915
  		if (!ret)
  			dbgbuf(cmd, vfd, p);
  		break;
  	}
  	case VIDIOC_QBUF:
  	{
  		struct v4l2_buffer *p = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
916
  		if (!ops->vidioc_qbuf)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
917
  			break;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
918
  		ret = check_fmt(ops, p->type);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
919
920
  		if (ret)
  			break;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
921
  		ret = ops->vidioc_qbuf(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
922
923
924
925
926
927
928
  		if (!ret)
  			dbgbuf(cmd, vfd, p);
  		break;
  	}
  	case VIDIOC_DQBUF:
  	{
  		struct v4l2_buffer *p = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
929
  		if (!ops->vidioc_dqbuf)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
930
  			break;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
931
  		ret = check_fmt(ops, p->type);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
932
933
  		if (ret)
  			break;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
934
  		ret = ops->vidioc_dqbuf(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
935
936
937
938
939
940
941
  		if (!ret)
  			dbgbuf(cmd, vfd, p);
  		break;
  	}
  	case VIDIOC_OVERLAY:
  	{
  		int *i = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
942
  		if (!ops->vidioc_overlay)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
943
  			break;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
944
945
946
947
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
948
949
  		dbgarg(cmd, "value=%d
  ", *i);
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
950
  		ret = ops->vidioc_overlay(file, fh, *i);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
951
952
953
954
955
  		break;
  	}
  	case VIDIOC_G_FBUF:
  	{
  		struct v4l2_framebuffer *p = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
956
  		if (!ops->vidioc_g_fbuf)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
957
  			break;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
958
  		ret = ops->vidioc_g_fbuf(file, fh, arg);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
959
960
961
962
963
964
965
966
967
968
969
970
  		if (!ret) {
  			dbgarg(cmd, "capability=0x%x, flags=%d, base=0x%08lx
  ",
  					p->capability, p->flags,
  					(unsigned long)p->base);
  			v4l_print_pix_fmt(vfd, &p->fmt);
  		}
  		break;
  	}
  	case VIDIOC_S_FBUF:
  	{
  		struct v4l2_framebuffer *p = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
971
  		if (!ops->vidioc_s_fbuf)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
972
  			break;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
973
974
975
976
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
977
978
979
980
  		dbgarg(cmd, "capability=0x%x, flags=%d, base=0x%08lx
  ",
  			p->capability, p->flags, (unsigned long)p->base);
  		v4l_print_pix_fmt(vfd, &p->fmt);
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
981
  		ret = ops->vidioc_s_fbuf(file, fh, arg);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
982
983
984
985
986
  		break;
  	}
  	case VIDIOC_STREAMON:
  	{
  		enum v4l2_buf_type i = *(int *)arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
987
  		if (!ops->vidioc_streamon)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
988
  			break;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
989
990
991
992
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
993
994
  		dbgarg(cmd, "type=%s
  ", prt_names(i, v4l2_type_names));
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
995
  		ret = ops->vidioc_streamon(file, fh, i);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
996
997
998
999
1000
  		break;
  	}
  	case VIDIOC_STREAMOFF:
  	{
  		enum v4l2_buf_type i = *(int *)arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1001
  		if (!ops->vidioc_streamoff)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1002
  			break;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1003
1004
1005
1006
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1007
1008
  		dbgarg(cmd, "type=%s
  ", prt_names(i, v4l2_type_names));
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1009
  		ret = ops->vidioc_streamoff(file, fh, i);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1010
1011
1012
1013
1014
1015
1016
1017
1018
  		break;
  	}
  	/* ---------- tv norms ---------- */
  	case VIDIOC_ENUMSTD:
  	{
  		struct v4l2_standard *p = arg;
  		v4l2_std_id id = vfd->tvnorms, curr_id = 0;
  		unsigned int index = p->index, i, j = 0;
  		const char *descr = "";
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1019
1020
1021
  		if (id == 0)
  			break;
  		ret = -EINVAL;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
  		/* Return norm array in a canonical way */
  		for (i = 0; i <= index && id; i++) {
  			/* last std value in the standards array is 0, so this
  			   while always ends there since (id & 0) == 0. */
  			while ((id & standards[j].std) != standards[j].std)
  				j++;
  			curr_id = standards[j].std;
  			descr = standards[j].descr;
  			j++;
  			if (curr_id == 0)
  				break;
  			if (curr_id != V4L2_STD_PAL &&
  			    curr_id != V4L2_STD_SECAM &&
  			    curr_id != V4L2_STD_NTSC)
  				id &= ~curr_id;
  		}
  		if (i <= index)
3f5e18249   Hans Verkuil   V4L/DVB: video_io...
1039
  			break;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1040
1041
  
  		v4l2_video_std_construct(p, curr_id, descr);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
  
  		dbgarg(cmd, "index=%d, id=0x%Lx, name=%s, fps=%d/%d, "
  				"framelines=%d
  ", p->index,
  				(unsigned long long)p->id, p->name,
  				p->frameperiod.numerator,
  				p->frameperiod.denominator,
  				p->framelines);
  
  		ret = 0;
  		break;
  	}
  	case VIDIOC_G_STD:
  	{
  		v4l2_std_id *id = arg;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1057
  		/* Calls the specific handler */
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1058
1059
  		if (ops->vidioc_g_std)
  			ret = ops->vidioc_g_std(file, fh, id);
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
1060
1061
  		else if (vfd->current_norm) {
  			ret = 0;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1062
  			*id = vfd->current_norm;
a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
1063
  		}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1064

a5f2db539   Mauro Carvalho Chehab   v4l2-ioctl: prope...
1065
  		if (likely(!ret))
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
  			dbgarg(cmd, "std=0x%08Lx
  ", (long long unsigned)*id);
  		break;
  	}
  	case VIDIOC_S_STD:
  	{
  		v4l2_std_id *id = arg, norm;
  
  		dbgarg(cmd, "std=%08Lx
  ", (long long unsigned)*id);
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1076
1077
1078
1079
1080
1081
1082
1083
  		if (!ops->vidioc_s_std)
  			break;
  
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
  		ret = -EINVAL;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1084
1085
1086
1087
1088
  		norm = (*id) & vfd->tvnorms;
  		if (vfd->tvnorms && !norm)	/* Check if std is supported */
  			break;
  
  		/* Calls the specific handler */
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1089
  		ret = ops->vidioc_s_std(file, fh, &norm);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1090
1091
1092
1093
1094
1095
1096
1097
1098
  
  		/* Updates standard information */
  		if (ret >= 0)
  			vfd->current_norm = norm;
  		break;
  	}
  	case VIDIOC_QUERYSTD:
  	{
  		v4l2_std_id *p = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1099
  		if (!ops->vidioc_querystd)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1100
  			break;
8715e6cba   Mauro Carvalho Chehab   [media] v4l2-ioct...
1101
1102
1103
1104
1105
1106
1107
1108
  		/*
  		 * If nothing detected, it should return all supported
  		 * Drivers just need to mask the std argument, in order
  		 * to remove the standards that don't apply from the mask.
  		 * This means that tuners, audio and video decoders can join
  		 * their efforts to improve the standards detection
  		 */
  		*p = vfd->tvnorms;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1109
  		ret = ops->vidioc_querystd(file, fh, arg);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
  		if (!ret)
  			dbgarg(cmd, "detected std=%08Lx
  ",
  						(unsigned long long)*p);
  		break;
  	}
  	/* ------ input switching ---------- */
  	/* FIXME: Inputs can be handled inside videodev2 */
  	case VIDIOC_ENUMINPUT:
  	{
  		struct v4l2_input *p = arg;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1121

b6456c0cf   Muralidharan Karicheri   V4L/DVB (13571): ...
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
  		/*
  		 * We set the flags for CAP_PRESETS, CAP_CUSTOM_TIMINGS &
  		 * CAP_STD here based on ioctl handler provided by the
  		 * driver. If the driver doesn't support these
  		 * for a specific input, it must override these flags.
  		 */
  		if (ops->vidioc_s_std)
  			p->capabilities |= V4L2_IN_CAP_STD;
  		if (ops->vidioc_s_dv_preset)
  			p->capabilities |= V4L2_IN_CAP_PRESETS;
  		if (ops->vidioc_s_dv_timings)
  			p->capabilities |= V4L2_IN_CAP_CUSTOM_TIMINGS;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1134
  		if (!ops->vidioc_enum_input)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1135
  			break;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1136

a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1137
  		ret = ops->vidioc_enum_input(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
  		if (!ret)
  			dbgarg(cmd, "index=%d, name=%s, type=%d, "
  				"audioset=%d, "
  				"tuner=%d, std=%08Lx, status=%d
  ",
  				p->index, p->name, p->type, p->audioset,
  				p->tuner,
  				(unsigned long long)p->std,
  				p->status);
  		break;
  	}
  	case VIDIOC_G_INPUT:
  	{
  		unsigned int *i = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1152
  		if (!ops->vidioc_g_input)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1153
  			break;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1154
  		ret = ops->vidioc_g_input(file, fh, i);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1155
1156
1157
1158
1159
1160
1161
1162
  		if (!ret)
  			dbgarg(cmd, "value=%d
  ", *i);
  		break;
  	}
  	case VIDIOC_S_INPUT:
  	{
  		unsigned int *i = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1163
  		if (!ops->vidioc_s_input)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1164
  			break;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1165
1166
1167
1168
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1169
1170
  		dbgarg(cmd, "value=%d
  ", *i);
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1171
  		ret = ops->vidioc_s_input(file, fh, *i);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1172
1173
1174
1175
1176
1177
1178
  		break;
  	}
  
  	/* ------ output switching ---------- */
  	case VIDIOC_ENUMOUTPUT:
  	{
  		struct v4l2_output *p = arg;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1179

a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1180
  		if (!ops->vidioc_enum_output)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1181
  			break;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1182

b6456c0cf   Muralidharan Karicheri   V4L/DVB (13571): ...
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
  		/*
  		 * We set the flags for CAP_PRESETS, CAP_CUSTOM_TIMINGS &
  		 * CAP_STD here based on ioctl handler provided by the
  		 * driver. If the driver doesn't support these
  		 * for a specific output, it must override these flags.
  		 */
  		if (ops->vidioc_s_std)
  			p->capabilities |= V4L2_OUT_CAP_STD;
  		if (ops->vidioc_s_dv_preset)
  			p->capabilities |= V4L2_OUT_CAP_PRESETS;
  		if (ops->vidioc_s_dv_timings)
  			p->capabilities |= V4L2_OUT_CAP_CUSTOM_TIMINGS;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1195
  		ret = ops->vidioc_enum_output(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
  		if (!ret)
  			dbgarg(cmd, "index=%d, name=%s, type=%d, "
  				"audioset=0x%x, "
  				"modulator=%d, std=0x%08Lx
  ",
  				p->index, p->name, p->type, p->audioset,
  				p->modulator, (unsigned long long)p->std);
  		break;
  	}
  	case VIDIOC_G_OUTPUT:
  	{
  		unsigned int *i = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1208
  		if (!ops->vidioc_g_output)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1209
  			break;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1210
  		ret = ops->vidioc_g_output(file, fh, i);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1211
1212
1213
1214
1215
1216
1217
1218
  		if (!ret)
  			dbgarg(cmd, "value=%d
  ", *i);
  		break;
  	}
  	case VIDIOC_S_OUTPUT:
  	{
  		unsigned int *i = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1219
  		if (!ops->vidioc_s_output)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1220
  			break;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1221
1222
1223
1224
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1225
1226
  		dbgarg(cmd, "value=%d
  ", *i);
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1227
  		ret = ops->vidioc_s_output(file, fh, *i);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1228
1229
1230
1231
1232
1233
1234
  		break;
  	}
  
  	/* --- controls ---------------------------------------------- */
  	case VIDIOC_QUERYCTRL:
  	{
  		struct v4l2_queryctrl *p = arg;
2d28b686a   Hans Verkuil   [media] v4l2-ioct...
1235
1236
1237
  		if (vfh && vfh->ctrl_handler)
  			ret = v4l2_queryctrl(vfh->ctrl_handler, p);
  		else if (vfd->ctrl_handler)
11bbc1cad   Hans Verkuil   V4L/DVB: v4l2: ho...
1238
1239
1240
1241
  			ret = v4l2_queryctrl(vfd->ctrl_handler, p);
  		else if (ops->vidioc_queryctrl)
  			ret = ops->vidioc_queryctrl(file, fh, p);
  		else
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1242
  			break;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
  		if (!ret)
  			dbgarg(cmd, "id=0x%x, type=%d, name=%s, min/max=%d/%d, "
  					"step=%d, default=%d, flags=0x%08x
  ",
  					p->id, p->type, p->name,
  					p->minimum, p->maximum,
  					p->step, p->default_value, p->flags);
  		else
  			dbgarg(cmd, "id=0x%x
  ", p->id);
  		break;
  	}
  	case VIDIOC_G_CTRL:
  	{
  		struct v4l2_control *p = arg;
2d28b686a   Hans Verkuil   [media] v4l2-ioct...
1258
1259
1260
  		if (vfh && vfh->ctrl_handler)
  			ret = v4l2_g_ctrl(vfh->ctrl_handler, p);
  		else if (vfd->ctrl_handler)
11bbc1cad   Hans Verkuil   V4L/DVB: v4l2: ho...
1261
1262
  			ret = v4l2_g_ctrl(vfd->ctrl_handler, p);
  		else if (ops->vidioc_g_ctrl)
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1263
1264
  			ret = ops->vidioc_g_ctrl(file, fh, p);
  		else if (ops->vidioc_g_ext_ctrls) {
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1265
1266
1267
1268
1269
1270
1271
1272
1273
  			struct v4l2_ext_controls ctrls;
  			struct v4l2_ext_control ctrl;
  
  			ctrls.ctrl_class = V4L2_CTRL_ID2CLASS(p->id);
  			ctrls.count = 1;
  			ctrls.controls = &ctrl;
  			ctrl.id = p->id;
  			ctrl.value = p->value;
  			if (check_ext_ctrls(&ctrls, 1)) {
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1274
  				ret = ops->vidioc_g_ext_ctrls(file, fh, &ctrls);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
  				if (ret == 0)
  					p->value = ctrl.value;
  			}
  		} else
  			break;
  		if (!ret)
  			dbgarg(cmd, "id=0x%x, value=%d
  ", p->id, p->value);
  		else
  			dbgarg(cmd, "id=0x%x
  ", p->id);
  		break;
  	}
  	case VIDIOC_S_CTRL:
  	{
  		struct v4l2_control *p = arg;
  		struct v4l2_ext_controls ctrls;
  		struct v4l2_ext_control ctrl;
2d28b686a   Hans Verkuil   [media] v4l2-ioct...
1293
  		if (!(vfh && vfh->ctrl_handler) && !vfd->ctrl_handler &&
11bbc1cad   Hans Verkuil   V4L/DVB: v4l2: ho...
1294
  			!ops->vidioc_s_ctrl && !ops->vidioc_s_ext_ctrls)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1295
  			break;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1296
1297
1298
1299
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1300
1301
1302
  
  		dbgarg(cmd, "id=0x%x, value=%d
  ", p->id, p->value);
2d28b686a   Hans Verkuil   [media] v4l2-ioct...
1303
  		if (vfh && vfh->ctrl_handler) {
ab892bac8   Hans Verkuil   [media] v4l2-ctrl...
1304
  			ret = v4l2_s_ctrl(vfh, vfh->ctrl_handler, p);
2d28b686a   Hans Verkuil   [media] v4l2-ioct...
1305
1306
  			break;
  		}
11bbc1cad   Hans Verkuil   V4L/DVB: v4l2: ho...
1307
  		if (vfd->ctrl_handler) {
ab892bac8   Hans Verkuil   [media] v4l2-ctrl...
1308
  			ret = v4l2_s_ctrl(NULL, vfd->ctrl_handler, p);
11bbc1cad   Hans Verkuil   V4L/DVB: v4l2: ho...
1309
1310
  			break;
  		}
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1311
1312
  		if (ops->vidioc_s_ctrl) {
  			ret = ops->vidioc_s_ctrl(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1313
1314
  			break;
  		}
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1315
  		if (!ops->vidioc_s_ext_ctrls)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1316
1317
1318
1319
1320
1321
1322
1323
  			break;
  
  		ctrls.ctrl_class = V4L2_CTRL_ID2CLASS(p->id);
  		ctrls.count = 1;
  		ctrls.controls = &ctrl;
  		ctrl.id = p->id;
  		ctrl.value = p->value;
  		if (check_ext_ctrls(&ctrls, 1))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1324
  			ret = ops->vidioc_s_ext_ctrls(file, fh, &ctrls);
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1325
1326
  		else
  			ret = -EINVAL;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1327
1328
1329
1330
1331
1332
1333
  		break;
  	}
  	case VIDIOC_G_EXT_CTRLS:
  	{
  		struct v4l2_ext_controls *p = arg;
  
  		p->error_idx = p->count;
2d28b686a   Hans Verkuil   [media] v4l2-ioct...
1334
1335
1336
  		if (vfh && vfh->ctrl_handler)
  			ret = v4l2_g_ext_ctrls(vfh->ctrl_handler, p);
  		else if (vfd->ctrl_handler)
11bbc1cad   Hans Verkuil   V4L/DVB: v4l2: ho...
1337
  			ret = v4l2_g_ext_ctrls(vfd->ctrl_handler, p);
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1338
1339
1340
1341
  		else if (ops->vidioc_g_ext_ctrls)
  			ret = check_ext_ctrls(p, 0) ?
  				ops->vidioc_g_ext_ctrls(file, fh, p) :
  				-EINVAL;
11bbc1cad   Hans Verkuil   V4L/DVB: v4l2: ho...
1342
1343
  		else
  			break;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1344
1345
1346
1347
1348
1349
1350
1351
  		v4l_print_ext_ctrls(cmd, vfd, p, !ret);
  		break;
  	}
  	case VIDIOC_S_EXT_CTRLS:
  	{
  		struct v4l2_ext_controls *p = arg;
  
  		p->error_idx = p->count;
2d28b686a   Hans Verkuil   [media] v4l2-ioct...
1352
1353
  		if (!(vfh && vfh->ctrl_handler) && !vfd->ctrl_handler &&
  				!ops->vidioc_s_ext_ctrls)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1354
  			break;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1355
1356
1357
1358
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1359
  		v4l_print_ext_ctrls(cmd, vfd, p, 1);
2d28b686a   Hans Verkuil   [media] v4l2-ioct...
1360
  		if (vfh && vfh->ctrl_handler)
ab892bac8   Hans Verkuil   [media] v4l2-ctrl...
1361
  			ret = v4l2_s_ext_ctrls(vfh, vfh->ctrl_handler, p);
2d28b686a   Hans Verkuil   [media] v4l2-ioct...
1362
  		else if (vfd->ctrl_handler)
ab892bac8   Hans Verkuil   [media] v4l2-ctrl...
1363
  			ret = v4l2_s_ext_ctrls(NULL, vfd->ctrl_handler, p);
11bbc1cad   Hans Verkuil   V4L/DVB: v4l2: ho...
1364
  		else if (check_ext_ctrls(p, 0))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1365
  			ret = ops->vidioc_s_ext_ctrls(file, fh, p);
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1366
1367
  		else
  			ret = -EINVAL;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1368
1369
1370
1371
1372
1373
1374
  		break;
  	}
  	case VIDIOC_TRY_EXT_CTRLS:
  	{
  		struct v4l2_ext_controls *p = arg;
  
  		p->error_idx = p->count;
2d28b686a   Hans Verkuil   [media] v4l2-ioct...
1375
1376
  		if (!(vfh && vfh->ctrl_handler) && !vfd->ctrl_handler &&
  				!ops->vidioc_try_ext_ctrls)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1377
1378
  			break;
  		v4l_print_ext_ctrls(cmd, vfd, p, 1);
2d28b686a   Hans Verkuil   [media] v4l2-ioct...
1379
1380
1381
  		if (vfh && vfh->ctrl_handler)
  			ret = v4l2_try_ext_ctrls(vfh->ctrl_handler, p);
  		else if (vfd->ctrl_handler)
11bbc1cad   Hans Verkuil   V4L/DVB: v4l2: ho...
1382
1383
  			ret = v4l2_try_ext_ctrls(vfd->ctrl_handler, p);
  		else if (check_ext_ctrls(p, 0))
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1384
  			ret = ops->vidioc_try_ext_ctrls(file, fh, p);
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1385
1386
  		else
  			ret = -EINVAL;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1387
1388
1389
1390
1391
  		break;
  	}
  	case VIDIOC_QUERYMENU:
  	{
  		struct v4l2_querymenu *p = arg;
2d28b686a   Hans Verkuil   [media] v4l2-ioct...
1392
1393
1394
  		if (vfh && vfh->ctrl_handler)
  			ret = v4l2_querymenu(vfh->ctrl_handler, p);
  		else if (vfd->ctrl_handler)
11bbc1cad   Hans Verkuil   V4L/DVB: v4l2: ho...
1395
1396
1397
1398
  			ret = v4l2_querymenu(vfd->ctrl_handler, p);
  		else if (ops->vidioc_querymenu)
  			ret = ops->vidioc_querymenu(file, fh, p);
  		else
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1399
  			break;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
  		if (!ret)
  			dbgarg(cmd, "id=0x%x, index=%d, name=%s
  ",
  				p->id, p->index, p->name);
  		else
  			dbgarg(cmd, "id=0x%x, index=%d
  ",
  				p->id, p->index);
  		break;
  	}
  	/* --- audio ---------------------------------------------- */
  	case VIDIOC_ENUMAUDIO:
  	{
  		struct v4l2_audio *p = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1414
  		if (!ops->vidioc_enumaudio)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1415
  			break;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1416
  		ret = ops->vidioc_enumaudio(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
  		if (!ret)
  			dbgarg(cmd, "index=%d, name=%s, capability=0x%x, "
  					"mode=0x%x
  ", p->index, p->name,
  					p->capability, p->mode);
  		else
  			dbgarg(cmd, "index=%d
  ", p->index);
  		break;
  	}
  	case VIDIOC_G_AUDIO:
  	{
  		struct v4l2_audio *p = arg;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1430

a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1431
  		if (!ops->vidioc_g_audio)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1432
  			break;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1433
  		ret = ops->vidioc_g_audio(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
  		if (!ret)
  			dbgarg(cmd, "index=%d, name=%s, capability=0x%x, "
  					"mode=0x%x
  ", p->index,
  					p->name, p->capability, p->mode);
  		else
  			dbgarg(cmd, "index=%d
  ", p->index);
  		break;
  	}
  	case VIDIOC_S_AUDIO:
  	{
  		struct v4l2_audio *p = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1447
  		if (!ops->vidioc_s_audio)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1448
  			break;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1449
1450
1451
1452
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1453
1454
1455
1456
  		dbgarg(cmd, "index=%d, name=%s, capability=0x%x, "
  					"mode=0x%x
  ", p->index, p->name,
  					p->capability, p->mode);
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1457
  		ret = ops->vidioc_s_audio(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1458
1459
1460
1461
1462
  		break;
  	}
  	case VIDIOC_ENUMAUDOUT:
  	{
  		struct v4l2_audioout *p = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1463
  		if (!ops->vidioc_enumaudout)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1464
1465
1466
  			break;
  		dbgarg(cmd, "Enum for index=%d
  ", p->index);
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1467
  		ret = ops->vidioc_enumaudout(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
  		if (!ret)
  			dbgarg2("index=%d, name=%s, capability=%d, "
  					"mode=%d
  ", p->index, p->name,
  					p->capability, p->mode);
  		break;
  	}
  	case VIDIOC_G_AUDOUT:
  	{
  		struct v4l2_audioout *p = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1478
  		if (!ops->vidioc_g_audout)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1479
  			break;
337f9d205   Trent Piepho   V4L/DVB (10812): ...
1480

a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1481
  		ret = ops->vidioc_g_audout(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
  		if (!ret)
  			dbgarg2("index=%d, name=%s, capability=%d, "
  					"mode=%d
  ", p->index, p->name,
  					p->capability, p->mode);
  		break;
  	}
  	case VIDIOC_S_AUDOUT:
  	{
  		struct v4l2_audioout *p = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1492
  		if (!ops->vidioc_s_audout)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1493
  			break;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1494
1495
1496
1497
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1498
1499
1500
1501
  		dbgarg(cmd, "index=%d, name=%s, capability=%d, "
  					"mode=%d
  ", p->index, p->name,
  					p->capability, p->mode);
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1502
  		ret = ops->vidioc_s_audout(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1503
1504
1505
1506
1507
  		break;
  	}
  	case VIDIOC_G_MODULATOR:
  	{
  		struct v4l2_modulator *p = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1508
  		if (!ops->vidioc_g_modulator)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1509
  			break;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1510
  		ret = ops->vidioc_g_modulator(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
  		if (!ret)
  			dbgarg(cmd, "index=%d, name=%s, "
  					"capability=%d, rangelow=%d,"
  					" rangehigh=%d, txsubchans=%d
  ",
  					p->index, p->name, p->capability,
  					p->rangelow, p->rangehigh,
  					p->txsubchans);
  		break;
  	}
  	case VIDIOC_S_MODULATOR:
  	{
  		struct v4l2_modulator *p = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1524
  		if (!ops->vidioc_s_modulator)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1525
  			break;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1526
1527
1528
1529
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1530
1531
1532
1533
1534
  		dbgarg(cmd, "index=%d, name=%s, capability=%d, "
  				"rangelow=%d, rangehigh=%d, txsubchans=%d
  ",
  				p->index, p->name, p->capability, p->rangelow,
  				p->rangehigh, p->txsubchans);
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1535
  			ret = ops->vidioc_s_modulator(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1536
1537
1538
1539
1540
  		break;
  	}
  	case VIDIOC_G_CROP:
  	{
  		struct v4l2_crop *p = arg;
992efeff7   Tomasz Stanislawski   [media] v4l: emul...
1541
  		if (!ops->vidioc_g_crop && !ops->vidioc_g_selection)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1542
  			break;
a56a18c3e   Mauro Carvalho Chehab   V4L/DVB (9579): v...
1543

35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1544
1545
  		dbgarg(cmd, "type=%s
  ", prt_names(p->type, v4l2_type_names));
992efeff7   Tomasz Stanislawski   [media] v4l: emul...
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
  
  		if (ops->vidioc_g_crop) {
  			ret = ops->vidioc_g_crop(file, fh, p);
  		} else {
  			/* simulate capture crop using selection api */
  			struct v4l2_selection s = {
  				.type = p->type,
  			};
  
  			/* crop means compose for output devices */
  			if (V4L2_TYPE_IS_OUTPUT(p->type))
  				s.target = V4L2_SEL_TGT_COMPOSE_ACTIVE;
  			else
  				s.target = V4L2_SEL_TGT_CROP_ACTIVE;
  
  			ret = ops->vidioc_g_selection(file, fh, &s);
  
  			/* copying results to old structure on success */
  			if (!ret)
  				p->c = s.r;
  		}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1567
1568
1569
1570
1571
1572
1573
  		if (!ret)
  			dbgrect(vfd, "", &p->c);
  		break;
  	}
  	case VIDIOC_S_CROP:
  	{
  		struct v4l2_crop *p = arg;
992efeff7   Tomasz Stanislawski   [media] v4l: emul...
1574
  		if (!ops->vidioc_s_crop && !ops->vidioc_s_selection)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1575
  			break;
992efeff7   Tomasz Stanislawski   [media] v4l: emul...
1576

93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1577
1578
1579
1580
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1581
1582
1583
  		dbgarg(cmd, "type=%s
  ", prt_names(p->type, v4l2_type_names));
  		dbgrect(vfd, "", &p->c);
992efeff7   Tomasz Stanislawski   [media] v4l: emul...
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
  
  		if (ops->vidioc_s_crop) {
  			ret = ops->vidioc_s_crop(file, fh, p);
  		} else {
  			/* simulate capture crop using selection api */
  			struct v4l2_selection s = {
  				.type = p->type,
  				.r = p->c,
  			};
  
  			/* crop means compose for output devices */
  			if (V4L2_TYPE_IS_OUTPUT(p->type))
  				s.target = V4L2_SEL_TGT_COMPOSE_ACTIVE;
  			else
  				s.target = V4L2_SEL_TGT_CROP_ACTIVE;
  
  			ret = ops->vidioc_s_selection(file, fh, &s);
  		}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1602
1603
  		break;
  	}
0e8caacef   Tomasz Stanislawski   [media] v4l: add ...
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
  	case VIDIOC_G_SELECTION:
  	{
  		struct v4l2_selection *p = arg;
  
  		if (!ops->vidioc_g_selection)
  			break;
  
  		dbgarg(cmd, "type=%s
  ", prt_names(p->type, v4l2_type_names));
  
  		ret = ops->vidioc_g_selection(file, fh, p);
  		if (!ret)
  			dbgrect(vfd, "", &p->r);
  		break;
  	}
  	case VIDIOC_S_SELECTION:
  	{
  		struct v4l2_selection *p = arg;
  
  		if (!ops->vidioc_s_selection)
  			break;
  
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
  
  		dbgarg(cmd, "type=%s
  ", prt_names(p->type, v4l2_type_names));
  		dbgrect(vfd, "", &p->r);
  
  		ret = ops->vidioc_s_selection(file, fh, p);
  		break;
  	}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1638
1639
1640
1641
1642
  	case VIDIOC_CROPCAP:
  	{
  		struct v4l2_cropcap *p = arg;
  
  		/*FIXME: Should also show v4l2_fract pixelaspect */
992efeff7   Tomasz Stanislawski   [media] v4l: emul...
1643
  		if (!ops->vidioc_cropcap && !ops->vidioc_g_selection)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1644
  			break;
a56a18c3e   Mauro Carvalho Chehab   V4L/DVB (9579): v...
1645

35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1646
1647
  		dbgarg(cmd, "type=%s
  ", prt_names(p->type, v4l2_type_names));
992efeff7   Tomasz Stanislawski   [media] v4l: emul...
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
  		if (ops->vidioc_cropcap) {
  			ret = ops->vidioc_cropcap(file, fh, p);
  		} else {
  			struct v4l2_selection s = { .type = p->type };
  
  			/* obtaining bounds */
  			if (V4L2_TYPE_IS_OUTPUT(p->type))
  				s.target = V4L2_SEL_TGT_COMPOSE_BOUNDS;
  			else
  				s.target = V4L2_SEL_TGT_CROP_BOUNDS;
  
  			ret = ops->vidioc_g_selection(file, fh, &s);
  			if (ret)
  				break;
  			p->bounds = s.r;
  
  			/* obtaining defrect */
  			if (V4L2_TYPE_IS_OUTPUT(p->type))
  				s.target = V4L2_SEL_TGT_COMPOSE_DEFAULT;
  			else
  				s.target = V4L2_SEL_TGT_CROP_DEFAULT;
  
  			ret = ops->vidioc_g_selection(file, fh, &s);
  			if (ret)
  				break;
  			p->defrect = s.r;
  
  			/* setting trivial pixelaspect */
  			p->pixelaspect.numerator = 1;
  			p->pixelaspect.denominator = 1;
  		}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1679
1680
1681
1682
1683
1684
1685
1686
1687
  		if (!ret) {
  			dbgrect(vfd, "bounds ", &p->bounds);
  			dbgrect(vfd, "defrect ", &p->defrect);
  		}
  		break;
  	}
  	case VIDIOC_G_JPEGCOMP:
  	{
  		struct v4l2_jpegcompression *p = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1688
  		if (!ops->vidioc_g_jpegcomp)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1689
  			break;
a56a18c3e   Mauro Carvalho Chehab   V4L/DVB (9579): v...
1690

a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1691
  		ret = ops->vidioc_g_jpegcomp(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
  		if (!ret)
  			dbgarg(cmd, "quality=%d, APPn=%d, "
  					"APP_len=%d, COM_len=%d, "
  					"jpeg_markers=%d
  ",
  					p->quality, p->APPn, p->APP_len,
  					p->COM_len, p->jpeg_markers);
  		break;
  	}
  	case VIDIOC_S_JPEGCOMP:
  	{
  		struct v4l2_jpegcompression *p = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1704
  		if (!ops->vidioc_g_jpegcomp)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1705
  			break;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1706
1707
1708
1709
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1710
1711
1712
1713
1714
  		dbgarg(cmd, "quality=%d, APPn=%d, APP_len=%d, "
  					"COM_len=%d, jpeg_markers=%d
  ",
  					p->quality, p->APPn, p->APP_len,
  					p->COM_len, p->jpeg_markers);
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1715
  		ret = ops->vidioc_s_jpegcomp(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1716
1717
1718
1719
1720
  		break;
  	}
  	case VIDIOC_G_ENC_INDEX:
  	{
  		struct v4l2_enc_idx *p = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1721
  		if (!ops->vidioc_g_enc_index)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1722
  			break;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1723
  		ret = ops->vidioc_g_enc_index(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1724
1725
1726
1727
1728
1729
1730
1731
1732
  		if (!ret)
  			dbgarg(cmd, "entries=%d, entries_cap=%d
  ",
  					p->entries, p->entries_cap);
  		break;
  	}
  	case VIDIOC_ENCODER_CMD:
  	{
  		struct v4l2_encoder_cmd *p = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1733
  		if (!ops->vidioc_encoder_cmd)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1734
  			break;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1735
1736
1737
1738
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1739
  		ret = ops->vidioc_encoder_cmd(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1740
1741
1742
1743
1744
1745
1746
1747
  		if (!ret)
  			dbgarg(cmd, "cmd=%d, flags=%x
  ", p->cmd, p->flags);
  		break;
  	}
  	case VIDIOC_TRY_ENCODER_CMD:
  	{
  		struct v4l2_encoder_cmd *p = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1748
  		if (!ops->vidioc_try_encoder_cmd)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1749
  			break;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1750
  		ret = ops->vidioc_try_encoder_cmd(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1751
1752
1753
1754
1755
1756
1757
1758
  		if (!ret)
  			dbgarg(cmd, "cmd=%d, flags=%x
  ", p->cmd, p->flags);
  		break;
  	}
  	case VIDIOC_G_PARM:
  	{
  		struct v4l2_streamparm *p = arg;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1759

93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1760
1761
  		if (!ops->vidioc_g_parm && !vfd->current_norm)
  			break;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1762
  		if (ops->vidioc_g_parm) {
34796bc00   Trent Piepho   V4L/DVB (11260): ...
1763
1764
1765
  			ret = check_fmt(ops, p->type);
  			if (ret)
  				break;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1766
  			ret = ops->vidioc_g_parm(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1767
  		} else {
9bedc7f7f   Hans Verkuil   V4L/DVB (12429): ...
1768
  			v4l2_std_id std = vfd->current_norm;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1769
  			ret = -EINVAL;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1770
  			if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
3f5e18249   Hans Verkuil   V4L/DVB: video_io...
1771
  				break;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1772

35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1773
  			ret = 0;
9bedc7f7f   Hans Verkuil   V4L/DVB (12429): ...
1774
1775
  			if (ops->vidioc_g_std)
  				ret = ops->vidioc_g_std(file, fh, &std);
9bedc7f7f   Hans Verkuil   V4L/DVB (12429): ...
1776
1777
1778
  			if (ret == 0)
  				v4l2_video_std_frame_period(std,
  						    &p->parm.capture.timeperframe);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1779
1780
1781
1782
1783
1784
1785
1786
1787
  		}
  
  		dbgarg(cmd, "type=%d
  ", p->type);
  		break;
  	}
  	case VIDIOC_S_PARM:
  	{
  		struct v4l2_streamparm *p = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1788
  		if (!ops->vidioc_s_parm)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1789
  			break;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1790
1791
1792
1793
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
34796bc00   Trent Piepho   V4L/DVB (11260): ...
1794
1795
1796
  		ret = check_fmt(ops, p->type);
  		if (ret)
  			break;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1797
1798
  		dbgarg(cmd, "type=%d
  ", p->type);
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1799
  		ret = ops->vidioc_s_parm(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1800
1801
1802
1803
1804
  		break;
  	}
  	case VIDIOC_G_TUNER:
  	{
  		struct v4l2_tuner *p = arg;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1805

a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1806
  		if (!ops->vidioc_g_tuner)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1807
  			break;
227690df7   Hans Verkuil   [media] v4l2-ioct...
1808
1809
  		p->type = (vfd->vfl_type == VFL_TYPE_RADIO) ?
  			V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1810
  		ret = ops->vidioc_g_tuner(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
  		if (!ret)
  			dbgarg(cmd, "index=%d, name=%s, type=%d, "
  					"capability=0x%x, rangelow=%d, "
  					"rangehigh=%d, signal=%d, afc=%d, "
  					"rxsubchans=0x%x, audmode=%d
  ",
  					p->index, p->name, p->type,
  					p->capability, p->rangelow,
  					p->rangehigh, p->signal, p->afc,
  					p->rxsubchans, p->audmode);
  		break;
  	}
  	case VIDIOC_S_TUNER:
  	{
  		struct v4l2_tuner *p = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1826
  		if (!ops->vidioc_s_tuner)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1827
  			break;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1828
1829
1830
1831
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
227690df7   Hans Verkuil   [media] v4l2-ioct...
1832
1833
  		p->type = (vfd->vfl_type == VFL_TYPE_RADIO) ?
  			V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1834
1835
1836
1837
1838
1839
1840
1841
1842
  		dbgarg(cmd, "index=%d, name=%s, type=%d, "
  				"capability=0x%x, rangelow=%d, "
  				"rangehigh=%d, signal=%d, afc=%d, "
  				"rxsubchans=0x%x, audmode=%d
  ",
  				p->index, p->name, p->type,
  				p->capability, p->rangelow,
  				p->rangehigh, p->signal, p->afc,
  				p->rxsubchans, p->audmode);
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1843
  		ret = ops->vidioc_s_tuner(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1844
1845
1846
1847
1848
  		break;
  	}
  	case VIDIOC_G_FREQUENCY:
  	{
  		struct v4l2_frequency *p = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1849
  		if (!ops->vidioc_g_frequency)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1850
  			break;
227690df7   Hans Verkuil   [media] v4l2-ioct...
1851
1852
  		p->type = (vfd->vfl_type == VFL_TYPE_RADIO) ?
  			V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1853
  		ret = ops->vidioc_g_frequency(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1854
1855
1856
1857
1858
1859
1860
1861
1862
  		if (!ret)
  			dbgarg(cmd, "tuner=%d, type=%d, frequency=%d
  ",
  					p->tuner, p->type, p->frequency);
  		break;
  	}
  	case VIDIOC_S_FREQUENCY:
  	{
  		struct v4l2_frequency *p = arg;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1863
  		if (!ops->vidioc_s_frequency)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1864
  			break;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1865
1866
1867
1868
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1869
1870
1871
  		dbgarg(cmd, "tuner=%d, type=%d, frequency=%d
  ",
  				p->tuner, p->type, p->frequency);
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1872
  		ret = ops->vidioc_s_frequency(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1873
1874
1875
1876
1877
  		break;
  	}
  	case VIDIOC_G_SLICED_VBI_CAP:
  	{
  		struct v4l2_sliced_vbi_cap *p = arg;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1878

a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1879
  		if (!ops->vidioc_g_sliced_vbi_cap)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1880
  			break;
19c96e4b7   Trent Piepho   V4L/DVB (10811): ...
1881
1882
1883
  
  		/* Clear up to type, everything after type is zerod already */
  		memset(p, 0, offsetof(struct v4l2_sliced_vbi_cap, type));
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1884
1885
  		dbgarg(cmd, "type=%s
  ", prt_names(p->type, v4l2_type_names));
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1886
  		ret = ops->vidioc_g_sliced_vbi_cap(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1887
1888
1889
1890
1891
1892
1893
  		if (!ret)
  			dbgarg2("service_set=%d
  ", p->service_set);
  		break;
  	}
  	case VIDIOC_LOG_STATUS:
  	{
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1894
  		if (!ops->vidioc_log_status)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1895
  			break;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1896
  		ret = ops->vidioc_log_status(file, fh);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1897
1898
1899
1900
1901
  		break;
  	}
  #ifdef CONFIG_VIDEO_ADV_DEBUG
  	case VIDIOC_DBG_G_REGISTER:
  	{
aecde8b53   Hans Verkuil   V4L/DVB (10141): ...
1902
  		struct v4l2_dbg_register *p = arg;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1903

a1198ccf9   Hans Verkuil   [media] v4l2-ioct...
1904
1905
1906
1907
1908
1909
  		if (ops->vidioc_g_register) {
  			if (!capable(CAP_SYS_ADMIN))
  				ret = -EPERM;
  			else
  				ret = ops->vidioc_g_register(file, fh, p);
  		}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1910
1911
1912
1913
  		break;
  	}
  	case VIDIOC_DBG_S_REGISTER:
  	{
aecde8b53   Hans Verkuil   V4L/DVB (10141): ...
1914
  		struct v4l2_dbg_register *p = arg;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1915

a1198ccf9   Hans Verkuil   [media] v4l2-ioct...
1916
1917
1918
1919
1920
1921
  		if (ops->vidioc_s_register) {
  			if (!capable(CAP_SYS_ADMIN))
  				ret = -EPERM;
  			else
  				ret = ops->vidioc_s_register(file, fh, p);
  		}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1922
1923
1924
  		break;
  	}
  #endif
aecde8b53   Hans Verkuil   V4L/DVB (10141): ...
1925
  	case VIDIOC_DBG_G_CHIP_IDENT:
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1926
  	{
aecde8b53   Hans Verkuil   V4L/DVB (10141): ...
1927
  		struct v4l2_dbg_chip_ident *p = arg;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1928

a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1929
  		if (!ops->vidioc_g_chip_ident)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1930
  			break;
80b36e0fc   Hans Verkuil   V4L/DVB (10490): ...
1931
1932
  		p->ident = V4L2_IDENT_NONE;
  		p->revision = 0;
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1933
  		ret = ops->vidioc_g_chip_ident(file, fh, p);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1934
1935
1936
1937
1938
  		if (!ret)
  			dbgarg(cmd, "chip_ident=%u, revision=0x%x
  ", p->ident, p->revision);
  		break;
  	}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1939
1940
1941
  	case VIDIOC_S_HW_FREQ_SEEK:
  	{
  		struct v4l2_hw_freq_seek *p = arg;
a6cf90a91   Hans Verkuil   [media] v4l2-ioct...
1942
  		enum v4l2_tuner_type type;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1943

a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1944
  		if (!ops->vidioc_s_hw_freq_seek)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1945
  			break;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
1946
1947
1948
1949
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
a6cf90a91   Hans Verkuil   [media] v4l2-ioct...
1950
1951
  		type = (vfd->vfl_type == VFL_TYPE_RADIO) ?
  			V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
1952
  		dbgarg(cmd,
a6cf90a91   Hans Verkuil   [media] v4l2-ioct...
1953
1954
1955
1956
1957
1958
1959
  			"tuner=%u, type=%u, seek_upward=%u, wrap_around=%u, spacing=%u
  ",
  			p->tuner, p->type, p->seek_upward, p->wrap_around, p->spacing);
  		if (p->type != type)
  			ret = -EINVAL;
  		else
  			ret = ops->vidioc_s_hw_freq_seek(file, fh, p);
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
1960
1961
  		break;
  	}
74d83fa02   Mauro Carvalho Chehab   V4L/DVB (9578): v...
1962
1963
1964
1965
1966
1967
  	case VIDIOC_ENUM_FRAMESIZES:
  	{
  		struct v4l2_frmsizeenum *p = arg;
  
  		if (!ops->vidioc_enum_framesizes)
  			break;
74d83fa02   Mauro Carvalho Chehab   V4L/DVB (9578): v...
1968
1969
  		ret = ops->vidioc_enum_framesizes(file, fh, p);
  		dbgarg(cmd,
d1afe4250   Mauro Carvalho Chehab   V4L/DVB (12124): ...
1970
1971
1972
1973
1974
1975
1976
  			"index=%d, pixelformat=%c%c%c%c, type=%d ",
  			p->index,
  			(p->pixel_format & 0xff),
  			(p->pixel_format >>  8) & 0xff,
  			(p->pixel_format >> 16) & 0xff,
  			(p->pixel_format >> 24) & 0xff,
  			p->type);
74d83fa02   Mauro Carvalho Chehab   V4L/DVB (9578): v...
1977
1978
  		switch (p->type) {
  		case V4L2_FRMSIZE_TYPE_DISCRETE:
d33fbcbb2   Mauro Carvalho Chehab   V4L/DVB (12168): ...
1979
1980
  			dbgarg3("width = %d, height=%d
  ",
74d83fa02   Mauro Carvalho Chehab   V4L/DVB (9578): v...
1981
1982
1983
  				p->discrete.width, p->discrete.height);
  			break;
  		case V4L2_FRMSIZE_TYPE_STEPWISE:
d33fbcbb2   Mauro Carvalho Chehab   V4L/DVB (12168): ...
1984
1985
  			dbgarg3("min %dx%d, max %dx%d, step %dx%d
  ",
74d83fa02   Mauro Carvalho Chehab   V4L/DVB (9578): v...
1986
1987
1988
1989
1990
  				p->stepwise.min_width,  p->stepwise.min_height,
  				p->stepwise.step_width, p->stepwise.step_height,
  				p->stepwise.max_width,  p->stepwise.max_height);
  			break;
  		case V4L2_FRMSIZE_TYPE_CONTINUOUS:
d33fbcbb2   Mauro Carvalho Chehab   V4L/DVB (12168): ...
1991
1992
  			dbgarg3("continuous
  ");
74d83fa02   Mauro Carvalho Chehab   V4L/DVB (9578): v...
1993
1994
  			break;
  		default:
d33fbcbb2   Mauro Carvalho Chehab   V4L/DVB (12168): ...
1995
1996
  			dbgarg3("- Unknown type!
  ");
74d83fa02   Mauro Carvalho Chehab   V4L/DVB (9578): v...
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
  		}
  
  		break;
  	}
  	case VIDIOC_ENUM_FRAMEINTERVALS:
  	{
  		struct v4l2_frmivalenum *p = arg;
  
  		if (!ops->vidioc_enum_frameintervals)
  			break;
74d83fa02   Mauro Carvalho Chehab   V4L/DVB (9578): v...
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
  		ret = ops->vidioc_enum_frameintervals(file, fh, p);
  		dbgarg(cmd,
  			"index=%d, pixelformat=%d, width=%d, height=%d, type=%d ",
  			p->index, p->pixel_format,
  			p->width, p->height, p->type);
  		switch (p->type) {
  		case V4L2_FRMIVAL_TYPE_DISCRETE:
  			dbgarg2("fps=%d/%d
  ",
  				p->discrete.numerator,
  				p->discrete.denominator);
  			break;
  		case V4L2_FRMIVAL_TYPE_STEPWISE:
1958578da   Mauro Carvalho Chehab   V4L/DVB (9591): v...
2020
2021
2022
2023
2024
2025
2026
2027
  			dbgarg2("min=%d/%d, max=%d/%d, step=%d/%d
  ",
  				p->stepwise.min.numerator,
  				p->stepwise.min.denominator,
  				p->stepwise.max.numerator,
  				p->stepwise.max.denominator,
  				p->stepwise.step.numerator,
  				p->stepwise.step.denominator);
74d83fa02   Mauro Carvalho Chehab   V4L/DVB (9578): v...
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
  			break;
  		case V4L2_FRMIVAL_TYPE_CONTINUOUS:
  			dbgarg2("continuous
  ");
  			break;
  		default:
  			dbgarg2("- Unknown type!
  ");
  		}
  		break;
  	}
b6456c0cf   Muralidharan Karicheri   V4L/DVB (13571): ...
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
  	case VIDIOC_ENUM_DV_PRESETS:
  	{
  		struct v4l2_dv_enum_preset *p = arg;
  
  		if (!ops->vidioc_enum_dv_presets)
  			break;
  
  		ret = ops->vidioc_enum_dv_presets(file, fh, p);
  		if (!ret)
  			dbgarg(cmd,
  				"index=%d, preset=%d, name=%s, width=%d,"
  				" height=%d ",
  				p->index, p->preset, p->name, p->width,
  				p->height);
  		break;
  	}
  	case VIDIOC_S_DV_PRESET:
  	{
  		struct v4l2_dv_preset *p = arg;
  
  		if (!ops->vidioc_s_dv_preset)
  			break;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
2061
2062
2063
2064
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
b6456c0cf   Muralidharan Karicheri   V4L/DVB (13571): ...
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
  
  		dbgarg(cmd, "preset=%d
  ", p->preset);
  		ret = ops->vidioc_s_dv_preset(file, fh, p);
  		break;
  	}
  	case VIDIOC_G_DV_PRESET:
  	{
  		struct v4l2_dv_preset *p = arg;
  
  		if (!ops->vidioc_g_dv_preset)
  			break;
  
  		ret = ops->vidioc_g_dv_preset(file, fh, p);
  		if (!ret)
  			dbgarg(cmd, "preset=%d
  ", p->preset);
  		break;
  	}
  	case VIDIOC_QUERY_DV_PRESET:
  	{
  		struct v4l2_dv_preset *p = arg;
  
  		if (!ops->vidioc_query_dv_preset)
  			break;
  
  		ret = ops->vidioc_query_dv_preset(file, fh, p);
  		if (!ret)
  			dbgarg(cmd, "preset=%d
  ", p->preset);
  		break;
  	}
  	case VIDIOC_S_DV_TIMINGS:
  	{
  		struct v4l2_dv_timings *p = arg;
  
  		if (!ops->vidioc_s_dv_timings)
  			break;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
2103
2104
2105
2106
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
b6456c0cf   Muralidharan Karicheri   V4L/DVB (13571): ...
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
  
  		switch (p->type) {
  		case V4L2_DV_BT_656_1120:
  			dbgarg2("bt-656/1120:interlaced=%d, pixelclock=%lld,"
  				" width=%d, height=%d, polarities=%x,"
  				" hfrontporch=%d, hsync=%d, hbackporch=%d,"
  				" vfrontporch=%d, vsync=%d, vbackporch=%d,"
  				" il_vfrontporch=%d, il_vsync=%d,"
  				" il_vbackporch=%d
  ",
  				p->bt.interlaced, p->bt.pixelclock,
  				p->bt.width, p->bt.height, p->bt.polarities,
  				p->bt.hfrontporch, p->bt.hsync,
  				p->bt.hbackporch, p->bt.vfrontporch,
  				p->bt.vsync, p->bt.vbackporch,
  				p->bt.il_vfrontporch, p->bt.il_vsync,
  				p->bt.il_vbackporch);
  			ret = ops->vidioc_s_dv_timings(file, fh, p);
  			break;
  		default:
  			dbgarg2("Unknown type %d!
  ", p->type);
  			break;
  		}
  		break;
  	}
  	case VIDIOC_G_DV_TIMINGS:
  	{
  		struct v4l2_dv_timings *p = arg;
  
  		if (!ops->vidioc_g_dv_timings)
  			break;
  
  		ret = ops->vidioc_g_dv_timings(file, fh, p);
  		if (!ret) {
  			switch (p->type) {
  			case V4L2_DV_BT_656_1120:
  				dbgarg2("bt-656/1120:interlaced=%d,"
  					" pixelclock=%lld,"
  					" width=%d, height=%d, polarities=%x,"
  					" hfrontporch=%d, hsync=%d,"
  					" hbackporch=%d, vfrontporch=%d,"
  					" vsync=%d, vbackporch=%d,"
  					" il_vfrontporch=%d, il_vsync=%d,"
  					" il_vbackporch=%d
  ",
  					p->bt.interlaced, p->bt.pixelclock,
  					p->bt.width, p->bt.height,
  					p->bt.polarities, p->bt.hfrontporch,
  					p->bt.hsync, p->bt.hbackporch,
  					p->bt.vfrontporch, p->bt.vsync,
  					p->bt.vbackporch, p->bt.il_vfrontporch,
  					p->bt.il_vsync, p->bt.il_vbackporch);
  				break;
  			default:
  				dbgarg2("Unknown type %d!
  ", p->type);
  				break;
  			}
  		}
  		break;
  	}
d3d7c9635   Sakari Ailus   V4L/DVB: V4L: Eve...
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
  	case VIDIOC_DQEVENT:
  	{
  		struct v4l2_event *ev = arg;
  
  		if (!ops->vidioc_subscribe_event)
  			break;
  
  		ret = v4l2_event_dequeue(fh, ev, file->f_flags & O_NONBLOCK);
  		if (ret < 0) {
  			dbgarg(cmd, "no pending events?");
  			break;
  		}
  		dbgarg(cmd,
  		       "pending=%d, type=0x%8.8x, sequence=%d, "
  		       "timestamp=%lu.%9.9lu ",
  		       ev->pending, ev->type, ev->sequence,
  		       ev->timestamp.tv_sec, ev->timestamp.tv_nsec);
  		break;
  	}
  	case VIDIOC_SUBSCRIBE_EVENT:
  	{
  		struct v4l2_event_subscription *sub = arg;
  
  		if (!ops->vidioc_subscribe_event)
  			break;
74d83fa02   Mauro Carvalho Chehab   V4L/DVB (9578): v...
2194

d3d7c9635   Sakari Ailus   V4L/DVB: V4L: Eve...
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
  		ret = ops->vidioc_subscribe_event(fh, sub);
  		if (ret < 0) {
  			dbgarg(cmd, "failed, ret=%ld", ret);
  			break;
  		}
  		dbgarg(cmd, "type=0x%8.8x", sub->type);
  		break;
  	}
  	case VIDIOC_UNSUBSCRIBE_EVENT:
  	{
  		struct v4l2_event_subscription *sub = arg;
  
  		if (!ops->vidioc_unsubscribe_event)
  			break;
  
  		ret = ops->vidioc_unsubscribe_event(fh, sub);
  		if (ret < 0) {
  			dbgarg(cmd, "failed, ret=%ld", ret);
  			break;
  		}
  		dbgarg(cmd, "type=0x%8.8x", sub->type);
  		break;
  	}
2150158b3   Guennadi Liakhovetski   [media] V4L: add ...
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
  	case VIDIOC_CREATE_BUFS:
  	{
  		struct v4l2_create_buffers *create = arg;
  
  		if (!ops->vidioc_create_bufs)
  			break;
  		if (ret_prio) {
  			ret = ret_prio;
  			break;
  		}
  		ret = check_fmt(ops, create->format.type);
  		if (ret)
  			break;
  
  		ret = ops->vidioc_create_bufs(file, fh, create);
  
  		dbgarg(cmd, "count=%d @ %d
  ", create->count, create->index);
  		break;
  	}
  	case VIDIOC_PREPARE_BUF:
  	{
  		struct v4l2_buffer *b = arg;
  
  		if (!ops->vidioc_prepare_buf)
  			break;
  		ret = check_fmt(ops, b->type);
  		if (ret)
  			break;
  
  		ret = ops->vidioc_prepare_buf(file, fh, b);
  
  		dbgarg(cmd, "index=%d", b->index);
  		break;
  	}
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
2253
  	default:
a399810ca   Hans Verkuil   V4L/DVB (8482): v...
2254
2255
  		if (!ops->vidioc_default)
  			break;
93d5a30bc   Hans Verkuil   [media] v4l2-ioct...
2256
  		ret = ops->vidioc_default(file, fh, ret_prio >= 0, cmd, arg);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
2257
  		break;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
2258
2259
2260
2261
2262
  	} /* switch */
  
  	if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) {
  		if (ret < 0) {
  			v4l_print_ioctl(vfd->name, cmd);
069b74793   Hans Verkuil   V4L/DVB (10138): ...
2263
2264
  			printk(KERN_CONT " error %ld
  ", ret);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
2265
2266
2267
2268
2269
  		}
  	}
  
  	return ret;
  }
19c96e4b7   Trent Piepho   V4L/DVB (10811): ...
2270
2271
2272
2273
2274
2275
  /* In some cases, only a few fields are used as input, i.e. when the app sets
   * "index" and then the driver fills in the rest of the structure for the thing
   * with that index.  We only need to copy up the first non-input field.  */
  static unsigned long cmd_input_size(unsigned int cmd)
  {
  	/* Size of structure up to and including 'field' */
9f1a693f7   Hans Verkuil   V4L/DVB (10920): ...
2276
2277
2278
2279
  #define CMDINSIZE(cmd, type, field) 				\
  	case VIDIOC_##cmd: 					\
  		return offsetof(struct v4l2_##type, field) + 	\
  			sizeof(((struct v4l2_##type *)0)->field);
19c96e4b7   Trent Piepho   V4L/DVB (10811): ...
2280

9f1a693f7   Hans Verkuil   V4L/DVB (10920): ...
2281
  	switch (cmd) {
19c96e4b7   Trent Piepho   V4L/DVB (10811): ...
2282
2283
  		CMDINSIZE(ENUM_FMT,		fmtdesc,	type);
  		CMDINSIZE(G_FMT,		format,		type);
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
2284
  		CMDINSIZE(QUERYBUF,		buffer,		length);
19c96e4b7   Trent Piepho   V4L/DVB (10811): ...
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
  		CMDINSIZE(G_PARM,		streamparm,	type);
  		CMDINSIZE(ENUMSTD,		standard,	index);
  		CMDINSIZE(ENUMINPUT,		input,		index);
  		CMDINSIZE(G_CTRL,		control,	id);
  		CMDINSIZE(G_TUNER,		tuner,		index);
  		CMDINSIZE(QUERYCTRL,		queryctrl,	id);
  		CMDINSIZE(QUERYMENU,		querymenu,	index);
  		CMDINSIZE(ENUMOUTPUT,		output,		index);
  		CMDINSIZE(G_MODULATOR,		modulator,	index);
  		CMDINSIZE(G_FREQUENCY,		frequency,	tuner);
  		CMDINSIZE(CROPCAP,		cropcap,	type);
  		CMDINSIZE(G_CROP,		crop,		type);
  		CMDINSIZE(ENUMAUDIO,		audio, 		index);
  		CMDINSIZE(ENUMAUDOUT,		audioout, 	index);
  		CMDINSIZE(ENCODER_CMD,		encoder_cmd,	flags);
  		CMDINSIZE(TRY_ENCODER_CMD,	encoder_cmd,	flags);
  		CMDINSIZE(G_SLICED_VBI_CAP,	sliced_vbi_cap,	type);
  		CMDINSIZE(ENUM_FRAMESIZES,	frmsizeenum,	pixel_format);
  		CMDINSIZE(ENUM_FRAMEINTERVALS,	frmivalenum,	height);
  	default:
  		return _IOC_SIZE(cmd);
  	}
  }
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
  static int check_array_args(unsigned int cmd, void *parg, size_t *array_size,
  			    void * __user *user_ptr, void ***kernel_ptr)
  {
  	int ret = 0;
  
  	switch (cmd) {
  	case VIDIOC_QUERYBUF:
  	case VIDIOC_QBUF:
  	case VIDIOC_DQBUF: {
  		struct v4l2_buffer *buf = parg;
  
  		if (V4L2_TYPE_IS_MULTIPLANAR(buf->type) && buf->length > 0) {
  			if (buf->length > VIDEO_MAX_PLANES) {
  				ret = -EINVAL;
  				break;
  			}
  			*user_ptr = (void __user *)buf->m.planes;
2ef403708   Hans Petter Selasky   [media] Fix compi...
2325
  			*kernel_ptr = (void *)&buf->m.planes;
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
  			*array_size = sizeof(struct v4l2_plane) * buf->length;
  			ret = 1;
  		}
  		break;
  	}
  
  	case VIDIOC_S_EXT_CTRLS:
  	case VIDIOC_G_EXT_CTRLS:
  	case VIDIOC_TRY_EXT_CTRLS: {
  		struct v4l2_ext_controls *ctrls = parg;
  
  		if (ctrls->count != 0) {
6c06108be   Dan Carpenter   [media] V4L/DVB: ...
2338
2339
2340
2341
  			if (ctrls->count > V4L2_CID_MAX_CTRLS) {
  				ret = -EINVAL;
  				break;
  			}
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
2342
  			*user_ptr = (void __user *)ctrls->controls;
2ef403708   Hans Petter Selasky   [media] Fix compi...
2343
  			*kernel_ptr = (void *)&ctrls->controls;
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
  			*array_size = sizeof(struct v4l2_ext_control)
  				    * ctrls->count;
  			ret = 1;
  		}
  		break;
  	}
  	}
  
  	return ret;
  }
fc0a80798   Laurent Pinchart   [media] v4l: Shar...
2354
2355
2356
  long
  video_usercopy(struct file *file, unsigned int cmd, unsigned long arg,
  	       v4l2_kioctl func)
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
2357
2358
2359
  {
  	char	sbuf[128];
  	void    *mbuf = NULL;
1d94aa369   Hans Verkuil   V4L/DVB: video_io...
2360
  	void	*parg = (void *)arg;
069b74793   Hans Verkuil   V4L/DVB (10138): ...
2361
  	long	err  = -EINVAL;
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
2362
2363
  	bool	has_array_args;
  	size_t  array_size = 0;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
2364
  	void __user *user_ptr = NULL;
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
2365
  	void	**kernel_ptr = NULL;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
2366

35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
2367
  	/*  Copy arguments into temp kernel buffer  */
337f9d205   Trent Piepho   V4L/DVB (10812): ...
2368
  	if (_IOC_DIR(cmd) != _IOC_NONE) {
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
  		if (_IOC_SIZE(cmd) <= sizeof(sbuf)) {
  			parg = sbuf;
  		} else {
  			/* too big to allocate from stack */
  			mbuf = kmalloc(_IOC_SIZE(cmd), GFP_KERNEL);
  			if (NULL == mbuf)
  				return -ENOMEM;
  			parg = mbuf;
  		}
  
  		err = -EFAULT;
19c96e4b7   Trent Piepho   V4L/DVB (10811): ...
2380
2381
2382
2383
  		if (_IOC_DIR(cmd) & _IOC_WRITE) {
  			unsigned long n = cmd_input_size(cmd);
  
  			if (copy_from_user(parg, (void __user *)arg, n))
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
2384
  				goto out;
19c96e4b7   Trent Piepho   V4L/DVB (10811): ...
2385
2386
2387
2388
  
  			/* zero out anything we don't copy from userspace */
  			if (n < _IOC_SIZE(cmd))
  				memset((u8 *)parg + n, 0, _IOC_SIZE(cmd) - n);
337f9d205   Trent Piepho   V4L/DVB (10812): ...
2389
2390
2391
  		} else {
  			/* read-only ioctl */
  			memset(parg, 0, _IOC_SIZE(cmd));
19c96e4b7   Trent Piepho   V4L/DVB (10811): ...
2392
  		}
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
2393
  	}
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
2394
2395
2396
2397
  	err = check_array_args(cmd, parg, &array_size, &user_ptr, &kernel_ptr);
  	if (err < 0)
  		goto out;
  	has_array_args = err;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
2398

d14e6d76e   Pawel Osciak   [media] v4l: Add ...
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
  	if (has_array_args) {
  		/*
  		 * When adding new types of array args, make sure that the
  		 * parent argument to ioctl (which contains the pointer to the
  		 * array) fits into sbuf (so that mbuf will still remain
  		 * unused up to here).
  		 */
  		mbuf = kmalloc(array_size, GFP_KERNEL);
  		err = -ENOMEM;
  		if (NULL == mbuf)
  			goto out_array_args;
  		err = -EFAULT;
  		if (copy_from_user(mbuf, user_ptr, array_size))
  			goto out_array_args;
  		*kernel_ptr = mbuf;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
2414
2415
2416
  	}
  
  	/* Handles IOCTL */
fc0a80798   Laurent Pinchart   [media] v4l: Shar...
2417
  	err = func(file, cmd, parg);
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
2418
2419
  	if (err == -ENOIOCTLCMD)
  		err = -EINVAL;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
2420

d14e6d76e   Pawel Osciak   [media] v4l: Add ...
2421
2422
2423
  	if (has_array_args) {
  		*kernel_ptr = user_ptr;
  		if (copy_to_user(user_ptr, mbuf, array_size))
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
2424
  			err = -EFAULT;
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
2425
  		goto out_array_args;
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
2426
2427
2428
  	}
  	if (err < 0)
  		goto out;
d14e6d76e   Pawel Osciak   [media] v4l: Add ...
2429
  out_array_args:
35ea11ff8   Hans Verkuil   V4L/DVB (8430): v...
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
  	/*  Copy results into user buffer  */
  	switch (_IOC_DIR(cmd)) {
  	case _IOC_READ:
  	case (_IOC_WRITE | _IOC_READ):
  		if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd)))
  			err = -EFAULT;
  		break;
  	}
  
  out:
  	kfree(mbuf);
  	return err;
  }
fc0a80798   Laurent Pinchart   [media] v4l: Shar...
2443
2444
2445
2446
2447
2448
2449
  EXPORT_SYMBOL(video_usercopy);
  
  long video_ioctl2(struct file *file,
  	       unsigned int cmd, unsigned long arg)
  {
  	return video_usercopy(file, cmd, arg, __video_do_ioctl);
  }
8a522c916   Mauro Carvalho Chehab   V4L/DVB (9331): R...
2450
  EXPORT_SYMBOL(video_ioctl2);