/dts-v1/;

#include "ipq5018.dtsi"
#include "ipq5018-mx-base.dtsi"

/ {
	model = "Linksys MX5500";
	compatible = "linksys,mx5500", "qcom,ipq5018";
};

/*
 * ===============================================================
 *     _______________________         _______________________
 *    |        IPQ5018        |       |        QCA8337        |
 *    | +------+   +--------+ |       | +--------+   +------+ |
 *    | | MAC0 |---| GE Phy | |       | |  Phy0  |---| MAC1 | |
 *    | +------+   +--------+ |       | +--------+   +------+ |
 *    | +------+   +--------+ |       | +--------+   +------+ |
 *    | | MAC1 |---| Uniphy |-+-SGMII-+-| SerDes |---| MAC6 | |
 *    | +------+   +--------+ |       | +--------+   +------+ |
 *    |_______________________|       |_______________________|
 *
 * ===============================================================
 */

&switch {
	status = "okay";

	switch_mac_mode = <MAC_MODE_SGMII_CHANNEL0>;

	qcom,port_phyinfo {
		// MAC0 -> GE Phy -> QCA8337 Phy4
		port@0 {
			port_id = <1>;
			mdiobus = <&mdio0>;
			phy_address = <7>;
		};

		// MAC1 ---SGMII---> QCA8337 SerDes
		port@1 {
			port_id = <2>;
			forced-speed = <1000>;
			forced-duplex = <1>;
		};
	};
};

// MAC1 ---SGMII---> QCA8337 SerDes
&dp2 {
	status = "okay";

	nvmem-cells = <&hw_mac_addr 0>;
	nvmem-cell-names = "mac-address";

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

&mdio0 {
	status = "okay";
};

&mdio1 {
	status = "okay";

	pinctrl-0 = <&mdio1_pins>;
	pinctrl-names = "default";
	reset-gpios = <&tlmm 39 GPIO_ACTIVE_LOW>;

	// QCA8337 Phy0 not connected
	qca8337_0: ethernet-phy@0 {
		reg = <0>;
	};

	// QCA8337 Phy1 -> WAN
	qca8337_1: ethernet-phy@1 {
		reg = <1>;
	};

	// QCA8337 Phy2 -> LAN1
	qca8337_2: ethernet-phy@2 {
		reg = <2>;
	};

	// QCA8337 Phy3 -> LAN2
	qca8337_3: ethernet-phy@3 {
		reg = <3>;
	};

	// QCA8337 Phy4 -> LAN3
	qca8337_4: ethernet-phy@4 {
		reg = <4>;
	};

	// QCA8337 switch
	switch1: ethernet-switch@17 {
		compatible = "qca,qca8337";
		reg = <17>;
		#address-cells = <1>;
		#size-cells = <0>;

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

			port@2 {
				reg = <2>;
				label = "wan";
				phy-handle = <&qca8337_1>;
			};

			port@3 {
				reg = <3>;
				label = "lan3";
				phy-handle = <&qca8337_2>;
			};

			port@4 {
				reg = <4>;
				label = "lan2";
				phy-handle = <&qca8337_3>;
			};

			port@5 {
				reg = <5>;
				label = "lan1";
				phy-handle = <&qca8337_4>;
			};

			port@6 {
				reg = <6>;
				label = "cpu";
				phy-mode = "sgmii";
				ethernet = <&dp2>;
				qca,sgmii-enable-pll;

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

&pcie0_phy {
	status = "okay";
};

&pcie0 {
	status = "okay";

	perst-gpios = <&tlmm 15 GPIO_ACTIVE_LOW>;

	bridge@0,0 {
		reg = <0x00000000 0 0 0 0>;
		#address-cells = <3>;
		#size-cells = <2>;
		ranges;

		wifi@1,0 {
			status = "okay";

			/* QCN9074: ath11k lacks DT compatible for PCI cards */
			compatible = "pci17cb,1104";
			reg = <0x00010000 0 0 0 0>;

			qcom,ath11k-calibration-variant = "Linksys-MX5500";
		};
	};
};

&q6v5_wcss {
	status = "okay";

	memory-region = <&q6_mem_regions>;
	firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt",
			"ath11k/IPQ5018/hw1.0/m3_fw.mdt";

	// IPQ5018
	q6_wcss_pd1: pd-1 {
		firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt";

		resets =
			<&gcc GCC_WCSSAON_RESET>,
			<&gcc GCC_WCSS_BCR>,
			<&gcc GCC_CE_BCR>;
		reset-names =
			"wcss_aon_reset",
			"wcss_reset",
			"ce_reset";

		clocks =
			<&gcc GCC_WCSS_AHB_S_CLK>,
			<&gcc GCC_WCSS_ACMT_CLK>,
			<&gcc GCC_WCSS_AXI_M_CLK>;
		clock-names =
			"gcc_wcss_ahb_s_clk",
			"gcc_wcss_acmt_clk",
			"gcc_wcss_axi_m_clk";

		interrupts-extended =
			<&wcss_smp2p_in 8 0>,
			<&wcss_smp2p_in 9 0>,
			<&wcss_smp2p_in 12 0>,
			<&wcss_smp2p_in 11 0>;
		interrupt-names =
			"fatal",
			"ready",
			"spawn-ack",
			"stop-ack";

		qcom,smem-states =
			<&wcss_smp2p_out 8>,
			<&wcss_smp2p_out 9>,
			<&wcss_smp2p_out 10>;
		qcom,smem-state-names =
			"shutdown",
			"stop",
			"spawn";
		status = "okay";
	};
};

&wifi0 {
	// IPQ5018
	qcom,rproc = <&q6_wcss_pd1>;
	qcom,ath11k-calibration-variant = "Linksys-MX5500";
	qcom,ath11k-fw-memory-mode = <2>;
	qcom,bdf-addr = <0x4c400000>;

	status = "okay";
};
