- patches.suse/slab-handle-memoryless-nodes-v2a.patch: Refresh.
[linux-flexiantxendom0-3.2.10.git] / drivers / media / video / cx23885 / cx23885-video.c
index 654cc25..8934d61 100644 (file)
@@ -35,6 +35,7 @@
 #include "cx23885.h"
 #include <media/v4l2-common.h>
 #include <media/v4l2-ioctl.h>
+#include "cx23885-ioctl.h"
 
 MODULE_DESCRIPTION("v4l2 driver module for cx23885 based TV cards");
 MODULE_AUTHOR("Steven Toth <stoth@linuxtv.org>");
@@ -317,11 +318,11 @@ static struct video_device *cx23885_vdev_init(struct cx23885_dev *dev,
        if (NULL == vfd)
                return NULL;
        *vfd = *template;
-       vfd->minor = -1;
        vfd->v4l2_dev = &dev->v4l2_dev;
        vfd->release = video_device_release;
        snprintf(vfd->name, sizeof(vfd->name), "%s %s (%s)",
                 dev->name, type, cx23885_boards[dev->board].name);
+       video_set_drvdata(vfd, dev);
        return vfd;
 }
 
@@ -401,6 +402,13 @@ static int cx23885_video_mux(struct cx23885_dev *dev, unsigned int input)
                INPUT(input)->gpio2, INPUT(input)->gpio3);
        dev->input = input;
 
+       if (dev->board == CX23885_BOARD_MYGICA_X8506 ||
+               dev->board == CX23885_BOARD_MAGICPRO_PROHDTVE2) {
+               /* Select Analog TV */
+               if (INPUT(input)->type == CX23885_VMUX_TELEVISION)
+                       cx23885_gpio_clear(dev, GPIO_0);
+       }
+
        /* Tell the internal A/V decoder */
        v4l2_subdev_call(dev->sd_cx25840, video, s_routing,
                        INPUT(input)->vmux, 0, 0);
@@ -708,46 +716,34 @@ static int get_resource(struct cx23885_fh *fh)
 
 static int video_open(struct file *file)
 {
-       int minor = video_devdata(file)->minor;
-       struct cx23885_dev *h, *dev = NULL;
+       struct video_device *vdev = video_devdata(file);
+       struct cx23885_dev *dev = video_drvdata(file);
        struct cx23885_fh *fh;
-       struct list_head *list;
        enum v4l2_buf_type type = 0;
        int radio = 0;
 
-       lock_kernel();
-       list_for_each(list, &cx23885_devlist) {
-               h = list_entry(list, struct cx23885_dev, devlist);
-               if (h->video_dev &&
-                   h->video_dev->minor == minor) {
-                       dev  = h;
-                       type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-               }
-               if (h->vbi_dev &&
-                   h->vbi_dev->minor == minor) {
-                       dev  = h;
-                       type = V4L2_BUF_TYPE_VBI_CAPTURE;
-               }
-               if (h->radio_dev &&
-                   h->radio_dev->minor == minor) {
-                       radio = 1;
-                       dev   = h;
-               }
-       }
-       if (NULL == dev) {
-               unlock_kernel();
-               return -ENODEV;
+       switch (vdev->vfl_type) {
+       case VFL_TYPE_GRABBER:
+               type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+               break;
+       case VFL_TYPE_VBI:
+               type = V4L2_BUF_TYPE_VBI_CAPTURE;
+               break;
+       case VFL_TYPE_RADIO:
+               radio = 1;
+               break;
        }
 
-       dprintk(1, "open minor=%d radio=%d type=%s\n",
-               minor, radio, v4l2_type_names[type]);
+       dprintk(1, "open dev=%s radio=%d type=%s\n",
+               video_device_node_name(vdev), radio, v4l2_type_names[type]);
 
        /* allocate + initialize per filehandle data */
        fh = kzalloc(sizeof(*fh), GFP_KERNEL);
-       if (NULL == fh) {
-               unlock_kernel();
+       if (NULL == fh)
                return -ENOMEM;
-       }
+
+       lock_kernel();
+
        file->private_data = fh;
        fh->dev      = dev;
        fh->radio    = radio;
@@ -1144,6 +1140,7 @@ static int cx23885_enum_input(struct cx23885_dev *dev, struct v4l2_input *i)
                [CX23885_VMUX_COMPOSITE3] = "Composite3",
                [CX23885_VMUX_COMPOSITE4] = "Composite4",
                [CX23885_VMUX_SVIDEO]     = "S-Video",
+               [CX23885_VMUX_COMPONENT]  = "Component",
                [CX23885_VMUX_TELEVISION] = "Television",
                [CX23885_VMUX_CABLE]      = "Cable TV",
                [CX23885_VMUX_DVB]        = "DVB",
@@ -1312,34 +1309,6 @@ static int vidioc_s_frequency(struct file *file, void *priv,
                cx23885_set_freq(dev, f);
 }
 
-#ifdef CONFIG_VIDEO_ADV_DEBUG
-static int vidioc_g_register(struct file *file, void *fh,
-                               struct v4l2_dbg_register *reg)
-{
-       struct cx23885_dev *dev = ((struct cx23885_fh *)fh)->dev;
-
-       if (!v4l2_chip_match_host(&reg->match))
-               return -EINVAL;
-
-       call_all(dev, core, g_register, reg);
-
-       return 0;
-}
-
-static int vidioc_s_register(struct file *file, void *fh,
-                               struct v4l2_dbg_register *reg)
-{
-       struct cx23885_dev *dev = ((struct cx23885_fh *)fh)->dev;
-
-       if (!v4l2_chip_match_host(&reg->match))
-               return -EINVAL;
-
-       call_all(dev, core, s_register, reg);
-
-       return 0;
-}
-#endif
-
 /* ----------------------------------------------------------- */
 
 static void cx23885_vid_timeout(unsigned long data)
@@ -1449,9 +1418,10 @@ static const struct v4l2_ioctl_ops video_ioctl_ops = {
        .vidioc_s_tuner       = vidioc_s_tuner,
        .vidioc_g_frequency   = vidioc_g_frequency,
        .vidioc_s_frequency   = vidioc_s_frequency,
+       .vidioc_g_chip_ident  = cx23885_g_chip_ident,
 #ifdef CONFIG_VIDEO_ADV_DEBUG
-       .vidioc_g_register    = vidioc_g_register,
-       .vidioc_s_register    = vidioc_s_register,
+       .vidioc_g_register    = cx23885_g_register,
+       .vidioc_s_register    = cx23885_s_register,
 #endif
 };
 
@@ -1459,7 +1429,6 @@ static struct video_device cx23885_vbi_template;
 static struct video_device cx23885_video_template = {
        .name                 = "cx23885-video",
        .fops                 = &video_fops,
-       .minor                = -1,
        .ioctl_ops            = &video_ioctl_ops,
        .tvnorms              = CX23885_NORMS,
        .current_norm         = V4L2_STD_NTSC_M,
@@ -1479,7 +1448,7 @@ void cx23885_video_unregister(struct cx23885_dev *dev)
        cx_clear(PCI_INT_MSK, 1);
 
        if (dev->video_dev) {
-               if (-1 != dev->video_dev->minor)
+               if (video_is_registered(dev->video_dev))
                        video_unregister_device(dev->video_dev);
                else
                        video_device_release(dev->video_dev);
@@ -1529,9 +1498,11 @@ int cx23885_video_register(struct cx23885_dev *dev)
                if (sd) {
                        struct tuner_setup tun_setup;
 
+                       memset(&tun_setup, 0, sizeof(tun_setup));
                        tun_setup.mode_mask = T_ANALOG_TV;
                        tun_setup.type = dev->tuner_type;
                        tun_setup.addr = v4l2_i2c_subdev_addr(sd);
+                       tun_setup.tuner_callback = cx23885_tuner_callback;
 
                        v4l2_subdev_call(sd, tuner, s_type_addr, &tun_setup);
                }
@@ -1548,8 +1519,8 @@ int cx23885_video_register(struct cx23885_dev *dev)
                        dev->name);
                goto fail_unreg;
        }
-       printk(KERN_INFO "%s/0: registered device video%d [v4l2]\n",
-              dev->name, dev->video_dev->num);
+       printk(KERN_INFO "%s/0: registered device %s [v4l2]\n",
+              dev->name, video_device_node_name(dev->video_dev));
        /* initial device configuration */
        mutex_lock(&dev->lock);
        cx23885_set_tvnorm(dev, dev->tvnorm);