[RFC PATCH] ARM: dts: Convert Linkstation Mini to Device Tree

Alexey Kopytko alexey at kopytko.ru
Sat Jun 20 18:05:23 PDT 2015


> On 20 june 2015 г., at 10:53, Benjamin Cama <benoar at dolka.fr> wrote:
>
>  as I had a problem with the hardware that I am
> going to fix soon, but I wanted some comments on it. I included
> Andrew's remarks, even though I do not know what to do about the
> buttons name for now: I don't know how the switch is wired exactly for
> now, and FYI the “auto-power” is an intermediate position between off
> and power that in the original firmware does some wake-up/sleep of the
> disks when the backup utility is run from the PC connected to the NAS.
> I never used it and do not know what to do with it, and what “key”
> should be associated with it.
>

1. These buttons shall be dealt with from the userspace. Actually
there is a userspace daemon in the original firmware that reboots the
whole thing if you turn the switch to off position. That's clearly not
a kernel's job so don't just worry about this switch for now. Moreover
I don't think this button does anything at all if there's no daemon.

Running evtest against this button and wiggling it gives this:

# evtest /dev/input/event0
Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x1 product 0x1 version 0x100
Input device name: "gpio-keys"
Supported events:
  Event type 0 (Sync)
  Event type 1 (Key)
    Event code 357 (Option)
  Event type 5 (?)
    Event code 0 (?)
    Event code 1 (?)
Testing ... (interrupt to exit)
Event: time 1434848366.955536, type 5 (?), code 0 (?), value 0
Event: time 1434848366.955557, -------------- Report Sync ------------
Event: time 1434848366.955576, type 5 (?), code 0 (?), value 1
Event: time 1434848366.955589, -------------- Report Sync ------------
Event: time 1434848366.955593, type 5 (?), code 0 (?), value 0


2. As far as I remember in my patch I intentionally changed states of
some of the lights to be able to see if a kernel is booting or we have
a bad build. Can't tell if you did this too, but if I would that will
be nice for those people who don't have a serial soldered.

-Alexey


> Signed-off-by: Benjamin Cama <benoar at dolka.fr>
> Reviewed-by: Andrew Lunn <andrew at lunn.ch>
> ---
> arch/arm/boot/dts/Makefile           |   3 +-
> arch/arm/boot/dts/orion5x-lswsgl.dts | 241 ++++++++++++++++++++++++++++++
> arch/arm/mach-orion5x/Kconfig        |   6 +-
> arch/arm/mach-orion5x/lsmini-setup.c | 280 -----------------------------------
> 4 files changed, 246 insertions(+), 284 deletions(-)
> create mode 100644 arch/arm/boot/dts/orion5x-lswsgl.dts
> delete mode 100644 arch/arm/mach-orion5x/lsmini-setup.c
>
> diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
> index 992736b..bd5ad2f 100644
> --- a/arch/arm/boot/dts/Makefile
> +++ b/arch/arm/boot/dts/Makefile
> @@ -441,7 +441,8 @@ dtb-$(CONFIG_ARCH_ORION5X) += \
>    orion5x-lacie-d2-network.dtb \
>    orion5x-lacie-ethernet-disk-mini-v2.dtb \
>    orion5x-maxtor-shared-storage-2.dtb \
> -    orion5x-rd88f5182-nas.dtb
> +    orion5x-rd88f5182-nas.dtb \
> +    orion5x-lswsgl.dtb
> dtb-$(CONFIG_ARCH_PRIMA2) += \
>    prima2-evb.dtb
> dtb-$(CONFIG_ARCH_QCOM) += \
> diff --git a/arch/arm/boot/dts/orion5x-lswsgl.dts b/arch/arm/boot/dts/orion5x-lswsgl.dts
> new file mode 100644
> index 0000000..c7537a6
> --- /dev/null
> +++ b/arch/arm/boot/dts/orion5x-lswsgl.dts
> @@ -0,0 +1,241 @@
> +/*
> + * Copyright (C) 2015 Benjamin Cama <benoar at dolka.fr>
> + * Copyright (C) 2014 Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
> + * Copyright (C) 2008 Alexey Kopytko <alexey at kopytko.ru>
> + *
> + * 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.
> + */
> +
> +/dts-v1/;
> +
> +#include <dt-bindings/gpio/gpio.h>
> +#include <dt-bindings/input/input.h>
> +#include <dt-bindings/interrupt-controller/irq.h>
> +#include "orion5x-mv88f5182.dtsi"
> +
> +/ {
> +    model = "Buffalo Linkstation Mini (LS-WSGL)";
> +    compatible = "buffalo,lswsgl", "marvell,orion5x-88f5182", "marvell,orion5x";
> +
> +    memory {
> +        reg = <0x00000000 0x8000000>; /* 128 MB */
> +    };
> +
> +    chosen {
> +        bootargs = "console=ttyS0,115200";
> +        linux,stdout-path = &uart0;
> +    };
> +
> +    soc {
> +        ranges = <MBUS_ID(0xf0, 0x01) 0 0xf1000000 0x100000>,
> +             <MBUS_ID(0x09, 0x00) 0 0xf2200000 0x800>,
> +             <MBUS_ID(0x01, 0x0f) 0 0xf4000000 0x40000>;
> +    };
> +
> +    gpio-keys {
> +        compatible = "gpio-keys";
> +        pinctrl-0 = <&pmx_buttons>;
> +        pinctrl-names = "default";
> +        #address-cells = <1>;
> +        #size-cells = <0>;
> +        func {
> +            label = "Function Button";
> +            linux,code = <KEY_OPTION>;
> +            gpios = <&gpio0 15 GPIO_ACTIVE_LOW>;
> +        };
> +
> +        power {
> +            label = "Power-on Switch";
> +            linux,input-type = <5>; /* EV_SW */
> +            linux,code = <0>; /* LSMINI_SW_POWER */
> +            gpios = <&gpio0 18 GPIO_ACTIVE_LOW>;
> +        };
> +
> +        autopower {
> +            label = "Power-auto Switch";
> +            linux,input-type = <5>; /* EV_SW */
> +            linux,code = <1>; /* LSMINI_SW_AUTOPOWER */
> +            gpios = <&gpio0 17 GPIO_ACTIVE_LOW>;
> +        };
> +    };
> +
> +    gpio-leds {
> +        compatible = "gpio-leds";
> +        pinctrl-0 = <&pmx_led_alarm &pmx_led_info &pmx_led_func
> +                 &pmx_led_power>;
> +        pinctrl-names = "default";
> +
> +        alarm {
> +            label = "lswsgl:alarm:red";
> +            gpio = <&gpio0 2 GPIO_ACTIVE_LOW>;
> +        };
> +
> +        info {
> +            label = "lswsgl:info:amber";
> +            gpio = <&gpio0 3 GPIO_ACTIVE_LOW>;
> +        };
> +
> +        func {
> +            label = "lswsgl:func:blue:top";
> +            gpio = <&gpio0 9 GPIO_ACTIVE_LOW>;
> +        };
> +
> +        power {
> +            label = "lswsgl:power:blue:bottom";
> +            gpio = <&gpio0 14 GPIO_ACTIVE_LOW>;
> +            default-state = "on";
> +        };
> +    };
> +
> +    restart_poweroff {
> +        compatible = "restart-poweroff";
> +    };
> +
> +    regulators {
> +        compatible = "simple-bus";
> +        #address-cells = <1>;
> +        #size-cells = <0>;
> +        pinctrl-0 = <&pmx_sata0_power &pmx_sata1_power &pmx_usb_power>;
> +        pinctrl-names = "default";
> +
> +        sata0_power: regulator at 0 {
> +            compatible = "regulator-fixed";
> +            reg = <0>;
> +            regulator-name = "SATA0 Power";
> +            regulator-min-microvolt = <5000000>;
> +            regulator-max-microvolt = <5000000>;
> +            enable-active-high;
> +            regulator-always-on;
> +            regulator-boot-on;
> +            gpio = <&gpio0 1 GPIO_ACTIVE_HIGH>;
> +        };
> +
> +        sata1_power: regulator at 1 {
> +            compatible = "regulator-fixed";
> +            reg = <1>;
> +            regulator-name = "SATA1 Power";
> +            regulator-min-microvolt = <5000000>;
> +            regulator-max-microvolt = <5000000>;
> +            enable-active-high;
> +            regulator-always-on;
> +            regulator-boot-on;
> +            gpio = <&gpio0 19 GPIO_ACTIVE_HIGH>;
> +        };
> +
> +        usb_power: regulator at 2 {
> +            compatible = "regulator-fixed";
> +            reg = <2>;
> +            regulator-name = "USB Power";
> +            regulator-min-microvolt = <5000000>;
> +            regulator-max-microvolt = <5000000>;
> +            enable-active-high;
> +            regulator-always-on;
> +            regulator-boot-on;
> +            gpio = <&gpio0 16 GPIO_ACTIVE_HIGH>;
> +        };
> +    };
> +};
> +
> +&devbus_bootcs {
> +    status = "okay";
> +
> +    devbus,keep-config;
> +
> +    flash at 0 {
> +        compatible = "cfi-flash";
> +        reg = <0 0x40000>;
> +        bank-width = <1>;
> +                #address-cells = <1>;
> +        #size-cells = <1>;
> +
> +        partition at 0 {
> +            label = "Full256Kb";
> +            reg = <0 0x40000>;
> +            read-only;
> +        };
> +    };
> +};
> +
> +&mdio {
> +    status = "okay";
> +
> +    ethphy: ethernet-phy {
> +        reg = <8>;
> +    };
> +};
> +
> +&ehci0 {
> +    status = "okay";
> +};
> +
> +&eth {
> +    status = "okay";
> +
> +    ethernet-port at 0 {
> +        phy-handle = <&ethphy>;
> +    };
> +};
> +
> +&i2c {
> +    status = "okay";
> +    clock-frequency = <100000>;
> +    #address-cells = <1>;
> +
> +    rtc at 32 {
> +        compatible = "ricoh,rs5c372a";
> +        reg = <0x32>;
> +    };
> +};
> +
> +&pinctrl {
> +    pmx_buttons: pmx-buttons {
> +        marvell,pins = "mpp15", "mpp17", "mpp18";
> +        marvell,function = "gpio";
> +    };
> +
> +    pmx_led_alarm: pmx-leds {
> +        marvell,pins = "mpp2";
> +        marvell,function = "gpio";
> +    };
> +
> +    pmx_led_info: pmx-leds {
> +        marvell,pins = "mpp3";
> +        marvell,function = "gpio";
> +    };
> +
> +    pmx_led_func: pmx-leds {
> +        marvell,pins = "mpp9";
> +        marvell,function = "gpio";
> +    };
> +
> +    pmx_led_power: pmx-leds {
> +        marvell,pins = "mpp14";
> +        marvell,function = "gpio";
> +    };
> +
> +    pmx_sata0_power: pmx-sata0-power {
> +        marvell,pins = "mpp1";
> +        marvell,function = "gpio";
> +    };
> +
> +    pmx_sata1_power: pmx-sata1-power {
> +        marvell,pins = "mpp19";
> +        marvell,function = "gpio";
> +    };
> +
> +    pmx_usb_power: pmx-usb-power {
> +        marvell,pins = "mpp16";
> +        marvell,function = "gpio";
> +    };
> +};
> +
> +&sata {
> +    status = "okay";
> +    nr-ports = <2>;
> +};
> +
> +&uart0 {
> +    status = "okay";
> +};
> diff --git a/arch/arm/mach-orion5x/Kconfig b/arch/arm/mach-orion5x/Kconfig
> index 2412efb..08d2be2 100644
> --- a/arch/arm/mach-orion5x/Kconfig
> +++ b/arch/arm/mach-orion5x/Kconfig
> @@ -78,11 +78,11 @@ config MACH_LINKSTATION_LSCHL
>      Buffalo Linkstation Live v3 (LS-CHL) platform.
>
> config MACH_LINKSTATION_MINI
> -    bool "Buffalo Linkstation Mini"
> -    select I2C_BOARDINFO
> +    bool "Buffalo Linkstation Mini (Flattened Device Tree)"
> +    select ARCH_ORION5X_DT
>    help
>      Say 'Y' here if you want your kernel to support the
> -      Buffalo Linkstation Mini platform.
> +      Buffalo Linkstation Mini (LS-WSGL) platform.
>
> config MACH_LINKSTATION_LS_HGL
>    bool "Buffalo Linkstation LS-HGL"
> diff --git a/arch/arm/mach-orion5x/lsmini-setup.c b/arch/arm/mach-orion5x/lsmini-setup.c
> deleted file mode 100644
> index a6493e7..0000000
> --- a/arch/arm/mach-orion5x/lsmini-setup.c
> +++ /dev/null
> @@ -1,280 +0,0 @@
> -/*
> - * arch/arm/mach-orion5x/lsmini-setup.c
> - *
> - * Maintainer: Alexey Kopytko <alexey at kopytko.ru>
> - *
> - * 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/mv643xx_eth.h>
> -#include <linux/leds.h>
> -#include <linux/gpio_keys.h>
> -#include <linux/input.h>
> -#include <linux/i2c.h>
> -#include <linux/ata_platform.h>
> -#include <linux/gpio.h>
> -#include <asm/mach-types.h>
> -#include <asm/mach/arch.h>
> -#include <mach/orion5x.h>
> -#include "common.h"
> -#include "mpp.h"
> -
> -/*****************************************************************************
> - * Linkstation Mini Info
> - ****************************************************************************/
> -
> -/*
> - * 256K NOR flash Device bus boot chip select
> - */
> -
> -#define LSMINI_NOR_BOOT_BASE    0xf4000000
> -#define LSMINI_NOR_BOOT_SIZE    SZ_256K
> -
> -/*****************************************************************************
> - * 256KB NOR Flash on BOOT Device
> - ****************************************************************************/
> -
> -static struct physmap_flash_data lsmini_nor_flash_data = {
> -    .width        = 1,
> -};
> -
> -static struct resource lsmini_nor_flash_resource = {
> -    .flags    = IORESOURCE_MEM,
> -    .start    = LSMINI_NOR_BOOT_BASE,
> -    .end    = LSMINI_NOR_BOOT_BASE + LSMINI_NOR_BOOT_SIZE - 1,
> -};
> -
> -static struct platform_device lsmini_nor_flash = {
> -    .name            = "physmap-flash",
> -    .id            = 0,
> -    .dev        = {
> -        .platform_data    = &lsmini_nor_flash_data,
> -    },
> -    .num_resources        = 1,
> -    .resource        = &lsmini_nor_flash_resource,
> -};
> -
> -/*****************************************************************************
> - * Ethernet
> - ****************************************************************************/
> -
> -static struct mv643xx_eth_platform_data lsmini_eth_data = {
> -    .phy_addr    = 8,
> -};
> -
> -/*****************************************************************************
> - * RTC 5C372a on I2C bus
> - ****************************************************************************/
> -
> -static struct i2c_board_info __initdata lsmini_i2c_rtc = {
> -    I2C_BOARD_INFO("rs5c372a", 0x32),
> -};
> -
> -/*****************************************************************************
> - * LEDs attached to GPIO
> - ****************************************************************************/
> -
> -#define LSMINI_GPIO_LED_ALARM    2
> -#define LSMINI_GPIO_LED_INFO    3
> -#define LSMINI_GPIO_LED_FUNC    9
> -#define LSMINI_GPIO_LED_PWR    14
> -
> -static struct gpio_led lsmini_led_pins[] = {
> -    {
> -        .name       = "alarm:red",
> -        .gpio       = LSMINI_GPIO_LED_ALARM,
> -        .active_low     = 1,
> -    }, {
> -        .name       = "info:amber",
> -        .gpio       = LSMINI_GPIO_LED_INFO,
> -        .active_low     = 1,
> -    }, {
> -        .name       = "func:blue:top",
> -        .gpio       = LSMINI_GPIO_LED_FUNC,
> -        .active_low     = 1,
> -    }, {
> -        .name       = "power:blue:bottom",
> -        .gpio       = LSMINI_GPIO_LED_PWR,
> -    },
> -};
> -
> -static struct gpio_led_platform_data lsmini_led_data = {
> -    .leds       = lsmini_led_pins,
> -    .num_leds       = ARRAY_SIZE(lsmini_led_pins),
> -};
> -
> -static struct platform_device lsmini_leds = {
> -    .name   = "leds-gpio",
> -    .id     = -1,
> -    .dev    = {
> -        .platform_data  = &lsmini_led_data,
> -    },
> -};
> -
> -/****************************************************************************
> - * GPIO Attached Keys
> - ****************************************************************************/
> -
> -#define LSMINI_GPIO_KEY_FUNC       15
> -#define LSMINI_GPIO_KEY_POWER       18
> -#define LSMINI_GPIO_KEY_AUTOPOWER 17
> -
> -#define LSMINI_SW_POWER        0x00
> -#define LSMINI_SW_AUTOPOWER    0x01
> -
> -static struct gpio_keys_button lsmini_buttons[] = {
> -    {
> -        .code       = KEY_OPTION,
> -        .gpio       = LSMINI_GPIO_KEY_FUNC,
> -        .desc       = "Function Button",
> -        .active_low     = 1,
> -    }, {
> -        .type        = EV_SW,
> -        .code       = LSMINI_SW_POWER,
> -        .gpio       = LSMINI_GPIO_KEY_POWER,
> -        .desc       = "Power-on Switch",
> -        .active_low     = 1,
> -    }, {
> -        .type        = EV_SW,
> -        .code       = LSMINI_SW_AUTOPOWER,
> -        .gpio       = LSMINI_GPIO_KEY_AUTOPOWER,
> -        .desc       = "Power-auto Switch",
> -        .active_low     = 1,
> -    },
> -};
> -
> -static struct gpio_keys_platform_data lsmini_button_data = {
> -    .buttons    = lsmini_buttons,
> -    .nbuttons       = ARRAY_SIZE(lsmini_buttons),
> -};
> -
> -static struct platform_device lsmini_button_device = {
> -    .name       = "gpio-keys",
> -    .id         = -1,
> -    .num_resources  = 0,
> -    .dev        = {
> -        .platform_data  = &lsmini_button_data,
> -    },
> -};
> -
> -
> -/*****************************************************************************
> - * SATA
> - ****************************************************************************/
> -static struct mv_sata_platform_data lsmini_sata_data = {
> -    .n_ports    = 2,
> -};
> -
> -
> -/*****************************************************************************
> - * Linkstation Mini specific power off method: reboot
> - ****************************************************************************/
> -/*
> - * On the Linkstation Mini, 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 lsmini_power_off(void)
> -{
> -    orion5x_restart(REBOOT_HARD, NULL);
> -}
> -
> -
> -/*****************************************************************************
> - * General Setup
> - ****************************************************************************/
> -
> -#define LSMINI_GPIO_USB_POWER    16
> -#define LSMINI_GPIO_AUTO_POWER    17
> -#define LSMINI_GPIO_POWER    18
> -
> -#define LSMINI_GPIO_HDD_POWER0    1
> -#define LSMINI_GPIO_HDD_POWER1    19
> -
> -static unsigned int lsmini_mpp_modes[] __initdata = {
> -    MPP0_UNUSED, /* LED_RESERVE1 (unused) */
> -    MPP1_GPIO, /* HDD_PWR */
> -    MPP2_GPIO, /* LED_ALARM */
> -    MPP3_GPIO, /* LED_INFO */
> -    MPP4_UNUSED,
> -    MPP5_UNUSED,
> -    MPP6_UNUSED,
> -    MPP7_UNUSED,
> -    MPP8_UNUSED,
> -    MPP9_GPIO, /* LED_FUNC */
> -    MPP10_UNUSED,
> -    MPP11_UNUSED, /* LED_ETH (dummy) */
> -    MPP12_UNUSED,
> -    MPP13_UNUSED,
> -    MPP14_GPIO, /* LED_PWR */
> -    MPP15_GPIO, /* FUNC */
> -    MPP16_GPIO, /* USB_PWR */
> -    MPP17_GPIO, /* AUTO_POWER */
> -    MPP18_GPIO, /* POWER */
> -    MPP19_GPIO, /* HDD_PWR1 */
> -    0,
> -};
> -
> -static void __init lsmini_init(void)
> -{
> -    /*
> -     * Setup basic Orion functions. Need to be called early.
> -     */
> -    orion5x_init();
> -
> -    orion5x_mpp_conf(lsmini_mpp_modes);
> -
> -    /*
> -     * Configure peripherals.
> -     */
> -    orion5x_ehci0_init();
> -    orion5x_ehci1_init();
> -    orion5x_eth_init(&lsmini_eth_data);
> -    orion5x_i2c_init();
> -    orion5x_sata_init(&lsmini_sata_data);
> -    orion5x_uart0_init();
> -    orion5x_xor_init();
> -
> -    mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET,
> -                    ORION_MBUS_DEVBUS_BOOT_ATTR,
> -                    LSMINI_NOR_BOOT_BASE,
> -                    LSMINI_NOR_BOOT_SIZE);
> -    platform_device_register(&lsmini_nor_flash);
> -
> -    platform_device_register(&lsmini_button_device);
> -
> -    platform_device_register(&lsmini_leds);
> -
> -    i2c_register_board_info(0, &lsmini_i2c_rtc, 1);
> -
> -    /* enable USB power */
> -    gpio_set_value(LSMINI_GPIO_USB_POWER, 1);
> -
> -    /* register power-off method */
> -    pm_power_off = lsmini_power_off;
> -
> -    pr_info("%s: finished\n", __func__);
> -}
> -
> -#ifdef CONFIG_MACH_LINKSTATION_MINI
> -MACHINE_START(LINKSTATION_MINI, "Buffalo Linkstation Mini")
> -    /* Maintainer: Alexey Kopytko <alexey at kopytko.ru> */
> -    .atag_offset    = 0x100,
> -    .init_machine    = lsmini_init,
> -    .map_io        = orion5x_map_io,
> -    .init_early    = orion5x_init_early,
> -    .init_irq    = orion5x_init_irq,
> -    .init_time    = orion5x_timer_init,
> -    .fixup        = tag_fixup_mem32,
> -    .restart    = orion5x_restart,
> -MACHINE_END
> -#endif
> --
> 2.1.4
>



More information about the linux-arm-kernel mailing list