OSDN Git Service

ASoC: msm_sdw: Add 48k TX VI sense sampling rate support
authorLaxminath Kasam <lkasam@codeaurora.org>
Thu, 23 Feb 2017 12:53:21 +0000 (18:23 +0530)
committerLaxminath Kasam <lkasam@codeaurora.org>
Fri, 24 Feb 2017 14:04:53 +0000 (19:34 +0530)
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>
sound/soc/codecs/msm_sdw/msm_sdw_cdc.c

index f4a8fe7..56bd0d0 100644 (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,