[PATCH 11/11] soundwire: amd: add interrupt_enabled synchronization for ACP7B/7E/7F

From: Vijendar Mukunda

Date: Sat Nov 07 2026 - 17:12:08 EST


Mirror the interrupt_enabled guard already used by the ACP6.3/7.0/7.1/7.2
manager to prevent new work from being queued during teardown.

- amd_acp7x_enable_sdw_interrupts(): set interrupt_enabled after all
hardware interrupt mask registers are written.
- amd_acp7x_disable_sdw_interrupts(): clear interrupt_enabled before
writing the hardware mask registers so any in-flight IRQ that arrives
during the mask writes sees the flag as false and skips scheduling.
- amd_acp7x_sdw_irq_thread(): guard schedule_work() with the
interrupt_enabled flag to avoid queueing new work once the driver
has begun teardown.

Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@xxxxxxx>
---
drivers/soundwire/amd_acp7x_manager.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/drivers/soundwire/amd_acp7x_manager.c b/drivers/soundwire/amd_acp7x_manager.c
index 9605577a8d35..d48254a279fe 100644
--- a/drivers/soundwire/amd_acp7x_manager.c
+++ b/drivers/soundwire/amd_acp7x_manager.c
@@ -362,12 +362,20 @@ static void amd_acp7x_enable_sdw_interrupts(struct amd_sdw_manager *amd_manager)
writel(AMD_SDW_IRQ_MASK_0TO7, amd_manager->mmio + ACP7X_SW_STATE_CHANGE_STATUS_MASK_0TO7);
writel(AMD_SDW_IRQ_MASK_8TO11, amd_manager->mmio + ACP7X_SW_STATE_CHANGE_STATUS_MASK_8TO11);
writel(AMD_SDW_IRQ_ERROR_MASK, amd_manager->mmio + ACP7X_SW_ERROR_INTR_MASK);
+ amd_manager->interrupt_enabled = true;
}

static void amd_acp7x_disable_sdw_interrupts(struct amd_sdw_manager *amd_manager)
{
u32 val, acp_ext_intr_cntl, sdw_intr_cntl;

+ /*
+ * Clear the flag before updating hardware masks so that any IRQ
+ * that fires during the mask-register writes sees the flag as false
+ * and does not queue new work.
+ */
+ amd_manager->interrupt_enabled = false;
+
mutex_lock(amd_manager->acp_sdw_lock);
val = acp7x_sdw_manager_reg_mask_array[amd_manager->instance];
acp_ext_intr_cntl = readl(amd_manager->acp_mmio + ACP7X_EXTERNAL_INTR_CNTL);
@@ -582,8 +590,9 @@ void amd_acp7x_sdw_irq_thread(struct amd_sdw_manager *amd_manager)
amd_acp7x_sdw_read_and_process_ping_status(amd_manager);
else if (status_change_0to7 || (status_change_8to11 & AMD_SDW_8TO11_DEV_STATUS))
amd_sdw_update_slave_status(status_change_0to7, status_change_8to11, amd_manager);
- if ((status_change_8to11 & AMD_SDW_PREQ_INTR_STAT) ||
- (status_change_8to11 & AMD_SDW_8TO11_DEV_STATUS) || status_change_0to7)
+ if (((status_change_8to11 & AMD_SDW_PREQ_INTR_STAT) ||
+ (status_change_8to11 & AMD_SDW_8TO11_DEV_STATUS) || status_change_0to7) &&
+ amd_manager->interrupt_enabled)
schedule_work(&amd_manager->amd_sdw_work);
}

--
2.53.0