How to turn on i2s mclk on tx2nx?

Here is my dts

aud_mclk_pj4 {
		nvidia,pins = "aud_mclk_pj4";
		nvidia,function = "aud";
		nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
		nvidia,tristate = <TEGRA_PIN_DISABLE>;
		nvidia,enable-input = <TEGRA_PIN_DISABLE>;
		nvidia,lpdr = <TEGRA_PIN_DISABLE>;
};

But the mclk dose not work.
But I use jetson-io, mclk works well.
I see the post that I can do it sudo busybox devmem 0x02431020 32 0x00000408
But I don’t know how to do it in dts like jetson-io

Using below command to dump the dtb before and after to compare to figure it.

sudo dtc -I fs -O dts -o extracted_proc.dts /proc/device-tree

Here is the extracted_proc.dts

hdr40-pin7 {
        nvidia,enable-input = <0x0>;
        nvidia,pins = "aud_mclk_pj4";
        nvidia,lpdr = <0x0>;
        nvidia,tristate = <0x0>;
        nvidia,function = "aud";
        nvidia,pull = <0x1>;
};

It’s right.
I want to know why I execute jetson-io I don’t need to sudo busybox devmem 0x02431020 32 0x00000408

The PINMUX driver will configure it after jetson-io modify the device tree.

if I modify the dts. How can I let the PINMUX driver do that?
Now, the other i2s pins work well,but mclk.

Find this pin “aud_mclk_pj4” and modify it like jetson-io done.

But why it can save the setting when I reboot jetson?

Jetson-io could modify the device tree by device tree overlay implement.

I know. I can see the jeton-io dts

hdr40-pin7 {
        nvidia,enable-input = <0x0>;
        nvidia,pins = "aud_mclk_pj4";
        nvidia,lpdr = <0x0>;
        nvidia,tristate = <0x0>;
        nvidia,function = "aud";
        nvidia,pull = <0x1>;
};

But I can not see the dts do sudo busybox devmem 0x02431020 32 0x00000408 to set the mclk function.
I also define the dts

aud_mclk_pj4 {
		nvidia,pins = "aud_mclk_pj4";
		nvidia,function = "aud";
		nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
		nvidia,tristate = <TEGRA_PIN_DISABLE>;
		nvidia,enable-input = <TEGRA_PIN_DISABLE>;
		nvidia,lpdr = <TEGRA_PIN_DISABLE>;
};

I don’t understand your express.
As I said the pinmux driver will configure it during boot time.

I add the configs to the dts and reboot. But the mclk does not work. Then I sudo busybox devmem 0x02431020 32 0x00000408 to set the mclk function and it works.
Here is my content of dts what I add

aud_mclk_pj4 {
		nvidia,pins = "aud_mclk_pj4";
		nvidia,function = "aud";
		nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
		nvidia,tristate = <TEGRA_PIN_DISABLE>;
		nvidia,enable-input = <TEGRA_PIN_DISABLE>;
		nvidia,lpdr = <TEGRA_PIN_DISABLE>;
};

I see the jetson-io.py also add the same content to the dts, But I don’t need to sudo busybox devmem 0x02431020 32 0x00000408 and it works after I reboot jetson.

I want to know I executejetson-io.py, how it saved status of the register to 0x00000408

How do you apply your dts?
You need compile the dts to dtb and modify the FDT context in /boot/extlinux/extlinux.conf to apply your dtb

Yes I have done it.
Here is my dts

#include <dt-bindings/pinctrl/pinctrl-tegra.h>

/ {
	pinmux@2430000 {
		pinctrl-0 = <&pinmux_default>;

		pinmux_default: common {
			dap1_sclk_pj0 {
				nvidia,pins = "dap1_sclk_pj0";
				nvidia,function = "i2s1";
				nvidia,pull = <TEGRA_PIN_PULL_NONE>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_ENABLE>;
				nvidia,lpdr = <TEGRA_PIN_DISABLE>;
			};

			dap1_dout_pj1 {
				nvidia,pins = "dap1_dout_pj1";
				nvidia,function = "i2s1";
				nvidia,pull = <TEGRA_PIN_PULL_NONE>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_DISABLE>;
				nvidia,lpdr = <TEGRA_PIN_DISABLE>;
			};

			dap1_din_pj2 {
				nvidia,pins = "dap1_din_pj2";
				nvidia,function = "i2s1";
				nvidia,pull = <TEGRA_PIN_PULL_NONE>;
				nvidia,tristate = <TEGRA_PIN_ENABLE>;
				nvidia,enable-input = <TEGRA_PIN_ENABLE>;
				nvidia,lpdr = <TEGRA_PIN_DISABLE>;
			};

			dap1_fs_pj3 {
				nvidia,pins = "dap1_fs_pj3";
				nvidia,function = "i2s1";
				nvidia,pull = <TEGRA_PIN_PULL_NONE>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_ENABLE>;
				nvidia,lpdr = <TEGRA_PIN_DISABLE>;
			};

			aud_mclk_pj4 {
				nvidia,pins = "aud_mclk_pj4";
				nvidia,function = "aud";
				nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_DISABLE>;
				nvidia,lpdr = <TEGRA_PIN_DISABLE>;
			};

sudo dtc -I fs -O dts -o extracted_proc.dts /proc/device-tree

dap1_din_pj2 {
        nvidia,enable-input = <0x1>;
        nvidia,pins = "dap1_din_pj2";
        nvidia,lpdr = <0x0>;
        nvidia,tristate = <0x1>;
        nvidia,function = "i2s1";
        nvidia,pull = <0x0>;
};

aud_mclk_pj4 {
        nvidia,enable-input = <0x0>;
        nvidia,pins = "aud_mclk_pj4";
        nvidia,lpdr = <0x0>;
        nvidia,tristate = <0x0>;
        nvidia,function = "aud";
        nvidia,pull = <0x1>;
};

dap1_fs_pj3 {
        nvidia,enable-input = <0x1>;
        nvidia,pins = "dap1_fs_pj3";
        nvidia,lpdr = <0x0>;
        nvidia,tristate = <0x0>;
        nvidia,function = "i2s1";
        nvidia,pull = <0x0>;
};
dap1_dout_pj1 {
          nvidia,enable-input = <0x0>;
          nvidia,pins = "dap1_dout_pj1";
          nvidia,lpdr = <0x0>;
          nvidia,tristate = <0x0>;
          nvidia,function = "i2s1";
          nvidia,pull = <0x0>;
  };

  dap1_sclk_pj0 {
          nvidia,enable-input = <0x1>;
          nvidia,pins = "dap1_sclk_pj0";
          nvidia,lpdr = <0x0>;
          nvidia,tristate = <0x0>;
          nvidia,function = "i2s1";
          nvidia,pull = <0x0>;
  };

Then I sudo busybox devmem 0x02431020 32 0x00000408 and it works well. That means I have added.

The 0x02431020 is the aud_mclk_pj4 REG, you can read it before and after apply your device tree to debug it.

You say that the jetson-io just overlay the dts. But I can’t see the 0x02431020 config. Does the dts can config the 0x02431020?

Yes, driver will looking the dts to do the REG configure.

Except for these configs

aud_mclk_pj4 {
  nvidia,pins = "aud_mclk_pj4";
  nvidia,function = "aud";
  nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
  nvidia,tristate = <TEGRA_PIN_DISABLE>;
  nvidia,enable-input = <TEGRA_PIN_DISABLE>;
  nvidia,lpdr = <TEGRA_PIN_DISABLE>;
};

Which options I should select in dts?

Sorry, I don’t understand your question.

You say that

I have change the dts. That means the REG will auto change?

Yes, should be like jetson-io do