V4L/DVB (8482): videodev: move all ioctl callbacks to a new v4l2_ioctl_ops struct
authorHans Verkuil <hverkuil@xs4all.nl>
Mon, 21 Jul 2008 05:57:38 +0000 (02:57 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Sat, 26 Jul 2008 15:54:58 +0000 (12:54 -0300)
All ioctl callbacks are now stored in a new v4l2_ioctl_ops struct. Drivers fill in
a const struct v4l2_ioctl_ops and video_device just contains a const pointer to it.

This ensures a clean separation between the const ops struct and the non-const
video_device struct.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
38 files changed:
drivers/media/radio/dsbr100.c
drivers/media/radio/radio-aimslab.c
drivers/media/radio/radio-aztech.c
drivers/media/radio/radio-cadet.c
drivers/media/radio/radio-gemtek-pci.c
drivers/media/radio/radio-gemtek.c
drivers/media/radio/radio-maestro.c
drivers/media/radio/radio-maxiradio.c
drivers/media/radio/radio-rtrack2.c
drivers/media/radio/radio-sf16fmi.c
drivers/media/radio/radio-sf16fmr2.c
drivers/media/radio/radio-si470x.c
drivers/media/radio/radio-terratec.c
drivers/media/radio/radio-trust.c
drivers/media/radio/radio-typhoon.c
drivers/media/radio/radio-zoltrix.c
drivers/media/video/bt8xx/bttv-driver.c
drivers/media/video/cafe_ccic.c
drivers/media/video/cx18/cx18-ioctl.c
drivers/media/video/cx23885/cx23885-417.c
drivers/media/video/cx23885/cx23885-video.c
drivers/media/video/cx88/cx88-blackbird.c
drivers/media/video/cx88/cx88-video.c
drivers/media/video/em28xx/em28xx-video.c
drivers/media/video/gspca/gspca.c
drivers/media/video/ivtv/ivtv-ioctl.c
drivers/media/video/meye.c
drivers/media/video/s2255drv.c
drivers/media/video/saa7134/saa7134-empress.c
drivers/media/video/saa7134/saa7134-video.c
drivers/media/video/soc_camera.c
drivers/media/video/stk-webcam.c
drivers/media/video/usbvision/usbvision-video.c
drivers/media/video/v4l2-ioctl.c
drivers/media/video/vivi.c
drivers/media/video/zr364xx.c
include/media/v4l2-dev.h
include/media/v4l2-ioctl.h

index 97c6853..08bf5e8 100644 (file)
@@ -445,14 +445,7 @@ static const struct file_operations usb_dsbr100_fops = {
        .llseek         = no_llseek,
 };
 
-/* V4L2 interface */
-static struct video_device dsbr100_videodev_template =
-{
-       .owner          = THIS_MODULE,
-       .name           = "D-Link DSB-R 100",
-       .type           = VID_TYPE_TUNER,
-       .fops           = &usb_dsbr100_fops,
-       .release        = video_device_release,
+static const struct v4l2_ioctl_ops usb_dsbr100_ioctl_ops = {
        .vidioc_querycap    = vidioc_querycap,
        .vidioc_g_tuner     = vidioc_g_tuner,
        .vidioc_s_tuner     = vidioc_s_tuner,
@@ -467,6 +460,16 @@ static struct video_device dsbr100_videodev_template =
        .vidioc_s_input     = vidioc_s_input,
 };
 
+/* V4L2 interface */
+static struct video_device dsbr100_videodev_template = {
+       .owner          = THIS_MODULE,
+       .name           = "D-Link DSB-R 100",
+       .type           = VID_TYPE_TUNER,
+       .fops           = &usb_dsbr100_fops,
+       .ioctl_ops      = &usb_dsbr100_ioctl_ops,
+       .release        = video_device_release,
+};
+
 /* check if the device is present and register with v4l and
 usb if it is */
 static int usb_dsbr100_probe(struct usb_interface *intf,
index ec8d647..be9bd7a 100644 (file)
@@ -389,12 +389,7 @@ static const struct file_operations rtrack_fops = {
        .llseek         = no_llseek,
 };
 
-static struct video_device rtrack_radio=
-{
-       .owner          = THIS_MODULE,
-       .name           = "RadioTrack radio",
-       .type           = VID_TYPE_TUNER,
-       .fops           = &rtrack_fops,
+static const struct v4l2_ioctl_ops rtrack_ioctl_ops = {
        .vidioc_querycap    = vidioc_querycap,
        .vidioc_g_tuner     = vidioc_g_tuner,
        .vidioc_s_tuner     = vidioc_s_tuner,
@@ -409,6 +404,14 @@ static struct video_device rtrack_radio=
        .vidioc_s_ctrl      = vidioc_s_ctrl,
 };
 
+static struct video_device rtrack_radio = {
+       .owner          = THIS_MODULE,
+       .name           = "RadioTrack radio",
+       .type           = VID_TYPE_TUNER,
+       .fops           = &rtrack_fops,
+       .ioctl_ops      = &rtrack_ioctl_ops,
+};
+
 static int __init rtrack_init(void)
 {
        if(io==-1)
index 639164a..04c738b 100644 (file)
@@ -353,12 +353,7 @@ static const struct file_operations aztech_fops = {
        .llseek         = no_llseek,
 };
 
-static struct video_device aztech_radio=
-{
-       .owner              = THIS_MODULE,
-       .name               = "Aztech radio",
-       .type               = VID_TYPE_TUNER,
-       .fops               = &aztech_fops,
+static const struct v4l2_ioctl_ops aztech_ioctl_ops = {
        .vidioc_querycap    = vidioc_querycap,
        .vidioc_g_tuner     = vidioc_g_tuner,
        .vidioc_s_tuner     = vidioc_s_tuner,
@@ -373,6 +368,14 @@ static struct video_device aztech_radio=
        .vidioc_s_ctrl      = vidioc_s_ctrl,
 };
 
+static struct video_device aztech_radio = {
+       .owner              = THIS_MODULE,
+       .name               = "Aztech radio",
+       .type               = VID_TYPE_TUNER,
+       .fops               = &aztech_fops,
+       .ioctl_ops          = &aztech_ioctl_ops,
+};
+
 module_param_named(debug,aztech_radio.debug, int, 0644);
 MODULE_PARM_DESC(debug,"activates debug info");
 
index 484ea87..36b850f 100644 (file)
@@ -570,12 +570,7 @@ static const struct file_operations cadet_fops = {
        .llseek         = no_llseek,
 };
 
-static struct video_device cadet_radio=
-{
-       .owner          = THIS_MODULE,
-       .name           = "Cadet radio",
-       .type           = VID_TYPE_TUNER,
-       .fops           = &cadet_fops,
+static const struct v4l2_ioctl_ops cadet_ioctl_ops = {
        .vidioc_querycap    = vidioc_querycap,
        .vidioc_g_tuner     = vidioc_g_tuner,
        .vidioc_s_tuner     = vidioc_s_tuner,
@@ -590,6 +585,14 @@ static struct video_device cadet_radio=
        .vidioc_s_input     = vidioc_s_input,
 };
 
+static struct video_device cadet_radio = {
+       .owner          = THIS_MODULE,
+       .name           = "Cadet radio",
+       .type           = VID_TYPE_TUNER,
+       .fops           = &cadet_fops,
+       .ioctl_ops      = &cadet_ioctl_ops,
+};
+
 #ifdef CONFIG_PNP
 
 static struct pnp_device_id cadet_pnp_devices[] = {
index 2b834b9..c41b35f 100644 (file)
@@ -375,11 +375,7 @@ static const struct file_operations gemtek_pci_fops = {
        .llseek         = no_llseek,
 };
 
-static struct video_device vdev_template = {
-       .owner         = THIS_MODULE,
-       .name          = "Gemtek PCI Radio",
-       .type          = VID_TYPE_TUNER,
-       .fops          = &gemtek_pci_fops,
+static const struct v4l2_ioctl_ops gemtek_pci_ioctl_ops = {
        .vidioc_querycap    = vidioc_querycap,
        .vidioc_g_tuner     = vidioc_g_tuner,
        .vidioc_s_tuner     = vidioc_s_tuner,
@@ -394,6 +390,14 @@ static struct video_device vdev_template = {
        .vidioc_s_ctrl      = vidioc_s_ctrl,
 };
 
+static struct video_device vdev_template = {
+       .owner         = THIS_MODULE,
+       .name          = "Gemtek PCI Radio",
+       .type          = VID_TYPE_TUNER,
+       .fops          = &gemtek_pci_fops,
+       .ioctl_ops     = &gemtek_pci_ioctl_ops,
+};
+
 static int __devinit gemtek_pci_probe( struct pci_dev *pci_dev, const struct pci_device_id *pci_id )
 {
        struct gemtek_pci_card *card;
index 4740bac..f82b59f 100644 (file)
@@ -553,11 +553,7 @@ static int vidioc_s_audio(struct file *file, void *priv, struct v4l2_audio *a)
        return 0;
 }
 
-static struct video_device gemtek_radio = {
-       .owner                  = THIS_MODULE,
-       .name                   = "GemTek Radio card",
-       .type                   = VID_TYPE_TUNER,
-       .fops                   = &gemtek_fops,
+static const struct v4l2_ioctl_ops gemtek_ioctl_ops = {
        .vidioc_querycap        = vidioc_querycap,
        .vidioc_g_tuner         = vidioc_g_tuner,
        .vidioc_s_tuner         = vidioc_s_tuner,
@@ -572,6 +568,14 @@ static struct video_device gemtek_radio = {
        .vidioc_s_ctrl          = vidioc_s_ctrl
 };
 
+static struct video_device gemtek_radio = {
+       .owner                  = THIS_MODULE,
+       .name                   = "GemTek Radio card",
+       .type                   = VID_TYPE_TUNER,
+       .fops                   = &gemtek_fops,
+       .ioctl_ops              = &gemtek_ioctl_ops,
+};
+
 /*
  * Initialization / cleanup related stuff.
  */
index 040a73f..d074a8c 100644 (file)
@@ -355,10 +355,7 @@ static u16 __devinit radio_power_on(struct radio_device *dev)
        return (ofreq == radio_bits_get(dev));
 }
 
-static struct video_device maestro_radio = {
-       .name           = "Maestro radio",
-       .type           = VID_TYPE_TUNER,
-       .fops           = &maestro_fops,
+static const struct v4l2_ioctl_ops maestro_ioctl_ops = {
        .vidioc_querycap    = vidioc_querycap,
        .vidioc_g_tuner     = vidioc_g_tuner,
        .vidioc_s_tuner     = vidioc_s_tuner,
@@ -373,6 +370,13 @@ static struct video_device maestro_radio = {
        .vidioc_s_ctrl      = vidioc_s_ctrl,
 };
 
+static struct video_device maestro_radio = {
+       .name           = "Maestro radio",
+       .type           = VID_TYPE_TUNER,
+       .fops           = &maestro_fops,
+       .ioctl_ops      = &maestro_ioctl_ops,
+};
+
 static int __devinit maestro_probe(struct pci_dev *pdev,
        const struct pci_device_id *ent)
 {
index 9e824a7..780516d 100644 (file)
@@ -374,13 +374,7 @@ static int vidioc_s_ctrl (struct file *file, void *priv,
        return -EINVAL;
 }
 
-static struct video_device maxiradio_radio =
-{
-       .owner              = THIS_MODULE,
-       .name               = "Maxi Radio FM2000 radio",
-       .type               = VID_TYPE_TUNER,
-       .fops               = &maxiradio_fops,
-
+static const struct v4l2_ioctl_ops maxiradio_ioctl_ops = {
        .vidioc_querycap    = vidioc_querycap,
        .vidioc_g_tuner     = vidioc_g_tuner,
        .vidioc_s_tuner     = vidioc_s_tuner,
@@ -395,6 +389,14 @@ static struct video_device maxiradio_radio =
        .vidioc_s_ctrl      = vidioc_s_ctrl,
 };
 
+static struct video_device maxiradio_radio = {
+       .owner              = THIS_MODULE,
+       .name               = "Maxi Radio FM2000 radio",
+       .type               = VID_TYPE_TUNER,
+       .fops               = &maxiradio_fops,
+       .ioctl_ops          = &maxiradio_ioctl_ops,
+};
+
 static int __devinit maxiradio_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        if(!request_region(pci_resource_start(pdev, 0),
index c3fb270..045ae9d 100644 (file)
@@ -295,12 +295,7 @@ static const struct file_operations rtrack2_fops = {
        .llseek         = no_llseek,
 };
 
-static struct video_device rtrack2_radio=
-{
-       .owner          = THIS_MODULE,
-       .name           = "RadioTrack II radio",
-       .type           = VID_TYPE_TUNER,
-       .fops           = &rtrack2_fops,
+static const struct v4l2_ioctl_ops rtrack2_ioctl_ops = {
        .vidioc_querycap    = vidioc_querycap,
        .vidioc_g_tuner     = vidioc_g_tuner,
        .vidioc_s_tuner     = vidioc_s_tuner,
@@ -315,6 +310,14 @@ static struct video_device rtrack2_radio=
        .vidioc_s_input     = vidioc_s_input,
 };
 
+static struct video_device rtrack2_radio = {
+       .owner          = THIS_MODULE,
+       .name           = "RadioTrack II radio",
+       .type           = VID_TYPE_TUNER,
+       .fops           = &rtrack2_fops,
+       .ioctl_ops      = &rtrack2_ioctl_ops,
+};
+
 static int __init rtrack2_init(void)
 {
        if(io==-1)
index bb8b1c9..75b68a0 100644 (file)
@@ -295,12 +295,7 @@ static const struct file_operations fmi_fops = {
        .llseek         = no_llseek,
 };
 
-static struct video_device fmi_radio=
-{
-       .owner          = THIS_MODULE,
-       .name           = "SF16FMx radio",
-       .type           = VID_TYPE_TUNER,
-       .fops           = &fmi_fops,
+static const struct v4l2_ioctl_ops fmi_ioctl_ops = {
        .vidioc_querycap    = vidioc_querycap,
        .vidioc_g_tuner     = vidioc_g_tuner,
        .vidioc_s_tuner     = vidioc_s_tuner,
@@ -315,6 +310,14 @@ static struct video_device fmi_radio=
        .vidioc_s_ctrl      = vidioc_s_ctrl,
 };
 
+static struct video_device fmi_radio = {
+       .owner          = THIS_MODULE,
+       .name           = "SF16FMx radio",
+       .type           = VID_TYPE_TUNER,
+       .fops           = &fmi_fops,
+       .ioctl_ops      = &fmi_ioctl_ops,
+};
+
 /* ladis: this is my card. does any other types exist? */
 static struct isapnp_device_id id_table[] __devinitdata = {
        {       ISAPNP_ANY_ID, ISAPNP_ANY_ID,
index 9fa025b..5ffddce 100644 (file)
@@ -411,12 +411,7 @@ static const struct file_operations fmr2_fops = {
        .llseek         = no_llseek,
 };
 
-static struct video_device fmr2_radio=
-{
-       .owner          = THIS_MODULE,
-       .name           = "SF16FMR2 radio",
-       . type          = VID_TYPE_TUNER,
-       .fops           = &fmr2_fops,
+static const struct v4l2_ioctl_ops fmr2_ioctl_ops = {
        .vidioc_querycap    = vidioc_querycap,
        .vidioc_g_tuner     = vidioc_g_tuner,
        .vidioc_s_tuner     = vidioc_s_tuner,
@@ -431,6 +426,14 @@ static struct video_device fmr2_radio=
        .vidioc_s_ctrl      = vidioc_s_ctrl,
 };
 
+static struct video_device fmr2_radio = {
+       .owner          = THIS_MODULE,
+       .name           = "SF16FMR2 radio",
+       .type           = VID_TYPE_TUNER,
+       .fops           = &fmr2_fops,
+       .ioctl_ops      = &fmr2_ioctl_ops,
+};
+
 static int __init fmr2_init(void)
 {
        fmr2_unit.port = io;
index 3336121..b829c67 100644 (file)
@@ -1586,15 +1586,7 @@ done:
        return retval;
 }
 
-
-/*
- * si470x_viddev_tamples - video device interface
- */
-static struct video_device si470x_viddev_template = {
-       .fops                   = &si470x_fops,
-       .name                   = DRIVER_NAME,
-       .type                   = VID_TYPE_TUNER,
-       .release                = video_device_release,
+static const struct v4l2_ioctl_ops si470x_ioctl_ops = {
        .vidioc_querycap        = si470x_vidioc_querycap,
        .vidioc_g_input         = si470x_vidioc_g_input,
        .vidioc_s_input         = si470x_vidioc_s_input,
@@ -1608,6 +1600,17 @@ static struct video_device si470x_viddev_template = {
        .vidioc_g_frequency     = si470x_vidioc_g_frequency,
        .vidioc_s_frequency     = si470x_vidioc_s_frequency,
        .vidioc_s_hw_freq_seek  = si470x_vidioc_s_hw_freq_seek,
+};
+
+/*
+ * si470x_viddev_tamples - video device interface
+ */
+static struct video_device si470x_viddev_template = {
+       .fops                   = &si470x_fops,
+       .ioctl_ops              = &si470x_ioctl_ops,
+       .name                   = DRIVER_NAME,
+       .type                   = VID_TYPE_TUNER,
+       .release                = video_device_release,
        .owner                  = THIS_MODULE,
 };
 
index a9914db..3a67471 100644 (file)
@@ -367,12 +367,7 @@ static const struct file_operations terratec_fops = {
        .llseek         = no_llseek,
 };
 
-static struct video_device terratec_radio=
-{
-       .owner          = THIS_MODULE,
-       .name           = "TerraTec ActiveRadio",
-       .type           = VID_TYPE_TUNER,
-       .fops           = &terratec_fops,
+static const struct v4l2_ioctl_ops terratec_ioctl_ops = {
        .vidioc_querycap    = vidioc_querycap,
        .vidioc_g_tuner     = vidioc_g_tuner,
        .vidioc_s_tuner     = vidioc_s_tuner,
@@ -387,6 +382,14 @@ static struct video_device terratec_radio=
        .vidioc_s_input     = vidioc_s_input,
 };
 
+static struct video_device terratec_radio = {
+       .owner          = THIS_MODULE,
+       .name           = "TerraTec ActiveRadio",
+       .type           = VID_TYPE_TUNER,
+       .fops           = &terratec_fops,
+       .ioctl_ops      = &terratec_ioctl_ops,
+};
+
 static int __init terratec_init(void)
 {
        if(io==-1)
index 560c494..e334001 100644 (file)
@@ -347,12 +347,7 @@ static const struct file_operations trust_fops = {
        .llseek         = no_llseek,
 };
 
-static struct video_device trust_radio=
-{
-       .owner          = THIS_MODULE,
-       .name           = "Trust FM Radio",
-       .type           = VID_TYPE_TUNER,
-       .fops           = &trust_fops,
+static const struct v4l2_ioctl_ops trust_ioctl_ops = {
        .vidioc_querycap    = vidioc_querycap,
        .vidioc_g_tuner     = vidioc_g_tuner,
        .vidioc_s_tuner     = vidioc_s_tuner,
@@ -367,6 +362,14 @@ static struct video_device trust_radio=
        .vidioc_s_input     = vidioc_s_input,
 };
 
+static struct video_device trust_radio = {
+       .owner          = THIS_MODULE,
+       .name           = "Trust FM Radio",
+       .type           = VID_TYPE_TUNER,
+       .fops           = &trust_fops,
+       .ioctl_ops      = &trust_ioctl_ops,
+};
+
 static int __init trust_init(void)
 {
        if(io == -1) {
index 023d6f3..48b5d2b 100644 (file)
@@ -345,12 +345,7 @@ static const struct file_operations typhoon_fops = {
        .llseek         = no_llseek,
 };
 
-static struct video_device typhoon_radio =
-{
-       .owner          = THIS_MODULE,
-       .name           = "Typhoon Radio",
-       .type           = VID_TYPE_TUNER,
-       .fops           = &typhoon_fops,
+static const struct v4l2_ioctl_ops typhoon_ioctl_ops = {
        .vidioc_querycap    = vidioc_querycap,
        .vidioc_g_tuner     = vidioc_g_tuner,
        .vidioc_s_tuner     = vidioc_s_tuner,
@@ -365,6 +360,14 @@ static struct video_device typhoon_radio =
        .vidioc_s_ctrl      = vidioc_s_ctrl,
 };
 
+static struct video_device typhoon_radio = {
+       .owner          = THIS_MODULE,
+       .name           = "Typhoon Radio",
+       .type           = VID_TYPE_TUNER,
+       .fops           = &typhoon_fops,
+       .ioctl_ops      = &typhoon_ioctl_ops,
+};
+
 #ifdef CONFIG_RADIO_TYPHOON_PROC_FS
 
 static int typhoon_proc_show(struct seq_file *m, void *v)
index cf0355b..c603443 100644 (file)
@@ -408,12 +408,7 @@ static const struct file_operations zoltrix_fops =
        .llseek         = no_llseek,
 };
 
-static struct video_device zoltrix_radio =
-{
-       .owner          = THIS_MODULE,
-       .name           = "Zoltrix Radio Plus",
-       .type           = VID_TYPE_TUNER,
-       .fops           = &zoltrix_fops,
+static const struct v4l2_ioctl_ops zoltrix_ioctl_ops = {
        .vidioc_querycap    = vidioc_querycap,
        .vidioc_g_tuner     = vidioc_g_tuner,
        .vidioc_s_tuner     = vidioc_s_tuner,
@@ -428,6 +423,14 @@ static struct video_device zoltrix_radio =
        .vidioc_s_ctrl      = vidioc_s_ctrl,
 };
 
+static struct video_device zoltrix_radio = {
+       .owner          = THIS_MODULE,
+       .name           = "Zoltrix Radio Plus",
+       .type           = VID_TYPE_TUNER,
+       .fops           = &zoltrix_fops,
+       .ioctl_ops      = &zoltrix_ioctl_ops,
+};
+
 static int __init zoltrix_init(void)
 {
        if (io == -1) {
index 33c7205..dfa399d 100644 (file)
@@ -3358,10 +3358,7 @@ static const struct file_operations bttv_fops =
        .poll     = bttv_poll,
 };
 
-static struct video_device bttv_video_template =
-{
-       .fops     = &bttv_fops,
-       .minor    = -1,
+static const struct v4l2_ioctl_ops bttv_ioctl_ops = {
        .vidioc_querycap                = bttv_querycap,
        .vidioc_enum_fmt_vid_cap        = bttv_enum_fmt_vid_cap,
        .vidioc_g_fmt_vid_cap           = bttv_g_fmt_vid_cap,
@@ -3412,8 +3409,14 @@ static struct video_device bttv_video_template =
        .vidioc_g_register              = bttv_g_register,
        .vidioc_s_register              = bttv_s_register,
 #endif
-       .tvnorms                        = BTTV_NORMS,
-       .current_norm                   = V4L2_STD_PAL,
+};
+
+static struct video_device bttv_video_template = {
+       .fops         = &bttv_fops,
+       .minor        = -1,
+       .ioctl_ops    = &bttv_ioctl_ops,
+       .tvnorms      = BTTV_NORMS,
+       .current_norm = V4L2_STD_PAL,
 };
 
 /* ----------------------------------------------------------------------- */
@@ -3636,10 +3639,7 @@ static const struct file_operations radio_fops =
        .poll     = radio_poll,
 };
 
-static struct video_device radio_template =
-{
-       .fops     = &radio_fops,
-       .minor    = -1,
+static const struct v4l2_ioctl_ops radio_ioctl_ops = {
        .vidioc_querycap        = radio_querycap,
        .vidioc_g_tuner         = radio_g_tuner,
        .vidioc_enum_input      = radio_enum_input,
@@ -3656,6 +3656,12 @@ static struct video_device radio_template =
        .vidioc_s_frequency     = bttv_s_frequency,
 };
 
+static struct video_device radio_template = {
+       .fops      = &radio_fops,
+       .minor     = -1,
+       .ioctl_ops = &radio_ioctl_ops,
+};
+
 /* ----------------------------------------------------------------------- */
 /* some debug code                                                         */
 
index 302c57f..4bbea45 100644 (file)
@@ -1769,17 +1769,7 @@ static const struct file_operations cafe_v4l_fops = {
        .llseek = no_llseek,
 };
 
-static struct video_device cafe_v4l_template = {
-       .name = "cafe",
-       .type = VFL_TYPE_GRABBER,
-       .type2 = VID_TYPE_CAPTURE,
-       .minor = -1, /* Get one dynamically */
-       .tvnorms = V4L2_STD_NTSC_M,
-       .current_norm = V4L2_STD_NTSC_M,  /* make mplayer happy */
-
-       .fops = &cafe_v4l_fops,
-       .release = cafe_v4l_dev_release,
-
+static const struct v4l2_ioctl_ops cafe_v4l_ioctl_ops = {
        .vidioc_querycap        = cafe_vidioc_querycap,
        .vidioc_enum_fmt_vid_cap = cafe_vidioc_enum_fmt_vid_cap,
        .vidioc_try_fmt_vid_cap = cafe_vidioc_try_fmt_vid_cap,
@@ -1802,6 +1792,19 @@ static struct video_device cafe_v4l_template = {
        .vidioc_s_parm          = cafe_vidioc_s_parm,
 };
 
+static struct video_device cafe_v4l_template = {
+       .name = "cafe",
+       .type = VFL_TYPE_GRABBER,
+       .type2 = VID_TYPE_CAPTURE,
+       .minor = -1, /* Get one dynamically */
+       .tvnorms = V4L2_STD_NTSC_M,
+       .current_norm = V4L2_STD_NTSC_M,  /* make mplayer happy */
+
+       .fops = &cafe_v4l_fops,
+       .ioctl_ops = &cafe_v4l_ioctl_ops,
+       .release = cafe_v4l_dev_release,
+};
+
 
 
 
index 0d74e59..a7f8396 100644 (file)
@@ -787,50 +787,54 @@ int cx18_v4l2_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
        return res;
 }
 
-void cx18_set_funcs(struct video_device *vdev)
-{
-       vdev->vidioc_querycap                = cx18_querycap;
-       vdev->vidioc_g_priority              = cx18_g_priority;
-       vdev->vidioc_s_priority              = cx18_s_priority;
-       vdev->vidioc_s_audio                 = cx18_s_audio;
-       vdev->vidioc_g_audio                 = cx18_g_audio;
-       vdev->vidioc_enumaudio               = cx18_enumaudio;
-       vdev->vidioc_enum_input              = cx18_enum_input;
-       vdev->vidioc_cropcap                 = cx18_cropcap;
-       vdev->vidioc_s_crop                  = cx18_s_crop;
-       vdev->vidioc_g_crop                  = cx18_g_crop;
-       vdev->vidioc_g_input                 = cx18_g_input;
-       vdev->vidioc_s_input                 = cx18_s_input;
-       vdev->vidioc_g_frequency             = cx18_g_frequency;
-       vdev->vidioc_s_frequency             = cx18_s_frequency;
-       vdev->vidioc_s_tuner                 = cx18_s_tuner;
-       vdev->vidioc_g_tuner                 = cx18_g_tuner;
-       vdev->vidioc_g_enc_index             = cx18_g_enc_index;
-       vdev->vidioc_g_std                   = cx18_g_std;
-       vdev->vidioc_s_std                   = cx18_s_std;
-       vdev->vidioc_log_status              = cx18_log_status;
-       vdev->vidioc_enum_fmt_vid_cap        = cx18_enum_fmt_vid_cap;
-       vdev->vidioc_encoder_cmd             = cx18_encoder_cmd;
-       vdev->vidioc_try_encoder_cmd         = cx18_try_encoder_cmd;
-       vdev->vidioc_g_fmt_vid_cap           = cx18_g_fmt_vid_cap;
-       vdev->vidioc_g_fmt_vbi_cap           = cx18_g_fmt_vbi_cap;
-       vdev->vidioc_g_fmt_sliced_vbi_cap    = cx18_g_fmt_sliced_vbi_cap;
-       vdev->vidioc_s_fmt_vid_cap           = cx18_s_fmt_vid_cap;
-       vdev->vidioc_s_fmt_vbi_cap           = cx18_s_fmt_vbi_cap;
-       vdev->vidioc_s_fmt_sliced_vbi_cap    = cx18_s_fmt_sliced_vbi_cap;
-       vdev->vidioc_try_fmt_vid_cap         = cx18_try_fmt_vid_cap;
-       vdev->vidioc_try_fmt_vbi_cap         = cx18_try_fmt_vbi_cap;
-       vdev->vidioc_try_fmt_sliced_vbi_cap  = cx18_try_fmt_sliced_vbi_cap;
-       vdev->vidioc_g_sliced_vbi_cap        = cx18_g_sliced_vbi_cap;
-       vdev->vidioc_g_chip_ident            = cx18_g_chip_ident;
+static const struct v4l2_ioctl_ops cx18_ioctl_ops = {
+       .vidioc_querycap                = cx18_querycap,
+       .vidioc_g_priority              = cx18_g_priority,
+       .vidioc_s_priority              = cx18_s_priority,
+       .vidioc_s_audio                 = cx18_s_audio,
+       .vidioc_g_audio                 = cx18_g_audio,
+       .vidioc_enumaudio               = cx18_enumaudio,
+       .vidioc_enum_input              = cx18_enum_input,
+       .vidioc_cropcap                 = cx18_cropcap,
+       .vidioc_s_crop                  = cx18_s_crop,
+       .vidioc_g_crop                  = cx18_g_crop,
+       .vidioc_g_input                 = cx18_g_input,
+       .vidioc_s_input                 = cx18_s_input,
+       .vidioc_g_frequency             = cx18_g_frequency,
+       .vidioc_s_frequency             = cx18_s_frequency,
+       .vidioc_s_tuner                 = cx18_s_tuner,
+       .vidioc_g_tuner                 = cx18_g_tuner,
+       .vidioc_g_enc_index             = cx18_g_enc_index,
+       .vidioc_g_std                   = cx18_g_std,
+       .vidioc_s_std                   = cx18_s_std,
+       .vidioc_log_status              = cx18_log_status,
+       .vidioc_enum_fmt_vid_cap        = cx18_enum_fmt_vid_cap,
+       .vidioc_encoder_cmd             = cx18_encoder_cmd,
+       .vidioc_try_encoder_cmd         = cx18_try_encoder_cmd,
+       .vidioc_g_fmt_vid_cap           = cx18_g_fmt_vid_cap,
+       .vidioc_g_fmt_vbi_cap           = cx18_g_fmt_vbi_cap,
+       .vidioc_g_fmt_sliced_vbi_cap    = cx18_g_fmt_sliced_vbi_cap,
+       .vidioc_s_fmt_vid_cap           = cx18_s_fmt_vid_cap,
+       .vidioc_s_fmt_vbi_cap           = cx18_s_fmt_vbi_cap,
+       .vidioc_s_fmt_sliced_vbi_cap    = cx18_s_fmt_sliced_vbi_cap,
+       .vidioc_try_fmt_vid_cap         = cx18_try_fmt_vid_cap,
+       .vidioc_try_fmt_vbi_cap         = cx18_try_fmt_vbi_cap,
+       .vidioc_try_fmt_sliced_vbi_cap  = cx18_try_fmt_sliced_vbi_cap,
+       .vidioc_g_sliced_vbi_cap        = cx18_g_sliced_vbi_cap,
+       .vidioc_g_chip_ident            = cx18_g_chip_ident,
 #ifdef CONFIG_VIDEO_ADV_DEBUG
-       vdev->vidioc_g_register              = cx18_g_register;
-       vdev->vidioc_s_register              = cx18_s_register;
+       .vidioc_g_register              = cx18_g_register,
+       .vidioc_s_register              = cx18_s_register,
 #endif
-       vdev->vidioc_default                 = cx18_default;
-       vdev->vidioc_queryctrl               = cx18_queryctrl;
-       vdev->vidioc_querymenu               = cx18_querymenu;
-       vdev->vidioc_g_ext_ctrls             = cx18_g_ext_ctrls;
-       vdev->vidioc_s_ext_ctrls             = cx18_s_ext_ctrls;
-       vdev->vidioc_try_ext_ctrls           = cx18_try_ext_ctrls;
+       .vidioc_default                 = cx18_default,
+       .vidioc_queryctrl               = cx18_queryctrl,
+       .vidioc_querymenu               = cx18_querymenu,
+       .vidioc_g_ext_ctrls             = cx18_g_ext_ctrls,
+       .vidioc_s_ext_ctrls             = cx18_s_ext_ctrls,
+       .vidioc_try_ext_ctrls           = cx18_try_ext_ctrls,
+};
+
+void cx18_set_funcs(struct video_device *vdev)
+{
+       vdev->ioctl_ops = &cx18_ioctl_ops;
 }
index 4d0dcb0..9d15d8a 100644 (file)
@@ -1700,14 +1700,7 @@ static struct file_operations mpeg_fops = {
        .llseek        = no_llseek,
 };
 
-static struct video_device cx23885_mpeg_template = {
-       .name          = "cx23885",
-       .type          = VID_TYPE_CAPTURE |
-                               VID_TYPE_TUNER |
-                               VID_TYPE_SCALES |
-                               VID_TYPE_MPEG_ENCODER,
-       .fops          = &mpeg_fops,
-       .minor         = -1,
+static const struct v4l2_ioctl_ops mpeg_ioctl_ops = {
        .vidioc_s_std            = vidioc_s_std,
        .vidioc_enum_input       = vidioc_enum_input,
        .vidioc_g_input          = vidioc_g_input,
@@ -1736,6 +1729,17 @@ static struct video_device cx23885_mpeg_template = {
        .vidioc_queryctrl        = vidioc_queryctrl,
 };
 
+static struct video_device cx23885_mpeg_template = {
+       .name          = "cx23885",
+       .type          = VID_TYPE_CAPTURE |
+                               VID_TYPE_TUNER |
+                               VID_TYPE_SCALES |
+                               VID_TYPE_MPEG_ENCODER,
+       .fops          = &mpeg_fops,
+       .ioctl_ops     = &mpeg_ioctl_ops,
+       .minor         = -1,
+};
+
 void cx23885_417_unregister(struct cx23885_dev *dev)
 {
        dprintk(1, "%s()\n", __func__);
index 245712e..308caa2 100644 (file)
@@ -1434,12 +1434,7 @@ static const struct file_operations video_fops = {
        .llseek        = no_llseek,
 };
 
-static struct video_device cx23885_vbi_template;
-static struct video_device cx23885_video_template = {
-       .name                 = "cx23885-video",
-       .type                 = VID_TYPE_CAPTURE|VID_TYPE_TUNER|VID_TYPE_SCALES,
-       .fops                 = &video_fops,
-       .minor                = -1,
+static const struct v4l2_ioctl_ops video_ioctl_ops = {
        .vidioc_querycap      = vidioc_querycap,
        .vidioc_enum_fmt_vid_cap  = vidioc_enum_fmt_vid_cap,
        .vidioc_g_fmt_vid_cap     = vidioc_g_fmt_vid_cap,
@@ -1472,6 +1467,15 @@ static struct video_device cx23885_video_template = {
        .vidioc_g_register    = vidioc_g_register,
        .vidioc_s_register    = vidioc_s_register,
 #endif
+};
+
+static struct video_device cx23885_vbi_template;
+static struct video_device cx23885_video_template = {
+       .name                 = "cx23885-video",
+       .type                 = VID_TYPE_CAPTURE|VID_TYPE_TUNER|VID_TYPE_SCALES,
+       .fops                 = &video_fops,
+       .minor                = -1,
+       .ioctl_ops            = &video_ioctl_ops,
        .tvnorms              = CX23885_NORMS,
        .current_norm         = V4L2_STD_NTSC_M,
 };
index 4d1a461..55c3548 100644 (file)
@@ -1175,12 +1175,7 @@ static const struct file_operations mpeg_fops =
        .llseek        = no_llseek,
 };
 
-static struct video_device cx8802_mpeg_template =
-{
-       .name                 = "cx8802",
-       .type                 = VID_TYPE_CAPTURE|VID_TYPE_TUNER|VID_TYPE_SCALES|VID_TYPE_MPEG_ENCODER,
-       .fops                 = &mpeg_fops,
-       .minor                = -1,
+static const struct v4l2_ioctl_ops mpeg_ioctl_ops = {
        .vidioc_querymenu     = vidioc_querymenu,
        .vidioc_querycap      = vidioc_querycap,
        .vidioc_enum_fmt_vid_cap  = vidioc_enum_fmt_vid_cap,
@@ -1208,6 +1203,15 @@ static struct video_device cx8802_mpeg_template =
        .vidioc_g_tuner       = vidioc_g_tuner,
        .vidioc_s_tuner       = vidioc_s_tuner,
        .vidioc_s_std         = vidioc_s_std,
+};
+
+static struct video_device cx8802_mpeg_template = {
+       .name                 = "cx8802",
+       .type                 = VID_TYPE_CAPTURE | VID_TYPE_TUNER |
+                               VID_TYPE_SCALES | VID_TYPE_MPEG_ENCODER,
+       .fops                 = &mpeg_fops,
+       .ioctl_ops            = &mpeg_ioctl_ops,
+       .minor                = -1,
        .tvnorms              = CX88_NORMS,
        .current_norm         = V4L2_STD_NTSC_M,
 };
index f8cc55d..24b403b 100644 (file)
@@ -1683,13 +1683,7 @@ static const struct file_operations video_fops =
        .llseek        = no_llseek,
 };
 
-static struct video_device cx8800_vbi_template;
-static struct video_device cx8800_video_template =
-{
-       .name                 = "cx8800-video",
-       .type                 = VID_TYPE_CAPTURE|VID_TYPE_TUNER|VID_TYPE_SCALES,
-       .fops                 = &video_fops,
-       .minor                = -1,
+static const struct v4l2_ioctl_ops video_ioctl_ops = {
        .vidioc_querycap      = vidioc_querycap,
        .vidioc_enum_fmt_vid_cap  = vidioc_enum_fmt_vid_cap,
        .vidioc_g_fmt_vid_cap     = vidioc_g_fmt_vid_cap,
@@ -1722,6 +1716,16 @@ static struct video_device cx8800_video_template =
        .vidioc_g_register    = vidioc_g_register,
        .vidioc_s_register    = vidioc_s_register,
 #endif
+};
+
+static struct video_device cx8800_vbi_template;
+
+static struct video_device cx8800_video_template = {
+       .name                 = "cx8800-video",
+       .type                 = VID_TYPE_CAPTURE|VID_TYPE_TUNER|VID_TYPE_SCALES,
+       .fops                 = &video_fops,
+       .minor                = -1,
+       .ioctl_ops            = &video_ioctl_ops,
        .tvnorms              = CX88_NORMS,
        .current_norm         = V4L2_STD_NTSC_M,
 };
@@ -1736,12 +1740,7 @@ static const struct file_operations radio_fops =
        .llseek        = no_llseek,
 };
 
-static struct video_device cx8800_radio_template =
-{
-       .name                 = "cx8800-radio",
-       .type                 = VID_TYPE_TUNER,
-       .fops                 = &radio_fops,
-       .minor                = -1,
+static const struct v4l2_ioctl_ops radio_ioctl_ops = {
        .vidioc_querycap      = radio_querycap,
        .vidioc_g_tuner       = radio_g_tuner,
        .vidioc_enum_input    = radio_enum_input,
@@ -1760,6 +1759,14 @@ static struct video_device cx8800_radio_template =
 #endif
 };
 
+static struct video_device cx8800_radio_template = {
+       .name                 = "cx8800-radio",
+       .type                 = VID_TYPE_TUNER,
+       .fops                 = &radio_fops,
+       .minor                = -1,
+       .ioctl_ops            = &radio_ioctl_ops,
+};
+
 /* ----------------------------------------------------------- */
 
 static void cx8800_unregister_video(struct cx8800_dev *dev)
index 67c62ea..fcfc741 100644 (file)
@@ -1764,20 +1764,7 @@ static const struct file_operations em28xx_v4l_fops = {
        .compat_ioctl  = v4l_compat_ioctl32,
 };
 
-static const struct file_operations radio_fops = {
-       .owner         = THIS_MODULE,
-       .open          = em28xx_v4l2_open,
-       .release       = em28xx_v4l2_close,
-       .ioctl         = video_ioctl2,
-       .compat_ioctl  = v4l_compat_ioctl32,
-       .llseek        = no_llseek,
-};
-
-static const struct video_device em28xx_video_template = {
-       .fops                       = &em28xx_v4l_fops,
-       .release                    = video_device_release,
-
-       .minor                      = -1,
+static const struct v4l2_ioctl_ops video_ioctl_ops = {
        .vidioc_querycap            = vidioc_querycap,
        .vidioc_enum_fmt_vid_cap    = vidioc_enum_fmt_vid_cap,
        .vidioc_g_fmt_vid_cap       = vidioc_g_fmt_vid_cap,
@@ -1815,16 +1802,29 @@ static const struct video_device em28xx_video_template = {
 #ifdef CONFIG_VIDEO_V4L1_COMPAT
        .vidiocgmbuf                = vidiocgmbuf,
 #endif
+};
+
+static const struct video_device em28xx_video_template = {
+       .fops                       = &em28xx_v4l_fops,
+       .release                    = video_device_release,
+       .ioctl_ops                  = &video_ioctl_ops,
+
+       .minor                      = -1,
 
        .tvnorms                    = V4L2_STD_ALL,
        .current_norm               = V4L2_STD_PAL,
 };
 
-static struct video_device em28xx_radio_template = {
-       .name                 = "em28xx-radio",
-       .type                 = VID_TYPE_TUNER,
-       .fops                 = &radio_fops,
-       .minor                = -1,
+static const struct file_operations radio_fops = {
+       .owner         = THIS_MODULE,
+       .open          = em28xx_v4l2_open,
+       .release       = em28xx_v4l2_close,
+       .ioctl         = video_ioctl2,
+       .compat_ioctl  = v4l_compat_ioctl32,
+       .llseek        = no_llseek,
+};
+
+static const struct v4l2_ioctl_ops radio_ioctl_ops = {
        .vidioc_querycap      = radio_querycap,
        .vidioc_g_tuner       = radio_g_tuner,
        .vidioc_enum_input    = radio_enum_input,
@@ -1843,6 +1843,14 @@ static struct video_device em28xx_radio_template = {
 #endif
 };
 
+static struct video_device em28xx_radio_template = {
+       .name                 = "em28xx-radio",
+       .type                 = VID_TYPE_TUNER,
+       .fops                 = &radio_fops,
+       .ioctl_ops            = &radio_ioctl_ops,
+       .minor                = -1,
+};
+
 /******************************** usb interface ******************************/
 
 
index 0f09784..2a416cf 100644 (file)
@@ -1651,12 +1651,7 @@ static struct file_operations dev_fops = {
        .poll   = dev_poll,
 };
 
-static struct video_device gspca_template = {
-       .name = "gspca main driver",
-       .type = VID_TYPE_CAPTURE,
-       .fops = &dev_fops,
-       .release = dev_release,         /* mandatory */
-       .minor = -1,
+static const struct v4l2_ioctl_ops dev_ioctl_ops = {
        .vidioc_querycap        = vidioc_querycap,
        .vidioc_dqbuf           = vidioc_dqbuf,
        .vidioc_qbuf            = vidioc_qbuf,
@@ -1685,6 +1680,15 @@ static struct video_device gspca_template = {
 #endif
 };
 
+static struct video_device gspca_template = {
+       .name = "gspca main driver",
+       .type = VID_TYPE_CAPTURE,
+       .fops = &dev_fops,
+       .ioctl_ops = &dev_ioctl_ops,
+       .release = dev_release,         /* mandatory */
+       .minor = -1,
+};
+
 /*
  * probe and create a new gspca device
  *
index 52e00a7..6103030 100644 (file)
@@ -1842,69 +1842,73 @@ int ivtv_v4l2_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
        return res;
 }
 
-void ivtv_set_funcs(struct video_device *vdev)
-{
-       vdev->vidioc_querycap               = ivtv_querycap;
-       vdev->vidioc_g_priority             = ivtv_g_priority;
-       vdev->vidioc_s_priority             = ivtv_s_priority;
-       vdev->vidioc_s_audio                = ivtv_s_audio;
-       vdev->vidioc_g_audio                = ivtv_g_audio;
-       vdev->vidioc_enumaudio              = ivtv_enumaudio;
-       vdev->vidioc_s_audout               = ivtv_s_audout;
-       vdev->vidioc_g_audout               = ivtv_g_audout;
-       vdev->vidioc_enum_input             = ivtv_enum_input;
-       vdev->vidioc_enum_output            = ivtv_enum_output;
-       vdev->vidioc_enumaudout             = ivtv_enumaudout;
-       vdev->vidioc_cropcap                = ivtv_cropcap;
-       vdev->vidioc_s_crop                 = ivtv_s_crop;
-       vdev->vidioc_g_crop                 = ivtv_g_crop;
-       vdev->vidioc_g_input                = ivtv_g_input;
-       vdev->vidioc_s_input                = ivtv_s_input;
-       vdev->vidioc_g_output               = ivtv_g_output;
-       vdev->vidioc_s_output               = ivtv_s_output;
-       vdev->vidioc_g_frequency            = ivtv_g_frequency;
-       vdev->vidioc_s_frequency            = ivtv_s_frequency;
-       vdev->vidioc_s_tuner                = ivtv_s_tuner;
-       vdev->vidioc_g_tuner                = ivtv_g_tuner;
-       vdev->vidioc_g_enc_index            = ivtv_g_enc_index;
-       vdev->vidioc_g_fbuf                 = ivtv_g_fbuf;
-       vdev->vidioc_s_fbuf                 = ivtv_s_fbuf;
-       vdev->vidioc_g_std                  = ivtv_g_std;
-       vdev->vidioc_s_std                  = ivtv_s_std;
-       vdev->vidioc_overlay                = ivtv_overlay;
-       vdev->vidioc_log_status             = ivtv_log_status;
-       vdev->vidioc_enum_fmt_vid_cap       = ivtv_enum_fmt_vid_cap;
-       vdev->vidioc_encoder_cmd            = ivtv_encoder_cmd;
-       vdev->vidioc_try_encoder_cmd        = ivtv_try_encoder_cmd;
-       vdev->vidioc_enum_fmt_vid_out       = ivtv_enum_fmt_vid_out;
-       vdev->vidioc_g_fmt_vid_cap          = ivtv_g_fmt_vid_cap;
-       vdev->vidioc_g_fmt_vbi_cap          = ivtv_g_fmt_vbi_cap;
-       vdev->vidioc_g_fmt_sliced_vbi_cap   = ivtv_g_fmt_sliced_vbi_cap;
-       vdev->vidioc_g_fmt_vid_out          = ivtv_g_fmt_vid_out;
-       vdev->vidioc_g_fmt_vid_out_overlay  = ivtv_g_fmt_vid_out_overlay;
-       vdev->vidioc_g_fmt_sliced_vbi_out   = ivtv_g_fmt_sliced_vbi_out;
-       vdev->vidioc_s_fmt_vid_cap          = ivtv_s_fmt_vid_cap;
-       vdev->vidioc_s_fmt_vbi_cap          = ivtv_s_fmt_vbi_cap;
-       vdev->vidioc_s_fmt_sliced_vbi_cap   = ivtv_s_fmt_sliced_vbi_cap;
-       vdev->vidioc_s_fmt_vid_out          = ivtv_s_fmt_vid_out;
-       vdev->vidioc_s_fmt_vid_out_overlay  = ivtv_s_fmt_vid_out_overlay;
-       vdev->vidioc_s_fmt_sliced_vbi_out   = ivtv_s_fmt_sliced_vbi_out;
-       vdev->vidioc_try_fmt_vid_cap        = ivtv_try_fmt_vid_cap;
-       vdev->vidioc_try_fmt_vbi_cap        = ivtv_try_fmt_vbi_cap;
-       vdev->vidioc_try_fmt_sliced_vbi_cap = ivtv_try_fmt_sliced_vbi_cap;
-       vdev->vidioc_try_fmt_vid_out        = ivtv_try_fmt_vid_out;
-       vdev->vidioc_try_fmt_vid_out_overlay = ivtv_try_fmt_vid_out_overlay;
-       vdev->vidioc_try_fmt_sliced_vbi_out = ivtv_try_fmt_sliced_vbi_out;
-       vdev->vidioc_g_sliced_vbi_cap       = ivtv_g_sliced_vbi_cap;
-       vdev->vidioc_g_chip_ident           = ivtv_g_chip_ident;
+static const struct v4l2_ioctl_ops ivtv_ioctl_ops = {
+       .vidioc_querycap                    = ivtv_querycap,
+       .vidioc_g_priority                  = ivtv_g_priority,
+       .vidioc_s_priority                  = ivtv_s_priority,
+       .vidioc_s_audio                     = ivtv_s_audio,
+       .vidioc_g_audio                     = ivtv_g_audio,
+       .vidioc_enumaudio                   = ivtv_enumaudio,
+       .vidioc_s_audout                    = ivtv_s_audout,
+       .vidioc_g_audout                    = ivtv_g_audout,
+       .vidioc_enum_input                  = ivtv_enum_input,
+       .vidioc_enum_output                 = ivtv_enum_output,
+       .vidioc_enumaudout                  = ivtv_enumaudout,
+       .vidioc_cropcap                     = ivtv_cropcap,
+       .vidioc_s_crop                      = ivtv_s_crop,
+       .vidioc_g_crop                      = ivtv_g_crop,
+       .vidioc_g_input                     = ivtv_g_input,
+       .vidioc_s_input                     = ivtv_s_input,
+       .vidioc_g_output                    = ivtv_g_output,
+       .vidioc_s_output                    = ivtv_s_output,
+       .vidioc_g_frequency                 = ivtv_g_frequency,
+       .vidioc_s_frequency                 = ivtv_s_frequency,
+       .vidioc_s_tuner                     = ivtv_s_tuner,
+       .vidioc_g_tuner                     = ivtv_g_tuner,
+       .vidioc_g_enc_index                 = ivtv_g_enc_index,
+       .vidioc_g_fbuf                      = ivtv_g_fbuf,
+       .vidioc_s_fbuf                      = ivtv_s_fbuf,
+       .vidioc_g_std                       = ivtv_g_std,
+       .vidioc_s_std                       = ivtv_s_std,
+       .vidioc_overlay                     = ivtv_overlay,
+       .vidioc_log_status                  = ivtv_log_status,
+       .vidioc_enum_fmt_vid_cap            = ivtv_enum_fmt_vid_cap,
+       .vidioc_encoder_cmd                 = ivtv_encoder_cmd,
+       .vidioc_try_encoder_cmd             = ivtv_try_encoder_cmd,
+       .vidioc_enum_fmt_vid_out            = ivtv_enum_fmt_vid_out,
+       .vidioc_g_fmt_vid_cap               = ivtv_g_fmt_vid_cap,
+       .vidioc_g_fmt_vbi_cap               = ivtv_g_fmt_vbi_cap,
+       .vidioc_g_fmt_sliced_vbi_cap        = ivtv_g_fmt_sliced_vbi_cap,
+       .vidioc_g_fmt_vid_out               = ivtv_g_fmt_vid_out,
+       .vidioc_g_fmt_vid_out_overlay       = ivtv_g_fmt_vid_out_overlay,
+       .vidioc_g_fmt_sliced_vbi_out        = ivtv_g_fmt_sliced_vbi_out,
+       .vidioc_s_fmt_vid_cap               = ivtv_s_fmt_vid_cap,
+       .vidioc_s_fmt_vbi_cap               = ivtv_s_fmt_vbi_cap,
+       .vidioc_s_fmt_sliced_vbi_cap        = ivtv_s_fmt_sliced_vbi_cap,
+       .vidioc_s_fmt_vid_out               = ivtv_s_fmt_vid_out,
+       .vidioc_s_fmt_vid_out_overlay       = ivtv_s_fmt_vid_out_overlay,
+       .vidioc_s_fmt_sliced_vbi_out        = ivtv_s_fmt_sliced_vbi_out,
+       .vidioc_try_fmt_vid_cap             = ivtv_try_fmt_vid_cap,
+       .vidioc_try_fmt_vbi_cap             = ivtv_try_fmt_vbi_cap,
+       .vidioc_try_fmt_sliced_vbi_cap      = ivtv_try_fmt_sliced_vbi_cap,
+       .vidioc_try_fmt_vid_out             = ivtv_try_fmt_vid_out,
+       .vidioc_try_fmt_vid_out_overlay     = ivtv_try_fmt_vid_out_overlay,
+       .vidioc_try_fmt_sliced_vbi_out      = ivtv_try_fmt_sliced_vbi_out,
+       .vidioc_g_sliced_vbi_cap            = ivtv_g_sliced_vbi_cap,
+       .vidioc_g_chip_ident                = ivtv_g_chip_ident,
 #ifdef CONFIG_VIDEO_ADV_DEBUG
-       vdev->vidioc_g_register             = ivtv_g_register;
-       vdev->vidioc_s_register             = ivtv_s_register;
+       .vidioc_g_register                  = ivtv_g_register,
+       .vidioc_s_register                  = ivtv_s_register,
 #endif
-       vdev->vidioc_default                = ivtv_default;
-       vdev->vidioc_queryctrl              = ivtv_queryctrl;
-       vdev->vidioc_querymenu              = ivtv_querymenu;
-       vdev->vidioc_g_ext_ctrls            = ivtv_g_ext_ctrls;
-       vdev->vidioc_s_ext_ctrls            = ivtv_s_ext_ctrls;
-       vdev->vidioc_try_ext_ctrls          = ivtv_try_ext_ctrls;
+       .vidioc_default                     = ivtv_default,
+       .vidioc_queryctrl                   = ivtv_queryctrl,
+       .vidioc_querymenu                   = ivtv_querymenu,
+       .vidioc_g_ext_ctrls                 = ivtv_g_ext_ctrls,
+       .vidioc_s_ext_ctrls                 = ivtv_s_ext_ctrls,
+       .vidioc_try_ext_ctrls               = ivtv_try_ext_ctrls,
+};
+
+void ivtv_set_funcs(struct video_device *vdev)
+{
+       vdev->ioctl_ops = &ivtv_ioctl_ops;
 }
index a1fb987..fd16ef0 100644 (file)
@@ -1698,13 +1698,7 @@ static const struct file_operations meye_fops = {
        .llseek         = no_llseek,
 };
 
-static struct video_device meye_template = {
-       .owner          = THIS_MODULE,
-       .name           = "meye",
-       .type           = VID_TYPE_CAPTURE,
-       .fops           = &meye_fops,
-       .release        = video_device_release,
-       .minor          = -1,
+static const struct v4l2_ioctl_ops meye_ioctl_ops = {
        .vidioc_querycap        = vidioc_querycap,
        .vidioc_enum_input      = vidioc_enum_input,
        .vidioc_g_input         = vidioc_g_input,
@@ -1725,6 +1719,16 @@ static struct video_device meye_template = {
        .vidioc_default         = vidioc_default,
 };
 
+static struct video_device meye_template = {
+       .owner          = THIS_MODULE,
+       .name           = "meye",
+       .type           = VID_TYPE_CAPTURE,
+       .fops           = &meye_fops,
+       .ioctl_ops      = &meye_ioctl_ops,
+       .release        = video_device_release,
+       .minor          = -1,
+};
+
 #ifdef CONFIG_PM
 static int meye_suspend(struct pci_dev *pdev, pm_message_t state)
 {
index eb81915..2428d44 100644 (file)
@@ -1659,12 +1659,7 @@ static const struct file_operations s2255_fops_v4l = {
        .llseek = no_llseek,
 };
 
-static struct video_device template = {
-       .name = "s2255v",
-       .type = VID_TYPE_CAPTURE,
-       .fops = &s2255_fops_v4l,
-       .minor = -1,
-       .release = video_device_release,
+static const struct v4l2_ioctl_ops s2255_ioctl_ops = {
        .vidioc_querycap = vidioc_querycap,
        .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
        .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
@@ -1686,6 +1681,15 @@ static struct video_device template = {
 #ifdef CONFIG_VIDEO_V4L1_COMPAT
        .vidiocgmbuf = vidioc_cgmbuf,
 #endif
+};
+
+static struct video_device template = {
+       .name = "s2255v",
+       .type = VID_TYPE_CAPTURE,
+       .fops = &s2255_fops_v4l,
+       .ioctl_ops = &s2255_ioctl_ops,
+       .minor = -1,
+       .release = video_device_release,
        .tvnorms = S2255_NORMS,
        .current_norm = V4L2_STD_NTSC_M,
 };
index 3854cc2..8b3f951 100644 (file)
@@ -400,16 +400,7 @@ static const struct file_operations ts_fops =
        .llseek   = no_llseek,
 };
 
-/* ----------------------------------------------------------- */
-
-static struct video_device saa7134_empress_template =
-{
-       .name          = "saa7134-empress",
-       .type          = 0 /* FIXME */,
-       .type2         = 0 /* FIXME */,
-       .fops          = &ts_fops,
-       .minor         = -1,
-
+static const struct v4l2_ioctl_ops ts_ioctl_ops = {
        .vidioc_querycap                = empress_querycap,
        .vidioc_enum_fmt_vid_cap        = empress_enum_fmt_vid_cap,
        .vidioc_s_fmt_vid_cap           = empress_s_fmt_vid_cap,
@@ -430,6 +421,17 @@ static struct video_device saa7134_empress_template =
        .vidioc_querymenu               = empress_querymenu,
        .vidioc_g_ctrl                  = saa7134_g_ctrl,
        .vidioc_s_ctrl                  = saa7134_s_ctrl,
+};
+
+/* ----------------------------------------------------------- */
+
+static struct video_device saa7134_empress_template = {
+       .name          = "saa7134-empress",
+       .type          = 0 /* FIXME */,
+       .type2         = 0 /* FIXME */,
+       .fops          = &ts_fops,
+       .minor         = -1,
+       .ioctl_ops     = &ts_ioctl_ops,
 
        .tvnorms                        = SAA7134_NORMS,
        .current_norm                   = V4L2_STD_PAL,
index 1a51375..5e9cfc8 100644 (file)
@@ -2353,26 +2353,7 @@ static const struct file_operations video_fops =
        .llseek   = no_llseek,
 };
 
-static const struct file_operations radio_fops =
-{
-       .owner    = THIS_MODULE,
-       .open     = video_open,
-       .release  = video_release,
-       .ioctl    = video_ioctl2,
-       .compat_ioctl   = v4l_compat_ioctl32,
-       .llseek   = no_llseek,
-};
-
-/* ----------------------------------------------------------- */
-/* exported stuff                                              */
-
-struct video_device saa7134_video_template =
-{
-       .name                           = "saa7134-video",
-       .type                           = VID_TYPE_CAPTURE|VID_TYPE_TUNER |
-                                       VID_TYPE_CLIPPING|VID_TYPE_SCALES,
-       .fops                           = &video_fops,
-       .minor                          = -1,
+static const struct v4l2_ioctl_ops video_ioctl_ops = {
        .vidioc_querycap                = saa7134_querycap,
        .vidioc_enum_fmt_vid_cap        = saa7134_enum_fmt_vid_cap,
        .vidioc_g_fmt_vid_cap           = saa7134_g_fmt_vid_cap,
@@ -2421,16 +2402,18 @@ struct video_device saa7134_video_template =
        .vidioc_g_register              = vidioc_g_register,
        .vidioc_s_register              = vidioc_s_register,
 #endif
-       .tvnorms                        = SAA7134_NORMS,
-       .current_norm                   = V4L2_STD_PAL,
 };
 
-struct video_device saa7134_radio_template =
-{
-       .name                   = "saa7134-radio",
-       .type                   = VID_TYPE_TUNER,
-       .fops                   = &radio_fops,
-       .minor                  = -1,
+static const struct file_operations radio_fops = {
+       .owner    = THIS_MODULE,
+       .open     = video_open,
+       .release  = video_release,
+       .ioctl    = video_ioctl2,
+       .compat_ioctl   = v4l_compat_ioctl32,
+       .llseek   = no_llseek,
+};
+
+static const struct v4l2_ioctl_ops radio_ioctl_ops = {
        .vidioc_querycap        = radio_querycap,
        .vidioc_g_tuner         = radio_g_tuner,
        .vidioc_enum_input      = radio_enum_input,
@@ -2447,6 +2430,28 @@ struct video_device saa7134_radio_template =
        .vidioc_s_frequency     = saa7134_s_frequency,
 };
 
+/* ----------------------------------------------------------- */
+/* exported stuff                                              */
+
+struct video_device saa7134_video_template = {
+       .name                           = "saa7134-video",
+       .type                           = VID_TYPE_CAPTURE|VID_TYPE_TUNER |
+                                       VID_TYPE_CLIPPING|VID_TYPE_SCALES,
+       .fops                           = &video_fops,
+       .ioctl_ops                      = &video_ioctl_ops,
+       .minor                          = -1,
+       .tvnorms                        = SAA7134_NORMS,
+       .current_norm                   = V4L2_STD_PAL,
+};
+
+struct video_device saa7134_radio_template = {
+       .name                   = "saa7134-radio",
+       .type                   = VID_TYPE_TUNER,
+       .fops                   = &radio_fops,
+       .ioctl_ops              = &radio_ioctl_ops,
+       .minor                  = -1,
+};
+
 int saa7134_video_init1(struct saa7134_dev *dev)
 {
        /* sanitycheck insmod options */
index b017490..9ff5614 100644 (file)
@@ -862,6 +862,35 @@ void soc_camera_device_unregister(struct soc_camera_device *icd)
 }
 EXPORT_SYMBOL(soc_camera_device_unregister);
 
+static const struct v4l2_ioctl_ops soc_camera_ioctl_ops = {
+       .vidioc_querycap         = soc_camera_querycap,
+       .vidioc_g_fmt_vid_cap    = soc_camera_g_fmt_vid_cap,
+       .vidioc_enum_fmt_vid_cap = soc_camera_enum_fmt_vid_cap,
+       .vidioc_s_fmt_vid_cap    = soc_camera_s_fmt_vid_cap,
+       .vidioc_enum_input       = soc_camera_enum_input,
+       .vidioc_g_input          = soc_camera_g_input,
+       .vidioc_s_input          = soc_camera_s_input,
+       .vidioc_s_std            = soc_camera_s_std,
+       .vidioc_reqbufs          = soc_camera_reqbufs,
+       .vidioc_try_fmt_vid_cap  = soc_camera_try_fmt_vid_cap,
+       .vidioc_querybuf         = soc_camera_querybuf,
+       .vidioc_qbuf             = soc_camera_qbuf,
+       .vidioc_dqbuf            = soc_camera_dqbuf,
+       .vidioc_streamon         = soc_camera_streamon,
+       .vidioc_streamoff        = soc_camera_streamoff,
+       .vidioc_queryctrl        = soc_camera_queryctrl,
+       .vidioc_g_ctrl           = soc_camera_g_ctrl,
+       .vidioc_s_ctrl           = soc_camera_s_ctrl,
+       .vidioc_cropcap          = soc_camera_cropcap,
+       .vidioc_g_crop           = soc_camera_g_crop,
+       .vidioc_s_crop           = soc_camera_s_crop,
+       .vidioc_g_chip_ident     = soc_camera_g_chip_ident,
+#ifdef CONFIG_VIDEO_ADV_DEBUG
+       .vidioc_g_register       = soc_camera_g_register,
+       .vidioc_s_register       = soc_camera_s_register,
+#endif
+};
+
 int soc_camera_video_start(struct soc_camera_device *icd)
 {
        struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
@@ -882,35 +911,10 @@ int soc_camera_video_start(struct soc_camera_device *icd)
        vdev->type              = VID_TYPE_CAPTURE;
        vdev->current_norm      = V4L2_STD_UNKNOWN;
        vdev->fops              = &soc_camera_fops;
+       vdev->ioctl_ops         = &soc_camera_ioctl_ops;
        vdev->release           = video_device_release;
        vdev->minor             = -1;
        vdev->tvnorms           = V4L2_STD_UNKNOWN,
-       vdev->vidioc_querycap   = soc_camera_querycap;
-       vdev->vidioc_g_fmt_vid_cap = soc_camera_g_fmt_vid_cap;
-       vdev->vidioc_enum_fmt_vid_cap = soc_camera_enum_fmt_vid_cap;
-       vdev->vidioc_s_fmt_vid_cap = soc_camera_s_fmt_vid_cap;
-       vdev->vidioc_enum_input = soc_camera_enum_input;
-       vdev->vidioc_g_input    = soc_camera_g_input;
-       vdev->vidioc_s_input    = soc_camera_s_input;
-       vdev->vidioc_s_std      = soc_camera_s_std;
-       vdev->vidioc_reqbufs    = soc_camera_reqbufs;
-       vdev->vidioc_try_fmt_vid_cap = soc_camera_try_fmt_vid_cap;
-       vdev->vidioc_querybuf   = soc_camera_querybuf;
-       vdev->vidioc_qbuf       = soc_camera_qbuf;
-       vdev->vidioc_dqbuf      = soc_camera_dqbuf;
-       vdev->vidioc_streamon   = soc_camera_streamon;
-       vdev->vidioc_streamoff  = soc_camera_streamoff;
-       vdev->vidioc_queryctrl  = soc_camera_queryctrl;
-       vdev->vidioc_g_ctrl     = soc_camera_g_ctrl;
-       vdev->vidioc_s_ctrl     = soc_camera_s_ctrl;
-       vdev->vidioc_cropcap    = soc_camera_cropcap;
-       vdev->vidioc_g_crop     = soc_camera_g_crop;
-       vdev->vidioc_s_crop     = soc_camera_s_crop;
-       vdev->vidioc_g_chip_ident = soc_camera_g_chip_ident;
-#ifdef CONFIG_VIDEO_ADV_DEBUG
-       vdev->vidioc_g_register = soc_camera_g_register;
-       vdev->vidioc_s_register = soc_camera_s_register;
-#endif
 
        icd->current_fmt = &icd->formats[0];
 
index 20028ae..8d5fa95 100644 (file)
@@ -1328,20 +1328,7 @@ static struct file_operations v4l_stk_fops = {
        .llseek = no_llseek
 };
 
-static void stk_v4l_dev_release(struct video_device *vd)
-{
-}
-
-static struct video_device stk_v4l_data = {
-       .name = "stkwebcam",
-       .type = VFL_TYPE_GRABBER,
-       .type2 = VID_TYPE_CAPTURE,
-       .minor = -1,
-       .tvnorms = V4L2_STD_UNKNOWN,
-       .current_norm = V4L2_STD_UNKNOWN,
-       .fops = &v4l_stk_fops,
-       .release = stk_v4l_dev_release,
-
+static const struct v4l2_ioctl_ops v4l_stk_ioctl_ops = {
        .vidioc_querycap = stk_vidioc_querycap,
        .vidioc_enum_fmt_vid_cap = stk_vidioc_enum_fmt_vid_cap,
        .vidioc_try_fmt_vid_cap = stk_vidioc_try_fmt_vid_cap,
@@ -1363,6 +1350,22 @@ static struct video_device stk_v4l_data = {
        .vidioc_g_parm = stk_vidioc_g_parm,
 };
 
+static void stk_v4l_dev_release(struct video_device *vd)
+{
+}
+
+static struct video_device stk_v4l_data = {
+       .name = "stkwebcam",
+       .type = VFL_TYPE_GRABBER,
+       .type2 = VID_TYPE_CAPTURE,
+       .minor = -1,
+       .tvnorms = V4L2_STD_UNKNOWN,
+       .current_norm = V4L2_STD_UNKNOWN,
+       .fops = &v4l_stk_fops,
+       .ioctl_ops = &v4l_stk_ioctl_ops,
+       .release = stk_v4l_dev_release,
+};
+
 
 static int stk_register_video_device(struct stk_camera *dev)
 {
index 5984c75..7eccdc1 100644 (file)
@@ -1370,13 +1370,8 @@ static const struct file_operations usbvision_fops = {
 /*     .poll          = video_poll, */
        .compat_ioctl  = v4l_compat_ioctl32,
 };
-static struct video_device usbvision_video_template = {
-       .owner             = THIS_MODULE,
-       .type           = VID_TYPE_TUNER | VID_TYPE_CAPTURE,
-       .fops           = &usbvision_fops,
-       .name           = "usbvision-video",
-       .release        = video_device_release,
-       .minor          = -1,
+
+static const struct v4l2_ioctl_ops usbvision_ioctl_ops = {
        .vidioc_querycap      = vidioc_querycap,
        .vidioc_enum_fmt_vid_cap  = vidioc_enum_fmt_vid_cap,
        .vidioc_g_fmt_vid_cap     = vidioc_g_fmt_vid_cap,
@@ -1408,6 +1403,16 @@ static struct video_device usbvision_video_template = {
        .vidioc_g_register    = vidioc_g_register,
        .vidioc_s_register    = vidioc_s_register,
 #endif
+};
+
+static struct video_device usbvision_video_template = {
+       .owner             = THIS_MODULE,
+       .type           = VID_TYPE_TUNER | VID_TYPE_CAPTURE,
+       .fops           = &usbvision_fops,
+       .ioctl_ops      = &usbvision_ioctl_ops,
+       .name           = "usbvision-video",
+       .release        = video_device_release,
+       .minor          = -1,
        .tvnorms              = USBVISION_NORMS,
        .current_norm         = V4L2_STD_PAL
 };
@@ -1423,14 +1428,7 @@ static const struct file_operations usbvision_radio_fops = {
        .compat_ioctl  = v4l_compat_ioctl32,
 };
 
-static struct video_device usbvision_radio_template=
-{
-       .owner             = THIS_MODULE,
-       .type           = VID_TYPE_TUNER,
-       .fops           = &usbvision_radio_fops,
-       .name           = "usbvision-radio",
-       .release        = video_device_release,
-       .minor          = -1,
+static const struct v4l2_ioctl_ops usbvision_radio_ioctl_ops = {
        .vidioc_querycap      = vidioc_querycap,
        .vidioc_enum_input    = vidioc_enum_input,
        .vidioc_g_input       = vidioc_g_input,
@@ -1444,6 +1442,16 @@ static struct video_device usbvision_radio_template=
        .vidioc_s_tuner       = vidioc_s_tuner,
        .vidioc_g_frequency   = vidioc_g_frequency,
        .vidioc_s_frequency   = vidioc_s_frequency,
+};
+
+static struct video_device usbvision_radio_template = {
+       .owner             = THIS_MODULE,
+       .type           = VID_TYPE_TUNER,
+       .fops           = &usbvision_radio_fops,
+       .name           = "usbvision-radio",
+       .release        = video_device_release,
+       .minor          = -1,
+       .ioctl_ops      = &usbvision_radio_ioctl_ops,
 
        .tvnorms              = USBVISION_NORMS,
        .current_norm         = V4L2_STD_PAL
index 56a4fde..fdfe773 100644 (file)
@@ -579,43 +579,46 @@ static inline int check_ext_ctrls(struct v4l2_ext_controls *c, int allow_priv)
        return 1;
 }
 
-static int check_fmt(struct video_device *vfd, enum v4l2_buf_type type)
+static int check_fmt(const struct v4l2_ioctl_ops *ops, enum v4l2_buf_type type)
 {
+       if (ops == NULL)
+               return -EINVAL;
+
        switch (type) {
        case V4L2_BUF_TYPE_VIDEO_CAPTURE:
-               if (vfd->vidioc_try_fmt_vid_cap)
+               if (ops->vidioc_try_fmt_vid_cap)
                        return 0;
                break;
        case V4L2_BUF_TYPE_VIDEO_OVERLAY:
-               if (vfd->vidioc_try_fmt_vid_overlay)
+               if (ops->vidioc_try_fmt_vid_overlay)
                        return 0;
                break;
        case V4L2_BUF_TYPE_VIDEO_OUTPUT:
-               if (vfd->vidioc_try_fmt_vid_out)
+               if (ops->vidioc_try_fmt_vid_out)
                        return 0;
                break;
        case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
-               if (vfd->vidioc_try_fmt_vid_out_overlay)
+               if (ops->vidioc_try_fmt_vid_out_overlay)
                        return 0;
                break;
        case V4L2_BUF_TYPE_VBI_CAPTURE:
-               if (vfd->vidioc_try_fmt_vbi_cap)
+               if (ops->vidioc_try_fmt_vbi_cap)
                        return 0;
                break;
        case V4L2_BUF_TYPE_VBI_OUTPUT:
-               if (vfd->vidioc_try_fmt_vbi_out)
+               if (ops->vidioc_try_fmt_vbi_out)
                        return 0;
                break;
        case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
-               if (vfd->vidioc_try_fmt_sliced_vbi_cap)
+               if (ops->vidioc_try_fmt_sliced_vbi_cap)
                        return 0;
                break;
        case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
-               if (vfd->vidioc_try_fmt_sliced_vbi_out)
+               if (ops->vidioc_try_fmt_sliced_vbi_out)
                        return 0;
                break;
        case V4L2_BUF_TYPE_PRIVATE:
-               if (vfd->vidioc_try_fmt_type_private)
+               if (ops->vidioc_try_fmt_type_private)
                        return 0;
                break;
        }
@@ -626,6 +629,7 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
                unsigned int cmd, void *arg)
 {
        struct video_device *vfd = video_devdata(file);
+       const struct v4l2_ioctl_ops *ops = vfd->ioctl_ops;
        void                 *fh = file->private_data;
        int                  ret = -EINVAL;
 
@@ -635,6 +639,12 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
                printk(KERN_CONT "\n");
        }
 
+       if (ops == NULL) {
+               printk(KERN_WARNING "videodev: \"%s\" has no ioctl_ops.\n",
+                               vfd->name);
+               return -EINVAL;
+       }
+
 #ifdef CONFIG_VIDEO_V4L1_COMPAT
        /***********************************************************
         Handles calls to the obsoleted V4L1 API
@@ -648,9 +658,9 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
 
                memset(p, 0, sizeof(*p));
 
-               if (!vfd->vidiocgmbuf)
+               if (!ops->vidiocgmbuf)
                        return ret;
-               ret = vfd->vidiocgmbuf(file, fh, p);
+               ret = ops->vidiocgmbuf(file, fh, p);
                if (!ret)
                        dbgarg(cmd, "size=%d, frames=%d, offsets=0x%08lx\n",
                                                p->size, p->frames,
@@ -676,10 +686,10 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
                struct v4l2_capability *cap = (struct v4l2_capability *)arg;
                memset(cap, 0, sizeof(*cap));
 
-               if (!vfd->vidioc_querycap)
+               if (!ops->vidioc_querycap)
                        break;
 
-               ret = vfd->vidioc_querycap(file, fh, cap);
+               ret = ops->vidioc_querycap(file, fh, cap);
                if (!ret)
                        dbgarg(cmd, "driver=%s, card=%s, bus=%s, "
                                        "version=0x%08x, "
@@ -695,9 +705,9 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                enum v4l2_priority *p = arg;
 
-               if (!vfd->vidioc_g_priority)
+               if (!ops->vidioc_g_priority)
                        break;
-               ret = vfd->vidioc_g_priority(file, fh, p);
+               ret = ops->vidioc_g_priority(file, fh, p);
                if (!ret)
                        dbgarg(cmd, "priority is %d\n", *p);
                break;
@@ -706,10 +716,10 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                enum v4l2_priority *p = arg;
 
-               if (!vfd->vidioc_s_priority)
+               if (!ops->vidioc_s_priority)
                        break;
                dbgarg(cmd, "setting priority to %d\n", *p);
-               ret = vfd->vidioc_s_priority(file, fh, *p);
+               ret = ops->vidioc_s_priority(file, fh, *p);
                break;
        }
 
@@ -728,12 +738,12 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
 
                switch (type) {
                case V4L2_BUF_TYPE_VIDEO_CAPTURE:
-                       if (vfd->vidioc_enum_fmt_vid_cap)
-                               ret = vfd->vidioc_enum_fmt_vid_cap(file, fh, f);
+                       if (ops->vidioc_enum_fmt_vid_cap)
+                               ret = ops->vidioc_enum_fmt_vid_cap(file, fh, f);
                        break;
                case V4L2_BUF_TYPE_VIDEO_OVERLAY:
-                       if (vfd->vidioc_enum_fmt_vid_overlay)
-                               ret = vfd->vidioc_enum_fmt_vid_overlay(file,
+                       if (ops->vidioc_enum_fmt_vid_overlay)
+                               ret = ops->vidioc_enum_fmt_vid_overlay(file,
                                        fh, f);
                        break;
 #if 1
@@ -742,19 +752,19 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
                 * it though, so just warn that this is deprecated and will be
                 * removed in the near future. */
                case V4L2_BUF_TYPE_VBI_CAPTURE:
-                       if (vfd->vidioc_enum_fmt_vbi_cap) {
+                       if (ops->vidioc_enum_fmt_vbi_cap) {
                                printk(KERN_WARNING "vidioc_enum_fmt_vbi_cap will be removed in 2.6.28!\n");
-                               ret = vfd->vidioc_enum_fmt_vbi_cap(file, fh, f);
+                               ret = ops->vidioc_enum_fmt_vbi_cap(file, fh, f);
                        }
                        break;
 #endif
                case V4L2_BUF_TYPE_VIDEO_OUTPUT:
-                       if (vfd->vidioc_enum_fmt_vid_out)
-                               ret = vfd->vidioc_enum_fmt_vid_out(file, fh, f);
+                       if (ops->vidioc_enum_fmt_vid_out)
+                               ret = ops->vidioc_enum_fmt_vid_out(file, fh, f);
                        break;
                case V4L2_BUF_TYPE_PRIVATE:
-                       if (vfd->vidioc_enum_fmt_type_private)
-                               ret = vfd->vidioc_enum_fmt_type_private(file,
+                       if (ops->vidioc_enum_fmt_type_private)
+                               ret = ops->vidioc_enum_fmt_type_private(file,
                                                                fh, f);
                        break;
                default:
@@ -782,48 +792,48 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
 
                switch (f->type) {
                case V4L2_BUF_TYPE_VIDEO_CAPTURE:
-                       if (vfd->vidioc_g_fmt_vid_cap)
-                               ret = vfd->vidioc_g_fmt_vid_cap(file, fh, f);
+                       if (ops->vidioc_g_fmt_vid_cap)
+                               ret = ops->vidioc_g_fmt_vid_cap(file, fh, f);
                        if (!ret)
                                v4l_print_pix_fmt(vfd, &f->fmt.pix);
                        break;
                case V4L2_BUF_TYPE_VIDEO_OVERLAY:
-                       if (vfd->vidioc_g_fmt_vid_overlay)
-                               ret = vfd->vidioc_g_fmt_vid_overlay(file,
+                       if (ops->vidioc_g_fmt_vid_overlay)
+                               ret = ops->vidioc_g_fmt_vid_overlay(file,
                                                                    fh, f);
                        break;
                case V4L2_BUF_TYPE_VIDEO_OUTPUT:
-                       if (vfd->vidioc_g_fmt_vid_out)
-                               ret = vfd->vidioc_g_fmt_vid_out(file, fh, f);
+                       if (ops->vidioc_g_fmt_vid_out)
+                               ret = ops->vidioc_g_fmt_vid_out(file, fh, f);
                        if (!ret)
                                v4l_print_pix_fmt(vfd, &f->fmt.pix);
                        break;
                case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
-                       if (vfd->vidioc_g_fmt_vid_out_overlay)
-                               ret = vfd->vidioc_g_fmt_vid_out_overlay(file,
+                       if (ops->vidioc_g_fmt_vid_out_overlay)
+                               ret = ops->vidioc_g_fmt_vid_out_overlay(file,
                                       fh, f);
                        break;
                case V4L2_BUF_TYPE_VBI_CAPTURE:
-                       if (vfd->vidioc_g_fmt_vbi_cap)
-                               ret = vfd->vidioc_g_fmt_vbi_cap(file, fh, f);
+                       if (ops->vidioc_g_fmt_vbi_cap)
+                               ret = ops->vidioc_g_fmt_vbi_cap(file, fh, f);
                        break;
                case V4L2_BUF_TYPE_VBI_OUTPUT:
-                       if (vfd->vidioc_g_fmt_vbi_out)
-                               ret = vfd->vidioc_g_fmt_vbi_out(file, fh, f);
+                       if (ops->vidioc_g_fmt_vbi_out)
+                               ret = ops->vidioc_g_fmt_vbi_out(file, fh, f);
                        break;
                case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
-                       if (vfd->vidioc_g_fmt_sliced_vbi_cap)
-                               ret = vfd->vidioc_g_fmt_sliced_vbi_cap(file,
+                       if (ops->vidioc_g_fmt_sliced_vbi_cap)
+                               ret = ops->vidioc_g_fmt_sliced_vbi_cap(file,
                                                                        fh, f);
                        break;
                case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
-                       if (vfd->vidioc_g_fmt_sliced_vbi_out)
-                               ret = vfd->vidioc_g_fmt_sliced_vbi_out(file,
+                       if (ops->vidioc_g_fmt_sliced_vbi_out)
+                               ret = ops->vidioc_g_fmt_sliced_vbi_out(file,
                                                                        fh, f);
                        break;
                case V4L2_BUF_TYPE_PRIVATE:
-                       if (vfd->vidioc_g_fmt_type_private)
-                               ret = vfd->vidioc_g_fmt_type_private(file,
+                       if (ops->vidioc_g_fmt_type_private)
+                               ret = ops->vidioc_g_fmt_type_private(file,
                                                                fh, f);
                        break;
                }
@@ -840,45 +850,45 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
                switch (f->type) {
                case V4L2_BUF_TYPE_VIDEO_CAPTURE:
                        v4l_print_pix_fmt(vfd, &f->fmt.pix);
-                       if (vfd->vidioc_s_fmt_vid_cap)
-                               ret = vfd->vidioc_s_fmt_vid_cap(file, fh, f);
+                       if (ops->vidioc_s_fmt_vid_cap)
+                               ret = ops->vidioc_s_fmt_vid_cap(file, fh, f);
                        break;
                case V4L2_BUF_TYPE_VIDEO_OVERLAY:
-                       if (vfd->vidioc_s_fmt_vid_overlay)
-                               ret = vfd->vidioc_s_fmt_vid_overlay(file,
+                       if (ops->vidioc_s_fmt_vid_overlay)
+                               ret = ops->vidioc_s_fmt_vid_overlay(file,
                                                                    fh, f);
                        break;
                case V4L2_BUF_TYPE_VIDEO_OUTPUT:
                        v4l_print_pix_fmt(vfd, &f->fmt.pix);
-                       if (vfd->vidioc_s_fmt_vid_out)
-                               ret = vfd->vidioc_s_fmt_vid_out(file, fh, f);
+                       if (ops->vidioc_s_fmt_vid_out)
+                               ret = ops->vidioc_s_fmt_vid_out(file, fh, f);
                        break;
                case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
-                       if (vfd->vidioc_s_fmt_vid_out_overlay)
-                               ret = vfd->vidioc_s_fmt_vid_out_overlay(file,
+                       if (ops->vidioc_s_fmt_vid_out_overlay)
+                               ret = ops->vidioc_s_fmt_vid_out_overlay(file,
                                        fh, f);
                        break;
                case V4L2_BUF_TYPE_VBI_CAPTURE:
-                       if (vfd->vidioc_s_fmt_vbi_cap)
-                               ret = vfd->vidioc_s_fmt_vbi_cap(file, fh, f);
+                       if (ops->vidioc_s_fmt_vbi_cap)
+                               ret = ops->vidioc_s_fmt_vbi_cap(file, fh, f);
                        break;
                case V4L2_BUF_TYPE_VBI_OUTPUT:
-                       if (vfd->vidioc_s_fmt_vbi_out)
-                               ret = vfd->vidioc_s_fmt_vbi_out(file, fh, f);
+                       if (ops->vidioc_s_fmt_vbi_out)
+                               ret = ops->vidioc_s_fmt_vbi_out(file, fh, f);
                        break;
                case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
-                       if (vfd->vidioc_s_fmt_sliced_vbi_cap)
-                               ret = vfd->vidioc_s_fmt_sliced_vbi_cap(file,
+                       if (ops->vidioc_s_fmt_sliced_vbi_cap)
+                               ret = ops->vidioc_s_fmt_sliced_vbi_cap(file,
                                                                        fh, f);
                        break;
                case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
-                       if (vfd->vidioc_s_fmt_sliced_vbi_out)
-                               ret = vfd->vidioc_s_fmt_sliced_vbi_out(file,
+                       if (ops->vidioc_s_fmt_sliced_vbi_out)
+                               ret = ops->vidioc_s_fmt_sliced_vbi_out(file,
                                                                        fh, f);
                        break;
                case V4L2_BUF_TYPE_PRIVATE:
-                       if (vfd->vidioc_s_fmt_type_private)
-                               ret = vfd->vidioc_s_fmt_type_private(file,
+                       if (ops->vidioc_s_fmt_type_private)
+                               ret = ops->vidioc_s_fmt_type_private(file,
                                                                fh, f);
                        break;
                }
@@ -893,48 +903,48 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
                                                v4l2_type_names));
                switch (f->type) {
                case V4L2_BUF_TYPE_VIDEO_CAPTURE:
-                       if (vfd->vidioc_try_fmt_vid_cap)
-                               ret = vfd->vidioc_try_fmt_vid_cap(file, fh, f);
+                       if (ops->vidioc_try_fmt_vid_cap)
+                               ret = ops->vidioc_try_fmt_vid_cap(file, fh, f);
                        if (!ret)
                                v4l_print_pix_fmt(vfd, &f->fmt.pix);
                        break;
                case V4L2_BUF_TYPE_VIDEO_OVERLAY:
-                       if (vfd->vidioc_try_fmt_vid_overlay)
-                               ret = vfd->vidioc_try_fmt_vid_overlay(file,
+                       if (ops->vidioc_try_fmt_vid_overlay)
+                               ret = ops->vidioc_try_fmt_vid_overlay(file,
                                        fh, f);
                        break;
                case V4L2_BUF_TYPE_VIDEO_OUTPUT:
-                       if (vfd->vidioc_try_fmt_vid_out)
-                               ret = vfd->vidioc_try_fmt_vid_out(file, fh, f);
+                       if (ops->vidioc_try_fmt_vid_out)
+                               ret = ops->vidioc_try_fmt_vid_out(file, fh, f);
                        if (!ret)
                                v4l_print_pix_fmt(vfd, &f->fmt.pix);
                        break;
                case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
-                       if (vfd->vidioc_try_fmt_vid_out_overlay)
-                               ret = vfd->vidioc_try_fmt_vid_out_overlay(file,
+                       if (ops->vidioc_try_fmt_vid_out_overlay)
+                               ret = ops->vidioc_try_fmt_vid_out_overlay(file,
                                       fh, f);
                        break;
                case V4L2_BUF_TYPE_VBI_CAPTURE:
-                       if (vfd->vidioc_try_fmt_vbi_cap)
-                               ret = vfd->vidioc_try_fmt_vbi_cap(file, fh, f);
+                       if (ops->vidioc_try_fmt_vbi_cap)
+                               ret = ops->vidioc_try_fmt_vbi_cap(file, fh, f);
                        break;
                case V4L2_BUF_TYPE_VBI_OUTPUT:
-                       if (vfd->vidioc_try_fmt_vbi_out)
-                               ret = vfd->vidioc_try_fmt_vbi_out(file, fh, f);
+                       if (ops->vidioc_try_fmt_vbi_out)
+                               ret = ops->vidioc_try_fmt_vbi_out(file, fh, f);
                        break;
                case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
-                       if (vfd->vidioc_try_fmt_sliced_vbi_cap)
-                               ret = vfd->vidioc_try_fmt_sliced_vbi_cap(file,
+                       if (ops->vidioc_try_fmt_sliced_vbi_cap)
+                               ret = ops->vidioc_try_fmt_sliced_vbi_cap(file,
                                                                fh, f);
                        break;
                case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
-                       if (vfd->vidioc_try_fmt_sliced_vbi_out)
-                               ret = vfd->vidioc_try_fmt_sliced_vbi_out(file,
+                       if (ops->vidioc_try_fmt_sliced_vbi_out)
+                               ret = ops->vidioc_try_fmt_sliced_vbi_out(file,
                                                                fh, f);
                        break;
                case V4L2_BUF_TYPE_PRIVATE:
-                       if (vfd->vidioc_try_fmt_type_private)
-                               ret = vfd->vidioc_try_fmt_type_private(file,
+                       if (ops->vidioc_try_fmt_type_private)
+                               ret = ops->vidioc_try_fmt_type_private(file,
                                                                fh, f);
                        break;
                }
@@ -949,13 +959,13 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                struct v4l2_requestbuffers *p = arg;
 
-               if (!vfd->vidioc_reqbufs)
+               if (!ops->vidioc_reqbufs)
                        break;
-               ret = check_fmt(vfd, p->type);
+               ret = check_fmt(ops, p->type);
                if (ret)
                        break;
 
-               ret = vfd->vidioc_reqbufs(file, fh, p);
+               ret = ops->vidioc_reqbufs(file, fh, p);
                dbgarg(cmd, "count=%d, type=%s, memory=%s\n",
                                p->count,
                                prt_names(p->type, v4l2_type_names),
@@ -966,13 +976,13 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                struct v4l2_buffer *p = arg;
 
-               if (!vfd->vidioc_querybuf)
+               if (!ops->vidioc_querybuf)
                        break;
-               ret = check_fmt(vfd, p->type);
+               ret = check_fmt(ops, p->type);
                if (ret)
                        break;
 
-               ret = vfd->vidioc_querybuf(file, fh, p);
+               ret = ops->vidioc_querybuf(file, fh, p);
                if (!ret)
                        dbgbuf(cmd, vfd, p);
                break;
@@ -981,13 +991,13 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                struct v4l2_buffer *p = arg;
 
-               if (!vfd->vidioc_qbuf)
+               if (!ops->vidioc_qbuf)
                        break;
-               ret = check_fmt(vfd, p->type);
+               ret = check_fmt(ops, p->type);
                if (ret)
                        break;
 
-               ret = vfd->vidioc_qbuf(file, fh, p);
+               ret = ops->vidioc_qbuf(file, fh, p);
                if (!ret)
                        dbgbuf(cmd, vfd, p);
                break;
@@ -996,13 +1006,13 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                struct v4l2_buffer *p = arg;
 
-               if (!vfd->vidioc_dqbuf)
+               if (!ops->vidioc_dqbuf)
                        break;
-               ret = check_fmt(vfd, p->type);
+               ret = check_fmt(ops, p->type);
                if (ret)
                        break;
 
-               ret = vfd->vidioc_dqbuf(file, fh, p);
+               ret = ops->vidioc_dqbuf(file, fh, p);
                if (!ret)
                        dbgbuf(cmd, vfd, p);
                break;
@@ -1011,19 +1021,19 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                int *i = arg;
 
-               if (!vfd->vidioc_overlay)
+               if (!ops->vidioc_overlay)
                        break;
                dbgarg(cmd, "value=%d\n", *i);
-               ret = vfd->vidioc_overlay(file, fh, *i);
+               ret = ops->vidioc_overlay(file, fh, *i);
                break;
        }
        case VIDIOC_G_FBUF:
        {
                struct v4l2_framebuffer *p = arg;
 
-               if (!vfd->vidioc_g_fbuf)
+               if (!ops->vidioc_g_fbuf)
                        break;
-               ret = vfd->vidioc_g_fbuf(file, fh, arg);
+               ret = ops->vidioc_g_fbuf(file, fh, arg);
                if (!ret) {
                        dbgarg(cmd, "capability=0x%x, flags=%d, base=0x%08lx\n",
                                        p->capability, p->flags,
@@ -1036,32 +1046,32 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                struct v4l2_framebuffer *p = arg;
 
-               if (!vfd->vidioc_s_fbuf)
+               if (!ops->vidioc_s_fbuf)
                        break;
                dbgarg(cmd, "capability=0x%x, flags=%d, base=0x%08lx\n",
                        p->capability, p->flags, (unsigned long)p->base);
                v4l_print_pix_fmt(vfd, &p->fmt);
-               ret = vfd->vidioc_s_fbuf(file, fh, arg);
+               ret = ops->vidioc_s_fbuf(file, fh, arg);
                break;
        }
        case VIDIOC_STREAMON:
        {
                enum v4l2_buf_type i = *(int *)arg;
 
-               if (!vfd->vidioc_streamon)
+               if (!ops->vidioc_streamon)
                        break;
                dbgarg(cmd, "type=%s\n", prt_names(i, v4l2_type_names));
-               ret = vfd->vidioc_streamon(file, fh, i);
+               ret = ops->vidioc_streamon(file, fh, i);
                break;
        }
        case VIDIOC_STREAMOFF:
        {
                enum v4l2_buf_type i = *(int *)arg;
 
-               if (!vfd->vidioc_streamoff)
+               if (!ops->vidioc_streamoff)
                        break;
                dbgarg(cmd, "type=%s\n", prt_names(i, v4l2_type_names));
-               ret = vfd->vidioc_streamoff(file, fh, i);
+               ret = ops->vidioc_streamoff(file, fh, i);
                break;
        }
        /* ---------- tv norms ---------- */
@@ -1110,8 +1120,8 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
 
                ret = 0;
                /* Calls the specific handler */
-               if (vfd->vidioc_g_std)
-                       ret = vfd->vidioc_g_std(file, fh, id);
+               if (ops->vidioc_g_std)
+                       ret = ops->vidioc_g_std(file, fh, id);
                else
                        *id = vfd->current_norm;
 
@@ -1130,8 +1140,8 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
                        break;
 
                /* Calls the specific handler */
-               if (vfd->vidioc_s_std)
-                       ret = vfd->vidioc_s_std(file, fh, &norm);
+               if (ops->vidioc_s_std)
+                       ret = ops->vidioc_s_std(file, fh, &norm);
                else
                        ret = -EINVAL;
 
@@ -1144,9 +1154,9 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                v4l2_std_id *p = arg;
 
-               if (!vfd->vidioc_querystd)
+               if (!ops->vidioc_querystd)
                        break;
-               ret = vfd->vidioc_querystd(file, fh, arg);
+               ret = ops->vidioc_querystd(file, fh, arg);
                if (!ret)
                        dbgarg(cmd, "detected std=%08Lx\n",
                                                (unsigned long long)*p);
@@ -1159,12 +1169,12 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
                struct v4l2_input *p = arg;
                int i = p->index;
 
-               if (!vfd->vidioc_enum_input)
+               if (!ops->vidioc_enum_input)
                        break;
                memset(p, 0, sizeof(*p));
                p->index = i;
 
-               ret = vfd->vidioc_enum_input(file, fh, p);
+               ret = ops->vidioc_enum_input(file, fh, p);
                if (!ret)
                        dbgarg(cmd, "index=%d, name=%s, type=%d, "
                                "audioset=%d, "
@@ -1179,9 +1189,9 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                unsigned int *i = arg;
 
-               if (!vfd->vidioc_g_input)
+               if (!ops->vidioc_g_input)
                        break;
-               ret = vfd->vidioc_g_input(file, fh, i);
+               ret = ops->vidioc_g_input(file, fh, i);
                if (!ret)
                        dbgarg(cmd, "value=%d\n", *i);
                break;
@@ -1190,10 +1200,10 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                unsigned int *i = arg;
 
-               if (!vfd->vidioc_s_input)
+               if (!ops->vidioc_s_input)
                        break;
                dbgarg(cmd, "value=%d\n", *i);
-               ret = vfd->vidioc_s_input(file, fh, *i);
+               ret = ops->vidioc_s_input(file, fh, *i);
                break;
        }
 
@@ -1203,12 +1213,12 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
                struct v4l2_output *p = arg;
                int i = p->index;
 
-               if (!vfd->vidioc_enum_output)
+               if (!ops->vidioc_enum_output)
                        break;
                memset(p, 0, sizeof(*p));
                p->index = i;
 
-               ret = vfd->vidioc_enum_output(file, fh, p);
+               ret = ops->vidioc_enum_output(file, fh, p);
                if (!ret)
                        dbgarg(cmd, "index=%d, name=%s, type=%d, "
                                "audioset=0x%x, "
@@ -1221,9 +1231,9 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                unsigned int *i = arg;
 
-               if (!vfd->vidioc_g_output)
+               if (!ops->vidioc_g_output)
                        break;
-               ret = vfd->vidioc_g_output(file, fh, i);
+               ret = ops->vidioc_g_output(file, fh, i);
                if (!ret)
                        dbgarg(cmd, "value=%d\n", *i);
                break;
@@ -1232,10 +1242,10 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                unsigned int *i = arg;
 
-               if (!vfd->vidioc_s_output)
+               if (!ops->vidioc_s_output)
                        break;
                dbgarg(cmd, "value=%d\n", *i);
-               ret = vfd->vidioc_s_output(file, fh, *i);
+               ret = ops->vidioc_s_output(file, fh, *i);
                break;
        }
 
@@ -1244,9 +1254,9 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                struct v4l2_queryctrl *p = arg;
 
-               if (!vfd->vidioc_queryctrl)
+               if (!ops->vidioc_queryctrl)
                        break;
-               ret = vfd->vidioc_queryctrl(file, fh, p);
+               ret = ops->vidioc_queryctrl(file, fh, p);
                if (!ret)
                        dbgarg(cmd, "id=0x%x, type=%d, name=%s, min/max=%d/%d, "
                                        "step=%d, default=%d, flags=0x%08x\n",
@@ -1261,9 +1271,9 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                struct v4l2_control *p = arg;
 
-               if (vfd->vidioc_g_ctrl)
-                       ret = vfd->vidioc_g_ctrl(file, fh, p);
-               else if (vfd->vidioc_g_ext_ctrls) {
+               if (ops->vidioc_g_ctrl)
+                       ret = ops->vidioc_g_ctrl(file, fh, p);
+               else if (ops->vidioc_g_ext_ctrls) {
                        struct v4l2_ext_controls ctrls;
                        struct v4l2_ext_control ctrl;
 
@@ -1273,7 +1283,7 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
                        ctrl.id = p->id;
                        ctrl.value = p->value;
                        if (check_ext_ctrls(&ctrls, 1)) {
-                               ret = vfd->vidioc_g_ext_ctrls(file, fh, &ctrls);
+                               ret = ops->vidioc_g_ext_ctrls(file, fh, &ctrls);
                                if (ret == 0)
                                        p->value = ctrl.value;
                        }
@@ -1291,16 +1301,16 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
                struct v4l2_ext_controls ctrls;
                struct v4l2_ext_control ctrl;
 
-               if (!vfd->vidioc_s_ctrl && !vfd->vidioc_s_ext_ctrls)
+               if (!ops->vidioc_s_ctrl && !ops->vidioc_s_ext_ctrls)
                        break;
 
                dbgarg(cmd, "id=0x%x, value=%d\n", p->id, p->value);
 
-               if (vfd->vidioc_s_ctrl) {
-                       ret = vfd->vidioc_s_ctrl(file, fh, p);
+               if (ops->vidioc_s_ctrl) {
+                       ret = ops->vidioc_s_ctrl(file, fh, p);
                        break;
                }
-               if (!vfd->vidioc_s_ext_ctrls)
+               if (!ops->vidioc_s_ext_ctrls)
                        break;
 
                ctrls.ctrl_class = V4L2_CTRL_ID2CLASS(p->id);
@@ -1309,7 +1319,7 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
                ctrl.id = p->id;
                ctrl.value = p->value;
                if (check_ext_ctrls(&ctrls, 1))
-                       ret = vfd->vidioc_s_ext_ctrls(file, fh, &ctrls);
+                       ret = ops->vidioc_s_ext_ctrls(file, fh, &ctrls);
                break;
        }
        case VIDIOC_G_EXT_CTRLS:
@@ -1317,10 +1327,10 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
                struct v4l2_ext_controls *p = arg;
 
                p->error_idx = p->count;
-               if (!vfd->vidioc_g_ext_ctrls)
+               if (!ops->vidioc_g_ext_ctrls)
                        break;
                if (check_ext_ctrls(p, 0))
-                       ret = vfd->vidioc_g_ext_ctrls(file, fh, p);
+                       ret = ops->vidioc_g_ext_ctrls(file, fh, p);
                v4l_print_ext_ctrls(cmd, vfd, p, !ret);
                break;
        }
@@ -1329,11 +1339,11 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
                struct v4l2_ext_controls *p = arg;
 
                p->error_idx = p->count;
-               if (!vfd->vidioc_s_ext_ctrls)
+               if (!ops->vidioc_s_ext_ctrls)
                        break;
                v4l_print_ext_ctrls(cmd, vfd, p, 1);
                if (check_ext_ctrls(p, 0))
-                       ret = vfd->vidioc_s_ext_ctrls(file, fh, p);
+                       ret = ops->vidioc_s_ext_ctrls(file, fh, p);
                break;
        }
        case VIDIOC_TRY_EXT_CTRLS:
@@ -1341,20 +1351,20 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
                struct v4l2_ext_controls *p = arg;
 
                p->error_idx = p->count;
-               if (!vfd->vidioc_try_ext_ctrls)
+               if (!ops->vidioc_try_ext_ctrls)
                        break;
                v4l_print_ext_ctrls(cmd, vfd, p, 1);
                if (check_ext_ctrls(p, 0))
-                       ret = vfd->vidioc_try_ext_ctrls(file, fh, p);
+                       ret = ops->vidioc_try_ext_ctrls(file, fh, p);
                break;
        }
        case VIDIOC_QUERYMENU:
        {
                struct v4l2_querymenu *p = arg;
 
-               if (!vfd->vidioc_querymenu)
+               if (!ops->vidioc_querymenu)
                        break;
-               ret = vfd->vidioc_querymenu(file, fh, p);
+               ret = ops->vidioc_querymenu(file, fh, p);
                if (!ret)
                        dbgarg(cmd, "id=0x%x, index=%d, name=%s\n",
                                p->id, p->index, p->name);
@@ -1368,9 +1378,9 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                struct v4l2_audio *p = arg;
 
-               if (!vfd->vidioc_enumaudio)
+               if (!ops->vidioc_enumaudio)
                        break;
-               ret = vfd->vidioc_enumaudio(file, fh, p);
+               ret = ops->vidioc_enumaudio(file, fh, p);
                if (!ret)
                        dbgarg(cmd, "index=%d, name=%s, capability=0x%x, "
                                        "mode=0x%x\n", p->index, p->name,
@@ -1384,12 +1394,12 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
                struct v4l2_audio *p = arg;
                __u32 index = p->index;
 
-               if (!vfd->vidioc_g_audio)
+               if (!ops->vidioc_g_audio)
                        break;
 
                memset(p, 0, sizeof(*p));
                p->index = index;
-               ret = vfd->vidioc_g_audio(file, fh, p);
+               ret = ops->vidioc_g_audio(file, fh, p);
                if (!ret)
                        dbgarg(cmd, "index=%d, name=%s, capability=0x%x, "
                                        "mode=0x%x\n", p->index,
@@ -1402,22 +1412,22 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                struct v4l2_audio *p = arg;
 
-               if (!vfd->vidioc_s_audio)
+               if (!ops->vidioc_s_audio)
                        break;
                dbgarg(cmd, "index=%d, name=%s, capability=0x%x, "
                                        "mode=0x%x\n", p->index, p->name,
                                        p->capability, p->mode);
-               ret = vfd->vidioc_s_audio(file, fh, p);
+               ret = ops->vidioc_s_audio(file, fh, p);
                break;
        }
        case VIDIOC_ENUMAUDOUT:
        {
                struct v4l2_audioout *p = arg;
 
-               if (!vfd->vidioc_enumaudout)
+               if (!ops->vidioc_enumaudout)
                        break;
                dbgarg(cmd, "Enum for index=%d\n", p->index);
-               ret = vfd->vidioc_enumaudout(file, fh, p);
+               ret = ops->vidioc_enumaudout(file, fh, p);
                if (!ret)
                        dbgarg2("index=%d, name=%s, capability=%d, "
                                        "mode=%d\n", p->index, p->name,
@@ -1428,10 +1438,10 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                struct v4l2_audioout *p = arg;
 
-               if (!vfd->vidioc_g_audout)
+               if (!ops->vidioc_g_audout)
                        break;
                dbgarg(cmd, "Enum for index=%d\n", p->index);
-               ret = vfd->vidioc_g_audout(file, fh, p);
+               ret = ops->vidioc_g_audout(file, fh, p);
                if (!ret)
                        dbgarg2("index=%d, name=%s, capability=%d, "
                                        "mode=%d\n", p->index, p->name,
@@ -1442,22 +1452,22 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                struct v4l2_audioout *p = arg;
 
-               if (!vfd->vidioc_s_audout)
+               if (!ops->vidioc_s_audout)
                        break;
                dbgarg(cmd, "index=%d, name=%s, capability=%d, "
                                        "mode=%d\n", p->index, p->name,
                                        p->capability, p->mode);
 
-               ret = vfd->vidioc_s_audout(file, fh, p);
+               ret = ops->vidioc_s_audout(file, fh, p);
                break;
        }
        case VIDIOC_G_MODULATOR:
        {
                struct v4l2_modulator *p = arg;
 
-               if (!vfd->vidioc_g_modulator)
+               if (!ops->vidioc_g_modulator)
                        break;
-               ret = vfd->vidioc_g_modulator(file, fh, p);
+               ret = ops->vidioc_g_modulator(file, fh, p);
                if (!ret)
                        dbgarg(cmd, "index=%d, name=%s, "
                                        "capability=%d, rangelow=%d,"
@@ -1471,23 +1481,23 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                struct v4l2_modulator *p = arg;
 
-               if (!vfd->vidioc_s_modulator)
+               if (!ops->vidioc_s_modulator)
                        break;
                dbgarg(cmd, "index=%d, name=%s, capability=%d, "
                                "rangelow=%d, rangehigh=%d, txsubchans=%d\n",
                                p->index, p->name, p->capability, p->rangelow,
                                p->rangehigh, p->txsubchans);
-                       ret = vfd->vidioc_s_modulator(file, fh, p);
+                       ret = ops->vidioc_s_modulator(file, fh, p);
                break;
        }
        case VIDIOC_G_CROP:
        {
                struct v4l2_crop *p = arg;
 
-               if (!vfd->vidioc_g_crop)
+               if (!ops->vidioc_g_crop)
                        break;
                dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names));
-               ret = vfd->vidioc_g_crop(file, fh, p);
+               ret = ops->vidioc_g_crop(file, fh, p);
                if (!ret)
                        dbgrect(vfd, "", &p->c);
                break;
@@ -1496,11 +1506,11 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                struct v4l2_crop *p = arg;
 
-               if (!vfd->vidioc_s_crop)
+               if (!ops->vidioc_s_crop)
                        break;
                dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names));
                dbgrect(vfd, "", &p->c);
-               ret = vfd->vidioc_s_crop(file, fh, p);
+               ret = ops->vidioc_s_crop(file, fh, p);
                break;
        }
        case VIDIOC_CROPCAP:
@@ -1508,10 +1518,10 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
                struct v4l2_cropcap *p = arg;
 
                /*FIXME: Should also show v4l2_fract pixelaspect */
-               if (!vfd->vidioc_cropcap)
+               if (!ops->vidioc_cropcap)
                        break;
                dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names));
-               ret = vfd->vidioc_cropcap(file, fh, p);
+               ret = ops->vidioc_cropcap(file, fh, p);
                if (!ret) {
                        dbgrect(vfd, "bounds ", &p->bounds);
                        dbgrect(vfd, "defrect ", &p->defrect);
@@ -1522,9 +1532,9 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                struct v4l2_jpegcompression *p = arg;
 
-               if (!vfd->vidioc_g_jpegcomp)
+               if (!ops->vidioc_g_jpegcomp)
                        break;
-               ret = vfd->vidioc_g_jpegcomp(file, fh, p);
+               ret = ops->vidioc_g_jpegcomp(file, fh, p);
                if (!ret)
                        dbgarg(cmd, "quality=%d, APPn=%d, "
                                        "APP_len=%d, COM_len=%d, "
@@ -1537,22 +1547,22 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                struct v4l2_jpegcompression *p = arg;
 
-               if (!vfd->vidioc_g_jpegcomp)
+               if (!ops->vidioc_g_jpegcomp)
                        break;
                dbgarg(cmd, "quality=%d, APPn=%d, APP_len=%d, "
                                        "COM_len=%d, jpeg_markers=%d\n",
                                        p->quality, p->APPn, p->APP_len,
                                        p->COM_len, p->jpeg_markers);
-                       ret = vfd->vidioc_s_jpegcomp(file, fh, p);
+                       ret = ops->vidioc_s_jpegcomp(file, fh, p);
                break;
        }
        case VIDIOC_G_ENC_INDEX:
        {
                struct v4l2_enc_idx *p = arg;
 
-               if (!vfd->vidioc_g_enc_index)
+               if (!ops->vidioc_g_enc_index)
                        break;
-               ret = vfd->vidioc_g_enc_index(file, fh, p);
+               ret = ops->vidioc_g_enc_index(file, fh, p);
                if (!ret)
                        dbgarg(cmd, "entries=%d, entries_cap=%d\n",
                                        p->entries, p->entries_cap);
@@ -1562,10 +1572,10 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                struct v4l2_encoder_cmd *p = arg;
 
-               if (!vfd->vidioc_encoder_cmd)
+               if (!ops->vidioc_encoder_cmd)
                        break;
                memset(&p->raw, 0, sizeof(p->raw));
-               ret = vfd->vidioc_encoder_cmd(file, fh, p);
+               ret = ops->vidioc_encoder_cmd(file, fh, p);
                if (!ret)
                        dbgarg(cmd, "cmd=%d, flags=%x\n", p->cmd, p->flags);
                break;
@@ -1574,10 +1584,10 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                struct v4l2_encoder_cmd *p = arg;
 
-               if (!vfd->vidioc_try_encoder_cmd)
+               if (!ops->vidioc_try_encoder_cmd)
                        break;
                memset(&p->raw, 0, sizeof(p->raw));
-               ret = vfd->vidioc_try_encoder_cmd(file, fh, p);
+               ret = ops->vidioc_try_encoder_cmd(file, fh, p);
                if (!ret)
                        dbgarg(cmd, "cmd=%d, flags=%x\n", p->cmd, p->flags);
                break;
@@ -1590,8 +1600,8 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
                memset(p, 0, sizeof(*p));
                p->type = type;
 
-               if (vfd->vidioc_g_parm) {
-                       ret = vfd->vidioc_g_parm(file, fh, p);
+               if (ops->vidioc_g_parm) {
+                       ret = ops->vidioc_g_parm(file, fh, p);
                } else {
                        struct v4l2_standard s;
 
@@ -1612,10 +1622,10 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                struct v4l2_streamparm *p = arg;
 
-               if (!vfd->vidioc_s_parm)
+               if (!ops->vidioc_s_parm)
                        break;
                dbgarg(cmd, "type=%d\n", p->type);
-               ret = vfd->vidioc_s_parm(file, fh, p);
+               ret = ops->vidioc_s_parm(file, fh, p);
                break;
        }
        case VIDIOC_G_TUNER:
@@ -1623,13 +1633,13 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
                struct v4l2_tuner *p = arg;
                __u32 index = p->index;
 
-               if (!vfd->vidioc_g_tuner)
+               if (!ops->vidioc_g_tuner)
                        break;
 
                memset(p, 0, sizeof(*p));
                p->index = index;
 
-               ret = vfd->vidioc_g_tuner(file, fh, p);
+               ret = ops->vidioc_g_tuner(file, fh, p);
                if (!ret)
                        dbgarg(cmd, "index=%d, name=%s, type=%d, "
                                        "capability=0x%x, rangelow=%d, "
@@ -1645,7 +1655,7 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                struct v4l2_tuner *p = arg;
 
-               if (!vfd->vidioc_s_tuner)
+               if (!ops->vidioc_s_tuner)
                        break;
                dbgarg(cmd, "index=%d, name=%s, type=%d, "
                                "capability=0x%x, rangelow=%d, "
@@ -1655,19 +1665,19 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
                                p->capability, p->rangelow,
                                p->rangehigh, p->signal, p->afc,
                                p->rxsubchans, p->audmode);
-               ret = vfd->vidioc_s_tuner(file, fh, p);
+               ret = ops->vidioc_s_tuner(file, fh, p);
                break;
        }
        case VIDIOC_G_FREQUENCY:
        {
                struct v4l2_frequency *p = arg;
 
-               if (!vfd->vidioc_g_frequency)
+               if (!ops->vidioc_g_frequency)
                        break;
 
                memset(p->reserved, 0, sizeof(p->reserved));
 
-               ret = vfd->vidioc_g_frequency(file, fh, p);
+               ret = ops->vidioc_g_frequency(file, fh, p);
                if (!ret)
                        dbgarg(cmd, "tuner=%d, type=%d, frequency=%d\n",
                                        p->tuner, p->type, p->frequency);
@@ -1677,11 +1687,11 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                struct v4l2_frequency *p = arg;
 
-               if (!vfd->vidioc_s_frequency)
+               if (!ops->vidioc_s_frequency)
                        break;
                dbgarg(cmd, "tuner=%d, type=%d, frequency=%d\n",
                                p->tuner, p->type, p->frequency);
-               ret = vfd->vidioc_s_frequency(file, fh, p);
+               ret = ops->vidioc_s_frequency(file, fh, p);
                break;
        }
        case VIDIOC_G_SLICED_VBI_CAP:
@@ -1689,21 +1699,21 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
                struct v4l2_sliced_vbi_cap *p = arg;
                __u32 type = p->type;
 
-               if (!vfd->vidioc_g_sliced_vbi_cap)
+               if (!ops->vidioc_g_sliced_vbi_cap)
                        break;
                memset(p, 0, sizeof(*p));
                p->type = type;
                dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names));
-               ret = vfd->vidioc_g_sliced_vbi_cap(file, fh, p);
+               ret = ops->vidioc_g_sliced_vbi_cap(file, fh, p);
                if (!ret)
                        dbgarg2("service_set=%d\n", p->service_set);
                break;
        }
        case VIDIOC_LOG_STATUS:
        {
-               if (!vfd->vidioc_log_status)
+               if (!ops->vidioc_log_status)
                        break;
-               ret = vfd->vidioc_log_status(file, fh);
+               ret = ops->vidioc_log_status(file, fh);
                break;
        }
 #ifdef CONFIG_VIDEO_ADV_DEBUG
@@ -1713,8 +1723,8 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
 
                if (!capable(CAP_SYS_ADMIN))
                        ret = -EPERM;
-               else if (vfd->vidioc_g_register)
-                       ret = vfd->vidioc_g_register(file, fh, p);
+               else if (ops->vidioc_g_register)
+                       ret = ops->vidioc_g_register(file, fh, p);
                break;
        }
        case VIDIOC_DBG_S_REGISTER:
@@ -1723,8 +1733,8 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
 
                if (!capable(CAP_SYS_ADMIN))
                        ret = -EPERM;
-               else if (vfd->vidioc_s_register)
-                       ret = vfd->vidioc_s_register(file, fh, p);
+               else if (ops->vidioc_s_register)
+                       ret = ops->vidioc_s_register(file, fh, p);
                break;
        }
 #endif
@@ -1732,30 +1742,30 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        {
                struct v4l2_chip_ident *p = arg;
 
-               if (!vfd->vidioc_g_chip_ident)
+               if (!ops->vidioc_g_chip_ident)
                        break;
-               ret = vfd->vidioc_g_chip_ident(file, fh, p);
+               ret = ops->vidioc_g_chip_ident(file, fh, p);
                if (!ret)
                        dbgarg(cmd, "chip_ident=%u, revision=0x%x\n", p->ident, p->revision);
                break;
        }
-       default:
-       {
-               if (!vfd->vidioc_default)
-                       break;
-               ret = vfd->vidioc_default(file, fh, cmd, arg);
-               break;
-       }
        case VIDIOC_S_HW_FREQ_SEEK:
        {
                struct v4l2_hw_freq_seek *p = arg;
 
-               if (!vfd->vidioc_s_hw_freq_seek)
+               if (!ops->vidioc_s_hw_freq_seek)
                        break;
                dbgarg(cmd,
                        "tuner=%d, type=%d, seek_upward=%d, wrap_around=%d\n",
                        p->tuner, p->type, p->seek_upward, p->wrap_around);
-               ret = vfd->vidioc_s_hw_freq_seek(file, fh, p);
+               ret = ops->vidioc_s_hw_freq_seek(file, fh, p);
+               break;
+       }
+       default:
+       {
+               if (!ops->vidioc_default)
+                       break;
+               ret = ops->vidioc_default(file, fh, cmd, arg);
                break;
        }
        } /* switch */
index e4b3a00..639210e 100644 (file)
@@ -1066,13 +1066,7 @@ static const struct file_operations vivi_fops = {
        .llseek         = no_llseek,
 };
 
-static struct video_device vivi_template = {
-       .name           = "vivi",
-       .type           = VID_TYPE_CAPTURE,
-       .fops           = &vivi_fops,
-       .minor          = -1,
-       .release        = video_device_release,
-
+static const struct v4l2_ioctl_ops vivi_ioctl_ops = {
        .vidioc_querycap      = vidioc_querycap,
        .vidioc_enum_fmt_vid_cap  = vidioc_enum_fmt_vid_cap,
        .vidioc_g_fmt_vid_cap     = vidioc_g_fmt_vid_cap,
@@ -1094,6 +1088,16 @@ static struct video_device vivi_template = {
 #ifdef CONFIG_VIDEO_V4L1_COMPAT
        .vidiocgmbuf          = vidiocgmbuf,
 #endif
+};
+
+static struct video_device vivi_template = {
+       .name           = "vivi",
+       .type           = VID_TYPE_CAPTURE,
+       .fops           = &vivi_fops,
+       .ioctl_ops      = &vivi_ioctl_ops,
+       .minor          = -1,
+       .release        = video_device_release,
+
        .tvnorms              = V4L2_STD_525_60,
        .current_norm         = V4L2_STD_NTSC_M,
 };
index ea5265c..617ed28 100644 (file)
@@ -762,14 +762,7 @@ static const struct file_operations zr364xx_fops = {
        .llseek = no_llseek,
 };
 
-static struct video_device zr364xx_template = {
-       .owner = THIS_MODULE,
-       .name = DRIVER_DESC,
-       .type = VID_TYPE_CAPTURE,
-       .fops = &zr364xx_fops,
-       .release = video_device_release,
-       .minor = -1,
-
+static const struct v4l2_ioctl_ops zr364xx_ioctl_ops = {
        .vidioc_querycap        = zr364xx_vidioc_querycap,
        .vidioc_enum_fmt_vid_cap = zr364xx_vidioc_enum_fmt_vid_cap,
        .vidioc_try_fmt_vid_cap = zr364xx_vidioc_try_fmt_vid_cap,
@@ -785,6 +778,16 @@ static struct video_device zr364xx_template = {
        .vidioc_s_ctrl          = zr364xx_vidioc_s_ctrl,
 };
 
+static struct video_device zr364xx_template = {
+       .owner = THIS_MODULE,
+       .name = DRIVER_DESC,
+       .type = VID_TYPE_CAPTURE,
+       .fops = &zr364xx_fops,
+       .ioctl_ops = &zr364xx_ioctl_ops,
+       .release = video_device_release,
+       .minor = -1,
+};
+
 
 
 /*******************/
index ad62d32..d9149cd 100644 (file)
@@ -39,6 +39,8 @@
 #define VFL_TYPE_RADIO         2
 #define VFL_TYPE_VTX           3
 
+struct v4l2_ioctl_callbacks;
+
 /*
  * Newer version of video_device, handled by videodev2.c
  *     This version moves redundant code from video device code to
@@ -72,225 +74,7 @@ struct video_device
        void (*release)(struct video_device *vfd);
 
        /* ioctl callbacks */
-
-       /* VIDIOC_QUERYCAP handler */
-       int (*vidioc_querycap)(struct file *file, void *fh, struct v4l2_capability *cap);
-
-       /* Priority handling */
-       int (*vidioc_g_priority)   (struct file *file, void *fh,
-                                   enum v4l2_priority *p);
-       int (*vidioc_s_priority)   (struct file *file, void *fh,
-                                   enum v4l2_priority p);
-
-       /* VIDIOC_ENUM_FMT handlers */
-       int (*vidioc_enum_fmt_vid_cap)     (struct file *file, void *fh,
-                                           struct v4l2_fmtdesc *f);
-       int (*vidioc_enum_fmt_vid_overlay) (struct file *file, void *fh,
-                                           struct v4l2_fmtdesc *f);
-       int (*vidioc_enum_fmt_vid_out)     (struct file *file, void *fh,
-                                           struct v4l2_fmtdesc *f);
-#if 1
-       /* deprecated, will be removed in 2.6.28 */
-       int (*vidioc_enum_fmt_vbi_cap)     (struct file *file, void *fh,
-                                           struct v4l2_fmtdesc *f);
-#endif
-       int (*vidioc_enum_fmt_type_private)(struct file *file, void *fh,
-                                           struct v4l2_fmtdesc *f);
-
-       /* VIDIOC_G_FMT handlers */
-       int (*vidioc_g_fmt_vid_cap)    (struct file *file, void *fh,
-                                       struct v4l2_format *f);
-       int (*vidioc_g_fmt_vid_overlay)(struct file *file, void *fh,
-                                       struct v4l2_format *f);
-       int (*vidioc_g_fmt_vid_out)    (struct file *file, void *fh,
-                                       struct v4l2_format *f);
-       int (*vidioc_g_fmt_vid_out_overlay)(struct file *file, void *fh,
-                                       struct v4l2_format *f);
-       int (*vidioc_g_fmt_vbi_cap)    (struct file *file, void *fh,
-                                       struct v4l2_format *f);
-       int (*vidioc_g_fmt_vbi_out)    (struct file *file, void *fh,
-                                       struct v4l2_format *f);
-       int (*vidioc_g_fmt_sliced_vbi_cap)(struct file *file, void *fh,
-                                       struct v4l2_format *f);
-       int (*vidioc_g_fmt_sliced_vbi_out)(struct file *file, void *fh,
-                                       struct v4l2_format *f);
-       int (*vidioc_g_fmt_type_private)(struct file *file, void *fh,
-                                       struct v4l2_format *f);
-
-       /* VIDIOC_S_FMT handlers */
-       int (*vidioc_s_fmt_vid_cap)    (struct file *file, void *fh,
-                                       struct v4l2_format *f);
-       int (*vidioc_s_fmt_vid_overlay)(struct file *file, void *fh,
-                                       struct v4l2_format *f);
-       int (*vidioc_s_fmt_vid_out)    (struct file *file, void *fh,
-                                       struct v4l2_format *f);
-       int (*vidioc_s_fmt_vid_out_overlay)(struct file *file, void *fh,
-                                       struct v4l2_format *f);
-       int (*vidioc_s_fmt_vbi_cap)    (struct file *file, void *fh,
-                                       struct v4l2_format *f);
-       int (*vidioc_s_fmt_vbi_out)    (struct file *file, void *fh,
-                                       struct v4l2_format *f);
-       int (*vidioc_s_fmt_sliced_vbi_cap)(struct file *file, void *fh,
-                                       struct v4l2_format *f);
-       int (*vidioc_s_fmt_sliced_vbi_out)(struct file *file, void *fh,
-                                       struct v4l2_format *f);
-       int (*vidioc_s_fmt_type_private)(struct file *file, void *fh,
-                                       struct v4l2_format *f);
-
-       /* VIDIOC_TRY_FMT handlers */
-       int (*vidioc_try_fmt_vid_cap)    (struct file *file, void *fh,
-                                         struct v4l2_format *f);
-       int (*vidioc_try_fmt_vid_overlay)(struct file *file, void *fh,
-                                         struct v4l2_format *f);
-       int (*vidioc_try_fmt_vid_out)    (struct file *file, void *fh,
-                                         struct v4l2_format *f);
-       int (*vidioc_try_fmt_vid_out_overlay)(struct file *file, void *fh,
-                                         struct v4l2_format *f);
-       int (*vidioc_try_fmt_vbi_cap)    (struct file *file, void *fh,
-                                         struct v4l2_format *f);
-       int (*vidioc_try_fmt_vbi_out)    (struct file *file, void *fh,
-                                         struct v4l2_format *f);
-       int (*vidioc_try_fmt_sliced_vbi_cap)(struct file *file, void *fh,
-                                         struct v4l2_format *f);
-       int (*vidioc_try_fmt_sliced_vbi_out)(struct file *file, void *fh,
-                                         struct v4l2_format *f);
-       int (*vidioc_try_fmt_type_private)(struct file *file, void *fh,
-                                         struct v4l2_format *f);
-
-       /* Buffer handlers */
-       int (*vidioc_reqbufs) (struct file *file, void *fh, struct v4l2_requestbuffers *b);
-       int (*vidioc_querybuf)(struct file *file, void *fh, struct v4l2_buffer *b);
-       int (*vidioc_qbuf)    (struct file *file, void *fh, struct v4l2_buffer *b);
-       int (*vidioc_dqbuf)   (struct file *file, void *fh, struct v4l2_buffer *b);
-
-
-       int (*vidioc_overlay) (struct file *file, void *fh, unsigned int i);
-#ifdef CONFIG_VIDEO_V4L1_COMPAT
-                       /* buffer type is struct vidio_mbuf * */
-       int (*vidiocgmbuf)  (struct file *file, void *fh, struct video_mbuf *p);
-#endif
-       int (*vidioc_g_fbuf)   (struct file *file, void *fh,
-                               struct v4l2_framebuffer *a);
-       int (*vidioc_s_fbuf)   (struct file *file, void *fh,
-                               struct v4l2_framebuffer *a);
-
-               /* Stream on/off */
-       int (*vidioc_streamon) (struct file *file, void *fh, enum v4l2_buf_type i);
-       int (*vidioc_streamoff)(struct file *file, void *fh, enum v4l2_buf_type i);
-
-               /* Standard handling
-                       ENUMSTD is handled by videodev.c
-                */
-       int (*vidioc_g_std) (struct file *file, void *fh, v4l2_std_id *norm);
-       int (*vidioc_s_std) (struct file *file, void *fh, v4l2_std_id *norm);
-       int (*vidioc_querystd) (struct file *file, void *fh, v4l2_std_id *a);
-
-               /* Input handling */
-       int (*vidioc_enum_input)(struct file *file, void *fh,
-                                struct v4l2_input *inp);
-       int (*vidioc_g_input)   (struct file *file, void *fh, unsigned int *i);
-       int (*vidioc_s_input)   (struct file *file, void *fh, unsigned int i);
-
-               /* Output handling */
-       int (*vidioc_enum_output) (struct file *file, void *fh,
-                                 struct v4l2_output *a);
-       int (*vidioc_g_output)   (struct file *file, void *fh, unsigned int *i);
-       int (*vidioc_s_output)   (struct file *file, void *fh, unsigned int i);
-
-               /* Control handling */
-       int (*vidioc_queryctrl)        (struct file *file, void *fh,
-                                       struct v4l2_queryctrl *a);
-       int (*vidioc_g_ctrl)           (struct file *file, void *fh,
-                                       struct v4l2_control *a);
-       int (*vidioc_s_ctrl)           (struct file *file, void *fh,
-                                       struct v4l2_control *a);
-       int (*vidioc_g_ext_ctrls)      (struct file *file, void *fh,
-                                       struct v4l2_ext_controls *a);
-       int (*vidioc_s_ext_ctrls)      (struct file *file, void *fh,
-                                       struct v4l2_ext_controls *a);
-       int (*vidioc_try_ext_ctrls)    (struct file *file, void *fh,
-                                       struct v4l2_ext_controls *a);
-       int (*vidioc_querymenu)        (struct file *file, void *fh,
-                                       struct v4l2_querymenu *a);
-
-       /* Audio ioctls */
-       int (*vidioc_enumaudio)        (struct file *file, void *fh,
-                                       struct v4l2_audio *a);
-       int (*vidioc_g_audio)          (struct file *file, void *fh,
-                                       struct v4l2_audio *a);
-       int (*vidioc_s_audio)          (struct file *file, void *fh,
-                                       struct v4l2_audio *a);
-
-       /* Audio out ioctls */
-       int (*vidioc_enumaudout)       (struct file *file, void *fh,
-                                       struct v4l2_audioout *a);
-       int (*vidioc_g_audout)         (struct file *file, void *fh,
-                                       struct v4l2_audioout *a);
-       int (*vidioc_s_audout)         (struct file *file, void *fh,
-                                       struct v4l2_audioout *a);
-       int (*vidioc_g_modulator)      (struct file *file, void *fh,
-                                       struct v4l2_modulator *a);
-       int (*vidioc_s_modulator)      (struct file *file, void *fh,
-                                       struct v4l2_modulator *a);
-       /* Crop ioctls */
-       int (*vidioc_cropcap)          (struct file *file, void *fh,
-                                       struct v4l2_cropcap *a);
-       int (*vidioc_g_crop)           (struct file *file, void *fh,
-                                       struct v4l2_crop *a);
-       int (*vidioc_s_crop)           (struct file *file, void *fh,
-                                       struct v4l2_crop *a);
-       /* Compression ioctls */
-       int (*vidioc_g_jpegcomp)       (struct file *file, void *fh,
-                                       struct v4l2_jpegcompression *a);
-       int (*vidioc_s_jpegcomp)       (struct file *file, void *fh,
-                                       struct v4l2_jpegcompression *a);
-       int (*vidioc_g_enc_index)      (struct file *file, void *fh,
-                                       struct v4l2_enc_idx *a);
-       int (*vidioc_encoder_cmd)      (struct file *file, void *fh,
-                                       struct v4l2_encoder_cmd *a);
-       int (*vidioc_try_encoder_cmd)  (struct file *file, void *fh,
-                                       struct v4l2_encoder_cmd *a);
-
-       /* Stream type-dependent parameter ioctls */
-       int (*vidioc_g_parm)           (struct file *file, void *fh,
-                                       struct v4l2_streamparm *a);
-       int (*vidioc_s_parm)           (struct file *file, void *fh,
-                                       struct v4l2_streamparm *a);
-
-       /* Tuner ioctls */
-       int (*vidioc_g_tuner)          (struct file *file, void *fh,
-                                       struct v4l2_tuner *a);
-       int (*vidioc_s_tuner)          (struct file *file, void *fh,
-                                       struct v4l2_tuner *a);
-       int (*vidioc_g_frequency)      (struct file *file, void *fh,
-                                       struct v4l2_frequency *a);
-       int (*vidioc_s_frequency)      (struct file *file, void *fh,
-                                       struct v4l2_frequency *a);
-
-       /* Sliced VBI cap */
-       int (*vidioc_g_sliced_vbi_cap) (struct file *file, void *fh,
-                                       struct v4l2_sliced_vbi_cap *a);
-
-       /* Log status ioctl */
-       int (*vidioc_log_status)       (struct file *file, void *fh);
-
-       int (*vidioc_s_hw_freq_seek)   (struct file *file, void *fh,
-                                       struct v4l2_hw_freq_seek *a);
-
-       /* Debugging ioctls */
-#ifdef CONFIG_VIDEO_ADV_DEBUG
-       int (*vidioc_g_register)       (struct file *file, void *fh,
-                                       struct v4l2_register *reg);
-       int (*vidioc_s_register)       (struct file *file, void *fh,
-                                       struct v4l2_register *reg);
-#endif
-       int (*vidioc_g_chip_ident)     (struct file *file, void *fh,
-                                       struct v4l2_chip_ident *chip);
-
-       /* For other private ioctls */
-       int (*vidioc_default)          (struct file *file, void *fh,
-                                       int cmd, void *arg);
-
+       const struct v4l2_ioctl_ops *ioctl_ops;
 
 #ifdef OBSOLETE_OWNER /* to be removed soon */
 /* obsolete -- fops->owner is used instead */
index e319d1f..dc64046 100644 (file)
 #include <linux/videodev2.h>
 #endif
 
+struct v4l2_ioctl_ops {
+       /* ioctl callbacks */
+
+       /* VIDIOC_QUERYCAP handler */
+       int (*vidioc_querycap)(struct file *file, void *fh, struct v4l2_capability *cap);
+
+       /* Priority handling */
+       int (*vidioc_g_priority)   (struct file *file, void *fh,
+                                   enum v4l2_priority *p);
+       int (*vidioc_s_priority)   (struct file *file, void *fh,
+                                   enum v4l2_priority p);
+
+       /* VIDIOC_ENUM_FMT handlers */
+       int (*vidioc_enum_fmt_vid_cap)     (struct file *file, void *fh,
+                                           struct v4l2_fmtdesc *f);
+       int (*vidioc_enum_fmt_vid_overlay) (struct file *file, void *fh,
+                                           struct v4l2_fmtdesc *f);
+       int (*vidioc_enum_fmt_vid_out)     (struct file *file, void *fh,
+                                           struct v4l2_fmtdesc *f);
+#if 1
+       /* deprecated, will be removed in 2.6.28 */
+       int (*vidioc_enum_fmt_vbi_cap)     (struct file *file, void *fh,
+                                           struct v4l2_fmtdesc *f);
+#endif
+       int (*vidioc_enum_fmt_type_private)(struct file *file, void *fh,
+                                           struct v4l2_fmtdesc *f);
+
+       /* VIDIOC_G_FMT handlers */
+       int (*vidioc_g_fmt_vid_cap)    (struct file *file, void *fh,
+                                       struct v4l2_format *f);
+       int (*vidioc_g_fmt_vid_overlay)(struct file *file, void *fh,
+                                       struct v4l2_format *f);
+       int (*vidioc_g_fmt_vid_out)    (struct file *file, void *fh,
+                                       struct v4l2_format *f);
+       int (*vidioc_g_fmt_vid_out_overlay)(struct file *file, void *fh,
+                                       struct v4l2_format *f);
+       int (*vidioc_g_fmt_vbi_cap)    (struct file *file, void *fh,
+                                       struct v4l2_format *f);
+       int (*vidioc_g_fmt_vbi_out)    (struct file *file, void *fh,
+                                       struct v4l2_format *f);
+       int (*vidioc_g_fmt_sliced_vbi_cap)(struct file *file, void *fh,
+                                       struct v4l2_format *f);
+       int (*vidioc_g_fmt_sliced_vbi_out)(struct file *file, void *fh,
+                                       struct v4l2_format *f);
+       int (*vidioc_g_fmt_type_private)(struct file *file, void *fh,
+                                       struct v4l2_format *f);
+
+       /* VIDIOC_S_FMT handlers */
+       int (*vidioc_s_fmt_vid_cap)    (struct file *file, void *fh,
+                                       struct v4l2_format *f);
+       int (*vidioc_s_fmt_vid_overlay)(struct file *file, void *fh,
+                                       struct v4l2_format *f);
+       int (*vidioc_s_fmt_vid_out)    (struct file *file, void *fh,
+                                       struct v4l2_format *f);
+       int (*vidioc_s_fmt_vid_out_overlay)(struct file *file, void *fh,
+                                       struct v4l2_format *f);
+       int (*vidioc_s_fmt_vbi_cap)    (struct file *file, void *fh,
+                                       struct v4l2_format *f);
+       int (*vidioc_s_fmt_vbi_out)    (struct file *file, void *fh,
+                                       struct v4l2_format *f);
+       int (*vidioc_s_fmt_sliced_vbi_cap)(struct file *file, void *fh,
+                                       struct v4l2_format *f);
+       int (*vidioc_s_fmt_sliced_vbi_out)(struct file *file, void *fh,
+                                       struct v4l2_format *f);
+       int (*vidioc_s_fmt_type_private)(struct file *file, void *fh,
+                                       struct v4l2_format *f);
+
+       /* VIDIOC_TRY_FMT handlers */
+       int (*vidioc_try_fmt_vid_cap)    (struct file *file, void *fh,
+                                         struct v4l2_format *f);
+       int (*vidioc_try_fmt_vid_overlay)(struct file *file, void *fh,
+                                         struct v4l2_format *f);
+       int (*vidioc_try_fmt_vid_out)    (struct file *file, void *fh,
+                                         struct v4l2_format *f);
+       int (*vidioc_try_fmt_vid_out_overlay)(struct file *file, void *fh,
+                                         struct v4l2_format *f);
+       int (*vidioc_try_fmt_vbi_cap)    (struct file *file, void *fh,
+                                         struct v4l2_format *f);
+       int (*vidioc_try_fmt_vbi_out)    (struct file *file, void *fh,
+                                         struct v4l2_format *f);
+       int (*vidioc_try_fmt_sliced_vbi_cap)(struct file *file, void *fh,
+                                         struct v4l2_format *f);
+       int (*vidioc_try_fmt_sliced_vbi_out)(struct file *file, void *fh,
+                                         struct v4l2_format *f);
+       int (*vidioc_try_fmt_type_private)(struct file *file, void *fh,
+                                         struct v4l2_format *f);
+
+       /* Buffer handlers */
+       int (*vidioc_reqbufs) (struct file *file, void *fh, struct v4l2_requestbuffers *b);
+       int (*vidioc_querybuf)(struct file *file, void *fh, struct v4l2_buffer *b);
+       int (*vidioc_qbuf)    (struct file *file, void *fh, struct v4l2_buffer *b);
+       int (*vidioc_dqbuf)   (struct file *file, void *fh, struct v4l2_buffer *b);
+
+
+       int (*vidioc_overlay) (struct file *file, void *fh, unsigned int i);
+#ifdef CONFIG_VIDEO_V4L1_COMPAT
+                       /* buffer type is struct vidio_mbuf * */
+       int (*vidiocgmbuf)  (struct file *file, void *fh, struct video_mbuf *p);
+#endif
+       int (*vidioc_g_fbuf)   (struct file *file, void *fh,
+                               struct v4l2_framebuffer *a);
+       int (*vidioc_s_fbuf)   (struct file *file, void *fh,
+                               struct v4l2_framebuffer *a);
+
+               /* Stream on/off */
+       int (*vidioc_streamon) (struct file *file, void *fh, enum v4l2_buf_type i);
+       int (*vidioc_streamoff)(struct file *file, void *fh, enum v4l2_buf_type i);
+
+               /* Standard handling
+                       ENUMSTD is handled by videodev.c
+                */
+       int (*vidioc_g_std) (struct file *file, void *fh, v4l2_std_id *norm);
+       int (*vidioc_s_std) (struct file *file, void *fh, v4l2_std_id *norm);
+       int (*vidioc_querystd) (struct file *file, void *fh, v4l2_std_id *a);
+
+               /* Input handling */
+       int (*vidioc_enum_input)(struct file *file, void *fh,
+                                struct v4l2_input *inp);
+       int (*vidioc_g_input)   (struct file *file, void *fh, unsigned int *i);
+       int (*vidioc_s_input)   (struct file *file, void *fh, unsigned int i);
+
+               /* Output handling */
+       int (*vidioc_enum_output) (struct file *file, void *fh,
+                                 struct v4l2_output *a);
+       int (*vidioc_g_output)   (struct file *file, void *fh, unsigned int *i);
+       int (*vidioc_s_output)   (struct file *file, void *fh, unsigned int i);
+
+               /* Control handling */
+       int (*vidioc_queryctrl)        (struct file *file, void *fh,
+                                       struct v4l2_queryctrl *a);
+       int (*vidioc_g_ctrl)           (struct file *file, void *fh,
+                                       struct v4l2_control *a);
+       int (*vidioc_s_ctrl)           (struct file *file, void *fh,
+                                       struct v4l2_control *a);
+       int (*vidioc_g_ext_ctrls)      (struct file *file, void *fh,
+                                       struct v4l2_ext_controls *a);
+       int (*vidioc_s_ext_ctrls)      (struct file *file, void *fh,
+                                       struct v4l2_ext_controls *a);
+       int (*vidioc_try_ext_ctrls)    (struct file *file, void *fh,
+                                       struct v4l2_ext_controls *a);
+       int (*vidioc_querymenu)        (struct file *file, void *fh,
+                                       struct v4l2_querymenu *a);
+
+       /* Audio ioctls */
+       int (*vidioc_enumaudio)        (struct file *file, void *fh,
+                                       struct v4l2_audio *a);
+       int (*vidioc_g_audio)          (struct file *file, void *fh,
+                                       struct v4l2_audio *a);
+       int (*vidioc_s_audio)          (struct file *file, void *fh,
+                                       struct v4l2_audio *a);
+
+       /* Audio out ioctls */
+       int (*vidioc_enumaudout)       (struct file *file, void *fh,
+                                       struct v4l2_audioout *a);
+       int (*vidioc_g_audout)         (struct file *file, void *fh,
+                                       struct v4l2_audioout *a);
+       int (*vidioc_s_audout)         (struct file *file, void *fh,
+                                       struct v4l2_audioout *a);
+       int (*vidioc_g_modulator)      (struct file *file, void *fh,
+                                       struct v4l2_modulator *a);
+       int (*vidioc_s_modulator)      (struct file *file, void *fh,
+                                       struct v4l2_modulator *a);
+       /* Crop ioctls */
+       int (*vidioc_cropcap)          (struct file *file, void *fh,
+                                       struct v4l2_cropcap *a);
+       int (*vidioc_g_crop)           (struct file *file, void *fh,
+                                       struct v4l2_crop *a);
+       int (*vidioc_s_crop)           (struct file *file, void *fh,
+                                       struct v4l2_crop *a);
+       /* Compression ioctls */
+       int (*vidioc_g_jpegcomp)       (struct file *file, void *fh,
+                                       struct v4l2_jpegcompression *a);
+       int (*vidioc_s_jpegcomp)       (struct file *file, void *fh,
+                                       struct v4l2_jpegcompression *a);
+       int (*vidioc_g_enc_index)      (struct file *file, void *fh,
+                                       struct v4l2_enc_idx *a);
+       int (*vidioc_encoder_cmd)      (struct file *file, void *fh,
+                                       struct v4l2_encoder_cmd *a);
+       int (*vidioc_try_encoder_cmd)  (struct file *file, void *fh,
+                                       struct v4l2_encoder_cmd *a);
+
+       /* Stream type-dependent parameter ioctls */
+       int (*vidioc_g_parm)           (struct file *file, void *fh,
+                                       struct v4l2_streamparm *a);
+       int (*vidioc_s_parm)           (struct file *file, void *fh,
+                                       struct v4l2_streamparm *a);
+
+       /* Tuner ioctls */
+       int (*vidioc_g_tuner)          (struct file *file, void *fh,
+                                       struct v4l2_tuner *a);
+       int (*vidioc_s_tuner)          (struct file *file, void *fh,
+                                       struct v4l2_tuner *a);
+       int (*vidioc_g_frequency)      (struct file *file, void *fh,
+                                       struct v4l2_frequency *a);
+       int (*vidioc_s_frequency)      (struct file *file, void *fh,
+                                       struct v4l2_frequency *a);
+
+       /* Sliced VBI cap */
+       int (*vidioc_g_sliced_vbi_cap) (struct file *file, void *fh,
+                                       struct v4l2_sliced_vbi_cap *a);
+
+       /* Log status ioctl */
+       int (*vidioc_log_status)       (struct file *file, void *fh);
+
+       int (*vidioc_s_hw_freq_seek)   (struct file *file, void *fh,
+                                       struct v4l2_hw_freq_seek *a);
+
+       /* Debugging ioctls */
+#ifdef CONFIG_VIDEO_ADV_DEBUG
+       int (*vidioc_g_register)       (struct file *file, void *fh,
+                                       struct v4l2_register *reg);
+       int (*vidioc_s_register)       (struct file *file, void *fh,
+                                       struct v4l2_register *reg);
+#endif
+       int (*vidioc_g_chip_ident)     (struct file *file, void *fh,
+                                       struct v4l2_chip_ident *chip);
+
+       /* For other private ioctls */
+       int (*vidioc_default)          (struct file *file, void *fh,
+                                       int cmd, void *arg);
+};
+
+
 /* v4l debugging and diagnostics */
 
 /* Debug bitmask flags to be used on V4L2 */