Skip to content

Commit

Permalink
sh: pass along struct pci_channel
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Magnus Damm authored and Paul Mundt committed Apr 16, 2009
1 parent 3ee8da8 commit b8b47bf
Show file tree
Hide file tree
Showing 19 changed files with 164 additions and 149 deletions.
23 changes: 12 additions & 11 deletions arch/sh/drivers/pci/fixups-lboxre2.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
33 changes: 17 additions & 16 deletions arch/sh/drivers/pci/fixups-r7780rp.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,32 +14,33 @@
#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;
}
23 changes: 12 additions & 11 deletions arch/sh/drivers/pci/fixups-rts7751r2d.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,34 +10,35 @@
* 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;
}
46 changes: 24 additions & 22 deletions arch/sh/drivers/pci/fixups-sdk7780.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,46 +14,48 @@
#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;
}
32 changes: 17 additions & 15 deletions arch/sh/drivers/pci/fixups-se7780.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,13 @@
#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));
Expand All @@ -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;
}
2 changes: 1 addition & 1 deletion arch/sh/drivers/pci/ops-landisk.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion arch/sh/drivers/pci/ops-lboxre2.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
2 changes: 1 addition & 1 deletion arch/sh/drivers/pci/ops-r7780rp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
2 changes: 1 addition & 1 deletion arch/sh/drivers/pci/ops-rts7751r2d.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

2 changes: 1 addition & 1 deletion arch/sh/drivers/pci/ops-sdk7780.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
2 changes: 1 addition & 1 deletion arch/sh/drivers/pci/ops-se7780.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
24 changes: 12 additions & 12 deletions arch/sh/drivers/pci/ops-sh4.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand All @@ -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;
}
Expand All @@ -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");
Expand Down Expand Up @@ -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;
Expand Down
Loading

0 comments on commit b8b47bf

Please sign in to comment.