[alsa-devel] [PATCH 4/5] ASoC: dapm: Add support for autodisable mux controls

Lars-Peter Clausen lars at metafoo.de
Thu Apr 30 14:44:40 CEST 2015


On 04/30/2015 12:38 PM, Charles Keepax wrote:
> Commit 57295073b6ac ("ASoC: dapm: Implement mixer input auto-disable")
> added support for autodisable controls, controls whose values are only
> written to the hardware when their respective widgets are powered up.
> But it only added support for controls based on the mixer abstraction.
>
> This patch add support for mux controls (DAPM controls based on the
> enum abstraction) to be auto-disabled as well. As each mux can only have
> a single control, there is no need to tie the autodisable widget to the
> inputs (as is done for the mixer controls) it can be tided directly to
> the mux widget itself.
>
> Signed-off-by: Charles Keepax <ckeepax at opensource.wolfsonmicro.com>

Looks pretty good.

[...]
> @@ -354,6 +355,34 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget,
>   			}
>   		}
>   		break;
> +	case snd_soc_dapm_mux:
> +		e = (struct soc_enum *)kcontrol->private_value;
> +
> +		if (e->autodisable) {
> +			struct snd_soc_dapm_widget template;
> +
> +			memset(&template, 0, sizeof(template));
> +			template.reg = e->reg;
> +			template.mask = e->mask << e->shift_l;
> +			template.shift = e->shift_l;
> +			template.off_val = 0;

I've though about adding a auto-disable MUX type as well and the chip were I 
wanted to use it has a non-zero power-off value. So I'd like to be able to 
somehow specify this. We could for example put it at the end of the values 
array. E.g.

if (e->values)
	template.off_val = e->values[e->items].
else
	template.off_val = 0;

> +			template.on_val = template.off_val;
> +			template.id = snd_soc_dapm_kcontrol;
> +			template.name = name;
> +
> +			data->value = template.on_val;
> +
> +			data->widget = snd_soc_dapm_new_control(widget->dapm,
> +					&template);
> +			if (!data->widget) {
> +				ret = -ENOMEM;
> +				goto err_name;
> +			}
> +
> +			snd_soc_dapm_add_path(widget->dapm, data->widget,
> +					      widget, NULL, NULL);
> +		}
> +		break;
>   	default:
>   		break;
>   	}



More information about the Alsa-devel mailing list