]> Pileus Git - ~andy/linux/commitdiff
ASoC: dapm: update DPCM runtime when mixer/mux changes
authorNenghua Cao <nhcao@marvell.com>
Fri, 13 Dec 2013 12:13:49 +0000 (20:13 +0800)
committerMark Brown <broonie@linaro.org>
Mon, 16 Dec 2013 20:13:50 +0000 (20:13 +0000)
    DPCM can dynamically alter the FE to BE PCM links at runtime based
on mixer/mux setting updates. Add soc_dpcm_runtime_update() calling in
get/put function for mixer/mux to support this feature.

Signed-off-by: Nenghua Cao <nhcao@marvell.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
sound/soc/soc-dapm.c

index dcade130157f3433d88ddbf7db7c311c43ea8042..67e63ab1f11e0597a2f3841bf502be31718d82b1 100644 (file)
@@ -2868,6 +2868,7 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
        unsigned int val;
        int connect, change;
        struct snd_soc_dapm_update update;
+       int ret = 0;
 
        if (snd_soc_volsw_is_stereo(mc))
                dev_warn(codec->dapm.dev,
@@ -2901,12 +2902,16 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
                        card->update = &update;
                }
 
-               soc_dapm_mixer_update_power(card, kcontrol, connect);
+               ret = soc_dapm_mixer_update_power(card, kcontrol, connect);
 
                card->update = NULL;
        }
 
        mutex_unlock(&card->dapm_mutex);
+
+       if (ret > 0)
+               soc_dpcm_runtime_update(card);
+
        return change;
 }
 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_volsw);
@@ -2955,6 +2960,7 @@ int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol,
        unsigned int val, mux, change;
        unsigned int mask;
        struct snd_soc_dapm_update update;
+       int ret = 0;
 
        if (ucontrol->value.enumerated.item[0] > e->max - 1)
                return -EINVAL;
@@ -2978,12 +2984,16 @@ int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol,
                update.val = val;
                card->update = &update;
 
-               soc_dapm_mux_update_power(card, kcontrol, mux, e);
+               ret = soc_dapm_mux_update_power(card, kcontrol, mux, e);
 
                card->update = NULL;
        }
 
        mutex_unlock(&card->dapm_mutex);
+
+       if (ret > 0)
+               soc_dpcm_runtime_update(card);
+
        return change;
 }
 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_enum_double);
@@ -3019,6 +3029,7 @@ int snd_soc_dapm_put_enum_virt(struct snd_kcontrol *kcontrol,
        struct soc_enum *e =
                (struct soc_enum *)kcontrol->private_value;
        int change;
+       int ret = 0;
 
        if (ucontrol->value.enumerated.item[0] >= e->max)
                return -EINVAL;
@@ -3028,9 +3039,13 @@ int snd_soc_dapm_put_enum_virt(struct snd_kcontrol *kcontrol,
        value = ucontrol->value.enumerated.item[0];
        change = dapm_kcontrol_set_value(kcontrol, value);
        if (change)
-               soc_dapm_mux_update_power(card, kcontrol, value, e);
+               ret = soc_dapm_mux_update_power(card, kcontrol, value, e);
 
        mutex_unlock(&card->dapm_mutex);
+
+       if (ret > 0)
+               soc_dpcm_runtime_update(card);
+
        return change;
 }
 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_enum_virt);
@@ -3097,6 +3112,7 @@ int snd_soc_dapm_put_value_enum_double(struct snd_kcontrol *kcontrol,
        unsigned int val, mux, change;
        unsigned int mask;
        struct snd_soc_dapm_update update;
+       int ret = 0;
 
        if (ucontrol->value.enumerated.item[0] > e->max - 1)
                return -EINVAL;
@@ -3120,12 +3136,16 @@ int snd_soc_dapm_put_value_enum_double(struct snd_kcontrol *kcontrol,
                update.val = val;
                card->update = &update;
 
-               soc_dapm_mux_update_power(card, kcontrol, mux, e);
+               ret = soc_dapm_mux_update_power(card, kcontrol, mux, e);
 
                card->update = NULL;
        }
 
        mutex_unlock(&card->dapm_mutex);
+
+       if (ret > 0)
+               soc_dpcm_runtime_update(card);
+
        return change;
 }
 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_value_enum_double);