[PATCH] powerpc: add support for multiple 85xx RapidIO development boards

Alex Dubov oakad at yahoo.com
Fri Jan 7 19:27:24 EST 2011


Many RapidIO development boards do not require any board/vendor specific
tweaking at kernel start, and can rely on the flattened device tree for
all their hardware configuration needs.

This patch adds support for "generic,mpc85xx-riodev" compatible boards
with PCI disabled by default and RapidIO enabled. It will also try to
read a "vendor" property from the root of device tree to provide a possibly
useful bit of information in the /proc/cpuinfo.

Signed-off-by: Alex Dubov <oakad at yahoo.com>
---
 arch/powerpc/configs/85xx/mpc85xx_riodev_defconfig |   82 ++++++++++++++
 arch/powerpc/platforms/85xx/Kconfig                |    9 ++
 arch/powerpc/platforms/85xx/Makefile               |    1 +
 arch/powerpc/platforms/85xx/mpc85xx_riodev.c       |  116 ++++++++++++++++++++
 4 files changed, 208 insertions(+), 0 deletions(-)
 create mode 100644 arch/powerpc/configs/85xx/mpc85xx_riodev_defconfig
 create mode 100644 arch/powerpc/platforms/85xx/mpc85xx_riodev.c

diff --git a/arch/powerpc/configs/85xx/mpc85xx_riodev_defconfig b/arch/powerpc/configs/85xx/mpc85xx_riodev_defconfig
new file mode 100644
index 0000000..5d0596e
--- /dev/null
+++ b/arch/powerpc/configs/85xx/mpc85xx_riodev_defconfig
@@ -0,0 +1,82 @@
+CONFIG_PPC_85xx=y
+CONFIG_EXPERIMENTAL=y
+CONFIG_SYSVIPC=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_EMBEDDED=y
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_BLK_DEV_BSG is not set
+CONFIG_MPC85xx_RIODEV=y
+CONFIG_HIGHMEM=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_BINFMT_MISC=y
+CONFIG_MATH_EMULATION=y
+CONFIG_SPARSE_IRQ=y
+# CONFIG_SECCOMP is not set
+CONFIG_PCI=n
+CONFIG_PCIEPORTBUS=n
+# CONFIG_PCIEASPM is not set
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_XFRM_USER=y
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+CONFIG_SYN_COOKIES=y
+# CONFIG_INET_LRO is not set
+# CONFIG_IPV6 is not set
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+# CONFIG_FW_LOADER is not set
+CONFIG_MTD=y
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_OF_PARTS=y
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLKDEVS=y
+CONFIG_MTD_CFI=y
+CONFIG_MTD_CFI_AMDSTD=y
+CONFIG_MTD_PHYSMAP_OF=y
+CONFIG_MTD_NAND_ECC_SMC=y
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_FSL_UPM=y
+CONFIG_PROC_DEVICETREE=y
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=32768
+CONFIG_NETDEVICES=y
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+CONFIG_GIANFAR=y
+# CONFIG_INPUT_MOUSEDEV is not set
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_SERIO is not set
+# CONFIG_VT is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+# CONFIG_HW_RANDOM is not set
+CONFIG_I2C=y
+CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_MPC=y
+CONFIG_VIDEO_OUTPUT_CONTROL=y
+# CONFIG_USB_SUPPORT is not set
+CONFIG_INOTIFY=y
+CONFIG_PROC_KCORE=y
+CONFIG_TMPFS=y
+CONFIG_JFFS2_FS=y
+CONFIG_NFS_FS=y
+CONFIG_ROOT_NFS=y
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_MSDOS_PARTITION is not set
+CONFIG_DEBUG_KERNEL=y
+CONFIG_DETECT_HUNG_TASK=y
+CONFIG_DEBUG_MUTEXES=y
+# CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_RCU_CPU_STALL_DETECTOR is not set
+CONFIG_SYSCTL_SYSCALL_CHECK=y
+# CONFIG_CRYPTO_ANSI_CPRNG is not set
diff --git a/arch/powerpc/platforms/85xx/Kconfig b/arch/powerpc/platforms/85xx/Kconfig
index b6976e1..be48db0 100644
--- a/arch/powerpc/platforms/85xx/Kconfig
+++ b/arch/powerpc/platforms/85xx/Kconfig
@@ -97,6 +97,15 @@ config XES_MPC85xx
 	  Manufacturer: Extreme Engineering Solutions, Inc.
 	  URL: <http://www.xes-inc.com/>
 
+config MPC85xx_RIODEV
+	bool "Generic MPC85xx board with serial RapidIO"
+	select DEFAULT_UIMAGE
+	select HAS_RAPIDIO
+	help
+	  This option enables support for one of many RapidIO development
+	  boards, which do not need any vendor specific kernel tweaks and
+	  fully rely on flattened device tree for the hardware configuration.
+
 config STX_GP3
 	bool "Silicon Turnkey Express GP3"
 	help
diff --git a/arch/powerpc/platforms/85xx/Makefile b/arch/powerpc/platforms/85xx/Makefile
index dd70db7..228f0f9 100644
--- a/arch/powerpc/platforms/85xx/Makefile
+++ b/arch/powerpc/platforms/85xx/Makefile
@@ -14,6 +14,7 @@ obj-$(CONFIG_P1022_DS)    += p1022_ds.o
 obj-$(CONFIG_P3041_DS)    += p3041_ds.o corenet_ds.o
 obj-$(CONFIG_P4080_DS)    += p4080_ds.o corenet_ds.o
 obj-$(CONFIG_P5020_DS)    += p5020_ds.o corenet_ds.o
+obj-$(CONFIG_MPC85xx_RIODEV) += mpc85xx_riodev.o
 obj-$(CONFIG_STX_GP3)	  += stx_gp3.o
 obj-$(CONFIG_TQM85xx)	  += tqm85xx.o
 obj-$(CONFIG_SBC8560)     += sbc8560.o
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_riodev.c b/arch/powerpc/platforms/85xx/mpc85xx_riodev.c
new file mode 100644
index 0000000..415f22b
--- /dev/null
+++ b/arch/powerpc/platforms/85xx/mpc85xx_riodev.c
@@ -0,0 +1,116 @@
+/*
+ * Based on tqm85xx.c and other similar files.
+ *
+ * Copyright (c) 2011 Alex Dubov <oakad at yahoo.com>
+ *
+ * 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.
+ */
+
+#include <linux/seq_file.h>
+#include <linux/of_platform.h>
+
+#include <asm/machdep.h>
+#include <asm/mpic.h>
+#include <asm/udbg.h>
+
+#include <sysdev/fsl_soc.h>
+
+static void __init mpc85xx_riodev_pic_init(void)
+{
+	struct mpic *mpic;
+	struct resource r;
+	struct device_node *np;
+
+	np = of_find_node_by_type(NULL, "open-pic");
+	if (!np) {
+		printk(KERN_ERR "Could not find open-pic node\n");
+		return;
+	}
+
+	if (of_address_to_resource(np, 0, &r)) {
+		printk(KERN_ERR "Could not map mpic register space\n");
+		of_node_put(np);
+		return;
+	}
+
+	mpic = mpic_alloc(np, r.start,
+			MPIC_PRIMARY | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN,
+			0, 256, " OpenPIC  ");
+	BUG_ON(mpic == NULL);
+	of_node_put(np);
+
+	mpic_init(mpic);
+}
+
+/*
+ * Setup the architecture
+ */
+static void __init mpc85xx_riodev_setup_arch(void)
+{
+}
+
+static void mpc85xx_riodev_show_cpuinfo(struct seq_file *m)
+{
+	struct device_node *root = NULL;
+	const char *vendor_str = NULL;
+	uint pvid, svid, phid1;
+
+	pvid = mfspr(SPRN_PVR);
+	svid = mfspr(SPRN_SVR);
+
+	root = of_find_node_by_path("/");
+	if (root) {
+		vendor_str = of_get_property(root, "vendor", NULL);
+		of_node_put(root);
+	}
+
+	if (!vendor_str)
+		vendor_str = "generic";
+
+	seq_printf(m, "vendor\t\t: %s\n", vendor_str);
+	seq_printf(m, "PVR\t\t: 0x%x\n", pvid);
+	seq_printf(m, "SVR\t\t: 0x%x\n", svid);
+
+	/* Display cpu Pll setting */
+	phid1 = mfspr(SPRN_HID1);
+	seq_printf(m, "PLL setting\t: 0x%x\n", ((phid1 >> 24) & 0x3f));
+}
+
+static struct of_device_id __initdata of_bus_ids[] = {
+	{ .compatible = "simple-bus", },
+	{ .compatible = "gianfar", },
+	{},
+};
+
+static int __init declare_of_platform_devices(void)
+{
+	of_platform_bus_probe(NULL, of_bus_ids, NULL);
+
+	return 0;
+}
+machine_device_initcall(mpc85xx_riodev, declare_of_platform_devices);
+
+/*
+ * Called very early, device-tree isn't unflattened
+ */
+static int __init mpc85xx_riodev_probe(void)
+{
+	unsigned long root = of_get_flat_dt_root();
+
+	return of_flat_dt_is_compatible(root, "generic,mpc85xx-riodev");
+}
+
+define_machine(mpc85xx_riodev) {
+	.name			= "MPC85xx w/ SRIO",
+	.probe			= mpc85xx_riodev_probe,
+	.setup_arch		= mpc85xx_riodev_setup_arch,
+	.init_IRQ		= mpc85xx_riodev_pic_init,
+	.show_cpuinfo		= mpc85xx_riodev_show_cpuinfo,
+	.get_irq		= mpic_get_irq,
+	.restart		= fsl_rstcr_restart,
+	.calibrate_decr		= generic_calibrate_decr,
+	.progress		= udbg_progress,
+};
-- 
1.7.3.2




      


More information about the Linuxppc-dev mailing list