memcpy(&hwif->io_ports, &hw->io_ports, sizeof(hwif->io_ports));
        hwif->irq = hw->irq;
        hwif->chipset = hw->chipset;
-       hwif->gendev.parent = hw->dev;
+       hwif->dev = hw->dev;
+       hwif->gendev.parent = hw->parent ? hw->parent : hw->dev;
        hwif->ack_intr = hw->ack_intr;
 }
 EXPORT_SYMBOL_GPL(ide_init_port_hw);
 
 
        ide_init_port_hw(hwif, &hw);
 
-       hwif->dev = dev;
-
        /* If the user has selected DDMA assisted copies,
           then set up a few local I/O function entry points 
        */
 
        hw.dev = &dev->dev;
        hw.chipset = ide_pci;
        ide_init_port_hw(hwif, &hw);
-       hwif->dev = &dev->dev;
 
        idx[0] = hwif->index;
 
 
        hw.dev = &dev->dev;
        ide_init_port_hw(hwif, &hw);
 
-       hwif->dev = &dev->dev;
-
        /* The IOC4 uses MMIO rather than Port IO. */
        default_hwif_mmiops(hwif);
 
 
        base = ioremap(macio_resource_start(mdev, 0), 0x400);
        regbase = (unsigned long) base;
 
-       hwif->dev = &mdev->bus->pdev->dev;
-
        pmif->mdev = mdev;
        pmif->node = mdev->ofdev.node;
        pmif->regbase = regbase;
        memset(&hw, 0, sizeof(hw));
        pmac_ide_init_ports(&hw, pmif->regbase);
        hw.irq = irq;
-       hw.dev = &mdev->ofdev.dev;
+       hw.dev = &mdev->bus->pdev->dev;
+       hw.parent = &mdev->ofdev.dev;
 
        rc = pmac_ide_setup_device(pmif, hwif, &hw);
        if (rc != 0) {
                goto out_free_pmif;
        }
 
-       hwif->dev = &pdev->dev;
        pmif->mdev = NULL;
        pmif->node = np;
 
 
 
        ide_init_port_hw(hwif, &hw);
 
-       hwif->dev = &dev->dev;
-
        return hwif;
 }
 
 
        int             irq;                    /* our irq number */
        ide_ack_intr_t  *ack_intr;              /* acknowledge interrupt */
        hwif_chipset_t  chipset;
-       struct device   *dev;
+       struct device   *dev, *parent;
 } hw_regs_t;
 
 void ide_init_port_data(struct hwif_s *, unsigned int);