Skip to content

Commit

Permalink
ASoC: intel: sof_sdw: Allow different devices on the same link
Browse files Browse the repository at this point in the history
If the current code encounters a new type of device on a SoundWire
link, it will abort processing that link and move onto the next
link. However, there is no reason to disallow this setup, it would
appear this was being disallowed to work around issues introduced
by only the first endpoint on each link being checked, which is now
fixed.

The device type shouldn't determine which DAI link it is connected to,
the group ID and aggregation status should.

Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
  • Loading branch information
charleskeepax authored and plbossart committed Aug 7, 2023
1 parent 296a735 commit 23a437a
Showing 1 changed file with 7 additions and 15 deletions.
22 changes: 7 additions & 15 deletions sound/soc/intel/boards/sof_sdw.c
Original file line number Diff line number Diff line change
Expand Up @@ -1173,10 +1173,15 @@ static bool is_unique_device(const struct snd_soc_acpi_link_adr *adr_link,
static int fill_sdw_codec_dlc(struct device *dev,
const struct snd_soc_acpi_link_adr *adr_link,
struct snd_soc_dai_link_component *codec,
int codec_index, int adr_index, int dai_index)
int adr_index, int dai_index)
{
unsigned int sdw_version, unique_id, mfg_id, link_id, part_id, class_id;
u64 adr = adr_link->adr_d[adr_index].adr;
int codec_index;

codec_index = find_codec_info_part(adr);
if (codec_index < 0)
return codec_index;

sdw_version = SDW_VERSION(adr);
link_id = SDW_DISCO_LINK_ID(adr);
Expand Down Expand Up @@ -1378,26 +1383,13 @@ static int create_sdw_dailink(struct snd_soc_card *card, int *link_index,
j = adr_index;
for (adr_link_next = adr_link; adr_link_next && adr_link_next->num_adr &&
i < cpu_dai_num; adr_link_next++) {
int _codec_index = -1;

/* skip the link excluded by this processed group */
if (cpu_dai_id[i] != ffs(adr_link_next->mask) - 1)
continue;

/* j reset after loop, adr_index only applies to first link */
for (; j < adr_link_next->num_adr; j++) {
const struct snd_soc_acpi_endpoint *endpoints;
int codec_index;
u64 adr = adr_link_next->adr_d[j].adr;

codec_index = find_codec_info_part(adr);
if (codec_index < 0)
return codec_index;
if (_codec_index != -1 && codec_index != _codec_index) {
dev_dbg(dev, "Different devices on the same sdw link\n");
break;
}
_codec_index = codec_index;

endpoints = adr_link_next->adr_d[j].endpoints;

Expand All @@ -1413,7 +1405,7 @@ static int create_sdw_dailink(struct snd_soc_card *card, int *link_index,

ret = fill_sdw_codec_dlc(dev, adr_link_next,
&codecs[codec_dlc_index],
codec_index, j, dai_index);
j, dai_index);
if (ret)
return ret;

Expand Down

0 comments on commit 23a437a

Please sign in to comment.