Commit 847253b9 authored by Andreas Ferber's avatar Andreas Ferber Committed by Ralf Baechle

MIPS: Fix SSB PCIcore IO resource management

The SSB PCIcore code reused the IO resource fixup code from the original
2.4.x Broadcom patch for BCM47xx based devices, which was a quick hack
for doing PCI IO resource configuration back then (the boot loader
doesn't configure PCI devices on this platform).

However, this code is no longer necessary since the kernel now can do
PCI resource management fine all by itself, so remove the old code.

When removing the code, it becomes obvious that the mem_offset setting
in the PCIcore driver was wrong, however this was masked by the fixup
code before, except in a few cases involving yenta_socket. For BCM47xx,
the correct offset is 0, and since this is the only device using PCIcore
in host mode, the offset can simply be removed unconditionally.
Signed-off-by: default avatarAndreas Ferber <af@chaos-agency.de>
Signed-off-by: default avatarMichael Buesch <mb@bu3sch.de>
Cc: Markus Wigge <markus@cultcom.de>
Cc: linux-mips@linux-mips.org
Patchwork: http://patchwork.linux-mips.org/patch/1070/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 86f7d75e
...@@ -246,20 +246,12 @@ static struct pci_controller ssb_pcicore_controller = { ...@@ -246,20 +246,12 @@ static struct pci_controller ssb_pcicore_controller = {
.pci_ops = &ssb_pcicore_pciops, .pci_ops = &ssb_pcicore_pciops,
.io_resource = &ssb_pcicore_io_resource, .io_resource = &ssb_pcicore_io_resource,
.mem_resource = &ssb_pcicore_mem_resource, .mem_resource = &ssb_pcicore_mem_resource,
.mem_offset = 0x24000000,
}; };
static u32 ssb_pcicore_pcibus_iobase = 0x100;
static u32 ssb_pcicore_pcibus_membase = SSB_PCI_DMA;
/* This function is called when doing a pci_enable_device(). /* This function is called when doing a pci_enable_device().
* We must first check if the device is a device on the PCI-core bridge. */ * We must first check if the device is a device on the PCI-core bridge. */
int ssb_pcicore_plat_dev_init(struct pci_dev *d) int ssb_pcicore_plat_dev_init(struct pci_dev *d)
{ {
struct resource *res;
int pos, size;
u32 *base;
if (d->bus->ops != &ssb_pcicore_pciops) { if (d->bus->ops != &ssb_pcicore_pciops) {
/* This is not a device on the PCI-core bridge. */ /* This is not a device on the PCI-core bridge. */
return -ENODEV; return -ENODEV;
...@@ -268,27 +260,6 @@ int ssb_pcicore_plat_dev_init(struct pci_dev *d) ...@@ -268,27 +260,6 @@ int ssb_pcicore_plat_dev_init(struct pci_dev *d)
ssb_printk(KERN_INFO "PCI: Fixing up device %s\n", ssb_printk(KERN_INFO "PCI: Fixing up device %s\n",
pci_name(d)); pci_name(d));
/* Fix up resource bases */
for (pos = 0; pos < 6; pos++) {
res = &d->resource[pos];
if (res->flags & IORESOURCE_IO)
base = &ssb_pcicore_pcibus_iobase;
else
base = &ssb_pcicore_pcibus_membase;
res->flags |= IORESOURCE_PCI_FIXED;
if (res->end) {
size = res->end - res->start + 1;
if (*base & (size - 1))
*base = (*base + size) & ~(size - 1);
res->start = *base;
res->end = res->start + size - 1;
*base += size;
pci_write_config_dword(d, PCI_BASE_ADDRESS_0 + (pos << 2), res->start);
}
/* Fix up PCI bridge BAR0 only */
if (d->bus->number == 0 && PCI_SLOT(d->devfn) == 0)
break;
}
/* Fix up interrupt lines */ /* Fix up interrupt lines */
d->irq = ssb_mips_irq(extpci_core->dev) + 2; d->irq = ssb_mips_irq(extpci_core->dev) + 2;
pci_write_config_byte(d, PCI_INTERRUPT_LINE, d->irq); pci_write_config_byte(d, PCI_INTERRUPT_LINE, d->irq);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment