Skip to content

Commit 829c3e1

Browse files
vijendarmukundavinodkoul
authored andcommitted
soundwire: amd: set device power state during suspend/resume sequence
Set SoundWire manager device power state during suspend and resume sequence for ACP7.0 & ACP7.1 platforms. Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com> Link: https://lore.kernel.org/r/20250207065841.4718-5-Vijendar.Mukunda@amd.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
1 parent 2c0ae8e commit 829c3e1

File tree

2 files changed

+58
-5
lines changed

2 files changed

+58
-5
lines changed

drivers/soundwire/amd_manager.c

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,29 @@ static void amd_sdw_wake_enable(struct amd_sdw_manager *amd_manager, bool enable
143143
writel(wake_ctrl, amd_manager->mmio + ACP_SW_STATE_CHANGE_STATUS_MASK_8TO11);
144144
}
145145

146+
static int amd_sdw_set_device_state(struct amd_sdw_manager *amd_manager, u32 target_device_state)
147+
{
148+
u32 sdw_dev_state;
149+
150+
sdw_dev_state = readl(amd_manager->acp_mmio + AMD_SDW_DEVICE_STATE);
151+
switch (amd_manager->instance) {
152+
case ACP_SDW0:
153+
u32p_replace_bits(&sdw_dev_state, target_device_state,
154+
AMD_SDW0_DEVICE_STATE_MASK);
155+
break;
156+
case ACP_SDW1:
157+
u32p_replace_bits(&sdw_dev_state, target_device_state,
158+
AMD_SDW1_DEVICE_STATE_MASK);
159+
break;
160+
default:
161+
return -EINVAL;
162+
}
163+
writel(sdw_dev_state, amd_manager->acp_mmio + AMD_SDW_DEVICE_STATE);
164+
sdw_dev_state = readl(amd_manager->acp_mmio + AMD_SDW_DEVICE_STATE);
165+
dev_dbg(amd_manager->dev, "AMD_SDW_DEVICE_STATE:0x%x\n", sdw_dev_state);
166+
return 0;
167+
}
168+
146169
static void amd_sdw_ctl_word_prep(u32 *lower_word, u32 *upper_word, struct sdw_msg *msg,
147170
int cmd_offset)
148171
{
@@ -1159,7 +1182,9 @@ static int __maybe_unused amd_suspend(struct device *dev)
11591182

11601183
if (amd_manager->power_mode_mask & AMD_SDW_CLK_STOP_MODE) {
11611184
amd_sdw_wake_enable(amd_manager, false);
1162-
return amd_sdw_clock_stop(amd_manager);
1185+
ret = amd_sdw_clock_stop(amd_manager);
1186+
if (ret)
1187+
return ret;
11631188
} else if (amd_manager->power_mode_mask & AMD_SDW_POWER_OFF_MODE) {
11641189
amd_sdw_wake_enable(amd_manager, false);
11651190
/*
@@ -1169,7 +1194,14 @@ static int __maybe_unused amd_suspend(struct device *dev)
11691194
ret = amd_sdw_clock_stop(amd_manager);
11701195
if (ret)
11711196
return ret;
1172-
return amd_deinit_sdw_manager(amd_manager);
1197+
ret = amd_deinit_sdw_manager(amd_manager);
1198+
if (ret)
1199+
return ret;
1200+
}
1201+
if (amd_manager->acp_rev >= ACP70_PCI_REV_ID) {
1202+
ret = amd_sdw_set_device_state(amd_manager, AMD_SDW_DEVICE_STATE_D3);
1203+
if (ret)
1204+
return ret;
11731205
}
11741206
return 0;
11751207
}
@@ -1187,13 +1219,22 @@ static int __maybe_unused amd_suspend_runtime(struct device *dev)
11871219
}
11881220
if (amd_manager->power_mode_mask & AMD_SDW_CLK_STOP_MODE) {
11891221
amd_sdw_wake_enable(amd_manager, true);
1190-
return amd_sdw_clock_stop(amd_manager);
1222+
ret = amd_sdw_clock_stop(amd_manager);
1223+
if (ret)
1224+
return ret;
11911225
} else if (amd_manager->power_mode_mask & AMD_SDW_POWER_OFF_MODE) {
11921226
amd_sdw_wake_enable(amd_manager, true);
11931227
ret = amd_sdw_clock_stop(amd_manager);
11941228
if (ret)
11951229
return ret;
1196-
return amd_deinit_sdw_manager(amd_manager);
1230+
ret = amd_deinit_sdw_manager(amd_manager);
1231+
if (ret)
1232+
return ret;
1233+
}
1234+
if (amd_manager->acp_rev >= ACP70_PCI_REV_ID) {
1235+
ret = amd_sdw_set_device_state(amd_manager, AMD_SDW_DEVICE_STATE_D3);
1236+
if (ret)
1237+
return ret;
11971238
}
11981239
return 0;
11991240
}
@@ -1212,7 +1253,9 @@ static int __maybe_unused amd_resume_runtime(struct device *dev)
12121253
}
12131254

12141255
if (amd_manager->power_mode_mask & AMD_SDW_CLK_STOP_MODE) {
1215-
return amd_sdw_clock_stop_exit(amd_manager);
1256+
ret = amd_sdw_clock_stop_exit(amd_manager);
1257+
if (ret)
1258+
return ret;
12161259
} else if (amd_manager->power_mode_mask & AMD_SDW_POWER_OFF_MODE) {
12171260
writel(0x00, amd_manager->acp_mmio + ACP_SW_WAKE_EN(amd_manager->instance));
12181261
val = readl(amd_manager->mmio + ACP_SW_CLK_RESUME_CTRL);
@@ -1235,6 +1278,11 @@ static int __maybe_unused amd_resume_runtime(struct device *dev)
12351278
return ret;
12361279
amd_sdw_set_frameshape(amd_manager);
12371280
}
1281+
if (amd_manager->acp_rev >= ACP70_PCI_REV_ID) {
1282+
ret = amd_sdw_set_device_state(amd_manager, AMD_SDW_DEVICE_STATE_D0);
1283+
if (ret)
1284+
return ret;
1285+
}
12381286
return 0;
12391287
}
12401288

drivers/soundwire/amd_manager.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,11 @@
194194
#define AMD_SDW_CLK_RESUME_DONE 3
195195
#define AMD_SDW_WAKE_STAT_MASK BIT(16)
196196
#define AMD_SDW_WAKE_INTR_MASK BIT(16)
197+
#define AMD_SDW_DEVICE_STATE 0x1430
198+
#define AMD_SDW0_DEVICE_STATE_MASK GENMASK(1, 0)
199+
#define AMD_SDW1_DEVICE_STATE_MASK GENMASK(3, 2)
200+
#define AMD_SDW_DEVICE_STATE_D0 0
201+
#define AMD_SDW_DEVICE_STATE_D3 3
197202

198203
static u32 amd_sdw_freq_tbl[AMD_SDW_MAX_FREQ_NUM] = {
199204
AMD_SDW_DEFAULT_CLK_FREQ,

0 commit comments

Comments
 (0)