// SPDX-License-Identifier: GPL-2.0-only OR MIT
/*
 * Copyright (C) 2025 PHYTEC America LLC
 * Author: Garrett Giordano <ggiordano@phytec.com>
 */

/dts-v1/;
/plugin/;

#include <dt-bindings/net/ti-dp83869.h>
#include "k3-pinctrl.h"

&{/} {
	aliases {
		ethernet3 = "/icssg1-ethernet/ethernet-ports/port@0";
		ethernet4 = "/icssg1-ethernet/ethernet-ports/port@1";
	};

	icssg1-ethernet {
		compatible = "ti,am642-icssg-prueth";
		pinctrl-names = "default";
		pinctrl-0 = <&icssg1_rgmii1_pins_default>, <&icssg1_rgmii2_pins_default>;

		dmas = <&main_pktdma 0xc200 15>, /* egress slice 0 */
				<&main_pktdma 0xc201 15>, /* egress slice 0 */
				<&main_pktdma 0xc202 15>, /* egress slice 0 */
				<&main_pktdma 0xc203 15>, /* egress slice 0 */
				<&main_pktdma 0xc204 15>, /* egress slice 1 */
				<&main_pktdma 0xc205 15>, /* egress slice 1 */
				<&main_pktdma 0xc206 15>, /* egress slice 1 */
				<&main_pktdma 0xc207 15>, /* egress slice 1 */
				<&main_pktdma 0x4200 15>, /* ingress slice 0 */
				<&main_pktdma 0x4201 15>; /* ingress slice 1 */
		dma-names = "tx0-0", "tx0-1", "tx0-2", "tx0-3",
					"tx1-0", "tx1-1", "tx1-2", "tx1-3",
					"rx0", "rx1";

		firmware-name = "ti-pruss/am65x-sr2-pru0-prueth-fw.elf",
				"ti-pruss/am65x-sr2-rtu0-prueth-fw.elf",
				"ti-pruss/am65x-sr2-txpru0-prueth-fw.elf",
				"ti-pruss/am65x-sr2-pru1-prueth-fw.elf",
				"ti-pruss/am65x-sr2-rtu1-prueth-fw.elf",
				"ti-pruss/am65x-sr2-txpru1-prueth-fw.elf";

		interrupt-parent = <&icssg1_intc>;
		interrupts = <24 0 2>, <25 1 3>;
		interrupt-names = "tx_ts0", "tx_ts1";
		sram = <&oc_sram>;

		ti,iep = <&icssg1_iep0>, <&icssg1_iep1>;
		ti,mii-g-rt = <&icssg1_mii_g_rt>;
		ti,mii-rt = <&icssg1_mii_rt>;
		ti,pa-stats = <&icssg1_pa_stats>;
		ti,prus = <&pru1_0>, <&rtu1_0>, <&tx_pru1_0>, <&pru1_1>, <&rtu1_1>, <&tx_pru1_1>;
		ti,pruss-gp-mux-sel = <2>,	/* MII mode */
				      <2>,
				      <2>,
				      <2>,	/* MII mode */
				      <2>,
				      <2>;

		ethernet-ports {
			#address-cells = <1>;
			#size-cells = <0>;
			icssg1_emac0: port@0 {
				reg = <0>;
				phy-handle = <&icssg1_phy1>;
				phy-mode = "rgmii-id";
				/* Filled in by bootloader */
				local-mac-address = [00 00 00 00 00 00];
				ti,syscon-rgmii-delay = <&main_conf 0x4110>;
			};

			icssg1_emac1: port@1 {
				reg = <1>;
				phy-handle = <&icssg1_phy2>;
				phy-mode = "rgmii-id";
				/* Filled in by bootloader */
				local-mac-address = [00 00 00 00 00 00];
				ti,syscon-rgmii-delay = <&main_conf 0x4114>;
			};
		};
	};
};

&main_pmx0 {
	icssg1_mdio_pins_default: icssg1-mdio-default-pins {
		pinctrl-single,pins = <
			AM64X_IOPAD(0x015c, PIN_OUTPUT, 0) /* (Y6) PRG1_MDIO0_MDC */
			AM64X_IOPAD(0x0158, PIN_INPUT, 0)  /* (AA6) PRG1_MDIO0_MDIO */
		>;
	};

	icssg1_rgmii1_pins_default: icssg1-rgmii1-default-pins {
		pinctrl-single,pins = <
			AM64X_IOPAD(0x00b8, PIN_INPUT, 2) /* (Y7) PRG1_PRU0_GPO0.PRG1_RGMII1_RD0 */
			AM64X_IOPAD(0x00bc, PIN_INPUT, 2) /* (U8) PRG1_PRU0_GPO1.PRG1_RGMII1_RD1 */
			AM64X_IOPAD(0x00c0, PIN_INPUT, 2) /* (W8) PRG1_PRU0_GPO2.PRG1_RGMII1_RD2 */
			AM64X_IOPAD(0x00c4, PIN_INPUT, 2) /* (V8) PRG1_PRU0_GPO3.PRG1_RGMII1_RD3 */
			AM64X_IOPAD(0x00d0, PIN_INPUT, 2) /* (AA7) PRG1_PRU0_GPO6.PRG1_RGMII1_RXC */
			AM64X_IOPAD(0x00c8, PIN_INPUT, 2) /* (Y8) PRG1_PRU0_GPO4.PRG1_RGMII1_RX_CTL */
			AM64X_IOPAD(0x00e4, PIN_OUTPUT, 2) /* (AA8) PRG1_PRU0_GPO11.PRG1_RGMII1_TD0 */
			AM64X_IOPAD(0x00e8, PIN_OUTPUT, 2) /* (U9) PRG1_PRU0_GPO12.PRG1_RGMII1_TD1 */
			AM64X_IOPAD(0x00ec, PIN_OUTPUT, 2) /* (W9) PRG1_PRU0_GPO13.PRG1_RGMII1_TD2 */
			AM64X_IOPAD(0x00f0, PIN_OUTPUT, 2) /* (AA9) PRG1_PRU0_GPO14.PRG1_RGMII1_TD3 */
			AM64X_IOPAD(0x00f4, PIN_OUTPUT, 2) /* (Y9) PRG1_PRU0_GPO15.PRG1_RGMII1_TX_CTL */
			AM64X_IOPAD(0x00f8, PIN_INPUT, 2) /* (V9) PRG1_PRU0_GPO16.PRG1_RGMII1_TXC */
		>;
	};

	icssg1_rgmii2_pins_default: icssg1-rgmii2-default-pins {
		pinctrl-single,pins = <
			AM64X_IOPAD(0x0108, PIN_INPUT, 2) /* (W11) PRG1_PRU1_GPO0.PRG1_RGMII2_RD0 */
			AM64X_IOPAD(0x010c, PIN_INPUT, 2) /* (V11) PRG1_PRU1_GPO1.PRG1_RGMII2_RD1 */
			AM64X_IOPAD(0x0110, PIN_INPUT, 2) /* (AA12) PRG1_PRU1_GPO2.PRG1_RGMII2_RD2 */
			AM64X_IOPAD(0x0114, PIN_INPUT, 2) /* (Y12) PRG1_PRU1_GPO3.PRG1_RGMII2_RD3 */
			AM64X_IOPAD(0x0118, PIN_INPUT, 2) /* (W12) PRG1_PRU1_GPO4.PRG1_RGMII2_RX_CTL */
			AM64X_IOPAD(0x0120, PIN_INPUT, 2) /* (U11) PRG1_PRU1_GPO6.PRG1_RGMII2_RXC */
			AM64X_IOPAD(0x0134, PIN_OUTPUT, 2) /* (AA10) PRG1_PRU1_GPO11.PRG1_RGMII2_TD0 */
			AM64X_IOPAD(0x0138, PIN_OUTPUT, 2) /* (V10) PRG1_PRU1_GPO12.PRG1_RGMII2_TD1 */
			AM64X_IOPAD(0x013c, PIN_OUTPUT, 2) /* (U10) PRG1_PRU1_GPO13.PRG1_RGMII2_TD2 */
			AM64X_IOPAD(0x0140, PIN_OUTPUT, 2) /* (AA11) PRG1_PRU1_GPO14.PRG1_RGMII2_TD3 */
			AM64X_IOPAD(0x0144, PIN_OUTPUT, 2) /* (Y11) PRG1_PRU1_GPO15.PRG1_RGMII2_TX_CTL */
			AM64X_IOPAD(0x0148, PIN_INPUT, 2) /* (Y10) PRG1_PRU1_GPO16.PRG1_RGMII2_TXC */
		>;
	};
};

&icssg1_mdio {
	pinctrl-names = "default";
	pinctrl-0 = <&icssg1_mdio_pins_default>;
	#address-cells = <1>;
	#size-cells = <0>;
	status = "okay";

	icssg1_phy1: ethernet-phy@1 {
		reg = <0x1>;
		rx-fifo-depth = <DP83869_PHYCR_FIFO_DEPTH_4_B_NIB>;
		tx-fifo-depth = <DP83869_PHYCR_FIFO_DEPTH_4_B_NIB>;
		rx-internal-delay-ps = <2000>;
		tx-internal-delay-ps = <2000>;
		ti,clk-output-sel = <DP83869_CLK_O_SEL_REF_CLK>;
		ti,min-output-impedance;
	};

	icssg1_phy2: ethernet-phy@2 {
		reg = <0x2>;
		rx-fifo-depth = <DP83869_PHYCR_FIFO_DEPTH_4_B_NIB>;
		tx-fifo-depth = <DP83869_PHYCR_FIFO_DEPTH_4_B_NIB>;
		rx-internal-delay-ps = <2000>;
		tx-internal-delay-ps = <2000>;
		ti,clk-output-sel = <DP83869_CLK_O_SEL_REF_CLK>;
		ti,min-output-impedance;
	};
};
