]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
ASoC: intel: sof_sdw: Use a fixed DAI link id for AMP
authorBard Liao <yung-chuan.liao@linux.intel.com>
Wed, 27 Oct 2021 02:18:19 +0000 (10:18 +0800)
committerMark Brown <broonie@kernel.org>
Mon, 15 Nov 2021 13:26:54 +0000 (13:26 +0000)
Currently, we assign SoundWire DAI link id according to the order in
the link address table, with the assumption that the headset codec is
listed first, then amplifiers and last capture devices. If the headset
codec is not present in a platform, the dai link for amplifiers will be
shifted, which can be handled in two ways
a) modify the topology to renumber the dailink changes
b) keep the dailink numbers constant in topology but also avoid the
   variations in the machine driver.

This patch adds support for option b), the dailink index for amplifiers
and capture devices becomes fixed.

Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Link: https://lore.kernel.org/r/20211027021824.24776-6-yung-chuan.liao@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/boards/sof_sdw.c
sound/soc/intel/boards/sof_sdw_common.h

index 2492cd3556a88192dc30a61d0d42c3b44671b063..1be5c4754337d7b26f69d791c75e683967526c1d 100644 (file)
@@ -462,6 +462,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
                .direction = {true, true},
                .dai_name = "rt700-aif1",
                .init = sof_sdw_rt700_init,
+               .codec_type = SOF_SDW_CODEC_TYPE_JACK,
        },
        {
                .part_id = 0x711,
@@ -470,6 +471,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
                .dai_name = "rt711-sdca-aif1",
                .init = sof_sdw_rt711_sdca_init,
                .exit = sof_sdw_rt711_sdca_exit,
+               .codec_type = SOF_SDW_CODEC_TYPE_JACK,
        },
        {
                .part_id = 0x711,
@@ -478,6 +480,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
                .dai_name = "rt711-aif1",
                .init = sof_sdw_rt711_init,
                .exit = sof_sdw_rt711_exit,
+               .codec_type = SOF_SDW_CODEC_TYPE_JACK,
        },
        {
                .part_id = 0x1308,
@@ -486,12 +489,14 @@ static struct sof_sdw_codec_info codec_info_list[] = {
                .dai_name = "rt1308-aif",
                .ops = &sof_sdw_rt1308_i2s_ops,
                .init = sof_sdw_rt1308_init,
+               .codec_type = SOF_SDW_CODEC_TYPE_AMP,
        },
        {
                .part_id = 0x1316,
                .direction = {true, true},
                .dai_name = "rt1316-aif",
                .init = sof_sdw_rt1316_init,
+               .codec_type = SOF_SDW_CODEC_TYPE_AMP,
        },
        {
                .part_id = 0x714,
@@ -500,6 +505,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
                .ignore_pch_dmic = true,
                .dai_name = "rt715-aif2",
                .init = sof_sdw_rt715_sdca_init,
+               .codec_type = SOF_SDW_CODEC_TYPE_MIC,
        },
        {
                .part_id = 0x715,
@@ -508,6 +514,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
                .ignore_pch_dmic = true,
                .dai_name = "rt715-aif2",
                .init = sof_sdw_rt715_sdca_init,
+               .codec_type = SOF_SDW_CODEC_TYPE_MIC,
        },
        {
                .part_id = 0x714,
@@ -516,6 +523,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
                .ignore_pch_dmic = true,
                .dai_name = "rt715-aif2",
                .init = sof_sdw_rt715_init,
+               .codec_type = SOF_SDW_CODEC_TYPE_MIC,
        },
        {
                .part_id = 0x715,
@@ -524,6 +532,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
                .ignore_pch_dmic = true,
                .dai_name = "rt715-aif2",
                .init = sof_sdw_rt715_init,
+               .codec_type = SOF_SDW_CODEC_TYPE_MIC,
        },
        {
                .part_id = 0x8373,
@@ -531,12 +540,14 @@ static struct sof_sdw_codec_info codec_info_list[] = {
                .dai_name = "max98373-aif1",
                .init = sof_sdw_mx8373_init,
                .codec_card_late_probe = sof_sdw_mx8373_late_probe,
+               .codec_type = SOF_SDW_CODEC_TYPE_AMP,
        },
        {
                .part_id = 0x5682,
                .direction = {true, true},
                .dai_name = "rt5682-sdw",
                .init = sof_sdw_rt5682_init,
+               .codec_type = SOF_SDW_CODEC_TYPE_JACK,
        },
        {
                .part_id = 0xaaaa, /* generic codec mockup */
@@ -544,6 +555,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
                .direction = {true, true},
                .dai_name = "sdw-mockup-aif1",
                .init = NULL,
+               .codec_type = SOF_SDW_CODEC_TYPE_JACK,
        },
        {
                .part_id = 0xaa55, /* headset codec mockup */
@@ -551,6 +563,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
                .direction = {true, true},
                .dai_name = "sdw-mockup-aif1",
                .init = NULL,
+               .codec_type = SOF_SDW_CODEC_TYPE_JACK,
        },
        {
                .part_id = 0x55aa, /* amplifier mockup */
@@ -558,6 +571,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
                .direction = {true, false},
                .dai_name = "sdw-mockup-aif1",
                .init = NULL,
+               .codec_type = SOF_SDW_CODEC_TYPE_AMP,
        },
        {
                .part_id = 0x5555,
@@ -565,6 +579,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
                .direction = {false, true},
                .dai_name = "sdw-mockup-aif1",
                .init = sof_sdw_mic_codec_mockup_init,
+               .codec_type = SOF_SDW_CODEC_TYPE_MIC,
        },
 };
 
@@ -906,7 +921,7 @@ static int create_sdw_dailink(struct snd_soc_card *card,
                              const struct snd_soc_acpi_link_adr *link,
                              int *cpu_id, bool *group_generated,
                              struct snd_soc_codec_conf *codec_conf,
-                             int codec_count,
+                             int codec_count, int *link_id,
                              int *codec_conf_index,
                              bool *ignore_pch_dmic)
 {
@@ -964,6 +979,11 @@ static int create_sdw_dailink(struct snd_soc_card *card,
        if (codec_info_list[codec_index].ignore_pch_dmic)
                *ignore_pch_dmic = true;
 
+       /* Shift the first amplifier's *link_id to SDW_AMP_DAI_ID */
+       if (codec_info_list[codec_index].codec_type == SOF_SDW_CODEC_TYPE_AMP &&
+           *link_id < SDW_AMP_DAI_ID)
+               *link_id = SDW_AMP_DAI_ID;
+
        cpu_dai_index = *cpu_id;
        for_each_pcm_streams(stream) {
                char *name, *cpu_name;
@@ -1018,7 +1038,7 @@ static int create_sdw_dailink(struct snd_soc_card *card,
 
                playback = (stream == SNDRV_PCM_STREAM_PLAYBACK);
                capture = (stream == SNDRV_PCM_STREAM_CAPTURE);
-               init_dai_link(dev, dai_links + *link_index, *link_index, name,
+               init_dai_link(dev, dai_links + *link_index, (*link_id)++, name,
                              playback, capture,
                              cpus + *cpu_id, cpu_dai_num,
                              codecs, codec_num,
@@ -1215,7 +1235,7 @@ static int sof_card_dai_links_create(struct device *dev,
                                         sdw_cpu_dai_num, cpus, adr_link,
                                         &cpu_id, group_generated,
                                         codec_conf, codec_conf_count,
-                                        &codec_conf_index,
+                                        &be_id, &codec_conf_index,
                                         &ignore_pch_dmic);
                if (ret < 0) {
                        dev_err(dev, "failed to create dai link %d", link_index);
index b35f5a9b96f5a2860bbcf38c167a94f622414d6a..c6200aa14089a74bcd110e0b4f0c8fa608410feb 100644 (file)
@@ -15,6 +15,7 @@
 
 #define MAX_NO_PROPS 2
 #define MAX_HDMI_NUM 4
+#define SDW_AMP_DAI_ID 2
 #define SDW_DMIC_DAI_ID 4
 #define SDW_MAX_CPU_DAIS 16
 #define SDW_INTEL_BIDIR_PDI_BASE 2
@@ -52,9 +53,14 @@ enum {
        (((quirk) << SOF_BT_OFFLOAD_SSP_SHIFT) & SOF_BT_OFFLOAD_SSP_MASK)
 #define SOF_SSP_BT_OFFLOAD_PRESENT     BIT(18)
 
+#define SOF_SDW_CODEC_TYPE_JACK                0
+#define SOF_SDW_CODEC_TYPE_AMP         1
+#define SOF_SDW_CODEC_TYPE_MIC         2
+
 struct sof_sdw_codec_info {
        const int part_id;
        const int version_id;
+       const int codec_type;
        int amp_num;
        const u8 acpi_id[ACPI_ID_LEN];
        const bool direction[2]; // playback & capture support