Merge branch 'powerpc-next' of master.kernel.org:/pub/scm/linux/kernel/git/galak...
[sfrench/cifs-2.6.git] / drivers / ide / ppc / pmac.c
index 78c9eeb85634876a428166668db3bcc65e8c6bb0..88619b50d9ef9ada1a475b74cfe2de355130a239 100644 (file)
@@ -80,7 +80,6 @@ typedef struct pmac_ide_hwif {
 } pmac_ide_hwif_t;
 
 static pmac_ide_hwif_t pmac_ide[MAX_HWIFS];
-static int pmac_ide_count;
 
 enum {
        controller_ohare,       /* OHare based */
@@ -419,38 +418,8 @@ static void pmac_ide_kauai_selectproc(ide_drive_t *drive);
 
 #endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */
 
-/*
- * N.B. this can't be an initfunc, because the media-bay task can
- * call ide_[un]register at any time.
- */
-void
-pmac_ide_init_hwif_ports(hw_regs_t *hw,
-                             unsigned long data_port, unsigned long ctrl_port,
-                             int *irq)
-{
-       int i, ix;
-
-       if (data_port == 0)
-               return;
-
-       for (ix = 0; ix < MAX_HWIFS; ++ix)
-               if (data_port == pmac_ide[ix].regbase)
-                       break;
-
-       if (ix >= MAX_HWIFS)
-               return;         /* not an IDE PMAC interface */
-
-       for (i = 0; i < 8; ++i)
-               hw->io_ports[i] = data_port + i * 0x10;
-       hw->io_ports[8] = data_port + 0x160;
-
-       if (irq != NULL)
-               *irq = pmac_ide[ix].irq;
-
-       hw->dev = &pmac_ide[ix].mdev->ofdev.dev;
-}
-
-#define PMAC_IDE_REG(x) ((void __iomem *)(IDE_DATA_REG+(x)))
+#define PMAC_IDE_REG(x) \
+       ((void __iomem *)((drive)->hwif->io_ports[IDE_DATA_OFFSET] + (x)))
 
 /*
  * Apply the timings of the proper unit (master/slave) to the shared
@@ -886,58 +855,6 @@ sanitize_timings(pmac_ide_hwif_t *pmif)
        pmif->timings[2] = pmif->timings[3] = value2;
 }
 
-unsigned long
-pmac_ide_get_base(int index)
-{
-       return pmac_ide[index].regbase;
-}
-
-int
-pmac_ide_check_base(unsigned long base)
-{
-       int ix;
-       
-       for (ix = 0; ix < MAX_HWIFS; ++ix)
-               if (base == pmac_ide[ix].regbase)
-                       return ix;
-       return -1;
-}
-
-int
-pmac_ide_get_irq(unsigned long base)
-{
-       int ix;
-
-       for (ix = 0; ix < MAX_HWIFS; ++ix)
-               if (base == pmac_ide[ix].regbase)
-                       return pmac_ide[ix].irq;
-       return 0;
-}
-
-static int ide_majors[] = { 3, 22, 33, 34, 56, 57 };
-
-dev_t __init
-pmac_find_ide_boot(char *bootdevice, int n)
-{
-       int i;
-       
-       /*
-        * Look through the list of IDE interfaces for this one.
-        */
-       for (i = 0; i < pmac_ide_count; ++i) {
-               char *name;
-               if (!pmac_ide[i].node || !pmac_ide[i].node->full_name)
-                       continue;
-               name = pmac_ide[i].node->full_name;
-               if (memcmp(name, bootdevice, n) == 0 && name[n] == 0) {
-                       /* XXX should cope with the 2nd drive as well... */
-                       return MKDEV(ide_majors[i], 0);
-               }
-       }
-
-       return 0;
-}
-
 /* Suspend call back, should be called after the child devices
  * have actually been suspended
  */
@@ -1088,7 +1005,8 @@ pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif, hw_regs_t *hw)
        if (np->parent && np->parent->name
            && strcasecmp(np->parent->name, "media-bay") == 0) {
 #ifdef CONFIG_PMAC_MEDIABAY
-               media_bay_set_ide_infos(np->parent, pmif->regbase, pmif->irq, hwif->index);
+               media_bay_set_ide_infos(np->parent, pmif->regbase, pmif->irq,
+                                       hwif);
 #endif /* CONFIG_PMAC_MEDIABAY */
                pmif->mediabay = 1;
                if (!bidp)
@@ -1119,7 +1037,6 @@ pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif, hw_regs_t *hw)
        hwif->hwif_data = pmif;
        ide_init_port_hw(hwif, hw);
        hwif->noprobe = pmif->mediabay;
-       hwif->hold = pmif->mediabay;
        hwif->cbl = pmif->cable_80 ? ATA_CBL_PATA80 : ATA_CBL_PATA40;
        hwif->set_pio_mode = pmac_ide_set_pio_mode;
        if (pmif->kind == controller_un_ata6
@@ -1154,6 +1071,15 @@ pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif, hw_regs_t *hw)
        return 0;
 }
 
+static void __devinit pmac_ide_init_ports(hw_regs_t *hw, unsigned long base)
+{
+       int i;
+
+       for (i = 0; i < 8; ++i)
+               hw->io_ports[i] = base + i * 0x10;
+       hw->io_ports[8] = base + 0x160;
+}
+
 /*
  * Attach to a macio probed interface
  */
@@ -1227,7 +1153,7 @@ pmac_ide_macio_attach(struct macio_dev *mdev, const struct of_device_id *match)
        dev_set_drvdata(&mdev->ofdev.dev, hwif);
 
        memset(&hw, 0, sizeof(hw));
-       pmac_ide_init_hwif_ports(&hw, pmif->regbase, 0, NULL);
+       pmac_ide_init_ports(&hw, pmif->regbase);
        hw.irq = irq;
        hw.dev = &mdev->ofdev.dev;
 
@@ -1341,7 +1267,7 @@ pmac_ide_pci_attach(struct pci_dev *pdev, const struct pci_device_id *id)
        pci_set_drvdata(pdev, hwif);
 
        memset(&hw, 0, sizeof(hw));
-       pmac_ide_init_hwif_ports(&hw, pmif->regbase, 0, NULL);
+       pmac_ide_init_ports(&hw, pmif->regbase);
        hw.irq = pdev->irq;
        hw.dev = &pdev->dev;
 
@@ -1771,3 +1697,5 @@ static int __devinit pmac_ide_setup_dma(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif)
 #endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */
 
 module_init(pmac_ide_probe);
+
+MODULE_LICENSE("GPL");