From: Tom Rini Attached is the latest version of Adrian Cox's OCP patch for MPC107/8240/8245. This unifies some openpic setup code, and ensures that the OCP devices are only added to the bus on chip variants which have them. All interested parties seem happy, and this patch is necessary to provide a unified I2C driver for 85xx and 107/824x. Signed-off-by: Adrian Cox Signed-off-by: Tom Rini Signed-off-by: Andrew Morton --- 25-akpm/arch/ppc/Kconfig | 10 +++ 25-akpm/arch/ppc/platforms/lopec_setup.c | 15 ----- 25-akpm/arch/ppc/platforms/powerpmc250.c | 2 25-akpm/arch/ppc/platforms/sandpoint.c | 12 ---- 25-akpm/arch/ppc/syslib/Makefile | 7 +- 25-akpm/arch/ppc/syslib/mpc10x_common.c | 81 ++++++++++++++++++++++++++++++- 25-akpm/include/asm-ppc/mpc10x.h | 3 + 7 files changed, 99 insertions(+), 31 deletions(-) diff -puN arch/ppc/Kconfig~ppc32-ocp-for-mp10x arch/ppc/Kconfig --- 25/arch/ppc/Kconfig~ppc32-ocp-for-mp10x 2004-06-30 12:14:51.228648296 -0700 +++ 25-akpm/arch/ppc/Kconfig 2004-06-30 12:14:51.240646472 -0700 @@ -705,6 +705,16 @@ config MPC10X_BRIDGE depends on PCORE || POWERPMC250 || LOPEC || SANDPOINT default y +config FSL_OCP + bool + depends on MPC10X_BRIDGE + default y + +config MPC10X_OPENPIC + bool + depends on POWERPMC250 || LOPEC || SANDPOINT + default y + config MPC10X_STORE_GATHERING bool "Enable MPC10x store gathering" depends on MPC10X_BRIDGE diff -puN arch/ppc/platforms/lopec_setup.c~ppc32-ocp-for-mp10x arch/ppc/platforms/lopec_setup.c --- 25/arch/ppc/platforms/lopec_setup.c~ppc32-ocp-for-mp10x 2004-06-30 12:14:51.229648144 -0700 +++ 25-akpm/arch/ppc/platforms/lopec_setup.c 2004-06-30 12:14:51.241646320 -0700 @@ -192,21 +192,8 @@ lopec_init_IRQ(void) OpenPIC_InitSenses = lopec_openpic_initsenses; OpenPIC_NumInitSenses = sizeof(lopec_openpic_initsenses); - /* - * We need to tell openpic_set_sources where things actually are. - * mpc10x_common will setup OpenPIC_Addr at ioremap(EUMB phys base + - * EPIC offset (0x40000)); The EPIC IRQ Register Address Map - - * Interrupt Source Configuration Registers gives these numbers - * as offsets starting at 0x50200, we need to adjust occordinly. - */ - /* Map serial interrupts 0-15 */ - openpic_set_sources(0, 16, OpenPIC_Addr + 0x10200); - /* Skip reserved space and map i2c and DMA Ch[01] */ - openpic_set_sources(16, 3, OpenPIC_Addr + 0x11020); - /* Skip reserved space and map Message Unit Interrupt (I2O) */ - openpic_set_sources(19, 1, OpenPIC_Addr + 0x110C0); + mpc10x_set_openpic(); - openpic_init(NUM_8259_INTERRUPTS); /* We have a cascade on OpenPIC IRQ 0, Linux IRQ 16 */ openpic_hookup_cascade(NUM_8259_INTERRUPTS, "82c59 cascade", &i8259_irq); diff -puN arch/ppc/platforms/powerpmc250.c~ppc32-ocp-for-mp10x arch/ppc/platforms/powerpmc250.c --- 25/arch/ppc/platforms/powerpmc250.c~ppc32-ocp-for-mp10x 2004-06-30 12:14:51.231647840 -0700 +++ 25-akpm/arch/ppc/platforms/powerpmc250.c 2004-06-30 12:14:51.241646320 -0700 @@ -197,7 +197,7 @@ powerpmc250_init_IRQ(void) OpenPIC_InitSenses = powerpmc250_openpic_initsenses; OpenPIC_NumInitSenses = sizeof(powerpmc250_openpic_initsenses); - openpic_init(1, 0, 0, -1); + mpc10x_set_openpic(); } /* diff -puN arch/ppc/platforms/sandpoint.c~ppc32-ocp-for-mp10x arch/ppc/platforms/sandpoint.c --- 25/arch/ppc/platforms/sandpoint.c~ppc32-ocp-for-mp10x 2004-06-30 12:14:51.232647688 -0700 +++ 25-akpm/arch/ppc/platforms/sandpoint.c 2004-06-30 12:14:51.242646168 -0700 @@ -433,17 +433,7 @@ sandpoint_init_IRQ(void) OpenPIC_InitSenses = sandpoint_openpic_initsenses; OpenPIC_NumInitSenses = sizeof(sandpoint_openpic_initsenses); - /* - * We need to tell openpic_set_sources where things actually are. - * mpc10x_common will setup OpenPIC_Addr at ioremap(EUMB phys base + - * EPIC offset (0x40000)); The EPIC IRQ Register Address Map - - * Interrupt Source Configuration Registers gives these numbers - * as offsets starting at 0x50200, we need to adjust occordinly. - */ - /* Map serial interrupts 0-15 */ - openpic_set_sources(0, 16, OpenPIC_Addr + 0x10200); - - openpic_init(NUM_8259_INTERRUPTS); + mpc10x_set_openpic(); openpic_hookup_cascade(NUM_8259_INTERRUPTS, "82c59 cascade", i8259_irq); diff -puN arch/ppc/syslib/Makefile~ppc32-ocp-for-mp10x arch/ppc/syslib/Makefile --- 25/arch/ppc/syslib/Makefile~ppc32-ocp-for-mp10x 2004-06-30 12:14:51.234647384 -0700 +++ 25-akpm/arch/ppc/syslib/Makefile 2004-06-30 12:14:51.243646016 -0700 @@ -48,7 +48,7 @@ obj-$(CONFIG_EV64260) += gt64260_common obj-$(CONFIG_GEMINI) += open_pic.o indirect_pci.o obj-$(CONFIG_K2) += i8259.o indirect_pci.o todc_time.o \ pci_auto.o -obj-$(CONFIG_LOPEC) += pci_auto.o open_pic.o i8259.o todc_time.o +obj-$(CONFIG_LOPEC) += i8259.o pci_auto.o todc_time.o obj-$(CONFIG_MCPN765) += todc_time.o indirect_pci.o pci_auto.o \ open_pic.o i8259.o hawk_common.o obj-$(CONFIG_MENF1) += todc_time.o i8259.o mpc10x_common.o \ @@ -58,14 +58,14 @@ obj-$(CONFIG_MVME5100) += open_pic.o to obj-$(CONFIG_OCOTEA) += indirect_pci.o pci_auto.o todc_time.o obj-$(CONFIG_PAL4) += cpc700_pic.o obj-$(CONFIG_PCORE) += todc_time.o i8259.o pci_auto.o -obj-$(CONFIG_POWERPMC250) += open_pic.o pci_auto.o +obj-$(CONFIG_POWERPMC250) += pci_auto.o obj-$(CONFIG_PPLUS) += hawk_common.o open_pic.o i8259.o \ indirect_pci.o todc_time.o pci_auto.o obj-$(CONFIG_PRPMC750) += open_pic.o indirect_pci.o pci_auto.o \ hawk_common.o obj-$(CONFIG_HARRIER) += harrier.o obj-$(CONFIG_PRPMC800) += open_pic.o indirect_pci.o pci_auto.o -obj-$(CONFIG_SANDPOINT) += i8259.o open_pic.o pci_auto.o todc_time.o +obj-$(CONFIG_SANDPOINT) += i8259.o pci_auto.o todc_time.o obj-$(CONFIG_SBC82xx) += todc_time.o obj-$(CONFIG_SPRUCE) += cpc700_pic.o indirect_pci.o pci_auto.o \ todc_time.o @@ -79,6 +79,7 @@ obj-$(CONFIG_SERIAL_TEXT_DEBUG) += gen55 endif obj-$(CONFIG_BOOTX_TEXT) += btext.o obj-$(CONFIG_MPC10X_BRIDGE) += mpc10x_common.o indirect_pci.o +obj-$(CONFIG_MPC10X_OPENPIC) += open_pic.o obj-$(CONFIG_40x) += dcr.o obj-$(CONFIG_BOOKE) += dcr.o obj-$(CONFIG_85xx) += open_pic.o ppc85xx_common.o ppc85xx_setup.o diff -puN arch/ppc/syslib/mpc10x_common.c~ppc32-ocp-for-mp10x arch/ppc/syslib/mpc10x_common.c --- 25/arch/ppc/syslib/mpc10x_common.c~ppc32-ocp-for-mp10x 2004-06-30 12:14:51.235647232 -0700 +++ 25-akpm/arch/ppc/syslib/mpc10x_common.c 2004-06-30 12:14:51.244645864 -0700 @@ -30,7 +30,60 @@ #include #include #include +#include +/* The OCP structure is fixed by code below, before OCP initialises. + paddr depends on where the board places the EUMB. + - fixed in mpc10x_bridge_init(). + irq depends on two things: + > does the board use the EPIC at all? (PCORE does not). + > is the EPIC in serial or parallel mode? + - fixed in mpc10x_set_openpic(). +*/ + +#ifdef CONFIG_MPC10X_OPENPIC +#ifdef CONFIG_EPIC_SERIAL_MODE +#define EPIC_IRQ_BASE 16 +#else +#define EPIC_IRQ_BASE 5 +#endif +#define MPC10X_I2C_IRQ (EPIC_IRQ_BASE + NUM_8259_INTERRUPTS) +#define MPC10X_DMA0_IRQ (EPIC_IRQ_BASE + 1 + NUM_8259_INTERRUPTS) +#define MPC10X_DMA1_IRQ (EPIC_IRQ_BASE + 2 + NUM_8259_INTERRUPTS) +#else +#define MPC10X_I2C_IRQ OCP_IRQ_NA +#define MPC10X_DMA0_IRQ OCP_IRQ_NA +#define MPC10X_DMA1_IRQ OCP_IRQ_NA +#endif + + +struct ocp_def core_ocp[] = { + { .vendor = OCP_VENDOR_INVALID + } +}; + +static struct ocp_fs_i2c_data mpc10x_i2c_data = { + .flags = 0 +}; +static struct ocp_def mpc10x_i2c_ocp = { + .vendor = OCP_VENDOR_MOTOROLA, + .function = OCP_FUNC_IIC, + .index = 0, + .irq = MPC10X_I2C_IRQ, + .additions = &mpc10x_i2c_data +}; + +static struct ocp_def mpc10x_dma_ocp[2] = { +{ .vendor = OCP_VENDOR_MOTOROLA, + .function = OCP_FUNC_DMA, + .index = 0, + .irq = MPC10X_DMA0_IRQ +}, +{ .vendor = OCP_VENDOR_MOTOROLA, + .function = OCP_FUNC_DMA, + .index = 1, + .irq = MPC10X_DMA1_IRQ } +}; /* Set resources to match bridge memory map */ void __init @@ -231,11 +284,21 @@ mpc10x_bridge_init(struct pci_controller PCI_DEVFN(0,0), MPC10X_CFG_EUMBBAR, phys_eumb_base); - - /* Map EPIC register part of EUMB into vitual memory */ +#ifdef CONFIG_MPC10X_OPENPIC + /* Map EPIC register part of EUMB into vitual memory - PCORE + uses an i8259 instead of EPIC. */ OpenPIC_Addr = ioremap(phys_eumb_base + MPC10X_EUMB_EPIC_OFFSET, MPC10X_EUMB_EPIC_SIZE); +#endif + mpc10x_i2c_ocp.paddr = phys_eumb_base + MPC10X_EUMB_I2C_OFFSET; + ocp_add_one_device(&mpc10x_i2c_ocp); + mpc10x_dma_ocp[0].paddr = phys_eumb_base + + MPC10X_EUMB_DMA_OFFSET + 0x100; + ocp_add_one_device(&mpc10x_dma_ocp[0]); + mpc10x_dma_ocp[1].paddr = phys_eumb_base + + MPC10X_EUMB_DMA_OFFSET + 0x200; + ocp_add_one_device(&mpc10x_dma_ocp[1]); } #ifdef CONFIG_MPC10X_STORE_GATHERING @@ -397,3 +460,17 @@ mpc10x_disable_store_gathering(struct pc return 0; } + +#ifdef CONFIG_MPC10X_OPENPIC +void __init mpc10x_set_openpic(void) +{ + /* Map external IRQs */ + openpic_set_sources(0, EPIC_IRQ_BASE, OpenPIC_Addr + 0x10200); + /* Skip reserved space and map i2c and DMA Ch[01] */ + openpic_set_sources(EPIC_IRQ_BASE, 3, OpenPIC_Addr + 0x11020); + /* Skip reserved space and map Message Unit Interrupt (I2O) */ + openpic_set_sources(EPIC_IRQ_BASE + 3, 1, OpenPIC_Addr + 0x110C0); + + openpic_init(NUM_8259_INTERRUPTS); +} +#endif diff -puN include/asm-ppc/mpc10x.h~ppc32-ocp-for-mp10x include/asm-ppc/mpc10x.h --- 25/include/asm-ppc/mpc10x.h~ppc32-ocp-for-mp10x 2004-06-30 12:14:51.236647080 -0700 +++ 25-akpm/include/asm-ppc/mpc10x.h 2004-06-30 12:14:51.244645864 -0700 @@ -164,4 +164,7 @@ unsigned long mpc10x_get_mem_size(uint m int mpc10x_enable_store_gathering(struct pci_controller *hose); int mpc10x_disable_store_gathering(struct pci_controller *hose); +/* For MPC107 boards that use the built-in openpic */ +void mpc10x_set_openpic(void); + #endif /* __PPC_KERNEL_MPC10X_H */ _