On May 8, 2007, at 4:56 PM, Øyvind Repvik wrote: > On Sunday 06 May 2007 14:46:05 Øyvind Repvik wrote: >> Hi, >> >> This patch adds support for the QNAP TurboStation TS-101 and >> TS-201 devices. > > Of course, it probably helps if my mail client doesn't break the > patch completely.
Comments below. Out of interesting, what's the difference between the TS-101 and TS-201? > > > Signed-off-by: Øyvind Repvik <[EMAIL PROTECTED]> > Signed-off-by: Alessandro Zummo <[EMAIL PROTECTED]> > > --- linux-2.6.21.1/arch/powerpc/boot/dts/qnap-ts101.dts 1970-01-01 > 01:00:00.000000000 +0100 > +++ linux-2.6.21.1.ts/arch/powerpc/boot/dts/qnap-ts101.dts > 2007-05-03 22:44:59.000000000 +0200 > @@ -0,0 +1,166 @@ > +/* > + * Device Tree Souce for QNAP Turbostation 101/201 > + * > + * Choose CONFIG_TURBOSTATION to build a kernel for turbostation > + * > + * > + * Based on kuroboxHD.dts by G. Liakhovetski > + * > + * 2007 (c) Oyvind Repvik <[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. > + * > + * build with: "dtc -f -I dts -O dtb -o qnap-ts101.dtb -V 16 qnap- > ts101.dts" > + * > + * > + */ > + > +/ { > + linux,phandle = <1000>; > + model = "TurboStation TSx01"; > + compatible = "turbostation"; > + #address-cells = <1>; > + #size-cells = <1>; > + > + cpus { > + linux,phandle = <2000>; Can you removal all linux,phandle's and use the new reference syntax. > + #cpus = <1>; > + #address-cells = <1>; > + #size-cells = <0>; > + > + PowerPC,603e { /* Really 8241 */ > + linux,phandle = <2100>; > + device_type = "cpu"; > + reg = <0>; > + clock-frequency = <fdad680>; /* 266 MHz */ > + timebase-frequency = <1fca055>; /* 33.3333333 MHz */ > + bus-frequency = <0>; > + /* Following required by dtc but not used */ > + i-cache-line-size = <0>; > + d-cache-line-size = <0>; No reason not to set the line-size properly to <20> > + i-cache-size = <4000>; > + d-cache-size = <4000>; > + }; > + }; > + > + /* 64MB @ 0x0 */ > + memory { > + linux,phandle = <3000>; > + device_type = "memory"; > + reg = <00000000 04000000>; > + }; > + > + [EMAIL PROTECTED] { > + linux,phandle = <3100>; > + device_type = "rom"; > + compatible = "direct-mapped"; > + probe-type = "CFI"; > + reg = <ff000000 01000000>; > + bank-width = <1>; > + partitions = < > + 00000000 00200000 > + 00200000 00d00000 > + 00f00000 00040001 > + 00f40000 00020000 > + 00f60000 00040000 > + 00fa0000 00020000 > + 00fc0000 00040000 > + >; > + partition-names = "kernel\0rootfs\0uboot1\0uboot1-env\0uboot2 > \0uboot2-env\0SysConf"; > + }; > + > + > + soc10x { /* AFAICT need to make soc for 8245's uarts to be > defined */ > + linux,phandle = <4000>; > + #address-cells = <1>; > + #size-cells = <1>; > + #interrupt-cells = <2>; > + device_type = "soc"; > + compatible = "mpc10x"; > + store-gathering = <0>; /* 0 == off, !0 == on */ > + reg = <80000000 00100000>; > + ranges = <80000000 80000000 70000000 /* pci mem space */ > + fc000000 fc000000 00100000 /* EUMB */ > + fe000000 fe000000 00c00000 /* pci i/o space */ > + fec00000 fec00000 00300000 /* pci cfg regs */ > + fef00000 fef00000 00100000>; /* pci iack */ > + > + [EMAIL PROTECTED] { > + linux,phandle = <4300>; > + device_type = "i2c"; > + compatible = "fsl-i2c"; > + reg = <fc003000 1000>; > + interrupts = <5 2>; > + interrupt-parent = <4400>; > + }; > + > + [EMAIL PROTECTED] { > + linux,phandle = <4511>; > + device_type = "serial"; > + compatible = "ns16550"; > + reg = <fc004500 8>; > + clock-frequency = <7ed6b40>; /* 133 MHz */ > + current-speed = <1c200>; /* 115200 */ > + interrupts = <9 2>; > + interrupt-parent = <4400>; > + }; > + > + [EMAIL PROTECTED] { > + linux,phandle = <4512>; > + device_type = "serial"; > + compatible = "ns16550"; > + reg = <fc004600 8>; > + clock-frequency = <7ed6b40>; > + current-speed = <4b00>; /* 19200 */ > + interrupts = <a 2>; > + interrupt-parent = <4400>; > + }; > + > + [EMAIL PROTECTED] { > + linux,phandle = <4400>; > + #interrupt-cells = <2>; > + #address-cells = <0>; > + device_type = "open-pic"; > + compatible = "chrp,open-pic"; > + interrupt-controller; > + reg = <fc040000 40000>; > + built-in; > + }; > + > + [EMAIL PROTECTED] { > + linux,phandle = <4500>; > + #address-cells = <3>; > + #size-cells = <2>; > + #interrupt-cells = <1>; > + device_type = "pci"; > + compatible = "mpc10x-pci"; > + reg = <fc000000 400000>; > + ranges = <01000000 0 0 fe000000 0 00c00000 > + 02000000 0 80000000 80000000 0 70000000>; > + bus-range = <0 ff>; > + clock-frequency = <7ed6b40>; /* 133 MHz */ > + interrupt-parent = <4400>; > + interrupt-map-mask = <f800 0 0 7>; > + interrupt-map = < > + /* IDSEL 0x13 - SATA*/ > + 6800 0 0 1 4400 0 1 > + 6800 0 0 2 4400 0 1 > + 6800 0 0 3 4400 0 1 > + 6800 0 0 4 4400 0 1 > + /* IDSEL 0x14 - USB */ > + 7000 0 0 1 4400 1 1 > + 7000 0 0 2 4400 1 1 > + 7000 0 0 3 4400 1 1 > + 7000 0 0 4 4400 1 1 > + /* IDSEL 0x15 - ETH */ > + 7800 0 0 1 4400 2 1 > + 7800 0 0 2 4400 2 1 > + 7800 0 0 3 4400 2 1 > + 7800 0 0 4 4400 2 1 > + >; > + }; > + }; > +}; > Binary files linux-2.6.21.1/arch/powerpc/boot/dts/storcenter.dtb > and linux-2.6.21.1.ts/arch/powerpc/boot/dts/storcenter.dtb differ > --- linux-2.6.21.1/arch/powerpc/platforms/embedded6xx/Kconfig > 2007-04-27 23:49:26.000000000 +0200 > +++ linux-2.6.21.1.ts/arch/powerpc/platforms/embedded6xx/Kconfig > 2007-05-06 14:31:55.000000000 +0200 > @@ -87,6 +87,13 @@ > Linkstation-I HD-HLAN and HD-HGLAN versions, and PPC-based > Terastation systems should be supported too. > > +config TURBOSTATION > + bool "QNap TS-101/TS-102 TurboStation" > + select MPIC > + select FSL_SOC > + select PPC_UDBG_16550 if SERIAL_8250 > + select DEFAULT_UIMAGE > + > config MPC7448HPC2 > bool "Freescale MPC7448HPC2(Taiga)" > select TSI108_BRIDGE > @@ -200,7 +207,7 @@ > depends on SANDPOINT || SPRUCE || PPLUS || \ > PRPMC750 || PRPMC800 || LOPEC || \ > (EV64260 && !SERIAL_MPSC) || CHESTNUT || RADSTONE_PPC7D || \ > - 83xx || LINKSTATION > + 83xx || LINKSTATION || TURBOSTATION > default y > > config FORCE > @@ -274,13 +281,15 @@ > > config MPC10X_BRIDGE > bool > - depends on POWERPMC250 || LOPEC || SANDPOINT || LINKSTATION > + depends on POWERPMC250 || LOPEC || SANDPOINT || LINKSTATION || \ > + TURBOSTATION > select PPC_INDIRECT_PCI > default y > > config MPC10X_OPENPIC > bool > - depends on POWERPMC250 || LOPEC || SANDPOINT || LINKSTATION > + depends on POWERPMC250 || LOPEC || SANDPOINT || LINKSTATION || \ > + TURBOSTATION > default y > > config MPC10X_STORE_GATHERING > --- linux-2.6.21.1/arch/powerpc/platforms/embedded6xx/Makefile > 2007-04-27 23:49:26.000000000 +0200 > +++ linux-2.6.21.1.ts/arch/powerpc/platforms/embedded6xx/Makefile > 2007-05-06 14:30:58.000000000 +0200 > @@ -3,3 +3,4 @@ > # > obj-$(CONFIG_MPC7448HPC2) += mpc7448_hpc2.o > obj-$(CONFIG_LINKSTATION) += linkstation.o ls_uart.o > +obj-$(CONFIG_TURBOSTATION) += turbostation.o > --- linux-2.6.21.1/arch/powerpc/platforms/embedded6xx/ > turbostation.c 1970-01-01 01:00:00.000000000 +0100 > +++ linux-2.6.21.1.ts/arch/powerpc/platforms/embedded6xx/ > turbostation.c 2007-05-03 22:45:03.000000000 +0200 > @@ -0,0 +1,141 @@ > +/* > + * Board setup routines for the QNAP Turbostation platform (TS-101/ > TS-201) > + * > + * Copyright (C) 2007 Oyvind Repvik ([EMAIL PROTECTED]) > + * > + * Based on linkstation.c by G. Liakhovetski > + * > + * 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. > + */ > + > +#include <linux/kernel.h> > +#include <linux/pci.h> > +#include <linux/initrd.h> > +#include <linux/mtd/physmap.h> > + > +#include <asm/time.h> > +#include <asm/prom.h> > +#include <asm/mpic.h> > +#include <asm/mpc10x.h> > +#include <asm/pci-bridge.h> > + > +static int __init add_bridge(struct device_node *dev) > +{ > + int len; > + struct pci_controller *hose; > + int *bus_range; > + > + printk("Adding PCI host bridge %s\n", dev->full_name); > + > + bus_range = (int *) get_property(dev, "bus-range", &len); > + if (bus_range == NULL || len < 2 * sizeof(int)) > + printk(KERN_WARNING "Can't get bus-range for %s, assume" > + " bus 0\n", dev->full_name); > + > + hose = pcibios_alloc_controller(); > + if (hose == NULL) > + return -ENOMEM; > + hose->first_busno = bus_range ? bus_range[0] : 0; > + hose->last_busno = bus_range ? bus_range[1] : 0xff; > + hose->arch_data = dev; > + setup_indirect_pci(hose, 0xfec00000, 0xfee00000); > + > + /* Interpret the "ranges" property */ > + /* This also maps the I/O region and sets isa_io/mem_base */ > + pci_process_bridge_OF_ranges(hose, dev, 1); > + > + return 0; > +} > + > +static void __init turbostation_setup_arch(void) > +{ > + struct device_node *np; > + > + /* Lookup PCI host bridges */ > + for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;) > + add_bridge(np); > + > + printk(KERN_INFO "QNAP Turbostation series\n"); > +} > + > +/* > + * Interrupt setup and service. Interrrupts on the turbostation come > + * from the four PCI slots plus onboard 8241 devices: I2C, DUART. > + */ > +static void __init turbostation_init_IRQ(void) > +{ > + struct mpic *mpic; > + struct device_node *dnp; > + void *prop; > + int size; > + phys_addr_t paddr; > + > + dnp = of_find_node_by_type(NULL, "open-pic"); > + if (dnp == NULL) > + return; > + > + prop = (struct device_node *)get_property(dnp, "reg", &size); > + paddr = (phys_addr_t)of_translate_address(dnp, prop); > + > + mpic = mpic_alloc(dnp, paddr, MPIC_PRIMARY | MPIC_WANTS_RESET, > + 4, 32, " EPIC "); > + BUG_ON(mpic == NULL); > + > + /* PCI IRQs */ > + mpic_assign_isu(mpic, 0, paddr + 0x10200); > + > + /* I2C */ > + mpic_assign_isu(mpic, 1, paddr + 0x11000); > + > + /* ttyS0, ttyS1 */ > + mpic_assign_isu(mpic, 2, paddr + 0x11100); > + > + mpic_init(mpic); > +} > + > +static void turbostation_restart(char *cmd) > +{ > + /* Insert restart-stuff */ > +} > + > +static void turbostation_power_off(void) > +{ > + /* Insert powerdown-stuff */ > +} > + > +static void turbostation_halt(void) > +{ > + turbostation_power_off(); > +} > + > +static void turbostation_show_cpuinfo(struct seq_file *m) > +{ > + seq_printf(m, "vendor\t\t: QNAP Systems Inc.\n"); > + seq_printf(m, "machine\t\t: Turbostation TS-101/TS-201\n"); > +} > + > +static int __init turbostation_probe(void) > +{ > + unsigned long root; > + > + root = of_get_flat_dt_root(); > + > + if (!of_flat_dt_is_compatible(root, "turbostation")) > + return 0; > + return 1; > +} > + > +define_machine(turbostation){ > + .name = "QNAP Turbostation", > + .probe = turbostation_probe, > + .setup_arch = turbostation_setup_arch, > + .init_IRQ = turbostation_init_IRQ, > + .show_cpuinfo = turbostation_show_cpuinfo, > + .get_irq = mpic_get_irq, > + .restart = turbostation_restart, > + .power_off = turbostation_power_off, > + .halt = turbostation_halt, > + .calibrate_decr = generic_calibrate_decr, > +}; > _______________________________________________ > Linuxppc-embedded mailing list > Linuxppc-embedded@ozlabs.org > https://ozlabs.org/mailman/listinfo/linuxppc-embedded _______________________________________________ Linuxppc-embedded mailing list Linuxppc-embedded@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-embedded