Message ID | 20240619-lpass-wsa-vi-v2-1-7aff3f97a490@linaro.org |
---|---|
State | New |
Headers | show |
Series | ASoC: codecs: lpass-wsa: fix vi capture setup | expand |
On Wed, Jun 19, 2024 at 02:42:00PM GMT, Srinivas Kandagatla wrote: > Currently the VI feedback rate is set to fixed 8K, fix this by getting > the correct rate from params_rate. What kind of issues are observed without this patch? What is the actual issue that is getting fixed? > > Fixes: 2c4066e5d428 ("ASoC: codecs: lpass-wsa-macro: add dapm widgets and route") > Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> > --- > sound/soc/codecs/lpass-wsa-macro.c | 39 +++++++++++++++++++++++++++++++++++--- > 1 file changed, 36 insertions(+), 3 deletions(-) > > diff --git a/sound/soc/codecs/lpass-wsa-macro.c b/sound/soc/codecs/lpass-wsa-macro.c > index 6ce309980cd1..ec9f0b5d6778 100644 > --- a/sound/soc/codecs/lpass-wsa-macro.c > +++ b/sound/soc/codecs/lpass-wsa-macro.c > @@ -66,6 +66,10 @@ > #define CDC_WSA_TX_SPKR_PROT_CLK_DISABLE 0 > #define CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK GENMASK(3, 0) > #define CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K 0 > +#define CDC_WSA_TX_SPKR_PROT_PCM_RATE_16K 1 > +#define CDC_WSA_TX_SPKR_PROT_PCM_RATE_24K 2 > +#define CDC_WSA_TX_SPKR_PROT_PCM_RATE_32K 3 > +#define CDC_WSA_TX_SPKR_PROT_PCM_RATE_48K 4 > #define CDC_WSA_TX0_SPKR_PROT_PATH_CFG0 (0x0248) > #define CDC_WSA_TX1_SPKR_PROT_PATH_CTL (0x0264) > #define CDC_WSA_TX1_SPKR_PROT_PATH_CFG0 (0x0268) > @@ -347,6 +351,7 @@ struct wsa_macro { > int ear_spkr_gain; > int spkr_gain_offset; > int spkr_mode; > + u32 pcm_rate_vi; > int is_softclip_on[WSA_MACRO_SOFTCLIP_MAX]; > int softclip_clk_users[WSA_MACRO_SOFTCLIP_MAX]; > struct regmap *regmap; > @@ -974,6 +979,7 @@ static int wsa_macro_hw_params(struct snd_pcm_substream *substream, > struct snd_soc_dai *dai) > { > struct snd_soc_component *component = dai->component; > + struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); > int ret; > > switch (substream->stream) { > @@ -985,6 +991,11 @@ static int wsa_macro_hw_params(struct snd_pcm_substream *substream, > __func__, params_rate(params)); > return ret; > } > + break; > + case SNDRV_PCM_STREAM_CAPTURE: > + if (dai->id == WSA_MACRO_AIF_VI) > + wsa->pcm_rate_vi = params_rate(params); > + > break; > default: > break; > @@ -1159,6 +1170,28 @@ static int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w, > struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); > struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); > u32 tx_reg0, tx_reg1; > + u32 rate_val; > + > + switch (wsa->pcm_rate_vi) { > + case 8000: > + rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K; > + break; > + case 16000: > + rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_16K; > + break; > + case 24000: > + rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_24K; > + break; > + case 32000: > + rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_32K; > + break; > + case 48000: > + rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_48K; > + break; > + default: > + rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K; > + break; > + } > > if (test_bit(WSA_MACRO_TX0, &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) { > tx_reg0 = CDC_WSA_TX0_SPKR_PROT_PATH_CTL; > @@ -1170,7 +1203,7 @@ static int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w, > > switch (event) { > case SND_SOC_DAPM_POST_PMU: > - /* Enable V&I sensing */ > + /* Enable V&I sensing */ > snd_soc_component_update_bits(component, tx_reg0, > CDC_WSA_TX_SPKR_PROT_RESET_MASK, > CDC_WSA_TX_SPKR_PROT_RESET); > @@ -1179,10 +1212,10 @@ static int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w, > CDC_WSA_TX_SPKR_PROT_RESET); > snd_soc_component_update_bits(component, tx_reg0, > CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK, > - CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K); > + rate_val); > snd_soc_component_update_bits(component, tx_reg1, > CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK, > - CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K); > + rate_val); > snd_soc_component_update_bits(component, tx_reg0, > CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK, > CDC_WSA_TX_SPKR_PROT_CLK_ENABLE); > > -- > 2.25.1 >
diff --git a/sound/soc/codecs/lpass-wsa-macro.c b/sound/soc/codecs/lpass-wsa-macro.c index 6ce309980cd1..ec9f0b5d6778 100644 --- a/sound/soc/codecs/lpass-wsa-macro.c +++ b/sound/soc/codecs/lpass-wsa-macro.c @@ -66,6 +66,10 @@ #define CDC_WSA_TX_SPKR_PROT_CLK_DISABLE 0 #define CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK GENMASK(3, 0) #define CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K 0 +#define CDC_WSA_TX_SPKR_PROT_PCM_RATE_16K 1 +#define CDC_WSA_TX_SPKR_PROT_PCM_RATE_24K 2 +#define CDC_WSA_TX_SPKR_PROT_PCM_RATE_32K 3 +#define CDC_WSA_TX_SPKR_PROT_PCM_RATE_48K 4 #define CDC_WSA_TX0_SPKR_PROT_PATH_CFG0 (0x0248) #define CDC_WSA_TX1_SPKR_PROT_PATH_CTL (0x0264) #define CDC_WSA_TX1_SPKR_PROT_PATH_CFG0 (0x0268) @@ -347,6 +351,7 @@ struct wsa_macro { int ear_spkr_gain; int spkr_gain_offset; int spkr_mode; + u32 pcm_rate_vi; int is_softclip_on[WSA_MACRO_SOFTCLIP_MAX]; int softclip_clk_users[WSA_MACRO_SOFTCLIP_MAX]; struct regmap *regmap; @@ -974,6 +979,7 @@ static int wsa_macro_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_component *component = dai->component; + struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); int ret; switch (substream->stream) { @@ -985,6 +991,11 @@ static int wsa_macro_hw_params(struct snd_pcm_substream *substream, __func__, params_rate(params)); return ret; } + break; + case SNDRV_PCM_STREAM_CAPTURE: + if (dai->id == WSA_MACRO_AIF_VI) + wsa->pcm_rate_vi = params_rate(params); + break; default: break; @@ -1159,6 +1170,28 @@ static int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w, struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); u32 tx_reg0, tx_reg1; + u32 rate_val; + + switch (wsa->pcm_rate_vi) { + case 8000: + rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K; + break; + case 16000: + rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_16K; + break; + case 24000: + rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_24K; + break; + case 32000: + rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_32K; + break; + case 48000: + rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_48K; + break; + default: + rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K; + break; + } if (test_bit(WSA_MACRO_TX0, &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) { tx_reg0 = CDC_WSA_TX0_SPKR_PROT_PATH_CTL; @@ -1170,7 +1203,7 @@ static int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_POST_PMU: - /* Enable V&I sensing */ + /* Enable V&I sensing */ snd_soc_component_update_bits(component, tx_reg0, CDC_WSA_TX_SPKR_PROT_RESET_MASK, CDC_WSA_TX_SPKR_PROT_RESET); @@ -1179,10 +1212,10 @@ static int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w, CDC_WSA_TX_SPKR_PROT_RESET); snd_soc_component_update_bits(component, tx_reg0, CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK, - CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K); + rate_val); snd_soc_component_update_bits(component, tx_reg1, CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK, - CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K); + rate_val); snd_soc_component_update_bits(component, tx_reg0, CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK, CDC_WSA_TX_SPKR_PROT_CLK_ENABLE);
Currently the VI feedback rate is set to fixed 8K, fix this by getting the correct rate from params_rate. Fixes: 2c4066e5d428 ("ASoC: codecs: lpass-wsa-macro: add dapm widgets and route") Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> --- sound/soc/codecs/lpass-wsa-macro.c | 39 +++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-)