ide: pass hw_regs_t-s to ide_device_add[_all]() (take 3)
[pandora-kernel.git] / drivers / ide / mips / swarm.c
index 712d17b..6da6844 100644 (file)
@@ -4,7 +4,7 @@
  *     Author: Manish Lachwani, mlachwani@mvista.com
  * Copyright (C) 2004  MIPS Technologies, Inc.  All rights reserved.
  *     Author: Maciej W. Rozycki <macro@mips.com>
- * Copyright (c) 2006  Maciej W. Rozycki
+ * Copyright (c) 2006, 2008  Maciej W. Rozycki
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -61,6 +61,11 @@ static struct resource swarm_ide_resource = {
 
 static struct platform_device *swarm_ide_dev;
 
+static const struct ide_port_info swarm_port_info = {
+       .name                   = DRV_NAME,
+       .host_flags             = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA,
+};
+
 /*
  * swarm_ide_probe - if the board header indicates the existence of
  * Generic Bus IDE, allocate a HWIF for it.
@@ -71,17 +76,12 @@ static int __devinit swarm_ide_probe(struct device *dev)
        u8 __iomem *base;
        phys_t offset, size;
        int i;
-       u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
+       hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
+       u8 idx[] = { 0xff, 0xff, 0xff, 0xff };
 
        if (!SIBYTE_HAVE_IDE)
                return -ENODEV;
 
-       hwif = ide_find_port();
-       if (hwif == NULL) {
-               printk(KERN_ERR DRV_NAME ": no free slot for interface\n");
-               return -ENOMEM;
-       }
-
        base = ioremap(A_IO_EXT_BASE, 0x800);
        offset = __raw_readq(base + R_IO_EXT_REG(R_IO_EXT_START_ADDR, IDE_CS));
        size = __raw_readq(base + R_IO_EXT_REG(R_IO_EXT_MULT_SIZE, IDE_CS));
@@ -108,26 +108,32 @@ static int __devinit swarm_ide_probe(struct device *dev)
 
        base = ioremap(offset, size);
 
-       /* Setup MMIO ops.  */
-       hwif->host_flags = IDE_HFLAG_MMIO;
-       default_hwif_mmiops(hwif);
-
-       hwif->chipset = ide_generic;
-
        for (i = 0; i <= 7; i++)
-               hwif->io_ports_array[i] =
+               hw.io_ports_array[i] =
                                (unsigned long)(base + ((0x1f0 + i) << 5));
-       hwif->io_ports.ctl_addr =
+       hw.io_ports.ctl_addr =
                                (unsigned long)(base + (0x3f6 << 5));
-       hwif->irq = K_INT_GB_IDE;
+       hw.irq = K_INT_GB_IDE;
+       hw.chipset = ide_generic;
+
+       hwif = ide_find_port_slot(&swarm_port_info);
+       if (hwif == NULL)
+               goto err;
+
+       /* Setup MMIO ops. */
+       default_hwif_mmiops(hwif);
 
        idx[0] = hwif->index;
 
-       ide_device_add(idx, NULL);
+       ide_device_add(idx, &swarm_port_info, hws);
 
        dev_set_drvdata(dev, hwif);
 
        return 0;
+err:
+       release_resource(&swarm_ide_resource);
+       iounmap(base);
+       return -ENOMEM;
 }
 
 static struct device_driver swarm_ide_driver = {