> 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.