From 23ee77a6d7b852a40d7b7e98d3e38aa60bfe86eb Mon Sep 17 00:00:00 2001 From: Meng Wang Date: Wed, 19 Aug 2020 16:38:05 +0800 Subject: [PATCH] asoc: swr-dmic: select correct port type for swr-dmic When same swr dmic is first enabled as HIFI, secondly as LP and closed HIFI, it would disable LP port by mistake. Update the logic to select correct port for swr-dmic. Change-Id: I5d4d1461d8cd7db7bc7f37fc91ee1c9324413980 Signed-off-by: Meng Wang --- asoc/codecs/swr-dmic.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/asoc/codecs/swr-dmic.c b/asoc/codecs/swr-dmic.c index 5672d58478..fb612df818 100644 --- a/asoc/codecs/swr-dmic.c +++ b/asoc/codecs/swr-dmic.c @@ -67,7 +67,6 @@ struct swr_dmic_priv { struct device_node *wcd_handle; bool is_wcd_supply; int is_en_supply; - int port_type; u8 tx_master_port_map[SWR_DMIC_MAX_PORTS]; struct notifier_block nblock; }; @@ -141,7 +140,6 @@ static int swr_dmic_tx_master_port_get(struct snd_kcontrol *kcontrol, dev_dbg(component->dev, "%s: invalid port string\n", __func__); return ret; } - swr_dmic->port_type = slave_port_idx; ucontrol->value.integer.value[0] = swr_dmic_get_master_port_val( @@ -168,7 +166,6 @@ static int swr_dmic_tx_master_port_put(struct snd_kcontrol *kcontrol, dev_dbg(component->dev, "%s: invalid port string\n", __func__); return ret; } - swr_dmic->port_type = slave_port_idx; swr_dmic->tx_master_port_map[slave_port_idx] = swr_master_channel_map[ucontrol->value.enumerated.item[0]]; @@ -188,9 +185,9 @@ static int swr_dmic_port_enable(struct snd_soc_dapm_widget *w, struct swr_dmic_priv *swr_dmic = snd_soc_component_get_drvdata(component); - u8 ch_mask = 0x01; // only DpnChannelEN1 register is available + u8 ch_mask = 0x01; /* only DpnChannelEN1 register is available */ u8 num_port = 1; - u8 port_id = swr_dmic->port_type; + u8 port_id = w->shift; u8 port_type = swr_dmic->tx_master_port_map[port_id]; switch (event) { @@ -217,17 +214,17 @@ static int dmic_swr_ctrl(struct snd_soc_dapm_widget *w, snd_soc_component_get_drvdata(component); u8 num_ch = 1; - u8 ch_mask = 0x01; // only DpnChannelEN1 register is available + u8 ch_mask = 0x01; /* only DpnChannelEN1 register is available */ u32 ch_rate = SWR_CLK_RATE_4P8MHZ; u8 num_port = 1; u8 port_type = 0; - u8 port_id = swr_dmic->port_type; + u8 port_id = w->shift; /* * Port 1 is high quality / 2.4 or 3.072 Mbps * Port 2 is listen low power / 0.6 or 0.768 Mbps */ - if(swr_dmic->port_type == SWR_DMIC_HIFI_PORT) + if(port_id == SWR_DMIC_HIFI_PORT) ch_rate = SWR_CLK_RATE_2P4MHZ; else ch_rate = SWR_CLK_RATE_0P6MHZ; @@ -279,22 +276,26 @@ static const struct snd_kcontrol_new va_dmic_switch[] = { }; static const struct snd_soc_dapm_widget swr_dmic_dapm_widgets[] = { - SND_SOC_DAPM_MIXER_E("SWR_DMIC_MIXER", SND_SOC_NOPM, 0, 0, + SND_SOC_DAPM_MIXER_E("SWR_DMIC_MIXER", SND_SOC_NOPM, + SWR_DMIC_HIFI_PORT, 0, dmic_switch, ARRAY_SIZE(dmic_switch), dmic_swr_ctrl, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_MIXER_E("SWR_DMIC_VA_MIXER", SND_SOC_NOPM, 0, 0, + SND_SOC_DAPM_MIXER_E("SWR_DMIC_VA_MIXER", SND_SOC_NOPM, + SWR_DMIC_LP_PORT, 0, va_dmic_switch, ARRAY_SIZE(va_dmic_switch), dmic_swr_ctrl, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_INPUT("SWR_DMIC"), SND_SOC_DAPM_INPUT("VA_SWR_DMIC"), - SND_SOC_DAPM_OUT_DRV_E("SMIC_PORT_EN", SND_SOC_NOPM, 0, 0, NULL, 0, + SND_SOC_DAPM_OUT_DRV_E("SMIC_PORT_EN", SND_SOC_NOPM, + SWR_DMIC_HIFI_PORT, 0, NULL, 0, swr_dmic_port_enable, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_OUT_DRV_E("SMIC_VA_PORT_EN", SND_SOC_NOPM, 0, 0, NULL, 0, + SND_SOC_DAPM_OUT_DRV_E("SMIC_VA_PORT_EN", SND_SOC_NOPM, + SWR_DMIC_LP_PORT, 0, NULL, 0, swr_dmic_port_enable, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),