diff options
author | Bo Yan <byan@nvidia.com> | 2012-06-22 09:16:36 -0700 |
---|---|---|
committer | Bo Yan <byan@nvidia.com> | 2012-06-22 09:37:39 -0700 |
commit | 22224417965d3842b24455a9e4589d6d39e079e9 (patch) | |
tree | b83b4024c8a4e15b6af29a9ea2338a28bb4ce7d9 /sound | |
parent | 25790efe3851ffaac45d7edc02b286b9c82364f8 (diff) | |
parent | ab8469437be95034d5da31d60bf2003e435285db (diff) |
Merge branch 'vwadekar-rebased' into tot
The branch 'vwadekar-rebased' has the necessary cherry-picks from
origin/android-t114-3.1 up to tag "daily-2012.02.09.0-dev-t114"
Change-Id: Id43d7e8f04a705b225d64358fb354d41ee7c6a20
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/codecs/rt5639.c | 24 | ||||
-rw-r--r-- | sound/soc/codecs/rt5640.c | 23 | ||||
-rw-r--r-- | sound/soc/tegra/tegra30_i2s.c | 17 | ||||
-rw-r--r-- | sound/soc/tegra/tegra_p1852.c | 3 | ||||
-rw-r--r-- | sound/usb/pcm.c | 3 |
5 files changed, 68 insertions, 2 deletions
diff --git a/sound/soc/codecs/rt5639.c b/sound/soc/codecs/rt5639.c index 0fd74a45d9ca..d13fb47fb2b5 100644 --- a/sound/soc/codecs/rt5639.c +++ b/sound/soc/codecs/rt5639.c @@ -105,6 +105,18 @@ static int rt5639_reg_init(struct snd_soc_codec *codec) } #endif +static int rt5639_index_sync(struct snd_soc_codec *codec) +{ + int i; + + for (i = 0; i < RT5639_INIT_REG_LEN; i++) + if (RT5639_PRIV_INDEX == init_list[i].reg || + RT5639_PRIV_DATA == init_list[i].reg) + snd_soc_write(codec, init_list[i].reg, + init_list[i].val); + return 0; +} + static const u16 rt5639_reg[RT5639_VENDOR_ID2 + 1] = { [RT5639_RESET] = 0x0008, [RT5639_SPK_VOL] = 0xc8c8, @@ -2213,7 +2225,9 @@ static int rt5639_set_bias_level(struct snd_soc_codec *codec, RT5639_PWR_FV1 | RT5639_PWR_FV2, RT5639_PWR_FV1 | RT5639_PWR_FV2); codec->cache_only = false; + codec->cache_sync = 1; snd_soc_cache_sync(codec); + rt5639_index_sync(codec); } break; @@ -2311,13 +2325,23 @@ static int rt5639_remove(struct snd_soc_codec *codec) #ifdef CONFIG_PM static int rt5639_suspend(struct snd_soc_codec *codec, pm_message_t state) { + rt5639_reset(codec); rt5639_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } static int rt5639_resume(struct snd_soc_codec *codec) { + int ret = 0 ; + + codec->cache_sync = 1; + ret = snd_soc_cache_sync(codec); + if (ret) { + dev_err(codec->dev,"Failed to sync cache: %d\n", ret); + return ret; + } rt5639_set_bias_level(codec, SND_SOC_BIAS_STANDBY); + return 0; } #else diff --git a/sound/soc/codecs/rt5640.c b/sound/soc/codecs/rt5640.c index 0daf92f6e2d5..22cc413e8efc 100644 --- a/sound/soc/codecs/rt5640.c +++ b/sound/soc/codecs/rt5640.c @@ -106,6 +106,18 @@ static int rt5640_reg_init(struct snd_soc_codec *codec) } #endif +static int rt5640_index_sync(struct snd_soc_codec *codec) +{ + int i; + + for (i = 0; i < RT5640_INIT_REG_LEN; i++) + if (RT5640_PRIV_INDEX == init_list[i].reg || + RT5640_PRIV_DATA == init_list[i].reg) + snd_soc_write(codec, init_list[i].reg, + init_list[i].val); + return 0; +} + static const u16 rt5640_reg[RT5640_VENDOR_ID2 + 1] = { [RT5640_RESET] = 0x000c, [RT5640_SPK_VOL] = 0xc8c8, @@ -2269,7 +2281,9 @@ static int rt5640_set_bias_level(struct snd_soc_codec *codec, RT5640_PWR_FV1 | RT5640_PWR_FV2, RT5640_PWR_FV1 | RT5640_PWR_FV2); codec->cache_only = false; + codec->cache_sync = 1; snd_soc_cache_sync(codec); + rt5640_index_sync(codec); } break; @@ -2381,6 +2395,7 @@ static int rt5640_remove(struct snd_soc_codec *codec) #ifdef CONFIG_PM static int rt5640_suspend(struct snd_soc_codec *codec, pm_message_t state) { + rt5640_reset(codec); rt5640_set_bias_level(codec, SND_SOC_BIAS_OFF); snd_soc_write(codec, RT5640_PWR_ANLG1, 0); @@ -2389,6 +2404,14 @@ static int rt5640_suspend(struct snd_soc_codec *codec, pm_message_t state) static int rt5640_resume(struct snd_soc_codec *codec) { + int ret = 0 ; + + codec->cache_sync = 1; + ret = snd_soc_cache_sync(codec); + if (ret) { + dev_err(codec->dev,"Failed to sync cache: %d\n", ret); + return ret; + } rt5640_set_bias_level(codec, SND_SOC_BIAS_STANDBY); return 0; diff --git a/sound/soc/tegra/tegra30_i2s.c b/sound/soc/tegra/tegra30_i2s.c index c2995816840f..6ffec136c4c3 100644 --- a/sound/soc/tegra/tegra30_i2s.c +++ b/sound/soc/tegra/tegra30_i2s.c @@ -346,6 +346,7 @@ static int tegra30_i2s_tdm_setup_clocks(struct device *dev, dev_err(dev, "Can't set parent of I2S clock\n"); return ret; } + ret = clk_set_rate(i2s->clk_i2s, *i2sclock); if (ret) { dev_err(dev, "Can't set I2S clock rate: %d\n", ret); @@ -359,6 +360,13 @@ static int tegra30_i2s_tdm_setup_clocks(struct device *dev, return ret; } + ret = clk_set_parent(clk_get_parent(i2s->clk_audio_2x), + i2s->clk_i2s_sync); + if (ret) { + dev_err(dev, "Can't set parent of audio2x clock\n"); + return ret; + } + ret = clk_set_rate(i2s->clk_audio_2x, *i2sclock); if (ret) { dev_err(dev, "Can't set audio2x clock rate\n"); @@ -367,7 +375,7 @@ static int tegra30_i2s_tdm_setup_clocks(struct device *dev, ret = clk_set_parent(i2s->clk_i2s, i2s->clk_audio_2x); if (ret) { - dev_err(dev, "Can't set parent of audio2x clock\n"); + dev_err(dev, "Can't set parent of i2s clock\n"); return ret; } } @@ -382,7 +390,8 @@ static int tegra30_i2s_tdm_hw_params(struct snd_pcm_substream *substream, struct device *dev = substream->pcm->card->dev; struct tegra30_i2s *i2s = snd_soc_dai_get_drvdata(dai); u32 val; - int i2s_client_ch, i2s_audio_ch, i2s_audio_bits, i2s_client_bits; + int i2s_client_ch, i2s_audio_ch; + int i2s_audio_bits = 0, i2s_client_bits = 0; int i2sclock, srate; int ret; @@ -418,6 +427,10 @@ static int tegra30_i2s_tdm_hw_params(struct snd_pcm_substream *substream, i2s_client_bits = TEGRA30_AUDIOCIF_BITS_32; i2s->reg_ctrl |= TEGRA30_I2S_CTRL_BIT_SIZE_32; break; + default: + dev_err(dev, "unknown slot_width %d\n", + i2s->dsp_config.slot_width); + return -EINVAL; } val = (0 << TEGRA30_AUDIOCIF_CTRL_FIFO_THRESHOLD_SHIFT) | diff --git a/sound/soc/tegra/tegra_p1852.c b/sound/soc/tegra/tegra_p1852.c index 14295b13649b..8a39178ad74a 100644 --- a/sound/soc/tegra/tegra_p1852.c +++ b/sound/soc/tegra/tegra_p1852.c @@ -228,6 +228,9 @@ static __devinit int tegra_p1852_driver_probe(struct platform_device *pdev) pdata->codec_info[i].codec_dai_name; tegra_p1852_dai_link[i].name = pdata->codec_info[i].name; + if (pdata->codec_info[i].pcm_driver) + tegra_p1852_dai_link[i].platform_name = + pdata->codec_info[i].pcm_driver; } ret = tegra_asoc_utils_init(&machine->util_data, &pdev->dev, card); diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c index 0eed6115c2d4..67a4d6dbb32b 100644 --- a/sound/usb/pcm.c +++ b/sound/usb/pcm.c @@ -699,6 +699,9 @@ static int snd_usb_pcm_check_knot(struct snd_pcm_runtime *runtime, int count = 0, needs_knot = 0; int err; + kfree(subs->rate_list.list); + subs->rate_list.list = NULL; + list_for_each_entry(fp, &subs->fmt_list, list) { if (fp->rates & SNDRV_PCM_RATE_CONTINUOUS) return 0; |