Devicetree
 help / color / mirror / Atom feed
* [PATCH] arm64: dts: nuvoton: ma35d1: add CAN nodes
@ 2026-06-04  6:01 Zi-Yu Chen
  2026-06-04  6:11 ` sashiko-bot
  0 siblings, 1 reply; 2+ messages in thread
From: Zi-Yu Chen @ 2026-06-04  6:01 UTC (permalink / raw)
  To: robh, krzk+dt, conor+dt
  Cc: ychuang3, schung, linux-arm-kernel, devicetree, linux-kernel,
	Zi-Yu Chen

Add controller nodes for the four Bosch M_CAN blocks found on the
Nuvoton MA35D1 SoC.

Additionally, configure pinctrl and enable CAN1 and CAN3 on the
MA35D1 SOM board.

Signed-off-by: Zi-Yu Chen <zychennvt@gmail.com>
---
 .../boot/dts/nuvoton/ma35d1-som-256m.dts      | 26 ++++++++
 arch/arm64/boot/dts/nuvoton/ma35d1.dtsi       | 60 +++++++++++++++++++
 2 files changed, 86 insertions(+)

diff --git a/arch/arm64/boot/dts/nuvoton/ma35d1-som-256m.dts b/arch/arm64/boot/dts/nuvoton/ma35d1-som-256m.dts
index f6f20a17e501..1b8ea14d3446 100644
--- a/arch/arm64/boot/dts/nuvoton/ma35d1-som-256m.dts
+++ b/arch/arm64/boot/dts/nuvoton/ma35d1-som-256m.dts
@@ -37,6 +37,18 @@ clk_hxt: clock-hxt {
 	};
 };
 
+&can1 {
+	status = "okay";
+	pinctrl-names = "default";
+	pinctrl-0 = <&pinctrl_can1>;
+};
+
+&can3 {
+	status = "okay";
+	pinctrl-names = "default";
+	pinctrl-0 = <&pinctrl_can3>;
+};
+
 &clk {
 	assigned-clocks = <&clk CAPLL>,
 			  <&clk DDRPLL>,
@@ -56,6 +68,20 @@ &clk {
 };
 
 &pinctrl {
+	can-grp {
+		pinctrl_can1: can1-pins {
+			nuvoton,pins = <11 14 4>,
+				       <11 15 4>;
+			bias-disable;
+		};
+
+		pinctrl_can3: can3-pins {
+			nuvoton,pins = <11 10 3>,
+				       <11 11 3>;
+			bias-disable;
+		};
+	};
+
 	uart-grp {
 		pinctrl_uart0: uart0-pins {
 			nuvoton,pins = <4 14 1>,
diff --git a/arch/arm64/boot/dts/nuvoton/ma35d1.dtsi b/arch/arm64/boot/dts/nuvoton/ma35d1.dtsi
index e51b98f5bdce..584dd8d44701 100644
--- a/arch/arm64/boot/dts/nuvoton/ma35d1.dtsi
+++ b/arch/arm64/boot/dts/nuvoton/ma35d1.dtsi
@@ -244,6 +244,66 @@ gpion: gpio@340 {
 			};
 		};
 
+		can0: can@403c0000 {
+			compatible = "bosch,m_can";
+			reg = <0x0 0x403c0000 0x0 0x200>, <0x0 0x403c0200 0x0 0x2000>;
+			reg-names = "m_can", "message_ram";
+			interrupts = <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>;
+			interrupt-names = "int0", "int1";
+			clocks = <&clk HCLK3>, <&clk CAN0_GATE>;
+			clock-names = "hclk", "cclk";
+			assigned-clocks = <&clk APLL>, <&clk CAN0_DIV>;
+			assigned-clock-rates = <200000000>, <50000000>;
+			bosch,mram-cfg = <0x0 4 4 32 32 32 8 8>;
+			status = "disabled";
+		};
+
+		can1: can@403d0000 {
+			compatible = "bosch,m_can";
+			reg = <0x0 0x403d0000 0x0 0x200>, <0x0 0x403d0200 0x0 0x2000>;
+			reg-names = "m_can", "message_ram";
+			interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 132 IRQ_TYPE_LEVEL_HIGH>;
+			interrupt-names = "int0", "int1";
+			clocks = <&clk HCLK3>, <&clk CAN1_GATE>;
+			clock-names = "hclk", "cclk";
+			assigned-clocks = <&clk APLL>, <&clk CAN1_DIV>;
+			assigned-clock-rates = <200000000>, <50000000>;
+			bosch,mram-cfg = <0x0 4 4 32 32 32 8 8>;
+			status = "disabled";
+		};
+
+		can2: can@403e0000 {
+			compatible = "bosch,m_can";
+			reg = <0x0 0x403e0000 0x0 0x200>, <0x0 0x403e0200 0x0 0x2000>;
+			reg-names = "m_can", "message_ram";
+			interrupts = <GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>;
+			interrupt-names = "int0", "int1";
+			clocks = <&clk HCLK3>, <&clk CAN2_GATE>;
+			clock-names = "hclk", "cclk";
+			assigned-clocks = <&clk APLL>, <&clk CAN2_DIV>;
+			assigned-clock-rates = <200000000>, <50000000>;
+			bosch,mram-cfg = <0x0 4 4 32 32 32 8 8>;
+			status = "disabled";
+		};
+
+		can3: can@403f0000 {
+			compatible = "bosch,m_can";
+			reg = <0x0 0x403f0000 0x0 0x200>, <0x0 0x403f0200 0x0 0x2000>;
+			reg-names = "m_can", "message_ram";
+			interrupts = <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 134 IRQ_TYPE_LEVEL_HIGH>;
+			interrupt-names = "int0", "int1";
+			clocks = <&clk HCLK3>, <&clk CAN3_GATE>;
+			clock-names = "hclk", "cclk";
+			assigned-clocks = <&clk APLL>, <&clk CAN3_DIV>;
+			assigned-clock-rates = <200000000>, <50000000>;
+			bosch,mram-cfg = <0x0 4 4 32 32 32 8 8>;
+			status = "disabled";
+		};
+
 		uart0: serial@40700000 {
 			compatible = "nuvoton,ma35d1-uart";
 			reg = <0x0 0x40700000 0x0 0x100>;
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] arm64: dts: nuvoton: ma35d1: add CAN nodes
  2026-06-04  6:01 [PATCH] arm64: dts: nuvoton: ma35d1: add CAN nodes Zi-Yu Chen
@ 2026-06-04  6:11 ` sashiko-bot
  0 siblings, 0 replies; 2+ messages in thread
From: sashiko-bot @ 2026-06-04  6:11 UTC (permalink / raw)
  To: Zi-Yu Chen; +Cc: robh, conor+dt, devicetree

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] Device Tree clock configuration conflict: CAN nodes improperly force the rate of the shared system PLL (`APLL`) to 200MHz, overriding board-level settings, and fail to explicitly configure the parent mux for the CAN clock.
--

commit f23799073b0fc964077e998ef98a6998b5225d4d
Author: Zi-Yu Chen <zychennvt@gmail.com>

arm64: dts: nuvoton: ma35d1: add CAN nodes

This commit adds controller nodes for the four Bosch M_CAN blocks found
on the Nuvoton MA35D1 SoC. It also configures pinctrl and enables CAN1
and CAN3 on the MA35D1 SOM board.

> diff --git a/arch/arm64/boot/dts/nuvoton/ma35d1.dtsi b/arch/arm64/boot/dts/nuvoton/ma35d1.dtsi
> index e51b98f5bdce4..584dd8d44701b 100644
> --- a/arch/arm64/boot/dts/nuvoton/ma35d1.dtsi
> +++ b/arch/arm64/boot/dts/nuvoton/ma35d1.dtsi
> @@ -244,6 +244,66 @@ gpion: gpio@340 {
>  			};
>  		};
>  
> +		can0: can@403c0000 {
> +			compatible = "bosch,m_can";
> +			reg = <0x0 0x403c0000 0x0 0x200>, <0x0 0x403c0200 0x0 0x2000>;
> +			reg-names = "m_can", "message_ram";
> +			interrupts = <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>,
> +				     <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>;
> +			interrupt-names = "int0", "int1";
> +			clocks = <&clk HCLK3>, <&clk CAN0_GATE>;
> +			clock-names = "hclk", "cclk";
> +			assigned-clocks = <&clk APLL>, <&clk CAN0_DIV>;
> +			assigned-clock-rates = <200000000>, <50000000>;

[Severity: High]
Does setting the APLL rate here override the board-level clock configuration?

In ma35d1-som-256m.dts, the top-level &clk node explicitly configures APLL:

&clk {
        assigned-clocks = <&clk CAPLL>,
                          <&clk DDRPLL>,
                          <&clk APLL>,
                          ...
        assigned-clock-rates = <800000000>,
                               <266000000>,
                               <180000000>,
                          ...
}

Since APLL is a shared system PLL, probing this CAN node will silently
overwrite that 180MHz setting with 200MHz, which could alter the
frequencies of other active peripherals relying on APLL.

Also, does this node need to explicitly configure the parent mux?

There is no assigned-clock-parents property here to route APLL to the CAN
mux. If the bootloader or hardware defaults leave the mux parented to VPLL
(which runs at 102MHz on this board), forcing APLL to 200MHz won't affect
the CAN controllers.

CAN0_DIV would then incorrectly attempt to derive 50MHz from 102MHz, causing
inaccurate CAN baud rates.

These questions also apply to the can1, can2, and can3 nodes below.

> +			bosch,mram-cfg = <0x0 4 4 32 32 32 8 8>;
> +			status = "disabled";
> +		};

[ ... ]

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260604060104.1662700-1-zychennvt@gmail.com?part=1

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-06-04  6:11 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-04  6:01 [PATCH] arm64: dts: nuvoton: ma35d1: add CAN nodes Zi-Yu Chen
2026-06-04  6:11 ` sashiko-bot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox