V4L/DVB (4707): 4linux: complete conversion to hotplug safe PCI API
authorAlan Cox <alan@lxorguk.ukuu.org.uk>
Tue, 3 Oct 2006 23:44:12 +0000 (20:44 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Wed, 4 Oct 2006 11:06:50 +0000 (08:06 -0300)
Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/video/zoran_card.c
drivers/media/video/zr36120.c

index 9f21d0ba0f0f721df3d44cad9d8b8566288964cd..653822ce391c574492f5c78c677ad7414edcd696 100644 (file)
@@ -1278,9 +1278,7 @@ find_zr36057 (void)
 
        zoran_num = 0;
        while (zoran_num < BUZ_MAX &&
-              (dev =
-               pci_find_device(PCI_VENDOR_ID_ZORAN,
-                               PCI_DEVICE_ID_ZORAN_36057, dev)) != NULL) {
+              (dev = pci_get_device(PCI_VENDOR_ID_ZORAN, PCI_DEVICE_ID_ZORAN_36057, dev)) != NULL) {
                card_num = card[zoran_num];
                zr = &zoran[zoran_num];
                memset(zr, 0, sizeof(struct zoran));    // Just in case if previous cycle failed
@@ -1541,7 +1539,8 @@ find_zr36057 (void)
                                goto zr_detach_vfe;
                        }
                }
-
+               /* Success so keep the pci_dev referenced */
+               pci_dev_get(zr->pci_dev);
                zoran_num++;
                continue;
 
@@ -1563,6 +1562,9 @@ find_zr36057 (void)
                iounmap(zr->zr36057_mem);
                continue;
        }
+       if (dev)        /* Clean up ref count on early exit */
+               pci_dev_put(dev);
+
        if (zoran_num == 0) {
                dprintk(1, KERN_INFO "No known MJPEG cards found.\n");
        }
index 9240638a01342bca3ad81d7b463dc906b30764cd..b5ffe53c40d8ee275a66de704bd4f9dcddf2a5ed 100644 (file)
@@ -1840,16 +1840,16 @@ int __init find_zoran(void)
        struct zoran *ztv;
        struct pci_dev *dev = NULL;
        unsigned char revision;
-       int zoran_num=0;
+       int zoran_num = 0;
 
-       while ((dev = pci_find_device(PCI_VENDOR_ID_ZORAN,PCI_DEVICE_ID_ZORAN_36120, dev)))
+       while ((dev = pci_get_device(PCI_VENDOR_ID_ZORAN,PCI_DEVICE_ID_ZORAN_36120, dev)))
        {
                /* Ok, a ZR36120/ZR36125 found! */
                ztv = &zorans[zoran_num];
                ztv->dev = dev;
 
                if (pci_enable_device(dev))
-                       return -EIO;
+                       continue;
 
                pci_read_config_byte(dev, PCI_CLASS_REVISION, &revision);
                printk(KERN_INFO "zoran: Zoran %x (rev %d) ",
@@ -1867,17 +1867,18 @@ int __init find_zoran(void)
                {
                        iounmap(ztv->zoran_mem);
                        printk(KERN_ERR "zoran: Bad irq number or handler\n");
-                       return -EINVAL;
+                       continue;
                }
                if (result==-EBUSY)
                        printk(KERN_ERR "zoran: IRQ %d busy, change your PnP config in BIOS\n",dev->irq);
                if (result < 0) {
                        iounmap(ztv->zoran_mem);
-                       return result;
+                       continue;
                }
                /* Enable bus-mastering */
                pci_set_master(dev);
-
+               /* Keep a reference */
+               pci_dev_get(dev);
                zoran_num++;
        }
        if(zoran_num)
@@ -2041,6 +2042,9 @@ void release_zoran(int max)
                if (ztv->zoran_mem)
                        iounmap(ztv->zoran_mem);
 
+               /* Drop PCI device */
+               pci_dev_put(ztv->dev);
+
                video_unregister_device(&ztv->video_dev);
                video_unregister_device(&ztv->vbi_dev);
        }
@@ -2057,13 +2061,12 @@ int __init zr36120_init(void)
 
        handle_chipset();
        zoran_cards = find_zoran();
-       if (zoran_cards<0)
-               /* no cards found, no need for a driver */
+       if (zoran_cards <= 0)
                return -EIO;
 
        /* initialize Zorans */
        for (card=0; card<zoran_cards; card++) {
-               if (init_zoran(card)<0) {
+               if (init_zoran(card) < 0) {
                        /* only release the zorans we have registered */
                        release_zoran(card);
                        return -EIO;