[SRU][R][PATCH v4 0/6] Fix SDCA jack detection race and reprobe issues on Dell Slate Max platform with CirrusLogic audio solution
Chris Chiu
chris.chiu at canonical.com
Mon Sep 7 06:47:37 UTC 2026
BugLink: https://bugs.launchpad.net/bugs/2163215
[Impact]
On Dell Slate Max systems with SoundWire Device Class Audio (SDCA) hardware, there is a race condition when setting up jack detection.
Plug headset first, sound can output and headset Mic is workable.
But after cold boot/reboot, audio device is keep but no sound output from headset, headset Mic also no function. Hot plug headset can recovery.
[Fix]
Reorganize SDCA IRQ registration and lifecycle management to run at the correct time and avoid races.
The fixes do this by adding a new component-level callback that runs after all ALSA controls are created. This ensures the jack detection IRQs are registered only when the controls are ready.
Upstream commits (first appeared in v7.2-rc6):
- 3e81e2fb2163 ASoC: Add a component fixup_controls callback
- b8f71f16134f ASoC: SDCA: Switch to fixup_controls callback for IRQ registration
- bf1b7821f853 ASoC: SDCA: Move kcontrol search out of IRQ
- 050406cbd676 ASoC: SDCA: Populate IRQ data earlier
- 0880082c27b6 ASoC: SDCA: Remove devm from primary IRQ cleanup
- f18e97fa7f12 ASoC: SDCA: Add sdca_irq_cleanup_late()
- 4ecef577d1ce ASoC: SDCA: Rename sdca_irq_allocate() to include devm
[Test Plan]
Boot the system, plug headphones in and out, and check if audio switches correctly.
1. Boot the system with headphones unplugged.
2. Plug headphones in and check the jack state:
$ evtest
(or check alsamixer/sound settings)
3. Unplug headphones and verify sound switches back.
4. Reload the SoundWire driver modules or trigger suspend/resume to force card teardown and reprobe:
$ sudo rtcwake -m mem -s 15
Or reload the SoundWire modules:
$ sudo modprobe -r snd_sof_intel_sdw
$ sudo modprobe snd_sof_intel_sdw
Without these patches:
- On boot, headphones might show up as connected when they are not, or sound might not switch correctly when plugged in.
- After suspend/resume or reloading modules, jack detection stops working, or the system crashes/shows warnings due to stale pointers.
With these patches:
- Headphones and speaker paths are always set correctly on boot.
- Jack detection and audio routing work correctly after suspend/resume and driver reloads.
[Where problems could occur]
Could break SDCA jack detection and SoundWire audio class drivers.
If the new fixup_controls callback has a bug, jack IRQs will not be registered. Jack detection could stop working completely.
If the cached kcontrol search gets a wrong pointer, the kernel will crash with a NULL pointer dereference when the IRQ handler runs.
[Other Info]
All seven patches are upstream in v7.2-rc6.
v2 change:
- Added missing fix commit 36c543cc5100 ("ASoC: SDCA: Fix bad move of
jack_state initialisation") which fixes cb3c257e0824 ("ASoC: SDCA:
Add correct masks whilst reporting SDCA jack status"). Without this
commit, the jack_state initialisation was accidentally moved after
its use, causing incorrect jack detection behavior.
v3 change:
- Remove the non-essential patches which only do refactoring
v4 change:
- Remove duplocated reporting logic: introduced type_get_mask and
replaced duplicated switch in sdca_jack_report()
Charles Keepax (6):
ASoC: SDCA: Rename sdca_irq_allocate() to include devm
ASoC: SDCA: Add sdca_irq_cleanup_late()
ASoC: SDCA: Remove devm from primary IRQ cleanup
ASoC: SDCA: Populate IRQ data earlier
ASoC: Add a component fixup_controls callback
ASoC: SDCA: Switch to fixup_controls callback for IRQ registration
include/sound/sdca_fdl.h | 2 +
include/sound/sdca_interrupts.h | 14 ++-
include/sound/sdca_jack.h | 2 +
include/sound/soc-component.h | 2 +
sound/soc/sdca/sdca_class.c | 4 +-
sound/soc/sdca/sdca_class_function.c | 6 +-
sound/soc/sdca/sdca_fdl.c | 13 ++-
sound/soc/sdca/sdca_interrupts.c | 168 +++++++++++++++------------
sound/soc/sdca/sdca_jack.c | 137 +++++++++++++---------
sound/soc/soc-component.c | 10 ++
sound/soc/soc-core.c | 5 +
11 files changed, 223 insertions(+), 140 deletions(-)
--
2.43.0
More information about the kernel-team
mailing list