Board setup code for the Synology DS101 platform

Signed-off-by: Alessandro Zummo <a.zummo@towertech.it>
Signed-off-by: Rod Whitby <rod@whitby.id.au>
Signed-off-by: OEyvind Repvik <oyvind@repvik.org>

 arch/arm/mach-ixp4xx/Kconfig       |    8 +
 arch/arm/mach-ixp4xx/Makefile      |    2 
 arch/arm/mach-ixp4xx/ds101-setup.c |  245 +++++++++++++++++++++++++++++++++++++
 3 files changed, 254 insertions(+), 1 deletion(-)

Index: linux-2.6.15/arch/arm/mach-ixp4xx/ds101-setup.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.15/arch/arm/mach-ixp4xx/ds101-setup.c	2006-02-24 12:37:01.000000000 +0100
@@ -0,0 +1,245 @@
+/*
+ * Synology DS101 board setup
+ *
+ * based ixdp425-setup.c:
+ *      Copyright (C) 2003-2004 MontaVista Software, Inc.
+ *
+ * Author: Alessandro Zummo <a.zummo@towertech.it>
+ * Author: Rod Whitby <rod@whitby.id.au>
+ * Author: OEyvind Repvik <oyvind@repvik.org>
+ * Maintainers: http://www.nslu2-linux.org/
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/serial.h>
+#include <linux/serial_8250.h>
+#include <linux/leds.h>
+#include <linux/pci.h>
+
+#include <asm/setup.h>
+#include <asm/memory.h>
+#include <asm/mach-types.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/flash.h>
+
+#ifdef CONFIG_MACLIST
+#include <net/maclist.h>
+#endif
+
+#ifdef CONFIG_LEDS_CLASS
+static struct resource ds101_led_resources[] = {
+	{
+		.name	= "power",
+		.start	= DS101_POWER_LED,
+		.end	= DS101_POWER_LED,
+		.flags	= IXP4XX_GPIO_LOW,
+	},
+	{
+		.name	= "usbcopy-solid",
+		.start	= DS101_USBCOPY_SOLID_LED,
+		.end	= DS101_USBCOPY_SOLID_LED,
+		.flags	= IXP4XX_GPIO_LOW,
+	},
+	{
+		.name	= "usbcopy-blink",
+		.start	= DS101_USBCOPY_BLINK_LED,
+		.end	= DS101_USBCOPY_BLINK_LED,
+		.flags	= IXP4XX_GPIO_LOW,
+	},
+	{
+		.name	= "status-ready",
+		.start	= DS101_STATUSOK_LED,
+		.end	= DS101_STATUSOK_LED,
+		.flags	= IXP4XX_GPIO_LOW,
+	},
+	{
+		.name	= "status-error",
+		.start	= DS101_STATUSBAD_LED,
+		.start	= DS101_STATUSBAD_LED,
+		.flags	= IXP4XX_GPIO_LOW,
+	}
+};
+
+
+static struct platform_device ds101_leds = {
+	.name		= "IXP4XX-GPIO-LED",
+	.id		= -1,
+	.num_resources	= ARRAY_SIZE(ds101_led_resources),
+	.resource	= ds101_led_resources,
+};
+#endif
+
+static struct ixp4xx_i2c_pins ds101_i2c_gpio_pins = {
+	.sda_pin		= DS101_SDA_PIN,
+	.scl_pin		= DS101_SCL_PIN,
+};
+
+static struct platform_device ds101_i2c_controller = {
+	.name			= "IXP4XX-I2C",
+	.id			= 0,
+	.dev.platform_data	= &ds101_i2c_gpio_pins,
+	.num_resources		= 0,
+};
+
+static struct platform_device ds101_beeper = {
+	.name		= "ixp4xx-beeper",
+	.id		= DS101_GPIO_BUZZ,
+	.num_resources	= 0,
+};
+
+static struct resource ds101_uart_resources[] = {
+	{
+		.start	= IXP4XX_UART1_BASE_PHYS,
+		.end	= IXP4XX_UART1_BASE_PHYS + 0x0fff,
+		.flags	= IORESOURCE_MEM,
+	},
+	{
+		.start	= IXP4XX_UART2_BASE_PHYS,
+		.end	= IXP4XX_UART2_BASE_PHYS + 0x0fff,
+		.flags	= IORESOURCE_MEM,
+	}
+};
+
+static struct plat_serial8250_port ds101_uart_data[] = {
+	{
+		.mapbase	= IXP4XX_UART1_BASE_PHYS,
+		.membase	= (char *)IXP4XX_UART1_BASE_VIRT + REG_OFFSET,
+		.irq		= IRQ_IXP4XX_UART1,
+		.flags		= UPF_BOOT_AUTOCONF,
+		.iotype		= UPIO_MEM,
+		.regshift	= 2,
+		.uartclk	= IXP4XX_UART_XTAL,
+	},
+	{
+		.mapbase	= IXP4XX_UART2_BASE_PHYS,
+		.membase	= (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET,
+		.irq		= IRQ_IXP4XX_UART2,
+		.flags		= UPF_BOOT_AUTOCONF,
+		.iotype		= UPIO_MEM,
+		.regshift	= 2,
+		.uartclk	= IXP4XX_UART_XTAL,
+	},
+	{ }
+};
+
+static struct platform_device ds101_uart = {
+	.name			= "serial8250",
+	.id			= PLAT8250_DEV_PLATFORM,
+	.dev.platform_data	= ds101_uart_data,
+	.num_resources		= 2,
+	.resource		= ds101_uart_resources,
+};
+
+static struct platform_device *ds101_devices[] __initdata = {
+	&ds101_i2c_controller,
+	&ds101_beeper,
+};
+
+static void ds101_power_off(void)
+{
+	/* Simple, but effective */
+	gpio_line_set(DS101_POWEROFF_GPIO, IXP4XX_GPIO_LOW);
+}
+
+static void ds101_gpio_setup(void)
+{
+	/* Set up buzzer */
+	gpio_line_config(DS101_GPIO_BUZZ, DS101_GPIO_OUT);
+	gpio_line_set(DS101_GPIO_BUZZ, DS101_GPIO_LOW);
+
+	/* Set up power led */
+	gpio_line_config(DS101_POWER_LED, DS101_GPIO_OUT);
+	gpio_line_set(DS101_POWER_LED, DS101_GPIO_LOW);
+
+	/* Poweroff */
+	gpio_line_config(DS101_POWEROFF_GPIO, DS101_GPIO_OUT);
+	gpio_line_set(DS101_POWEROFF_GPIO, DS101_GPIO_HIGH);
+
+	/* Status leds */
+	(*IXP4XX_GPIO_GPCLKR) = ((*IXP4XX_GPIO_GPCLKR) & ~DS101_GPIO_CLK0_ENABLE);
+	(*IXP4XX_GPIO_GPCLKR) = ((*IXP4XX_GPIO_GPCLKR) & ~DS101_GPIO_CLK1_ENABLE);
+	gpio_line_config(DS101_STATUSOK_LED, DS101_GPIO_OUT);
+	gpio_line_config(DS101_STATUSBAD_LED, DS101_GPIO_OUT);
+	gpio_line_set(DS101_STATUSOK_LED, DS101_GPIO_HIGH);
+	gpio_line_set(DS101_STATUSBAD_LED, DS101_GPIO_LOW);
+};
+
+static void ds101_cs0_setup(void)
+{
+	*IXP4XX_EXP_CS0 = DS101_EXP_CS0_INIT;
+};
+
+static void __init ds101_init(void)
+{
+	ixp4xx_sys_init();
+
+	ds101_cs0_setup(); /* Needed for DoC support */
+	ds101_gpio_setup();
+	pm_power_off = ds101_power_off;
+
+	platform_add_devices(ds101_devices, ARRAY_SIZE(ds101_devices));
+
+	/* This is only useful on a modified machine, but it is valuable
+	* to have it first in order to see debug messages, and so that
+	* it does *not* get removed if platform_add_devices fails!
+	*/
+	(void)platform_device_register(&ds101_uart);
+
+#ifdef CONFIG_LEDS_CLASS
+	/* We don't care whether or not this works. */
+	(void)platform_device_register(&ds101_leds);
+#endif
+}
+
+/*
+ * DS101 bootstrap may pass in parameters, but we zap the mem
+ * settings to be safe (DS101  always has 64MByte at 0, DS101J has
+ * 32MB).  The passed in command line can override this default, we
+ * prepend to the config'ed default.
+ *
+ * NOTE: the startup sequence is:
+ *     1) Call the machine fixup
+ *     2) Parse the ATAG list, the ATAG_CMDLINE is copied in
+ *	to default_command_line which is the value of *from
+ *     3) Parse the command line in *from (*not*
+ *	default_command_line unless they are the same!)
+ *
+ * Setting mi->nr_banks causes (2) to 'squash' (set to ATAG_NONE)
+ * any ATAG_MEM tags, but mem= command line options cause nr_banks
+ * to be reset to 0 (on the first mem=)
+ */
+
+static char ds101_command_line[] __initdata =
+	"root=/dev/sda2 rootfstype=ext3 init=/sbin/init "
+	"rtc-rs5c372.probe=0,0x32 "
+	CONFIG_CMDLINE;
+
+static void __init ds101_fixup(struct machine_desc *desc,
+		struct tag *tags, char **cmdline, struct meminfo *mi)
+{
+	/* The DS101 has one bank of 64MByte memory.
+	* NOTE: setting nr_banks != 0 causes kernel/setup.c to remove
+	* the mem tags from the tag list.  We need do nothing here!
+	*/
+	mi->nr_banks=1;
+	mi->bank[0].start = 0;
+	mi->bank[0].size = (64*1024*1024);
+	mi->bank[0].node = PHYS_TO_NID(0);
+	/* A command line in the ATAG list will override this one,
+	* as is intended.
+	*/
+	strlcpy(*cmdline, ds101_command_line, COMMAND_LINE_SIZE);
+}
+
+MACHINE_START(DS101, "Synology DiskStation DS101")
+	/* Maintainer: www.nslu2-linux.org */
+	.phys_io	= IXP4XX_PERIPHERAL_BASE_PHYS,
+	.io_pg_offst	= ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xFFFC,
+	.boot_params	= 0x00000100,
+	.fixup		= ds101_fixup,
+	.map_io		= ixp4xx_map_io,
+	.init_irq	= ixp4xx_init_irq,
+	.timer		= &ixp4xx_timer,
+	.init_machine	= ds101_init,
+MACHINE_END
Index: linux-2.6.15/arch/arm/mach-ixp4xx/Kconfig
===================================================================
--- linux-2.6.15.orig/arch/arm/mach-ixp4xx/Kconfig	2006-02-24 11:44:49.000000000 +0100
+++ linux-2.6.15/arch/arm/mach-ixp4xx/Kconfig	2006-02-24 11:44:49.000000000 +0100
@@ -94,6 +94,14 @@
 	  DSM-G600 device. For more information on this platform,
 	  see http://www.nslu2-linux.org/
 
+config MACH_DS101
+       bool
+       prompt "DS101"
+       help
+         Say 'Y' here if you want your kernel to support Synology's
+         DiskStation DS101(j) device. For more information on this
+         platform see http://www.nslu2-linux.org/wiki/DS101/HomePage
+
 #
 # Avila and IXDP share the same source for now. Will change in future
 #
Index: linux-2.6.15/arch/arm/mach-ixp4xx/Makefile
===================================================================
--- linux-2.6.15.orig/arch/arm/mach-ixp4xx/Makefile	2006-02-24 11:44:48.000000000 +0100
+++ linux-2.6.15/arch/arm/mach-ixp4xx/Makefile	2006-02-24 11:44:49.000000000 +0100
@@ -11,4 +11,4 @@
 obj-$(CONFIG_MACH_NSLU2)	+= nslu2-pci.o nslu2-setup.o nslu2-power.o
 obj-$(CONFIG_MACH_NAS100D)	+= nas100d-pci.o nas100d-setup.o nas100d-power.o
 obj-$(CONFIG_MACH_DSMG600)	+= dsmg600-pci.o dsmg600-setup.o
-
+obj-$(CONFIG_MACH_DS101)	+= ds101-pci.o ds101-setup.o ds101-buttons.o