/*
 * Device Tree file for the Linksys WRT3200ACM (Rango)
 *
 * Copyright (C) 2016 Imre Kaloz <kaloz@openwrt.org>
 *
 *
 * 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 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.
 *
 * 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 <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
#include "armada-385-linksys.dtsi"

/ {
	model = "Linksys WRT3200ACM";
	compatible = "linksys,rango", "linksys,armada385", "marvell,armada385",
		     "marvell,armada380";
};

&expander0 {
	wan_amber@0 {
		label = "rango:amber:wan";
		reg = <0x0>;
	};

	wan_white@1 {
		label = "rango:white:wan";
		reg = <0x1>;
	};

	usb2@5 {
		label = "rango:white:usb2";
		reg = <0x5>;
	};

	usb3_1@6 {
		label = "rango:white:usb3_1";
		reg = <0x6>;
	};

	usb3_2@7 {
		label = "rango:white:usb3_2";
		reg = <0x7>;
	};

	wps_white@8 {
		label = "rango:white:wps";
		reg = <0x8>;
	};

	wps_amber@9 {
		label = "rango:amber:wps";
		reg = <0x9>;
	};
};

&gpio_leds {
	power {
		gpios = <&gpio1 24 GPIO_ACTIVE_HIGH>;
		label = "rango:white:power";
	};

	sata {
		gpios = <&gpio0 21 GPIO_ACTIVE_LOW>;
		label = "rango:white:sata";
	};

	wlan_2g {
		gpios = <&gpio1 13 GPIO_ACTIVE_LOW>;
		label = "rango:white:wlan_2g";
	};

	wlan_5g {
		gpios = <&gpio1 14 GPIO_ACTIVE_LOW>;
		label = "rango:white:wlan_5g";
	};
};

&gpio_leds_pins {
	marvell,pins = "mpp21", "mpp45", "mpp46", "mpp56";
};

&nand {
	/* AMD/Spansion S34ML02G2 256MiB, OEM Layout */

	partition@0 {
		label = "u-boot";
		reg = <0x0000000 0x200000>;  /* 2MiB */
		read-only;
	};

	partition@200000 {
		label = "u_env";
		reg = <0x200000 0x20000>;    /* 128KiB */
	};

	partition@220000 {
		label = "s_env";
		reg = <0x220000 0x40000>;    /* 256KiB */
	};

	partition@7e0000 {
		label = "devinfo";
		reg = <0x7e0000 0x40000>;   /* 256KiB */
		read-only;
	};

	partition@820000 {
		label = "sysdiag";
		reg = <0x820000 0x1e0000>;   /* 1920KiB */
		read-only;
	};

	/* kernel1 overlaps with rootfs1 by design */
	partition@a00000 {
		label = "kernel1";
		reg = <0xa00000 0x5000000>;  /* 80MiB */
	};

	partition@1000000 {
		label = "rootfs1";
		reg = <0x1000000 0x4a00000>;  /* 74MiB */
	};

	/* kernel2 overlaps with rootfs2 by design */
	partition@5a00000 {
		label = "kernel2";
		reg = <0x5a00000 0x5000000>; /* 80MiB */
	};

	partition@6000000 {
		label = "rootfs2";
		reg = <0x6000000 0x4a00000>; /* 74MiB */
	};

	/*
	 * 86MiB, last MiB is for the BBT, not writable
	 */
	partition@aa00000 {
		label = "syscfg";
		reg = <0xaa00000 0x5600000>;
	};

	/*
	 * Unused area between "s_env" and "devinfo".
	 * Moved here because otherwise the renumbered
	 * partitions would break the bootloader
	 * supplied bootargs
	 */
	partition@180000 {
		label = "unused_area";
		reg = <0x260000 0x5c0000>;   /* 5.75MiB */
	};
};

&sdhci {
	pinctrl-names = "default";
	pinctrl-0 = <&sdhci_pins>;
	no-1-8-v;
	non-removable;
	wp-inverted;
	bus-width = <8>;
	status = "okay";
};

&usb3_1_vbus {
	gpio = <&gpio1 12 GPIO_ACTIVE_HIGH>;
};

&usb3_1_vbus_pins {
	marvell,pins = "mpp44";
};
