Merge "ASoC: msm_sdw: Add 48k TX VI sense sampling rate support"

This commit is contained in:
Linux Build Service Account 2017-02-25 19:49:31 -08:00 committed by Gerrit - the friendly Code Review server
commit b7fb0e4bdf

View file

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