Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / pci / hotplug / cpcihp_zt5550.c
index e992802..f7cb00d 100644 (file)
@@ -36,6 +36,7 @@
 #include <linux/init.h>
 #include <linux/errno.h>
 #include <linux/pci.h>
+#include <linux/signal.h>      /* SA_SHIRQ */
 #include "cpci_hotplug.h"
 #include "cpcihp_zt5550.h"
 
@@ -78,11 +79,20 @@ static void __iomem *csr_int_mask;
 
 static int zt5550_hc_config(struct pci_dev *pdev)
 {
+       int ret;
+
        /* Since we know that no boards exist with two HC chips, treat it as an error */
        if(hc_dev) {
                err("too many host controller devices?");
                return -EBUSY;
        }
+
+       ret = pci_enable_device(pdev);
+       if(ret) {
+               err("cannot enable %s\n", pci_name(pdev));
+               return ret;
+       }
+
        hc_dev = pdev;
        dbg("hc_dev = %p", hc_dev);
        dbg("pci resource start %lx", pci_resource_start(hc_dev, 1));
@@ -91,7 +101,8 @@ static int zt5550_hc_config(struct pci_dev *pdev)
        if(!request_mem_region(pci_resource_start(hc_dev, 1),
                                pci_resource_len(hc_dev, 1), MY_NAME)) {
                err("cannot reserve MMIO region");
-               return -ENOMEM;
+               ret = -ENOMEM;
+               goto exit_disable_device;
        }
 
        hc_registers =
@@ -99,9 +110,8 @@ static int zt5550_hc_config(struct pci_dev *pdev)
        if(!hc_registers) {
                err("cannot remap MMIO region %lx @ %lx",
                    pci_resource_len(hc_dev, 1), pci_resource_start(hc_dev, 1));
-               release_mem_region(pci_resource_start(hc_dev, 1),
-                                  pci_resource_len(hc_dev, 1));
-               return -ENODEV;
+               ret = -ENODEV;
+               goto exit_release_region;
        }
 
        csr_hc_index = hc_registers + CSR_HCINDEX;
@@ -124,6 +134,13 @@ static int zt5550_hc_config(struct pci_dev *pdev)
        writeb((u8) ALL_DIRECT_INTS_MASK, csr_int_mask);
        dbg("disabled timer0, timer1 and ENUM interrupts");
        return 0;
+
+exit_release_region:
+       release_mem_region(pci_resource_start(hc_dev, 1),
+                          pci_resource_len(hc_dev, 1));
+exit_disable_device:
+       pci_disable_device(hc_dev);
+       return ret;
 }
 
 static int zt5550_hc_cleanup(void)
@@ -134,6 +151,7 @@ static int zt5550_hc_cleanup(void)
        iounmap(hc_registers);
        release_mem_region(pci_resource_start(hc_dev, 1),
                           pci_resource_len(hc_dev, 1));
+       pci_disable_device(hc_dev);
        return 0;
 }