diff options
| author | Lennert Buytenhek <buytenh@wantstofly.org> | 2006-04-01 12:33:35 -0500 |
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2006-04-01 12:33:35 -0500 |
| commit | 532bda5d9cd2f94a9e374765c23858c7d8641f66 (patch) | |
| tree | a87fc82de89a993867d11e328b6b82afb16fe83a | |
| parent | 50c37e216132d2185a15d5cf6b966adf6ecea535 (diff) | |
[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: Lennert Buytenhek <buytenh@wantstofly.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
| -rw-r--r-- | arch/arm/mach-ixp23xx/espresso.c | 9 | ||||
| -rw-r--r-- | arch/arm/mach-ixp23xx/pci.c | 12 | ||||
| -rw-r--r-- | include/asm-arm/arch-ixp23xx/platform.h | 1 |
3 files changed, 21 insertions, 1 deletions
diff --git a/arch/arm/mach-ixp23xx/espresso.c b/arch/arm/mach-ixp23xx/espresso.c index 2327c9790416..bf688c128630 100644 --- a/arch/arm/mach-ixp23xx/espresso.c +++ b/arch/arm/mach-ixp23xx/espresso.c | |||
| @@ -44,6 +44,15 @@ | |||
| 44 | #include <asm/mach/irq.h> | 44 | #include <asm/mach/irq.h> |
| 45 | #include <asm/mach/pci.h> | 45 | #include <asm/mach/pci.h> |
| 46 | 46 | ||
| 47 | static int __init espresso_pci_init(void) | ||
| 48 | { | ||
| 49 | if (machine_is_espresso()) | ||
| 50 | ixp23xx_pci_slave_init(); | ||
| 51 | |||
| 52 | return 0; | ||
| 53 | }; | ||
| 54 | subsys_initcall(espresso_pci_init); | ||
| 55 | |||
| 47 | static void __init espresso_init(void) | 56 | static void __init espresso_init(void) |
| 48 | { | 57 | { |
| 49 | physmap_configure(0x90000000, 0x02000000, 2, NULL); | 58 | physmap_configure(0x90000000, 0x02000000, 2, NULL); |
diff --git a/arch/arm/mach-ixp23xx/pci.c b/arch/arm/mach-ixp23xx/pci.c index 5330ad78c1bb..ba6b4367a1d5 100644 --- a/arch/arm/mach-ixp23xx/pci.c +++ b/arch/arm/mach-ixp23xx/pci.c | |||
| @@ -201,7 +201,7 @@ int clear_master_aborts(void) | |||
| 201 | return 0; | 201 | return 0; |
| 202 | } | 202 | } |
| 203 | 203 | ||
| 204 | void __init ixp23xx_pci_preinit(void) | 204 | static void __init ixp23xx_pci_common_init(void) |
| 205 | { | 205 | { |
| 206 | #ifdef __ARMEB__ | 206 | #ifdef __ARMEB__ |
| 207 | *IXP23XX_PCI_CONTROL |= 0x20000; /* set I/O swapping */ | 207 | *IXP23XX_PCI_CONTROL |= 0x20000; /* set I/O swapping */ |
| @@ -220,6 +220,11 @@ void __init ixp23xx_pci_preinit(void) | |||
| 220 | } else { | 220 | } else { |
| 221 | *IXP23XX_PCI_CPP_ADDR_BITS |= (1 << 1); | 221 | *IXP23XX_PCI_CPP_ADDR_BITS |= (1 << 1); |
| 222 | } | 222 | } |
| 223 | } | ||
| 224 | |||
| 225 | void __init ixp23xx_pci_preinit(void) | ||
| 226 | { | ||
| 227 | ixp23xx_pci_common_init(); | ||
| 223 | 228 | ||
| 224 | hook_fault_code(16+6, ixp23xx_pci_abort_handler, SIGBUS, | 229 | hook_fault_code(16+6, ixp23xx_pci_abort_handler, SIGBUS, |
| 225 | "PCI config cycle to non-existent device"); | 230 | "PCI config cycle to non-existent device"); |
| @@ -273,3 +278,8 @@ int ixp23xx_pci_setup(int nr, struct pci_sys_data *sys) | |||
| 273 | 278 | ||
| 274 | return 1; | 279 | return 1; |
| 275 | } | 280 | } |
| 281 | |||
| 282 | void ixp23xx_pci_slave_init(void) | ||
| 283 | { | ||
| 284 | ixp23xx_pci_common_init(); | ||
| 285 | } | ||
diff --git a/include/asm-arm/arch-ixp23xx/platform.h b/include/asm-arm/arch-ixp23xx/platform.h index f85b4685a491..e4d99060a049 100644 --- a/include/asm-arm/arch-ixp23xx/platform.h +++ b/include/asm-arm/arch-ixp23xx/platform.h | |||
| @@ -22,6 +22,7 @@ void ixp23xx_sys_init(void); | |||
| 22 | int ixp23xx_pci_setup(int, struct pci_sys_data *); | 22 | int ixp23xx_pci_setup(int, struct pci_sys_data *); |
| 23 | void ixp23xx_pci_preinit(void); | 23 | void ixp23xx_pci_preinit(void); |
| 24 | struct pci_bus *ixp23xx_pci_scan_bus(int, struct pci_sys_data*); | 24 | struct pci_bus *ixp23xx_pci_scan_bus(int, struct pci_sys_data*); |
| 25 | void ixp23xx_pci_slave_init(void); | ||
| 25 | 26 | ||
| 26 | extern struct sys_timer ixp23xx_timer; | 27 | extern struct sys_timer ixp23xx_timer; |
| 27 | 28 | ||
