static int __init ide_arm_init(void)
 {
-       struct ide_host *host;
        unsigned long base = IDE_ARM_IO, ctl = IDE_ARM_IO + 0x206;
        hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
 
        hw.irq = IDE_ARM_IRQ;
        hw.chipset = ide_generic;
 
-       host = ide_host_alloc(NULL, hws);
-       if (host)
-               ide_host_register(host, NULL, hws);
-
-       return 0;
+       return ide_host_add(NULL, hws, NULL);
 }
 
 module_init(ide_arm_init);
 
        struct resource *mem, *irq;
        struct ide_host *host;
        unsigned long base, rate;
-       int i;
+       int i, rc;
        hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
 
        clk = clk_get(NULL, "IDECLK");
        hw.irq = irq->start;
        hw.chipset = ide_palm3710;
 
-       host = ide_host_alloc(&palm_bk3710_port_info, hws);
-       if (host == NULL)
+       rc = ide_host_add(&palm_bk3710_port_info, hws, NULL);
+       if (rc)
                goto out;
 
-       ide_host_register(host, &palm_bk3710_port_info, hws);
-
        return 0;
 out:
        printk(KERN_WARNING "Palm Chip BK3710 IDE Register Fail\n");
-       return -ENODEV;
+       return rc;
 }
 
 /* work with hotplug and coldplug */
 
        hw.chipset = ide_generic;
        hw.dev = &ec->dev;
 
-       host = ide_host_alloc(&rapide_port_info, hws);
-       if (host == NULL) {
-               ret = -ENOENT;
+       ret = ide_host_add(&rapide_port_info, hws, &host);
+       if (ret)
                goto release;
-       }
-
-       ide_host_register(host, &rapide_port_info, hws);
 
        ecard_set_drvdata(ec, host);
        goto out;
 
 
 static int __init h8300_ide_init(void)
 {
-       struct ide_host *host;
        hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
 
        printk(KERN_INFO DRV_NAME ": H8/300 generic IDE interface\n");
 
        hw_setup(&hw);
 
-       host = ide_host_alloc(&h8300_port_info, hws);
-       if (host == NULL)
-               return -ENOENT;
-
-       ide_host_register(host, &h8300_port_info, hws);
-
-       return 0;
+       return ide_host_add(&h8300_port_info, hws, NULL);
 
 out_busy:
        printk(KERN_ERR "ide-h8300: IDE I/F resource already used.\n");
 
 
 static ssize_t store_add(struct class *cls, const char *buf, size_t n)
 {
-       struct ide_host *host;
        unsigned int base, ctl;
-       int irq;
+       int irq, rc;
        hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
 
        if (sscanf(buf, "%x:%x:%d", &base, &ctl, &irq) != 3)
        hw.irq = irq;
        hw.chipset = ide_generic;
 
-       host = ide_host_alloc(NULL, hws);
-       if (host == NULL)
-               return -ENOENT;
-
-       ide_host_register(host, NULL, hws);
+       rc = ide_host_add(NULL, hws, NULL);
+       if (rc)
+               return rc;
 
        return n;
 };
 
 {
        struct ide_host *host;
        unsigned long base, ctl;
+       int rc;
        hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
 
        printk(KERN_INFO DRV_NAME ": generic PnP IDE interface\n");
        hw.irq = pnp_irq(dev, 0);
        hw.chipset = ide_generic;
 
-       host = ide_host_alloc(NULL, hws);
-       if (host) {
-               pnp_set_drvdata(dev, host);
+       rc = ide_host_add(NULL, hws, &host);
+       if (rc)
+               goto out;
 
-               ide_host_register(host, NULL, hws);
-
-               return 0;
-       }
+       pnp_set_drvdata(dev, host);
 
+       return 0;
+out:
        release_region(ctl, 1);
        release_region(base, 8);
 
-       return -1;
+       return rc;
 }
 
 static void idepnp_remove(struct pnp_dev *dev)
 
 }
 EXPORT_SYMBOL_GPL(ide_host_register);
 
+int ide_host_add(const struct ide_port_info *d, hw_regs_t **hws,
+                struct ide_host **hostp)
+{
+       struct ide_host *host;
+
+       host = ide_host_alloc(d, hws);
+       if (host == NULL)
+               return -ENOMEM;
+
+       ide_host_register(host, d, hws);
+
+       if (hostp)
+               *hostp = host;
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(ide_host_add);
+
 void ide_host_remove(struct ide_host *host)
 {
        int i;
 
 int ide_legacy_device_add(const struct ide_port_info *d, unsigned long config)
 {
-       struct ide_host *host;
        hw_regs_t hw[2], *hws[] = { NULL, NULL, NULL, NULL };
 
        memset(&hw, 0, sizeof(hw));
            (d->host_flags & IDE_HFLAG_SINGLE))
                return -ENOENT;
 
-       host = ide_host_alloc(d, hws);
-       if (host == NULL)
-               return -ENOMEM;
-
-       ide_host_register(host, d, hws);
-
-       return 0;
+       return ide_host_add(d, hws, NULL);
 }
 EXPORT_SYMBOL_GPL(ide_legacy_device_add);
 
 static int __init buddha_init(void)
 {
        struct zorro_dev *z = NULL;
-       struct ide_host *host;
        u_long buddha_board = 0;
        BuddhaType type;
        int buddha_num_hwifs, i;
                        hws[i] = &hw[i];
                }
 
-               host = ide_host_alloc(NULL, hws);
-               if (host)
-                       ide_host_register(host, NULL, hws);
+               ide_host_add(NULL, hws, NULL);
        }
 
        return 0;
 
     unsigned long phys_base, res_start, res_n;
     unsigned long base, ctrlport, irqport;
     ide_ack_intr_t *ack_intr;
-    struct ide_host *host;
     int a4000, i;
     hw_regs_t hw[GAYLE_NUM_HWIFS], *hws[] = { NULL, NULL, NULL, NULL };
 
        hws[i] = &hw[i];
     }
 
-    host = ide_host_alloc(NULL, hws);
-    if (host)
-       ide_host_register(host, NULL, hws);
-
-    return 0;
+    return ide_host_add(NULL, hws, NULL);
 }
 
 module_init(gayle_init);
 
 
 static int __init ide_4drives_init(void)
 {
-       struct ide_host *host;
        unsigned long base = 0x1f0, ctl = 0x3f6;
        hw_regs_t hw, *hws[] = { &hw, &hw, NULL, NULL };
 
        hw.irq = 14;
        hw.chipset = ide_4drives;
 
-       host = ide_host_alloc(&ide_4drives_port_info, hws);
-       if (host)
-               ide_host_register(host, &ide_4drives_port_info, hws);
-
-       return 0;
+       return ide_host_add(&ide_4drives_port_info, hws, NULL);
 }
 
 module_init(ide_4drives_init);
 
 {
     struct ide_host *host;
     ide_hwif_t *hwif;
-    int i;
+    int i, rc;
     hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
 
     if (!request_region(io, 8, DRV_NAME)) {
     hw.chipset = ide_pci;
     hw.dev = &handle->dev;
 
-    host = ide_host_alloc(&idecs_port_info, hws);
-    if (host == NULL)
+    rc = ide_host_add(&idecs_port_info, hws, &host);
+    if (rc)
        goto out_release;
 
-    ide_host_register(host, &idecs_port_info, hws);
-
     hwif = host->ports[0];
 
     if (hwif->present)
 
        if (mmio)
                d.host_flags |= IDE_HFLAG_MMIO;
 
-       host = ide_host_alloc(&d, hws);
-       if (host == NULL) {
-               ret = -ENODEV;
+       ret = ide_host_add(&d, hws, &host);
+       if (ret)
                goto out;
-       }
-
-       ide_host_register(host, &d, hws);
 
        platform_set_drvdata(pdev, host);
 
 
 static int __init macide_init(void)
 {
        ide_ack_intr_t *ack_intr;
-       struct ide_host *host;
        unsigned long base;
        int irq;
        hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
 
        macide_setup_ports(&hw, base, irq, ack_intr);
 
-       host = ide_host_alloc(NULL, hws);
-       if (host)
-               ide_host_register(host, NULL, hws);
-
-       return 0;
+       return ide_host_add(NULL, hws, NULL);
 }
 
 module_init(macide_init);
 
 
 static int __init q40ide_init(void)
 {
-    struct ide_host *host;
     int i;
     hw_regs_t hw[Q40IDE_NUM_HWIFS], *hws[] = { NULL, NULL, NULL, NULL };
 
        hws[i] = &hw[i];
     }
 
-    host = ide_host_alloc(&q40ide_port_info, hws);
-    if (host)
-       ide_host_register(host, &q40ide_port_info, hws);
-
-    return 0;
+    return ide_host_add(&q40ide_port_info, hws, NULL);
 }
 
 module_init(q40ide_init);
 
        hw.dev = dev;
        hw.chipset = ide_au1xxx;
 
-       host = ide_host_alloc(&au1xxx_port_info, hws);
-       if (host == NULL) {
-               ret = -ENOENT;
+       ret = ide_host_add(&au1xxx_port_info, hws, &host);
+       if (ret)
                goto out;
-       }
-
-       ide_host_register(host, &au1xxx_port_info, hws);
 
        auide_hwif.hwif = host->ports[0];
 
 
        u8 __iomem *base;
        struct ide_host *host;
        phys_t offset, size;
-       int i;
+       int i, rc;
        hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
 
        if (!SIBYTE_HAVE_IDE)
        hw.irq = K_INT_GB_IDE;
        hw.chipset = ide_generic;
 
-       host = ide_host_alloc(&swarm_port_info, hws);
-       if (host == NULL)
+       rc = ide_host_add(&swarm_port_info, hws, &host);
+       if (rc)
                goto err;
 
-       ide_host_register(host, &swarm_port_info, hws);
-
        dev_set_drvdata(dev, host);
 
        return 0;
 err:
        release_resource(&swarm_ide_resource);
        iounmap(base);
-       return -ENOMEM;
+       return rc;
 }
 
 static struct device_driver swarm_ide_driver = {
 
  */
 static int __init cmd640x_init(void)
 {
-       struct ide_host *host;
        int second_port_cmd640 = 0, rc;
        const char *bus_type, *port2;
        u8 b, cfr;
        cmd640_dump_regs();
 #endif
 
-       host = ide_host_alloc(&cmd640_port_info, hws);
-       if (host)
-               ide_host_register(host, &cmd640_port_info, hws);
-
-       return 1;
+       return ide_host_add(&cmd640_port_info, hws, NULL);
 }
 
 module_param_named(probe_vlb, cmd640_vlb, bool, 0);
 
  
 static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
-       struct ide_host *host;
        const struct ide_port_info *d = &cyrix_chipsets[id->driver_data];
        hw_regs_t hw[4], *hws[] = { NULL, NULL, NULL, NULL };
 
 
        ide_pci_setup_ports(dev, d, 14, &hw[0], &hws[0]);
 
-       host = ide_host_alloc(d, hws);
-       if (host)
-               ide_host_register(host, d, hws);
-
-       return 0;
+       return ide_host_add(d, hws, NULL);
 }
 
 static const struct pci_device_id cs5520_pci_tbl[] = {
 
        hw.dev = &dev->dev;
        hw.chipset = ide_pci;           /* this enables IRQ sharing */
 
-       host = ide_host_alloc(&delkin_cb_port_info, hws);
-       if (host == NULL)
+       rc = ide_host_add(&delkin_cb_port_info, hws, &host);
+       if (rc)
                goto out_disable;
 
-       ide_host_register(host, &delkin_cb_port_info, hws);
-
        pci_set_drvdata(dev, host);
 
        return 0;
 out_disable:
        pci_release_regions(dev);
        pci_disable_device(dev);
-       return -ENODEV;
+       return rc;
 }
 
 static void
 
        struct scc_ports *ports = pci_get_drvdata(dev);
        struct ide_host *host;
        hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
-       int i;
+       int i, rc;
 
        memset(&hw, 0, sizeof(hw));
        for (i = 0; i <= 8; i++)
        hw.dev = &dev->dev;
        hw.chipset = ide_pci;
 
-       host = ide_host_alloc(d, hws);
-       if (host == NULL)
-               return -ENOMEM;
-
-       ide_host_register(host, d, hws);
+       rc = ide_host_add(d, hws, &host);
+       if (rc)
+               return rc;
 
        ports->host = host;
 
 
        ide_hwif_t *hwif;
        hw_regs_t *hws[] = { hw, NULL, NULL, NULL };
        struct ide_port_info d = pmac_port_info;
+       int rc;
 
        pmif->broken_dma = pmif->broken_dma_warn = 0;
        if (of_device_is_compatible(np, "shasta-ata")) {
                         pmif->mdev ? "macio" : "PCI", pmif->aapl_bus_id,
                         pmif->mediabay ? " (mediabay)" : "", hw->irq);
 
-       host = ide_host_alloc(&d, hws);
-       if (host == NULL)
-               return -ENOENT;
-
-       ide_host_register(host, &d, hws);
+       rc = ide_host_add(&d, hws, &host);
+       if (rc)
+               return rc;
 
        hwif = host->ports[0];
 
 
 
 int ide_setup_pci_device(struct pci_dev *dev, const struct ide_port_info *d)
 {
-       struct ide_host *host;
        hw_regs_t hw[4], *hws[] = { NULL, NULL, NULL, NULL };
        int ret;
 
                /* FIXME: silent failure can happen */
                ide_pci_setup_ports(dev, d, ret, &hw[0], &hws[0]);
 
-               host = ide_host_alloc(d, hws);
-               if (host)
-                       ide_host_register(host, d, hws);
+               ret = ide_host_add(d, hws, NULL);
        }
 
        return ret;
                          const struct ide_port_info *d)
 {
        struct pci_dev *pdev[] = { dev1, dev2 };
-       struct ide_host *host;
        int ret, i;
        hw_regs_t hw[4], *hws[] = { NULL, NULL, NULL, NULL };
 
                ide_pci_setup_ports(pdev[i], d, ret, &hw[i*2], &hws[i*2]);
        }
 
-       host = ide_host_alloc(d, hws);
-       if (host)
-               ide_host_register(host, d, hws);
+       ret = ide_host_add(d, hws, NULL);
 out:
        return ret;
 }
 
 struct ide_host *ide_host_alloc(const struct ide_port_info *, hw_regs_t **);
 int ide_host_register(struct ide_host *, const struct ide_port_info *,
                      hw_regs_t **);
+int ide_host_add(const struct ide_port_info *, hw_regs_t **,
+                struct ide_host **);
 void ide_host_remove(struct ide_host *);
 int ide_legacy_device_add(const struct ide_port_info *, unsigned long);
 void ide_port_unregister_devices(ide_hwif_t *);