ASoC: Intel: sof_sdw: starts non sdw BE id with the highest sdw BE id
authorBard Liao <yung-chuan.liao@linux.intel.com>
Thu, 8 Feb 2024 16:55:45 +0000 (10:55 -0600)
committerMark Brown <broonie@kernel.org>
Thu, 8 Feb 2024 21:23:26 +0000 (21:23 +0000)
The soundwire links do not have their IDs as consecutive numbers, thus
the last link might have lower be_id than the previous one and this
leads to id collision with non SDW links.

For example,
create dai link SDW0-Playback-SimpleJack, id 0
create dai link SDW0-Capture-SmartMic, id 4
create dai link SDW0-Capture-SimpleJack, id 1
create dai link SDW2-Playback-SmartAmp, id 2
create dai link SDW2-Capture-SmartAmp, id 3
create dai link iDisp1, id 4
create dai link iDisp2, id 5
create dai link iDisp3, id 6

Reviewed-by: Chao Song <chao.song@linux.intel.com>
Co-developed-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20240208165545.93811-25-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/boards/sof_sdw.c

index e4b9f4d1ec06cf103983463a8dda015d1a487657..08f330ed5c2ea65b504600c5d12e329d0c64755a 100644 (file)
@@ -1767,15 +1767,21 @@ out:
                                return codec_index;
 
                        for (j = 0; j < codec_info_list[codec_index].dai_num ; j++) {
+                               int current_be_id;
+
                                ret = create_sdw_dailink(card, &link_index, dai_links,
                                                         sdw_be_num, adr_link,
                                                         codec_conf, codec_conf_num,
-                                                        &be_id, &codec_conf_index,
+                                                        &current_be_id, &codec_conf_index,
                                                         &ignore_pch_dmic, append_dai_type, i, j);
                                if (ret < 0) {
                                        dev_err(dev, "failed to create dai link %d\n", link_index);
                                        return ret;
                                }
+
+                               /* Update the be_id to match the highest ID used for SDW link */
+                               if (be_id < current_be_id)
+                                       be_id = current_be_id;
                        }
 
                        if (aggregation && endpoint->aggregated)