]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/ide/setup-pci.c
ide: add ide_pci_remove() helper
[karo-tx-linux.git] / drivers / ide / setup-pci.c
index ca17bf8896df19e02736ddbb81a6da602dc60cde..20f0ee004695cc4dc22c3287bdb2ca1d860be584 100644 (file)
@@ -548,8 +548,7 @@ int ide_pci_init_one(struct pci_dev *dev, const struct ide_port_info *d,
 
        host->host_priv = priv;
 
-       if (priv)
-               pci_set_drvdata(dev, host);
+       pci_set_drvdata(dev, host);
 
        ret = do_ide_setup_pci_device(dev, d, 1);
        if (ret < 0)
@@ -593,10 +592,8 @@ int ide_pci_init_two(struct pci_dev *dev1, struct pci_dev *dev2,
 
        host->host_priv = priv;
 
-       if (priv) {
-               pci_set_drvdata(pdev[0], host);
-               pci_set_drvdata(pdev[1], host);
-       }
+       pci_set_drvdata(pdev[0], host);
+       pci_set_drvdata(pdev[1], host);
 
        for (i = 0; i < 2; i++) {
                ret = do_ide_setup_pci_device(pdev[i], d, !i);
@@ -619,3 +616,33 @@ out:
        return ret;
 }
 EXPORT_SYMBOL_GPL(ide_pci_init_two);
+
+void ide_pci_remove(struct pci_dev *dev)
+{
+       struct ide_host *host = pci_get_drvdata(dev);
+       struct pci_dev *dev2 = host->dev[1] ? to_pci_dev(host->dev[1]) : NULL;
+       int bars;
+
+       if (host->host_flags & IDE_HFLAG_SINGLE)
+               bars = (1 << 2) - 1;
+       else
+               bars = (1 << 4) - 1;
+
+       if ((host->host_flags & IDE_HFLAG_NO_DMA) == 0) {
+               if (host->host_flags & IDE_HFLAG_CS5520)
+                       bars |= (1 << 2);
+               else
+                       bars |= (1 << 4);
+       }
+
+       ide_host_remove(host);
+
+       if (dev2)
+               pci_release_selected_regions(dev2, bars);
+       pci_release_selected_regions(dev, bars);
+
+       if (dev2)
+               pci_disable_device(dev2);
+       pci_disable_device(dev);
+}
+EXPORT_SYMBOL_GPL(ide_pci_remove);