Toradex Verdin-imx8mp 4GB IT module SPI1 canbus working but SPI2 canbus not working

Hello,

I want to drive two separate Holt hi3111 spi can controller integrated from the ecspi1 and ecspi2 interfaces of the imx8mp module. The integrated device I installed via ecspi1 works successfully. But I get an error during boot for the integrated device I use via ecspi2.

hi311x spi2.0: Cannot initialize HI3110. Wrong wiring?
hi311x spi2.0: Probe failed, err=19

I am sharing my patch file containing my device-tree changes below. Can you help with the problem?

---
 .../boot/dts/freescale/imx8mp-verdin-dev.dtsi |  7 +-
 .../dts/freescale/imx8mp-verdin-nonwifi.dtsi  |  3 +-
 .../dts/freescale/imx8mp-verdin-wifi.dtsi     | 14 ----
 .../boot/dts/freescale/imx8mp-verdin.dtsi     | 80 ++++++++++++-------
 arch/arm64/boot/dts/freescale/imx8mp.dtsi     |  6 +-
 arch/arm64/configs/toradex_defconfig          |  5 +-
 drivers/net/can/spi/Kconfig                   |  1 +
 7 files changed, 64 insertions(+), 52 deletions(-)

diff --git a/arch/arm64/boot/dts/freescale/imx8mp-verdin-dev.dtsi b/arch/arm64/boot/dts/freescale/imx8mp-verdin-dev.dtsi
index e6efe3a11e756..f2cb4a32b03b1 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-verdin-dev.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mp-verdin-dev.dtsi
@@ -61,6 +61,11 @@
 	status = "okay";
 };
 
+/* Verdin SPI_2 */
+&ecspi2 {
+	status = "okay";
+};
+
 /* EEPROM on display adapter boards */
 &eeprom_display_adapter {
 	status = "okay";
@@ -118,7 +123,7 @@
 
 /* Verdin I2C_1 */
 &i2c4 {
-	status = "okay";
+	status = "disabled";
 
 	/* Audio Codec */
 	nau8822_1a: codec-nau@1a {
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-verdin-nonwifi.dtsi b/arch/arm64/boot/dts/freescale/imx8mp-verdin-nonwifi.dtsi
index a484b4988ddab..4ddcbccb5d57b 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-verdin-nonwifi.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mp-verdin-nonwifi.dtsi
@@ -40,8 +40,7 @@
 	pinctrl-names = "default";
 	pinctrl-0 = <&pinctrl_gpio1>, <&pinctrl_gpio2>,
 		    <&pinctrl_gpio3>, <&pinctrl_gpio4>,
-		    <&pinctrl_gpio7>, <&pinctrl_gpio8>,
-		    <&pinctrl_gpio_hog1>, <&pinctrl_gpio_hog2>, <&pinctrl_gpio_hog3>,
+		    <&pinctrl_gpio_hog2>, <&pinctrl_gpio_hog3>,
 		    <&pinctrl_hdmi_hog>;
 };
 
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-verdin-wifi.dtsi b/arch/arm64/boot/dts/freescale/imx8mp-verdin-wifi.dtsi
index 4013ed48df33a..0c5a9466bcd63 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-verdin-wifi.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mp-verdin-wifi.dtsi
@@ -54,24 +54,10 @@
 	pinctrl-names = "default";
 	pinctrl-0 = <&pinctrl_gpio1>, <&pinctrl_gpio2>,
 		    <&pinctrl_gpio3>, <&pinctrl_gpio4>,
-		    <&pinctrl_gpio7>, <&pinctrl_gpio8>,
 		    <&pinctrl_gpio_hog2>, <&pinctrl_gpio_hog3>, <&pinctrl_gpio_hog4>,
 		    <&pinctrl_hdmi_hog>;
 };
 
-/* On-module Bluetooth */
-&uart4 {
-	uart-has-rtscts;
-	pinctrl-names = "default";
-	pinctrl-0 = <&pinctrl_bt_uart>;
-	status = "okay";
-
-	bluetooth {
-		compatible = "mrvl,88w8997";
-		max-speed = <921600>;
-	};
-};
-
 /* On-module Wi-Fi */
 &usdhc1 {
 	bus-width = <4>;
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-verdin.dtsi b/arch/arm64/boot/dts/freescale/imx8mp-verdin.dtsi
index ead0c747532a9..e2c0227891654 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-verdin.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mp-verdin.dtsi
@@ -20,6 +20,13 @@
 		rtc1 = &snvs_rtc;
 	};
 
+	/* Fixed clock dedicated to SPI CAN controller */
+	clk16m: oscillator {
+		compatible = "fixed-clock";
+		#clock-cells = <0>;
+		clock-frequency = <16000000>;
+	};
+
 	backlight: backlight {
 		compatible = "pwm-backlight";
 		brightness-levels = <0 45 63 88 119 158 203 255>;
@@ -244,8 +251,37 @@
 	cs-gpios = <&gpio5 9 GPIO_ACTIVE_LOW>;
 	pinctrl-names = "default";
 	pinctrl-0 = <&pinctrl_ecspi1>;
+
+	can2: can@0 {
+		compatible = "holt,hi3110";
+		reg = <0>;
+		clocks = <&clk16m>;
+		interrupt-parent = <&gpio4>;
+		interrupts = <3 IRQ_TYPE_LEVEL_HIGH>;
+		spi-max-frequency = <16000000>;
+		status = "okay";
+		};
 };
 
+
+/* Verdin SPI_2 */
+&ecspi2 {
+	#address-cells = <1>;
+	#size-cells = <0>;
+	cs-gpios = <&gpio5 21 GPIO_ACTIVE_LOW>;
+	pinctrl-names = "default";
+	pinctrl-0 = <&pinctrl_ecspi2>;
+
+	can3: can@0 {
+		compatible = "holt,hi3110";
+		reg = <0>;
+		clocks = <&clk16m>;
+		interrupt-parent = <&gpio4>;
+		interrupts = <1 IRQ_TYPE_LEVEL_HIGH>;
+		spi-max-frequency = <16000000>;
+		status = "okay"; };
+ };
+
 /* Verdin ETH_1 (On-module PHY) */
 &eqos {
 	phy-handle = <&ethphy0>;
@@ -1018,13 +1054,6 @@
 };
 
 &iomuxc {
-	pinctrl_bt_uart: btuartgrp {
-		fsl,pins =
-			<MX8MP_IOMUXC_ECSPI2_MISO__UART4_DCE_CTS	0x1c4>,
-			<MX8MP_IOMUXC_ECSPI2_MOSI__UART4_DCE_TX		0x1c4>,
-			<MX8MP_IOMUXC_ECSPI2_SCLK__UART4_DCE_RX		0x1c4>,
-			<MX8MP_IOMUXC_ECSPI2_SS0__UART4_DCE_RTS		0x1c4>;
-	};
 
 	pinctrl_ctrl_sleep_moci: ctrlsleepmocigrp {
 		fsl,pins =
@@ -1036,7 +1065,17 @@
 			<MX8MP_IOMUXC_ECSPI1_MISO__ECSPI1_MISO		0x1c4>,	/* SODIMM 198 */
 			<MX8MP_IOMUXC_ECSPI1_MOSI__ECSPI1_MOSI		0x4>,	/* SODIMM 200 */
 			<MX8MP_IOMUXC_ECSPI1_SCLK__ECSPI1_SCLK		0x4>,	/* SODIMM 196 */
-			<MX8MP_IOMUXC_ECSPI1_SS0__GPIO5_IO09		0x1c4>;	/* SODIMM 202 */
+			<MX8MP_IOMUXC_ECSPI1_SS0__GPIO5_IO09		0x1c4>,	/* SODIMM 202 */
+			<MX8MP_IOMUXC_SAI1_RXD1__GPIO4_IO03		0x1c4>;	/* SODIMM 220 */
+	};
+
+	pinctrl_ecspi2: ecspi2grp {
+		fsl,pins =
+			<MX8MP_IOMUXC_ECSPI2_MISO__ECSPI2_MISO		0x1c4>,	/* SODIMM 116 */
+ 			<MX8MP_IOMUXC_ECSPI2_MOSI__ECSPI2_MOSI		0x4>,	/* SODIMM 152 */
+ 			<MX8MP_IOMUXC_ECSPI2_SCLK__ECSPI2_SCLK		0x4>,	/* SODIMM 164 */
+			<MX8MP_IOMUXC_I2C4_SDA__GPIO5_IO21		0x1c4>, /* SODIMM 12 */
+			<MX8MP_IOMUXC_SAI1_RXC__GPIO4_IO01		0x1c4>;	/* SODIMM 222 */
 	};
 
 	/* Connection On Board PHY */
@@ -1157,16 +1196,6 @@
 			<MX8MP_IOMUXC_GPIO1_IO08__GPIO1_IO08		0x184>;	/* SODIMM 218 */
 	};
 
-	pinctrl_gpio7: gpio7grp {
-		fsl,pins =
-			<MX8MP_IOMUXC_SAI1_RXD1__GPIO4_IO03		0x184>;	/* SODIMM 220 */
-	};
-
-	pinctrl_gpio8: gpio8grp {
-		fsl,pins =
-			<MX8MP_IOMUXC_SAI1_RXC__GPIO4_IO01		0x184>;	/* SODIMM 222 */
-	};
-
 	/* Verdin GPIO_9_DSI (pulled-up as active-low) */
 	pinctrl_gpio_9_dsi: gpio9dsigrp {
 		fsl,pins =
@@ -1179,15 +1208,6 @@
 			<MX8MP_IOMUXC_SAI3_RXFS__GPIO4_IO28		0x1c4>;	/* SODIMM 21 */
 	};
 
-	/* Non-wifi MSP usage only */
-	pinctrl_gpio_hog1: gpiohog1grp {
-		fsl,pins =
-			<MX8MP_IOMUXC_ECSPI2_MISO__GPIO5_IO12		0x1c4>,	/* SODIMM 116 */
-			<MX8MP_IOMUXC_ECSPI2_MOSI__GPIO5_IO11		0x1c4>,	/* SODIMM 152 */
-			<MX8MP_IOMUXC_ECSPI2_SCLK__GPIO5_IO10		0x1c4>,	/* SODIMM 164 */
-			<MX8MP_IOMUXC_ECSPI2_SS0__GPIO5_IO13		0x1c4>;	/* SODIMM 128 */
-	};
-
 	/* USB_2_OC# */
 	pinctrl_gpio_hog2: gpiohog2grp {
 		fsl,pins =
@@ -1262,14 +1282,12 @@
 	/* Verdin I2C_1 */
 	pinctrl_i2c4: i2c4grp {
 		fsl,pins =
-			<MX8MP_IOMUXC_I2C4_SCL__I2C4_SCL		0x400001c6>,	/* SODIMM 14 */
-			<MX8MP_IOMUXC_I2C4_SDA__I2C4_SDA		0x400001c6>;	/* SODIMM 12 */
+			<MX8MP_IOMUXC_I2C4_SCL__I2C4_SCL		0x400001c6>;	/* SODIMM 14 */
 	};
 
 	pinctrl_i2c4_gpio: i2c4gpiogrp {
 		fsl,pins =
-			<MX8MP_IOMUXC_I2C4_SCL__GPIO5_IO20		0x400001c6>,	/* SODIMM 14 */
-			<MX8MP_IOMUXC_I2C4_SDA__GPIO5_IO21		0x400001c6>;	/* SODIMM 12 */
+			<MX8MP_IOMUXC_I2C4_SCL__GPIO5_IO20		0x400001c6>;	/* SODIMM 14 */
 	};
 
 	/* Verdin I2S_2_BCLK (TOUCH_RESET#) */
diff --git a/arch/arm64/boot/dts/freescale/imx8mp.dtsi b/arch/arm64/boot/dts/freescale/imx8mp.dtsi
index 0adef60267ffc..527125e5aa863 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mp.dtsi
@@ -39,6 +39,8 @@
 		serial2 = &uart3;
 		serial3 = &uart4;
 		spi0 = &flexspi;
+		spi1 = &ecspi1;
+		spi2 = &ecspi2;
 		isi0 = &isi_0;
 		isi1 = &isi_1;
 		csi0 = &mipi_csi_0;
@@ -915,7 +917,7 @@
 				assigned-clock-parents = <&clk IMX8MP_SYS_PLL1_800M>;
 				dmas = <&sdma1 0 7 1>, <&sdma1 1 7 2>;
 				dma-names = "rx", "tx";
-				status = "disabled";
+				status = "okay";
 			};
 
 			ecspi2: spi@30830000 {
@@ -932,7 +934,7 @@
 				assigned-clock-parents = <&clk IMX8MP_SYS_PLL1_800M>;
 				dmas = <&sdma1 2 7 1>, <&sdma1 3 7 2>;
 				dma-names = "rx", "tx";
-				status = "disabled";
+				status = "okay";
 			};
 
 			ecspi3: spi@30840000 {

Hi @eepvs !

Sorry for the delay.

I just tested enabling a second SPI on Verdin iMX8MP Q 4GB WB IT V1.0B.

torizon@verdin-imx8mp-06849036:~$ sudo tdx-info

Software summary
------------------------------------------------------------
Bootloader:               U-Boot
Kernel version:           5.15.129-6.4.0+git.67c3153d20ff #1-TorizonCore SMP PREEMPT Wed Sep 27 12:30:36 UTC 2023
Kernel command line:      root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:3 ostree=/ostree/boot.1/torizon/460c0c1dde52ce6a4fd14e6ff7399ad1c879175a9ffa047acbb97523d9376591/0
Distro name:              NAME="TorizonCore"
Distro version:           VERSION_ID=6.4.0-build.5
Hostname:                 verdin-imx8mp-06849036
------------------------------------------------------------

Hardware info
------------------------------------------------------------
HW model:                 Toradex Verdin iMX8M Plus WB on Verdin Development Board
Toradex version:          0058 V1.0B
Serial number:            06849036
Processor arch:           aarch64
------------------------------------------------------------

This is the device tree overlay I came up with:

// verdin-imx8mp_spidev2_overlay.dts

// Verdin imx8mp second spidev

/dts-v1/;
/plugin/;

#include "imx8mp-pinfunc.h"

/ {
	compatible = "toradex,verdin-imx8mp";
};

&ecspi2 {
	#address-cells = <1>;
	#size-cells = <0>;
	status = "okay";
	//cs-gpios = <&gpioX X GPIO_ACTIVE_LOW>; // maybe not needed, as SS0 is set on pinctrl
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_ecspi2>;

	spidev@0 {
		/* Use compatible "rohm,dh2228fv" to bind spidev driver */
		compatible = "rohm,dh2228fv";
		reg = <0>;
		spi-max-frequency = <10000000>;
	};
};

/* Verdin I2C_1 - disabled for ecspi2 MISO and SS0 */
&i2c4 {
	status = "disabled";
};

/* Verdin I2C_4_CSI - disabled for ecspi2 MOSI and SCLK*/
&i2c3 {
	status = "disabled";
};

&iomuxc {
	pinctrl_ecspi2: ecspi2grp {
		fsl,pins = 
			<MX8MP_IOMUXC_I2C4_SCL__ECSPI2_MISO	0x01c4>,
			<MX8MP_IOMUXC_I2C4_SDA__ECSPI2_SS0	0x01c4>,
			<MX8MP_IOMUXC_I2C3_SCL__ECSPI2_SCLK	0x0004>,
			<MX8MP_IOMUXC_I2C3_SDA__ECSPI2_MOSI	0x0004>;
	};
};

And I quickly tested it with loopback from spidev_test (from Linux Kernel tools folder):

torizon@verdin-imx8mp-06849036:~$ ./spidev_test -l -D /dev/spidev1.0
spi mode: 0x20
bits per word: 8
max speed: 500000 Hz (500 kHz)
torizon@verdin-imx8mp-06849036:~$ ./spidev_test -l -D /dev/spidev2.0
spi mode: 0x20
bits per word: 8
max speed: 500000 Hz (500 kHz)

You can see in my dmesg that there is no issue related to SPI:

torizon@verdin-imx8mp-06849036:~$ sudo dmesg | grep -i spi
[    0.000000] GICv3: 160 SPIs implemented
[    0.000000] GICv3: 0 Extended SPIs implemented
[  191.309707] audit: type=1701 audit(1703019590.748:102): auid=1000 uid=1000 gid=1000 ses=2 pid=1422 comm="spidev_test" exe="/var/rootdirs/home/torizon/spidev_test" sig=6 res=1
[  194.675500] audit: type=1701 audit(1703019594.118:103): auid=1000 uid=1000 gid=1000 ses=2 pid=1423 comm="spidev_test" exe="/var/rootdirs/home/torizon/spidev_test" sig=6 res=1
[  202.049657] audit: type=1701 audit(1703019601.488:104): auid=1000 uid=1000 gid=1000 ses=2 pid=1424 comm="spidev_test" exe="/var/rootdirs/home/torizon/spidev_test" sig=6 res=1
[  209.389173] audit: type=1701 audit(1703019608.828:105): auid=1000 uid=1000 gid=1000 ses=2 pid=1425 comm="spidev_test" exe="/var/rootdirs/home/torizon/spidev_test" sig=6 res=1
[  216.078542] audit: type=1701 audit(1703019615.518:106): auid=1000 uid=0 gid=0 ses=2 pid=1427 comm="spidev_test" exe="/var/rootdirs/home/torizon/spidev_test" sig=6 res=1

Although I used Torizon OS for my tests, the same overlay should work on images built from Toradex BSP.

Let us know if this helps you.

Best regards,

Hi Henrique,

Thanks for your reply, which pins are you using for ecspi2?

&iomuxc {
pinctrl_ecspi2: ecspi2grp {
fsl,pins =
<MX8MP_IOMUXC_I2C4_SCL__ECSPI2_MISO 0x01c4>,
<MX8MP_IOMUXC_I2C4_SDA__ECSPI2_SS0 0x01c4>,
<MX8MP_IOMUXC_I2C3_SCL__ECSPI2_SCLK 0x0004>,
<MX8MP_IOMUXC_I2C3_SDA__ECSPI2_MOSI 0x0004>;
};
};

This defining for which pins? I want to use 116,152,164,12.

Hi @eepvs !

You can check my device tree overlay against Verdin iMX8MP’s datasheet and device tree to find this information:

MX8MP_IOMUXC_I2C4_SCL → SODIMM 14
MX8MP_IOMUXC_I2C4_SDA → SODIMM 12
MX8MP_IOMUXC_I2C3_SCL → SODIMM 95
MX8MP_IOMUXC_I2C3_SDA → SODIMM 93

Based on the overlay I shared and by reading our articles about Device Tree documentation, you will be able to perform the necessary changes to come up with the overlay you need.

https://developer.toradex.com/software/linux-resources/device-tree/

As I am using a Verdin iMX8MP with Wi-Fi/Bluetooth, the SODIMM pins you list are not exposed (this is highlighted in the datasheet of the module), so I can’t test it. Below is the overlay I came up with for this. The uart4 uses some of the SPI pins you want for the UART communication with Bluetooth, so I disabled it. This should not be needed on non-Wi-Fi/Bluetooth Verdin iMX8MP modules.

// verdin-imx8mp_spidev2-nonwifi_overlay.dts

/dts-v1/;
/plugin/;

#include "imx8mp-pinfunc.h"

/ {
	compatible = "toradex,verdin-imx8mp";
};

/* Verdin SPI_1 */
&ecspi2 {
	#address-cells = <1>;
	#size-cells = <0>;
	status = "okay";
	//cs-gpios = <&gpioX X GPIO_ACTIVE_LOW>;
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_ecspi2>;


	spidev@0 {
		/* Use compatible "rohm,dh2228fv" to bind spidev driver */
		compatible = "rohm,dh2228fv";
		reg = <0>;
		spi-max-frequency = <10000000>;
	};
};

/* Verdin I2C_1 - disabled for ecspi2 MISO */
&i2c4 {
	status = "disabled";
};

/* Verdin UART_4, used for Bluetooth on Wi-Fi/Bluetooth SKUs - disabled for ecspi2 MISO, MOSI and SCLK */
&uart4 { 
	status = "disabled";
};

&iomuxc {
	pinctrl-0 = <&pinctrl_gpio1>, <&pinctrl_gpio2>,
		    <&pinctrl_gpio3>, <&pinctrl_gpio4>,
		    <&pinctrl_gpio7>, <&pinctrl_gpio8>,
		    <&pinctrl_gpio_hog2>, <&pinctrl_gpio_hog3>,
		    <&pinctrl_hdmi_hog>;

	pinctrl_ecspi2: ecspi2grp {
		fsl,pins = 
			<MX8MP_IOMUXC_ECSPI2_MISO__ECSPI2_MISO	0x01c4>, /* SODIMM 116 */
			<MX8MP_IOMUXC_I2C4_SDA__ECSPI2_SS0	0x01c4>, /* SODIMM 12 */
			<MX8MP_IOMUXC_ECSPI2_SCLK__ECSPI2_SCLK	0x0004>, /* SODIMM 164 */
			<MX8MP_IOMUXC_ECSPI2_MOSI__ECSPI2_MOSI	0x0004>; /* SODIMM 152 */
	};
};

Here is again the successful loopback test and parts of dmesg output:

torizon@verdin-imx8mp-06849036:~$ sudo dmesg | grep -i spi
Password:
[    0.000000] GICv3: 160 SPIs implemented
[    0.000000] GICv3: 0 Extended SPIs implemented

torizon@verdin-imx8mp-06849036:~$ ls /dev/spi*
/dev/spidev1.0  /dev/spidev2.0
torizon@verdin-imx8mp-06849036:~$ ./spidev_test -l -D /dev/spidev1.0
spi mode: 0x20
bits per word: 8
max speed: 500000 Hz (500 kHz)
torizon@verdin-imx8mp-06849036:~$ ./spidev_test -l -D /dev/spidev2.0
spi mode: 0x20
bits per word: 8
max speed: 500000 Hz (500 kHz)

Best regards,