int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate);
 
 /* Digital Audio Interface mute */
-int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute);
+int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute,
+                            int direction);
 
 struct snd_soc_dai_ops {
        /*
         * Called by soc-core to minimise any pops.
         */
        int (*digital_mute)(struct snd_soc_dai *dai, int mute);
+       int (*mute_stream)(struct snd_soc_dai *dai, int mute, int stream);
 
        /*
         * ALSA PCM audio operations - all optional.
 
        if (cstream->direction == SND_COMPRESS_PLAYBACK) {
                cpu_dai->playback_active--;
                codec_dai->playback_active--;
-               snd_soc_dai_digital_mute(codec_dai, 1);
        } else {
                cpu_dai->capture_active--;
                codec_dai->capture_active--;
        }
 
+       snd_soc_dai_digital_mute(codec_dai, 1, cstream->direction);
+
        cpu_dai->active--;
        codec_dai->active--;
        codec->active--;
                        goto out;
        }
 
-       if (cstream->direction == SND_COMPRESS_PLAYBACK) {
-               switch (cmd) {
-               case SNDRV_PCM_TRIGGER_START:
-                       snd_soc_dai_digital_mute(codec_dai, 0);
-                       break;
-               case SNDRV_PCM_TRIGGER_STOP:
-                       snd_soc_dai_digital_mute(codec_dai, 1);
-                       break;
-               }
+       switch (cmd) {
+       case SNDRV_PCM_TRIGGER_START:
+               snd_soc_dai_digital_mute(codec_dai, 0, cstream->direction);
+               break;
+       case SNDRV_PCM_TRIGGER_STOP:
+               snd_soc_dai_digital_mute(codec_dai, 1, cstream->direction);
+               break;
        }
 
 out:
 
  * snd_soc_dai_digital_mute - configure DAI system or master clock.
  * @dai: DAI
  * @mute: mute enable
+ * @direction: stream to mute
  *
  * Mutes the DAI DAC.
  */
-int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute)
+int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute,
+                            int direction)
 {
-       if (dai->driver && dai->driver->ops->digital_mute)
+       if (!dai->driver)
+               return -ENOTSUPP;
+
+       if (dai->driver->ops->mute_stream)
+               return dai->driver->ops->mute_stream(dai, mute, direction);
+       else if (direction == SNDRV_PCM_STREAM_PLAYBACK &&
+                dai->driver->ops->digital_mute)
                return dai->driver->ops->digital_mute(dai, mute);
        else
                return -ENOTSUPP;
 
                break;
 
        case SND_SOC_DAPM_POST_PMU:
-               ret = snd_soc_dai_digital_mute(sink, 0);
+               ret = snd_soc_dai_digital_mute(sink, 0,
+                                              SNDRV_PCM_STREAM_PLAYBACK);
                if (ret != 0 && ret != -ENOTSUPP)
                        dev_warn(sink->dev, "ASoC: Failed to unmute: %d\n", ret);
                ret = 0;
                break;
 
        case SND_SOC_DAPM_PRE_PMD:
-               ret = snd_soc_dai_digital_mute(sink, 1);
+               ret = snd_soc_dai_digital_mute(sink, 1,
+                                              SNDRV_PCM_STREAM_PLAYBACK);
                if (ret != 0 && ret != -ENOTSUPP)
                        dev_warn(sink->dev, "ASoC: Failed to mute: %d\n", ret);
                ret = 0;
 
        /* Muting the DAC suppresses artifacts caused during digital
         * shutdown, for example from stopping clocks.
         */
-       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-               snd_soc_dai_digital_mute(codec_dai, 1);
+       snd_soc_dai_digital_mute(codec_dai, 1, substream->stream);
 
        if (cpu_dai->driver->ops->shutdown)
                cpu_dai->driver->ops->shutdown(substream, cpu_dai);
        snd_soc_dapm_stream_event(rtd, substream->stream,
                        SND_SOC_DAPM_STREAM_START);
 
-       snd_soc_dai_digital_mute(codec_dai, 0);
+       snd_soc_dai_digital_mute(codec_dai, 0, substream->stream);
 
 out:
        mutex_unlock(&rtd->pcm_mutex);
 
        /* apply codec digital mute */
        if (!codec->active)
-               snd_soc_dai_digital_mute(codec_dai, 1);
+               snd_soc_dai_digital_mute(codec_dai, 1, substream->stream);
 
        /* free any machine hw params */
        if (rtd->dai_link->ops && rtd->dai_link->ops->hw_free)