Skip to content

Commit 53024d9

Browse files
ASoC: SOF: amd: add system and runtime PM ops for ACP7x
Add amd_sof_acp7x_suspend() and amd_sof_acp7x_resume() for ACP7.B/7.F platforms power management. Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
1 parent 41e9ced commit 53024d9

3 files changed

Lines changed: 80 additions & 0 deletions

File tree

sound/soc/sof/amd/acp.c

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1150,6 +1150,77 @@ void amd_sof_acp7x_remove(struct snd_sof_dev *sdev)
11501150
}
11511151
EXPORT_SYMBOL_NS(amd_sof_acp7x_remove, "SND_SOC_SOF_AMD_COMMON");
11521152

1153+
int amd_sof_acp7x_suspend(struct snd_sof_dev *sdev, u32 target_state)
1154+
{
1155+
struct acp_dev_data *acp_data;
1156+
int ret;
1157+
bool enable = false;
1158+
1159+
acp_data = sdev->pdata->hw_pdata;
1160+
1161+
ret = acp_reset(sdev);
1162+
if (ret) {
1163+
dev_err(sdev->dev, "ACP Reset failed\n");
1164+
return ret;
1165+
}
1166+
switch (acp_data->pci_rev) {
1167+
case ACP7B_PCI_ID:
1168+
case ACP7F_PCI_ID:
1169+
enable = true;
1170+
break;
1171+
default:
1172+
break;
1173+
}
1174+
snd_sof_dsp_write(sdev, ACP_DSP_BAR, ACP_CONTROL, enable);
1175+
snd_sof_dsp_write(sdev, ACP_DSP_BAR, ACP7X_ZSC_DSP_CTRL, 1);
1176+
1177+
return 0;
1178+
}
1179+
EXPORT_SYMBOL_NS(amd_sof_acp7x_suspend, "SND_SOC_SOF_AMD_COMMON");
1180+
1181+
int amd_sof_acp7x_resume(struct snd_sof_dev *sdev)
1182+
{
1183+
struct acp_dev_data *acp_data;
1184+
int ret;
1185+
1186+
acp_data = sdev->pdata->hw_pdata;
1187+
1188+
ret = acp_init(sdev);
1189+
if (ret) {
1190+
dev_err(sdev->dev, "ACP Init failed\n");
1191+
return ret;
1192+
}
1193+
ret = acp_memory_init(sdev);
1194+
if (ret) {
1195+
dev_err(sdev->dev, "ACP Memory init failed\n");
1196+
return ret;
1197+
}
1198+
1199+
switch (acp_data->pci_rev) {
1200+
case ACP7B_PCI_ID:
1201+
case ACP7F_PCI_ID:
1202+
snd_sof_dsp_write(sdev, ACP_DSP_BAR, ACP7X_PME_EN, 1);
1203+
break;
1204+
default:
1205+
break;
1206+
}
1207+
1208+
return 0;
1209+
}
1210+
EXPORT_SYMBOL_NS(amd_sof_acp7x_resume, "SND_SOC_SOF_AMD_COMMON");
1211+
1212+
int amd_sof_acp7x_suspend_runtime(struct snd_sof_dev *sdev)
1213+
{
1214+
return amd_sof_acp7x_suspend(sdev, 0);
1215+
}
1216+
EXPORT_SYMBOL_NS(amd_sof_acp7x_suspend_runtime, "SND_SOC_SOF_AMD_COMMON");
1217+
1218+
int amd_sof_acp7x_resume_runtime(struct snd_sof_dev *sdev)
1219+
{
1220+
return amd_sof_acp7x_resume(sdev);
1221+
}
1222+
EXPORT_SYMBOL_NS(amd_sof_acp7x_resume_runtime, "SND_SOC_SOF_AMD_COMMON");
1223+
11531224
MODULE_LICENSE("Dual BSD/GPL");
11541225
MODULE_DESCRIPTION("AMD ACP sof driver");
11551226
MODULE_IMPORT_NS("SOUNDWIRE_AMD_INIT");

sound/soc/sof/amd/acp.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,10 @@ int sof_acp7x_ops_init(struct snd_sof_dev *sdev);
357357

358358
int amd_sof_acp7x_probe(struct snd_sof_dev *sdev);
359359
void amd_sof_acp7x_remove(struct snd_sof_dev *sdev);
360+
int amd_sof_acp7x_suspend(struct snd_sof_dev *sdev, u32 target_state);
361+
int amd_sof_acp7x_resume(struct snd_sof_dev *sdev);
362+
int amd_sof_acp7x_suspend_runtime(struct snd_sof_dev *sdev);
363+
int amd_sof_acp7x_resume_runtime(struct snd_sof_dev *sdev);
360364

361365
struct snd_soc_acpi_mach *amd_sof_machine_select(struct snd_sof_dev *sdev);
362366
/* Machine configuration */

sound/soc/sof/amd/acp7x.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,5 +176,10 @@ int sof_acp7x_ops_init(struct snd_sof_dev *sdev)
176176
if (acp_sof_post_fw_run_delay)
177177
sof_acp7x_ops.post_fw_run = sof_acp7x_post_fw_run_delay;
178178

179+
sof_acp7x_ops.suspend = amd_sof_acp7x_suspend;
180+
sof_acp7x_ops.resume = amd_sof_acp7x_resume;
181+
sof_acp7x_ops.runtime_suspend = amd_sof_acp7x_suspend_runtime;
182+
sof_acp7x_ops.runtime_resume = amd_sof_acp7x_resume_runtime;
183+
179184
return 0;
180185
}

0 commit comments

Comments
 (0)