On Fri, Oct 09, 2009 at 10:11:05AM +0200, Niklaus Giger wrote: >Adds support for a HCU5 PPC405EPx based board from Netstal Maschinen AG.
Should be 440EPx, no? Also, the subject should probably be "powerpc/44x". These are minor things, not really a big deal. Overall, nice patch. See below for a few more comments. >+ UART0: ser...@ef600300 { >+ device_type = "serial"; >+ compatible = "ns16550"; >+ reg = <0xef600300 0x00000008>; >+ virtual-reg = <0xef600300>; >+ clock-frequency = <0>; /* Filled in by U-Boot */ >+ current-speed = <0>; /* Filled in by U-Boot */ I've been considering dropping the current-speed property entirely in most 4xx boards. Given that you have a bootargs specified in chosen that explicitly tells the kernel to use 115200, do you think you could drop this property and see how things work? >+ interrupt-parent = <&UIC0>; >+ interrupts = <0x0 0x4>; >+ }; >+ >+ IIC0: i...@ef600700 { >+ #address-cells = <1>; >+ #size-cells = <0>; >+ compatible = "ibm,iic-440epx", "ibm,iic"; >+ reg = <0xef600700 0x00000014>; >+ interrupt-parent = <&UIC0>; >+ interrupts = <0x2 0x4>; >+ }; >+ >+ IIC1: i...@ef600800 { >+ #address-cells = <1>; >+ #size-cells = <0>; >+ compatible = "ibm,iic-440epx", "ibm,iic"; >+ reg = <0xef600800 0x00000014>; >+ interrupt-parent = <&UIC0>; >+ interrupts = <0x7 0x4>; >+ }; >+ >+ >+ ZMII0: emac-z...@ef600d00 { >+ compatible = "ibm,zmii-440epx", "ibm,zmii"; >+ reg = <0xef600d00 0x0000000c>; >+ }; >+ >+ SMII0: emac-s...@ef601000 { >+ compatible = "ibm,smii-440epx", >"ibm,smmii"; >+ reg = <0xef601000 0x00000008>; >+ has-mdio; >+ }; >+ >+ EMAC0: ether...@ef600e00 { >+ device_type = "network"; >+ compatible = "ibm,emac-440epx", "ibm,emac4"; >+ interrupt-parent = <&EMAC0>; >+ interrupts = <0x0 0x1>; >+ #interrupt-cells = <1>; >+ #address-cells = <0>; >+ #size-cells = <0>; >+ interrupt-map = </*Status*/ 0x0 &UIC0 0x18 0x4 >+ /*Wake*/ 0x1 &UIC1 0x1d 0x4>; >+ reg = <0xef600e00 0x00000074>; >+ local-mac-address = [000000000000]; >+ mal-device = <&MAL0>; >+ mal-tx-channel = <0>; >+ mal-rx-channel = <0>; >+ cell-index = <0>; >+ max-frame-size = <9000>; >+ rx-fifo-size = <4096>; >+ tx-fifo-size = <2048>; >+ phy-mode = "smii"; >+ phy-map = <1>; >+ zmii-device = <&ZMII0>; >+ zmii-channel = <0>; >+ has-inverted-stacr-oc; >+ has-new-stacr-staopc; >+ }; >+ >+ CPLD: c...@0xcd000000 { >+ reg = <0xcd000000 0x00000100>; >+ interval = "1000"; >+ device_type = "cpld"; Should drop the device_type. >+ interrupt-parent = <&UIC1>; >+ interrupts = <28 8>; /* 8 is IRQ_TYPE_LEVEL_LOW >*/ >+ }; >+ >+ /* The HCU5 has two Intel CAN SCC82527 controllers */ >+ CAN1: c...@0xc8000000 { >+ device_type = "can1"; Same comment here and for the one below as well. >+ compatible = "intel,82527"; >+ reg = <0xc800000 0x00000100>; >+ interrupt-parent = <&UIC2>; >+ interrupts = <3 8>; /* 8 is IRQ_TYPE_LEVEL_LOW >*/ >+ }; >+ >+ CAN2: c...@0xc8000100 { >+ device_type = "can2"; >+ compatible = "intel,82527"; >+ reg = <0xc8000100 0x00000100>; >+ interrupt-parent = <&UIC2>; >+ interrupts = <4 8>; /* 8 is IRQ_TYPE_LEVEL_LOW >*/ >+ }; >+ >+ }; >+ >+ }; >+ >+ chosen { >+ linux,stdout-path = "/plb/opb/ser...@ef600300"; >+ bootargs = "console=ttyS0,115200"; >+ }; >+}; >+# Platform support >+# >+# CONFIG_PPC_CELL is not set >+# CONFIG_PPC_CELL_NATIVE is not set >+# CONFIG_PQ2ADS is not set >+CONFIG_BAMBOO=y >+# CONFIG_EBONY is not set >+CONFIG_HCU5=y You have both bamboo and hcu5 enabled... >+# CONFIG_SAM440EP is not set >+# CONFIG_SEQUOIA is not set >+# CONFIG_TAISHAN is not set >+# CONFIG_KATMAI is not set >+# CONFIG_RAINIER is not set >+# CONFIG_WARP is not set >+# CONFIG_ARCHES is not set >+# CONFIG_CANYONLANDS is not set >+# CONFIG_GLACIER is not set >+# CONFIG_REDWOOD is not set >+# CONFIG_EIGER is not set >+# CONFIG_YOSEMITE is not set >+# CONFIG_XILINX_VIRTEX440_GENERIC_BOARD is not set >+CONFIG_PPC44x_SIMPLE=y >+# CONFIG_PPC4xx_GPIO is not set >+CONFIG_440EP=y >+CONFIG_440EPX=y >+CONFIG_IBM440EP_ERR42=y And both 440EP and 440EPx? Just curious as to why. >+# >+# Bus options >+# >+CONFIG_ZONE_DMA=y >+CONFIG_PPC_INDIRECT_PCI=y >+CONFIG_4xx_SOC=y >+CONFIG_PPC_PCI_CHOICE=y >+CONFIG_PCI=y >+CONFIG_PCI_DOMAINS=y >+CONFIG_PCI_SYSCALL=y You have PCI enabled, but no PCI device nodes in your DTS. >diff --git a/arch/powerpc/platforms/44x/Kconfig >b/arch/powerpc/platforms/44x/Kconfig >index 7486bff..cbf3601 100644 >--- a/arch/powerpc/platforms/44x/Kconfig >+++ b/arch/powerpc/platforms/44x/Kconfig >@@ -18,6 +18,15 @@ config EBONY > help > This option enables support for the IBM PPC440GP evaluation board. > >+config HCU5 >+ bool "Hcu5" >+ depends on 44x >+ default n >+ select PPC44x_SIMPLE I don't think you need to select this here. PPC44x_SIMPLE is for boards that don't have their own .c file. >+ select 440EPX >+ help >+ This option enables support for the Netstal Maschinen HCU5 board. >+ > config SAM440EP > bool "Sam440ep" > depends on 44x >diff --git a/arch/powerpc/platforms/44x/Makefile >b/arch/powerpc/platforms/44x/Makefile >index ee6185a..5263595 100644 >--- a/arch/powerpc/platforms/44x/Makefile >+++ b/arch/powerpc/platforms/44x/Makefile >@@ -1,6 +1,7 @@ > obj-$(CONFIG_44x) := misc_44x.o idle.o > obj-$(CONFIG_PPC44x_SIMPLE) += ppc44x_simple.o > obj-$(CONFIG_EBONY) += ebony.o >+obj-$(CONFIG_HCU5) += hcu5.o > obj-$(CONFIG_SAM440EP) += sam440ep.o > obj-$(CONFIG_WARP) += warp.o > obj-$(CONFIG_XILINX_VIRTEX_5_FXT) += virtex.o >diff --git a/arch/powerpc/platforms/44x/hcu5.c >b/arch/powerpc/platforms/44x/hcu5.c >new file mode 100644 >index 0000000..1248a84 >--- /dev/null >+++ b/arch/powerpc/platforms/44x/hcu5.c >@@ -0,0 +1,153 @@ >+/* >+ * arch/ppc/platforms/4xx/hcu5.c >+ * >+ * HCU5 board specific routines >+ * >+ * Copyright (c) 2009 Niklaus Giger <niklaus.gi...@member.fsf.org> >+ * >+ * Copyright 2006-2007 DENX Software Engineering, Stefan Roese <s...@denx.de> >+ * >+ * Based on bamboo.c from Wade Farnsworth <wfarnswo...@mvista.com> >+ * Copyright 2004 MontaVista Software Inc. >+ * Copyright 2006 AMCC >+ * >+ * 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 <asm/machdep.h> >+#include <asm/pci-bridge.h> >+#include <asm/ppc4xx.h> >+#include <asm/prom.h> >+#include <asm/time.h> >+#include <asm/udbg.h> >+#include <asm/uic.h> >+ >+#include <linux/init.h> >+#include <linux/of_platform.h> >+#include <linux/of_device.h> >+#include <asm/irq.h> >+#include <linux/types.h> >+#include <linux/interrupt.h> >+#include <asm/device.h> >+ >+static int __init hcu5_probe(void); >+#define debug printk We have a pr_debug already. Could you use that? As it stands now this does nothing more than s/printk/debug, which seems unecessary unless you meant for it to be switchable. >+/* HCU5 tick-status und tick-ontrol-register definitions */ >+#define CFG_CS_2 0xCC000000 >+#define CFG_CPLD CFG_CS_2 >+#define HCU_TICK_CONTROL_REGISTER_ADDRESS (CFG_CPLD + 0x1000000) >+ >+#define TICK_INTERRUPT_ON_HCU5 60 /* UIC1, 28, GPIO40, IRQ0 */ >+#define CAN1_INTERRUPT_ON_HCU5 67 /* UIC2, 3 GPIO42 IRQ2 */ >+#define CAN2_INTERRUPT_ON_HCU5 68 /* UIC3, 4 GPIO43 IRQ3 */ >+ >+#define TICK_INT_ENABLE 0x01 >+#define TICK_INT_RESET 0x02 >+#define TICK_INT_PENDING 0x04 >+#define TICK_START 0x08 >+ >+#define TICK_INTERVAL_250_US 0x00 >+#define TICK_INTERVAL_500_US 0x10 >+#define TICK_INTERVAL_1000_US 0x20 >+#define TICK_INTERVAL_2000_US 0x30 >+ >+static u16 __iomem *tickAddr; >+ >+static irqreturn_t cpld_interrupt(int irq, void *dev_id) >+{ >+ /* >+ out_be16(HCU_TICK_CONTROL_REGISTER_ADDRESS, >+ TICK_INT_ENABLE | TICK_INT_RESET | TICK_START | >+ TICK_INTERVAL_1000_US); >+ */ >+ return 0; >+} >+ >+static irqreturn_t can1_interrupt(int irq, void *dev_id) >+{ >+ return 0; >+} >+ >+static irqreturn_t can2_interrupt(int irq, void *dev_id) >+{ >+ return 0; >+} >+ >+static int map_one_irq(const char *typeName, void *proc) >+{ >+ struct device_node *np; >+ int irq = 0; >+ int rc; >+ >+ np = of_find_node_by_type(NULL, typeName); Use of_find_compatible_node and specify proper compatible properties instead. >+ debug(KERN_INFO "%s: %s np %p\n", __func__, typeName, np); >+ if (!np) { >+ printk(KERN_INFO "\n\nNo %s found in device tree\n", typeName); >+ return -1; >+ } >+ >+ irq = irq_of_parse_and_map(np, 0); >+ debug(KERN_INFO "%s: %s with irq %d\n", __func__, typeName, irq); >+ if (irq == NO_IRQ) { >+ printk(KERN_ERR "%s: irq_of_parse_and_map failed\n", typeName); >+ of_node_put(np); >+ return -ENODEV; >+ } >+ rc = request_irq(irq, proc, IRQF_TRIGGER_LOW, >+ typeName, NULL); >+ debug(KERN_INFO"%s: %s %d rc %d\n", >+ __func__, typeName, irq, rc); >+ return 0; >+} >+ >+static __initdata struct of_device_id hcu5_of_bus[] = { >+ { .compatible = "ibm,plb4", }, >+ { .compatible = "ibm,opb", }, >+ { .compatible = "ibm,ebc", }, >+ { .compatible = "simple-bus", }, >+ {}, >+}; >+ >+static int __init hcu5_device_probe(void) >+{ >+ of_platform_bus_probe(NULL, hcu5_of_bus, NULL); >+ tickAddr = ioremap(HCU_TICK_CONTROL_REGISTER_ADDRESS, 0x100); >+ printk(KERN_INFO "%s: tickAddr is at %p from 0x%x\n", __func__, >+ tickAddr, HCU_TICK_CONTROL_REGISTER_ADDRESS); >+ map_one_irq("cpld", cpld_interrupt); >+ map_one_irq("can1", can1_interrupt); >+ map_one_irq("can2", can2_interrupt); >+ >+ return 0; >+} >+ >+machine_device_initcall(hcu5, hcu5_device_probe); >+ >+/* >+* Called very early, MMU is off, device-tree isn't unflattened >+*/ >+static int __init hcu5_probe(void) >+{ >+ unsigned long root = of_get_flat_dt_root(); >+ >+ if (!of_flat_dt_is_compatible(root, "netstal,hcu5")) >+ return 0; >+ ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC; Do you need this line at all? You don't have PCI nodes... >+ return 1; >+} >+ josh _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev