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