[SRU][Q][PATCH 0/5] Fix the error during suspend on cs42l43

Aaron Ma aaron.ma at canonical.com
Fri Jan 16 05:58:11 UTC 2026


BugLink: https://bugs.launchpad.net/bugs/2138423

[Impact]
The system fails to read IRQ status after suspend/resume on Lenovo systems, resulting in error -16 (EBUSY) in kernel logs:

cs42l43 sdw:0:0:01fa:4243:01: Failed to read IRQ status: -16

This error occurs during system suspend/resume cycles when IRQ handlers attempt to access volatile registers on suspended hardware. The race condition happens because the MFD driver disables IRQs upon entering suspend, but IRQ handlers can run, claim a PM runtime reference, get scheduled, and then try to access registers after the device has been force suspended.

Affected hardware: Lenovo systems with Cirrus Logic cs42l43 audio codec
Failure rate: Occurs on every suspend/resume cycle

[Fix]
This series of 6 patches fixes the IRQ handling race condition during system suspend/resume by properly coordinating IRQ masking between the MFD driver and child drivers.

The patches are upstream in mainline kernel v6.18:

1. mfd: cs42l43: Move IRQ enable/disable to encompass force suspend (62aec8a0a5b6)
   - Moves IRQ disabling to cover the whole forced suspend state to avoid race conditions

2. mfd: cs42l43: Remove IRQ masking in suspend (afe0f94992db)
   - Removes IRQ masking from MFD code since individual child drivers now mask their own IRQs

3. ASoC: cs42l43: Rename system suspend callback and fix debug print (638ca7601f41)
   - Clarifies that the function is a system suspend callback, not runtime suspend

4. ASoC: cs42l43: Store IRQ domain in codec private data (149dda5f42a8)
   - Prepares for refactoring by storing IRQ domain pointer in private data

5. ASoC: cs42l43: Disable IRQs in system suspend (a69b4ba19a07)
   - Masks IRQs and syncs work queues in the codec driver during system suspend

6. ASoC: cs42l43: Shutdown jack detection on suspend (dd7ae5b8b3c2)
   - Fully powers down jack detection during system suspend

Already in questing :
   - mfd: cs42l43: Move IRQ enable/disable to encompass force suspend (commit 62aec8a0a5b6)

Patches:
https://lore.kernel.org/lkml/20250903094549.271068-1-ckeepax@opensource.cirrus.com/

[Test Plan]
Suspend and resume the system 30 times using the command:

$ sudo rtcwake -m mem -s 20

Without the patches:
- The error "cs42l43 sdw:0:0:01fa:4243:01: Failed to read IRQ status: -16" appears in dmesg after each resume
- Check with: $ dmesg | grep "cs42l43.*IRQ.*-16"

With the patches:
- No IRQ status read errors in dmesg
- Verify with: $ dmesg | grep "cs42l43.*IRQ.*-16" (should return no results)

[Where problems could occur]
It may break the Cirrus Logic cs42l43 audio codec driver.

The patches are merged upstream in kernel v6.18.
The hardware is not supported by noble 6.8 kernel.
So SRU for questing and oem-6.17.

Charles Keepax (5):
  mfd: cs42l43: Remove IRQ masking in suspend
  ASoC: cs42l43: Rename system suspend callback and fix debug print
  ASoC: cs42l43: Store IRQ domain in codec private data
  ASoC: cs42l43: Disable IRQs in system suspend
  ASoC: cs42l43: Shutdown jack detection on suspend

 drivers/mfd/cs42l43.c           |  26 --------
 sound/soc/codecs/cs42l43-jack.c |   8 ++-
 sound/soc/codecs/cs42l43.c      | 109 +++++++++++++++++++++++---------
 sound/soc/codecs/cs42l43.h      |   3 +
 4 files changed, 86 insertions(+), 60 deletions(-)

-- 
2.43.0




More information about the kernel-team mailing list