ASoC: msm_sdw: Add 48k TX VI sense sampling rate support
To capture VI sense from soundwire codec to LPASS AFE, add 48k sampling rate support. Currently 8k sampling rate record from soundwire codec to LPASS AFE shows distorted data. Fallback to use 48k sampling rate which is supported from soundwire codec and LPASS AFE speaker protection module and V/I sense captured is in sync with playback data. CRs-Fixed: 2003278 Change-Id: Ibb266094e288cc9341f5da7f569e07e9ae8d03df Signed-off-by: Laxminath Kasam <lkasam@codeaurora.org>
This commit is contained in:
parent
b7f73d188d
commit
ac0a983dae
1 changed files with 47 additions and 33 deletions
|
@ -467,10 +467,9 @@ static int msm_sdw_codec_enable_vi_feedback(struct snd_soc_dapm_widget *w,
|
|||
MSM_SDW_TX10_SPKR_PROT_PATH_CTL, 0x20,
|
||||
0x20);
|
||||
snd_soc_update_bits(codec,
|
||||
MSM_SDW_TX9_SPKR_PROT_PATH_CTL, 0x0F, 0x00);
|
||||
MSM_SDW_TX9_SPKR_PROT_PATH_CTL, 0x0F, 0x04);
|
||||
snd_soc_update_bits(codec,
|
||||
MSM_SDW_TX10_SPKR_PROT_PATH_CTL, 0x0F,
|
||||
0x00);
|
||||
MSM_SDW_TX10_SPKR_PROT_PATH_CTL, 0x0F, 0x04);
|
||||
snd_soc_update_bits(codec,
|
||||
MSM_SDW_TX9_SPKR_PROT_PATH_CTL, 0x10, 0x10);
|
||||
snd_soc_update_bits(codec,
|
||||
|
@ -493,10 +492,10 @@ static int msm_sdw_codec_enable_vi_feedback(struct snd_soc_dapm_widget *w,
|
|||
0x20);
|
||||
snd_soc_update_bits(codec,
|
||||
MSM_SDW_TX11_SPKR_PROT_PATH_CTL, 0x0F,
|
||||
0x00);
|
||||
0x04);
|
||||
snd_soc_update_bits(codec,
|
||||
MSM_SDW_TX12_SPKR_PROT_PATH_CTL, 0x0F,
|
||||
0x00);
|
||||
0x04);
|
||||
snd_soc_update_bits(codec,
|
||||
MSM_SDW_TX11_SPKR_PROT_PATH_CTL, 0x10,
|
||||
0x10);
|
||||
|
@ -1232,7 +1231,7 @@ static int msm_sdw_hw_params(struct snd_pcm_substream *substream,
|
|||
struct snd_pcm_hw_params *params,
|
||||
struct snd_soc_dai *dai)
|
||||
{
|
||||
u8 rx_clk_fs_rate, rx_fs_rate;
|
||||
u8 clk_fs_rate, fs_rate;
|
||||
|
||||
dev_dbg(dai->codec->dev,
|
||||
"%s: dai_name = %s DAI-ID %x rate %d num_ch %d format %d\n",
|
||||
|
@ -1241,28 +1240,28 @@ static int msm_sdw_hw_params(struct snd_pcm_substream *substream,
|
|||
|
||||
switch (params_rate(params)) {
|
||||
case 8000:
|
||||
rx_clk_fs_rate = 0x00;
|
||||
rx_fs_rate = 0x00;
|
||||
clk_fs_rate = 0x00;
|
||||
fs_rate = 0x00;
|
||||
break;
|
||||
case 16000:
|
||||
rx_clk_fs_rate = 0x01;
|
||||
rx_fs_rate = 0x01;
|
||||
clk_fs_rate = 0x01;
|
||||
fs_rate = 0x01;
|
||||
break;
|
||||
case 32000:
|
||||
rx_clk_fs_rate = 0x02;
|
||||
rx_fs_rate = 0x03;
|
||||
clk_fs_rate = 0x02;
|
||||
fs_rate = 0x03;
|
||||
break;
|
||||
case 48000:
|
||||
rx_clk_fs_rate = 0x03;
|
||||
rx_fs_rate = 0x04;
|
||||
clk_fs_rate = 0x03;
|
||||
fs_rate = 0x04;
|
||||
break;
|
||||
case 96000:
|
||||
rx_clk_fs_rate = 0x04;
|
||||
rx_fs_rate = 0x05;
|
||||
clk_fs_rate = 0x04;
|
||||
fs_rate = 0x05;
|
||||
break;
|
||||
case 192000:
|
||||
rx_clk_fs_rate = 0x05;
|
||||
rx_fs_rate = 0x06;
|
||||
clk_fs_rate = 0x05;
|
||||
fs_rate = 0x06;
|
||||
break;
|
||||
default:
|
||||
dev_err(dai->codec->dev,
|
||||
|
@ -1271,30 +1270,45 @@ static int msm_sdw_hw_params(struct snd_pcm_substream *substream,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
snd_soc_update_bits(dai->codec,
|
||||
MSM_SDW_TOP_RX_I2S_CTL, 0x1C, (rx_clk_fs_rate << 2));
|
||||
snd_soc_update_bits(dai->codec,
|
||||
MSM_SDW_RX7_RX_PATH_CTL, 0x0F, rx_fs_rate);
|
||||
snd_soc_update_bits(dai->codec,
|
||||
MSM_SDW_RX8_RX_PATH_CTL, 0x0F, rx_fs_rate);
|
||||
if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
|
||||
snd_soc_update_bits(dai->codec,
|
||||
MSM_SDW_TOP_TX_I2S_CTL, 0x1C,
|
||||
(clk_fs_rate << 2));
|
||||
} else {
|
||||
snd_soc_update_bits(dai->codec,
|
||||
MSM_SDW_TOP_RX_I2S_CTL, 0x1C,
|
||||
(clk_fs_rate << 2));
|
||||
snd_soc_update_bits(dai->codec,
|
||||
MSM_SDW_RX7_RX_PATH_CTL, 0x0F,
|
||||
fs_rate);
|
||||
snd_soc_update_bits(dai->codec,
|
||||
MSM_SDW_RX8_RX_PATH_CTL, 0x0F,
|
||||
fs_rate);
|
||||
}
|
||||
|
||||
switch (params_format(params)) {
|
||||
case SNDRV_PCM_FORMAT_S16_LE:
|
||||
snd_soc_update_bits(dai->codec,
|
||||
MSM_SDW_TOP_RX_I2S_CTL, 0x20, 0x20);
|
||||
if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
|
||||
snd_soc_update_bits(dai->codec,
|
||||
MSM_SDW_TOP_TX_I2S_CTL, 0x20, 0x20);
|
||||
else
|
||||
snd_soc_update_bits(dai->codec,
|
||||
MSM_SDW_TOP_RX_I2S_CTL, 0x20, 0x20);
|
||||
break;
|
||||
case SNDRV_PCM_FORMAT_S24_LE:
|
||||
case SNDRV_PCM_FORMAT_S24_3LE:
|
||||
snd_soc_update_bits(dai->codec,
|
||||
MSM_SDW_TOP_RX_I2S_CTL, 0x20, 0x00);
|
||||
if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
|
||||
snd_soc_update_bits(dai->codec,
|
||||
MSM_SDW_TOP_TX_I2S_CTL, 0x20, 0x00);
|
||||
else
|
||||
snd_soc_update_bits(dai->codec,
|
||||
MSM_SDW_TOP_RX_I2S_CTL, 0x20, 0x00);
|
||||
break;
|
||||
default:
|
||||
dev_err(dai->codec->dev, "%s: wrong format selected\n",
|
||||
__func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
snd_soc_update_bits(dai->codec,
|
||||
MSM_SDW_TOP_TX_I2S_CTL, 0x20, 0x20);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1410,7 +1424,7 @@ static struct snd_soc_dai_driver msm_sdw_dai[] = {
|
|||
.rate_max = 192000,
|
||||
.rate_min = 8000,
|
||||
.channels_min = 1,
|
||||
.channels_max = 2,
|
||||
.channels_max = 4,
|
||||
},
|
||||
.ops = &msm_sdw_dai_ops,
|
||||
},
|
||||
|
@ -1419,9 +1433,9 @@ static struct snd_soc_dai_driver msm_sdw_dai[] = {
|
|||
.id = AIF1_SDW_VIFEED,
|
||||
.capture = {
|
||||
.stream_name = "VIfeed_SDW",
|
||||
.rates = SNDRV_PCM_RATE_8000,
|
||||
.rates = MSM_SDW_RATES,
|
||||
.formats = SNDRV_PCM_FMTBIT_S16_LE,
|
||||
.rate_max = 8000,
|
||||
.rate_max = 48000,
|
||||
.rate_min = 8000,
|
||||
.channels_min = 2,
|
||||
.channels_max = 4,
|
||||
|
|
Loading…
Add table
Reference in a new issue