[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