Merge tag 'ti-v2021.10-rc2' of https://source.denx.de/u-boot/custodians/u-boot-ti
authorTom Rini <trini@konsulko.com>
Thu, 29 Jul 2021 12:20:06 +0000 (08:20 -0400)
committerTom Rini <trini@konsulko.com>
Thu, 29 Jul 2021 12:20:06 +0000 (08:20 -0400)
- Add MMC High speed modes for AM64 and J7200
- Add Sierra/Torrent SERDES driver
- Minor clean-ups for R5F boot from SPL

55 files changed:
arch/arm/dts/Makefile
arch/arm/dts/am335x-bone-common.dtsi
arch/arm/dts/am335x-bone.dts
arch/arm/dts/am335x-boneblack-common.dtsi [new file with mode: 0644]
arch/arm/dts/am335x-boneblack.dts
arch/arm/dts/am335x-bonegreen-common.dtsi [new file with mode: 0644]
arch/arm/dts/am335x-bonegreen.dts
arch/arm/dts/am335x-sancloud-bbe.dts [new file with mode: 0644]
arch/arm/dts/k3-am642-sk-u-boot.dtsi
arch/arm/dts/k3-am654-base-board-u-boot.dtsi
arch/arm/dts/k3-j7200-common-proc-board-u-boot.dtsi
arch/arm/dts/k3-j7200-common-proc-board.dts
arch/arm/dts/k3-j7200-main.dtsi
arch/arm/dts/k3-j721e-common-proc-board-u-boot.dtsi
arch/arm/dts/k3-j721e-r5-common-proc-board-u-boot.dtsi
arch/arm/dts/k3-j721e-r5-common-proc-board.dts
arch/arm/mach-k3/am642_init.c
arch/arm/mach-k3/common.c
arch/arm/mach-k3/common.h
arch/arm/mach-k3/j721e_init.c
board/ti/am335x/board.c
board/ti/j721e/README [deleted file]
board/ti/j721e/evm.c
board/ti/ks2_evm/mux-k2g.h
configs/am335x_evm_defconfig
configs/am64x_evm_a53_defconfig
configs/am64x_evm_r5_defconfig
configs/j7200_evm_a72_defconfig
configs/j7200_evm_r5_defconfig
configs/j721e_evm_a72_defconfig
configs/j721e_evm_r5_defconfig
doc/board/index.rst
doc/board/ti/j721e_evm.rst [new file with mode: 0644]
drivers/core/ofnode.c
drivers/mmc/am654_sdhci.c
drivers/mmc/sdhci.c
drivers/phy/Kconfig
drivers/phy/Makefile
drivers/phy/cadence/Kconfig [new file with mode: 0644]
drivers/phy/cadence/Makefile [new file with mode: 0644]
drivers/phy/cadence/phy-cadence-sierra.c [new file with mode: 0644]
drivers/phy/cadence/phy-cadence-torrent.c [new file with mode: 0644]
drivers/phy/ti/Kconfig [new file with mode: 0644]
drivers/phy/ti/Makefile [new file with mode: 0644]
drivers/phy/ti/phy-j721e-wiz.c [new file with mode: 0644]
include/configs/am64x_evm.h
include/configs/j721e_evm.h
include/dm/ofnode.h
include/dt-bindings/mux/ti-serdes.h
include/dt-bindings/phy/phy-cadence.h [new file with mode: 0644]
include/dt-bindings/phy/phy-ti.h [new file with mode: 0644]
include/dt-bindings/phy/phy.h
include/dt-bindings/pinctrl/am33xx.h
include/dt-bindings/pinctrl/omap.h
test/dm/core.c

index 3941a08..537c96b 100644 (file)
@@ -366,6 +366,7 @@ dtb-$(CONFIG_AM33XX) += \
        am335x-pocketbeagle.dtb \
        am335x-pxm50.dtb \
        am335x-rut.dtb \
+       am335x-sancloud-bbe.dtb \
        am335x-shc.dtb \
        am335x-pdu001.dtb \
        am335x-chiliboard.dtb \
index 8dcfac3..35ec1a8 100644 (file)
@@ -1,9 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
+ * Copyright (C) 2012 Texas Instruments Incorporated - https://www.ti.com/
  */
 
 / {
                };
        };
 
+       memory@80000000 {
+               device_type = "memory";
+               reg = <0x80000000 0x10000000>; /* 256 MB */
+       };
+
        chosen {
                stdout-path = &uart0;
                tick-timer = &timer2;
        };
 
-       memory {
-               device_type = "memory";
-               reg = <0x80000000 0x10000000>; /* 256 MB */
-       };
-
        leds {
                pinctrl-names = "default";
                pinctrl-0 = <&user_leds_s0>;
 
                compatible = "gpio-leds";
 
-               led@2 {
+               led2 {
                        label = "beaglebone:green:heartbeat";
                        gpios = <&gpio1 21 GPIO_ACTIVE_HIGH>;
                        linux,default-trigger = "heartbeat";
                        default-state = "off";
                };
 
-               led@3 {
+               led3 {
                        label = "beaglebone:green:mmc0";
                        gpios = <&gpio1 22 GPIO_ACTIVE_HIGH>;
                        linux,default-trigger = "mmc0";
                        default-state = "off";
                };
 
-               led@4 {
+               led4 {
                        label = "beaglebone:green:usr2";
                        gpios = <&gpio1 23 GPIO_ACTIVE_HIGH>;
                        linux,default-trigger = "cpu0";
                        default-state = "off";
                };
 
-               led@5 {
+               led5 {
                        label = "beaglebone:green:usr3";
                        gpios = <&gpio1 24 GPIO_ACTIVE_HIGH>;
                        linux,default-trigger = "mmc1";
@@ -58,7 +55,7 @@
                };
        };
 
-       vmmcsd_fixed: fixedregulator@0 {
+       vmmcsd_fixed: fixedregulator0 {
                compatible = "regulator-fixed";
                regulator-name = "vmmcsd_fixed";
                regulator-min-microvolt = <3300000>;
 
        user_leds_s0: user_leds_s0 {
                pinctrl-single,pins = <
-                       0x54 (PIN_OUTPUT_PULLDOWN | MUX_MODE7)  /* gpmc_a5.gpio1_21 */
-                       0x58 (PIN_OUTPUT_PULLUP | MUX_MODE7)    /* gpmc_a6.gpio1_22 */
-                       0x5c (PIN_OUTPUT_PULLDOWN | MUX_MODE7)  /* gpmc_a7.gpio1_23 */
-                       0x60 (PIN_OUTPUT_PULLUP | MUX_MODE7)    /* gpmc_a8.gpio1_24 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_A5, PIN_OUTPUT_PULLDOWN, MUX_MODE7)      /* gpmc_a5.gpio1_21 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_A6, PIN_OUTPUT_PULLUP, MUX_MODE7)        /* gpmc_a6.gpio1_22 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_A7, PIN_OUTPUT_PULLDOWN, MUX_MODE7)      /* gpmc_a7.gpio1_23 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_A8, PIN_OUTPUT_PULLUP, MUX_MODE7)        /* gpmc_a8.gpio1_24 */
                >;
        };
 
        i2c0_pins: pinmux_i2c0_pins {
                pinctrl-single,pins = <
-                       0x188 (PIN_INPUT_PULLUP | MUX_MODE0)    /* i2c0_sda.i2c0_sda */
-                       0x18c (PIN_INPUT_PULLUP | MUX_MODE0)    /* i2c0_scl.i2c0_scl */
+                       AM33XX_PADCONF(AM335X_PIN_I2C0_SDA, PIN_INPUT_PULLUP, MUX_MODE0)        /* i2c0_sda.i2c0_sda */
+                       AM33XX_PADCONF(AM335X_PIN_I2C0_SCL, PIN_INPUT_PULLUP, MUX_MODE0)        /* i2c0_scl.i2c0_scl */
                >;
        };
 
        i2c2_pins: pinmux_i2c2_pins {
                pinctrl-single,pins = <
-                       0x178 (PIN_INPUT_PULLUP | MUX_MODE3)    /* uart1_ctsn.i2c2_sda */
-                       0x17c (PIN_INPUT_PULLUP | MUX_MODE3)    /* uart1_rtsn.i2c2_scl */
+                       AM33XX_PADCONF(AM335X_PIN_UART1_CTSN, PIN_INPUT_PULLUP, MUX_MODE3)      /* uart1_ctsn.i2c2_sda */
+                       AM33XX_PADCONF(AM335X_PIN_UART1_RTSN, PIN_INPUT_PULLUP, MUX_MODE3)      /* uart1_rtsn.i2c2_scl */
                >;
        };
 
        uart0_pins: pinmux_uart0_pins {
                pinctrl-single,pins = <
-                       0x170 (PIN_INPUT_PULLUP | MUX_MODE0)    /* uart0_rxd.uart0_rxd */
-                       0x174 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* uart0_txd.uart0_txd */
+                       AM33XX_PADCONF(AM335X_PIN_UART0_RXD, PIN_INPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_UART0_TXD, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
                >;
        };
 
        clkout2_pin: pinmux_clkout2_pin {
                pinctrl-single,pins = <
-                       0x1b4 (PIN_OUTPUT_PULLDOWN | MUX_MODE3) /* xdma_event_intr1.clkout2 */
+                       AM33XX_PADCONF(AM335X_PIN_XDMA_EVENT_INTR1, PIN_OUTPUT_PULLDOWN, MUX_MODE3)     /* xdma_event_intr1.clkout2 */
                >;
        };
 
        cpsw_default: cpsw_default {
                pinctrl-single,pins = <
                        /* Slave 1 */
-                       0x110 (PIN_INPUT_PULLUP | MUX_MODE0)    /* mii1_rxerr.mii1_rxerr */
-                       0x114 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txen.mii1_txen */
-                       0x118 (PIN_INPUT_PULLUP | MUX_MODE0)    /* mii1_rxdv.mii1_rxdv */
-                       0x11c (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd3.mii1_txd3 */
-                       0x120 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd2.mii1_txd2 */
-                       0x124 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd1.mii1_txd1 */
-                       0x128 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd0.mii1_txd0 */
-                       0x12c (PIN_INPUT_PULLUP | MUX_MODE0)    /* mii1_txclk.mii1_txclk */
-                       0x130 (PIN_INPUT_PULLUP | MUX_MODE0)    /* mii1_rxclk.mii1_rxclk */
-                       0x134 (PIN_INPUT_PULLUP | MUX_MODE0)    /* mii1_rxd3.mii1_rxd3 */
-                       0x138 (PIN_INPUT_PULLUP | MUX_MODE0)    /* mii1_rxd2.mii1_rxd2 */
-                       0x13c (PIN_INPUT_PULLUP | MUX_MODE0)    /* mii1_rxd1.mii1_rxd1 */
-                       0x140 (PIN_INPUT_PULLUP | MUX_MODE0)    /* mii1_rxd0.mii1_rxd0 */
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RX_ER, PIN_INPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TX_EN, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RX_DV, PIN_INPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TXD3, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TXD2, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TXD1, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TXD0, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TX_CLK, PIN_INPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RX_CLK, PIN_INPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RXD3, PIN_INPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RXD2, PIN_INPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RXD1, PIN_INPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RXD0, PIN_INPUT_PULLUP, MUX_MODE0)
                >;
        };
 
        cpsw_sleep: cpsw_sleep {
                pinctrl-single,pins = <
                        /* Slave 1 reset value */
-                       0x110 (PIN_INPUT_PULLDOWN | MUX_MODE7)
-                       0x114 (PIN_INPUT_PULLDOWN | MUX_MODE7)
-                       0x118 (PIN_INPUT_PULLDOWN | MUX_MODE7)
-                       0x11c (PIN_INPUT_PULLDOWN | MUX_MODE7)
-                       0x120 (PIN_INPUT_PULLDOWN | MUX_MODE7)
-                       0x124 (PIN_INPUT_PULLDOWN | MUX_MODE7)
-                       0x128 (PIN_INPUT_PULLDOWN | MUX_MODE7)
-                       0x12c (PIN_INPUT_PULLDOWN | MUX_MODE7)
-                       0x130 (PIN_INPUT_PULLDOWN | MUX_MODE7)
-                       0x134 (PIN_INPUT_PULLDOWN | MUX_MODE7)
-                       0x138 (PIN_INPUT_PULLDOWN | MUX_MODE7)
-                       0x13c (PIN_INPUT_PULLDOWN | MUX_MODE7)
-                       0x140 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RX_ER, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TX_EN, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RX_DV, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TXD3, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TXD2, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TXD1, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TXD0, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TX_CLK, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RX_CLK, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RXD3, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RXD2, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RXD1, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RXD0, PIN_INPUT_PULLDOWN, MUX_MODE7)
                >;
        };
 
        davinci_mdio_default: davinci_mdio_default {
                pinctrl-single,pins = <
                        /* MDIO */
-                       0x148 (PIN_INPUT_PULLUP | SLEWCTRL_FAST | MUX_MODE0)    /* mdio_data.mdio_data */
-                       0x14c (PIN_OUTPUT_PULLUP | MUX_MODE0)                   /* mdio_clk.mdio_clk */
+                       AM33XX_PADCONF(AM335X_PIN_MDIO, PIN_INPUT_PULLUP | SLEWCTRL_FAST, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MDC, PIN_OUTPUT_PULLUP, MUX_MODE0)
                >;
        };
 
        davinci_mdio_sleep: davinci_mdio_sleep {
                pinctrl-single,pins = <
                        /* MDIO reset value */
-                       0x148 (PIN_INPUT_PULLDOWN | MUX_MODE7)
-                       0x14c (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MDIO, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MDC, PIN_INPUT_PULLDOWN, MUX_MODE7)
                >;
        };
 
        mmc1_pins: pinmux_mmc1_pins {
                pinctrl-single,pins = <
-                       0x160 (PIN_INPUT | MUX_MODE7) /* GPIO0_6 */
+                       AM33XX_PADCONF(AM335X_PIN_SPI0_CS1, PIN_INPUT, MUX_MODE7)               /* spio0_cs1.gpio0_6 */
+                       AM33XX_PADCONF(AM335X_PIN_MMC0_DAT0, PIN_INPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MMC0_DAT1, PIN_INPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MMC0_DAT2, PIN_INPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MMC0_DAT3, PIN_INPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MMC0_CMD, PIN_INPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MMC0_CLK, PIN_INPUT_PULLUP, MUX_MODE0)
                >;
        };
 
        emmc_pins: pinmux_emmc_pins {
                pinctrl-single,pins = <
-                       0x80 (PIN_INPUT_PULLUP | MUX_MODE2) /* gpmc_csn1.mmc1_clk */
-                       0x84 (PIN_INPUT_PULLUP | MUX_MODE2) /* gpmc_csn2.mmc1_cmd */
-                       0x00 (PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad0.mmc1_dat0 */
-                       0x04 (PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad1.mmc1_dat1 */
-                       0x08 (PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad2.mmc1_dat2 */
-                       0x0c (PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad3.mmc1_dat3 */
-                       0x10 (PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad4.mmc1_dat4 */
-                       0x14 (PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad5.mmc1_dat5 */
-                       0x18 (PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad6.mmc1_dat6 */
-                       0x1c (PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad7.mmc1_dat7 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_CSN1, PIN_INPUT_PULLUP, MUX_MODE2) /* gpmc_csn1.mmc1_clk */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_CSN2, PIN_INPUT_PULLUP, MUX_MODE2) /* gpmc_csn2.mmc1_cmd */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD0, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad0.mmc1_dat0 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD1, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad1.mmc1_dat1 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD2, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad2.mmc1_dat2 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD3, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad3.mmc1_dat3 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD4, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad4.mmc1_dat4 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD5, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad5.mmc1_dat5 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD6, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad6.mmc1_dat6 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD7, PIN_INPUT_PULLUP, MUX_MODE1) /* gpmc_ad7.mmc1_dat7 */
                >;
        };
 };
        status = "okay";
 };
 
-&usb {
-       status = "okay";
-};
-
-&usb_ctrl_mod {
-       status = "okay";
-};
-
-&usb0_phy {
-       status = "okay";
-};
-
-&usb1_phy {
-       status = "okay";
-};
-
 &usb0 {
-       status = "okay";
        dr_mode = "peripheral";
+       interrupts-extended = <&intc 18 &tps 0>;
+       interrupt-names = "mc", "vbus";
 };
 
 &usb1 {
-       status = "okay";
        dr_mode = "host";
 };
 
-&cppi41dma  {
-       status = "okay";
-};
-
 &i2c0 {
        pinctrl-names = "default";
        pinctrl-0 = <&i2c0_pins>;
        };
 
        baseboard_eeprom: baseboard_eeprom@50 {
-               compatible = "at,24c256";
+               compatible = "atmel,24c256";
                reg = <0x50>;
 
                #address-cells = <1>;
        clock-frequency = <100000>;
 
        cape_eeprom0: cape_eeprom0@54 {
-               compatible = "at,24c256";
+               compatible = "atmel,24c256";
                reg = <0x54>;
                #address-cells = <1>;
                #size-cells = <1>;
        };
 
        cape_eeprom1: cape_eeprom1@55 {
-               compatible = "at,24c256";
+               compatible = "atmel,24c256";
                reg = <0x55>;
                #address-cells = <1>;
                #size-cells = <1>;
        };
 
        cape_eeprom2: cape_eeprom2@56 {
-               compatible = "at,24c256";
+               compatible = "atmel,24c256";
                reg = <0x56>;
                #address-cells = <1>;
                #size-cells = <1>;
        };
 
        cape_eeprom3: cape_eeprom3@57 {
-               compatible = "at,24c256";
+               compatible = "atmel,24c256";
                reg = <0x57>;
                #address-cells = <1>;
                #size-cells = <1>;
         * by the hardware problems. (Tip: double-check by performing a current
         * measurement after shutdown: it should be less than 1 mA.)
         */
+
+       interrupts = <7>; /* NMI */
+       interrupt-parent = <&intc>;
+
        ti,pmic-shutdown-controller;
 
+       charger {
+               status = "okay";
+       };
+
+       pwrbutton {
+               status = "okay";
+       };
+
        regulators {
                dcdc1_reg: regulator@0 {
                        regulator-name = "vdds_dpr";
                        /* VDD_MPU voltage limits 0.95V - 1.26V with +/-4% tolerance */
                        regulator-name = "vdd_mpu";
                        regulator-min-microvolt = <925000>;
-                       regulator-max-microvolt = <1325000>;
+                       regulator-max-microvolt = <1351500>;
                        regulator-boot-on;
                        regulator-always-on;
                };
index 6b84937..b5d85ef 100644 (file)
@@ -1,9 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
+ * Copyright (C) 2012 Texas Instruments Incorporated - https://www.ti.com/
  */
 /dts-v1/;
 
diff --git a/arch/arm/dts/am335x-boneblack-common.dtsi b/arch/arm/dts/am335x-boneblack-common.dtsi
new file mode 100644 (file)
index 0000000..64c3e92
--- /dev/null
@@ -0,0 +1,169 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (C) 2012 Texas Instruments Incorporated - https://www.ti.com/
+ */
+
+#include <dt-bindings/display/tda998x.h>
+#include <dt-bindings/interrupt-controller/irq.h>
+
+&ldo3_reg {
+       regulator-min-microvolt = <1800000>;
+       regulator-max-microvolt = <1800000>;
+       regulator-always-on;
+};
+
+&mmc1 {
+       vmmc-supply = <&vmmcsd_fixed>;
+};
+
+&mmc2 {
+       vmmc-supply = <&vmmcsd_fixed>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&emmc_pins>;
+       bus-width = <8>;
+       status = "okay";
+       non-removable;
+};
+
+&am33xx_pinmux {
+       nxp_hdmi_bonelt_pins: nxp_hdmi_bonelt_pins {
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_XDMA_EVENT_INTR0, PIN_OUTPUT_PULLDOWN, MUX_MODE3)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA0, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA1, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA2, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA3, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA4, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA5, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA6, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA7, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA8, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA9, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA10, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA11, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA12, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA13, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA14, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA15, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_VSYNC, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_HSYNC, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_PCLK, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_AC_BIAS_EN, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
+               >;
+       };
+
+       nxp_hdmi_bonelt_off_pins: nxp_hdmi_bonelt_off_pins {
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_XDMA_EVENT_INTR0, PIN_OUTPUT_PULLDOWN, MUX_MODE3)
+               >;
+       };
+
+       mcasp0_pins: mcasp0_pins {
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_MCASP0_AHCLKX, PIN_INPUT_PULLUP, MUX_MODE0) /* mcasp0_ahcklx.mcasp0_ahclkx */
+                       AM33XX_PADCONF(AM335X_PIN_MCASP0_AHCLKR, PIN_OUTPUT_PULLDOWN, MUX_MODE2) /* mcasp0_ahclkr.mcasp0_axr2*/
+                       AM33XX_PADCONF(AM335X_PIN_MCASP0_FSX, PIN_OUTPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MCASP0_ACLKX, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_A11, PIN_OUTPUT_PULLDOWN, MUX_MODE7) /* gpmc_a11.GPIO1_27 */
+               >;
+       };
+};
+
+&lcdc {
+       status = "okay";
+
+       /* If you want to get 24 bit RGB and 16 BGR mode instead of
+        * current 16 bit RGB and 24 BGR modes, set the propety
+        * below to "crossed" and uncomment the video-ports -property
+        * in tda19988 node.
+        */
+       blue-and-red-wiring = "straight";
+
+       port {
+               lcdc_0: endpoint@0 {
+                       remote-endpoint = <&hdmi_0>;
+               };
+       };
+};
+
+&i2c0 {
+       tda19988: tda19988@70 {
+               compatible = "nxp,tda998x";
+               reg = <0x70>;
+               nxp,calib-gpios = <&gpio1 25 0>;
+               interrupts-extended = <&gpio1 25 IRQ_TYPE_LEVEL_LOW>;
+
+               pinctrl-names = "default", "off";
+               pinctrl-0 = <&nxp_hdmi_bonelt_pins>;
+               pinctrl-1 = <&nxp_hdmi_bonelt_off_pins>;
+
+               /* Convert 24bit BGR to RGB, e.g. cross red and blue wiring */
+               /* video-ports = <0x234501>; */
+
+               #sound-dai-cells = <0>;
+               audio-ports = < TDA998x_I2S     0x03>;
+
+               ports {
+                       port@0 {
+                               hdmi_0: endpoint@0 {
+                                       remote-endpoint = <&lcdc_0>;
+                               };
+                       };
+               };
+       };
+};
+
+&rtc {
+       system-power-controller;
+};
+
+&mcasp0        {
+       #sound-dai-cells = <0>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&mcasp0_pins>;
+       status = "okay";
+       op-mode = <0>;  /* MCASP_IIS_MODE */
+       tdm-slots = <2>;
+       serial-dir = <  /* 0: INACTIVE, 1: TX, 2: RX */
+                       0 0 1 0
+               >;
+       tx-num-evt = <32>;
+       rx-num-evt = <32>;
+};
+
+/ {
+       memory@80000000 {
+               device_type = "memory";
+               reg = <0x80000000 0x20000000>; /* 512 MB */
+       };
+
+       clk_mcasp0_fixed: clk_mcasp0_fixed {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+               clock-frequency = <24576000>;
+       };
+
+       clk_mcasp0: clk_mcasp0 {
+               #clock-cells = <0>;
+               compatible = "gpio-gate-clock";
+               clocks = <&clk_mcasp0_fixed>;
+               enable-gpios = <&gpio1 27 0>; /* BeagleBone Black Clk enable on GPIO1_27 */
+       };
+
+       sound {
+               compatible = "simple-audio-card";
+               simple-audio-card,name = "TI BeagleBone Black";
+               simple-audio-card,format = "i2s";
+               simple-audio-card,bitclock-master = <&dailink0_master>;
+               simple-audio-card,frame-master = <&dailink0_master>;
+
+               dailink0_master: simple-audio-card,cpu {
+                       sound-dai = <&mcasp0>;
+                       clocks = <&clk_mcasp0>;
+               };
+
+               simple-audio-card,codec {
+                       sound-dai = <&tda19988>;
+               };
+       };
+};
index 27ebe4a..e2ee8b8 100644 (file)
+// SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
+ * Copyright (C) 2012 Texas Instruments Incorporated - https://www.ti.com/
  */
 /dts-v1/;
 
 #include "am33xx.dtsi"
 #include "am335x-bone-common.dtsi"
+#include "am335x-boneblack-common.dtsi"
 
 / {
        model = "TI AM335x BeagleBone Black";
        compatible = "ti,am335x-bone-black", "ti,am335x-bone", "ti,am33xx";
-       chosen {
-               stdout-path = &uart0;
-               tick-timer = &timer2;
-       };
-};
-
-&ldo3_reg {
-       regulator-min-microvolt = <1800000>;
-       regulator-max-microvolt = <1800000>;
-       regulator-always-on;
-};
-
-&mmc1 {
-       vmmc-supply = <&vmmcsd_fixed>;
 };
 
-&mmc2 {
-       vmmc-supply = <&vmmcsd_fixed>;
-       pinctrl-names = "default";
-       pinctrl-0 = <&emmc_pins>;
-       bus-width = <8>;
-       status = "okay";
+&cpu0_opp_table {
+       /*
+        * All PG 2.0 silicon may not support 1GHz but some of the early
+        * BeagleBone Blacks have PG 2.0 silicon which is guaranteed
+        * to support 1GHz OPP so enable it for PG 2.0 on this board.
+        */
+       oppnitro-1000000000 {
+               opp-supported-hw = <0x06 0x0100>;
+       };
 };
 
-&am33xx_pinmux {
-       nxp_hdmi_bonelt_pins: nxp_hdmi_bonelt_pins {
-               pinctrl-single,pins = <
-                       0x1b0 0x03      /* xdma_event_intr0, OMAP_MUX_MODE3 | AM33XX_PIN_OUTPUT */
-                       0xa0 0x08       /* lcd_data0.lcd_data0, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
-                       0xa4 0x08       /* lcd_data1.lcd_data1, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
-                       0xa8 0x08       /* lcd_data2.lcd_data2, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
-                       0xac 0x08       /* lcd_data3.lcd_data3, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
-                       0xb0 0x08       /* lcd_data4.lcd_data4, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
-                       0xb4 0x08       /* lcd_data5.lcd_data5, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
-                       0xb8 0x08       /* lcd_data6.lcd_data6, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
-                       0xbc 0x08       /* lcd_data7.lcd_data7, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
-                       0xc0 0x08       /* lcd_data8.lcd_data8, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
-                       0xc4 0x08       /* lcd_data9.lcd_data9, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
-                       0xc8 0x08       /* lcd_data10.lcd_data10, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
-                       0xcc 0x08       /* lcd_data11.lcd_data11, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
-                       0xd0 0x08       /* lcd_data12.lcd_data12, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
-                       0xd4 0x08       /* lcd_data13.lcd_data13, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
-                       0xd8 0x08       /* lcd_data14.lcd_data14, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
-                       0xdc 0x08       /* lcd_data15.lcd_data15, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
-                       0xe0 0x00       /* lcd_vsync.lcd_vsync, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
-                       0xe4 0x00       /* lcd_hsync.lcd_hsync, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
-                       0xe8 0x00       /* lcd_pclk.lcd_pclk, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
-                       0xec 0x00       /* lcd_ac_bias_en.lcd_ac_bias_en, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
-               >;
-       };
-       nxp_hdmi_bonelt_off_pins: nxp_hdmi_bonelt_off_pins {
-               pinctrl-single,pins = <
-                       0x1b0 0x03      /* xdma_event_intr0, OMAP_MUX_MODE3 | AM33XX_PIN_OUTPUT */
-               >;
-       };
+&gpio0 {
+       gpio-line-names =
+               "[mdio_data]",
+               "[mdio_clk]",
+               "P9_22 [spi0_sclk]",
+               "P9_21 [spi0_d0]",
+               "P9_18 [spi0_d1]",
+               "P9_17 [spi0_cs0]",
+               "[mmc0_cd]",
+               "P8_42A [ecappwm0]",
+               "P8_35 [lcd d12]",
+               "P8_33 [lcd d13]",
+               "P8_31 [lcd d14]",
+               "P8_32 [lcd d15]",
+               "P9_20 [i2c2_sda]",
+               "P9_19 [i2c2_scl]",
+               "P9_26 [uart1_rxd]",
+               "P9_24 [uart1_txd]",
+               "[rmii1_txd3]",
+               "[rmii1_txd2]",
+               "[usb0_drvvbus]",
+               "[hdmi cec]",
+               "P9_41B",
+               "[rmii1_txd1]",
+               "P8_19 [ehrpwm2a]",
+               "P8_13 [ehrpwm2b]",
+               "NC",
+               "NC",
+               "P8_14",
+               "P8_17",
+               "[rmii1_txd0]",
+               "[rmii1_refclk]",
+               "P9_11 [uart4_rxd]",
+               "P9_13 [uart4_txd]";
 };
 
-&lcdc {
-       status = "okay";
+&gpio1 {
+       gpio-line-names =
+               "P8_25 [mmc1_dat0]",
+               "[mmc1_dat1]",
+               "P8_5 [mmc1_dat2]",
+               "P8_6 [mmc1_dat3]",
+               "P8_23 [mmc1_dat4]",
+               "P8_22 [mmc1_dat5]",
+               "P8_3 [mmc1_dat6]",
+               "P8_4 [mmc1_dat7]",
+               "NC",
+               "NC",
+               "NC",
+               "NC",
+               "P8_12",
+               "P8_11",
+               "P8_16",
+               "P8_15",
+               "P9_15A",
+               "P9_23",
+               "P9_14 [ehrpwm1a]",
+               "P9_16 [ehrpwm1b]",
+               "[emmc rst]",
+               "[usr0 led]",
+               "[usr1 led]",
+               "[usr2 led]",
+               "[usr3 led]",
+               "[hdmi irq]",
+               "[usb vbus oc]",
+               "[hdmi audio]",
+               "P9_12",
+               "P8_26",
+               "P8_21 [emmc]",
+               "P8_20 [emmc]";
 };
 
-/ {
-       hdmi {
-               compatible = "ti,tilcdc,slave";
-               i2c = <&i2c0>;
-               pinctrl-names = "default", "off";
-               pinctrl-0 = <&nxp_hdmi_bonelt_pins>;
-               pinctrl-1 = <&nxp_hdmi_bonelt_off_pins>;
-               status = "okay";
-       };
+&gpio2 {
+       gpio-line-names =
+               "P9_15B",
+               "P8_18",
+               "P8_7",
+               "P8_8",
+               "P8_10",
+               "P8_9",
+               "P8_45 [hdmi]",
+               "P8_46 [hdmi]",
+               "P8_43 [hdmi]",
+               "P8_44 [hdmi]",
+               "P8_41 [hdmi]",
+               "P8_42 [hdmi]",
+               "P8_39 [hdmi]",
+               "P8_40 [hdmi]",
+               "P8_37 [hdmi]",
+               "P8_38 [hdmi]",
+               "P8_36 [hdmi]",
+               "P8_34 [hdmi]",
+               "[rmii1_rxd3]",
+               "[rmii1_rxd2]",
+               "[rmii1_rxd1]",
+               "[rmii1_rxd0]",
+               "P8_27 [hdmi]",
+               "P8_29 [hdmi]",
+               "P8_28 [hdmi]",
+               "P8_30 [hdmi]",
+               "[mmc0_dat3]",
+               "[mmc0_dat2]",
+               "[mmc0_dat1]",
+               "[mmc0_dat0]",
+               "[mmc0_clk]",
+               "[mmc0_cmd]";
 };
 
-&rtc {
-       system-power-controller;
+&gpio3 {
+       gpio-line-names =
+               "[mii col]",
+               "[mii crs]",
+               "[mii rx err]",
+               "[mii tx en]",
+               "[mii rx dv]",
+               "[i2c0 sda]",
+               "[i2c0 scl]",
+               "[jtag emu0]",
+               "[jtag emu1]",
+               "[mii tx clk]",
+               "[mii rx clk]",
+               "NC",
+               "NC",
+               "[usb vbus en]",
+               "P9_31 [spi1_sclk]",
+               "P9_29 [spi1_d0]",
+               "P9_30 [spi1_d1]",
+               "P9_28 [spi1_cs0]",
+               "P9_42B [ecappwm0]",
+               "P9_27",
+               "P9_41A",
+               "P9_25",
+               "NC",
+               "NC",
+               "NC",
+               "NC",
+               "NC",
+               "NC",
+               "NC",
+               "NC",
+               "NC",
+               "NC";
 };
diff --git a/arch/arm/dts/am335x-bonegreen-common.dtsi b/arch/arm/dts/am335x-bonegreen-common.dtsi
new file mode 100644 (file)
index 0000000..9f7fb63
--- /dev/null
@@ -0,0 +1,41 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (C) 2012 Texas Instruments Incorporated - https://www.ti.com/
+ */
+
+&ldo3_reg {
+       regulator-min-microvolt = <1800000>;
+       regulator-max-microvolt = <1800000>;
+       regulator-always-on;
+};
+
+&mmc1 {
+       vmmc-supply = <&vmmcsd_fixed>;
+};
+
+&mmc2 {
+       vmmc-supply = <&vmmcsd_fixed>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&emmc_pins>;
+       bus-width = <8>;
+       status = "okay";
+};
+
+&am33xx_pinmux {
+       uart2_pins: uart2_pins {
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_SPI0_SCLK, PIN_INPUT, MUX_MODE1)      /* spi0_sclk.uart2_rxd */
+                       AM33XX_PADCONF(AM335X_PIN_SPI0_D0, PIN_OUTPUT, MUX_MODE1)       /* spi0_d0.uart2_txd */
+               >;
+       };
+};
+
+&uart2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart2_pins>;
+       status = "okay";
+};
+
+&rtc {
+       system-power-controller;
+};
index 9c59da9..18cc0f4 100644 (file)
@@ -1,57 +1,14 @@
+// SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
+ * Copyright (C) 2012 Texas Instruments Incorporated - https://www.ti.com/
  */
 /dts-v1/;
 
 #include "am33xx.dtsi"
 #include "am335x-bone-common.dtsi"
+#include "am335x-bonegreen-common.dtsi"
 
 / {
        model = "TI AM335x BeagleBone Green";
        compatible = "ti,am335x-bone-green", "ti,am335x-bone-black", "ti,am335x-bone", "ti,am33xx";
-       chosen {
-               stdout-path = &uart0;
-               tick-timer = &timer2;
-       };
-};
-
-&ldo3_reg {
-       regulator-min-microvolt = <1800000>;
-       regulator-max-microvolt = <1800000>;
-       regulator-always-on;
-};
-
-&mmc1 {
-       vmmc-supply = <&vmmcsd_fixed>;
-};
-
-&mmc2 {
-       vmmc-supply = <&vmmcsd_fixed>;
-       pinctrl-names = "default";
-       pinctrl-0 = <&emmc_pins>;
-       bus-width = <8>;
-       status = "okay";
-};
-
-&am33xx_pinmux {
-       uart2_pins: uart2_pins {
-               pinctrl-single,pins = <
-                       AM33XX_IOPAD(0x950, PIN_INPUT | MUX_MODE1)      /* spi0_sclk.uart2_rxd */
-                       AM33XX_IOPAD(0x954, PIN_OUTPUT | MUX_MODE1)     /* spi0_d0.uart2_txd */
-               >;
-       };
-};
-
-&uart2 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&uart2_pins>;
-       status = "okay";
-};
-
-&rtc {
-       system-power-controller;
 };
diff --git a/arch/arm/dts/am335x-sancloud-bbe.dts b/arch/arm/dts/am335x-sancloud-bbe.dts
new file mode 100644 (file)
index 0000000..275ba33
--- /dev/null
@@ -0,0 +1,137 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (C) 2012 Texas Instruments Incorporated - https://www.ti.com/
+ */
+/dts-v1/;
+
+#include "am33xx.dtsi"
+#include "am335x-bone-common.dtsi"
+#include "am335x-boneblack-common.dtsi"
+#include <dt-bindings/interrupt-controller/irq.h>
+
+/ {
+       model = "SanCloud BeagleBone Enhanced";
+       compatible = "sancloud,am335x-boneenhanced", "ti,am335x-bone-black", "ti,am335x-bone", "ti,am33xx";
+};
+
+&am33xx_pinmux {
+       pinctrl-names = "default";
+
+       cpsw_default: cpsw_default {
+               pinctrl-single,pins = <
+                       /* Slave 1 */
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TX_EN, PIN_OUTPUT_PULLDOWN, MUX_MODE2)   /* mii1_txen.rgmii1_tctl */
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RX_DV, PIN_INPUT_PULLDOWN, MUX_MODE2)    /* mii1_rxdv.rgmii1_rctl */
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TXD3, PIN_OUTPUT_PULLDOWN, MUX_MODE2)    /* mii1_txd3.rgmii1_td3 */
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TXD2, PIN_OUTPUT_PULLDOWN, MUX_MODE2)    /* mii1_txd2.rgmii1_td2 */
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TXD1, PIN_OUTPUT_PULLDOWN, MUX_MODE2)    /* mii1_txd1.rgmii1_td1 */
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TXD0, PIN_OUTPUT_PULLDOWN, MUX_MODE2)    /* mii1_txd0.rgmii1_td0 */
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TX_CLK, PIN_OUTPUT_PULLDOWN, MUX_MODE2)  /* mii1_txclk.rgmii1_tclk */
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RX_CLK, PIN_INPUT_PULLDOWN, MUX_MODE2)   /* mii1_rxclk.rgmii1_rclk */
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RXD3, PIN_INPUT_PULLDOWN, MUX_MODE2)     /* mii1_rxd3.rgmii1_rd3 */
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RXD2, PIN_INPUT_PULLDOWN, MUX_MODE2)     /* mii1_rxd2.rgmii1_rd2 */
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RXD1, PIN_INPUT_PULLDOWN, MUX_MODE2)     /* mii1_rxd1.rgmii1_rd1 */
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RXD0, PIN_INPUT_PULLDOWN, MUX_MODE2)     /* mii1_rxd0.rgmii1_rd0 */
+               >;
+       };
+
+       cpsw_sleep: cpsw_sleep {
+               pinctrl-single,pins = <
+                       /* Slave 1 reset value */
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TX_EN, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RX_DV, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TXD3, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TXD2, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TXD1, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TXD0, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TX_CLK, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RX_CLK, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RXD3, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RXD2, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RXD1, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RXD0, PIN_INPUT_PULLDOWN, MUX_MODE7)
+               >;
+       };
+
+       davinci_mdio_default: davinci_mdio_default {
+               pinctrl-single,pins = <
+                       /* MDIO */
+                       AM33XX_PADCONF(AM335X_PIN_MDIO, PIN_INPUT_PULLUP | SLEWCTRL_FAST, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MDC, PIN_OUTPUT_PULLUP, MUX_MODE0)
+               >;
+       };
+
+       davinci_mdio_sleep: davinci_mdio_sleep {
+               pinctrl-single,pins = <
+                       /* MDIO reset value */
+                       AM33XX_PADCONF(AM335X_PIN_MDIO, PIN_INPUT_PULLDOWN, MUX_MODE7)
+                       AM33XX_PADCONF(AM335X_PIN_MDC, PIN_INPUT_PULLDOWN, MUX_MODE7)
+               >;
+       };
+
+       usb_hub_ctrl: usb_hub_ctrl {
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_RMII1_REF_CLK, PIN_OUTPUT_PULLUP, MUX_MODE7)     /* rmii1_refclk.gpio0_29 */
+               >;
+       };
+
+       mpu6050_pins: pinmux_mpu6050_pins {
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_UART0_CTSN, PIN_INPUT, MUX_MODE7)    /* uart0_ctsn.gpio1_8 */
+               >;
+       };
+
+       lps3331ap_pins: pinmux_lps3331ap_pins {
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_A10, PIN_INPUT, MUX_MODE7)     /* gpmc_a10.gpio1_26 */
+               >;
+       };
+};
+
+&mac {
+       pinctrl-names = "default", "sleep";
+       pinctrl-0 = <&cpsw_default>;
+       pinctrl-1 = <&cpsw_sleep>;
+       status = "okay";
+};
+
+&davinci_mdio {
+       pinctrl-names = "default", "sleep";
+       pinctrl-0 = <&davinci_mdio_default>;
+       pinctrl-1 = <&davinci_mdio_sleep>;
+       status = "okay";
+
+       ethphy0: ethernet-phy@0 {
+               reg = <0>;
+       };
+};
+
+&cpsw_emac0 {
+       phy-handle = <&ethphy0>;
+       phy-mode = "rgmii-id";
+};
+
+&i2c0 {
+       lps331ap: barometer@5c {
+               compatible = "st,lps331ap-press";
+               st,drdy-int-pin = <1>;
+               reg = <0x5c>;
+               interrupt-parent = <&gpio1>;
+               interrupts = <26 IRQ_TYPE_EDGE_RISING>;
+       };
+
+       mpu6050: accelerometer@68 {
+               compatible = "invensense,mpu6050";
+               reg = <0x68>;
+               interrupt-parent = <&gpio0>;
+               interrupts = <2 IRQ_TYPE_EDGE_RISING>;
+               orientation = <0xff 0 0 0 1 0 0 0 0xff>;
+       };
+
+       usb2512b: usb-hub@2c {
+               compatible = "microchip,usb2512b";
+               reg = <0x2c>;
+               reset-gpios = <&gpio0 29 GPIO_ACTIVE_LOW>;
+               /* wifi on port 4 */
+       };
+};
index 35b49df..efbcfb3 100644 (file)
@@ -8,6 +8,10 @@
                stdout-path = "serial2:115200n8";
                tick-timer = &timer1;
        };
+
+       aliases {
+               mmc1 = &sdhci1;
+       };
 };
 
 &cbass_main{
@@ -79,6 +83,7 @@
 };
 
 &sdhci0 {
+       status = "disabled";
        u-boot,dm-spl;
 };
 
index df850a2..0c1305d 100644 (file)
@@ -76,3 +76,7 @@
 &tx_pru2_1 {
        remoteproc-name = "tx_pru2_1";
 };
+
+&mcu_r5fss0 {
+       ti,cluster-mode = <0>;
+};
index 786cc48..8a3f189 100644 (file)
 &hbmc_mux {
        u-boot,dm-spl;
 };
+
+&serdes_ln_ctrl {
+       u-boot,mux-autoprobe;
+};
+
+&usb_serdes_mux {
+       u-boot,mux-autoprobe;
+};
+
+&serdes0 {
+       u-boot,dm-spl;
+};
index 5120711..f0440cd 100644 (file)
@@ -9,6 +9,7 @@
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/net/ti-dp83867.h>
 #include <dt-bindings/mux/ti-serdes.h>
+#include <dt-bindings/phy/phy.h>
 
 / {
        chosen {
                ti,adc-channels = <0 1 2 3 4 5 6 7>;
        };
 };
+
+&serdes_refclk {
+       clock-frequency = <100000000>;
+};
+
+&serdes0 {
+       serdes0_pcie_link: link@0 {
+               reg = <0>;
+               cdns,num-lanes = <2>;
+               #phy-cells = <0>;
+               cdns,phy-type = <PHY_TYPE_PCIE>;
+               resets = <&serdes_wiz0 1>, <&serdes_wiz0 2>;
+       };
+
+       serdes0_qsgmii_link: link@1 {
+               reg = <2>;
+               cdns,num-lanes = <1>;
+               #phy-cells = <0>;
+               cdns,phy-type = <PHY_TYPE_QSGMII>;
+               resets = <&serdes_wiz0 3>;
+       };
+};
index 1131464..e1d43ac 100644 (file)
@@ -5,6 +5,13 @@
  * Copyright (C) 2020 Texas Instruments Incorporated - https://www.ti.com/
  */
 
+/ {
+       serdes_refclk: serdes-refclk {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+       };
+};
+
 &cbass_main {
        msmc_ram: sram@70000000 {
                compatible = "mmio-sram";
                ti,otap-del-sel-mmc-hs = <0x0>;
                ti,otap-del-sel-ddr52 = <0x6>;
                ti,otap-del-sel-hs200 = <0x8>;
-               ti,otap-del-sel-hs400 = <0x0>;
+               ti,otap-del-sel-hs400 = <0x5>;
+               ti,itap-del-sel-legacy = <0x10>;
+               ti,itap-del-sel-mmc-hs = <0xa>;
                ti,strobe-sel = <0x77>;
+               ti,clkbuf-sel = <0x7>;
                ti,trm-icp = <0x8>;
                bus-width = <8>;
+               mmc-hs400-1_8v;
                mmc-hs200-1_8v;
                mmc-ddr-1_8v;
                dma-coherent;
                ti,otap-del-sel-sdr50 = <0xc>;
                ti,otap-del-sel-sdr104 = <0x5>;
                ti,otap-del-sel-ddr50 = <0xc>;
+               ti,itap-del-sel-legacy = <0x0>;
+               ti,itap-del-sel-sd-hs = <0x0>;
+               ti,itap-del-sel-sdr12 = <0x0>;
+               ti,itap-del-sel-sdr25 = <0x0>;
                ti,clkbuf-sel = <0x7>;
+               ti,trm-icp = <0x8>;
                dma-coherent;
        };
 
                clock-names = "gpio";
        };
 
+       serdes_wiz0: wiz@5060000 {
+               compatible = "ti,j721e-wiz-10g";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               power-domains = <&k3_pds 292 TI_SCI_PD_EXCLUSIVE>;
+               clocks = <&k3_clks 292 11>, <&k3_clks 292 85>, <&serdes_refclk>;
+               clock-names = "fck", "core_ref_clk", "ext_ref_clk";
+               num-lanes = <4>;
+               #reset-cells = <1>;
+               ranges = <0x5060000 0x0 0x5060000 0x10000>;
+
+               assigned-clocks = <&k3_clks 292 85>;
+               assigned-clock-parents = <&k3_clks 292 89>;
+
+               wiz0_pll0_refclk: pll0-refclk {
+                       clocks = <&k3_clks 292 85>, <&serdes_refclk>;
+                       clock-output-names = "wiz0_pll0_refclk";
+                       #clock-cells = <0>;
+                       assigned-clocks = <&wiz0_pll0_refclk>;
+                       assigned-clock-parents = <&k3_clks 292 85>;
+               };
+
+               wiz0_pll1_refclk: pll1-refclk {
+                       clocks = <&k3_clks 292 85>, <&serdes_refclk>;
+                       clock-output-names = "wiz0_pll1_refclk";
+                       #clock-cells = <0>;
+                       assigned-clocks = <&wiz0_pll1_refclk>;
+                       assigned-clock-parents = <&k3_clks 292 85>;
+               };
+
+               wiz0_refclk_dig: refclk-dig {
+                       clocks = <&k3_clks 292 85>, <&serdes_refclk>;
+                       clock-output-names = "wiz0_refclk_dig";
+                       #clock-cells = <0>;
+                       assigned-clocks = <&wiz0_refclk_dig>;
+                       assigned-clock-parents = <&k3_clks 292 85>;
+               };
+
+               wiz0_cmn_refclk_dig_div: cmn-refclk-dig-div {
+                       clocks = <&wiz0_refclk_dig>;
+                       #clock-cells = <0>;
+               };
+
+               serdes0: serdes@5060000 {
+                       compatible = "ti,j721e-serdes-10g";
+                       reg = <0x05060000 0x00010000>;
+                       reg-names = "torrent_phy";
+                       resets = <&serdes_wiz0 0>;
+                       reset-names = "torrent_reset";
+                       clocks = <&wiz0_pll0_refclk>;
+                       clock-names = "refclk";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+       };
+
        usbss0: cdns-usb@4104000 {
                compatible = "ti,j721e-usb";
                reg = <0x00 0x4104000 0x00 0x100>;
index 974dae8..85dbf8d 100644 (file)
        u-boot,dm-spl;
 };
 
+&wiz3_pll1_refclk {
+       assigned-clocks = <&wiz3_pll1_refclk>, <&wiz3_pll0_refclk>;
+       assigned-clock-parents = <&k3_clks 295 0>, <&k3_clks 295 9>;
+};
+
 &main_usbss0_pins_default {
        u-boot,dm-spl;
 };
 
 &usbss0 {
        u-boot,dm-spl;
-       ti,usb2-only;
 };
 
 &usb0 {
 &main_r5fss1 {
        ti,cluster-mode = <0>;
 };
+
+&wiz3_pll1_refclk {
+       assigned-clocks = <&wiz3_pll1_refclk>, <&wiz3_pll0_refclk>;
+       assigned-clock-parents = <&k3_clks 295 0>, <&k3_clks 295 9>;
+};
+
+&serdes_ln_ctrl {
+       u-boot,mux-autoprobe;
+};
+
+&usb_serdes_mux {
+       u-boot,mux-autoprobe;
+};
index f346bb3..48c6ddf 100644 (file)
@@ -13,8 +13,6 @@
        aliases {
                remoteproc0 = &sysctrler;
                remoteproc1 = &a72_0;
-               remoteproc2 = &main_r5fss0_core0;
-               remoteproc3 = &main_r5fss0_core1;
        };
 
        fs_loader0: fs_loader@0 {
        };
 };
 
-&main_r5fss0 {
-       u-boot,dm-spl;
-};
-
-&main_r5fss0_core0 {
-       u-boot,dm-spl;
-};
-
-&main_r5fss0_core1 {
-       u-boot,dm-spl;
-};
-
 &tps659413a {
        esm: esm {
                compatible = "ti,tps659413-esm";
index 0542b2f..a12607d 100644 (file)
@@ -13,8 +13,6 @@
        aliases {
                remoteproc0 = &sysctrler;
                remoteproc1 = &a72_0;
-               remoteproc2 = &main_r5fss0_core0;
-               remoteproc3 = &main_r5fss0_core1;
        };
 
        chosen {
index 0e46d70..533905d 100644 (file)
@@ -198,7 +198,7 @@ void board_init_f(ulong dummy)
 #endif
 }
 
-u32 spl_boot_mode(const u32 boot_device)
+u32 spl_mmc_boot_mode(const u32 boot_device)
 {
        switch (boot_device) {
        case BOOT_DEVICE_MMC1:
index ab6d9bd..bb0f641 100644 (file)
@@ -193,10 +193,6 @@ int load_firmware(char *name_fw, char *name_loadaddr, u32 *loadaddr)
 }
 #endif
 
-__weak void start_non_linux_remote_cores(void)
-{
-}
-
 void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
 {
        typedef void __noreturn (*image_entry_noargs_t)(void);
@@ -214,7 +210,6 @@ void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
        init_env();
 
        if (!fit_image_info[IMAGE_ID_DM_FW].image_start) {
-               start_non_linux_remote_cores();
                size = load_firmware("name_mcur5f0_0fw", "addr_mcur5f0_0load",
                                     &loadaddr);
        }
index f421ed1..e81b70d 100644 (file)
@@ -22,7 +22,6 @@ void setup_k3_mpu_regions(void);
 int early_console_init(void);
 void disable_linefill_optimization(void);
 void remove_fwl_configs(struct fwl_data *fwl_data, size_t fwl_data_size);
-void start_non_linux_remote_cores(void);
 int load_firmware(char *name_fw, char *name_loadaddr, u32 *loadaddr);
 void k3_sysfw_print_ver(void);
 void spl_enable_dcache(void);
index e9e076c..78d80be 100644 (file)
@@ -370,39 +370,3 @@ void release_resources_for_core_shutdown(void)
        }
 }
 #endif
-
-#ifdef CONFIG_SYS_K3_SPL_ATF
-void start_non_linux_remote_cores(void)
-{
-       int size = 0, ret;
-       u32 loadaddr = 0;
-
-       if (!soc_is_j721e())
-               return;
-
-       size = load_firmware("name_mainr5f0_0fw", "addr_mainr5f0_0load",
-                            &loadaddr);
-       if (size <= 0)
-               goto err_load;
-
-       /* assuming remoteproc 2 is aliased for the needed remotecore */
-       ret = rproc_load(2, loadaddr, size);
-       if (ret) {
-               printf("Firmware failed to start on rproc (%d)\n", ret);
-               goto err_load;
-       }
-
-       ret = rproc_start(2);
-       if (ret) {
-               printf("Firmware init failed on rproc (%d)\n", ret);
-               goto err_load;
-       }
-
-       printf("Remoteproc 2 started successfully\n");
-
-       return;
-
-err_load:
-       rproc_reset(2);
-}
-#endif
index 555c0aa..2e4f3d1 100644 (file)
@@ -954,6 +954,8 @@ int board_fit_config_name_match(const char *name)
                return 0;
        else if (board_is_icev2() && !strcmp(name, "am335x-icev2"))
                return 0;
+       else if (board_is_bben() && !strcmp(name, "am335x-sancloud-bbe"))
+               return 0;
        else
                return -1;
 }
diff --git a/board/ti/j721e/README b/board/ti/j721e/README
deleted file mode 100644 (file)
index b1c9145..0000000
+++ /dev/null
@@ -1,277 +0,0 @@
-Introduction:
--------------
-The J721e family of SoCs are part of K3 Multicore SoC architecture platform
-targeting automotive applications. They are designed as a low power, high
-performance and highly integrated device architecture, adding significant
-enhancement on processing power, graphics capability, video and imaging
-processing, virtualization and coherent memory support.
-
-The device is partitioned into three functional domains, each containing
-specific processing cores and peripherals:
-1. Wake-up (WKUP) domain:
-       - Device Management and Security Controller (DMSC)
-2. Microcontroller (MCU) domain:
-       - Dual Core ARM Cortex-R5F processor
-3. MAIN domain:
-       - Dual core 64-bit ARM Cortex-A72
-       - 2 x Dual cortex ARM Cortex-R5 subsystem
-       - 2 x C66x Digital signal processor sub system
-       - C71x Digital signal processor sub-system with MMA.
-
-More info can be found in TRM: http://www.ti.com/lit/pdf/spruil1
-
-Boot Flow:
-----------
-Boot flow is similar to that of AM65x SoC and extending it with remoteproc
-support. Below is the pictorial representation of boot flow:
-
-+------------------------------------------------------------------------+-----------------------+
-|        DMSC            |      MCU R5           |        A72            |  MAIN R5/C66x/C7x     |
-+------------------------------------------------------------------------+-----------------------+
-|    +--------+          |                       |                       |                       |
-|    |  Reset |          |                       |                       |                       |
-|    +--------+          |                       |                       |                       |
-|         :              |                       |                       |                       |
-|    +--------+          |   +-----------+       |                       |                       |
-|    | *ROM*  |----------|-->| Reset rls |       |                       |                       |
-|    +--------+          |   +-----------+       |                       |                       |
-|    |        |          |         :             |                       |                       |
-|    |  ROM   |          |         :             |                       |                       |
-|    |services|          |         :             |                       |                       |
-|    |        |          |   +-------------+     |                       |                       |
-|    |        |          |   |  *R5 ROM*   |     |                       |                       |
-|    |        |          |   +-------------+     |                       |                       |
-|    |        |<---------|---|Load and auth|     |                       |                       |
-|    |        |          |   | tiboot3.bin |     |                       |                       |
-|    |        |          |   +-------------+     |                       |                       |
-|    |        |          |         :             |                       |                       |
-|    |        |          |         :             |                       |                       |
-|    |        |          |         :             |                       |                       |
-|    |        |          |   +-------------+     |                       |                       |
-|    |        |          |   |  *R5 SPL*   |     |                       |                       |
-|    |        |          |   +-------------+     |                       |                       |
-|    |        |          |   |    Load     |     |                       |                       |
-|    |        |          |   |  sysfw.itb  |     |                       |                       |
-|    | Start  |          |   +-------------+     |                       |                       |
-|    | System |<---------|---|    Start    |     |                       |                       |
-|    |Firmware|          |   |    SYSFW    |     |                       |                       |
-|    +--------+          |   +-------------+     |                       |                       |
-|        :               |   |             |     |                       |                       |
-|    +---------+         |   |   Load      |     |                       |                       |
-|    | *SYSFW* |         |   |   system    |     |                       |                       |
-|    +---------+         |   | Config data |     |                       |                       |
-|    |         |<--------|---|             |     |                       |                       |
-|    |         |         |   +-------------+     |                       |                       |
-|    |         |         |   |    DDR      |     |                       |                       |
-|    |         |         |   |   config    |     |                       |                       |
-|    |         |         |   +-------------+     |                       |                       |
-|    |         |         |   |    Load     |     |                       |                       |
-|    |         |         |   |  tispl.bin  |     |                       |                       |
-|    |         |         |   +-------------+     |                       |                       |
-|    |         |         |   |   Load R5   |     |                       |                       |
-|    |         |         |   |   firmware  |     |                       |                       |
-|    |         |         |   +-------------+     |                       |                       |
-|    |         |<--------|---| Start A72   |     |                       |                       |
-|    |         |         |   | and jump to |     |                       |                       |
-|    |         |         |   | DM fw image |     |                       |                       |
-|    |         |         |   +-------------+     |                       |                       |
-|    |         |         |                       |     +-----------+     |                       |
-|    |         |---------|-----------------------|---->| Reset rls |     |                       |
-|    |         |         |                       |     +-----------+     |                       |
-|    |  TIFS   |         |                       |          :            |                       |
-|    |Services |         |                       |     +-----------+     |                       |
-|    |         |<--------|-----------------------|---->|*ATF/OPTEE*|     |                       |
-|    |         |         |                       |     +-----------+     |                       |
-|    |         |         |                       |          :            |                       |
-|    |         |         |                       |     +-----------+     |                       |
-|    |         |<--------|-----------------------|---->| *A72 SPL* |     |                       |
-|    |         |         |                       |     +-----------+     |                       |
-|    |         |         |                       |     |   Load    |     |                       |
-|    |         |         |                       |     | u-boot.img|     |                       |
-|    |         |         |                       |     +-----------+     |                       |
-|    |         |         |                       |          :            |                       |
-|    |         |         |                       |     +-----------+     |                       |
-|    |         |<--------|-----------------------|---->| *U-Boot*  |     |                       |
-|    |         |         |                       |     +-----------+     |                       |
-|    |         |         |                       |     |  prompt   |     |                       |
-|    |         |         |                       |     +-----------+     |                       |
-|    |         |         |                       |     |  Load R5  |     |                       |
-|    |         |         |                       |     |  Firmware |     |                       |
-|    |         |         |                       |     +-----------+     |                       |
-|    |         |<--------|-----------------------|-----|  Start R5 |     |      +-----------+    |
-|    |         |---------|-----------------------|-----+-----------+-----|----->| R5 starts |    |
-|    |         |         |                       |     |  Load C6  |     |      +-----------+    |
-|    |         |         |                       |     |  Firmware |     |                       |
-|    |         |         |                       |     +-----------+     |                       |
-|    |         |<--------|-----------------------|-----|  Start C6 |     |      +-----------+    |
-|    |         |---------|-----------------------|-----+-----------+-----|----->| C6 starts |    |
-|    |         |         |                       |     |  Load C7  |     |      +-----------+    |
-|    |         |         |                       |     |  Firmware |     |                       |
-|    |         |         |                       |     +-----------+     |                       |
-|    |         |<--------|-----------------------|-----|  Start C7 |     |      +-----------+    |
-|    |         |---------|-----------------------|-----+-----------+-----|----->| C7 starts |    |
-|    +---------+         |                       |                       |      +-----------+    |
-|                        |                       |                       |                       |
-+------------------------------------------------------------------------+-----------------------+
-
-- Here DMSC acts as master and provides all the critical services. R5/A72
-requests DMSC to get these services done as shown in the above diagram.
-
-Sources:
---------
-1. SYSFW:
-       Tree: git://git.ti.com/k3-image-gen/k3-image-gen.git
-       Branch: master
-
-2. ATF:
-       Tree: https://github.com/ARM-software/arm-trusted-firmware.git
-       Branch: master
-
-3. OPTEE:
-       Tree: https://github.com/OP-TEE/optee_os.git
-       Branch: master
-
-4. U-Boot:
-       Tree: https://source.denx.de/u-boot/u-boot
-       Branch: master
-
-Build procedure:
-----------------
-1. SYSFW:
-$ make CROSS_COMPILE=arm-linux-gnueabihf-
-
-2. ATF:
-$ make CROSS_COMPILE=aarch64-linux-gnu- ARCH=aarch64 PLAT=k3 TARGET_BOARD=generic SPD=opteed
-
-3. OPTEE:
-$ make PLATFORM=k3-j721e CFG_ARM64_core=y
-
-4. U-Boot:
-
-4.1. R5:
-$ make CROSS_COMPILE=arm-linux-gnueabihf- j721e_evm_r5_defconfig O=/tmp/r5
-$ make CROSS_COMPILE=arm-linux-gnueabihf- O=/tmp/r5
-
-4.2. A72:
-$ make CROSS_COMPILE=aarch64-linux-gnu- j721e_evm_a72_defconfig O=/tmp/a72
-$ make CROSS_COMPILE=aarch64-linux-gnu- ATF=<path to ATF dir>/build/k3/generic/release/bl31.bin TEE=<path to OPTEE OS dir>/out/arm-plat-k3/core/tee-pager_v2.bin DM=<path to DM firmware image> O=/tmp/a72
-
-Target Images
---------------
-Copy the below images to an SD card and boot:
-- sysfw.itb from step 1
-- tiboot3.bin from step 4.1
-- tispl.bin, u-boot.img from 4.2
-
-Image formats:
---------------
-
-- tiboot3.bin:
-                +-----------------------+
-                |        X.509          |
-                |      Certificate      |
-                | +-------------------+ |
-                | |                   | |
-                | |        R5         | |
-                | |   u-boot-spl.bin  | |
-                | |                   | |
-                | +-------------------+ |
-                | |                   | |
-                | |     FIT header    | |
-                | | +---------------+ | |
-                | | |               | | |
-                | | |   DTB 1...N   | | |
-                | | +---------------+ | |
-                | +-------------------+ |
-                +-----------------------+
-
-- tispl.bin
-                +-----------------------+
-                |                       |
-                |       FIT HEADER      |
-                | +-------------------+ |
-                | |                   | |
-                | |      A72 ATF      | |
-                | +-------------------+ |
-                | |                   | |
-                | |     A72 OPTEE     | |
-                | +-------------------+ |
-                | |                   | |
-                | |      R5 DM FW     | |
-                | +-------------------+ |
-                | |                   | |
-                | |      A72 SPL      | |
-                | +-------------------+ |
-                | |                   | |
-                | |   SPL DTB 1...N   | |
-                | +-------------------+ |
-                +-----------------------+
-
-- sysfw.itb
-                +-----------------------+
-                |                       |
-                |       FIT HEADER      |
-                | +-------------------+ |
-                | |                   | |
-                | |     sysfw.bin     | |
-                | +-------------------+ |
-                | |                   | |
-                | |    board config   | |
-                | +-------------------+ |
-                | |                   | |
-                | |     PM config     | |
-                | +-------------------+ |
-                | |                   | |
-                | |     RM config     | |
-                | +-------------------+ |
-                | |                   | |
-                | |    Secure config  | |
-                | +-------------------+ |
-                +-----------------------+
-
-OSPI:
------
-ROM supports booting from OSPI from offset 0x0.
-
-Flashing images to OSPI:
-
-Below commands can be used to download tiboot3.bin, tispl.bin, u-boot.img,
-and sysfw.itb over tftp and then flash those to OSPI at their respective
-addresses.
-
-=> sf probe
-=> tftp ${loadaddr} tiboot3.bin
-=> sf update $loadaddr 0x0 $filesize
-=> tftp ${loadaddr} tispl.bin
-=> sf update $loadaddr 0x80000 $filesize
-=> tftp ${loadaddr} u-boot.img
-=> sf update $loadaddr 0x280000 $filesize
-=> tftp ${loadaddr} sysfw.itb
-=> sf update $loadaddr 0x6C0000 $filesize
-
-Flash layout for OSPI:
-
-         0x0 +----------------------------+
-             |     ospi.tiboot3(512K)     |
-             |                            |
-     0x80000 +----------------------------+
-             |     ospi.tispl(2M)         |
-             |                            |
-    0x280000 +----------------------------+
-             |     ospi.u-boot(4M)        |
-             |                            |
-    0x680000 +----------------------------+
-             |     ospi.env(128K)         |
-             |                            |
-    0x6A0000 +----------------------------+
-            |   ospi.env.backup (128K)   |
-            |                            |
-    0x6C0000 +----------------------------+
-             |      ospi.sysfw(1M)        |
-             |                            |
-    0x7C0000 +----------------------------+
-            |      padding (256k)        |
-    0x800000 +----------------------------+
-             |     ospi.rootfs(UBIFS)     |
-             |                            |
-             +----------------------------+
index b9a9f19..580f13c 100644 (file)
@@ -10,6 +10,7 @@
 #include <common.h>
 #include <env.h>
 #include <fdt_support.h>
+#include <generic-phy.h>
 #include <image.h>
 #include <init.h>
 #include <log.h>
@@ -29,7 +30,8 @@
 #define board_is_j721e_som()   (board_ti_k3_is("J721EX-PM1-SOM") || \
                                 board_ti_k3_is("J721EX-PM2-SOM"))
 
-#define board_is_j7200_som()   board_ti_k3_is("J7200X-PM1-SOM")
+#define board_is_j7200_som()   (board_ti_k3_is("J7200X-PM1-SOM") || \
+                                board_ti_k3_is("J7200X-PM2-SOM"))
 
 /* Max number of MAC addresses that are parsed/processed per daughter card */
 #define DAUGHTER_CARD_NO_OF_MAC_ADDR   8
@@ -384,6 +386,33 @@ static int probe_daughtercards(void)
 }
 #endif
 
+void configure_serdes_torrent(void)
+{
+       struct udevice *dev;
+       struct phy serdes;
+       int ret;
+
+       if (!IS_ENABLED(CONFIG_PHY_CADENCE_TORRENT))
+               return;
+
+       ret = uclass_get_device_by_driver(UCLASS_PHY,
+                                         DM_DRIVER_GET(torrent_phy_provider),
+                                         &dev);
+       if (ret)
+               printf("Torrent init failed:%d\n", ret);
+
+       serdes.dev = dev;
+       serdes.id = 0;
+
+       ret = generic_phy_init(&serdes);
+       if (ret)
+               printf("phy_init failed!!\n");
+
+       ret = generic_phy_power_on(&serdes);
+       if (ret)
+               printf("phy_power_on failed !!\n");
+}
+
 int board_late_init(void)
 {
        if (IS_ENABLED(CONFIG_TI_I2C_BOARD_DETECT)) {
@@ -394,6 +423,9 @@ int board_late_init(void)
                probe_daughtercards();
        }
 
+       if (board_is_j7200_som())
+               configure_serdes_torrent();
+
        return 0;
 }
 
index fa6c92c..f24e628 100644 (file)
@@ -368,6 +368,9 @@ struct pin_cfg k2g_ice_evm_pin_cfg[] = {
        { 98,   BUFFER_CLASS_B | PIN_PDIS | MODE(0) },  /* MDIO_DATA */
        { 99,   BUFFER_CLASS_B | PIN_PDIS | MODE(0) },  /* MDIO_CLK */
 
+       /* ICSS1 Padconf Workaround */
+       { 202, MODE(1) | PIN_PDIS },    /* PR1_PRU1_GPO1.PR1_PRU1_GPI1 (PR1_MII1_RXD1) */
+
        { MAX_PIN_N, }
 };
 
index 8be1f18..ef8de59 100644 (file)
@@ -37,7 +37,7 @@ CONFIG_MTDIDS_DEFAULT="nand0=nand.0"
 CONFIG_MTDPARTS_DEFAULT="mtdparts=nand.0:128k(NAND.SPL),128k(NAND.SPL.backup1),128k(NAND.SPL.backup2),128k(NAND.SPL.backup3),256k(NAND.u-boot-spl-os),1m(NAND.u-boot),128k(NAND.u-boot-env),128k(NAND.u-boot-env.backup1),8m(NAND.kernel),-(NAND.file-system)"
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_OF_CONTROL=y
-CONFIG_OF_LIST="am335x-evm am335x-bone am335x-boneblack am335x-evmsk am335x-bonegreen am335x-icev2 am335x-pocketbeagle"
+CONFIG_OF_LIST="am335x-evm am335x-bone am335x-sancloud-bbe am335x-boneblack am335x-evmsk am335x-bonegreen am335x-icev2 am335x-pocketbeagle"
 CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
@@ -67,6 +67,7 @@ CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_SMSC=y
 CONFIG_DM_ETH=y
+CONFIG_PHY_GIGE=y
 CONFIG_MII=y
 CONFIG_DRIVER_TI_CPSW=y
 CONFIG_SPI=y
index babed94..eba6d33 100644 (file)
@@ -8,6 +8,7 @@ CONFIG_SOC_K3_AM642=y
 CONFIG_K3_ATF_LOAD_ADDR=0x701c0000
 CONFIG_TARGET_AM642_A53_EVM=y
 CONFIG_ENV_SIZE=0x20000
+CONFIG_ENV_OFFSET=0x680000
 CONFIG_SYS_SPI_U_BOOT_OFFS=0x280000
 CONFIG_SPL_DM_SPI=y
 CONFIG_DEFAULT_DEVICE_TREE="k3-am642-evm"
@@ -29,6 +30,8 @@ CONFIG_BOARD_LATE_INIT=y
 CONFIG_SPL_SYS_MALLOC_SIMPLE=y
 CONFIG_SPL_STACK_R=y
 CONFIG_SPL_SEPARATE_BSS=y
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x1400
 CONFIG_SPL_DMA=y
 CONFIG_SPL_ENV_SUPPORT=y
 CONFIG_SPL_I2C=y
@@ -46,6 +49,7 @@ CONFIG_SPL_YMODEM_SUPPORT=y
 CONFIG_CMD_ASKENV=y
 CONFIG_CMD_DFU=y
 CONFIG_CMD_DM=y
+CONFIG_CMD_GPT=y
 CONFIG_CMD_I2C=y
 CONFIG_CMD_MMC=y
 CONFIG_CMD_USB=y
@@ -56,10 +60,10 @@ CONFIG_OF_LIST="k3-am642-evm k3-am642-sk"
 CONFIG_MULTI_DTB_FIT=y
 CONFIG_SPL_MULTI_DTB_FIT=y
 CONFIG_SPL_MULTI_DTB_FIT_NO_COMPRESSION=y
-CONFIG_ENV_IS_NOWHERE=y
-CONFIG_ENV_IS_IN_FAT=y
-CONFIG_ENV_FAT_DEVICE_AND_PART="1:1"
 CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_ENV_IS_IN_MMC=y
+CONFIG_SYS_MMC_ENV_DEV=0
+CONFIG_SYS_MMC_ENV_PART=1
 CONFIG_DM=y
 CONFIG_SPL_DM=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
@@ -81,6 +85,12 @@ CONFIG_DM_I2C=y
 CONFIG_SYS_I2C_OMAP24XX=y
 CONFIG_DM_MAILBOX=y
 CONFIG_K3_SEC_PROXY=y
+CONFIG_DM_MMC=y
+CONFIG_MMC_HS200_SUPPORT=y
+CONFIG_SPL_MMC_HS200_SUPPORT=y
+CONFIG_MMC_HS400_SUPPORT=y
+CONFIG_SUPPORT_EMMC_BOOT=y
+CONFIG_SPL_MMC_HS400_SUPPORT=y
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_ADMA=y
 CONFIG_SPL_MMC_SDHCI_ADMA=y
@@ -130,4 +140,6 @@ CONFIG_USB_GADGET_VENDOR_NUM=0x0451
 CONFIG_USB_GADGET_PRODUCT_NUM=0x6165
 CONFIG_USB_GADGET_DOWNLOAD=y
 CONFIG_USB_FUNCTION_MASS_STORAGE=y
+CONFIG_FAT_WRITE=y
+CONFIG_OF_LIBFDT_OVERLAY=y
 CONFIG_FS_FAT_MAX_CLUSTSIZE=16384
index a133216..98e9aa4 100644 (file)
@@ -7,11 +7,15 @@ CONFIG_SYS_MALLOC_F_LEN=0x80000
 CONFIG_SOC_K3_AM642=y
 CONFIG_TARGET_AM642_R5_EVM=y
 CONFIG_ENV_SIZE=0x20000
+CONFIG_ENV_OFFSET=0x680000
 CONFIG_SYS_SPI_U_BOOT_OFFS=0x80000
 CONFIG_DM_GPIO=y
 CONFIG_SPL_DM_SPI=y
 CONFIG_DEFAULT_DEVICE_TREE="k3-am642-r5-evm"
-CONFIG_SPL_TEXT_BASE=0x70020000
+CONFIG_SPL_TEXT_BASE=0x70000000
+CONFIG_ENV_IS_IN_MMC=y
+CONFIG_SYS_MMC_ENV_DEV=0
+CONFIG_SYS_MMC_ENV_PART=1
 CONFIG_SPL_MMC_SUPPORT=y
 CONFIG_SPL_SERIAL_SUPPORT=y
 CONFIG_SPL_DRIVERS_MISC=y
@@ -29,6 +33,8 @@ CONFIG_SPL_SIZE_LIMIT_SUBTRACT_GD=y
 CONFIG_SPL_SIZE_LIMIT_SUBTRACT_MALLOC=y
 CONFIG_SPL_SYS_REPORT_STACK_F_USAGE=y
 CONFIG_SPL_BOARD_INIT=y
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x400
 CONFIG_SPL_SYS_MALLOC_SIMPLE=y
 CONFIG_SPL_STACK_R=y
 CONFIG_SPL_SEPARATE_BSS=y
@@ -52,6 +58,7 @@ CONFIG_SPL_YMODEM_SUPPORT=y
 CONFIG_HUSH_PARSER=y
 CONFIG_CMD_ASKENV=y
 CONFIG_CMD_DFU=y
+CONFIG_CMD_GPT=y
 CONFIG_CMD_MMC=y
 CONFIG_CMD_REMOTEPROC=y
 CONFIG_CMD_USB=y
index 14f951f..b7578f8 100644 (file)
@@ -30,6 +30,7 @@ CONFIG_SPL_LOAD_FIT=y
 CONFIG_SPL_LOAD_FIT_ADDRESS=0x81000000
 # CONFIG_USE_SPL_FIT_GENERATOR is not set
 CONFIG_OF_BOARD_SETUP=y
+CONFIG_PREBOOT="run main_cpsw0_qsgmii_phyinit;"
 CONFIG_BOOTCOMMAND="run findfdt; run envboot; run init_${boot}; run boot_rprocs; run get_kern_${boot}; run get_fdt_${boot}; run get_overlay_${boot}; run run_kern"
 CONFIG_LOGLEVEL=7
 CONFIG_SPL_BOARD_INIT=y
@@ -96,6 +97,7 @@ CONFIG_SPL_OF_TRANSLATE=y
 CONFIG_CLK=y
 CONFIG_SPL_CLK=y
 CONFIG_CLK_TI_SCI=y
+CONFIG_CLK_CCF=y
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
 CONFIG_DFU_SF=y
@@ -118,8 +120,8 @@ CONFIG_K3_SEC_PROXY=y
 CONFIG_SUPPORT_EMMC_BOOT=y
 CONFIG_MMC_IO_VOLTAGE=y
 CONFIG_MMC_UHS_SUPPORT=y
-CONFIG_MMC_HS200_SUPPORT=y
-CONFIG_SPL_MMC_HS200_SUPPORT=y
+CONFIG_MMC_HS400_SUPPORT=y
+CONFIG_SPL_MMC_HS400_SUPPORT=y
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_ADMA=y
 CONFIG_SPL_MMC_SDHCI_ADMA=y
@@ -137,9 +139,15 @@ CONFIG_DM_SPI_FLASH=y
 CONFIG_SPI_FLASH_STMICRO=y
 # CONFIG_SPI_FLASH_USE_4K_SECTORS is not set
 CONFIG_SPI_FLASH_MTD=y
+CONFIG_MULTIPLEXER=y
+CONFIG_MUX_MMIO=y
 CONFIG_PHY_FIXED=y
 CONFIG_DM_ETH=y
 CONFIG_TI_AM65_CPSW_NUSS=y
+CONFIG_PHY=y
+CONFIG_SPL_PHY=y
+CONFIG_PHY_CADENCE_TORRENT=y
+CONFIG_PHY_J721E_WIZ=y
 CONFIG_PINCTRL=y
 # CONFIG_PINCTRL_GENERIC is not set
 CONFIG_SPL_PINCTRL=y
index 693f7af..74571cf 100644 (file)
@@ -92,7 +92,7 @@ CONFIG_K3_SEC_PROXY=y
 CONFIG_FS_LOADER=y
 CONFIG_K3_AVS0=y
 CONFIG_SUPPORT_EMMC_BOOT=y
-CONFIG_SPL_MMC_HS200_SUPPORT=y
+CONFIG_SPL_MMC_HS400_SUPPORT=y
 CONFIG_MMC_SDHCI=y
 CONFIG_SPL_MMC_SDHCI_ADMA=y
 CONFIG_MMC_SDHCI_AM654=y
index 3b168fb..a8c6ab7 100644 (file)
@@ -135,9 +135,15 @@ CONFIG_SPI_FLASH_STMICRO=y
 # CONFIG_SPI_FLASH_USE_4K_SECTORS is not set
 CONFIG_SPI_FLASH_MTD=y
 CONFIG_PHY_TI_DP83867=y
+CONFIG_MULTIPLEXER=y
+CONFIG_MUX_MMIO=y
 CONFIG_PHY_FIXED=y
 CONFIG_DM_ETH=y
 CONFIG_TI_AM65_CPSW_NUSS=y
+CONFIG_PHY=y
+CONFIG_SPL_PHY=y
+CONFIG_PHY_CADENCE_SIERRA=y
+CONFIG_PHY_J721E_WIZ=y
 CONFIG_PINCTRL=y
 # CONFIG_PINCTRL_GENERIC is not set
 CONFIG_SPL_PINCTRL=y
index 503975a..0651fd3 100644 (file)
@@ -113,7 +113,6 @@ CONFIG_SPL_DM_REGULATOR=y
 CONFIG_DM_REGULATOR_TPS65941=y
 CONFIG_K3_SYSTEM_CONTROLLER=y
 CONFIG_REMOTEPROC_TI_K3_ARM64=y
-CONFIG_REMOTEPROC_TI_K3_R5F=y
 CONFIG_DM_RESET=y
 CONFIG_RESET_TI_SCI=y
 CONFIG_DM_SERIAL=y
index a6b3952..9e90978 100644 (file)
@@ -27,6 +27,7 @@ Board-specific doc
    socionext/index
    st/index
    tbs/index
+   ti/index
    toradex/index
    xen/index
    xilinx/index
diff --git a/doc/board/ti/j721e_evm.rst b/doc/board/ti/j721e_evm.rst
new file mode 100644 (file)
index 0000000..44dc316
--- /dev/null
@@ -0,0 +1,331 @@
+.. SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
+.. sectionauthor:: Lokesh Vutla <lokeshvutla@ti.com>
+
+Texas Instruments K3 Platforms
+==============================
+
+Introduction:
+-------------
+The J721e family of SoCs are part of K3 Multicore SoC architecture platform
+targeting automotive applications. They are designed as a low power, high
+performance and highly integrated device architecture, adding significant
+enhancement on processing power, graphics capability, video and imaging
+processing, virtualization and coherent memory support.
+
+The device is partitioned into three functional domains, each containing
+specific processing cores and peripherals:
+
+1. Wake-up (WKUP) domain:
+        * Device Management and Security Controller (DMSC)
+
+2. Microcontroller (MCU) domain:
+        * Dual Core ARM Cortex-R5F processor
+
+3. MAIN domain:
+        * Dual core 64-bit ARM Cortex-A72
+        * 2 x Dual cortex ARM Cortex-R5 subsystem
+        * 2 x C66x Digital signal processor sub system
+        * C71x Digital signal processor sub-system with MMA.
+
+More info can be found in TRM: http://www.ti.com/lit/pdf/spruil1
+
+Boot Flow:
+----------
+Boot flow is similar to that of AM65x SoC and extending it with remoteproc
+support. Below is the pictorial representation of boot flow:
+
+.. code-block:: text
+
+ +------------------------------------------------------------------------+-----------------------+
+ |        DMSC            |      MCU R5           |        A72            |  MAIN R5/C66x/C7x     |
+ +------------------------------------------------------------------------+-----------------------+
+ |    +--------+          |                       |                       |                       |
+ |    |  Reset |          |                       |                       |                       |
+ |    +--------+          |                       |                       |                       |
+ |         :              |                       |                       |                       |
+ |    +--------+          |   +-----------+       |                       |                       |
+ |    | *ROM*  |----------|-->| Reset rls |       |                       |                       |
+ |    +--------+          |   +-----------+       |                       |                       |
+ |    |        |          |         :             |                       |                       |
+ |    |  ROM   |          |         :             |                       |                       |
+ |    |services|          |         :             |                       |                       |
+ |    |        |          |   +-------------+     |                       |                       |
+ |    |        |          |   |  *R5 ROM*   |     |                       |                       |
+ |    |        |          |   +-------------+     |                       |                       |
+ |    |        |<---------|---|Load and auth|     |                       |                       |
+ |    |        |          |   | tiboot3.bin |     |                       |                       |
+ |    |        |          |   +-------------+     |                       |                       |
+ |    |        |          |         :             |                       |                       |
+ |    |        |          |         :             |                       |                       |
+ |    |        |          |         :             |                       |                       |
+ |    |        |          |   +-------------+     |                       |                       |
+ |    |        |          |   |  *R5 SPL*   |     |                       |                       |
+ |    |        |          |   +-------------+     |                       |                       |
+ |    |        |          |   |    Load     |     |                       |                       |
+ |    |        |          |   |  sysfw.itb  |     |                       |                       |
+ |    | Start  |          |   +-------------+     |                       |                       |
+ |    | System |<---------|---|    Start    |     |                       |                       |
+ |    |Firmware|          |   |    SYSFW    |     |                       |                       |
+ |    +--------+          |   +-------------+     |                       |                       |
+ |        :               |   |             |     |                       |                       |
+ |    +---------+         |   |   Load      |     |                       |                       |
+ |    | *SYSFW* |         |   |   system    |     |                       |                       |
+ |    +---------+         |   | Config data |     |                       |                       |
+ |    |         |<--------|---|             |     |                       |                       |
+ |    |         |         |   +-------------+     |                       |                       |
+ |    |         |         |   |    DDR      |     |                       |                       |
+ |    |         |         |   |   config    |     |                       |                       |
+ |    |         |         |   +-------------+     |                       |                       |
+ |    |         |         |   |    Load     |     |                       |                       |
+ |    |         |         |   |  tispl.bin  |     |                       |                       |
+ |    |         |         |   +-------------+     |                       |                       |
+ |    |         |         |   |   Load R5   |     |                       |                       |
+ |    |         |         |   |   firmware  |     |                       |                       |
+ |    |         |         |   +-------------+     |                       |                       |
+ |    |         |<--------|---| Start A72   |     |                       |                       |
+ |    |         |         |   | and jump to |     |                       |                       |
+ |    |         |         |   | DM fw image |     |                       |                       |
+ |    |         |         |   +-------------+     |                       |                       |
+ |    |         |         |                       |     +-----------+     |                       |
+ |    |         |---------|-----------------------|---->| Reset rls |     |                       |
+ |    |         |         |                       |     +-----------+     |                       |
+ |    |  TIFS   |         |                       |          :            |                       |
+ |    |Services |         |                       |     +-----------+     |                       |
+ |    |         |<--------|-----------------------|---->|*ATF/OPTEE*|     |                       |
+ |    |         |         |                       |     +-----------+     |                       |
+ |    |         |         |                       |          :            |                       |
+ |    |         |         |                       |     +-----------+     |                       |
+ |    |         |<--------|-----------------------|---->| *A72 SPL* |     |                       |
+ |    |         |         |                       |     +-----------+     |                       |
+ |    |         |         |                       |     |   Load    |     |                       |
+ |    |         |         |                       |     | u-boot.img|     |                       |
+ |    |         |         |                       |     +-----------+     |                       |
+ |    |         |         |                       |          :            |                       |
+ |    |         |         |                       |     +-----------+     |                       |
+ |    |         |<--------|-----------------------|---->| *U-Boot*  |     |                       |
+ |    |         |         |                       |     +-----------+     |                       |
+ |    |         |         |                       |     |  prompt   |     |                       |
+ |    |         |         |                       |     +-----------+     |                       |
+ |    |         |         |                       |     |  Load R5  |     |                       |
+ |    |         |         |                       |     |  Firmware |     |                       |
+ |    |         |         |                       |     +-----------+     |                       |
+ |    |         |<--------|-----------------------|-----|  Start R5 |     |      +-----------+    |
+ |    |         |---------|-----------------------|-----+-----------+-----|----->| R5 starts |    |
+ |    |         |         |                       |     |  Load C6  |     |      +-----------+    |
+ |    |         |         |                       |     |  Firmware |     |                       |
+ |    |         |         |                       |     +-----------+     |                       |
+ |    |         |<--------|-----------------------|-----|  Start C6 |     |      +-----------+    |
+ |    |         |---------|-----------------------|-----+-----------+-----|----->| C6 starts |    |
+ |    |         |         |                       |     |  Load C7  |     |      +-----------+    |
+ |    |         |         |                       |     |  Firmware |     |                       |
+ |    |         |         |                       |     +-----------+     |                       |
+ |    |         |<--------|-----------------------|-----|  Start C7 |     |      +-----------+    |
+ |    |         |---------|-----------------------|-----+-----------+-----|----->| C7 starts |    |
+ |    +---------+         |                       |                       |      +-----------+    |
+ |                        |                       |                       |                       |
+ +------------------------------------------------------------------------+-----------------------+
+
+- Here DMSC acts as master and provides all the critical services. R5/A72
+  requests DMSC to get these services done as shown in the above diagram.
+
+Sources:
+--------
+1. SYSFW:
+       Tree: git://git.ti.com/k3-image-gen/k3-image-gen.git
+       Branch: master
+
+2. ATF:
+       Tree: https://github.com/ARM-software/arm-trusted-firmware.git
+       Branch: master
+
+3. OPTEE:
+       Tree: https://github.com/OP-TEE/optee_os.git
+       Branch: master
+
+4. U-Boot:
+       Tree: https://source.denx.de/u-boot/u-boot
+       Branch: master
+
+Build procedure:
+----------------
+1. SYSFW:
+
+.. code-block:: text
+
+ $ make CROSS_COMPILE=arm-linux-gnueabihf-
+
+2. ATF:
+
+.. code-block:: text
+
+ $ make CROSS_COMPILE=aarch64-linux-gnu- ARCH=aarch64 PLAT=k3 TARGET_BOARD=generic SPD=opteed
+
+3. OPTEE:
+
+.. code-block:: text
+
+ $ make PLATFORM=k3-j721e CFG_ARM64_core=y
+
+4. U-Boot:
+
+* 4.1 R5:
+
+.. code-block:: text
+
+ $ make CROSS_COMPILE=arm-linux-gnueabihf- j721e_evm_r5_defconfig O=/tmp/r5
+ $ make CROSS_COMPILE=arm-linux-gnueabihf- O=/tmp/r5
+
+* 4.2 A72:
+
+.. code-block:: text
+
+ $ make CROSS_COMPILE=aarch64-linux-gnu- j721e_evm_a72_defconfig O=/tmp/a72
+ $ make CROSS_COMPILE=aarch64-linux-gnu- ATF=<path to ATF dir>/build/k3/generic/release/bl31.bin TEE=<path to OPTEE OS dir>/out/arm-plat-k3/core/tee-pager_v2.bin DM=<path to DM firmware image> O=/tmp/a72
+
+Target Images
+--------------
+Copy the below images to an SD card and boot:
+ - sysfw.itb from step 1
+ - tiboot3.bin from step 4.1
+ - tispl.bin, u-boot.img from 4.2
+
+Image formats:
+--------------
+
+- tiboot3.bin:
+
+.. code-block:: text
+
+                +-----------------------+
+                |        X.509          |
+                |      Certificate      |
+                | +-------------------+ |
+                | |                   | |
+                | |        R5         | |
+                | |   u-boot-spl.bin  | |
+                | |                   | |
+                | +-------------------+ |
+                | |                   | |
+                | |     FIT header    | |
+                | | +---------------+ | |
+                | | |               | | |
+                | | |   DTB 1...N   | | |
+                | | +---------------+ | |
+                | +-------------------+ |
+                +-----------------------+
+
+- tispl.bin
+
+.. code-block:: text
+
+                +-----------------------+
+                |                       |
+                |       FIT HEADER      |
+                | +-------------------+ |
+                | |                   | |
+                | |      A72 ATF      | |
+                | +-------------------+ |
+                | |                   | |
+                | |     A72 OPTEE     | |
+                | +-------------------+ |
+                | |                   | |
+                | |      R5 DM FW     | |
+                | +-------------------+ |
+                | |                   | |
+                | |      A72 SPL      | |
+                | +-------------------+ |
+                | |                   | |
+                | |   SPL DTB 1...N   | |
+                | +-------------------+ |
+                +-----------------------+
+
+- sysfw.itb
+
+.. code-block:: text
+
+                +-----------------------+
+                |                       |
+                |       FIT HEADER      |
+                | +-------------------+ |
+                | |                   | |
+                | |     sysfw.bin     | |
+                | +-------------------+ |
+                | |                   | |
+                | |    board config   | |
+                | +-------------------+ |
+                | |                   | |
+                | |     PM config     | |
+                | +-------------------+ |
+                | |                   | |
+                | |     RM config     | |
+                | +-------------------+ |
+                | |                   | |
+                | |    Secure config  | |
+                | +-------------------+ |
+                +-----------------------+
+
+OSPI:
+-----
+ROM supports booting from OSPI from offset 0x0.
+
+Flashing images to OSPI:
+
+Below commands can be used to download tiboot3.bin, tispl.bin, u-boot.img,
+and sysfw.itb over tftp and then flash those to OSPI at their respective
+addresses.
+
+.. code-block:: text
+
+ => sf probe
+ => tftp ${loadaddr} tiboot3.bin
+ => sf update $loadaddr 0x0 $filesize
+ => tftp ${loadaddr} tispl.bin
+ => sf update $loadaddr 0x80000 $filesize
+ => tftp ${loadaddr} u-boot.img
+ => sf update $loadaddr 0x280000 $filesize
+ => tftp ${loadaddr} sysfw.itb
+ => sf update $loadaddr 0x6C0000 $filesize
+
+Flash layout for OSPI:
+
+.. code-block:: text
+
+         0x0 +----------------------------+
+             |     ospi.tiboot3(512K)     |
+             |                            |
+     0x80000 +----------------------------+
+             |     ospi.tispl(2M)         |
+             |                            |
+    0x280000 +----------------------------+
+             |     ospi.u-boot(4M)        |
+             |                            |
+    0x680000 +----------------------------+
+             |     ospi.env(128K)         |
+             |                            |
+    0x6A0000 +----------------------------+
+            |   ospi.env.backup (128K)   |
+            |                            |
+    0x6C0000 +----------------------------+
+             |      ospi.sysfw(1M)        |
+             |                            |
+    0x7C0000 +----------------------------+
+            |      padding (256k)        |
+    0x800000 +----------------------------+
+             |     ospi.rootfs(UBIFS)     |
+             |                            |
+             +----------------------------+
+
+Firmwares:
+----------
+
+The J721e u-boot allows firmware to be loaded for the Cortex-R5 subsystem.
+The CPSW5G in J7200 and CPSW9G in J721E present in MAIN domain is configured
+and controlled by the ethernet firmware that executes in the MAIN Cortex R5.
+The default supported environment variables support loading these firmwares
+from only MMC. "dorprocboot" env variable has to be set for the U-BOOT to load
+and start the remote cores in the system.
+
+J721E common processor board can be attached to a Ethernet QSGMII card and the
+PHY in the card has to be reset before it can be used for data transfer.
+"do_main_cpsw0_qsgmii_phyinit" env variable has to be set for the U-BOOT to
+configure this PHY.
index dda6c76..701b23e 100644 (file)
 #include <linux/ioport.h>
 #include <asm/global_data.h>
 
+bool ofnode_name_eq(ofnode node, const char *name)
+{
+       const char *node_name;
+       size_t len;
+
+       assert(ofnode_valid(node));
+
+       node_name = ofnode_get_name(node);
+       len = strchrnul(node_name, '@') - node_name;
+
+       return (strlen(name) == len) && !strncmp(node_name, name, len);
+}
+
 int ofnode_read_u32(ofnode node, const char *propname, u32 *outp)
 {
        return ofnode_read_u32_index(node, propname, 0, outp);
index a86d96a..4305967 100644 (file)
@@ -619,6 +619,7 @@ static int am654_sdhci_of_to_plat(struct udevice *dev)
                }
        }
 
+       dev_read_u32(dev, "ti,strobe-sel", &plat->strb_sel);
        dev_read_u32(dev, "ti,clkbuf-sel", &plat->clkbuf_sel);
 
        ret = mmc_of_parse(dev, cfg);
index d9ab6a0..eea4701 100644 (file)
@@ -507,6 +507,9 @@ void sdhci_set_uhs_timing(struct sdhci_host *host)
        case MMC_HS_200:
                reg |= SDHCI_CTRL_UHS_SDR104;
                break;
+       case MMC_HS_400:
+               reg |= SDHCI_CTRL_HS400;
+               break;
        default:
                reg |= SDHCI_CTRL_UHS_SDR12;
        }
index 80ae1af..4767d21 100644 (file)
@@ -282,4 +282,7 @@ config PHY_IMX8MQ_USB
          Support the USB3.0 PHY in NXP i.MX8MQ SoC
 
 source "drivers/phy/rockchip/Kconfig"
+source "drivers/phy/cadence/Kconfig"
+source "drivers/phy/ti/Kconfig"
+
 endmenu
index b2285c4..13a8ade 100644 (file)
@@ -38,3 +38,5 @@ obj-$(CONFIG_MT76X8_USB_PHY) += mt76x8-usb-phy.o
 obj-$(CONFIG_PHY_DA8XX_USB) += phy-da8xx-usb.o
 obj-$(CONFIG_PHY_MTK_TPHY) += phy-mtk-tphy.o
 obj-$(CONFIG_PHY_IMX8MQ_USB) += phy-imx8mq-usb.o
+obj-y += cadence/
+obj-y += ti/
diff --git a/drivers/phy/cadence/Kconfig b/drivers/phy/cadence/Kconfig
new file mode 100644 (file)
index 0000000..549ddbf
--- /dev/null
@@ -0,0 +1,11 @@
+config PHY_CADENCE_SIERRA
+       tristate "Cadence Sierra PHY Driver"
+       depends on DM_RESET
+       help
+         Enable this to support the Cadence Sierra PHY driver
+
+config PHY_CADENCE_TORRENT
+       tristate "Cadence Torrent PHY Driver"
+       depends on DM_RESET
+       help
+         Enable this to support the Cadence Torrent PHY driver
diff --git a/drivers/phy/cadence/Makefile b/drivers/phy/cadence/Makefile
new file mode 100644 (file)
index 0000000..af63b32
--- /dev/null
@@ -0,0 +1,2 @@
+obj-$(CONFIG_$(SPL_)PHY_CADENCE_SIERRA)        += phy-cadence-sierra.o
+obj-$(CONFIG_$(SPL_)PHY_CADENCE_TORRENT) += phy-cadence-torrent.o
diff --git a/drivers/phy/cadence/phy-cadence-sierra.c b/drivers/phy/cadence/phy-cadence-sierra.c
new file mode 100644 (file)
index 0000000..715def6
--- /dev/null
@@ -0,0 +1,751 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Cadence Sierra PHY Driver
+ *
+ * Based on the linux driver provided by Cadence
+ *
+ * Copyright (c) 2018 Cadence Design Systems
+ * Author: Alan Douglas <adouglas@cadence.com>
+ *
+ * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/
+ * Jean-Jacques Hiblot <jjhiblot@ti.com>
+ *
+ */
+#include <common.h>
+#include <clk.h>
+#include <generic-phy.h>
+#include <reset.h>
+#include <dm/device.h>
+#include <dm/device-internal.h>
+#include <dm/device_compat.h>
+#include <dm/lists.h>
+#include <dm/read.h>
+#include <dm/uclass.h>
+#include <dm/devres.h>
+#include <linux/io.h>
+#include <dt-bindings/phy/phy.h>
+#include <regmap.h>
+
+/* PHY register offsets */
+#define SIERRA_COMMON_CDB_OFFSET                       0x0
+#define SIERRA_MACRO_ID_REG                            0x0
+#define SIERRA_CMN_PLLLC_MODE_PREG                     0x48
+#define SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG           0x49
+#define SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG           0x4A
+#define SIERRA_CMN_PLLLC_LOCK_CNTSTART_PREG            0x4B
+#define SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG              0x4F
+#define SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG              0x50
+#define SIERRA_CMN_PLLLC_SS_TIME_STEPSIZE_MODE_PREG    0x62
+
+#define SIERRA_LANE_CDB_OFFSET(ln, offset)     \
+                               (0x4000 + ((ln) * (0x800 >> (2 - (offset)))))
+
+#define SIERRA_DET_STANDEC_A_PREG                      0x000
+#define SIERRA_DET_STANDEC_B_PREG                      0x001
+#define SIERRA_DET_STANDEC_C_PREG                      0x002
+#define SIERRA_DET_STANDEC_D_PREG                      0x003
+#define SIERRA_DET_STANDEC_E_PREG                      0x004
+#define SIERRA_PSM_LANECAL_DLY_A1_RESETS_PREG          0x008
+#define SIERRA_PSM_A0IN_TMR_PREG                       0x009
+#define SIERRA_PSM_DIAG_PREG                           0x015
+#define SIERRA_PSC_TX_A0_PREG                          0x028
+#define SIERRA_PSC_TX_A1_PREG                          0x029
+#define SIERRA_PSC_TX_A2_PREG                          0x02A
+#define SIERRA_PSC_TX_A3_PREG                          0x02B
+#define SIERRA_PSC_RX_A0_PREG                          0x030
+#define SIERRA_PSC_RX_A1_PREG                          0x031
+#define SIERRA_PSC_RX_A2_PREG                          0x032
+#define SIERRA_PSC_RX_A3_PREG                          0x033
+#define SIERRA_PLLCTRL_SUBRATE_PREG                    0x03A
+#define SIERRA_PLLCTRL_GEN_D_PREG                      0x03E
+#define SIERRA_PLLCTRL_CPGAIN_MODE_PREG                        0x03F
+#define SIERRA_PLLCTRL_STATUS_PREG                     0x044
+#define SIERRA_CLKPATH_BIASTRIM_PREG                   0x04B
+#define SIERRA_DFE_BIASTRIM_PREG                       0x04C
+#define SIERRA_DRVCTRL_ATTEN_PREG                      0x06A
+#define SIERRA_CLKPATHCTRL_TMR_PREG                    0x081
+#define SIERRA_RX_CREQ_FLTR_A_MODE3_PREG               0x085
+#define SIERRA_RX_CREQ_FLTR_A_MODE2_PREG               0x086
+#define SIERRA_RX_CREQ_FLTR_A_MODE1_PREG               0x087
+#define SIERRA_RX_CREQ_FLTR_A_MODE0_PREG               0x088
+#define SIERRA_CREQ_CCLKDET_MODE01_PREG                        0x08E
+#define SIERRA_RX_CTLE_MAINTENANCE_PREG                        0x091
+#define SIERRA_CREQ_FSMCLK_SEL_PREG                    0x092
+#define SIERRA_CREQ_EQ_CTRL_PREG                       0x093
+#define SIERRA_CREQ_SPARE_PREG                         0x096
+#define SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG            0x097
+#define SIERRA_CTLELUT_CTRL_PREG                       0x098
+#define SIERRA_DFE_ECMP_RATESEL_PREG                   0x0C0
+#define SIERRA_DFE_SMP_RATESEL_PREG                    0x0C1
+#define SIERRA_DEQ_PHALIGN_CTRL                                0x0C4
+#define SIERRA_DEQ_CONCUR_CTRL1_PREG                   0x0C8
+#define SIERRA_DEQ_CONCUR_CTRL2_PREG                   0x0C9
+#define SIERRA_DEQ_EPIPWR_CTRL2_PREG                   0x0CD
+#define SIERRA_DEQ_FAST_MAINT_CYCLES_PREG              0x0CE
+#define SIERRA_DEQ_ERRCMP_CTRL_PREG                    0x0D0
+#define SIERRA_DEQ_OFFSET_CTRL_PREG                    0x0D8
+#define SIERRA_DEQ_GAIN_CTRL_PREG                      0x0E0
+#define SIERRA_DEQ_VGATUNE_CTRL_PREG                   0x0E1
+#define SIERRA_DEQ_GLUT0                               0x0E8
+#define SIERRA_DEQ_GLUT1                               0x0E9
+#define SIERRA_DEQ_GLUT2                               0x0EA
+#define SIERRA_DEQ_GLUT3                               0x0EB
+#define SIERRA_DEQ_GLUT4                               0x0EC
+#define SIERRA_DEQ_GLUT5                               0x0ED
+#define SIERRA_DEQ_GLUT6                               0x0EE
+#define SIERRA_DEQ_GLUT7                               0x0EF
+#define SIERRA_DEQ_GLUT8                               0x0F0
+#define SIERRA_DEQ_GLUT9                               0x0F1
+#define SIERRA_DEQ_GLUT10                              0x0F2
+#define SIERRA_DEQ_GLUT11                              0x0F3
+#define SIERRA_DEQ_GLUT12                              0x0F4
+#define SIERRA_DEQ_GLUT13                              0x0F5
+#define SIERRA_DEQ_GLUT14                              0x0F6
+#define SIERRA_DEQ_GLUT15                              0x0F7
+#define SIERRA_DEQ_GLUT16                              0x0F8
+#define SIERRA_DEQ_ALUT0                               0x108
+#define SIERRA_DEQ_ALUT1                               0x109
+#define SIERRA_DEQ_ALUT2                               0x10A
+#define SIERRA_DEQ_ALUT3                               0x10B
+#define SIERRA_DEQ_ALUT4                               0x10C
+#define SIERRA_DEQ_ALUT5                               0x10D
+#define SIERRA_DEQ_ALUT6                               0x10E
+#define SIERRA_DEQ_ALUT7                               0x10F
+#define SIERRA_DEQ_ALUT8                               0x110
+#define SIERRA_DEQ_ALUT9                               0x111
+#define SIERRA_DEQ_ALUT10                              0x112
+#define SIERRA_DEQ_ALUT11                              0x113
+#define SIERRA_DEQ_ALUT12                              0x114
+#define SIERRA_DEQ_ALUT13                              0x115
+#define SIERRA_DEQ_DFETAP_CTRL_PREG                    0x128
+#define SIERRA_DFE_EN_1010_IGNORE_PREG                 0x134
+#define SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG           0x150
+#define SIERRA_DEQ_TAU_CTRL2_PREG                      0x151
+#define SIERRA_DEQ_PICTRL_PREG                         0x161
+#define SIERRA_CPICAL_TMRVAL_MODE1_PREG                        0x170
+#define SIERRA_CPICAL_TMRVAL_MODE0_PREG                        0x171
+#define SIERRA_CPICAL_PICNT_MODE1_PREG                 0x174
+#define SIERRA_CPI_OUTBUF_RATESEL_PREG                 0x17C
+#define SIERRA_CPICAL_RES_STARTCODE_MODE23_PREG                0x183
+#define SIERRA_LFPSDET_SUPPORT_PREG                    0x188
+#define SIERRA_LFPSFILT_NS_PREG                                0x18A
+#define SIERRA_LFPSFILT_RD_PREG                                0x18B
+#define SIERRA_LFPSFILT_MP_PREG                                0x18C
+#define SIERRA_SIGDET_SUPPORT_PREG                     0x190
+#define SIERRA_SDFILT_H2L_A_PREG                       0x191
+#define SIERRA_SDFILT_L2H_PREG                         0x193
+#define SIERRA_RXBUFFER_CTLECTRL_PREG                  0x19E
+#define SIERRA_RXBUFFER_RCDFECTRL_PREG                 0x19F
+#define SIERRA_RXBUFFER_DFECTRL_PREG                   0x1A0
+#define SIERRA_DEQ_TAU_CTRL1_FAST_MAINT_PREG           0x14F
+#define SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG           0x150
+
+#define SIERRA_PHY_CONFIG_CTRL_OFFSET                  0xc000
+#define SIERRA_PHY_PLL_CFG                             0xe
+
+#define SIERRA_MACRO_ID                                        0x00007364
+#define SIERRA_MAX_LANES                               16
+#define PLL_LOCK_TIME                                  100
+
+static const struct reg_field macro_id_type =
+                               REG_FIELD(SIERRA_MACRO_ID_REG, 0, 15);
+static const struct reg_field phy_pll_cfg_1 =
+                               REG_FIELD(SIERRA_PHY_PLL_CFG, 1, 1);
+static const struct reg_field pllctrl_lock =
+                               REG_FIELD(SIERRA_PLLCTRL_STATUS_PREG, 0, 0);
+
+#define reset_control_assert(rst) cdns_reset_assert(rst)
+#define reset_control_deassert(rst) cdns_reset_deassert(rst)
+#define reset_control reset_ctl
+
+struct cdns_sierra_inst {
+       u32 phy_type;
+       u32 num_lanes;
+       u32 mlane;
+       struct reset_ctl_bulk *lnk_rst;
+};
+
+struct cdns_reg_pairs {
+       u16 val;
+       u32 off;
+};
+
+struct cdns_sierra_data {
+               u32 id_value;
+               u8 block_offset_shift;
+               u8 reg_offset_shift;
+               u32 pcie_cmn_regs;
+               u32 pcie_ln_regs;
+               u32 usb_cmn_regs;
+               u32 usb_ln_regs;
+               struct cdns_reg_pairs *pcie_cmn_vals;
+               struct cdns_reg_pairs *pcie_ln_vals;
+               struct cdns_reg_pairs *usb_cmn_vals;
+               struct cdns_reg_pairs *usb_ln_vals;
+};
+
+struct cdns_regmap_cdb_context {
+       struct udevice *dev;
+       void __iomem *base;
+       u8 reg_offset_shift;
+};
+
+struct cdns_sierra_phy {
+       struct udevice *dev;
+       void *base;
+       size_t size;
+       struct regmap *regmap;
+       struct cdns_sierra_data *init_data;
+       struct cdns_sierra_inst phys[SIERRA_MAX_LANES];
+       struct reset_control *phy_rst;
+       struct regmap *regmap_lane_cdb[SIERRA_MAX_LANES];
+       struct regmap *regmap_phy_config_ctrl;
+       struct regmap *regmap_common_cdb;
+       struct regmap_field *macro_id_type;
+       struct regmap_field *phy_pll_cfg_1;
+       struct regmap_field *pllctrl_lock[SIERRA_MAX_LANES];
+       struct clk *clk;
+       struct clk *cmn_refclk;
+       struct clk *cmn_refclk1;
+       int nsubnodes;
+       u32 num_lanes;
+       bool autoconf;
+};
+
+static inline int cdns_reset_assert(struct reset_control *rst)
+{
+       if (rst)
+               return reset_assert(rst);
+       else
+               return 0;
+}
+
+static inline int cdns_reset_deassert(struct reset_control *rst)
+{
+       if (rst)
+               return reset_deassert(rst);
+       else
+               return 0;
+}
+
+static inline struct cdns_sierra_inst *phy_get_drvdata(struct phy *phy)
+{
+       struct cdns_sierra_phy *sp = dev_get_priv(phy->dev);
+       int index;
+
+       if (phy->id >= SIERRA_MAX_LANES)
+               return NULL;
+
+       for (index = 0; index < sp->nsubnodes; index++) {
+               if (phy->id == sp->phys[index].mlane)
+                       return &sp->phys[index];
+       }
+
+       return NULL;
+}
+
+static int cdns_sierra_phy_init(struct phy *gphy)
+{
+       struct cdns_sierra_inst *ins = phy_get_drvdata(gphy);
+       struct cdns_sierra_phy *phy = dev_get_priv(gphy->dev);
+       struct regmap *regmap = phy->regmap;
+       int i, j;
+       struct cdns_reg_pairs *cmn_vals, *ln_vals;
+       u32 num_cmn_regs, num_ln_regs;
+
+       /* Initialise the PHY registers, unless auto configured */
+       if (phy->autoconf)
+               return 0;
+
+       clk_set_rate(phy->cmn_refclk, 25000000);
+       clk_set_rate(phy->cmn_refclk1, 25000000);
+
+       if (ins->phy_type == PHY_TYPE_PCIE) {
+               num_cmn_regs = phy->init_data->pcie_cmn_regs;
+               num_ln_regs = phy->init_data->pcie_ln_regs;
+               cmn_vals = phy->init_data->pcie_cmn_vals;
+               ln_vals = phy->init_data->pcie_ln_vals;
+       } else if (ins->phy_type == PHY_TYPE_USB3) {
+               num_cmn_regs = phy->init_data->usb_cmn_regs;
+               num_ln_regs = phy->init_data->usb_ln_regs;
+               cmn_vals = phy->init_data->usb_cmn_vals;
+               ln_vals = phy->init_data->usb_ln_vals;
+       } else {
+               return -EINVAL;
+       }
+
+       regmap = phy->regmap_common_cdb;
+       for (j = 0; j < num_cmn_regs ; j++)
+               regmap_write(regmap, cmn_vals[j].off, cmn_vals[j].val);
+
+       for (i = 0; i < ins->num_lanes; i++) {
+               for (j = 0; j < num_ln_regs ; j++) {
+                       regmap = phy->regmap_lane_cdb[i + ins->mlane];
+                       regmap_write(regmap, ln_vals[j].off, ln_vals[j].val);
+               }
+       }
+
+       return 0;
+}
+
+static int cdns_sierra_phy_on(struct phy *gphy)
+{
+       struct cdns_sierra_inst *ins = phy_get_drvdata(gphy);
+       struct cdns_sierra_phy *sp = dev_get_priv(gphy->dev);
+       struct udevice *dev = gphy->dev;
+       u32 val;
+       int ret;
+
+       /* Take the PHY lane group out of reset */
+       ret = reset_deassert_bulk(ins->lnk_rst);
+       if (ret) {
+               dev_err(dev, "Failed to take the PHY lane out of reset\n");
+               return ret;
+       }
+
+       ret = regmap_field_read_poll_timeout(sp->pllctrl_lock[ins->mlane],
+                                            val, val, 1000, PLL_LOCK_TIME);
+       if (ret < 0)
+               dev_err(dev, "PLL lock of lane failed\n");
+
+       reset_control_assert(sp->phy_rst);
+       reset_control_deassert(sp->phy_rst);
+
+       return ret;
+}
+
+static int cdns_sierra_phy_off(struct phy *gphy)
+{
+       struct cdns_sierra_inst *ins = phy_get_drvdata(gphy);
+
+       return reset_assert_bulk(ins->lnk_rst);
+}
+
+static int cdns_sierra_phy_reset(struct phy *gphy)
+{
+       struct cdns_sierra_phy *sp = dev_get_priv(gphy->dev);
+
+       reset_control_assert(sp->phy_rst);
+       reset_control_deassert(sp->phy_rst);
+       return 0;
+};
+
+static const struct phy_ops ops = {
+       .init           = cdns_sierra_phy_init,
+       .power_on       = cdns_sierra_phy_on,
+       .power_off      = cdns_sierra_phy_off,
+       .reset          = cdns_sierra_phy_reset,
+};
+
+static int cdns_sierra_get_optional(struct cdns_sierra_inst *inst,
+                                   ofnode child)
+{
+       if (ofnode_read_u32(child, "reg", &inst->mlane))
+               return -EINVAL;
+
+       if (ofnode_read_u32(child, "cdns,num-lanes", &inst->num_lanes))
+               return -EINVAL;
+
+       if (ofnode_read_u32(child, "cdns,phy-type", &inst->phy_type))
+               return -EINVAL;
+
+       return 0;
+}
+
+static struct regmap *cdns_regmap_init(struct udevice *dev, void __iomem *base,
+                                      u32 block_offset, u8 block_offset_shift,
+                                      u8 reg_offset_shift)
+{
+       struct cdns_sierra_phy *sp = dev_get_priv(dev);
+       struct regmap_config config;
+
+       config.r_start = (ulong)(base + (block_offset << block_offset_shift));
+       config.r_size = sp->size - (block_offset << block_offset_shift);
+       config.reg_offset_shift = reg_offset_shift;
+       config.width = REGMAP_SIZE_16;
+
+       return devm_regmap_init(dev, NULL, NULL, &config);
+}
+
+static int cdns_regfield_init(struct cdns_sierra_phy *sp)
+{
+       struct udevice *dev = sp->dev;
+       struct regmap_field *field;
+       struct regmap *regmap;
+       int i;
+
+       regmap = sp->regmap_common_cdb;
+       field = devm_regmap_field_alloc(dev, regmap, macro_id_type);
+       if (IS_ERR(field)) {
+               dev_err(dev, "MACRO_ID_TYPE reg field init failed\n");
+               return PTR_ERR(field);
+       }
+       sp->macro_id_type = field;
+
+       regmap = sp->regmap_phy_config_ctrl;
+       field = devm_regmap_field_alloc(dev, regmap, phy_pll_cfg_1);
+       if (IS_ERR(field)) {
+               dev_err(dev, "PHY_PLL_CFG_1 reg field init failed\n");
+               return PTR_ERR(field);
+       }
+       sp->phy_pll_cfg_1 = field;
+
+       for (i = 0; i < SIERRA_MAX_LANES; i++) {
+               regmap = sp->regmap_lane_cdb[i];
+               field = devm_regmap_field_alloc(dev, regmap, pllctrl_lock);
+               if (IS_ERR(field)) {
+                       dev_err(dev, "P%d_ENABLE reg field init failed\n", i);
+                       return PTR_ERR(field);
+               }
+               sp->pllctrl_lock[i] =  field;
+       }
+
+       return 0;
+}
+
+static int cdns_regmap_init_blocks(struct cdns_sierra_phy *sp,
+                                  void __iomem *base, u8 block_offset_shift,
+                                  u8 reg_offset_shift)
+{
+       struct udevice *dev = sp->dev;
+       struct regmap *regmap;
+       u32 block_offset;
+       int i;
+
+       for (i = 0; i < SIERRA_MAX_LANES; i++) {
+               block_offset = SIERRA_LANE_CDB_OFFSET(i, reg_offset_shift);
+               regmap = cdns_regmap_init(dev, base, block_offset,
+                                         block_offset_shift, reg_offset_shift);
+               if (IS_ERR(regmap)) {
+                       dev_err(dev, "Failed to init lane CDB regmap\n");
+                       return PTR_ERR(regmap);
+               }
+               sp->regmap_lane_cdb[i] = regmap;
+       }
+
+       regmap = cdns_regmap_init(dev, base, SIERRA_COMMON_CDB_OFFSET,
+                                 block_offset_shift, reg_offset_shift);
+       if (IS_ERR(regmap)) {
+               dev_err(dev, "Failed to init common CDB regmap\n");
+               return PTR_ERR(regmap);
+       }
+       sp->regmap_common_cdb = regmap;
+
+       regmap = cdns_regmap_init(dev, base, SIERRA_PHY_CONFIG_CTRL_OFFSET,
+                                 block_offset_shift, reg_offset_shift);
+       if (IS_ERR(regmap)) {
+               dev_err(dev, "Failed to init PHY config and control regmap\n");
+               return PTR_ERR(regmap);
+       }
+       sp->regmap_phy_config_ctrl = regmap;
+
+       return 0;
+}
+
+static int cdns_sierra_phy_probe(struct udevice *dev)
+{
+       struct cdns_sierra_phy *sp = dev_get_priv(dev);
+       struct cdns_sierra_data *data;
+       unsigned int id_value;
+       int ret, node = 0;
+       struct clk *clk;
+       ofnode child;
+
+       sp->dev = dev;
+
+       sp->base =  devfdt_remap_addr_index(dev, 0);
+       if (!sp->base) {
+               dev_err(dev, "unable to map regs\n");
+               return -ENOMEM;
+       }
+       devfdt_get_addr_size_index(dev, 0, (fdt_size_t *)&sp->size);
+
+       /* Get init data for this PHY */
+       data = (struct cdns_sierra_data *)dev_get_driver_data(dev);
+       sp->init_data = data;
+
+       ret = cdns_regmap_init_blocks(sp, sp->base, data->block_offset_shift,
+                                     data->reg_offset_shift);
+       if (ret)
+               return ret;
+
+       ret = cdns_regfield_init(sp);
+       if (ret)
+               return ret;
+
+       sp->clk = devm_clk_get_optional(dev, "phy_clk");
+       if (IS_ERR(sp->clk)) {
+               dev_err(dev, "failed to get clock phy_clk\n");
+               return PTR_ERR(sp->clk);
+       }
+
+       sp->phy_rst = devm_reset_control_get(dev, "sierra_reset");
+       if (IS_ERR(sp->phy_rst)) {
+               dev_err(dev, "failed to get reset\n");
+               return PTR_ERR(sp->phy_rst);
+       }
+
+       clk = devm_clk_get_optional(dev, "cmn_refclk_dig_div");
+       if (IS_ERR(clk)) {
+               dev_err(dev, "cmn_refclk clock not found\n");
+               ret = PTR_ERR(clk);
+               return ret;
+       }
+       sp->cmn_refclk = clk;
+
+       clk = devm_clk_get_optional(dev, "cmn_refclk1_dig_div");
+       if (IS_ERR(clk)) {
+               dev_err(dev, "cmn_refclk1 clock not found\n");
+               ret = PTR_ERR(clk);
+               return ret;
+       }
+       sp->cmn_refclk1 = clk;
+
+       ret = clk_prepare_enable(sp->clk);
+       if (ret)
+               return ret;
+
+       /* Check that PHY is present */
+       regmap_field_read(sp->macro_id_type, &id_value);
+       if  (sp->init_data->id_value != id_value) {
+               dev_err(dev, "PHY not found 0x%x vs 0x%x\n",
+                       sp->init_data->id_value, id_value);
+               ret = -EINVAL;
+               goto clk_disable;
+       }
+
+       sp->autoconf = dev_read_bool(dev, "cdns,autoconf");
+
+       ofnode_for_each_subnode(child, dev_ofnode(dev)) {
+               sp->phys[node].lnk_rst = devm_reset_bulk_get_by_node(dev,
+                                                                    child);
+               if (IS_ERR(sp->phys[node].lnk_rst)) {
+                       ret = PTR_ERR(sp->phys[node].lnk_rst);
+                       dev_err(dev, "failed to get reset %s\n",
+                               ofnode_get_name(child));
+                       goto put_child2;
+               }
+
+               if (!sp->autoconf) {
+                       ret = cdns_sierra_get_optional(&sp->phys[node], child);
+                       if (ret) {
+                               dev_err(dev, "missing property in node %s\n",
+                                       ofnode_get_name(child));
+                               goto put_child;
+                       }
+               }
+               sp->num_lanes += sp->phys[node].num_lanes;
+
+               node++;
+       }
+       sp->nsubnodes = node;
+
+       /* If more than one subnode, configure the PHY as multilink */
+       if (!sp->autoconf && sp->nsubnodes > 1)
+               regmap_field_write(sp->phy_pll_cfg_1, 0x1);
+
+       reset_control_deassert(sp->phy_rst);
+       dev_info(dev, "sierra probed\n");
+       return 0;
+
+put_child:
+       node++;
+put_child2:
+
+clk_disable:
+       clk_disable_unprepare(sp->clk);
+       return ret;
+}
+
+static int cdns_sierra_phy_remove(struct udevice *dev)
+{
+       struct cdns_sierra_phy *phy = dev_get_priv(dev);
+       int i;
+
+       reset_control_assert(phy->phy_rst);
+
+       /*
+        * The device level resets will be put automatically.
+        * Need to put the subnode resets here though.
+        */
+       for (i = 0; i < phy->nsubnodes; i++)
+               reset_assert_bulk(phy->phys[i].lnk_rst);
+
+       return 0;
+}
+
+/* refclk100MHz_32b_PCIe_cmn_pll_ext_ssc */
+static struct cdns_reg_pairs cdns_pcie_cmn_regs_ext_ssc[] = {
+       {0x2106, SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG},
+       {0x2106, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG},
+       {0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG},
+       {0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG},
+       {0x1B1B, SIERRA_CMN_PLLLC_SS_TIME_STEPSIZE_MODE_PREG}
+};
+
+/* refclk100MHz_32b_PCIe_ln_ext_ssc */
+static struct cdns_reg_pairs cdns_pcie_ln_regs_ext_ssc[] = {
+       {0x813E, SIERRA_CLKPATHCTRL_TMR_PREG},
+       {0x8047, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG},
+       {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG},
+       {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG},
+       {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG},
+       {0x033C, SIERRA_RX_CTLE_MAINTENANCE_PREG},
+       {0x44CC, SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG}
+};
+
+/* refclk100MHz_20b_USB_cmn_pll_ext_ssc */
+static struct cdns_reg_pairs cdns_usb_cmn_regs_ext_ssc[] = {
+       {0x2085, SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG},
+       {0x2085, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG},
+       {0x0000, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG},
+       {0x0000, SIERRA_CMN_PLLLC_SS_TIME_STEPSIZE_MODE_PREG}
+};
+
+/* refclk100MHz_20b_USB_ln_ext_ssc */
+static struct cdns_reg_pairs cdns_usb_ln_regs_ext_ssc[] = {
+       {0xFE0A, SIERRA_DET_STANDEC_A_PREG},
+       {0x000F, SIERRA_DET_STANDEC_B_PREG},
+       {0x00A5, SIERRA_DET_STANDEC_C_PREG},
+       {0x69ad, SIERRA_DET_STANDEC_D_PREG},
+       {0x0241, SIERRA_DET_STANDEC_E_PREG},
+       {0x0010, SIERRA_PSM_LANECAL_DLY_A1_RESETS_PREG},
+       {0x0014, SIERRA_PSM_A0IN_TMR_PREG},
+       {0xCF00, SIERRA_PSM_DIAG_PREG},
+       {0x001F, SIERRA_PSC_TX_A0_PREG},
+       {0x0007, SIERRA_PSC_TX_A1_PREG},
+       {0x0003, SIERRA_PSC_TX_A2_PREG},
+       {0x0003, SIERRA_PSC_TX_A3_PREG},
+       {0x0FFF, SIERRA_PSC_RX_A0_PREG},
+       {0x0619, SIERRA_PSC_RX_A1_PREG},
+       {0x0003, SIERRA_PSC_RX_A2_PREG},
+       {0x0001, SIERRA_PSC_RX_A3_PREG},
+       {0x0001, SIERRA_PLLCTRL_SUBRATE_PREG},
+       {0x0406, SIERRA_PLLCTRL_GEN_D_PREG},
+       {0x5233, SIERRA_PLLCTRL_CPGAIN_MODE_PREG},
+       {0x00CA, SIERRA_CLKPATH_BIASTRIM_PREG},
+       {0x2512, SIERRA_DFE_BIASTRIM_PREG},
+       {0x0000, SIERRA_DRVCTRL_ATTEN_PREG},
+       {0x873E, SIERRA_CLKPATHCTRL_TMR_PREG},
+       {0x03CF, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG},
+       {0x01CE, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG},
+       {0x7B3C, SIERRA_CREQ_CCLKDET_MODE01_PREG},
+       {0x033F, SIERRA_RX_CTLE_MAINTENANCE_PREG},
+       {0x3232, SIERRA_CREQ_FSMCLK_SEL_PREG},
+       {0x0000, SIERRA_CREQ_EQ_CTRL_PREG},
+       {0x8000, SIERRA_CREQ_SPARE_PREG},
+       {0xCC44, SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG},
+       {0x8453, SIERRA_CTLELUT_CTRL_PREG},
+       {0x4110, SIERRA_DFE_ECMP_RATESEL_PREG},
+       {0x4110, SIERRA_DFE_SMP_RATESEL_PREG},
+       {0x0002, SIERRA_DEQ_PHALIGN_CTRL},
+       {0x3200, SIERRA_DEQ_CONCUR_CTRL1_PREG},
+       {0x5064, SIERRA_DEQ_CONCUR_CTRL2_PREG},
+       {0x0030, SIERRA_DEQ_EPIPWR_CTRL2_PREG},
+       {0x0048, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG},
+       {0x5A5A, SIERRA_DEQ_ERRCMP_CTRL_PREG},
+       {0x02F5, SIERRA_DEQ_OFFSET_CTRL_PREG},
+       {0x02F5, SIERRA_DEQ_GAIN_CTRL_PREG},
+       {0x9A8A, SIERRA_DEQ_VGATUNE_CTRL_PREG},
+       {0x0014, SIERRA_DEQ_GLUT0},
+       {0x0014, SIERRA_DEQ_GLUT1},
+       {0x0014, SIERRA_DEQ_GLUT2},
+       {0x0014, SIERRA_DEQ_GLUT3},
+       {0x0014, SIERRA_DEQ_GLUT4},
+       {0x0014, SIERRA_DEQ_GLUT5},
+       {0x0014, SIERRA_DEQ_GLUT6},
+       {0x0014, SIERRA_DEQ_GLUT7},
+       {0x0014, SIERRA_DEQ_GLUT8},
+       {0x0014, SIERRA_DEQ_GLUT9},
+       {0x0014, SIERRA_DEQ_GLUT10},
+       {0x0014, SIERRA_DEQ_GLUT11},
+       {0x0014, SIERRA_DEQ_GLUT12},
+       {0x0014, SIERRA_DEQ_GLUT13},
+       {0x0014, SIERRA_DEQ_GLUT14},
+       {0x0014, SIERRA_DEQ_GLUT15},
+       {0x0014, SIERRA_DEQ_GLUT16},
+       {0x0BAE, SIERRA_DEQ_ALUT0},
+       {0x0AEB, SIERRA_DEQ_ALUT1},
+       {0x0A28, SIERRA_DEQ_ALUT2},
+       {0x0965, SIERRA_DEQ_ALUT3},
+       {0x08A2, SIERRA_DEQ_ALUT4},
+       {0x07DF, SIERRA_DEQ_ALUT5},
+       {0x071C, SIERRA_DEQ_ALUT6},
+       {0x0659, SIERRA_DEQ_ALUT7},
+       {0x0596, SIERRA_DEQ_ALUT8},
+       {0x0514, SIERRA_DEQ_ALUT9},
+       {0x0492, SIERRA_DEQ_ALUT10},
+       {0x0410, SIERRA_DEQ_ALUT11},
+       {0x038E, SIERRA_DEQ_ALUT12},
+       {0x030C, SIERRA_DEQ_ALUT13},
+       {0x03F4, SIERRA_DEQ_DFETAP_CTRL_PREG},
+       {0x0001, SIERRA_DFE_EN_1010_IGNORE_PREG},
+       {0x3C01, SIERRA_DEQ_TAU_CTRL1_FAST_MAINT_PREG},
+       {0x3C40, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG},
+       {0x1C08, SIERRA_DEQ_TAU_CTRL2_PREG},
+       {0x0033, SIERRA_DEQ_PICTRL_PREG},
+       {0x0400, SIERRA_CPICAL_TMRVAL_MODE1_PREG},
+       {0x0330, SIERRA_CPICAL_TMRVAL_MODE0_PREG},
+       {0x01FF, SIERRA_CPICAL_PICNT_MODE1_PREG},
+       {0x0009, SIERRA_CPI_OUTBUF_RATESEL_PREG},
+       {0x3232, SIERRA_CPICAL_RES_STARTCODE_MODE23_PREG},
+       {0x0005, SIERRA_LFPSDET_SUPPORT_PREG},
+       {0x000F, SIERRA_LFPSFILT_NS_PREG},
+       {0x0009, SIERRA_LFPSFILT_RD_PREG},
+       {0x0001, SIERRA_LFPSFILT_MP_PREG},
+       {0x8013, SIERRA_SDFILT_H2L_A_PREG},
+       {0x8009, SIERRA_SDFILT_L2H_PREG},
+       {0x0024, SIERRA_RXBUFFER_CTLECTRL_PREG},
+       {0x0020, SIERRA_RXBUFFER_RCDFECTRL_PREG},
+       {0x4243, SIERRA_RXBUFFER_DFECTRL_PREG}
+};
+
+static const struct cdns_sierra_data cdns_map_sierra = {
+       SIERRA_MACRO_ID,
+       0x2,
+       0x2,
+       ARRAY_SIZE(cdns_pcie_cmn_regs_ext_ssc),
+       ARRAY_SIZE(cdns_pcie_ln_regs_ext_ssc),
+       ARRAY_SIZE(cdns_usb_cmn_regs_ext_ssc),
+       ARRAY_SIZE(cdns_usb_ln_regs_ext_ssc),
+       cdns_pcie_cmn_regs_ext_ssc,
+       cdns_pcie_ln_regs_ext_ssc,
+       cdns_usb_cmn_regs_ext_ssc,
+       cdns_usb_ln_regs_ext_ssc,
+};
+
+static const struct cdns_sierra_data cdns_ti_map_sierra = {
+       SIERRA_MACRO_ID,
+       0x0,
+       0x1,
+       ARRAY_SIZE(cdns_pcie_cmn_regs_ext_ssc),
+       ARRAY_SIZE(cdns_pcie_ln_regs_ext_ssc),
+       ARRAY_SIZE(cdns_usb_cmn_regs_ext_ssc),
+       ARRAY_SIZE(cdns_usb_ln_regs_ext_ssc),
+       cdns_pcie_cmn_regs_ext_ssc,
+       cdns_pcie_ln_regs_ext_ssc,
+       cdns_usb_cmn_regs_ext_ssc,
+       cdns_usb_ln_regs_ext_ssc,
+};
+
+static const struct udevice_id cdns_sierra_id_table[] = {
+       {
+               .compatible = "cdns,sierra-phy-t0",
+               .data = (ulong)&cdns_map_sierra,
+       },
+       {
+               .compatible = "ti,sierra-phy-t0",
+               .data = (ulong)&cdns_ti_map_sierra,
+       },
+       {}
+};
+
+U_BOOT_DRIVER(sierra_phy_provider) = {
+       .name           = "cdns,sierra",
+       .id             = UCLASS_PHY,
+       .of_match       = cdns_sierra_id_table,
+       .probe          = cdns_sierra_phy_probe,
+       .remove         = cdns_sierra_phy_remove,
+       .ops            = &ops,
+       .priv_auto      = sizeof(struct cdns_sierra_phy),
+};
diff --git a/drivers/phy/cadence/phy-cadence-torrent.c b/drivers/phy/cadence/phy-cadence-torrent.c
new file mode 100644 (file)
index 0000000..141ece4
--- /dev/null
@@ -0,0 +1,2463 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Cadence Torrent SD0801 PHY driver.
+ *
+ * Based on the linux driver provided by Cadence
+ *
+ * Copyright (c) 2018 Cadence Design Systems
+ *
+ * Copyright (C) 2020 Texas Instruments Incorporated - https://www.ti.com/
+ *
+ */
+
+#include <common.h>
+#include <clk.h>
+#include <generic-phy.h>
+#include <reset.h>
+#include <dm/device.h>
+#include <dm/device_compat.h>
+#include <dm/device-internal.h>
+#include <dm/lists.h>
+#include <dm/read.h>
+#include <dm/uclass.h>
+#include <linux/io.h>
+#include <dt-bindings/phy/phy.h>
+#include <regmap.h>
+#include <linux/delay.h>
+#include <linux/string.h>
+
+#define REF_CLK_19_2MHz                19200000
+#define REF_CLK_25MHz          25000000
+
+#define MAX_NUM_LANES          4
+#define DEFAULT_MAX_BIT_RATE   8100 /* in Mbps*/
+
+#define NUM_SSC_MODE           3
+#define NUM_PHY_TYPE           6
+
+#define POLL_TIMEOUT_US                5000
+#define PLL_LOCK_TIMEOUT       100000
+
+#define TORRENT_COMMON_CDB_OFFSET      0x0
+
+#define TORRENT_TX_LANE_CDB_OFFSET(ln, block_offset, reg_offset)       \
+                               ((0x4000 << (block_offset)) +           \
+                               (((ln) << 9) << (reg_offset)))
+#define TORRENT_RX_LANE_CDB_OFFSET(ln, block_offset, reg_offset)       \
+                               ((0x8000 << (block_offset)) +           \
+                               (((ln) << 9) << (reg_offset)))
+
+#define TORRENT_PHY_PCS_COMMON_OFFSET(block_offset)    \
+                               (0xC000 << (block_offset))
+
+#define TORRENT_PHY_PMA_COMMON_OFFSET(block_offset)    \
+                               (0xE000 << (block_offset))
+
+/*
+ * register offsets from SD0801 PHY register block base (i.e MHDP
+ * register base + 0x500000)
+ */
+#define CMN_SSM_BANDGAP_TMR            0x0021U
+#define CMN_SSM_BIAS_TMR               0x0022U
+#define CMN_PLLSM0_PLLPRE_TMR          0x002AU
+#define CMN_PLLSM0_PLLLOCK_TMR         0x002CU
+#define CMN_PLLSM1_PLLPRE_TMR          0x0032U
+#define CMN_PLLSM1_PLLLOCK_TMR         0x0034U
+#define CMN_CDIAG_CDB_PWRI_OVRD                0x0041U
+#define CMN_CDIAG_XCVRC_PWRI_OVRD      0x0047U
+#define CMN_BGCAL_INIT_TMR             0x0064U
+#define CMN_BGCAL_ITER_TMR             0x0065U
+#define CMN_IBCAL_INIT_TMR             0x0074U
+#define CMN_PLL0_VCOCAL_TCTRL          0x0082U
+#define CMN_PLL0_VCOCAL_INIT_TMR       0x0084U
+#define CMN_PLL0_VCOCAL_ITER_TMR       0x0085U
+#define CMN_PLL0_VCOCAL_REFTIM_START   0x0086U
+#define CMN_PLL0_VCOCAL_PLLCNT_START   0x0088U
+#define CMN_PLL0_INTDIV_M0             0x0090U
+#define CMN_PLL0_FRACDIVL_M0           0x0091U
+#define CMN_PLL0_FRACDIVH_M0           0x0092U
+#define CMN_PLL0_HIGH_THR_M0           0x0093U
+#define CMN_PLL0_DSM_DIAG_M0           0x0094U
+#define CMN_PLL0_SS_CTRL1_M0           0x0098U
+#define CMN_PLL0_SS_CTRL2_M0           0x0099U
+#define CMN_PLL0_SS_CTRL3_M0           0x009AU
+#define CMN_PLL0_SS_CTRL4_M0           0x009BU
+#define CMN_PLL0_LOCK_REFCNT_START     0x009CU
+#define CMN_PLL0_LOCK_PLLCNT_START     0x009EU
+#define CMN_PLL0_LOCK_PLLCNT_THR       0x009FU
+#define CMN_PLL0_INTDIV_M1             0x00A0U
+#define CMN_PLL0_FRACDIVH_M1           0x00A2U
+#define CMN_PLL0_HIGH_THR_M1           0x00A3U
+#define CMN_PLL0_DSM_DIAG_M1           0x00A4U
+#define CMN_PLL0_SS_CTRL1_M1           0x00A8U
+#define CMN_PLL0_SS_CTRL2_M1           0x00A9U
+#define CMN_PLL0_SS_CTRL3_M1           0x00AAU
+#define CMN_PLL0_SS_CTRL4_M1           0x00ABU
+#define CMN_PLL1_VCOCAL_TCTRL          0x00C2U
+#define CMN_PLL1_VCOCAL_INIT_TMR       0x00C4U
+#define CMN_PLL1_VCOCAL_ITER_TMR       0x00C5U
+#define CMN_PLL1_VCOCAL_REFTIM_START   0x00C6U
+#define CMN_PLL1_VCOCAL_PLLCNT_START   0x00C8U
+#define CMN_PLL1_INTDIV_M0             0x00D0U
+#define CMN_PLL1_FRACDIVL_M0           0x00D1U
+#define CMN_PLL1_FRACDIVH_M0           0x00D2U
+#define CMN_PLL1_HIGH_THR_M0           0x00D3U
+#define CMN_PLL1_DSM_DIAG_M0           0x00D4U
+#define CMN_PLL1_DSM_FBH_OVRD_M0       0x00D5U
+#define CMN_PLL1_DSM_FBL_OVRD_M0       0x00D6U
+#define CMN_PLL1_SS_CTRL1_M0           0x00D8U
+#define CMN_PLL1_SS_CTRL2_M0           0x00D9U
+#define CMN_PLL1_SS_CTRL3_M0           0x00DAU
+#define CMN_PLL1_SS_CTRL4_M0           0x00DBU
+#define CMN_PLL1_LOCK_REFCNT_START     0x00DCU
+#define CMN_PLL1_LOCK_PLLCNT_START     0x00DEU
+#define CMN_PLL1_LOCK_PLLCNT_THR       0x00DFU
+#define CMN_TXPUCAL_TUNE               0x0103U
+#define CMN_TXPUCAL_INIT_TMR           0x0104U
+#define CMN_TXPUCAL_ITER_TMR           0x0105U
+#define CMN_CMN_TXPDCAL_OVRD           0x0109U
+#define CMN_TXPDCAL_TUNE               0x010BU
+#define CMN_TXPDCAL_INIT_TMR           0x010CU
+#define CMN_TXPDCAL_ITER_TMR           0x010DU
+#define CMN_RXCAL_INIT_TMR             0x0114U
+#define CMN_RXCAL_ITER_TMR             0x0115U
+#define CMN_SD_CAL_INIT_TMR            0x0124U
+#define CMN_SD_CAL_ITER_TMR            0x0125U
+#define CMN_SD_CAL_REFTIM_START                0x0126U
+#define CMN_SD_CAL_PLLCNT_START                0x0128U
+#define CMN_PDIAG_PLL0_CTRL_M0         0x01A0U
+#define CMN_PDIAG_PLL0_CLK_SEL_M0      0x01A1U
+#define CMN_PDIAG_PLL0_CP_PADJ_M0      0x01A4U
+#define CMN_PDIAG_PLL0_CP_IADJ_M0      0x01A5U
+#define CMN_PDIAG_PLL0_FILT_PADJ_M0    0x01A6U
+#define CMN_PDIAG_PLL0_CTRL_M1         0x01B0U
+#define CMN_PDIAG_PLL0_CLK_SEL_M1      0x01B1U
+#define CMN_PDIAG_PLL0_CP_PADJ_M1      0x01B4U
+#define CMN_PDIAG_PLL0_CP_IADJ_M1      0x01B5U
+#define CMN_PDIAG_PLL0_FILT_PADJ_M1    0x01B6U
+#define CMN_PDIAG_PLL1_CTRL_M0         0x01C0U
+#define CMN_PDIAG_PLL1_CLK_SEL_M0      0x01C1U
+#define CMN_PDIAG_PLL1_CP_PADJ_M0      0x01C4U
+#define CMN_PDIAG_PLL1_CP_IADJ_M0      0x01C5U
+#define CMN_PDIAG_PLL1_FILT_PADJ_M0    0x01C6U
+#define CMN_DIAG_BIAS_OVRD1            0x01E1U
+
+/* PMA TX Lane registers */
+#define TX_TXCC_CTRL                   0x0040U
+#define TX_TXCC_CPOST_MULT_00          0x004CU
+#define TX_TXCC_CPOST_MULT_01          0x004DU
+#define TX_TXCC_MGNFS_MULT_000         0x0050U
+#define TX_TXCC_MGNFS_MULT_100         0x0054U
+#define DRV_DIAG_TX_DRV                        0x00C6U
+#define XCVR_DIAG_PLLDRC_CTRL          0x00E5U
+#define XCVR_DIAG_HSCLK_SEL            0x00E6U
+#define XCVR_DIAG_HSCLK_DIV            0x00E7U
+#define XCVR_DIAG_RXCLK_CTRL           0x00E9U
+#define XCVR_DIAG_BIDI_CTRL            0x00EAU
+#define XCVR_DIAG_PSC_OVRD             0x00EBU
+#define TX_PSC_A0                      0x0100U
+#define TX_PSC_A1                      0x0101U
+#define TX_PSC_A2                      0x0102U
+#define TX_PSC_A3                      0x0103U
+#define TX_RCVDET_ST_TMR               0x0123U
+#define TX_DIAG_ACYA                   0x01E7U
+#define TX_DIAG_ACYA_HBDC_MASK         0x0001U
+
+/* PMA RX Lane registers */
+#define RX_PSC_A0                      0x0000U
+#define RX_PSC_A1                      0x0001U
+#define RX_PSC_A2                      0x0002U
+#define RX_PSC_A3                      0x0003U
+#define RX_PSC_CAL                     0x0006U
+#define RX_CDRLF_CNFG                  0x0080U
+#define RX_CDRLF_CNFG3                 0x0082U
+#define RX_SIGDET_HL_FILT_TMR          0x0090U
+#define RX_REE_GCSM1_CTRL              0x0108U
+#define RX_REE_GCSM1_EQENM_PH1         0x0109U
+#define RX_REE_GCSM1_EQENM_PH2         0x010AU
+#define RX_REE_GCSM2_CTRL              0x0110U
+#define RX_REE_PERGCSM_CTRL            0x0118U
+#define RX_REE_ATTEN_THR               0x0149U
+#define RX_REE_TAP1_CLIP               0x0171U
+#define RX_REE_TAP2TON_CLIP            0x0172U
+#define RX_REE_SMGM_CTRL1              0x0177U
+#define RX_REE_SMGM_CTRL2              0x0178U
+#define RX_DIAG_DFE_CTRL               0x01E0U
+#define RX_DIAG_DFE_AMP_TUNE_2         0x01E2U
+#define RX_DIAG_DFE_AMP_TUNE_3         0x01E3U
+#define RX_DIAG_NQST_CTRL              0x01E5U
+#define RX_DIAG_SIGDET_TUNE            0x01E8U
+#define RX_DIAG_PI_RATE                        0x01F4U
+#define RX_DIAG_PI_CAP                 0x01F5U
+#define RX_DIAG_ACYA                   0x01FFU
+
+/* PHY PCS common registers */
+#define PHY_PLL_CFG                    0x000EU
+#define PHY_PIPE_USB3_GEN2_PRE_CFG0    0x0020U
+#define PHY_PIPE_USB3_GEN2_POST_CFG0   0x0022U
+#define PHY_PIPE_USB3_GEN2_POST_CFG1   0x0023U
+
+/* PHY PMA common registers */
+#define PHY_PMA_CMN_CTRL1              0x0000U
+#define PHY_PMA_CMN_CTRL2              0x0001U
+#define PHY_PMA_PLL_RAW_CTRL           0x0003U
+
+static const struct reg_field phy_pll_cfg =  REG_FIELD(PHY_PLL_CFG, 0, 1);
+static const struct reg_field phy_pma_cmn_ctrl_1 =
+                                       REG_FIELD(PHY_PMA_CMN_CTRL1, 0, 0);
+static const struct reg_field phy_pma_cmn_ctrl_2 =
+                                       REG_FIELD(PHY_PMA_CMN_CTRL2, 0, 7);
+static const struct reg_field phy_pma_pll_raw_ctrl =
+                                       REG_FIELD(PHY_PMA_PLL_RAW_CTRL, 0, 1);
+
+#define reset_control_assert reset_assert
+#define reset_control_deassert reset_deassert
+#define reset_control reset_ctl
+#define reset_control_put reset_free
+
+enum cdns_torrent_phy_type {
+       TYPE_NONE,
+       TYPE_DP,
+       TYPE_PCIE,
+       TYPE_SGMII,
+       TYPE_QSGMII,
+       TYPE_USB,
+};
+
+enum cdns_torrent_ssc_mode {
+       NO_SSC,
+       EXTERNAL_SSC,
+       INTERNAL_SSC
+};
+
+struct cdns_torrent_inst {
+       struct phy *phy;
+       u32 mlane;
+       enum cdns_torrent_phy_type phy_type;
+       u32 num_lanes;
+       struct reset_ctl_bulk *lnk_rst;
+       enum cdns_torrent_ssc_mode ssc_mode;
+};
+
+struct cdns_torrent_phy {
+       void __iomem *sd_base;  /* SD0801 register base  */
+       size_t size;
+       struct reset_control *phy_rst;
+       struct udevice *dev;
+       struct cdns_torrent_inst phys[MAX_NUM_LANES];
+       int nsubnodes;
+       const struct cdns_torrent_data *init_data;
+       struct regmap *regmap;
+       struct regmap *regmap_common_cdb;
+       struct regmap *regmap_phy_pcs_common_cdb;
+       struct regmap *regmap_phy_pma_common_cdb;
+       struct regmap *regmap_tx_lane_cdb[MAX_NUM_LANES];
+       struct regmap *regmap_rx_lane_cdb[MAX_NUM_LANES];
+       struct regmap_field *phy_pll_cfg;
+       struct regmap_field *phy_pma_cmn_ctrl_1;
+       struct regmap_field *phy_pma_cmn_ctrl_2;
+       struct regmap_field *phy_pma_pll_raw_ctrl;
+};
+
+struct cdns_reg_pairs {
+       u32 val;
+       u32 off;
+};
+
+struct cdns_torrent_vals {
+       struct cdns_reg_pairs *reg_pairs;
+       u32 num_regs;
+};
+
+struct cdns_torrent_data {
+       u8 block_offset_shift;
+       u8 reg_offset_shift;
+       struct cdns_torrent_vals *link_cmn_vals[NUM_PHY_TYPE][NUM_PHY_TYPE]
+                                              [NUM_SSC_MODE];
+       struct cdns_torrent_vals *xcvr_diag_vals[NUM_PHY_TYPE][NUM_PHY_TYPE]
+                                               [NUM_SSC_MODE];
+       struct cdns_torrent_vals *pcs_cmn_vals[NUM_PHY_TYPE][NUM_PHY_TYPE]
+                                              [NUM_SSC_MODE];
+       struct cdns_torrent_vals *cmn_vals[NUM_PHY_TYPE][NUM_PHY_TYPE]
+                                         [NUM_SSC_MODE];
+       struct cdns_torrent_vals *tx_ln_vals[NUM_PHY_TYPE][NUM_PHY_TYPE]
+                                         [NUM_SSC_MODE];
+       struct cdns_torrent_vals *rx_ln_vals[NUM_PHY_TYPE][NUM_PHY_TYPE]
+                                           [NUM_SSC_MODE];
+};
+
+static inline struct cdns_torrent_inst *phy_get_drvdata(struct phy *phy)
+{
+       struct cdns_torrent_phy *sp = dev_get_priv(phy->dev);
+       int index;
+
+       if (phy->id >= MAX_NUM_LANES)
+               return NULL;
+
+       for (index = 0; index < sp->nsubnodes; index++) {
+               if (phy->id == sp->phys[index].mlane)
+                       return &sp->phys[index];
+       }
+
+       return NULL;
+}
+
+static struct regmap *cdns_regmap_init(struct udevice *dev, void __iomem *base,
+                                      u32 block_offset,
+                                      u8 reg_offset_shift)
+{
+       struct cdns_torrent_phy *sp = dev_get_priv(dev);
+       struct regmap_config config;
+
+       config.r_start = (ulong)(base + block_offset);
+       config.r_size = sp->size - block_offset;
+       config.reg_offset_shift = reg_offset_shift;
+       config.width = REGMAP_SIZE_16;
+
+       return devm_regmap_init(dev, NULL, NULL, &config);
+}
+
+static int cdns_torrent_regfield_init(struct cdns_torrent_phy *cdns_phy)
+{
+       struct udevice *dev = cdns_phy->dev;
+       struct regmap_field *field;
+       struct regmap *regmap;
+
+       regmap = cdns_phy->regmap_phy_pcs_common_cdb;
+       field = devm_regmap_field_alloc(dev, regmap, phy_pll_cfg);
+       if (IS_ERR(field)) {
+               dev_err(dev, "PHY_PLL_CFG reg field init failed\n");
+               return PTR_ERR(field);
+       }
+       cdns_phy->phy_pll_cfg = field;
+
+       regmap = cdns_phy->regmap_phy_pma_common_cdb;
+       field = devm_regmap_field_alloc(dev, regmap, phy_pma_cmn_ctrl_1);
+       if (IS_ERR(field)) {
+               dev_err(dev, "PHY_PMA_CMN_CTRL1 reg field init failed\n");
+               return PTR_ERR(field);
+       }
+       cdns_phy->phy_pma_cmn_ctrl_1 = field;
+
+       regmap = cdns_phy->regmap_phy_pma_common_cdb;
+       field = devm_regmap_field_alloc(dev, regmap, phy_pma_cmn_ctrl_2);
+       if (IS_ERR(field)) {
+               dev_err(dev, "PHY_PMA_CMN_CTRL2 reg field init failed\n");
+               return PTR_ERR(field);
+       }
+       cdns_phy->phy_pma_cmn_ctrl_2 = field;
+
+       regmap = cdns_phy->regmap_phy_pma_common_cdb;
+       field = devm_regmap_field_alloc(dev, regmap, phy_pma_pll_raw_ctrl);
+       if (IS_ERR(field)) {
+               dev_err(dev, "PHY_PMA_PLL_RAW_CTRL reg field init failed\n");
+               return PTR_ERR(field);
+       }
+       cdns_phy->phy_pma_pll_raw_ctrl = field;
+
+       return 0;
+}
+
+static int cdns_torrent_regmap_init(struct cdns_torrent_phy *cdns_phy)
+{
+       void __iomem *sd_base = cdns_phy->sd_base;
+       u8 block_offset_shift, reg_offset_shift;
+       struct udevice *dev = cdns_phy->dev;
+       struct regmap *regmap;
+       u32 block_offset;
+       int i;
+
+       block_offset_shift = cdns_phy->init_data->block_offset_shift;
+       reg_offset_shift = cdns_phy->init_data->reg_offset_shift;
+
+       for (i = 0; i < MAX_NUM_LANES; i++) {
+               block_offset = TORRENT_TX_LANE_CDB_OFFSET(i, block_offset_shift,
+                                                         reg_offset_shift);
+
+               regmap = cdns_regmap_init(dev, sd_base, block_offset,
+                                         reg_offset_shift);
+               if (IS_ERR(regmap)) {
+                       dev_err(dev, "Failed to init tx lane CDB regmap\n");
+                       return PTR_ERR(regmap);
+               }
+               cdns_phy->regmap_tx_lane_cdb[i] = regmap;
+               block_offset = TORRENT_RX_LANE_CDB_OFFSET(i, block_offset_shift,
+                                                         reg_offset_shift);
+               regmap = cdns_regmap_init(dev, sd_base, block_offset,
+                                         reg_offset_shift);
+               if (IS_ERR(regmap)) {
+                       dev_err(dev, "Failed to init rx lane CDB regmap");
+                       return PTR_ERR(regmap);
+               }
+               cdns_phy->regmap_rx_lane_cdb[i] = regmap;
+       }
+
+       block_offset = TORRENT_COMMON_CDB_OFFSET;
+       regmap = cdns_regmap_init(dev, sd_base, block_offset,
+                                 reg_offset_shift);
+       if (IS_ERR(regmap)) {
+               dev_err(dev, "Failed to init common CDB regmap\n");
+               return PTR_ERR(regmap);
+       }
+       cdns_phy->regmap_common_cdb = regmap;
+
+       block_offset = TORRENT_PHY_PCS_COMMON_OFFSET(block_offset_shift);
+       regmap = cdns_regmap_init(dev, sd_base, block_offset,
+                                 reg_offset_shift);
+       if (IS_ERR(regmap)) {
+               dev_err(dev, "Failed to init PHY PCS common CDB regmap\n");
+               return PTR_ERR(regmap);
+       }
+       cdns_phy->regmap_phy_pcs_common_cdb = regmap;
+
+       block_offset = TORRENT_PHY_PMA_COMMON_OFFSET(block_offset_shift);
+       regmap = cdns_regmap_init(dev, sd_base, block_offset,
+                                 reg_offset_shift);
+       if (IS_ERR(regmap)) {
+               dev_err(dev, "Failed to init PHY PMA common CDB regmap\n");
+               return PTR_ERR(regmap);
+       }
+       cdns_phy->regmap_phy_pma_common_cdb = regmap;
+
+       return 0;
+}
+
+static int cdns_torrent_phy_configure_multilink(struct cdns_torrent_phy *cdns_phy)
+{
+       const struct cdns_torrent_data *init_data = cdns_phy->init_data;
+       struct cdns_torrent_vals *cmn_vals, *tx_ln_vals, *rx_ln_vals;
+       struct cdns_torrent_vals *link_cmn_vals, *xcvr_diag_vals;
+       enum cdns_torrent_phy_type phy_t1, phy_t2, tmp_phy_type;
+       struct cdns_torrent_vals *pcs_cmn_vals;
+       int i, j, node, mlane, num_lanes, ret;
+       struct cdns_reg_pairs *reg_pairs;
+       enum cdns_torrent_ssc_mode ssc;
+       struct regmap *regmap;
+       u32 num_regs;
+
+       /* Maximum 2 links (subnodes) are supported */
+       if (cdns_phy->nsubnodes != 2)
+               return -EINVAL;
+
+       phy_t1 = cdns_phy->phys[0].phy_type;
+       phy_t2 = cdns_phy->phys[1].phy_type;
+
+       /*
+        * First configure the PHY for first link with phy_t1. Geth the array
+        * values are [phy_t1][phy_t2][ssc].
+        */
+       for (node = 0; node < cdns_phy->nsubnodes; node++) {
+               if (node == 1) {
+                       /*
+                        * If fist link with phy_t1 is configured, then
+                        * configure the PHY for second link with phy_t2.
+                        * Get the array values as [phy_t2][phy_t1][ssc]
+                        */
+                       tmp_phy_type = phy_t1;
+                       phy_t1 = phy_t2;
+                       phy_t2 = tmp_phy_type;
+               }
+
+               mlane = cdns_phy->phys[node].mlane;
+               ssc = cdns_phy->phys[node].ssc_mode;
+               num_lanes = cdns_phy->phys[node].num_lanes;
+
+               /**
+                * PHY configuration specific registers:
+                * link_cmn_vals depend on combination of PHY types being
+                * configured and are common for both PHY types, so array
+                * values should be same for [phy_t1][phy_t2][ssc] and
+                * [phy_t2][phy_t1][ssc].
+                * xcvr_diag_vals also depend on combination of PHY types
+                * being configured, but these can be different for particular
+                * PHY type and are per lane.
+                */
+               link_cmn_vals = init_data->link_cmn_vals[phy_t1][phy_t2][ssc];
+               if (link_cmn_vals) {
+                       reg_pairs = link_cmn_vals->reg_pairs;
+                       num_regs = link_cmn_vals->num_regs;
+                       regmap = cdns_phy->regmap_common_cdb;
+
+                       /**
+                        * First array value in link_cmn_vals must be of
+                        * PHY_PLL_CFG register
+                        */
+                       regmap_field_write(cdns_phy->phy_pll_cfg,
+                                          reg_pairs[0].val);
+
+                       for (i = 1; i < num_regs; i++)
+                               regmap_write(regmap, reg_pairs[i].off,
+                                            reg_pairs[i].val);
+               }
+
+               xcvr_diag_vals = init_data->xcvr_diag_vals[phy_t1][phy_t2][ssc];
+               if (xcvr_diag_vals) {
+                       reg_pairs = xcvr_diag_vals->reg_pairs;
+                       num_regs = xcvr_diag_vals->num_regs;
+                       for (i = 0; i < num_lanes; i++) {
+                               regmap = cdns_phy->regmap_tx_lane_cdb[i + mlane];
+                               for (j = 0; j < num_regs; j++)
+                                       regmap_write(regmap, reg_pairs[j].off,
+                                                    reg_pairs[j].val);
+                       }
+               }
+
+               /* PHY PCS common registers configurations */
+               pcs_cmn_vals = init_data->pcs_cmn_vals[phy_t1][phy_t2][ssc];
+               if (pcs_cmn_vals) {
+                       reg_pairs = pcs_cmn_vals->reg_pairs;
+                       num_regs = pcs_cmn_vals->num_regs;
+                       regmap = cdns_phy->regmap_phy_pcs_common_cdb;
+                       for (i = 0; i < num_regs; i++)
+                               regmap_write(regmap, reg_pairs[i].off,
+                                            reg_pairs[i].val);
+               }
+
+               /* PMA common registers configurations */
+               cmn_vals = init_data->cmn_vals[phy_t1][phy_t2][ssc];
+               if (cmn_vals) {
+                       reg_pairs = cmn_vals->reg_pairs;
+                       num_regs = cmn_vals->num_regs;
+                       regmap = cdns_phy->regmap_common_cdb;
+                       for (i = 0; i < num_regs; i++)
+                               regmap_write(regmap, reg_pairs[i].off,
+                                            reg_pairs[i].val);
+               }
+
+               /* PMA TX lane registers configurations */
+               tx_ln_vals = init_data->tx_ln_vals[phy_t1][phy_t2][ssc];
+               if (tx_ln_vals) {
+                       reg_pairs = tx_ln_vals->reg_pairs;
+                       num_regs = tx_ln_vals->num_regs;
+                       for (i = 0; i < num_lanes; i++) {
+                               regmap = cdns_phy->regmap_tx_lane_cdb[i + mlane];
+                               for (j = 0; j < num_regs; j++)
+                                       regmap_write(regmap, reg_pairs[j].off,
+                                                    reg_pairs[j].val);
+                       }
+               }
+
+               /* PMA RX lane registers configurations */
+               rx_ln_vals = init_data->rx_ln_vals[phy_t1][phy_t2][ssc];
+               if (rx_ln_vals) {
+                       reg_pairs = rx_ln_vals->reg_pairs;
+                       num_regs = rx_ln_vals->num_regs;
+                       for (i = 0; i < num_lanes; i++) {
+                               regmap = cdns_phy->regmap_rx_lane_cdb[i + mlane];
+                               for (j = 0; j < num_regs; j++)
+                                       regmap_write(regmap, reg_pairs[j].off,
+                                                    reg_pairs[j].val);
+                       }
+               }
+
+               reset_deassert_bulk(cdns_phy->phys[node].lnk_rst);
+       }
+
+       /* Take the PHY out of reset */
+       ret = reset_control_deassert(cdns_phy->phy_rst);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+static int cdns_torrent_phy_probe(struct udevice *dev)
+{
+       struct cdns_torrent_phy *cdns_phy = dev_get_priv(dev);
+       int ret, subnodes = 0, node = 0, i;
+       struct cdns_torrent_data *data;
+       u32 total_num_lanes = 0;
+       struct clk *clk;
+       ofnode child;
+       u32 phy_type;
+
+       cdns_phy->dev = dev;
+
+       /* Get init data for this phy  */
+       data = (struct cdns_torrent_data *)dev_get_driver_data(dev);
+       cdns_phy->init_data = data;
+
+       cdns_phy->phy_rst = devm_reset_control_get_by_index(dev, 0);
+       if (IS_ERR(cdns_phy->phy_rst)) {
+               dev_err(dev, "failed to get reset\n");
+               return PTR_ERR(cdns_phy->phy_rst);
+       }
+
+       clk = devm_clk_get(dev, "refclk");
+       if (IS_ERR(clk)) {
+               dev_err(dev, "phy ref clock not found\n");
+               return PTR_ERR(clk);
+       }
+
+       ret = clk_prepare_enable(clk);
+       if (ret) {
+               dev_err(cdns_phy->dev, "Failed to prepare ref clock\n");
+               return ret;
+       }
+
+       cdns_phy->sd_base = devfdt_remap_addr_index(dev, 0);
+       if (IS_ERR(cdns_phy->sd_base))
+               return PTR_ERR(cdns_phy->sd_base);
+       devfdt_get_addr_size_index(dev, 0, (fdt_size_t *)&cdns_phy->size);
+
+       dev_for_each_subnode(child, dev)
+               subnodes++;
+       if (subnodes == 0) {
+               dev_err(dev, "No available link subnodes found\n");
+               return -EINVAL;
+       }
+       ret = cdns_torrent_regmap_init(cdns_phy);
+       if (ret)
+               return ret;
+
+       ret = cdns_torrent_regfield_init(cdns_phy);
+       if (ret)
+               return ret;
+
+       /* Going through all the available subnodes or children*/
+       ofnode_for_each_subnode(child, dev_ofnode(dev)) {
+               /* PHY subnode name must be a 'link' */
+               if (!ofnode_name_eq(child, "link"))
+                       continue;
+               cdns_phy->phys[node].lnk_rst =
+                               devm_reset_bulk_get_by_node(dev, child);
+               if (IS_ERR(cdns_phy->phys[node].lnk_rst)) {
+                       dev_err(dev, "%s: failed to get reset\n",
+                               ofnode_get_name(child));
+                       ret = PTR_ERR(cdns_phy->phys[node].lnk_rst);
+                       goto put_lnk_rst;
+               }
+
+               if (ofnode_read_u32(child, "reg",
+                                   &cdns_phy->phys[node].mlane)) {
+                       dev_err(dev, "%s: No \"reg \" - property.\n",
+                               ofnode_get_name(child));
+                       ret = -EINVAL;
+                       goto put_child;
+               }
+
+               if (ofnode_read_u32(child, "cdns,phy-type", &phy_type)) {
+                       dev_err(dev, "%s: No \"cdns,phy-type \" - property.\n",
+                               ofnode_get_name(child));
+                       ret = -EINVAL;
+                       goto put_child;
+               }
+
+               switch (phy_type) {
+               case PHY_TYPE_PCIE:
+                       cdns_phy->phys[node].phy_type = TYPE_PCIE;
+                       break;
+               case PHY_TYPE_DP:
+                       cdns_phy->phys[node].phy_type = TYPE_DP;
+                       break;
+               case PHY_TYPE_SGMII:
+                       cdns_phy->phys[node].phy_type = TYPE_SGMII;
+                       break;
+               case PHY_TYPE_QSGMII:
+                       cdns_phy->phys[node].phy_type = TYPE_QSGMII;
+                       break;
+               case PHY_TYPE_USB3:
+                       cdns_phy->phys[node].phy_type = TYPE_USB;
+                       break;
+               default:
+                       dev_err(dev, "Unsupported protocol\n");
+                       ret = -EINVAL;
+                       goto put_child;
+               }
+
+               if (ofnode_read_u32(child, "cdns,num-lanes",
+                                   &cdns_phy->phys[node].num_lanes)) {
+                       dev_err(dev, "%s: No \"cdns,num-lanes \" - property.\n",
+                               ofnode_get_name(child));
+                       ret = -EINVAL;
+                       goto put_child;
+               }
+
+               total_num_lanes += cdns_phy->phys[node].num_lanes;
+
+               /* Get SSC mode */
+               ofnode_read_u32(child, "cdns,ssc-mode",
+                               &cdns_phy->phys[node].ssc_mode);
+               node++;
+       }
+
+       cdns_phy->nsubnodes = node;
+
+       if (total_num_lanes > MAX_NUM_LANES) {
+               dev_err(dev, "Invalid lane configuration\n");
+               goto put_lnk_rst;
+       }
+
+       if (cdns_phy->nsubnodes > 1) {
+               ret = cdns_torrent_phy_configure_multilink(cdns_phy);
+               if (ret)
+                       goto put_lnk_rst;
+       }
+
+       reset_control_deassert(cdns_phy->phy_rst);
+       return 0;
+
+put_child:
+       node++;
+put_lnk_rst:
+       for (i = 0; i < node; i++)
+               reset_release_bulk(cdns_phy->phys[i].lnk_rst);
+       return ret;
+}
+
+static int cdns_torrent_phy_on(struct phy *gphy)
+{
+       struct cdns_torrent_inst *inst = phy_get_drvdata(gphy);
+       struct cdns_torrent_phy *cdns_phy = dev_get_priv(gphy->dev);
+       u32 read_val;
+       int ret;
+
+       if (cdns_phy->nsubnodes == 1) {
+               /* Take the PHY lane group out of reset */
+               reset_deassert_bulk(inst->lnk_rst);
+
+               /* Take the PHY out of reset */
+               ret = reset_control_deassert(cdns_phy->phy_rst);
+               if (ret)
+                       return ret;
+       }
+
+       /*
+        * Wait for cmn_ready assertion
+        * PHY_PMA_CMN_CTRL1[0] == 1
+        */
+       ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_1,
+                                            read_val, read_val, 1000,
+                                            PLL_LOCK_TIMEOUT);
+       if (ret) {
+               dev_err(cdns_phy->dev, "Timeout waiting for CMN ready\n");
+               return ret;
+       }
+       mdelay(10);
+
+       return 0;
+}
+
+static int cdns_torrent_phy_init(struct phy *phy)
+{
+       struct cdns_torrent_phy *cdns_phy = dev_get_priv(phy->dev);
+       const struct cdns_torrent_data *init_data = cdns_phy->init_data;
+       struct cdns_torrent_vals *cmn_vals, *tx_ln_vals, *rx_ln_vals;
+       struct cdns_torrent_vals *link_cmn_vals, *xcvr_diag_vals;
+       struct cdns_torrent_inst *inst = phy_get_drvdata(phy);
+       enum cdns_torrent_phy_type phy_type = inst->phy_type;
+       enum cdns_torrent_ssc_mode ssc = inst->ssc_mode;
+       struct cdns_torrent_vals *pcs_cmn_vals;
+       struct cdns_reg_pairs *reg_pairs;
+       struct regmap *regmap;
+       u32 num_regs;
+       int i, j;
+
+       if (cdns_phy->nsubnodes > 1)
+               return 0;
+
+       /**
+        * Spread spectrum generation is not required or supported
+        * for SGMII/QSGMII
+        */
+       if (phy_type == TYPE_SGMII || phy_type == TYPE_QSGMII)
+               ssc = NO_SSC;
+
+       /* PHY configuration specific registers for single link */
+       link_cmn_vals = init_data->link_cmn_vals[phy_type][TYPE_NONE][ssc];
+       if (link_cmn_vals) {
+               reg_pairs = link_cmn_vals->reg_pairs;
+               num_regs = link_cmn_vals->num_regs;
+               regmap = cdns_phy->regmap_common_cdb;
+
+               /**
+                * First array value in link_cmn_vals must be of
+                * PHY_PLL_CFG register
+                */
+               regmap_field_write(cdns_phy->phy_pll_cfg, reg_pairs[0].val);
+
+               for (i = 1; i < num_regs; i++)
+                       regmap_write(regmap, reg_pairs[i].off,
+                                    reg_pairs[i].val);
+       }
+
+       xcvr_diag_vals = init_data->xcvr_diag_vals[phy_type][TYPE_NONE][ssc];
+       if (xcvr_diag_vals) {
+               reg_pairs = xcvr_diag_vals->reg_pairs;
+               num_regs = xcvr_diag_vals->num_regs;
+               for (i = 0; i < inst->num_lanes; i++) {
+                       regmap = cdns_phy->regmap_tx_lane_cdb[i + inst->mlane];
+                       for (j = 0; j < num_regs; j++)
+                               regmap_write(regmap, reg_pairs[j].off,
+                                            reg_pairs[j].val);
+               }
+       }
+
+       /* PHY PCS common registers configurations */
+       pcs_cmn_vals = init_data->pcs_cmn_vals[phy_type][TYPE_NONE][ssc];
+       if (pcs_cmn_vals) {
+               reg_pairs = pcs_cmn_vals->reg_pairs;
+               num_regs = pcs_cmn_vals->num_regs;
+               regmap = cdns_phy->regmap_phy_pcs_common_cdb;
+               for (i = 0; i < num_regs; i++)
+                       regmap_write(regmap, reg_pairs[i].off,
+                                    reg_pairs[i].val);
+       }
+
+       /* PMA common registers configurations */
+       cmn_vals = init_data->cmn_vals[phy_type][TYPE_NONE][ssc];
+       if (cmn_vals) {
+               reg_pairs = cmn_vals->reg_pairs;
+               num_regs = cmn_vals->num_regs;
+               regmap = cdns_phy->regmap_common_cdb;
+               for (i = 0; i < num_regs; i++)
+                       regmap_write(regmap, reg_pairs[i].off,
+                                    reg_pairs[i].val);
+       }
+
+       /* PMA TX lane registers configurations */
+       tx_ln_vals = init_data->tx_ln_vals[phy_type][TYPE_NONE][ssc];
+       if (tx_ln_vals) {
+               reg_pairs = tx_ln_vals->reg_pairs;
+               num_regs = tx_ln_vals->num_regs;
+               for (i = 0; i < inst->num_lanes; i++) {
+                       regmap = cdns_phy->regmap_tx_lane_cdb[i + inst->mlane];
+                       for (j = 0; j < num_regs; j++)
+                               regmap_write(regmap, reg_pairs[j].off,
+                                            reg_pairs[j].val);
+               }
+       }
+
+       /* PMA RX lane registers configurations */
+       rx_ln_vals = init_data->rx_ln_vals[phy_type][TYPE_NONE][ssc];
+       if (rx_ln_vals) {
+               reg_pairs = rx_ln_vals->reg_pairs;
+               num_regs = rx_ln_vals->num_regs;
+               for (i = 0; i < inst->num_lanes; i++) {
+                       regmap = cdns_phy->regmap_rx_lane_cdb[i + inst->mlane];
+                       for (j = 0; j < num_regs; j++)
+                               regmap_write(regmap, reg_pairs[j].off,
+                                            reg_pairs[j].val);
+               }
+       }
+
+       return 0;
+}
+
+static int cdns_torrent_phy_off(struct phy *gphy)
+{
+       struct cdns_torrent_inst *inst = phy_get_drvdata(gphy);
+       struct cdns_torrent_phy *cdns_phy = dev_get_priv(gphy->dev);
+       int ret;
+
+       if (cdns_phy->nsubnodes != 1)
+               return 0;
+
+       ret = reset_control_assert(cdns_phy->phy_rst);
+       if (ret)
+               return ret;
+
+       return reset_assert_bulk(inst->lnk_rst);
+}
+
+static int cdns_torrent_phy_remove(struct udevice *dev)
+{
+       struct cdns_torrent_phy *cdns_phy = dev_get_priv(dev);
+       int i;
+
+       reset_control_assert(cdns_phy->phy_rst);
+       for (i = 0; i < cdns_phy->nsubnodes; i++)
+               reset_release_bulk(cdns_phy->phys[i].lnk_rst);
+
+       return 0;
+}
+
+/* USB and SGMII/QSGMII link configuration */
+static struct cdns_reg_pairs usb_sgmii_link_cmn_regs[] = {
+       {0x0002, PHY_PLL_CFG},
+       {0x8600, CMN_PDIAG_PLL0_CLK_SEL_M0},
+       {0x0601, CMN_PDIAG_PLL1_CLK_SEL_M0}
+};
+
+static struct cdns_reg_pairs usb_sgmii_xcvr_diag_ln_regs[] = {
+       {0x0000, XCVR_DIAG_HSCLK_SEL},
+       {0x0001, XCVR_DIAG_HSCLK_DIV},
+       {0x0041, XCVR_DIAG_PLLDRC_CTRL}
+};
+
+static struct cdns_reg_pairs sgmii_usb_xcvr_diag_ln_regs[] = {
+       {0x0011, XCVR_DIAG_HSCLK_SEL},
+       {0x0003, XCVR_DIAG_HSCLK_DIV},
+       {0x009B, XCVR_DIAG_PLLDRC_CTRL}
+};
+
+static struct cdns_torrent_vals usb_sgmii_link_cmn_vals = {
+       .reg_pairs = usb_sgmii_link_cmn_regs,
+       .num_regs = ARRAY_SIZE(usb_sgmii_link_cmn_regs),
+};
+
+static struct cdns_torrent_vals usb_sgmii_xcvr_diag_ln_vals = {
+       .reg_pairs = usb_sgmii_xcvr_diag_ln_regs,
+       .num_regs = ARRAY_SIZE(usb_sgmii_xcvr_diag_ln_regs),
+};
+
+static struct cdns_torrent_vals sgmii_usb_xcvr_diag_ln_vals = {
+       .reg_pairs = sgmii_usb_xcvr_diag_ln_regs,
+       .num_regs = ARRAY_SIZE(sgmii_usb_xcvr_diag_ln_regs),
+};
+
+/* PCIe and USB Unique SSC link configuration */
+static struct cdns_reg_pairs pcie_usb_link_cmn_regs[] = {
+       {0x0003, PHY_PLL_CFG},
+       {0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0},
+       {0x0400, CMN_PDIAG_PLL0_CLK_SEL_M1},
+       {0x8600, CMN_PDIAG_PLL1_CLK_SEL_M0}
+};
+
+static struct cdns_reg_pairs pcie_usb_xcvr_diag_ln_regs[] = {
+       {0x0000, XCVR_DIAG_HSCLK_SEL},
+       {0x0001, XCVR_DIAG_HSCLK_DIV},
+       {0x0012, XCVR_DIAG_PLLDRC_CTRL}
+};
+
+static struct cdns_reg_pairs usb_pcie_xcvr_diag_ln_regs[] = {
+       {0x0011, XCVR_DIAG_HSCLK_SEL},
+       {0x0001, XCVR_DIAG_HSCLK_DIV},
+       {0x00C9, XCVR_DIAG_PLLDRC_CTRL}
+};
+
+static struct cdns_torrent_vals pcie_usb_link_cmn_vals = {
+       .reg_pairs = pcie_usb_link_cmn_regs,
+       .num_regs = ARRAY_SIZE(pcie_usb_link_cmn_regs),
+};
+
+static struct cdns_torrent_vals pcie_usb_xcvr_diag_ln_vals = {
+       .reg_pairs = pcie_usb_xcvr_diag_ln_regs,
+       .num_regs = ARRAY_SIZE(pcie_usb_xcvr_diag_ln_regs),
+};
+
+static struct cdns_torrent_vals usb_pcie_xcvr_diag_ln_vals = {
+       .reg_pairs = usb_pcie_xcvr_diag_ln_regs,
+       .num_regs = ARRAY_SIZE(usb_pcie_xcvr_diag_ln_regs),
+};
+
+/* USB 100 MHz Ref clk, internal SSC */
+static struct cdns_reg_pairs usb_100_int_ssc_cmn_regs[] = {
+       {0x0004, CMN_PLL0_DSM_DIAG_M0},
+       {0x0004, CMN_PLL0_DSM_DIAG_M1},
+       {0x0004, CMN_PLL1_DSM_DIAG_M0},
+       {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
+       {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
+       {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
+       {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
+       {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
+       {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
+       {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
+       {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
+       {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
+       {0x0064, CMN_PLL0_INTDIV_M0},
+       {0x0050, CMN_PLL0_INTDIV_M1},
+       {0x0064, CMN_PLL1_INTDIV_M0},
+       {0x0002, CMN_PLL0_FRACDIVH_M0},
+       {0x0002, CMN_PLL0_FRACDIVH_M1},
+       {0x0002, CMN_PLL1_FRACDIVH_M0},
+       {0x0044, CMN_PLL0_HIGH_THR_M0},
+       {0x0036, CMN_PLL0_HIGH_THR_M1},
+       {0x0044, CMN_PLL1_HIGH_THR_M0},
+       {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
+       {0x0002, CMN_PDIAG_PLL0_CTRL_M1},
+       {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
+       {0x0001, CMN_PLL0_SS_CTRL1_M0},
+       {0x0001, CMN_PLL0_SS_CTRL1_M1},
+       {0x0001, CMN_PLL1_SS_CTRL1_M0},
+       {0x011B, CMN_PLL0_SS_CTRL2_M0},
+       {0x011B, CMN_PLL0_SS_CTRL2_M1},
+       {0x011B, CMN_PLL1_SS_CTRL2_M0},
+       {0x006E, CMN_PLL0_SS_CTRL3_M0},
+       {0x0058, CMN_PLL0_SS_CTRL3_M1},
+       {0x006E, CMN_PLL1_SS_CTRL3_M0},
+       {0x000E, CMN_PLL0_SS_CTRL4_M0},
+       {0x0012, CMN_PLL0_SS_CTRL4_M1},
+       {0x000E, CMN_PLL1_SS_CTRL4_M0},
+       {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
+       {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
+       {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
+       {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
+       {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
+       {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
+       {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
+       {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
+       {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
+       {0x0005, CMN_PLL1_LOCK_PLLCNT_THR},
+       {0x8200, CMN_CDIAG_CDB_PWRI_OVRD},
+       {0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD},
+       {0x007F, CMN_TXPUCAL_TUNE},
+       {0x007F, CMN_TXPDCAL_TUNE}
+};
+
+static struct cdns_torrent_vals usb_100_int_ssc_cmn_vals = {
+       .reg_pairs = usb_100_int_ssc_cmn_regs,
+       .num_regs = ARRAY_SIZE(usb_100_int_ssc_cmn_regs),
+};
+
+/* Single USB link configuration */
+static struct cdns_reg_pairs sl_usb_link_cmn_regs[] = {
+       {0x0000, PHY_PLL_CFG},
+       {0x8600, CMN_PDIAG_PLL0_CLK_SEL_M0}
+};
+
+static struct cdns_reg_pairs sl_usb_xcvr_diag_ln_regs[] = {
+       {0x0000, XCVR_DIAG_HSCLK_SEL},
+       {0x0001, XCVR_DIAG_HSCLK_DIV},
+       {0x0041, XCVR_DIAG_PLLDRC_CTRL}
+};
+
+static struct cdns_torrent_vals sl_usb_link_cmn_vals = {
+       .reg_pairs = sl_usb_link_cmn_regs,
+       .num_regs = ARRAY_SIZE(sl_usb_link_cmn_regs),
+};
+
+static struct cdns_torrent_vals sl_usb_xcvr_diag_ln_vals = {
+       .reg_pairs = sl_usb_xcvr_diag_ln_regs,
+       .num_regs = ARRAY_SIZE(sl_usb_xcvr_diag_ln_regs),
+};
+
+/* USB PHY PCS common configuration */
+static struct cdns_reg_pairs usb_phy_pcs_cmn_regs[] = {
+       {0x0A0A, PHY_PIPE_USB3_GEN2_PRE_CFG0},
+       {0x1000, PHY_PIPE_USB3_GEN2_POST_CFG0},
+       {0x0010, PHY_PIPE_USB3_GEN2_POST_CFG1}
+};
+
+static struct cdns_torrent_vals usb_phy_pcs_cmn_vals = {
+       .reg_pairs = usb_phy_pcs_cmn_regs,
+       .num_regs = ARRAY_SIZE(usb_phy_pcs_cmn_regs),
+};
+
+/* USB 100 MHz Ref clk, no SSC */
+static struct cdns_reg_pairs sl_usb_100_no_ssc_cmn_regs[] = {
+       {0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
+       {0x001E, CMN_PLL1_DSM_FBH_OVRD_M0},
+       {0x000C, CMN_PLL1_DSM_FBL_OVRD_M0},
+       {0x0003, CMN_PLL0_VCOCAL_TCTRL},
+       {0x0003, CMN_PLL1_VCOCAL_TCTRL},
+       {0x8200, CMN_CDIAG_CDB_PWRI_OVRD},
+       {0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD}
+};
+
+static struct cdns_torrent_vals sl_usb_100_no_ssc_cmn_vals = {
+       .reg_pairs = sl_usb_100_no_ssc_cmn_regs,
+       .num_regs = ARRAY_SIZE(sl_usb_100_no_ssc_cmn_regs),
+};
+
+static struct cdns_reg_pairs usb_100_no_ssc_cmn_regs[] = {
+       {0x8200, CMN_CDIAG_CDB_PWRI_OVRD},
+       {0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD},
+       {0x007F, CMN_TXPUCAL_TUNE},
+       {0x007F, CMN_TXPDCAL_TUNE}
+};
+
+static struct cdns_reg_pairs usb_100_no_ssc_tx_ln_regs[] = {
+       {0x02FF, TX_PSC_A0},
+       {0x06AF, TX_PSC_A1},
+       {0x06AE, TX_PSC_A2},
+       {0x06AE, TX_PSC_A3},
+       {0x2A82, TX_TXCC_CTRL},
+       {0x0014, TX_TXCC_CPOST_MULT_01},
+       {0x0003, XCVR_DIAG_PSC_OVRD}
+};
+
+static struct cdns_reg_pairs usb_100_no_ssc_rx_ln_regs[] = {
+       {0x0D1D, RX_PSC_A0},
+       {0x0D1D, RX_PSC_A1},
+       {0x0D00, RX_PSC_A2},
+       {0x0500, RX_PSC_A3},
+       {0x0013, RX_SIGDET_HL_FILT_TMR},
+       {0x0000, RX_REE_GCSM1_CTRL},
+       {0x0C02, RX_REE_ATTEN_THR},
+       {0x0330, RX_REE_SMGM_CTRL1},
+       {0x0300, RX_REE_SMGM_CTRL2},
+       {0x0019, RX_REE_TAP1_CLIP},
+       {0x0019, RX_REE_TAP2TON_CLIP},
+       {0x1004, RX_DIAG_SIGDET_TUNE},
+       {0x00F9, RX_DIAG_NQST_CTRL},
+       {0x0C01, RX_DIAG_DFE_AMP_TUNE_2},
+       {0x0002, RX_DIAG_DFE_AMP_TUNE_3},
+       {0x0000, RX_DIAG_PI_CAP},
+       {0x0031, RX_DIAG_PI_RATE},
+       {0x0001, RX_DIAG_ACYA},
+       {0x018C, RX_CDRLF_CNFG},
+       {0x0003, RX_CDRLF_CNFG3}
+};
+
+static struct cdns_torrent_vals usb_100_no_ssc_cmn_vals = {
+       .reg_pairs = usb_100_no_ssc_cmn_regs,
+       .num_regs = ARRAY_SIZE(usb_100_no_ssc_cmn_regs),
+};
+
+static struct cdns_torrent_vals usb_100_no_ssc_tx_ln_vals = {
+       .reg_pairs = usb_100_no_ssc_tx_ln_regs,
+       .num_regs = ARRAY_SIZE(usb_100_no_ssc_tx_ln_regs),
+};
+
+static struct cdns_torrent_vals usb_100_no_ssc_rx_ln_vals = {
+       .reg_pairs = usb_100_no_ssc_rx_ln_regs,
+       .num_regs = ARRAY_SIZE(usb_100_no_ssc_rx_ln_regs),
+};
+
+/* Single link USB, 100 MHz Ref clk, internal SSC */
+static struct cdns_reg_pairs sl_usb_100_int_ssc_cmn_regs[] = {
+       {0x0004, CMN_PLL0_DSM_DIAG_M0},
+       {0x0004, CMN_PLL1_DSM_DIAG_M0},
+       {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
+       {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
+       {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
+       {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
+       {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
+       {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
+       {0x0064, CMN_PLL0_INTDIV_M0},
+       {0x0064, CMN_PLL1_INTDIV_M0},
+       {0x0002, CMN_PLL0_FRACDIVH_M0},
+       {0x0002, CMN_PLL1_FRACDIVH_M0},
+       {0x0044, CMN_PLL0_HIGH_THR_M0},
+       {0x0044, CMN_PLL1_HIGH_THR_M0},
+       {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
+       {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
+       {0x0001, CMN_PLL0_SS_CTRL1_M0},
+       {0x0001, CMN_PLL1_SS_CTRL1_M0},
+       {0x011B, CMN_PLL0_SS_CTRL2_M0},
+       {0x011B, CMN_PLL1_SS_CTRL2_M0},
+       {0x006E, CMN_PLL0_SS_CTRL3_M0},
+       {0x006E, CMN_PLL1_SS_CTRL3_M0},
+       {0x000E, CMN_PLL0_SS_CTRL4_M0},
+       {0x000E, CMN_PLL1_SS_CTRL4_M0},
+       {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
+       {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
+       {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
+       {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
+       {0x0003, CMN_PLL0_VCOCAL_TCTRL},
+       {0x0003, CMN_PLL1_VCOCAL_TCTRL},
+       {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
+       {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
+       {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
+       {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
+       {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
+       {0x0005, CMN_PLL1_LOCK_PLLCNT_THR},
+       {0x8200, CMN_CDIAG_CDB_PWRI_OVRD},
+       {0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD}
+};
+
+static struct cdns_torrent_vals sl_usb_100_int_ssc_cmn_vals = {
+       .reg_pairs = sl_usb_100_int_ssc_cmn_regs,
+       .num_regs = ARRAY_SIZE(sl_usb_100_int_ssc_cmn_regs),
+};
+
+/* PCIe and SGMII/QSGMII Unique SSC link configuration */
+static struct cdns_reg_pairs pcie_sgmii_link_cmn_regs[] = {
+       {0x0003, PHY_PLL_CFG},
+       {0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0},
+       {0x0400, CMN_PDIAG_PLL0_CLK_SEL_M1},
+       {0x0601, CMN_PDIAG_PLL1_CLK_SEL_M0}
+};
+
+static struct cdns_reg_pairs pcie_sgmii_xcvr_diag_ln_regs[] = {
+       {0x0000, XCVR_DIAG_HSCLK_SEL},
+       {0x0001, XCVR_DIAG_HSCLK_DIV},
+       {0x0012, XCVR_DIAG_PLLDRC_CTRL}
+};
+
+static struct cdns_reg_pairs sgmii_pcie_xcvr_diag_ln_regs[] = {
+       {0x0011, XCVR_DIAG_HSCLK_SEL},
+       {0x0003, XCVR_DIAG_HSCLK_DIV},
+       {0x009B, XCVR_DIAG_PLLDRC_CTRL}
+};
+
+static struct cdns_torrent_vals pcie_sgmii_link_cmn_vals = {
+       .reg_pairs = pcie_sgmii_link_cmn_regs,
+       .num_regs = ARRAY_SIZE(pcie_sgmii_link_cmn_regs),
+};
+
+static struct cdns_torrent_vals pcie_sgmii_xcvr_diag_ln_vals = {
+       .reg_pairs = pcie_sgmii_xcvr_diag_ln_regs,
+       .num_regs = ARRAY_SIZE(pcie_sgmii_xcvr_diag_ln_regs),
+};
+
+static struct cdns_torrent_vals sgmii_pcie_xcvr_diag_ln_vals = {
+       .reg_pairs = sgmii_pcie_xcvr_diag_ln_regs,
+       .num_regs = ARRAY_SIZE(sgmii_pcie_xcvr_diag_ln_regs),
+};
+
+/* SGMII 100 MHz Ref clk, no SSC */
+static struct cdns_reg_pairs sl_sgmii_100_no_ssc_cmn_regs[] = {
+       {0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
+       {0x001E, CMN_PLL1_DSM_FBH_OVRD_M0},
+       {0x000C, CMN_PLL1_DSM_FBL_OVRD_M0},
+       {0x0003, CMN_PLL0_VCOCAL_TCTRL},
+       {0x0003, CMN_PLL1_VCOCAL_TCTRL}
+};
+
+static struct cdns_torrent_vals sl_sgmii_100_no_ssc_cmn_vals = {
+       .reg_pairs = sl_sgmii_100_no_ssc_cmn_regs,
+       .num_regs = ARRAY_SIZE(sl_sgmii_100_no_ssc_cmn_regs),
+};
+
+static struct cdns_reg_pairs sgmii_100_no_ssc_cmn_regs[] = {
+       {0x007F, CMN_TXPUCAL_TUNE},
+       {0x007F, CMN_TXPDCAL_TUNE}
+};
+
+static struct cdns_reg_pairs sgmii_100_no_ssc_tx_ln_regs[] = {
+       {0x00F3, TX_PSC_A0},
+       {0x04A2, TX_PSC_A2},
+       {0x04A2, TX_PSC_A3},
+       {0x0000, TX_TXCC_CPOST_MULT_00},
+       {0x00B3, DRV_DIAG_TX_DRV}
+};
+
+static struct cdns_reg_pairs ti_sgmii_100_no_ssc_tx_ln_regs[] = {
+       {0x00F3, TX_PSC_A0},
+       {0x04A2, TX_PSC_A2},
+       {0x04A2, TX_PSC_A3},
+       {0x0000, TX_TXCC_CPOST_MULT_00},
+       {0x00B3, DRV_DIAG_TX_DRV},
+       {0x4000, XCVR_DIAG_RXCLK_CTRL},
+};
+
+static struct cdns_reg_pairs sgmii_100_no_ssc_rx_ln_regs[] = {
+       {0x091D, RX_PSC_A0},
+       {0x0900, RX_PSC_A2},
+       {0x0100, RX_PSC_A3},
+       {0x03C7, RX_REE_GCSM1_EQENM_PH1},
+       {0x01C7, RX_REE_GCSM1_EQENM_PH2},
+       {0x0000, RX_DIAG_DFE_CTRL},
+       {0x0019, RX_REE_TAP1_CLIP},
+       {0x0019, RX_REE_TAP2TON_CLIP},
+       {0x0098, RX_DIAG_NQST_CTRL},
+       {0x0C01, RX_DIAG_DFE_AMP_TUNE_2},
+       {0x0000, RX_DIAG_DFE_AMP_TUNE_3},
+       {0x0000, RX_DIAG_PI_CAP},
+       {0x0010, RX_DIAG_PI_RATE},
+       {0x0001, RX_DIAG_ACYA},
+       {0x018C, RX_CDRLF_CNFG},
+};
+
+static struct cdns_torrent_vals sgmii_100_no_ssc_cmn_vals = {
+       .reg_pairs = sgmii_100_no_ssc_cmn_regs,
+       .num_regs = ARRAY_SIZE(sgmii_100_no_ssc_cmn_regs),
+};
+
+static struct cdns_torrent_vals sgmii_100_no_ssc_tx_ln_vals = {
+       .reg_pairs = sgmii_100_no_ssc_tx_ln_regs,
+       .num_regs = ARRAY_SIZE(sgmii_100_no_ssc_tx_ln_regs),
+};
+
+static struct cdns_torrent_vals ti_sgmii_100_no_ssc_tx_ln_vals = {
+       .reg_pairs = ti_sgmii_100_no_ssc_tx_ln_regs,
+       .num_regs = ARRAY_SIZE(ti_sgmii_100_no_ssc_tx_ln_regs),
+};
+
+static struct cdns_torrent_vals sgmii_100_no_ssc_rx_ln_vals = {
+       .reg_pairs = sgmii_100_no_ssc_rx_ln_regs,
+       .num_regs = ARRAY_SIZE(sgmii_100_no_ssc_rx_ln_regs),
+};
+
+/* SGMII 100 MHz Ref clk, internal SSC */
+static struct cdns_reg_pairs sgmii_100_int_ssc_cmn_regs[] = {
+       {0x0004, CMN_PLL0_DSM_DIAG_M0},
+       {0x0004, CMN_PLL0_DSM_DIAG_M1},
+       {0x0004, CMN_PLL1_DSM_DIAG_M0},
+       {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
+       {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
+       {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
+       {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
+       {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
+       {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
+       {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
+       {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
+       {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
+       {0x0064, CMN_PLL0_INTDIV_M0},
+       {0x0050, CMN_PLL0_INTDIV_M1},
+       {0x0064, CMN_PLL1_INTDIV_M0},
+       {0x0002, CMN_PLL0_FRACDIVH_M0},
+       {0x0002, CMN_PLL0_FRACDIVH_M1},
+       {0x0002, CMN_PLL1_FRACDIVH_M0},
+       {0x0044, CMN_PLL0_HIGH_THR_M0},
+       {0x0036, CMN_PLL0_HIGH_THR_M1},
+       {0x0044, CMN_PLL1_HIGH_THR_M0},
+       {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
+       {0x0002, CMN_PDIAG_PLL0_CTRL_M1},
+       {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
+       {0x0001, CMN_PLL0_SS_CTRL1_M0},
+       {0x0001, CMN_PLL0_SS_CTRL1_M1},
+       {0x0001, CMN_PLL1_SS_CTRL1_M0},
+       {0x011B, CMN_PLL0_SS_CTRL2_M0},
+       {0x011B, CMN_PLL0_SS_CTRL2_M1},
+       {0x011B, CMN_PLL1_SS_CTRL2_M0},
+       {0x006E, CMN_PLL0_SS_CTRL3_M0},
+       {0x0058, CMN_PLL0_SS_CTRL3_M1},
+       {0x006E, CMN_PLL1_SS_CTRL3_M0},
+       {0x000E, CMN_PLL0_SS_CTRL4_M0},
+       {0x0012, CMN_PLL0_SS_CTRL4_M1},
+       {0x000E, CMN_PLL1_SS_CTRL4_M0},
+       {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
+       {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
+       {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
+       {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
+       {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
+       {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
+       {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
+       {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
+       {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
+       {0x0005, CMN_PLL1_LOCK_PLLCNT_THR},
+       {0x007F, CMN_TXPUCAL_TUNE},
+       {0x007F, CMN_TXPDCAL_TUNE}
+};
+
+static struct cdns_torrent_vals sgmii_100_int_ssc_cmn_vals = {
+       .reg_pairs = sgmii_100_int_ssc_cmn_regs,
+       .num_regs = ARRAY_SIZE(sgmii_100_int_ssc_cmn_regs),
+};
+
+/* QSGMII 100 MHz Ref clk, no SSC */
+static struct cdns_reg_pairs sl_qsgmii_100_no_ssc_cmn_regs[] = {
+       {0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
+       {0x001E, CMN_PLL1_DSM_FBH_OVRD_M0},
+       {0x000C, CMN_PLL1_DSM_FBL_OVRD_M0},
+       {0x0003, CMN_PLL0_VCOCAL_TCTRL},
+       {0x0003, CMN_PLL1_VCOCAL_TCTRL}
+};
+
+static struct cdns_torrent_vals sl_qsgmii_100_no_ssc_cmn_vals = {
+       .reg_pairs = sl_qsgmii_100_no_ssc_cmn_regs,
+       .num_regs = ARRAY_SIZE(sl_qsgmii_100_no_ssc_cmn_regs),
+};
+
+static struct cdns_reg_pairs qsgmii_100_no_ssc_cmn_regs[] = {
+       {0x007F, CMN_TXPUCAL_TUNE},
+       {0x007F, CMN_TXPDCAL_TUNE}
+};
+
+static struct cdns_reg_pairs qsgmii_100_no_ssc_tx_ln_regs[] = {
+       {0x00F3, TX_PSC_A0},
+       {0x04A2, TX_PSC_A2},
+       {0x04A2, TX_PSC_A3},
+       {0x0000, TX_TXCC_CPOST_MULT_00},
+       {0x0011, TX_TXCC_MGNFS_MULT_100},
+       {0x0003, DRV_DIAG_TX_DRV}
+};
+
+static struct cdns_reg_pairs ti_qsgmii_100_no_ssc_tx_ln_regs[] = {
+       {0x00F3, TX_PSC_A0},
+       {0x04A2, TX_PSC_A2},
+       {0x04A2, TX_PSC_A3},
+       {0x0000, TX_TXCC_CPOST_MULT_00},
+       {0x0011, TX_TXCC_MGNFS_MULT_100},
+       {0x0003, DRV_DIAG_TX_DRV},
+       {0x4000, XCVR_DIAG_RXCLK_CTRL},
+};
+
+static struct cdns_reg_pairs qsgmii_100_no_ssc_rx_ln_regs[] = {
+       {0x091D, RX_PSC_A0},
+       {0x0900, RX_PSC_A2},
+       {0x0100, RX_PSC_A3},
+       {0x03C7, RX_REE_GCSM1_EQENM_PH1},
+       {0x01C7, RX_REE_GCSM1_EQENM_PH2},
+       {0x0000, RX_DIAG_DFE_CTRL},
+       {0x0019, RX_REE_TAP1_CLIP},
+       {0x0019, RX_REE_TAP2TON_CLIP},
+       {0x0098, RX_DIAG_NQST_CTRL},
+       {0x0C01, RX_DIAG_DFE_AMP_TUNE_2},
+       {0x0000, RX_DIAG_DFE_AMP_TUNE_3},
+       {0x0000, RX_DIAG_PI_CAP},
+       {0x0010, RX_DIAG_PI_RATE},
+       {0x0001, RX_DIAG_ACYA},
+       {0x018C, RX_CDRLF_CNFG},
+};
+
+static struct cdns_torrent_vals qsgmii_100_no_ssc_cmn_vals = {
+       .reg_pairs = qsgmii_100_no_ssc_cmn_regs,
+       .num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_cmn_regs),
+};
+
+static struct cdns_torrent_vals qsgmii_100_no_ssc_tx_ln_vals = {
+       .reg_pairs = qsgmii_100_no_ssc_tx_ln_regs,
+       .num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_tx_ln_regs),
+};
+
+static struct cdns_torrent_vals ti_qsgmii_100_no_ssc_tx_ln_vals = {
+       .reg_pairs = ti_qsgmii_100_no_ssc_tx_ln_regs,
+       .num_regs = ARRAY_SIZE(ti_qsgmii_100_no_ssc_tx_ln_regs),
+};
+
+static struct cdns_torrent_vals qsgmii_100_no_ssc_rx_ln_vals = {
+       .reg_pairs = qsgmii_100_no_ssc_rx_ln_regs,
+       .num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_rx_ln_regs),
+};
+
+/* QSGMII 100 MHz Ref clk, internal SSC */
+static struct cdns_reg_pairs qsgmii_100_int_ssc_cmn_regs[] = {
+       {0x0004, CMN_PLL0_DSM_DIAG_M0},
+       {0x0004, CMN_PLL0_DSM_DIAG_M1},
+       {0x0004, CMN_PLL1_DSM_DIAG_M0},
+       {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
+       {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
+       {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
+       {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
+       {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
+       {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
+       {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
+       {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
+       {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
+       {0x0064, CMN_PLL0_INTDIV_M0},
+       {0x0050, CMN_PLL0_INTDIV_M1},
+       {0x0064, CMN_PLL1_INTDIV_M0},
+       {0x0002, CMN_PLL0_FRACDIVH_M0},
+       {0x0002, CMN_PLL0_FRACDIVH_M1},
+       {0x0002, CMN_PLL1_FRACDIVH_M0},
+       {0x0044, CMN_PLL0_HIGH_THR_M0},
+       {0x0036, CMN_PLL0_HIGH_THR_M1},
+       {0x0044, CMN_PLL1_HIGH_THR_M0},
+       {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
+       {0x0002, CMN_PDIAG_PLL0_CTRL_M1},
+       {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
+       {0x0001, CMN_PLL0_SS_CTRL1_M0},
+       {0x0001, CMN_PLL0_SS_CTRL1_M1},
+       {0x0001, CMN_PLL1_SS_CTRL1_M0},
+       {0x011B, CMN_PLL0_SS_CTRL2_M0},
+       {0x011B, CMN_PLL0_SS_CTRL2_M1},
+       {0x011B, CMN_PLL1_SS_CTRL2_M0},
+       {0x006E, CMN_PLL0_SS_CTRL3_M0},
+       {0x0058, CMN_PLL0_SS_CTRL3_M1},
+       {0x006E, CMN_PLL1_SS_CTRL3_M0},
+       {0x000E, CMN_PLL0_SS_CTRL4_M0},
+       {0x0012, CMN_PLL0_SS_CTRL4_M1},
+       {0x000E, CMN_PLL1_SS_CTRL4_M0},
+       {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
+       {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
+       {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
+       {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
+       {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
+       {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
+       {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
+       {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
+       {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
+       {0x0005, CMN_PLL1_LOCK_PLLCNT_THR},
+       {0x007F, CMN_TXPUCAL_TUNE},
+       {0x007F, CMN_TXPDCAL_TUNE}
+};
+
+static struct cdns_torrent_vals qsgmii_100_int_ssc_cmn_vals = {
+       .reg_pairs = qsgmii_100_int_ssc_cmn_regs,
+       .num_regs = ARRAY_SIZE(qsgmii_100_int_ssc_cmn_regs),
+};
+
+/* Single SGMII/QSGMII link configuration */
+static struct cdns_reg_pairs sl_sgmii_link_cmn_regs[] = {
+       {0x0000, PHY_PLL_CFG},
+       {0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0}
+};
+
+static struct cdns_reg_pairs sl_sgmii_xcvr_diag_ln_regs[] = {
+       {0x0000, XCVR_DIAG_HSCLK_SEL},
+       {0x0003, XCVR_DIAG_HSCLK_DIV},
+       {0x0013, XCVR_DIAG_PLLDRC_CTRL}
+};
+
+static struct cdns_torrent_vals sl_sgmii_link_cmn_vals = {
+       .reg_pairs = sl_sgmii_link_cmn_regs,
+       .num_regs = ARRAY_SIZE(sl_sgmii_link_cmn_regs),
+};
+
+static struct cdns_torrent_vals sl_sgmii_xcvr_diag_ln_vals = {
+       .reg_pairs = sl_sgmii_xcvr_diag_ln_regs,
+       .num_regs = ARRAY_SIZE(sl_sgmii_xcvr_diag_ln_regs),
+};
+
+/* Multi link PCIe, 100 MHz Ref clk, internal SSC */
+static struct cdns_reg_pairs pcie_100_int_ssc_cmn_regs[] = {
+       {0x0004, CMN_PLL0_DSM_DIAG_M0},
+       {0x0004, CMN_PLL0_DSM_DIAG_M1},
+       {0x0004, CMN_PLL1_DSM_DIAG_M0},
+       {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
+       {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
+       {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
+       {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
+       {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
+       {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
+       {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
+       {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
+       {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
+       {0x0064, CMN_PLL0_INTDIV_M0},
+       {0x0050, CMN_PLL0_INTDIV_M1},
+       {0x0064, CMN_PLL1_INTDIV_M0},
+       {0x0002, CMN_PLL0_FRACDIVH_M0},
+       {0x0002, CMN_PLL0_FRACDIVH_M1},
+       {0x0002, CMN_PLL1_FRACDIVH_M0},
+       {0x0044, CMN_PLL0_HIGH_THR_M0},
+       {0x0036, CMN_PLL0_HIGH_THR_M1},
+       {0x0044, CMN_PLL1_HIGH_THR_M0},
+       {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
+       {0x0002, CMN_PDIAG_PLL0_CTRL_M1},
+       {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
+       {0x0001, CMN_PLL0_SS_CTRL1_M0},
+       {0x0001, CMN_PLL0_SS_CTRL1_M1},
+       {0x0001, CMN_PLL1_SS_CTRL1_M0},
+       {0x011B, CMN_PLL0_SS_CTRL2_M0},
+       {0x011B, CMN_PLL0_SS_CTRL2_M1},
+       {0x011B, CMN_PLL1_SS_CTRL2_M0},
+       {0x006E, CMN_PLL0_SS_CTRL3_M0},
+       {0x0058, CMN_PLL0_SS_CTRL3_M1},
+       {0x006E, CMN_PLL1_SS_CTRL3_M0},
+       {0x000E, CMN_PLL0_SS_CTRL4_M0},
+       {0x0012, CMN_PLL0_SS_CTRL4_M1},
+       {0x000E, CMN_PLL1_SS_CTRL4_M0},
+       {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
+       {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
+       {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
+       {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
+       {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
+       {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
+       {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
+       {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
+       {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
+       {0x0005, CMN_PLL1_LOCK_PLLCNT_THR}
+};
+
+static struct cdns_torrent_vals pcie_100_int_ssc_cmn_vals = {
+       .reg_pairs = pcie_100_int_ssc_cmn_regs,
+       .num_regs = ARRAY_SIZE(pcie_100_int_ssc_cmn_regs),
+};
+
+/* Single link PCIe, 100 MHz Ref clk, internal SSC */
+static struct cdns_reg_pairs sl_pcie_100_int_ssc_cmn_regs[] = {
+       {0x0004, CMN_PLL0_DSM_DIAG_M0},
+       {0x0004, CMN_PLL0_DSM_DIAG_M1},
+       {0x0004, CMN_PLL1_DSM_DIAG_M0},
+       {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
+       {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
+       {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
+       {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
+       {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
+       {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
+       {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
+       {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
+       {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
+       {0x0064, CMN_PLL0_INTDIV_M0},
+       {0x0050, CMN_PLL0_INTDIV_M1},
+       {0x0050, CMN_PLL1_INTDIV_M0},
+       {0x0002, CMN_PLL0_FRACDIVH_M0},
+       {0x0002, CMN_PLL0_FRACDIVH_M1},
+       {0x0002, CMN_PLL1_FRACDIVH_M0},
+       {0x0044, CMN_PLL0_HIGH_THR_M0},
+       {0x0036, CMN_PLL0_HIGH_THR_M1},
+       {0x0036, CMN_PLL1_HIGH_THR_M0},
+       {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
+       {0x0002, CMN_PDIAG_PLL0_CTRL_M1},
+       {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
+       {0x0001, CMN_PLL0_SS_CTRL1_M0},
+       {0x0001, CMN_PLL0_SS_CTRL1_M1},
+       {0x0001, CMN_PLL1_SS_CTRL1_M0},
+       {0x011B, CMN_PLL0_SS_CTRL2_M0},
+       {0x011B, CMN_PLL0_SS_CTRL2_M1},
+       {0x011B, CMN_PLL1_SS_CTRL2_M0},
+       {0x006E, CMN_PLL0_SS_CTRL3_M0},
+       {0x0058, CMN_PLL0_SS_CTRL3_M1},
+       {0x0058, CMN_PLL1_SS_CTRL3_M0},
+       {0x000E, CMN_PLL0_SS_CTRL4_M0},
+       {0x0012, CMN_PLL0_SS_CTRL4_M1},
+       {0x0012, CMN_PLL1_SS_CTRL4_M0},
+       {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
+       {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
+       {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
+       {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
+       {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
+       {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
+       {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
+       {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
+       {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
+       {0x0005, CMN_PLL1_LOCK_PLLCNT_THR}
+};
+
+static struct cdns_torrent_vals sl_pcie_100_int_ssc_cmn_vals = {
+       .reg_pairs = sl_pcie_100_int_ssc_cmn_regs,
+       .num_regs = ARRAY_SIZE(sl_pcie_100_int_ssc_cmn_regs),
+};
+
+/* PCIe, 100 MHz Ref clk, no SSC & external SSC */
+static struct cdns_reg_pairs pcie_100_ext_no_ssc_cmn_regs[] = {
+       {0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
+       {0x001E, CMN_PLL1_DSM_FBH_OVRD_M0},
+       {0x000C, CMN_PLL1_DSM_FBL_OVRD_M0}
+};
+
+static struct cdns_reg_pairs pcie_100_ext_no_ssc_rx_ln_regs[] = {
+       {0x0019, RX_REE_TAP1_CLIP},
+       {0x0019, RX_REE_TAP2TON_CLIP},
+       {0x0001, RX_DIAG_ACYA}
+};
+
+static struct cdns_torrent_vals pcie_100_no_ssc_cmn_vals = {
+       .reg_pairs = pcie_100_ext_no_ssc_cmn_regs,
+       .num_regs = ARRAY_SIZE(pcie_100_ext_no_ssc_cmn_regs),
+};
+
+static struct cdns_torrent_vals pcie_100_no_ssc_rx_ln_vals = {
+       .reg_pairs = pcie_100_ext_no_ssc_rx_ln_regs,
+       .num_regs = ARRAY_SIZE(pcie_100_ext_no_ssc_rx_ln_regs),
+};
+
+static const struct cdns_torrent_data cdns_map_torrent = {
+       .block_offset_shift = 0x2,
+       .reg_offset_shift = 0x2,
+       .link_cmn_vals = {
+               [TYPE_PCIE] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = NULL,
+                               [EXTERNAL_SSC] = NULL,
+                               [INTERNAL_SSC] = NULL,
+                       },
+                       [TYPE_SGMII] = {
+                               [NO_SSC] = &pcie_sgmii_link_cmn_vals,
+                               [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
+                               [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
+                       },
+                       [TYPE_QSGMII] = {
+                               [NO_SSC] = &pcie_sgmii_link_cmn_vals,
+                               [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
+                               [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &pcie_usb_link_cmn_vals,
+                               [EXTERNAL_SSC] = &pcie_usb_link_cmn_vals,
+                               [INTERNAL_SSC] = &pcie_usb_link_cmn_vals,
+                       },
+               },
+               [TYPE_SGMII] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &sl_sgmii_link_cmn_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &pcie_sgmii_link_cmn_vals,
+                               [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
+                               [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &usb_sgmii_link_cmn_vals,
+                               [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
+                               [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
+                       },
+               },
+               [TYPE_QSGMII] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &sl_sgmii_link_cmn_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &pcie_sgmii_link_cmn_vals,
+                               [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
+                               [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &usb_sgmii_link_cmn_vals,
+                               [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
+                               [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
+                       },
+               },
+               [TYPE_USB] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &sl_usb_link_cmn_vals,
+                               [EXTERNAL_SSC] = &sl_usb_link_cmn_vals,
+                               [INTERNAL_SSC] = &sl_usb_link_cmn_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &pcie_usb_link_cmn_vals,
+                               [EXTERNAL_SSC] = &pcie_usb_link_cmn_vals,
+                               [INTERNAL_SSC] = &pcie_usb_link_cmn_vals,
+                       },
+                       [TYPE_SGMII] = {
+                               [NO_SSC] = &usb_sgmii_link_cmn_vals,
+                               [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
+                               [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
+                       },
+                       [TYPE_QSGMII] = {
+                               [NO_SSC] = &usb_sgmii_link_cmn_vals,
+                               [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
+                               [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
+                       },
+               },
+       },
+       .xcvr_diag_vals = {
+               [TYPE_PCIE] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = NULL,
+                               [EXTERNAL_SSC] = NULL,
+                               [INTERNAL_SSC] = NULL,
+                       },
+                       [TYPE_SGMII] = {
+                               [NO_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
+                               [EXTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
+                               [INTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
+                       },
+                       [TYPE_QSGMII] = {
+                               [NO_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
+                               [EXTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
+                               [INTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &pcie_usb_xcvr_diag_ln_vals,
+                               [EXTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals,
+                               [INTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals,
+                       },
+               },
+               [TYPE_SGMII] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &sl_sgmii_xcvr_diag_ln_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
+                               [EXTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
+                               [INTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
+                               [EXTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
+                               [INTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
+                       },
+               },
+               [TYPE_QSGMII] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &sl_sgmii_xcvr_diag_ln_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
+                               [EXTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
+                               [INTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
+                               [EXTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
+                               [INTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
+                       },
+               },
+               [TYPE_USB] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &sl_usb_xcvr_diag_ln_vals,
+                               [EXTERNAL_SSC] = &sl_usb_xcvr_diag_ln_vals,
+                               [INTERNAL_SSC] = &sl_usb_xcvr_diag_ln_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &usb_pcie_xcvr_diag_ln_vals,
+                               [EXTERNAL_SSC] = &usb_pcie_xcvr_diag_ln_vals,
+                               [INTERNAL_SSC] = &usb_pcie_xcvr_diag_ln_vals,
+                       },
+                       [TYPE_SGMII] = {
+                               [NO_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
+                               [EXTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
+                               [INTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
+                       },
+                       [TYPE_QSGMII] = {
+                               [NO_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
+                               [EXTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
+                               [INTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
+                       },
+               },
+       },
+       .pcs_cmn_vals = {
+               [TYPE_USB] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &usb_phy_pcs_cmn_vals,
+                               [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
+                               [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &usb_phy_pcs_cmn_vals,
+                               [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
+                               [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
+                       },
+                       [TYPE_SGMII] = {
+                               [NO_SSC] = &usb_phy_pcs_cmn_vals,
+                               [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
+                               [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
+                       },
+                       [TYPE_QSGMII] = {
+                               [NO_SSC] = &usb_phy_pcs_cmn_vals,
+                               [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
+                               [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
+                       },
+               },
+       },
+       .cmn_vals = {
+               [TYPE_PCIE] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = NULL,
+                               [EXTERNAL_SSC] = NULL,
+                               [INTERNAL_SSC] = &sl_pcie_100_int_ssc_cmn_vals,
+                       },
+                       [TYPE_SGMII] = {
+                               [NO_SSC] = &pcie_100_no_ssc_cmn_vals,
+                               [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals,
+                               [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals,
+                       },
+                       [TYPE_QSGMII] = {
+                               [NO_SSC] = &pcie_100_no_ssc_cmn_vals,
+                               [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals,
+                               [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &pcie_100_no_ssc_cmn_vals,
+                               [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals,
+                               [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals,
+                       },
+               },
+               [TYPE_SGMII] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &sl_sgmii_100_no_ssc_cmn_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &sgmii_100_no_ssc_cmn_vals,
+                               [EXTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals,
+                               [INTERNAL_SSC] = &sgmii_100_int_ssc_cmn_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &sgmii_100_no_ssc_cmn_vals,
+                               [EXTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals,
+                               [INTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals,
+                       },
+               },
+               [TYPE_QSGMII] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &sl_qsgmii_100_no_ssc_cmn_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &qsgmii_100_no_ssc_cmn_vals,
+                               [EXTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals,
+                               [INTERNAL_SSC] = &qsgmii_100_int_ssc_cmn_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &qsgmii_100_no_ssc_cmn_vals,
+                               [EXTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals,
+                               [INTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals,
+                       },
+               },
+               [TYPE_USB] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals,
+                               [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals,
+                               [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &usb_100_no_ssc_cmn_vals,
+                               [EXTERNAL_SSC] = &usb_100_no_ssc_cmn_vals,
+                               [INTERNAL_SSC] = &usb_100_int_ssc_cmn_vals,
+                       },
+                       [TYPE_SGMII] = {
+                               [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals,
+                               [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals,
+                               [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals,
+                       },
+                       [TYPE_QSGMII] = {
+                               [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals,
+                               [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals,
+                               [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals,
+                       },
+               },
+       },
+       .tx_ln_vals = {
+               [TYPE_PCIE] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = NULL,
+                               [EXTERNAL_SSC] = NULL,
+                               [INTERNAL_SSC] = NULL,
+                       },
+                       [TYPE_SGMII] = {
+                               [NO_SSC] = NULL,
+                               [EXTERNAL_SSC] = NULL,
+                               [INTERNAL_SSC] = NULL,
+                       },
+                       [TYPE_QSGMII] = {
+                               [NO_SSC] = NULL,
+                               [EXTERNAL_SSC] = NULL,
+                               [INTERNAL_SSC] = NULL,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = NULL,
+                               [EXTERNAL_SSC] = NULL,
+                               [INTERNAL_SSC] = NULL,
+                       },
+               },
+               [TYPE_SGMII] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
+                               [EXTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
+                               [INTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
+                               [EXTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
+                               [INTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
+                       },
+               },
+               [TYPE_QSGMII] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
+                               [EXTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
+                               [INTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
+                               [EXTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
+                               [INTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
+                       },
+               },
+               [TYPE_USB] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                               [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                               [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                               [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                               [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                       },
+                       [TYPE_SGMII] = {
+                               [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                               [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                               [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                       },
+                       [TYPE_QSGMII] = {
+                               [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                               [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                               [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                       },
+               },
+       },
+       .rx_ln_vals = {
+               [TYPE_PCIE] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                       },
+                       [TYPE_SGMII] = {
+                               [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                       },
+                       [TYPE_QSGMII] = {
+                               [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                       },
+               },
+               [TYPE_SGMII] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
+                       },
+               },
+               [TYPE_QSGMII] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
+                       },
+               },
+               [TYPE_USB] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                       },
+                       [TYPE_SGMII] = {
+                               [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                       },
+                       [TYPE_QSGMII] = {
+                               [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                       },
+               },
+       },
+};
+
+static const struct cdns_torrent_data ti_j721e_map_torrent = {
+       .block_offset_shift = 0x0,
+       .reg_offset_shift = 0x1,
+       .link_cmn_vals = {
+               [TYPE_PCIE] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = NULL,
+                               [EXTERNAL_SSC] = NULL,
+                               [INTERNAL_SSC] = NULL,
+                       },
+                       [TYPE_SGMII] = {
+                               [NO_SSC] = &pcie_sgmii_link_cmn_vals,
+                               [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
+                               [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
+                       },
+                       [TYPE_QSGMII] = {
+                               [NO_SSC] = &pcie_sgmii_link_cmn_vals,
+                               [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
+                               [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &pcie_usb_link_cmn_vals,
+                               [EXTERNAL_SSC] = &pcie_usb_link_cmn_vals,
+                               [INTERNAL_SSC] = &pcie_usb_link_cmn_vals,
+                       },
+               },
+               [TYPE_SGMII] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &sl_sgmii_link_cmn_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &pcie_sgmii_link_cmn_vals,
+                               [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
+                               [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &usb_sgmii_link_cmn_vals,
+                               [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
+                               [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
+                       },
+               },
+               [TYPE_QSGMII] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &sl_sgmii_link_cmn_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &pcie_sgmii_link_cmn_vals,
+                               [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
+                               [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &usb_sgmii_link_cmn_vals,
+                               [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
+                               [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
+                       },
+               },
+               [TYPE_USB] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &sl_usb_link_cmn_vals,
+                               [EXTERNAL_SSC] = &sl_usb_link_cmn_vals,
+                               [INTERNAL_SSC] = &sl_usb_link_cmn_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &pcie_usb_link_cmn_vals,
+                               [EXTERNAL_SSC] = &pcie_usb_link_cmn_vals,
+                               [INTERNAL_SSC] = &pcie_usb_link_cmn_vals,
+                       },
+                       [TYPE_SGMII] = {
+                               [NO_SSC] = &usb_sgmii_link_cmn_vals,
+                               [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
+                               [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
+                       },
+                       [TYPE_QSGMII] = {
+                               [NO_SSC] = &usb_sgmii_link_cmn_vals,
+                               [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
+                               [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
+                       },
+               },
+       },
+       .xcvr_diag_vals = {
+               [TYPE_PCIE] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = NULL,
+                               [EXTERNAL_SSC] = NULL,
+                               [INTERNAL_SSC] = NULL,
+                       },
+                       [TYPE_SGMII] = {
+                               [NO_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
+                               [EXTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
+                               [INTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
+                       },
+                       [TYPE_QSGMII] = {
+                               [NO_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
+                               [EXTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
+                               [INTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &pcie_usb_xcvr_diag_ln_vals,
+                               [EXTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals,
+                               [INTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals,
+                       },
+               },
+               [TYPE_SGMII] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &sl_sgmii_xcvr_diag_ln_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
+                               [EXTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
+                               [INTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
+                               [EXTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
+                               [INTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
+                       },
+               },
+               [TYPE_QSGMII] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &sl_sgmii_xcvr_diag_ln_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
+                               [EXTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
+                               [INTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
+                               [EXTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
+                               [INTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
+                       },
+               },
+               [TYPE_USB] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &sl_usb_xcvr_diag_ln_vals,
+                               [EXTERNAL_SSC] = &sl_usb_xcvr_diag_ln_vals,
+                               [INTERNAL_SSC] = &sl_usb_xcvr_diag_ln_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &usb_pcie_xcvr_diag_ln_vals,
+                               [EXTERNAL_SSC] = &usb_pcie_xcvr_diag_ln_vals,
+                               [INTERNAL_SSC] = &usb_pcie_xcvr_diag_ln_vals,
+                       },
+                       [TYPE_SGMII] = {
+                               [NO_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
+                               [EXTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
+                               [INTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
+                       },
+                       [TYPE_QSGMII] = {
+                               [NO_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
+                               [EXTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
+                               [INTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
+                       },
+               },
+       },
+       .pcs_cmn_vals = {
+               [TYPE_USB] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &usb_phy_pcs_cmn_vals,
+                               [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
+                               [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &usb_phy_pcs_cmn_vals,
+                               [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
+                               [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
+                       },
+                       [TYPE_SGMII] = {
+                               [NO_SSC] = &usb_phy_pcs_cmn_vals,
+                               [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
+                               [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
+                       },
+                       [TYPE_QSGMII] = {
+                               [NO_SSC] = &usb_phy_pcs_cmn_vals,
+                               [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
+                               [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
+                       },
+               },
+       },
+       .cmn_vals = {
+               [TYPE_PCIE] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = NULL,
+                               [EXTERNAL_SSC] = NULL,
+                               [INTERNAL_SSC] = &sl_pcie_100_int_ssc_cmn_vals,
+                       },
+                       [TYPE_SGMII] = {
+                               [NO_SSC] = &pcie_100_no_ssc_cmn_vals,
+                               [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals,
+                               [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals,
+                       },
+                       [TYPE_QSGMII] = {
+                               [NO_SSC] = &pcie_100_no_ssc_cmn_vals,
+                               [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals,
+                               [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &pcie_100_no_ssc_cmn_vals,
+                               [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals,
+                               [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals,
+                       },
+               },
+               [TYPE_SGMII] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &sl_sgmii_100_no_ssc_cmn_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &sgmii_100_no_ssc_cmn_vals,
+                               [EXTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals,
+                               [INTERNAL_SSC] = &sgmii_100_int_ssc_cmn_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &sgmii_100_no_ssc_cmn_vals,
+                               [EXTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals,
+                               [INTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals,
+                       },
+               },
+               [TYPE_QSGMII] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &sl_qsgmii_100_no_ssc_cmn_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &qsgmii_100_no_ssc_cmn_vals,
+                               [EXTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals,
+                               [INTERNAL_SSC] = &qsgmii_100_int_ssc_cmn_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &qsgmii_100_no_ssc_cmn_vals,
+                               [EXTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals,
+                               [INTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals,
+                       },
+               },
+               [TYPE_USB] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals,
+                               [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals,
+                               [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &usb_100_no_ssc_cmn_vals,
+                               [EXTERNAL_SSC] = &usb_100_no_ssc_cmn_vals,
+                               [INTERNAL_SSC] = &usb_100_int_ssc_cmn_vals,
+                       },
+                       [TYPE_SGMII] = {
+                               [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals,
+                               [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals,
+                               [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals,
+                       },
+                       [TYPE_QSGMII] = {
+                               [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals,
+                               [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals,
+                               [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals,
+                       },
+               },
+       },
+       .tx_ln_vals = {
+               [TYPE_PCIE] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = NULL,
+                               [EXTERNAL_SSC] = NULL,
+                               [INTERNAL_SSC] = NULL,
+                       },
+                       [TYPE_SGMII] = {
+                               [NO_SSC] = NULL,
+                               [EXTERNAL_SSC] = NULL,
+                               [INTERNAL_SSC] = NULL,
+                       },
+                       [TYPE_QSGMII] = {
+                               [NO_SSC] = NULL,
+                               [EXTERNAL_SSC] = NULL,
+                               [INTERNAL_SSC] = NULL,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = NULL,
+                               [EXTERNAL_SSC] = NULL,
+                               [INTERNAL_SSC] = NULL,
+                       },
+               },
+               [TYPE_SGMII] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals,
+                               [EXTERNAL_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals,
+                               [INTERNAL_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals,
+                               [EXTERNAL_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals,
+                               [INTERNAL_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals,
+                       },
+               },
+               [TYPE_QSGMII] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals,
+                               [EXTERNAL_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals,
+                               [INTERNAL_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals,
+                               [EXTERNAL_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals,
+                               [INTERNAL_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals,
+                       },
+               },
+               [TYPE_USB] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                               [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                               [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                               [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                               [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                       },
+                       [TYPE_SGMII] = {
+                               [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                               [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                               [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                       },
+                       [TYPE_QSGMII] = {
+                               [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                               [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                               [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                       },
+               },
+       },
+       .rx_ln_vals = {
+               [TYPE_PCIE] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                       },
+                       [TYPE_SGMII] = {
+                               [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                       },
+                       [TYPE_QSGMII] = {
+                               [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                       },
+               },
+               [TYPE_SGMII] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
+                       },
+               },
+               [TYPE_QSGMII] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
+                       },
+               },
+               [TYPE_USB] = {
+                       [TYPE_NONE] = {
+                               [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                       },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                       },
+                       [TYPE_SGMII] = {
+                               [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                       },
+                       [TYPE_QSGMII] = {
+                               [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                               [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                               [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                       },
+               },
+       },
+};
+
+static int cdns_torrent_phy_reset(struct phy *gphy)
+{
+       struct cdns_torrent_phy *sp = dev_get_priv(gphy->dev);
+
+       reset_control_assert(sp->phy_rst);
+       reset_control_deassert(sp->phy_rst);
+       return 0;
+}
+
+static const struct udevice_id cdns_torrent_id_table[] = {
+       {
+               .compatible = "cdns,torrent-phy",
+               .data = (ulong)&cdns_map_torrent,
+       },
+       {
+               .compatible = "ti,j721e-serdes-10g",
+               .data = (ulong)&ti_j721e_map_torrent,
+       },
+       {}
+};
+
+static const struct phy_ops cdns_torrent_phy_ops = {
+       .init           = cdns_torrent_phy_init,
+       .power_on       = cdns_torrent_phy_on,
+       .power_off      = cdns_torrent_phy_off,
+       .reset          = cdns_torrent_phy_reset,
+};
+
+U_BOOT_DRIVER(torrent_phy_provider) = {
+       .name           = "cdns,torrent",
+       .id             = UCLASS_PHY,
+       .of_match       = cdns_torrent_id_table,
+       .probe          = cdns_torrent_phy_probe,
+       .remove         = cdns_torrent_phy_remove,
+       .ops            = &cdns_torrent_phy_ops,
+       .priv_auto      = sizeof(struct cdns_torrent_phy),
+};
diff --git a/drivers/phy/ti/Kconfig b/drivers/phy/ti/Kconfig
new file mode 100644 (file)
index 0000000..111085f
--- /dev/null
@@ -0,0 +1,9 @@
+config PHY_J721E_WIZ
+       tristate "TI J721E WIZ (SERDES Wrapper) support"
+       depends on ARCH_K3
+       help
+         This option enables support for WIZ module present in TI's J721E
+         SoC. WIZ is a serdes wrapper used to configure some of the input
+         signals to the SERDES (Sierra/Torrent). This driver configures
+         three clock selects (pll0, pll1, dig) and resets for each of the
+         lanes.
diff --git a/drivers/phy/ti/Makefile b/drivers/phy/ti/Makefile
new file mode 100644 (file)
index 0000000..873ddbf
--- /dev/null
@@ -0,0 +1 @@
+obj-$(CONFIG_$(SPL_)PHY_J721E_WIZ)     += phy-j721e-wiz.o
diff --git a/drivers/phy/ti/phy-j721e-wiz.c b/drivers/phy/ti/phy-j721e-wiz.c
new file mode 100644 (file)
index 0000000..d74efcd
--- /dev/null
@@ -0,0 +1,1156 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2017-2018 Texas Instruments Incorporated - http://www.ti.com/
+ * Jean-Jacques Hiblot <jjhiblot@ti.com>
+ */
+
+#include <common.h>
+#include <clk-uclass.h>
+#include <dm.h>
+#include <dm/device_compat.h>
+#include <asm/gpio.h>
+#include <dm/lists.h>
+#include <dm/device-internal.h>
+#include <regmap.h>
+#include <reset-uclass.h>
+#include <dt-bindings/phy/phy.h>
+
+#include <dt-bindings/phy/phy-ti.h>
+
+#define WIZ_MAX_INPUT_CLOCKS   4
+/* To include mux clocks, divider clocks and gate clocks */
+#define WIZ_MAX_OUTPUT_CLOCKS  32
+
+#define WIZ_MAX_LANES          4
+#define WIZ_MUX_NUM_CLOCKS     3
+#define WIZ_DIV_NUM_CLOCKS_16G 2
+#define WIZ_DIV_NUM_CLOCKS_10G 1
+
+#define WIZ_SERDES_CTRL                0x404
+#define WIZ_SERDES_TOP_CTRL    0x408
+#define WIZ_SERDES_RST         0x40c
+#define WIZ_SERDES_TYPEC       0x410
+#define WIZ_LANECTL(n)         (0x480 + (0x40 * (n)))
+#define WIZ_LANEDIV(n)         (0x484 + (0x40 * (n)))
+
+#define WIZ_MAX_LANES          4
+#define WIZ_MUX_NUM_CLOCKS     3
+#define WIZ_DIV_NUM_CLOCKS_16G 2
+#define WIZ_DIV_NUM_CLOCKS_10G 1
+
+#define WIZ_SERDES_TYPEC_LN10_SWAP     BIT(30)
+
+enum wiz_lane_standard_mode {
+       LANE_MODE_GEN1,
+       LANE_MODE_GEN2,
+       LANE_MODE_GEN3,
+       LANE_MODE_GEN4,
+};
+
+enum wiz_refclk_mux_sel {
+       PLL0_REFCLK,
+       PLL1_REFCLK,
+       REFCLK_DIG,
+};
+
+enum wiz_refclk_div_sel {
+       CMN_REFCLK,
+       CMN_REFCLK1,
+};
+
+enum wiz_clock_input {
+       WIZ_CORE_REFCLK,
+       WIZ_EXT_REFCLK,
+       WIZ_CORE_REFCLK1,
+       WIZ_EXT_REFCLK1,
+};
+
+static const struct reg_field por_en = REG_FIELD(WIZ_SERDES_CTRL, 31, 31);
+static const struct reg_field phy_reset_n = REG_FIELD(WIZ_SERDES_RST, 31, 31);
+static const struct reg_field pll1_refclk_mux_sel =
+                                       REG_FIELD(WIZ_SERDES_RST, 29, 29);
+static const struct reg_field pll0_refclk_mux_sel =
+                                       REG_FIELD(WIZ_SERDES_RST, 28, 28);
+static const struct reg_field refclk_dig_sel_16g =
+                                       REG_FIELD(WIZ_SERDES_RST, 24, 25);
+static const struct reg_field refclk_dig_sel_10g =
+                                       REG_FIELD(WIZ_SERDES_RST, 24, 24);
+static const struct reg_field pma_cmn_refclk_int_mode =
+                                       REG_FIELD(WIZ_SERDES_TOP_CTRL, 28, 29);
+static const struct reg_field pma_cmn_refclk_mode =
+                                       REG_FIELD(WIZ_SERDES_TOP_CTRL, 30, 31);
+static const struct reg_field pma_cmn_refclk_dig_div =
+                                       REG_FIELD(WIZ_SERDES_TOP_CTRL, 26, 27);
+static const struct reg_field pma_cmn_refclk1_dig_div =
+                                       REG_FIELD(WIZ_SERDES_TOP_CTRL, 24, 25);
+
+static const struct reg_field p_enable[WIZ_MAX_LANES] = {
+       REG_FIELD(WIZ_LANECTL(0), 30, 31),
+       REG_FIELD(WIZ_LANECTL(1), 30, 31),
+       REG_FIELD(WIZ_LANECTL(2), 30, 31),
+       REG_FIELD(WIZ_LANECTL(3), 30, 31),
+};
+
+enum p_enable { P_ENABLE = 2, P_ENABLE_FORCE = 1, P_ENABLE_DISABLE = 0 };
+
+static const struct reg_field p_align[WIZ_MAX_LANES] = {
+       REG_FIELD(WIZ_LANECTL(0), 29, 29),
+       REG_FIELD(WIZ_LANECTL(1), 29, 29),
+       REG_FIELD(WIZ_LANECTL(2), 29, 29),
+       REG_FIELD(WIZ_LANECTL(3), 29, 29),
+};
+
+static const struct reg_field p_raw_auto_start[WIZ_MAX_LANES] = {
+       REG_FIELD(WIZ_LANECTL(0), 28, 28),
+       REG_FIELD(WIZ_LANECTL(1), 28, 28),
+       REG_FIELD(WIZ_LANECTL(2), 28, 28),
+       REG_FIELD(WIZ_LANECTL(3), 28, 28),
+};
+
+static const struct reg_field p_standard_mode[WIZ_MAX_LANES] = {
+       REG_FIELD(WIZ_LANECTL(0), 24, 25),
+       REG_FIELD(WIZ_LANECTL(1), 24, 25),
+       REG_FIELD(WIZ_LANECTL(2), 24, 25),
+       REG_FIELD(WIZ_LANECTL(3), 24, 25),
+};
+
+static const struct reg_field p0_fullrt_div[WIZ_MAX_LANES] = {
+       REG_FIELD(WIZ_LANECTL(0), 22, 23),
+       REG_FIELD(WIZ_LANECTL(1), 22, 23),
+       REG_FIELD(WIZ_LANECTL(2), 22, 23),
+       REG_FIELD(WIZ_LANECTL(3), 22, 23),
+};
+
+static const struct reg_field p_mac_div_sel0[WIZ_MAX_LANES] = {
+       REG_FIELD(WIZ_LANEDIV(0), 16, 22),
+       REG_FIELD(WIZ_LANEDIV(1), 16, 22),
+       REG_FIELD(WIZ_LANEDIV(2), 16, 22),
+       REG_FIELD(WIZ_LANEDIV(3), 16, 22),
+};
+
+static const struct reg_field p_mac_div_sel1[WIZ_MAX_LANES] = {
+       REG_FIELD(WIZ_LANEDIV(0), 0, 8),
+       REG_FIELD(WIZ_LANEDIV(1), 0, 8),
+       REG_FIELD(WIZ_LANEDIV(2), 0, 8),
+       REG_FIELD(WIZ_LANEDIV(3), 0, 8),
+};
+
+struct wiz_clk_mux_sel {
+       enum wiz_refclk_mux_sel mux_sel;
+       u32                     table[WIZ_MAX_INPUT_CLOCKS];
+       const char              *node_name;
+       u32                     num_parents;
+       u32                     parents[WIZ_MAX_INPUT_CLOCKS];
+};
+
+struct wiz_clk_div_sel {
+       enum wiz_refclk_div_sel div_sel;
+       const char              *node_name;
+};
+
+static struct wiz_clk_mux_sel clk_mux_sel_16g[] = {
+       {
+               /*
+                * Mux value to be configured for each of the input clocks
+                * in the order populated in device tree
+                */
+               .num_parents = 2,
+               .parents = { WIZ_CORE_REFCLK, WIZ_EXT_REFCLK },
+               .mux_sel = PLL0_REFCLK,
+               .table = { 1, 0 },
+               .node_name = "pll0-refclk",
+       },
+       {
+               .num_parents = 2,
+               .parents = { WIZ_CORE_REFCLK1, WIZ_EXT_REFCLK1 },
+               .mux_sel = PLL1_REFCLK,
+               .table = { 1, 0 },
+               .node_name = "pll1-refclk",
+       },
+       {
+               .num_parents = 4,
+               .parents = { WIZ_CORE_REFCLK, WIZ_CORE_REFCLK1, WIZ_EXT_REFCLK, WIZ_EXT_REFCLK1 },
+               .mux_sel = REFCLK_DIG,
+               .table = { 1, 3, 0, 2 },
+               .node_name = "refclk-dig",
+       },
+};
+
+static struct wiz_clk_mux_sel clk_mux_sel_10g[] = {
+       {
+               /*
+                * Mux value to be configured for each of the input clocks
+                * in the order populated in device tree
+                */
+               .num_parents = 2,
+               .parents = { WIZ_CORE_REFCLK, WIZ_EXT_REFCLK },
+               .mux_sel = PLL0_REFCLK,
+               .table = { 1, 0 },
+               .node_name = "pll0-refclk",
+       },
+       {
+               .num_parents = 2,
+               .parents = { WIZ_CORE_REFCLK, WIZ_EXT_REFCLK },
+               .mux_sel = PLL1_REFCLK,
+               .table = { 1, 0 },
+               .node_name = "pll1-refclk",
+       },
+       {
+               .num_parents = 2,
+               .parents = { WIZ_CORE_REFCLK, WIZ_EXT_REFCLK },
+               .mux_sel = REFCLK_DIG,
+               .table = { 1, 0 },
+               .node_name = "refclk-dig",
+       },
+};
+
+static struct wiz_clk_div_sel clk_div_sel[] = {
+       {
+               .div_sel = CMN_REFCLK,
+               .node_name = "cmn-refclk-dig-div",
+       },
+       {
+               .div_sel = CMN_REFCLK1,
+               .node_name = "cmn-refclk1-dig-div",
+       },
+};
+
+enum wiz_type {
+       J721E_WIZ_16G,
+       J721E_WIZ_10G,
+       AM64_WIZ_10G,
+};
+
+#define WIZ_TYPEC_DIR_DEBOUNCE_MIN     100     /* ms */
+#define WIZ_TYPEC_DIR_DEBOUNCE_MAX     1000
+
+struct wiz {
+       struct regmap           *regmap;
+       enum wiz_type           type;
+       struct wiz_clk_mux_sel  *clk_mux_sel;
+       struct wiz_clk_div_sel  *clk_div_sel;
+       unsigned int            clk_div_sel_num;
+       struct regmap_field     *por_en;
+       struct regmap_field     *phy_reset_n;
+       struct regmap_field     *phy_en_refclk;
+       struct regmap_field     *p_enable[WIZ_MAX_LANES];
+       struct regmap_field     *p_align[WIZ_MAX_LANES];
+       struct regmap_field     *p_raw_auto_start[WIZ_MAX_LANES];
+       struct regmap_field     *p_standard_mode[WIZ_MAX_LANES];
+       struct regmap_field     *p_mac_div_sel0[WIZ_MAX_LANES];
+       struct regmap_field     *p_mac_div_sel1[WIZ_MAX_LANES];
+       struct regmap_field     *p0_fullrt_div[WIZ_MAX_LANES];
+       struct regmap_field     *pma_cmn_refclk_int_mode;
+       struct regmap_field     *pma_cmn_refclk_mode;
+       struct regmap_field     *pma_cmn_refclk_dig_div;
+       struct regmap_field     *pma_cmn_refclk1_dig_div;
+       struct regmap_field     *div_sel_field[WIZ_DIV_NUM_CLOCKS_16G];
+       struct regmap_field     *mux_sel_field[WIZ_MUX_NUM_CLOCKS];
+
+       struct udevice          *dev;
+       u32                     num_lanes;
+       struct gpio_desc        *gpio_typec_dir;
+       u32                     lane_phy_type[WIZ_MAX_LANES];
+       struct clk              *input_clks[WIZ_MAX_INPUT_CLOCKS];
+       unsigned int            id;
+};
+
+struct wiz_div_clk {
+       struct clk parent_clk;
+       struct wiz *wiz;
+};
+
+struct wiz_mux_clk {
+       struct clk parent_clks[4];
+       struct wiz *wiz;
+};
+
+struct wiz_clk {
+       struct wiz *wiz;
+};
+
+struct wiz_reset {
+       struct wiz *wiz;
+};
+
+static ulong wiz_div_clk_get_rate(struct clk *clk)
+{
+       struct udevice *dev = clk->dev;
+       struct wiz_div_clk *priv = dev_get_priv(dev);
+       struct wiz_clk_div_sel *data = dev_get_plat(dev);
+       struct wiz *wiz = priv->wiz;
+       ulong parent_rate = clk_get_rate(&priv->parent_clk);
+       u32 val;
+
+       regmap_field_read(wiz->div_sel_field[data->div_sel], &val);
+
+       return parent_rate >> val;
+}
+
+static ulong wiz_div_clk_set_rate(struct clk *clk, ulong rate)
+{
+       struct udevice *dev = clk->dev;
+       struct wiz_div_clk *priv = dev_get_priv(dev);
+       struct wiz_clk_div_sel *data = dev_get_plat(dev);
+       struct wiz *wiz = priv->wiz;
+       ulong parent_rate = clk_get_rate(&priv->parent_clk);
+       u32 div = parent_rate / rate;
+
+       div = __ffs(div);
+       regmap_field_write(wiz->div_sel_field[data->div_sel], div);
+
+       return parent_rate >> div;
+}
+
+const struct clk_ops wiz_div_clk_ops = {
+       .get_rate = wiz_div_clk_get_rate,
+       .set_rate = wiz_div_clk_set_rate,
+};
+
+int wiz_div_clk_probe(struct udevice *dev)
+{
+       struct wiz_div_clk *priv = dev_get_priv(dev);
+       struct clk parent_clk;
+       int rc;
+
+       rc = clk_get_by_index(dev, 0, &parent_clk);
+       if (rc) {
+               dev_err(dev, "unable to get parent clock. ret %d\n", rc);
+               return rc;
+       }
+       priv->parent_clk = parent_clk;
+       priv->wiz = dev_get_priv(dev->parent);
+       return 0;
+}
+
+U_BOOT_DRIVER(wiz_div_clk) = {
+       .name           = "wiz_div_clk",
+       .id             = UCLASS_CLK,
+       .priv_auto      = sizeof(struct wiz_div_clk),
+       .ops            = &wiz_div_clk_ops,
+       .probe          = wiz_div_clk_probe,
+};
+
+static int wiz_clk_mux_set_parent(struct clk *clk,  struct clk *parent)
+{
+       struct udevice *dev = clk->dev;
+       struct wiz_mux_clk *priv = dev_get_priv(dev);
+       struct wiz_clk_mux_sel *data = dev_get_plat(dev);
+       struct wiz *wiz = priv->wiz;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(priv->parent_clks); i++)
+               if (parent->dev == priv->parent_clks[i].dev)
+                       break;
+
+       if (i == ARRAY_SIZE(priv->parent_clks))
+               return -EINVAL;
+
+       regmap_field_write(wiz->mux_sel_field[data->mux_sel], data->table[i]);
+       return 0;
+}
+
+static int wiz_clk_xlate(struct clk *clk, struct ofnode_phandle_args *args)
+{
+       struct udevice *dev = clk->dev;
+       struct wiz_mux_clk *priv = dev_get_priv(dev);
+       struct wiz *wiz = priv->wiz;
+
+       clk->id = wiz->id;
+
+       return 0;
+}
+
+static const struct clk_ops wiz_clk_mux_ops = {
+       .set_parent = wiz_clk_mux_set_parent,
+       .of_xlate = wiz_clk_xlate,
+};
+
+int wiz_mux_clk_probe(struct udevice *dev)
+{
+       struct wiz_mux_clk *priv = dev_get_priv(dev);
+       int rc;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(priv->parent_clks); i++) {
+               rc = clk_get_by_index(dev, i, &priv->parent_clks[i]);
+               if (rc)
+                       priv->parent_clks[i].dev = NULL;
+       }
+       priv->wiz = dev_get_priv(dev->parent);
+       return 0;
+}
+
+U_BOOT_DRIVER(wiz_mux_clk) = {
+       .name           = "wiz_mux_clk",
+       .id             = UCLASS_CLK,
+       .priv_auto      = sizeof(struct wiz_mux_clk),
+       .ops            = &wiz_clk_mux_ops,
+       .probe          = wiz_mux_clk_probe,
+};
+
+static int wiz_clk_set_parent(struct clk *clk,  struct clk *parent)
+{
+       struct udevice *dev = clk->dev;
+       struct wiz_clk *priv = dev_get_priv(dev);
+       const struct wiz_clk_mux_sel *mux_sel;
+       struct wiz *wiz = priv->wiz;
+       int num_parents;
+       int i, j, id;
+
+       id = clk->id >> 10;
+
+       /* set_parent is applicable only for MUX clocks */
+       if (id > TI_WIZ_REFCLK_DIG)
+               return 0;
+
+       for (i = 0; i < WIZ_MAX_INPUT_CLOCKS; i++)
+               if (wiz->input_clks[i]->dev == parent->dev)
+                       break;
+
+       if (i == WIZ_MAX_INPUT_CLOCKS)
+               return -EINVAL;
+
+       mux_sel = &wiz->clk_mux_sel[id];
+       num_parents = mux_sel->num_parents;
+       for (j = 0; j < num_parents; j++)
+               if (mux_sel->parents[j] == i)
+                       break;
+
+       if (j == num_parents)
+               return -EINVAL;
+
+       regmap_field_write(wiz->mux_sel_field[id], mux_sel->table[j]);
+
+       return 0;
+}
+
+static int wiz_clk_of_xlate(struct clk *clk, struct ofnode_phandle_args *args)
+{
+       struct udevice *dev = clk->dev;
+       struct wiz_clk *priv = dev_get_priv(dev);
+       struct wiz *wiz = priv->wiz;
+
+       clk->id = args->args[0] << 10 | wiz->id;
+
+       return 0;
+}
+
+static const struct clk_ops wiz_clk_ops = {
+       .set_parent = wiz_clk_set_parent,
+       .of_xlate = wiz_clk_of_xlate,
+};
+
+int wiz_clk_probe(struct udevice *dev)
+{
+       struct wiz_clk *priv = dev_get_priv(dev);
+
+       priv->wiz = dev_get_priv(dev->parent);
+
+       return 0;
+}
+
+U_BOOT_DRIVER(wiz_clk) = {
+       .name           = "wiz_clk",
+       .id             = UCLASS_CLK,
+       .priv_auto      = sizeof(struct wiz_clk),
+       .ops            = &wiz_clk_ops,
+       .probe          = wiz_clk_probe,
+};
+
+static int wiz_reset_request(struct reset_ctl *reset_ctl)
+{
+       return 0;
+}
+
+static int wiz_reset_free(struct reset_ctl *reset_ctl)
+{
+       return 0;
+}
+
+static int wiz_reset_assert(struct reset_ctl *reset_ctl)
+{
+       struct wiz_reset *priv = dev_get_priv(reset_ctl->dev);
+       struct wiz *wiz = priv->wiz;
+       int ret;
+       int id = reset_ctl->id;
+
+       if (id == 0) {
+               ret = regmap_field_write(wiz->phy_reset_n, false);
+               return ret;
+       }
+
+       ret = regmap_field_write(wiz->p_enable[id - 1], P_ENABLE_DISABLE);
+       return ret;
+}
+
+static int wiz_phy_fullrt_div(struct wiz *wiz, int lane)
+{
+       if (wiz->type != AM64_WIZ_10G)
+               return 0;
+
+       if (wiz->lane_phy_type[lane] == PHY_TYPE_PCIE)
+               return regmap_field_write(wiz->p0_fullrt_div[lane], 0x1);
+
+       return 0;
+}
+
+static int wiz_reset_deassert(struct reset_ctl *reset_ctl)
+{
+       struct wiz_reset *priv = dev_get_priv(reset_ctl->dev);
+       struct wiz *wiz = priv->wiz;
+       int ret;
+       int id = reset_ctl->id;
+
+       ret = wiz_phy_fullrt_div(wiz, id - 1);
+       if (ret)
+               return ret;
+
+       /* if typec-dir gpio was specified, set LN10 SWAP bit based on that */
+       if (id == 0 && wiz->gpio_typec_dir) {
+               if (dm_gpio_get_value(wiz->gpio_typec_dir)) {
+                       regmap_update_bits(wiz->regmap, WIZ_SERDES_TYPEC,
+                                          WIZ_SERDES_TYPEC_LN10_SWAP,
+                                          WIZ_SERDES_TYPEC_LN10_SWAP);
+               } else {
+                       regmap_update_bits(wiz->regmap, WIZ_SERDES_TYPEC,
+                                          WIZ_SERDES_TYPEC_LN10_SWAP, 0);
+               }
+       }
+
+       if (id == 0) {
+               ret = regmap_field_write(wiz->phy_reset_n, true);
+               return ret;
+       }
+
+       if (wiz->lane_phy_type[id - 1] == PHY_TYPE_PCIE)
+               ret = regmap_field_write(wiz->p_enable[id - 1], P_ENABLE);
+       else
+               ret = regmap_field_write(wiz->p_enable[id - 1], P_ENABLE_FORCE);
+
+       return ret;
+}
+
+static struct reset_ops wiz_reset_ops = {
+       .request = wiz_reset_request,
+       .rfree = wiz_reset_free,
+       .rst_assert = wiz_reset_assert,
+       .rst_deassert = wiz_reset_deassert,
+};
+
+int wiz_reset_probe(struct udevice *dev)
+{
+       struct wiz_reset *priv = dev_get_priv(dev);
+
+       priv->wiz = dev_get_priv(dev->parent);
+
+       return 0;
+}
+
+U_BOOT_DRIVER(wiz_reset) = {
+       .name = "wiz-reset",
+       .id = UCLASS_RESET,
+       .probe = wiz_reset_probe,
+       .ops = &wiz_reset_ops,
+       .flags = DM_FLAG_LEAVE_PD_ON,
+};
+
+static int wiz_reset(struct wiz *wiz)
+{
+       int ret;
+
+       ret = regmap_field_write(wiz->por_en, 0x1);
+       if (ret)
+               return ret;
+
+       mdelay(1);
+
+       ret = regmap_field_write(wiz->por_en, 0x0);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+static int wiz_p_mac_div_sel(struct wiz *wiz)
+{
+       u32 num_lanes = wiz->num_lanes;
+       int ret;
+       int i;
+
+       for (i = 0; i < num_lanes; i++) {
+               if (wiz->lane_phy_type[i] == PHY_TYPE_QSGMII) {
+                       ret = regmap_field_write(wiz->p_mac_div_sel0[i], 1);
+                       if (ret)
+                               return ret;
+
+                       ret = regmap_field_write(wiz->p_mac_div_sel1[i], 2);
+                       if (ret)
+                               return ret;
+               }
+       }
+
+       return 0;
+}
+
+static int wiz_mode_select(struct wiz *wiz)
+{
+       u32 num_lanes = wiz->num_lanes;
+       int ret;
+       int i;
+
+       for (i = 0; i < num_lanes; i++) {
+               if (wiz->lane_phy_type[i] == PHY_TYPE_QSGMII) {
+                       ret = regmap_field_write(wiz->p_standard_mode[i],
+                                                LANE_MODE_GEN2);
+                       if (ret)
+                               return ret;
+               }
+       }
+
+       return 0;
+}
+
+static int wiz_init_raw_interface(struct wiz *wiz, bool enable)
+{
+       u32 num_lanes = wiz->num_lanes;
+       int i;
+       int ret;
+
+       for (i = 0; i < num_lanes; i++) {
+               ret = regmap_field_write(wiz->p_align[i], enable);
+               if (ret)
+                       return ret;
+
+               ret = regmap_field_write(wiz->p_raw_auto_start[i], enable);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
+}
+
+static int wiz_init(struct wiz *wiz)
+{
+       struct udevice *dev = wiz->dev;
+       int ret;
+
+       ret = wiz_reset(wiz);
+       if (ret) {
+               dev_err(dev, "WIZ reset failed\n");
+               return ret;
+       }
+
+       ret = wiz_mode_select(wiz);
+       if (ret) {
+               dev_err(dev, "WIZ mode select failed\n");
+               return ret;
+       }
+
+       ret = wiz_p_mac_div_sel(wiz);
+       if (ret) {
+               dev_err(dev, "Configuring P0 MAC DIV SEL failed\n");
+               return ret;
+       }
+
+       ret = wiz_init_raw_interface(wiz, true);
+       if (ret) {
+               dev_err(dev, "WIZ interface initialization failed\n");
+               return ret;
+       }
+
+       return 0;
+}
+
+static int wiz_regfield_init(struct wiz *wiz)
+{
+       struct regmap *regmap = wiz->regmap;
+       int num_lanes = wiz->num_lanes;
+       struct udevice *dev = wiz->dev;
+       enum wiz_type type;
+       int i;
+
+       wiz->por_en = devm_regmap_field_alloc(dev, regmap, por_en);
+       if (IS_ERR(wiz->por_en)) {
+               dev_err(dev, "POR_EN reg field init failed\n");
+               return PTR_ERR(wiz->por_en);
+       }
+
+       wiz->phy_reset_n = devm_regmap_field_alloc(dev, regmap,
+                                                  phy_reset_n);
+       if (IS_ERR(wiz->phy_reset_n)) {
+               dev_err(dev, "PHY_RESET_N reg field init failed\n");
+               return PTR_ERR(wiz->phy_reset_n);
+       }
+
+       wiz->pma_cmn_refclk_int_mode =
+               devm_regmap_field_alloc(dev, regmap, pma_cmn_refclk_int_mode);
+       if (IS_ERR(wiz->pma_cmn_refclk_int_mode)) {
+               dev_err(dev, "PMA_CMN_REFCLK_INT_MODE reg field init failed\n");
+               return PTR_ERR(wiz->pma_cmn_refclk_int_mode);
+       }
+
+       wiz->pma_cmn_refclk_mode =
+               devm_regmap_field_alloc(dev, regmap, pma_cmn_refclk_mode);
+       if (IS_ERR(wiz->pma_cmn_refclk_mode)) {
+               dev_err(dev, "PMA_CMN_REFCLK_MODE reg field init failed\n");
+               return PTR_ERR(wiz->pma_cmn_refclk_mode);
+       }
+
+       wiz->div_sel_field[CMN_REFCLK] =
+               devm_regmap_field_alloc(dev, regmap, pma_cmn_refclk_dig_div);
+       if (IS_ERR(wiz->div_sel_field[CMN_REFCLK])) {
+               dev_err(dev, "PMA_CMN_REFCLK_DIG_DIV reg field init failed\n");
+               return PTR_ERR(wiz->div_sel_field[CMN_REFCLK]);
+       }
+
+       wiz->div_sel_field[CMN_REFCLK1] =
+               devm_regmap_field_alloc(dev, regmap, pma_cmn_refclk1_dig_div);
+       if (IS_ERR(wiz->div_sel_field[CMN_REFCLK1])) {
+               dev_err(dev, "PMA_CMN_REFCLK1_DIG_DIV reg field init failed\n");
+               return PTR_ERR(wiz->div_sel_field[CMN_REFCLK1]);
+       }
+
+       wiz->mux_sel_field[PLL0_REFCLK] =
+               devm_regmap_field_alloc(dev, regmap, pll0_refclk_mux_sel);
+       if (IS_ERR(wiz->mux_sel_field[PLL0_REFCLK])) {
+               dev_err(dev, "PLL0_REFCLK_SEL reg field init failed\n");
+               return PTR_ERR(wiz->mux_sel_field[PLL0_REFCLK]);
+       }
+
+       wiz->mux_sel_field[PLL1_REFCLK] =
+               devm_regmap_field_alloc(dev, regmap, pll1_refclk_mux_sel);
+       if (IS_ERR(wiz->mux_sel_field[PLL1_REFCLK])) {
+               dev_err(dev, "PLL1_REFCLK_SEL reg field init failed\n");
+               return PTR_ERR(wiz->mux_sel_field[PLL1_REFCLK]);
+       }
+
+       type = dev_get_driver_data(dev);
+       if (type == J721E_WIZ_10G || type == AM64_WIZ_10G)
+               wiz->mux_sel_field[REFCLK_DIG] =
+                       devm_regmap_field_alloc(dev, regmap,
+                                               refclk_dig_sel_10g);
+       else
+               wiz->mux_sel_field[REFCLK_DIG] =
+                       devm_regmap_field_alloc(dev, regmap,
+                                               refclk_dig_sel_16g);
+       if (IS_ERR(wiz->mux_sel_field[REFCLK_DIG])) {
+               dev_err(dev, "REFCLK_DIG_SEL reg field init failed\n");
+               return PTR_ERR(wiz->mux_sel_field[REFCLK_DIG]);
+       }
+
+       for (i = 0; i < num_lanes; i++) {
+               wiz->p_enable[i] = devm_regmap_field_alloc(dev, regmap,
+                                                          p_enable[i]);
+               if (IS_ERR(wiz->p_enable[i])) {
+                       dev_err(dev, "P%d_ENABLE reg field init failed\n", i);
+                       return PTR_ERR(wiz->p_enable[i]);
+               }
+
+               wiz->p_align[i] = devm_regmap_field_alloc(dev, regmap,
+                                                         p_align[i]);
+               if (IS_ERR(wiz->p_align[i])) {
+                       dev_err(dev, "P%d_ALIGN reg field init failed\n", i);
+                       return PTR_ERR(wiz->p_align[i]);
+               }
+
+               wiz->p_raw_auto_start[i] =
+                 devm_regmap_field_alloc(dev, regmap, p_raw_auto_start[i]);
+               if (IS_ERR(wiz->p_raw_auto_start[i])) {
+                       dev_err(dev, "P%d_RAW_AUTO_START reg field init fail\n",
+                               i);
+                       return PTR_ERR(wiz->p_raw_auto_start[i]);
+               }
+
+               wiz->p_standard_mode[i] =
+                 devm_regmap_field_alloc(dev, regmap, p_standard_mode[i]);
+               if (IS_ERR(wiz->p_standard_mode[i])) {
+                       dev_err(dev, "P%d_STANDARD_MODE reg field init fail\n",
+                               i);
+                       return PTR_ERR(wiz->p_standard_mode[i]);
+               }
+
+               wiz->p0_fullrt_div[i] = devm_regmap_field_alloc(dev, regmap, p0_fullrt_div[i]);
+               if (IS_ERR(wiz->p0_fullrt_div[i])) {
+                       dev_err(dev, "P%d_FULLRT_DIV reg field init failed\n", i);
+                       return PTR_ERR(wiz->p0_fullrt_div[i]);
+               }
+
+               wiz->p_mac_div_sel0[i] =
+                 devm_regmap_field_alloc(dev, regmap, p_mac_div_sel0[i]);
+               if (IS_ERR(wiz->p_mac_div_sel0[i])) {
+                       dev_err(dev, "P%d_MAC_DIV_SEL0 reg field init fail\n",
+                               i);
+                       return PTR_ERR(wiz->p_mac_div_sel0[i]);
+               }
+
+               wiz->p_mac_div_sel1[i] =
+                 devm_regmap_field_alloc(dev, regmap, p_mac_div_sel1[i]);
+               if (IS_ERR(wiz->p_mac_div_sel1[i])) {
+                       dev_err(dev, "P%d_MAC_DIV_SEL1 reg field init fail\n",
+                               i);
+                       return PTR_ERR(wiz->p_mac_div_sel1[i]);
+               }
+       }
+
+       return 0;
+}
+
+static int wiz_clock_init(struct wiz *wiz)
+{
+       struct udevice *dev = wiz->dev;
+       unsigned long rate;
+       struct clk *clk;
+       int ret;
+
+       clk = devm_clk_get(dev, "core_ref_clk");
+       if (IS_ERR(clk)) {
+               dev_err(dev, "core_ref_clk clock not found\n");
+               ret = PTR_ERR(clk);
+               return ret;
+       }
+       wiz->input_clks[WIZ_CORE_REFCLK] = clk;
+       /* Initialize CORE_REFCLK1 to the same clock reference to maintain old DT compatibility */
+       wiz->input_clks[WIZ_CORE_REFCLK1] = clk;
+
+       rate = clk_get_rate(clk);
+       if (rate >= 100000000)
+               regmap_field_write(wiz->pma_cmn_refclk_int_mode, 0x1);
+       else
+               regmap_field_write(wiz->pma_cmn_refclk_int_mode, 0x3);
+
+       clk = devm_clk_get(dev, "ext_ref_clk");
+       if (IS_ERR(clk)) {
+               dev_err(dev, "ext_ref_clk clock not found\n");
+               ret = PTR_ERR(clk);
+               return ret;
+       }
+
+       wiz->input_clks[WIZ_EXT_REFCLK] = clk;
+       /* Initialize EXT_REFCLK1 to the same clock reference to maintain old DT compatibility */
+       wiz->input_clks[WIZ_EXT_REFCLK1] = clk;
+
+       rate = clk_get_rate(clk);
+       if (rate >= 100000000)
+               regmap_field_write(wiz->pma_cmn_refclk_mode, 0x0);
+       else
+               regmap_field_write(wiz->pma_cmn_refclk_mode, 0x2);
+
+       return 0;
+}
+
+static ofnode get_child_by_name(struct udevice *dev, const char *name)
+{
+       int l = strlen(name);
+       ofnode node = dev_read_first_subnode(dev);
+
+       while (ofnode_valid(node)) {
+               const char *child_name = ofnode_get_name(node);
+
+               if (!strncmp(child_name, name, l)) {
+                       if (child_name[l] == '\0' || child_name[l] == '@')
+                               return node;
+               }
+               node = dev_read_next_subnode(node);
+       }
+       return node;
+}
+
+static int j721e_wiz_bind_clocks(struct wiz *wiz)
+{
+       struct udevice *dev = wiz->dev;
+       struct driver *wiz_clk_drv;
+       int i, rc;
+
+       wiz_clk_drv = lists_driver_lookup_name("wiz_clk");
+       if (!wiz_clk_drv) {
+               dev_err(dev, "Cannot find driver 'wiz_clk'\n");
+               return -ENOENT;
+       }
+
+       for (i = 0; i < WIZ_DIV_NUM_CLOCKS_10G; i++) {
+               rc = device_bind(dev, wiz_clk_drv, clk_div_sel[i].node_name,
+                                &clk_div_sel[i], dev_ofnode(dev), NULL);
+               if (rc) {
+                       dev_err(dev, "cannot bind driver for clock %s\n",
+                               clk_div_sel[i].node_name);
+               }
+       }
+
+       for (i = 0; i < WIZ_MUX_NUM_CLOCKS; i++) {
+               rc = device_bind(dev, wiz_clk_drv, clk_mux_sel_10g[i].node_name,
+                                &clk_mux_sel_10g[i], dev_ofnode(dev), NULL);
+               if (rc) {
+                       dev_err(dev, "cannot bind driver for clock %s\n",
+                               clk_mux_sel_10g[i].node_name);
+               }
+       }
+
+       return 0;
+}
+
+static int j721e_wiz_bind_of_clocks(struct wiz *wiz)
+{
+       struct wiz_clk_mux_sel *clk_mux_sel = wiz->clk_mux_sel;
+       struct udevice *dev = wiz->dev;
+       enum wiz_type type = wiz->type;
+       struct driver *div_clk_drv;
+       struct driver *mux_clk_drv;
+       ofnode node;
+       int i, rc;
+
+       if (type == AM64_WIZ_10G)
+               return j721e_wiz_bind_clocks(wiz);
+
+       div_clk_drv = lists_driver_lookup_name("wiz_div_clk");
+       if (!div_clk_drv) {
+               dev_err(dev, "Cannot find driver 'wiz_div_clk'\n");
+               return -ENOENT;
+       }
+
+       mux_clk_drv = lists_driver_lookup_name("wiz_mux_clk");
+       if (!mux_clk_drv) {
+               dev_err(dev, "Cannot find driver 'wiz_mux_clk'\n");
+               return -ENOENT;
+       }
+
+       for (i = 0; i < wiz->clk_div_sel_num; i++) {
+               node = get_child_by_name(dev, clk_div_sel[i].node_name);
+               if (!ofnode_valid(node)) {
+                       dev_err(dev, "cannot find node for clock %s\n",
+                               clk_div_sel[i].node_name);
+                       continue;
+               }
+               rc = device_bind(dev, div_clk_drv, clk_div_sel[i].node_name,
+                                &clk_div_sel[i], node, NULL);
+               if (rc) {
+                       dev_err(dev, "cannot bind driver for clock %s\n",
+                               clk_div_sel[i].node_name);
+               }
+       }
+
+       for (i = 0; i < WIZ_MUX_NUM_CLOCKS; i++) {
+               node = get_child_by_name(dev, clk_mux_sel[i].node_name);
+               if (!ofnode_valid(node)) {
+                       dev_err(dev, "cannot find node for clock %s\n",
+                               clk_mux_sel[i].node_name);
+                       continue;
+               }
+               rc = device_bind(dev, mux_clk_drv, clk_mux_sel[i].node_name,
+                                &clk_mux_sel[i], node, NULL);
+               if (rc) {
+                       dev_err(dev, "cannot bind driver for clock %s\n",
+                               clk_mux_sel[i].node_name);
+               }
+       }
+
+       return 0;
+}
+
+static int j721e_wiz_bind_reset(struct udevice *dev)
+{
+       int rc;
+       struct driver *drv;
+
+       drv = lists_driver_lookup_name("wiz-reset");
+       if (!drv) {
+               dev_err(dev, "Cannot find driver 'wiz-reset'\n");
+               return -ENOENT;
+       }
+
+       rc = device_bind(dev, drv, "wiz-reset", NULL, dev_ofnode(dev), NULL);
+       if (rc) {
+               dev_err(dev, "cannot bind driver for wiz-reset\n");
+               return rc;
+       }
+
+       return 0;
+}
+
+static int j721e_wiz_bind(struct udevice *dev)
+{
+       dm_scan_fdt_dev(dev);
+
+       return 0;
+}
+
+static int wiz_get_lane_phy_types(struct udevice *dev, struct wiz *wiz)
+{
+       ofnode child, serdes;
+
+       serdes = get_child_by_name(dev, "serdes");
+       if (!ofnode_valid(serdes)) {
+               dev_err(dev, "%s: Getting \"serdes\"-node failed\n", __func__);
+               return -EINVAL;
+       }
+
+       ofnode_for_each_subnode(child, serdes) {
+               u32 reg, num_lanes = 1, phy_type = PHY_NONE;
+               int ret, i;
+
+               ret = ofnode_read_u32(child, "reg", &reg);
+               if (ret) {
+                       dev_err(dev, "%s: Reading \"reg\" from failed: %d\n",
+                               __func__, ret);
+                       return ret;
+               }
+               ofnode_read_u32(child, "cdns,num-lanes", &num_lanes);
+               ofnode_read_u32(child, "cdns,phy-type", &phy_type);
+
+               dev_dbg(dev, "%s: Lanes %u-%u have phy-type %u\n", __func__,
+                       reg, reg + num_lanes - 1, phy_type);
+
+               for (i = reg; i < reg + num_lanes; i++)
+                       wiz->lane_phy_type[i] = phy_type;
+       }
+
+       return 0;
+}
+
+static int j721e_wiz_probe(struct udevice *dev)
+{
+       struct wiz *wiz = dev_get_priv(dev);
+       struct ofnode_phandle_args args;
+       unsigned int val;
+       int rc, i;
+       ofnode node;
+       struct regmap *regmap;
+       u32 num_lanes;
+
+       node = get_child_by_name(dev, "serdes");
+
+       if (!ofnode_valid(node)) {
+               dev_err(dev, "Failed to get SERDES child DT node\n");
+               return -ENODEV;
+       }
+
+       rc = regmap_init_mem(node, &regmap);
+       if (rc)  {
+               dev_err(dev, "Failed to get memory resource\n");
+               return rc;
+       }
+       rc = dev_read_u32(dev, "num-lanes", &num_lanes);
+       if (rc) {
+               dev_err(dev, "Failed to read num-lanes property\n");
+               goto err_addr_to_resource;
+       }
+
+       if (num_lanes > WIZ_MAX_LANES) {
+               dev_err(dev, "Cannot support %d lanes\n", num_lanes);
+               goto err_addr_to_resource;
+       }
+
+       wiz->gpio_typec_dir = devm_gpiod_get_optional(dev, "typec-dir",
+                                                     GPIOD_IS_IN);
+       if (IS_ERR(wiz->gpio_typec_dir)) {
+               rc = PTR_ERR(wiz->gpio_typec_dir);
+               dev_err(dev, "Failed to request typec-dir gpio: %d\n", rc);
+               goto err_addr_to_resource;
+       }
+
+       rc = dev_read_phandle_with_args(dev, "power-domains", "#power-domain-cells", 0, 0, &args);
+       if (rc) {
+               dev_err(dev, "Failed to get power domain: %d\n", rc);
+               goto err_addr_to_resource;
+       }
+
+       wiz->id = args.args[0];
+       wiz->regmap = regmap;
+       wiz->num_lanes = num_lanes;
+       wiz->dev = dev;
+       wiz->clk_div_sel = clk_div_sel;
+       wiz->type = dev_get_driver_data(dev);
+       if (wiz->type == J721E_WIZ_10G || wiz->type == AM64_WIZ_10G) {
+               wiz->clk_mux_sel = clk_mux_sel_10g;
+               wiz->clk_div_sel_num = WIZ_DIV_NUM_CLOCKS_10G;
+       } else {
+               wiz->clk_mux_sel = clk_mux_sel_16g;
+               wiz->clk_div_sel_num = WIZ_DIV_NUM_CLOCKS_16G;
+       }
+
+       rc = wiz_get_lane_phy_types(dev, wiz);
+       if (rc) {
+               dev_err(dev, "Failed to get lane PHY types\n");
+               goto err_addr_to_resource;
+       }
+
+       rc = wiz_regfield_init(wiz);
+       if (rc) {
+               dev_err(dev, "Failed to initialize regfields\n");
+               goto err_addr_to_resource;
+       }
+
+       for (i = 0; i < wiz->num_lanes; i++) {
+               regmap_field_read(wiz->p_enable[i], &val);
+               if (val & (P_ENABLE | P_ENABLE_FORCE)) {
+                       dev_err(dev, "SERDES already configured\n");
+                       rc = -EBUSY;
+                       goto err_addr_to_resource;
+               }
+       }
+
+       rc = j721e_wiz_bind_of_clocks(wiz);
+       if (rc) {
+               dev_err(dev, "Failed to bind clocks\n");
+               goto err_addr_to_resource;
+       }
+
+       rc = j721e_wiz_bind_reset(dev);
+       if (rc) {
+               dev_err(dev, "Failed to bind reset\n");
+               goto err_addr_to_resource;
+       }
+
+       rc = wiz_clock_init(wiz);
+       if (rc) {
+               dev_warn(dev, "Failed to initialize clocks\n");
+               goto err_addr_to_resource;
+       }
+
+       rc = wiz_init(wiz);
+       if (rc) {
+               dev_err(dev, "WIZ initialization failed\n");
+               goto err_addr_to_resource;
+       }
+
+       return 0;
+
+err_addr_to_resource:
+       free(regmap);
+
+       return rc;
+}
+
+static int j721e_wiz_remove(struct udevice *dev)
+{
+       struct wiz *wiz = dev_get_priv(dev);
+
+       if (wiz->regmap)
+               free(wiz->regmap);
+
+       return 0;
+}
+
+static const struct udevice_id j721e_wiz_ids[] = {
+       {
+               .compatible = "ti,j721e-wiz-16g", .data = J721E_WIZ_16G,
+       },
+       {
+               .compatible = "ti,j721e-wiz-10g", .data = J721E_WIZ_10G,
+       },
+       {
+               .compatible = "ti,am64-wiz-10g", .data = AM64_WIZ_10G,
+       },
+       {}
+};
+
+U_BOOT_DRIVER(phy_j721e_wiz) = {
+       .name           = "phy-j721e-wiz",
+       .id             = UCLASS_NOP,
+       .of_match       = j721e_wiz_ids,
+       .bind           = j721e_wiz_bind,
+       .probe          = j721e_wiz_probe,
+       .remove         = j721e_wiz_remove,
+       .priv_auto      = sizeof(struct wiz),
+       .flags          = DM_FLAG_LEAVE_PD_ON,
+};
index c2c2bf0..7c520f4 100644 (file)
 
 #define CONFIG_SYS_USB_FAT_BOOT_PARTITION 1
 
-/* MMC ENV related defines */
-#ifdef CONFIG_ENV_IS_IN_MMC
-#define CONFIG_SYS_MMC_ENV_DEV         0
-#define CONFIG_SYS_MMC_ENV_PART        1
-#endif
-
 #endif /* __CONFIG_AM642_EVM_H */
index 62da8ff..18b80ef 100644 (file)
@@ -82,8 +82,6 @@
 #ifdef CONFIG_SYS_K3_SPL_ATF
 #if defined(CONFIG_TARGET_J721E_R5_EVM)
 #define EXTRA_ENV_R5_SPL_RPROC_FW_ARGS_MMC                             \
-       "addr_mainr5f0_0load=0x88000000\0"                              \
-       "name_mainr5f0_0fw=/lib/firmware/j7-main-r5f0_0-fw\0"           \
        "addr_mcur5f0_0load=0x89000000\0"                               \
        "name_mcur5f0_0fw=/lib/firmware/j7-mcu-r5f0_0-fw\0"
 #elif defined(CONFIG_TARGET_J7200_R5_EVM)
 
 #ifdef CONFIG_TARGET_J721E_A72_EVM
 #define DEFAULT_RPROCS ""                                              \
+               "2 /lib/firmware/j7-main-r5f0_0-fw "                    \
                "3 /lib/firmware/j7-main-r5f0_1-fw "                    \
                "4 /lib/firmware/j7-main-r5f1_0-fw "                    \
                "5 /lib/firmware/j7-main-r5f1_1-fw "                    \
 #endif /* CONFIG_TARGET_J721E_A72_EVM */
 
 #ifdef CONFIG_TARGET_J7200_A72_EVM
+#define EXTRA_ENV_CONFIG_MAIN_CPSW0_QSGMII_PHY                         \
+       "do_main_cpsw0_qsgmii_phyinit=1\0"                              \
+       "init_main_cpsw0_qsgmii_phy=gpio set gpio@22_17;"               \
+                "gpio clear gpio@22_16\0"                              \
+       "main_cpsw0_qsgmii_phyinit="                                    \
+       "if test ${do_main_cpsw0_qsgmii_phyinit} -eq 1 && test ${dorprocboot} -eq 1 && " \
+                       "test ${boot} = mmc; then "                     \
+               "run init_main_cpsw0_qsgmii_phy;"                       \
+       "fi;\0"
 #define DEFAULT_RPROCS ""                                              \
                "2 /lib/firmware/j7200-main-r5f0_0-fw "                 \
                "3 /lib/firmware/j7200-main-r5f0_1-fw "
 #endif /* CONFIG_TARGET_J7200_A72_EVM */
 
+#ifndef EXTRA_ENV_CONFIG_MAIN_CPSW0_QSGMII_PHY
+#define EXTRA_ENV_CONFIG_MAIN_CPSW0_QSGMII_PHY
+#endif
+
 /* set default dfu_bufsiz to 128KB (sector size of OSPI) */
 #define EXTRA_ENV_DFUARGS \
        "dfu_bufsiz=0x20000\0" \
        EXTRA_ENV_DFUARGS                                               \
        DEFAULT_UFS_TI_ARGS                                             \
        EXTRA_ENV_J721E_BOARD_SETTINGS_MTD                              \
+       EXTRA_ENV_CONFIG_MAIN_CPSW0_QSGMII_PHY                          \
        BOOTENV
 
 /* Now for the remaining common defines */
index 3da05d8..4e1a844 100644 (file)
@@ -232,6 +232,16 @@ static inline ofnode ofnode_root(void)
 }
 
 /**
+ * ofnode_name_eq() - Check if the node name is equivalent to a given name
+ *                    ignoring the unit address
+ *
+ * @node:      valid node reference that has to be compared
+ * @name:      name that has to be compared with the node name
+ * @return true if matches, false if it doesn't match
+ */
+bool ofnode_name_eq(ofnode node, const char *name);
+
+/**
  * ofnode_read_u32() - Read a 32-bit integer from a property
  *
  * @ref:       valid node reference to read property from
index 9047ec6..d417b92 100644 (file)
@@ -90,4 +90,9 @@
 #define J7200_SERDES0_LANE3_USB                        0x2
 #define J7200_SERDES0_LANE3_IP4_UNUSED         0x3
 
+/* AM64 */
+
+#define AM64_SERDES0_LANE0_PCIE0               0x0
+#define AM64_SERDES0_LANE0_USB                 0x1
+
 #endif /* _DT_BINDINGS_MUX_TI_SERDES */
diff --git a/include/dt-bindings/phy/phy-cadence.h b/include/dt-bindings/phy/phy-cadence.h
new file mode 100644 (file)
index 0000000..4652bcb
--- /dev/null
@@ -0,0 +1,20 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * This header provides constants for Cadence SERDES.
+ */
+
+#ifndef _DT_BINDINGS_CADENCE_SERDES_H
+#define _DT_BINDINGS_CADENCE_SERDES_H
+
+/* Torrent */
+#define TORRENT_SERDES_NO_SSC          0
+#define TORRENT_SERDES_EXTERNAL_SSC    1
+#define TORRENT_SERDES_INTERNAL_SSC    2
+
+#define CDNS_TORRENT_REFCLK_DRIVER      0
+
+/* Sierra */
+#define CDNS_SIERRA_PLL_CMNLC          0
+#define CDNS_SIERRA_PLL_CMNLC1         1
+
+#endif /* _DT_BINDINGS_CADENCE_SERDES_H */
diff --git a/include/dt-bindings/phy/phy-ti.h b/include/dt-bindings/phy/phy-ti.h
new file mode 100644 (file)
index 0000000..ad955d3
--- /dev/null
@@ -0,0 +1,21 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * This header provides constants for TI SERDES.
+ */
+
+#ifndef _DT_BINDINGS_TI_SERDES
+#define _DT_BINDINGS_TI_SERDES
+
+/* Clock index for output clocks from WIZ */
+
+/* MUX Clocks */
+#define TI_WIZ_PLL0_REFCLK     0
+#define TI_WIZ_PLL1_REFCLK     1
+#define TI_WIZ_REFCLK_DIG      2
+
+/* Reserve index here for future additions */
+
+/* MISC Clocks */
+#define TI_WIZ_PHY_EN_REFCLK   16
+
+#endif /* _DT_BINDINGS_TI_SERDES */
index 7e657da..d3714ed 100644 (file)
@@ -19,5 +19,6 @@
 #define PHY_TYPE_DP            6
 #define PHY_TYPE_XPCS          7
 #define PHY_TYPE_SGMII         8
+#define PHY_TYPE_QSGMII                9
 
 #endif /* _DT_BINDINGS_PHY */
index 226f772..17877e8 100644 (file)
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  * This header provides constants specific to AM33XX pinctrl bindings.
  */
 #undef PIN_OFF_INPUT_PULLDOWN
 #undef PIN_OFF_WAKEUPENABLE
 
-#endif
+#define AM335X_PIN_OFFSET_MIN                  0x0800U
+
+#define AM335X_PIN_GPMC_AD0                    0x800
+#define AM335X_PIN_GPMC_AD1                    0x804
+#define AM335X_PIN_GPMC_AD2                    0x808
+#define AM335X_PIN_GPMC_AD3                    0x80c
+#define AM335X_PIN_GPMC_AD4                    0x810
+#define AM335X_PIN_GPMC_AD5                    0x814
+#define AM335X_PIN_GPMC_AD6                    0x818
+#define AM335X_PIN_GPMC_AD7                    0x81c
+#define AM335X_PIN_GPMC_AD8                    0x820
+#define AM335X_PIN_GPMC_AD9                    0x824
+#define AM335X_PIN_GPMC_AD10                   0x828
+#define AM335X_PIN_GPMC_AD11                   0x82c
+#define AM335X_PIN_GPMC_AD12                   0x830
+#define AM335X_PIN_GPMC_AD13                   0x834
+#define AM335X_PIN_GPMC_AD14                   0x838
+#define AM335X_PIN_GPMC_AD15                   0x83c
+#define AM335X_PIN_GPMC_A0                     0x840
+#define AM335X_PIN_GPMC_A1                     0x844
+#define AM335X_PIN_GPMC_A2                     0x848
+#define AM335X_PIN_GPMC_A3                     0x84c
+#define AM335X_PIN_GPMC_A4                     0x850
+#define AM335X_PIN_GPMC_A5                     0x854
+#define AM335X_PIN_GPMC_A6                     0x858
+#define AM335X_PIN_GPMC_A7                     0x85c
+#define AM335X_PIN_GPMC_A8                     0x860
+#define AM335X_PIN_GPMC_A9                     0x864
+#define AM335X_PIN_GPMC_A10                    0x868
+#define AM335X_PIN_GPMC_A11                    0x86c
+#define AM335X_PIN_GPMC_WAIT0                  0x870
+#define AM335X_PIN_GPMC_WPN                    0x874
+#define AM335X_PIN_GPMC_BEN1                   0x878
+#define AM335X_PIN_GPMC_CSN0                   0x87c
+#define AM335X_PIN_GPMC_CSN1                   0x880
+#define AM335X_PIN_GPMC_CSN2                   0x884
+#define AM335X_PIN_GPMC_CSN3                   0x888
+#define AM335X_PIN_GPMC_CLK                    0x88c
+#define AM335X_PIN_GPMC_ADVN_ALE               0x890
+#define AM335X_PIN_GPMC_OEN_REN                        0x894
+#define AM335X_PIN_GPMC_WEN                    0x898
+#define AM335X_PIN_GPMC_BEN0_CLE               0x89c
+#define AM335X_PIN_LCD_DATA0                   0x8a0
+#define AM335X_PIN_LCD_DATA1                   0x8a4
+#define AM335X_PIN_LCD_DATA2                   0x8a8
+#define AM335X_PIN_LCD_DATA3                   0x8ac
+#define AM335X_PIN_LCD_DATA4                   0x8b0
+#define AM335X_PIN_LCD_DATA5                   0x8b4
+#define AM335X_PIN_LCD_DATA6                   0x8b8
+#define AM335X_PIN_LCD_DATA7                   0x8bc
+#define AM335X_PIN_LCD_DATA8                   0x8c0
+#define AM335X_PIN_LCD_DATA9                   0x8c4
+#define AM335X_PIN_LCD_DATA10                  0x8c8
+#define AM335X_PIN_LCD_DATA11                  0x8cc
+#define AM335X_PIN_LCD_DATA12                  0x8d0
+#define AM335X_PIN_LCD_DATA13                  0x8d4
+#define AM335X_PIN_LCD_DATA14                  0x8d8
+#define AM335X_PIN_LCD_DATA15                  0x8dc
+#define AM335X_PIN_LCD_VSYNC                   0x8e0
+#define AM335X_PIN_LCD_HSYNC                   0x8e4
+#define AM335X_PIN_LCD_PCLK                    0x8e8
+#define AM335X_PIN_LCD_AC_BIAS_EN              0x8ec
+#define AM335X_PIN_MMC0_DAT3                   0x8f0
+#define AM335X_PIN_MMC0_DAT2                   0x8f4
+#define AM335X_PIN_MMC0_DAT1                   0x8f8
+#define AM335X_PIN_MMC0_DAT0                   0x8fc
+#define AM335X_PIN_MMC0_CLK                    0x900
+#define AM335X_PIN_MMC0_CMD                    0x904
+#define AM335X_PIN_MII1_COL                    0x908
+#define AM335X_PIN_MII1_CRS                    0x90c
+#define AM335X_PIN_MII1_RX_ER                  0x910
+#define AM335X_PIN_MII1_TX_EN                  0x914
+#define AM335X_PIN_MII1_RX_DV                  0x918
+#define AM335X_PIN_MII1_TXD3                   0x91c
+#define AM335X_PIN_MII1_TXD2                   0x920
+#define AM335X_PIN_MII1_TXD1                   0x924
+#define AM335X_PIN_MII1_TXD0                   0x928
+#define AM335X_PIN_MII1_TX_CLK                 0x92c
+#define AM335X_PIN_MII1_RX_CLK                 0x930
+#define AM335X_PIN_MII1_RXD3                   0x934
+#define AM335X_PIN_MII1_RXD2                   0x938
+#define AM335X_PIN_MII1_RXD1                   0x93c
+#define AM335X_PIN_MII1_RXD0                   0x940
+#define AM335X_PIN_RMII1_REF_CLK               0x944
+#define AM335X_PIN_MDIO                                0x948
+#define AM335X_PIN_MDC                         0x94c
+#define AM335X_PIN_SPI0_SCLK                   0x950
+#define AM335X_PIN_SPI0_D0                     0x954
+#define AM335X_PIN_SPI0_D1                     0x958
+#define AM335X_PIN_SPI0_CS0                    0x95c
+#define AM335X_PIN_SPI0_CS1                    0x960
+#define AM335X_PIN_ECAP0_IN_PWM0_OUT           0x964
+#define AM335X_PIN_UART0_CTSN                  0x968
+#define AM335X_PIN_UART0_RTSN                  0x96c
+#define AM335X_PIN_UART0_RXD                   0x970
+#define AM335X_PIN_UART0_TXD                   0x974
+#define AM335X_PIN_UART1_CTSN                  0x978
+#define AM335X_PIN_UART1_RTSN                  0x97c
+#define AM335X_PIN_UART1_RXD                   0x980
+#define AM335X_PIN_UART1_TXD                   0x984
+#define AM335X_PIN_I2C0_SDA                    0x988
+#define AM335X_PIN_I2C0_SCL                    0x98c
+#define AM335X_PIN_MCASP0_ACLKX                        0x990
+#define AM335X_PIN_MCASP0_FSX                  0x994
+#define AM335X_PIN_MCASP0_AXR0                 0x998
+#define AM335X_PIN_MCASP0_AHCLKR               0x99c
+#define AM335X_PIN_MCASP0_ACLKR                        0x9a0
+#define AM335X_PIN_MCASP0_FSR                  0x9a4
+#define AM335X_PIN_MCASP0_AXR1                 0x9a8
+#define AM335X_PIN_MCASP0_AHCLKX               0x9ac
+#define AM335X_PIN_XDMA_EVENT_INTR0            0x9b0
+#define AM335X_PIN_XDMA_EVENT_INTR1            0x9b4
+#define AM335X_PIN_WARMRSTN                    0x9b8
+#define AM335X_PIN_NNMI                                0x9c0
+#define AM335X_PIN_TMS                         0x9d0
+#define AM335X_PIN_TDI                         0x9d4
+#define AM335X_PIN_TDO                         0x9d8
+#define AM335X_PIN_TCK                         0x9dc
+#define AM335X_PIN_TRSTN                       0x9e0
+#define AM335X_PIN_EMU0                                0x9e4
+#define AM335X_PIN_EMU1                                0x9e8
+#define AM335X_PIN_RTC_PWRONRSTN               0x9f8
+#define AM335X_PIN_PMIC_POWER_EN               0x9fc
+#define AM335X_PIN_EXT_WAKEUP                  0xa00
+#define AM335X_PIN_USB0_DRVVBUS                        0xa1c
+#define AM335X_PIN_USB1_DRVVBUS                        0xa34
 
+#define AM335X_PIN_OFFSET_MAX                  0x0a34U
+
+#endif
index 58fe28f..f48245f 100644 (file)
@@ -24,7 +24,7 @@
 #define PULL_UP                        (1 << 4)
 #define ALTELECTRICALSEL       (1 << 5)
 
-/* 34xx specific mux bit defines */
+/* omap3/4/5 specific mux bit defines */
 #define INPUT_EN               (1 << 8)
 #define OFF_EN                 (1 << 9)
 #define OFFOUT_EN              (1 << 10)
@@ -32,8 +32,6 @@
 #define OFF_PULL_EN            (1 << 12)
 #define OFF_PULL_UP            (1 << 13)
 #define WAKEUP_EN              (1 << 14)
-
-/* 44xx specific mux bit defines */
 #define WAKEUP_EVENT           (1 << 15)
 
 /* Active pin states */
@@ -48,8 +46,8 @@
 #define PIN_OFF_NONE           0
 #define PIN_OFF_OUTPUT_HIGH    (OFF_EN | OFFOUT_EN | OFFOUT_VAL)
 #define PIN_OFF_OUTPUT_LOW     (OFF_EN | OFFOUT_EN)
-#define PIN_OFF_INPUT_PULLUP   (OFF_EN | OFF_PULL_EN | OFF_PULL_UP)
-#define PIN_OFF_INPUT_PULLDOWN (OFF_EN | OFF_PULL_EN)
+#define PIN_OFF_INPUT_PULLUP   (OFF_EN | OFFOUT_EN | OFF_PULL_EN | OFF_PULL_UP)
+#define PIN_OFF_INPUT_PULLDOWN (OFF_EN | OFFOUT_EN | OFF_PULL_EN)
 #define PIN_OFF_WAKEUPENABLE   WAKEUP_EN
 
 /*
@@ -66,7 +64,8 @@
 #define OMAP3_WKUP_IOPAD(pa, val)      OMAP_IOPAD_OFFSET((pa), 0x2a00) (val)
 #define DM814X_IOPAD(pa, val)          OMAP_IOPAD_OFFSET((pa), 0x0800) (val)
 #define DM816X_IOPAD(pa, val)          OMAP_IOPAD_OFFSET((pa), 0x0800) (val)
-#define AM33XX_IOPAD(pa, val)          OMAP_IOPAD_OFFSET((pa), 0x0800) (val)
+#define AM33XX_IOPAD(pa, val)          OMAP_IOPAD_OFFSET((pa), 0x0800) (val) (0)
+#define AM33XX_PADCONF(pa, conf, mux)  OMAP_IOPAD_OFFSET((pa), 0x0800) (conf) (mux)
 
 /*
  * Macros to allow using the offset from the padconf physical address
index 0492698..48e66b7 100644 (file)
@@ -177,6 +177,20 @@ static int dm_test_autobind_uclass_pdata_alloc(struct unit_test_state *uts)
 }
 DM_TEST(dm_test_autobind_uclass_pdata_alloc, UT_TESTF_SCAN_PDATA);
 
+/* compare node names ignoring the unit address */
+static int dm_test_compare_node_name(struct unit_test_state *uts)
+{
+       ofnode node;
+
+       node = ofnode_path("/mmio-bus@0");
+       ut_assert(ofnode_valid(node));
+       ut_assert(ofnode_name_eq(node, "mmio-bus"));
+
+       return 0;
+}
+
+DM_TEST(dm_test_compare_node_name, UT_TESTF_SCAN_PDATA);
+
 /* Test that binding with uclass plat setting occurs correctly */
 static int dm_test_autobind_uclass_pdata_valid(struct unit_test_state *uts)
 {