Commit 532bda5d authored by Lennert Buytenhek's avatar Lennert Buytenhek Committed by Russell King

[ARM] 3438/1: ixp23xx: add pci slave support

Patch from Lennert Buytenhek

On the Double Espresso board, the IXP2350s are PCI slave devices and
we skip calling pci_common_init() as that enumerates the bus.  But even
though we are a PCI slave device, there is still some PCI-related setup
that has to be done.

Create ixp23xx_pci_common_init(), move the common initialisation bits
there, and have this function called from both the PCI master and the
PCI slave init path.
Signed-off-by: default avatarLennert Buytenhek <buytenh@wantstofly.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 50c37e21
...@@ -44,6 +44,15 @@ ...@@ -44,6 +44,15 @@
#include <asm/mach/irq.h> #include <asm/mach/irq.h>
#include <asm/mach/pci.h> #include <asm/mach/pci.h>
static int __init espresso_pci_init(void)
{
if (machine_is_espresso())
ixp23xx_pci_slave_init();
return 0;
};
subsys_initcall(espresso_pci_init);
static void __init espresso_init(void) static void __init espresso_init(void)
{ {
physmap_configure(0x90000000, 0x02000000, 2, NULL); physmap_configure(0x90000000, 0x02000000, 2, NULL);
......
...@@ -201,7 +201,7 @@ int clear_master_aborts(void) ...@@ -201,7 +201,7 @@ int clear_master_aborts(void)
return 0; return 0;
} }
void __init ixp23xx_pci_preinit(void) static void __init ixp23xx_pci_common_init(void)
{ {
#ifdef __ARMEB__ #ifdef __ARMEB__
*IXP23XX_PCI_CONTROL |= 0x20000; /* set I/O swapping */ *IXP23XX_PCI_CONTROL |= 0x20000; /* set I/O swapping */
...@@ -220,6 +220,11 @@ void __init ixp23xx_pci_preinit(void) ...@@ -220,6 +220,11 @@ void __init ixp23xx_pci_preinit(void)
} else { } else {
*IXP23XX_PCI_CPP_ADDR_BITS |= (1 << 1); *IXP23XX_PCI_CPP_ADDR_BITS |= (1 << 1);
} }
}
void __init ixp23xx_pci_preinit(void)
{
ixp23xx_pci_common_init();
hook_fault_code(16+6, ixp23xx_pci_abort_handler, SIGBUS, hook_fault_code(16+6, ixp23xx_pci_abort_handler, SIGBUS,
"PCI config cycle to non-existent device"); "PCI config cycle to non-existent device");
...@@ -273,3 +278,8 @@ int ixp23xx_pci_setup(int nr, struct pci_sys_data *sys) ...@@ -273,3 +278,8 @@ int ixp23xx_pci_setup(int nr, struct pci_sys_data *sys)
return 1; return 1;
} }
void ixp23xx_pci_slave_init(void)
{
ixp23xx_pci_common_init();
}
...@@ -22,6 +22,7 @@ void ixp23xx_sys_init(void); ...@@ -22,6 +22,7 @@ void ixp23xx_sys_init(void);
int ixp23xx_pci_setup(int, struct pci_sys_data *); int ixp23xx_pci_setup(int, struct pci_sys_data *);
void ixp23xx_pci_preinit(void); void ixp23xx_pci_preinit(void);
struct pci_bus *ixp23xx_pci_scan_bus(int, struct pci_sys_data*); struct pci_bus *ixp23xx_pci_scan_bus(int, struct pci_sys_data*);
void ixp23xx_pci_slave_init(void);
extern struct sys_timer ixp23xx_timer; extern struct sys_timer ixp23xx_timer;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment