]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ASoC: Intel: sof_sdw: add mutual exclusion between PCH DMIC and RT715
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Wed, 5 May 2021 16:36:56 +0000 (11:36 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 20 Jul 2021 14:02:03 +0000 (16:02 +0200)
[ Upstream commit 35564e2bf94611c3eb51d35362addb3cb394ad54 ]

When external RT714/715 devices are used for capture, we don't want
the PCH DMICs to be used.

Any information provided by the SOF platform driver or DMI quirks will
be overridden.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Reviewed-by: Libin Yang <libin.yang@intel.com>
Link: https://lore.kernel.org/r/20210505163705.305616-5-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
sound/soc/intel/boards/sof_sdw.c
sound/soc/intel/boards/sof_sdw_common.h

index dfad2ad129abb3e483b3c522151b42e53f0dd01b..5827a16773c90ce323aa22c75472a6d1576a7133 100644 (file)
@@ -354,6 +354,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
                .part_id = 0x714,
                .version_id = 3,
                .direction = {false, true},
+               .ignore_pch_dmic = true,
                .dai_name = "rt715-aif2",
                .init = sof_sdw_rt715_sdca_init,
        },
@@ -361,6 +362,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
                .part_id = 0x715,
                .version_id = 3,
                .direction = {false, true},
+               .ignore_pch_dmic = true,
                .dai_name = "rt715-aif2",
                .init = sof_sdw_rt715_sdca_init,
        },
@@ -368,6 +370,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
                .part_id = 0x714,
                .version_id = 2,
                .direction = {false, true},
+               .ignore_pch_dmic = true,
                .dai_name = "rt715-aif2",
                .init = sof_sdw_rt715_init,
        },
@@ -375,6 +378,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
                .part_id = 0x715,
                .version_id = 2,
                .direction = {false, true},
+               .ignore_pch_dmic = true,
                .dai_name = "rt715-aif2",
                .init = sof_sdw_rt715_init,
        },
@@ -730,7 +734,8 @@ static int create_sdw_dailink(struct device *dev, int *be_index,
                              int *cpu_id, bool *group_generated,
                              struct snd_soc_codec_conf *codec_conf,
                              int codec_count,
-                             int *codec_conf_index)
+                             int *codec_conf_index,
+                             bool *ignore_pch_dmic)
 {
        const struct snd_soc_acpi_link_adr *link_next;
        struct snd_soc_dai_link_component *codecs;
@@ -783,6 +788,9 @@ static int create_sdw_dailink(struct device *dev, int *be_index,
        if (codec_index < 0)
                return codec_index;
 
+       if (codec_info_list[codec_index].ignore_pch_dmic)
+               *ignore_pch_dmic = true;
+
        cpu_dai_index = *cpu_id;
        for_each_pcm_streams(stream) {
                char *name, *cpu_name;
@@ -914,6 +922,7 @@ static int sof_card_dai_links_create(struct device *dev,
        const struct snd_soc_acpi_link_adr *adr_link;
        struct snd_soc_dai_link_component *cpus;
        struct snd_soc_codec_conf *codec_conf;
+       bool ignore_pch_dmic = false;
        int codec_conf_count;
        int codec_conf_index = 0;
        bool group_generated[SDW_MAX_GROUPS];
@@ -1020,7 +1029,8 @@ 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);
+                                        &codec_conf_index,
+                                        &ignore_pch_dmic);
                if (ret < 0) {
                        dev_err(dev, "failed to create dai link %d", be_id);
                        return -ENOMEM;
@@ -1088,6 +1098,10 @@ SSP:
 DMIC:
        /* dmic */
        if (dmic_num > 0) {
+               if (ignore_pch_dmic) {
+                       dev_warn(dev, "Ignoring PCH DMIC\n");
+                       goto HDMI;
+               }
                cpus[cpu_id].dai_name = "DMIC01 Pin";
                init_dai_link(dev, links + link_id, be_id, "dmic01",
                              0, 1, // DMIC only supports capture
@@ -1106,6 +1120,7 @@ DMIC:
                INC_ID(be_id, cpu_id, link_id);
        }
 
+HDMI:
        /* HDMI */
        if (hdmi_num > 0) {
                idisp_components = devm_kcalloc(dev, hdmi_num,
index f3cb6796363e7fcb8ce024d437be7018d936e25c..ea60e8ed215c551c0445c66c956dfd68beff01cb 100644 (file)
@@ -56,6 +56,7 @@ struct sof_sdw_codec_info {
        int amp_num;
        const u8 acpi_id[ACPI_ID_LEN];
        const bool direction[2]; // playback & capture support
+       const bool ignore_pch_dmic;
        const char *dai_name;
        const struct snd_soc_ops *ops;