ASoC: tlv320dac33: Manage a pointer for snd_pcm_substream in private structure
authorPeter Ujfalusi <peter.ujfalusi@nokia.com>
Fri, 30 Apr 2010 11:59:35 +0000 (14:59 +0300)
committerLiam Girdwood <lrg@slimlogic.co.uk>
Mon, 3 May 2010 11:55:48 +0000 (12:55 +0100)
As a preparation for supporting codec to be turned off,
when we are in BIAS_STANDBY.

The substream must be easily available in other places than
pcm_* callbacks.

Manage a pointer in _startup, and _shutdown for this.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@nokia.com>
Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
sound/soc/codecs/tlv320dac33.c

index 9944721a055c42a0f883846e64acae962316c598..50d152215abd0764df27604c13787b70f2c29b71 100644 (file)
@@ -91,6 +91,7 @@ struct tlv320dac33_priv {
        struct work_struct work;
        struct snd_soc_codec codec;
        struct regulator_bulk_data supplies[DAC33_NUM_SUPPLIES];
+       struct snd_pcm_substream *substream;
        int power_gpio;
        int chip_power;
        int irq;
@@ -720,6 +721,31 @@ static void dac33_oscwait(struct snd_soc_codec *codec)
                        "internal oscillator calibration failed\n");
 }
 
+static int dac33_startup(struct snd_pcm_substream *substream,
+                          struct snd_soc_dai *dai)
+{
+       struct snd_soc_pcm_runtime *rtd = substream->private_data;
+       struct snd_soc_device *socdev = rtd->socdev;
+       struct snd_soc_codec *codec = socdev->card->codec;
+       struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec);
+
+       /* Stream started, save the substream pointer */
+       dac33->substream = substream;
+
+       return 0;
+}
+
+static void dac33_shutdown(struct snd_pcm_substream *substream,
+                            struct snd_soc_dai *dai)
+{
+       struct snd_soc_pcm_runtime *rtd = substream->private_data;
+       struct snd_soc_device *socdev = rtd->socdev;
+       struct snd_soc_codec *codec = socdev->card->codec;
+       struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec);
+
+       dac33->substream = NULL;
+}
+
 static int dac33_hw_params(struct snd_pcm_substream *substream,
                           struct snd_pcm_hw_params *params,
                           struct snd_soc_dai *dai)
@@ -1367,6 +1393,8 @@ EXPORT_SYMBOL_GPL(soc_codec_dev_tlv320dac33);
 #define DAC33_FORMATS  SNDRV_PCM_FMTBIT_S16_LE
 
 static struct snd_soc_dai_ops dac33_dai_ops = {
+       .startup        = dac33_startup,
+       .shutdown       = dac33_shutdown,
        .hw_params      = dac33_hw_params,
        .prepare        = dac33_pcm_prepare,
        .trigger        = dac33_pcm_trigger,