[PATCH v5 00/25] soundwire: amd: SoundWire manager driver bug fixes
From: Vijendar Mukunda
Date: Sat Nov 07 2026 - 14:04:28 EST
This series collects bug fixes for the AMD SoundWire manager driver
(ACP6.3/7.0/7.1/7.2). The patches address correctness issues across
five areas. Patches 9, 14, 15, 17, 22, and 23 fix issues reported by
Lee Jones <lee@xxxxxxxxxx>.
Wake interrupt handling (patches 1-8): fixes reported on OEM platforms
running ACP6.3/7.0/7.1/7.2. Consolidate pad register macros into
amd_init.h, add correct SCHMEN/OE programming for ACP 7.0/7.1/7.2,
introduce D0/D3 PM pad helpers, track full pad teardown across
suspend/resume, fix missing wake interrupt and group wake-arming calls
in runtime suspend, fix the IRQ thread dropping STATUS_0TO7 on
simultaneous wake and state-change events, remove the spurious
STATUS_8TO11 clear in amd_sdw_process_wake_event(), and fix a missing
wake interrupt for ACP6.3 in POWER_OFF suspend.
Command response handling (patches 9-13): fix silent widening of
-ETIMEDOUT to u64 (reported by Lee Jones), return valid hardware
response when only the IMM status cleanup poll times out, clarify the
bad-state guard poll omission in the IMM_RES_VALID path, cache the
last successful PING result to avoid spurious disconnect warnings on
transient timeouts, and add lockdep_assert_held() to enforce the
msg_lock contract.
Work-queue and driver lifecycle (patches 14-18): fix drain ordering in
the remove path and defer dev_set_drvdata() until after INIT_WORK() to
close a concurrent-remove window (both reported by Lee Jones), guard
pm_runtime_disable() against unpaired calls, guard IRQ work scheduling
with the interrupt_enabled flag (reported by Lee Jones), and delay
*sdw_ctx publication until after sdw_amd_startup() succeeds.
Power management (patches 19-22): propagate amd_init_sdw_manager()
errors on POWER_OFF resume, drop amd_deinit_sdw_manager() in POWER_OFF
suspend, replace the open-coded >= ACP70 comparison with an explicit
switch/case, and fix interrupt-gate and work-drain ordering in PM ops
(reported by Lee Jones).
Drvdata and register safety (patches 23-25): add a NULL drvdata guard
in sdw_amd_startup() (reported by Lee Jones), and fix shared-register
read-modify-write races in amd_sdw_set_device_state() and
amd_sdw_host_wake_enable() by holding acp_sdw_lock.
Changes since v4:
- Add patches 1-8 (OEM-reported wake interrupt fixes for
ACP6.3/7.0/7.1/7.2): pad register macro consolidation, SCHMEN/OE
programming for ACP 7.0/7.1/7.2, D0/D3 PM helpers, pad teardown
tracking, missing wake interrupt in runtime suspend, STATUS_0TO7
race fix (promoted from patch 12/13 in v4), STATUS_8TO11 fix
reworked to a targeted removal of the clear in
amd_sdw_process_wake_event(), and ACP6.3 POWER_OFF wake fix.
- Add patch 11: clarify bad-state guard poll omission in
IMM_RES_VALID path.
- Add patch 15: defer dev_set_drvdata() until after INIT_WORK().
- Add patches 17-18: guard IRQ work with interrupt_enabled flag;
delay *sdw_ctx publication until after startup succeeds
(supersedes v4 patch 7 ctx-leak fix with a more robust approach).
- Add patches 23-25: NULL drvdata guard in sdw_amd_startup(), and
shared-register RMW races in amd_sdw_set_device_state() and
amd_sdw_host_wake_enable().
- Drop v4 patch 7 (fix ctx leak when sdw_amd_startup() fails):
superseded by patch 18.
-Link to v4:
https://lore.kernel.org/all/20261026044507.2310694-1-Vijendar.Mukunda@xxxxxxx/
Changes since v3:
- Add patch 12/13 to fix IRQ thread dropping STATUS_0TO7 when a
wake event and a device-state change arrive simultaneously.
- Add patch 13/13 to fix STATUS_8TO11 double-clear race in the
wake handler introduced by the simultaneous-wake fix.
- Add lockdep_assert_held() to amd_sdw_read_ping_status() (patch 4/13)
to enforce the msg_lock contract machine-checkably.
- Add return response on IMM status cleanup timeout (patch 2/13).
- Update patch 11/13 (fix interrupt gate and work drain ordering in PM
ops) to also fix amd_sdw_wake_enable() ordering in both CLK_STOP_MODE
paths: move the call to after amd_enable_sdw_interrupts() so the
unconditional interrupt mask write does not clobber the wake bit.
Changes since v2:
- Update comment for ping_slave_stat variable description in patch 3/13.
- Split the remove path work drain and pm ops guard patch into separate
patches (patches 5/13 and 6/13) to improve clarity and maintainability.
Changes since v1:
- Rework patch 1 to fix the u64 return type properly via out-parameter.
Vijendar Mukunda (25):
soundwire: amd: consolidate pad register macros into amd_init.h
soundwire: amd: program pad SCHMEN and OE control for ACP 7.0/7.1/7.2
soundwire: amd: add pad ctrl helpers for D0/D3 PM transitions
soundwire: amd: track full pad teardown across suspend/resume
soundwire: amd: fix missing wake interrupt and group wake-arming calls
in runtime suspend
soundwire: amd: fix IRQ thread dropping STATUS_0TO7 on simultaneous
wake
soundwire: amd: remove STATUS_8TO11 clear from
amd_sdw_process_wake_event()
soundwire: amd: fix missing wake interrupt for ACP6.3 in POWER_OFF
suspend
soundwire: amd: fix SDW command timeout return value handling
soundwire: amd: return response on IMM status cleanup timeout
soundwire: amd: clarify bad-state guard poll omission in IMM_RES_VALID
path
soundwire: amd: cache ping slave status to avoid spurious disconnect
on timeout
soundwire: amd: assert msg_lock is held in amd_sdw_read_ping_status()
soundwire: amd: fix work drain ordering in remove path
soundwire: amd: defer dev_set_drvdata() until after INIT_WORK()
soundwire: amd: pm_runtime guard in remove path
soundwire: amd: use interrupt_enabled flag to guard IRQ work
scheduling
soundwire: amd: delay *sdw_ctx publication until after startup
succeeds
soundwire: amd: propagate amd_init_sdw_manager() error on resume
soundwire: amd: drop amd_deinit_sdw_manager() in POWER_OFF suspend
soundwire: amd: replace >= ACP70 with explicit switch/case in PM paths
soundwire: amd: fix interrupt gate and work drain ordering in PM ops
soundwire: amd: check for NULL manager drvdata in sdw_amd_startup()
soundwire: amd: fix shared-register RMW race in
amd_sdw_set_device_state()
soundwire: amd: fix shared-register RMW race in
amd_sdw_host_wake_enable()
drivers/soundwire/amd_init.c | 69 ++++--
drivers/soundwire/amd_init.h | 18 ++
drivers/soundwire/amd_manager.c | 364 ++++++++++++++++++++++++------
drivers/soundwire/amd_manager.h | 10 -
include/linux/soundwire/sdw_amd.h | 15 ++
5 files changed, 369 insertions(+), 107 deletions(-)
--
2.53.0