From ac0a983daec732ad6d732683d44d8d69e521afb8 Mon Sep 17 00:00:00 2001 From: Laxminath Kasam Date: Thu, 23 Feb 2017 18:23:21 +0530 Subject: [PATCH] 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 --- sound/soc/codecs/msm_sdw/msm_sdw_cdc.c | 80 +++++++++++++++----------- 1 file changed, 47 insertions(+), 33 deletions(-) diff --git a/sound/soc/codecs/msm_sdw/msm_sdw_cdc.c b/sound/soc/codecs/msm_sdw/msm_sdw_cdc.c index f4a8fe7778fd..56bd0d0469de 100644 --- a/sound/soc/codecs/msm_sdw/msm_sdw_cdc.c +++ b/sound/soc/codecs/msm_sdw/msm_sdw_cdc.c @@ -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,