Colibri-iMX7D ENET2 RMII clock output

Colibri iMX7D 1GB EMMC V1.1B
Custom Carrier Board
Linux BSP 6.4.0

Hello

I’ve got problem with second ethernet controller on Colibri-imx7d EMMC. As far as my investigations goes it seems that the reason is no clock signal on pin MX7D_PAD_EPDC_BDR0__CCM_ENET_REF_CLK2

We want to use the same PHY ic as on Colibri module: Micrel KSZ8041 with RMII mode, but with SFP module. We did this many times on our boards with iMX6ULL from different vendor than Toradex, and it worked without issues. This is first time with iMX7D.

The MDIO communication is working, PHY is detected by kernel but nothing happens when fiber/ethernet cable is connected(I’ve also soldered standard Ethernet socket to debug the issue).

[    1.332645] fec 30be0000.ethernet eth0: registered PHC device 0
[    1.981441] fec 30bf0000.ethernet eth1: registered PHC device 1
[    8.052666] Micrel KSZ8041 30bf0000.ethernet-2:01: attached PHY driver (mii_bus:phy_addr=30bf0000.ethernet-2:01, irq=POLL)
[    8.286216] Micrel KSZ8041 30be0000.ethernet-1:00: attached PHY driver (mii_bus:phy_addr=30be0000.ethernet-1:00, irq=POLL)
[   10.392130] fec 30be0000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx

Here is my device-tree config(based on this patch colibri_imx7_2nd_ethernet/0001-imx7d-2nd-ethernet-support_update_20200218.patch at master · simonqin09/colibri_imx7_2nd_ethernet · GitHub):

&fec2 {
    pinctrl-names = "default", "sleep";
    pinctrl-0 = <&pinctrl_enet2>;
    pinctrl-1 = <&pinctrl_enet2_sleep>;
	
	clocks = <&clks IMX7D_ENET2_IPG_ROOT_CLK>,
		<&clks IMX7D_ENET_AXI_ROOT_CLK>,
		<&clks IMX7D_ENET2_TIME_ROOT_CLK>,
		<&clks IMX7D_PLL_ENET_MAIN_50M_CLK>,
		<&clks IMX7D_ENET_PHY_REF_ROOT_DIV>;
	clock-names = "ipg", "ahb", "ptp",
		"enet_clk_ref", "enet_out";
    assigned-clocks = <&clks IMX7D_ENET2_TIME_ROOT_SRC>,
                      <&clks IMX7D_ENET2_TIME_ROOT_CLK>,
                      <&clks IMX7D_ENET_PHY_REF_ROOT_DIV>;
    assigned-clock-parents = <&clks IMX7D_PLL_ENET_MAIN_100M_CLK>;
    assigned-clock-rates = <0>, <100000000>, <50000000>;
	
	phy-mode = "rmii";
	phy-handle = <&ethphy1>;
	phy-supply = <&reg_eth1_vbus>;
	phy-reset-gpios = <&gpio2 30 GPIO_ACTIVE_LOW>;
	phy-reset-duration = <500>;
	phy-reset-post-delay = <100>;
	
	fsl,magic-packet;
	fsl,mii-exclusive;
	
	nvmem-cells = <&eth1_macaddr>;
    nvmem-cell-names = "mac-address";
	status = "okay";

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

		ethphy1: ethernet-phy@1 {
			compatible = "ethernet-phy-ieee802.3-c22";
			reg = <1>;
			micrel,fiber-mode; /* remove this when testing standard ethernet */
		};
	};
};

	pinctrl_enet2: enet2grp {
		fsl,pins = <		
			MX7D_PAD_GPIO1_IO14__ENET2_MDIO	        0x1b0b0  /* SODIMM 188 */
			MX7D_PAD_GPIO1_IO15__ENET2_MDC          0x1b0b0  /* SODIMM 178 */
		
			MX7D_PAD_EPDC_SDCE0__ENET2_RGMII_RX_CTL	0x73 /* SODIMM 122 */
			MX7D_PAD_EPDC_SDCLK__ENET2_RGMII_RD0	0x73 /* SODIMM 114 */
			MX7D_PAD_EPDC_SDLE__ENET2_RGMII_RD1	    0x73 /* SODIMM 116 */
			MX7D_PAD_EPDC_SDCE1__ENET2_RX_ER		0x73 /* SODIMM 124 */

			MX7D_PAD_EPDC_GDRL__ENET2_RGMII_TX_CTL	0x73 /* SODIMM 133 */
			MX7D_PAD_EPDC_SDCE2__ENET2_RGMII_TD0	0x73 /* SODIMM 127 */
			MX7D_PAD_EPDC_SDCE3__ENET2_RGMII_TD1	0x73 /* SODIMM 130 */
			MX7D_PAD_EPDC_BDR0__CCM_ENET_REF_CLK2   0x40000073 /* SODIMM 106 */
			
			MX7D_PAD_EPDC_PWR_COM__GPIO2_IO30       0x73 /* SODIMM 112 - RST */
		>;
	};
	
    pinctrl_enet2_sleep: enet2sleepgrp {
        fsl,pins = <
            MX7D_PAD_GPIO1_IO14__GPIO1_IO14       0x0
            MX7D_PAD_GPIO1_IO15__GPIO1_IO15       0x0

            MX7D_PAD_EPDC_SDCE0__GPIO2_IO20       0x0
            MX7D_PAD_EPDC_SDCLK__GPIO2_IO16       0x0
            MX7D_PAD_EPDC_SDLE__GPIO2_IO17        0x0
            MX7D_PAD_EPDC_SDCE1__GPIO2_IO21       0x0

            MX7D_PAD_EPDC_GDRL__GPIO2_IO26        0x0
            MX7D_PAD_EPDC_SDCE2__GPIO2_IO22       0x0
            MX7D_PAD_EPDC_SDCE3__GPIO2_IO23       0x0
            MX7D_PAD_EPDC_BDR0__GPIO2_IO28        0x0
        >;
    };

We have found out that 50MHz clock signal form MX7D_PAD_EPDC_BDR0__CCM_ENET_REF_CLK2 is produced only for a short time on boot. And disappears when this boot message is shown:

[    8.052666] Micrel KSZ8041 30bf0000.ethernet-2:01: attached PHY driver (mii_bus:phy_addr=30bf0000.ethernet-2:01, irq=POLL)
[    8.286216] Micrel KSZ8041 30be0000.ethernet-1:00: attached PHY driver (mii_bus:phy_addr=30be0000.ethernet-1:00, irq=POLL)

As far as I know there is an external 50MHz oscillator used to drive fec1 controller on Colibri board. So generation of ref_clock from Colibri board is not needed.

I’ve found also this function in currently used kernel source:
https://git.toradex.com/cgit/linux-toradex.git/tree/arch/arm/mach-imx/mach-imx7d.c?h=toradex_5.15-2.2.x-imx

static void __init imx7d_enet_clk_sel(void)
{
	struct regmap *gpr;

	gpr = syscon_regmap_lookup_by_compatible("fsl,imx7d-iomuxc-gpr");
	if (!IS_ERR(gpr)) {
		regmap_update_bits(gpr, IOMUXC_GPR1, IMX7D_GPR1_ENET_TX_CLK_SEL_MASK, 0);
		regmap_update_bits(gpr, IOMUXC_GPR1, IMX7D_GPR1_ENET_CLK_DIR_MASK, 0);
	} else {
		pr_err("failed to find fsl,imx7d-iomux-gpr regmap\n");
	}
}

I’ve tried to create patches with that ones from previous versions of kernel:
https://git.toradex.com/cgit/linux-toradex.git/tree/arch/arm/mach-imx/mach-imx7d.c?h=toradex_4.1-2.0.x-imx

static void __init imx7d_enet_clk_sel(void)
{
	struct device_node *np;
	struct clk *enet_out_clk;
	struct regmap *gpr;

	np = of_find_compatible_node(NULL, NULL, "fsl,imx7d-fec");
	if (!np) {
		pr_warn("%s: failed to find fec node\n", __func__);
		return;
	}

	enet_out_clk = of_clk_get_by_name(np, "enet_out");

	gpr = syscon_regmap_lookup_by_compatible("fsl,imx7d-iomuxc-gpr");

	if (!IS_ERR(gpr)) {
		if (IS_ERR(enet_out_clk)) {
			pr_info("%s: failed to get enet_out clock, assuming ext. clock source\n", __func__);
			/* use external clock for PHY */
			regmap_update_bits(gpr, IOMUXC_GPR1, IMX7D_GPR1_ENET_TX_CLK_SEL_MASK, IMX7D_GPR1_ENET_TX_CLK_SEL_MASK);
			regmap_update_bits(gpr, IOMUXC_GPR1, IMX7D_GPR1_ENET_CLK_DIR_MASK, 0);
		} else {
			pr_info("%s: found enet_out clock, assuming internal clock source\n", __func__);
			/* use internal clock generation and output it to PHY */
			regmap_update_bits(gpr, IOMUXC_GPR1, IMX7D_GPR1_ENET_TX_CLK_SEL_MASK, 0);
			regmap_update_bits(gpr, IOMUXC_GPR1, IMX7D_GPR1_ENET_CLK_DIR_MASK, IMX7D_GPR1_ENET1_CLK_DIR_MASK);
			clk_put(enet_out_clk);

		}
	} else {
		pr_err("failed to find fsl,imx7d-iomux-gpr regmap\n");
	}
	of_node_put(np);
}

https://git.toradex.com/cgit/linux-toradex.git/tree/arch/arm/mach-imx/mach-imx7d.c?h=toradex_4.14-2.3.x-imx

static void __init imx7d_enet_clk_sel(void)
{
	struct device_node *np = NULL;
	struct clk *enet_out_clk;
	struct regmap *gpr;

	gpr = syscon_regmap_lookup_by_compatible("fsl,imx7d-iomuxc-gpr");
	if (IS_ERR(gpr)) {
		pr_err("failed to find fsl,imx7d-iomux-gpr regmap\n");
		return;
	}

	do {
		int id;
		u32 clk_sel_mask, clk_dir_mask;

		np = of_find_compatible_node(np, NULL, "fsl,imx7d-fec");
		if (!np)
			return;

		/* Determine controller ID by ethernet alias */
		id = of_alias_get_id(np, "ethernet");
		clk_sel_mask = id == 0 ? IMX7D_GPR1_ENET1_TX_CLK_SEL_MASK :
					 IMX7D_GPR1_ENET2_TX_CLK_SEL_MASK;
		clk_dir_mask = id == 0 ? IMX7D_GPR1_ENET1_CLK_DIR_MASK :
					 IMX7D_GPR1_ENET2_CLK_DIR_MASK;

		enet_out_clk = of_clk_get_by_name(np, "enet_out");

		if (IS_ERR(enet_out_clk)) {
			pr_info("%s: fec%d: failed to get enet_out clock, assuming ext. clock source\n",
				__func__, id + 1);
			/* use external clock for PHY */
			regmap_update_bits(gpr, IOMUXC_GPR1, clk_sel_mask, clk_sel_mask);
			regmap_update_bits(gpr, IOMUXC_GPR1, clk_dir_mask, 0);
		} else {
			pr_info("%s: fec%d: found enet_out clock, assuming internal clock source\n",
				__func__, id + 1);
			/* use internal clock generation and output it to PHY */
			regmap_update_bits(gpr, IOMUXC_GPR1, clk_sel_mask, 0);
			regmap_update_bits(gpr, IOMUXC_GPR1, clk_dir_mask, clk_dir_mask);
			clk_put(enet_out_clk);
		}
	} while (np);
}

But without luck. None of them worked. There only appeared this messages from kernel:

[    0.066892] imx7d_enet_clk_sel: fec1: failed to get enet_out clock, assuming ext. clock source
[    0.066943] imx7d_enet_clk_sel: fec2: found enet_out clock, assuming internal clock source

Still:
u-boot → 50MHz on MX7D_PAD_EPDC_BDR0__CCM_ENET_REF_CLK2 →
[ 8.052666] Micrel KSZ8041 30bf0000.ethernet-2:01: attached PHY driver (mii_bus:phy_addr=30bf0000.ethernet-2:01, irq=POLL) → clock off → fec2 not working

Here is the enet clocks summary:

cat /sys/kernel/debug/clk/clk_summary
                                 enable  prepare  protect                                duty  hardware
   clock                          count    count    count        rate   accuracy phase  cycle    enable
-------------------------------------------------------------------------------------------------------
    pll_enet_main                     1        1        0  1000000000          0     0  50000         Y
       pll_enet_main_bypass           1        1        0  1000000000          0     0  50000         Y
          pll_enet_main_clk           2        2        0  1000000000          0     0  50000         Y
             pll_enet_25m             0        0        0    25000000          0     0  50000         Y
                pll_enet_25m_clk       0        0        0    25000000          0     0  50000         N
             pll_enet_40m             0        0        0    40000000          0     0  50000         Y
                pll_enet_40m_clk       0        0        0    40000000          0     0  50000         N
                   wrclk_src          0        0        0    40000000          0     0  50000         Y
                      wrclk_cg        0        0        0    40000000          0     0  50000         N
                         wrclk_pre_div       0        0        0    40000000          0     0  50000         Y
                            wrclk_post_div       0        0        0    40000000          0     0  50000         Y
                               wrclk_root_clk       0        0        0    40000000          0     0  50000         N
             pll_enet_50m             1        1        0    50000000          0     0  50000         Y
                pll_enet_50m_clk       2        2        0    50000000          0     0  50000         Y
                   enet2_ref_src       0        0        0    50000000          0     0  50000         Y
                      enet2_ref_cg       0        0        0    50000000          0     0  50000         N
                         enet2_ref_pre_div       0        0        0    50000000          0     0  50000         Y
                            enet2_ref_post_div       0        0        0    50000000          0     0  50000         Y
                   enet1_ref_src       0        0        0    50000000          0     0  50000         Y
                      enet1_ref_cg       0        0        0    50000000          0     0  50000         N
                         enet1_ref_pre_div       0        0        0    50000000          0     0  50000         Y
                            enet1_ref_post_div       0        0        0    50000000          0     0  50000         Y
             pll_enet_100m            1        1        0   100000000          0     0  50000         Y
                pll_enet_100m_clk       2        2        0   100000000          0     0  50000         Y
                   enet2_time_src       1        1        0   100000000          0     0  50000         Y
                      enet2_time_cg       1        1        0   100000000          0     0  50000         Y
                         enet2_time_pre_div       1        1        0   100000000          0     0  50000         Y
                            enet2_time_post_div       1        1        0   100000000          0     0  50000         Y
                               enet2_time_root_clk       1        1        0   100000000          0     0  50000         Y
                   enet1_time_src       1        1        0   100000000          0     0  50000         Y
                      enet1_time_cg       1        1        0   100000000          0     0  50000         Y
                         enet1_time_pre_div       1        1        0   100000000          0     0  50000         Y
                            enet1_time_post_div       1        1        0   100000000          0     0  50000         Y
                               enet1_time_root_clk       1        1        0   100000000          0     0  50000         Y
             pll_enet_125m            0        0        0   125000000          0     0  50000         Y
                pll_enet_125m_clk       0        0        0   125000000          0     0  50000         N
             pll_enet_250m            0        0        0   250000000          0     0  50000         Y
                pll_enet_250m_clk       0        0        0   250000000          0     0  50000         N
             pll_enet_500m            0        0        0   500000000          0     0  50000         Y
                pll_enet_500m_clk       0        0        0   500000000          0     0  50000         N

And some links connected with that issue:

Hello @qba,

can you please share your schematic, and how you connect the external ethernet phy.

Best Regards,

Matthias

Yes of course. Sorry for the little mess, it is still WIP. I’ve marked clock line.

After applying this patch to kernel 5.15


---
 arch/arm/mach-imx/mach-imx7d.c | 42 ++++++++++++++++++++++++++++++----
 1 file changed, 38 insertions(+), 4 deletions(-)

diff --git a/arch/arm/mach-imx/mach-imx7d.c b/arch/arm/mach-imx/mach-imx7d.c
index a15d8f5083eb..0490c702ab3c 100644
--- a/arch/arm/mach-imx/mach-imx7d.c
+++ b/arch/arm/mach-imx/mach-imx7d.c
@@ -2,6 +2,7 @@
 /*
  * Copyright (C) 2015 Freescale Semiconductor, Inc.
  */
+#include <linux/clk.h>
 #include <linux/irqchip.h>
 #include <linux/mfd/syscon.h>
 #include <linux/mfd/syscon/imx7-iomuxc-gpr.h>
@@ -61,15 +62,48 @@ static void __init imx7d_enet_mdio_fixup(void)
 
 static void __init imx7d_enet_clk_sel(void)
 {
+	struct device_node *np = NULL;
+	struct clk *enet_out_clk;
 	struct regmap *gpr;
 
 	gpr = syscon_regmap_lookup_by_compatible("fsl,imx7d-iomuxc-gpr");
-	if (!IS_ERR(gpr)) {
-		regmap_update_bits(gpr, IOMUXC_GPR1, IMX7D_GPR1_ENET_TX_CLK_SEL_MASK, 0);
-		regmap_update_bits(gpr, IOMUXC_GPR1, IMX7D_GPR1_ENET_CLK_DIR_MASK, 0);
-	} else {
+	if (IS_ERR(gpr)) {
 		pr_err("failed to find fsl,imx7d-iomux-gpr regmap\n");
+		return;
 	}
+
+	do {
+		int id;
+		u32 clk_sel_mask, clk_dir_mask;
+
+		np = of_find_compatible_node(np, NULL, "fsl,imx7d-fec");
+		if (!np)
+			return;
+
+		/* Determine controller ID by ethernet alias */
+		id = of_alias_get_id(np, "ethernet");
+		clk_sel_mask = id == 0 ? IMX7D_GPR1_ENET1_TX_CLK_SEL_MASK :
+					 IMX7D_GPR1_ENET2_TX_CLK_SEL_MASK;
+		clk_dir_mask = id == 0 ? IMX7D_GPR1_ENET1_CLK_DIR_MASK :
+					 IMX7D_GPR1_ENET2_CLK_DIR_MASK;
+
+		enet_out_clk = of_clk_get_by_name(np, "enet_out");
+
+		if (IS_ERR(enet_out_clk)) {
+			pr_info("%s: fec%d: failed to get enet_out clock, assuming ext. clock source\n",
+				__func__, id + 1);
+			/* use external clock for PHY */
+			regmap_update_bits(gpr, IOMUXC_GPR1, clk_sel_mask, clk_sel_mask);
+			regmap_update_bits(gpr, IOMUXC_GPR1, clk_dir_mask, 0);
+		} else {
+			pr_info("%s: fec%d: found enet_out clock, assuming internal clock source\n",
+				__func__, id + 1);
+			/* use internal clock generation and output it to PHY */
+			regmap_update_bits(gpr, IOMUXC_GPR1, clk_sel_mask, 0);
+			regmap_update_bits(gpr, IOMUXC_GPR1, clk_dir_mask, clk_dir_mask);
+			clk_put(enet_out_clk);
+		}
+	} while (np);
 }
 
 static inline void imx7d_enet_init(void)

I got 50Mhz clock signal for about a 1 second when kernel starts to boot.

[    0.066892] imx7d_enet_clk_sel: fec1: failed to get enet_out clock, assuming ext. clock source
[    0.066943] imx7d_enet_clk_sel: fec2: found enet_out clock, assuming internal clock source

can you send the device tree?

Here is our board full device-tree: kk01_mb_01-ver1.0.dtsi

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

/ {
    board = "KK01_MB_01";
    board_version = "1.0";
    
	chosen {
		stdout-path = "serial0:115200n8";
	};

	reg_3v3: regulator-3v3 {
		compatible = "regulator-fixed";
		regulator-name = "3.3V";
		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
	};

	reg_5v0: regulator-5v0 {
		compatible = "regulator-fixed";
		regulator-name = "5V";
		regulator-min-microvolt = <5000000>;
		regulator-max-microvolt = <5000000>;
	};

	reg_usbh_vbus: regulator-usbh-vbus {
		compatible = "regulator-fixed";
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_usbh_reg>;
		regulator-name = "VCC_USB[1-2]";
		regulator-min-microvolt = <5000000>;
		regulator-max-microvolt = <5000000>;
		gpio = <&gpio4 7 GPIO_ACTIVE_LOW>;
		vin-supply = <&reg_5v0>;
	};
	
	reg_eth_vbus: eth-vbus {
        compatible = "regulator-fixed";
        regulator-name = "VCC_ETH";
        regulator-min-microvolt = <3300000>;
        regulator-max-microvolt = <3300000>;
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_eth_vbus>;
        gpio = <&gpio5 13 GPIO_ACTIVE_HIGH>;
        enable-active-high;
    };
	
	manipulator: adc-joystick {
		compatible = "adc-joystick";
		io-channels = <&ext_adc1 0>;
		poll-interval = <10>;
		#address-cells = <1>;
		#size-cells = <0>;

		axis@0 {
			reg = <0>;
			abs-flat = <50>;
			abs-fuzz = <30>;
			abs-range = <0 4096>;
			linux,code = <ABS_X>;
		};
	};

	joystick-keys {
		compatible = "gpio-keys";
		status = "okay";
		pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_keys>;
        autorepeat;

	    key1 {
			label = "BTN-1";
			gpios = <&gpio2 0 GPIO_ACTIVE_LOW>;
			linux,code = <BTN_1>;
		    autorepeat;
		};
	    key2 {
			label = "BTN-2";
			gpios = <&gpio2 1 GPIO_ACTIVE_LOW>;
			linux,code = <BTN_2>;
			autorepeat;
		};		
	    key3 {
			label = "BTN-3";
			gpios = <&gpio2 2 GPIO_ACTIVE_LOW>;
			linux,code = <BTN_3>;
			autorepeat;
		};		
	    key4 {
			label = "BTN-4";
			gpios = <&gpio2 3 GPIO_ACTIVE_LOW>;
			linux,code = <BTN_4>;
			autorepeat;
		};		
	    key5 {
			label = "BTN-5";
			gpios = <&gpio2 4 GPIO_ACTIVE_LOW>;
			linux,code = <BTN_5>;
			autorepeat;
		};		                
	};
	
    leds {
        compatible = "gpio-leds";
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_gpio_leds>;

        led10 {
            label = "HEARTBEAT";
            function = LED_FUNCTION_HEARTBEAT;
            color = <LED_COLOR_ID_GREEN>;
            gpios = <&gpio3 17 GPIO_ACTIVE_HIGH>;
            linux,default-trigger = "heartbeat";
        };
        
        led11 {
            label = "STATUS";
            function = LED_FUNCTION_STATUS;
            color = <LED_COLOR_ID_GREEN>;
            gpios = <&gpio3 16 GPIO_ACTIVE_HIGH>;
        };
        
        led12 {
            label = "COMM";
            function = LED_FUNCTION_LAN;
            color = <LED_COLOR_ID_GREEN>;
            gpios = <&gpio3 14 GPIO_ACTIVE_HIGH>;
        };

        led13 {
            label = "FAULT";
            function = LED_FUNCTION_FAULT ;
            color = <LED_COLOR_ID_RED>;
            gpios = <&gpio3 12 GPIO_ACTIVE_HIGH>;
        };
    };
    
    DINK-1 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_dink1>;
        compatible = "interrupt-counter";
        gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
    };
    
    DINK-2 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_dink2>;
        compatible = "interrupt-counter";
        gpios = <&gpio3 21 GPIO_ACTIVE_HIGH>;
    };
    
    DINK-3 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_dink3>;
        compatible = "interrupt-counter";
        gpios = <&gpio6 19 GPIO_ACTIVE_HIGH>;
    };
    
    DINK-4 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_dink4>;
        compatible = "interrupt-counter";
        gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>;
    };
    
    DINK-5 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_dink5>;
        compatible = "interrupt-counter";
        gpios = <&gpio1 6 GPIO_ACTIVE_HIGH>;
    };
    
    DINK-6 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_dink6>;
        compatible = "interrupt-counter";
        gpios = <&gpio6 20 GPIO_ACTIVE_HIGH>;
    };
};

&ecspi1 {
    pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_ecspi1 &pinctrl_ecspi1_cs>;
	cs-gpios =  <&gpio1 2 GPIO_ACTIVE_LOW>,
                <&gpio4 19 GPIO_ACTIVE_LOW>,
                <&gpio4 15 GPIO_ACTIVE_LOW>,
                <&gpio6 12 GPIO_ACTIVE_LOW>,
                <&gpio5 0 GPIO_ACTIVE_LOW>;
    status = "okay";

	ext_adc1: adc@0 {
        compatible = "microchip,mcp3208";
        reg = <0>;
        
        spi-cpha;
        spi-cpol;
        spi-max-frequency = <100000>;
        
        vref-supply = <&reg_3v3>;

		#address-cells = <1>;
		#size-cells = <0>;
		#io-channel-cells = <1>;
		
	    channel@0 {
			reg = <0>;
            label = "Ex +12V";
		};
	    channel@1 {
			reg = <1>;
            label = "AINK_UP6";
		};
	    channel@2 {
			reg = <2>;
            label = "AINK_UP5";
		};
	    channel@3 {
			reg = <3>;
            label = "-";
		};
	    channel@4 {
			reg = <4>;
            label = "AINK_UP4";
		};
	    channel@5 {
			reg = <5>;
            label = "AINK_UP3";
		};
	    channel@6 {
			reg = <6>;
            label = "AINK_UP2";
		};
        channel@7 {
			reg = <7>;
            label = "AINK_UP1";
		};
	};
	
	ext_adc2: adc@1 {
        compatible = "microchip,mcp3208";
        reg = <1>;
        
        spi-cpha;
        spi-cpol;
        spi-max-frequency = <100000>;
        
        vref-supply = <&reg_3v3>;

		#address-cells = <1>;
		#size-cells = <0>;
		#io-channel-cells = <1>;
		
	    channel@0 {
			reg = <0>;
            label = "Ex +12V";
		};
	    channel@1 {
			reg = <1>;
            label = "AINK_UP6";
		};
	    channel@2 {
			reg = <2>;
            label = "AINK_UP5";
		};
	    channel@3 {
			reg = <3>;
            label = "-";
		};
	    channel@4 {
			reg = <4>;
            label = "AINK_UP4";
		};
	    channel@5 {
			reg = <5>;
            label = "AINK_UP3";
		};
	    channel@6 {
			reg = <6>;
            label = "AINK_UP2";
		};
        channel@7 {
			reg = <7>;
            label = "AINK_UP1";
		};
	};
};

&fec1 {
	status = "okay";
};

&fec2 {
    pinctrl-names = "default", "sleep";
    pinctrl-0 = <&pinctrl_enet2>;
    pinctrl-1 = <&pinctrl_enet2_sleep>;
	
	clocks = <&clks IMX7D_ENET2_IPG_ROOT_CLK>,
			 <&clks IMX7D_ENET_AXI_ROOT_CLK>,
			 <&clks IMX7D_ENET2_TIME_ROOT_CLK>,
			 <&clks IMX7D_PLL_ENET_MAIN_50M_CLK>;
	clock-names = "ipg", "ahb", "ptp", "enet_clk_ref";
	assigned-clocks = 	<&clks IMX7D_ENET2_TIME_ROOT_SRC>,
	       				<&clks IMX7D_ENET2_TIME_ROOT_CLK> ;
	assigned-clock-parents = <&clks IMX7D_PLL_ENET_MAIN_100M_CLK>;
	assigned-clock-rates = <0>, <100000000>;
	
	phy-mode = "rmii";
	phy-handle = <&ethphy1>;
	phy-supply = <&pinctrl_eth_vbus>;
	phy-reset-gpios = <&gpio2 30 GPIO_ACTIVE_LOW>;
	phy-reset-duration = <500>;
	phy-reset-post-delay = <100>;
	
	fsl,magic-packet;
	fsl,mii-exclusive;
	
	nvmem-cells = <&eth1_macaddr>;
    nvmem-cell-names = "mac-address";
    
	status = "okay";

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

		ethphy1: ethernet-phy@1 {
			compatible = "ethernet-phy-ieee802.3-c22";
			reg = <1>;
		};
	};
};

&flexcan1 {
    xceiver-supply = <&reg_3v3>;
    status = "okay";
};

&i2c2 {
	clock-frequency = <100000>;
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_i2c2>;
	scl-gpios = <&gpio4 10 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
	sda-gpios = <&gpio4 11 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;

	clock-frequency = <100000>;
	status = "okay";
};

&i2c4 {
	clock-frequency = <100000>;
	status = "okay";

	rtc@6f {
		compatible = "microchip,mcp7940x";
		reg = <0x6F>;
	}; 

    eeprom@52 {
        compatible = "microchip,24c02","atmel,24c02"; /* microchip 24AA025E48 */
        reg = <0x52>;
        #address-cells = <1>;
        #size-cells = <1>;
        vcc-supply = <&reg_3v3>;
        
        eth0_macaddr: eth0_macaddr {
            reg = <0xFA 0x06>;
        };
    }; 

    eeprom@53 {
        compatible = "microchip,24c02","atmel,24c02"; /* microchip 24AA025E48 */
        reg = <0x53>;
        #address-cells = <1>;
        #size-cells = <1>;
        vcc-supply = <&reg_3v3>;
        
        eth1_macaddr: eth1_macaddr {
            reg = <0xFA 0x06>;
        };
    };
};

&uart1 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_uart1>;
	uart-has-rtscts;
	fsl,dte-mode;
    status = "okay";
};

&uart2 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_uart2>;
    uart-has-rtscts;
    linux,rs485-enabled-at-boot-time;
	status = "okay";
};

&usbotg1 {
	status = "okay";
};

&usbotg2 {
    pinctrl-names = "default";
    vbus-supply = <&reg_usbh_vbus>;
    status = "okay";
};

&usdhc1 {
	max-frequency = <4000000>; /* Ex 4 MHz */
	vmmc-supply = <&reg_3v3>;
	disable-wp;
	status = "okay";
};


&gpio1 {
	gpio-line-names = "SODIMM_43",
			  "SODIMM_45",
			  "SODIMM_135",
			  "SODIMM_22",
			  "",
			  "",
			  "DINK_UP5",
			  "DINK_UP4",
			  "SODIMM_59",
			  "OUT_UP1",
			  "OUT_UP2",
			  "SODIMM_67",
			  "",
			  "",
			  "ENET2_MDIO",
			  "ENET2_MDC";
};

&gpio2 {
	gpio-line-names = "JSTIN_UP1",
			  "JSTIN_UP2",
			  "JSTIN_UP3",
			  "JSTIN_UP4",
			  "JSTIN_UP5",
			  "OUT_B2",
			  "FLT_B",
			  "TEST_OB",
			  "SODIMM_91",
			  "SODIMM_89",
			  "SODIMM_105",
			  "SODIMM_152",
			  "SODIMM_150",
			  "SODIMM_95",
			  "SODIMM_126",
			  "SODIMM_107",
			  "ENET2_RGMII_RD0",
			  "ENET2_RGMII_RD1",
			  "SODIMM_118",
			  "SODIMM_120",
			  "ENET2_RGMII_RX_CTL",
			  "ENET2_RX_ER",
			  "ENET2_RGMII_TD0",
			  "ENET2_RGMII_TD1",
			  "SODIMM_132",
			  "SODIMM_134",
			  "SODIMM_133",
			  "SODIMM_104",
			  "ENET2_TX_CLK",
			  "SODIMM_110",
			  "ENET2_RST",
			  "SODIMM_128";
};

&gpio3 {
	gpio-line-names = "SODIMM_56",
			  "SODIMM_44",
			  "SODIMM_68",
			  "SODIMM_82",
			  "SODIMM_93",
			  "SODIMM_76",
			  "SODIMM_70",
			  "SODIMM_60",
			  "SODIMM_58",
			  "SODIMM_78",
			  "SODIMM_72",
			  "SODIMM_80",
			  "FAULT",
			  "SODIMM_62",
			  "COMM",
			  "SODIMM_74",
			  "STATUS",
			  "HEARTBEAT",
			  "SODIMM_54",
			  "SODIMM_66",
			  "SODIMM_64",
			  "DINK_UP2",
			  "DINK_UP1",
			  "SODIMM_136",
			  "SODIMM_138",
			  "DAIN1_UP",
			  "DAIN2_UP",
			  "DAIN3_UP",
			  "DAIN4_UP";
};

&gpio4 {
	gpio-line-names = "SODIMM_35",
			  "SODIMM_33",
			  "SODIMM_38",
			  "SODIMM_36",
			  "OUT_UP3",
			  "OUT_UP5",
			  "SODIMM_131",
			  "SODIMM_129",
			  "SODIMM_90",
			  "SODIMM_92",
			  "I2C2_SCL",
			  "I2C2_SDA",
			  "SODIMM_81",
			  "SODIMM_94",
			  "SODIMM_96",
			  "SPI_CS1",
			  "ECSPI1_SCLK",
			  "ECSPI1_MOSI",
			  "ECSPI1_MISO",
			  "SODIMM_97",
			  "SODIMM_67",
			  "SODIMM_59",
			  "SODIMM_85",
			  "OUT_UP6";
};

&gpio5 {
	gpio-line-names = "SPI_CS3",
			  "OUT_UP4",
			  "SODIMM_73",
			  "SODIMM_47",
			  "SODIMM_190",
			  "SODIMM_192",
			  "SODIMM_49",
			  "SODIMM_51",
			  "SODIMM_53",
			  "",
			  "",
			  "SODIMM_98",
			  "SODIMM_184",
			  "ENABLE_+3V3_ETHETNET",
			  "SODIMM_23",
			  "SODIMM_31",
			  "SODIMM_100",
			  "SODIMM_102";
};

&gpio6 {
	gpio-line-names = "",
			  "",
			  "",
			  "",
			  "",
			  "",
			  "",
			  "",
			  "",
			  "",
			  "",
			  "",
			  "SPI_CS2",
			  "OUT_B1",
			  "",
			  "OB_UP",
			  "SODIMM_77",
			  "SODIMM_24",
			  "",
			  "DINK_UP3",
			  "DINK_UP6",
			  "SODIMM_32",
			  "SODIMM_34";
};

&gpio7 {
	gpio-line-names = "",
			  "",
			  "SODIMM_63",
			  "SODIMM_55",
			  "",
			  "",
			  "",
			  "",
			  "SODIMM_196",
			  "SODIMM_194",
			  "",
			  "SODIMM_99",
			  "",
			  "",
			  "SODIMM_137";
};

&iomuxc {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_gpio1 &pinctrl_gpio2 &pinctrl_gpio3 &pinctrl_gpio4
		     &pinctrl_usbc_det>;

	pinctrl_gpio1: gpio1-grp {
		fsl,pins = <
		    MX7D_PAD_GPIO1_IO09__GPIO1_IO9      0x14 /* SODIMM 28 - OUT_UP1 */                      
		    MX7D_PAD_GPIO1_IO10__GPIO1_IO10     0x14 /* SODIMM 30 - OUT_UP2 */
			MX7D_PAD_SAI1_RX_SYNC__GPIO6_IO16	0x14 /* SODIMM 77 */
			MX7D_PAD_EPDC_DATA09__GPIO2_IO9		0x14 /* SODIMM 89 */
			MX7D_PAD_EPDC_DATA08__GPIO2_IO8		0x74 /* SODIMM 91 */
			MX7D_PAD_LCD_RESET__GPIO3_IO4		0x14 /* SODIMM 93 */
			MX7D_PAD_EPDC_DATA13__GPIO2_IO13	0x14 /* SODIMM 95 */
			MX7D_PAD_ENET1_RGMII_TXC__GPIO7_IO11	0x14 /* SODIMM 99 */
			MX7D_PAD_EPDC_DATA10__GPIO2_IO10	0x74 /* SODIMM 105 */
			MX7D_PAD_EPDC_DATA05__GPIO2_IO5		0x14 /* SODIMM 121 - OUT_B2 */
			MX7D_PAD_EPDC_DATA06__GPIO2_IO6		0x14 /* SODIMM 123 - FLT_B */
			MX7D_PAD_EPDC_DATA07__GPIO2_IO7		0x14 /* SODIMM 125 - TEST_OB */
			MX7D_PAD_EPDC_SDCE2__GPIO2_IO22		0x14 /* SODIMM 127 */
			MX7D_PAD_UART3_RTS_B__GPIO4_IO6		0x14 /* SODIMM 131 */
			MX7D_PAD_EPDC_GDRL__GPIO2_IO26		0x14 /* SODIMM 133 */
			MX7D_PAD_SAI1_RX_BCLK__GPIO6_IO17	0x14 /* SODIMM 24 */
			MX7D_PAD_SD2_DATA2__GPIO5_IO16		0x14 /* SODIMM 100 */
			MX7D_PAD_SD2_DATA3__GPIO5_IO17		0x14 /* SODIMM 102 */
			MX7D_PAD_EPDC_GDSP__GPIO2_IO27		0x14 /* SODIMM 104 */
			MX7D_PAD_EPDC_BDR1__GPIO2_IO29		0x14 /* SODIMM 110 */
			MX7D_PAD_EPDC_PWR_COM__GPIO2_IO30	0x14 /* SODIMM 112 */
			MX7D_PAD_EPDC_SDOE__GPIO2_IO18		0x14 /* SODIMM 118 */
			MX7D_PAD_EPDC_SDSHR__GPIO2_IO19		0x14 /* SODIMM 120 */
			MX7D_PAD_EPDC_DATA14__GPIO2_IO14	0x14 /* SODIMM 126 */
			MX7D_PAD_EPDC_PWR_STAT__GPIO2_IO31	0x14 /* SODIMM 128 */
			MX7D_PAD_EPDC_GDCLK__GPIO2_IO24		0x14 /* SODIMM 132 */
			MX7D_PAD_EPDC_GDOE__GPIO2_IO25		0x14 /* SODIMM 134 */
			MX7D_PAD_EPDC_DATA12__GPIO2_IO12	0x14 /* SODIMM 150 */
			MX7D_PAD_EPDC_DATA11__GPIO2_IO11	0x14 /* SODIMM 152 */
			MX7D_PAD_SD2_CLK__GPIO5_IO12		0x14 /* SODIMM 184 */
		>;
	};

	pinctrl_gpio2: gpio2-grp { /* On X22 Camera interface */
		fsl,pins = <
			MX7D_PAD_ECSPI2_SS0__GPIO4_IO23		0x14 /* SODIMM 65 - OUT_UP6 */
			MX7D_PAD_I2C3_SCL__GPIO4_IO12		0x14 /* SODIMM 81 */
			MX7D_PAD_ECSPI2_MISO__GPIO4_IO22	0x14 /* SODIMM 85 */
			/* MX7D_PAD_ECSPI1_SS0__GPIO4_IO19		0x14 /* SODIMM 97 */
			MX7D_PAD_I2C3_SDA__GPIO4_IO13		0x14 /* SODIMM 94 */
			MX7D_PAD_I2C4_SCL__GPIO4_IO14		0x14 /* SODIMM 96 */
			MX7D_PAD_SD2_RESET_B__GPIO5_IO11	0x14 /* SODIMM 98 */
		>;
	};

	pinctrl_gpio3: gpio3-grp { /* LCD 18-23 */
		fsl,pins = <             
			MX7D_PAD_LCD_DATA18__GPIO3_IO23		0x14 /* SODIMM 136 */
			MX7D_PAD_LCD_DATA19__GPIO3_IO24		0x14 /* SODIMM 138 */
			MX7D_PAD_LCD_DATA20__GPIO3_IO25		0x14 /* SODIMM 140 - DAIN1_UP */
			MX7D_PAD_LCD_DATA21__GPIO3_IO26		0x14 /* SODIMM 142 - DAIN2_UP */
			MX7D_PAD_LCD_DATA22__GPIO3_IO27		0x74 /* SODIMM 144 - DAIN3_UP */
			MX7D_PAD_LCD_DATA23__GPIO3_IO28		0x74 /* SODIMM 146 - DAIN4_UP */
		>;
	};

	pinctrl_gpio4: gpio4-grp { /* Alternatively CAN2 */
		fsl,pins = <
		    MX7D_PAD_UART3_RX_DATA__GPIO4_IO4  0x74 /* SODIMM 21 - OUT_UP3 */ 
		    MX7D_PAD_UART3_TX_DATA__GPIO4_IO5  0x74 /* SODIMM 19 - OUT_UP5 */                          
		>;
	};
	
	pinctrl_gpio5: gpio6-grp {
		fsl,pins = <	
	        MX7D_PAD_SD1_WP__GPIO5_IO1     /* SODIMM 71 - OUT_UP3 */  
	    >;
	};                       

	pinctrl_gpio6: gpio6-grp {
		fsl,pins = <
		    MX7D_PAD_SAI1_TX_BCLK__GPIO6_IO13 0x74 /* SODIMM 157 - OUT_B1 */   
		    MX7D_PAD_SAI1_TX_DATA__GPIO6_IO15 0x74 /* SODIMM 163 - OB_UP */                                                       
		>;
	};
	
	pinctrl_uart1: uart1-grp {
		fsl,pins = <
			MX7D_PAD_UART1_TX_DATA__UART1_DTE_RX	0x79
			MX7D_PAD_UART1_RX_DATA__UART1_DTE_TX	0x79
		>;
	};
	
    pinctrl_gpio_leds: led-grp {
        fsl,pins = <
            MX7D_PAD_LCD_DATA12__GPIO3_IO17 0x17099  /* SODIMM 52 - HEARTBEAT */
            MX7D_PAD_LCD_DATA11__GPIO3_IO16 0x17099  /* SODIMM 50 - STATUS */
            MX7D_PAD_LCD_DATA09__GPIO3_IO14 0x17099  /* SODIMM 48 - COMM */
            MX7D_PAD_LCD_DATA07__GPIO3_IO12 0x17099  /* SODIMM 46 - FAULT */                 
        >;
    };
    
    pinctrl_keys: keys-grp {
		fsl,pins = <
			MX7D_PAD_EPDC_DATA00__GPIO2_IO0		0x14 /* SODIMM 111 - JSTIN_UP1 */
			MX7D_PAD_EPDC_DATA01__GPIO2_IO1		0x14 /* SODIMM 113 - JSTIN_UP2 */
			MX7D_PAD_EPDC_DATA02__GPIO2_IO2		0x14 /* SODIMM 115 - JSTIN_UP3 */
			MX7D_PAD_EPDC_DATA03__GPIO2_IO3		0x14 /* SODIMM 117 - JSTIN_UP4 */
			MX7D_PAD_EPDC_DATA04__GPIO2_IO4		0x14 /* SODIMM 119 - JSTIN_UP5 */
		>;
	};
    
    pinctrl_i2c2: i2c2-grp {
		fsl,pins = <
			MX7D_PAD_I2C2_SDA__I2C2_SDA         0x4000007f /* SODIMM 86 */
			MX7D_PAD_I2C2_SCL__I2C2_SCL         0x4000007f /* SODIMM 88 */
		>;
	};

	pinctrl_enet2: enet2grp {
		fsl,pins = <		
			MX7D_PAD_GPIO1_IO14__ENET2_MDIO	        0x1b0b0  /* SODIMM 188 */
			MX7D_PAD_GPIO1_IO15__ENET2_MDC          0x1b0b0  /* SODIMM 178 */
		
			MX7D_PAD_EPDC_SDCE0__ENET2_RGMII_RX_CTL	0x73 /* SODIMM 122 */
			MX7D_PAD_EPDC_SDCLK__ENET2_RGMII_RD0	0x73 /* SODIMM 114 */
			MX7D_PAD_EPDC_SDLE__ENET2_RGMII_RD1	    0x73 /* SODIMM 116 */
			MX7D_PAD_EPDC_SDCE1__ENET2_RX_ER		0x73 /* SODIMM 124 */

			MX7D_PAD_EPDC_GDRL__ENET2_RGMII_TX_CTL	0x73 /* SODIMM 133 */
			MX7D_PAD_EPDC_SDCE2__ENET2_RGMII_TD0	0x73 /* SODIMM 127 */
			MX7D_PAD_EPDC_SDCE3__ENET2_RGMII_TD1	0x73 /* SODIMM 130 */
			MX7D_PAD_EPDC_BDR0__CCM_ENET_REF_CLK2   0x40000073 /* SODIMM 106 */
			
			MX7D_PAD_EPDC_PWR_COM__GPIO2_IO30       0x73 /* SODIMM 112 - RST */
		>;
	};
	
    pinctrl_enet2_sleep: enet2sleepgrp {
        fsl,pins = <
            MX7D_PAD_GPIO1_IO14__GPIO1_IO14       0x0
            MX7D_PAD_GPIO1_IO15__GPIO1_IO15       0x0

            MX7D_PAD_EPDC_SDCE0__GPIO2_IO20       0x0
            MX7D_PAD_EPDC_SDCLK__GPIO2_IO16       0x0
            MX7D_PAD_EPDC_SDLE__GPIO2_IO17        0x0
            MX7D_PAD_EPDC_SDCE1__GPIO2_IO21       0x0

            MX7D_PAD_EPDC_GDRL__GPIO2_IO26        0x0
            MX7D_PAD_EPDC_SDCE2__GPIO2_IO22       0x0
            MX7D_PAD_EPDC_SDCE3__GPIO2_IO23       0x0
            MX7D_PAD_EPDC_BDR0__GPIO2_IO28        0x0
        >;
    };

    pinctrl_eth_vbus: eth_vbus_grp {
		fsl,pins = <
			MX7D_PAD_SD2_CMD__GPIO5_IO13		0x14 /* SODIMM 186 - ENABLE_+3V3_ETHETNET */
		>;
	};

	pinctrl_ecspi1: ecspi1-grp {
		fsl,pins = <
			MX7D_PAD_ECSPI1_MISO__ECSPI1_MISO   0x2 /* SODIMM 79  */
			MX7D_PAD_ECSPI1_MOSI__ECSPI1_MOSI   0x2 /* SODIMM 103 */
			MX7D_PAD_ECSPI1_SCLK__ECSPI1_SCLK   0x2 /* SODIMM 101 */
		>;
	};

	pinctrl_ecspi1_cs: ecspi1-cs-grp {
		fsl,pins = <
            MX7D_PAD_LPSR_GPIO1_IO02__GPIO1_IO2 0x14 /* SODIMM 135 - TEST CS1 */
			MX7D_PAD_ECSPI1_SS0__GPIO4_IO19		0x14 /* SODIMM 97  - test CS2 */
		
		    MX7D_PAD_I2C4_SDA__GPIO4_IO15		0x14 /* SODIMM 75  - SPI_CS1 */
			MX7D_PAD_SAI1_RX_DATA__GPIO6_IO12	0x14 /* SODIMM 169 - SPI_CS2 */
			MX7D_PAD_SD1_CD_B__GPIO5_IO0        0x14 /* SODIMM 69  - SPI_CS3 */  
		>;
	};
	
	pinctrl_dink1: dink1-grp {
		fsl,pins = <
		    MX7D_PAD_LCD_DATA17__GPIO3_IO22     0x14 /* SODIMM 61  - DINK_UP1 */  
		>;
	};
	
	pinctrl_dink2: dink2-grp {
		fsl,pins = <
		    MX7D_PAD_LCD_DATA16__GPIO3_IO21     0x14 /* SODIMM 57  - DINK_UP2 */      
		>;
	};

	pinctrl_dink3: dink3-grp {
		fsl,pins = <
		    MX7D_PAD_SAI2_TX_SYNC__GPIO6_IO19 0x74 /* SODIMM 25  - DINK_UP3 */     
		>;
	};
	
	pinctrl_dink6: dink6-grp {
		fsl,pins = <
		    MX7D_PAD_SAI2_TX_BCLK__GPIO6_IO20 0x74 /* SODIMM 27  - DINK_UP6 */
		>;
	};
};

&iomuxc_lpsr {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_gpio_lpsr>;

	pinctrl_gpio_lpsr: gpio1-grp {
		fsl,pins = <
			/* MX7D_PAD_LPSR_GPIO1_IO02__GPIO1_IO2	0x59 */
			MX7D_PAD_LPSR_GPIO1_IO03__GPIO1_IO3	0x59               
		>;
	};
	
	pinctrl_dink4: dink4-grp {
		fsl,pins = <
			MX7D_PAD_LPSR_GPIO1_IO07__GPIO1_IO7 0x73 /* SODIMM 29 - DINK_UP4 */
		>;
	};

	pinctrl_dink5: dink5-grp {
		fsl,pins = <
			MX7D_PAD_LPSR_GPIO1_IO06__GPIO1_IO6 0x73 /* SODIMM 37 - DINK_UP5 */     
		>;
	};
};

/delete-node/ &bl;

And the final.dts file

/dts-v1/;
#include "imx7d-colibri-emmc.dtsi"
#include "kk01_mb_01-ver1.0.dtsi"

/ {
    model = "KK-01";
    hw_rev = "1.0";
    compatible = "toradex,colibri-imx7d-emmc", "fsl,imx7d";
};

Hi @qba,

so you can see no clock with the OSC on the clock line ?
I see you connected the clock to ref input. on our some we use the X1 input and do not connect the ref.

Best Regards,

Matthias

Hi @qba

What is the reason for 0x40000073, what do you want to achieve with 0x40000000?

MX7D_PAD_EPDC_BDR0__CCM_ENET_REF_CLK2   0x40000073 /* SODIMM 106 */

What if you change it to:

MX7D_PAD_EPDC_BDR0__CCM_ENET_REF_CLK2   0x73 /* SODIMM 106 */

Will it output the clock again?

Regards,
Stefan

Hello

What is the reason for 0x40000073, what do you want to achieve with 0x40000000

The reason was to set SION bit to get clock signal on output as in this thread:

No matter the value was 0x40000073 or 0x73 I had no clock output on SODIMM 106 pin. Only for a little time on boot with mentioned in first post patch.
We have designed 3 other devices with two active fec controllers with imx6ULL and without need to use external oscillators to drive PHY ics

Finally, after reading iMX7-colibri errata we decided to use external 50MHz oscillator like on Colibri board.

Here is the current device-tree fec2 node that works with ext 50MHz oscillator:

&fec2 {
    pinctrl-names = "default", "sleep";
    pinctrl-0 = <&pinctrl_enet2>;
    pinctrl-1 = <&pinctrl_enet2_sleep>;
	
    clocks = <&clks IMX7D_ENET_AXI_ROOT_CLK>,
		<&clks IMX7D_ENET_AXI_ROOT_CLK>,
		<&clks IMX7D_ENET2_TIME_ROOT_CLK>,
		<&clks IMX7D_PLL_ENET_MAIN_50M_CLK>;
	clock-names = "ipg", "ahb", "ptp", "enet_clk_ref";
	assigned-clocks = <&clks IMX7D_ENET2_TIME_ROOT_SRC>,
			  <&clks IMX7D_ENET2_TIME_ROOT_CLK>;
	assigned-clock-parents = <&clks IMX7D_PLL_ENET_MAIN_100M_CLK>;
	assigned-clock-rates = <0>, <100000000>;
	
	phy-mode = "rmii";
	phy-handle = <&ethphy1>;
	phy-supply = <&reg_eth_vbus>;
	phy-reset-gpios = <&gpio2 30 GPIO_ACTIVE_LOW>;
	phy-reset-duration = <500>;
	phy-reset-post-delay = <100>;
	
	fsl,magic-packet;
	fsl,mii-exclusive;
	
	nvmem-cells = <&eth1_macaddr>;
    nvmem-cell-names = "mac-address";
    
	status = "okay";

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

		ethphy1: ethernet-phy@1 {
			compatible = "ethernet-phy-ieee802.3-c22";
			reg = <1>;
		};
	};
};

	pinctrl_enet2: enet2grp {
		fsl,pins = <		
			MX7D_PAD_GPIO1_IO14__ENET2_MDIO	        0x1b0b0  /* SODIMM 188 */
			MX7D_PAD_GPIO1_IO15__ENET2_MDC          0x1b0b0  /* SODIMM 178 */
		
			MX7D_PAD_EPDC_SDCE0__ENET2_RGMII_RX_CTL	0x73 /* SODIMM 122 */
			MX7D_PAD_EPDC_SDCLK__ENET2_RGMII_RD0	0x73 /* SODIMM 114 */
			MX7D_PAD_EPDC_SDLE__ENET2_RGMII_RD1	    0x73 /* SODIMM 116 */
			MX7D_PAD_EPDC_SDCE1__ENET2_RX_ER		0x73 /* SODIMM 124 */

			MX7D_PAD_EPDC_GDRL__ENET2_RGMII_TX_CTL	0x73 /* SODIMM 133 */
			MX7D_PAD_EPDC_SDCE2__ENET2_RGMII_TD0	0x73 /* SODIMM 127 */
			MX7D_PAD_EPDC_SDCE3__ENET2_RGMII_TD1	0x73 /* SODIMM 130 */
			MX7D_PAD_EPDC_BDR0__CCM_ENET_REF_CLK2   0x73 /* SODIMM 106 */
			
			MX7D_PAD_EPDC_PWR_COM__GPIO2_IO30       0x73 /* SODIMM 112 - RST */
		>;
	};
	
    pinctrl_enet2_sleep: enet2sleepgrp {
        fsl,pins = <
            MX7D_PAD_GPIO1_IO14__GPIO1_IO14       0x0
            MX7D_PAD_GPIO1_IO15__GPIO1_IO15       0x0

            MX7D_PAD_EPDC_SDCE0__GPIO2_IO20       0x0
            MX7D_PAD_EPDC_SDCLK__GPIO2_IO16       0x0
            MX7D_PAD_EPDC_SDLE__GPIO2_IO17        0x0
            MX7D_PAD_EPDC_SDCE1__GPIO2_IO21       0x0

            MX7D_PAD_EPDC_GDRL__GPIO2_IO26        0x0
            MX7D_PAD_EPDC_SDCE2__GPIO2_IO22       0x0
            MX7D_PAD_EPDC_SDCE3__GPIO2_IO23       0x0
            MX7D_PAD_EPDC_BDR0__GPIO2_IO28        0x0
        >;
    };

I will mark this message as solution because fec2 finally works in our device