[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