mirror of
https://github.com/torvalds/linux.git
synced 2026-05-29 17:43:52 +02:00
ASoC: codecs: lpass-wsa: fix VI capture setup.
Merge series from srinivas.kandagatla@linaro.org: This two patches fixes below two issues with the VI setup. 1. Only one channel gets enabled on VI feedback patch instead of two channels 2. recording rate is hardcoded to 8K instead dyamically setting it up. Both of these issues are fixed in these patches.
This commit is contained in:
commit
d4c29a3360
|
|
@ -63,6 +63,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)
|
||||
|
|
@ -407,6 +411,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;
|
||||
|
|
@ -1280,6 +1285,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) {
|
||||
|
|
@ -1291,6 +1297,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;
|
||||
|
|
@ -1448,6 +1459,67 @@ static void wsa_macro_mclk_enable(struct wsa_macro *wsa, bool mclk_enable)
|
|||
}
|
||||
}
|
||||
|
||||
static void wsa_macro_enable_disable_vi_sense(struct snd_soc_component *component, bool enable,
|
||||
u32 tx_reg0, u32 tx_reg1, u32 val)
|
||||
{
|
||||
if (enable) {
|
||||
/* 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);
|
||||
snd_soc_component_update_bits(component, tx_reg1,
|
||||
CDC_WSA_TX_SPKR_PROT_RESET_MASK,
|
||||
CDC_WSA_TX_SPKR_PROT_RESET);
|
||||
snd_soc_component_update_bits(component, tx_reg0,
|
||||
CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK,
|
||||
val);
|
||||
snd_soc_component_update_bits(component, tx_reg1,
|
||||
CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK,
|
||||
val);
|
||||
snd_soc_component_update_bits(component, tx_reg0,
|
||||
CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
|
||||
CDC_WSA_TX_SPKR_PROT_CLK_ENABLE);
|
||||
snd_soc_component_update_bits(component, tx_reg1,
|
||||
CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
|
||||
CDC_WSA_TX_SPKR_PROT_CLK_ENABLE);
|
||||
snd_soc_component_update_bits(component, tx_reg0,
|
||||
CDC_WSA_TX_SPKR_PROT_RESET_MASK,
|
||||
CDC_WSA_TX_SPKR_PROT_NO_RESET);
|
||||
snd_soc_component_update_bits(component, tx_reg1,
|
||||
CDC_WSA_TX_SPKR_PROT_RESET_MASK,
|
||||
CDC_WSA_TX_SPKR_PROT_NO_RESET);
|
||||
} else {
|
||||
snd_soc_component_update_bits(component, tx_reg0,
|
||||
CDC_WSA_TX_SPKR_PROT_RESET_MASK,
|
||||
CDC_WSA_TX_SPKR_PROT_RESET);
|
||||
snd_soc_component_update_bits(component, tx_reg1,
|
||||
CDC_WSA_TX_SPKR_PROT_RESET_MASK,
|
||||
CDC_WSA_TX_SPKR_PROT_RESET);
|
||||
snd_soc_component_update_bits(component, tx_reg0,
|
||||
CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
|
||||
CDC_WSA_TX_SPKR_PROT_CLK_DISABLE);
|
||||
snd_soc_component_update_bits(component, tx_reg1,
|
||||
CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
|
||||
CDC_WSA_TX_SPKR_PROT_CLK_DISABLE);
|
||||
}
|
||||
}
|
||||
|
||||
static void wsa_macro_enable_disable_vi_feedback(struct snd_soc_component *component,
|
||||
bool enable, u32 rate)
|
||||
{
|
||||
struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
|
||||
|
||||
if (test_bit(WSA_MACRO_TX0, &wsa->active_ch_mask[WSA_MACRO_AIF_VI]))
|
||||
wsa_macro_enable_disable_vi_sense(component, enable,
|
||||
CDC_WSA_TX0_SPKR_PROT_PATH_CTL,
|
||||
CDC_WSA_TX1_SPKR_PROT_PATH_CTL, rate);
|
||||
|
||||
if (test_bit(WSA_MACRO_TX1, &wsa->active_ch_mask[WSA_MACRO_AIF_VI]))
|
||||
wsa_macro_enable_disable_vi_sense(component, enable,
|
||||
CDC_WSA_TX2_SPKR_PROT_PATH_CTL,
|
||||
CDC_WSA_TX3_SPKR_PROT_PATH_CTL, rate);
|
||||
}
|
||||
|
||||
static int wsa_macro_mclk_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
|
|
@ -1464,58 +1536,37 @@ 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;
|
||||
|
||||
if (test_bit(WSA_MACRO_TX0, &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) {
|
||||
tx_reg0 = CDC_WSA_TX0_SPKR_PROT_PATH_CTL;
|
||||
tx_reg1 = CDC_WSA_TX1_SPKR_PROT_PATH_CTL;
|
||||
} else if (test_bit(WSA_MACRO_TX1, &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) {
|
||||
tx_reg0 = CDC_WSA_TX2_SPKR_PROT_PATH_CTL;
|
||||
tx_reg1 = CDC_WSA_TX3_SPKR_PROT_PATH_CTL;
|
||||
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;
|
||||
}
|
||||
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_POST_PMU:
|
||||
/* 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);
|
||||
snd_soc_component_update_bits(component, tx_reg1,
|
||||
CDC_WSA_TX_SPKR_PROT_RESET_MASK,
|
||||
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);
|
||||
snd_soc_component_update_bits(component, tx_reg1,
|
||||
CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK,
|
||||
CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K);
|
||||
snd_soc_component_update_bits(component, tx_reg0,
|
||||
CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
|
||||
CDC_WSA_TX_SPKR_PROT_CLK_ENABLE);
|
||||
snd_soc_component_update_bits(component, tx_reg1,
|
||||
CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
|
||||
CDC_WSA_TX_SPKR_PROT_CLK_ENABLE);
|
||||
snd_soc_component_update_bits(component, tx_reg0,
|
||||
CDC_WSA_TX_SPKR_PROT_RESET_MASK,
|
||||
CDC_WSA_TX_SPKR_PROT_NO_RESET);
|
||||
snd_soc_component_update_bits(component, tx_reg1,
|
||||
CDC_WSA_TX_SPKR_PROT_RESET_MASK,
|
||||
CDC_WSA_TX_SPKR_PROT_NO_RESET);
|
||||
/* Enable V&I sensing */
|
||||
wsa_macro_enable_disable_vi_feedback(component, true, rate_val);
|
||||
break;
|
||||
case SND_SOC_DAPM_POST_PMD:
|
||||
/* Disable V&I sensing */
|
||||
snd_soc_component_update_bits(component, tx_reg0,
|
||||
CDC_WSA_TX_SPKR_PROT_RESET_MASK,
|
||||
CDC_WSA_TX_SPKR_PROT_RESET);
|
||||
snd_soc_component_update_bits(component, tx_reg1,
|
||||
CDC_WSA_TX_SPKR_PROT_RESET_MASK,
|
||||
CDC_WSA_TX_SPKR_PROT_RESET);
|
||||
snd_soc_component_update_bits(component, tx_reg0,
|
||||
CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
|
||||
CDC_WSA_TX_SPKR_PROT_CLK_DISABLE);
|
||||
snd_soc_component_update_bits(component, tx_reg1,
|
||||
CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
|
||||
CDC_WSA_TX_SPKR_PROT_CLK_DISABLE);
|
||||
wsa_macro_enable_disable_vi_feedback(component, false, rate_val);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user