Skip to content

Commit 057f1ef

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 13ac7ce commit 057f1ef

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
@@ -1149,6 +1149,77 @@ void amd_sof_acp7x_remove(struct snd_sof_dev *sdev)
11491149
}
11501150
EXPORT_SYMBOL_NS(amd_sof_acp7x_remove, "SND_SOC_SOF_AMD_COMMON");
11511151

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

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

0 commit comments

Comments
 (0)