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>
61 lines
1.9 KiB
C
61 lines
1.9 KiB
C
/*
|
|
* arch/sh/drivers/pci/fixups-sdk7780.c
|
|
*
|
|
* PCI fixups for the SDK7780SE03
|
|
*
|
|
* Copyright (C) 2003 Lineo uSolutions, Inc.
|
|
* Copyright (C) 2004 - 2006 Paul Mundt
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file "COPYING" in the main directory of this archive
|
|
* for more details.
|
|
*/
|
|
#include <linux/pci.h>
|
|
#include "pci-sh4.h"
|
|
#include <asm/io.h>
|
|
|
|
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(chan, 0x0000C3FF, SH7780_PCIIMR);
|
|
pci_write_reg(chan, 0x0000380F, SH7780_PCIAINTM);
|
|
|
|
/* Set up standard PCI config registers */
|
|
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(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(chan, 0x00000000, SH7780_PCIMBAR1);
|
|
pci_write_reg(chan, 0x00000000, SH7780_PCILAR1);
|
|
pci_write_reg(chan, 0x00000000, SH7780_PCILSR1);
|
|
|
|
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(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(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(chan, 0xA5000C01, SH7780_PCICR);
|
|
|
|
return 0;
|
|
}
|