[ARM] 3438/1: ixp23xx: add pci slave support
Lennert Buytenhek [Sat, 1 Apr 2006 17:33:35 +0000 (18:33 +0100)]
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>

arch/arm/mach-ixp23xx/espresso.c
arch/arm/mach-ixp23xx/pci.c
include/asm-arm/arch-ixp23xx/platform.h

index 2327c97..bf688c1 100644 (file)
 #include <asm/mach/irq.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)
 {
        physmap_configure(0x90000000, 0x02000000, 2, NULL);
index 5330ad7..ba6b436 100644 (file)
@@ -201,7 +201,7 @@ int clear_master_aborts(void)
        return 0;
 }
 
-void __init ixp23xx_pci_preinit(void)
+static void __init ixp23xx_pci_common_init(void)
 {
 #ifdef __ARMEB__
        *IXP23XX_PCI_CONTROL |= 0x20000;        /* set I/O swapping */
@@ -220,6 +220,11 @@ void __init ixp23xx_pci_preinit(void)
        } else {
                *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,
                        "PCI config cycle to non-existent device");
@@ -273,3 +278,8 @@ int ixp23xx_pci_setup(int nr, struct pci_sys_data *sys)
 
        return 1;
 }
+
+void ixp23xx_pci_slave_init(void)
+{
+       ixp23xx_pci_common_init();
+}
index f85b468..e4d9906 100644 (file)
@@ -22,6 +22,7 @@ void ixp23xx_sys_init(void);
 int ixp23xx_pci_setup(int, struct pci_sys_data *);
 void ixp23xx_pci_preinit(void);
 struct pci_bus *ixp23xx_pci_scan_bus(int, struct pci_sys_data*);
+void ixp23xx_pci_slave_init(void);
 
 extern struct sys_timer ixp23xx_timer;