We have two Soundwire controllers swr0 and swr3, each with two WSA884x speakers (codecs):
&swr0 { status = "okay";
left_woofer: speaker@0,0 { compatible = "sdw20217020400"; reg = <0 0>; // ... };
/* WSA8845, Left Tweeter */ left_tweeter: speaker@0,1 { compatible = "sdw20217020400"; reg = <0 1>; // ... }; };
&swr3 { status = "okay";
/* WSA8845, Right Woofer */ right_woofer: speaker@0,0 { compatible = "sdw20217020400"; reg = <0 0>; // ... };
/* WSA8845, Right Tweeter */ right_tweeter: speaker@0,1 { compatible = "sdw20217020400"; reg = <0 1>; // ... }; };
Now, for four-speaker playback, we have sound card with links like:
wsa-dai-link { link-name = "WSA Playback";
cpu { sound-dai = <&q6apmbedai WSA_CODEC_DMA_RX_0>; };
codec { sound-dai = <&left_woofer>, <&left_tweeter>, <&swr0 0>, <&lpass_wsamacro 0>, <&right_woofer>, <&right_tweeter>, <&swr3 0>, <&lpass_wsa2macro 0>; };
platform { sound-dai = <&q6apm>; }; };
We need to prepare the stream for all four speakers and two soundwire controllers (so two different soundwire buses), however without the patches here, the stream (sdw_stream_runtime *sruntime) right woofer/twitter is set to swr0 (the other bus!). But it should stay as swr3 (their bus).
Does it help a bit? I hope I am able to properly explain it.
The configuration seems fine, but the problem is the "sdw_stream_runtime" definition.
You need *ONE* sdw_stream_runtime, and multiple m_rt contexts added in the linked lists of this sdw_stream_runtime. In other words, you need to call sdw_stream_add_master() twice, for swr0 and swr3 respectively.
Put differently, a sdw_stream_runtime does not point to a specific bus, it provides a top-level structure which can use multiple buses.
The best way to allocate the sdw_stream_runtime is to rely on the dailink .startup callback. From the description above that's where you have all the needed information, and then each DAI .startup (or hw_params) can call sdw_stream_add_master() to update the linked lists.