sh: hook in struct pci_channel in sysdata
authorMagnus Damm <magnus.damm@gmail.com>
Tue, 19 Feb 2008 12:34:55 +0000 (21:34 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Thu, 16 Apr 2009 07:00:13 +0000 (16:00 +0900)
Store a struct pci_channel pointer in bus->sysdata. This makes whatever
struct pci_channel assigned to a bus available for sh4_pci_read() and
sh4_pci_write(). We also modify PCIBIOS_MIN_IO and PCIBIOS_MIN_MEM to
use bus->sysdata - this to gives us support for multiple pci channels.

Signed-off-by: Magnus Damm <damm@igel.co.jp>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/sh/drivers/pci/ops-sh4.c
arch/sh/drivers/pci/pci-auto.c
arch/sh/include/asm/pci.h

index 92d27f7..ee62e6d 100644 (file)
@@ -26,6 +26,7 @@ static DEFINE_SPINLOCK(sh4_pci_lock);
 static int sh4_pci_read(struct pci_bus *bus, unsigned int devfn,
                           int where, int size, u32 *val)
 {
+       struct pci_channel *chan = bus->sysdata;
        unsigned long flags;
        u32 data;
 
@@ -34,8 +35,8 @@ static int sh4_pci_read(struct pci_bus *bus, unsigned int devfn,
         * so we must do byte alignment by hand
         */
        spin_lock_irqsave(&sh4_pci_lock, flags);
-       pci_write_reg(NULL, CONFIG_CMD(bus, devfn, where), SH4_PCIPAR);
-       data = pci_read_reg(NULL, SH4_PCIPDR);
+       pci_write_reg(chan, CONFIG_CMD(bus, devfn, where), SH4_PCIPAR);
+       data = pci_read_reg(chan, SH4_PCIPDR);
        spin_unlock_irqrestore(&sh4_pci_lock, flags);
 
        switch (size) {
@@ -63,13 +64,14 @@ static int sh4_pci_read(struct pci_bus *bus, unsigned int devfn,
 static int sh4_pci_write(struct pci_bus *bus, unsigned int devfn,
                         int where, int size, u32 val)
 {
+       struct pci_channel *chan = bus->sysdata;
        unsigned long flags;
        int shift;
        u32 data;
 
        spin_lock_irqsave(&sh4_pci_lock, flags);
-       pci_write_reg(NULL, CONFIG_CMD(bus, devfn, where), SH4_PCIPAR);
-       data = pci_read_reg(NULL, SH4_PCIPDR);
+       pci_write_reg(chan, CONFIG_CMD(bus, devfn, where), SH4_PCIPAR);
+       data = pci_read_reg(chan, SH4_PCIPDR);
        spin_unlock_irqrestore(&sh4_pci_lock, flags);
 
        switch (size) {
@@ -90,7 +92,7 @@ static int sh4_pci_write(struct pci_bus *bus, unsigned int devfn,
                return PCIBIOS_FUNC_NOT_SUPPORTED;
        }
 
-       pci_write_reg(NULL, data, SH4_PCIPDR);
+       pci_write_reg(chan, data, SH4_PCIPDR);
 
        return PCIBIOS_SUCCESSFUL;
 }
index cf48b12..1d715ec 100644 (file)
@@ -67,6 +67,7 @@ static struct pci_dev *fake_pci_dev(struct pci_channel *hose,
        dev.devfn = devfn;
        bus.number = busnr;
        bus.ops = hose->pci_ops;
+       bus.sysdata = hose;
 
        if(busnr != top_bus)
                /* Fake a parent bus structure. */
index 5c7a8f1..386587e 100644 (file)
@@ -31,8 +31,10 @@ struct pci_channel {
  */
 extern struct pci_channel board_pci_channels[];
 
-#define PCIBIOS_MIN_IO         board_pci_channels->io_resource->start
-#define PCIBIOS_MIN_MEM                board_pci_channels->mem_resource->start
+/* ugly as hell, but makes drivers/pci/setup-res.c compile and work */
+#define __PCI_CHAN(bus)                ((struct pci_channel *)bus->sysdata)
+#define PCIBIOS_MIN_IO         __PCI_CHAN(bus)->io_resource->start
+#define PCIBIOS_MIN_MEM                __PCI_CHAN(bus)->mem_resource->start
 
 /*
  * I/O routine helpers