sh: pci: Track io and mem_offset per-channel.
authorPaul Mundt <lethal@linux-sh.org>
Mon, 20 Apr 2009 09:42:00 +0000 (18:42 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Mon, 20 Apr 2009 09:42:00 +0000 (18:42 +0900)
This implements a per-hose offset for I/O and mem resources.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/sh/drivers/pci/pci-new.c
arch/sh/drivers/pci/pci-sh7780.c
arch/sh/include/asm/pci.h

index 78b7292..e8ac8da 100644 (file)
@@ -105,7 +105,7 @@ static void pcibios_fixup_device_resources(struct pci_dev *dev,
        struct pci_bus *bus)
 {
        /* Update device resources.  */
-       struct pci_channel *chan = bus->sysdata;
+       struct pci_channel *hose = bus->sysdata;
        unsigned long offset = 0;
        int i;
 
@@ -115,9 +115,9 @@ static void pcibios_fixup_device_resources(struct pci_dev *dev,
                if (dev->resource[i].flags & IORESOURCE_PCI_FIXED)
                        continue;
                if (dev->resource[i].flags & IORESOURCE_IO)
-                       offset = chan->io_base;
+                       offset = hose->io_offset;
                else if (dev->resource[i].flags & IORESOURCE_MEM)
-                       offset = 0;
+                       offset = hose->mem_offset;
 
                dev->resource[i].start += offset;
                dev->resource[i].end += offset;
@@ -150,13 +150,13 @@ void __devinit __weak pcibios_fixup_bus(struct pci_bus *bus)
 void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
                         struct resource *res)
 {
-       struct pci_channel *chan = dev->sysdata;
+       struct pci_channel *hose = dev->sysdata;
        unsigned long offset = 0;
 
        if (res->flags & IORESOURCE_IO)
-               offset = chan->io_base;
+               offset = hose->io_offset;
        else if (res->flags & IORESOURCE_MEM)
-               offset = 0;
+               offset = hose->mem_offset;
 
        region->start = res->start - offset;
        region->end = res->end - offset;
@@ -166,13 +166,13 @@ void __devinit
 pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
                        struct pci_bus_region *region)
 {
-       struct pci_channel *chan = dev->sysdata;
+       struct pci_channel *hose = dev->sysdata;
        unsigned long offset = 0;
 
        if (res->flags & IORESOURCE_IO)
-               offset = chan->io_base;
+               offset = hose->io_offset;
        else if (res->flags & IORESOURCE_MEM)
-               offset = 0;
+               offset = hose->mem_offset;
 
        res->start = region->start + offset;
        res->end = region->end + offset;
index 4dd6e3b..57a3b87 100644 (file)
@@ -34,7 +34,9 @@ static struct resource sh7785_mem_resource = {
 static struct pci_channel sh7780_pci_controller = {
        .pci_ops        = &sh4_pci_ops,
        .mem_resource   = &sh7785_mem_resource,
+       .mem_offset     = 0x00000000,
        .io_resource    = &sh7785_io_resource,
+       .io_offset      = 0x00000000,
 };
 
 static struct sh4_pci_address_map sh7780_pci_map = {
index e057ebd..0be2052 100644 (file)
@@ -25,6 +25,9 @@ struct pci_channel {
        struct resource         *io_resource;
        struct resource         *mem_resource;
 
+       unsigned long           io_offset;
+       unsigned long           mem_offset;
+
        int                     first_devfn;
        int                     last_devfn;
        int                     enabled;