/*
 * Device Tree file for Marvell Armada 3720 development board
 * (DB-88F3720-DDR3)
 * Copyright (C) 2016 Marvell
 *
 * Gregory CLEMENT <gregory.clement@free-electrons.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 <dt-bindings/gpio/gpio.h>
#include "armada-372x.dtsi"

/ {
	model = "Marvell Armada 3720 Development Board DB-88F3720-DDR3";
	compatible = "marvell,armada-3720-db", "marvell,armada3720", "marvell,armada3710";

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

	memory@0 {
		device_type = "memory";
		reg = <0x00000000 0x00000000 0x00000000 0x20000000>;
	};

	exp_usb3_vbus: usb3-vbus {
		compatible = "regulator-fixed";
		regulator-name = "usb3-vbus";
		regulator-min-microvolt = <5000000>;
		regulator-max-microvolt = <5000000>;
		enable-active-high;
		regulator-always-on;
		gpio = <&gpio_exp 1 GPIO_ACTIVE_HIGH>;
	};

	usb3_phy: usb3-phy {
		compatible = "usb-nop-xceiv";
		vcc-supply = <&exp_usb3_vbus>;
	};
};

&i2c0 {
	pinctrl-names = "default";
	pinctrl-0 = <&i2c1_pins>;
	status = "okay";

	gpio_exp: pca9555@22 {
		compatible = "nxp,pca9555";
		gpio-controller;
		#gpio-cells = <2>;

		reg = <0x22>;
		/*
		 * IO0_0: PWR_EN_USB2	IO1_0: PWR_EN_VTT
		 * IO0_1: PWR_EN_USB23	IO1_1: MPCIE_WDISABLE
		 * IO0_2: PWR_EN_SATA	IO1_2: RGMII_DEV_RSTN
		 * IO0_3: PWR_EN_PCIE	IO1_3: SGMII_DEV_RSTN
		 * IO0_4: PWR_EN_SD
		 * IO0_5: PWR_EN_EMMC
		 * IO0_6: PWR_EN_RGMII	IO1_6: SATA_USB3.0_SEL
		 * IO0_7: PWR_EN_SGMII	IO1_7: PWR_MCI_PS
		 */
	};

	rtc@68  {
		/* PT7C4337A from pericom fully compatible with the ds1337 */
		compatible = "dallas,ds1337";
		reg = <0x68>;
	};
};

/* CON3 */
&sata {
	status = "okay";
};

&spi0 {
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = <&spi_quad_pins>;

	m25p80@0 {
		compatible = "jedec,spi-nor";
		reg = <0>;
		spi-max-frequency = <108000000>;
		spi-rx-bus-width = <4>;
		spi-tx-bus-width = <4>;

		partitions {
			compatible = "fixed-partitions";
			#address-cells = <1>;
			#size-cells = <1>;
			partition@0 {
				label = "bootloader";
				reg = <0x0 0x200000>;
			};
			partition@200000 {
				label = "U-boot Env";
				reg = <0x200000 0x10000>;
			};
			partition@210000 {
				label = "Linux";
				reg = <0x210000 0xDF0000>;
			};
		};
	};
};

/* Exported on the micro USB connector CON32 through an FTDI */
&uart0 {
	pinctrl-names = "default";
	pinctrl-0 = <&uart1_pins>;
	status = "okay";
};

&sdhci0 {
	non-removable;
	bus-width = <8>;
	mmc-ddr-1_8v;
	mmc-hs400-1_8v;
	marvell,pad-type = "fixed-1-8v";
	status = "okay";
};

/* CON31 */
&usb3 {
	status = "okay";
	usb-phy = <&usb3_phy>;
};

/* CON17 (PCIe) / CON12 (mini-PCIe) */
&pcie0 {
	status = "okay";
};

/* CON27 */
&usb2 {
	status = "okay";
};


&mdio {
	status = "okay";
	phy0: ethernet-phy@0 {
		reg = <0>;
	};

	phy1: ethernet-phy@1 {
		reg = <1>;
	};
};

&eth0 {
	pinctrl-names = "default";
	pinctrl-0 = <&rgmii_pins>;
	phy-mode = "rgmii-id";
	phy = <&phy0>;
	status = "okay";
};

&eth1 {
	phy-mode = "sgmii";
	phy = <&phy1>;
	status = "okay";
};
