Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 77254
b: refs/heads/master
c: 57c802e
h: refs/heads/master
v: v3
  • Loading branch information
Bartlomiej Zolnierkiewicz committed Jan 26, 2008
1 parent 46fd8bf commit e7658ad
Show file tree
Hide file tree
Showing 7 changed files with 82 additions and 67 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 8f8e8483f667d79739007b25f0e59a540fb9fa51
refs/heads/master: 57c802e84f9c759c3d1794a9dbe81bc10444df62
34 changes: 17 additions & 17 deletions trunk/drivers/ide/arm/rapide.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
Expand All @@ -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;

Expand Down
19 changes: 13 additions & 6 deletions trunk/drivers/ide/ide.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -729,13 +740,9 @@ int ide_register_hw(hw_regs_t *hw, void (*quirkproc)(ide_drive_t *),
}
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 };
Expand Down
55 changes: 28 additions & 27 deletions trunk/drivers/ide/legacy/ide_platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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;

Expand Down Expand Up @@ -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;

Expand Down
9 changes: 4 additions & 5 deletions trunk/drivers/ide/pci/sgiioc4.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
29 changes: 18 additions & 11 deletions trunk/drivers/ide/ppc/pmac.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand All @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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;

Expand All @@ -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);
Expand Down
1 change: 1 addition & 0 deletions trunk/include/linux/ide.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit e7658ad

Please sign in to comment.