/recipes/linux/linux-omap3-psp/omap3evm/2.1.2.9/0412-ASoC-Provide-core-support-for-symmetric-sample-rate.patch
Patch | 118 lines | 108 code | 10 blank | 0 comment | 0 complexity | 18c1bacd4b91a3be43837c6620c4b94a MD5 | raw file
- From 1218a7108d6d6aa729dc60d9539d42d710ccbd59 Mon Sep 17 00:00:00 2001
- From: Mark Brown <broonie@opensource.wolfsonmicro.com>
- Date: Tue, 7 Apr 2009 18:10:13 +0100
- Subject: [PATCH 412/426] ASoC: Provide core support for symmetric sample rates
- Many devices require symmetric configurations of capture and playback
- data formats, often due to shared clocking but sometimes also due to
- other shared playback and record configuration in the device. Start
- providing core support for this by allowing the DAIs or the machine
- to specify that the sample rates used should be kept symmetric.
- A flag symmetric_rates is provided in the snd_soc_dai and
- snd_soc_dai_link structures. If this is set in either of the DAIs or in
- the machine then a constraint will be applied when a stream is already
- open preventing any changes in sample rate.
- Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
- ---
- include/sound/soc-dai.h | 1 +
- include/sound/soc.h | 6 ++++++
- sound/soc/soc-core.c | 38 ++++++++++++++++++++++++++++++++++++++
- 3 files changed, 45 insertions(+), 0 deletions(-)
- diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h
- index 1367647..22b729f 100644
- --- a/include/sound/soc-dai.h
- +++ b/include/sound/soc-dai.h
- @@ -208,6 +208,7 @@ struct snd_soc_dai {
- /* DAI capabilities */
- struct snd_soc_pcm_stream capture;
- struct snd_soc_pcm_stream playback;
- + unsigned int symmetric_rates:1;
-
- /* DAI runtime info */
- struct snd_pcm_runtime *runtime;
- diff --git a/include/sound/soc.h b/include/sound/soc.h
- index 4b41df6..6e27c0a 100644
- --- a/include/sound/soc.h
- +++ b/include/sound/soc.h
- @@ -420,6 +420,12 @@ struct snd_soc_dai_link {
- /* codec/machine specific init - e.g. add machine controls */
- int (*init)(struct snd_soc_codec *codec);
-
- + /* Symmetry requirements */
- + unsigned int symmetric_rates:1;
- +
- + /* Symmetry data - only valid if symmetry is being enforced */
- + unsigned int rate;
- +
- /* DAI pcm */
- struct snd_pcm *pcm;
- };
- diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
- index 28a06f5..2a3adaf 100644
- --- a/sound/soc/soc-core.c
- +++ b/sound/soc/soc-core.c
- @@ -113,6 +113,35 @@ static int soc_ac97_dev_register(struct snd_soc_codec *codec)
- }
- #endif
-
- +static int soc_pcm_apply_symmetry(struct snd_pcm_substream *substream)
- +{
- + struct snd_soc_pcm_runtime *rtd = substream->private_data;
- + struct snd_soc_device *socdev = rtd->socdev;
- + struct snd_soc_card *card = socdev->card;
- + struct snd_soc_dai_link *machine = rtd->dai;
- + struct snd_soc_dai *cpu_dai = machine->cpu_dai;
- + struct snd_soc_dai *codec_dai = machine->codec_dai;
- + int ret;
- +
- + if (codec_dai->symmetric_rates || cpu_dai->symmetric_rates ||
- + machine->symmetric_rates) {
- + dev_dbg(card->dev, "Symmetry forces %dHz rate\n",
- + machine->rate);
- +
- + ret = snd_pcm_hw_constraint_minmax(substream->runtime,
- + SNDRV_PCM_HW_PARAM_RATE,
- + machine->rate,
- + machine->rate);
- + if (ret < 0) {
- + dev_err(card->dev,
- + "Unable to apply rate symmetry constraint: %d\n", ret);
- + return ret;
- + }
- + }
- +
- + return 0;
- +}
- +
- /*
- * Called by ALSA when a PCM substream is opened, the runtime->hw record is
- * then initialized and any private data can be allocated. This also calls
- @@ -221,6 +250,13 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
- goto machine_err;
- }
-
- + /* Symmetry only applies if we've already got an active stream. */
- + if (cpu_dai->active || codec_dai->active) {
- + ret = soc_pcm_apply_symmetry(substream);
- + if (ret != 0)
- + goto machine_err;
- + }
- +
- pr_debug("asoc: %s <-> %s info:\n", codec_dai->name, cpu_dai->name);
- pr_debug("asoc: rate mask 0x%x\n", runtime->hw.rates);
- pr_debug("asoc: min ch %d max ch %d\n", runtime->hw.channels_min,
- @@ -479,6 +515,8 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
- }
- }
-
- + machine->rate = params_rate(params);
- +
- out:
- mutex_unlock(&pcm_mutex);
- return ret;
- --
- 1.6.2.4