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

#include "rtl930x.dtsi"

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

/ {
	compatible = "tplink,tl-st1008f-v2", "realtek,rtl930x-soc";
	model = "TP-Link TL-ST1008F v2.0";

	memory@0 {
		device_type = "memory";
		reg = <0x00000000 0x10000000>, /* first 256 MiB */
		      <0x20000000 0x10000000>; /* remaining 256 MiB */
	};

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

	keys {
		compatible = "gpio-keys";

		m1 {
			label = "M1";
			gpios = <&gpio0 17 GPIO_ACTIVE_LOW>;
			debounce-interval = <50>;
			linux,code = <BTN_0>;
			linux,input-type = <EV_SW>;
		};

		m2 {
			label = "M2";
			gpios = <&gpio0 18 GPIO_ACTIVE_LOW>;
			debounce-interval = <50>;
			linux,code = <BTN_1>;
			linux,input-type = <EV_SW>;
		};

		m3 {
			label = "M3";
			gpios = <&gpio0 19 GPIO_ACTIVE_LOW>;
			debounce-interval = <50>;
			linux,code = <BTN_2>;
			linux,input-type = <EV_SW>;
		};
	};

	led_set {
		compatible = "realtek,rtl9300-leds";
		active-high;

		led_set0 = <0x0ba0 0x0a08 0x0a01>;
	};

	i2c_gpio {
		compatible = "i2c-gpio";
		#address-cells = <1>;
		#size-cells = <0>;
		i2c-gpio,delay-us = <2>;
		scl-gpios = <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
		sda-gpios = <&gpio0 23 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;

		gpioexp0: i2c@38 {
			reg = <0x38>;
			compatible = "nxp,pca9534";
			gpio-controller;
			#gpio-cells = <2>;
		};
	};

	sfp0: sfp-p1 {
		compatible = "sff,sfp";
		i2c-bus = <&i2c0>;
		mod-def0-gpio = <&gpio0 0 GPIO_ACTIVE_LOW>;
		tx-disable-gpio = <&gpioexp0 0 GPIO_ACTIVE_HIGH>;
		maximum-power-milliwatt = <2900>;
		#thermal-sensor-cells = <0>;
	};

	sfp1: sfp-p2 {
		compatible = "sff,sfp";
		i2c-bus = <&i2c1>;
		mod-def0-gpio = <&gpio0 1 GPIO_ACTIVE_LOW>;
		tx-disable-gpio = <&gpioexp0 1 GPIO_ACTIVE_HIGH>;
		maximum-power-milliwatt = <1500>;
		#thermal-sensor-cells = <0>;
	};

	sfp2: sfp-p3 {
		compatible = "sff,sfp";
		i2c-bus = <&i2c2>;
		mod-def0-gpio = <&gpio0 2 GPIO_ACTIVE_LOW>;
		tx-disable-gpio = <&gpioexp0 2 GPIO_ACTIVE_HIGH>;
		maximum-power-milliwatt = <1500>;
		#thermal-sensor-cells = <0>;
	};

	sfp3: sfp-p4 {
		compatible = "sff,sfp";
		i2c-bus = <&i2c3>;
		mod-def0-gpio = <&gpio0 3 GPIO_ACTIVE_LOW>;
		tx-disable-gpio = <&gpioexp0 3 GPIO_ACTIVE_HIGH>;
		maximum-power-milliwatt = <2000>;
		#thermal-sensor-cells = <0>;
	};

	sfp4: sfp-p5 {
		compatible = "sff,sfp";
		i2c-bus = <&i2c4>;
		mod-def0-gpio = <&gpio0 4 GPIO_ACTIVE_LOW>;
		tx-disable-gpio = <&gpioexp0 4 GPIO_ACTIVE_HIGH>;
		maximum-power-milliwatt = <2000>;
		#thermal-sensor-cells = <0>;
	};

	sfp5: sfp-p6 {
		compatible = "sff,sfp";
		i2c-bus = <&i2c5>;
		mod-def0-gpio = <&gpio0 5 GPIO_ACTIVE_LOW>;
		tx-disable-gpio = <&gpioexp0 5 GPIO_ACTIVE_HIGH>;
		maximum-power-milliwatt = <1500>;
		#thermal-sensor-cells = <0>;
	};

	sfp6: sfp-p7 {
		compatible = "sff,sfp";
		i2c-bus = <&i2c6>;
		mod-def0-gpio = <&gpio0 6 GPIO_ACTIVE_LOW>;
		tx-disable-gpio = <&gpioexp0 6 GPIO_ACTIVE_HIGH>;
		maximum-power-milliwatt = <1500>;
		#thermal-sensor-cells = <0>;
	};

	sfp7: sfp-p8 {
		compatible = "sff,sfp";
		i2c-bus = <&i2c7>;
		mod-def0-gpio = <&gpio0 7 GPIO_ACTIVE_LOW>;
		tx-disable-gpio = <&gpioexp0 7 GPIO_ACTIVE_HIGH>;
		maximum-power-milliwatt = <2900>;
		#thermal-sensor-cells = <0>;
	};

	watchdog {
		compatible = "linux,wdt-gpio";
		gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>;
		hw_algo = "toggle";
		hw_margin_ms = <1200>;
		always-running;
	};
};

&i2c_mst1 {
	status = "okay";

	/* SDA0-7 correspond to GPIO9-16 */
	i2c0: i2c@0 {
		reg = <0>;
	};
	i2c1: i2c@1 {
		reg = <1>;
	};
	i2c2: i2c@2 {
		reg = <2>;
	};
	i2c3: i2c@3 {
		reg = <3>;
	};
	i2c4: i2c@4 {
		reg = <4>;
	};
	i2c5: i2c@5 {
		reg = <5>;
	};
	i2c6: i2c@6 {
		reg = <6>;
	};
	i2c7: i2c@7 {
		reg = <7>;
	};
};

&spi0 {
	status = "okay";

	flash@0 {
		compatible = "jedec,spi-nor";
		reg = <0>;
		spi-max-frequency = <100000000>;

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

			partition@0 {
				label = "u-boot";
				reg = <0x0 0xe0000>;
				read-only;
			};

			partition@e0000 {
				label = "u-boot-env";
				reg = <0xe0000 0x10000>;
			};

			partition@f0000 {
				label = "u-boot-env2";
				reg = <0xf0000 0x10000>;
				read-only;
			};

			partition@100000 {
				label = "jffs2-cfg";
				reg = <0x100000 0x100000>;
			};

			partition@200000 {
				label = "jffs2-log";
				reg = <0x200000 0x100000>;
			};

			partition@300000 {
				compatible = "openwrt,uimage", "denx,uimage";
				reg = <0x300000 0x1d00000>;
				label = "firmware";
				openwrt,ih-magic = <0x93030000>;
			};
		};
	};
};

&mdio_bus0 {
	INTERNAL_PHY(0)
	INTERNAL_PHY(8)
	INTERNAL_PHY(16)
	INTERNAL_PHY(20)
	INTERNAL_PHY(24)
	INTERNAL_PHY(25)
	INTERNAL_PHY(26)
	INTERNAL_PHY(27)
};

&switch0 {
	ports {
		#address-cells = <1>;
		#size-cells = <0>;

		port@0 {
			reg = <0>;
			label = "lan1";
			pcs-handle = <&serdes2>;
			phy-handle = <&phy0>;
			phy-mode = "1000base-x";
			sfp = <&sfp0>;
			managed = "in-band-status";
			led-set = <0>;
		};

		port@8 {
			reg = <8>;
			label = "lan2";
			pcs-handle = <&serdes3>;
			phy-handle = <&phy8>;
			phy-mode = "1000base-x";
			sfp = <&sfp1>;
			managed = "in-band-status";
			led-set = <0>;
		};

		port@10 {
			reg = <16>;
			label = "lan3";
			pcs-handle = <&serdes4>;
			phy-handle = <&phy16>;
			phy-mode = "1000base-x";
			sfp = <&sfp2>;
			managed = "in-band-status";
			led-set = <0>;
		};

		port@14 {
			reg = <20>;
			label = "lan4";
			pcs-handle = <&serdes5>;
			phy-handle = <&phy20>;
			phy-mode = "1000base-x";
			sfp = <&sfp3>;
			managed = "in-band-status";
			led-set = <0>;
		};

		port@18 {
			reg = <24>;
			label = "lan5";
			pcs-handle = <&serdes6>;
			phy-handle = <&phy24>;
			phy-mode = "1000base-x";
			sfp = <&sfp4>;
			managed = "in-band-status";
			led-set = <0>;
		};

		port@19 {
			reg = <25>;
			label = "lan6";
			pcs-handle = <&serdes7>;
			phy-handle = <&phy25>;
			phy-mode = "1000base-x";
			sfp = <&sfp5>;
			managed = "in-band-status";
			led-set = <0>;
		};

		port@1a {
			reg = <26>;
			label = "lan7";
			pcs-handle = <&serdes8>;
			phy-handle = <&phy26>;
			phy-mode = "1000base-x";
			sfp = <&sfp6>;
			managed = "in-band-status";
			led-set = <0>;
		};

		port@1b {
			reg = <27>;
			label = "lan8";
			pcs-handle = <&serdes9>;
			phy-handle = <&phy27>;
			phy-mode = "1000base-x";
			sfp = <&sfp7>;
			managed = "in-band-status";
			led-set = <0>;
		};

		port@1c {
			ethernet = <&ethernet0>;
			reg = <28>;
			phy-mode = "internal";

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

&thermal_zones {
	sfp-thermal {
		polling-delay-passive = <10000>;
		polling-delay = <10000>;
		thermal-sensors = <&sfp0>, <&sfp1>, <&sfp2>, <&sfp3>, <&sfp4>, <&sfp5>, <&sfp6>, <&sfp7>;
		trips {
			sfp-crit {
				temperature = <110000>;
				hysteresis = <1000>;
				type = "critical";
			};
		};
	};
};
