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:
Laxminath Kasam 2017-02-23 18:23:21 +05:30
parent b7f73d188d
commit ac0a983dae

View file

@ -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,