V4L/DVB (10496): saa7146: implement v4l2_device support.
authorHans Verkuil <hverkuil@xs4all.nl>
Sat, 7 Feb 2009 10:23:40 +0000 (07:23 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 30 Mar 2009 15:42:41 +0000 (12:42 -0300)
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/common/saa7146_core.c
include/media/saa7146.h

index d599d360da3fafcbcd26d72c19419683f1f2c4cb..961ad16e1d6f2f3a4e0e8557dddcfaa4bca909bb 100644 (file)
@@ -363,13 +363,16 @@ 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_free;
+               goto err_unreg;
        }
 
        /* enable bus-mastering */
@@ -452,8 +455,6 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent
        INFO(("found saa7146 @ mem %p (revision %d, irq %d) (0x%04x,0x%04x).\n", dev->mem, dev->revision, pci->irq, pci->subsystem_vendor, pci->subsystem_device));
        dev->ext = ext;
 
-       pci_set_drvdata(pci, dev);
-
        mutex_init(&dev->lock);
        spin_lock_init(&dev->int_slock);
        spin_lock_init(&dev->slock);
@@ -477,7 +478,7 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent
 
        if (ext->attach(dev, pci_ext)) {
                DEB_D(("ext->attach() failed for %p. skipping device.\n",dev));
-               goto err_unprobe;
+               goto err_free_i2c;
        }
 
        INIT_LIST_HEAD(&dev->item);
@@ -488,8 +489,6 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent
 out:
        return err;
 
-err_unprobe:
-       pci_set_drvdata(pci, NULL);
 err_free_i2c:
        pci_free_consistent(pci, SAA7146_RPS_MEM, dev->d_i2c.cpu_addr,
                            dev->d_i2c.dma_handle);
@@ -507,6 +506,8 @@ 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;
@@ -514,7 +515,8 @@ err_free:
 
 static void saa7146_remove_one(struct pci_dev *pdev)
 {
-       struct saa7146_dev* dev = pci_get_drvdata(pdev);
+       struct v4l2_device *v4l2_dev = pci_get_drvdata(pdev);
+       struct saa7146_dev *dev = container_of(v4l2_dev, struct saa7146_dev, v4l2_dev);
        struct {
                void *addr;
                dma_addr_t dma;
@@ -528,6 +530,7 @@ 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);
 
        /* shut down all video dma transfers */
        saa7146_write(dev, MC1, 0x00ff0000);
index c5a6e22a4b37d626d90370b3becb212105534478..b9dfeeb26faea30b413f81991cdaace2d99c08a3 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/stringify.h>
 #include <linux/mutex.h>
 #include <linux/scatterlist.h>
+#include <media/v4l2-device.h>
 
 #include <linux/vmalloc.h>     /* for vmalloc() */
 #include <linux/mm.h>          /* for vmalloc_to_page() */
@@ -110,6 +111,8 @@ struct saa7146_dev
 
        struct list_head                item;
 
+       struct v4l2_device              v4l2_dev;
+
        /* different device locks */
        spinlock_t                      slock;
        struct mutex                    lock;