On 12/15/2013 09:56 PM, Vinod Koul wrote:
On Fri, Dec 13, 2013 at 08:13:49PM +0800, Nenghua Cao wrote:
From: Nenghua Cao nhcao@marvell.com
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
sound/soc/soc-dapm.c | 28 ++++++++++++++++++++++++---- 1 files changed, 24 insertions(+), 4 deletions(-)
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index dcade13..67e63ab 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c @@ -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);
This version looks much better! Btw would it make sense to have flag in card for dynmaic support and call soc_dpcm_runtime_update() for only these cards?
Hi, Vinod
In soc_dpcm_runtime_update(), it traverses the FE dai_link's "dynamic" flag. If the asoc driver supports DPCM, it will do update work. Or it will do nothing. After discussing with Mark and Takashi, it seems no more meaning to add this flag.
-- ~Vinod
- 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); -- 1.7.0.4
Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel