]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
sh: pass along struct pci_channel
authorMagnus Damm <damm@igel.co.jp>
Wed, 11 Mar 2009 06:41:51 +0000 (15:41 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Thu, 16 Apr 2009 07:00:12 +0000 (16:00 +0900)
These patches rework the pci code for the sh architecture.

Currently each board implements some kind of ioport to address mapping.
Some boards use generic_io_base others try passing addresses as io ports.
This is the first set of patches that try to unify the pci code as much
as possible to avoid duplicated code. This will in the end lead to fewer
lines board specific code and more generic code.

This patch makes sure a struct pci_channel pointer is passed along to
various pci functions such as pci_read_reg(), pci_write_reg(),
pci_fixup_pcic(), sh7751_pcic_init() and sh7780_pcic_init().

Signed-off-by: Magnus Damm <damm@igel.co.jp>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
19 files changed:
arch/sh/drivers/pci/fixups-lboxre2.c
arch/sh/drivers/pci/fixups-r7780rp.c
arch/sh/drivers/pci/fixups-rts7751r2d.c
arch/sh/drivers/pci/fixups-sdk7780.c
arch/sh/drivers/pci/fixups-se7780.c
arch/sh/drivers/pci/ops-landisk.c
arch/sh/drivers/pci/ops-lboxre2.c
arch/sh/drivers/pci/ops-r7780rp.c
arch/sh/drivers/pci/ops-rts7751r2d.c
arch/sh/drivers/pci/ops-sdk7780.c
arch/sh/drivers/pci/ops-se7780.c
arch/sh/drivers/pci/ops-sh4.c
arch/sh/drivers/pci/ops-snapgear.c
arch/sh/drivers/pci/ops-titan.c
arch/sh/drivers/pci/pci-sh4.h
arch/sh/drivers/pci/pci-sh7751.c
arch/sh/drivers/pci/pci-sh7751.h
arch/sh/drivers/pci/pci-sh7780.c
arch/sh/drivers/pci/pci-sh7780.h

index 1c1d41255ec0fd16c12f0db70749e94e74431d10..a82011d03cb0a01e1787ea00345178422570acc3 100644 (file)
@@ -9,33 +9,34 @@
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
  */
+#include <linux/pci.h>
 #include "pci-sh4.h"
 
 #define PCIMCR_MRSET_OFF       0xBFFFFFFF
 #define PCIMCR_RFSH_OFF                0xFFFFFFFB
 
-int pci_fixup_pcic(void)
+int pci_fixup_pcic(struct pci_channel *chan)
 {
        unsigned long bcr1, mcr;
 
        bcr1 = ctrl_inl(SH7751_BCR1);
        bcr1 |= 0x40080000;     /* Enable Bit 19 BREQEN, set PCIC to slave */
-       pci_write_reg(bcr1, SH4_PCIBCR1);
+       pci_write_reg(chan, bcr1, SH4_PCIBCR1);
 
        /* Enable all interrupts, so we known what to fix */
-       pci_write_reg(0x0000c3ff, SH4_PCIINTM);
-       pci_write_reg(0x0000380f, SH4_PCIAINTM);
-       pci_write_reg(0xfb900047, SH7751_PCICONF1);
-       pci_write_reg(0xab000001, SH7751_PCICONF4);
+       pci_write_reg(chan, 0x0000c3ff, SH4_PCIINTM);
+       pci_write_reg(chan, 0x0000380f, SH4_PCIAINTM);
+       pci_write_reg(chan, 0xfb900047, SH7751_PCICONF1);
+       pci_write_reg(chan, 0xab000001, SH7751_PCICONF4);
 
        mcr = ctrl_inl(SH7751_MCR);
        mcr = (mcr & PCIMCR_MRSET_OFF) & PCIMCR_RFSH_OFF;
-       pci_write_reg(mcr, SH4_PCIMCR);
+       pci_write_reg(chan, mcr, SH4_PCIMCR);
 
-       pci_write_reg(0x0c000000, SH7751_PCICONF5);
-       pci_write_reg(0xd0000000, SH7751_PCICONF6);
-       pci_write_reg(0x0c000000, SH4_PCILAR0);
-       pci_write_reg(0x00000000, SH4_PCILAR1);
+       pci_write_reg(chan, 0x0c000000, SH7751_PCICONF5);
+       pci_write_reg(chan, 0xd0000000, SH7751_PCICONF6);
+       pci_write_reg(chan, 0x0c000000, SH4_PCILAR0);
+       pci_write_reg(chan, 0x00000000, SH4_PCILAR1);
 
        return 0;
 }
index 3e321df65d22a9a7723f630496405bdca854e17b..5b25021bbd62a0cb2ad63ee1fcfc9f9208ae799a 100644 (file)
 #include "pci-sh4.h"
 #include <asm/io.h>
 
-int pci_fixup_pcic(void)
+int pci_fixup_pcic(struct pci_channel *chan)
 {
-       pci_write_reg(0x000043ff, SH4_PCIINTM);
-       pci_write_reg(0x0000380f, SH4_PCIAINTM);
+       pci_write_reg(chan, 0x000043ff, SH4_PCIINTM);
+       pci_write_reg(chan, 0x0000380f, SH4_PCIAINTM);
 
-       pci_write_reg(0xfbb00047, SH7780_PCICMD);
-       pci_write_reg(0x00000000, SH7780_PCIIBAR);
+       pci_write_reg(chan, 0xfbb00047, SH7780_PCICMD);
+       pci_write_reg(chan, 0x00000000, SH7780_PCIIBAR);
 
-       pci_write_reg(0x00011912, SH7780_PCISVID);
-       pci_write_reg(0x08000000, SH7780_PCICSCR0);
-       pci_write_reg(0x0000001b, SH7780_PCICSAR0);
-       pci_write_reg(0xfd000000, SH7780_PCICSCR1);
-       pci_write_reg(0x0000000f, SH7780_PCICSAR1);
+       pci_write_reg(chan, 0x00011912, SH7780_PCISVID);
+       pci_write_reg(chan, 0x08000000, SH7780_PCICSCR0);
+       pci_write_reg(chan, 0x0000001b, SH7780_PCICSAR0);
+       pci_write_reg(chan, 0xfd000000, SH7780_PCICSCR1);
+       pci_write_reg(chan, 0x0000000f, SH7780_PCICSAR1);
 
-       pci_write_reg(0xfd000000, SH7780_PCIMBR0);
-       pci_write_reg(0x00fc0000, SH7780_PCIMBMR0);
+       pci_write_reg(chan, 0xfd000000, SH7780_PCIMBR0);
+       pci_write_reg(chan, 0x00fc0000, SH7780_PCIMBMR0);
 
 #ifdef CONFIG_32BIT
-       pci_write_reg(0xc0000000, SH7780_PCIMBR2);
-       pci_write_reg(0x20000000 - SH7780_PCI_IO_SIZE, SH7780_PCIMBMR2);
+       pci_write_reg(chan, 0xc0000000, SH7780_PCIMBR2);
+       pci_write_reg(chan, 0x20000000 - SH7780_PCI_IO_SIZE, SH7780_PCIMBMR2);
 #endif
 
        /* Set IOBR for windows containing area specified in pci.h */
-       pci_write_reg((PCIBIOS_MIN_IO & ~(SH7780_PCI_IO_SIZE - 1)),
+       pci_write_reg(chan, (PCIBIOS_MIN_IO & ~(SH7780_PCI_IO_SIZE - 1)),
                      SH7780_PCIIOBR);
-       pci_write_reg(((SH7780_PCI_IO_SIZE-1) & (7<<18)), SH7780_PCIIOBMR);
+       pci_write_reg(chan, ((SH7780_PCI_IO_SIZE-1) & (7<<18)),
+                     SH7780_PCIIOBMR);
 
        return 0;
 }
index 904bce8768d3b2360899cfdf97c00d44b11b4beb..38852334d4791e6a3f2f1d7fcadafb7fa1d5ce1e 100644 (file)
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
  */
+#include <linux/pci.h>
 #include "pci-sh4.h"
 
 #define PCIMCR_MRSET_OFF       0xBFFFFFFF
 #define PCIMCR_RFSH_OFF                0xFFFFFFFB
 
-int pci_fixup_pcic(void)
+int pci_fixup_pcic(struct pci_channel *chan)
 {
        unsigned long bcr1, mcr;
 
        bcr1 = ctrl_inl(SH7751_BCR1);
        bcr1 |= 0x40080000;     /* Enable Bit 19 BREQEN, set PCIC to slave */
-       pci_write_reg(bcr1, SH4_PCIBCR1);
+       pci_write_reg(chan, bcr1, SH4_PCIBCR1);
 
        /* Enable all interrupts, so we known what to fix */
-       pci_write_reg(0x0000c3ff, SH4_PCIINTM);
-       pci_write_reg(0x0000380f, SH4_PCIAINTM);
+       pci_write_reg(chan, 0x0000c3ff, SH4_PCIINTM);
+       pci_write_reg(chan, 0x0000380f, SH4_PCIAINTM);
 
-       pci_write_reg(0xfb900047, SH7751_PCICONF1);
-       pci_write_reg(0xab000001, SH7751_PCICONF4);
+       pci_write_reg(chan, 0xfb900047, SH7751_PCICONF1);
+       pci_write_reg(chan, 0xab000001, SH7751_PCICONF4);
 
        mcr = ctrl_inl(SH7751_MCR);
        mcr = (mcr & PCIMCR_MRSET_OFF) & PCIMCR_RFSH_OFF;
-       pci_write_reg(mcr, SH4_PCIMCR);
+       pci_write_reg(chan, mcr, SH4_PCIMCR);
 
-       pci_write_reg(0x0c000000, SH7751_PCICONF5);
-       pci_write_reg(0xd0000000, SH7751_PCICONF6);
-       pci_write_reg(0x0c000000, SH4_PCILAR0);
-       pci_write_reg(0x00000000, SH4_PCILAR1);
+       pci_write_reg(chan, 0x0c000000, SH7751_PCICONF5);
+       pci_write_reg(chan, 0xd0000000, SH7751_PCICONF6);
+       pci_write_reg(chan, 0x0c000000, SH4_PCILAR0);
+       pci_write_reg(chan, 0x00000000, SH4_PCILAR1);
 
        return 0;
 }
index 2f8863099dd1572bed0d4ed0d7ab764d226fe8b9..3f6754a120ed5e0e186c7ecb2a5798c5619f4fa7 100644 (file)
 #include "pci-sh4.h"
 #include <asm/io.h>
 
-int pci_fixup_pcic(void)
+int pci_fixup_pcic(struct pci_channel *chan)
 {
        ctrl_outl(0x00000001, SH7780_PCI_VCR2);
 
        /* Enable all interrupts, so we know what to fix */
-       pci_write_reg(0x0000C3FF, SH7780_PCIIMR);
-       pci_write_reg(0x0000380F, SH7780_PCIAINTM);
+       pci_write_reg(chan, 0x0000C3FF, SH7780_PCIIMR);
+       pci_write_reg(chan, 0x0000380F, SH7780_PCIAINTM);
 
        /* Set up standard PCI config registers */
-       pci_write_reg(0xFB00, SH7780_PCISTATUS);
-       pci_write_reg(0x0047, SH7780_PCICMD);
-       pci_write_reg(0x00, SH7780_PCIPIF);
-       pci_write_reg(0x00, SH7780_PCISUB);
-       pci_write_reg(0x06, SH7780_PCIBCC);
-       pci_write_reg(0x1912, SH7780_PCISVID);
-       pci_write_reg(0x0001, SH7780_PCISID);
+       pci_write_reg(chan, 0xFB00, SH7780_PCISTATUS);
+       pci_write_reg(chan, 0x0047, SH7780_PCICMD);
+       pci_write_reg(chan, 0x00, SH7780_PCIPIF);
+       pci_write_reg(chan, 0x00, SH7780_PCISUB);
+       pci_write_reg(chan, 0x06, SH7780_PCIBCC);
+       pci_write_reg(chan, 0x1912, SH7780_PCISVID);
+       pci_write_reg(chan, 0x0001, SH7780_PCISID);
 
-       pci_write_reg(0x08000000, SH7780_PCIMBAR0);     /* PCI */
-       pci_write_reg(0x08000000, SH7780_PCILAR0);      /* SHwy */
-       pci_write_reg(0x07F00001, SH7780_PCILSR);       /* size 128M w/ MBAR */
+       pci_write_reg(chan, 0x08000000, SH7780_PCIMBAR0);       /* PCI */
+       pci_write_reg(chan, 0x08000000, SH7780_PCILAR0);        /* SHwy */
+       pci_write_reg(chan, 0x07F00001, SH7780_PCILSR); /* size 128M w/ MBAR */
 
-       pci_write_reg(0x00000000, SH7780_PCIMBAR1);
-       pci_write_reg(0x00000000, SH7780_PCILAR1);
-       pci_write_reg(0x00000000, SH7780_PCILSR1);
+       pci_write_reg(chan, 0x00000000, SH7780_PCIMBAR1);
+       pci_write_reg(chan, 0x00000000, SH7780_PCILAR1);
+       pci_write_reg(chan, 0x00000000, SH7780_PCILSR1);
 
-       pci_write_reg(0xAB000801, SH7780_PCIIBAR);
+       pci_write_reg(chan, 0xAB000801, SH7780_PCIIBAR);
 
        /*
         * Set the MBR so PCI address is one-to-one with window,
         * meaning all calls go straight through... use ifdef to
         * catch erroneous assumption.
         */
-       pci_write_reg(0xFD000000 , SH7780_PCIMBR0);
-       pci_write_reg(0x00FC0000 , SH7780_PCIMBMR0);    /* 16M */
+       pci_write_reg(chan, 0xFD000000 , SH7780_PCIMBR0);
+       pci_write_reg(chan, 0x00FC0000 , SH7780_PCIMBMR0);      /* 16M */
 
        /* Set IOBR for window containing area specified in pci.h */
-       pci_write_reg(PCIBIOS_MIN_IO & ~(SH7780_PCI_IO_SIZE-1), SH7780_PCIIOBR);
-       pci_write_reg((SH7780_PCI_IO_SIZE-1) & (7 << 18), SH7780_PCIIOBMR);
+       pci_write_reg(chan, PCIBIOS_MIN_IO & ~(SH7780_PCI_IO_SIZE-1),
+                     SH7780_PCIIOBR);
+       pci_write_reg(chan, (SH7780_PCI_IO_SIZE-1) & (7 << 18),
+                     SH7780_PCIIOBMR);
 
-       pci_write_reg(0xA5000C01, SH7780_PCICR);
+       pci_write_reg(chan, 0xA5000C01, SH7780_PCICR);
 
        return 0;
 }
index 880cea1c0d89d62bdf22d3dacd79b24de0fd8164..b8e735e01c3c77436946a97e32e27abec0ba22a0 100644 (file)
 #include "pci-sh4.h"
 #include <asm/io.h>
 
-int pci_fixup_pcic(void)
+int pci_fixup_pcic(struct pci_channel *chan)
 {
        ctrl_outl(0x00000001, SH7780_PCI_VCR2);
 
        /* Enable all interrupts, so we know what to fix */
-       pci_write_reg(0x0000C3FF, SH7780_PCIIMR);
-       pci_write_reg(0x0000380F, SH7780_PCIAINTM);
+       pci_write_reg(chan, 0x0000C3FF, SH7780_PCIIMR);
+       pci_write_reg(chan, 0x0000380F, SH7780_PCIAINTM);
 
        /* Set up standard PCI config registers */
        ctrl_outw(0xFB00, PCI_REG(SH7780_PCISTATUS));
@@ -32,29 +32,31 @@ int pci_fixup_pcic(void)
        ctrl_outw(0x1912, PCI_REG(SH7780_PCISVID));
        ctrl_outw(0x0001, PCI_REG(SH7780_PCISID));
 
-       pci_write_reg(0x08000000, SH7780_PCIMBAR0);     /* PCI */
-       pci_write_reg(0x08000000, SH7780_PCILAR0);     /* SHwy */
-       pci_write_reg(0x07F00001, SH7780_PCILSR);      /* size 128M w/ MBAR */
+       pci_write_reg(chan, 0x08000000, SH7780_PCIMBAR0);     /* PCI */
+       pci_write_reg(chan, 0x08000000, SH7780_PCILAR0);     /* SHwy */
+       pci_write_reg(chan, 0x07F00001, SH7780_PCILSR); /* size 128M w/ MBAR */
 
-       pci_write_reg(0x00000000, SH7780_PCIMBAR1);
-       pci_write_reg(0x00000000, SH7780_PCILAR1);
-       pci_write_reg(0x00000000, SH7780_PCILSR1);
+       pci_write_reg(chan, 0x00000000, SH7780_PCIMBAR1);
+       pci_write_reg(chan, 0x00000000, SH7780_PCILAR1);
+       pci_write_reg(chan, 0x00000000, SH7780_PCILSR1);
 
-       pci_write_reg(0xAB000801, SH7780_PCIIBAR);
+       pci_write_reg(chan, 0xAB000801, SH7780_PCIIBAR);
 
        /*
         * Set the MBR so PCI address is one-to-one with window,
         * meaning all calls go straight through... use ifdef to
         * catch erroneous assumption.
         */
-       pci_write_reg(0xFD000000 , SH7780_PCIMBR0);
-       pci_write_reg(0x00FC0000 , SH7780_PCIMBMR0);    /* 16M */
+       pci_write_reg(chan, 0xFD000000 , SH7780_PCIMBR0);
+       pci_write_reg(chan, 0x00FC0000 , SH7780_PCIMBMR0);    /* 16M */
 
        /* Set IOBR for window containing area specified in pci.h */
-       pci_write_reg(PCIBIOS_MIN_IO & ~(SH7780_PCI_IO_SIZE-1), SH7780_PCIIOBR);
-       pci_write_reg((SH7780_PCI_IO_SIZE-1) & (7 << 18), SH7780_PCIIOBMR);
+       pci_write_reg(chan, PCIBIOS_MIN_IO & ~(SH7780_PCI_IO_SIZE-1),
+                     SH7780_PCIIOBR);
+       pci_write_reg(chan, (SH7780_PCI_IO_SIZE-1) & (7 << 18),
+                     SH7780_PCIIOBMR);
 
-       pci_write_reg(0xA5000C01, SH7780_PCICR);
+       pci_write_reg(chan, 0xA5000C01, SH7780_PCICR);
 
        return 0;
 }
index bff09ecf34198a1d5f91e3233038d06b2b4323cb..343c072a5a7960408b9d56520b271a30a255c007 100644 (file)
@@ -45,7 +45,7 @@ static struct sh4_pci_address_map sh7751_pci_map = {
 
 int __init pcibios_init_platform(void)
 {
-       return sh7751_pcic_init(&sh7751_pci_map);
+       return sh7751_pcic_init(&board_pci_channels[0], &sh7751_pci_map);
 }
 
 int pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin)
index 86c0b6fb7375a3a794acf613407768c684bda699..8bff32a22101e5e39e75ff39f87c8d9d31172d25 100644 (file)
@@ -59,5 +59,5 @@ static struct sh4_pci_address_map sh7751_pci_map = {
 
 int __init pcibios_init_platform(void)
 {
-       return sh7751_pcic_init(&sh7751_pci_map);
+       return sh7751_pcic_init(&board_pci_channels[0], &sh7751_pci_map);
 }
index 8555238e63eb832ab797de3ff07bad4b57089363..bf32ee8b1321b45c2ed346296651e4b467d83ded 100644 (file)
@@ -64,5 +64,5 @@ static struct sh4_pci_address_map sh7780_pci_map = {
 
 int __init pcibios_init_platform(void)
 {
-       return sh7780_pcic_init(&sh7780_pci_map);
+       return sh7780_pcic_init(&board_pci_channels[0], &sh7780_pci_map);
 }
index d6ca74b25d5f45e3eed5cd8fe8acb08030cc837d..e4208a697321d26d04881a992617587dc5994196 100644 (file)
@@ -69,6 +69,6 @@ static struct sh4_pci_address_map sh7751_pci_map = {
 int __init pcibios_init_platform(void)
 {
        __set_io_port_base(SH7751_PCI_IO_BASE);
-       return sh7751_pcic_init(&sh7751_pci_map);
+       return sh7751_pcic_init(&board_pci_channels[0], &sh7751_pci_map);
 }
 
index 4dcc64184b235e198a5c08c08a72c92cb52dff2f..21d59d4a2150ddb3fca09dfa64c6a5af0b466598 100644 (file)
@@ -69,5 +69,5 @@ static struct sh4_pci_address_map sdk7780_pci_map = {
 int __init pcibios_init_platform(void)
 {
        printk(KERN_INFO "SH7780 PCI: Finished initializing PCI controller\n");
-       return sh7780_pcic_init(&sdk7780_pci_map);
+       return sh7780_pcic_init(&board_pci_channels[0], &sdk7780_pci_map);
 }
index 3145c62484d618be0d3453d05d0a2c2b383dda97..78a6f2bc4f12b93f4c41dcdfcc35cd9433fbce18 100644 (file)
@@ -92,5 +92,5 @@ int __init pcibios_init_platform(void)
        ctrl_outw(0x0013, FPGA_PCI_INTSEL1);
        ctrl_outw(0xE402, FPGA_PCI_INTSEL2);
 
-       return sh7780_pcic_init(&se7780_pci_map);
+       return sh7780_pcic_init(&board_pci_channels[0], &se7780_pci_map);
 }
index 710a3b0306e59739c8b6b9b0e4157fc267dd8bbc..92d27f734f2e7dfc9ee27511d3d875223610da6d 100644 (file)
@@ -34,8 +34,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(CONFIG_CMD(bus, devfn, where), SH4_PCIPAR);
-       data = pci_read_reg(SH4_PCIPDR);
+       pci_write_reg(NULL, CONFIG_CMD(bus, devfn, where), SH4_PCIPAR);
+       data = pci_read_reg(NULL, SH4_PCIPDR);
        spin_unlock_irqrestore(&sh4_pci_lock, flags);
 
        switch (size) {
@@ -68,8 +68,8 @@ static int sh4_pci_write(struct pci_bus *bus, unsigned int devfn,
        u32 data;
 
        spin_lock_irqsave(&sh4_pci_lock, flags);
-       pci_write_reg(CONFIG_CMD(bus, devfn, where), SH4_PCIPAR);
-       data = pci_read_reg(SH4_PCIPDR);
+       pci_write_reg(NULL, CONFIG_CMD(bus, devfn, where), SH4_PCIPAR);
+       data = pci_read_reg(NULL, SH4_PCIPDR);
        spin_unlock_irqrestore(&sh4_pci_lock, flags);
 
        switch (size) {
@@ -90,7 +90,7 @@ static int sh4_pci_write(struct pci_bus *bus, unsigned int devfn,
                return PCIBIOS_FUNC_NOT_SUPPORTED;
        }
 
-       pci_write_reg(data, SH4_PCIPDR);
+       pci_write_reg(NULL, data, SH4_PCIPDR);
 
        return PCIBIOS_SUCCESSFUL;
 }
@@ -106,25 +106,25 @@ struct pci_ops sh4_pci_ops = {
  */
 static unsigned int pci_probe = PCI_PROBE_CONF1;
 
-int __init sh4_pci_check_direct(void)
+int __init sh4_pci_check_direct(struct pci_channel *chan)
 {
        /*
         * Check if configuration works.
         */
        if (pci_probe & PCI_PROBE_CONF1) {
-               unsigned int tmp = pci_read_reg(SH4_PCIPAR);
+               unsigned int tmp = pci_read_reg(chan, SH4_PCIPAR);
 
-               pci_write_reg(P1SEG, SH4_PCIPAR);
+               pci_write_reg(chan, P1SEG, SH4_PCIPAR);
 
-               if (pci_read_reg(SH4_PCIPAR) == P1SEG) {
-                       pci_write_reg(tmp, SH4_PCIPAR);
+               if (pci_read_reg(chan, SH4_PCIPAR) == P1SEG) {
+                       pci_write_reg(chan, tmp, SH4_PCIPAR);
                        printk(KERN_INFO "PCI: Using configuration type 1\n");
                        request_region(PCI_REG(SH4_PCIPAR), 8, "PCI conf1");
 
                        return 0;
                }
 
-               pci_write_reg(tmp, SH4_PCIPAR);
+               pci_write_reg(chan, tmp, SH4_PCIPAR);
        }
 
        pr_debug("PCI: pci_check_direct failed\n");
@@ -163,7 +163,7 @@ char * __devinit pcibios_setup(char *str)
        return str;
 }
 
-int __attribute__((weak)) pci_fixup_pcic(void)
+int __attribute__((weak)) pci_fixup_pcic(struct pci_channel *chan)
 {
        /* Nothing to do. */
        return 0;
index 53dd893d4e549feddec846c29d8408ab7e865e47..cba80153dde983b0920248a3fa99dc54f42500a5 100644 (file)
@@ -66,7 +66,7 @@ static struct sh4_pci_address_map sh7751_pci_map = {
  */
 int __init pcibios_init_platform(void)
 {
-       return sh7751_pcic_init(&sh7751_pci_map);
+       return sh7751_pcic_init(&board_pci_channels[0], &sh7751_pci_map);
 }
 
 int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin)
index a8f7801a34afb038451daf47e2c5cc717aa592d6..69fcc5c5d5204947fb150b76bf33af0b8b038be1 100644 (file)
@@ -73,5 +73,5 @@ static struct sh4_pci_address_map sh7751_pci_map = {
 
 int __init pcibios_init_platform(void)
 {
-       return sh7751_pcic_init(&sh7751_pci_map);
+       return sh7751_pcic_init(&board_pci_channels[0], &sh7751_pci_map);
 }
index a83dcf70c13b1734a2b936f8622a70f5776624d8..62ba35056087a3ca434545b1f4a39039de1e280c 100644 (file)
 
 /* arch/sh/kernel/drivers/pci/ops-sh4.c */
 extern struct pci_ops sh4_pci_ops;
-int sh4_pci_check_direct(void);
-int pci_fixup_pcic(void);
+int sh4_pci_check_direct(struct pci_channel *chan);
+int pci_fixup_pcic(struct pci_channel *chan);
 
 struct sh4_pci_address_space {
        unsigned long base;
@@ -168,13 +168,16 @@ struct sh4_pci_address_map {
        unsigned long flags;
 };
 
-static inline void pci_write_reg(unsigned long val, unsigned long reg)
+static inline void pci_write_reg(struct pci_channel *chan,
+                                unsigned long val, unsigned long reg)
 {
        ctrl_outl(val, PCI_REG(reg));
 }
 
-static inline unsigned long pci_read_reg(unsigned long reg)
+static inline unsigned long pci_read_reg(struct pci_channel *chan,
+                                        unsigned long reg)
 {
        return ctrl_inl(PCI_REG(reg));
 }
+
 #endif /* __PCI_SH4_H */
index 3065eb184f01c72c8b5e7f5a1ec4a177e4ce3def..9c2c01490d626c86decbe76d58409edaeca7316a 100644 (file)
@@ -40,21 +40,22 @@ static int __init sh7751_pci_init(void)
        pr_debug("PCI: Starting intialization.\n");
 
        /* check for SH7751/SH7751R hardware */
-       id = pci_read_reg(SH7751_PCICONF0);
+       id = pci_read_reg(NULL, SH7751_PCICONF0);
        if (id != ((SH7751_DEVICE_ID << 16) | SH7751_VENDOR_ID) &&
            id != ((SH7751R_DEVICE_ID << 16) | SH7751_VENDOR_ID)) {
                pr_debug("PCI: This is not an SH7751(R) (%x)\n", id);
                return -ENODEV;
        }
 
-       if ((ret = sh4_pci_check_direct()) != 0)
+       if ((ret = sh4_pci_check_direct(NULL)) != 0)
                return ret;
 
        return pcibios_init_platform();
 }
 subsys_initcall(sh7751_pci_init);
 
-static int __init __area_sdram_check(unsigned int area)
+static int __init __area_sdram_check(struct pci_channel *chan,
+                                    unsigned int area)
 {
        u32 word;
 
@@ -65,7 +66,7 @@ static int __init __area_sdram_check(unsigned int area)
                       area, word);
                return 0;
        }
-       pci_write_reg(word, SH4_PCIBCR1);
+       pci_write_reg(chan, word, SH4_PCIBCR1);
 
        word = (u16)ctrl_inw(SH7751_BCR2);
        /* check BCR2 for 32bit SDRAM interface*/
@@ -74,12 +75,13 @@ static int __init __area_sdram_check(unsigned int area)
                       area, word);
                return 0;
        }
-       pci_write_reg(word, SH4_PCIBCR2);
+       pci_write_reg(chan, word, SH4_PCIBCR2);
 
        return 1;
 }
 
-int __init sh7751_pcic_init(struct sh4_pci_address_map *map)
+int __init sh7751_pcic_init(struct pci_channel *chan,
+                           struct sh4_pci_address_map *map)
 {
        u32 reg;
        u32 word;
@@ -90,10 +92,10 @@ int __init sh7751_pcic_init(struct sh4_pci_address_map *map)
        ctrl_outl(reg, SH7751_BCR1);
 
        /* Turn the clocks back on (not done in reset)*/
-       pci_write_reg(0, SH4_PCICLKR);
+       pci_write_reg(chan, 0, SH4_PCICLKR);
        /* Clear Powerdown IRQ's (not done in reset) */
        word = SH4_PCIPINT_D3 | SH4_PCIPINT_D0;
-       pci_write_reg(word, SH4_PCIPINT);
+       pci_write_reg(chan, word, SH4_PCIPINT);
 
        /*
         * This code is unused for some boards as it is done in the
@@ -103,11 +105,11 @@ int __init sh7751_pcic_init(struct sh4_pci_address_map *map)
        if (!(map->flags & SH4_PCIC_NO_RESET)) {
                /* toggle PCI reset pin */
                word = SH4_PCICR_PREFIX | SH4_PCICR_PRST;
-               pci_write_reg(word, SH4_PCICR);
+               pci_write_reg(chan, word, SH4_PCICR);
                /* Wait for a long time... not 1 sec. but long enough */
                mdelay(100);
                word = SH4_PCICR_PREFIX;
-               pci_write_reg(word, SH4_PCICR);
+               pci_write_reg(chan, word, SH4_PCICR);
        }
 
        /* set the command/status bits to:
@@ -116,11 +118,11 @@ int __init sh7751_pcic_init(struct sh4_pci_address_map *map)
         */
        word = SH7751_PCICONF1_WCC | SH7751_PCICONF1_PER |
               SH7751_PCICONF1_BUM | SH7751_PCICONF1_MES;
-       pci_write_reg(word, SH7751_PCICONF1);
+       pci_write_reg(chan, word, SH7751_PCICONF1);
 
        /* define this host as the host bridge */
        word = PCI_BASE_CLASS_BRIDGE << 24;
-       pci_write_reg(word, SH7751_PCICONF2);
+       pci_write_reg(chan, word, SH7751_PCICONF2);
 
        /* Set IO and Mem windows to local address
         * Make PCI and local address the same for easy 1 to 1 mapping
@@ -128,24 +130,24 @@ int __init sh7751_pcic_init(struct sh4_pci_address_map *map)
         * Window1 = map->window1.size @ cached area base = SDRAM
         */
        word = map->window0.size - 1;
-       pci_write_reg(word, SH4_PCILSR0);
+       pci_write_reg(chan, word, SH4_PCILSR0);
        word = map->window1.size - 1;
-       pci_write_reg(word, SH4_PCILSR1);
+       pci_write_reg(chan, word, SH4_PCILSR1);
        /* Set the values on window 0 PCI config registers */
        word = P2SEGADDR(map->window0.base);
-       pci_write_reg(word, SH4_PCILAR0);
-       pci_write_reg(word, SH7751_PCICONF5);
+       pci_write_reg(chan, word, SH4_PCILAR0);
+       pci_write_reg(chan, word, SH7751_PCICONF5);
        /* Set the values on window 1 PCI config registers */
        word =  PHYSADDR(map->window1.base);
-       pci_write_reg(word, SH4_PCILAR1);
-       pci_write_reg(word, SH7751_PCICONF6);
+       pci_write_reg(chan, word, SH4_PCILAR1);
+       pci_write_reg(chan, word, SH7751_PCICONF6);
 
        /* Set the local 16MB PCI memory space window to
         * the lowest PCI mapped address
         */
        word = PCIBIOS_MIN_MEM & SH4_PCIMBR_MASK;
        pr_debug("PCI: Setting upper bits of Memory window to 0x%x\n", word);
-       pci_write_reg(word , SH4_PCIMBR);
+       pci_write_reg(chan, word , SH4_PCIMBR);
 
        /* Map IO space into PCI IO window
         * The IO window is 64K-PCIBIOS_MIN_IO in size
@@ -160,19 +162,19 @@ int __init sh7751_pcic_init(struct sh4_pci_address_map *map)
         * correctly */
        word = PCIBIOS_MIN_IO & SH4_PCIIOBR_MASK;
        pr_debug("PCI: Setting upper bits of IO window to 0x%x\n", word);
-       pci_write_reg(word, SH4_PCIIOBR);
+       pci_write_reg(chan, word, SH4_PCIIOBR);
 
        /* Set PCI WCRx, BCRx's, copy from BSC locations */
 
        /* check BCR for SDRAM in specified area */
        switch (map->window0.base) {
-       case SH7751_CS0_BASE_ADDR: word = __area_sdram_check(0); break;
-       case SH7751_CS1_BASE_ADDR: word = __area_sdram_check(1); break;
-       case SH7751_CS2_BASE_ADDR: word = __area_sdram_check(2); break;
-       case SH7751_CS3_BASE_ADDR: word = __area_sdram_check(3); break;
-       case SH7751_CS4_BASE_ADDR: word = __area_sdram_check(4); break;
-       case SH7751_CS5_BASE_ADDR: word = __area_sdram_check(5); break;
-       case SH7751_CS6_BASE_ADDR: word = __area_sdram_check(6); break;
+       case SH7751_CS0_BASE_ADDR: word = __area_sdram_check(chan, 0); break;
+       case SH7751_CS1_BASE_ADDR: word = __area_sdram_check(chan, 1); break;
+       case SH7751_CS2_BASE_ADDR: word = __area_sdram_check(chan, 2); break;
+       case SH7751_CS3_BASE_ADDR: word = __area_sdram_check(chan, 3); break;
+       case SH7751_CS4_BASE_ADDR: word = __area_sdram_check(chan, 4); break;
+       case SH7751_CS5_BASE_ADDR: word = __area_sdram_check(chan, 5); break;
+       case SH7751_CS6_BASE_ADDR: word = __area_sdram_check(chan, 6); break;
        }
 
        if (!word)
@@ -180,25 +182,25 @@ int __init sh7751_pcic_init(struct sh4_pci_address_map *map)
 
        /* configure the wait control registers */
        word = ctrl_inl(SH7751_WCR1);
-       pci_write_reg(word, SH4_PCIWCR1);
+       pci_write_reg(chan, word, SH4_PCIWCR1);
        word = ctrl_inl(SH7751_WCR2);
-       pci_write_reg(word, SH4_PCIWCR2);
+       pci_write_reg(chan, word, SH4_PCIWCR2);
        word = ctrl_inl(SH7751_WCR3);
-       pci_write_reg(word, SH4_PCIWCR3);
+       pci_write_reg(chan, word, SH4_PCIWCR3);
        word = ctrl_inl(SH7751_MCR);
-       pci_write_reg(word, SH4_PCIMCR);
+       pci_write_reg(chan, word, SH4_PCIMCR);
 
        /* NOTE: I'm ignoring the PCI error IRQs for now..
         * TODO: add support for the internal error interrupts and
         * DMA interrupts...
         */
 
-       pci_fixup_pcic();
+       pci_fixup_pcic(chan);
 
        /* SH7751 init done, set central function init complete */
        /* use round robin mode to stop a device starving/overruning */
        word = SH4_PCICR_PREFIX | SH4_PCICR_CFIN | SH4_PCICR_ARBM;
-       pci_write_reg(word, SH4_PCICR);
+       pci_write_reg(chan, word, SH4_PCICR);
 
        return 1;
 }
index 68e3cb5e6bec2f5c7804c4b7cb3cff60235ae534..6f101e5a6c834b969a2f8d31036f103ddfa9014f 100644 (file)
 struct sh4_pci_address_map;
 
 /* arch/sh/drivers/pci/pci-sh7751.c */
-int sh7751_pcic_init(struct sh4_pci_address_map *map);
+int sh7751_pcic_init(struct pci_channel *chan,
+                    struct sh4_pci_address_map *map);
 
 #endif /* _PCI_SH7751_H_ */
index bae6a2cf047dc0aace922c908a5a792a2322b82a..56f673f66cb5bea1d2aa1929d06ebf906610e015 100644 (file)
@@ -55,7 +55,7 @@ static int __init sh7780_pci_init(void)
        ctrl_outl(0x00000001, SH7780_PCI_VCR2); /* Enable PCIC */
 
        /* check for SH7780/SH7780R hardware */
-       id = pci_read_reg(SH7780_PCIVID);
+       id = pci_read_reg(NULL, SH7780_PCIVID);
        if ((id & 0xffff) == SH7780_VENDOR_ID) {
                switch ((id >> 16) & 0xffff) {
                case SH7763_DEVICE_ID:
@@ -82,14 +82,15 @@ static int __init sh7780_pci_init(void)
                ctrl_outl(0x33333333, INTC_INTPRI);
        }
 
-       if ((ret = sh4_pci_check_direct()) != 0)
+       if ((ret = sh4_pci_check_direct(NULL)) != 0)
                return ret;
 
        return pcibios_init_platform();
 }
 core_initcall(sh7780_pci_init);
 
-int __init sh7780_pcic_init(struct sh4_pci_address_map *map)
+int __init sh7780_pcic_init(struct pci_channel *chan,
+                           struct sh4_pci_address_map *map)
 {
        u32 word;
 
@@ -101,34 +102,34 @@ int __init sh7780_pcic_init(struct sh4_pci_address_map *map)
        if (!(map->flags & SH4_PCIC_NO_RESET)) {
                /* toggle PCI reset pin */
                word = SH4_PCICR_PREFIX | SH4_PCICR_PRST;
-               pci_write_reg(word, SH4_PCICR);
+               pci_write_reg(chan, word, SH4_PCICR);
                /* Wait for a long time... not 1 sec. but long enough */
                mdelay(100);
                word = SH4_PCICR_PREFIX;
-               pci_write_reg(word, SH4_PCICR);
+               pci_write_reg(chan, word, SH4_PCICR);
        }
 
        /* set the command/status bits to:
         * Wait Cycle Control + Parity Enable + Bus Master +
         * Mem space enable
         */
-       pci_write_reg(0x00000046, SH7780_PCICMD);
+       pci_write_reg(chan, 0x00000046, SH7780_PCICMD);
 
        /* define this host as the host bridge */
        word = PCI_BASE_CLASS_BRIDGE << 24;
-       pci_write_reg(word, SH7780_PCIRID);
+       pci_write_reg(chan, word, SH7780_PCIRID);
 
        /* Set IO and Mem windows to local address
         * Make PCI and local address the same for easy 1 to 1 mapping
         */
-       pci_write_reg(map->window0.size - 0xfffff, SH4_PCILSR0);
-       pci_write_reg(map->window1.size - 0xfffff, SH4_PCILSR1);
+       pci_write_reg(chan, map->window0.size - 0xfffff, SH4_PCILSR0);
+       pci_write_reg(chan, map->window1.size - 0xfffff, SH4_PCILSR1);
        /* Set the values on window 0 PCI config registers */
-       pci_write_reg(map->window0.base, SH4_PCILAR0);
-       pci_write_reg(map->window0.base, SH7780_PCIMBAR0);
+       pci_write_reg(chan, map->window0.base, SH4_PCILAR0);
+       pci_write_reg(chan, map->window0.base, SH7780_PCIMBAR0);
        /* Set the values on window 1 PCI config registers */
-       pci_write_reg(map->window1.base, SH4_PCILAR1);
-       pci_write_reg(map->window1.base, SH7780_PCIMBAR1);
+       pci_write_reg(chan, map->window1.base, SH4_PCILAR1);
+       pci_write_reg(chan, map->window1.base, SH7780_PCIMBAR1);
 
        /* Map IO space into PCI IO window
         * The IO window is 64K-PCIBIOS_MIN_IO in size
@@ -145,12 +146,12 @@ int __init sh7780_pcic_init(struct sh4_pci_address_map *map)
         */
 
        /* Apply any last-minute PCIC fixups */
-       pci_fixup_pcic();
+       pci_fixup_pcic(chan);
 
        /* SH7780 init done, set central function init complete */
        /* use round robin mode to stop a device starving/overruning */
        word = SH4_PCICR_PREFIX | SH4_PCICR_CFIN | SH4_PCICR_FTO;
-       pci_write_reg(word, SH4_PCICR);
+       pci_write_reg(chan, word, SH4_PCICR);
 
        return 1;
 }
index 93adc7119b790df7ae7dc92644a63dbaa22654b0..d34961153d5834040bf3a4487b6891d2d3daf597 100644 (file)
 struct sh4_pci_address_map;
 
 /* arch/sh/drivers/pci/pci-sh7780.c */
-int sh7780_pcic_init(struct sh4_pci_address_map *map);
+int sh7780_pcic_init(struct pci_channel *chan,
+                    struct sh4_pci_address_map *map);
 
 #endif /* _PCI_SH7780_H_ */