| From d7159a53833437dc1f92e4988923f451814cf842 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 5 May 2021 11:36:56 -0500 |
| Subject: ASoC: Intel: sof_sdw: add mutual exclusion between PCH DMIC and RT715 |
| |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| |
| [ 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 | 19 +++++++++++++++++-- |
| sound/soc/intel/boards/sof_sdw_common.h | 1 + |
| 2 files changed, 18 insertions(+), 2 deletions(-) |
| |
| diff --git a/sound/soc/intel/boards/sof_sdw.c b/sound/soc/intel/boards/sof_sdw.c |
| index dfad2ad129ab..5827a16773c9 100644 |
| --- a/sound/soc/intel/boards/sof_sdw.c |
| +++ b/sound/soc/intel/boards/sof_sdw.c |
| @@ -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, |
| diff --git a/sound/soc/intel/boards/sof_sdw_common.h b/sound/soc/intel/boards/sof_sdw_common.h |
| index f3cb6796363e..ea60e8ed215c 100644 |
| --- a/sound/soc/intel/boards/sof_sdw_common.h |
| +++ b/sound/soc/intel/boards/sof_sdw_common.h |
| @@ -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; |
| |
| -- |
| 2.30.2 |
| |