Skip to content

Commit

Permalink
ASoC: amd: ps: fix for acp pme wake for soundwire configuration
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Vijendar Mukunda authored and Mark Brown committed Feb 19, 2024
1 parent 3c697ce commit c76f3b1
Showing 1 changed file with 34 additions and 1 deletion.
35 changes: 34 additions & 1 deletion sound/soc/amd/ps/pci-ps.c
Original file line number Diff line number Diff line change
Expand Up @@ -554,6 +554,19 @@ static bool check_acp_sdw_enable_status(struct acp63_dev_data *adata)
return (sdw0_en || sdw1_en);
}

static void handle_acp63_sdw_pme_event(struct acp63_dev_data *adata)
{
u32 val;

val = readl(adata->acp63_base + ACP_SW0_WAKE_EN);
if (val && adata->sdw->pdev[0])
pm_request_resume(&adata->sdw->pdev[0]->dev);

val = readl(adata->acp63_base + ACP_SW1_WAKE_EN);
if (val && adata->sdw->pdev[1])
pm_request_resume(&adata->sdw->pdev[1]->dev);
}

static int __maybe_unused snd_acp63_suspend(struct device *dev)
{
struct acp63_dev_data *adata;
Expand All @@ -572,6 +585,26 @@ static int __maybe_unused snd_acp63_suspend(struct device *dev)
return ret;
}

static int __maybe_unused snd_acp63_runtime_resume(struct device *dev)
{
struct acp63_dev_data *adata;
int ret;

adata = dev_get_drvdata(dev);
if (adata->sdw_en_stat)
return 0;

ret = acp63_init(adata->acp63_base, dev);
if (ret) {
dev_err(dev, "ACP init failed\n");
return ret;
}

if (!adata->sdw_en_stat)
handle_acp63_sdw_pme_event(adata);
return 0;
}

static int __maybe_unused snd_acp63_resume(struct device *dev)
{
struct acp63_dev_data *adata;
Expand All @@ -589,7 +622,7 @@ static int __maybe_unused snd_acp63_resume(struct device *dev)
}

static const struct dev_pm_ops acp63_pm_ops = {
SET_RUNTIME_PM_OPS(snd_acp63_suspend, snd_acp63_resume, NULL)
SET_RUNTIME_PM_OPS(snd_acp63_suspend, snd_acp63_runtime_resume, NULL)
SET_SYSTEM_SLEEP_PM_OPS(snd_acp63_suspend, snd_acp63_resume)
};

Expand Down

0 comments on commit c76f3b1

Please sign in to comment.