/*
 * Device Tree file for Buffalo Linkstation LS-CHLv3
 *
 * Copyright (C) 2016 Ash Hughes <ashley.hughes@blueyonder.co.uk>
 * Copyright (C) 2015-2017
 * Roger Shimizu <rogershimizu@gmail.com>
 *
 * This file is dual-licensed: you can use it either under the terms
 * of the GPL or the X11 license, at your option. Note that this dual
 * licensing only applies to this file, and not this project as a
 * whole.
 *
 *  a) This file 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.
 *
 *     This file is distributed in the hope that it will be useful,
 *     but WITHOUT ANY WARRANTY; without even the implied warranty of
 *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *     GNU General Public License for more details.
 *
 * Or, alternatively,
 *
 *  b) Permission is hereby granted, free of charge, to any person
 *     obtaining a copy of this software and associated documentation
 *     files (the "Software"), to deal in the Software without
 *     restriction, including without limitation the rights to use,
 *     copy, modify, merge, publish, distribute, sublicense, and/or
 *     sell copies of the Software, and to permit persons to whom the
 *     Software is furnished to do so, subject to the following
 *     conditions:
 *
 *     The above copyright notice and this permission notice shall be
 *     included in all copies or substantial portions of the Software.
 *
 *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 *     OTHER DEALINGS IN THE SOFTWARE.
 */

/dts-v1/;

#include "orion5x-linkstation.dtsi"
#include "mvebu-linkstation-gpio-simple.dtsi"
#include "mvebu-linkstation-fan.dtsi"
#include <dt-bindings/gpio/gpio.h>

/ {
	model = "Buffalo Linkstation LiveV3 (LS-CHL)";
	compatible = "buffalo,lschl", "marvell,orion5x-88f5182", "marvell,orion5x";

	memory { /* 128 MB */
		device_type = "memory";
		reg = <0x00000000 0x8000000>;
	};

	gpio_keys {
		func {
			label = "Function Button";
			linux,code = <KEY_OPTION>;
			gpios = <&gpio0 15 GPIO_ACTIVE_LOW>;
		};

		power-on-switch {
			gpios = <&gpio0 8 GPIO_ACTIVE_LOW>;
		};

		power-auto-switch {
			gpios = <&gpio0 10 GPIO_ACTIVE_LOW>;
		};
	};

	gpio_leds {
		pinctrl-0 = <&pmx_led_power &pmx_led_alarm &pmx_led_info &pmx_led_func>;
		blue-power-led {
			gpios = <&gpio0 0 GPIO_ACTIVE_LOW>;
		};

		red-alarm-led {
			gpios = <&gpio0 2 GPIO_ACTIVE_LOW>;
		};

		amber-info-led {
			gpios = <&gpio0 3 GPIO_ACTIVE_LOW>;
		};

		func {
			label = "lschl:func:blue:top";
			gpios = <&gpio0 17 GPIO_ACTIVE_LOW>;
		};
	};

	gpio_fan {
		gpios = <&gpio0 14 GPIO_ACTIVE_LOW
			 &gpio0 16 GPIO_ACTIVE_LOW>;

		alarm-gpios = <&gpio0 6 GPIO_ACTIVE_HIGH>;
	};
};

&pinctrl {
	pmx_led_power: pmx-leds {
		marvell,pins = "mpp0";
		marvell,function = "gpio";
	};

	pmx_power_hdd: pmx-power-hdd {
		marvell,pins = "mpp1";
		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_fan_lock: pmx-fan-lock {
		marvell,pins = "mpp6";
		marvell,function = "gpio";
	};

	pmx_power_switch: pmx-power-switch {
		marvell,pins = "mpp8", "mpp10", "mpp15";
		marvell,function = "gpio";
	};

	pmx_power_usb: pmx-power-usb {
		marvell,pins = "mpp9";
		marvell,function = "gpio";
	};

	pmx_fan_high: pmx-fan-high {
		marvell,pins = "mpp14";
		marvell,function = "gpio";
	};

	pmx_fan_low: pmx-fan-low {
		marvell,pins = "mpp16";
		marvell,function = "gpio";
	};

	pmx_led_func: pmx-leds {
		marvell,pins = "mpp17";
		marvell,function = "gpio";
	};

	pmx_sw_init: pmx-sw-init {
		marvell,pins = "mpp7";
		marvell,function = "gpio";
	};
};

&hdd_power {
	gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>;
};

&usb_power {
	gpios = <&gpio0 9 GPIO_ACTIVE_HIGH>;
};

