V4L/DVB (10502): saa7146: move v4l2 device registration to saa7146_vv.
authorHans Verkuil <hverkuil@xs4all.nl>
Sat, 7 Feb 2009 23:42:33 +0000 (20:42 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 30 Mar 2009 15:42:42 +0000 (12:42 -0300)
Doing the v4l2_device registration in the saa7146 core will make it
dependent on v4l2, even for DVB-only boards. This registration and
unregistration belongs in saa7146_vv instead.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/common/saa7146_core.c
drivers/media/common/saa7146_fops.c

index a123844..982f000 100644 (file)
@@ -363,16 +363,13 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent
                ERR(("out of memory.\n"));
                goto out;
        }
-       err = v4l2_device_register(&pci->dev, &dev->v4l2_dev);
-       if (err)
-               goto err_free;
 
        DEB_EE(("pci:%p\n",pci));
 
        err = pci_enable_device(pci);
        if (err < 0) {
                ERR(("pci_enable_device() failed.\n"));
-               goto err_unreg;
+               goto err_free;
        }
 
        /* enable bus-mastering */
@@ -480,6 +477,10 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent
                DEB_D(("ext->attach() failed for %p. skipping device.\n",dev));
                goto err_free_i2c;
        }
+       /* V4L extensions will set the pci drvdata to the v4l2_device in the
+          attach() above. So for those cards that do not use V4L we have to
+          set it explicitly. */
+       pci_set_drvdata(pci, &dev->v4l2_dev);
 
        INIT_LIST_HEAD(&dev->item);
        list_add_tail(&dev->item,&saa7146_devices);
@@ -506,8 +507,6 @@ err_release:
        pci_release_region(pci, 0);
 err_disable:
        pci_disable_device(pci);
-err_unreg:
-       v4l2_device_unregister(&dev->v4l2_dev);
 err_free:
        kfree(dev);
        goto out;
@@ -530,7 +529,8 @@ static void saa7146_remove_one(struct pci_dev *pdev)
        DEB_EE(("dev:%p\n",dev));
 
        dev->ext->detach(dev);
-       v4l2_device_unregister(&dev->v4l2_dev);
+       /* Zero the PCI drvdata after use. */
+       pci_set_drvdata(pdev, NULL);
 
        /* shut down all video dma transfers */
        saa7146_write(dev, MC1, 0x00ff0000);
index fec799d..620f655 100644 (file)
@@ -446,11 +446,17 @@ static void vv_callback(struct saa7146_dev *dev, unsigned long status)
 
 int saa7146_vv_init(struct saa7146_dev* dev, struct saa7146_ext_vv *ext_vv)
 {
-       struct saa7146_vv *vv = kzalloc(sizeof(struct saa7146_vv), GFP_KERNEL);
+       struct saa7146_vv *vv;
+       int err;
+
+       err = v4l2_device_register(&dev->pci->dev, &dev->v4l2_dev);
+       if (err)
+               return err;
 
+       vv = kzalloc(sizeof(struct saa7146_vv), GFP_KERNEL);
        if (vv == NULL) {
                ERR(("out of memory. aborting.\n"));
-               return -1;
+               return -ENOMEM;
        }
        ext_vv->ops = saa7146_video_ioctl_ops;
        ext_vv->core_ops = &saa7146_video_ioctl_ops;
@@ -496,6 +502,7 @@ int saa7146_vv_release(struct saa7146_dev* dev)
 
        DEB_EE(("dev:%p\n",dev));
 
+       v4l2_device_unregister(&dev->v4l2_dev);
        pci_free_consistent(dev->pci, SAA7146_CLIPPING_MEM, vv->d_clipping.cpu_addr, vv->d_clipping.dma_handle);
        kfree(vv);
        dev->vv_data = NULL;