POWERPC: Add support for CPM2 peripherals and 8560 eval board
cover POWERPC: Add support for CPM2 peripherals and 8560 eval board
The following series implements the generic cpm2 infrastructure port, mpc8560 board-specific bits, and an attempt to overhaul and get rid of some stuff moved along from the 2.4 times.
--
Sincerely, Vitaly
PATCH 1/6 POWERPC: CPM2 SoC support to fsl_soc.c
This patch contains necessary modifications to support the CPM2 SoC peripherals. For the time being, those are fs_enet Ethernet driver and cpm_uart serial. Written initially to support mpc8560, it also suites to the part of the large PQ2 (more specifically, mpc8260) family.
---
arch/powerpc/sysdev/fsl_soc.c | 265 ++++++++++++++++++++++++++++++++++++++++- arch/powerpc/sysdev/fsl_soc.h | 2 2 files changed, 262 insertions(+), 5 deletions(-)
arch/powerpc/sysdev/fsl_soc.c +260 -5
@@ -2,6 +2,9 @@* FSL SoC setup code * * Maintained by Kumar Gala (see MAINTAINERS for contact information) +* +* 2006 (c) MontaVista Software, Inc. +* Vitaly Bordug <[email protected]> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the
@@ -20,11 +23,14 @@ #include <linux/module.h>#include <linux/device.h> #include <linux/platform_device.h> #include <linux/fsl_devices.h> +#include <linux/fs_enet_pd.h> +#include <linux/fs_uart_pd.h> #include <asm/system.h> #include <asm/atomic.h> #include <asm/io.h> #include <asm/irq.h> +#include <asm/time.h> #include <asm/prom.h> #include <sysdev/fsl_soc.h> #include <mm/mmu_decl.h>
@@ -42,7 +48,9 @@ phys_addr_t get_immrbase(void)if (soc) {unsigned int size;const void *prop =get_property (soc,"reg" , &size); - immrbase =of_translate_address (soc, prop); + +if (prop) + immrbase =of_translate_address (soc, prop);of_node_put (soc); };
@@ -51,6 +59,57 @@ phys_addr_t get_immrbase(void)EXPORT_SYMBOL (get_immrbase); +#ifdef CONFIG_CPM2 + +static u32 brgfreq =-1 ; + +u32 get_brgfreq (void ) +{ +struct device_node *node; + +if (brgfreq !=-1 ) +return brgfreq; + + node =of_find_node_by_type (NULL ,"cpm" ); +if (node) { +unsigned int size; +unsigned int *prop = (unsigned int *)get_property (node,"brg-frequency" , &size); + +if (prop) + brgfreq = *prop; +of_node_put (node); + }; + +return brgfreq; +} + +EXPORT_SYMBOL (get_brgfreq); + +static u32 fs_baudrate =-1 ; + +u32 get_baudrate (void ) +{ +struct device_node *node; + +if (fs_baudrate !=-1 ) +return fs_baudrate; + + node =of_find_node_by_type (NULL ,"serial" ); +if (node) { +unsigned int size; +unsigned int *prop = (unsigned int *)get_property (node,"current-speed" , &size); + +if (prop) + fs_baudrate = *prop; +of_node_put (node); + }; + +return fs_baudrate; +} + +EXPORT_SYMBOL (get_baudrate); +#endif /* CONFIG_CPM2 */ +static int __init gfar_mdio_of_init (void ) {struct device_node *np;
@@ -85,8 +144,11 @@ static int __init gfar_mdio_of_init(void mdio_data.irq[k] =-1 ;while ((child =of_get_next_child (np, child)) !=NULL ) { -const u32 *id =get_property (child,"reg" ,NULL ); - mdio_data.irq[*id] =irq_of_parse_and_map (child,0 ); +int irq =irq_of_parse_and_map (child,0 ); +if (irq !=NO_IRQ ) { +const u32 *id =get_property (child,"reg" ,NULL ); + mdio_data.irq[*id] = irq; + } } ret =
@@ -128,7 +190,7 @@ static int __init gfar_of_init(void)const char *model;const void *mac_addr;const phandle *ph; -int n_res =1 ; +int n_res =2 ;memset (r,0 ,sizeof (r));memset (&gfar_data,0 ,sizeof (gfar_data));
@@ -159,7 +221,7 @@ static int __init gfar_of_init(void) gfar_dev =platform_device_register_simple ("fsl-gianfar" , i, &r[0 ], - n_res +1 ); + n_res);if (IS_ERR (gfar_dev)) { ret =PTR_ERR (gfar_dev);
@@ -470,3 +532,196 @@ err: }arch_initcall (fsl_usb_of_init); + +#ifdef CONFIG_CPM2 + +static const char *fcc_regs ="fcc_regs" ; +static const char *fcc_regs_c ="fcc_regs_c" ; +static const char *fcc_pram ="fcc_pram" ; +static char bus_id[9 ][BUS_ID_SIZE ]; + +static int __init fs_enet_of_init (void ) +{ +struct device_node *np; +unsigned int i; +struct platform_device *fs_enet_dev; +struct resource res; +int ret; + +for (np =NULL , i =0 ; + (np =of_find_compatible_node (np,"network" ,"fs_enet" )) !=NULL ; + i++) { +struct resource r[4 ]; +struct device_node *phy, *mdio; +struct fs_platform_info fs_enet_data; +unsigned int *id, *phy_addr; +void *mac_addr; +phandle *ph; +char *model; + +memset (r,0 ,sizeof (r)); +memset (&fs_enet_data,0 ,sizeof (fs_enet_data)); + + ret =of_address_to_resource (np,0 , &r[0 ]); +if (ret) + goto err; + r[0 ].name = fcc_regs; + + ret =of_address_to_resource (np,1 , &r[1 ]); +if (ret) + goto err; + r[1 ].name = fcc_pram; + + ret =of_address_to_resource (np,2 , &r[2 ]); +if (ret) + goto err; + r[2 ].name = fcc_regs_c; + + r[3 ].start = r[3 ].end =irq_of_parse_and_map (np,0 ); + r[3 ].flags =IORESOURCE_IRQ ; + + fs_enet_dev = +platform_device_register_simple ("fsl-cpm-fcc" , i, &r[0 ],4 ); + +if (IS_ERR (fs_enet_dev)) { + ret =PTR_ERR (fs_enet_dev); + goto err; + } + + model = (char *)get_property (np,"model" ,NULL ); +if (model ==NULL ) { + ret = -ENODEV ; + goto unreg; + } + + mac_addr = (void *)get_property (np,"mac-address" ,NULL ); +memcpy (fs_enet_data.macaddr, mac_addr,6 ); + + ph = (phandle *)get_property (np,"phy-handle" ,NULL ); + phy =of_find_node_by_phandle (*ph); + +if (phy ==NULL ) { + ret = -ENODEV ; + goto unreg; + } + + phy_addr = (u32 *)get_property (phy,"reg" ,NULL ); + fs_enet_data.phy_addr = *phy_addr; + + id = (u32 *)get_property (np,"device-id" ,NULL ); + fs_enet_data.fs_no = *id; + + mdio =of_get_parent (phy); + ret =of_address_to_resource (mdio,0 , &res); +if (ret) { +of_node_put (phy); +of_node_put (mdio); + goto unreg; + } + +if (strstr (model,"FCC" )) { +int fcc_index =fs_get_fcc_index (*id); + + fs_enet_data.dpram_offset = (u32 )cpm2_immr->im_dprambase; + fs_enet_data.rx_ring =32 ; + fs_enet_data.tx_ring =32 ; + fs_enet_data.rx_copybreak =240 ; + fs_enet_data.use_napi =0 ; + fs_enet_data.napi_weight =17 ; + fs_enet_data.mem_offset =FCC_MEM_OFFSET (fcc_index); + fs_enet_data.cp_page =CPM_CR_FCC_PAGE (fcc_index); + fs_enet_data.cp_block =CPM_CR_FCC_SBLOCK (fcc_index); + +snprintf ((char *)&bus_id[(*id)],BUS_ID_SIZE ,"%x:%02x" , + (u32 )res.start, fs_enet_data.phy_addr); + fs_enet_data.bus_id = (char *)&bus_id[(*id)]; + } + +of_node_put (phy); +of_node_put (mdio); + + ret =platform_device_add_data (fs_enet_dev, &fs_enet_data, +sizeof (struct +fs_platform_info )); +if (ret) + goto unreg; + } +return 0 ; + +unreg: +platform_device_unregister (fs_enet_dev); +err: +return ret; +} + +arch_initcall (fs_enet_of_init); + +static const char *scc_regs ="regs" ; +static const char *scc_pram ="pram" ; + +static int __init cpm_uart_of_init (void ) +{ +struct device_node *np; +unsigned int i; +struct platform_device *cpm_uart_dev; +int ret; + +for (np =NULL , i =0 ; + (np =of_find_compatible_node (np,"serial" ,"cpm_uart" )) !=NULL ; + i++) { +struct resource r[3 ]; +struct fs_uart_platform_info cpm_uart_data; +int *id; + +memset (r,0 ,sizeof (r)); +memset (&cpm_uart_data,0 ,sizeof (cpm_uart_data)); + + ret =of_address_to_resource (np,0 , &r[0 ]); +if (ret) + goto err; + + r[0 ].name = scc_regs; + + ret =of_address_to_resource (np,1 , &r[1 ]); +if (ret) + goto err; + r[1 ].name = scc_pram; + + r[2 ].start = r[2 ].end =irq_of_parse_and_map (np,0 ); + r[2 ].flags =IORESOURCE_IRQ ; + + cpm_uart_dev = +platform_device_register_simple ("fsl-cpm-scc:uart" , i, &r[0 ],3 ); + +if (IS_ERR (cpm_uart_dev)) { + ret =PTR_ERR (cpm_uart_dev); + goto err; + } + + id = (int *)get_property (np,"device-id" ,NULL ); + cpm_uart_data.fs_no = *id; + cpm_uart_data.uart_clk = ppc_proc_freq; + + cpm_uart_data.tx_num_fifo =4 ; + cpm_uart_data.tx_buf_size =32 ; + cpm_uart_data.rx_num_fifo =4 ; + cpm_uart_data.rx_buf_size =32 ; + + ret = +platform_device_add_data (cpm_uart_dev, &cpm_uart_data, +sizeof (struct +fs_uart_platform_info )); +if (ret) + goto unreg; + } + +return 0 ; + +unreg: +platform_device_unregister (cpm_uart_dev); +err: +return ret; +} + +arch_initcall (cpm_uart_of_init); +#endif /* CONFIG_CPM2 */
arch/powerpc/sysdev/fsl_soc.h +2 -0
@@ -3,6 +3,8 @@ #define __PPC_FSL_SOC_H#ifdef __KERNEL__extern phys_addr_t get_immrbase (void ); +extern u32 get_brgfreq (void ); +extern u32 get_baudrate (void );#endif #endif
PATCH 2/6 CPM_UART: update to make the utilization possible both from ppc and powerpc
In reply to Vitaly BordugDriver core has been updated to make use of the new powerpc OF-inspired platform devices, yet keeping compatibility to the vast board list from ppc.
---
drivers/serial/cpm_uart/cpm_uart_core.c | 11 ++++------- drivers/serial/cpm_uart/cpm_uart_cpm2.c | 13 +++++++------ include/asm-powerpc/fs_pd.h | 27 ++++++++++++++++++++++++++ include/asm-ppc/fs_pd.h | 32 +++++++++++++++++++++++++++++++ 4 files changed, 70 insertions(+), 13 deletions(-)
drivers/serial/cpm_uart/cpm_uart_core.c +4 -7
@@ -46,6 +46,7 @@ #include <linux/fs_uart_pd.h>#include <asm/io.h> #include <asm/irq.h> #include <asm/delay.h> +#include <asm/fs_pd.h> #if defined(CONFIG_SERIAL_CPM_CONSOLE ) && defined(CONFIG_MAGIC_SYSRQ )#define SUPPORT_SYSRQ
@@ -1044,11 +1045,11 @@ int cpm_uart_drv_get_platform_data(strucif (!(r =platform_get_resource_byname (pdev,IORESOURCE_MEM ,"regs" )))return -EINVAL ; - mem = r->start; + mem = (u32 )ioremap (r->start, r->end - r->start +1 );if (!(r =platform_get_resource_byname (pdev,IORESOURCE_MEM ,"pram" )))return -EINVAL ; - pram = r->start; + pram = (u32 )ioremap (r->start, r->end - r->start +1 );if (idx > fsid_smc2_uart) { pinfo->sccp = (scc_t *)mem;
@@ -1189,11 +1190,7 @@ static int __init cpm_uart_console_setupif (options) {uart_parse_options (options, &baud, &parity, &bits, &flow); }else { -bd_t *bd = (bd_t *) __res; - -if (bd->bi_baudrate) - baud = bd->bi_baudrate; -else +if ((baud =uart_baudrate ()) ==-1 ) baud =9600 ; }
drivers/serial/cpm_uart/cpm_uart_cpm2.c +7 -6
@@ -40,6 +40,7 @@ #include <linux/dma-mapping.h>#include <asm/io.h> #include <asm/irq.h> +#include <asm/fs_pd.h> #include <linux/serial_core.h> #include <linux/kernel.h>
@@ -266,7 +267,7 @@ #ifdef CONFIG_SERIAL_CPM_SMC1 (unsigned long )&cpm2_immr->im_smc[0 ]; cpm_uart_ports[UART_SMC1 ].smcp->smc_smcm |= (SMCM_RX |SMCM_TX ); cpm_uart_ports[UART_SMC1 ].smcp->smc_smcmr &= ~(SMCMR_REN |SMCMR_TEN ); - cpm_uart_ports[UART_SMC1 ].port.uartclk = (((bd_t *) __res)->bi_intfreq); + cpm_uart_ports[UART_SMC1 ].port.uartclk =uart_clock (); cpm_uart_port_map[cpm_uart_nr++] =UART_SMC1 ;#endif
@@ -279,7 +280,7 @@ #ifdef CONFIG_SERIAL_CPM_SMC2 (unsigned long )&cpm2_immr->im_smc[1 ]; cpm_uart_ports[UART_SMC2 ].smcp->smc_smcm |= (SMCM_RX |SMCM_TX ); cpm_uart_ports[UART_SMC2 ].smcp->smc_smcmr &= ~(SMCMR_REN |SMCMR_TEN ); - cpm_uart_ports[UART_SMC2 ].port.uartclk = (((bd_t *) __res)->bi_intfreq); + cpm_uart_ports[UART_SMC2 ].port.uartclk =uart_clock (); cpm_uart_port_map[cpm_uart_nr++] =UART_SMC2 ;#endif
@@ -293,7 +294,7 @@ #ifdef CONFIG_SERIAL_CPM_SCC1 ~(UART_SCCM_TX |UART_SCCM_RX ); cpm_uart_ports[UART_SCC1 ].sccp->scc_gsmrl &= ~(SCC_GSMRL_ENR |SCC_GSMRL_ENT ); - cpm_uart_ports[UART_SCC1 ].port.uartclk = (((bd_t *) __res)->bi_intfreq); + cpm_uart_ports[UART_SCC1 ].port.uartclk =uart_clock (); cpm_uart_port_map[cpm_uart_nr++] =UART_SCC1 ;#endif
@@ -307,7 +308,7 @@ #ifdef CONFIG_SERIAL_CPM_SCC2 ~(UART_SCCM_TX |UART_SCCM_RX ); cpm_uart_ports[UART_SCC2 ].sccp->scc_gsmrl &= ~(SCC_GSMRL_ENR |SCC_GSMRL_ENT ); - cpm_uart_ports[UART_SCC2 ].port.uartclk = (((bd_t *) __res)->bi_intfreq); + cpm_uart_ports[UART_SCC2 ].port.uartclk =uart_clock (); cpm_uart_port_map[cpm_uart_nr++] =UART_SCC2 ;#endif
@@ -321,7 +322,7 @@ #ifdef CONFIG_SERIAL_CPM_SCC3 ~(UART_SCCM_TX |UART_SCCM_RX ); cpm_uart_ports[UART_SCC3 ].sccp->scc_gsmrl &= ~(SCC_GSMRL_ENR |SCC_GSMRL_ENT ); - cpm_uart_ports[UART_SCC3 ].port.uartclk = (((bd_t *) __res)->bi_intfreq); + cpm_uart_ports[UART_SCC3 ].port.uartclk =uart_clock (); cpm_uart_port_map[cpm_uart_nr++] =UART_SCC3 ;#endif
@@ -335,7 +336,7 @@ #ifdef CONFIG_SERIAL_CPM_SCC4 ~(UART_SCCM_TX |UART_SCCM_RX ); cpm_uart_ports[UART_SCC4 ].sccp->scc_gsmrl &= ~(SCC_GSMRL_ENR |SCC_GSMRL_ENT ); - cpm_uart_ports[UART_SCC4 ].port.uartclk = (((bd_t *) __res)->bi_intfreq); + cpm_uart_ports[UART_SCC4 ].port.uartclk =uart_clock (); cpm_uart_port_map[cpm_uart_nr++] =UART_SCC4 ;#endif
include/asm-powerpc/fs_pd.h new file +27 -0
@@ -0,0 +1,27 @@ +/* +* Platform information definitions. +* +* 2006 (c) MontaVista Software, Inc. +* Vitaly Bordug <[email protected]> +* +* This file is licensed under the terms of the GNU General Public License +* version 2. This program is licensed "as is" without any warranty of any +* kind, whether express or implied. +*/ + +#ifndef FS_PD_H +#define FS_PD_H +#include <sysdev/fsl_soc.h> +#include <asm/time.h> + +static inline int uart_baudrate (void ) +{ +return get_baudrate (); +} + +static inline int uart_clock (void ) +{ +return ppc_proc_freq; +} + +#endif
include/asm-ppc/fs_pd.h new file +32 -0
@@ -0,0 +1,32 @@ +/* +* Platform information definitions. +* +* 2006 (c) MontaVista Software, Inc. +* Vitaly Bordug <[email protected]> +* +* This file is licensed under the terms of the GNU General Public License +* version 2. This program is licensed "as is" without any warranty of any +* kind, whether express or implied. +*/ + +#ifndef FS_PD_H +#define FS_PD_H + +static inline int uart_baudrate (void ) +{ +int baud; +bd_t *bd = (bd_t *) __res; + +if (bd->bi_baudrate) + baud = bd->bi_baudrate; +else + baud =-1 ; +return baud; +} + +static inline int uart_clock (void ) +{ +return (((bd_t *) __res)->bi_intfreq); +} + +#endif
PATCH 3/6 POWERPC: move the generic cpm2 stuff to the powerpc
In reply to Vitaly BordugThis moves the cpm2 common code and PIC stuff to the powerpc. Most of the files were just copied from ppc/, with minor tuning to make it compile, and, subsequently, work.
---
arch/powerpc/lib/Makefile | 5 + arch/powerpc/sysdev/Makefile | 7 + arch/powerpc/sysdev/cpm2_common.c | 204 +++++++++++++++++++++++++++++ arch/powerpc/sysdev/cpm2_pic.c | 256 +++++++++++++++++++++++++++++++++++++ arch/powerpc/sysdev/cpm2_pic.h | 8 + include/asm-ppc/cpm2.h | 6 + 6 files changed, 484 insertions(+), 2 deletions(-)
arch/powerpc/lib/Makefile +5 -0
@@ -20,3 +20,8 @@ ifeq ($(CONFIG_PPC64),y) obj-$(CONFIG_SMP) += locks.o obj-$(CONFIG_DEBUG_KERNEL) += sstep.o endif + +# Temporary hack until we have migrated to asm-powerpc +ifeq ($(ARCH),powerpc) +obj-$(CONFIG_CPM2) += rheap.o +endif
arch/powerpc/sysdev/Makefile +6 -1
@@ -16,4 +16,9 @@ obj-$(CONFIG_TSI108_BRIDGE) += tsi108_pc ifeq ($(CONFIG_PPC_MERGE),y) obj-$(CONFIG_PPC_I8259) += i8259.o - endif +endif + +# Temporary hack until we have migrated to asm-powerpc +ifeq ($(ARCH),powerpc) +obj-$(CONFIG_CPM2) += cpm2_common.o cpm2_pic.o +endif
arch/powerpc/sysdev/cpm2_common.c new file +204 -0
204 lines not on this page · raw message
arch/powerpc/sysdev/cpm2_pic.c new file +256 -0
256 lines not on this page · raw message
arch/powerpc/sysdev/cpm2_pic.h new file +8 -0
@@ -0,0 +1,8 @@ +#ifndef _PPC_KERNEL_CPM2_H +#define _PPC_KERNEL_CPM2_H + +extern int cpm2_get_irq (struct pt_regs *regs); + +extern void cpm2_pic_init (struct device_node *); + +#endif /* _PPC_KERNEL_CPM2_H */
include/asm-ppc/cpm2.h +5 -1
@@ -42,6 +42,8 @@ #define CPM_CR_IDMA3_SBLOCK (0x16)#define CPM_CR_IDMA4_SBLOCK (0x17)#define CPM_CR_MCC1_SBLOCK (0x1c) +#define CPM_CR_FCC_SBLOCK (x) (x + 0x10) +#define CPM_CR_SCC1_PAGE (0x00)#define CPM_CR_SCC2_PAGE (0x01)#define CPM_CR_SCC3_PAGE (0x02)
@@ -62,6 +64,8 @@ #define CPM_CR_IDMA4_PAGE (0x0a)#define CPM_CR_MCC1_PAGE (0x07)#define CPM_CR_MCC2_PAGE (0x08) +#define CPM_CR_FCC_PAGE (x) (x + 0x04) +/* Some opcodes (there are more...later) */ #define CPM_CR_INIT_TRX ((ushort)0x0000)
@@ -1186,7 +1190,7 @@ #define PC3_DIRC1 (PC3_TXDAT)#define FCC_MEM_OFFSET (x) (CPM_FCC_SPECIAL_BASE + (x*128))#define FCC1_MEM_OFFSET FCC_MEM_OFFSET(0)#define FCC2_MEM_OFFSET FCC_MEM_OFFSET(1) -#define FCC2_MEM_OFFSET FCC_MEM_OFFSET(2) +#define FCC3_MEM_OFFSET FCC_MEM_OFFSET(2)#endif /* __CPM2__ */ #endif /* __KERNEL__ */
Re: [PATCH 3/6] POWERPC: move the generic cpm2 stuff to the powerpc
Hello.
Quoted 4 lines · Vitaly Bordug
This moves the cpm2 common code and PIC stuff to the powerpc. Most of the files were just copied from ppc/, with minor tuning to make it compile, and, subsequently, work.
Signed-off-by Vitaly Bordug <[email protected]>
[...]
Quoted 4 lines
include/asm-ppc/cpm2.h +0
-0
[...]
include/asm-ppc/cpm2.h #define PC3_DIRC1 (PC3_TXDAT) · line 1196
Quoted 9 lines
include/asm-ppc/cpm2.h +1
-1@@ -1186,7 +1190,7 @@ #define PC3_DIRC1 (PC3_TXDAT)#define FCC_MEM_OFFSET (x) (CPM_FCC_SPECIAL_BASE + (x*128))#define FCC1_MEM_OFFSET FCC_MEM_OFFSET(0)#define FCC2_MEM_OFFSET FCC_MEM_OFFSET(1) -#define FCC2_MEM_OFFSET FCC_MEM_OFFSET(2) +#define FCC3_MEM_OFFSET FCC_MEM_OFFSET(2)#endif /* __CPM2__ */ #endif /* __KERNEL__ */
Alas, this last hunk doesn't apply to powerpc.git. Shouldn't it be in some
other patch instead?
WBR, Sergei
Re: [PATCH 3/6] POWERPC: move the generic cpm2 stuff to the powerpc
Quoted 23 lines · On Sat, 12 Aug 2006 22:36:17 +0400 Sergei Shtylyov wrote:
Hello.
Quoted 5 lines · Vitaly Bordug
This moves the cpm2 common code and PIC stuff to the powerpc. Most of the files were just copied from ppc/, with minor tuning to make it compile, and, subsequently, work.
Signed-off-by Vitaly Bordug <[email protected]>[...]
Quoted 4 lines
include/asm-ppc/cpm2.h +0
-0[...]
Quoted 7 lines
include/asm-ppc/cpm2.h +1
-1@@ -1186,7 +1190,7 @@ #define PC3_DIRC1 (PC3_TXDAT)#define FCC_MEM_OFFSET (x) (CPM_FCC_SPECIAL_BASE + (x*128))#define FCC1_MEM_OFFSET FCC_MEM_OFFSET(0)#define FCC2_MEM_OFFSET FCC_MEM_OFFSET(1) -#define FCC2_MEM_OFFSET FCC_MEM_OFFSET(2) +#define FCC3_MEM_OFFSET FCC_MEM_OFFSET(2)
Quoted 5 lines
include/asm-ppc/cpm2.h #define PC3_DIRC1 (PC3_TXDAT) · line 1196
Quoted 2 lines
include/asm-ppc/cpm2.h +0
-0#endif /* __CPM2__ */ #endif /* __KERNEL__ */ Alas, this last hunk doesn't apply to powerpc.git. Shouldn't it
be in some other patch instead?
This whole patch series depends on the fs_enet PALification series, that is accepted to netdev tree at least, according to the last mail from Andrew Morton.
Hence, it will be auto-fixed shortly. Next time I'll submit the preceding stuff as well to prevent confusion.
Quoted 4 lines
WBR, Sergei
PATCH 4/6 POWERPC: add support of mpc8560 eval board
In reply to Vitaly BordugThis make the 8560 evaluation board fully supported under arch/powerpc, as the first board with CPM2 SoC peripherals. The brand new devicetree nodes are introduced (intending to be a subset of the QuiccEngine-equipped models, with dts sources placed into the kernel according to the new convention.
Assuming all the preceding stuff applied (PAL+fs_enet related+ CPM_UART update), the both TSEC eth ,FCC Eths, and both SCC UARTs are working. The relevant drivers are still capable to drive users in ppc, which was verified with 8272ADS (SCC uart+FCC eth).
This is also verified on mpc8540 and actually make it work (PCI stuff working as well)
---
arch/powerpc/boot/dts/mpc8560ads.dts | 310 ++++++++++ arch/powerpc/configs/mpc8560_ads_defconfig | 854 ++++++++++++++++++++++++++++ arch/powerpc/platforms/85xx/Kconfig | 11 arch/powerpc/platforms/85xx/Makefile | 1 arch/powerpc/platforms/85xx/mpc8540_ads.h | 12 arch/powerpc/platforms/85xx/mpc8560_ads.h | 65 ++ arch/powerpc/platforms/85xx/mpc85xx.h | 1 arch/powerpc/platforms/85xx/mpc85xx_ads.c | 334 +++++++++-- arch/powerpc/platforms/85xx/pci.c | 12 include/asm-powerpc/mpc85xx.h | 199 +++++++ 10 files changed, 1729 insertions(+), 70 deletions(-)
arch/powerpc/boot/dts/mpc8560ads.dts new file +310 -0
@@ -0,0 +1,310 @@ +/* + * MPC8560 ADS Device Tree Source + * + * Copyright 2006 Freescale Semiconductor Inc. + * + * 2006 (c) MontaVista Software, Inc. + * Vitaly Bordug <[email protected]> + * + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + + +/* +/memreserve/ 00000000 1000000; +*/ + +/ { + model = "MPC8560ADS"; + compatible = "MPC85xxADS"; + #address-cells = <1>; + #size-cells = <1>; + linux,phandle = <100>; + + cpus { + #cpus = <1>; + #address-cells = <1>; + #size-cells = <0>; + linux,phandle = <200>; + + PowerPC,8560@0 { + device_type = "cpu"; + reg = <0>; + d-cache-line-size = <20>; // 32 bytes + i-cache-line-size = <20>; // 32 bytes + d-cache-size = <8000>; // L1, 32K + i-cache-size = <8000>; // L1, 32K + timebase-frequency = <0>; + bus-frequency = <0>; + clock-frequency = <0>; + 32-bit; + linux,phandle = <201>; + linux,boot-cpu; + }; + }; + + memory { + device_type = "memory"; + linux,phandle = <300>; + reg = <00000000 10000000>; + }; + + soc8560@e0000000 { + #address-cells = <1>; + #size-cells = <1>; + #interrupt-cells = <2>; + device_type = "soc"; + ranges = <0 e0000000 00100000>; + reg = <e0000000 00000200>; + bus-frequency = <0>; + + mdio@24520 { + device_type = "mdio"; + compatible = "gianfar"; + reg = <24520 20>; + linux,phandle = <24520>; + #address-cells = <1>; + #size-cells = <0>; + ethernet-phy@0 { + linux,phandle = <2452000>; + interrupt-parent = <40000>; + interrupts = <35 1>; + reg = <0>; + device_type = "ethernet-phy"; + }; + ethernet-phy@1 { + linux,phandle = <2452001>; + interrupt-parent = <40000>; + interrupts = <35 1>; + reg = <1>; + device_type = "ethernet-phy"; + }; + ethernet-phy@2 { + linux,phandle = <2452002>; + interrupt-parent = <40000>; + interrupts = <37 1>; + reg = <2>; + device_type = "ethernet-phy"; + }; + ethernet-phy@3 { + linux,phandle = <2452003>; + interrupt-parent = <40000>; + interrupts = <37 1>; + reg = <3>; + device_type = "ethernet-phy"; + }; + }; + + ethernet@24000 { + device_type = "network"; + model = "TSEC"; + compatible = "gianfar"; + reg = <24000 1000>; + address = [ 00 00 0C 00 00 FD ]; + interrupts = <d 0 e 0 12 0>; + interrupt-parent = <40000>; + phy-handle = <2452000>; + }; + + ethernet@25000 { + #address-cells = <1>; + #size-cells = <0>; + device_type = "network"; + model = "TSEC"; + compatible = "gianfar"; + reg = <25000 1000>; + address = [ 00 00 0C 00 01 FD ]; + interrupts = <13 0 14 0 18 0>; + interrupt-parent = <40000>; + phy-handle = <2452001>; + }; + + pci@8000 { + linux,phandle = <8000>; + #interrupt-cells = <1>; + #size-cells = <2>; + #address-cells = <3>; + compatible = "85xx"; + device_type = "pci"; + reg = <8000 400>; + clock-frequency = <3f940aa>; + interrupt-map-mask = <f800 0 0 7>; + interrupt-map = < + + /* IDSEL 0x2 */ + 1000 0 0 1 40000 31 1 + 1000 0 0 2 40000 32 1 + 1000 0 0 3 40000 33 1 + 1000 0 0 4 40000 34 1 + + /* IDSEL 0x3 */ + 1800 0 0 1 40000 34 1 + 1800 0 0 2 40000 31 1 + 1800 0 0 3 40000 32 1 + 1800 0 0 4 40000 33 1 + + /* IDSEL 0x4 */ + 2000 0 0 1 40000 33 1 + 2000 0 0 2 40000 34 1 + 2000 0 0 3 40000 31 1 + 2000 0 0 4 40000 32 1 + + /* IDSEL 0x5 */ + 2800 0 0 1 40000 32 1 + 2800 0 0 2 40000 33 1 + 2800 0 0 3 40000 34 1 + 2800 0 0 4 40000 31 1 + + /* IDSEL 12 */ + 6000 0 0 1 40000 31 1 + 6000 0 0 2 40000 32 1 + 6000 0 0 3 40000 33 1 + 6000 0 0 4 40000 34 1 + + /* IDSEL 13 */ + 6800 0 0 1 40000 34 1 + 6800 0 0 2 40000 31 1 + 6800 0 0 3 40000 32 1 + 6800 0 0 4 40000 33 1 + + /* IDSEL 14*/ + 7000 0 0 1 40000 33 1 + 7000 0 0 2 40000 34 1 + 7000 0 0 3 40000 31 1 + 7000 0 0 4 40000 32 1 + + /* IDSEL 15 */ + 7800 0 0 1 40000 32 1 + 7800 0 0 2 40000 33 1 + 7800 0 0 3 40000 34 1 + 7800 0 0 4 40000 31 1 + + /* IDSEL 18 */ + 9000 0 0 1 40000 31 1 + 9000 0 0 2 40000 32 1 + 9000 0 0 3 40000 33 1 + 9000 0 0 4 40000 34 1 + + /* IDSEL 19 */ + 9800 0 0 1 40000 34 1 + 9800 0 0 2 40000 31 1 + 9800 0 0 3 40000 32 1 + 9800 0 0 4 40000 33 1 + + /* IDSEL 20 */ + a000 0 0 1 40000 33 1 + a000 0 0 2 40000 34 1 + a000 0 0 3 40000 31 1 + a000 0 0 4 40000 32 1 + + /* IDSEL 21 */ + a800 0 0 1 40000 32 1 + a800 0 0 2 40000 33 1 + a800 0 0 3 40000 34 1 + a800 0 0 4 40000 31 1>; + + interrupt-parent = <40000>; + interrupts = <42 0>; + bus-range = <0 0>; + ranges = <02000000 0 80000000 80000000 0 20000000 + 01000000 0 00000000 e2000000 0 01000000>; + }; + + pic@40000 { + linux,phandle = <40000>; + interrupt-controller; + #address-cells = <0>; + #interrupt-cells = <2>; + reg = <40000 20100>; + built-in; + device_type = "mpic"; + }; + + cpm@e0000000 { + linux,phandle = <e0000000>; + #address-cells = <1>; + #size-cells = <1>; + #interrupt-cells = <2>; + device_type = "cpm"; + model = "CPM2"; + ranges = <0 0 c0000>; + reg = <80000 40000>; + command-proc = <919c0>; + brg-frequency = <0>; + + pic@90c00 { + linux,phandle = <90c00>; + interrupt-controller; + #address-cells = <0>; + #interrupt-cells = <2>; + interrupts = <1e 0>; + interrupt-parent = <40000>; + reg = <90c00 80>; + built-in; + device_type = "cpm-pic"; + }; + + scc@91a00 { + device_type = "serial"; + compatible = "cpm_uart"; + model = "SCC"; + device-id = <2>; + reg = <91a00 20 88000 100>; + clock-setup = <00ffffff 0>; + rx-clock = <1>; + tx-clock = <1>; + current-speed = <0>; + interrupts = <64 3>; + interrupt-parent = <90c00>; + }; + + scc@91a20 { + device_type = "serial"; + compatible = "cpm_uart"; + model = "SCC"; + device-id = <3>; + reg = <91a20 20 88100 100>; + clock-setup = <ff00ffff 90000>; + rx-clock = <2>; + tx-clock = <2>; + current-speed = <0>; + interrupts = <65 3>; + interrupt-parent = <90c00>; + }; + + fcc@91320 { + device_type = "network"; + compatible = "fs_enet"; + model = "FCC"; + device-id = <3>; + reg = <91320 20 88500 100 913a0 30>; + mac-address = [ 00 00 0C 00 02 FD ]; + clock-setup = <ff00ffff 250000>; + rx-clock = <15>; + tx-clock = <16>; + interrupts = <5d 3>; + interrupt-parent = <90c00>; + phy-handle = <2452002>; + }; + + fcc@91340 { + device_type = "network"; + compatible = "fs_enet"; + model = "FCC"; + device-id = <4>; + reg = <91340 20 88600 100 913d0 30>; + mac-address = [ 00 00 0C 00 03 FD ]; + clock-setup = <ffff00ff 3700>; + rx-clock = <17>; + tx-clock = <18>; + interrupts = <5e 3>; + interrupt-parent = <90c00>; + phy-handle = <2452003>; + }; + }; + }; +};
arch/powerpc/configs/mpc8560_ads_defconfig new file +854 -0
854 lines not on this page · raw message
arch/powerpc/platforms/85xx/Kconfig +11 -0
@@ -11,6 +11,12 @@ config MPC8540_ADS help This option enables support for the MPC 8540 ADS board +config MPC8560_ADS + bool "Freescale MPC8560 ADS" + select DEFAULT_UIMAGE + help + This option enables support for the MPC 8560 ADS board + config MPC85xx_CDS bool "Freescale MPC85xx CDS" select DEFAULT_UIMAGE
@@ -26,6 +32,11 @@ config MPC8540 select PPC_INDIRECT_PCI default y if MPC8540_ADS || MPC85xx_CDS +config MPC8560 + bool + select PPC_INDIRECT_PCI + default y if MPC8560_ADS + config PPC_INDIRECT_PCI_BE bool depends on PPC_85xx
arch/powerpc/platforms/85xx/Makefile +1 -0
@@ -3,4 +3,5 @@ # Makefile for the PowerPC 85xx linux ke # obj-$(CONFIG_PPC_85xx) += misc.o pci.o obj-$(CONFIG_MPC8540_ADS) += mpc85xx_ads.o +obj-$(CONFIG_MPC8560_ADS) += mpc85xx_ads.o obj-$(CONFIG_MPC85xx_CDS) += mpc85xx_cds.o
arch/powerpc/platforms/85xx/mpc8540_ads.h +8 -4
@@ -6,6 +6,10 @@* Maintainer: Kumar Gala <[email protected]> * * Copyright 2004 Freescale Semiconductor Inc. +* +* 2006 (c) MontaVista Software, Inc. +* Vitaly Bordug <[email protected]> +* Merged to arch/powerpc * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the
@@ -24,10 +28,10 @@ #define BCSR_ADDR ((uint)0xf8000000)#define BCSR_SIZE ((uint)(32 * 1024))/* PCI interrupt controller */ -#define PIRQA MPC85xx_IRQ_EXT1 -#define PIRQB MPC85xx_IRQ_EXT2 -#define PIRQC MPC85xx_IRQ_EXT3 -#define PIRQD MPC85xx_IRQ_EXT4 +#define PIRQA 49 +#define PIRQB 50 +#define PIRQC 51 +#define PIRQD 52/* Offset of CPM register space */ #define CPM_MAP_ADDR (CCSRBAR + MPC85xx_CPM_OFFSET)
arch/powerpc/platforms/85xx/mpc8560_ads.h new file +65 -0
65 lines not on this page · raw message
arch/powerpc/platforms/85xx/mpc85xx.h +1 -0
@@ -16,3 +16,4 @@extern void mpc85xx_restart (char *);extern int add_bridge (struct device_node *dev); +extern void mpc85xx_pcibios_fixup (void );
arch/powerpc/platforms/85xx/mpc85xx_ads.c +268 -66
418 lines not on this page · raw message
arch/powerpc/platforms/85xx/pci.c +12 -0
@@ -3,6 +3,10 @@* * Maintained by Kumar Gala (see MAINTAINERS for contact information) * +* 2006 (c) MontaVista Software, Inc. +* Vitaly Bordug <[email protected]> +* Merged to arch/powerpc +* * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your
@@ -93,4 +97,12 @@ int __init add_bridge(struct device_node return 0; } +void __init mpc85xx_pcibios_fixup (void ) +{ +struct pci_dev *dev =NULL ; + +for_each_pci_dev (dev) +pci_read_irq_line (dev); +} +#endif
include/asm-powerpc/mpc85xx.h new file +199 -0
199 lines not on this page · raw message
Re: [PATCH 4/6] POWERPC: add support of mpc8560 eval board
Quoted 7 lines · Vitaly Bordug
arch/powerpc/boot/dts/mpc8560ads.dts new file +0
-0
arch/powerpc/boot/dts/mpc8560ads.dts line 108
Quoted 9 lines
arch/powerpc/boot/dts/mpc8560ads.dts new file +8
-0@@ -0,0 +1,310 @@ + + ethernet@24000 { + device_type = "network"; + model = "TSEC"; + compatible = "gianfar"; + reg = <24000 1000>; + address = [ 00 00 0C 00 00 FD ]; + interrupts = <d 0 e 0 12 0>;
Your sense values are wrong here. Should be "2"
ie - interrupts = <d 2 e 2 12 2>;
arch/powerpc/boot/dts/mpc8560ads.dts line 121
Quoted 13 lines
arch/powerpc/boot/dts/mpc8560ads.dts new file +13
-0+ interrupt-parent = <40000>; + phy-handle = <2452000>; + }; + + ethernet@25000 { + #address-cells = <1>; + #size-cells = <0>; + device_type = "network"; + model = "TSEC"; + compatible = "gianfar"; + reg = <25000 1000>; + address = [ 00 00 0C 00 01 FD ]; + interrupts = <13 0 14 0 18 0>;
Here, too
arch/powerpc/boot/dts/mpc8560ads.dts line 224
Quoted 8 lines
arch/powerpc/boot/dts/mpc8560ads.dts new file +8
-0+ pic@40000 { + linux,phandle = <40000>; + interrupt-controller; + #address-cells = <0>; + #interrupt-cells = <2>; + reg = <40000 20100>; + built-in; + device_type = "mpic";
This is wrong. It should be "open-pic";
arch/powerpc/boot/dts/mpc8560ads.dts line 227
Quoted 3 lines
arch/powerpc/boot/dts/mpc8560ads.dts new file +3
-0+ }; + + cpm@e0000000 {
I'm going to leave this to others to discuss, since I'm not a CPM expert. But you may want to double-check your interrupt sense values, and make sure the encodings are right.
Quoted 5 lines
arch/powerpc/platforms/85xx/Kconfig +0
-0
arch/powerpc/platforms/85xx/Kconfig config MPC8540_ADS · line 19
Quoted 9 lines
arch/powerpc/platforms/85xx/Kconfig +6
-0@@ -11,6 +11,12 @@ config MPC8540_ADS help This option enables support for the MPC 8540 ADS board +config MPC8560_ADS + bool "Freescale MPC8560 ADS" + select DEFAULT_UIMAGE + help + This option enables support for the MPC 8560 ADS board +
If at all possible, I think that the 8560 shouldn't be a config option. It's just an 85xx ADS, and use the dts to distinguish. But keeping separate defconfigs seems like a good idea.
Quoted 19 lines
arch/powerpc/platforms/85xx/mpc8540_ads.h +4
-0@@ -6,6 +6,10 @@* Maintainer: Kumar Gala <[email protected]> * * Copyright 2004 Freescale Semiconductor Inc. +* +* 2006 (c) MontaVista Software, Inc. +* Vitaly Bordug <[email protected]> +* Merged to arch/powerpc * * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as
published by thearch/powerpc/platforms/85xx/mpc8540_ads.h +0
-0@@ -24,10 +28,10 @@ #define BCSR_ADDR ((uint)0xf8000000)#define BCSR_SIZE ((uint)(32 * 1024))
arch/powerpc/platforms/85xx/mpc8540_ads.h #define BCSR_ADDR ((uint)0xf8000000) · line 34
Quoted 10 lines
arch/powerpc/platforms/85xx/mpc8540_ads.h +4
-4/* PCI interrupt controller */ -#define PIRQA MPC85xx_IRQ_EXT1 -#define PIRQB MPC85xx_IRQ_EXT2 -#define PIRQC MPC85xx_IRQ_EXT3 -#define PIRQD MPC85xx_IRQ_EXT4 +#define PIRQA 49 +#define PIRQB 50 +#define PIRQC 51 +#define PIRQD 52
Wha?! I can't imagine any reason this change would be acceptable. Especially since your patch needs to apply against a tree with the new irq code, which doesn't need such hard-coded values. We get them from the dts.
arch/powerpc/platforms/85xx/mpc8560_ads.h
Quoted 1 line
arch/powerpc/platforms/85xx/mpc8560_ads.h +0
-0
This file should be able to go away, now, and get merged with mpc8540_ads.h. While we're at it, mpc8540_ads.h should become mpc85xx_ads.h
arch/powerpc/platforms/85xx/mpc85xx.h line 19
Quoted 9 lines
arch/powerpc/platforms/85xx/mpc85xx.h +1
-0@@ -16,3 +16,4 @@extern void mpc85xx_restart (char *);extern int add_bridge (struct device_node *dev); +extern void mpc85xx_pcibios_fixup (void );
Why is this being "exported"?
arch/powerpc/platforms/85xx/mpc85xx_ads.c line 10
Quoted 12 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +4
-0@@ -4,6 +4,10 @@* Maintained by Kumar Gala (see MAINTAINERS for contact information) * * Copyright 2005 Freescale Semiconductor Inc. +* +* 2006 (c) MontaVista Software, Inc. +* Vitaly Bordug <[email protected]> +* Merged to arch/powerpc
This comment is confusing. This file was already "merged". Regardless, I believe there's a general policy against putting change logs in the header.
Quoted 17 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +4
-4@@ -47,19 +59,19 @@ static u_char mpc85xx_ads_openpic_initse MPC85XX_INTERNAL_IRQ_SENSES, 0x0, /* External 0: */#if defined(CONFIG_PCI ) - (IRQ_SENSE_LEVEL |IRQ_POLARITY_NEGATIVE ),/* Ext 1: PCI slot 0 */ - (IRQ_SENSE_LEVEL |IRQ_POLARITY_NEGATIVE ),/* Ext 2: PCI slot 1 */ - (IRQ_SENSE_LEVEL |IRQ_POLARITY_NEGATIVE ),/* Ext 3: PCI slot 2 */ - (IRQ_SENSE_LEVEL |IRQ_POLARITY_NEGATIVE ),/* Ext 4: PCI slot 3 */ +IRQ_TYPE_LEVEL_LOW ,/* Ext 1: PCI slot 0 */ +IRQ_TYPE_LEVEL_LOW ,/* Ext 2: PCI slot 1 */ +IRQ_TYPE_LEVEL_LOW ,/* Ext 3: PCI slot 2 */ +IRQ_TYPE_LEVEL_LOW ,/* Ext 4: PCI slot 3 */ #else0x0 ,/* External 1: */ 0x0 ,/* External 2: */ 0x0, /* External 3: */
arch/powerpc/platforms/85xx/mpc85xx_ads.c static u_char mpc85xx_ads_openpic_initse · line 77
Quoted 10 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +2
-20x0 ,/* External 4: */ #endif - (IRQ_SENSE_LEVEL |IRQ_POLARITY_NEGATIVE ),/* External 5: PHY */ +IRQ_TYPE_LEVEL_LOW ,/* External 5: PHY */ 0x0 ,/* External 6: */ - (IRQ_SENSE_LEVEL |IRQ_POLARITY_NEGATIVE ),/* External 7: PHY */ +IRQ_TYPE_LEVEL_LOW ,/* External 7: PHY */ 0x0 ,/* External 8: */ 0x0 ,/* External 9: */ 0x0, /* External 10: */
This isn't how interrupt senses are supposed to be done now. They should be gotten from the device tree. This whole array can be deleted.
arch/powerpc/platforms/85xx/mpc85xx_ads.c #ifdef CONFIG_PCI · line 89
Quoted 5 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +0
-0@@ -74,40 +86,109 @@ #ifdef CONFIG_PCIint mpc85xx_map_irq (struct pci_dev *dev,unsigned char idsel,unsigned char pin) {
This whole function can be deleted.
Quoted 97 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +93
-0+struct device_node * pci_OF; +struct irq_map_of_mask { +unsigned int idsel_msk; +unsigned int slot_msk; +unsigned int offset_irqs_msk; +unsigned int line_msk; + } *ip; +int i; +struct irq_of_table_s { +struct { +unsigned int idsel; +unsigned int slot; +unsigned int offset_irqs; +unsigned int line; +unsigned int parent; +unsigned int table_item; +unsigned int ext_irqs; + } idsel[1 ]; + }* irq_of_table; + + + pci_OF =of_find_node_by_type (NULL ,"pci" ); +if (pci_OF) { +unsigned long max_idsel =0 ; +unsigned long min_idsel =0xffffffff ; +unsigned long irqs_per_slot =0 ; +unsigned int idsel_ =0 ; +unsigned int line; +unsigned int * irq; +unsigned int ip_len; +unsigned int irq_table_len; +unsigned int irq_len; + + ip = (struct irq_map_of_mask*)get_property(pci_OF, "interrupt- map-mask", &ip_len); + + irq_of_table = (struct irq_of_table_s *)get_property (pci_OF, "interrupt-map", &irq_table_len); + + irq = (unsigned int *)get_property (pci_OF,"interrupts" , &irq_len); + +if (ip && irq_of_table && irq && ip_len && irq_table_len && irq_len ) { +for (i=0 ; i<irq_table_len/sizeof (irq_of_table->idsel[0 ]); i++) { + line = irq_of_table->idsel[i].line & ip->line_msk; + idsel_ = (irq_of_table->idsel[i].idsel & ip->idsel_msk) >>11 ; + + irqs_per_slot = (line > irqs_per_slot) ? line : irqs_per_slot; + min_idsel = (idsel_ < min_idsel) ? idsel_ : min_idsel; + max_idsel = (idsel_ > max_idsel) ? idsel_ : max_idsel; + } + +do { +char pci_irq_table[max_idsel - min_idsel +1 ][irqs_per_slot]; + +memset (&pci_irq_table[0 ][0 ],0 ,sizeof (pci_irq_table)); +for (i = irq_table_len/sizeof (irq_of_table->idsel[0 ]) -1 ; i>=0 ; i--) { + idsel_ = (irq_of_table->idsel[i].idsel & ip->idsel_msk) >>11 ; + + line = irq_of_table->idsel[i].line & ip->line_msk; + pci_irq_table[idsel_ - min_idsel][line-1 ] = + irq_of_table->idsel[i].table_item; + } + +return PCI_IRQ_TABLE_LOOKUP ; + }while (0 ); + }else { +printk (KERN_INFO "%s: device tree ERROR\n" ,__func__); +return -1 ; + } + }else { +static char pci_irq_table[][4 ] = +/* +* This is little evil, but works around the fact +* that revA boards have IDSEL starting at 18 +* and others boards (older) start at 12 +* +* PCI IDSEL/INTPIN->INTLINE +* A B C D +*/ + { + {PIRQA ,PIRQB ,PIRQC ,PIRQD },/* IDSEL 2 */ + {PIRQD ,PIRQA ,PIRQB ,PIRQC }, + {PIRQC ,PIRQD ,PIRQA ,PIRQB }, + {PIRQB ,PIRQC ,PIRQD ,PIRQA },/* IDSEL 5 */ + {0 ,0 ,0 ,0 },/* -- */ + {0 ,0 ,0 ,0 },/* -- */ + {0 ,0 ,0 ,0 },/* -- */ + {0 ,0 ,0 ,0 },/* -- */ + {0 ,0 ,0 ,0 },/* -- */ + {0 ,0 ,0 ,0 },/* -- */ + {PIRQA ,PIRQB ,PIRQC ,PIRQD },/* IDSEL 12 */ + {PIRQD ,PIRQA ,PIRQB ,PIRQC }, + {PIRQC ,PIRQD ,PIRQA ,PIRQB }, + {PIRQB ,PIRQC ,PIRQD ,PIRQA },/* IDSEL 15 */ + {0 ,0 ,0 ,0 },/* -- */
arch/powerpc/platforms/85xx/mpc85xx_ads.c #ifdef CONFIG_PCI · line 191
Quoted 10 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +10
-0+ {0, 0, 0, 0}, /* -- */ + {PIRQA, PIRQB, PIRQC, PIRQD}, /* IDSEL 18 */ + {PIRQD, PIRQA, PIRQB, PIRQC}, + {PIRQC, PIRQD, PIRQA, PIRQB}, + {PIRQB, PIRQC, PIRQD, PIRQA}, /* IDSEL 21 */ + }; + +const long min_idsel =2 , max_idsel =21 , irqs_per_slot =4 ; +return PCI_IRQ_TABLE_LOOKUP ; + }
Is there some reason you reimplemented code that already exists for mapping PCI interrupts? Delete this function, and instead add:
void __initmpc85xx_pcibios_fixup(void)
{
struct pci_dev *dev = NULL;
for_each_pci_dev(dev)
pci_read_irq_line(dev);
}Hm. I see you added that function to pci.c. Anyway, you don't need the map_irq function anymore
arch/powerpc/platforms/85xx/mpc85xx_ads.c mpc85xx_exclude_device(u_char bus, u_cha · line 271
Quoted 4 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +4
-0+mpic_set_default_senses (mpic1, + mpc85xx_ads_openpic_initsenses, +sizeof (mpc85xx_ads_openpic_initsenses)); +
No. We have parse_and_map to handle this.
arch/powerpc/platforms/85xx/mpc85xx_ads.c
Quoted 2 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0mpic_init (mpic1); +of_node_put (np);
Are we definitely supposed to release the of nodes after we call init? Actually, it looks like you can put that after mpic_alloc(). mpic_alloc() grabs a reference, so we don't need it after that.
Quoted 4 lines
/*
* Setup the architecture
*/
There should probably be an #ifdef CONFIG_CPM2 here
Quoted 1 line
+static void
init_fcc_ioports(void)
...
include/asm-powerpc/mpc85xx.h
Quoted 1 line
include/asm-powerpc/mpc85xx.h +0
-0
This file really needs to be cleaned up. Most of the stuff in here can go.
Andy
Re: [PATCH 4/6] POWERPC: add support of mpc8560 eval board
Quoted 10 lines
arch/powerpc/boot/dts/mpc8560ads.dts line 224
Quoted 8 lines
arch/powerpc/boot/dts/mpc8560ads.dts new file +8
-0+ pic@40000 { + linux,phandle = <40000>; + interrupt-controller; + #address-cells = <0>; + #interrupt-cells = <2>; + reg = <40000 20100>; + built-in; + device_type = "mpic";This is wrong. It should be "open-pic";
Not necessarily; if not, it should have "open-pic" somewhere in the "compatible" property though.
Best might be to have device_type = interrupt-controller, and put "mpic,open-pic" in the "compatible" property (no comma but a zero byte...)
Or prefix it with the name of your _exact_ interrupt controller, even.
Segher
Re: [PATCH 4/6] POWERPC: add support of mpc8560 eval board
In reply to Andy FlemingQuoted 13 lines · On Thu, 17 Aug 2006 15:04:11 -0500 Andy Fleming wrote:
Quoted 9 lines · Vitaly Bordug
arch/powerpc/ renamed from arch/powerpc/boot/dts/mpc8560ads.dts +0
-0
boot/dts/mpc8560ads.dts
new file mode 100644
index 0000000..f6ccb99arch/powerpc/boot/dts/mpc8560ads.dts new file +0
-0@@ -0,0 +1,310 @@
Quoted 12 lines
arch/powerpc/boot/dts/mpc8560ads.dts line 108
Quoted 8 lines
arch/powerpc/boot/dts/mpc8560ads.dts new file +8
-0+ + ethernet@24000 { + device_type = "network"; + model = "TSEC"; + compatible = "gianfar"; + reg = <24000 1000>; + address = [ 00 00 0C 00 00 FD ]; + interrupts = <d 0 e 0 12 0>;Your sense values are wrong here. Should be "2"
ie - interrupts = <d 2 e 2 12 2>;
Here and below:
those were derived from the original dts's an since it worked "as it is" I didn't fairly care atm.
It is clear, that the spec itself is 100% non-contradictory and consistent, so my main concern was to make-it-work. And, those stuff seems not to be taken into account (may be wrong `tho, haven't really looked into, Ben ?
)
Quoted 18 lines
Quoted 4 lines
arch/powerpc/boot/dts/mpc8560ads.dts new file +3
-0+ interrupt-parent = <40000>; + phy-handle = <2452000>; + };arch/powerpc/boot/dts/mpc8560ads.dts line 121
Quoted 10 lines
arch/powerpc/boot/dts/mpc8560ads.dts new file +10
-0+ + ethernet@25000 { + #address-cells = <1>; + #size-cells = <0>; + device_type = "network"; + model = "TSEC"; + compatible = "gianfar"; + reg = <25000 1000>; + address = [ 00 00 0C 00 01 FD ]; + interrupts = <13 0 14 0 18 0>;Here, too
ditto
Quoted 11 lines
arch/powerpc/boot/dts/mpc8560ads.dts line 224
Quoted 8 lines
arch/powerpc/boot/dts/mpc8560ads.dts new file +8
-0+ pic@40000 { + linux,phandle = <40000>; + interrupt-controller; + #address-cells = <0>; + #interrupt-cells = <2>; + reg = <40000 20100>; + built-in; + device_type = "mpic";This is wrong. It should be "open-pic";
I am recalling nogo with open-pic here... I agree with Segher, we'll make this 100% clear and follow that further.
Quoted 9 lines
arch/powerpc/boot/dts/mpc8560ads.dts line 227
Quoted 3 lines
arch/powerpc/boot/dts/mpc8560ads.dts new file +3
-0+ }; + + cpm@e0000000 {I'm going to leave this to others to discuss, since I'm not a CPM expert. But you may want to double-check your interrupt sense values, and make sure the encodings are right.
I am completely open to the comments here..
And my guess is that the irq thing should be clarified and re-synced
with spec. All I can say currently - it works for me so may be used at least as reference for the stuff alike. If the cpm2 description got settle down, I'll update the spec in relevance and hope to make other inconsistencies (irq-related, obsoleted stuff etc. ) addressed.
Quoted 9 lines
Quoted 9 lines
arch/powerpc/ renamed from arch/powerpc/platforms/85xx/Kconfig +0
-0platforms/85xx/Kconfig
index 454fc53..3d440de 100644arch/powerpc/platforms/85xx/Kconfig +0
-0@@ -11,6 +11,12 @@ config MPC8540_ADS help This option enables support for the MPC 8540 ADS board
Quoted 13 lines
arch/powerpc/platforms/85xx/Kconfig config MPC8540_ADS · line 19
Quoted 6 lines
arch/powerpc/platforms/85xx/Kconfig +6
-0+config MPC8560_ADS + bool "Freescale MPC8560 ADS" + select DEFAULT_UIMAGE + help + This option enables support for the MPC 8560 ADS board +If at all possible, I think that the 8560 shouldn't be a config option. It's just an 85xx ADS, and use the dts to distinguish. But keeping separate defconfigs seems like a good idea.
Agreed.
Quoted 23 lines
Quoted 23 lines
arch/ renamed from arch/powerpc/platforms/85xx/mpc8540_ads.h +0
-0
powerpc/platforms/85xx/mpc8540_ads.h
index c0d56d2..670abaf 100644arch/powerpc/platforms/85xx/mpc8540_ads.h +4
-0@@ -6,6 +6,10 @@* Maintainer: Kumar Gala <[email protected]> * * Copyright 2004 Freescale Semiconductor Inc. +* +* 2006 (c) MontaVista Software, Inc. +* Vitaly Bordug <[email protected]> +* Merged to arch/powerpc * * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as
published by thearch/powerpc/platforms/85xx/mpc8540_ads.h +0
-0@@ -24,10 +28,10 @@ #define BCSR_ADDR((uint)0xf8000000) #define
BCSR_SIZE((uint)(32 *
1024))
Quoted 17 lines
arch/powerpc/platforms/85xx/mpc8540_ads.h #define BCSR_ADDR ((uint)0xf8000000) · line 34
Quoted 9 lines
/* PCI interrupt controller */
arch/powerpc/platforms/85xx/mpc8540_ads.h +4
-4-#define PIRQA MPC85xx_IRQ_EXT1 -#define PIRQB MPC85xx_IRQ_EXT2 -#define PIRQC MPC85xx_IRQ_EXT3 -#define PIRQD MPC85xx_IRQ_EXT4 +#define PIRQA 49 +#define PIRQB 50 +#define PIRQC 51 +#define PIRQD 52Wha?! I can't imagine any reason this change would be acceptable. Especially since your patch needs to apply against a tree with the new irq code, which doesn't need such hard-coded values. We get them from the dts.
Tend to be cleanup_miss, the same as note below.
Quoted 15 lines
Quoted 2 lines
arch/ renamed from arch/powerpc/platforms/85xx/mpc8560_ads.h +0
-0
powerpc/platforms/85xx/mpc8560_ads.hThis file should be able to go away, now, and get merged with
mpc8540_ads.h. While we're at it,mpc8540_ads.hshould becomempc85xx_ads.hQuoted 7 lines
arch/powerpc/ renamed from arch/powerpc/platforms/85xx/mpc85xx.h +0
-0
platforms/85xx/mpc85xx.h
index b44db62..4fe613e 100644arch/powerpc/platforms/85xx/mpc85xx.h +0
-0@@ -16,3 +16,4 @@
Quoted 6 lines
arch/powerpc/platforms/85xx/mpc85xx.h line 19
Quoted 3 lines
arch/powerpc/platforms/85xx/mpc85xx.h +1
-0extern void mpc85xx_restart (char *);extern int add_bridge (struct device_node *dev); +extern void mpc85xx_pcibios_fixup (void );Why is this being "exported"?
To make it compile :) will be fixed in the reordering in the next respin.
Quoted 9 lines
Quoted 9 lines
arch/ renamed from arch/powerpc/platforms/85xx/mpc85xx_ads.c +0
-0
powerpc/platforms/85xx/mpc85xx_ads.c
index d0cfcdb..974e035 100644arch/powerpc/platforms/85xx/mpc85xx_ads.c +0
-0@@ -4,6 +4,10 @@* Maintained by Kumar Gala (see MAINTAINERS for contact information) *
* Copyright 2005 Freescale Semiconductor Inc.
Quoted 9 lines
Quoted 4 lines
+ *
+ * 2006 (c) MontaVista Software, Inc.
+ * Vitaly Bordug <[email protected]>
+ * Merged toarch/powerpcThis comment is confusing. This file was already "merged". Regardless, I believe there's a general policy against putting change logs in the header.
The last line is extra here - copy-paste thing. I added the upper line to make it clear that though I've created the file(s) in powerpc/, that is only "merge" thing, which is not quite right for this particular file, sorry about that.
Quoted 31 lines
Quoted 31 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +0
-1@@ -47,19 +59,19 @@ static u_char mpc85xx_ads_openpic_initse MPC85XX_INTERNAL_IRQ_SENSES, 0x0, /* External 0: */#if defined(CONFIG_PCI ) - (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* Ext1: PCI slot 0 */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +0
-1- (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* Ext2: PCI slot 1 */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +0
-1- (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* Ext3: PCI slot 2 */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +0
-1- (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* Ext4: PCI slot 3 */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +4
-1+IRQ_TYPE_LEVEL_LOW ,/* Ext 1: PCI slot 0 */ +IRQ_TYPE_LEVEL_LOW ,/* Ext 2: PCI slot 1 */ +IRQ_TYPE_LEVEL_LOW ,/* Ext 3: PCI slot 2 */ +IRQ_TYPE_LEVEL_LOW ,/* Ext 4: PCI slot 3 */ #else0x0 ,/* External 1: */ 0x0 ,/* External 2: */ 0x0 ,/* External 3: */ 0x0, /* External 4: */ #endif - (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /*External 5: PHY */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-1+IRQ_TYPE_LEVEL_LOW ,/* External 5: PHY */ 0x0, /* External 6: */ - (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /*External 7: PHY */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ IRQ_TYPE_LEVEL_LOW, /* External 7: PHY */
Quoted 10 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c static u_char mpc85xx_ads_openpic_initse · line 77
Quoted 3 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +0
-00x0 ,/* External 8: */ 0x0 ,/* External 9: */ 0x0, /* External 10: */This isn't how interrupt senses are supposed to be done now. They should be gotten from the device tree. This whole array can be deleted.
Here and below about PCI irq stuff - OK.
Quoted 160 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c #ifdef CONFIG_PCI · line 89
Quoted 5 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +0
-0@@ -74,40 +86,109 @@ #ifdef CONFIG_PCIint mpc85xx_map_irq (struct pci_dev *dev,unsigned char idsel,unsigned char pin) {This whole function can be deleted.
Quoted 124 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +36
-0+struct device_node * pci_OF; +struct irq_map_of_mask { +unsigned int idsel_msk; +unsigned int slot_msk; +unsigned int offset_irqs_msk; +unsigned int line_msk; + } *ip; +int i; +struct irq_of_table_s { +struct { +unsigned int idsel; +unsigned int slot; +unsigned int offset_irqs; +unsigned int line; +unsigned int parent; +unsigned int table_item; +unsigned int ext_irqs; + } idsel[1 ]; + }* irq_of_table; + + + pci_OF =of_find_node_by_type (NULL ,"pci" ); +if (pci_OF) { +unsigned long max_idsel =0 ; +unsigned long min_idsel =0xffffffff ; +unsigned long irqs_per_slot =0 ; +unsigned int idsel_ =0 ; +unsigned int line; +unsigned int * irq; +unsigned int ip_len; +unsigned int irq_table_len; +unsigned int irq_len; + + ip = (struct irq_map_of_mask *)get_property (pci_OF,"interrupt- map-mask" , &ip_len); + + irq_of_table = (struct irq_of_table_s*)get_property(pci_OF, "interrupt-map",
&irq_table_len); +arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ irq = (unsigned int*)get_property(pci_OF,"interrupts",
&irq_len); +arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ if (ip && irq_of_table && irq && ip_len &&
irq_table_len&&irq_len) {arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ for (i=0;i<irq_table_len/sizeof(irq_of_table->idsel[0]); i++) {
arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ line = irq_of_table->idsel[i].line&
ip->line_msk;arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ idsel_ =(irq_of_table->idsel[i].idsel &
ip->idsel_msk) >> 11; +arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ irqs_per_slot = (line >
irqs_per_slot) ? line :irqs_per_slot;arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ min_idsel = (idsel_ <
min_idsel) ?idsel_:min_idsel;arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ max_idsel = (idsel_ >
max_idsel) ?idsel_:max_idsel;arch/powerpc/platforms/85xx/mpc85xx_ads.c +4
-0+ } + + do { + char pci_irq_table[max_idsel -
min_idsel+ 1][irqs_per_slot]; +arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ memset(&pci_irq_table[0][0], 0,
sizeof(pci_irq_table));arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ for (i =irq_table_len/sizeof(irq_of_table->idsel[0]) - 1;
i>=0; i--) {arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ idsel_ =(irq_of_table->idsel[i].idsel &
ip->idsel_msk) >> 11; +arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ line =irq_of_table->idsel[i].line &
ip->line_msk;arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ pci_irq_table[idsel_ -min_idsel][line-1] =
+
irq_of_table->idsel[i].table_item;arch/powerpc/platforms/85xx/mpc85xx_ads.c +6
-0+ } + +return PCI_IRQ_TABLE_LOOKUP ; + }while (0 ); + } else { + printk(KERN_INFO "%s: device treeERROR\n",__func__);
arch/powerpc/platforms/85xx/mpc85xx_ads.c +6
-0+return -1 ; + } + }else { +static char pci_irq_table[][4 ] = +/* +* This is little evil, but works around the fact
arch/powerpc/platforms/85xx/mpc85xx_ads.c +8
-0+* that revA boards have IDSEL starting at 18 +* and others boards (older) start at 12 +* +* PCI IDSEL/INTPIN->INTLINE +* A B C D +*/ + { + {PIRQA, PIRQB, PIRQC, PIRQD}, /*IDSEL 2 */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +3
-0+ {PIRQD, PIRQA, PIRQB, PIRQC}, + {PIRQC, PIRQD, PIRQA, PIRQB}, + {PIRQB, PIRQC, PIRQD, PIRQA}, /*IDSEL 5 */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +7
-0+ {0, 0, 0, 0}, /* -- */ + {0, 0, 0, 0}, /* -- */ + {0, 0, 0, 0}, /* -- */ + {0, 0, 0, 0}, /* -- */ + {0, 0, 0, 0}, /* -- */ + {0, 0, 0, 0}, /* -- */ + {PIRQA, PIRQB, PIRQC, PIRQD}, /*IDSEL 12 */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +3
-0+ {PIRQD, PIRQA, PIRQB, PIRQC}, + {PIRQC, PIRQD, PIRQA, PIRQB}, + {PIRQB, PIRQC, PIRQD, PIRQA}, /*IDSEL 15 */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +3
-0+ {0, 0, 0, 0}, /* -- */ + {0, 0, 0, 0}, /* -- */ + {PIRQA, PIRQB, PIRQC, PIRQD}, /*IDSEL 18 */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +3
-0+ {PIRQD, PIRQA, PIRQB, PIRQC}, + {PIRQC, PIRQD, PIRQA, PIRQB}, + {PIRQB, PIRQC, PIRQD, PIRQA}, /*IDSEL 21 */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +3
-0+ }; + + const long min_idsel = 2, max_idsel = 21,
irqs_per_slot= 4;arch/powerpc/platforms/85xx/mpc85xx_ads.c
Quoted 2 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +2
-0+return PCI_IRQ_TABLE_LOOKUP ; + }Is there some reason you reimplemented code that already exists for mapping PCI interrupts? Delete this function, and instead add:
void
__initmpc85xx_pcibios_fixup(void){ struct pci_dev *dev = NULL; for_each_pci_dev(dev) pci_read_irq_line(dev); }Hm. I see you added that function to
pci.c. Anyway, you don't need themap_irqfunction anymoreQuoted 4 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +3
-0+ mpic_set_default_senses(mpic1, + mpc85xx_ads_openpic_initsenses, +
sizeof(mpc85xx_ads_openpic_initsenses)); +No. We have
parse_and_mapto handle this.
Quoted 7 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c
Quoted 2 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0mpic_init (mpic1); +of_node_put (np);Are we definitely supposed to release the of nodes after we call init? Actually, it looks like you can put that after
mpic_alloc().mpic_alloc()grabs a reference, so we don't need it after that.
Looks like true, but I'll double-check this anyway.
Quoted 8 lines
Quoted 5 lines
/*
* Setup the architecture
*/There should probably be an #ifdef
CONFIG_CPM2here
ok
Quoted 6 lines
Quoted 1 line
+static void
init_fcc_ioports(void)...
Quoted 6 lines
Quoted 2 lines
include/asm-powerpc/ renamed from include/asm-powerpc/mpc85xx.h +0
-0
mpc85xx.hThis file really needs to be cleaned up. Most of the stuff in here can go.
My guess to separate the "cleanup_obsolete" and "add_new_stuff" in some ways, it it does not prevent stuff from work. Note that there are still a lot of confusion with ppc/powerpc header mix. So "cleanup" patch should be carefully tested with both ppc and powerpc. I am aware that mpc85xx.h exist in both instances, these are just generic thoughts.
Thanks for the comments and review.
Quoted 3 lines
Andy
Re: [PATCH 4/6] POWERPC: add support of mpc8560 eval board
In reply to Andy FlemingQuoted 13 lines · On Thu, 17 Aug 2006 15:04:11 -0500 Andy Fleming wrote:
Quoted 9 lines · Vitaly Bordug
arch/powerpc/ renamed from arch/powerpc/boot/dts/mpc8560ads.dts +0
-0
boot/dts/mpc8560ads.dts
new file mode 100644
index 0000000..f6ccb99arch/powerpc/boot/dts/mpc8560ads.dts new file +0
-0@@ -0,0 +1,310 @@
Quoted 12 lines
arch/powerpc/boot/dts/mpc8560ads.dts line 108
Quoted 8 lines
arch/powerpc/boot/dts/mpc8560ads.dts new file +8
-0+ + ethernet@24000 { + device_type = "network"; + model = "TSEC"; + compatible = "gianfar"; + reg = <24000 1000>; + address = [ 00 00 0C 00 00 FD ]; + interrupts = <d 0 e 0 12 0>;Your sense values are wrong here. Should be "2"
ie - interrupts = <d 2 e 2 12 2>;
Here and below:
those were derived from the original dts's an since it worked "as it is" I didn't fairly care atm.
It is clear, that the spec itself is 100% non-contradictory and consistent, so my main concern was to make-it-work. And, those stuff seems not to be taken into account (may be wrong `tho, haven't really looked into, Ben ?
)
Quoted 18 lines
Quoted 4 lines
arch/powerpc/boot/dts/mpc8560ads.dts new file +3
-0+ interrupt-parent = <40000>; + phy-handle = <2452000>; + };arch/powerpc/boot/dts/mpc8560ads.dts line 121
Quoted 10 lines
arch/powerpc/boot/dts/mpc8560ads.dts new file +10
-0+ + ethernet@25000 { + #address-cells = <1>; + #size-cells = <0>; + device_type = "network"; + model = "TSEC"; + compatible = "gianfar"; + reg = <25000 1000>; + address = [ 00 00 0C 00 01 FD ]; + interrupts = <13 0 14 0 18 0>;Here, too
ditto
Quoted 11 lines
arch/powerpc/boot/dts/mpc8560ads.dts line 224
Quoted 8 lines
arch/powerpc/boot/dts/mpc8560ads.dts new file +8
-0+ pic@40000 { + linux,phandle = <40000>; + interrupt-controller; + #address-cells = <0>; + #interrupt-cells = <2>; + reg = <40000 20100>; + built-in; + device_type = "mpic";This is wrong. It should be "open-pic";
I am recalling nogo with open-pic here... I agree with Segher, we'll make this 100% clear and follow that further.
Quoted 9 lines
arch/powerpc/boot/dts/mpc8560ads.dts line 227
Quoted 3 lines
arch/powerpc/boot/dts/mpc8560ads.dts new file +3
-0+ }; + + cpm@e0000000 {I'm going to leave this to others to discuss, since I'm not a CPM expert. But you may want to double-check your interrupt sense values, and make sure the encodings are right.
I am completely open to the comments here..
And my guess is that the irq thing should be clarified and re-synced
with spec. All I can say currently - it works for me so may be used at least as reference for the stuff alike. If the cpm2 description got settle down, I'll update the spec in relevance and hope to make other inconsistencies (irq-related, obsoleted stuff etc. ) addressed.
Quoted 9 lines
Quoted 9 lines
arch/powerpc/ renamed from arch/powerpc/platforms/85xx/Kconfig +0
-0platforms/85xx/Kconfig
index 454fc53..3d440de 100644arch/powerpc/platforms/85xx/Kconfig +0
-0@@ -11,6 +11,12 @@ config MPC8540_ADS help This option enables support for the MPC 8540 ADS board
Quoted 13 lines
arch/powerpc/platforms/85xx/Kconfig config MPC8540_ADS · line 19
Quoted 6 lines
arch/powerpc/platforms/85xx/Kconfig +6
-0+config MPC8560_ADS + bool "Freescale MPC8560 ADS" + select DEFAULT_UIMAGE + help + This option enables support for the MPC 8560 ADS board +If at all possible, I think that the 8560 shouldn't be a config option. It's just an 85xx ADS, and use the dts to distinguish. But keeping separate defconfigs seems like a good idea.
Agreed.
Quoted 23 lines
Quoted 23 lines
arch/ renamed from arch/powerpc/platforms/85xx/mpc8540_ads.h +0
-0
powerpc/platforms/85xx/mpc8540_ads.h
index c0d56d2..670abaf 100644arch/powerpc/platforms/85xx/mpc8540_ads.h +4
-0@@ -6,6 +6,10 @@* Maintainer: Kumar Gala <[email protected]> * * Copyright 2004 Freescale Semiconductor Inc. +* +* 2006 (c) MontaVista Software, Inc. +* Vitaly Bordug <[email protected]> +* Merged to arch/powerpc * * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as
published by thearch/powerpc/platforms/85xx/mpc8540_ads.h +0
-0@@ -24,10 +28,10 @@ #define BCSR_ADDR((uint)0xf8000000) #define
BCSR_SIZE((uint)(32 *
1024))
Quoted 17 lines
arch/powerpc/platforms/85xx/mpc8540_ads.h #define BCSR_ADDR ((uint)0xf8000000) · line 34
Quoted 9 lines
/* PCI interrupt controller */
arch/powerpc/platforms/85xx/mpc8540_ads.h +4
-4-#define PIRQA MPC85xx_IRQ_EXT1 -#define PIRQB MPC85xx_IRQ_EXT2 -#define PIRQC MPC85xx_IRQ_EXT3 -#define PIRQD MPC85xx_IRQ_EXT4 +#define PIRQA 49 +#define PIRQB 50 +#define PIRQC 51 +#define PIRQD 52Wha?! I can't imagine any reason this change would be acceptable. Especially since your patch needs to apply against a tree with the new irq code, which doesn't need such hard-coded values. We get them from the dts.
Tend to be cleanup_miss, the same as note below.
Quoted 15 lines
Quoted 2 lines
arch/ renamed from arch/powerpc/platforms/85xx/mpc8560_ads.h +0
-0
powerpc/platforms/85xx/mpc8560_ads.hThis file should be able to go away, now, and get merged with
mpc8540_ads.h. While we're at it,mpc8540_ads.hshould becomempc85xx_ads.hQuoted 7 lines
arch/powerpc/ renamed from arch/powerpc/platforms/85xx/mpc85xx.h +0
-0
platforms/85xx/mpc85xx.h
index b44db62..4fe613e 100644arch/powerpc/platforms/85xx/mpc85xx.h +0
-0@@ -16,3 +16,4 @@
Quoted 6 lines
arch/powerpc/platforms/85xx/mpc85xx.h line 19
Quoted 3 lines
arch/powerpc/platforms/85xx/mpc85xx.h +1
-0extern void mpc85xx_restart (char *);extern int add_bridge (struct device_node *dev); +extern void mpc85xx_pcibios_fixup (void );Why is this being "exported"?
To make it compile :) will be fixed in the reordering in the next respin.
Quoted 9 lines
Quoted 9 lines
arch/ renamed from arch/powerpc/platforms/85xx/mpc85xx_ads.c +0
-0
powerpc/platforms/85xx/mpc85xx_ads.c
index d0cfcdb..974e035 100644arch/powerpc/platforms/85xx/mpc85xx_ads.c +0
-0@@ -4,6 +4,10 @@* Maintained by Kumar Gala (see MAINTAINERS for contact information) *
* Copyright 2005 Freescale Semiconductor Inc.
Quoted 9 lines
Quoted 4 lines
+ *
+ * 2006 (c) MontaVista Software, Inc.
+ * Vitaly Bordug <[email protected]>
+ * Merged toarch/powerpcThis comment is confusing. This file was already "merged". Regardless, I believe there's a general policy against putting change logs in the header.
The last line is extra here - copy-paste thing. I added the upper line to make it clear that though I've created the file(s) in powerpc/, that is only "merge" thing, which is not quite right for this particular file, sorry about that.
Quoted 31 lines
Quoted 31 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +0
-1@@ -47,19 +59,19 @@ static u_char mpc85xx_ads_openpic_initse MPC85XX_INTERNAL_IRQ_SENSES, 0x0, /* External 0: */#if defined(CONFIG_PCI ) - (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* Ext1: PCI slot 0 */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +0
-1- (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* Ext2: PCI slot 1 */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +0
-1- (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* Ext3: PCI slot 2 */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +0
-1- (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* Ext4: PCI slot 3 */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +4
-1+IRQ_TYPE_LEVEL_LOW ,/* Ext 1: PCI slot 0 */ +IRQ_TYPE_LEVEL_LOW ,/* Ext 2: PCI slot 1 */ +IRQ_TYPE_LEVEL_LOW ,/* Ext 3: PCI slot 2 */ +IRQ_TYPE_LEVEL_LOW ,/* Ext 4: PCI slot 3 */ #else0x0 ,/* External 1: */ 0x0 ,/* External 2: */ 0x0 ,/* External 3: */ 0x0, /* External 4: */ #endif - (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /*External 5: PHY */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-1+IRQ_TYPE_LEVEL_LOW ,/* External 5: PHY */ 0x0, /* External 6: */ - (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /*External 7: PHY */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ IRQ_TYPE_LEVEL_LOW, /* External 7: PHY */
Quoted 10 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c static u_char mpc85xx_ads_openpic_initse · line 77
Quoted 3 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +0
-00x0 ,/* External 8: */ 0x0 ,/* External 9: */ 0x0, /* External 10: */This isn't how interrupt senses are supposed to be done now. They should be gotten from the device tree. This whole array can be deleted.
Here and below about PCI irq stuff - OK.
Quoted 160 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c #ifdef CONFIG_PCI · line 89
Quoted 5 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +0
-0@@ -74,40 +86,109 @@ #ifdef CONFIG_PCIint mpc85xx_map_irq (struct pci_dev *dev,unsigned char idsel,unsigned char pin) {This whole function can be deleted.
Quoted 124 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +36
-0+struct device_node * pci_OF; +struct irq_map_of_mask { +unsigned int idsel_msk; +unsigned int slot_msk; +unsigned int offset_irqs_msk; +unsigned int line_msk; + } *ip; +int i; +struct irq_of_table_s { +struct { +unsigned int idsel; +unsigned int slot; +unsigned int offset_irqs; +unsigned int line; +unsigned int parent; +unsigned int table_item; +unsigned int ext_irqs; + } idsel[1 ]; + }* irq_of_table; + + + pci_OF =of_find_node_by_type (NULL ,"pci" ); +if (pci_OF) { +unsigned long max_idsel =0 ; +unsigned long min_idsel =0xffffffff ; +unsigned long irqs_per_slot =0 ; +unsigned int idsel_ =0 ; +unsigned int line; +unsigned int * irq; +unsigned int ip_len; +unsigned int irq_table_len; +unsigned int irq_len; + + ip = (struct irq_map_of_mask *)get_property (pci_OF,"interrupt- map-mask" , &ip_len); + + irq_of_table = (struct irq_of_table_s*)get_property(pci_OF, "interrupt-map",
&irq_table_len); +arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ irq = (unsigned int*)get_property(pci_OF,"interrupts",
&irq_len); +arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ if (ip && irq_of_table && irq && ip_len &&
irq_table_len&&irq_len) {arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ for (i=0;i<irq_table_len/sizeof(irq_of_table->idsel[0]); i++) {
arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ line = irq_of_table->idsel[i].line&
ip->line_msk;arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ idsel_ =(irq_of_table->idsel[i].idsel &
ip->idsel_msk) >> 11; +arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ irqs_per_slot = (line >
irqs_per_slot) ? line :irqs_per_slot;arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ min_idsel = (idsel_ <
min_idsel) ?idsel_:min_idsel;arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ max_idsel = (idsel_ >
max_idsel) ?idsel_:max_idsel;arch/powerpc/platforms/85xx/mpc85xx_ads.c +4
-0+ } + + do { + char pci_irq_table[max_idsel -
min_idsel+ 1][irqs_per_slot]; +arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ memset(&pci_irq_table[0][0], 0,
sizeof(pci_irq_table));arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ for (i =irq_table_len/sizeof(irq_of_table->idsel[0]) - 1;
i>=0; i--) {arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ idsel_ =(irq_of_table->idsel[i].idsel &
ip->idsel_msk) >> 11; +arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ line =irq_of_table->idsel[i].line &
ip->line_msk;arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0+ pci_irq_table[idsel_ -min_idsel][line-1] =
+
irq_of_table->idsel[i].table_item;arch/powerpc/platforms/85xx/mpc85xx_ads.c +6
-0+ } + +return PCI_IRQ_TABLE_LOOKUP ; + }while (0 ); + } else { + printk(KERN_INFO "%s: device treeERROR\n",__func__);
arch/powerpc/platforms/85xx/mpc85xx_ads.c +6
-0+return -1 ; + } + }else { +static char pci_irq_table[][4 ] = +/* +* This is little evil, but works around the fact
arch/powerpc/platforms/85xx/mpc85xx_ads.c +8
-0+* that revA boards have IDSEL starting at 18 +* and others boards (older) start at 12 +* +* PCI IDSEL/INTPIN->INTLINE +* A B C D +*/ + { + {PIRQA, PIRQB, PIRQC, PIRQD}, /*IDSEL 2 */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +3
-0+ {PIRQD, PIRQA, PIRQB, PIRQC}, + {PIRQC, PIRQD, PIRQA, PIRQB}, + {PIRQB, PIRQC, PIRQD, PIRQA}, /*IDSEL 5 */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +7
-0+ {0, 0, 0, 0}, /* -- */ + {0, 0, 0, 0}, /* -- */ + {0, 0, 0, 0}, /* -- */ + {0, 0, 0, 0}, /* -- */ + {0, 0, 0, 0}, /* -- */ + {0, 0, 0, 0}, /* -- */ + {PIRQA, PIRQB, PIRQC, PIRQD}, /*IDSEL 12 */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +3
-0+ {PIRQD, PIRQA, PIRQB, PIRQC}, + {PIRQC, PIRQD, PIRQA, PIRQB}, + {PIRQB, PIRQC, PIRQD, PIRQA}, /*IDSEL 15 */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +3
-0+ {0, 0, 0, 0}, /* -- */ + {0, 0, 0, 0}, /* -- */ + {PIRQA, PIRQB, PIRQC, PIRQD}, /*IDSEL 18 */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +3
-0+ {PIRQD, PIRQA, PIRQB, PIRQC}, + {PIRQC, PIRQD, PIRQA, PIRQB}, + {PIRQB, PIRQC, PIRQD, PIRQA}, /*IDSEL 21 */
arch/powerpc/platforms/85xx/mpc85xx_ads.c +3
-0+ }; + + const long min_idsel = 2, max_idsel = 21,
irqs_per_slot= 4;arch/powerpc/platforms/85xx/mpc85xx_ads.c
Quoted 2 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +2
-0+return PCI_IRQ_TABLE_LOOKUP ; + }Is there some reason you reimplemented code that already exists for mapping PCI interrupts? Delete this function, and instead add:
void
__initmpc85xx_pcibios_fixup(void){ struct pci_dev *dev = NULL; for_each_pci_dev(dev) pci_read_irq_line(dev); }Hm. I see you added that function to
pci.c. Anyway, you don't need themap_irqfunction anymoreQuoted 4 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +3
-0+ mpic_set_default_senses(mpic1, + mpc85xx_ads_openpic_initsenses, +
sizeof(mpc85xx_ads_openpic_initsenses)); +No. We have
parse_and_mapto handle this.
Quoted 7 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c
Quoted 2 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +1
-0mpic_init (mpic1); +of_node_put (np);Are we definitely supposed to release the of nodes after we call init? Actually, it looks like you can put that after
mpic_alloc().mpic_alloc()grabs a reference, so we don't need it after that.
Looks like true, but I'll double-check this anyway.
Quoted 8 lines
Quoted 5 lines
/*
* Setup the architecture
*/There should probably be an #ifdef
CONFIG_CPM2here
ok
Quoted 6 lines
Quoted 1 line
+static void
init_fcc_ioports(void)...
Quoted 6 lines
Quoted 2 lines
include/asm-powerpc/ renamed from include/asm-powerpc/mpc85xx.h +0
-0
mpc85xx.hThis file really needs to be cleaned up. Most of the stuff in here can go.
My guess to separate the "cleanup_obsolete" and "add_new_stuff" in some ways, it it does not prevent stuff from work. Note that there are still a lot of confusion with ppc/powerpc header mix. So "cleanup" patch should be carefully tested with both ppc and powerpc. I am aware that mpc85xx.h exist in both instances, these are just generic thoughts.
Thanks for the comments and review.
Quoted 3 lines
Andy
RFC PATCH 5/6 POWERPC cpm2: get rid of remapping the whole immr
In reply to Vitaly BordugThe stuff below cleans up the code attempting to remap the whole cpm2_immr early, as well as places happily assuming that fact. This is more like the 2.4 legacy stuff, and is at least confusing and unclear now.
To keep the world comfortable, a new mechanism is introduced: before accessing specific immr register/register set, one needs to map it, using cpm2_map(<reg>), for instance, access to CPM command register will look like
volatile cpm_cpm2_t *cp = cpm2_map(im_cpm);
keeping the code clear, yet without "already defined somewhere" cpm2_immr.
So far, unmapping code is not implemented, but it's not a big deal to add it, if the whole idea makes sense.
---
arch/powerpc/sysdev/cpm2_common.c | 19 +++-- arch/powerpc/sysdev/cpm2_pic.c | 28 +++---- arch/powerpc/sysdev/cpm2_pic.h | 2 arch/powerpc/sysdev/fsl_soc.c | 2 drivers/serial/cpm_uart/cpm_uart_cpm2.c | 130 +++++++++++++++++++++---------- drivers/serial/cpm_uart/cpm_uart_cpm2.h | 2 include/asm-powerpc/fs_pd.h | 18 ++++ include/asm-ppc/cpm2.h | 4 + include/asm-ppc/fs_pd.h | 4 + 9 files changed, 145 insertions(+), 64 deletions(-)
arch/powerpc/sysdev/cpm2_common.c +14 -5
@@ -44,6 +44,7 @@ cpm_cpm2_t *cpmp; /* Pointer to comm pr* the communication processor devices. */ cpm2_map_t *cpm2_immr; +intctl_cpm2_t *cpm2_intctl;#define CPM_MAP_SIZE (0x40000)/* 256k - the PQ3 reserve this amount of space for CPM as it is larger
@@ -53,6 +54,7 @@ voidcpm2_reset (void) { cpm2_immr = (cpm2_map_t *)ioremap (CPM_MAP_ADDR ,CPM_MAP_SIZE ); + cpm2_intctl =cpm2_map (im_intctl);/* Reclaim the DP memory for our use. */
@@ -87,14 +89,16 @@ cpm_setbrg(uint brg, uint rate)/* This is good enough to get SMCs running..... */ if (brg <4 ) { - bp = (uint *)&cpm2_immr->im_brgc1; + bp =cpm2_map_size (im_brgc1,16 ); }else { - bp = (uint *)&cpm2_immr->im_brgc5; + bp =cpm2_map_size (im_brgc5,16 ); brg -=4 ; } bp += brg; *bp = ((BRG_UART_CLK / rate) <<1 ) |CPM_BRG_EN ; + +cpm2_unmap (bp); }/* This function is used to set high speed synchronous baud rate
@@ -106,16 +110,18 @@ cpm2_fastbrg(uint brg, uint rate, int divolatile uint *bp;if (brg <4 ) { - bp = (uint *)&cpm2_immr->im_brgc1; + bp =cpm2_map_size (im_brgc1,16 ); }else { - bp = (uint *)&cpm2_immr->im_brgc5; + bp =cpm2_map_size (im_brgc5,16 ); brg -=4 ; } bp += brg; *bp = ((BRG_INT_CLK / rate) <<1 ) |CPM_BRG_EN ;if (div16) *bp |=CPM_BRG_DIV16 ; + +cpm2_unmap (bp); }/*
@@ -126,11 +132,14 @@ static spinlock_t cpm_dpmem_lock;* until the memory subsystem goes up... */ static rh_block_t cpm_boot_dpmem_rh_block[16 ];static rh_info_t cpm_dpmem_info; +static u8 * im_dprambase;static void cpm2_dpinit (void ) {spin_lock_init (&cpm_dpmem_lock); + im_dprambase =ioremap (CPM_MAP_ADDR ,CPM_DATAONLY_BASE +CPM_DATAONLY_SIZE ); +/* initialize the info header */ rh_init(&cpm_dpmem_info, 1, sizeof(cpm_boot_dpmem_rh_block) /
@@ -199,6 +208,6 @@ EXPORT_SYMBOL(cpm_dpdump);void *cpm_dpram_addr (uint offset) { -return (void *)&cpm2_immr->im_dprambase[offset]; +return (void *)(im_dprambase + offset); }EXPORT_SYMBOL (cpm_dpram_addr);
arch/powerpc/sysdev/cpm2_pic.c +14 -14
@@ -76,7 +76,7 @@ static void cpm2_mask_irq(unsigned int i bit = irq_to_siubit[irq_nr]; word = irq_to_siureg[irq_nr]; - simr = &(cpm2_immr->im_intctl.ic_simrh); + simr = &(cpm2_intctl->ic_simrh); ppc_cached_irq_mask[word] &= ~(1 << bit); simr[word] = ppc_cached_irq_mask[word]; }
@@ -91,7 +91,7 @@ static void cpm2_unmask_irq(unsigned int bit = irq_to_siubit[irq_nr]; word = irq_to_siureg[irq_nr]; - simr = &(cpm2_immr->im_intctl.ic_simrh); + simr = &(cpm2_intctl->ic_simrh); ppc_cached_irq_mask[word] |=1 << bit; simr[word] = ppc_cached_irq_mask[word]; }
@@ -106,8 +106,8 @@ static void cpm2_mask_and_ack(unsigned i bit = irq_to_siubit[irq_nr]; word = irq_to_siureg[irq_nr]; - simr = &(cpm2_immr->im_intctl.ic_simrh); - sipnr = &(cpm2_immr->im_intctl.ic_sipnrh); + simr = &(cpm2_intctl->ic_simrh); + sipnr = &(cpm2_intctl->ic_sipnrh); ppc_cached_irq_mask[word] &= ~(1 << bit); simr[word] = ppc_cached_irq_mask[word]; sipnr[word] =1 << bit;
@@ -125,7 +125,7 @@ static void cpm2_end_irq(unsigned int ir bit = irq_to_siubit[irq_nr]; word = irq_to_siureg[irq_nr]; - simr = &(cpm2_immr->im_intctl.ic_simrh); + simr = &(cpm2_intctl->ic_simrh); ppc_cached_irq_mask[word] |=1 << bit; simr[word] = ppc_cached_irq_mask[word];/*
@@ -152,7 +152,7 @@ int cpm2_get_irq(struct pt_regs *regs)/* For CPM2, read the SIVEC register and shift the bits down * to get the irq number. */ - bits = cpm2_immr->im_intctl.ic_sivec; + bits = cpm2_intctl->ic_sivec; irq = bits >>26 ;if (irq ==0 )
@@ -223,26 +223,26 @@ void cpm2_pic_init(struct device_node *n/* Mask out everything */ - cpm2_immr->im_intctl.ic_simrh =0x00000000 ; - cpm2_immr->im_intctl.ic_simrl =0x00000000 ; + cpm2_intctl->ic_simrh =0x00000000 ; + cpm2_intctl->ic_simrl =0x00000000 ;wmb ();/* Ack everything */ - cpm2_immr->im_intctl.ic_sipnrh =0xffffffff ; - cpm2_immr->im_intctl.ic_sipnrl =0xffffffff ; + cpm2_intctl->ic_sipnrh =0xffffffff ; + cpm2_intctl->ic_sipnrl =0xffffffff ;wmb ();/* Dummy read of the vector */ - i = cpm2_immr->im_intctl.ic_sivec; + i = cpm2_intctl->ic_sivec;rmb ();/* Initialize the default interrupt mapping priorities, * in case the boot rom changed something on us. */ - cpm2_immr->im_intctl.ic_sicr =0 ; - cpm2_immr->im_intctl.ic_scprrh =0x05309770 ; - cpm2_immr->im_intctl.ic_scprrl =0x05309770 ; + cpm2_intctl->ic_sicr =0 ; + cpm2_intctl->ic_scprrh =0x05309770 ; + cpm2_intctl->ic_scprrl =0x05309770 ;/* create a legacy host */ if (node)
arch/powerpc/sysdev/cpm2_pic.h +2 -0
@@ -1,6 +1,8 @@#ifndef _PPC_KERNEL_CPM2_H#define _PPC_KERNEL_CPM2_H +extern intctl_cpm2_t *cpm2_intctl; +extern int cpm2_get_irq (struct pt_regs *regs);extern void cpm2_pic_init (struct device_node *);
arch/powerpc/sysdev/fsl_soc.c +1 -1
@@ -622,7 +622,7 @@ static int __init fs_enet_of_init(void)if (strstr (model,"FCC" )) {int fcc_index =fs_get_fcc_index (*id); - fs_enet_data.dpram_offset = (u32 )cpm2_immr->im_dprambase; + fs_enet_data.dpram_offset = (u32 )cpm_dpram_addr (0 ); fs_enet_data.rx_ring =32 ; fs_enet_data.tx_ring =32 ; fs_enet_data.rx_copybreak =240 ;
drivers/serial/cpm_uart/cpm_uart_cpm2.c +87 -43
256 lines not on this page · raw message
drivers/serial/cpm_uart/cpm_uart_cpm2.h +1 -1
@@ -40,6 +40,6 @@ static inline void cpm_set_smc_fcr(volat up->smc_tfcr = CPMFCR_GBL | CPMFCR_EB; } -#define DPRAM_BASE ((unsigned char *)&cpm2_immr->im_dprambase[0]) +#define DPRAM_BASE ((unsigned char *)cpm_dpram_addr(0))#endif
include/asm-powerpc/fs_pd.h +18 -0
@@ -11,6 +11,7 @@#ifndef FS_PD_H #define FS_PD_H +#include <asm/cpm2.h> #include <sysdev/fsl_soc.h> #include <asm/time.h>
@@ -24,4 +25,21 @@ static inline int uart_clock(void) return ppc_proc_freq; } +#define cpm2_map (member) \ +({ \ + u32 offset = offsetof(cpm2_map_t, member); \ + void *addr = ioremap (CPM_MAP_ADDR + offset, \ + sizeof( ((cpm2_map_t*)0)->member)); \ + addr; \ +}) + +#define cpm2_map_size (member, size) \ +({ \ + u32 offset = offsetof(cpm2_map_t, member); \ + void *addr = ioremap (CPM_MAP_ADDR + offset, size); \ + addr; \ +}) + +#define cpm2_unmap (addr) iounmap(addr) +#endif
include/asm-ppc/cpm2.h +4 -0
@@ -177,6 +177,10 @@ #define PROFF_RAND ((uint)0x8af8)#define PROFF_I2C_BASE ((uint)0x8afc)#define PROFF_IDMA4_BASE ((uint)0x8afe) +#define PROFF_SCC_SIZE ((uint)0x100) +#define PROFF_FCC_SIZE ((uint)0x100) +#define PROFF_SMC_SIZE ((uint)64) +/* The SMCs are relocated to any of the first eight DPRAM pages. * We will fix these at the first locations of DPRAM, until we * get some microcode patches :-).
include/asm-ppc/fs_pd.h +4 -0
@@ -29,4 +29,8 @@ static inline int uart_clock(void) return (((bd_t *) __res)->bi_intfreq); } +#define cpm2_map (member) (&cpm2_immr->member) +#define cpm2_map_size (member, size) (&cpm2_immr->member) +#define cpm2_unmap (addr) do {} while(0) +#endif
RFC PATCH 6/6 POWERPC: generic CPM2 peripherals rehaul with cpm2_map mechanism
In reply to Vitaly BordugIncorporating the new way of cpm2 immr access, introduced in the previous patch, into CPM2 peripheral devices (fs_enet and cpm_uart). Both ppc and powerpc approved working( real actions taken in powerpc only, ppc just has a wrapper to keep init stuff consistent).
---
arch/powerpc/platforms/85xx/mpc85xx_ads.c | 109 ++++++++++++++++------------- arch/powerpc/sysdev/cpm2_common.c | 90 ++++++++++++++++++++++++ arch/powerpc/sysdev/fsl_soc.c | 10 +++ arch/ppc/platforms/mpc8272ads_setup.c | 8 +- arch/ppc/platforms/mpc866ads_setup.c | 8 +- arch/ppc/platforms/mpc885ads_setup.c | 10 +-- drivers/net/fs_enet/fs_enet-main.c | 2 - drivers/serial/cpm_uart/cpm_uart_core.c | 4 + include/asm-ppc/cpm2.h | 53 ++++++++++++++ include/linux/fs_enet_pd.h | 10 ++- include/linux/fs_uart_pd.h | 4 + 11 files changed, 239 insertions(+), 69 deletions(-)
arch/powerpc/platforms/85xx/mpc85xx_ads.c +61 -48
@@ -292,71 +292,84 @@ #endif/* * Setup the architecture */ -static void init_fcc_ioports (void ) +#ifdef CONFIG_CPM2 +void init_fcc_ioports (struct fs_platform_info *fpi) { -struct immap *immap; -struct io_port *io; +struct io_port *io =cpm2_map (im_ioport); +int fcc_no =fs_get_fcc_index (fpi->fs_no); +int target;u32 tempval; - immap = cpm2_immr; - - io = &immap->im_ioport; -/* FCC2/3 are on the ports B/C. */ - tempval =in_be32 (&io->iop_pdirb); - tempval &= ~PB2_DIRB0 ; - tempval |=PB2_DIRB1 ; -out_be32 (&io->iop_pdirb, tempval); - - tempval =in_be32 (&io->iop_psorb); - tempval &= ~PB2_PSORB0 ; - tempval |=PB2_PSORB1 ; -out_be32 (&io->iop_psorb, tempval); - - tempval =in_be32 (&io->iop_pparb); - tempval |= (PB2_DIRB0 |PB2_DIRB1 ); -out_be32 (&io->iop_pparb, tempval); - - tempval =in_be32 (&io->iop_pdirb); - tempval &= ~PB3_DIRB0 ; - tempval |=PB3_DIRB1 ; -out_be32 (&io->iop_pdirb, tempval); - - tempval =in_be32 (&io->iop_psorb); - tempval &= ~PB3_PSORB0 ; - tempval |=PB3_PSORB1 ; -out_be32 (&io->iop_psorb, tempval); - - tempval =in_be32 (&io->iop_pparb); - tempval |= (PB3_DIRB0 |PB3_DIRB1 ); -out_be32 (&io->iop_pparb, tempval); - - tempval =in_be32 (&io->iop_pdirc); - tempval |=PC3_DIRC1 ; -out_be32 (&io->iop_pdirc, tempval); - - tempval =in_be32 (&io->iop_pparc); - tempval |=PC3_DIRC1 ; -out_be32 (&io->iop_pparc, tempval); +switch (fcc_no) { +case 1 : + tempval =in_be32 (&io->iop_pdirb); + tempval &= ~PB2_DIRB0 ; + tempval |=PB2_DIRB1 ; +out_be32 (&io->iop_pdirb, tempval); + + tempval =in_be32 (&io->iop_psorb); + tempval &= ~PB2_PSORB0 ; + tempval |=PB2_PSORB1 ; +out_be32 (&io->iop_psorb, tempval); + + tempval =in_be32 (&io->iop_pparb); + tempval |= (PB2_DIRB0 |PB2_DIRB1 ); +out_be32 (&io->iop_pparb, tempval); + + target =CPM_CLK_FCC2 ; +break ; +case 2 : + tempval =in_be32 (&io->iop_pdirb); + tempval &= ~PB3_DIRB0 ; + tempval |=PB3_DIRB1 ; +out_be32 (&io->iop_pdirb, tempval); + + tempval =in_be32 (&io->iop_psorb); + tempval &= ~PB3_PSORB0 ; + tempval |=PB3_PSORB1 ; +out_be32 (&io->iop_psorb, tempval); + + tempval =in_be32 (&io->iop_pparb); + tempval |= (PB3_DIRB0 |PB3_DIRB1 ); +out_be32 (&io->iop_pparb, tempval); + + tempval =in_be32 (&io->iop_pdirc); + tempval |=PC3_DIRC1 ; +out_be32 (&io->iop_pdirc, tempval); + + tempval =in_be32 (&io->iop_pparc); + tempval |=PC3_DIRC1 ; +out_be32 (&io->iop_pparc, tempval); + + target =CPM_CLK_FCC3 ; +break ; +default : +printk (KERN_ERR "init_fcc_ioports: invalid FCC number\n" ); +return ; + }/* Port C has clocks...... */ tempval =in_be32 (&io->iop_psorc); - tempval &= ~(CLK_TRX ); + tempval &= ~(PC_CLK (fpi->clk_rx -8 ) |PC_CLK (fpi->clk_tx -8 ));out_be32 (&io->iop_psorc, tempval); tempval =in_be32 (&io->iop_pdirc); - tempval &= ~(CLK_TRX ); + tempval &= ~(PC_CLK (fpi->clk_rx -8 ) |PC_CLK (fpi->clk_tx -8 ));out_be32 (&io->iop_pdirc, tempval); tempval =in_be32 (&io->iop_pparc); - tempval |= (CLK_TRX ); + tempval |= (PC_CLK (fpi->clk_rx -8 ) |PC_CLK (fpi->clk_tx -8 ));out_be32 (&io->iop_pparc, tempval); +cpm2_unmap (io); +/* Configure Serial Interface clock routing. -* First, clear all FCC bits to zero, +* First, clear FCC bits to zero, * then set the ones we want. */ - immap->im_cpmux.cmx_fcr &= ~(CPMUX_CLK_MASK ); - immap->im_cpmux.cmx_fcr |=CPMUX_CLK_ROUTE ; +cpm2_clk_setup (target, fpi->clk_rx,CPM_CLK_RX ); +cpm2_clk_setup (target, fpi->clk_tx,CPM_CLK_TX ); } +#endif static void __init mpc85xx_ads_setup_arch (void ) {
arch/powerpc/sysdev/cpm2_common.c +90 -0
96 lines not on this page · raw message
arch/powerpc/sysdev/fsl_soc.c +10 -0
@@ -34,7 +34,11 @@ #include <asm/time.h>#include <asm/prom.h> #include <sysdev/fsl_soc.h> #include <mm/mmu_decl.h> +#ifdef CONFIG_CPM2 +#include <asm/cpm2.h> +#endif +extern void init_fcc_ioports (struct fs_platform_info *);static phys_addr_t immrbase =-1 ;phys_addr_t get_immrbase (void )
@@ -619,6 +623,9 @@ static int __init fs_enet_of_init(void) goto unreg; } + fs_enet_data.clk_rx = *((u32 *)get_property (np,"rx-clock" ,NULL )); + fs_enet_data.clk_tx = *((u32 *)get_property (np,"tx-clock" ,NULL )); +if (strstr (model,"FCC" )) {int fcc_index =fs_get_fcc_index (*id);
@@ -635,6 +642,7 @@ static int __init fs_enet_of_init(void)snprintf ((char *)&bus_id[(*id)],BUS_ID_SIZE ,"%x:%02x" , (u32 )res.start, fs_enet_data.phy_addr); fs_enet_data.bus_id = (char *)&bus_id[(*id)]; + fs_enet_data.init_ioports = init_fcc_ioports; }of_node_put (phy);
@@ -706,6 +714,8 @@ static int __init cpm_uart_of_init(void) cpm_uart_data.tx_buf_size =32 ; cpm_uart_data.rx_num_fifo =4 ; cpm_uart_data.rx_buf_size =32 ; + cpm_uart_data.clk_rx = *((u32 *)get_property (np,"rx-clock" ,NULL )); + cpm_uart_data.clk_tx = *((u32 *)get_property (np,"tx-clock" ,NULL )); ret = platform_device_add_data(cpm_uart_dev, &cpm_uart_data,
arch/ppc/platforms/mpc8272ads_setup.c +4 -4
@@ -103,7 +103,7 @@ static struct fs_platform_info mpc82xx_e }, }; -static void init_fcc1_ioports (void ) +static void init_fcc1_ioports (struct fs_platform_info *) {struct io_port *io;u32 tempval;
@@ -144,7 +144,7 @@ static void init_fcc1_ioports(void)iounmap (immap); } -static void init_fcc2_ioports (void ) +static void init_fcc2_ioports (struct fs_platform_info *) {cpm2_map_t * immap =ioremap (CPM_MAP_ADDR ,sizeof (cpm2_map_t));u32 *bcsr =ioremap (BCSR_ADDR +12 ,sizeof (u32));
@@ -229,7 +229,7 @@ static void mpc8272ads_fixup_uart_pdata( } } -static void init_scc1_uart_ioports (void ) +static void init_scc1_uart_ioports (struct fs_uart_platform_info *) {cpm2_map_t * immap =ioremap (CPM_MAP_ADDR ,sizeof (cpm2_map_t));
@@ -246,7 +246,7 @@ static void init_scc1_uart_ioports(void)iounmap (immap); } -static void init_scc4_uart_ioports (void ) +static void init_scc4_uart_ioports (struct fs_uart_platform_info *) {cpm2_map_t * immap =ioremap (CPM_MAP_ADDR ,sizeof (cpm2_map_t));
arch/ppc/platforms/mpc866ads_setup.c +4 -4
@@ -137,7 +137,7 @@ #endifiounmap (bcsr_io); } -static void setup_fec1_ioports (void ) +static void setup_fec1_ioports (struct fs_platform_info *) {immap_t *immap = (immap_t *)IMAP_ADDR ;
@@ -145,7 +145,7 @@ static void setup_fec1_ioports(void)setbits16 (&immap->im_ioport.iop_pddir,0x1fff ); } -static void setup_scc1_ioports (void ) +static void setup_scc1_ioports (struct fs_platform_info *) {immap_t *immap = (immap_t *)IMAP_ADDR ;unsigned *bcsr_io;
@@ -194,7 +194,7 @@ static void setup_scc1_ioports(void) } -static void setup_smc1_ioports (void ) +static void setup_smc1_ioports (struct fs_uart_platform_info *) {immap_t *immap = (immap_t *)IMAP_ADDR ;unsigned *bcsr_io;
@@ -216,7 +216,7 @@ static void setup_smc1_ioports(void) } -static void setup_smc2_ioports (void ) +static void setup_smc2_ioports (struct fs_uart_platform_info *) {immap_t *immap = (immap_t *)IMAP_ADDR ;unsigned *bcsr_io;
arch/ppc/platforms/mpc885ads_setup.c +5 -5
@@ -161,7 +161,7 @@ #endif#endif } -static void setup_fec1_ioports (void ) +static void setup_fec1_ioports (struct fs_platform_info *) {immap_t *immap = (immap_t *)IMAP_ADDR ;
@@ -181,7 +181,7 @@ static void setup_fec1_ioports(void)clrbits32 (&immap->im_cpm.cp_cptr,0x00000100 ); } -static void setup_fec2_ioports (void ) +static void setup_fec2_ioports (struct fs_platform_info *) {immap_t *immap = (immap_t *)IMAP_ADDR ;
@@ -193,7 +193,7 @@ static void setup_fec2_ioports(void)clrbits32 (&immap->im_cpm.cp_cptr,0x00000080 ); } -static void setup_scc3_ioports (void ) +static void setup_scc3_ioports (struct fs_platform_info *) {immap_t *immap = (immap_t *)IMAP_ADDR ;unsigned *bcsr_io;
@@ -315,7 +315,7 @@ static void __init mpc885ads_fixup_scc_empc885ads_fixup_enet_pdata (pdev, fsid_scc1 + pdev->id -1 ); } -static void setup_smc1_ioports (void ) +static void setup_smc1_ioports (struct fs_uart_platform_info *) {immap_t *immap = (immap_t *)IMAP_ADDR ;unsigned *bcsr_io;
@@ -335,7 +335,7 @@ static void setup_smc1_ioports(void)clrbits16 (&immap->im_cpm.cp_pbodr, iobits); } -static void setup_smc2_ioports (void ) +static void setup_smc2_ioports (struct fs_uart_platform_info *) {immap_t *immap = (immap_t *)IMAP_ADDR ;unsigned *bcsr_io;
drivers/net/fs_enet/fs_enet-main.c +1 -1
@@ -971,7 +971,7 @@ static struct net_device *fs_init_instandev_set_drvdata (dev, ndev); fep->fpi = fpi;if (fpi->init_ioports) - fpi->init_ioports (); + fpi->init_ioports ((struct fs_platform_info *)fpi);#ifdef CONFIG_FS_ENET_HAS_FEC if (fs_get_fec_index (fpi->fs_no) >=0 )
drivers/serial/cpm_uart/cpm_uart_core.c +2 -2
@@ -1180,7 +1180,7 @@ static int __init cpm_uart_console_setup pdata = pdev->dev.platform_data;if (pdata)if (pdata->init_ioports) - pdata->init_ioports (); + pdata->init_ioports (pdata);cpm_uart_drv_get_platform_data (pdev,1 ); }
@@ -1269,7 +1269,7 @@ static int cpm_uart_drv_probe(struct devreturn ret;if (pdata->init_ioports) - pdata->init_ioports (); + pdata->init_ioports (pdata); ret =uart_add_one_port (&cpm_reg, &cpm_uart_ports[pdata->fs_no].port);
include/asm-ppc/cpm2.h +53 -0
58 lines not on this page · raw message
include/linux/fs_enet_pd.h +6 -4
@@ -87,18 +87,20 @@ struct fs_mii_bb_platform_info { };struct fs_platform_info { - -void (*init_ioports)(void ); + +void (*init_ioports)(struct fs_platform_info *);/* device specific information */ int fs_no;/* controller index */ u32 cp_page;/* CPM page */ u32 cp_block;/* CPM sblock */ - +u32 clk_trx;/* some stuff for pins & mux configuration*/ +u32 clk_rx; +u32 clk_tx;u32 clk_route;u32 clk_mask; - +u32 mem_offset;u32 dpram_offset;u32 fcc_regs_c;
include/linux/fs_uart_pd.h +3 -1
@@ -46,7 +46,7 @@ static inline int fs_uart_id_fsid2smc(in }struct fs_uart_platform_info { -void (*init_ioports)(void ); +void (*init_ioports)(struct fs_uart_platform_info *);/* device specific information */ int fs_no;/* controller index */ u32 uart_clk;
@@ -55,6 +55,8 @@ struct fs_uart_platform_info {u8 rx_num_fifo;u8 rx_buf_size;u8 brg; +u8 clk_rx; + u8 clk_tx; };#endif
Re: [PATCH 6/6] [RFC] POWERPC: generic CPM2 peripherals rehaul with cpm2_map mechanism
Hello.
Quoted 6 lines · Vitaly Bordug
Incorporating the new way of cpm2 immr access, introduced in the previous patch, into CPM2 peripheral devices (
fs_enetandcpm_uart). Both ppc and powerpc approvedworking( real actions taken in powerpc only, ppc just has a wrapper to keep init stuff consistent).Signed-off-by Vitaly Bordug <[email protected]>
Hm, I got 4 rejects here. :-/
arch/ppc/platforms/mpc8272ads_setup.c static struct fs_platform_info mpc82xx_e · line 109
Quoted 13 lines
arch/ppc/platforms/mpc8272ads_setup.c +1
-1@@ -103,7 +103,7 @@ static struct fs_platform_info mpc82xx_e }, }; -static void init_fcc1_ioports (void ) +static void init_fcc1_ioports (struct fs_platform_info *) {struct io_port *io;u32 tempval;
This one get rejected as well.
Quoted 4 lines
arch/ppc/platforms/mpc866ads_setup.c +0
-0
[...]
arch/ppc/platforms/mpc866ads_setup.c static void setup_scc1_ioports(void) · line 200
Quoted 9 lines
arch/ppc/platforms/mpc866ads_setup.c +1
-1@@ -194,7 +194,7 @@ static void setup_scc1_ioports(void) } -static void setup_smc1_ioports (void ) +static void setup_smc1_ioports (struct fs_uart_platform_info *) {immap_t *immap = (immap_t *)IMAP_ADDR ;unsigned *bcsr_io;
And this one...
Quoted 4 lines
arch/ppc/platforms/mpc885ads_setup.c +0
-0
[...]
arch/ppc/platforms/mpc885ads_setup.c static void __init mpc885ads_fixup_scc_e · line 321
Quoted 9 lines
arch/ppc/platforms/mpc885ads_setup.c +1
-1@@ -315,7 +315,7 @@ static void __init mpc885ads_fixup_scc_empc885ads_fixup_enet_pdata (pdev, fsid_scc1 + pdev->id -1 ); } -static void setup_smc1_ioports (void ) +static void setup_smc1_ioports (struct fs_uart_platform_info *) {immap_t *immap = (immap_t *)IMAP_ADDR ;unsigned *bcsr_io;
And this...
Quoted 53 lines
include/asm-ppc/cpm2.h +45
-0@@ -1196,5 +1196,58 @@ #define FCC1_MEM_OFFSET FCC_MEM_OFFSET(0#define FCC2_MEM_OFFSET FCC_MEM_OFFSET(1)#define FCC3_MEM_OFFSET FCC_MEM_OFFSET(2) +/* Clocks and GRG's */ + +enum cpm_clk_dir { +CPM_CLK_RX , +CPM_CLK_TX , +CPM_CLK_RTX +}; + +enum cpm_clk_target { +CPM_CLK_SCC1 , +CPM_CLK_SCC2 , +CPM_CLK_SCC3 , +CPM_CLK_SCC4 , +CPM_CLK_FCC1 , +CPM_CLK_FCC2 , +CPM_CLK_FCC3 +}; + +enum cpm_clk { +CPM_CLK_NONE =0 , +CPM_BRG1 ,/* Baud Rate Generator 1 */ +CPM_BRG2 ,/* Baud Rate Generator 2 */ +CPM_BRG3 ,/* Baud Rate Generator 3 */ +CPM_BRG4 ,/* Baud Rate Generator 4 */ +CPM_BRG5 ,/* Baud Rate Generator 5 */ +CPM_BRG6 ,/* Baud Rate Generator 6 */ +CPM_BRG7 ,/* Baud Rate Generator 7 */ +CPM_BRG8 ,/* Baud Rate Generator 8 */ +CPM_CLK1 ,/* Clock 1 */ +CPM_CLK2 ,/* Clock 2 */ +CPM_CLK3 ,/* Clock 3 */ +CPM_CLK4 ,/* Clock 4 */ +CPM_CLK5 ,/* Clock 5 */ +CPM_CLK6 ,/* Clock 6 */ +CPM_CLK7 ,/* Clock 7 */ +CPM_CLK8 ,/* Clock 8 */ +CPM_CLK9 ,/* Clock 9 */ +CPM_CLK10 ,/* Clock 10 */ +CPM_CLK11 ,/* Clock 11 */ +CPM_CLK12 ,/* Clock 12 */ +CPM_CLK13 ,/* Clock 13 */ +CPM_CLK14 ,/* Clock 14 */ +CPM_CLK15 ,/* Clock 15 */ +CPM_CLK16 ,/* Clock 16 */ +CPM_CLK17 ,/* Clock 17 */
include/asm-ppc/cpm2.h #define FCC1_MEM_OFFSET FCC_MEM_OFFSET(0 · line 1253
Quoted 10 lines
include/asm-ppc/cpm2.h +8
-0+CPM_CLK18 ,/* Clock 18 */ +CPM_CLK19 ,/* Clock 19 */ +CPM_CLK20 ,/* Clock 20 */ +CPM_CLK_DUMMY +}; + +extern int cpm2_clk_setup (enum cpm_clk_target target,int clock,int mode); +#endif /* __CPM2__ */ #endif /* __KERNEL__ */
And this file refuses to be patched altogether... With these rejects fixed, everything seems fine, though.
WBR, Sergei
Re: [PATCH 6/6] [RFC] POWERPC: generic CPM2 peripherals rehaul with cpm2_map mechanism
Quoted 122 lines · On Sun, 13 Aug 2006 00:18:36 +0400 Sergei Shtylyov wrote:
Hello.
Quoted 7 lines · Vitaly Bordug
Incorporating the new way of cpm2 immr access, introduced in the previous patch, into CPM2 peripheral devices (
fs_enetandcpm_uart). Both ppc and powerpc approvedworking( real actions taken in powerpc only, ppc just has a wrapper to keep init stuff consistent).Signed-off-by Vitaly Bordug <[email protected]>Hm, I got 4 rejects here. :-/
arch/ppc/platforms/mpc8272ads_setup.c static struct fs_platform_info mpc82xx_e · line 109
Quoted 13 lines
(quoted diff) +0
-0
b/arch/ppc/platforms/mpc8272ads_setup.cindex 2a35fe2..d5d36c3 100644 ---a/arch/ppc/platforms/mpc8272ads_setup.c+++b/arch/ppc/platforms/mpc8272ads_setup.carch/ppc/platforms/mpc8272ads_setup.c +1
-1@@ -103,7 +103,7 @@ static struct fs_platform_info mpc82xx_e }, }; -static void init_fcc1_ioports (void ) +static void init_fcc1_ioports (struct fs_platform_info *) {struct io_port *io;u32 tempval;This one get rejected as well.
Quoted 4 lines
(quoted diff) +0
-0
b/arch/ppc/platforms/mpc866ads_setup.cindex e12cece..5f130dc 100644arch/ppc/platforms/mpc866ads_setup.c +0
-0[...]
arch/ppc/platforms/mpc866ads_setup.c static void setup_scc1_ioports(void) · line 200
Quoted 9 lines
arch/ppc/platforms/mpc866ads_setup.c +1
-1@@ -194,7 +194,7 @@ static void setup_scc1_ioports(void) } -static void setup_smc1_ioports (void ) +static void setup_smc1_ioports (struct fs_uart_platform_info *) {immap_t *immap = (immap_t *)IMAP_ADDR ;unsigned *bcsr_io;And this one...
Quoted 4 lines
(quoted diff) +0
-0
b/arch/ppc/platforms/mpc885ads_setup.cindex 5dfa4e6..bf388ed 100644arch/ppc/platforms/mpc885ads_setup.c +0
-0[...]
arch/ppc/platforms/mpc885ads_setup.c static void __init mpc885ads_fixup_scc_e · line 321
Quoted 9 lines
arch/ppc/platforms/mpc885ads_setup.c +1
-1@@ -315,7 +315,7 @@ static void __init mpc885ads_fixup_scc_empc885ads_fixup_enet_pdata (pdev, fsid_scc1 + pdev->id -1 ); } -static void setup_smc1_ioports (void ) +static void setup_smc1_ioports (struct fs_uart_platform_info *) {immap_t *immap = (immap_t *)IMAP_ADDR ;unsigned *bcsr_io;And this...Quoted 58 lines
include/asm-ppc/cpm2.h +50
-0@@ -1196,5 +1196,58 @@ #define FCC1_MEM_OFFSET FCC_MEM_OFFSET(0#define FCC2_MEM_OFFSET FCC_MEM_OFFSET(1)#define FCC3_MEM_OFFSET FCC_MEM_OFFSET(2) +/* Clocks and GRG's */ + +enum cpm_clk_dir { +CPM_CLK_RX , +CPM_CLK_TX , +CPM_CLK_RTX +}; + +enum cpm_clk_target { +CPM_CLK_SCC1 , +CPM_CLK_SCC2 , +CPM_CLK_SCC3 , +CPM_CLK_SCC4 , +CPM_CLK_FCC1 , +CPM_CLK_FCC2 , +CPM_CLK_FCC3 +}; + +enum cpm_clk { +CPM_CLK_NONE =0 , +CPM_BRG1 ,/* Baud Rate Generator 1 */ +CPM_BRG2 ,/* Baud Rate Generator 2 */ +CPM_BRG3 ,/* Baud Rate Generator 3 */ +CPM_BRG4 ,/* Baud Rate Generator 4 */ +CPM_BRG5 ,/* Baud Rate Generator 5 */ +CPM_BRG6 ,/* Baud Rate Generator 6 */ +CPM_BRG7 ,/* Baud Rate Generator 7 */ +CPM_BRG8 ,/* Baud Rate Generator 8 */ +CPM_CLK1 ,/* Clock 1 */ +CPM_CLK2 ,/* Clock 2 */ +CPM_CLK3 ,/* Clock 3 */ +CPM_CLK4 ,/* Clock 4 */ +CPM_CLK5 ,/* Clock 5 */ +CPM_CLK6 ,/* Clock 6 */ +CPM_CLK7 ,/* Clock 7 */ +CPM_CLK8 ,/* Clock 8 */ +CPM_CLK9 ,/* Clock 9 */ +CPM_CLK10 ,/* Clock 10 */ +CPM_CLK11 ,/* Clock 11 */ +CPM_CLK12 ,/* Clock 12 */ +CPM_CLK13 ,/* Clock 13 */ +CPM_CLK14 ,/* Clock 14 */ +CPM_CLK15 ,/* Clock 15 */ +CPM_CLK16 ,/* Clock 16 */ +CPM_CLK17 ,/* Clock 17 */ +CPM_CLK18 ,/* Clock 18 */ +CPM_CLK19 ,/* Clock 19 */ +CPM_CLK20 ,/* Clock 20 */ +CPM_CLK_DUMMY +};
Quoted 8 lines
Quoted 5 lines
include/asm-ppc/cpm2.h +2
-0+ +extern int cpm2_clk_setup(enum cpm_clk_target target, int clock,int mode); +
#endif /*__CPM2__*/
#endif /*__KERNEL__*/And this file refuses to be patched altogether... With these rejects fixed, everything seems fine, though.
The same note - the mis-sync because preceding fs_enet overhaul and update are missing before the stuff above.
Taking into accordance Kumar's opinion to put this on hold until the next kernel release, the whole thing should settle down pretty shortly hereby before upstream merge. Meanwhile, we'll catch up the issues and scrub the code in general. Hopefully, with netdev things merged, we'll get back to the only powerpc.git base which will simplify following them up.
Quoted 4 lines
WBR, Sergei
Quoted 5 lines · Vitaly Bordug
The following series implements the generic cpm2 infrastructure port, mpc8560 board-specific bits, and an attempt to overhaul and get rid of some stuff moved along from the 2.4 times.
Signed-off-by Vitaly Bordug <[email protected]>
Can you post the .dts for 8560 you are using. I'd like to look at it before reviewing the patchset.
thanks
- kumar