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, MSM_SDW_TX10_SPKR_PROT_PATH_CTL, 0x20,
0x20); 0x20);
snd_soc_update_bits(codec, 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, snd_soc_update_bits(codec,
MSM_SDW_TX10_SPKR_PROT_PATH_CTL, 0x0F, MSM_SDW_TX10_SPKR_PROT_PATH_CTL, 0x0F, 0x04);
0x00);
snd_soc_update_bits(codec, snd_soc_update_bits(codec,
MSM_SDW_TX9_SPKR_PROT_PATH_CTL, 0x10, 0x10); MSM_SDW_TX9_SPKR_PROT_PATH_CTL, 0x10, 0x10);
snd_soc_update_bits(codec, snd_soc_update_bits(codec,
@ -497,10 +496,10 @@ static int msm_sdw_codec_enable_vi_feedback(struct snd_soc_dapm_widget *w,
0x20); 0x20);
snd_soc_update_bits(codec, snd_soc_update_bits(codec,
MSM_SDW_TX11_SPKR_PROT_PATH_CTL, 0x0F, MSM_SDW_TX11_SPKR_PROT_PATH_CTL, 0x0F,
0x00); 0x04);
snd_soc_update_bits(codec, snd_soc_update_bits(codec,
MSM_SDW_TX12_SPKR_PROT_PATH_CTL, 0x0F, MSM_SDW_TX12_SPKR_PROT_PATH_CTL, 0x0F,
0x00); 0x04);
snd_soc_update_bits(codec, snd_soc_update_bits(codec,
MSM_SDW_TX11_SPKR_PROT_PATH_CTL, 0x10, MSM_SDW_TX11_SPKR_PROT_PATH_CTL, 0x10,
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_pcm_hw_params *params,
struct snd_soc_dai *dai) struct snd_soc_dai *dai)
{ {
u8 rx_clk_fs_rate, rx_fs_rate; u8 clk_fs_rate, fs_rate;
dev_dbg(dai->codec->dev, dev_dbg(dai->codec->dev,
"%s: dai_name = %s DAI-ID %x rate %d num_ch %d format %d\n", "%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)) { switch (params_rate(params)) {
case 8000: case 8000:
rx_clk_fs_rate = 0x00; clk_fs_rate = 0x00;
rx_fs_rate = 0x00; fs_rate = 0x00;
break; break;
case 16000: case 16000:
rx_clk_fs_rate = 0x01; clk_fs_rate = 0x01;
rx_fs_rate = 0x01; fs_rate = 0x01;
break; break;
case 32000: case 32000:
rx_clk_fs_rate = 0x02; clk_fs_rate = 0x02;
rx_fs_rate = 0x03; fs_rate = 0x03;
break; break;
case 48000: case 48000:
rx_clk_fs_rate = 0x03; clk_fs_rate = 0x03;
rx_fs_rate = 0x04; fs_rate = 0x04;
break; break;
case 96000: case 96000:
rx_clk_fs_rate = 0x04; clk_fs_rate = 0x04;
rx_fs_rate = 0x05; fs_rate = 0x05;
break; break;
case 192000: case 192000:
rx_clk_fs_rate = 0x05; clk_fs_rate = 0x05;
rx_fs_rate = 0x06; fs_rate = 0x06;
break; break;
default: default:
dev_err(dai->codec->dev, dev_err(dai->codec->dev,
@ -1275,20 +1274,37 @@ static int msm_sdw_hw_params(struct snd_pcm_substream *substream,
return -EINVAL; return -EINVAL;
} }
if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
snd_soc_update_bits(dai->codec, snd_soc_update_bits(dai->codec,
MSM_SDW_TOP_RX_I2S_CTL, 0x1C, (rx_clk_fs_rate << 2)); MSM_SDW_TOP_TX_I2S_CTL, 0x1C,
(clk_fs_rate << 2));
} else {
snd_soc_update_bits(dai->codec, snd_soc_update_bits(dai->codec,
MSM_SDW_RX7_RX_PATH_CTL, 0x0F, rx_fs_rate); MSM_SDW_TOP_RX_I2S_CTL, 0x1C,
(clk_fs_rate << 2));
snd_soc_update_bits(dai->codec, snd_soc_update_bits(dai->codec,
MSM_SDW_RX8_RX_PATH_CTL, 0x0F, rx_fs_rate); 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)) { switch (params_format(params)) {
case SNDRV_PCM_FORMAT_S16_LE: case SNDRV_PCM_FORMAT_S16_LE:
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, snd_soc_update_bits(dai->codec,
MSM_SDW_TOP_RX_I2S_CTL, 0x20, 0x20); MSM_SDW_TOP_RX_I2S_CTL, 0x20, 0x20);
break; break;
case SNDRV_PCM_FORMAT_S24_LE: case SNDRV_PCM_FORMAT_S24_LE:
case SNDRV_PCM_FORMAT_S24_3LE: case SNDRV_PCM_FORMAT_S24_3LE:
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, snd_soc_update_bits(dai->codec,
MSM_SDW_TOP_RX_I2S_CTL, 0x20, 0x00); MSM_SDW_TOP_RX_I2S_CTL, 0x20, 0x00);
break; break;
@ -1297,8 +1313,6 @@ static int msm_sdw_hw_params(struct snd_pcm_substream *substream,
__func__); __func__);
return -EINVAL; return -EINVAL;
} }
snd_soc_update_bits(dai->codec,
MSM_SDW_TOP_TX_I2S_CTL, 0x20, 0x20);
return 0; return 0;
} }
@ -1414,7 +1428,7 @@ static struct snd_soc_dai_driver msm_sdw_dai[] = {
.rate_max = 192000, .rate_max = 192000,
.rate_min = 8000, .rate_min = 8000,
.channels_min = 1, .channels_min = 1,
.channels_max = 2, .channels_max = 4,
}, },
.ops = &msm_sdw_dai_ops, .ops = &msm_sdw_dai_ops,
}, },
@ -1423,9 +1437,9 @@ static struct snd_soc_dai_driver msm_sdw_dai[] = {
.id = AIF1_SDW_VIFEED, .id = AIF1_SDW_VIFEED,
.capture = { .capture = {
.stream_name = "VIfeed_SDW", .stream_name = "VIfeed_SDW",
.rates = SNDRV_PCM_RATE_8000, .rates = MSM_SDW_RATES,
.formats = SNDRV_PCM_FMTBIT_S16_LE, .formats = SNDRV_PCM_FMTBIT_S16_LE,
.rate_max = 8000, .rate_max = 48000,
.rate_min = 8000, .rate_min = 8000,
.channels_min = 2, .channels_min = 2,
.channels_max = 4, .channels_max = 4,