sh: hook in struct pci_channel in sysdata
PATCH 4/9 sh: hook in struct pci_channel in sysdata
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 <[email protected]>
---
arch/sh/drivers/pci/ops-sh4.c | 12 +++++++----- arch/sh/drivers/pci/pci-auto.c | 1 + include/asm-sh/pci.h | 6 ++++-- 3 files changed, 12 insertions(+), 7 deletions(-)
arch/sh/drivers/pci/ops-sh4.c +7 -5
@@ -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 ** 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 *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_busreturn PCIBIOS_FUNC_NOT_SUPPORTED ; } -pci_write_reg (NULL , data,SH4_PCIPDR ); +pci_write_reg (chan, data,SH4_PCIPDR );return PCIBIOS_SUCCESSFUL ; }
arch/sh/drivers/pci/pci-auto.c +1 -0
@@ -67,6 +67,7 @@ static struct pci_dev *fake_pci_dev(stru dev.devfn = devfn; bus.number = busnr; bus.ops = hose->pci_ops; + bus.sysdata = hose;if (busnr != top_bus)/* Fake a parent bus structure. */
include/asm-sh/pci.h +4 -2
@@ -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