/*
 * T2080PCIe-RDB Board Device Tree Source
 *
 * Copyright 2014 - 2015 Freescale Semiconductor Inc.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *	 notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *	 notice, this list of conditions and the following disclaimer in the
 *	 documentation and/or other materials provided with the distribution.
 *     * Neither the name of Freescale Semiconductor nor the
 *	 names of its contributors may be used to endorse or promote products
 *	 derived from this software without specific prior written permission.
 *
 *
 * ALTERNATIVELY, this software may be distributed under the terms of the
 * GNU General Public License ("GPL") as published by the Free Software
 * Foundation, either version 2 of that License or (at your option) any
 * later version.
 *
 * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/include/ "t208xsi-pre.dtsi"
/include/ "t208xrdb.dtsi"

/ {
	model = "fsl,T2080RDB";
	compatible = "fsl,T2080RDB";
	#address-cells = <2>;
	#size-cells = <2>;
	interrupt-parent = <&mpic>;

	rio: rapidio@ffe0c0000 {
		reg = <0xf 0xfe0c0000 0 0x11000>;

		port1 {
			ranges = <0 0 0xc 0x20000000 0 0x10000000>;
		};
		port2 {
			ranges = <0 0 0xc 0x30000000 0 0x10000000>;
		};
	};
};

&soc {
	fman@400000 {
		ethernet@e0000 {
			phy-handle = <&xg_aq1202_phy3>;
			phy-connection-type = "xgmii";
		};

		ethernet@e2000 {
			phy-handle = <&xg_aq1202_phy4>;
			phy-connection-type = "xgmii";
		};

		ethernet@e4000 {
			phy-handle = <&rgmii_phy1>;
			phy-connection-type = "rgmii";
		};

		ethernet@e6000 {
			phy-handle = <&rgmii_phy2>;
			phy-connection-type = "rgmii";
		};

		ethernet@f0000 {
			phy-handle = <&xg_cs4315_phy2>;
			phy-connection-type = "xgmii";
		};

		ethernet@f2000 {
			phy-handle = <&xg_cs4315_phy1>;
			phy-connection-type = "xgmii";
		};

		mdio@fc000 {
			rgmii_phy1: ethernet-phy@1 {
				reg = <0x1>;
			};
			rgmii_phy2: ethernet-phy@2 {
				reg = <0x2>;
			};
		};

		mdio@fd000 {
			xg_cs4315_phy1: ethernet-phy@c {
				compatible = "ethernet-phy-id13e5.1002";
				reg = <0xc>;
			};

			xg_cs4315_phy2: ethernet-phy@d {
				compatible = "ethernet-phy-id13e5.1002";
				reg = <0xd>;
			};

			xg_aq1202_phy3: ethernet-phy@0 {
				compatible = "ethernet-phy-ieee802.3-c45";
				reg = <0x0>;
			};

			xg_aq1202_phy4: ethernet-phy@1 {
				compatible = "ethernet-phy-ieee802.3-c45";
				reg = <0x1>;
			};
		};
	};
};

/include/ "t2080si-post.dtsi"
