]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/ide/setup-pci.c
ide: use I/O ops directly in ide-dma.c
[linux-2.6-omap-h63xx.git] / drivers / ide / setup-pci.c
index abcfb1739d4d3a2089d580a1f7ffe5583ed3ff6a..acb467c6f3459b678a0549b1b6921bdb9652e078 100644 (file)
@@ -6,19 +6,15 @@
  *  May be copied or modified under the terms of the GNU General Public License
  */
 
-#include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <linux/pci.h>
 #include <linux/init.h>
-#include <linux/timer.h>
-#include <linux/mm.h>
 #include <linux/interrupt.h>
 #include <linux/ide.h>
 #include <linux/dma-mapping.h>
 
 #include <asm/io.h>
-#include <asm/irq.h>
 
 /**
  *     ide_setup_pci_baseregs  -       place a PCI IDE controller native
@@ -293,6 +289,7 @@ static int ide_pci_check_iomem(struct pci_dev *dev, const struct ide_port_info *
  *     @d: IDE port info
  *     @port: port number
  *     @irq: PCI IRQ
+ *     @hw: hw_regs_t instance corresponding to this port
  *
  *     Perform the initial set up for the hardware interface structure. This
  *     is done per interface port rather than per PCI device. There may be
@@ -303,11 +300,11 @@ static int ide_pci_check_iomem(struct pci_dev *dev, const struct ide_port_info *
 
 static ide_hwif_t *ide_hwif_configure(struct pci_dev *dev,
                                      const struct ide_port_info *d,
-                                     unsigned int port, int irq)
+                                     unsigned int port, int irq,
+                                     hw_regs_t *hw)
 {
        unsigned long ctl = 0, base = 0;
        ide_hwif_t *hwif;
-       struct hw_regs_s hw;
 
        if ((d->host_flags & IDE_HFLAG_ISA_PORTS) == 0) {
                if (ide_pci_check_iomem(dev, d, 2 * port) ||
@@ -319,34 +316,29 @@ static ide_hwif_t *ide_hwif_configure(struct pci_dev *dev,
 
                ctl  = pci_resource_start(dev, 2*port+1);
                base = pci_resource_start(dev, 2*port);
-               if ((ctl && !base) || (base && !ctl)) {
-                       printk(KERN_ERR "%s: inconsistent baseregs (BIOS) "
-                               "for port %d, skipping\n", d->name, port);
-                       return NULL;
-               }
-       }
-       if (!ctl) {
+       } else {
                /* Use default values */
                ctl = port ? 0x374 : 0x3f4;
                base = port ? 0x170 : 0x1f0;
        }
 
-       hwif = ide_find_port_slot(d);
-       if (hwif == NULL) {
-               printk(KERN_ERR "%s: too many IDE interfaces, no room in "
-                               "table\n", d->name);
+       if (!base || !ctl) {
+               printk(KERN_ERR "%s: bad PCI BARs for port %d, skipping\n",
+                               d->name, port);
                return NULL;
        }
 
-       memset(&hw, 0, sizeof(hw));
-       hw.irq = irq;
-       hw.dev = &dev->dev;
-       hw.chipset = d->chipset ? d->chipset : ide_pci;
-       ide_std_init_ports(&hw, base, ctl | 2);
+       memset(hw, 0, sizeof(*hw));
+       hw->irq = irq;
+       hw->dev = &dev->dev;
+       hw->chipset = d->chipset ? d->chipset : ide_pci;
+       ide_std_init_ports(hw, base, ctl | 2);
 
-       ide_init_port_hw(hwif, &hw);
+       hwif = ide_find_port_slot(d);
+       if (hwif == NULL)
+               return NULL;
 
-       hwif->dev = &dev->dev;
+       hwif->chipset = hw->chipset;
 
        return hwif;
 }
@@ -439,6 +431,8 @@ out:
  *     @d: IDE port info
  *     @pciirq: IRQ line
  *     @idx: ATA index table to update
+ *     @hw: hw_regs_t instances corresponding to this PCI IDE device
+ *     @hws: hw_regs_t pointers table to update
  *
  *     Scan the interfaces attached to this device and do any
  *     necessary per port setup. Attach the devices and ask the
@@ -449,7 +443,8 @@ out:
  *     where the chipset setup is not the default PCI IDE one.
  */
 
-void ide_pci_setup_ports(struct pci_dev *dev, const struct ide_port_info *d, int pciirq, u8 *idx)
+void ide_pci_setup_ports(struct pci_dev *dev, const struct ide_port_info *d,
+                        int pciirq, u8 *idx, hw_regs_t *hw, hw_regs_t **hws)
 {
        int channels = (d->host_flags & IDE_HFLAG_SINGLE) ? 1 : 2, port;
        ide_hwif_t *hwif;
@@ -468,10 +463,11 @@ void ide_pci_setup_ports(struct pci_dev *dev, const struct ide_port_info *d, int
                        continue;       /* port not enabled */
                }
 
-               hwif = ide_hwif_configure(dev, d, port, pciirq);
+               hwif = ide_hwif_configure(dev, d, port, pciirq, hw + port);
                if (hwif == NULL)
                        continue;
 
+               *(hws + port) = hw + port;
                *(idx + port) = hwif->index;
        }
 }
@@ -489,7 +485,7 @@ EXPORT_SYMBOL_GPL(ide_pci_setup_ports);
  */
 static int do_ide_setup_pci_device(struct pci_dev *dev,
                                   const struct ide_port_info *d,
-                                  u8 *idx, u8 noisy)
+                                  u8 noisy)
 {
        int tried_config = 0;
        int pciirq, ret;
@@ -538,9 +534,7 @@ static int do_ide_setup_pci_device(struct pci_dev *dev,
                                d->name, pciirq);
        }
 
-       /* FIXME: silent failure can happen */
-
-       ide_pci_setup_ports(dev, d, pciirq, idx);
+       ret = pciirq;
 out:
        return ret;
 }
@@ -548,12 +542,17 @@ out:
 int ide_setup_pci_device(struct pci_dev *dev, const struct ide_port_info *d)
 {
        u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
+       hw_regs_t hw[4], *hws[] = { NULL, NULL, NULL, NULL };
        int ret;
 
-       ret = do_ide_setup_pci_device(dev, d, &idx[0], 1);
+       ret = do_ide_setup_pci_device(dev, d, 1);
+
+       if (ret >= 0) {
+               /* FIXME: silent failure can happen */
+               ide_pci_setup_ports(dev, d, ret, &idx[0], &hw[0], &hws[0]);
 
-       if (ret >= 0)
-               ide_device_add(idx, d);
+               ide_device_add(idx, d, hws);
+       }
 
        return ret;
 }
@@ -564,19 +563,25 @@ int ide_setup_pci_devices(struct pci_dev *dev1, struct pci_dev *dev2,
 {
        struct pci_dev *pdev[] = { dev1, dev2 };
        int ret, i;
+       hw_regs_t hw[4], *hws[] = { NULL, NULL, NULL, NULL };
        u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
 
        for (i = 0; i < 2; i++) {
-               ret = do_ide_setup_pci_device(pdev[i], d, &idx[i*2], !i);
+               ret = do_ide_setup_pci_device(pdev[i], d, !i);
+
                /*
                 * FIXME: Mom, mom, they stole me the helper function to undo
                 * do_ide_setup_pci_device() on the first device!
                 */
                if (ret < 0)
                        goto out;
+
+               /* FIXME: silent failure can happen */
+               ide_pci_setup_ports(pdev[i], d, ret, &idx[i*2], &hw[i*2],
+                                   &hws[i*2]);
        }
 
-       ide_device_add(idx, d);
+       ide_device_add(idx, d, hws);
 out:
        return ret;
 }