Re: [PATCH v2 09/21] ASoC: apple: Add macaudio machine driver
From: Ajay Kumar Nandam
Date: Wed Oct 07 2026 - 14:05:01 EST
On 10/4/2026 11:33 AM, James Calligeros wrote:
From: Martin Povišer <povik+lin@xxxxxxxxxxx>
Apple Silicon Macs have a complex audio subsystem consisting
of an I2S peripheral (MCA) and multiple codecs of various
models and capabilities. Some machines have a basic mono
speaker with hardware downmix, while others have a very
intricate stereo system consisting of multiple codecs and
drivers per L/R channel. Some machines report voice coil
voltage and current information back to the SoC, and others
do not. All machines have a headset jack.
Add an ASoC machine driver for this platform.
To express all of this sanely, we initialise the correct
combinations of codecs/I2S ports as DAI backends and link
them to a synthetic frontend. Each frontend is linked to
a PCM, one for the headset codec and one for the speaker
system on the target machine.
Signed-off-by: Martin Povišer <povik+lin@xxxxxxxxxxx>
Co-developed-by: Hector Martin <marcan@xxxxxxxxx>
Signed-off-by: Hector Martin <marcan@xxxxxxxxx>
Co-developed-by: Janne Grunau <j@xxxxxxxxxx>
Signed-off-by: Janne Grunau <j@xxxxxxxxxx>
Co-developed-by: Sasha Finkelstein <fnkl.kernel@xxxxxxxxx>
Signed-off-by: Sasha Finkelstein <fnkl.kernel@xxxxxxxxx>
Co-developed-by: James Calligeros <jcalligeros99@xxxxxxxxx>
Signed-off-by: James Calligeros <jcalligeros99@xxxxxxxxx>
---
sound/soc/apple/Kconfig | 18 +
sound/soc/apple/Makefile | 4 +
sound/soc/apple/macaudio.c | 1699 +++++++++++++++++++++++++
3 files changed, 1721 insertions(+)
+
+static int macaudio_be_trigger(struct snd_pcm_substream *substream, int cmd)
+{
+ struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
+ struct macaudio_snd_data *ma = snd_soc_card_get_drvdata(rtd->card);
+ struct macaudio_link_props *props = &ma->link_props[rtd->dai_link->id];
+
+ guard(mutex)(&ma->be_link_mutex);
+
This is in the DAI link `.trigger` callback, but I don't see the
macaudio links being marked `.nonatomic = 1`.
The default PCM trigger path can run with the stream lock held and IRQs
disabled, so taking a normal mutex here can sleep in atomic context. If
this state really needs a sleeping lock, should the affected links be
marked nonatomic, or should the trigger path avoid the mutex?
+ if (props->is_speakers && substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+ switch (cmd) {
+ case SNDRV_PCM_TRIGGER_START:
+ case SNDRV_PCM_TRIGGER_RESUME:
+ case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+ ma->bes_active |= BIT(rtd->dai_link->id);
+ break;
+ case SNDRV_PCM_TRIGGER_SUSPEND:
+ case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
+ case SNDRV_PCM_TRIGGER_STOP:
+ ma->bes_active &= ~BIT(rtd->dai_link->id);
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ schedule_work(&ma->lock_update_work);
+ }
+
+ return 0;
+}
+