[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#688990: src:linux: Add support for Buffalo Linkstation LS-XHL and LS-CHLv2



Package: src:linux
Severity: wishlist
Tags: d-i patch

This patch add new hardware support for the Buffalo Linkstation LS-XHL and
LS-CHLv2. Both systems are supported by the upstream linux kernel as per
commit 4aff38a3db1f63494812834f1fbbdb1f00579c66. While the upstream support
is device tree based, this patch uses the old fashioned machine setup.


-- System Information:
Debian Release: 6.0.4
  APT prefers stable
  APT policy: (500, 'stable')
Architecture: i386 (i686)

Kernel: Linux 2.6.32-5-686-bigmem (SMP w/2 CPU cores)
Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash
Index: linux-source-3.2/arch/arm/mach-kirkwood/Kconfig
===================================================================
--- linux-source-3.2.orig/arch/arm/mach-kirkwood/Kconfig	2012-09-16 16:27:20.000000000 +0200
+++ linux-source-3.2/arch/arm/mach-kirkwood/Kconfig	2012-09-25 23:04:34.001022783 +0200
@@ -150,6 +150,12 @@
 	  Say 'Y' here if you want your kernel to support the
 	  HP t5325 Thin Client.
 
+config MACH_LSXL
+	bool "Buffalo Linkstation LS-XHL, LS-CHLv2"
+	help
+	  Say 'Y' here if you want your kernel to support the
+	  Buffalo Linkstation LS-XHL & LS-CHLv2 devices.
+
 endmenu
 
 endif
Index: linux-source-3.2/arch/arm/mach-kirkwood/Makefile
===================================================================
--- linux-source-3.2.orig/arch/arm/mach-kirkwood/Makefile	2012-09-16 16:27:20.000000000 +0200
+++ linux-source-3.2/arch/arm/mach-kirkwood/Makefile	2012-09-25 23:04:34.001022783 +0200
@@ -18,6 +18,7 @@
 obj-$(CONFIG_MACH_NET2BIG_V2)		+= netxbig_v2-setup.o lacie_v2-common.o
 obj-$(CONFIG_MACH_NET5BIG_V2)		+= netxbig_v2-setup.o lacie_v2-common.o
 obj-$(CONFIG_MACH_T5325)		+= t5325-setup.o
+obj-$(CONFIG_MACH_LSXL)		+= lsxl-setup.o
 
 obj-$(CONFIG_CPU_IDLE)			+= cpuidle.o
 obj-$(CONFIG_ARCH_KIRKWOOD_DT)		+= board-dt.o
Index: linux-source-3.2/arch/arm/mach-kirkwood/lsxl-setup.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-source-3.2/arch/arm/mach-kirkwood/lsxl-setup.c	2012-09-25 23:38:06.009022285 +0200
@@ -0,0 +1,329 @@
+/*
+ * Copyright 2012 (C), Michael Walle <michael@walle.cc>
+ *
+ * arch/arm/mach-kirkwood/lsxl-setup.c
+ *
+ * Buffalo Linkstation LS-XHL and LS-CHLv2 setup
+ *
+ * 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/init.h>
+#include <linux/platform_device.h>
+#include <linux/mtd/physmap.h>
+#include <linux/ata_platform.h>
+#include <linux/spi/flash.h>
+#include <linux/spi/spi.h>
+#include <linux/mv643xx_eth.h>
+#include <linux/gpio.h>
+#include <linux/gpio_keys.h>
+#include <linux/gpio-fan.h>
+#include <linux/input.h>
+#include <linux/leds.h>
+#include <asm/mach-types.h>
+#include <asm/mach/arch.h>
+#include <mach/kirkwood.h>
+#include <plat/mvsdio.h>
+#include "common.h"
+#include "mpp.h"
+
+/*****************************************************************************
+ * 512KB SPI Flash on BOOT Device
+ ****************************************************************************/
+static struct mtd_partition lsxl_partitions[] = {
+	{
+		.name		= "uboot",
+		.size		= 0x60000,
+		.offset		= 0x00000,
+		.mask_flags	= MTD_WRITEABLE,
+	},
+	{
+		.name		= "dtb",
+		.size		= 0x10000,
+		.offset		= 0x60000,
+		.mask_flags	= MTD_WRITEABLE,
+	},
+	{
+		.name		= "uboot_env",
+		.size		= 0x10000,
+		.offset		= 0x70000,
+	}
+};
+
+static struct flash_platform_data lsxl_spi_slave_data = {
+	.type		= "m25p40",
+	.parts		= lsxl_partitions,
+	.nr_parts	= ARRAY_SIZE(lsxl_partitions),
+};
+
+static struct spi_board_info __initdata lsxl_spi_slave_info[] = {
+	{
+		.modalias	= "m25p80",
+		.platform_data	= &lsxl_spi_slave_data,
+		.irq		= -1,
+		.max_speed_hz	= 20000000,
+		.bus_num	= 0,
+		.chip_select	= 0,
+	}
+};
+
+/*****************************************************************************
+ * Ethernet
+ ****************************************************************************/
+static struct mv643xx_eth_platform_data lsxl_ge00_data = {
+	.phy_addr	= MV643XX_ETH_PHY_ADDR(0),
+};
+
+static struct mv643xx_eth_platform_data lsxl_ge01_data = {
+	.phy_addr	= MV643XX_ETH_PHY_ADDR(8),
+};
+
+/*****************************************************************************
+ * SATA
+ ****************************************************************************/
+static struct mv_sata_platform_data lsxl_sata_data = {
+	.n_ports	= 1,
+};
+
+/*****************************************************************************
+ * LEDs attached to GPIO
+ ****************************************************************************/
+#define LSXL_GPIO_LED_ALARM		37
+#define LSXL_GPIO_LED_INFO		38
+#define LSXL_GPIO_LED_PWR		39
+#define LSXL_GPIO_LED_FUNC_BLUE	36
+#define LSXL_GPIO_LED_FUNC_RED		48
+
+static struct gpio_led lsxl_led_pins[] = {
+	{
+		.name			= "lsxl:red:alarm",
+		.gpio			= LSXL_GPIO_LED_ALARM,
+		.active_low		= 1,
+	},
+	{
+		.name			= "lsxl:amber:info",
+		.gpio			= LSXL_GPIO_LED_INFO,
+		.active_low		= 1,
+	},
+	{
+		.name			= "lsxl:blue:power",
+		.default_trigger	= "default-on",
+		.gpio			= LSXL_GPIO_LED_PWR,
+		.active_low		= 1,
+	},
+	{
+		.name			= "lsxl:blue:func",
+		.gpio			= LSXL_GPIO_LED_FUNC_BLUE,
+		.active_low		= 1,
+	},
+	{
+		.name			= "lsxl:red:func",
+		.gpio			= LSXL_GPIO_LED_FUNC_RED,
+		.active_low		= 1,
+	},
+};
+
+static struct gpio_led_platform_data lsxl_led_data = {
+	.leds		= lsxl_led_pins,
+	.num_leds	= ARRAY_SIZE(lsxl_led_pins),
+};
+
+static struct platform_device lsxl_leds = {
+	.name	= "leds-gpio",
+	.id	= -1,
+	.dev	= {
+		.platform_data	= &lsxl_led_data,
+	}
+};
+
+/*****************************************************************************
+ * General Setup
+ ****************************************************************************/
+#define LSXL_GPIO_HDD_POWER 10
+#define LSXL_GPIO_USB_POWER 11
+
+/*****************************************************************************
+ * GPIO Attached Keys
+ ****************************************************************************/
+#define LSXL_GPIO_KEY_FUNC		41
+#define LSXL_GPIO_KEY_POWER		42
+#define LSXL_GPIO_KEY_AUTOPOWER	43
+
+#define LSXL_SW_POWER		0
+#define LSXL_SW_AUTOPOWER	1
+
+static struct gpio_keys_button lsxl_buttons[] = {
+	{
+		.type = EV_SW,
+		.code = LSXL_SW_POWER,
+		.gpio = LSXL_GPIO_KEY_POWER,
+		.desc = "Power-on Switch",
+		.active_low = 1,
+	}, {
+		.type = EV_SW,
+		.code = LSXL_SW_AUTOPOWER,
+		.gpio = LSXL_GPIO_KEY_AUTOPOWER,
+		.desc = "Power-auto Switch",
+		.active_low = 1,
+	}, {
+		.code = KEY_OPTION,
+		.gpio = LSXL_GPIO_KEY_FUNC,
+		.desc = "Function Button",
+		.active_low = 1,
+	},
+};
+
+static struct gpio_keys_platform_data lsxl_button_data = {
+	.buttons = lsxl_buttons,
+	.nbuttons = ARRAY_SIZE(lsxl_buttons),
+};
+
+static struct platform_device lsxl_button_device = {
+	.name = "gpio-keys",
+	.id = -1,
+	.num_resources = 0,
+	.dev = {
+		.platform_data = &lsxl_button_data,
+	},
+};
+
+/*****************************************************************************
+ * GPIO Fan
+ ****************************************************************************/
+#define LSXL_GPIO_FAN_HIGH	18
+#define LSXL_GPIO_FAN_LOW	19
+#define LSXL_GPIO_FAN_LOCK	40
+
+static struct gpio_fan_alarm lsxl_alarm = {
+	.gpio = LSXL_GPIO_FAN_LOCK,
+};
+
+static struct gpio_fan_speed lsxl_speeds[] = {
+	{
+		.rpm = 0,
+		.ctrl_val = 3,
+	}, {
+		.rpm = 1500,
+		.ctrl_val = 1,
+	}, {
+		.rpm = 3250,
+		.ctrl_val = 2,
+	}, {
+		.rpm = 5000,
+		.ctrl_val = 0,
+	}
+};
+
+static int lsxl_gpio_list[] = {
+	LSXL_GPIO_FAN_HIGH, LSXL_GPIO_FAN_LOW,
+};
+
+static struct gpio_fan_platform_data lsxl_fan_data = {
+	.num_ctrl = ARRAY_SIZE(lsxl_gpio_list),
+	.ctrl = lsxl_gpio_list,
+	.alarm = &lsxl_alarm,
+	.num_speed = ARRAY_SIZE(lsxl_speeds),
+	.speed = lsxl_speeds,
+};
+
+static struct platform_device lsxl_fan_device = {
+	.name = "gpio-fan",
+	.id = -1,
+	.num_resources = 0,
+	.dev = {
+		.platform_data = &lsxl_fan_data,
+	},
+};
+
+/*****************************************************************************
+ * GPIO Data
+ ****************************************************************************/
+
+static unsigned int lsxl_mpp_config[] __initdata = {
+	MPP10_GPO,	/* HDD Power Enable */
+	MPP11_GPIO,	/* USB Vbus Enable */
+	MPP18_GPO,	/* FAN High Enable# */
+	MPP19_GPO,	/* FAN Low Enable# */
+	MPP36_GPIO,	/* Function Blue LED */
+	MPP37_GPIO,	/* Alarm LED */
+	MPP38_GPIO,	/* Info LED */
+	MPP39_GPIO,	/* Power LED */
+	MPP40_GPIO,	/* Fan Lock */
+	MPP41_GPIO,	/* Function Button */
+	MPP42_GPIO,	/* Power Switch */
+	MPP43_GPIO,	/* Power Auto Switch */
+	MPP48_GPIO,	/* Function Red LED */
+	0
+};
+
+/*****************************************************************************
+ * LS-XL specific power off method: reboot
+ ****************************************************************************/
+/*
+ * On the LS-XL, the shutdown process is following:
+ * - Userland monitors key events until the power switch goes to off position
+ * - The board reboots
+ * - U-boot starts and goes into an idle mode waiting for the user
+ *   to move the switch to ON position
+ *
+ */
+
+static void lsxl_power_off(void)
+{
+	arm_machine_restart('h', NULL);
+}
+
+static void __init lsxl_init(void)
+{
+	/*
+	 * Basic setup. Needs to be called early.
+	 */
+	kirkwood_init();
+	kirkwood_mpp_conf(lsxl_mpp_config);
+
+	/*
+	 * Configure peripherals.
+	 */
+	kirkwood_uart0_init();
+	kirkwood_ehci_init();
+	kirkwood_ge00_init(&lsxl_ge00_data);
+	kirkwood_ge01_init(&lsxl_ge01_data);
+	kirkwood_sata_init(&lsxl_sata_data);
+	kirkwood_spi_init();
+
+	platform_device_register(&lsxl_leds);
+	platform_device_register(&lsxl_button_device);
+	platform_device_register(&lsxl_fan_device);
+
+	spi_register_board_info(lsxl_spi_slave_info,
+				ARRAY_SIZE(lsxl_spi_slave_info));
+
+	/* usb power on */
+	gpio_set_value(LSXL_GPIO_USB_POWER, 1);
+
+	/* register power-off method */
+	pm_power_off = lsxl_power_off;
+
+	pr_info("%s: finished\n", __func__);
+}
+
+MACHINE_START(LINKSTATION_CHLV2, "Buffalo LS-CHLv2")
+	.atag_offset	= 0x100,
+	.init_machine	= lsxl_init,
+	.map_io		= kirkwood_map_io,
+	.init_early	= kirkwood_init_early,
+	.init_irq	= kirkwood_init_irq,
+	.timer		= &kirkwood_timer,
+MACHINE_END
+
+MACHINE_START(LSXHL, "Buffalo LS-XHL")
+	.atag_offset	= 0x100,
+	.init_machine	= lsxl_init,
+	.map_io		= kirkwood_map_io,
+	.init_early	= kirkwood_init_early,
+	.init_irq	= kirkwood_init_irq,
+	.timer		= &kirkwood_timer,
+MACHINE_END
Index: linux-source-3.2/arch/arm/configs/kirkwood_defconfig
===================================================================
--- linux-source-3.2.orig/arch/arm/configs/kirkwood_defconfig	2012-09-12 04:37:38.000000000 +0200
+++ linux-source-3.2/arch/arm/configs/kirkwood_defconfig	2012-09-25 23:05:17.029022479 +0200
@@ -28,6 +28,7 @@
 CONFIG_MACH_NET2BIG_V2=y
 CONFIG_MACH_NET5BIG_V2=y
 CONFIG_MACH_T5325=y
+CONFIG_MACH_LSXL=y
 # CONFIG_CPU_FEROCEON_OLD_ID is not set
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
Index: linux-source-3.2/arch/arm/tools/mach-types
===================================================================
--- linux-source-3.2.orig/arch/arm/tools/mach-types	2012-09-25 23:05:46.689522169 +0200
+++ linux-source-3.2/arch/arm/tools/mach-types	2012-09-25 23:07:26.861022306 +0200
@@ -458,6 +458,7 @@
 guruplug		MACH_GURUPLUG		GURUPLUG		2659
 spear310		MACH_SPEAR310		SPEAR310		2660
 spear320		MACH_SPEAR320		SPEAR320		2661
+lsxhl			MACH_LSXHL		LSXHL			2663
 aquila			MACH_AQUILA		AQUILA			2676
 sheeva_esata		MACH_ESATA_SHEEVAPLUG	ESATA_SHEEVAPLUG	2678
 msm7x30_surf		MACH_MSM7X30_SURF	MSM7X30_SURF		2679

Reply to: