/*
 * Broadcom BCM470X / BCM5301X ARM platform code.
 * DTS for Netgear R8000
 *
 * Copyright (C) 2015 Rafał Miłecki <zajec5@gmail.com>
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
 */

/dts-v1/;

#include "bcm4709.dtsi"
#include "bcm5301x-nand-cs0-bch8.dtsi"

/ {
	compatible = "netgear,r8000", "brcm,bcm4709", "brcm,bcm4708";
	model = "Netgear R8000 (BCM4709)";

	chosen {
		bootargs = "console=ttyS0,115200";
	};

	memory@0 {
		device_type = "memory";
		reg = <0x00000000 0x08000000>,
		      <0x88000000 0x08000000>;
	};

	leds {
		compatible = "gpio-leds";

		power-white {
			label = "bcm53xx:white:power";
			gpios = <&chipcommon 2 GPIO_ACTIVE_LOW>;
			linux,default-trigger = "default-on";
		};

		power-amber {
			label = "bcm53xx:amber:power";
			gpios = <&chipcommon 3 GPIO_ACTIVE_LOW>;
		};

		wan-white {
			label = "bcm53xx:white:wan";
			gpios = <&chipcommon 8 GPIO_ACTIVE_LOW>;
			linux,default-trigger = "default-on";
		};

		wan-amber {
			label = "bcm53xx:amber:wan";
			gpios = <&chipcommon 9 GPIO_ACTIVE_HIGH>;
		};

		5ghz-1 {
			label = "bcm53xx:white:5ghz-1";
			gpios = <&chipcommon 12 GPIO_ACTIVE_LOW>;
		};

		2ghz {
			label = "bcm53xx:white:2ghz";
			gpios = <&chipcommon 13 GPIO_ACTIVE_LOW>;
		};

		wireless {
			label = "bcm53xx:white:wireless";
			gpios = <&chipcommon 14 GPIO_ACTIVE_HIGH>;
		};

		wps {
			label = "bcm53xx:white:wps";
			gpios = <&chipcommon 15 GPIO_ACTIVE_HIGH>;
		};

		5ghz-2 {
			label = "bcm53xx:white:5ghz-2";
			gpios = <&chipcommon 16 GPIO_ACTIVE_LOW>;
		};

		usb3 {
			label = "bcm53xx:white:usb3";
			gpios = <&chipcommon 17 GPIO_ACTIVE_LOW>;
		};

		usb2 {
			label = "bcm53xx:white:usb2";
			gpios = <&chipcommon 18 GPIO_ACTIVE_LOW>;
		};
	};

	gpio-keys {
		compatible = "gpio-keys";
		#address-cells = <1>;
		#size-cells = <0>;

		rfkill {
			label = "WiFi";
			linux,code = <KEY_RFKILL>;
			gpios = <&chipcommon 4 GPIO_ACTIVE_LOW>;
		};

		wps {
			label = "WPS";
			linux,code = <KEY_WPS_BUTTON>;
			gpios = <&chipcommon 5 GPIO_ACTIVE_LOW>;
		};

		restart {
			label = "Reset";
			linux,code = <KEY_RESTART>;
			gpios = <&chipcommon 6 GPIO_ACTIVE_LOW>;
		};

		brightness {
			label = "Backlight";
			linux,code = <KEY_BRIGHTNESS_ZERO>;
			gpios = <&chipcommon 19 GPIO_ACTIVE_LOW>;
		};
	};
};

&pcie0 {
	#address-cells = <3>;
	#size-cells = <2>;

	bridge@0,0,0 {
		reg = <0x0000 0 0 0 0>;

		#address-cells = <3>;
		#size-cells = <2>;

		wifi@0,1,0 {
			reg = <0x0000 0 0 0 0>;
			ieee80211-freq-limit = <5735000 5835000>;
		};
	};
};

&pcie1 {
	#address-cells = <3>;
	#size-cells = <2>;

	bridge@1,0,0 {
		reg = <0x0000 0 0 0 0>;

		#address-cells = <3>;
		#size-cells = <2>;

		bridge@1,1,0 {
			reg = <0x0000 0 0 0 0>;

			#address-cells = <3>;
			#size-cells = <2>;

			bridge@1,2,2 {
				reg = <0x1000 0 0 0 0>;

				#address-cells = <3>;
				#size-cells = <2>;

				wifi@1,4,0 {
					reg = <0x0000 0 0 0 0>;
					ieee80211-freq-limit = <5170000 5730000>;
				};
			};
		};
	};
};

&usb2 {
	vcc-gpio = <&chipcommon 0 GPIO_ACTIVE_HIGH>;
};

&usb3 {
	vcc-gpio = <&chipcommon 0 GPIO_ACTIVE_HIGH>;
};

&usb3_phy {
	status = "okay";
};

&srab {
	status = "okay";

	ports {
		port@0 {
			reg = <0>;
			label = "lan1";
		};

		port@1 {
			reg = <1>;
			label = "lan2";
		};

		port@2 {
			reg = <2>;
			label = "lan3";
		};

		port@3 {
			reg = <3>;
			label = "lan4";
		};

		port@4 {
			reg = <4>;
			label = "wan";
		};

		port@8 {
			reg = <8>;
			label = "cpu";
			ethernet = <&gmac2>;

			fixed-link {
				speed = <1000>;
				full-duplex;
			};
		};
	};
};
