staging: cx25821: call disable_pci_device() if pci_probe() failed
authorKulikov Vasiliy <segooon@gmail.com>
Fri, 6 Aug 2010 19:52:57 +0000 (23:52 +0400)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 31 Aug 2010 21:48:10 +0000 (14:48 -0700)
Driver should call disable_pci_device() if it returns from pci_probe()
with error. Also it must not be called if pci_request_region() fails as
it means that somebody uses device resources and rules the device.

Signed-off-by: Kulikov Vasiliy <segooon@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/cx25821/cx25821-core.c

index c487c19256b94af7710db77d41ff9f5d850fa9f2..ad7ce013ba50cba5e8fc81f96849408977c5d90b 100644 (file)
@@ -962,7 +962,7 @@ static int cx25821_dev_setup(struct cx25821_dev *dev)
                       dev->pci->subsystem_device);
 
                cx25821_devcount--;
-               return -ENODEV;
+               return -EBUSY;
        }
 
        /* PCIe stuff */
@@ -1412,9 +1412,12 @@ static int __devinit cx25821_initdev(struct pci_dev *pci_dev,
 
        printk(KERN_INFO "cx25821 Athena pci enable !\n");
 
-       if (cx25821_dev_setup(dev) < 0) {
-               err = -EINVAL;
-               goto fail_unregister_device;
+       err = cx25821_dev_setup(dev);
+       if (err) {
+               if (err == -EBUSY)
+                       goto fail_unregister_device;
+               else
+                       goto fail_unregister_pci;
        }
 
        /* print pci info */
@@ -1448,6 +1451,8 @@ fail_irq:
        printk(KERN_INFO "cx25821 cx25821_initdev() can't get IRQ !\n");
        cx25821_dev_unregister(dev);
 
+fail_unregister_pci:
+       pci_disable_device(pci_dev);
 fail_unregister_device:
        v4l2_device_unregister(&dev->v4l2_dev);