[PATCH 8/8] riscv: dts: sophgo: add Milk-V Duo 256M board dts

Anton D. Stavinskii
2026-01-15T19:18:28Z

Example of usage internal dac/adc and external I2S mic
The example shows how to use the card and
will actually work other boards.
Fixed clocks needed to make simple card make
initial .set_sysclk with proper clock rates.
Same for DAC. I2S3 has to be started not only
for DAC but for the ADC also because it
provides mclk for both.

dai-link@2 will only work if registers
are set according to this issue
https://github.com/sophgo/sophgo-doc/issues/174#event-21395297524
in other case i2s2 will not output clocks and data.
Those changes are not connected to the driver itself,
but for another subsystem which is not yet ipmlemented.
The following config properly works for MilkV Duo/256Mm, Module.
Basically everything with sg2000/sg2002 but on some boards
i2s2 output pins are soldered to Ethernet module.
In Milk 256M they are free to use as external DAC/ADC.

Signed-off-by: Anton D. Stavinskii <stavinsky@gmail.com>
---
arch/riscv/boot/dts/sophgo/Makefile | 1 +
.../boot/dts/sophgo/sg2002-milkv-duo-256m.dts | 231 +++++++++++++++++++++
2 files changed, 232 insertions(+)

diff --git a/arch/riscv/boot/dts/sophgo/Makefile b/arch/riscv/boot/dts/sophgo/Makefile
index 6f65526d4193..c8901ff680cb 100644
--- a/arch/riscv/boot/dts/sophgo/Makefile
+++ b/arch/riscv/boot/dts/sophgo/Makefile
@@ -6,3 +6,4 @@ dtb-$(CONFIG_ARCH_SOPHGO) += sg2042-milkv-pioneer.dtb
dtb-$(CONFIG_ARCH_SOPHGO) += sg2042-evb-v1.dtb
dtb-$(CONFIG_ARCH_SOPHGO) += sg2042-evb-v2.dtb
dtb-$(CONFIG_ARCH_SOPHGO) += sg2044-sophgo-srd3-10.dtb
+dtb-$(CONFIG_ARCH_SOPHGO) += sg2002-milkv-duo-256m.dtb
diff --git a/arch/riscv/boot/dts/sophgo/sg2002-milkv-duo-256m.dts b/arch/riscv/boot/dts/sophgo/sg2002-milkv-duo-256m.dts
new file mode 100644
index 000000000000..cc33c4355969
--- /dev/null
+++ b/arch/riscv/boot/dts/sophgo/sg2002-milkv-duo-256m.dts
@@ -0,0 +1,231 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright (C) 2024 Thomas Bonnefille <thomas.bonnefille@bootlin.com>
+ */
+
+/dts-v1/;
+
+#include "sg2002.dtsi"
+
+/ {
+ model = "Milk-V duo 256M";
+ compatible = "milkv,duo-256m",
+ "sipeed,licheerv-nano",
+ "sophgo,sg2002";
+
+ aliases {
+ gpio0 = &gpio0;
+ gpio1 = &gpio1;
+ gpio2 = &gpio2;
+ gpio3 = &gpio3;
+ serial0 = &uart0;
+ serial1 = &uart1;
+ serial2 = &uart2;
+ serial3 = &uart3;
+ serial4 = &uart4;
+ };
+
+ chosen {
+ stdout-path = "serial0:115200n8";
+ };
+};
+
+&osc {
+ clock-frequency = <25000000>;
+};
+
+&pinctrl {
+ uart0_cfg: uart0-cfg {
+ uart0-pins {
+ pinmux = <PINMUX(PIN_UART0_TX, 0)>,
+ <PINMUX(PIN_UART0_RX, 0)>;
+ bias-pull-up;
+ drive-strength-microamp = <10800>;
+ power-source = <3300>;
+ };
+ };
+
+ sdhci0_cfg: sdhci0-cfg {
+ sdhci0-clk-pins {
+ pinmux = <PINMUX(PIN_SD0_CLK, 0)>;
+ bias-pull-up;
+ drive-strength-microamp = <16100>;
+ power-source = <3300>;
+ };
+
+ sdhci0-cmd-pins {
+ pinmux = <PINMUX(PIN_SD0_CMD, 0)>;
+ bias-pull-up;
+ drive-strength-microamp = <10800>;
+ power-source = <3300>;
+ };
+
+ sdhci0-data-pins {
+ pinmux = <PINMUX(PIN_SD0_D0, 0)>,
+ <PINMUX(PIN_SD0_D1, 0)>,
+ <PINMUX(PIN_SD0_D2, 0)>,
+ <PINMUX(PIN_SD0_D3, 0)>;
+ bias-pull-up;
+ drive-strength-microamp = <10800>;
+ power-source = <3300>;
+ };
+
+ sdhci0-cd-pins {
+ pinmux = <PINMUX(PIN_SD0_CD, 0)>;
+ bias-pull-up;
+ drive-strength-microamp = <10800>;
+ power-source = <3300>;
+ };
+ };
+};
+
+&sdhci0 {
+ pinctrl-0 = <&sdhci0_cfg>;
+ pinctrl-names = "default";
+ status = "okay";
+ bus-width = <4>;
+ no-1-8-v;
+ no-mmc;
+ no-sdio;
+ disable-wp;
+};
+
+&usb {
+ dr_mode = "peripheral";
+ status = "okay";
+ g-rx-fifo-size = <1536>;
+ g-tx-fifo-size = <128 128 64 64 64 64 32 32>;
+};
+
+&uart0 {
+ pinctrl-0 = <&uart0_cfg>;
+ pinctrl-names = "default";
+ status = "okay";
+};
+
+&dmac {
+ status = "okay";
+};
+
+&dmamux {
+ status = "okay";
+};
+
+&pinctrl {
+ i2s2_cfg: i2s2-cfg {
+ i2s2-out-pins {
+ pinmux = <PINMUX(PIN_ETH_TXM, 7)>,
+ <PINMUX(PIN_ETH_RXP, 7)>,
+ <PINMUX(PIN_ETH_RXM, 7)>;
+
+ drive-strength-microamp = <15700>;
+ power-source = <1800>;
+ };
+
+ i2s2-in-pins {
+ pinmux = <PINMUX(PIN_ETH_TXP, 7)>;
+ power-source = <1800>;
+ };
+ };
+};
+
+&i2s0 {
+ #sound-dai-cells = <0>;
+ status = "okay";
+};
+
+&i2s2 {
+ pinctrl-0 = <&i2s2_cfg>;
+ pinctrl-names = "default";
+ #sound-dai-cells = <0>;
+ status = "okay";
+};
+
+&i2s3 {
+ #sound-dai-cells = <0>;
+ status = "okay";
+};
+
+/ {
+ int_adc: codec@300a100 {
+ compatible = "sophgo,cv1800b-sound-adc";
+ #sound-dai-cells = <0>;
+ reg = <0x300a100 0x100>;
+ };
+
+ int_dac: codec@300a000 {
+ compatible = "sophgo,cv1800b-sound-dac";
+ #sound-dai-cells = <0>;
+ reg = <0x300a000 0x100>;
+ };
+
+ ext_adc: my-ext-adc {
+ compatible = "invensense,ics43432";
+ #sound-dai-cells = <0>;
+ };
+
+ sound {
+ compatible = "simple-audio-card";
+ simple-audio-card,name = "cv1800b card";
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ simple-audio-card,dai-link@0 {
+ reg = <0>;
+ format = "i2s";
+ bitclock-master = <&clock_master0>;
+ frame-master = <&clock_master0>;
+
+ codec {
+ sound-dai = <&int_dac>;
+ };
+
+ clock_master0: cpu {
+ system-clock-frequency = <12288000>;
+ system-clock-fixed;
+ system-clock-direction-out;
+ mclk-fs = <256>;
+ sound-dai = <&i2s3>;
+ };
+ };
+
+ simple-audio-card,dai-link@1 {
+ reg = <1>;
+ format = "i2s";
+ bitclock-master = <&clock_master1>;
+ frame-master = <&clock_master1>;
+
+ clock_master1: codec {
+ mclk-fs = <256>;
+ system-clock-frequency = <12288000>;
+ system-clock-fixed;
+ sound-dai = <&int_adc>;
+ };
+
+ cpu {
+ mclk-fs = <256>;
+ system-clock-frequency = <12288000>;
+ system-clock-fixed;
+ sound-dai = <&i2s0>;
+ };
+ };
+
+ simple-audio-card,dai-link@2 {
+ reg = <2>;
+ format = "i2s";
+ bitclock-master = <&clock_master2>;
+ frame-master = <&clock_master2>;
+
+ codec {
+ sound-dai = <&ext_adc>;
+ };
+
+ clock_master2: cpu {
+ mclk-fs = <256>;
+ system-clock-frequency = <12288000>;
+ system-clock-fixed;
+ sound-dai = <&i2s2>;
+ };
+ };
+ };
+};

--
2.43.0