/*
 * Device Tree file for Lenovo Iomega ix4-300d
 *
 * Copyright (C) 2014, Benoit Masson <yahoo@perenite.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 , 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/input/input.h>
#include <dt-bindings/gpio/gpio.h>
#include "armada-xp-mv78230.dtsi"

/ {
	model = "Lenovo Iomega ix4-300d";
	compatible = "lenovo,ix4-300d", "marvell,armadaxp-mv78230",
		     "marvell,armadaxp", "marvell,armada-370-xp";

	chosen {
		stdout-path = "serial0:115200n8";
	};

	memory {
		device_type = "memory";
		reg = <0 0x00000000 0 0x20000000>; /* 512MB */
	};

	soc {
		ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000
			MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
			MBUS_ID(0x09, 0x09) 0 0 0xf8100000 0x10000
			MBUS_ID(0x09, 0x05) 0 0 0xf8110000 0x10000>;

		pcie-controller {
			status = "okay";

			/* Quad port sata: Marvell 88SX7042 */
			pcie@1,0 {
				/* Port 0, Lane 0 */
				status = "okay";
			};

			/* USB 3.0 xHCI controller: NEC D720200F1 */
			pcie@5,0 {
				/* Port 1, Lane 0 */
				status = "okay";
			};
		};

		internal-regs {
			serial@12000 {
				status = "okay";
			};

			mdio {
				phy0: ethernet-phy@0 { /* Marvell 88E1318 */
					reg = <0>;
				};

				phy1: ethernet-phy@1 { /* Marvell 88E1318 */
					reg = <1>;
				};
			};

			ethernet@70000 {
				pinctrl-0 = <&ge0_rgmii_pins>;
				pinctrl-names = "default";
				status = "okay";
				phy = <&phy0>;
				phy-mode = "rgmii-id";
			};

			ethernet@74000 {
				pinctrl-0 = <&ge1_rgmii_pins>;
				pinctrl-names = "default";
				status = "okay";
				phy = <&phy1>;
				phy-mode = "rgmii-id";
			};

			usb@50000 {
				status = "okay";
			};

			usb@51000 {
				status = "okay";
			};

			i2c@11000 {
				clock-frequency = <400000>;
				status = "okay";

				adt7473@2e {
					compatible = "adi,adt7473";
					reg = <0x2e>;
				};

				eeprom@50 {
					compatible = "atmel,24c64";
					reg = <0x50>;
				};

				pcf8563@51 {
					compatible = "nxp,pcf8563";
					reg = <0x51>;
				};

			};

			nand@d0000 {
				status = "okay";
				num-cs = <1>;
				marvell,nand-keep-config;
				marvell,nand-enable-arbiter;
				nand-on-flash-bbt;

				partitions {
					#address-cells = <1>;
					#size-cells = <1>;

					partition@0 {
						label = "u-boot";
						reg = <0x00000000 0x000e0000>;
						read-only;
					};

					partition@e0000 {
						label = "u-boot-env";
						reg = <0x000e0000 0x00020000>;
						read-only;
					};

					partition@100000 {
						label = "u-boot-env2";
						reg = <0x00100000 0x00020000>;
						read-only;
					};

					partition@120000 {
						label = "zImage";
						reg = <0x00120000 0x00400000>;
					};

					partition@520000 {
						label = "initrd";
						reg = <0x00520000 0x00400000>;
					};

					partition@e00000 {
						label = "boot";
						reg = <0x00e00000 0x3f200000>;
					};
				};
			};
		};
	};

	gpio-keys {
		compatible = "gpio-keys";
		pinctrl-0 = <&power_button_pin &reset_button_pin
			&select_button_pin &scroll_button_pin>;
		pinctrl-names = "default";

		power-button {
			label = "Power Button";
			linux,code = <KEY_POWER>;
			gpios = <&gpio1 12 GPIO_ACTIVE_HIGH>;
		};

		reset-button {
			label = "Reset Button";
			linux,code = <KEY_RESTART>;
			gpios = <&gpio1 13 GPIO_ACTIVE_LOW>;
		};

		select-button {
			label = "Select Button";
			linux,code = <BTN_SELECT>;
			gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;
		};

		scroll-button {
			label = "Scroll Button";
			linux,code = <KEY_SCROLLDOWN>;
			gpios = <&gpio1 10 GPIO_ACTIVE_LOW>;
		};
	};

	spi3 {
		compatible = "spi-gpio";
		status = "okay";
		gpio-sck = <&gpio0 25 GPIO_ACTIVE_LOW>;
		gpio-mosi = <&gpio1 15 GPIO_ACTIVE_LOW>; /*gpio 47*/
		cs-gpios = <&gpio0 27 GPIO_ACTIVE_LOW>;
		num-chipselects = <1>;
		#address-cells = <1>;
		#size-cells = <0>;

		gpio_spi: gpio_spi@0 {
			compatible = "fairchild,74hc595";
			gpio-controller;
			#gpio-cells = <2>;
			reg = <0>;
			registers-number = <1>;
			spi-max-frequency = <100000>;
		};
	};

	gpio-leds {
		compatible = "gpio-leds";
		pinctrl-0 = <&hdd_led_pin>;
		pinctrl-names = "default";

		hdd-led {
			label = "ix4-300d:hdd:blue";
			gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>;
			default-state = "off";
		};

		power-led {
			label = "ix4-300d:power:white";
			gpios = <&gpio_spi 1 GPIO_ACTIVE_LOW>;
			/* init blinking while booting */
			linux,default-trigger = "timer";
			default-state = "on";
		};

		sysfail-led {
			label = "ix4-300d:sysfail:red";
			gpios = <&gpio_spi 2 GPIO_ACTIVE_HIGH>;
			default-state = "off";
		};

		sys-led {
			label = "ix4-300d:sys:blue";
			gpios = <&gpio_spi 3 GPIO_ACTIVE_HIGH>;
			default-state = "off";
		};

		hddfail-led {
			label = "ix4-300d:hddfail:red";
			gpios = <&gpio_spi 4 GPIO_ACTIVE_HIGH>;
			default-state = "off";
		};

	};

	/*
	 * Warning: you need both eth1 & 0 PHY initialized (i.e having
	 * them up does the tweak) for poweroff to shutdown otherwise it
	 * reboots
	 */
	gpio-poweroff {
		compatible = "gpio-poweroff";
		pinctrl-0 = <&poweroff_pin>;
		pinctrl-names = "default";
		gpios = <&gpio0 24 GPIO_ACTIVE_HIGH>;
	};
};

&pinctrl {
	poweroff_pin: poweroff-pin {
		marvell,pins = "mpp24";
		marvell,function = "gpio";
	};

	power_button_pin: power-button-pin {
		marvell,pins = "mpp44";
		marvell,function = "gpio";
	};

	reset_button_pin: reset-button-pin {
		marvell,pins = "mpp45";
		marvell,function = "gpio";
	};
	select_button_pin: select-button-pin {
		marvell,pins = "mpp41";
		marvell,function = "gpio";
	};

	scroll_button_pin: scroll-button-pin {
		marvell,pins = "mpp42";
		marvell,function = "gpio";
	};

	hdd_led_pin: hdd-led-pin {
		marvell,pins = "mpp26";
		marvell,function = "gpio";
	};
};
