I2s-tdm with external mclk

Hello,

I have built a carrier board with TI PCM3168A codec which interfaces 6in/8out via tdm. This carrier board supplies a 24.576MHz clock to the PCM3168A’s scki input, and also to the Rock Pi S GPIO header (Pin 7 = GPIO2_A4).

The TRM for the RK3308 indicates that it can either supply mclk from that pin as an output, or accept an external mclk via that pin as an input. However I can’t work out the necessary dt bindings to link it all up.

I’m using Armbian 20.11.6 Focal with Linux 5.9.14-rockchip64. So far my dts overlay will show the card as an ALSA device, with no errors in dmesg but speaker-test does not scroll through the speaker channels - it just gets stuck on ch0 suggesting that the driver stack is not receiving the mclk.

Confirmed that the LRCLK and BCLK is present at the GPIO pins, originating from the PCM3168A as the LRCLK and BCLK master (ie: RK3308 is LRCLK + BCLK slave).

Has anybody successfully sourced mclk externally?

Here is my current pcm3168a.dts:

/dts-v1/;
/plugin/;

/ {
	compatible = "radxa,rockpis\0rockchip,rk3308";
	
	fragment@0 {
			target = <&acodec>;
			__overlay__ {
				status = "disabled";
			};
		};

	fragment@1 {
			target = <&codec>;
			__overlay__ {
				status = "disabled";
			};
		};

	fragment@2 {
			target = <&pcm5102a>;
			__overlay__ {
				status = "disabled";
			};
		};

	fragment@3 {
			target = <&i2s_8ch_2>; /* i2s@ff320000*/
			__overlay__ {
				status = "disabled";
			};
		};

	
	fragment@4 {
			target = <&i2s_8ch_0>; /* i2s@ff300000*/
			__overlay__ {
				#sound-dai-cells = <0x0>;
				rockchip,bclk-fs = <0x200>;
				rockchip,clk-trcm = <0>; /* 0 = tx_lrck/bclk and rx_lrck/bclk used 1 = only tx 2 = only rx */
				status = "okay";
			};
		};

	fragment@5 {
		target-path = "/";
			__overlay__ {
			mclk_i2s0_8ch_in: mclk_i2s0_8ch_in {
					compatible = "fixed-clock";
					#clock-cells = < 0x00 >;
					clock-frequency = < 0x1770000 >;
					clock-output-names = "mclk_i2s0_8ch_in";
				};
			};
		};
	
	fragment@6 {
		target = <&i2c1>; /* i2c@ff050000 */
			__overlay__ {
				status = "okay";
				pcm3168: codec@44 {
					compatible = "ti,pcm3168a";
					reg = <0x44>; /* i2c address */
					reset-gpios = <&gpio3 10 0>; /* May need to be inverted */
					#sound-dai-cells = <1>;
					clocks = <&mclk_i2s0_8ch_in>;
					clock-names = "scki";
					VDD1-supply = <&vcc_io>; 
					VDD2-supply = <&vcc_io>; 
					VCCAD1-supply = <&vcc5v0_sys>; 
					VCCAD2-supply = <&vcc5v0_sys>; 
					VCCDA1-supply = <&vcc5v0_sys>; 
					VCCDA2-supply = <&vcc5v0_sys>; 
				
				};
			};
		};

	fragment@7 {
		target-path = "/sound";
			__overlay__ {
				compatible = "simple-audio-card";
				#address-cells = <1>;
				#size-cells = <0>;
				simple-audio-card,name = "KimCardashian";
				simple-audio-card,mclk-fs = <0x200>;
				simple-audio-card,dai-link@1 {
						format = "i2s";
						bitclock-master = <&pcm3168_dac>;
						frame-master = <&pcm3168_dac>;
						cpu {
							sound-dai = <&i2s_8ch_0>;
							dai-tdm-slot-num = <8>;
							dai-tdm-slot-width = <32>;
						};

						pcm3168_dac: codec {
								sound-dai = <&pcm3168 0>;
								dai-tdm-slot-num = <8>;
								dai-tdm-slot-width = <32>;
								clocks = <&mclk_i2s0_8ch_in>;	
						};
					};
	
				simple-audio-card,dai-link@2 {
						format = "i2s";
						bitclock-master = <&pcm3168_adc>;
						frame-master = <&pcm3168_adc>;
	
						cpu {
								sound-dai = <&i2s_8ch_0>;
								dai-tdm-slot-num = <0x08>;
								dai-tdm-slot-width = <0x20>;
						};
	
						pcm3168_adc: codec {
								sound-dai = <&pcm3168 1>;
								dai-tdm-slot-num = <0x08>;
								dai-tdm-slot-width = <0x20>;
								clocks = <&mclk_i2s0_8ch_in>;
	
						};
					};
			};
	};
	
};

Did you solve this? I use my ADC as my I2S master (driving raspberry pi I2S including DAC chip) and this is one outstanding issue I would like to test before moving the project from raspberry pi to radxa. I use a dummy DTO and control my ADC/I2S via I2C outside of ALSA. All my dummy DTO does is set I2S of the pi to slave mode. I have no radxa experience so I’m hoping this is possible or I have no use for radxa devices. Hoping to ditch broadcom asap.

Edit: also referencing this topic here which confirms that (at some point) radxa only supports master mode and cannot be a slave. Hoping this has changed. Basic question about kernel modules