diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2017-02-25 19:49:31 -0800 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-02-25 19:49:31 -0800 |
| commit | b7fb0e4bdf5bbaa555d2cec03ef3ce4fc600d8c9 (patch) | |
| tree | cc756b061f1fe89c81eec49476b5ffc9483f6174 | |
| parent | 083b8cc4391f98606cf8158c8356638b8bd280bc (diff) | |
| parent | ac0a983daec732ad6d732683d44d8d69e521afb8 (diff) | |
Merge "ASoC: msm_sdw: Add 48k TX VI sense sampling rate support"
| -rw-r--r-- | sound/soc/codecs/msm_sdw/msm_sdw_cdc.c | 80 |
1 files 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 2667d9e32869..6b267122dc08 100644 --- a/sound/soc/codecs/msm_sdw/msm_sdw_cdc.c +++ b/sound/soc/codecs/msm_sdw/msm_sdw_cdc.c @@ -471,10 +471,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, @@ -497,10 +496,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); @@ -1236,7 +1235,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", @@ -1245,28 +1244,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, @@ -1275,30 +1274,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; } @@ -1414,7 +1428,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, }, @@ -1423,9 +1437,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, |
