From b24f4262de9c03f0eabd79b5511d9f12d78dc767 Mon Sep 17 00:00:00 2001 From: Niranjan H Y Date: Wed, 30 Sep 2026 02:24:16 +0530 Subject: [PATCH] ASoC: sdw_utils: Add quirk for disabling capture ch Amps can provide reference stream to hosts DSP which can be used for input audio proocessing. But some AMD HW doesn't support such a feature and hence reference stream should be selectively disabled for those. This patch adds the following quirk for the same. ASOC_SDW_CODEC_EXCLUDE_SPK_REF_STREAM Signed-off-by: Niranjan H Y Suggested-by: Vijendar Mukunda --- include/sound/soc_sdw_utils.h | 6 +++++- sound/soc/amd/acp/acp-sdw-legacy-mach.c | 4 +++- sound/soc/sdw_utils/soc_sdw_utils.c | 16 ++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/include/sound/soc_sdw_utils.h b/include/sound/soc_sdw_utils.h index 418466438ea1cb..8fec6e9d845088 100644 --- a/include/sound/soc_sdw_utils.h +++ b/include/sound/soc_sdw_utils.h @@ -30,6 +30,8 @@ */ #define SOC_SDW_SIDECAR_AMPS BIT(16) #define SOC_SDW_CODEC_MIC BIT(17) +/* Amp on hosts without DSP, capture ref stream should be disabled */ +#define ASOC_SDW_CODEC_EXCLUDE_SPK_REF_STREAM BIT(18) #define SOC_SDW_UNUSED_DAI_ID -1 #define SOC_SDW_JACK_OUT_DAI_ID 0 @@ -57,7 +59,7 @@ struct asoc_sdw_mc_private { }; struct asoc_sdw_dai_info { - const bool direction[2]; /* playback & capture support */ + bool direction[2]; /* playback & capture support */ const char *codec_name; const char *dai_name; const char *component_name; @@ -189,6 +191,8 @@ int asoc_sdw_parse_sdw_endpoints(struct device *dev, struct asoc_sdw_endpoint *soc_ends, int *num_devs); +void asoc_sdw_disable_spk_ref_stream(void); + int asoc_sdw_rtd_init(struct snd_soc_pcm_runtime *rtd); /* DMIC support */ diff --git a/sound/soc/amd/acp/acp-sdw-legacy-mach.c b/sound/soc/amd/acp/acp-sdw-legacy-mach.c index 6eac42bac855f8..98dd4ca223544d 100644 --- a/sound/soc/amd/acp/acp-sdw-legacy-mach.c +++ b/sound/soc/amd/acp/acp-sdw-legacy-mach.c @@ -16,7 +16,7 @@ #include "soc_amd_sdw_common.h" #include "../../codecs/rt711.h" -static unsigned long soc_sdw_quirk = RT711_JD1; +static unsigned long soc_sdw_quirk = RT711_JD1 | ASOC_SDW_CODEC_EXCLUDE_SPK_REF_STREAM;; static int quirk_override = -1; module_param_named(quirk, quirk_override, int, 0444); MODULE_PARM_DESC(quirk, "Board-specific quirk override"); @@ -533,6 +533,8 @@ static int mc_probe(struct platform_device *pdev) /* reset amp_num to ensure amp_num++ starts from 0 in each probe */ for (i = 0; i < ctx->codec_info_list_count; i++) codec_info_list[i].amp_num = 0; + if (soc_sdw_quirk & ASOC_SDW_CODEC_EXCLUDE_SPK_REF_STREAM) + asoc_sdw_disable_spk_ref_stream(); ret = soc_card_dai_links_create(card); if (ret < 0) diff --git a/sound/soc/sdw_utils/soc_sdw_utils.c b/sound/soc/sdw_utils/soc_sdw_utils.c index 0d7182bebcdc58..3e7d0b1731eef0 100644 --- a/sound/soc/sdw_utils/soc_sdw_utils.c +++ b/sound/soc/sdw_utils/soc_sdw_utils.c @@ -2374,5 +2374,21 @@ int asoc_sdw_parse_sdw_endpoints(struct device *dev, } EXPORT_SYMBOL_NS(asoc_sdw_parse_sdw_endpoints, "SND_SOC_SDW_UTILS"); +void asoc_sdw_disable_spk_ref_stream(void) +{ + int i, j, dai_num, codec_list_count; + struct asoc_sdw_dai_info *dais; + codec_list_count = asoc_sdw_get_codec_info_list_count(); + for (i = 0; i < codec_list_count; i++) { + dai_num = codec_info_list[i].dai_num; + dais = codec_info_list[i].dais; + for (j = 0; j < dai_num; j++) { + if (dais[j].dai_type == SOC_SDW_DAI_TYPE_AMP) + dais[j].direction[SNDRV_PCM_STREAM_CAPTURE] = false; + } + } +} +EXPORT_SYMBOL_NS(asoc_sdw_disable_spk_ref_stream, "SND_SOC_SDW_UTILS"); + MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("SoundWire ASoC helpers");