Skip to contentSkip to conversation

POWERPC: Add support for CPM2 peripherals and 8560 eval board

PATCH In review Vitaly Bordug 5 participants 16 messages Aug 12, 2006 – Aug 22, 2006

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

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

#1 lore raw

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
index 4a6aa64..7f4ed40 100644
@@ -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
index c433d3f..25230ce 100644
@@ -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
#2 lore raw

PATCH 2/6 CPM_UART: update to make the utilization possible both from ppc and powerpc

In reply to Vitaly Bordug

Driver 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
index 90ff96e..dfa06b6 100644
@@ -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(struc
 
 	if (!(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_setup
 	if (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
index ef3bb47..02b9ef9 100644
@@ -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
new file mode 100644
index 0000000..d530f68
@@ -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
new file mode 100644
index 0000000..eed7778
@@ -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
#3 lore raw

PATCH 3/6 POWERPC: move the generic cpm2 stuff to the powerpc

In reply to 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.

---

 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
index 336dd19..460cea0 100644
@@ -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
index cebfae2..0f44f06 100644
@@ -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
new file mode 100644
index 0000000..436cca7
@@ -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
index f6a7ff0..876974e 100644
@@ -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__ */
#4 lore raw

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.

[...]

Quoted 4 lines
include/asm-ppc/cpm2.h +0 -0
index f6a7ff0..876974e 100644

[...]

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

#5 lore raw

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.

[...]

Quoted 4 lines
include/asm-ppc/cpm2.h +0 -0
index f6a7ff0..876974e 100644

[...]

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

#6 lore raw

PATCH 4/6 POWERPC: add support of mpc8560 eval board

In reply to Vitaly Bordug

This 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
new file mode 100644
index 0000000..f6ccb99
@@ -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
index 454fc53..3d440de 100644
@@ -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
index 7615aa5..282f5d0 100644
@@ -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
index c0d56d2..670abaf 100644
@@ -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
index b44db62..4fe613e 100644
@@ -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
index 05930ee..af4cef5 100644
@@ -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

#7 lore raw

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
new file mode 100644
index 0000000..f6ccb99

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
index 454fc53..3d440de 100644

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
index c0d56d2..670abaf 100644
@@ -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

arch/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
index b44db62..4fe613e 100644
@@ -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
index d0cfcdb..974e035 100644
@@ -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 */
 #else
 	0x0,			/* 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 -2
 	0x0,			/* 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_PCI
 int
 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 __init
mpc85xx_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 -0
 	mpic_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

#8 lore raw

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

#9 lore raw

Re: [PATCH 4/6] POWERPC: add support of mpc8560 eval board

In reply to Andy Fleming
Quoted 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..f6ccb99

arch/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 -0

platforms/85xx/Kconfig
index 454fc53..3d440de 100644

arch/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 100644

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 the

arch/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		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.

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.h

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

Quoted 7 lines
arch/powerpc/ renamed from arch/powerpc/platforms/85xx/mpc85xx.h +0 -0

platforms/85xx/mpc85xx.h
index b44db62..4fe613e 100644

arch/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 -0
 extern 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 100644

arch/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 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.

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),	/* Ext

1: PCI slot 0 */

arch/powerpc/platforms/85xx/mpc85xx_ads.c +0 -1
-	(IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),	/* Ext

2: PCI slot 1 */

arch/powerpc/platforms/85xx/mpc85xx_ads.c +0 -1
-	(IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),	/* Ext

3: PCI slot 2 */

arch/powerpc/platforms/85xx/mpc85xx_ads.c +0 -1
-	(IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),	/* Ext

4: 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 */
 #else
 	0x0,			/* 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 -0
 	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.

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_PCI
 int
 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 tree

ERROR\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 __init
mpc85xx_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

Quoted 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_map to handle this.

Quoted 7 lines

arch/powerpc/platforms/85xx/mpc85xx_ads.c

Quoted 2 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +1 -0
 	mpic_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_CPM2 here

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.h

This 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

#10 lore raw

Re: [PATCH 4/6] POWERPC: add support of mpc8560 eval board

In reply to Andy Fleming
Quoted 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..f6ccb99

arch/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 -0

platforms/85xx/Kconfig
index 454fc53..3d440de 100644

arch/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 100644

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 the

arch/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		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.

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.h

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

Quoted 7 lines
arch/powerpc/ renamed from arch/powerpc/platforms/85xx/mpc85xx.h +0 -0

platforms/85xx/mpc85xx.h
index b44db62..4fe613e 100644

arch/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 -0
 extern 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 100644

arch/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 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.

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),	/* Ext

1: PCI slot 0 */

arch/powerpc/platforms/85xx/mpc85xx_ads.c +0 -1
-	(IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),	/* Ext

2: PCI slot 1 */

arch/powerpc/platforms/85xx/mpc85xx_ads.c +0 -1
-	(IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),	/* Ext

3: PCI slot 2 */

arch/powerpc/platforms/85xx/mpc85xx_ads.c +0 -1
-	(IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),	/* Ext

4: 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 */
 #else
 	0x0,			/* 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 -0
 	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.

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_PCI
 int
 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 tree

ERROR\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 __init
mpc85xx_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

Quoted 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_map to handle this.

Quoted 7 lines

arch/powerpc/platforms/85xx/mpc85xx_ads.c

Quoted 2 lines
arch/powerpc/platforms/85xx/mpc85xx_ads.c +1 -0
 	mpic_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_CPM2 here

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.h

This 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

#11 lore raw

RFC PATCH 5/6 POWERPC cpm2: get rid of remapping the whole immr

In reply to Vitaly Bordug

The 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
index 1161970..ea1a7bf 100644
@@ -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 @@ void
 cpm2_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 di
 	volatile 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
index ec9df31..845a08b 100644
@@ -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
index 436cca7..d63e45d 100644
@@ -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
index 7f4ed40..cff9bf7 100644
@@ -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
index 4793fec..a663300 100644
@@ -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
index d530f68..3d0e819 100644
@@ -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
index 876974e..bd6623a 100644
@@ -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
index eed7778..8691327 100644
@@ -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
#12 lore raw

RFC PATCH 6/6 POWERPC: generic CPM2 peripherals rehaul with cpm2_map mechanism

In reply to Vitaly Bordug

Incorporating 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
index 974e035..52be63a 100644
@@ -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
index cff9bf7..7878613 100644
@@ -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
index 2a35fe2..d5d36c3 100644
@@ -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
index e12cece..5f130dc 100644
@@ -137,7 +137,7 @@ #endif
 	iounmap(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
index 5dfa4e6..bf388ed 100644
@@ -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_e
 	mpc885ads_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
index df62506..f358ee6 100644
@@ -971,7 +971,7 @@ static struct net_device *fs_init_instan
 	dev_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
index dfa06b6..24613a6 100644
@@ -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 dev
 		return 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
index 74ed35a..9322235 100644
@@ -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
index f597512..a99a020 100644
@@ -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
#13 lore raw

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_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).

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
index 2a35fe2..d5d36c3 100644
@@ -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
index e12cece..5f130dc 100644

[...]

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
index 5dfa4e6..bf388ed 100644

[...]

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_e
 	mpc885ads_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
index bd6623a..220cc2d 100644
@@ -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

#14 lore raw

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_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).

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.c index 2a35fe2..d5d36c3 100644 --- a/arch/ppc/platforms/mpc8272ads_setup.c +++ b/arch/ppc/platforms/mpc8272ads_setup.c

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
(quoted diff) +0 -0

b/arch/ppc/platforms/mpc866ads_setup.c index e12cece..5f130dc 100644

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
(quoted diff) +0 -0

b/arch/ppc/platforms/mpc885ads_setup.c index 5dfa4e6..bf388ed 100644

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_e
 	mpc885ads_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
index bd6623a..220cc2d 100644
@@ -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

#15 lore raw
In reply to Vitaly Bordug
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.

Can you post the .dts for 8560 you are using. I'd like to look at it before reviewing the patchset.

thanks

- kumar