ASoC: codecs: tx-macro: add dmic support via tx macro
authorSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
Tue, 15 Nov 2022 06:54:30 +0000 (06:54 +0000)
committerMark Brown <broonie@kernel.org>
Tue, 15 Nov 2022 10:13:38 +0000 (10:13 +0000)
DMIC Paths into LPASS digital codec can go via tx-macro or va-macro codec, add
support to tx-macro path as va-macro path is already supported.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Link: https://lore.kernel.org/r/20221115065430.4126-1-srinivas.kandagatla@linaro.org
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/lpass-tx-macro.c

index ee15cf6..2ef62d6 100644 (file)
@@ -46,6 +46,7 @@
 #define CDC_TX_TOP_CSR_SWR_AMIC1_CTL   (0x00D4)
 #define CDC_TX_INP_MUX_ADC_MUXn_CFG0(n)        (0x0100 + 0x8 * n)
 #define CDC_TX_MACRO_SWR_MIC_MUX_SEL_MASK GENMASK(3, 0)
+#define CDC_TX_MACRO_DMIC_MUX_SEL_MASK GENMASK(7, 4)
 #define CDC_TX_INP_MUX_ADC_MUX0_CFG0   (0x0100)
 #define CDC_TX_INP_MUX_ADC_MUXn_CFG1(n)        (0x0104 + 0x8 * n)
 #define CDC_TX_INP_MUX_ADC_MUX0_CFG1   (0x0104)
@@ -774,7 +775,10 @@ static int tx_macro_put_dec_enum(struct snd_kcontrol *kcontrol,
        }
 
        if (val != 0) {
-               if (val < 5) {
+               if (widget->shift) { /* MSM DMIC */
+                       snd_soc_component_write_field(component, mic_sel_reg,
+                                                     CDC_TXn_ADC_DMIC_SEL_MASK, 1);
+               } else if (val < 5) {
                        snd_soc_component_write_field(component, mic_sel_reg,
                                                      CDC_TXn_ADC_DMIC_SEL_MASK, 0);
                } else {
@@ -1272,6 +1276,52 @@ static const struct snd_kcontrol_new tx_smic6_mux = SOC_DAPM_ENUM_EXT("tx_smic6"
 static const struct snd_kcontrol_new tx_smic7_mux = SOC_DAPM_ENUM_EXT("tx_smic7", tx_smic7_enum,
                        snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
 
+static const char * const dmic_mux_text[] = {
+       "ZERO", "DMIC0", "DMIC1", "DMIC2", "DMIC3",
+       "DMIC4", "DMIC5", "DMIC6", "DMIC7"
+};
+
+static SOC_ENUM_SINGLE_DECL(tx_dmic0_enum, CDC_TX_INP_MUX_ADC_MUX0_CFG0,
+                       4, dmic_mux_text);
+
+static SOC_ENUM_SINGLE_DECL(tx_dmic1_enum, CDC_TX_INP_MUX_ADC_MUX1_CFG0,
+                       4, dmic_mux_text);
+
+static SOC_ENUM_SINGLE_DECL(tx_dmic2_enum, CDC_TX_INP_MUX_ADC_MUX2_CFG0,
+                       4, dmic_mux_text);
+
+static SOC_ENUM_SINGLE_DECL(tx_dmic3_enum, CDC_TX_INP_MUX_ADC_MUX3_CFG0,
+                       4, dmic_mux_text);
+
+static SOC_ENUM_SINGLE_DECL(tx_dmic4_enum, CDC_TX_INP_MUX_ADC_MUX4_CFG0,
+                       4, dmic_mux_text);
+
+static SOC_ENUM_SINGLE_DECL(tx_dmic5_enum, CDC_TX_INP_MUX_ADC_MUX5_CFG0,
+                       4, dmic_mux_text);
+
+static SOC_ENUM_SINGLE_DECL(tx_dmic6_enum, CDC_TX_INP_MUX_ADC_MUX6_CFG0,
+                       4, dmic_mux_text);
+
+static SOC_ENUM_SINGLE_DECL(tx_dmic7_enum, CDC_TX_INP_MUX_ADC_MUX7_CFG0,
+                       4, dmic_mux_text);
+
+static const struct snd_kcontrol_new tx_dmic0_mux = SOC_DAPM_ENUM_EXT("tx_dmic0", tx_dmic0_enum,
+                       snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
+static const struct snd_kcontrol_new tx_dmic1_mux = SOC_DAPM_ENUM_EXT("tx_dmic1", tx_dmic1_enum,
+                       snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
+static const struct snd_kcontrol_new tx_dmic2_mux = SOC_DAPM_ENUM_EXT("tx_dmic2", tx_dmic2_enum,
+                       snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
+static const struct snd_kcontrol_new tx_dmic3_mux = SOC_DAPM_ENUM_EXT("tx_dmic3", tx_dmic3_enum,
+                       snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
+static const struct snd_kcontrol_new tx_dmic4_mux = SOC_DAPM_ENUM_EXT("tx_dmic4", tx_dmic4_enum,
+                       snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
+static const struct snd_kcontrol_new tx_dmic5_mux = SOC_DAPM_ENUM_EXT("tx_dmic5", tx_dmic5_enum,
+                       snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
+static const struct snd_kcontrol_new tx_dmic6_mux = SOC_DAPM_ENUM_EXT("tx_dmic6", tx_dmic6_enum,
+                       snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
+static const struct snd_kcontrol_new tx_dmic7_mux = SOC_DAPM_ENUM_EXT("tx_dmic7", tx_dmic7_enum,
+                       snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
+
 static const char * const dec_mode_mux_text[] = {
        "ADC_DEFAULT", "ADC_LOW_PWR", "ADC_HIGH_PERF",
 };
@@ -1380,6 +1430,15 @@ static const struct snd_soc_dapm_widget tx_macro_dapm_widgets[] = {
        SND_SOC_DAPM_MUX("TX SMIC MUX6", SND_SOC_NOPM, 0, 0, &tx_smic6_mux),
        SND_SOC_DAPM_MUX("TX SMIC MUX7", SND_SOC_NOPM, 0, 0, &tx_smic7_mux),
 
+       SND_SOC_DAPM_MUX("TX DMIC MUX0", SND_SOC_NOPM, 4, 0, &tx_dmic0_mux),
+       SND_SOC_DAPM_MUX("TX DMIC MUX1", SND_SOC_NOPM, 4, 0, &tx_dmic1_mux),
+       SND_SOC_DAPM_MUX("TX DMIC MUX2", SND_SOC_NOPM, 4, 0, &tx_dmic2_mux),
+       SND_SOC_DAPM_MUX("TX DMIC MUX3", SND_SOC_NOPM, 4, 0, &tx_dmic3_mux),
+       SND_SOC_DAPM_MUX("TX DMIC MUX4", SND_SOC_NOPM, 4, 0, &tx_dmic4_mux),
+       SND_SOC_DAPM_MUX("TX DMIC MUX5", SND_SOC_NOPM, 4, 0, &tx_dmic5_mux),
+       SND_SOC_DAPM_MUX("TX DMIC MUX6", SND_SOC_NOPM, 4, 0, &tx_dmic6_mux),
+       SND_SOC_DAPM_MUX("TX DMIC MUX7", SND_SOC_NOPM, 4, 0, &tx_dmic7_mux),
+
        SND_SOC_DAPM_INPUT("TX SWR_ADC0"),
        SND_SOC_DAPM_INPUT("TX SWR_ADC1"),
        SND_SOC_DAPM_INPUT("TX SWR_ADC2"),
@@ -1392,6 +1451,14 @@ static const struct snd_soc_dapm_widget tx_macro_dapm_widgets[] = {
        SND_SOC_DAPM_INPUT("TX SWR_DMIC5"),
        SND_SOC_DAPM_INPUT("TX SWR_DMIC6"),
        SND_SOC_DAPM_INPUT("TX SWR_DMIC7"),
+       SND_SOC_DAPM_INPUT("TX DMIC0"),
+       SND_SOC_DAPM_INPUT("TX DMIC1"),
+       SND_SOC_DAPM_INPUT("TX DMIC2"),
+       SND_SOC_DAPM_INPUT("TX DMIC3"),
+       SND_SOC_DAPM_INPUT("TX DMIC4"),
+       SND_SOC_DAPM_INPUT("TX DMIC5"),
+       SND_SOC_DAPM_INPUT("TX DMIC6"),
+       SND_SOC_DAPM_INPUT("TX DMIC7"),
 
        SND_SOC_DAPM_MUX_E("TX DEC0 MUX", SND_SOC_NOPM,
                           TX_MACRO_DEC0, 0,
@@ -1495,6 +1562,16 @@ static const struct snd_soc_dapm_route tx_audio_map[] = {
        {"TX DEC6 MUX", NULL, "TX_MCLK"},
        {"TX DEC7 MUX", NULL, "TX_MCLK"},
 
+       {"TX DEC0 MUX", "MSM_DMIC", "TX DMIC MUX0"},
+       {"TX DMIC MUX0", "DMIC0", "TX DMIC0"},
+       {"TX DMIC MUX0", "DMIC1", "TX DMIC1"},
+       {"TX DMIC MUX0", "DMIC2", "TX DMIC2"},
+       {"TX DMIC MUX0", "DMIC3", "TX DMIC3"},
+       {"TX DMIC MUX0", "DMIC4", "TX DMIC4"},
+       {"TX DMIC MUX0", "DMIC5", "TX DMIC5"},
+       {"TX DMIC MUX0", "DMIC6", "TX DMIC6"},
+       {"TX DMIC MUX0", "DMIC7", "TX DMIC7"},
+
        {"TX DEC0 MUX", "SWR_MIC", "TX SMIC MUX0"},
        {"TX SMIC MUX0", NULL, "TX_SWR_CLK"},
        {"TX SMIC MUX0", "ADC0", "TX SWR_ADC0"},
@@ -1510,6 +1587,16 @@ static const struct snd_soc_dapm_route tx_audio_map[] = {
        {"TX SMIC MUX0", "SWR_DMIC6", "TX SWR_DMIC6"},
        {"TX SMIC MUX0", "SWR_DMIC7", "TX SWR_DMIC7"},
 
+       {"TX DEC1 MUX", "MSM_DMIC", "TX DMIC MUX1"},
+       {"TX DMIC MUX1", "DMIC0", "TX DMIC0"},
+       {"TX DMIC MUX1", "DMIC1", "TX DMIC1"},
+       {"TX DMIC MUX1", "DMIC2", "TX DMIC2"},
+       {"TX DMIC MUX1", "DMIC3", "TX DMIC3"},
+       {"TX DMIC MUX1", "DMIC4", "TX DMIC4"},
+       {"TX DMIC MUX1", "DMIC5", "TX DMIC5"},
+       {"TX DMIC MUX1", "DMIC6", "TX DMIC6"},
+       {"TX DMIC MUX1", "DMIC7", "TX DMIC7"},
+
        {"TX DEC1 MUX", "SWR_MIC", "TX SMIC MUX1"},
        {"TX SMIC MUX1", NULL, "TX_SWR_CLK"},
        {"TX SMIC MUX1", "ADC0", "TX SWR_ADC0"},
@@ -1525,6 +1612,16 @@ static const struct snd_soc_dapm_route tx_audio_map[] = {
        {"TX SMIC MUX1", "SWR_DMIC6", "TX SWR_DMIC6"},
        {"TX SMIC MUX1", "SWR_DMIC7", "TX SWR_DMIC7"},
 
+       {"TX DEC2 MUX", "MSM_DMIC", "TX DMIC MUX2"},
+       {"TX DMIC MUX2", "DMIC0", "TX DMIC0"},
+       {"TX DMIC MUX2", "DMIC1", "TX DMIC1"},
+       {"TX DMIC MUX2", "DMIC2", "TX DMIC2"},
+       {"TX DMIC MUX2", "DMIC3", "TX DMIC3"},
+       {"TX DMIC MUX2", "DMIC4", "TX DMIC4"},
+       {"TX DMIC MUX2", "DMIC5", "TX DMIC5"},
+       {"TX DMIC MUX2", "DMIC6", "TX DMIC6"},
+       {"TX DMIC MUX2", "DMIC7", "TX DMIC7"},
+
        {"TX DEC2 MUX", "SWR_MIC", "TX SMIC MUX2"},
        {"TX SMIC MUX2", NULL, "TX_SWR_CLK"},
        {"TX SMIC MUX2", "ADC0", "TX SWR_ADC0"},
@@ -1540,6 +1637,16 @@ static const struct snd_soc_dapm_route tx_audio_map[] = {
        {"TX SMIC MUX2", "SWR_DMIC6", "TX SWR_DMIC6"},
        {"TX SMIC MUX2", "SWR_DMIC7", "TX SWR_DMIC7"},
 
+       {"TX DEC3 MUX", "MSM_DMIC", "TX DMIC MUX3"},
+       {"TX DMIC MUX3", "DMIC0", "TX DMIC0"},
+       {"TX DMIC MUX3", "DMIC1", "TX DMIC1"},
+       {"TX DMIC MUX3", "DMIC2", "TX DMIC2"},
+       {"TX DMIC MUX3", "DMIC3", "TX DMIC3"},
+       {"TX DMIC MUX3", "DMIC4", "TX DMIC4"},
+       {"TX DMIC MUX3", "DMIC5", "TX DMIC5"},
+       {"TX DMIC MUX3", "DMIC6", "TX DMIC6"},
+       {"TX DMIC MUX3", "DMIC7", "TX DMIC7"},
+
        {"TX DEC3 MUX", "SWR_MIC", "TX SMIC MUX3"},
        {"TX SMIC MUX3", NULL, "TX_SWR_CLK"},
        {"TX SMIC MUX3", "ADC0", "TX SWR_ADC0"},
@@ -1555,6 +1662,16 @@ static const struct snd_soc_dapm_route tx_audio_map[] = {
        {"TX SMIC MUX3", "SWR_DMIC6", "TX SWR_DMIC6"},
        {"TX SMIC MUX3", "SWR_DMIC7", "TX SWR_DMIC7"},
 
+       {"TX DEC4 MUX", "MSM_DMIC", "TX DMIC MUX4"},
+       {"TX DMIC MUX4", "DMIC0", "TX DMIC0"},
+       {"TX DMIC MUX4", "DMIC1", "TX DMIC1"},
+       {"TX DMIC MUX4", "DMIC2", "TX DMIC2"},
+       {"TX DMIC MUX4", "DMIC3", "TX DMIC3"},
+       {"TX DMIC MUX4", "DMIC4", "TX DMIC4"},
+       {"TX DMIC MUX4", "DMIC5", "TX DMIC5"},
+       {"TX DMIC MUX4", "DMIC6", "TX DMIC6"},
+       {"TX DMIC MUX4", "DMIC7", "TX DMIC7"},
+
        {"TX DEC4 MUX", "SWR_MIC", "TX SMIC MUX4"},
        {"TX SMIC MUX4", NULL, "TX_SWR_CLK"},
        {"TX SMIC MUX4", "ADC0", "TX SWR_ADC0"},
@@ -1570,6 +1687,16 @@ static const struct snd_soc_dapm_route tx_audio_map[] = {
        {"TX SMIC MUX4", "SWR_DMIC6", "TX SWR_DMIC6"},
        {"TX SMIC MUX4", "SWR_DMIC7", "TX SWR_DMIC7"},
 
+       {"TX DEC5 MUX", "MSM_DMIC", "TX DMIC MUX5"},
+       {"TX DMIC MUX5", "DMIC0", "TX DMIC0"},
+       {"TX DMIC MUX5", "DMIC1", "TX DMIC1"},
+       {"TX DMIC MUX5", "DMIC2", "TX DMIC2"},
+       {"TX DMIC MUX5", "DMIC3", "TX DMIC3"},
+       {"TX DMIC MUX5", "DMIC4", "TX DMIC4"},
+       {"TX DMIC MUX5", "DMIC5", "TX DMIC5"},
+       {"TX DMIC MUX5", "DMIC6", "TX DMIC6"},
+       {"TX DMIC MUX5", "DMIC7", "TX DMIC7"},
+
        {"TX DEC5 MUX", "SWR_MIC", "TX SMIC MUX5"},
        {"TX SMIC MUX5", NULL, "TX_SWR_CLK"},
        {"TX SMIC MUX5", "ADC0", "TX SWR_ADC0"},
@@ -1585,6 +1712,16 @@ static const struct snd_soc_dapm_route tx_audio_map[] = {
        {"TX SMIC MUX5", "SWR_DMIC6", "TX SWR_DMIC6"},
        {"TX SMIC MUX5", "SWR_DMIC7", "TX SWR_DMIC7"},
 
+       {"TX DEC6 MUX", "MSM_DMIC", "TX DMIC MUX6"},
+       {"TX DMIC MUX6", "DMIC0", "TX DMIC0"},
+       {"TX DMIC MUX6", "DMIC1", "TX DMIC1"},
+       {"TX DMIC MUX6", "DMIC2", "TX DMIC2"},
+       {"TX DMIC MUX6", "DMIC3", "TX DMIC3"},
+       {"TX DMIC MUX6", "DMIC4", "TX DMIC4"},
+       {"TX DMIC MUX6", "DMIC5", "TX DMIC5"},
+       {"TX DMIC MUX6", "DMIC6", "TX DMIC6"},
+       {"TX DMIC MUX6", "DMIC7", "TX DMIC7"},
+
        {"TX DEC6 MUX", "SWR_MIC", "TX SMIC MUX6"},
        {"TX SMIC MUX6", NULL, "TX_SWR_CLK"},
        {"TX SMIC MUX6", "ADC0", "TX SWR_ADC0"},
@@ -1600,6 +1737,16 @@ static const struct snd_soc_dapm_route tx_audio_map[] = {
        {"TX SMIC MUX6", "SWR_DMIC6", "TX SWR_DMIC6"},
        {"TX SMIC MUX6", "SWR_DMIC7", "TX SWR_DMIC7"},
 
+       {"TX DEC7 MUX", "MSM_DMIC", "TX DMIC MUX7"},
+       {"TX DMIC MUX7", "DMIC0", "TX DMIC0"},
+       {"TX DMIC MUX7", "DMIC1", "TX DMIC1"},
+       {"TX DMIC MUX7", "DMIC2", "TX DMIC2"},
+       {"TX DMIC MUX7", "DMIC3", "TX DMIC3"},
+       {"TX DMIC MUX7", "DMIC4", "TX DMIC4"},
+       {"TX DMIC MUX7", "DMIC5", "TX DMIC5"},
+       {"TX DMIC MUX7", "DMIC6", "TX DMIC6"},
+       {"TX DMIC MUX7", "DMIC7", "TX DMIC7"},
+
        {"TX DEC7 MUX", "SWR_MIC", "TX SMIC MUX7"},
        {"TX SMIC MUX7", NULL, "TX_SWR_CLK"},
        {"TX SMIC MUX7", "ADC0", "TX SWR_ADC0"},