Skip to content

Commit 63dc588

Browse files
vijendarmukundavinodkoul
authored andcommitted
soundwire: amd: fix for wake interrupt handling for clockstop mode
When SoundWire Wake interrupt is enabled along with SoundWire Wake enable register, SoundWire wake interrupt will be reported when SoundWire manager is in D3 state and ACP is in D3 state. When SoundWire Wake interrupt is reported, it will invoke runtime resume of the SoundWire manager device. In case of system level suspend, for ClockStop Mode SoundWire Wake interrupt should be disabled. It should be enabled only for runtime suspend scenario. Change wake interrupt enable/disable sequence for ClockStop Mode in system level suspend and runtime suspend sceanrio. Fixes: 9cf1efc ("soundwire: amd: add pm_prepare callback and pm ops support") Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com> Link: https://lore.kernel.org/r/20240327063143.2266464-2-Vijendar.Mukunda@amd.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
1 parent 4cece76 commit 63dc588

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

drivers/soundwire/amd_manager.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,19 @@ static void amd_sdw_set_frameshape(struct amd_sdw_manager *amd_manager)
130130
writel(frame_size, amd_manager->mmio + ACP_SW_FRAMESIZE);
131131
}
132132

133+
static void amd_sdw_wake_enable(struct amd_sdw_manager *amd_manager, bool enable)
134+
{
135+
u32 wake_ctrl;
136+
137+
wake_ctrl = readl(amd_manager->mmio + ACP_SW_STATE_CHANGE_STATUS_MASK_8TO11);
138+
if (enable)
139+
wake_ctrl |= AMD_SDW_WAKE_INTR_MASK;
140+
else
141+
wake_ctrl &= ~AMD_SDW_WAKE_INTR_MASK;
142+
143+
writel(wake_ctrl, amd_manager->mmio + ACP_SW_STATE_CHANGE_STATUS_MASK_8TO11);
144+
}
145+
133146
static void amd_sdw_ctl_word_prep(u32 *lower_word, u32 *upper_word, struct sdw_msg *msg,
134147
int cmd_offset)
135148
{
@@ -1095,6 +1108,7 @@ static int __maybe_unused amd_suspend(struct device *dev)
10951108
}
10961109

10971110
if (amd_manager->power_mode_mask & AMD_SDW_CLK_STOP_MODE) {
1111+
amd_sdw_wake_enable(amd_manager, false);
10981112
return amd_sdw_clock_stop(amd_manager);
10991113
} else if (amd_manager->power_mode_mask & AMD_SDW_POWER_OFF_MODE) {
11001114
/*
@@ -1121,6 +1135,7 @@ static int __maybe_unused amd_suspend_runtime(struct device *dev)
11211135
return 0;
11221136
}
11231137
if (amd_manager->power_mode_mask & AMD_SDW_CLK_STOP_MODE) {
1138+
amd_sdw_wake_enable(amd_manager, true);
11241139
return amd_sdw_clock_stop(amd_manager);
11251140
} else if (amd_manager->power_mode_mask & AMD_SDW_POWER_OFF_MODE) {
11261141
ret = amd_sdw_clock_stop(amd_manager);

drivers/soundwire/amd_manager.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@
152152
#define AMD_SDW0_EXT_INTR_MASK 0x200000
153153
#define AMD_SDW1_EXT_INTR_MASK 4
154154
#define AMD_SDW_IRQ_MASK_0TO7 0x77777777
155-
#define AMD_SDW_IRQ_MASK_8TO11 0x000d7777
155+
#define AMD_SDW_IRQ_MASK_8TO11 0x000c7777
156156
#define AMD_SDW_IRQ_ERROR_MASK 0xff
157157
#define AMD_SDW_MAX_FREQ_NUM 1
158158
#define AMD_SDW0_MAX_TX_PORTS 3
@@ -190,6 +190,7 @@
190190
#define AMD_SDW_CLK_RESUME_REQ 2
191191
#define AMD_SDW_CLK_RESUME_DONE 3
192192
#define AMD_SDW_WAKE_STAT_MASK BIT(16)
193+
#define AMD_SDW_WAKE_INTR_MASK BIT(16)
193194

194195
static u32 amd_sdw_freq_tbl[AMD_SDW_MAX_FREQ_NUM] = {
195196
AMD_SDW_DEFAULT_CLK_FREQ,

0 commit comments

Comments
 (0)