/*
 * 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.
 *
 * This file is compatible with the version 1.4 and the version 2.0 of
 * the board, however the CON numbers are different between the 2
 * version
 */

/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>;
	};

	vcc_sd_reg1: regulator {
		compatible = "regulator-gpio";
		regulator-name = "vcc_sd1";
		regulator-min-microvolt = <1800000>;
		regulator-max-microvolt = <3300000>;
		regulator-boot-on;

		gpios = <&gpiosb 23 GPIO_ACTIVE_HIGH>;
		gpios-states = <0>;
		states = <1800000 0x1
			  3300000 0x0>;
		enable-active-high;
	};

	vcc_sd_reg2: regulator-vmcc {
		compatible = "regulator-fixed";
		regulator-name = "vcc_sd2";
		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
		regulator-boot-on;
		enable-active-high;
		gpio = <&gpio_exp 4 GPIO_ACTIVE_HIGH>;
	};
};

/* Gigabit module on CON19(V2.0)/CON21(V1.4) */
&eth0 {
	pinctrl-names = "default";
	pinctrl-0 = <&rgmii_pins>;
	phy-mode = "rgmii-id";
	phy = <&phy0>;
	status = "okay";
};

/* Gigabit module on CON18(V2.0)/CON20(V1.4) */
&eth1 {
	phy-mode = "sgmii";
	phy = <&phy1>;
	status = "okay";
};

&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>;
	};
};

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

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

/* CON15(V2.0)/CON17(V1.4) : PCIe / CON15(V2.0)/CON12(V1.4) :mini-PCIe */
&pcie0 {
	status = "okay";
};

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

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

/* SD slot module on CON14(V2.0)/CON15(V1.4) */
&sdhci1 {
	wp-inverted;
	cd-gpios = <&gpiosb 2 GPIO_ACTIVE_LOW>;
	bus-width = <4>;
	marvell,pad-type = "sd";
	vqmmc-supply = <&vcc_sd_reg1>;
	vmmc-supply = <&vcc_sd_reg2>;
	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 CON30(V2.0)/CON32(V1.4) through
 * an FTDI (also on CON24(V2.0)/CON26(V1.4)).
 */
&uart0 {
	pinctrl-names = "default";
	pinctrl-0 = <&uart1_pins>;
	status = "okay";
};

/* CON26(V2.0)/CON28(V1.4) */
&uart1 {
	pinctrl-names = "default";
	pinctrl-0 = <&uart2_pins>;
	status = "okay";
};

/* CON27(V2.0)/CON29(V1.4) */
&usb2 {
	status = "okay";
};

/* CON29(V2.0)/CON31(V1.4) */
&usb3 {
	status = "okay";
	usb-phy = <&usb3_phy>;
};
