[alsa-devel] [PATCH] ASoC: Remove special casing for registerless widgets

Lu Guanqun guanqun.lu at intel.com
Sat Apr 2 10:07:55 CEST 2011


On Sat, Apr 02, 2011 at 03:49:01PM +0800, Mark Brown wrote:
> Since we recently explicitly set the register for registerless widgets
> to no register there is no longer any need to special case power updates
> for them, we can allow them to be handled with the register compression
> code as other widgets are.
> 
> As this is the only remaining user of dapm_generic_apply_power() and
> dapm_update_bits() also remove those functions.
> 
> Noticed-by: Lu Guanqun <guanqun.lu at intel.com>
> Signed-off-by: Mark Brown <broonie at opensource.wolfsonmicro.com>
> ---
> 
> Compile tested only currently, sending it out now as part of discussion
> with Lu Guanqun.

I see the point what you were saying.

But I still don't quite understand the write compression, it aims at
reducing the number of register writes, however in
dapm_seq_run_coalesced, it calls snd_soc_update_bits.

Could you explain a little bit? It's appreciated. I'm vauge in this
part.

> 
>  sound/soc/soc-dapm.c |  100 --------------------------------------------------
>  1 files changed, 0 insertions(+), 100 deletions(-)
> 
> diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
> index b11d011..c9196d6 100644
> --- a/sound/soc/soc-dapm.c
> +++ b/sound/soc/soc-dapm.c
> @@ -322,45 +322,6 @@ static int dapm_connect_mixer(struct snd_soc_dapm_context *dapm,
>  	return -ENODEV;
>  }
>  
> -/* update dapm codec register bits */
> -static int dapm_update_bits(struct snd_soc_dapm_widget *widget)
> -{
> -	int change, power;
> -	unsigned int old, new;
> -	struct snd_soc_codec *codec = widget->codec;
> -	struct snd_soc_dapm_context *dapm = widget->dapm;
> -	struct snd_soc_card *card = dapm->card;
> -
> -	/* check for valid widgets */
> -	if (widget->reg < 0 || widget->id == snd_soc_dapm_input ||
> -		widget->id == snd_soc_dapm_output ||
> -		widget->id == snd_soc_dapm_hp ||
> -		widget->id == snd_soc_dapm_mic ||
> -		widget->id == snd_soc_dapm_line ||
> -		widget->id == snd_soc_dapm_spk)
> -		return 0;
> -
> -	power = widget->power;
> -	if (widget->invert)
> -		power = (power ? 0:1);
> -
> -	old = snd_soc_read(codec, widget->reg);
> -	new = (old & ~(0x1 << widget->shift)) | (power << widget->shift);
> -
> -	change = old != new;
> -	if (change) {
> -		pop_dbg(dapm->dev, card->pop_time,
> -			"pop test %s : %s in %d ms\n",
> -			widget->name, widget->power ? "on" : "off",
> -			card->pop_time);
> -		pop_wait(card->pop_time);
> -		snd_soc_write(codec, widget->reg, new);
> -	}
> -	dev_dbg(dapm->dev, "reg %x old %x new %x change %d\n", widget->reg,
> -		old, new, change);
> -	return change;
> -}
> -
>  /* create new dapm mixer control */
>  static int dapm_new_mixer(struct snd_soc_dapm_context *dapm,
>  	struct snd_soc_dapm_widget *w)
> @@ -644,57 +605,6 @@ int dapm_reg_event(struct snd_soc_dapm_widget *w,
>  }
>  EXPORT_SYMBOL_GPL(dapm_reg_event);
>  
> -/* Standard power change method, used to apply power changes to most
> - * widgets.
> - */
> -static int dapm_generic_apply_power(struct snd_soc_dapm_widget *w)
> -{
> -	int ret;
> -
> -	/* call any power change event handlers */
> -	if (w->event)
> -		dev_dbg(w->dapm->dev, "power %s event for %s flags %x\n",
> -			 w->power ? "on" : "off",
> -			 w->name, w->event_flags);
> -
> -	/* power up pre event */
> -	if (w->power && w->event &&
> -	    (w->event_flags & SND_SOC_DAPM_PRE_PMU)) {
> -		ret = w->event(w, NULL, SND_SOC_DAPM_PRE_PMU);
> -		if (ret < 0)
> -			return ret;
> -	}
> -
> -	/* power down pre event */
> -	if (!w->power && w->event &&
> -	    (w->event_flags & SND_SOC_DAPM_PRE_PMD)) {
> -		ret = w->event(w, NULL, SND_SOC_DAPM_PRE_PMD);
> -		if (ret < 0)
> -			return ret;
> -	}
> -
> -	dapm_update_bits(w);
> -
> -	/* power up post event */
> -	if (w->power && w->event &&
> -	    (w->event_flags & SND_SOC_DAPM_POST_PMU)) {
> -		ret = w->event(w,
> -			       NULL, SND_SOC_DAPM_POST_PMU);
> -		if (ret < 0)
> -			return ret;
> -	}
> -
> -	/* power down post event */
> -	if (!w->power && w->event &&
> -	    (w->event_flags & SND_SOC_DAPM_POST_PMD)) {
> -		ret = w->event(w, NULL, SND_SOC_DAPM_POST_PMD);
> -		if (ret < 0)
> -			return ret;
> -	}
> -
> -	return 0;
> -}
> -
>  /* Generic check to see if a widget should be powered.
>   */
>  static int dapm_generic_check_power(struct snd_soc_dapm_widget *w)
> @@ -981,16 +891,6 @@ static void dapm_seq_run(struct snd_soc_dapm_context *dapm,
>  					       NULL, SND_SOC_DAPM_POST_PMD);
>  			break;
>  
> -		case snd_soc_dapm_input:
> -		case snd_soc_dapm_output:
> -		case snd_soc_dapm_hp:
> -		case snd_soc_dapm_mic:
> -		case snd_soc_dapm_line:
> -		case snd_soc_dapm_spk:
> -			/* No register support currently */
> -			ret = dapm_generic_apply_power(w);
> -			break;
> -
>  		default:
>  			/* Queue it up for application */
>  			cur_sort = sort[w->id];
> -- 
> 1.7.4.1
> 

-- 
guanqun


More information about the Alsa-devel mailing list