summaryrefslogtreecommitdiff
path: root/sound/soc/mxs/mxs-saif.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-08-03 22:20:19 +0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-08-03 22:20:19 +0400
commitd667319a12c79e31cf17daffca3aa692d2f277ee (patch)
treee9e8e82f643cf47e4b1cfd996b48933818024068 /sound/soc/mxs/mxs-saif.c
parentc4e62d67854e247b09ffe763163057237c8b1614 (diff)
parentac190c76680cde6ce379b6be5baf89a970ea13d4 (diff)
downloadlinux-d667319a12c79e31cf17daffca3aa692d2f277ee.tar.xz
Merge tag 'sound-3.6' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound fixes from Takashi Iwai: "A bunch of small fixes for ASoC, mainly against regressions due to the defaulting regmap i/o, in addition to a HD-audio fixup." * tag 'sound-3.6' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ASoC: core: Fix check before defaulting to regmap ALSA: hda - Support dock on Lenovo Thinkpad T530 with ALC269VC ASoC: wm8962: Allow VMID time to fully ramp ASoC: AC97 doesn't use regmap by default ASoC: sgtl5000: enable VAG_POWER for LINE_IN ASoC: ab8500: Inform SoC Core that we have our own I/O arrangements ASoC: omap: Add missing modules aliases to get sound working on omap devices sound: tegra_alc5632: Adjust to of_get_named_gpio() change sound: tegra_wm8903: Adjust to of_get_named_gpio() change ASoC: mc13783: Provide codec->control_data ASoC: ux500: Include the correct header files ASoC: wm8994: Hold runtime PM reference while handling mic and jack IRQs ASoC: sgtl5000: remove unneeded snd_soc_dapm_new_widgets in probe ASoC: mxs-saif: set a base clock rate for EXTMASTER mode work ASoC: mxs-saif: fix clock prepare and enable unbalance issue ASoC: wm8994: Ensure there are enough BCLKs for four channels
Diffstat (limited to 'sound/soc/mxs/mxs-saif.c')
-rw-r--r--sound/soc/mxs/mxs-saif.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/sound/soc/mxs/mxs-saif.c b/sound/soc/mxs/mxs-saif.c
index aba71bfa33b1..b3030718c228 100644
--- a/sound/soc/mxs/mxs-saif.c
+++ b/sound/soc/mxs/mxs-saif.c
@@ -394,9 +394,14 @@ static int mxs_saif_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *cpu_dai)
{
struct mxs_saif *saif = snd_soc_dai_get_drvdata(cpu_dai);
+ struct mxs_saif *master_saif;
u32 scr, stat;
int ret;
+ master_saif = mxs_saif_get_master(saif);
+ if (!master_saif)
+ return -EINVAL;
+
/* mclk should already be set */
if (!saif->mclk && saif->mclk_in_use) {
dev_err(cpu_dai->dev, "set mclk first\n");
@@ -420,6 +425,25 @@ static int mxs_saif_hw_params(struct snd_pcm_substream *substream,
return ret;
}
+ /* prepare clk in hw_param, enable in trigger */
+ clk_prepare(saif->clk);
+ if (saif != master_saif) {
+ /*
+ * Set an initial clock rate for the saif internal logic to work
+ * properly. This is important when working in EXTMASTER mode
+ * that uses the other saif's BITCLK&LRCLK but it still needs a
+ * basic clock which should be fast enough for the internal
+ * logic.
+ */
+ clk_enable(saif->clk);
+ ret = clk_set_rate(saif->clk, 24000000);
+ clk_disable(saif->clk);
+ if (ret)
+ return ret;
+
+ clk_prepare(master_saif->clk);
+ }
+
scr = __raw_readl(saif->base + SAIF_CTRL);
scr &= ~BM_SAIF_CTRL_WORD_LENGTH;