projects/linux·commit aba7b41f

soundwire: cadence_master: wait and cancel cdns->work before clock stop

aba7b41f · Bard Liao <[email protected]> · 2026-09-01 11:10:19 +08:00

A peripheral event could happen during the clock stop process. We need
to wait for the event be handled before stopping the bus clock.
Otherwise, we will get the IO transfer timed out issue.

Fixes: af4cc917826f ("soundwire: cadence: mask Slave interrupt before stopping clock")
Signed-off-by: Bard Liao <[email protected]>
Reviewed-by: David Lin <[email protected]>
Reviewed-by: Shuming Fan <[email protected]>
Reviewed-by: Pierre-Louis Bossart <[email protected]>
Link: https://patch.msgid.link/[email protected]
Signed-off-by: Vinod Koul <[email protected]>
Commit
aba7b41faeecb7692458095ce6fafc341fe0b80e
Parents
6d49beec

Changes

1 files changed · +7 −0

FileStatusAddDelContent
drivers/soundwire/cadence_master.cmodified+7−0View file

drivers/soundwire/cadence_master.c

View file
diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence_master.c
index e690237..a0a63b7 100644
--- a/drivers/soundwire/cadence_master.c
+++ b/drivers/soundwire/cadence_master.c
@@ -1702,6 +1702,13 @@ int sdw_cdns_clock_stop(struct sdw_cdns *cdns, bool block_wake)
}
/*
+ * wait for any in-flight peripheral event handling to complete before stopping the clock.
+ * No need to disable peripheral interrupts before canceling the work, as the peripheral
+ * interrupts are already masked before the work is scheduled.
+ */
+ cancel_work_sync(&cdns->work);
+
+ /*
* Before entering clock stop we mask the Slave
* interrupts. This helps avoid having to deal with e.g. a
* Slave becoming UNATTACHED while the clock is being stopped