V4L/DVB (10502): saa7146: move v4l2 device registration to saa7146_vv.

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>
diff --git a/drivers/media/common/saa7146_core.c b/drivers/media/common/saa7146_core.c
index a123844..982f000 100644
--- a/drivers/media/common/saa7146_core.c
+++ b/drivers/media/common/saa7146_core.c
@@ -363,16 +363,13 @@
 		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 @@
 		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 @@
 	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 @@
 	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);
diff --git a/drivers/media/common/saa7146_fops.c b/drivers/media/common/saa7146_fops.c
index fec799d..620f655 100644
--- a/drivers/media/common/saa7146_fops.c
+++ b/drivers/media/common/saa7146_fops.c
@@ -446,11 +446,17 @@
 
 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 @@
 
 	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;