Re: [RFC PATCH v2 5/5] ASoC: apple: Add macaudio machine driver

From: Martin Povišer
Date: Thu Jun 09 2022 - 09:42:51 EST



> On 9. 6. 2022, at 15:16, Mark Brown <broonie@xxxxxxxxxx> wrote:
>
> On Mon, Jun 06, 2022 at 09:19:10PM +0200, Martin Povišer wrote:
>
>> + * ┌──────────┐ ┌───────────────► ┌─────┐ ┌──────────┐
>> + * │ Primary ├───────┤ │ Mux │ ──► │ Speakers │
>> + * └──────────┘ │ ┌──────────► └─────┘ └──────────┘
>> + * ┌─── │ ───┘ ▲
>> + * ┌──────────┐ │ │ │
>> + * │Secondary ├──┘ │ ┌────────────┴┐
>> + * └──────────┘ ├────►│Plug-in Demux│
>> + * │ └────────────┬┘
>> + * │ │
>> + * │ ▼
>> + * │ ┌─────┐ ┌──────────┐
>> + * └───────────────► │ Mux │ ──► │Headphones│
>> + * └─────┘ └──────────┘
>
> As far as I can tell this demux is entirely software based - why not
> just expose the routing control to userspace and let it handle
> switching (which I suspect may be more featureful than what's
> implemented here)?

Well, userspace should have the other two muxes at its disposal to
implement any routing/switching it wishes -- but in addition we are
also offering letting kernel take care of the switching, by pointing
the muxes to the demux.

I assume (but I don’t know the extent of what’s possible with UCM files),
that this will be of some value to users running plain ALSA with no
sound server.

>> +static int macaudio_jack_event(struct notifier_block *nb, unsigned long event,
>> + void *data)
>> +{
>> + struct snd_soc_jack *jack = data;
>> + struct macaudio_snd_data *ma = snd_soc_card_get_drvdata(jack->card);
>> +
>> + ma->jack_plugin_state = !!event;
>> +
>> + if (!ma->plugin_demux_kcontrol)
>> + return 0;
>> +
>> + snd_soc_dapm_mux_update_power(&ma->card.dapm, ma->plugin_demux_kcontrol,
>> + ma->jack_plugin_state,
>> + (struct soc_enum *) &macaudio_plugin_demux_enum, NULL);
>> +
>> + return 0;
>> +}
>
> This should be integrated with the core jack detection stuff in
> soc-jack.c and/or the core stuff that's wrapping - that way you'll
> ensure that events are generated and status readable via all the
> interfaces userspace might be looking for. The ASoC stuff also has some
> DAPM integration for turning on/off outputs which might DTRT for you if
> you do need it in kernel.

Aren’t all the right events to userspace generated already by the
codec calling snd_soc_jack_report?

I looked at the existing DAPM integration but I couldn’t figure out
how to switch the demux with it.