From e5f7f9c1e05e8e19eaca455f9936516e11618345 Mon Sep 17 00:00:00 2001 From: sugar Date: Wed, 5 Nov 2014 13:25:47 +0800 Subject: [PATCH] Audio: add 192k samplerate support. --- include/sound/pcm_params.h | 3 +++ sound/soc/codecs/hdmi_i2s.c | 3 ++- sound/soc/codecs/rk312x_codec.c | 3 ++- sound/soc/rockchip/rk_hdmi_i2s.c | 21 ++++++++++++++++----- sound/soc/rockchip/rk_pcm.c | 4 ++-- 5 files changed, 25 insertions(+), 9 deletions(-) mode change 100644 => 100755 include/sound/pcm_params.h mode change 100644 => 100755 sound/soc/codecs/hdmi_i2s.c mode change 100644 => 100755 sound/soc/rockchip/rk_hdmi_i2s.c diff --git a/include/sound/pcm_params.h b/include/sound/pcm_params.h old mode 100644 new mode 100755 index 37ae12e0ab06..3aa1e07ea2ac --- a/include/sound/pcm_params.h +++ b/include/sound/pcm_params.h @@ -354,4 +354,7 @@ params_period_bytes(const struct snd_pcm_hw_params *p) params_channels(p)) / 8; } +#define HW_PARAMS_FLAG_LPCM 0 +#define HW_PARAMS_FLAG_NLPCM 1 + #endif /* __SOUND_PCM_PARAMS_H */ diff --git a/sound/soc/codecs/hdmi_i2s.c b/sound/soc/codecs/hdmi_i2s.c old mode 100644 new mode 100755 index ac552780d18b..2d790eeb7d48 --- a/sound/soc/codecs/hdmi_i2s.c +++ b/sound/soc/codecs/hdmi_i2s.c @@ -29,7 +29,8 @@ struct snd_soc_dai_driver hdmi_i2s_dai = { .rates = (SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | - SNDRV_PCM_RATE_96000), + SNDRV_PCM_RATE_96000 | + SNDRV_PCM_RATE_192000), .formats = (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE), diff --git a/sound/soc/codecs/rk312x_codec.c b/sound/soc/codecs/rk312x_codec.c index a58cf54cbbca..872f619b063f 100755 --- a/sound/soc/codecs/rk312x_codec.c +++ b/sound/soc/codecs/rk312x_codec.c @@ -1995,7 +1995,8 @@ static void rk312x_shutdown(struct snd_pcm_substream *substream, SNDRV_PCM_RATE_32000 | \ SNDRV_PCM_RATE_44100 | \ SNDRV_PCM_RATE_48000 | \ - SNDRV_PCM_RATE_96000) + SNDRV_PCM_RATE_96000 | \ + SNDRV_PCM_RATE_192000) #define RK312x_CAPTURE_RATES (SNDRV_PCM_RATE_8000 |\ SNDRV_PCM_RATE_16000 | \ diff --git a/sound/soc/rockchip/rk_hdmi_i2s.c b/sound/soc/rockchip/rk_hdmi_i2s.c old mode 100644 new mode 100755 index b89339fa8b5f..fe9c716861e0 --- a/sound/soc/rockchip/rk_hdmi_i2s.c +++ b/sound/soc/rockchip/rk_hdmi_i2s.c @@ -30,6 +30,7 @@ static int hdmi_i2s_hifi_hw_params(struct snd_pcm_substream *substream, struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_dai *cpu_dai = rtd->cpu_dai; unsigned int pll_out = 0, dai_fmt = rtd->dai_link->dai_fmt; + int div_bclk,div_mclk; int ret; DBG("Enter::%s----%d\n", __func__, __LINE__); @@ -48,13 +49,21 @@ static int hdmi_i2s_hifi_hw_params(struct snd_pcm_substream *substream, case 24000: case 32000: case 48000: + case 96000: pll_out = 12288000; break; case 11025: case 22050: case 44100: + case 88200: pll_out = 11289600; break; + case 176400: + pll_out = 11289600*2; + break; + case 192000: + pll_out = 12288000*2; + break; default: pr_err("Enter:%s, %d, Error rate=%d\n", __func__, __LINE__, params_rate(params)); @@ -66,13 +75,15 @@ static int hdmi_i2s_hifi_hw_params(struct snd_pcm_substream *substream, __func__, __LINE__, params_rate(params)); + div_bclk = 63; + div_mclk = pll_out/(params_rate(params)*(div_bclk+1))-1; + snd_soc_dai_set_sysclk(cpu_dai, 0, pll_out, 0); - snd_soc_dai_set_clkdiv(cpu_dai, ROCKCHIP_DIV_BCLK, - (pll_out / 4) / params_rate(params) - 1); - snd_soc_dai_set_clkdiv(cpu_dai, ROCKCHIP_DIV_MCLK, 3); + snd_soc_dai_set_clkdiv(cpu_dai, ROCKCHIP_DIV_BCLK,div_bclk); + snd_soc_dai_set_clkdiv(cpu_dai, ROCKCHIP_DIV_MCLK, div_mclk); - DBG("Enter:%s, %d, pll_out / 4 / params_rate(params) = %d\n", - __func__, __LINE__, (pll_out / 4) / params_rate(params)); + DBG("Enter:%s, %d, div_bclk: %d, div_mclk: %d\n", + __func__, __LINE__, div_bclk, div_mclk); return 0; } diff --git a/sound/soc/rockchip/rk_pcm.c b/sound/soc/rockchip/rk_pcm.c index d90c142967ad..dad8e63e34dd 100755 --- a/sound/soc/rockchip/rk_pcm.c +++ b/sound/soc/rockchip/rk_pcm.c @@ -36,7 +36,7 @@ static const struct snd_pcm_hardware rockchip_pcm_hardware = { .channels_max = 8, .buffer_bytes_max = 128*1024, .period_bytes_min = 64, - .period_bytes_max = 2048*4, + .period_bytes_max = 32*1024,//2048*4,///PAGE_SIZE*2, .periods_min = 3, .periods_max = 128, .fifo_size = 16, @@ -46,7 +46,7 @@ static const struct snd_dmaengine_pcm_config rockchip_dmaengine_pcm_config = { .pcm_hardware = &rockchip_pcm_hardware, .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config, .compat_filter_fn = NULL, - .prealloc_buffer_size = PAGE_SIZE * 8, + .prealloc_buffer_size = PAGE_SIZE * 32, }; int rockchip_pcm_platform_register(struct device *dev) -- 2.34.1