Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ASoC: amd: ps: fix for acp pme wake for soundwire configuration

Consider the below scenario, When ACP and SoundWire managers are in
D3 state and SoundWire manager power off mode is selected and acp and
SoundWire manager instances are in runtime suspended state.

In this case, for the ACP PME wake event, the ACP PCI driver should resume
SoundWire manager devices based on wake enable status set.

Add code for handling ACP PME wake event for runtime suspend scenario
when SoundWire power off mode is selected.

Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
Link: https://msgid.link/r/20240214104014.1144668-4-Vijendar.Mukunda@amd.com
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Vijendar Mukunda and committed by
Mark Brown
c76f3b1f 3c697ced

+34 -1
+34 -1
sound/soc/amd/ps/pci-ps.c
··· 554 554 return (sdw0_en || sdw1_en); 555 555 } 556 556 557 + static void handle_acp63_sdw_pme_event(struct acp63_dev_data *adata) 558 + { 559 + u32 val; 560 + 561 + val = readl(adata->acp63_base + ACP_SW0_WAKE_EN); 562 + if (val && adata->sdw->pdev[0]) 563 + pm_request_resume(&adata->sdw->pdev[0]->dev); 564 + 565 + val = readl(adata->acp63_base + ACP_SW1_WAKE_EN); 566 + if (val && adata->sdw->pdev[1]) 567 + pm_request_resume(&adata->sdw->pdev[1]->dev); 568 + } 569 + 557 570 static int __maybe_unused snd_acp63_suspend(struct device *dev) 558 571 { 559 572 struct acp63_dev_data *adata; ··· 583 570 dev_err(dev, "ACP de-init failed\n"); 584 571 585 572 return ret; 573 + } 574 + 575 + static int __maybe_unused snd_acp63_runtime_resume(struct device *dev) 576 + { 577 + struct acp63_dev_data *adata; 578 + int ret; 579 + 580 + adata = dev_get_drvdata(dev); 581 + if (adata->sdw_en_stat) 582 + return 0; 583 + 584 + ret = acp63_init(adata->acp63_base, dev); 585 + if (ret) { 586 + dev_err(dev, "ACP init failed\n"); 587 + return ret; 588 + } 589 + 590 + if (!adata->sdw_en_stat) 591 + handle_acp63_sdw_pme_event(adata); 592 + return 0; 586 593 } 587 594 588 595 static int __maybe_unused snd_acp63_resume(struct device *dev) ··· 622 589 } 623 590 624 591 static const struct dev_pm_ops acp63_pm_ops = { 625 - SET_RUNTIME_PM_OPS(snd_acp63_suspend, snd_acp63_resume, NULL) 592 + SET_RUNTIME_PM_OPS(snd_acp63_suspend, snd_acp63_runtime_resume, NULL) 626 593 SET_SYSTEM_SLEEP_PM_OPS(snd_acp63_suspend, snd_acp63_resume) 627 594 }; 628 595