return NULL;
        }
 
+       if (hws[0])
+               host->dev[0] = hws[0]->dev;
+
        return host;
 }
 EXPORT_SYMBOL_GPL(ide_host_alloc_all);
 
                }
        }
 
-       err = ide_setup_pci_device(dev, &d);
+       err = ide_pci_init_one(dev, &d, NULL);
        if (err)
                pci_disable_device(dev);
 
 
        if (idx == 0)
                d.host_flags |= IDE_HFLAG_CLEAR_SIMPLEX;
 
-       return ide_setup_pci_device(dev, &d);
+       return ide_pci_init_one(dev, &d, NULL);
 }
 
 
 
                         d.name, pci_name(dev), dev->revision,
                         amd_dma[fls(d.udma_mask) - 1]);
 
-       return ide_setup_pci_device(dev, &d);
+       return ide_pci_init_one(dev, &d, NULL);
 }
 
 static const struct pci_device_id amd74xx_pci_tbl[] = {
 
 
 static int __devinit atiixp_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
-       return ide_setup_pci_device(dev, &atiixp_pci_info[id->driver_data]);
+       return ide_pci_init_one(dev, &atiixp_pci_info[id->driver_data], NULL);
 }
 
 static const struct pci_device_id atiixp_pci_tbl[] = {
 
                }
        }
 
-       return ide_setup_pci_device(dev, &d);
+       return ide_pci_init_one(dev, &d, NULL);
 }
 
 static const struct pci_device_id cmd64x_pci_tbl[] = {
 
 
 static int __devinit cs5530_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
-       return ide_setup_pci_device(dev, &cs5530_chipset);
+       return ide_pci_init_one(dev, &cs5530_chipset, NULL);
 }
 
 static const struct pci_device_id cs5530_pci_tbl[] = {
 
 static int __devinit cs5535_init_one(struct pci_dev *dev,
                                        const struct pci_device_id *id)
 {
-       return ide_setup_pci_device(dev, &cs5535_chipset);
+       return ide_pci_init_one(dev, &cs5535_chipset, NULL);
 }
 
 static const struct pci_device_id cs5535_pci_tbl[] = {
 
        if ((dev->class >> 8) == PCI_CLASS_STORAGE_IDE &&
            PCI_FUNC(dev->devfn) == 1) {
                dev2 = pci_get_slot(dev->bus, dev->devfn + 1);
-               ret = ide_setup_pci_devices(dev, dev2, &cy82c693_chipset);
+               ret = ide_pci_init_two(dev, dev2, &cy82c693_chipset, NULL);
                /* We leak pci refs here but thats ok - we can't be unloaded */
        }
        return ret;
 
                        goto out;
                }
        }
-       ret = ide_setup_pci_device(dev, d);
+       ret = ide_pci_init_one(dev, d, NULL);
 out:
        return ret;
 }
 
 
        d = &hpt34x_chipsets[(pcicmd & PCI_COMMAND_MEMORY) ? 1 : 0];
 
-       return ide_setup_pci_device(dev, d);
+       return ide_pci_init_one(dev, d, NULL);
 }
 
 static const struct pci_device_id hpt34x_pci_tbl[] = {
 
                                d.host_flags &= ~IDE_HFLAG_NON_BOOTABLE;
                }
 
-               ret = ide_setup_pci_devices(dev, dev2, &d);
+               ret = ide_pci_init_two(dev, dev2, &d, NULL);
                if (ret < 0)
                        pci_dev_put(dev2);
                return ret;
        }
 
-       return ide_setup_pci_device(dev, &d);
+       return ide_pci_init_one(dev, &d, NULL);
 }
 
 static const struct pci_device_id hpt366_pci_tbl[] __devinitconst = {
 
 
 static int __devinit it8213_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
-       return ide_setup_pci_device(dev, &it8213_chipsets[id->driver_data]);
+       return ide_pci_init_one(dev, &it8213_chipsets[id->driver_data], NULL);
 }
 
 static const struct pci_device_id it8213_pci_tbl[] = {
 
 
        pci_set_drvdata(dev, itdevs);
 
-       return ide_setup_pci_device(dev, &it821x_chipsets[id->driver_data]);
+       return ide_pci_init_one(dev, &it821x_chipsets[id->driver_data], NULL);
 }
 
 static const struct pci_device_id it821x_pci_tbl[] = {
 
 
 static int __devinit jmicron_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
-       return ide_setup_pci_device(dev, &jmicron_chipset);
+       return ide_pci_init_one(dev, &jmicron_chipset, NULL);
 }
 
 /* All JMB PATA controllers have and will continue to have the same
 
                d.tp_ops = &superio_tp_ops;
        }
 #endif
-       return ide_setup_pci_device(dev, &d);
+       return ide_pci_init_one(dev, &d, NULL);
 }
 
 static const struct pci_device_id ns87415_pci_tbl[] = {
 
 
 static int __devinit opti621_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
-       return ide_setup_pci_device(dev, &opti621_chipset);
+       return ide_pci_init_one(dev, &opti621_chipset, NULL);
 }
 
 static const struct pci_device_id opti621_pci_tbl[] = {
 
                dev2 = pdc20270_get_dev2(dev);
 
                if (dev2) {
-                       int ret = ide_setup_pci_devices(dev, dev2, d);
+                       int ret = ide_pci_init_two(dev, dev2, d, NULL);
                        if (ret < 0)
                                pci_dev_put(dev2);
                        return ret;
                return -ENODEV;
        }
 
-       return ide_setup_pci_device(dev, d);
+       return ide_pci_init_one(dev, d, NULL);
 }
 
 static const struct pci_device_id pdc202new_pci_tbl[] = {
 
                }
        }
 
-       return ide_setup_pci_device(dev, d);
+       return ide_pci_init_one(dev, d, NULL);
 }
 
 static const struct pci_device_id pdc202xx_pci_tbl[] = {
 
  
 static int __devinit piix_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
-       return ide_setup_pci_device(dev, &piix_pci_info[id->driver_data]);
+       return ide_pci_init_one(dev, &piix_pci_info[id->driver_data], NULL);
 }
 
 /**
 
 
 static int __devinit rz1000_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
-       return ide_setup_pci_device(dev, &rz1000_chipset);
+       return ide_pci_init_one(dev, &rz1000_chipset, NULL);
 }
 
 static const struct pci_device_id rz1000_pci_tbl[] = {
 
 
 static int __devinit sc1200_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
-       return ide_setup_pci_device(dev, &sc1200_chipset);
+       return ide_pci_init_one(dev, &sc1200_chipset, NULL);
 }
 
 static const struct pci_device_id sc1200_pci_tbl[] = {
 
                        d.host_flags &= ~IDE_HFLAG_SINGLE;
        }
 
-       return ide_setup_pci_device(dev, &d);
+       return ide_pci_init_one(dev, &d, NULL);
 }
 
 static const struct pci_device_id svwks_pci_tbl[] = {
 
                d.host_flags |= IDE_HFLAG_NO_ATAPI_DMA;
        }
 
-       return ide_setup_pci_device(dev, &d);
+       return ide_pci_init_one(dev, &d, NULL);
 }
 
 static const struct pci_device_id siimage_pci_tbl[] = {
 
 
        d.udma_mask = udma_rates[chipset_family];
 
-       return ide_setup_pci_device(dev, &d);
+       return ide_pci_init_one(dev, &d, NULL);
 }
 
 static const struct pci_device_id sis5513_pci_tbl[] = {
 
                d.host_flags &= ~IDE_HFLAG_SERIALIZE_DMA;
        }
 
-       return ide_setup_pci_device(dev, &d);
+       return ide_pci_init_one(dev, &d, NULL);
 }
 
 static const struct pci_device_id sl82c105_pci_tbl[] = {
 
 
 static int __devinit slc90e66_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
-       return ide_setup_pci_device(dev, &slc90e66_chipset);
+       return ide_pci_init_one(dev, &slc90e66_chipset, NULL);
 }
 
 static const struct pci_device_id slc90e66_pci_tbl[] = {
 
 static int __devinit tc86c001_init_one(struct pci_dev *dev,
                                       const struct pci_device_id *id)
 {
-       return ide_setup_pci_device(dev, &tc86c001_chipset);
+       return ide_pci_init_one(dev, &tc86c001_chipset, NULL);
 }
 
 static const struct pci_device_id tc86c001_pci_tbl[] = {
 
 static int __devinit triflex_init_one(struct pci_dev *dev, 
                const struct pci_device_id *id)
 {
-       return ide_setup_pci_device(dev, &triflex_device);
+       return ide_pci_init_one(dev, &triflex_device, NULL);
 }
 
 static const struct pci_device_id triflex_pci_tbl[] = {
 
 
 static int __devinit trm290_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
-       return ide_setup_pci_device(dev, &trm290_chipset);
+       return ide_pci_init_one(dev, &trm290_chipset, NULL);
 }
 
 static const struct pci_device_id trm290_pci_tbl[] = {
 
 
        d.udma_mask = via_config->udma_mask;
 
-       return ide_setup_pci_device(dev, &d);
+       return ide_pci_init_one(dev, &d, NULL);
 }
 
 static const struct pci_device_id via_pci_tbl[] = {
 
        return ret;
 }
 
-int ide_setup_pci_device(struct pci_dev *dev, const struct ide_port_info *d)
+int ide_pci_init_one(struct pci_dev *dev, const struct ide_port_info *d,
+                    void *priv)
 {
+       struct ide_host *host;
        hw_regs_t hw[4], *hws[] = { NULL, NULL, NULL, NULL };
        int ret;
 
 
        ide_pci_setup_ports(dev, d, 0, &hw[0], &hws[0]);
 
+       host = ide_host_alloc(d, hws);
+       if (host == NULL) {
+               ret = -ENOMEM;
+               goto out;
+       }
+
+       host->dev[0] = &dev->dev;
+
+       host->host_priv = priv;
+
+       if (priv)
+               pci_set_drvdata(dev, host);
+
        ret = do_ide_setup_pci_device(dev, d, 1);
        if (ret < 0)
                goto out;
        /* fixup IRQ */
        hw[1].irq = hw[0].irq = ret;
 
-       ret = ide_host_add(d, hws, NULL);
+       ret = ide_host_register(host, d, hws);
+       if (ret)
+               ide_host_free(host);
 out:
        return ret;
 }
-EXPORT_SYMBOL_GPL(ide_setup_pci_device);
+EXPORT_SYMBOL_GPL(ide_pci_init_one);
 
-int ide_setup_pci_devices(struct pci_dev *dev1, struct pci_dev *dev2,
-                         const struct ide_port_info *d)
+int ide_pci_init_two(struct pci_dev *dev1, struct pci_dev *dev2,
+                    const struct ide_port_info *d, void *priv)
 {
        struct pci_dev *pdev[] = { dev1, dev2 };
+       struct ide_host *host;
        int ret, i;
        hw_regs_t hw[4], *hws[] = { NULL, NULL, NULL, NULL };
 
                        goto out;
 
                ide_pci_setup_ports(pdev[i], d, 0, &hw[i*2], &hws[i*2]);
+       }
 
+       host = ide_host_alloc(d, hws);
+       if (host == NULL) {
+               ret = -ENOMEM;
+               goto out;
+       }
+
+       host->dev[0] = &dev1->dev;
+       host->dev[1] = &dev2->dev;
+
+       host->host_priv = priv;
+
+       if (priv) {
+               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);
 
                /*
                hw[i*2 + 1].irq = hw[i*2].irq = ret;
        }
 
-       ret = ide_host_add(d, hws, NULL);
+       ret = ide_host_register(host, d, hws);
+       if (ret)
+               ide_host_free(host);
 out:
        return ret;
 }
-EXPORT_SYMBOL_GPL(ide_setup_pci_devices);
+EXPORT_SYMBOL_GPL(ide_pci_init_two);
 
 struct ide_host {
        ide_hwif_t      *ports[MAX_HWIFS];
        unsigned int    n_ports;
+       struct device   *dev[2];
+       void            *host_priv;
 };
 
 /*
        u8                      udma_mask;
 };
 
-int ide_setup_pci_device(struct pci_dev *, const struct ide_port_info *);
-int ide_setup_pci_devices(struct pci_dev *, struct pci_dev *, const struct ide_port_info *);
+int ide_pci_init_one(struct pci_dev *, const struct ide_port_info *, void *);
+int ide_pci_init_two(struct pci_dev *, struct pci_dev *,
+                    const struct ide_port_info *, void *);
 
 void ide_map_sg(ide_drive_t *, struct request *);
 void ide_init_sg_cmd(ide_drive_t *, struct request *);