Skip to content

Commit 1aa2f3a

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 6ce387e commit 1aa2f3a

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
@@ -1154,6 +1154,77 @@ void amd_sof_acp7x_remove(struct snd_sof_dev *sdev)
11541154
}
11551155
EXPORT_SYMBOL_NS(amd_sof_acp7x_remove, "SND_SOC_SOF_AMD_COMMON");
11561156

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

359359
int amd_sof_acp7x_probe(struct snd_sof_dev *sdev);
360360
void amd_sof_acp7x_remove(struct snd_sof_dev *sdev);
361+
int amd_sof_acp7x_suspend(struct snd_sof_dev *sdev, u32 target_state);
362+
int amd_sof_acp7x_resume(struct snd_sof_dev *sdev);
363+
int amd_sof_acp7x_suspend_runtime(struct snd_sof_dev *sdev);
364+
int amd_sof_acp7x_resume_runtime(struct snd_sof_dev *sdev);
361365

362366
struct snd_soc_acpi_mach *amd_sof_machine_select(struct snd_sof_dev *sdev);
363367
/* 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)