Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ASoC: intel: sof_sdw: Device loop should not always start at adr_index

The current loops at the top of create_sdw_dailink process the devices
on each link starting from device index adr_index. But adr_index is only
meaningful on the first on these SoundWire links, as it is the index of
the current device on that link. This means devices will be skipped on
later links.

Say for example the system looks like this:

SDW0 - Codec (Not Aggregated), Amp 1 (Aggregated, Group 1)
SDW1 - Amp 2 (Aggregated, Group 1), Amp 3 (Aggregated, Group 1)

The code should create 2 DAI links, one for the CODEC and one for the
aggregated amps. It will create the DAI link for the codec no problem.
When it creates the DAI link for Group 1 however, create_sdw_dailink
will be called with an adr_index of 1, since that is the index of Amp
1 on SDW0. However, as the loop in create_sdw_dailink moves onto SDW1
it will again start from adr_index, skipping Amp 2. Resulting in the amp
DAI link only have amps 1 and 3 in it.

It is reasonable to start at adr_index on the first link, since
earlier devices have by definition already been processed. However,
update the code when processing later links to handle all devices.

Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20230808132013.889419-9-ckeepax@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Charles Keepax and committed by
Mark Brown
f3eb3d45 59736ca6

+4 -1
+4 -1
sound/soc/intel/boards/sof_sdw.c
··· 1366 1366 return -ENOMEM; 1367 1367 1368 1368 /* generate codec name on different links in the same group */ 1369 + j = adr_index; 1369 1370 for (adr_link_next = adr_link; adr_link_next && adr_link_next->num_adr && 1370 1371 i < cpu_dai_num; adr_link_next++) { 1371 1372 const struct snd_soc_acpi_endpoint *endpoints; ··· 1381 1380 if (cpu_dai_id[i] != ffs(adr_link_next->mask) - 1) 1382 1381 continue; 1383 1382 1384 - for (j = adr_index; j < adr_link_next->num_adr; j++) { 1383 + /* j reset after loop, adr_index only applies to first link */ 1384 + for (; j < adr_link_next->num_adr; j++) { 1385 1385 int codec_index; 1386 1386 u64 adr = adr_link_next->adr_d[j].adr; 1387 1387 ··· 1414 1412 codec_dlc_index++; 1415 1413 (*codec_conf_index)++; 1416 1414 } 1415 + j = 0; 1417 1416 1418 1417 /* check next link to create codec dai in the processed group */ 1419 1418 i++;