From 8d254fbe17a5783367998d4048f2046fdde9f946 Mon Sep 17 00:00:00 2001
From: "joachim.schmidt" <joachim.schmidt@hesge.ch>
Date: Sat, 20 Feb 2021 09:17:40 +0100
Subject: [PATCH] PetaLinux scalp_safe_petalinux project in debug version about
 the switch sja1105.  Transitional commitment.

---
 README.md                                     |  107 +-
 scalp_safe_petalinux/.petalinux/metadata      |    2 +-
 .../project-spec/configs/config               |   15 +-
 .../hw-description/scalp_safe_firmware.bit    |  Bin 3510783 -> 3510783 bytes
 .../project-spec/hw-description/system.xsa    |  Bin 497165 -> 497140 bytes
 .../device-tree/files/system-user.dtsi        |  119 +-
 .../recipes-bsp/u-boot/files/platform-top.h   |    6 +-
 .../recipes-bsp/u-boot/files/scalp_uboot.cfg  |   25 +-
 .../files/u-boot-scalp-sja1105-dbg.patch      | 1164 ++++++
 .../files/u-boot-scalp-sja1105-official.patch | 3280 +++++++++++++++++
 ...boot-zynq-scalp-dts-sja1105-official.patch |  293 ++
 ...zynq-scalp-dts-sja1105-static-config.patch |  209 ++
 .../u-boot/files/u-boot-zynq-scalp-dts.patch  |   20 +-
 .../scalp-linux-mtdcore-config-name.patch     |   15 +
 14 files changed, 5171 insertions(+), 84 deletions(-)
 create mode 100644 scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/u-boot-scalp-sja1105-dbg.patch
 create mode 100644 scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/u-boot-scalp-sja1105-official.patch
 create mode 100644 scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/u-boot-zynq-scalp-dts-sja1105-official.patch
 create mode 100644 scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/u-boot-zynq-scalp-dts-sja1105-static-config.patch
 create mode 100644 scalp_safe_petalinux/project-spec/meta-user/recipes-kernel/linux/linux-xlnx/scalp-linux-mtdcore-config-name.patch

diff --git a/README.md b/README.md
index 5c67a7c..7f651ed 100644
--- a/README.md
+++ b/README.md
@@ -23,7 +23,7 @@ Run the following command from a terminal.
 $ source /<XILINX_INSTALL_FOLDER>/PetaLinux/2020.2/bin/settings.sh
 ```
 
-In my case /<XILINX\_INSTALL\_FOLDER>/ corresponds to /tools/Xilinx/.
+In my case **\<XILINX\_INSTALL\_FOLDER\>** corresponds to /tools/Xilinx/.
 
 **Check that the "rsync" tool is installed.**
 
@@ -53,6 +53,16 @@ $ git checkout SCALP-SAFE-v0.01
 
 ### FPGA scalp_safe_firmware creation
 
+First of all... Go to the **board_files** folder of the GIT **scalp_firmware** deposit. [Scalp Firmware - Board files](https://gitedu.hesge.ch/soma/scalp_firmware/-/tree/master/board_files)
+
+And follow these instructions...
+
+The **scalp_node** folder can be copied into **\<Vivado directory\>/\<version\>/data/boards/board_files** to add **SCALP node** support in Vivado. The definition "hepia-cores.ch:scalp_node:part0:0.1" can then be used as a proper board definition for project creation. This board definition is currently blank and does not provide full board definition but it will evolve in the future and should be used for new project creation.
+
+**In your case, the definition is already present in the scalp_safe_firmware project. However, if the scalp_node folder is not copied, the creation of the project will fail.**
+
+Next...
+
 ```
 $ cd <SCALP_PROJECT_FOLDER>/scalp_firmware/designs/vivado/scalp_safe_firmware/2020.2/lin64/
 $ source setup.sh
@@ -166,46 +176,125 @@ In my case **\<path-to-hw\>** corresponds to /home/jo/Documents/Projets/Hepia/sc
 
 ```
 
-### Build the PetaLinux project
+### Bug in the U-Boot config with the selection of the ZYNQ_SPI driver
+
+Despite the fact that the ZYNQ_SPI driver is preselected in the U-Boot configuration specific to the SCALP board, this configuration is not automatically taken into account. Therefore, it is necessary to select the ZYNQ_SPI driver manually.
+
+First, you need to open the U-Boot configuration menu, after cleaning up the project.
 
 ```
 $ petalinux-build -x mrproper -f
+$ petalinux-config -c u-boot
+```
+
+Please select...
+
+```
+U-Boot 2020.01 Configuration
+    Device Drivers  --->
+    -*- SPI Support  --->
+        [*]   Zynq SPI driver (select with spacebar)
+```
+
+Then select 3 times EXIT...
+
+And save the configuration.
+
+**You can eventually go back to the U-Boot configuration menu to check that the ZYNQ_SPI driver has been taken into account.**
+
+### Build the PetaLinux project
+
+```
 $ petalinux-build
 ```
 
 The produced binary files can be found in the **./images/linux** folder.
 
+**You can possibly check that the ZYNQ_SPI driver has been compiled.**
+
+```
+
+```
+
+### Creation of the basic image of the U-Boot environment
+
+The image content can be produced by using the **mkenvimage** command.
+
+```
+$ echo -e "custom_board_name=\"Zynq Scalp Board\"\ncustom_board_version=\"RevB 2008\"\ncustom_board_vendor=\"Hepia CoRES - LSN\"" > images/linux/scalp-u-boot.env
+$ /tools/u-boot-tools/mkenvimage -s 0x20000 -o images/linux/scalp-u-boot.env.bin images/linux/scalp-u-boot.env
+```
+
+In my case, I copied the tools produced by U-Boot into the **/tools/u-boot-tools/** folder.
+
 ### QSPI firmware packaging
 
 ```
-$ petalinux-package --boot --fsbl images/linux/zynq_fsbl.elf --fpga images/linux/system.bit --u-boot --kernel --offset 0x520000
+$ petalinux-package --boot --fsbl images/linux/zynq_fsbl.elf --fpga images/linux/system.bit --u-boot --kernel --offset 0x540000 --dtb images/linux/system.dtb --offset 0x520000 --force
+
+$ petalinux-package --boot --fsbl images/linux/zynq_fsbl.elf --offset 0x0 --fpga images/linux/system.bit --u-boot --add images/linux/scalp-u-boot.env.bin --offset 0x500000 --kernel --offset 0x540000 --dtb images/linux/system.dtb --offset 0x520000 --force
+```
+
+The produced binary file can be found in the **./images/linux** folder. The **FIT image** of the Linux kernel is located at the address **0x540000**.
+
+Below is the partitioning of the flash memory.
+
 ```
+/* FSBL + safe bitstream (design with only Zynq) + U-Boot */
+/* Size : 5242880 Bytes */
+partition@boot {
+    label = "boot";
+    reg = <0x0 0x500000>;
+};
+        
+/* Safe U-Boot Env. */
+/* Size : 131072 Bytes */
+partition@bootenv {
+    label = "bootenv";
+    reg = <0x500000 0x20000>;
+};
 
-The produced binary file can be found in the **./images/linux** folder. This is copied in **0x520000** offset in the final image.
+/* Safe DTB */
+/* Size : 131072 Bytes */
+partition@dtb {
+    label = "dtb";
+    reg = <0x520000 0x20000>;
+};
+
+/* Safe Fit Image */
+/* Size : 28049408 Bytes */
+partition@fitimage {
+    label = "fitimage";
+    reg = <0x540000 0x1ac0000>;
+};
+```
 
 ### Flash firmware on QSPI memory
 
+**First of all, to flash the board, it is necessary to set switch SW1 (BOOT MODE) in JTAG mode. Then, once the card is flashed, it is necessary to set switch SW1 back in QSPI mode and reconnect the board.**
+
 If you are using a single JTAG probe.
 
 ```
 $ program_flash -f images/linux/BOOT.BIN -offset 0 -flash_type qspi-x4-single -fsbl images/linux/zynq_fsbl.elf -cable type xilinx_tcf url TCP:127.0.0.1:3121
 ```
 
-The **program_flash** command is located in the Vivado installation folder.
+The **program_flash** command is located in the Vitis installation folder **/tools/Xilinx/Vitis/2020.2/bin/program_flash**.
 
 If you use several JTAG probes.
 
 ```
 $ program_flash -jtagtarget
 
+> Available targets and devices:
 > JTAG chain configuration
 > --------------------------------------------------
 > 1 Digilent 210299AFC175 
-> 	2    jsn-JTAG-HS3-210299AFC175-4ba00477-0  (name arm_dap  idcode 4ba00477)
+> 	2    jsn-JTAG-HS3-210299AFC175-4ba00477-0  (name arm_dap  idcode 4ba00477) <-- target id 2
 > 	3    jsn-JTAG-HS3-210299AFC175-0373b093-0  (name xc7z015  idcode 0373b093)
-> 4 Xilinx 00001a3719fe01 
-> 	5    jsn-DLC10-00001a3719fe01-4ba00477-0  (name arm_dap  idcode 4ba00477)
->	6    jsn-DLC10-00001a3719fe01-0373b093-0  (name xc7z015  idcode 0373b093)
+> 4 Digilent 210299AFB167 
+> 	5    jsn-JTAG-HS3-210299AFB167-4ba00477-0  (name arm_dap  idcode 4ba00477) <-- target id 5
+> 	6    jsn-JTAG-HS3-210299AFB167-0373b093-0  (name xc7z015  idcode 0373b093)
 
 $ program_flash -f images/linux/BOOT.BIN -offset 0 -flash_type qspi-x4-single -fsbl images/linux/zynq_fsbl.elf -target_id 2 -url TCP:127.0.0.1:3121
 
diff --git a/scalp_safe_petalinux/.petalinux/metadata b/scalp_safe_petalinux/.petalinux/metadata
index ce403eb..90e3190 100644
--- a/scalp_safe_petalinux/.petalinux/metadata
+++ b/scalp_safe_petalinux/.petalinux/metadata
@@ -1,6 +1,6 @@
 PETALINUX_VER=2020.2
 VALIDATE_HW_CHKSUM=1
 HARDWARE_PATH=/home/jo/Documents/Projets/Hepia/scalp_project/scalp_firmware/designs/vivado/scalp_safe_firmware/2020.2/lin64/scalp_safe_firmware/scalp_safe_firmware.xsa
-HARDWARE_CHECKSUM=86e69a2505aca58b710730ddd68dd848
+HARDWARE_CHECKSUM=c0e54849f94ffc5aaa53e1cad4e1235f
 YOCTO_SDK=5ff8fc5f85d1566b314bb73eaa378212
 RFSCONFIG_CHKSUM=7fb2a289957dc67ab720c7cb67e09ee0
diff --git a/scalp_safe_petalinux/project-spec/configs/config b/scalp_safe_petalinux/project-spec/configs/config
index eca3550..dd45760 100644
--- a/scalp_safe_petalinux/project-spec/configs/config
+++ b/scalp_safe_petalinux/project-spec/configs/config
@@ -105,16 +105,16 @@ CONFIG_SUBSYSTEM_FLASH_PS7_QSPI_0_BANKLESS_PART1_FLAGS="bootenv"
 #
 # partition 2
 #
-CONFIG_SUBSYSTEM_FLASH_PS7_QSPI_0_BANKLESS_PART2_NAME="fitimage"
-CONFIG_SUBSYSTEM_FLASH_PS7_QSPI_0_BANKLESS_PART2_SIZE=0x1AC0000
-CONFIG_SUBSYSTEM_FLASH_PS7_QSPI_0_BANKLESS_PART2_FLAGS="fitimage"
+CONFIG_SUBSYSTEM_FLASH_PS7_QSPI_0_BANKLESS_PART2_NAME="dtb"
+CONFIG_SUBSYSTEM_FLASH_PS7_QSPI_0_BANKLESS_PART2_SIZE=0x20000
+CONFIG_SUBSYSTEM_FLASH_PS7_QSPI_0_BANKLESS_PART2_FLAGS="dtb"
 
 #
 # partition 3
 #
-CONFIG_SUBSYSTEM_FLASH_PS7_QSPI_0_BANKLESS_PART3_NAME="dtb"
-CONFIG_SUBSYSTEM_FLASH_PS7_QSPI_0_BANKLESS_PART3_SIZE=0x20000
-CONFIG_SUBSYSTEM_FLASH_PS7_QSPI_0_BANKLESS_PART3_FLAGS="dtb"
+CONFIG_SUBSYSTEM_FLASH_PS7_QSPI_0_BANKLESS_PART3_NAME="fitimage"
+CONFIG_SUBSYSTEM_FLASH_PS7_QSPI_0_BANKLESS_PART3_SIZE=0x1AC0000
+CONFIG_SUBSYSTEM_FLASH_PS7_QSPI_0_BANKLESS_PART3_FLAGS="fitimage"
 
 #
 # partition 4
@@ -195,7 +195,7 @@ CONFIG_SUBSYSTEM_EXTRA_DT_FILES=""
 #
 CONFIG_SUBSYSTEM_BOOTARGS_AUTO=y
 CONFIG_SUBSYSTEM_BOOTARGS_EARLYPRINTK=y
-
+CONFIG_SUBSYSTEM_BOOTARGS_GENERATED="console=ttyPS0,115200 earlycon"
 CONFIG_SUBSYSTEM_DEVICETREE_COMPILER_FLAGS="-@"
 # CONFIG_SUBSYSTEM_DTB_OVERLAY is not set
 # CONFIG_SUBSYSTEM_REMOVE_PL_DTB is not set
@@ -290,4 +290,3 @@ CONFIG_YOCTO_NETWORK_SSTATE_FEEDS_URL="http://petalinux.xilinx.com/sswreleases/r
 # User Layers
 #
 CONFIG_USER_LAYER_0=""
-CONFIG_SUBSYSTEM_BOOTARGS_GENERATED="console=ttyPS0,115200 earlycon"
diff --git a/scalp_safe_petalinux/project-spec/hw-description/scalp_safe_firmware.bit b/scalp_safe_petalinux/project-spec/hw-description/scalp_safe_firmware.bit
index 8c4c4527bb931dfe476b87c6fe53e0ef84073712..23eb74d76dece145f45538952c942a7f8de9eec0 100644
GIT binary patch
delta 190
zcmeyr_!=V!Ply#T(l<0^NMYbKG_*1`urf4g%x%qOY|UkA&1G)QWogZ2ZOvtC&1G-R
z<!H_2Y|Z6r&E;;*<!R03ZO!Ft&E;>+6==;BY|RyF%@uCV6=}^CZOs*H%@uFWm1xbC
zY|WKw&6RG=m1)hDZOxTy&6RJ>RcOssY|T|_%~fvARcXytZOv6{%~fyB)o9JtY|Yhb
n&DCzr)oIPuZOzqd&DC$sHE7K>Y|S-l%{6Y#HQAbLI%y&RDLg{5

delta 190
zcmeyr_!=V!Ply#T)HgC^NMYbKu&^>Qw=y(s%x%qOY|UkA&1G)QWogZ2ZOvtC&1G-R
z<!H_2Y|Z6r&E;;*<!R03ZO!Ft&E;>+6==;BY|RyF%@uCV6=}^CZOs*H%@uFWm1xbC
zY|WKw&6RG=m1)hDZOxTy&6RJ>RcOssY|T|_%~fvARcXytZOv6{%~fyB)o9JtY|Yhb
n&DCzr)oIPuZOzqd&DC$sHE7K>Y|S-l%{6Y#HQAbLI%y&RG*Uvt

diff --git a/scalp_safe_petalinux/project-spec/hw-description/system.xsa b/scalp_safe_petalinux/project-spec/hw-description/system.xsa
index b89135d74407fa63c8abfe03e63b60c1b0bc7465..5d18795d6fe6b33532d6e4287580d2f70772f40f 100644
GIT binary patch
delta 54435
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
B4{ZPd

delta 54392
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%0Dv>v7xqf_mP`CUcM7
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

diff --git a/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi b/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
index 337d87f..b48d920 100644
--- a/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
+++ b/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
@@ -89,35 +89,36 @@
         /* m25p,fast-read; */
         #address-cells = <1>;
         #size-cells = <1>;
-        
-        /* FSBL + safe bitstream (design with only Zynq) + U-Boot + (devicetree) => BOOT.BIN */
-        /* Size : 5242880 Bytes */
-        partition@boot {       
-            label = "boot";
-            reg = <0x0 0x500000>;
-        };
-        
-        /* Safe U-Boot Env. */
-        /* Size : 131072 Bytes */
-        partition@bootenv {       
-            label = "bootenv";
-            reg = <0x500000 0x20000>;
-        };
-        
-        /* Safe Fit Image */
-        /* Size : 28049408 Bytes */
-        partition@fitimage {            
-            label = "fitimage";
-            reg = <0x520000 0x1ac0000>;
-        };
-
-        /* Safe DTB */
-        /* Size : 131072 Bytes */
-        partition@dtb {            
-            label = "dtb";
-            reg = <0x1ac0000 0x20000>;
-        };
     };
+    
+    //     /* FSBL + safe bitstream (design with only Zynq) + U-Boot */
+    //     /* Size : 5242880 Bytes */
+    //     partition@boot {       
+    //         label = "boot";
+    //         reg = <0x0 0x500000>;
+    //     };
+        
+    //     /* Safe U-Boot Env. */
+    //     /* Size : 131072 Bytes */
+    //     partition@bootenv {       
+    //         label = "bootenv";
+    //         reg = <0x500000 0x20000>;
+    //     };
+
+    //     /* Safe DTB */
+    //     /* Size : 131072 Bytes */
+    //     partition@dtb {            
+    //         label = "dtb";
+    //         reg = <0x520000 0x20000>;
+    //     };
+
+    //     /* Safe Fit Image */
+    //     /* Size : 28049408 Bytes */
+    //     partition@fitimage {            
+    //         label = "fitimage";
+    //         reg = <0x540000 0x1ac0000>;
+    //     };
+    // };
 };
 
 /* Switch Ethernet 5 ports - SPI0 - MIO 40, 41, 42, 45 */
@@ -157,14 +158,14 @@
 			#address-cells = <1>;
 			#size-cells = <0>;
             
-			port@0 {
+			swp0_east: port@0 {
 				label = "swp0_east";
 				phy-mode = "rgmii";
 				reg = <0>;
-                sja1105,role-phy;
+                //sja1105,role-phy;
 
                 fixed-link {
-					speed = <1000>;
+					speed = <10>;
 					full-duplex;
 				};
 			};
@@ -173,46 +174,46 @@
 				ethernet = <&gem0>;
 				phy-mode = "rgmii";
 				reg = <1>;
-                sja1105,role-phy;
+                //sja1105,role-phy;
 				
 				fixed-link {
-					speed = <1000>;
+					speed = <10>;
 					full-duplex;
 				};
 			};
             
-			port@2 {
+			swp2_bottom: port@2 {
 				label = "swp2_bottom";
 				phy-mode = "rgmii";
 				reg = <2>;
-                sja1105,role-mac;
+                //sja1105,role-mac;
 
                 fixed-link {
-					speed = <1000>;
+					speed = <10>;
 					full-duplex;
 				};
 			};
             
-			port@3 {
+			swp3_top: port@3 {
 				label = "swp3_top";
 				phy-mode = "rgmii";
 				reg = <3>;
-                sja1105,role-phy;
+                //sja1105,role-phy;
 
                 fixed-link {
-					speed = <1000>;
+					speed = <10>;
 					full-duplex;
 				};
 			};
             
-            port@4 {
+            swp4_west: port@4 {
 				label = "swp4_west";
 				phy-mode = "rgmii";
 				reg = <4>;
-                sja1105,role-mac;
+                //sja1105,role-mac;
 
                 fixed-link {
-					speed = <1000>;
+					speed = <10>;
 					full-duplex;
 				};
 			};			
@@ -220,13 +221,21 @@
 	};
 };
 
-/* spi2 */
-&spi1 {
-    u-boot,dm-pre-reloc;
-    is-decoded-cs = <0>;
-	num-cs = <3>;
-	status = "okay";
-};
+// &spi0 {
+//       bus-num = <0>;
+//       status = "okay";
+
+//       /* SCALP specific SJA1105T driver */
+//       sja1105@0 {
+//                 reg = <0>;
+//                 #address-cells = <1>;
+//                 #size-cells = <0>;
+//                 compatible = "scalp,sja1105t";
+//                 reset-gpios = <&gpio0 44 GPIO_ACTIVE_LOW>;
+//                 spi-max-frequency = <12000000>;
+//                 spi-cpha;
+//       };
+// };
 
 /* ethernet0 */
 &gem0 {
@@ -237,7 +246,7 @@
       //local-mac-address = [00 0a 35 00 00 00];
 
       fixed-link {
-		  speed = <1000>;
+		  speed = <10>;
 	      full-duplex;
 	  };
 
@@ -246,6 +255,16 @@
 	  //};
 };
 
+/* spi2 */
+&spi1 {
+    u-boot,dm-pre-reloc;
+    is-decoded-cs = <0>;
+	num-cs = <3>;
+	status = "okay";
+};
+
+
+
 &gpio0 {
 	emio-gpio-width = <64>;
 	gpio-mask-high = <0x0>;
diff --git a/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h b/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h
index 2c626cc..a372e17 100644
--- a/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h
+++ b/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h
@@ -10,10 +10,10 @@
     "SCALP_BOOT_PARTITION_SIZE=0x500000\0"                              \
     "SCALP_BOOTENV_PARTITION_OFFSET=0x500000\0"                         \
     "SCALP_BOOTENV_PARTITION_SIZE=0x20000\0"                            \
-    "SCALP_FITIMAGE_PARTITION_OFFSET=0x520000\0"                        \
+    "SCALP_FITIMAGE_PARTITION_OFFSET=0x540000\0"                        \
     "SCALP_FITIMAGE_PARTITION_SIZE=0x1AC0000\0"                         \
     "SCALP_FITIMAGE_LOAD_OFFSET=0x2000000\0"                            \
-    "SCALP_DTB_PARTITION_OFFSET=0x1AC0000\0"                            \
+    "SCALP_DTB_PARTITION_OFFSET=0x520000\0"                            \
     "SCALP_DTB_PARTITION_SIZE=0x20000\0"                                \
     "load_scalp_fitimage=sf probe 0 0 0 && sf read ${SCALP_FITIMAGE_LOAD_OFFSET} ${SCALP_FITIMAGE_PARTITION_OFFSET} ${SCALP_FITIMAGE_PARTITION_SIZE}\0" \
     "macmemaddr=0x1000000\0"                                            \
@@ -39,7 +39,7 @@
     "setenv bootargs \"ip=${ipaddr}:::::eth0\"\0"                       \
     "setup_eth=run readmac buildmac buildip\0"                          \
     "boot_from_qspi=run setup_eth && run load_scalp_fitimage && iminfo ${SCALP_FITIMAGE_LOAD_OFFSET} && bootm ${SCALP_FITIMAGE_LOAD_OFFSET}\0" \
-    "custom_autoboot=echo Scalp board autoboot && sja1105 init && run boot_from_qspi\0" \
+    "custom_autoboot=echo Scalp board autoboot && run boot_from_qspi\0" \
     "baudrate=115200\0"                                                 \
     "bootargs=ip=${ipaddr}:::::eth0\0"                                  \
     "bootdelay=2\0"                                                     \
diff --git a/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/scalp_uboot.cfg b/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/scalp_uboot.cfg
index 1a2104c..e4573d7 100644
--- a/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/scalp_uboot.cfg
+++ b/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/scalp_uboot.cfg
@@ -38,17 +38,36 @@ CONFIG_MTD_UBI=y
 CONFIG_MTD_UBI_WL_THRESHOLD=4096
 CONFIG_MTD_UBI_BEB_LIMIT=20
 # CONFIG_MTD_UBI_FASTMAP is not set
+CONFIG_SPI=y
+CONFIG_DM_SPI=y
+CONFIG_ZYNQ_SPI=y
+CONFIG_ZYNQ_QSPI=y
 CONFIG_RGMII=y
-CONFIG_XILINX_SPI=y
 CONFIG_FS_JFFS2=y
 CONFIG_RBTREE=y
 CONFIG_LZO=y
 CONFIG_ENV_OFFSET=0x0
 CONFIG_ENV_ADDR=0x500000
-CONFIG_XILINX_OF_BOARD_DTB_ADDR=0x1AC0000
+CONFIG_XILINX_OF_BOARD_DTB_ADDR=0x520000
 CONFIG_PACKING=y
 CONFIG_CMD_SJA1105=y
 CONFIG_SCALP_SJA1105=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_FULL=y
+CONFIG_PINCTRL_GENERIC=y
+CONFIG_PINMUX=y
+# CONFIG_PINCONF is not set
+CONFIG_PINCONF_RECURSIVE=y
+# CONFIG_PINCTRL_AT91 is not set
+# CONFIG_PINCTRL_AT91PIO4 is not set
+# CONFIG_PINCTRL_ROCKCHIP_RV1108 is not set
+# CONFIG_PINCTRL_SINGLE is not set
+# CONFIG_PINCTRL_STM32 is not set
+# CONFIG_PINCTRL_STMFX is not set
+CONFIG_DEFAULT_DEVICE_TREE="zynq-scalp"
 # CONFIG_OF_SEPARATE is not set
 CONFIG_OF_EMBED=y
-CONFIG_DEFAULT_DEVICE_TREE="zynq-scalp"
+CONFIG_DM_MDIO=y
+CONFIG_DM_MDIO_MUX=y
+# CONFIG_MDIO_MUX_I2CREG is not set
+# CONFIG_MVMDIO is not set
\ No newline at end of file
diff --git a/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/u-boot-scalp-sja1105-dbg.patch b/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/u-boot-scalp-sja1105-dbg.patch
new file mode 100644
index 0000000..919bddd
--- /dev/null
+++ b/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/u-boot-scalp-sja1105-dbg.patch
@@ -0,0 +1,1164 @@
+diff --git a/cmd/Kconfig b/cmd/Kconfig
+index 1ae0f4055a..06d2c55e4e 100644
+--- a/cmd/Kconfig
++++ b/cmd/Kconfig
+@@ -935,6 +935,12 @@ config RANDOM_UUID
+ 	  Enable the generation of partitions with random UUIDs if none
+ 	  are provided.
+
++config CMD_SJA1105
++	bool "sja1105 - Commands for interacting with scalp-sja1105 simple driver"
++	help
++	  Provides a 'sja1105' command which can be used to probe and
++	  initialize the scalp-sja1105 driver.
++
+ config CMD_GPT_RENAME
+ 	bool "GPT partition renaming commands"
+ 	depends on CMD_GPT
+diff --git a/cmd/Makefile b/cmd/Makefile
+index 3feb7741c8..c4321ff92b 100644
+--- a/cmd/Makefile
++++ b/cmd/Makefile
+@@ -42,6 +42,7 @@ obj-$(CONFIG_CMD_CPU) += cpu.o
+ obj-$(CONFIG_DATAFLASH_MMC_SELECT) += dataflash_mmc_mux.o
+ obj-$(CONFIG_CMD_DATE) += date.o
+ obj-$(CONFIG_CMD_DEMO) += demo.o
++obj-$(CONFIG_CMD_SJA1105) += sja1105.o
+ obj-$(CONFIG_CMD_DM) += dm.o
+ obj-$(CONFIG_CMD_FRU) += fru.o
+ obj-$(CONFIG_CMD_SOUND) += sound.o
+diff --git a/cmd/sja1105.c b/cmd/sja1105.c
+new file mode 100644
+index 0000000000..7fbcac9e83
+--- /dev/null
++++ b/cmd/sja1105.c
+@@ -0,0 +1,100 @@
++// SPDX-License-Identifier: GPL-2.0+
++/*
++ * Copyright (c) 2013 Google, Inc
++ *
++ * (C) Copyright 2012
++ * Pavel Herrmann <morpheus.ibis@gmail.com>
++ */
++
++#include <common.h>
++//#include <dm-demo.h>
++#include <dm.h>
++#include <mapmem.h>
++#include <asm/io.h>
++
++struct udevice *sja1105_dev;
++
++static int do_sja1105_status(cmd_tbl_t *cmdtp, int flag, int argc,
++			  char * const argv[])
++{
++	printf("Not implemented\n");
++	return 0;
++}
++
++int do_sja1105_init(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
++{
++	struct udevice *dev;
++	int i, ret;
++    printf("DEBUG : do_sja1105_init START\n");
++
++	for (i = 0, ret = uclass_first_device(UCLASS_SPI, &dev);
++	     dev;
++	     ret = uclass_next_device(&dev)) {
++		printf("entry %d - instance %08x, ops %08x, platdata %08x\n",
++		       i++, (uint)map_to_sysmem(dev),
++		       (uint)map_to_sysmem(dev->driver->ops),
++		       (uint)map_to_sysmem(dev_get_platdata(dev)));
++	}
++
++    printf("DEBUG : do_sja1105_init END\n");
++
++	return cmd_process_error(cmdtp, ret);
++}
++
++static cmd_tbl_t sja1105_commands[] = {
++	U_BOOT_CMD_MKENT(init, 0, 1, do_sja1105_init, "", ""),
++	U_BOOT_CMD_MKENT(status, 0, 1, do_sja1105_status, "", ""),
++};
++
++static int do_sja1105(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
++{
++	cmd_tbl_t *sja1105_cmd;
++	int devnum = 0;
++	int ret;
++
++    printf("DEBUG : do_sja1105 START\n");
++
++	if (argc < 2)
++    {
++        printf("DEBUG : do_sja1105 END 0\n");
++		return CMD_RET_USAGE;
++    }
++
++	sja1105_cmd = find_cmd_tbl(argv[1], sja1105_commands,
++				ARRAY_SIZE(sja1105_commands));
++	argc -= 2;
++	argv += 2;
++
++	if ((!sja1105_cmd || argc > sja1105_cmd->maxargs))
++    {
++        printf("DEBUG : do_sja1105 END 1\n");
++		return CMD_RET_USAGE;
++    }
++
++	/*if (argc) {
++		devnum = simple_strtoul(argv[0], NULL, 10);
++		ret = uclass_get_device(UCLASS_DEMO, devnum, &sja1105_dev);
++		if (ret)
++			return cmd_process_error(cmdtp, ret);
++		argc--;
++		argv++;
++	} else {
++		sja1105_dev = NULL;
++		if (sja1105_cmd->cmd != do_sja1105_list)
++			return CMD_RET_USAGE;
++	}*/
++
++	ret = sja1105_cmd->cmd(sja1105_cmd, flag, argc, argv);
++
++    printf("DEBUG : do_sja1105 END 2\n");
++
++	return cmd_process_error(sja1105_cmd, ret);
++}
++
++U_BOOT_CMD(
++	sja1105,   2,      1,      do_sja1105,
++	"sja1105 operations",
++	"init                     Initialize sja1105 devices\n"
++	"sja1105 status                   Get sja1105 device status (not implemented)\n"
++	"sja1105 init                     Initialize sja1105 devices"
++);
+diff --git a/drivers/Kconfig b/drivers/Kconfig
+index 9d99ce0226..13e4ccaaec 100644
+--- a/drivers/Kconfig
++++ b/drivers/Kconfig
+@@ -26,6 +26,8 @@ source "drivers/ddr/Kconfig"
+
+ source "drivers/demo/Kconfig"
+
++source "drivers/scalp_sja1105/Kconfig"
++
+ source "drivers/board/Kconfig"
+
+ source "drivers/ddr/fsl/Kconfig"
+diff --git a/drivers/Makefile b/drivers/Makefile
+index e977f19af6..3a107c85a4 100644
+--- a/drivers/Makefile
++++ b/drivers/Makefile
+@@ -72,6 +72,7 @@ ifeq ($(CONFIG_SPL_BUILD)$(CONFIG_TPL_BUILD),)
+ obj-y += adc/
+ obj-y += ata/
+ obj-$(CONFIG_DM_DEMO) += demo/
++obj-$(CONFIG_SCALP_SJA1105) += scalp_sja1105/
+ obj-$(CONFIG_BIOSEMU) += bios_emulator/
+ obj-y += block/
+ obj-y += board/
+diff --git a/drivers/scalp_sja1105/Kconfig b/drivers/scalp_sja1105/Kconfig
+new file mode 100644
+index 0000000000..f6960bf4d0
+--- /dev/null
++++ b/drivers/scalp_sja1105/Kconfig
+@@ -0,0 +1,15 @@
++menu "Scalp specific"
++
++config SCALP_SJA1105
++	bool "NXP SJA1105 Ethernet switch driver for SCALP board"
++	depends on DM_SPI
++	select PACKING
++	select BITREVERSE
++	help
++	  This a basic driver for the NXP SJA1105 automotive Ethernet switch
++	  specifically created for it's use on the SCALP board. A fixed
++	  configuration is sent to the SJA1105 thru SPI to configure it
++	  as a standard switch.
++
++
++endmenu
+diff --git a/drivers/scalp_sja1105/Makefile b/drivers/scalp_sja1105/Makefile
+new file mode 100644
+index 0000000000..b89b1bd62a
+--- /dev/null
++++ b/drivers/scalp_sja1105/Makefile
+@@ -0,0 +1,5 @@
++# SPDX-License-Identifier: GPL-2.0+
++#
++# Copyright (c) 2013 Google, Inc
++
++obj-y += scalp_sja1105.o
+diff --git a/drivers/scalp_sja1105/scalp_sja1105.c b/drivers/scalp_sja1105/scalp_sja1105.c
+new file mode 100644
+index 0000000000..c0f0b67998
+--- /dev/null
++++ b/drivers/scalp_sja1105/scalp_sja1105.c
+@@ -0,0 +1,639 @@
++/*
++
++ */
++
++#define DEBUG
++#undef CONFIG_LOGLEVEL
++#define CONFIG_LOGLEVEL 8
++
++#include <common.h>
++#include <linux/packing.h>
++#include <spi.h>
++#include <dm.h>
++#include <dm/uclass-internal.h>
++
++// Static configuration generated by pyhton scripts
++#include "scalp_sja1105_static_config.h"
++
++#define SJA1105_NUM_PORTS					5
++#define SJA1105_SIZE_CGU_CMD				4
++#define SJA1105_SIZE_SPI_MSG_HEADER			4
++#define SJA1105_SIZE_RESET_CMD				4
++#define SJA1105_SIZE_SPI_MSG_MAXLEN			(64 * 4)
++#define SJA1105_ADDR_DEVICE_ID				0
++#define SJA1105_SIZE_DEVICE_ID				4
++#define SJA1105_ADDR_PROD_ID				0x100BC3
++
++#define SJA1105_ADDR_CONFIG					0x020000
++#define SJA1105_ADDR_RGU					0x100440
++#define SJA1105_ADDR_STATUS					0x1
++
++#define SJA1105T_DEVICE_ID					0x9E00030Eull
++#define SJA1105ET_PART_NO					0x9A83
++
++u64 reg_addr_rgmii_tx_clk[] = {0x100016, 0x10001D, 0x100024, 0x10002B, 0x100032};
++u64 reg_addr_pad_mii_tx[] = {0x100800, 0x100802, 0x100804, 0x100806, 0x100808};
++u64 reg_addr_cgu_idiv[] = {0x10000B, 0x10000C, 0x10000D, 0x10000E, 0x10000F};
++
++enum {
++	CLKSRC_MII0_TX_CLK	= 0x00,
++	CLKSRC_MII0_RX_CLK	= 0x01,
++	CLKSRC_MII1_TX_CLK	= 0x02,
++	CLKSRC_MII1_RX_CLK	= 0x03,
++	CLKSRC_MII2_TX_CLK	= 0x04,
++	CLKSRC_MII2_RX_CLK	= 0x05,
++	CLKSRC_MII3_TX_CLK	= 0x06,
++	CLKSRC_MII3_RX_CLK	= 0x07,
++	CLKSRC_MII4_TX_CLK	= 0x08,
++	CLKSRC_MII4_RX_CLK	= 0x09,
++	CLKSRC_PLL0		= 0x0B,
++	CLKSRC_PLL1		= 0x0E,
++	CLKSRC_IDIV0		= 0x11,
++	CLKSRC_IDIV1		= 0x12,
++	CLKSRC_IDIV2		= 0x13,
++	CLKSRC_IDIV3		= 0x14,
++	CLKSRC_IDIV4		= 0x15,
++};
++
++struct scalp_sja1105_private {
++	u64 phy_mac[5];
++	const struct scalp_sja1105_info *info;
++	struct udevice *dev;
++};
++
++typedef enum {
++	XMII_MAC = 0,
++	XMII_PHY = 1,
++} sja1105_mii_role_t;
++
++struct sja1105_cgu_mii_ctrl {
++	u64 clksrc;
++	u64 autoblock;
++	u64 pd;
++};
++
++struct sja1105_cfg_pad_mii_tx {
++	u64 d32_os;
++	u64 d32_ipud;
++	u64 d10_os;
++	u64 d10_ipud;
++	u64 ctrl_os;
++	u64 ctrl_ipud;
++	u64 clk_os;
++	u64 clk_ih;
++	u64 clk_ipud;
++};
++
++struct scalp_sja1105_info {
++	u64 device_id;
++	u64 part_no;
++	const struct sja1105_table_ops *static_ops;
++	const struct sja1105_regs *regs;
++	int (*reset_cmd)(struct scalp_sja1105_private *priv);
++	//int (*setup_rgmii_delay)(struct scalp_sja1105_private *priv, int port);
++	const char *name;
++};
++
++typedef enum {
++	SPI_READ = 0,
++	SPI_WRITE = 1,
++} sja1105_spi_rw_mode_t;
++
++struct sja1105_chunk {
++	u8	*buf;
++	size_t	len;
++	u64	reg_addr;
++};
++
++struct sja1105_spi_message {
++	u64 access;
++	u64 read_count;
++	u64 address;
++};
++
++struct sja1105_cgu_idiv {
++	u64 clksrc;
++	u64 autoblock;
++	u64 idiv;
++	u64 pd;
++};
++
++typedef enum {
++	SJA1105_SPEED_10MBPS	= 3,
++	SJA1105_SPEED_100MBPS	= 2,
++	SJA1105_SPEED_1000MBPS	= 1,
++} sja1105_speed_t;
++
++static void scalp_sja1105_packing(void *buf, u64 *val, int start, int end, size_t len, enum packing_op op)
++{
++	int rc;
++
++	rc = packing(buf, val, start, end, len, op, QUIRK_LSW32_IS_FIRST);
++	if (likely(!rc))
++		return;
++
++	printf("Invalid use of packing API: start %d end %d returned %d\n",
++	       start, end, rc);
++}
++
++static void scalp_sja1105_spi_message_pack(void *buf, struct sja1105_spi_message *msg)
++{
++	const int size = SJA1105_SIZE_SPI_MSG_HEADER;
++
++	memset(buf, 0, size);
++
++	scalp_sja1105_packing(buf, &msg->access,     31, 31, size, PACK);
++	scalp_sja1105_packing(buf, &msg->read_count, 30, 25, size, PACK);
++	scalp_sja1105_packing(buf, &msg->address,    24,  4, size, PACK);
++}
++
++static int scalp_sja1105_xfer_buf(const struct scalp_sja1105_private *priv,
++			    sja1105_spi_rw_mode_t rw, u64 reg_addr,
++			    u8 *buf, size_t len)
++{
++	struct udevice *dev = priv->dev;
++	struct sja1105_chunk chunk = {
++		.len = min_t(size_t, len, SJA1105_SIZE_SPI_MSG_MAXLEN),
++		.reg_addr = reg_addr,
++		.buf = buf,
++	};
++	int num_chunks;
++	int rc, i;
++
++	rc = dm_spi_claim_bus(dev);
++	if (rc)
++		return rc;
++
++	num_chunks = DIV_ROUND_UP(len, SJA1105_SIZE_SPI_MSG_MAXLEN);
++
++	for (i = 0; i < num_chunks; i++) {
++		u8 hdr_buf[SJA1105_SIZE_SPI_MSG_HEADER];
++		struct sja1105_spi_message msg;
++		u8 *rx_buf = NULL;
++		u8 *tx_buf = NULL;
++
++		/* Populate the transfer's header buffer */
++		msg.address = chunk.reg_addr;
++		msg.access = rw;
++		if (rw == SPI_READ)
++			msg.read_count = chunk.len / 4;
++		else
++			/* Ignored */
++			msg.read_count = 0;
++		scalp_sja1105_spi_message_pack(hdr_buf, &msg);
++		rc = dm_spi_xfer(dev, SJA1105_SIZE_SPI_MSG_HEADER * 8, hdr_buf,
++				 NULL, SPI_XFER_BEGIN);
++		if (rc)
++			goto out;
++
++		/* Populate the transfer's data buffer */
++		if (rw == SPI_READ)
++			rx_buf = chunk.buf;
++		else
++			tx_buf = chunk.buf;
++		rc = dm_spi_xfer(dev, chunk.len * 8, tx_buf, rx_buf,
++				 SPI_XFER_END);
++		if (rc)
++			goto out;
++
++		/* Calculate next chunk */
++		chunk.buf += chunk.len;
++		chunk.reg_addr += chunk.len / 4;
++		chunk.len = min_t(size_t, (ptrdiff_t)(buf + len - chunk.buf),
++				  SJA1105_SIZE_SPI_MSG_MAXLEN);
++	}
++
++out:
++	dm_spi_release_bus(dev);
++
++	return rc;
++}
++
++static int scalp_sja1105_transmit_raw(const struct scalp_sja1105_private *priv,
++									  const u8 *buf, size_t len)
++{
++	struct udevice *dev = priv->dev;
++	int rc;
++
++	if (len > 260)
++		return -EFBIG;
++
++	rc = dm_spi_claim_bus(dev);
++	if (rc)
++		return rc;
++
++	rc = dm_spi_xfer(dev, len * 8, buf, NULL, SPI_XFER_ONCE);
++	if (rc)
++		goto out;
++
++out:
++	dm_spi_release_bus(dev);
++
++	return rc;
++}
++
++/* AGU */
++static void
++sja1105_cfg_pad_mii_tx_packing(void *buf, struct sja1105_cfg_pad_mii_tx *cmd,
++			       enum packing_op op)
++{
++	const int size = 4;
++
++	scalp_sja1105_packing(buf, &cmd->d32_os,   28, 27, size, op);
++	scalp_sja1105_packing(buf, &cmd->d32_ipud, 25, 24, size, op);
++	scalp_sja1105_packing(buf, &cmd->d10_os,   20, 19, size, op);
++	scalp_sja1105_packing(buf, &cmd->d10_ipud, 17, 16, size, op);
++	scalp_sja1105_packing(buf, &cmd->ctrl_os,  12, 11, size, op);
++	scalp_sja1105_packing(buf, &cmd->ctrl_ipud, 9,  8, size, op);
++	scalp_sja1105_packing(buf, &cmd->clk_os,    4,  3, size, op);
++	scalp_sja1105_packing(buf, &cmd->clk_ih,    2,  2, size, op);
++	scalp_sja1105_packing(buf, &cmd->clk_ipud,  1,  0, size, op);
++}
++
++static void
++sja1105_cgu_mii_control_packing(void *buf, struct sja1105_cgu_mii_ctrl *cmd,
++				enum packing_op op)
++{
++	const int size = 4;
++
++	scalp_sja1105_packing(buf, &cmd->clksrc,    28, 24, size, op);
++	scalp_sja1105_packing(buf, &cmd->autoblock, 11, 11, size, op);
++	scalp_sja1105_packing(buf, &cmd->pd,         0,  0, size, op);
++}
++
++static int scalp_sja1105_check_device_id(struct scalp_sja1105_private *priv)
++{
++    u8 packed_buf[SJA1105_SIZE_DEVICE_ID] = {0};
++	u64 device_id;
++	u64 part_no;
++	int rc;
++
++	rc = scalp_sja1105_xfer_buf(priv, SPI_READ, SJA1105_ADDR_DEVICE_ID, packed_buf,
++			      SJA1105_SIZE_DEVICE_ID);
++	if (rc < 0)
++		return rc;
++
++	scalp_sja1105_packing(packed_buf, &device_id, 31, 0, SJA1105_SIZE_DEVICE_ID,
++			UNPACK);
++
++	if (device_id != SJA1105T_DEVICE_ID) {
++		printf("Expected device ID 0x%llx but read 0x%llx\n",
++		       SJA1105T_DEVICE_ID, device_id);
++		return -ENODEV;
++	}
++
++	rc = scalp_sja1105_xfer_buf(priv, SPI_READ, SJA1105_ADDR_PROD_ID, packed_buf,
++			      SJA1105_SIZE_DEVICE_ID);
++	if (rc < 0)
++		return rc;
++
++	scalp_sja1105_packing(packed_buf, &part_no, 19, 4, SJA1105_SIZE_DEVICE_ID,
++			UNPACK);
++
++	if (part_no != SJA1105ET_PART_NO) {
++		printf("Expected part number 0x%llx but read 0x%llx\n",
++		       (long long unsigned int)SJA1105ET_PART_NO, part_no);
++		return -ENODEV;
++	}
++
++	return 0;
++}
++
++struct scalp_sja1105_status {
++	u64 configs;
++	u64 crcchkl;
++	u64 ids;
++	u64 crcchkg;
++};
++
++static void scalp_sja1105_status_unpack(void *buf, struct scalp_sja1105_status *status)
++{
++	scalp_sja1105_packing(buf, &status->configs,   31, 31, 4, UNPACK);
++	scalp_sja1105_packing(buf, &status->crcchkl,   30, 30, 4, UNPACK);
++	scalp_sja1105_packing(buf, &status->ids,       29, 29, 4, UNPACK);
++	scalp_sja1105_packing(buf, &status->crcchkg,   28, 28, 4, UNPACK);
++}
++
++static int scalp_sja1105_status_get(struct scalp_sja1105_private *priv,
++			      struct scalp_sja1105_status *status)
++{
++	u8 packed_buf[4];
++	int rc;
++
++	rc = scalp_sja1105_xfer_buf(priv, SPI_READ, SJA1105_ADDR_STATUS, packed_buf, 4);
++	if (rc < 0)
++		return rc;
++
++	scalp_sja1105_status_unpack(packed_buf, status);
++
++	return 0;
++}
++
++static int scalp_sja1105et_reset_cmd(struct scalp_sja1105_private *priv)
++{
++	u8 packed_buf[SJA1105_SIZE_RESET_CMD] = {0};
++	const int size = SJA1105_SIZE_RESET_CMD;
++	u64 cold_rst = 1;
++
++	scalp_sja1105_packing(packed_buf, &cold_rst, 3, 3, size, PACK);
++
++	return scalp_sja1105_xfer_buf(priv, SPI_WRITE, SJA1105_ADDR_RGU, packed_buf,
++				SJA1105_SIZE_RESET_CMD);
++}
++
++static void sja1105_cgu_idiv_packing(void *buf, struct sja1105_cgu_idiv *idiv,
++				     enum packing_op op)
++{
++	const int size = 4;
++
++	scalp_sja1105_packing(buf, &idiv->clksrc,    28, 24, size, op);
++	scalp_sja1105_packing(buf, &idiv->autoblock, 11, 11, size, op);
++	scalp_sja1105_packing(buf, &idiv->idiv,       5,  2, size, op);
++	scalp_sja1105_packing(buf, &idiv->pd,         0,  0, size, op);
++}
++
++static int sja1105_cgu_idiv_config(struct scalp_sja1105_private *priv, int port,
++				   bool enabled, int factor)
++{
++	//const struct sja1105_regs *regs = priv->info->regs;
++	struct sja1105_cgu_idiv idiv;
++	u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
++
++	if (enabled && factor != 1 && factor != 10)
++		return -ERANGE;
++
++	/* Payload for packed_buf */
++	idiv.clksrc    = 0x0A;            /* 25MHz */
++	idiv.autoblock = 1;               /* Block clk automatically */
++	idiv.idiv      = factor - 1;      /* Divide by 1 or 10 */
++	idiv.pd        = enabled ? 0 : 1; /* Power down? */
++	sja1105_cgu_idiv_packing(packed_buf, &idiv, PACK);
++
++	return scalp_sja1105_xfer_buf(priv, SPI_WRITE, reg_addr_cgu_idiv[port],
++				packed_buf, SJA1105_SIZE_CGU_CMD);
++}
++
++static int scalp_sja1105_static_config_upload(struct scalp_sja1105_private *priv)
++{
++	struct scalp_sja1105_status status;
++	int rc;
++
++	/* Put the SJA1105 in programming mode */
++	rc = scalp_sja1105et_reset_cmd(priv);
++	if (rc < 0) {
++		printf("Failed to reset switch\n");
++		goto out;
++	}
++
++	/* Wait for the switch to come out of reset */
++	udelay(1000);
++
++	/* Upload the static config to the device */
++    rc  = scalp_sja1105_transmit_raw(priv, config_data_0, sizeof(config_data_0));
++    rc |= scalp_sja1105_transmit_raw(priv, config_data_1, sizeof(config_data_1));
++    rc |= scalp_sja1105_transmit_raw(priv, config_data_2, sizeof(config_data_2));
++    rc |= scalp_sja1105_transmit_raw(priv, config_data_3, sizeof(config_data_3));
++	if (rc < 0) {
++		printf("Failed to upload config\n");
++		goto out;
++	}
++
++	/* Check that SJA1105 responded well to the config upload */
++	rc = scalp_sja1105_status_get(priv, &status);
++	if (rc < 0)
++		goto out;
++
++	if (status.ids == 1) {
++		printf("Mismatch between hardware and static config device id.");
++		rc = -EIO;
++		goto out;
++	}
++	if (status.crcchkl == 1 || status.crcchkg == 1) {
++		printf("Switch reported invalid CRC on static config\n");
++		rc = -EIO;
++		goto out;
++	}
++	if (status.configs == 0) {
++		printf("Switch reported that config is invalid\n");
++		rc = -EIO;
++		goto out;
++	}
++	printf("Config uploaded\n");
++out:
++	return rc;
++}
++
++static int scalp_sja1105_static_config_load(struct scalp_sja1105_private *priv)
++{
++	return scalp_sja1105_static_config_upload(priv);
++}
++
++
++
++static int sja1105_cgu_rgmii_tx_clk_config(struct scalp_sja1105_private *priv,
++					   int port, sja1105_speed_t speed)
++{
++	struct sja1105_cgu_mii_ctrl txc;
++	u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
++	int clksrc;
++
++	if (speed == SJA1105_SPEED_1000MBPS) {
++		clksrc = CLKSRC_PLL0;
++	} else {
++		int clk_sources[] = {CLKSRC_IDIV0, CLKSRC_IDIV1, CLKSRC_IDIV2,
++				     CLKSRC_IDIV3, CLKSRC_IDIV4};
++		clksrc = clk_sources[port];
++	}
++
++	/* RGMII: 125MHz for 1000, 25MHz for 100, 2.5MHz for 10 */
++	txc.clksrc = clksrc;
++	/* Autoblock clk while changing clksrc */
++	txc.autoblock = 1;
++	/* Power Down off => enabled */
++	txc.pd = 0;
++	sja1105_cgu_mii_control_packing(packed_buf, &txc, PACK);
++
++	return scalp_sja1105_xfer_buf(priv, SPI_WRITE, reg_addr_rgmii_tx_clk[port],
++				packed_buf, SJA1105_SIZE_CGU_CMD);
++}
++
++static int sja1105_rgmii_cfg_pad_tx_config(struct scalp_sja1105_private *priv,
++					   int port)
++{
++	struct sja1105_cfg_pad_mii_tx pad_mii_tx;
++	u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
++
++	/* Payload */
++	pad_mii_tx.d32_os    = 3; /* TXD[3:2] output stage: */
++				  /*          high noise/high speed */
++	pad_mii_tx.d10_os    = 3; /* TXD[1:0] output stage: */
++				  /*          high noise/high speed */
++	pad_mii_tx.d32_ipud  = 2; /* TXD[3:2] input stage: */
++				  /*          plain input (default) */
++	pad_mii_tx.d10_ipud  = 2; /* TXD[1:0] input stage: */
++				  /*          plain input (default) */
++	pad_mii_tx.ctrl_os   = 3; /* TX_CTL / TX_ER output stage */
++	pad_mii_tx.ctrl_ipud = 2; /* TX_CTL / TX_ER input stage (default) */
++	pad_mii_tx.clk_os    = 3; /* TX_CLK output stage */
++	pad_mii_tx.clk_ih    = 0; /* TX_CLK input hysteresis (default) */
++	pad_mii_tx.clk_ipud  = 2; /* TX_CLK input stage (default) */
++	sja1105_cfg_pad_mii_tx_packing(packed_buf, &pad_mii_tx, PACK);
++
++	return scalp_sja1105_xfer_buf(priv, SPI_WRITE, reg_addr_pad_mii_tx[port],
++				packed_buf, SJA1105_SIZE_CGU_CMD);
++}
++
++static int scalp_sja1105_rgmii_clocking_setup(struct scalp_sja1105_private *priv, int port,
++					sja1105_mii_role_t role)
++{
++	//struct sja1105_mac_config_entry *mac;
++	sja1105_speed_t speed;
++	int rc;
++
++	//mac = priv->static_config.tables[BLK_IDX_MAC_CONFIG].entries;
++	speed = SJA1105_SPEED_10MBPS;
++
++	switch (speed) {
++	case SJA1105_SPEED_1000MBPS:
++		/* 1000Mbps, IDIV disabled (125 MHz) */
++		rc = sja1105_cgu_idiv_config(priv, port, false, 1);
++		break;
++	case SJA1105_SPEED_100MBPS:
++		/* 100Mbps, IDIV enabled, divide by 1 (25 MHz) */
++		rc = sja1105_cgu_idiv_config(priv, port, true, 1);
++		break;
++	case SJA1105_SPEED_10MBPS:
++		/* 10Mbps, IDIV enabled, divide by 10 (2.5 MHz) */
++		rc = sja1105_cgu_idiv_config(priv, port, true, 10);
++		break;
++	default:
++		rc = -EINVAL;
++	}
++
++	if (rc < 0) {
++		dev_err(dev, "Failed to configure idiv\n");
++		return rc;
++	}
++
++	rc = sja1105_cgu_rgmii_tx_clk_config(priv, port, speed);
++	if (rc < 0) {
++		dev_err(dev, "Failed to configure RGMII Tx clock\n");
++		return rc;
++	}
++
++	rc = sja1105_rgmii_cfg_pad_tx_config(priv, port);
++	if (rc < 0) {
++		dev_err(dev, "Failed to configure Tx pad registers\n");
++		return rc;
++	}
++
++	return 0;
++
++	// the following case is only relevant for non-T version
++	// of the chip, which have internal delay capability:
++	/*if (!priv->info->setup_rgmii_delay)
++		return 0;*/
++	/* The role has no hardware effect for RGMII. However we use it as
++	 * a proxy for this interface being a MAC-to-MAC connection, with
++	 * the RGMII internal delays needing to be applied by us.
++	 */
++	/*if (role == XMII_MAC)
++		return 0;
++
++	return priv->info->setup_rgmii_delay(priv, port);*/
++}
++
++
++static int scalp_sja1105_clocking_setup_port(struct scalp_sja1105_private *priv, int port)
++{
++	sja1105_mii_role_t role;
++	int rc;
++
++	/* MAC or PHY, for applicable types (not RGMII) */
++	role = priv->phy_mac[port];
++
++	rc = scalp_sja1105_rgmii_clocking_setup(priv, port, role);
++
++	return rc;
++}
++
++static int scalp_sja1105_clocking_setup(struct scalp_sja1105_private *priv)
++{
++	int port, rc;
++
++	for (port = 0; port < SJA1105_NUM_PORTS; port++) {
++		rc = scalp_sja1105_clocking_setup_port(priv, port);
++		if (rc < 0)
++			return rc;
++	}
++	return 0;
++}
++
++static int scalp_sja1105_init(struct scalp_sja1105_private *priv)
++{
++	int rc;
++
++    printf("DEBUG : scalp_sja1105_init START\n");
++
++	rc = scalp_sja1105_static_config_load(priv);
++	if (rc < 0) {
++		printf("Failed to load static config: %d\n", rc);
++		return rc;
++	}
++
++	priv->phy_mac[0] = XMII_PHY; /* East       , external delay = yes */
++	priv->phy_mac[1] = XMII_PHY; /* Local host , external delay = yes */
++	priv->phy_mac[2] = XMII_MAC; /* Bottom     , external delay = no  */
++	priv->phy_mac[3] = XMII_PHY; /* Top        , external delay = yes */
++	priv->phy_mac[4] = XMII_MAC; /* West       , external delay = no  */
++
++	// Configure the CGU (PHY link modes and speeds)
++	rc = scalp_sja1105_clocking_setup(priv);
++	if (rc < 0) {
++		printf("Failed to configure MII clocking: %d\n", rc);
++		return rc;
++	}
++
++	return 0;
++}
++
++static int scalp_sja1105_probe(struct udevice *dev)
++{
++    printf("DEBUG : scalp_sja1105_probe START\n");
++
++	pr_warn("scalp_sja1105_probe()\n");
++
++	struct scalp_sja1105_private *priv = dev_get_priv(dev);
++
++	int rc;
++
++	// FIXME: usefull ?
++	if (ofnode_valid(dev->node) && !ofnode_is_available(dev->node)) {
++		dev_dbg(dev, "switch disabled\n");
++		return -ENODEV;
++	}
++
++	priv->dev = dev;
++
++	rc = scalp_sja1105_check_device_id(priv);
++	if (rc < 0) {
++		dev_err(dev, "Device ID check failed: %d\n", rc);
++		return rc;
++	}
++	dev_dbg(dev, "Device ID check succeeded\n");
++
++	return scalp_sja1105_init(priv);
++}
++
++static const struct udevice_id scalp_sja1105_of_match[] = {
++	{ .compatible = "scalp,sja1105t"},
++	{},
++};
++
++U_BOOT_DRIVER(scalp_sja1105) = {
++	.name = "scalp_sja1105",
++	.id = UCLASS_SPI,
++	.of_match = scalp_sja1105_of_match,
++	.priv_auto_alloc_size		= sizeof(struct scalp_sja1105_private),
++	.probe = scalp_sja1105_probe,
++};
+diff --git a/drivers/scalp_sja1105/scalp_sja1105_static_config.h b/drivers/scalp_sja1105/scalp_sja1105_static_config.h
+new file mode 100644
+index 0000000000..3a736522b1
+--- /dev/null
++++ b/drivers/scalp_sja1105/scalp_sja1105_static_config.h
+@@ -0,0 +1,9 @@
++#ifndef _SCALP_SJA1105_STATIC_CONFIG_H
++#define _SCALP_SJA1105_STATIC_CONFIG_H
++
++static const uint8_t config_data_0[] = { 0x80, 0x20, 0x00, 0x00, 0x9E, 0x00, 0x03, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x21, 0x6F, 0x25, 0x6B, 0xFE, 0xF7, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF };
++static const uint8_t config_data_1[] = { 0x80, 0x20, 0x04, 0x00, 0xFE, 0xF7, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x13, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x13, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x13, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x13, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x13, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x13, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x13, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0x00, 0x00, 0x13, 0xFF, 0xFF, 0xFF, 0xFA, 0x2E, 0x19, 0xF8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x58, 0x60, 0x94, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0xC7, 0xEF, 0x16, 0xA7, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x6A, 0xF6, 0x23, 0x53, 0x10, 0x00, 0x00, 0x00, 0xF7, 0xBD, 0xF5, 0x8D, 0x10, 0x00, 0x00, 0x00, 0xEF, 0x7B, 0xF5, 0x8D, 0x10, 0x00, 0x00, 0x00, 0xDE, 0xF7, 0xF5, 0x8D, 0x10, 0x00, 0x00, 0x00, 0xBD, 0xEF, 0xF5, 0x8D, 0x10, 0x00, 0x00, 0x00, 0x7B, 0xDF, 0xF5, 0x8D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x04, 0xA6, 0x06, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0xDA, 0xB5, 0xBD, 0xC8, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00 };
++static const uint8_t config_data_2[] = { 0x80, 0x20, 0x08, 0x00, 0x07, 0xFC, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA3, 0x8C, 0xFC, 0x39, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x25, 0x0E, 0x7C, 0xBD, 0x00, 0x01, 0x25, 0xC0, 0x70, 0x94, 0x84, 0x50, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC8, 0xA7, 0xCE, 0xE6, 0x00, 0x71, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0xF7, 0x04, 0xB9, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x57, 0x1F, 0x81, 0x3F, 0x06, 0x44, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0D, 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xCE, 0xDD, 0x8B, 0x4F, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x3A, 0x5D, 0x5E, 0x24, 0x59, 0x6C, 0x00, 0x00 };
++static const uint8_t config_data_3[] = { 0x80, 0x20, 0x0C, 0x00, 0xFA, 0xBB, 0x12, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0x65, 0xAA, 0x65 };
++
++#endif
+\ No newline at end of file
+diff --git a/include/linux/packing.h b/include/linux/packing.h
+new file mode 100644
+index 0000000000..c2741b8d2e
+--- /dev/null
++++ b/include/linux/packing.h
+@@ -0,0 +1,49 @@
++/* SPDX-License-Identifier: BSD-3-Clause
++ * Copyright (c) 2016-2018, NXP Semiconductors
++ * Copyright (c) 2018-2019, Vladimir Oltean <olteanv@gmail.com>
++ */
++#ifndef _LINUX_PACKING_H
++#define _LINUX_PACKING_H
++
++#include <linux/types.h>
++#include <linux/bitops.h>
++
++#define QUIRK_MSB_ON_THE_RIGHT	BIT(0)
++#define QUIRK_LITTLE_ENDIAN	BIT(1)
++#define QUIRK_LSW32_IS_FIRST	BIT(2)
++
++enum packing_op {
++	PACK,
++	UNPACK,
++};
++
++/**
++ * packing - Convert numbers (currently u64) between a packed and an unpacked
++ *	     format. Unpacked means laid out in memory in the CPU's native
++ *	     understanding of integers, while packed means anything else that
++ *	     requires translation.
++ *
++ * @pbuf: Pointer to a buffer holding the packed value.
++ * @uval: Pointer to an u64 holding the unpacked value.
++ * @startbit: The index (in logical notation, compensated for quirks) where
++ *	      the packed value starts within pbuf. Must be larger than, or
++ *	      equal to, endbit.
++ * @endbit: The index (in logical notation, compensated for quirks) where
++ *	    the packed value ends within pbuf. Must be smaller than, or equal
++ *	    to, startbit.
++ * @op: If PACK, then uval will be treated as const pointer and copied (packed)
++ *	into pbuf, between startbit and endbit.
++ *	If UNPACK, then pbuf will be treated as const pointer and the logical
++ *	value between startbit and endbit will be copied (unpacked) to uval.
++ * @quirks: A bit mask of QUIRK_LITTLE_ENDIAN, QUIRK_LSW32_IS_FIRST and
++ *	    QUIRK_MSB_ON_THE_RIGHT.
++ *
++ * Return: 0 on success, EINVAL or ERANGE if called incorrectly. Assuming
++ *	   correct usage, return code may be discarded.
++ *	   If op is PACK, pbuf is modified.
++ *	   If op is UNPACK, uval is modified.
++ */
++int packing(void *pbuf, u64 *uval, int startbit, int endbit, size_t pbuflen,
++	    enum packing_op op, u8 quirks);
++
++#endif
+\ No newline at end of file
+diff --git a/lib/Kconfig b/lib/Kconfig
+index 965cf7bc03..a828b80a40 100644
+--- a/lib/Kconfig
++++ b/lib/Kconfig
+@@ -33,6 +33,23 @@ config HAVE_PRIVATE_LIBGCC
+ config LIB_UUID
+ 	bool
+
++config PACKING
++	bool "Generic bitfield packing and unpacking"
++	default n
++	help
++	  This option provides the packing() helper function, which permits
++	  converting bitfields between a CPU-usable representation and a
++	  memory representation that can have any combination of these quirks:
++	    - Is little endian (bytes are reversed within a 32-bit group)
++	    - The least-significant 32-bit word comes first (within a 64-bit
++	      group)
++	    - The most significant bit of a byte is at its right (bit 0 of a
++	      register description is numerically 2^7).
++	  Drivers may use these helpers to match the bit indices as described
++	  in the data sheets of the peripherals they are in control of.
++
++	  When in doubt, say N.
++
+ config PRINTF
+ 	bool
+ 	default y
+diff --git a/lib/Makefile b/lib/Makefile
+index 1fb650cd90..4f99bd47c2 100644
+--- a/lib/Makefile
++++ b/lib/Makefile
+@@ -104,6 +104,7 @@ obj-y += hexdump.o
+ obj-$(CONFIG_TRACE) += trace.o
+ obj-$(CONFIG_LIB_UUID) += uuid.o
+ obj-$(CONFIG_LIB_RAND) += rand.o
++obj-$(CONFIG_PACKING) += packing.o
+ obj-y += panic.o
+
+ ifeq ($(CONFIG_$(SPL_TPL_)BUILD),y)
+diff --git a/lib/packing.c b/lib/packing.c
+new file mode 100644
+index 0000000000..ec576ea6c0
+--- /dev/null
++++ b/lib/packing.c
+@@ -0,0 +1,208 @@
++// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
++/* Copyright (c) 2016-2018, NXP Semiconductors
++ * Copyright (c) 2018-2019, Vladimir Oltean <olteanv@gmail.com>
++ */
++#include <linux/packing.h>
++#include <linux/bitops.h>
++#include <linux/errno.h>
++#include <linux/types.h>
++
++static int get_le_offset(int offset)
++{
++	int closest_multiple_of_4;
++
++	closest_multiple_of_4 = (offset / 4) * 4;
++	offset -= closest_multiple_of_4;
++	return closest_multiple_of_4 + (3 - offset);
++}
++
++static int get_reverse_lsw32_offset(int offset, size_t len)
++{
++	int closest_multiple_of_4;
++	int word_index;
++
++	word_index = offset / 4;
++	closest_multiple_of_4 = word_index * 4;
++	offset -= closest_multiple_of_4;
++	word_index = (len / 4) - word_index - 1;
++	return word_index * 4 + offset;
++}
++
++static u64 bit_reverse(u64 val, unsigned int width)
++{
++	u64 new_val = 0;
++	unsigned int bit;
++	unsigned int i;
++
++	for (i = 0; i < width; i++) {
++		bit = (val & (1 << i)) != 0;
++		new_val |= (bit << (width - i - 1));
++	}
++	return new_val;
++}
++
++static void adjust_for_msb_right_quirk(u64 *to_write, int *box_start_bit,
++				       int *box_end_bit, u8 *box_mask)
++{
++	int box_bit_width = *box_start_bit - *box_end_bit + 1;
++	int new_box_start_bit, new_box_end_bit;
++
++	*to_write >>= *box_end_bit;
++	*to_write = bit_reverse(*to_write, box_bit_width);
++	*to_write <<= *box_end_bit;
++
++	new_box_end_bit   = box_bit_width - *box_start_bit - 1;
++	new_box_start_bit = box_bit_width - *box_end_bit - 1;
++	*box_mask = GENMASK_ULL(new_box_start_bit, new_box_end_bit);
++	*box_start_bit = new_box_start_bit;
++	*box_end_bit   = new_box_end_bit;
++}
++
++/**
++ * packing - Convert numbers (currently u64) between a packed and an unpacked
++ *	     format. Unpacked means laid out in memory in the CPU's native
++ *	     understanding of integers, while packed means anything else that
++ *	     requires translation.
++ *
++ * @pbuf: Pointer to a buffer holding the packed value.
++ * @uval: Pointer to an u64 holding the unpacked value.
++ * @startbit: The index (in logical notation, compensated for quirks) where
++ *	      the packed value starts within pbuf. Must be larger than, or
++ *	      equal to, endbit.
++ * @endbit: The index (in logical notation, compensated for quirks) where
++ *	    the packed value ends within pbuf. Must be smaller than, or equal
++ *	    to, startbit.
++ * @op: If PACK, then uval will be treated as const pointer and copied (packed)
++ *	into pbuf, between startbit and endbit.
++ *	If UNPACK, then pbuf will be treated as const pointer and the logical
++ *	value between startbit and endbit will be copied (unpacked) to uval.
++ * @quirks: A bit mask of QUIRK_LITTLE_ENDIAN, QUIRK_LSW32_IS_FIRST and
++ *	    QUIRK_MSB_ON_THE_RIGHT.
++ *
++ * Return: 0 on success, EINVAL or ERANGE if called incorrectly. Assuming
++ *	   correct usage, return code may be discarded.
++ *	   If op is PACK, pbuf is modified.
++ *	   If op is UNPACK, uval is modified.
++ */
++int packing(void *pbuf, u64 *uval, int startbit, int endbit, size_t pbuflen,
++	    enum packing_op op, u8 quirks)
++{
++	/* Number of bits for storing "uval"
++	 * also width of the field to access in the pbuf
++	 */
++	u64 value_width;
++	/* Logical byte indices corresponding to the
++	 * start and end of the field.
++	 */
++	int plogical_first_u8, plogical_last_u8, box;
++
++	/* startbit is expected to be larger than endbit */
++	if (startbit < endbit)
++		/* Invalid function call */
++		return -EINVAL;
++
++	value_width = startbit - endbit + 1;
++	if (value_width > 64)
++		return -ERANGE;
++
++	/* Check if "uval" fits in "value_width" bits.
++	 * If value_width is 64, the check will fail, but any
++	 * 64-bit uval will surely fit.
++	 */
++	if (op == PACK && value_width < 64 && (*uval >= (1ull << value_width)))
++		/* Cannot store "uval" inside "value_width" bits.
++		 * Truncating "uval" is most certainly not desirable,
++		 * so simply erroring out is appropriate.
++		 */
++		return -ERANGE;
++
++	/* Initialize parameter */
++	if (op == UNPACK)
++		*uval = 0;
++
++	/* Iterate through an idealistic view of the pbuf as an u64 with
++	 * no quirks, u8 by u8 (aligned at u8 boundaries), from high to low
++	 * logical bit significance. "box" denotes the current logical u8.
++	 */
++	plogical_first_u8 = startbit / 8;
++	plogical_last_u8  = endbit / 8;
++
++	for (box = plogical_first_u8; box >= plogical_last_u8; box--) {
++		/* Bit indices into the currently accessed 8-bit box */
++		int box_start_bit, box_end_bit, box_addr;
++		u8  box_mask;
++		/* Corresponding bits from the unpacked u64 parameter */
++		int proj_start_bit, proj_end_bit;
++		u64 proj_mask;
++
++		/* This u8 may need to be accessed in its entirety
++		 * (from bit 7 to bit 0), or not, depending on the
++		 * input arguments startbit and endbit.
++		 */
++		if (box == plogical_first_u8)
++			box_start_bit = startbit % 8;
++		else
++			box_start_bit = 7;
++		if (box == plogical_last_u8)
++			box_end_bit = endbit % 8;
++		else
++			box_end_bit = 0;
++
++		/* We have determined the box bit start and end.
++		 * Now we calculate where this (masked) u8 box would fit
++		 * in the unpacked (CPU-readable) u64 - the u8 box's
++		 * projection onto the unpacked u64. Though the
++		 * box is u8, the projection is u64 because it may fall
++		 * anywhere within the unpacked u64.
++		 */
++		proj_start_bit = ((box * 8) + box_start_bit) - endbit;
++		proj_end_bit   = ((box * 8) + box_end_bit) - endbit;
++		proj_mask = GENMASK_ULL(proj_start_bit, proj_end_bit);
++		box_mask  = GENMASK_ULL(box_start_bit, box_end_bit);
++
++		/* Determine the offset of the u8 box inside the pbuf,
++		 * adjusted for quirks. The adjusted box_addr will be used for
++		 * effective addressing inside the pbuf (so it's not
++		 * logical any longer).
++		 */
++		box_addr = pbuflen - box - 1;
++		if (quirks & QUIRK_LITTLE_ENDIAN)
++			box_addr = get_le_offset(box_addr);
++		if (quirks & QUIRK_LSW32_IS_FIRST)
++			box_addr = get_reverse_lsw32_offset(box_addr,
++							    pbuflen);
++
++		if (op == UNPACK) {
++			u64 pval;
++
++			/* Read from pbuf, write to uval */
++			pval = ((u8 *)pbuf)[box_addr] & box_mask;
++			if (quirks & QUIRK_MSB_ON_THE_RIGHT)
++				adjust_for_msb_right_quirk(&pval,
++							   &box_start_bit,
++							   &box_end_bit,
++							   &box_mask);
++
++			pval >>= box_end_bit;
++			pval <<= proj_end_bit;
++			*uval &= ~proj_mask;
++			*uval |= pval;
++		} else {
++			u64 pval;
++
++			/* Write to pbuf, read from uval */
++			pval = (*uval) & proj_mask;
++			pval >>= proj_end_bit;
++			if (quirks & QUIRK_MSB_ON_THE_RIGHT)
++				adjust_for_msb_right_quirk(&pval,
++							   &box_start_bit,
++							   &box_end_bit,
++							   &box_mask);
++
++			pval <<= box_end_bit;
++			((u8 *)pbuf)[box_addr] &= ~box_mask;
++			((u8 *)pbuf)[box_addr] |= pval;
++		}
++	}
++	return 0;
++}
+\ No newline at end of file
diff --git a/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/u-boot-scalp-sja1105-official.patch b/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/u-boot-scalp-sja1105-official.patch
new file mode 100644
index 0000000..c23166e
--- /dev/null
+++ b/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/u-boot-scalp-sja1105-official.patch
@@ -0,0 +1,3280 @@
+diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
+index 2d606b0dbb..b6f74f7320 100644
+--- a/drivers/net/Kconfig
++++ b/drivers/net/Kconfig
+@@ -37,6 +37,19 @@ config DM_MDIO_MUX
+ 	  This is currently implemented in net/mdio-mux-uclass.c
+ 	  Look in include/miiphy.h for details.
+ 
++config DM_DSA
++	bool "Enable Driver Model for DSA switches"
++	depends on DM_ETH && DM_MDIO
++	help
++	  Enable Driver Model for DSA switches
++
++	  Adds UCLASS_DSA class supporting switches that follow the Distributed
++	  Switch Architecture (DSA).  These switches rely on the presence of a
++	  management switch port connected to an Ethernet controller capable of
++	  receiving frames from the switch.  This host Ethernet controller is
++	  called "master" and "cpu" in DSA terminology.
++	  This is currently implemented in net/dsa-uclass.c
++
+ config MDIO_SANDBOX
+ 	depends on DM_MDIO && SANDBOX
+ 	default y
+@@ -57,6 +70,14 @@ config MDIO_MUX_SANDBOX
+ 
+ 	  This driver is used for testing in test/dm/mdio.c
+ 
++config DSA_SANDBOX
++	depends on DM_DSA && SANDBOX
++	default y
++	bool "Sandbox: Mocked DSA driver"
++	help
++	  This driver implements a dummy switch and a dummy Ethernet device used
++	  to test DSA class code.
++
+ menuconfig NETDEVICES
+ 	bool "Network device support"
+ 	depends on NET
+@@ -360,6 +381,23 @@ config RTL8169
+ 	  This driver supports Realtek 8169 series gigabit ethernet family of
+ 	  PCI/PCIe chipsets/adapters.
+ 
++config SJA1105
++	bool "NXP SJA1105 Ethernet switch family driver"
++	depends on DM_DSA && DM_SPI
++	select BITREVERSE
++	select PACKING
++	help
++	  This is the driver for the NXP SJA1105 automotive Ethernet switch
++	  family. These are 5-port devices and are managed over an SPI
++	  interface. Probing is handled based on OF bindings. The driver
++	  supports the following revisions:
++	    - SJA1105E (Gen. 1, No TT-Ethernet)
++	    - SJA1105T (Gen. 1, TT-Ethernet)
++	    - SJA1105P (Gen. 2, No SGMII, No TT-Ethernet)
++	    - SJA1105Q (Gen. 2, No SGMII, TT-Ethernet)
++	    - SJA1105R (Gen. 2, SGMII, No TT-Ethernet)
++	    - SJA1105S (Gen. 2, SGMII, TT-Ethernet)
++
+ config SMC911X
+ 	bool "SMSC LAN911x and LAN921x controller driver"
+ 
+diff --git a/drivers/net/Makefile b/drivers/net/Makefile
+index 30991834ec..67204ef3f4 100644
+--- a/drivers/net/Makefile
++++ b/drivers/net/Makefile
+@@ -22,6 +22,7 @@ obj-$(CONFIG_DNET) += dnet.o
+ obj-$(CONFIG_E1000) += e1000.o
+ obj-$(CONFIG_E1000_SPI) += e1000_spi.o
+ obj-$(CONFIG_EEPRO100) += eepro100.o
++obj-$(CONFIG_SJA1105) += sja1105.o
+ obj-$(CONFIG_SUN4I_EMAC) += sunxi_emac.o
+ obj-$(CONFIG_SUN8I_EMAC) += sun8i_emac.o
+ obj-$(CONFIG_EP93XX) += ep93xx_eth.o
+@@ -82,3 +83,4 @@ obj-y += mscc_eswitch/
+ obj-$(CONFIG_HIGMACV300_ETH) += higmacv300.o
+ obj-$(CONFIG_MDIO_SANDBOX) += mdio_sandbox.o
+ obj-$(CONFIG_FSL_ENETC) += fsl_enetc.o fsl_enetc_mdio.o
++obj-$(CONFIG_DSA_SANDBOX) += dsa_sandbox.o
+diff --git a/drivers/net/dsa_sandbox.c b/drivers/net/dsa_sandbox.c
+new file mode 100644
+index 0000000000..eb98274430
+--- /dev/null
++++ b/drivers/net/dsa_sandbox.c
+@@ -0,0 +1,272 @@
++// SPDX-License-Identifier: GPL-2.0+
++/*
++ * Copyright 2019 NXP
++ */
++
++#include <net/dsa.h>
++
++#define DSA_SANDBOX_MAGIC	0x00415344
++#define DSA_SANDBOX_TAG_LEN	sizeof(struct dsa_sandbox_tag)
++/*
++ * This global flag is used to enable DSA just for DSA test so it doesn't affect
++ * the existing eth unit test.
++ */
++int dsa_sandbox_port_mask;
++
++struct dsa_sandbox_priv {
++	int enabled;
++	int port_enabled;
++};
++
++struct dsa_sandbox_tag {
++	u32 magic;
++	u32 port;
++};
++
++static int dsa_sandbox_port_enable(struct udevice *dev, int port,
++				   struct phy_device *phy)
++{
++	struct dsa_sandbox_priv *priv = dev->priv;
++
++	if (!priv->enabled)
++		return -EFAULT;
++
++	priv->port_enabled |= BIT(port);
++
++	return 0;
++}
++
++static void dsa_sandbox_port_disable(struct udevice *dev, int port,
++				     struct phy_device *phy)
++{
++	struct dsa_sandbox_priv *priv = dev->priv;
++
++	if (!priv->enabled)
++		return;
++
++	priv->port_enabled &= ~BIT(port);
++}
++
++static int dsa_sandbox_xmit(struct udevice *dev, int port, void *packet,
++			    int length)
++{
++	struct dsa_sandbox_priv *priv = dev->priv;
++	struct dsa_sandbox_tag *tag = packet;
++
++	if (!priv->enabled)
++		return -EFAULT;
++
++	if (!(priv->port_enabled & BIT(port)))
++		return -EFAULT;
++
++	tag->magic = DSA_SANDBOX_MAGIC;
++	tag->port = port;
++
++	return 0;
++}
++
++static int dsa_sandbox_rcv(struct udevice *dev, int *port, void *packet,
++			   int length)
++{
++	struct dsa_sandbox_priv *priv = dev->priv;
++	struct dsa_sandbox_tag *tag = packet;
++
++	if (!priv->enabled)
++		return -EFAULT;
++
++	if (tag->magic != DSA_SANDBOX_MAGIC)
++		return -EFAULT;
++
++	*port = tag->port;
++	if (!(priv->port_enabled & BIT(*port)))
++		return -EFAULT;
++
++	return 0;
++}
++
++static const struct dsa_ops dsa_sandbox_ops = {
++	.port_enable = dsa_sandbox_port_enable,
++	.port_disable = dsa_sandbox_port_disable,
++	.xmit = dsa_sandbox_xmit,
++	.rcv = dsa_sandbox_rcv,
++};
++
++static int dsa_sandbox_bind(struct udevice *dev)
++{
++	struct dsa_perdev_platdata *pdata = dev->platdata;
++
++	/* must be at least 4 to match sandbox test DT */
++	pdata->num_ports = 4;
++	pdata->headroom = DSA_SANDBOX_TAG_LEN;
++
++	return 0;
++}
++
++static int dsa_sandbox_probe(struct udevice *dev)
++{
++	struct dsa_sandbox_priv *priv = dev_get_priv(dev);
++
++	/*
++	 * return error if DSA is not being tested so we don't break existing
++	 * eth test.
++	 */
++	if (!dsa_sandbox_port_mask)
++		return -EINVAL;
++
++	priv->enabled = 1;
++
++	return 0;
++}
++
++static int dsa_sandbox_remove(struct udevice *dev)
++{
++	struct dsa_sandbox_priv *priv = dev_get_priv(dev);
++
++	priv->enabled = 0;
++
++	return 0;
++}
++
++static const struct udevice_id dsa_sandbox_ids[] = {
++	{ .compatible = "sandbox,dsa" },
++	{ }
++};
++
++U_BOOT_DRIVER(dsa_sandbox) = {
++	.name		= "dsa_sandbox",
++	.id		= UCLASS_DSA,
++	.of_match	= dsa_sandbox_ids,
++	.bind		= dsa_sandbox_bind,
++	.probe		= dsa_sandbox_probe,
++	.remove		= dsa_sandbox_remove,
++	.ops		= &dsa_sandbox_ops,
++	.priv_auto_alloc_size = sizeof(struct dsa_sandbox_priv),
++	.platdata_auto_alloc_size = sizeof(struct dsa_perdev_platdata),
++};
++
++struct dsa_sandbox_eth_priv {
++	int enabled;
++	int started;
++	int packet_length;
++	uchar packet[DSA_MAX_FRAME_SIZE];
++};
++
++static int dsa_eth_sandbox_start(struct udevice *dev)
++{
++	struct dsa_sandbox_eth_priv *priv = dev->priv;
++
++	if (!priv->enabled)
++		return -EFAULT;
++
++	priv->started = 1;
++
++	return 0;
++}
++
++static void dsa_eth_sandbox_stop(struct udevice *dev)
++{
++	struct dsa_sandbox_eth_priv *priv = dev->priv;
++
++	if (!priv->enabled)
++		return;
++
++	priv->started = 0;
++}
++
++static int dsa_eth_sandbox_send(struct udevice *dev, void *packet, int length)
++{
++	struct dsa_sandbox_eth_priv *priv = dev->priv;
++	struct dsa_sandbox_tag *tag = packet;
++
++	if (!priv->enabled || !priv->started)
++		return -EFAULT;
++
++	memcpy(priv->packet, packet, length);
++	priv->packet_length = length;
++
++	/*
++	 * for DSA test frames we only respond if the associated port is enabled
++	 * in the dsa test port mask
++	 */
++
++	if (tag->magic == DSA_SANDBOX_MAGIC) {
++		int port = tag->port;
++
++		if (!(dsa_sandbox_port_mask & BIT(port)))
++			/* drop the frame, port is not enabled */
++			priv->packet_length = 0;
++	}
++
++	return 0;
++}
++
++static int dsa_eth_sandbox_recv(struct udevice *dev, int flags, uchar **packetp)
++{
++	struct dsa_sandbox_eth_priv *priv = dev->priv;
++	int length = priv->packet_length;
++
++	if (!priv->enabled || !priv->started)
++		return -EFAULT;
++
++	if (!length) {
++		/* no frames pending, force a time-out */
++		timer_test_add_offset(100);
++		return -EAGAIN;
++	}
++
++	*packetp = priv->packet;
++	priv->packet_length = 0;
++
++	return length;
++}
++
++static const struct eth_ops dsa_eth_sandbox_ops = {
++	.start	= dsa_eth_sandbox_start,
++	.send	= dsa_eth_sandbox_send,
++	.recv	= dsa_eth_sandbox_recv,
++	.stop	= dsa_eth_sandbox_stop,
++};
++
++static int dsa_eth_sandbox_bind(struct udevice *dev)
++{
++	return 0;
++}
++
++static int dsa_eth_sandbox_probe(struct udevice *dev)
++{
++	struct dsa_sandbox_eth_priv *priv = dev->priv;
++
++	priv->enabled = 1;
++
++	/*
++	 * return error if DSA is not being tested do we don't break existing
++	 * eth test.
++	 */
++	return dsa_sandbox_port_mask ? 0 : -EINVAL;
++}
++
++static int dsa_eth_sandbox_remove(struct udevice *dev)
++{
++	struct dsa_sandbox_eth_priv *priv = dev->priv;
++
++	priv->enabled = 0;
++
++	return 0;
++}
++
++static const struct udevice_id dsa_eth_sandbox_ids[] = {
++	{ .compatible = "sandbox,dsa-eth" },
++	{ }
++};
++
++U_BOOT_DRIVER(dsa_eth_sandbox) = {
++	.name		= "dsa_eth_sandbox",
++	.id		= UCLASS_ETH,
++	.of_match	= dsa_eth_sandbox_ids,
++	.bind		= dsa_eth_sandbox_bind,
++	.probe		= dsa_eth_sandbox_probe,
++	.remove		= dsa_eth_sandbox_remove,
++	.ops		= &dsa_eth_sandbox_ops,
++	.platdata_auto_alloc_size = sizeof(struct eth_pdata),
++	.priv_auto_alloc_size = sizeof(struct dsa_sandbox_eth_priv),
++};
+diff --git a/drivers/net/sja1105.c b/drivers/net/sja1105.c
+new file mode 100644
+index 0000000000..775ec7774e
+--- /dev/null
++++ b/drivers/net/sja1105.c
+@@ -0,0 +1,2416 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * Copyright 2016-2018,2020 NXP
++ * Copyright 2018, Sensor-Technik Wiedemann GmbH
++ *
++ * Ported from Linux (drivers/net/dsa/sja1105/).
++ */
++
++#include <common.h>
++#include <linux/if_vlan.h>
++#include <linux/packing.h>
++#include <linux/bitrev.h>
++#include <net/dsa.h>
++#include <stdlib.h>
++#include <spi.h>
++
++#define ETHER_CRC32_POLY				0x04C11DB7
++#define ETH_P_SJA1105					0xdadb
++#define SJA1105_NUM_PORTS				5
++#define SJA1105_NUM_TC					8
++#define SJA1105ET_FDB_BIN_SIZE				4
++#define SJA1105_SIZE_CGU_CMD				4
++#define SJA1105_SIZE_RESET_CMD				4
++#define SJA1105_SIZE_SPI_MSG_HEADER			4
++#define SJA1105_SIZE_SPI_MSG_MAXLEN			(64 * 4)
++#define SJA1105_SIZE_DEVICE_ID				4
++#define SJA1105_SIZE_TABLE_HEADER			12
++#define SJA1105_SIZE_L2_POLICING_ENTRY			8
++#define SJA1105_SIZE_VLAN_LOOKUP_ENTRY			8
++#define SJA1105_SIZE_L2_FORWARDING_ENTRY		8
++#define SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY		12
++#define SJA1105_SIZE_XMII_PARAMS_ENTRY			4
++#define SJA1105ET_SIZE_MAC_CONFIG_ENTRY			28
++#define SJA1105ET_SIZE_L2_LOOKUP_PARAMS_ENTRY		4
++#define SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY		40
++#define SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY		32
++#define SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY		16
++#define SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY		44
++
++#define SJA1105_MAX_L2_LOOKUP_COUNT			1024
++#define SJA1105_MAX_L2_POLICING_COUNT			45
++#define SJA1105_MAX_VLAN_LOOKUP_COUNT			4096
++#define SJA1105_MAX_L2_FORWARDING_COUNT			13
++#define SJA1105_MAX_MAC_CONFIG_COUNT			5
++#define SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT		1
++#define SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT		1
++#define SJA1105_MAX_GENERAL_PARAMS_COUNT		1
++#define SJA1105_MAX_XMII_PARAMS_COUNT			1
++
++#define SJA1105_SGMII_PORT				4
++
++/* DIGITAL_CONTROL_1 (address 1f8000h) */
++#define SJA1105_DC1_EN_VSMMD1				BIT(13)
++#define SJA1105_DC1_CLOCK_STOP_EN			BIT(10)
++#define SJA1105_DC1_MAC_AUTO_SW				BIT(9)
++#define SJA1105_DC1_INIT				BIT(8)
++
++/* DIGITAL_CONTROL_2 register (address 1f80e1h) */
++#define SJA1105_DC2_TX_POL_INV_DISABLE			BIT(4)
++#define SJA1105_DC2_RX_POL_INV				BIT(0)
++
++/* AUTONEG_CONTROL register (address 1f8001h) */
++#define SJA1105_AC_SGMII_LINK				BIT(4)
++#define SJA1105_AC_PHY_MODE				BIT(3)
++#define SJA1105_AC_AUTONEG_MODE_SGMII			(2 << 1)
++
++#define SJA1105_MAX_FRAME_MEMORY			929
++
++#define SJA1105E_DEVICE_ID				0x9C00000Cull
++#define SJA1105T_DEVICE_ID				0x9E00030Eull
++#define SJA1105PR_DEVICE_ID				0xAF00030Eull
++#define SJA1105QS_DEVICE_ID				0xAE00030Eull
++
++#define SJA1105ET_PART_NO				0x9A83
++#define SJA1105P_PART_NO				0x9A84
++#define SJA1105Q_PART_NO				0x9A85
++#define SJA1105R_PART_NO				0x9A86
++#define SJA1105S_PART_NO				0x9A87
++
++#define DSA_8021Q_DIR_RX		BIT(10)
++#define DSA_8021Q_PORT_SHIFT		0
++#define DSA_8021Q_PORT_MASK		GENMASK(3, 0)
++#define DSA_8021Q_PORT(x)		(((x) << DSA_8021Q_PORT_SHIFT) & \
++						 DSA_8021Q_PORT_MASK)
++
++#define SJA1105_RATE_MBPS(speed) (((speed) * 64000) / 1000)
++
++/* UM10944.pdf Page 11, Table 2. Configuration Blocks */
++enum {
++	BLKID_L2_POLICING				= 0x06,
++	BLKID_VLAN_LOOKUP				= 0x07,
++	BLKID_L2_FORWARDING				= 0x08,
++	BLKID_MAC_CONFIG				= 0x09,
++	BLKID_L2_LOOKUP_PARAMS				= 0x0D,
++	BLKID_L2_FORWARDING_PARAMS			= 0x0E,
++	BLKID_GENERAL_PARAMS				= 0x11,
++	BLKID_XMII_PARAMS				= 0x4E,
++};
++
++enum sja1105_blk_idx {
++	BLK_IDX_L2_POLICING = 0,
++	BLK_IDX_VLAN_LOOKUP,
++	BLK_IDX_L2_FORWARDING,
++	BLK_IDX_MAC_CONFIG,
++	BLK_IDX_L2_LOOKUP_PARAMS,
++	BLK_IDX_L2_FORWARDING_PARAMS,
++	BLK_IDX_GENERAL_PARAMS,
++	BLK_IDX_XMII_PARAMS,
++	BLK_IDX_MAX,
++};
++
++struct sja1105_general_params_entry {
++	u64 mac_fltres1;
++	u64 mac_fltres0;
++	u64 mac_flt1;
++	u64 mac_flt0;
++	u64 casc_port;
++	u64 host_port;
++	u64 mirr_port;
++	u64 tpid;
++	u64 tpid2;
++};
++
++struct sja1105_vlan_lookup_entry {
++	u64 vmemb_port;
++	u64 vlan_bc;
++	u64 tag_port;
++	u64 vlanid;
++};
++
++struct sja1105_l2_lookup_params_entry {
++	u64 maxaddrp[5];
++	u64 start_dynspc;
++	u64 use_static;
++	u64 owr_dyn;
++	u64 dyn_tbsz;
++	u64 poly;
++};
++
++struct sja1105_l2_forwarding_entry {
++	u64 bc_domain;
++	u64 reach_port;
++	u64 fl_domain;
++};
++
++struct sja1105_l2_forwarding_params_entry {
++	u64 part_spc[8];
++};
++
++struct sja1105_l2_policing_entry {
++	u64 sharindx;
++	u64 smax;
++	u64 rate;
++	u64 maxlen;
++	u64 partition;
++};
++
++struct sja1105_mac_config_entry {
++	u64 top[8];
++	u64 base[8];
++	u64 enabled[8];
++	u64 speed;
++	u64 maxage;
++	u64 vlanprio;
++	u64 vlanid;
++	u64 dyn_learn;
++	u64 egress;
++	u64 ingress;
++};
++
++struct sja1105_xmii_params_entry {
++	u64 phy_mac[5];
++	u64 xmii_mode[5];
++};
++
++struct sja1105_table_header {
++	u64 block_id;
++	u64 len;
++	u64 crc;
++};
++
++struct sja1105_table_ops {
++	size_t (*packing)(void *buf, void *entry_ptr, enum packing_op op);
++	size_t unpacked_entry_size;
++	size_t packed_entry_size;
++	size_t max_entry_count;
++};
++
++struct sja1105_table {
++	const struct sja1105_table_ops *ops;
++	size_t entry_count;
++	void *entries;
++};
++
++struct sja1105_static_config {
++	u64 device_id;
++	struct sja1105_table tables[BLK_IDX_MAX];
++};
++
++struct sja1105_sgmii_cfg {
++	bool inband_an;
++	u16 pcs_speed;
++};
++
++struct sja1105_private {
++	struct sja1105_static_config static_config;
++	bool rgmii_rx_delay[SJA1105_NUM_PORTS];
++	bool rgmii_tx_delay[SJA1105_NUM_PORTS];
++	int phy_modes[SJA1105_NUM_PORTS];
++	u16 pvid[SJA1105_NUM_PORTS];
++	struct sja1105_sgmii_cfg sgmii_cfg;
++	const struct sja1105_info *info;
++	struct udevice *dev;
++};
++
++typedef enum {
++	SPI_READ = 0,
++	SPI_WRITE = 1,
++} sja1105_spi_rw_mode_t;
++
++typedef enum {
++	XMII_MAC = 0,
++	XMII_PHY = 1,
++} sja1105_mii_role_t;
++
++typedef enum {
++	XMII_MODE_MII		= 0,
++	XMII_MODE_RMII		= 1,
++	XMII_MODE_RGMII		= 2,
++	XMII_MODE_SGMII		= 3,
++} sja1105_phy_interface_t;
++
++typedef enum {
++	SJA1105_SPEED_10MBPS	= 3,
++	SJA1105_SPEED_100MBPS	= 2,
++	SJA1105_SPEED_1000MBPS	= 1,
++} sja1105_speed_t;
++
++/* Keeps the different addresses between E/T and P/Q/R/S */
++struct sja1105_regs {
++	u64 device_id;
++	u64 prod_id;
++	u64 status;
++	u64 port_control;
++	u64 rgu;
++	u64 config;
++	u64 sgmii;
++	u64 rmii_pll1;
++	u64 pad_mii_tx[SJA1105_NUM_PORTS];
++	u64 pad_mii_id[SJA1105_NUM_PORTS];
++	u64 cgu_idiv[SJA1105_NUM_PORTS];
++	u64 mii_tx_clk[SJA1105_NUM_PORTS];
++	u64 mii_rx_clk[SJA1105_NUM_PORTS];
++	u64 mii_ext_tx_clk[SJA1105_NUM_PORTS];
++	u64 mii_ext_rx_clk[SJA1105_NUM_PORTS];
++	u64 rgmii_tx_clk[SJA1105_NUM_PORTS];
++	u64 rmii_ref_clk[SJA1105_NUM_PORTS];
++	u64 rmii_ext_tx_clk[SJA1105_NUM_PORTS];
++};
++
++struct sja1105_info {
++	u64 device_id;
++	u64 part_no;
++	const struct sja1105_table_ops *static_ops;
++	const struct sja1105_regs *regs;
++	int (*reset_cmd)(struct sja1105_private *priv);
++	int (*setup_rgmii_delay)(struct sja1105_private *priv, int port);
++	const char *name;
++};
++
++struct sja1105_chunk {
++	u8	*buf;
++	size_t	len;
++	u64	reg_addr;
++};
++
++struct sja1105_spi_message {
++	u64 access;
++	u64 read_count;
++	u64 address;
++};
++
++struct sja1105_cfg_pad_mii_tx {
++	u64 d32_os;
++	u64 d32_ipud;
++	u64 d10_os;
++	u64 d10_ipud;
++	u64 ctrl_os;
++	u64 ctrl_ipud;
++	u64 clk_os;
++	u64 clk_ih;
++	u64 clk_ipud;
++};
++
++struct sja1105_cfg_pad_mii_id {
++	u64 rxc_stable_ovr;
++	u64 rxc_delay;
++	u64 rxc_bypass;
++	u64 rxc_pd;
++	u64 txc_stable_ovr;
++	u64 txc_delay;
++	u64 txc_bypass;
++	u64 txc_pd;
++};
++
++struct sja1105_cgu_idiv {
++	u64 clksrc;
++	u64 autoblock;
++	u64 idiv;
++	u64 pd;
++};
++
++struct sja1105_cgu_pll_ctrl {
++	u64 pllclksrc;
++	u64 msel;
++	u64 autoblock;
++	u64 psel;
++	u64 direct;
++	u64 fbsel;
++	u64 bypass;
++	u64 pd;
++};
++
++enum {
++	CLKSRC_MII0_TX_CLK	= 0x00,
++	CLKSRC_MII0_RX_CLK	= 0x01,
++	CLKSRC_MII1_TX_CLK	= 0x02,
++	CLKSRC_MII1_RX_CLK	= 0x03,
++	CLKSRC_MII2_TX_CLK	= 0x04,
++	CLKSRC_MII2_RX_CLK	= 0x05,
++	CLKSRC_MII3_TX_CLK	= 0x06,
++	CLKSRC_MII3_RX_CLK	= 0x07,
++	CLKSRC_MII4_TX_CLK	= 0x08,
++	CLKSRC_MII4_RX_CLK	= 0x09,
++	CLKSRC_PLL0		= 0x0B,
++	CLKSRC_PLL1		= 0x0E,
++	CLKSRC_IDIV0		= 0x11,
++	CLKSRC_IDIV1		= 0x12,
++	CLKSRC_IDIV2		= 0x13,
++	CLKSRC_IDIV3		= 0x14,
++	CLKSRC_IDIV4		= 0x15,
++};
++
++struct sja1105_cgu_mii_ctrl {
++	u64 clksrc;
++	u64 autoblock;
++	u64 pd;
++};
++
++static void sja1105_packing(void *buf, u64 *val, int start, int end,
++			    size_t len, enum packing_op op)
++{
++	int rc;
++
++	rc = packing(buf, val, start, end, len, op, QUIRK_LSW32_IS_FIRST);
++	if (likely(!rc))
++		return;
++
++	printf("Invalid use of packing API: start %d end %d returned %d\n",
++	       start, end, rc);
++}
++
++static u32 crc32_add(u32 crc, u8 byte)
++{
++	u32 byte32 = bitrev32(byte);
++	int i;
++
++	for (i = 0; i < 8; i++) {
++		if ((crc ^ byte32) & BIT(31)) {
++			crc <<= 1;
++			crc ^= ETHER_CRC32_POLY;
++		} else {
++			crc <<= 1;
++		}
++		byte32 <<= 1;
++	}
++	return crc;
++}
++
++/* Little-endian Ethernet CRC32 of data packed as big-endian u32 words */
++static uint32_t sja1105_crc32(void *buf, size_t len)
++{
++	unsigned int i;
++	u64 chunk;
++	u32 crc;
++
++	/* seed */
++	crc = 0xFFFFFFFF;
++	for (i = 0; i < len; i += 4) {
++		sja1105_packing(buf + i, &chunk, 31, 0, 4, UNPACK);
++		crc = crc32_add(crc, chunk & 0xFF);
++		crc = crc32_add(crc, (chunk >> 8) & 0xFF);
++		crc = crc32_add(crc, (chunk >> 16) & 0xFF);
++		crc = crc32_add(crc, (chunk >> 24) & 0xFF);
++	}
++	return bitrev32(~crc);
++}
++
++static void sja1105_spi_message_pack(void *buf, struct sja1105_spi_message *msg)
++{
++	const int size = SJA1105_SIZE_SPI_MSG_HEADER;
++
++	memset(buf, 0, size);
++
++	sja1105_packing(buf, &msg->access,     31, 31, size, PACK);
++	sja1105_packing(buf, &msg->read_count, 30, 25, size, PACK);
++	sja1105_packing(buf, &msg->address,    24,  4, size, PACK);
++}
++
++static int sja1105_xfer_buf(const struct sja1105_private *priv,
++			    sja1105_spi_rw_mode_t rw, u64 reg_addr,
++			    u8 *buf, size_t len)
++{
++	struct udevice *dev = priv->dev;
++	struct sja1105_chunk chunk = {
++		.len = min_t(size_t, len, SJA1105_SIZE_SPI_MSG_MAXLEN),
++		.reg_addr = reg_addr,
++		.buf = buf,
++	};
++	int num_chunks;
++	int rc, i;
++
++	rc = dm_spi_claim_bus(dev);
++	if (rc)
++		return rc;
++
++	num_chunks = DIV_ROUND_UP(len, SJA1105_SIZE_SPI_MSG_MAXLEN);
++
++	for (i = 0; i < num_chunks; i++) {
++		u8 hdr_buf[SJA1105_SIZE_SPI_MSG_HEADER];
++		struct sja1105_spi_message msg;
++		u8 *rx_buf = NULL;
++		u8 *tx_buf = NULL;
++
++		/* Populate the transfer's header buffer */
++		msg.address = chunk.reg_addr;
++		msg.access = rw;
++		if (rw == SPI_READ)
++			msg.read_count = chunk.len / 4;
++		else
++			/* Ignored */
++			msg.read_count = 0;
++		sja1105_spi_message_pack(hdr_buf, &msg);
++		rc = dm_spi_xfer(dev, SJA1105_SIZE_SPI_MSG_HEADER * 8, hdr_buf,
++				 NULL, SPI_XFER_BEGIN);
++		if (rc)
++			goto out;
++
++		/* Populate the transfer's data buffer */
++		if (rw == SPI_READ)
++			rx_buf = chunk.buf;
++		else
++			tx_buf = chunk.buf;
++		rc = dm_spi_xfer(dev, chunk.len * 8, tx_buf, rx_buf,
++				 SPI_XFER_END);
++		if (rc)
++			goto out;
++
++		/* Calculate next chunk */
++		chunk.buf += chunk.len;
++		chunk.reg_addr += chunk.len / 4;
++		chunk.len = min_t(size_t, (ptrdiff_t)(buf + len - chunk.buf),
++				  SJA1105_SIZE_SPI_MSG_MAXLEN);
++	}
++
++out:
++	dm_spi_release_bus(dev);
++
++	return rc;
++}
++
++static int sja1105et_reset_cmd(struct sja1105_private *priv)
++{
++	const struct sja1105_regs *regs = priv->info->regs;
++	u8 packed_buf[SJA1105_SIZE_RESET_CMD] = {0};
++	const int size = SJA1105_SIZE_RESET_CMD;
++	u64 cold_rst = 1;
++
++	sja1105_packing(packed_buf, &cold_rst, 3, 3, size, PACK);
++
++	return sja1105_xfer_buf(priv, SPI_WRITE, regs->rgu, packed_buf,
++				SJA1105_SIZE_RESET_CMD);
++}
++
++static int sja1105pqrs_reset_cmd(struct sja1105_private *priv)
++{
++	const struct sja1105_regs *regs = priv->info->regs;
++	u8 packed_buf[SJA1105_SIZE_RESET_CMD] = {0};
++	const int size = SJA1105_SIZE_RESET_CMD;
++	u64 cold_rst = 1;
++
++	sja1105_packing(packed_buf, &cold_rst, 2, 2, size, PACK);
++
++	return sja1105_xfer_buf(priv, SPI_WRITE, regs->rgu, packed_buf,
++				SJA1105_SIZE_RESET_CMD);
++}
++
++static size_t sja1105et_general_params_entry_packing(void *buf, void *entry_ptr,
++						     enum packing_op op)
++{
++	const size_t size = SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY;
++	struct sja1105_general_params_entry *entry = entry_ptr;
++
++	sja1105_packing(buf, &entry->mac_fltres1, 311, 264, size, op);
++	sja1105_packing(buf, &entry->mac_fltres0, 263, 216, size, op);
++	sja1105_packing(buf, &entry->mac_flt1,    215, 168, size, op);
++	sja1105_packing(buf, &entry->mac_flt0,    167, 120, size, op);
++	sja1105_packing(buf, &entry->casc_port,   115, 113, size, op);
++	sja1105_packing(buf, &entry->host_port,   112, 110, size, op);
++	sja1105_packing(buf, &entry->mirr_port,   109, 107, size, op);
++	sja1105_packing(buf, &entry->tpid,         42,  27, size, op);
++	sja1105_packing(buf, &entry->tpid2,        25,  10, size, op);
++	return size;
++}
++
++static size_t
++sja1105pqrs_general_params_entry_packing(void *buf, void *entry_ptr,
++					 enum packing_op op)
++{
++	const size_t size = SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY;
++	struct sja1105_general_params_entry *entry = entry_ptr;
++
++	sja1105_packing(buf, &entry->mac_fltres1, 343, 296, size, op);
++	sja1105_packing(buf, &entry->mac_fltres0, 295, 248, size, op);
++	sja1105_packing(buf, &entry->mac_flt1,    247, 200, size, op);
++	sja1105_packing(buf, &entry->mac_flt0,    199, 152, size, op);
++	sja1105_packing(buf, &entry->casc_port,   147, 145, size, op);
++	sja1105_packing(buf, &entry->host_port,   144, 142, size, op);
++	sja1105_packing(buf, &entry->mirr_port,   141, 139, size, op);
++	sja1105_packing(buf, &entry->tpid,         74,  59, size, op);
++	sja1105_packing(buf, &entry->tpid2,        57,  42, size, op);
++	return size;
++}
++
++static size_t
++sja1105_l2_forwarding_params_entry_packing(void *buf, void *entry_ptr,
++					   enum packing_op op)
++{
++	const size_t size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY;
++	struct sja1105_l2_forwarding_params_entry *entry = entry_ptr;
++	int offset, i;
++
++	for (i = 0, offset = 13; i < 8; i++, offset += 10)
++		sja1105_packing(buf, &entry->part_spc[i],
++				offset + 9, offset + 0, size, op);
++	return size;
++}
++
++static size_t sja1105_l2_forwarding_entry_packing(void *buf, void *entry_ptr,
++						  enum packing_op op)
++{
++	const size_t size = SJA1105_SIZE_L2_FORWARDING_ENTRY;
++	struct sja1105_l2_forwarding_entry *entry = entry_ptr;
++
++	sja1105_packing(buf, &entry->bc_domain,  63, 59, size, op);
++	sja1105_packing(buf, &entry->reach_port, 58, 54, size, op);
++	sja1105_packing(buf, &entry->fl_domain,  53, 49, size, op);
++	return size;
++}
++
++static size_t
++sja1105et_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,
++					 enum packing_op op)
++{
++	const size_t size = SJA1105ET_SIZE_L2_LOOKUP_PARAMS_ENTRY;
++	struct sja1105_l2_lookup_params_entry *entry = entry_ptr;
++
++	sja1105_packing(buf, &entry->dyn_tbsz,       16, 14, size, op);
++	sja1105_packing(buf, &entry->poly,           13,  6, size, op);
++	return size;
++}
++
++static size_t
++sja1105pqrs_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,
++					   enum packing_op op)
++{
++	const size_t size = SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY;
++	struct sja1105_l2_lookup_params_entry *entry = entry_ptr;
++	int offset, i;
++
++	for (i = 0, offset = 58; i < 5; i++, offset += 11)
++		sja1105_packing(buf, &entry->maxaddrp[i],
++				offset + 10, offset + 0, size, op);
++	sja1105_packing(buf, &entry->start_dynspc,   42,  33, size, op);
++	sja1105_packing(buf, &entry->use_static,     24,  24, size, op);
++	sja1105_packing(buf, &entry->owr_dyn,        23,  23, size, op);
++	return size;
++}
++
++static size_t sja1105_l2_policing_entry_packing(void *buf, void *entry_ptr,
++						enum packing_op op)
++{
++	const size_t size = SJA1105_SIZE_L2_POLICING_ENTRY;
++	struct sja1105_l2_policing_entry *entry = entry_ptr;
++
++	sja1105_packing(buf, &entry->sharindx,  63, 58, size, op);
++	sja1105_packing(buf, &entry->smax,      57, 42, size, op);
++	sja1105_packing(buf, &entry->rate,      41, 26, size, op);
++	sja1105_packing(buf, &entry->maxlen,    25, 15, size, op);
++	sja1105_packing(buf, &entry->partition, 14, 12, size, op);
++	return size;
++}
++
++static size_t sja1105et_mac_config_entry_packing(void *buf, void *entry_ptr,
++						 enum packing_op op)
++{
++	const size_t size = SJA1105ET_SIZE_MAC_CONFIG_ENTRY;
++	struct sja1105_mac_config_entry *entry = entry_ptr;
++	int offset, i;
++
++	for (i = 0, offset = 72; i < 8; i++, offset += 19) {
++		sja1105_packing(buf, &entry->enabled[i],
++				offset +  0, offset +  0, size, op);
++		sja1105_packing(buf, &entry->base[i],
++				offset +  9, offset +  1, size, op);
++		sja1105_packing(buf, &entry->top[i],
++				offset + 18, offset + 10, size, op);
++	}
++	sja1105_packing(buf, &entry->speed,     66, 65, size, op);
++	sja1105_packing(buf, &entry->maxage,    32, 25, size, op);
++	sja1105_packing(buf, &entry->vlanprio,  24, 22, size, op);
++	sja1105_packing(buf, &entry->vlanid,    21, 10, size, op);
++	sja1105_packing(buf, &entry->dyn_learn,  3,  3, size, op);
++	sja1105_packing(buf, &entry->egress,     2,  2, size, op);
++	sja1105_packing(buf, &entry->ingress,    1,  1, size, op);
++	return size;
++}
++
++static size_t sja1105pqrs_mac_config_entry_packing(void *buf, void *entry_ptr,
++						   enum packing_op op)
++{
++	const size_t size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY;
++	struct sja1105_mac_config_entry *entry = entry_ptr;
++	int offset, i;
++
++	for (i = 0, offset = 104; i < 8; i++, offset += 19) {
++		sja1105_packing(buf, &entry->enabled[i],
++				offset +  0, offset +  0, size, op);
++		sja1105_packing(buf, &entry->base[i],
++				offset +  9, offset +  1, size, op);
++		sja1105_packing(buf, &entry->top[i],
++				offset + 18, offset + 10, size, op);
++	}
++	sja1105_packing(buf, &entry->speed,      98, 97, size, op);
++	sja1105_packing(buf, &entry->maxage,     64, 57, size, op);
++	sja1105_packing(buf, &entry->vlanprio,   56, 54, size, op);
++	sja1105_packing(buf, &entry->vlanid,     53, 42, size, op);
++	sja1105_packing(buf, &entry->dyn_learn,  33, 33, size, op);
++	sja1105_packing(buf, &entry->egress,     32, 32, size, op);
++	sja1105_packing(buf, &entry->ingress,    31, 31, size, op);
++	return size;
++}
++
++static size_t sja1105_vlan_lookup_entry_packing(void *buf, void *entry_ptr,
++						enum packing_op op)
++{
++	const size_t size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY;
++	struct sja1105_vlan_lookup_entry *entry = entry_ptr;
++
++	sja1105_packing(buf, &entry->vmemb_port, 53, 49, size, op);
++	sja1105_packing(buf, &entry->vlan_bc,    48, 44, size, op);
++	sja1105_packing(buf, &entry->tag_port,   43, 39, size, op);
++	sja1105_packing(buf, &entry->vlanid,     38, 27, size, op);
++	return size;
++}
++
++static size_t sja1105_xmii_params_entry_packing(void *buf, void *entry_ptr,
++						enum packing_op op)
++{
++	const size_t size = SJA1105_SIZE_XMII_PARAMS_ENTRY;
++	struct sja1105_xmii_params_entry *entry = entry_ptr;
++	int offset, i;
++
++	for (i = 0, offset = 17; i < 5; i++, offset += 3) {
++		sja1105_packing(buf, &entry->xmii_mode[i],
++				offset + 1, offset + 0, size, op);
++		sja1105_packing(buf, &entry->phy_mac[i],
++				offset + 2, offset + 2, size, op);
++	}
++	return size;
++}
++
++static size_t sja1105_table_header_packing(void *buf, void *entry_ptr,
++					   enum packing_op op)
++{
++	const size_t size = SJA1105_SIZE_TABLE_HEADER;
++	struct sja1105_table_header *entry = entry_ptr;
++
++	sja1105_packing(buf, &entry->block_id, 31, 24, size, op);
++	sja1105_packing(buf, &entry->len,      55, 32, size, op);
++	sja1105_packing(buf, &entry->crc,      95, 64, size, op);
++	return size;
++}
++
++static void
++sja1105_table_header_pack_with_crc(void *buf, struct sja1105_table_header *hdr)
++{
++	/* First pack the table as-is, then calculate the CRC, and
++	 * finally put the proper CRC into the packed buffer
++	 */
++	memset(buf, 0, SJA1105_SIZE_TABLE_HEADER);
++	sja1105_table_header_packing(buf, hdr, PACK);
++	hdr->crc = sja1105_crc32(buf, SJA1105_SIZE_TABLE_HEADER - 4);
++	sja1105_packing(buf + SJA1105_SIZE_TABLE_HEADER - 4, &hdr->crc,
++			31, 0, 4, PACK);
++}
++
++static void sja1105_table_write_crc(u8 *table_start, u8 *crc_ptr)
++{
++	u64 computed_crc;
++	int len_bytes;
++
++	len_bytes = (uintptr_t)(crc_ptr - table_start);
++	computed_crc = sja1105_crc32(table_start, len_bytes);
++	sja1105_packing(crc_ptr, &computed_crc, 31, 0, 4, PACK);
++}
++
++/* The block IDs that the switches support are unfortunately sparse, so keep a
++ * mapping table to "block indices" and translate back and forth.
++ */
++static u64 blk_id_map[BLK_IDX_MAX] = {
++	[BLK_IDX_L2_POLICING] = BLKID_L2_POLICING,
++	[BLK_IDX_VLAN_LOOKUP] = BLKID_VLAN_LOOKUP,
++	[BLK_IDX_L2_FORWARDING] = BLKID_L2_FORWARDING,
++	[BLK_IDX_MAC_CONFIG] = BLKID_MAC_CONFIG,
++	[BLK_IDX_L2_LOOKUP_PARAMS] = BLKID_L2_LOOKUP_PARAMS,
++	[BLK_IDX_L2_FORWARDING_PARAMS] = BLKID_L2_FORWARDING_PARAMS,
++	[BLK_IDX_GENERAL_PARAMS] = BLKID_GENERAL_PARAMS,
++	[BLK_IDX_XMII_PARAMS] = BLKID_XMII_PARAMS,
++};
++
++static void
++sja1105_static_config_pack(void *buf, struct sja1105_static_config *config)
++{
++	struct sja1105_table_header header = {0};
++	enum sja1105_blk_idx i;
++	u8 *p = buf;
++	int j;
++
++	sja1105_packing(p, &config->device_id, 31, 0, 4, PACK);
++	p += SJA1105_SIZE_DEVICE_ID;
++
++	for (i = 0; i < BLK_IDX_MAX; i++) {
++		const struct sja1105_table *table;
++		u8 *table_start;
++
++		table = &config->tables[i];
++		if (!table->entry_count)
++			continue;
++
++		header.block_id = blk_id_map[i];
++		header.len = table->entry_count *
++			     table->ops->packed_entry_size / 4;
++		sja1105_table_header_pack_with_crc(p, &header);
++		p += SJA1105_SIZE_TABLE_HEADER;
++		table_start = p;
++		for (j = 0; j < table->entry_count; j++) {
++			u8 *entry_ptr = table->entries;
++
++			entry_ptr += j * table->ops->unpacked_entry_size;
++			memset(p, 0, table->ops->packed_entry_size);
++			table->ops->packing(p, entry_ptr, PACK);
++			p += table->ops->packed_entry_size;
++		}
++		sja1105_table_write_crc(table_start, p);
++		p += 4;
++	}
++	/* Final header:
++	 * Block ID does not matter
++	 * Length of 0 marks that header is final
++	 * CRC will be replaced on-the-fly
++	 */
++	header.block_id = 0;
++	header.len = 0;
++	header.crc = 0xDEADBEEF;
++	memset(p, 0, SJA1105_SIZE_TABLE_HEADER);
++	sja1105_table_header_packing(p, &header, PACK);
++}
++
++static size_t
++sja1105_static_config_get_length(const struct sja1105_static_config *config)
++{
++	unsigned int header_count;
++	enum sja1105_blk_idx i;
++	unsigned int sum;
++
++	/* Ending header */
++	header_count = 1;
++	sum = SJA1105_SIZE_DEVICE_ID;
++
++	/* Tables (headers and entries) */
++	for (i = 0; i < BLK_IDX_MAX; i++) {
++		const struct sja1105_table *table;
++
++		table = &config->tables[i];
++		if (table->entry_count)
++			header_count++;
++
++		sum += table->ops->packed_entry_size * table->entry_count;
++	}
++	/* Headers have an additional CRC at the end */
++	sum += header_count * (SJA1105_SIZE_TABLE_HEADER + 4);
++	/* Last header does not have an extra CRC because there is no data */
++	sum -= 4;
++
++	return sum;
++}
++
++/* Compatibility matrices */
++static struct sja1105_table_ops sja1105et_table_ops[BLK_IDX_MAX] = {
++	[BLK_IDX_L2_POLICING] = {
++		.packing = sja1105_l2_policing_entry_packing,
++		.unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry),
++		.packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY,
++		.max_entry_count = SJA1105_MAX_L2_POLICING_COUNT,
++	},
++	[BLK_IDX_VLAN_LOOKUP] = {
++		.packing = sja1105_vlan_lookup_entry_packing,
++		.unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry),
++		.packed_entry_size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY,
++		.max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT,
++	},
++	[BLK_IDX_L2_FORWARDING] = {
++		.packing = sja1105_l2_forwarding_entry_packing,
++		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry),
++		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY,
++		.max_entry_count = SJA1105_MAX_L2_FORWARDING_COUNT,
++	},
++	[BLK_IDX_MAC_CONFIG] = {
++		.packing = sja1105et_mac_config_entry_packing,
++		.unpacked_entry_size = sizeof(struct sja1105_mac_config_entry),
++		.packed_entry_size = SJA1105ET_SIZE_MAC_CONFIG_ENTRY,
++		.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT,
++	},
++	[BLK_IDX_L2_LOOKUP_PARAMS] = {
++		.packing = sja1105et_l2_lookup_params_entry_packing,
++		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry),
++		.packed_entry_size = SJA1105ET_SIZE_L2_LOOKUP_PARAMS_ENTRY,
++		.max_entry_count = SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT,
++	},
++	[BLK_IDX_L2_FORWARDING_PARAMS] = {
++		.packing = sja1105_l2_forwarding_params_entry_packing,
++		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry),
++		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY,
++		.max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT,
++	},
++	[BLK_IDX_GENERAL_PARAMS] = {
++		.packing = sja1105et_general_params_entry_packing,
++		.unpacked_entry_size = sizeof(struct sja1105_general_params_entry),
++		.packed_entry_size = SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY,
++		.max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT,
++	},
++	[BLK_IDX_XMII_PARAMS] = {
++		.packing = sja1105_xmii_params_entry_packing,
++		.unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry),
++		.packed_entry_size = SJA1105_SIZE_XMII_PARAMS_ENTRY,
++		.max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT,
++	},
++};
++
++static struct sja1105_table_ops sja1105pqrs_table_ops[BLK_IDX_MAX] = {
++	[BLK_IDX_L2_POLICING] = {
++		.packing = sja1105_l2_policing_entry_packing,
++		.unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry),
++		.packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY,
++		.max_entry_count = SJA1105_MAX_L2_POLICING_COUNT,
++	},
++	[BLK_IDX_VLAN_LOOKUP] = {
++		.packing = sja1105_vlan_lookup_entry_packing,
++		.unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry),
++		.packed_entry_size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY,
++		.max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT,
++	},
++	[BLK_IDX_L2_FORWARDING] = {
++		.packing = sja1105_l2_forwarding_entry_packing,
++		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry),
++		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY,
++		.max_entry_count = SJA1105_MAX_L2_FORWARDING_COUNT,
++	},
++	[BLK_IDX_MAC_CONFIG] = {
++		.packing = sja1105pqrs_mac_config_entry_packing,
++		.unpacked_entry_size = sizeof(struct sja1105_mac_config_entry),
++		.packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY,
++		.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT,
++	},
++	[BLK_IDX_L2_LOOKUP_PARAMS] = {
++		.packing = sja1105pqrs_l2_lookup_params_entry_packing,
++		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry),
++		.packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY,
++		.max_entry_count = SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT,
++	},
++	[BLK_IDX_L2_FORWARDING_PARAMS] = {
++		.packing = sja1105_l2_forwarding_params_entry_packing,
++		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry),
++		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY,
++		.max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT,
++	},
++	[BLK_IDX_GENERAL_PARAMS] = {
++		.packing = sja1105pqrs_general_params_entry_packing,
++		.unpacked_entry_size = sizeof(struct sja1105_general_params_entry),
++		.packed_entry_size = SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY,
++		.max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT,
++	},
++	[BLK_IDX_XMII_PARAMS] = {
++		.packing = sja1105_xmii_params_entry_packing,
++		.unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry),
++		.packed_entry_size = SJA1105_SIZE_XMII_PARAMS_ENTRY,
++		.max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT,
++	},
++};
++
++static int
++sja1105_static_config_init(struct sja1105_static_config *config,
++			   const struct sja1105_table_ops *static_ops,
++			   u64 device_id)
++{
++	enum sja1105_blk_idx i;
++
++	*config = (struct sja1105_static_config) {0};
++
++	/* Transfer static_ops array from priv into per-table ops
++	 * for handier access
++	 */
++	for (i = 0; i < BLK_IDX_MAX; i++)
++		config->tables[i].ops = &static_ops[i];
++
++	config->device_id = device_id;
++	return 0;
++}
++
++static void sja1105_static_config_free(struct sja1105_static_config *config)
++{
++	enum sja1105_blk_idx i;
++
++	for (i = 0; i < BLK_IDX_MAX; i++) {
++		if (config->tables[i].entry_count) {
++			free(config->tables[i].entries);
++			config->tables[i].entry_count = 0;
++		}
++	}
++}
++
++static void sja1105_cgu_idiv_packing(void *buf, struct sja1105_cgu_idiv *idiv,
++				     enum packing_op op)
++{
++	const int size = 4;
++
++	sja1105_packing(buf, &idiv->clksrc,    28, 24, size, op);
++	sja1105_packing(buf, &idiv->autoblock, 11, 11, size, op);
++	sja1105_packing(buf, &idiv->idiv,       5,  2, size, op);
++	sja1105_packing(buf, &idiv->pd,         0,  0, size, op);
++}
++
++static int sja1105_cgu_idiv_config(struct sja1105_private *priv, int port,
++				   bool enabled, int factor)
++{
++	const struct sja1105_regs *regs = priv->info->regs;
++	struct sja1105_cgu_idiv idiv;
++	u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
++
++	if (enabled && factor != 1 && factor != 10)
++		return -ERANGE;
++
++	/* Payload for packed_buf */
++	idiv.clksrc    = 0x0A;            /* 25MHz */
++	idiv.autoblock = 1;               /* Block clk automatically */
++	idiv.idiv      = factor - 1;      /* Divide by 1 or 10 */
++	idiv.pd        = enabled ? 0 : 1; /* Power down? */
++	sja1105_cgu_idiv_packing(packed_buf, &idiv, PACK);
++
++	return sja1105_xfer_buf(priv, SPI_WRITE, regs->cgu_idiv[port],
++				packed_buf, SJA1105_SIZE_CGU_CMD);
++}
++
++static void
++sja1105_cgu_mii_control_packing(void *buf, struct sja1105_cgu_mii_ctrl *cmd,
++				enum packing_op op)
++{
++	const int size = 4;
++
++	sja1105_packing(buf, &cmd->clksrc,    28, 24, size, op);
++	sja1105_packing(buf, &cmd->autoblock, 11, 11, size, op);
++	sja1105_packing(buf, &cmd->pd,         0,  0, size, op);
++}
++
++static int sja1105_cgu_mii_tx_clk_config(struct sja1105_private *priv,
++					 int port, sja1105_mii_role_t role)
++{
++	const struct sja1105_regs *regs = priv->info->regs;
++	struct sja1105_cgu_mii_ctrl mii_tx_clk;
++	const int mac_clk_sources[] = {
++		CLKSRC_MII0_TX_CLK,
++		CLKSRC_MII1_TX_CLK,
++		CLKSRC_MII2_TX_CLK,
++		CLKSRC_MII3_TX_CLK,
++		CLKSRC_MII4_TX_CLK,
++	};
++	const int phy_clk_sources[] = {
++		CLKSRC_IDIV0,
++		CLKSRC_IDIV1,
++		CLKSRC_IDIV2,
++		CLKSRC_IDIV3,
++		CLKSRC_IDIV4,
++	};
++	u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
++	int clksrc;
++
++	if (role == XMII_MAC)
++		clksrc = mac_clk_sources[port];
++	else
++		clksrc = phy_clk_sources[port];
++
++	/* Payload for packed_buf */
++	mii_tx_clk.clksrc    = clksrc;
++	mii_tx_clk.autoblock = 1;  /* Autoblock clk while changing clksrc */
++	mii_tx_clk.pd        = 0;  /* Power Down off => enabled */
++	sja1105_cgu_mii_control_packing(packed_buf, &mii_tx_clk, PACK);
++
++	return sja1105_xfer_buf(priv, SPI_WRITE, regs->mii_tx_clk[port],
++				packed_buf, SJA1105_SIZE_CGU_CMD);
++}
++
++static int
++sja1105_cgu_mii_rx_clk_config(struct sja1105_private *priv, int port)
++{
++	const struct sja1105_regs *regs = priv->info->regs;
++	struct sja1105_cgu_mii_ctrl mii_rx_clk;
++	u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
++	const int clk_sources[] = {
++		CLKSRC_MII0_RX_CLK,
++		CLKSRC_MII1_RX_CLK,
++		CLKSRC_MII2_RX_CLK,
++		CLKSRC_MII3_RX_CLK,
++		CLKSRC_MII4_RX_CLK,
++	};
++
++	/* Payload for packed_buf */
++	mii_rx_clk.clksrc    = clk_sources[port];
++	mii_rx_clk.autoblock = 1;  /* Autoblock clk while changing clksrc */
++	mii_rx_clk.pd        = 0;  /* Power Down off => enabled */
++	sja1105_cgu_mii_control_packing(packed_buf, &mii_rx_clk, PACK);
++
++	return sja1105_xfer_buf(priv, SPI_WRITE, regs->mii_rx_clk[port],
++				packed_buf, SJA1105_SIZE_CGU_CMD);
++}
++
++static int
++sja1105_cgu_mii_ext_tx_clk_config(struct sja1105_private *priv, int port)
++{
++	const struct sja1105_regs *regs = priv->info->regs;
++	struct sja1105_cgu_mii_ctrl mii_ext_tx_clk;
++	u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
++	const int clk_sources[] = {
++		CLKSRC_IDIV0,
++		CLKSRC_IDIV1,
++		CLKSRC_IDIV2,
++		CLKSRC_IDIV3,
++		CLKSRC_IDIV4,
++	};
++
++	/* Payload for packed_buf */
++	mii_ext_tx_clk.clksrc    = clk_sources[port];
++	mii_ext_tx_clk.autoblock = 1; /* Autoblock clk while changing clksrc */
++	mii_ext_tx_clk.pd        = 0; /* Power Down off => enabled */
++	sja1105_cgu_mii_control_packing(packed_buf, &mii_ext_tx_clk, PACK);
++
++	return sja1105_xfer_buf(priv, SPI_WRITE, regs->mii_ext_tx_clk[port],
++				packed_buf, SJA1105_SIZE_CGU_CMD);
++}
++
++static int
++sja1105_cgu_mii_ext_rx_clk_config(struct sja1105_private *priv, int port)
++{
++	const struct sja1105_regs *regs = priv->info->regs;
++	struct sja1105_cgu_mii_ctrl mii_ext_rx_clk;
++	u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
++	const int clk_sources[] = {
++		CLKSRC_IDIV0,
++		CLKSRC_IDIV1,
++		CLKSRC_IDIV2,
++		CLKSRC_IDIV3,
++		CLKSRC_IDIV4,
++	};
++
++	/* Payload for packed_buf */
++	mii_ext_rx_clk.clksrc    = clk_sources[port];
++	mii_ext_rx_clk.autoblock = 1; /* Autoblock clk while changing clksrc */
++	mii_ext_rx_clk.pd        = 0; /* Power Down off => enabled */
++	sja1105_cgu_mii_control_packing(packed_buf, &mii_ext_rx_clk, PACK);
++
++	return sja1105_xfer_buf(priv, SPI_WRITE, regs->mii_ext_rx_clk[port],
++				packed_buf, SJA1105_SIZE_CGU_CMD);
++}
++
++static int sja1105_mii_clocking_setup(struct sja1105_private *priv, int port,
++				      sja1105_mii_role_t role)
++{
++	int rc;
++
++	rc = sja1105_cgu_idiv_config(priv, port, (role == XMII_PHY), 1);
++	if (rc < 0)
++		return rc;
++
++	rc = sja1105_cgu_mii_tx_clk_config(priv, port, role);
++	if (rc < 0)
++		return rc;
++
++	rc = sja1105_cgu_mii_rx_clk_config(priv, port);
++	if (rc < 0)
++		return rc;
++
++	if (role == XMII_PHY) {
++		rc = sja1105_cgu_mii_ext_tx_clk_config(priv, port);
++		if (rc < 0)
++			return rc;
++
++		rc = sja1105_cgu_mii_ext_rx_clk_config(priv, port);
++		if (rc < 0)
++			return rc;
++	}
++	return 0;
++}
++
++static void
++sja1105_cgu_pll_control_packing(void *buf, struct sja1105_cgu_pll_ctrl *cmd,
++				enum packing_op op)
++{
++	const int size = 4;
++
++	sja1105_packing(buf, &cmd->pllclksrc, 28, 24, size, op);
++	sja1105_packing(buf, &cmd->msel,      23, 16, size, op);
++	sja1105_packing(buf, &cmd->autoblock, 11, 11, size, op);
++	sja1105_packing(buf, &cmd->psel,       9,  8, size, op);
++	sja1105_packing(buf, &cmd->direct,     7,  7, size, op);
++	sja1105_packing(buf, &cmd->fbsel,      6,  6, size, op);
++	sja1105_packing(buf, &cmd->bypass,     1,  1, size, op);
++	sja1105_packing(buf, &cmd->pd,         0,  0, size, op);
++}
++
++static int sja1105_cgu_rgmii_tx_clk_config(struct sja1105_private *priv,
++					   int port, sja1105_speed_t speed)
++{
++	const struct sja1105_regs *regs = priv->info->regs;
++	struct sja1105_cgu_mii_ctrl txc;
++	u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
++	int clksrc;
++
++	if (speed == SJA1105_SPEED_1000MBPS) {
++		clksrc = CLKSRC_PLL0;
++	} else {
++		int clk_sources[] = {CLKSRC_IDIV0, CLKSRC_IDIV1, CLKSRC_IDIV2,
++				     CLKSRC_IDIV3, CLKSRC_IDIV4};
++		clksrc = clk_sources[port];
++	}
++
++	/* RGMII: 125MHz for 1000, 25MHz for 100, 2.5MHz for 10 */
++	txc.clksrc = clksrc;
++	/* Autoblock clk while changing clksrc */
++	txc.autoblock = 1;
++	/* Power Down off => enabled */
++	txc.pd = 0;
++	sja1105_cgu_mii_control_packing(packed_buf, &txc, PACK);
++
++	return sja1105_xfer_buf(priv, SPI_WRITE, regs->rgmii_tx_clk[port],
++				packed_buf, SJA1105_SIZE_CGU_CMD);
++}
++
++/* AGU */
++static void
++sja1105_cfg_pad_mii_tx_packing(void *buf, struct sja1105_cfg_pad_mii_tx *cmd,
++			       enum packing_op op)
++{
++	const int size = 4;
++
++	sja1105_packing(buf, &cmd->d32_os,   28, 27, size, op);
++	sja1105_packing(buf, &cmd->d32_ipud, 25, 24, size, op);
++	sja1105_packing(buf, &cmd->d10_os,   20, 19, size, op);
++	sja1105_packing(buf, &cmd->d10_ipud, 17, 16, size, op);
++	sja1105_packing(buf, &cmd->ctrl_os,  12, 11, size, op);
++	sja1105_packing(buf, &cmd->ctrl_ipud, 9,  8, size, op);
++	sja1105_packing(buf, &cmd->clk_os,    4,  3, size, op);
++	sja1105_packing(buf, &cmd->clk_ih,    2,  2, size, op);
++	sja1105_packing(buf, &cmd->clk_ipud,  1,  0, size, op);
++}
++
++static int sja1105_rgmii_cfg_pad_tx_config(struct sja1105_private *priv,
++					   int port)
++{
++	const struct sja1105_regs *regs = priv->info->regs;
++	struct sja1105_cfg_pad_mii_tx pad_mii_tx;
++	u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
++
++	/* Payload */
++	pad_mii_tx.d32_os    = 3; /* TXD[3:2] output stage: */
++				  /*          high noise/high speed */
++	pad_mii_tx.d10_os    = 3; /* TXD[1:0] output stage: */
++				  /*          high noise/high speed */
++	pad_mii_tx.d32_ipud  = 2; /* TXD[3:2] input stage: */
++				  /*          plain input (default) */
++	pad_mii_tx.d10_ipud  = 2; /* TXD[1:0] input stage: */
++				  /*          plain input (default) */
++	pad_mii_tx.ctrl_os   = 3; /* TX_CTL / TX_ER output stage */
++	pad_mii_tx.ctrl_ipud = 2; /* TX_CTL / TX_ER input stage (default) */
++	pad_mii_tx.clk_os    = 3; /* TX_CLK output stage */
++	pad_mii_tx.clk_ih    = 0; /* TX_CLK input hysteresis (default) */
++	pad_mii_tx.clk_ipud  = 2; /* TX_CLK input stage (default) */
++	sja1105_cfg_pad_mii_tx_packing(packed_buf, &pad_mii_tx, PACK);
++
++	return sja1105_xfer_buf(priv, SPI_WRITE, regs->pad_mii_tx[port],
++				packed_buf, SJA1105_SIZE_CGU_CMD);
++}
++
++static void
++sja1105_cfg_pad_mii_id_packing(void *buf, struct sja1105_cfg_pad_mii_id *cmd,
++			       enum packing_op op)
++{
++	const int size = SJA1105_SIZE_CGU_CMD;
++
++	sja1105_packing(buf, &cmd->rxc_stable_ovr, 15, 15, size, op);
++	sja1105_packing(buf, &cmd->rxc_delay,      14, 10, size, op);
++	sja1105_packing(buf, &cmd->rxc_bypass,      9,  9, size, op);
++	sja1105_packing(buf, &cmd->rxc_pd,          8,  8, size, op);
++	sja1105_packing(buf, &cmd->txc_stable_ovr,  7,  7, size, op);
++	sja1105_packing(buf, &cmd->txc_delay,       6,  2, size, op);
++	sja1105_packing(buf, &cmd->txc_bypass,      1,  1, size, op);
++	sja1105_packing(buf, &cmd->txc_pd,          0,  0, size, op);
++}
++
++/* Valid range in degrees is an integer between 73.8 and 101.7 */
++static u64 sja1105_rgmii_delay(u64 phase)
++{
++	/* UM11040.pdf: The delay in degree phase is 73.8 + delay_tune * 0.9.
++	 * To avoid floating point operations we'll multiply by 10
++	 * and get 1 decimal point precision.
++	 */
++	phase *= 10;
++	return (phase - 738) / 9;
++}
++
++static int sja1105pqrs_setup_rgmii_delay(struct sja1105_private *priv, int port)
++{
++	const struct sja1105_regs *regs = priv->info->regs;
++	struct sja1105_cfg_pad_mii_id pad_mii_id = {0};
++	u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
++	int rc;
++
++	if (priv->rgmii_rx_delay[port])
++		pad_mii_id.rxc_delay = sja1105_rgmii_delay(90);
++	if (priv->rgmii_tx_delay[port])
++		pad_mii_id.txc_delay = sja1105_rgmii_delay(90);
++
++	/* Stage 1: Turn the RGMII delay lines off. */
++	pad_mii_id.rxc_bypass = 1;
++	pad_mii_id.rxc_pd = 1;
++	pad_mii_id.txc_bypass = 1;
++	pad_mii_id.txc_pd = 1;
++	sja1105_cfg_pad_mii_id_packing(packed_buf, &pad_mii_id, PACK);
++
++	rc = sja1105_xfer_buf(priv, SPI_WRITE, regs->pad_mii_id[port],
++			      packed_buf, SJA1105_SIZE_CGU_CMD);
++	if (rc < 0)
++		return rc;
++
++	/* Stage 2: Turn the RGMII delay lines on. */
++	if (priv->rgmii_rx_delay[port]) {
++		pad_mii_id.rxc_bypass = 0;
++		pad_mii_id.rxc_pd = 0;
++	}
++	if (priv->rgmii_tx_delay[port]) {
++		pad_mii_id.txc_bypass = 0;
++		pad_mii_id.txc_pd = 0;
++	}
++	sja1105_cfg_pad_mii_id_packing(packed_buf, &pad_mii_id, PACK);
++
++	return sja1105_xfer_buf(priv, SPI_WRITE, regs->pad_mii_id[port],
++				packed_buf, SJA1105_SIZE_CGU_CMD);
++}
++
++static int sja1105_rgmii_clocking_setup(struct sja1105_private *priv, int port,
++					sja1105_mii_role_t role)
++{
++	struct sja1105_mac_config_entry *mac;
++	sja1105_speed_t speed;
++	int rc;
++
++	mac = priv->static_config.tables[BLK_IDX_MAC_CONFIG].entries;
++	speed = mac[port].speed;
++
++	switch (speed) {
++	case SJA1105_SPEED_1000MBPS:
++		/* 1000Mbps, IDIV disabled (125 MHz) */
++		rc = sja1105_cgu_idiv_config(priv, port, false, 1);
++		break;
++	case SJA1105_SPEED_100MBPS:
++		/* 100Mbps, IDIV enabled, divide by 1 (25 MHz) */
++		rc = sja1105_cgu_idiv_config(priv, port, true, 1);
++		break;
++	case SJA1105_SPEED_10MBPS:
++		/* 10Mbps, IDIV enabled, divide by 10 (2.5 MHz) */
++		rc = sja1105_cgu_idiv_config(priv, port, true, 10);
++		break;
++	default:
++		rc = -EINVAL;
++	}
++
++	if (rc < 0) {
++		dev_err(dev, "Failed to configure idiv\n");
++		return rc;
++	}
++	rc = sja1105_cgu_rgmii_tx_clk_config(priv, port, speed);
++	if (rc < 0) {
++		dev_err(dev, "Failed to configure RGMII Tx clock\n");
++		return rc;
++	}
++	rc = sja1105_rgmii_cfg_pad_tx_config(priv, port);
++	if (rc < 0) {
++		dev_err(dev, "Failed to configure Tx pad registers\n");
++		return rc;
++	}
++	if (!priv->info->setup_rgmii_delay)
++		return 0;
++	/* The role has no hardware effect for RGMII. However we use it as
++	 * a proxy for this interface being a MAC-to-MAC connection, with
++	 * the RGMII internal delays needing to be applied by us.
++	 */
++	if (role == XMII_MAC)
++		return 0;
++
++	return priv->info->setup_rgmii_delay(priv, port);
++}
++
++static int sja1105_cgu_rmii_ref_clk_config(struct sja1105_private *priv,
++					   int port)
++{
++	const struct sja1105_regs *regs = priv->info->regs;
++	struct sja1105_cgu_mii_ctrl ref_clk;
++	u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
++	const int clk_sources[] = {
++		CLKSRC_MII0_TX_CLK,
++		CLKSRC_MII1_TX_CLK,
++		CLKSRC_MII2_TX_CLK,
++		CLKSRC_MII3_TX_CLK,
++		CLKSRC_MII4_TX_CLK,
++	};
++
++	/* Payload for packed_buf */
++	ref_clk.clksrc    = clk_sources[port];
++	ref_clk.autoblock = 1;      /* Autoblock clk while changing clksrc */
++	ref_clk.pd        = 0;      /* Power Down off => enabled */
++	sja1105_cgu_mii_control_packing(packed_buf, &ref_clk, PACK);
++
++	return sja1105_xfer_buf(priv, SPI_WRITE, regs->rmii_ref_clk[port],
++				packed_buf, SJA1105_SIZE_CGU_CMD);
++}
++
++static int
++sja1105_cgu_rmii_ext_tx_clk_config(struct sja1105_private *priv, int port)
++{
++	const struct sja1105_regs *regs = priv->info->regs;
++	struct sja1105_cgu_mii_ctrl ext_tx_clk;
++	u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
++
++	/* Payload for packed_buf */
++	ext_tx_clk.clksrc    = CLKSRC_PLL1;
++	ext_tx_clk.autoblock = 1;   /* Autoblock clk while changing clksrc */
++	ext_tx_clk.pd        = 0;   /* Power Down off => enabled */
++	sja1105_cgu_mii_control_packing(packed_buf, &ext_tx_clk, PACK);
++
++	return sja1105_xfer_buf(priv, SPI_WRITE, regs->rmii_ext_tx_clk[port],
++				packed_buf, SJA1105_SIZE_CGU_CMD);
++}
++
++static int sja1105_cgu_rmii_pll_config(struct sja1105_private *priv)
++{
++	const struct sja1105_regs *regs = priv->info->regs;
++	u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
++	struct sja1105_cgu_pll_ctrl pll = {0};
++	int rc;
++
++	/* Step 1: PLL1 setup for 50Mhz */
++	pll.pllclksrc = 0xA;
++	pll.msel      = 0x1;
++	pll.autoblock = 0x1;
++	pll.psel      = 0x1;
++	pll.direct    = 0x0;
++	pll.fbsel     = 0x1;
++	pll.bypass    = 0x0;
++	pll.pd        = 0x1;
++
++	sja1105_cgu_pll_control_packing(packed_buf, &pll, PACK);
++	rc = sja1105_xfer_buf(priv, SPI_WRITE, regs->rmii_pll1, packed_buf,
++			      SJA1105_SIZE_CGU_CMD);
++	if (rc < 0)
++		return rc;
++
++	/* Step 2: Enable PLL1 */
++	pll.pd = 0x0;
++
++	sja1105_cgu_pll_control_packing(packed_buf, &pll, PACK);
++	rc = sja1105_xfer_buf(priv, SPI_WRITE, regs->rmii_pll1, packed_buf,
++			      SJA1105_SIZE_CGU_CMD);
++	return rc;
++}
++
++static int sja1105_rmii_clocking_setup(struct sja1105_private *priv, int port,
++				       sja1105_mii_role_t role)
++{
++	int rc;
++
++	/* AH1601.pdf chapter 2.5.1. Sources */
++	if (role == XMII_MAC) {
++		/* Configure and enable PLL1 for 50Mhz output */
++		rc = sja1105_cgu_rmii_pll_config(priv);
++		if (rc < 0)
++			return rc;
++	}
++	/* Disable IDIV for this port */
++	rc = sja1105_cgu_idiv_config(priv, port, false, 1);
++	if (rc < 0)
++		return rc;
++	/* Source to sink mappings */
++	rc = sja1105_cgu_rmii_ref_clk_config(priv, port);
++	if (rc < 0)
++		return rc;
++	if (role == XMII_MAC) {
++		rc = sja1105_cgu_rmii_ext_tx_clk_config(priv, port);
++		if (rc < 0)
++			return rc;
++	}
++	return 0;
++}
++
++static int sja1105_sgmii_write(struct sja1105_private *priv, int pcs_reg,
++			       u16 pcs_val)
++{
++	const struct sja1105_regs *regs = priv->info->regs;
++	u8 packed_buf[4] = {0};
++	u64 val = pcs_val;
++
++	sja1105_packing(packed_buf, &val, 31, 0, 4, PACK);
++
++	return sja1105_xfer_buf(priv, SPI_WRITE, regs->sgmii + pcs_reg,
++				packed_buf, 4);
++}
++
++static int sja1105_sgmii_setup(struct sja1105_private *priv, int port)
++{
++	int bmcr = BMCR_FULLDPLX | priv->sgmii_cfg.pcs_speed;
++
++	if (priv->sgmii_cfg.inband_an)
++		bmcr |= BMCR_ANENABLE | BMCR_ANRESTART;
++
++	sja1105_sgmii_write(priv, MII_BMCR, bmcr);
++	/* DIGITAL_CONTROL_1: Enable vendor-specific MMD1, allow the PHY to
++	 * stop the clock during LPI mode, make the MAC reconfigure
++	 * autonomously after PCS autoneg is done, flush the internal FIFOs.
++	 */
++	sja1105_sgmii_write(priv, 0x8000, SJA1105_DC1_EN_VSMMD1 |
++					  SJA1105_DC1_CLOCK_STOP_EN |
++					  SJA1105_DC1_MAC_AUTO_SW |
++					  SJA1105_DC1_INIT);
++	/* DIGITAL_CONTROL_2: No polarity inversion for TX and RX lanes */
++	sja1105_sgmii_write(priv, 0x80e1, SJA1105_DC2_TX_POL_INV_DISABLE);
++	/* AUTONEG_CONTROL: Use SGMII autoneg */
++	sja1105_sgmii_write(priv, 0x8001, SJA1105_AC_AUTONEG_MODE_SGMII);
++
++	return 0;
++}
++
++static int sja1105_clocking_setup_port(struct sja1105_private *priv, int port)
++{
++	struct sja1105_xmii_params_entry *mii;
++	sja1105_phy_interface_t phy_mode;
++	sja1105_mii_role_t role;
++	int rc;
++
++	mii = priv->static_config.tables[BLK_IDX_XMII_PARAMS].entries;
++
++	/* RGMII etc */
++	phy_mode = mii->xmii_mode[port];
++	/* MAC or PHY, for applicable types (not RGMII) */
++	role = mii->phy_mac[port];
++
++	switch (phy_mode) {
++	case XMII_MODE_MII:
++		rc = sja1105_mii_clocking_setup(priv, port, role);
++		break;
++	case XMII_MODE_RMII:
++		rc = sja1105_rmii_clocking_setup(priv, port, role);
++		break;
++	case XMII_MODE_RGMII:
++		rc = sja1105_rgmii_clocking_setup(priv, port, role);
++		break;
++	case XMII_MODE_SGMII:
++		rc = sja1105_sgmii_setup(priv, port);
++		break;
++	default:
++		return -EINVAL;
++	}
++	return rc;
++}
++
++static int sja1105_clocking_setup(struct sja1105_private *priv)
++{
++	int port, rc;
++
++	for (port = 0; port < SJA1105_NUM_PORTS; port++) {
++		rc = sja1105_clocking_setup_port(priv, port);
++		if (rc < 0)
++			return rc;
++	}
++	return 0;
++}
++
++static struct sja1105_regs sja1105et_regs = {
++	.device_id = 0x0,
++	.prod_id = 0x100BC3,
++	.status = 0x1,
++	.port_control = 0x11,
++	.config = 0x020000,
++	.rgu = 0x100440,
++	/* UM10944.pdf, Table 86, ACU Register overview */
++	.pad_mii_tx = {0x100800, 0x100802, 0x100804, 0x100806, 0x100808},
++	.rmii_pll1 = 0x10000A,
++	.cgu_idiv = {0x10000B, 0x10000C, 0x10000D, 0x10000E, 0x10000F},
++	/* UM10944.pdf, Table 78, CGU Register overview */
++	.mii_tx_clk = {0x100013, 0x10001A, 0x100021, 0x100028, 0x10002F},
++	.mii_rx_clk = {0x100014, 0x10001B, 0x100022, 0x100029, 0x100030},
++	.mii_ext_tx_clk = {0x100018, 0x10001F, 0x100026, 0x10002D, 0x100034},
++	.mii_ext_rx_clk = {0x100019, 0x100020, 0x100027, 0x10002E, 0x100035},
++	.rgmii_tx_clk = {0x100016, 0x10001D, 0x100024, 0x10002B, 0x100032},
++	.rmii_ref_clk = {0x100015, 0x10001C, 0x100023, 0x10002A, 0x100031},
++	.rmii_ext_tx_clk = {0x100018, 0x10001F, 0x100026, 0x10002D, 0x100034},
++};
++
++static struct sja1105_regs sja1105pqrs_regs = {
++	.device_id = 0x0,
++	.prod_id = 0x100BC3,
++	.status = 0x1,
++	.port_control = 0x12,
++	.config = 0x020000,
++	.rgu = 0x100440,
++	/* UM10944.pdf, Table 86, ACU Register overview */
++	.pad_mii_tx = {0x100800, 0x100802, 0x100804, 0x100806, 0x100808},
++	.pad_mii_id = {0x100810, 0x100811, 0x100812, 0x100813, 0x100814},
++	.rmii_pll1 = 0x10000A,
++	.cgu_idiv = {0x10000B, 0x10000C, 0x10000D, 0x10000E, 0x10000F},
++	/* UM11040.pdf, Table 114 */
++	.mii_tx_clk = {0x100013, 0x100019, 0x10001F, 0x100025, 0x10002B},
++	.mii_rx_clk = {0x100014, 0x10001A, 0x100020, 0x100026, 0x10002C},
++	.mii_ext_tx_clk = {0x100017, 0x10001D, 0x100023, 0x100029, 0x10002F},
++	.mii_ext_rx_clk = {0x100018, 0x10001E, 0x100024, 0x10002A, 0x100030},
++	.rgmii_tx_clk = {0x100016, 0x10001C, 0x100022, 0x100028, 0x10002E},
++	.rmii_ref_clk = {0x100015, 0x10001B, 0x100021, 0x100027, 0x10002D},
++	.rmii_ext_tx_clk = {0x100017, 0x10001D, 0x100023, 0x100029, 0x10002F},
++	.sgmii = 0x1F0000,
++};
++
++enum sja1105_switch_id {
++	SJA1105E = 0,
++	SJA1105T,
++	SJA1105P,
++	SJA1105Q,
++	SJA1105R,
++	SJA1105S,
++};
++
++struct sja1105_info sja1105_info[] = {
++	[SJA1105E] = {
++		.device_id		= SJA1105E_DEVICE_ID,
++		.part_no		= SJA1105ET_PART_NO,
++		.static_ops		= sja1105et_table_ops,
++		.reset_cmd		= sja1105et_reset_cmd,
++		.regs			= &sja1105et_regs,
++		.name			= "SJA1105E",
++	},
++	[SJA1105T] = {
++		.device_id		= SJA1105T_DEVICE_ID,
++		.part_no		= SJA1105ET_PART_NO,
++		.static_ops		= sja1105et_table_ops,
++		.reset_cmd		= sja1105et_reset_cmd,
++		.regs			= &sja1105et_regs,
++		.name			= "SJA1105T",
++	},
++	[SJA1105P] = {
++		.device_id		= SJA1105PR_DEVICE_ID,
++		.part_no		= SJA1105P_PART_NO,
++		.static_ops		= sja1105pqrs_table_ops,
++		.setup_rgmii_delay	= sja1105pqrs_setup_rgmii_delay,
++		.reset_cmd		= sja1105pqrs_reset_cmd,
++		.regs			= &sja1105pqrs_regs,
++		.name			= "SJA1105P",
++	},
++	[SJA1105Q] = {
++		.device_id		= SJA1105QS_DEVICE_ID,
++		.part_no		= SJA1105Q_PART_NO,
++		.static_ops		= sja1105pqrs_table_ops,
++		.setup_rgmii_delay	= sja1105pqrs_setup_rgmii_delay,
++		.reset_cmd		= sja1105pqrs_reset_cmd,
++		.regs			= &sja1105pqrs_regs,
++		.name			= "SJA1105Q",
++	},
++	[SJA1105R] = {
++		.device_id		= SJA1105PR_DEVICE_ID,
++		.part_no		= SJA1105R_PART_NO,
++		.static_ops		= sja1105pqrs_table_ops,
++		.setup_rgmii_delay	= sja1105pqrs_setup_rgmii_delay,
++		.reset_cmd		= sja1105pqrs_reset_cmd,
++		.regs			= &sja1105pqrs_regs,
++		.name			= "SJA1105R",
++	},
++	[SJA1105S] = {
++		.device_id		= SJA1105QS_DEVICE_ID,
++		.part_no		= SJA1105S_PART_NO,
++		.static_ops		= sja1105pqrs_table_ops,
++		.setup_rgmii_delay	= sja1105pqrs_setup_rgmii_delay,
++		.reset_cmd		= sja1105pqrs_reset_cmd,
++		.regs			= &sja1105pqrs_regs,
++		.name			= "SJA1105S",
++	},
++};
++
++static void
++sja1105_port_allow_traffic(struct sja1105_l2_forwarding_entry *l2_fwd,
++			   int from, int to)
++{
++	l2_fwd[from].bc_domain  |= BIT(to);
++	l2_fwd[from].reach_port |= BIT(to);
++	l2_fwd[from].fl_domain  |= BIT(to);
++}
++
++static int sja1105_init_mac_settings(struct sja1105_private *priv)
++{
++	struct sja1105_mac_config_entry default_mac = {
++		/* Enable 1 priority queue on egress. */
++		.top  = {0x1FF, 0, 0, 0, 0, 0, 0},
++		.base = {0x0, 0, 0, 0, 0, 0, 0, 0},
++		.enabled = {1, 0, 0, 0, 0, 0, 0, 0},
++		/* Default for all ports including the CPU. FIXME: may not work
++		 * for all ports.
++		 */
++		.speed = SJA1105_SPEED_1000MBPS,
++		/* Disable aging for critical TTEthernet traffic */
++		.maxage = 0xFF,
++		.dyn_learn = true,
++		.egress = true,
++		.ingress = true,
++	};
++	struct sja1105_mac_config_entry *mac;
++	struct sja1105_table *table;
++	int port;
++
++	table = &priv->static_config.tables[BLK_IDX_MAC_CONFIG];
++
++	table->entries = calloc(SJA1105_NUM_PORTS,
++				table->ops->unpacked_entry_size);
++	if (!table->entries)
++		return -ENOMEM;
++
++	table->entry_count = SJA1105_NUM_PORTS;
++
++	mac = table->entries;
++
++	for (port = 0; port < SJA1105_NUM_PORTS; port++) {
++		mac[port] = default_mac;
++		/* Internal VLAN (pvid) to apply to untagged ingress */
++		mac[port].vlanid = priv->pvid[port];
++	}
++
++	return 0;
++}
++
++static bool sja1105_supports_sgmii(struct sja1105_private *priv, int port)
++{
++	if (priv->info->part_no != SJA1105R_PART_NO &&
++	    priv->info->part_no != SJA1105S_PART_NO)
++		return false;
++
++	if (port != SJA1105_SGMII_PORT)
++		return false;
++
++	return true;
++}
++
++static int sja1105_init_mii_settings(struct sja1105_private *priv)
++{
++	struct dsa_perdev_platdata *platdata = priv->dev->platdata;
++	struct sja1105_xmii_params_entry *mii;
++	struct sja1105_table *table;
++	int port;
++
++	table = &priv->static_config.tables[BLK_IDX_XMII_PARAMS];
++
++	table->entries = calloc(SJA1105_MAX_XMII_PARAMS_COUNT,
++				table->ops->unpacked_entry_size);
++	if (!table->entries)
++		return -ENOMEM;
++
++	/* Override table based on DT bindings */
++	table->entry_count = SJA1105_MAX_XMII_PARAMS_COUNT;
++
++	mii = table->entries;
++
++	for (port = 0; port < SJA1105_NUM_PORTS; port++) {
++		struct phy_device *phy = platdata->port[port].phy;
++
++		switch (priv->phy_modes[port]) {
++		case PHY_INTERFACE_MODE_MII:
++			mii->xmii_mode[port] = XMII_MODE_MII;
++			break;
++		case PHY_INTERFACE_MODE_RMII:
++			mii->xmii_mode[port] = XMII_MODE_RMII;
++			break;
++		case PHY_INTERFACE_MODE_RGMII:
++		case PHY_INTERFACE_MODE_RGMII_ID:
++		case PHY_INTERFACE_MODE_RGMII_RXID:
++		case PHY_INTERFACE_MODE_RGMII_TXID:
++			mii->xmii_mode[port] = XMII_MODE_RGMII;
++			break;
++		case PHY_INTERFACE_MODE_SGMII:
++			if (!sja1105_supports_sgmii(priv, port))
++				return -EINVAL;
++			mii->xmii_mode[port] = XMII_MODE_SGMII;
++			break;
++		default:
++			return -EINVAL;
++		}
++
++		if (priv->phy_modes[port] != PHY_INTERFACE_MODE_SGMII &&
++		    (!phy || phy->phy_id == PHY_FIXED_ID))
++			mii->phy_mac[port] = XMII_PHY;
++		else
++			mii->phy_mac[port] = XMII_MAC;
++	}
++	return 0;
++}
++
++static int sja1105_init_l2_lookup_params(struct sja1105_private *priv)
++{
++	u64 max_fdb_entries = SJA1105_MAX_L2_LOOKUP_COUNT / SJA1105_NUM_PORTS;
++	struct sja1105_l2_lookup_params_entry default_l2_lookup_params = {
++		/* All entries within a FDB bin are available for learning */
++		.dyn_tbsz = SJA1105ET_FDB_BIN_SIZE,
++		/* And the P/Q/R/S equivalent setting: */
++		.start_dynspc = 0,
++		.maxaddrp = {max_fdb_entries, max_fdb_entries, max_fdb_entries,
++			     max_fdb_entries, max_fdb_entries, },
++		/* 2^8 + 2^5 + 2^3 + 2^2 + 2^1 + 1 in Koopman notation */
++		.poly = 0x97,
++		/* P/Q/R/S only */
++		.use_static = true,
++		/* Dynamically learned FDB entries can overwrite other (older)
++		 * dynamic FDB entries
++		 */
++		.owr_dyn = true,
++	};
++	struct sja1105_table *table;
++
++	table = &priv->static_config.tables[BLK_IDX_L2_LOOKUP_PARAMS];
++
++	table->entries = calloc(SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT,
++				table->ops->unpacked_entry_size);
++	if (!table->entries)
++		return -ENOMEM;
++
++	table->entry_count = SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT;
++
++	/* This table only has a single entry */
++	((struct sja1105_l2_lookup_params_entry *)table->entries)[0] =
++				default_l2_lookup_params;
++
++	return 0;
++}
++
++static void sja1105_setup_tagging(struct sja1105_private *priv, int port)
++{
++	struct dsa_perdev_platdata *platdata = priv->dev->platdata;
++	struct sja1105_vlan_lookup_entry *vlan;
++	int cpu = platdata->cpu_port;
++
++	/* The CPU port is implicitly configured by
++	 * configuring the front-panel ports
++	 */
++	if (port == cpu)
++		return;
++
++	vlan = priv->static_config.tables[BLK_IDX_VLAN_LOOKUP].entries;
++
++	priv->pvid[port] = DSA_8021Q_DIR_RX | DSA_8021Q_PORT(port);
++
++	vlan[port].vmemb_port	= BIT(port) | BIT(cpu);
++	vlan[port].vlan_bc	= BIT(port) | BIT(cpu);
++	vlan[port].tag_port	= BIT(cpu);
++	vlan[port].vlanid	= priv->pvid[port];
++}
++
++static int sja1105_init_vlan(struct sja1105_private *priv)
++{
++	struct sja1105_table *table;
++	int port;
++
++	table = &priv->static_config.tables[BLK_IDX_VLAN_LOOKUP];
++
++	table->entries = calloc(SJA1105_NUM_PORTS,
++				table->ops->unpacked_entry_size);
++	if (!table->entries)
++		return -ENOMEM;
++
++	table->entry_count = SJA1105_NUM_PORTS;
++
++	for (port = 0; port < SJA1105_NUM_PORTS; port++)
++		sja1105_setup_tagging(priv, port);
++
++	return 0;
++}
++
++static int sja1105_init_l2_forwarding(struct sja1105_private *priv)
++{
++	struct dsa_perdev_platdata *platdata = priv->dev->platdata;
++	struct sja1105_l2_forwarding_entry *l2fwd;
++	int cpu = platdata->cpu_port;
++	struct sja1105_table *table;
++	int i;
++
++	table = &priv->static_config.tables[BLK_IDX_L2_FORWARDING];
++
++	table->entries = calloc(SJA1105_MAX_L2_FORWARDING_COUNT,
++				table->ops->unpacked_entry_size);
++	if (!table->entries)
++		return -ENOMEM;
++
++	table->entry_count = SJA1105_MAX_L2_FORWARDING_COUNT;
++
++	l2fwd = table->entries;
++
++	/* First 5 entries define the forwarding rules */
++	for (i = 0; i < SJA1105_NUM_PORTS; i++) {
++		if (i == cpu)
++			continue;
++
++		sja1105_port_allow_traffic(l2fwd, i, cpu);
++		sja1105_port_allow_traffic(l2fwd, cpu, i);
++	}
++	/* Next 8 entries define VLAN PCP mapping from ingress to egress.
++	 * Leave them unpopulated (implicitly 0) but present.
++	 */
++	return 0;
++}
++
++static int sja1105_init_l2_forwarding_params(struct sja1105_private *priv)
++{
++	struct sja1105_l2_forwarding_params_entry default_l2fwd_params = {
++		/* Use a single memory partition for all ingress queues */
++		.part_spc = { SJA1105_MAX_FRAME_MEMORY, 0, 0, 0, 0, 0, 0, 0 },
++	};
++	struct sja1105_table *table;
++
++	table = &priv->static_config.tables[BLK_IDX_L2_FORWARDING_PARAMS];
++
++	table->entries = calloc(SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT,
++				table->ops->unpacked_entry_size);
++	if (!table->entries)
++		return -ENOMEM;
++
++	table->entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT;
++
++	/* This table only has a single entry */
++	((struct sja1105_l2_forwarding_params_entry *)table->entries)[0] =
++				default_l2fwd_params;
++
++	return 0;
++}
++
++static int sja1105_init_general_params(struct sja1105_private *priv)
++{
++	struct sja1105_general_params_entry default_general_params = {
++		/* No frame trapping */
++		.mac_fltres1 = 0x0,
++		.mac_flt1    = 0xffffffffffff,
++		.mac_fltres0 = 0x0,
++		.mac_flt0    = 0xffffffffffff,
++		.host_port = SJA1105_NUM_PORTS,
++		/* No mirroring => specify an out-of-range port value */
++		.mirr_port = SJA1105_NUM_PORTS,
++		/* No link-local trapping => specify an out-of-range port value
++		 */
++		.casc_port = SJA1105_NUM_PORTS,
++		/* Force the switch to see all traffic as untagged. */
++		.tpid = ETH_P_SJA1105,
++		.tpid2 = ETH_P_SJA1105,
++	};
++	struct sja1105_table *table;
++
++	table = &priv->static_config.tables[BLK_IDX_GENERAL_PARAMS];
++
++	table->entries = calloc(SJA1105_MAX_GENERAL_PARAMS_COUNT,
++				table->ops->unpacked_entry_size);
++	if (!table->entries)
++		return -ENOMEM;
++
++	table->entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT;
++
++	/* This table only has a single entry */
++	((struct sja1105_general_params_entry *)table->entries)[0] =
++				default_general_params;
++
++	return 0;
++}
++
++static void sja1105_setup_policer(struct sja1105_l2_policing_entry *policing,
++				  int index, int mtu)
++{
++	policing[index].sharindx = index;
++	policing[index].smax = 65535; /* Burst size in bytes */
++	policing[index].rate = SJA1105_RATE_MBPS(1000);
++	policing[index].maxlen = mtu;
++	policing[index].partition = 0;
++}
++
++static int sja1105_init_l2_policing(struct sja1105_private *priv)
++{
++	struct dsa_perdev_platdata *platdata = priv->dev->platdata;
++	struct sja1105_l2_policing_entry *policing;
++	int cpu = platdata->cpu_port;
++	struct sja1105_table *table;
++	int i, j, k;
++
++	table = &priv->static_config.tables[BLK_IDX_L2_POLICING];
++
++	table->entries = calloc(SJA1105_MAX_L2_POLICING_COUNT,
++				table->ops->unpacked_entry_size);
++	if (!table->entries)
++		return -ENOMEM;
++
++	table->entry_count = SJA1105_MAX_L2_POLICING_COUNT;
++
++	policing = table->entries;
++
++	/* k sweeps through all unicast policers (0-39).
++	 * bcast sweeps through policers 40-44.
++	 */
++	for (i = 0, k = 0; i < SJA1105_NUM_PORTS; i++) {
++		int bcast = (SJA1105_NUM_PORTS * SJA1105_NUM_TC) + i;
++		int mtu = VLAN_ETH_FRAME_LEN + ETH_FCS_LEN;
++
++		if (i == cpu)
++			mtu += VLAN_HLEN;
++
++		for (j = 0; j < SJA1105_NUM_TC; j++, k++)
++			sja1105_setup_policer(policing, k, mtu);
++
++		/* Set up this port's policer for broadcast traffic */
++		sja1105_setup_policer(policing, bcast, mtu);
++	}
++	return 0;
++}
++
++struct sja1105_status {
++	u64 configs;
++	u64 crcchkl;
++	u64 ids;
++	u64 crcchkg;
++};
++
++static void sja1105_status_unpack(void *buf, struct sja1105_status *status)
++{
++	sja1105_packing(buf, &status->configs,   31, 31, 4, UNPACK);
++	sja1105_packing(buf, &status->crcchkl,   30, 30, 4, UNPACK);
++	sja1105_packing(buf, &status->ids,       29, 29, 4, UNPACK);
++	sja1105_packing(buf, &status->crcchkg,   28, 28, 4, UNPACK);
++}
++
++static int sja1105_status_get(struct sja1105_private *priv,
++			      struct sja1105_status *status)
++{
++	const struct sja1105_regs *regs = priv->info->regs;
++	u8 packed_buf[4];
++	int rc;
++
++	rc = sja1105_xfer_buf(priv, SPI_READ, regs->status, packed_buf, 4);
++	if (rc < 0)
++		return rc;
++
++	sja1105_status_unpack(packed_buf, status);
++
++	return 0;
++}
++
++/* Not const because unpacking priv->static_config into buffers and preparing
++ * for upload requires the recalculation of table CRCs and updating the
++ * structures with these.
++ */
++static int
++static_config_buf_prepare_for_upload(struct sja1105_private *priv,
++				     void *config_buf, int buf_len)
++{
++	struct sja1105_static_config *config = &priv->static_config;
++	struct sja1105_table_header final_header;
++	char *final_header_ptr;
++	int crc_len;
++
++	/* Write Device ID and config tables to config_buf */
++	sja1105_static_config_pack(config_buf, config);
++	/* Recalculate CRC of the last header (right now 0xDEADBEEF).
++	 * Don't include the CRC field itself.
++	 */
++	crc_len = buf_len - 4;
++	/* Read the whole table header */
++	final_header_ptr = config_buf + buf_len - SJA1105_SIZE_TABLE_HEADER;
++	sja1105_table_header_packing(final_header_ptr, &final_header, UNPACK);
++	/* Modify */
++	final_header.crc = sja1105_crc32(config_buf, crc_len);
++	/* Rewrite */
++	sja1105_table_header_packing(final_header_ptr, &final_header, PACK);
++
++	return 0;
++}
++
++static int sja1105_static_config_upload(struct sja1105_private *priv)
++{
++	struct sja1105_static_config *config = &priv->static_config;
++	const struct sja1105_regs *regs = priv->info->regs;
++	struct sja1105_status status;
++	u8 *config_buf;
++	int buf_len;
++	int rc;
++
++	buf_len = sja1105_static_config_get_length(config);
++	config_buf = calloc(buf_len, sizeof(char));
++	if (!config_buf)
++		return -ENOMEM;
++
++	rc = static_config_buf_prepare_for_upload(priv, config_buf, buf_len);
++	if (rc < 0) {
++		printf("Invalid config, cannot upload\n");
++		rc = -EINVAL;
++		goto out;
++	}
++	/* Put the SJA1105 in programming mode */
++	rc = priv->info->reset_cmd(priv);
++	if (rc < 0) {
++		printf("Failed to reset switch\n");
++		goto out;
++	}
++	/* Wait for the switch to come out of reset */
++	udelay(1000);
++	/* Upload the static config to the device */
++	rc = sja1105_xfer_buf(priv, SPI_WRITE, regs->config,
++			      config_buf, buf_len);
++	if (rc < 0) {
++		printf("Failed to upload config\n");
++		goto out;
++	}
++	/* Check that SJA1105 responded well to the config upload */
++	rc = sja1105_status_get(priv, &status);
++	if (rc < 0)
++		goto out;
++
++	if (status.ids == 1) {
++		printf("Mismatch between hardware and static config device id. "
++		       "Wrote 0x%llx, wants 0x%llx\n",
++		       config->device_id, priv->info->device_id);
++		rc = -EIO;
++		goto out;
++	}
++	if (status.crcchkl == 1 || status.crcchkg == 1) {
++		printf("Switch reported invalid CRC on static config\n");
++		rc = -EIO;
++		goto out;
++	}
++	if (status.configs == 0) {
++		printf("Switch reported that config is invalid\n");
++		rc = -EIO;
++		goto out;
++	}
++
++out:
++	free(config_buf);
++	return rc;
++}
++
++static int sja1105_static_config_load(struct sja1105_private *priv)
++{
++	int rc;
++
++	rc = sja1105_static_config_init(&priv->static_config,
++					priv->info->static_ops,
++					priv->info->device_id);
++	if (rc)
++		return rc;
++
++	/* Build static configuration */
++	rc = sja1105_init_vlan(priv);
++	if (rc < 0)
++		return rc;
++	rc = sja1105_init_mac_settings(priv);
++	if (rc < 0)
++		return rc;
++	rc = sja1105_init_mii_settings(priv);
++	if (rc < 0)
++		return rc;
++	rc = sja1105_init_l2_lookup_params(priv);
++	if (rc < 0)
++		return rc;
++	rc = sja1105_init_l2_forwarding(priv);
++	if (rc < 0)
++		return rc;
++	rc = sja1105_init_l2_forwarding_params(priv);
++	if (rc < 0)
++		return rc;
++	rc = sja1105_init_l2_policing(priv);
++	if (rc < 0)
++		return rc;
++	rc = sja1105_init_general_params(priv);
++	if (rc < 0)
++		return rc;
++
++	/* Send initial configuration to hardware via SPI */
++	return sja1105_static_config_upload(priv);
++}
++
++static int sja1105_static_config_reload(struct sja1105_private *priv)
++{
++	int rc;
++
++	rc = sja1105_static_config_upload(priv);
++	if (rc < 0) {
++		printf("Failed to load static config: %d\n", rc);
++		return rc;
++	}
++
++	/* Configure the CGU (PHY link modes and speeds) */
++	rc = sja1105_clocking_setup(priv);
++	if (rc < 0) {
++		printf("Failed to configure MII clocking: %d\n", rc);
++		return rc;
++	}
++
++	return 0;
++}
++
++static int sja1105_port_enable(struct udevice *dev, int port,
++			       struct phy_device *phy)
++{
++	struct sja1105_private *priv = dev_get_priv(dev);
++	struct sja1105_xmii_params_entry *mii;
++	struct sja1105_mac_config_entry *mac;
++
++	if (phy)
++		phy_startup(phy);
++
++	mii = priv->static_config.tables[BLK_IDX_XMII_PARAMS].entries;
++	mac = priv->static_config.tables[BLK_IDX_MAC_CONFIG].entries;
++
++	if (mii->xmii_mode[port] == XMII_MODE_SGMII) {
++		priv->sgmii_cfg.inband_an = (phy && phy->phy_id != PHY_FIXED_ID);
++		priv->sgmii_cfg.pcs_speed = BMCR_SPEED1000;
++		mac[port].speed = SJA1105_SPEED_1000MBPS;
++	} else {
++		int speed = phy ? phy->speed : SPEED_1000;
++
++		switch (speed) {
++		case SPEED_1000:
++			mac[port].speed = SJA1105_SPEED_1000MBPS;
++			break;
++		case SPEED_100:
++			mac[port].speed = SJA1105_SPEED_100MBPS;
++			break;
++		case SPEED_10:
++			mac[port].speed = SJA1105_SPEED_10MBPS;
++			break;
++		default:
++			printf("Invalid speed %d\n", speed);
++			return -EINVAL;
++		}
++	}
++
++	return sja1105_static_config_reload(priv);
++}
++
++static void sja1105_port_disable(struct udevice *dev, int port,
++				 struct phy_device *phy)
++{
++	if (phy)
++		phy_shutdown(phy);
++}
++
++static int sja1105_xmit(struct udevice *dev, int port, void *packet, int length)
++{
++	struct sja1105_private *priv = dev_get_priv(dev);
++	u8 *from = (u8 *)packet + VLAN_HLEN;
++	struct vlan_ethhdr *hdr = packet;
++	u8 *dest = (u8 *)packet;
++
++	memmove(dest, from, 2 * ETH_ALEN);
++	hdr->h_vlan_proto = htons(ETH_P_SJA1105);
++	hdr->h_vlan_TCI = htons(priv->pvid[port]);
++
++	return 0;
++}
++
++static int sja1105_rcv(struct udevice *dev, int *port, void *packet, int length)
++{
++	struct vlan_ethhdr *hdr = packet;
++	u8 *dest = packet + VLAN_HLEN;
++	u8 *from = packet;
++
++	if (ntohs(hdr->h_vlan_proto) != ETH_P_SJA1105)
++		return -EINVAL;
++
++	*port = ntohs(hdr->h_vlan_TCI) & DSA_8021Q_PORT_MASK;
++	memmove(dest, from, 2 * ETH_ALEN);
++
++	return 0;
++}
++
++static const struct dsa_ops sja1105_dsa_ops = {
++	.port_enable	= sja1105_port_enable,
++	.port_disable	= sja1105_port_disable,
++	.xmit		= sja1105_xmit,
++	.rcv		= sja1105_rcv,
++};
++
++static int sja1105_init_port(struct sja1105_private *priv, int port)
++{
++	struct dsa_perdev_platdata *platdata = priv->dev->platdata;
++	int phy_mode = PHY_INTERFACE_MODE_NONE;
++	struct phy_device *phy;
++	const char *if_str;
++
++	if (!ofnode_is_available(platdata->port[port].node)) {
++		dev_dbg(priv->dev, "port %d is not available, skipping\n",
++			port);
++		return 0;
++	}
++
++	if_str = ofnode_read_string(platdata->port[port].node, "phy-mode");
++	if (if_str)
++		phy_mode = phy_get_interface_by_name(if_str);
++
++	phy = platdata->port[port].phy;
++	if (phy) {
++		if (phy_mode == PHY_INTERFACE_MODE_MII ||
++		    phy_mode == PHY_INTERFACE_MODE_RMII) {
++			phy->supported &= PHY_BASIC_FEATURES;
++			phy->advertising &= PHY_BASIC_FEATURES;
++		} else {
++			phy->supported &= PHY_GBIT_FEATURES;
++			phy->advertising &= PHY_GBIT_FEATURES;
++		}
++		phy_config(phy);
++	}
++
++	if (phy_mode != PHY_INTERFACE_MODE_RGMII_TXID &&
++	    phy_mode != PHY_INTERFACE_MODE_RGMII_RXID &&
++	    phy_mode != PHY_INTERFACE_MODE_RGMII_ID &&
++	    phy_mode != PHY_INTERFACE_MODE_RGMII &&
++	    phy_mode != PHY_INTERFACE_MODE_SGMII &&
++	    phy_mode != PHY_INTERFACE_MODE_RMII &&
++	    phy_mode != PHY_INTERFACE_MODE_MII) {
++		printf("Unsupported PHY mode %s!\n", if_str);
++		return -EINVAL;
++	}
++
++	/* Let the PHY handle the RGMII delays, if present. */
++	if (!phy || phy->phy_id == PHY_FIXED_ID) {
++		if (phy_mode == PHY_INTERFACE_MODE_RGMII_RXID ||
++		    phy_mode == PHY_INTERFACE_MODE_RGMII_ID)
++			priv->rgmii_rx_delay[port] = true;
++
++		if (phy_mode == PHY_INTERFACE_MODE_RGMII_TXID ||
++		    phy_mode == PHY_INTERFACE_MODE_RGMII_ID)
++			priv->rgmii_tx_delay[port] = true;
++
++		if ((priv->rgmii_rx_delay[port] ||
++		     priv->rgmii_tx_delay[port]) &&
++		     !priv->info->setup_rgmii_delay)
++			return -EINVAL;
++	}
++
++	priv->phy_modes[port] = phy_mode;
++
++	return 0;
++}
++
++static int sja1105_init(struct sja1105_private *priv)
++{
++	int port;
++	int rc;
++
++	for (port = 0; port < SJA1105_NUM_PORTS; port++) {
++		rc = sja1105_init_port(priv, port);
++		if (rc < 0) {
++			printf("Failed to initialize port %d\n", port);
++			return rc;
++		}
++	}
++
++	rc = sja1105_static_config_load(priv);
++	if (rc < 0) {
++		printf("Failed to load static config: %d\n", rc);
++		return rc;
++	}
++
++	/* Configure the CGU (PHY link modes and speeds) */
++	rc = sja1105_clocking_setup(priv);
++	if (rc < 0) {
++		printf("Failed to configure MII clocking: %d\n", rc);
++		return rc;
++	}
++
++	return 0;
++}
++
++static int sja1105_check_device_id(struct sja1105_private *priv)
++{
++	const struct sja1105_regs *regs = priv->info->regs;
++	u8 packed_buf[SJA1105_SIZE_DEVICE_ID] = {0};
++	u64 device_id;
++	u64 part_no;
++	int rc;
++
++	rc = sja1105_xfer_buf(priv, SPI_READ, regs->device_id, packed_buf,
++			      SJA1105_SIZE_DEVICE_ID);
++	if (rc < 0)
++		return rc;
++
++	sja1105_packing(packed_buf, &device_id, 31, 0, SJA1105_SIZE_DEVICE_ID,
++			UNPACK);
++
++	if (device_id != priv->info->device_id) {
++		printf("Expected device ID 0x%llx but read 0x%llx\n",
++		       priv->info->device_id, device_id);
++		return -ENODEV;
++	}
++
++	rc = sja1105_xfer_buf(priv, SPI_READ, regs->prod_id, packed_buf,
++			      SJA1105_SIZE_DEVICE_ID);
++	if (rc < 0)
++		return rc;
++
++	sja1105_packing(packed_buf, &part_no, 19, 4, SJA1105_SIZE_DEVICE_ID,
++			UNPACK);
++
++	if (part_no != priv->info->part_no) {
++		printf("Expected part number 0x%llx but read 0x%llx\n",
++		       priv->info->part_no, part_no);
++		return -ENODEV;
++	}
++
++	return 0;
++}
++
++static int sja1105_probe(struct udevice *dev)
++{
++	enum sja1105_switch_id id = dev_get_driver_data(dev);
++	struct sja1105_private *priv = dev_get_priv(dev);
++	int rc;
++
++	if (ofnode_valid(dev->node) && !ofnode_is_available(dev->node)) {
++		dev_dbg(dev, "switch disabled\n");
++		return -ENODEV;
++	}
++
++	priv->info = &sja1105_info[id];
++	priv->dev = dev;
++
++	rc = sja1105_check_device_id(priv);
++	if (rc < 0) {
++		dev_err(dev, "Device ID check failed: %d\n", rc);
++		return rc;
++	}
++
++	return sja1105_init(priv);
++}
++
++static int sja1105_remove(struct udevice *dev)
++{
++	struct sja1105_private *priv = dev->priv;
++
++	sja1105_static_config_free(&priv->static_config);
++
++	return 0;
++}
++
++static int sja1105_bind(struct udevice *dev)
++{
++	struct dsa_perdev_platdata *pdata = dev->platdata;
++
++	pdata->num_ports = SJA1105_NUM_PORTS;
++	pdata->headroom = VLAN_HLEN;
++
++	return 0;
++}
++
++static const struct udevice_id sja1105_ids[] = {
++	{ .compatible = "nxp,sja1105e", .data = SJA1105E },
++	{ .compatible = "nxp,sja1105t", .data = SJA1105T },
++	{ .compatible = "nxp,sja1105p", .data = SJA1105P },
++	{ .compatible = "nxp,sja1105q", .data = SJA1105Q },
++	{ .compatible = "nxp,sja1105r", .data = SJA1105R },
++	{ .compatible = "nxp,sja1105s", .data = SJA1105S },
++	{ }
++};
++
++U_BOOT_DRIVER(sja1105) = {
++	.name				= "sja1105",
++	.id				= UCLASS_DSA,
++	.of_match			= sja1105_ids,
++	.bind				= sja1105_bind,
++	.probe				= sja1105_probe,
++	.remove				= sja1105_remove,
++	.ops				= &sja1105_dsa_ops,
++	.priv_auto_alloc_size		= sizeof(struct sja1105_private),
++	.platdata_auto_alloc_size	= sizeof(struct dsa_perdev_platdata),
++};
+diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h
+index 0c563d898b..f21ee4071a 100644
+--- a/include/dm/uclass-id.h
++++ b/include/dm/uclass-id.h
+@@ -42,6 +42,7 @@ enum uclass_id {
+ 	UCLASS_DISPLAY,		/* Display (e.g. DisplayPort, HDMI) */
+ 	UCLASS_DSI_HOST,	/* Display Serial Interface host */
+ 	UCLASS_DMA,		/* Direct Memory Access */
++    UCLASS_DSA,		/* Distributed (Ethernet) Switch Architecture */
+ 	UCLASS_EFI,		/* EFI managed devices */
+ 	UCLASS_ETH,		/* Ethernet device */
+ 	UCLASS_FIRMWARE,	/* Firmware */
+diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h
+new file mode 100644
+index 0000000000..cbc82f4cc2
+--- /dev/null
++++ b/include/linux/if_vlan.h
+@@ -0,0 +1,26 @@
++/* SPDX-License-Identifier: GPL-2.0-or-later */
++/*
++ * VLAN		An implementation of 802.1Q VLAN tagging.
++ *
++ * Authors:	Ben Greear <greearb@candelatech.com>
++ */
++#ifndef _LINUX_IF_VLAN_H_
++#define _LINUX_IF_VLAN_H_
++
++/**
++ *	struct vlan_ethhdr - vlan ethernet header (ethhdr + vlan_hdr)
++ *	@h_dest: destination ethernet address
++ *	@h_source: source ethernet address
++ *	@h_vlan_proto: ethernet protocol
++ *	@h_vlan_TCI: priority and VLAN ID
++ *	@h_vlan_encapsulated_proto: packet type ID or len
++ */
++struct vlan_ethhdr {
++	unsigned char	h_dest[ETH_ALEN];
++	unsigned char	h_source[ETH_ALEN];
++	__be16		h_vlan_proto;
++	__be16		h_vlan_TCI;
++	__be16		h_vlan_encapsulated_proto;
++};
++
++#endif /* !(_LINUX_IF_VLAN_H_) */
+diff --git a/include/linux/packing.h b/include/linux/packing.h
+new file mode 100644
+index 0000000000..194e29b8c9
+--- /dev/null
++++ b/include/linux/packing.h
+@@ -0,0 +1,49 @@
++// SPDX-License-Identifier: BSD-3-Clause
++/*
++ * Copyright 2016-2018,2020 NXP
++ */
++#ifndef _LINUX_PACKING_H
++#define _LINUX_PACKING_H
++
++#include <linux/types.h>
++#include <linux/bitops.h>
++
++#define QUIRK_MSB_ON_THE_RIGHT	BIT(0)
++#define QUIRK_LITTLE_ENDIAN	BIT(1)
++#define QUIRK_LSW32_IS_FIRST	BIT(2)
++
++enum packing_op {
++	PACK,
++	UNPACK,
++};
++
++/**
++ * packing - Convert numbers (currently u64) between a packed and an unpacked
++ *	     format. Unpacked means laid out in memory in the CPU's native
++ *	     understanding of integers, while packed means anything else that
++ *	     requires translation.
++ *
++ * @pbuf: Pointer to a buffer holding the packed value.
++ * @uval: Pointer to an u64 holding the unpacked value.
++ * @startbit: The index (in logical notation, compensated for quirks) where
++ *	      the packed value starts within pbuf. Must be larger than, or
++ *	      equal to, endbit.
++ * @endbit: The index (in logical notation, compensated for quirks) where
++ *	    the packed value ends within pbuf. Must be smaller than, or equal
++ *	    to, startbit.
++ * @op: If PACK, then uval will be treated as const pointer and copied (packed)
++ *	into pbuf, between startbit and endbit.
++ *	If UNPACK, then pbuf will be treated as const pointer and the logical
++ *	value between startbit and endbit will be copied (unpacked) to uval.
++ * @quirks: A bit mask of QUIRK_LITTLE_ENDIAN, QUIRK_LSW32_IS_FIRST and
++ *	    QUIRK_MSB_ON_THE_RIGHT.
++ *
++ * Return: 0 on success, EINVAL or ERANGE if called incorrectly. Assuming
++ *	   correct usage, return code may be discarded.
++ *	   If op is PACK, pbuf is modified.
++ *	   If op is UNPACK, uval is modified.
++ */
++int packing(void *pbuf, u64 *uval, int startbit, int endbit, size_t pbuflen,
++	    enum packing_op op, u8 quirks);
++
++#endif
+diff --git a/include/net/dsa.h b/include/net/dsa.h
+new file mode 100644
+index 0000000000..be95cc68ea
+--- /dev/null
++++ b/include/net/dsa.h
+@@ -0,0 +1,141 @@
++/* SPDX-License-Identifier: GPL-2.0+ */
++/*
++ * Copyright 2019 NXP
++ */
++
++#ifndef __DSA_H__
++#define __DSA_H__
++
++#include <common.h>
++#include <dm.h>
++#include <phy.h>
++
++/**
++ * DSA stands for Distributed Switch Architecture and it is infrastructure
++ * intended to support drivers for Switches that rely on an intermediary
++ * Ethernet device for I/O.  These switches may support cascading allowing
++ * them to be arranged as a tree.
++ * DSA is documented in detail in the Linux kernel documentation under
++ * Documentation/networking/dsa/dsa.txt
++ * The network layout of such a switch is shown below:
++ *
++ *	    |---------------------------
++ *	    | CPU network device (eth0)|
++ *	    ----------------------------
++ *	    | <tag added by switch     |
++ *	    |                          |
++ *	    |                          |
++ *	    |        tag added by CPU> |
++ *	|--------------------------------------------|
++ *	| Switch driver				     |
++ *	|--------------------------------------------|
++ *	    ||        ||         ||
++ *	|-------|  |-------|  |-------|
++ *	| sw0p0 |  | sw0p1 |  | sw0p2 |
++ *	|-------|  |-------|  |-------|
++ *
++ * In U-Boot the intent is to allow access to front panel ports (shown at the
++ * bottom of the picture) though the master Ethernet port (eth0 in the picture).
++ * Front panel ports are presented as regular Ethernet devices in U-Boot and
++ * they are expected to support the typical networking commands.
++ * In general DSA switches require the use of tags, extra headers added both by
++ * software on Tx and by the switch on Rx.  These tags carry at a minimum port
++ * information and switch information for cascaded set-ups.
++ * In U-Boot these tags are inserted and parsed by the DSA switch driver, the
++ * class code helps with headroom/tailroom for the extra headers.
++ *
++ * TODO:
++ * - handle switch cascading, for now U-Boot only supports stand-alone switches.
++ * - propagate the master Eth MAC address to switch ports, this is used in
++ * Linux to avoid using additional MAC addresses on master Eth.
++ * - Add support to probe DSA switches connected to a MDIO bus, this is needed
++ * to convert switch drivers that are now under drivers/net/phy.
++ */
++
++#define DSA_PORT_NAME_LENGTH	16
++
++/* Maximum number of ports each DSA device can have */
++#define DSA_MAX_PORTS		12
++/* Used to size internal buffers, no support for jumbo yet */
++#define DSA_MAX_FRAME_SIZE	2048
++
++/**
++ * struct dsa_ops - DSA operations
++ *
++ * @port_enable:  Initialize a switch port for I/O
++ * @port_disable: Disable a port
++ * @xmit:         Insert the DSA tag for transmission
++ *                DSA drivers receive a copy of the packet with headroom and
++ *                tailroom reserved and set to 0.
++ *                Packet points to headroom and length is updated to include
++ *                both headroom and tailroom
++ * @rcv:          Process the DSA tag on reception
++ *                Packet and length describe the frame as received from master
++ *                including any additional headers
++ */
++struct dsa_ops {
++	int (*port_enable)(struct udevice *dev, int port,
++			   struct phy_device *phy);
++	void (*port_disable)(struct udevice *dev, int port,
++			     struct phy_device *phy);
++	int (*xmit)(struct udevice *dev, int port, void *packet, int length);
++	int (*rcv)(struct udevice *dev, int *port, void *packet, int length);
++};
++
++#define dsa_get_ops(dev) ((struct dsa_ops *)(dev)->driver->ops)
++
++/**
++ * struct dsa_port_platdata - DSA port platform data
++ *
++ * @dev :  Port u-device
++ *         Uclass code sets this field for all ports
++ * @phy:   PHY device associated with this port
++ *         Uclass code sets this field for all ports except CPU port, based on
++ *         DT information.  It may be NULL.
++ * @node:  Port DT node, if any.  Uclass code sets this field.
++ * @index: Port index in the DSA switch, set by class code.
++ * @name:  Name of the port Eth device.  If a label property is present in the
++ *         port DT node, it is used as name.  Drivers can use custom names by
++ *         populating this field, otherwise class code generates a default.
++ */
++struct dsa_port_platdata {
++	struct udevice *dev;
++	struct phy_device *phy;
++	ofnode node;
++	int index;
++	char name[DSA_PORT_NAME_LENGTH];
++};
++
++/**
++ * struct dsa_perdev_platdata - Per-device platform data for DSA DM
++ *
++ * @num_ports:   Number of ports the device has, must be <= DSA_MAX_PORTS
++ *               All DSA drivers must set this at _bind
++ * @headroom:    Size, in bytes, of headroom needed for the DSA tag
++ *               All DSA drivers must set this at _bind or _probe
++ * @tailroom:    Size, in bytes, of tailroom needed for the DSA tag
++ *               DSA class code allocates headroom and tailroom on Tx before
++ *               calling DSA driver xmit function
++ *               All DSA drivers must set this at _bind or _probe
++ * @master_node: DT node of the master Ethernet.  DT is optional so this may be
++ *               null.
++ * @master_dev:  Ethernet device to be used as master.  Uclass code sets this
++ *               based on DT information if present, otherwise drivers must set
++ *               this field in _probe.
++ * @cpu_port:    Index of switch port linked to master Ethernet.
++ *               Uclass code sets this based on DT information if present,
++ *               otherwise drivers must set this field in _bind.
++ * @port:        per-port data
++ */
++struct dsa_perdev_platdata {
++	int num_ports;
++	int headroom;
++	int tailroom;
++
++	ofnode master_node;
++	struct udevice *master_dev;
++	int cpu_port;
++	struct dsa_port_platdata port[DSA_MAX_PORTS];
++};
++
++#endif /* __DSA_H__ */
+diff --git a/lib/Kconfig b/lib/Kconfig
+index 965cf7bc03..a828b80a40 100644
+--- a/lib/Kconfig
++++ b/lib/Kconfig
+@@ -33,6 +33,23 @@ config HAVE_PRIVATE_LIBGCC
+ config LIB_UUID
+ 	bool
+ 
++config PACKING
++	bool "Generic bitfield packing and unpacking"
++	default n
++	help
++	  This option provides the packing() helper function, which permits
++	  converting bitfields between a CPU-usable representation and a
++	  memory representation that can have any combination of these quirks:
++	    - Is little endian (bytes are reversed within a 32-bit group)
++	    - The least-significant 32-bit word comes first (within a 64-bit
++	      group)
++	    - The most significant bit of a byte is at its right (bit 0 of a
++	      register description is numerically 2^7).
++	  Drivers may use these helpers to match the bit indices as described
++	  in the data sheets of the peripherals they are in control of.
++
++	  When in doubt, say N.
++
+ config PRINTF
+ 	bool
+ 	default y
+diff --git a/lib/Makefile b/lib/Makefile
+index 1fb650cd90..4f99bd47c2 100644
+--- a/lib/Makefile
++++ b/lib/Makefile
+@@ -104,6 +104,7 @@ obj-y += hexdump.o
+ obj-$(CONFIG_TRACE) += trace.o
+ obj-$(CONFIG_LIB_UUID) += uuid.o
+ obj-$(CONFIG_LIB_RAND) += rand.o
++obj-$(CONFIG_PACKING) += packing.o
+ obj-y += panic.o
+ 
+ ifeq ($(CONFIG_$(SPL_TPL_)BUILD),y)
+diff --git a/lib/packing.c b/lib/packing.c
+new file mode 100644
+index 0000000000..21e0fab20d
+--- /dev/null
++++ b/lib/packing.c
+@@ -0,0 +1,208 @@
++// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
++/*
++ * Copyright 2016-2018,2020 NXP
++ */
++#include <linux/packing.h>
++#include <linux/bitops.h>
++#include <linux/errno.h>
++#include <linux/types.h>
++
++static int get_le_offset(int offset)
++{
++	int closest_multiple_of_4;
++
++	closest_multiple_of_4 = (offset / 4) * 4;
++	offset -= closest_multiple_of_4;
++	return closest_multiple_of_4 + (3 - offset);
++}
++
++static int get_reverse_lsw32_offset(int offset, size_t len)
++{
++	int closest_multiple_of_4;
++	int word_index;
++
++	word_index = offset / 4;
++	closest_multiple_of_4 = word_index * 4;
++	offset -= closest_multiple_of_4;
++	word_index = (len / 4) - word_index - 1;
++	return word_index * 4 + offset;
++}
++
++static u64 bit_reverse(u64 val, unsigned int width)
++{
++	u64 new_val = 0;
++	unsigned int bit;
++	unsigned int i;
++
++	for (i = 0; i < width; i++) {
++		bit = (val & (1 << i)) != 0;
++		new_val |= (bit << (width - i - 1));
++	}
++	return new_val;
++}
++
++static void adjust_for_msb_right_quirk(u64 *to_write, int *box_start_bit,
++				       int *box_end_bit, u8 *box_mask)
++{
++	int box_bit_width = *box_start_bit - *box_end_bit + 1;
++	int new_box_start_bit, new_box_end_bit;
++
++	*to_write >>= *box_end_bit;
++	*to_write = bit_reverse(*to_write, box_bit_width);
++	*to_write <<= *box_end_bit;
++
++	new_box_end_bit   = box_bit_width - *box_start_bit - 1;
++	new_box_start_bit = box_bit_width - *box_end_bit - 1;
++	*box_mask = GENMASK_ULL(new_box_start_bit, new_box_end_bit);
++	*box_start_bit = new_box_start_bit;
++	*box_end_bit   = new_box_end_bit;
++}
++
++/**
++ * packing - Convert numbers (currently u64) between a packed and an unpacked
++ *	     format. Unpacked means laid out in memory in the CPU's native
++ *	     understanding of integers, while packed means anything else that
++ *	     requires translation.
++ *
++ * @pbuf: Pointer to a buffer holding the packed value.
++ * @uval: Pointer to an u64 holding the unpacked value.
++ * @startbit: The index (in logical notation, compensated for quirks) where
++ *	      the packed value starts within pbuf. Must be larger than, or
++ *	      equal to, endbit.
++ * @endbit: The index (in logical notation, compensated for quirks) where
++ *	    the packed value ends within pbuf. Must be smaller than, or equal
++ *	    to, startbit.
++ * @op: If PACK, then uval will be treated as const pointer and copied (packed)
++ *	into pbuf, between startbit and endbit.
++ *	If UNPACK, then pbuf will be treated as const pointer and the logical
++ *	value between startbit and endbit will be copied (unpacked) to uval.
++ * @quirks: A bit mask of QUIRK_LITTLE_ENDIAN, QUIRK_LSW32_IS_FIRST and
++ *	    QUIRK_MSB_ON_THE_RIGHT.
++ *
++ * Return: 0 on success, EINVAL or ERANGE if called incorrectly. Assuming
++ *	   correct usage, return code may be discarded.
++ *	   If op is PACK, pbuf is modified.
++ *	   If op is UNPACK, uval is modified.
++ */
++int packing(void *pbuf, u64 *uval, int startbit, int endbit, size_t pbuflen,
++	    enum packing_op op, u8 quirks)
++{
++	/* Number of bits for storing "uval"
++	 * also width of the field to access in the pbuf
++	 */
++	u64 value_width;
++	/* Logical byte indices corresponding to the
++	 * start and end of the field.
++	 */
++	int plogical_first_u8, plogical_last_u8, box;
++
++	/* startbit is expected to be larger than endbit */
++	if (startbit < endbit)
++		/* Invalid function call */
++		return -EINVAL;
++
++	value_width = startbit - endbit + 1;
++	if (value_width > 64)
++		return -ERANGE;
++
++	/* Check if "uval" fits in "value_width" bits.
++	 * If value_width is 64, the check will fail, but any
++	 * 64-bit uval will surely fit.
++	 */
++	if (op == PACK && value_width < 64 && (*uval >= (1ull << value_width)))
++		/* Cannot store "uval" inside "value_width" bits.
++		 * Truncating "uval" is most certainly not desirable,
++		 * so simply erroring out is appropriate.
++		 */
++		return -ERANGE;
++
++	/* Initialize parameter */
++	if (op == UNPACK)
++		*uval = 0;
++
++	/* Iterate through an idealistic view of the pbuf as an u64 with
++	 * no quirks, u8 by u8 (aligned at u8 boundaries), from high to low
++	 * logical bit significance. "box" denotes the current logical u8.
++	 */
++	plogical_first_u8 = startbit / 8;
++	plogical_last_u8  = endbit / 8;
++
++	for (box = plogical_first_u8; box >= plogical_last_u8; box--) {
++		/* Bit indices into the currently accessed 8-bit box */
++		int box_start_bit, box_end_bit, box_addr;
++		u8  box_mask;
++		/* Corresponding bits from the unpacked u64 parameter */
++		int proj_start_bit, proj_end_bit;
++		u64 proj_mask;
++
++		/* This u8 may need to be accessed in its entirety
++		 * (from bit 7 to bit 0), or not, depending on the
++		 * input arguments startbit and endbit.
++		 */
++		if (box == plogical_first_u8)
++			box_start_bit = startbit % 8;
++		else
++			box_start_bit = 7;
++		if (box == plogical_last_u8)
++			box_end_bit = endbit % 8;
++		else
++			box_end_bit = 0;
++
++		/* We have determined the box bit start and end.
++		 * Now we calculate where this (masked) u8 box would fit
++		 * in the unpacked (CPU-readable) u64 - the u8 box's
++		 * projection onto the unpacked u64. Though the
++		 * box is u8, the projection is u64 because it may fall
++		 * anywhere within the unpacked u64.
++		 */
++		proj_start_bit = ((box * 8) + box_start_bit) - endbit;
++		proj_end_bit   = ((box * 8) + box_end_bit) - endbit;
++		proj_mask = GENMASK_ULL(proj_start_bit, proj_end_bit);
++		box_mask  = GENMASK_ULL(box_start_bit, box_end_bit);
++
++		/* Determine the offset of the u8 box inside the pbuf,
++		 * adjusted for quirks. The adjusted box_addr will be used for
++		 * effective addressing inside the pbuf (so it's not
++		 * logical any longer).
++		 */
++		box_addr = pbuflen - box - 1;
++		if (quirks & QUIRK_LITTLE_ENDIAN)
++			box_addr = get_le_offset(box_addr);
++		if (quirks & QUIRK_LSW32_IS_FIRST)
++			box_addr = get_reverse_lsw32_offset(box_addr,
++							    pbuflen);
++
++		if (op == UNPACK) {
++			u64 pval;
++
++			/* Read from pbuf, write to uval */
++			pval = ((u8 *)pbuf)[box_addr] & box_mask;
++			if (quirks & QUIRK_MSB_ON_THE_RIGHT)
++				adjust_for_msb_right_quirk(&pval,
++							   &box_start_bit,
++							   &box_end_bit,
++							   &box_mask);
++
++			pval >>= box_end_bit;
++			pval <<= proj_end_bit;
++			*uval &= ~proj_mask;
++			*uval |= pval;
++		} else {
++			u64 pval;
++
++			/* Write to pbuf, read from uval */
++			pval = (*uval) & proj_mask;
++			pval >>= proj_end_bit;
++			if (quirks & QUIRK_MSB_ON_THE_RIGHT)
++				adjust_for_msb_right_quirk(&pval,
++							   &box_start_bit,
++							   &box_end_bit,
++							   &box_mask);
++
++			pval <<= box_end_bit;
++			((u8 *)pbuf)[box_addr] &= ~box_mask;
++			((u8 *)pbuf)[box_addr] |= pval;
++		}
++	}
++	return 0;
++}
diff --git a/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/u-boot-zynq-scalp-dts-sja1105-official.patch b/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/u-boot-zynq-scalp-dts-sja1105-official.patch
new file mode 100644
index 0000000..55fa9c3
--- /dev/null
+++ b/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/u-boot-zynq-scalp-dts-sja1105-official.patch
@@ -0,0 +1,293 @@
+diff --git a/arch/arm/dts/zynq-scalp.dts b/arch/arm/dts/zynq-scalp.dts
+new file mode 100644
+index 0000000000..fb7bebd40d
+--- /dev/null
++++ b/arch/arm/dts/zynq-scalp.dts
+@@ -0,0 +1,287 @@
++/*
++ * Scalp Board DTS
++ *
++ * Copyright (c) 2018-2021 Hepia
++ * Joachim Schmidt <joachim.schmidt@hesge.ch>
++ *
++ */
++
++/dts-v1/;
++#include "zynq-7000.dtsi"
++#include <dt-bindings/gpio/gpio.h>
++
++/ {
++    model = "Zynq Scalp Board";
++    compatible = "xlnx,zynq-scalp", "xlnx,zynq-7000";
++
++	aliases {
++        serial0   = &uart0;                      /* Bottom : MIO  46 - 47 (Switch on schematic) */
++		serial1   = &uart1;                      /* Top    : MIO  48 - 49                       */
++        ethernet0 = &gem0;                       /*          MIO  16 - 27                       */
++        /* Switch the name. QSPI first */
++		spi0      = &qspi;                       /*          MIO  1 - 6                        */
++        spi1      = &spi0;                       /*          MIO  40 - 41, 45                  */
++        spi2      = &spi1;                       /*          EMIO                              */
++		mmc0      = &sdhci1;                     /*          MIO  10 - 15, 9 (card detect)     */
++        usb0      = &usb0;                       /*          MIO  28 - 39                      */
++        i2c0      = &i2c0;                       /*          MIO  50 - 51                      */
++        can0      = &can1;                       /*          MIO  52 - 53                      */
++        //gpio0     = &gpio0;                    /*          MIO  0, 7, 8, 43, 44              */
++	};
++
++    /* 256 MB DDR3 */
++	memory@0 {
++		device_type = "memory";
++		reg = <0 0x10000000>;
++	};
++
++    chosen {
++           bootargs = "earlyprintk cpuidle.off=1 crashkernel=256M rw";
++           stdout-path = "serial0:115200n8";
++           xlnx,eeprom = &eeprom;
++    };
++};
++
++/* PS_Clk50M_i */
++&clkc {
++      fclk-enable = <0x1>;
++      ps-clk-frequency = <50000000>;
++};
++
++&intc {
++	num_cpus = <2>;
++	num_interrupts = <96>;
++};
++
++/* serial0 */
++&uart0 {
++	u-boot,dm-pre-reloc;
++    cts-override ;
++	device_type = "serial";
++	port-number = <0>;
++	status = "okay";
++};
++
++/* serial1 */
++&uart1 {
++	u-boot,dm-pre-reloc;
++    cts-override ;
++	device_type = "serial";
++	port-number = <1>;
++	status = "okay";
++};
++
++&qspi {
++    u-boot,dm-pre-reloc;
++    status = "okay";
++    is-dual = <0>;
++    num-cs = <1>;
++
++    /* Erase sector size of 64KB */
++    flash@0 {
++        /* compatible = "s25fl256s_64k"; drivers/mtd/spi/spi_flash_ids.c */
++        /* compatible = "spansion,s25fl256s1", "jedec,spi-nor"; */
++        /* compatible = "spansion,S25FL256S_64K", "spi-flash"; */
++        compatible = "spansion,s25fl256s", "jedec,spi-nor";
++        reg = <0x0>;
++        spi-tx-bus-width = <1>;
++        spi-rx-bus-width = <4>;
++        spi-max-frequency = <50000000>;
++        /* m25p,fast-read; */
++        #address-cells = <1>;
++        #size-cells = <1>;
++    };
++
++    //     /* FSBL + safe bitstream (design with only Zynq) + U-Boot + (devicetree) => BOOT.BIN */
++    //     /* Size : 5242880 Bytes */
++    //     partition@boot {
++    //         label = "boot";
++    //         reg = <0x0 0x500000>;
++    //     };
++
++    //     /* Safe U-Boot Env. */
++    //     /* Size : 131072 Bytes */
++    //     partition@bootenv {
++    //         label = "bootenv";
++    //         reg = <0x500000 0x20000>;
++    //     };
++
++    //     /* Safe Fit Image */
++    //     /* Size : 28049408 Bytes */
++    //     partition@fitimage {
++    //         label = "fitimage";
++    //         reg = <0x520000 0x1ac0000>;
++    //     };
++
++    //     /* Safe DTB */
++    //     /* Size : 131072 Bytes */
++    //     partition@dtb {
++    //         label = "dtb";
++    //         reg = <0x1ac0000 0x20000>;
++    //     };
++    // };
++};
++
++/* Switch Ethernet 5 ports - SPI0 - MIO 40, 41, 42, 45 */
++
++/*
++ * Port 0 => East
++ * Port 1 => Local
++ * Port 2 => Bottom
++ * Port 3 => Top
++ * Port 4 => West
++ */
++
++/*            (PYH + Delay)
++ *                Top 3
++ *
++ * 4 (MAC) West          East (PHY + Delay) 0
++ *
++ *               Bottom 2
++ *               (MAC)
++ *
++ */
++
++&spi0 {
++    bus-num = <0>;
++	status = "okay";
++
++    sja1105@0 {
++        reg = <0>;
++		#address-cells = <1>;
++		#size-cells = <0>;
++		compatible = "nxp,sja1105t";
++        reset-gpios = <&gpio0 44 GPIO_ACTIVE_LOW>;
++		spi-max-frequency = <12000000>;
++		spi-cpha;
++
++		ports {
++			#address-cells = <1>;
++			#size-cells = <0>;
++
++			swp0_east: port@0 {
++				label = "swp0_east";
++				phy-mode = "rgmii";
++				reg = <0>;
++                //sja1105,role-phy;
++
++                // fixed-link {
++				// 	speed = <10>;
++				// 	full-duplex;
++				// };
++			};
++
++			port@1 {
++				ethernet = <&gem0>;
++				phy-mode = "rgmii";
++				reg = <1>;
++                //sja1105,role-phy;
++
++				fixed-link {
++					speed = <10>;
++					full-duplex;
++				};
++			};
++
++			swp2_bottom: port@2 {
++				label = "swp2_bottom";
++				phy-mode = "rgmii";
++				reg = <2>;
++                //sja1105,role-mac;
++
++                // fixed-link {
++				// 	speed = <10>;
++				// 	full-duplex;
++				// };
++			};
++
++			swp3_top: port@3 {
++				label = "swp3_top";
++				phy-mode = "rgmii";
++				reg = <3>;
++                //sja1105,role-phy;
++
++                // fixed-link {
++				// 	speed = <10>;
++				// 	full-duplex;
++				// };
++			};
++
++            swp4_west: port@4 {
++				label = "swp4_west";
++				phy-mode = "rgmii";
++				reg = <4>;
++                //sja1105,role-mac;
++
++                // fixed-link {
++				// 	speed = <10>;
++				// 	full-duplex;
++				// };
++			};
++		};
++	};
++};
++
++/* ethernet0 */
++&gem0 {
++      status = "okay";
++      phy-mode = "rgmii"; /* "rgmii_id" */
++	  //phy-handle = <&ethernet_phy>;
++      xlnx,ptp-enet-clock = <0x7735940>;
++      //local-mac-address = [00 0a 35 00 00 00];
++
++      fixed-link {
++		  speed = <1000>;
++	      full-duplex;
++	  };
++
++	  //ethernet_phy: ethernet-phy@0 {
++      //    reg = <0>;
++	  //};
++};
++
++/* spi2 */
++&spi1 {
++    u-boot,dm-pre-reloc;
++    is-decoded-cs = <0>;
++	num-cs = <3>;
++	status = "okay";
++};
++
++&gpio0 {
++	emio-gpio-width = <64>;
++	gpio-mask-high = <0x0>;
++	gpio-mask-low = <0x5600>;
++};
++
++/* mmc0 */
++&sdhci1 {
++	u-boot,dm-pre-reloc;
++    xlnx,has-cd = <0x1>;
++	xlnx,has-power = <0x0>;
++	xlnx,has-wp = <0x0>;
++	status = "okay";
++};
++
++/* usb0 */
++/*&usb0 {
++    u-boot,dm-pre-reloc;
++    phy_type = "ulpi";
++	status = "okay";
++};*/
++
++/* i2c0 */
++&i2c0 {
++	status = "okay";
++
++    eeprom: eeprom@53 {
++        compatible = "microchip,24aa02e48";
++		reg = <0x53>;
++    };
++};
++
++/* can0 */
++&can1 {
++    u-boot,dm-pre-reloc;
++	status = "okay";
++};
diff --git a/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/u-boot-zynq-scalp-dts-sja1105-static-config.patch b/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/u-boot-zynq-scalp-dts-sja1105-static-config.patch
new file mode 100644
index 0000000..0600589
--- /dev/null
+++ b/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/u-boot-zynq-scalp-dts-sja1105-static-config.patch
@@ -0,0 +1,209 @@
+diff --git a/arch/arm/dts/zynq-scalp.dts b/arch/arm/dts/zynq-scalp.dts
+new file mode 100644
+index 0000000000..cfe81d0a0c
+--- /dev/null
++++ b/arch/arm/dts/zynq-scalp.dts
+@@ -0,0 +1,203 @@
++/*
++ * Scalp Board DTS
++ *
++ * Copyright (c) 2018-2021 Hepia
++ * Joachim Schmidt <joachim.schmidt@hesge.ch>
++ *
++ */
++
++/dts-v1/;
++#include "zynq-7000.dtsi"
++#include <dt-bindings/gpio/gpio.h>
++
++/ {
++    model = "Zynq Scalp Board";
++    compatible = "xlnx,zynq-scalp", "xlnx,zynq-7000";
++
++	aliases {
++        serial0   = &uart0;                      /* Bottom : MIO  46 - 47 (Switch on schematic) */
++		serial1   = &uart1;                      /* Top    : MIO  48 - 49                       */
++        ethernet0 = &gem0;                       /*          MIO  16 - 27                       */
++        /* Switch the name. QSPI first */
++		spi0      = &qspi;                       /*          MIO  1 - 6                        */
++        spi1      = &spi0;                       /*          MIO  40 - 41, 45                  */
++        spi2      = &spi1;                       /*          EMIO                              */
++		mmc0      = &sdhci1;                     /*          MIO  10 - 15, 9 (card detect)     */
++        usb0      = &usb0;                       /*          MIO  28 - 39                      */
++        i2c0      = &i2c0;                       /*          MIO  50 - 51                      */
++        can0      = &can1;                       /*          MIO  52 - 53                      */
++        //gpio0     = &gpio0;                    /*          MIO  0, 7, 8, 43, 44              */
++	};
++
++    /* 256 MB DDR3 */
++	memory@0 {
++		device_type = "memory";
++		reg = <0 0x10000000>;
++	};
++
++    chosen {
++           bootargs = "earlyprintk cpuidle.off=1 crashkernel=256M rw";
++           stdout-path = "serial0:115200n8";
++           xlnx,eeprom = &eeprom;
++    };
++};
++
++/* PS_Clk50M_i */
++&clkc {
++      fclk-enable = <0x1>;
++      ps-clk-frequency = <50000000>;
++};
++
++&intc {
++	num_cpus = <2>;
++	num_interrupts = <96>;
++};
++
++/* serial0 */
++&uart0 {
++	u-boot,dm-pre-reloc;
++    cts-override ;
++	device_type = "serial";
++	port-number = <0>;
++	status = "okay";
++};
++
++/* serial1 */
++&uart1 {
++	u-boot,dm-pre-reloc;
++    cts-override ;
++	device_type = "serial";
++	port-number = <1>;
++	status = "okay";
++};
++
++&qspi {
++    u-boot,dm-pre-reloc;
++    status = "okay";
++    is-dual = <0>;
++    num-cs = <1>;
++
++    /* Erase sector size of 64KB */
++    flash@0 {
++        /* compatible = "s25fl256s_64k"; drivers/mtd/spi/spi_flash_ids.c */
++        /* compatible = "spansion,s25fl256s1", "jedec,spi-nor"; */
++        /* compatible = "spansion,S25FL256S_64K", "spi-flash"; */
++        compatible = "spansion,s25fl256s", "jedec,spi-nor";
++        reg = <0x0>;
++        spi-tx-bus-width = <1>;
++        spi-rx-bus-width = <4>;
++        spi-max-frequency = <50000000>;
++        /* m25p,fast-read; */
++        #address-cells = <1>;
++        #size-cells = <1>;
++    };
++
++    //     /* FSBL + safe bitstream (design with only Zynq) + U-Boot + (devicetree) => BOOT.BIN */
++    //     /* Size : 5242880 Bytes */
++    //     partition@boot {
++    //         label = "boot";
++    //         reg = <0x0 0x500000>;
++    //     };
++
++    //     /* Safe U-Boot Env. */
++    //     /* Size : 131072 Bytes */
++    //     partition@bootenv {
++    //         label = "bootenv";
++    //         reg = <0x500000 0x20000>;
++    //     };
++
++    //     /* Safe Fit Image */
++    //     /* Size : 28049408 Bytes */
++    //     partition@fitimage {
++    //         label = "fitimage";
++    //         reg = <0x520000 0x1ac0000>;
++    //     };
++
++    //     /* Safe DTB */
++    //     /* Size : 131072 Bytes */
++    //     partition@dtb {
++    //         label = "dtb";
++    //         reg = <0x1ac0000 0x20000>;
++    //     };
++    // };
++};
++
++&spi0 {
++    bus-num = <0>;
++    status = "okay";
++
++    /* SCALP specific SJA1105T driver */
++    sja1105@0 {
++        reg = <0>;
++        #address-cells = <1>;
++        #size-cells = <0>;
++        compatible = "scalp,sja1105t";
++        reset-gpios = <&gpio0 44 GPIO_ACTIVE_LOW>;
++        spi-max-frequency = <12000000>;
++        spi-cpha;
++    };
++};
++
++/* ethernet0 */
++&gem0 {
++      status = "okay";
++      phy-mode = "rgmii"; /* "rgmii_id" */
++	  //phy-handle = <&ethernet_phy>;
++      xlnx,ptp-enet-clock = <0x7735940>;
++      //local-mac-address = [00 0a 35 00 00 00];
++
++      fixed-link {
++		  speed = <1000>;
++	      full-duplex;
++	  };
++
++	  //ethernet_phy: ethernet-phy@0 {
++      //    reg = <0>;
++	  //};
++};
++
++/* spi2 */
++&spi1 {
++    u-boot,dm-pre-reloc;
++    is-decoded-cs = <0>;
++	num-cs = <3>;
++	status = "okay";
++};
++
++&gpio0 {
++	emio-gpio-width = <64>;
++	gpio-mask-high = <0x0>;
++	gpio-mask-low = <0x5600>;
++};
++
++/* mmc0 */
++&sdhci1 {
++	u-boot,dm-pre-reloc;
++    xlnx,has-cd = <0x1>;
++	xlnx,has-power = <0x0>;
++	xlnx,has-wp = <0x0>;
++	status = "okay";
++};
++
++/* usb0 */
++/*&usb0 {
++    u-boot,dm-pre-reloc;
++    phy_type = "ulpi";
++	status = "okay";
++};*/
++
++/* i2c0 */
++&i2c0 {
++	status = "okay";
++
++    eeprom: eeprom@53 {
++        compatible = "microchip,24aa02e48";
++		reg = <0x53>;
++    };
++};
++
++/* can0 */
++&can1 {
++    u-boot,dm-pre-reloc;
++	status = "okay";
++};
diff --git a/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/u-boot-zynq-scalp-dts.patch b/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/u-boot-zynq-scalp-dts.patch
index 9b0b035..c311634 100644
--- a/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/u-boot-zynq-scalp-dts.patch
+++ b/scalp_safe_petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/u-boot-zynq-scalp-dts.patch
@@ -11,7 +11,7 @@ index 0000000000..201cd16922
 + * Joachim Schmidt <joachim.schmidt@hesge.ch>
 + *
 + */
-+ 
++
 +/dts-v1/;
 +#include "zynq-7000.dtsi"
 +#include <dt-bindings/gpio/gpio.h>
@@ -20,7 +20,7 @@ index 0000000000..201cd16922
 +    model = "Zynq Scalp Board";
 +    compatible = "xlnx,zynq-scalp", "xlnx,zynq-7000";
 +
-+	aliases {        
++	aliases {
 +        serial0   = &uart0;                      /* Bottom : MIO  46 - 47 (Switch on schematic) */
 +		serial1   = &uart1;                      /* Top    : MIO  48 - 49                       */
 +        ethernet0 = &gem0;                       /*          MIO  16 - 27                       */
@@ -96,31 +96,31 @@ index 0000000000..201cd16922
 +        /* m25p,fast-read; */
 +        #address-cells = <1>;
 +        #size-cells = <1>;
-+        
++
 +        /* FSBL + safe bitstream (design with only Zynq) + U-Boot + (devicetree) => BOOT.BIN */
 +        /* Size : 5242880 Bytes */
-+        partition@boot {       
++        partition@boot {
 +            label = "boot";
 +            reg = <0x0 0x500000>;
 +        };
-+        
++
 +        /* Safe U-Boot Env. */
 +        /* Size : 131072 Bytes */
-+        partition@bootenv {       
++        partition@bootenv {
 +            label = "bootenv";
 +            reg = <0x500000 0x20000>;
 +        };
-+        
++
 +        /* Safe Fit Image */
 +        /* Size : 28049408 Bytes */
-+        partition@fitimage {            
++        partition@fitimage {
 +            label = "fitimage";
 +            reg = <0x520000 0x1ac0000>;
 +        };
 +
 +        /* Safe DTB */
 +        /* Size : 131072 Bytes */
-+        partition@dtb {            
++        partition@dtb {
 +            label = "dtb";
 +            reg = <0x1ac0000 0x20000>;
 +        };
@@ -141,7 +141,7 @@ index 0000000000..201cd16922
 +        spi-max-frequency = <12000000>;
 +        spi-cpha;
 +    };
-+}; 
++};
 +
 +/* spi2 */
 +&spi1 {
diff --git a/scalp_safe_petalinux/project-spec/meta-user/recipes-kernel/linux/linux-xlnx/scalp-linux-mtdcore-config-name.patch b/scalp_safe_petalinux/project-spec/meta-user/recipes-kernel/linux/linux-xlnx/scalp-linux-mtdcore-config-name.patch
new file mode 100644
index 0000000..3d7ed62
--- /dev/null
+++ b/scalp_safe_petalinux/project-spec/meta-user/recipes-kernel/linux/linux-xlnx/scalp-linux-mtdcore-config-name.patch
@@ -0,0 +1,15 @@
+diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
+index 6cc7ecb0c788..1867f1a41d82 100644
+--- a/drivers/mtd/mtdcore.c
++++ b/drivers/mtd/mtdcore.c
+@@ -563,7 +563,9 @@ static int mtd_nvmem_add(struct mtd_info *mtd)
+ 
+ 	config.id = -1;
+ 	config.dev = &mtd->dev;
+-	config.name = mtd->name;
++    /* MODIF JOACHIM */
++	config.name = dev_name(&mtd->dev);
++    /* FIN MODIF JOACHIM */
+ 	config.owner = THIS_MODULE;
+ 	config.reg_read = mtd_nvmem_reg_read;
+ 	config.size = mtd->size;
-- 
GitLab