[alsa-devel] [PATCH] ASOC:DAPM: update DPCM runtime when mixer/mux changes
Nenghua Cao
nhcao at marvell.com
Mon Dec 16 03:43:05 CET 2013
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 at 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 at 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 at alsa-project.org
>> > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
More information about the Alsa-devel
mailing list