Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=57c802e84f9c759c3d1794a9dbe81bc10444df62
Commit:     57c802e84f9c759c3d1794a9dbe81bc10444df62
Parent:     8f8e8483f667d79739007b25f0e59a540fb9fa51
Author:     Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]>
AuthorDate: Sat Jan 26 20:13:05 2008 +0100
Committer:  Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]>
CommitDate: Sat Jan 26 20:13:05 2008 +0100

    ide: add ide_init_port_hw() helper
    
    * Add ide_init_port_hw() helper.
    
    * rapide.c: convert rapide_locate_hwif() to rapide_setup_ports()
      and use ide_init_port_hw().
    
    * ide_platform.c: convert plat_ide_locate_hwif() to plat_ide_setup_ports()
      and use ide_init_port_hw().
    
    * sgiioc4.c: use ide_init_port_hw().
    
    * pmac.c: add 'hw_regs_t *hw' argument to pmac_ide_setup_device(),
      setup 'hw' in pmac_ide_{macio,pci}_attach() and use ide_init_port_hw()
      in pmac_ide_setup_device().
    
    This patch is a preparation for the future changes in the IDE probing code.
    
    There should be no functionality changes caused by this patch.
    
    Cc: Russell King <[EMAIL PROTECTED]>
    Cc: Anton Vorontsov <[EMAIL PROTECTED]>
    Cc: Jeremy Higdon <[EMAIL PROTECTED]>
    Cc: Benjamin Herrenschmidt <[EMAIL PROTECTED]>
    Acked-by: Sergei Shtylyov <[EMAIL PROTECTED]>
    Signed-off-by: Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]>
---
 drivers/ide/arm/rapide.c          |   34 +++++++++++-----------
 drivers/ide/ide.c                 |   19 +++++++++----
 drivers/ide/legacy/ide_platform.c |   55 +++++++++++++++++++------------------
 drivers/ide/pci/sgiioc4.c         |    9 +++---
 drivers/ide/ppc/pmac.c            |   29 ++++++++++++-------
 include/linux/ide.h               |    1 +
 6 files changed, 81 insertions(+), 66 deletions(-)

diff --git a/drivers/ide/arm/rapide.c b/drivers/ide/arm/rapide.c
index c709d37..0267467 100644
--- a/drivers/ide/arm/rapide.c
+++ b/drivers/ide/arm/rapide.c
@@ -13,26 +13,18 @@
 
 #include <asm/ecard.h>
 
-static ide_hwif_t *
-rapide_locate_hwif(void __iomem *base, void __iomem *ctrl, unsigned int sz, 
int irq)
+static void rapide_setup_ports(hw_regs_t *hw, void __iomem *base,
+                              void __iomem *ctrl, unsigned int sz, int irq)
 {
        unsigned long port = (unsigned long)base;
-       ide_hwif_t *hwif = ide_find_port(port);
        int i;
 
-       if (hwif == NULL)
-               goto out;
-
        for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
-               hwif->io_ports[i] = port;
+               hw->io_ports[i] = port;
                port += sz;
        }
-       hwif->io_ports[IDE_CONTROL_OFFSET] = (unsigned long)ctrl;
-       hwif->irq = irq;
-       hwif->mmio = 1;
-       default_hwif_mmiops(hwif);
-out:
-       return hwif;
+       hw->io_ports[IDE_CONTROL_OFFSET] = (unsigned long)ctrl;
+       hw->irq = irq;
 }
 
 static int __devinit
@@ -42,6 +34,7 @@ rapide_probe(struct expansion_card *ec, const struct ecard_id 
*id)
        void __iomem *base;
        int ret;
        u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
+       hw_regs_t hw;
 
        ret = ecard_request_resources(ec);
        if (ret)
@@ -53,12 +46,19 @@ rapide_probe(struct expansion_card *ec, const struct 
ecard_id *id)
                goto release;
        }
 
-       hwif = rapide_locate_hwif(base, base + 0x818, 1 << 6, ec->irq);
+       hwif = ide_find_port((unsigned long)base);
        if (hwif) {
-               hwif->chipset = ide_generic;
+               memset(&hw, 0, sizeof(hw));
+               rapide_setup_ports(&hw, base, base + 0x818, 1 << 6, ec->irq);
+               hw.chipset = ide_generic;
+               hw.dev = &ec->dev;
+
+               ide_init_port_hw(hwif, &hw);
+
+               hwif->mmio = 1;
+               default_hwif_mmiops(hwif);
+
                hwif->hwif_data = base;
-               hwif->gendev.parent = &ec->dev;
-               hwif->noprobe = 0;
 
                idx[0] = hwif->index;
 
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c
index 8ef521f..98bd45e 100644
--- a/drivers/ide/ide.c
+++ b/drivers/ide/ide.c
@@ -675,6 +675,17 @@ void ide_setup_ports (     hw_regs_t *hw,
  */
 }
 
+void ide_init_port_hw(ide_hwif_t *hwif, hw_regs_t *hw)
+{
+       memcpy(hwif->io_ports, hw->io_ports, sizeof(hwif->io_ports));
+       hwif->irq = hw->irq;
+       hwif->noprobe = 0;
+       hwif->chipset = hw->chipset;
+       hwif->gendev.parent = hw->dev;
+       hwif->ack_intr = hw->ack_intr;
+}
+EXPORT_SYMBOL_GPL(ide_init_port_hw);
+
 /**
  *     ide_register_hw         -       register IDE interface
  *     @hw: hardware registers
@@ -729,13 +740,9 @@ found:
        }
        if (hwif->present)
                return -1;
-       memcpy(hwif->io_ports, hw->io_ports, sizeof(hwif->io_ports));
-       hwif->irq = hw->irq;
-       hwif->noprobe = 0;
+
+       ide_init_port_hw(hwif, hw);
        hwif->quirkproc = quirkproc;
-       hwif->chipset = hw->chipset;
-       hwif->gendev.parent = hw->dev;
-       hwif->ack_intr = hw->ack_intr;
 
        if (initializing == 0) {
                u8 idx[4] = { index, 0xff, 0xff, 0xff };
diff --git a/drivers/ide/legacy/ide_platform.c 
b/drivers/ide/legacy/ide_platform.c
index 7bb79f5..69a0fb0 100644
--- a/drivers/ide/legacy/ide_platform.c
+++ b/drivers/ide/legacy/ide_platform.c
@@ -28,39 +28,27 @@ static struct {
        int index;
 } hwif_prop;
 
-static ide_hwif_t *__devinit plat_ide_locate_hwif(void __iomem *base,
-           void __iomem *ctrl, struct pata_platform_info *pdata, int irq,
-           int mmio)
+static void __devinit plat_ide_setup_ports(hw_regs_t *hw,
+                                          void __iomem *base,
+                                          void __iomem *ctrl,
+                                          struct pata_platform_info *pdata,
+                                          int irq)
 {
        unsigned long port = (unsigned long)base;
-       ide_hwif_t *hwif = ide_find_port(port);
        int i;
 
-       if (hwif == NULL)
-               goto out;
-
-       hwif->io_ports[IDE_DATA_OFFSET] = port;
+       hw->io_ports[IDE_DATA_OFFSET] = port;
 
        port += (1 << pdata->ioport_shift);
        for (i = IDE_ERROR_OFFSET; i <= IDE_STATUS_OFFSET;
             i++, port += (1 << pdata->ioport_shift))
-               hwif->io_ports[i] = port;
-
-       hwif->io_ports[IDE_CONTROL_OFFSET] = (unsigned long)ctrl;
+               hw->io_ports[i] = port;
 
-       hwif->irq = irq;
+       hw->io_ports[IDE_CONTROL_OFFSET] = (unsigned long)ctrl;
 
-       hwif->chipset = ide_generic;
+       hw->irq = irq;
 
-       if (mmio) {
-               hwif->mmio = 1;
-               default_hwif_mmiops(hwif);
-       }
-
-       hwif_prop.hwif = hwif;
-       hwif_prop.index = hwif->index;
-out:
-       return hwif;
+       hw->chipset = ide_generic;
 }
 
 static int __devinit plat_ide_probe(struct platform_device *pdev)
@@ -71,6 +59,7 @@ static int __devinit plat_ide_probe(struct platform_device 
*pdev)
        u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
        int ret = 0;
        int mmio = 0;
+       hw_regs_t hw;
 
        pdata = pdev->dev.platform_data;
 
@@ -106,15 +95,27 @@ static int __devinit plat_ide_probe(struct platform_device 
*pdev)
                        res_alt->start, res_alt->end - res_alt->start + 1);
        }
 
-       hwif = plat_ide_locate_hwif(hwif_prop.plat_ide_mapbase,
-                hwif_prop.plat_ide_alt_mapbase, pdata, res_irq->start, mmio);
-
+       hwif = ide_find_port((unsigned long)hwif_prop.plat_ide_mapbase);
        if (!hwif) {
                ret = -ENODEV;
                goto out;
        }
-       hwif->gendev.parent = &pdev->dev;
-       hwif->noprobe = 0;
+
+       memset(&hw, 0, sizeof(hw));
+       plat_ide_setup_ports(&hw, hwif_prop.plat_ide_mapbase,
+                            hwif_prop.plat_ide_alt_mapbase,
+                            pdata, res_irq->start);
+       hw.dev = &pdev->dev;
+
+       ide_init_port_hw(hwif, &hw);
+
+       if (mmio) {
+               hwif->mmio = 1;
+               default_hwif_mmiops(hwif);
+       }
+
+       hwif_prop.hwif = hwif;
+       hwif_prop.index = hwif->index;
 
        idx[0] = hwif->index;
 
diff --git a/drivers/ide/pci/sgiioc4.c b/drivers/ide/pci/sgiioc4.c
index b188efc..9e0be7d 100644
--- a/drivers/ide/pci/sgiioc4.c
+++ b/drivers/ide/pci/sgiioc4.c
@@ -636,14 +636,13 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev)
        /* Initialize the IO registers */
        memset(&hw, 0, sizeof(hw));
        sgiioc4_init_hwif_ports(&hw, cmd_base, ctl, irqport);
-       memcpy(hwif->io_ports, hw.io_ports, sizeof(hwif->io_ports));
-       hwif->noprobe = 0;
+       hw.irq = dev->irq;
+       hw.chipset = ide_pci;
+       hw.dev = &dev->dev;
+       ide_init_port_hw(hwif, &hw);
 
-       hwif->irq = dev->irq;
-       hwif->chipset = ide_pci;
        hwif->pci_dev = dev;
        hwif->channel = 0;      /* Single Channel chip */
-       hwif->gendev.parent = &dev->dev;/* setup proper ancestral information */
 
        /* The IOC4 uses MMIO rather than Port IO. */
        default_hwif_mmiops(hwif);
diff --git a/drivers/ide/ppc/pmac.c b/drivers/ide/ppc/pmac.c
index 6a4b0d4..36e4b95 100644
--- a/drivers/ide/ppc/pmac.c
+++ b/drivers/ide/ppc/pmac.c
@@ -1012,12 +1012,11 @@ pmac_ide_do_resume(ide_hwif_t *hwif)
  * rare machines unfortunately, but it's better this way.
  */
 static int
-pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif)
+pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif, hw_regs_t *hw)
 {
        struct device_node *np = pmif->node;
        const int *bidp;
        u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
-       hw_regs_t hw;
 
        pmif->cable_80 = 0;
        pmif->broken_dma = pmif->broken_dma_warn = 0;
@@ -1103,11 +1102,9 @@ pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t 
*hwif)
        /* Tell common code _not_ to mess with resources */
        hwif->mmio = 1;
        hwif->hwif_data = pmif;
-       memset(&hw, 0, sizeof(hw));
-       pmac_ide_init_hwif_ports(&hw, pmif->regbase, 0, &hwif->irq);
-       memcpy(hwif->io_ports, hw.io_ports, sizeof(hwif->io_ports));
-       hwif->chipset = ide_pmac;
-       hwif->noprobe = !hwif->io_ports[IDE_DATA_OFFSET] || pmif->mediabay;
+       hw->chipset = ide_pmac;
+       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->drives[0].unmask = 1;
@@ -1163,6 +1160,7 @@ pmac_ide_macio_attach(struct macio_dev *mdev, const 
struct of_device_id *match)
        ide_hwif_t *hwif;
        pmac_ide_hwif_t *pmif;
        int i, rc;
+       hw_regs_t hw;
 
        i = 0;
        while (i < MAX_HWIFS && (ide_hwifs[i].io_ports[IDE_DATA_OFFSET] != 0
@@ -1205,7 +1203,6 @@ pmac_ide_macio_attach(struct macio_dev *mdev, const 
struct of_device_id *match)
        regbase = (unsigned long) base;
 
        hwif->pci_dev = mdev->bus->pdev;
-       hwif->gendev.parent = &mdev->ofdev.dev;
 
        pmif->mdev = mdev;
        pmif->node = mdev->ofdev.node;
@@ -1223,7 +1220,12 @@ pmac_ide_macio_attach(struct macio_dev *mdev, const 
struct of_device_id *match)
 #endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */
        dev_set_drvdata(&mdev->ofdev.dev, hwif);
 
-       rc = pmac_ide_setup_device(pmif, hwif);
+       memset(&hw, 0, sizeof(hw));
+       pmac_ide_init_hwif_ports(&hw, pmif->regbase, 0, NULL);
+       hw.irq = irq;
+       hw.dev = &mdev->ofdev.dev;
+
+       rc = pmac_ide_setup_device(pmif, hwif, &hw);
        if (rc != 0) {
                /* The inteface is released to the common IDE layer */
                dev_set_drvdata(&mdev->ofdev.dev, NULL);
@@ -1282,6 +1284,7 @@ pmac_ide_pci_attach(struct pci_dev *pdev, const struct 
pci_device_id *id)
        void __iomem *base;
        unsigned long rbase, rlen;
        int i, rc;
+       hw_regs_t hw;
 
        np = pci_device_to_OF_node(pdev);
        if (np == NULL) {
@@ -1315,7 +1318,6 @@ pmac_ide_pci_attach(struct pci_dev *pdev, const struct 
pci_device_id *id)
        }
 
        hwif->pci_dev = pdev;
-       hwif->gendev.parent = &pdev->dev;
        pmif->mdev = NULL;
        pmif->node = np;
 
@@ -1332,7 +1334,12 @@ pmac_ide_pci_attach(struct pci_dev *pdev, const struct 
pci_device_id *id)
 
        pci_set_drvdata(pdev, hwif);
 
-       rc = pmac_ide_setup_device(pmif, hwif);
+       memset(&hw, 0, sizeof(hw));
+       pmac_ide_init_hwif_ports(&hw, pmif->regbase, 0, NULL);
+       hw.irq = pdev->irq;
+       hw.dev = &pdev->dev;
+
+       rc = pmac_ide_setup_device(pmif, hwif, &hw);
        if (rc != 0) {
                /* The inteface is released to the common IDE layer */
                pci_set_drvdata(pdev, NULL);
diff --git a/include/linux/ide.h b/include/linux/ide.h
index ce9b16f..de94a52 100644
--- a/include/linux/ide.h
+++ b/include/linux/ide.h
@@ -198,6 +198,7 @@ typedef struct hw_regs_s {
 } hw_regs_t;
 
 struct hwif_s * ide_find_port(unsigned long);
+void ide_init_port_hw(struct hwif_s *, hw_regs_t *);
 
 struct ide_drive_s;
 int ide_register_hw(hw_regs_t *, void (*)(struct ide_drive_s *), int,
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to