// SPDX-License-Identifier: GPL-2.0-or-later OR MIT

#include "cn71xx.dtsi"

#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
#include <dt-bindings/leds/common.h>

/ {
	compatible = "ubnt,edgerouter-e300", "cavium,cn7130";
	model = "Ubiquiti EdgeRouter E300 series";

	aliases {
		/* White + Blinking Blue */
		led-boot = &led_power_white;
		/* Blue + Blinking White */
		led-failsafe = &led_power_blue;
		/* Constant Blue */
		led-running = &led_power_blue;
		/* Blue + Blinking White */
		led-upgrade = &led_power_blue;
	};

	memory@0 {
		device_type = "memory";
		reg = <0x0 0x00000000>,
		      <0x0 0x10000000>,
		      <0x0 0x20000000>,
		      <0x0 0x30000000>;
	};

	leds {
		compatible = "gpio-leds";

		led_power_blue: power_blue {
			function = LED_FUNCTION_POWER;
			color = <LED_COLOR_ID_BLUE>;
			gpios = <&gpio 17 GPIO_ACTIVE_HIGH>;
		};

		led_power_white: power_white {
			function = LED_FUNCTION_POWER;
			color = <LED_COLOR_ID_WHITE>;
			gpios = <&gpio 15 GPIO_ACTIVE_HIGH>;
		};
	};

	keys {
		compatible = "gpio-keys-polled";
		poll-interval = <20>;

		reset {
			label = "reset";
			linux,code = <KEY_RESTART>;
			gpios = <&gpio 11 GPIO_ACTIVE_LOW>;
			debounce-interval = <60>;
		};
	};

	sfp: sfp {
		compatible = "sff,sfp";
		i2c-bus = <&twsi0>;
		/* Pins 12, 13 and 14 gets pulled low when SFP is plugged in */
		mod-def0-gpio = <&gpio 12 GPIO_ACTIVE_LOW>;
	};
};

&uart0 {
	status = "okay";
};

&usb0 {
	status = "okay";
};

&xhci0 {
	status = "okay";
	dr_mode = "host";
};

&twsi0 {
	status = "okay";

	sfp_eeprom@50 {
		compatible = "at,24c04";
		reg = <0x50>;
	};

	sfp_eeprom@51 {
		compatible = "at,24c04";
		reg = <0x51>;
	};
};

&spi {
	status = "okay";

	flash@0 {
		#address-cells = <1>;
		#size-cells = <1>;
		compatible = "Macronix,mx25l6405d", "spi-flash";
		reg = <0>;
		spi-max-frequency = <25000000>;

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

			partition@0 {
				label = "boot0";
				read-only;
				reg = <0x000000 0x300000>;
			};

			partition@300000 {
				label = "dummy";
				read-only;
				reg = <0x300000 0x100000>;
			};

			partition@400000 {
				label = "eeprom";
				read-only;
				reg = <0x400000 0x10000>;

				nvmem-layout {
					compatible = "fixed-layout";
					#address-cells = <1>;
					#size-cells = <1>;

					macaddr_eeprom_0: macaddr@0 {
						compatible = "mac-base";
						reg = <0x0 0x6>;
						#nvmem-cell-cells = <1>;
					};
				};
			};
		};
	};
};

&mmc {
	status = "okay";

	mmc-slot@0 {
		compatible = "mmc-slot";
		reg = <0>;
		non-removable;
		max-frequency = <26000000>;
		voltage-ranges = <3300 3300>;
		bus-width = <8>;
	};
};

&smi0 {
	status = "okay";

	phy4: ethernet-phy@4 {
		device_type = "ethernet-phy";
		interrupts = <17 8>;
		interrupt-parent = <&gpio>;
		compatible = "vitesse,vsc8504", "ethernet-phy-ieee802.3-c22";
		reg = <4>;
		sfp = <&sfp>;
	};

	phy5: ethernet-phy@5 {
		device_type = "ethernet-phy";
		interrupts = <17 8>;
		interrupt-parent = <&gpio>;
		compatible = "vitesse,vsc8504", "ethernet-phy-ieee802.3-c22";
		reg = <5>;
	};

	phy6: ethernet-phy@6 {
		device_type = "ethernet-phy";
		interrupts = <17 8>;
		interrupt-parent = <&gpio>;
		compatible = "vitesse,vsc8504", "ethernet-phy-ieee802.3-c22";
		reg = <6>;
	};

	phy7: ethernet-phy@7 {
		device_type = "ethernet-phy";
		interrupts = <17 8>;
		interrupt-parent = <&gpio>;
		compatible = "vitesse,vsc8504", "ethernet-phy-ieee802.3-c22";
		reg = <7>;
	};
};

&pip {
	status = "okay";

	interface@0 {
		status = "okay";

		ethernet@1 {
			label = "lan0";
			status = "okay";
			phy-mode = "sgmii";
			phy-handle = <&phy5>;
			nvmem-cells = <&macaddr_eeprom_0 1>;
			nvmem-cell-names = "mac-address";
		};

		ethernet@2 {
			label = "lan1";
			status = "okay";
			phy-mode = "sgmii";
			phy-handle = <&phy6>;
			nvmem-cells = <&macaddr_eeprom_0 2>;
			nvmem-cell-names = "mac-address";
		};

		ethernet@3 {
			label = "lan2";
			status = "okay";
			phy-mode = "sgmii";
			phy-handle = <&phy7>;
			nvmem-cells = <&macaddr_eeprom_0 3>;
			nvmem-cell-names = "mac-address";
		};
	};
};
