mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Mukunda,Vijendar" <vijendar.mukunda@amd.com>
To: broonie@kernel.org
Cc: alsa-devel@alsa-project.org, lgirdwood@gmail.com, perex@perex.cz,
	tiwai@suse.com, Basavaraj.Hiregoudar@amd.com,
	Sunil-kumar.Dommati@amd.com, venkataprasad.potturu@amd.com,
	Syed.SabaKareem@amd.com, linux-sound@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH] ASoC: amd: ps: fix for soundwire failures during hibernation exit sequence
Date: Sat, 21 Jun 2025 18:09:51 +0530	[thread overview]
Message-ID: <feed5d33-63a5-4657-b9d8-34bd7f969ed3@amd.com> (raw)
In-Reply-To: <20250621095002.1336167-1-Vijendar.Mukunda@amd.com>

On 21/06/25 15:17, Vijendar Mukunda wrote:
> During the hibernate entry sequence, ACP registers will be reset to
> default values and acp ip will be completely powered off including acp
> SoundWire pads. During resume sequence, if acp SoundWire pad keeper enable
> register is not restored along with pad pulldown control register value,
> then SoundWire manager links won't be powered on correctly results in
> peripheral register access failures and completely audio function is
> broken.
>
> Add code to store the acp SoundWire pad keeper enable register and acp pad
> pulldown ctrl register values before entering into suspend state and
> restore the register values during resume sequence based on condition check
> for acp SoundWire pad keeper enable register for ACP6.3, ACP7.0 & ACP7.1
> platforms.
>
> Fixes: 491628388005 ("ASoC: amd: ps: add callback functions for acp pci driver pm ops")
> Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
> ---
>  sound/soc/amd/ps/acp63.h     |  5 +++++
>  sound/soc/amd/ps/ps-common.c | 18 ++++++++++++++++++
>  2 files changed, 23 insertions(+)
>
> diff --git a/sound/soc/amd/ps/acp63.h b/sound/soc/amd/ps/acp63.h
> index 85feae45c44c..babf2fa7ea27 100644
> --- a/sound/soc/amd/ps/acp63.h
> +++ b/sound/soc/amd/ps/acp63.h
> @@ -82,6 +82,7 @@
>  #define ACP63_SDW0_DMA_MAX_STREAMS	6
>  #define ACP63_SDW1_DMA_MAX_STREAMS	2
>  #define ACP63_P1_AUDIO_TX_THRESHOLD	6
> +#define ACP_SW_PAD_KEEPER_EN		0x0001454
>  
>  /*
>   * Below entries describes SDW0 instance DMA stream id and DMA irq bit mapping
> @@ -334,6 +335,8 @@ struct acp_hw_ops {
>   * @addr: pci ioremap address
>   * @reg_range: ACP reigister range
>   * @acp_rev: ACP PCI revision id
> + * @acp_sw_pad_keeper_en: store acp SoundWire pad keeper enable register value
> + * @acp_pad_pulldown_ctrl: store acp pad pulldown control register value
>   * @acp63_sdw0-dma_intr_stat: DMA interrupt status array for ACP6.3 platform SoundWire
>   * manager-SW0 instance
>   * @acp63_sdw_dma_intr_stat: DMA interrupt status array for ACP6.3 platform SoundWire
> @@ -367,6 +370,8 @@ struct acp63_dev_data {
>  	u32 addr;
>  	u32 reg_range;
>  	u32 acp_rev;
> +	u32 acp_sw_pad_keeper_en;
> +	u32 acp_pad_pulldown_ctrl;
>  	u16 acp63_sdw0_dma_intr_stat[ACP63_SDW0_DMA_MAX_STREAMS];
>  	u16 acp63_sdw1_dma_intr_stat[ACP63_SDW1_DMA_MAX_STREAMS];
>  	u16 acp70_sdw0_dma_intr_stat[ACP70_SDW0_DMA_MAX_STREAMS];
> diff --git a/sound/soc/amd/ps/ps-common.c b/sound/soc/amd/ps/ps-common.c
> index 1c89fb5fe1da..f18d2a0d83aa 100644
> --- a/sound/soc/amd/ps/ps-common.c
> +++ b/sound/soc/amd/ps/ps-common.c
> @@ -160,6 +160,8 @@ static int __maybe_unused snd_acp63_suspend(struct device *dev)
>  
>  	adata = dev_get_drvdata(dev);
>  	if (adata->is_sdw_dev) {
> +		adata->acp_sw_pad_keeper_en = readl(adata->acp63_base + ACP_SW_PAD_KEEPER_EN);
> +		adata->acp_pad_pulldown_ctrl = readl(adata->acp63_base + ACP_PAD_PULLDOWN_CTRL);
>  		adata->sdw_en_stat = check_acp_sdw_enable_status(adata);
>  		if (adata->sdw_en_stat) {
>  			writel(1, adata->acp63_base + ACP_ZSC_DSP_CTRL);
> @@ -197,6 +199,7 @@ static int __maybe_unused snd_acp63_runtime_resume(struct device *dev)
>  static int __maybe_unused snd_acp63_resume(struct device *dev)
>  {
>  	struct acp63_dev_data *adata;
> +	u32 acp_sw_pad_keeper_en;
>  	int ret;
>  
>  	adata = dev_get_drvdata(dev);
> @@ -209,6 +212,12 @@ static int __maybe_unused snd_acp63_resume(struct device *dev)
>  	if (ret)
>  		dev_err(dev, "ACP init failed\n");
>  
> +	acp_sw_pad_keeper_en = readl(adata->acp63_base + ACP_SW_PAD_KEEPER_EN);
> +	dev_dbg(dev, "ACP_SW_PAD_KEEPER_EN:0x%x\n", acp_sw_pad_keeper_en);
> +	if (!acp_sw_pad_keeper_en) {
> +		writel(adata->acp_sw_pad_keeper_en, adata->acp63_base + ACP_SW_PAD_KEEPER_EN);
> +		writel(adata->acp_pad_pulldown_ctrl, adata->acp63_base + ACP_PAD_PULLDOWN_CTRL);
> +	}
>  	return ret;
>  }
>  
> @@ -408,6 +417,8 @@ static int __maybe_unused snd_acp70_suspend(struct device *dev)
>  
>  	adata = dev_get_drvdata(dev);
>  	if (adata->is_sdw_dev) {
> +		adata->acp_sw_pad_keeper_en = readl(adata->acp63_base + ACP_SW0_PAD_KEEPER_EN);
As register offsets, ACP_SW_PAD_KEEPER_EN & ACP_SW0_PAD_KEEPER_EN
are same, will use the same register macro and post the v2 version.


> +		adata->acp_pad_pulldown_ctrl = readl(adata->acp63_base + ACP_PAD_PULLDOWN_CTRL);
>  		adata->sdw_en_stat = check_acp_sdw_enable_status(adata);
>  		if (adata->sdw_en_stat) {
>  			writel(1, adata->acp63_base + ACP_ZSC_DSP_CTRL);
> @@ -445,6 +456,7 @@ static int __maybe_unused snd_acp70_runtime_resume(struct device *dev)
>  static int __maybe_unused snd_acp70_resume(struct device *dev)
>  {
>  	struct acp63_dev_data *adata;
> +	u32 acp_sw_pad_keeper_en;
>  	int ret;
>  
>  	adata = dev_get_drvdata(dev);
> @@ -459,6 +471,12 @@ static int __maybe_unused snd_acp70_resume(struct device *dev)
>  	if (ret)
>  		dev_err(dev, "ACP init failed\n");
>  
> +	acp_sw_pad_keeper_en = readl(adata->acp63_base + ACP_SW_PAD_KEEPER_EN);
> +	dev_dbg(dev, "ACP_SW_PAD_KEEPER_EN:0x%x\n", acp_sw_pad_keeper_en);
> +	if (!acp_sw_pad_keeper_en) {
> +		writel(adata->acp_sw_pad_keeper_en, adata->acp63_base + ACP_SW0_PAD_KEEPER_EN);
> +		writel(adata->acp_pad_pulldown_ctrl, adata->acp63_base + ACP_PAD_PULLDOWN_CTRL);
> +	}
>  	return ret;
>  }
>  


      reply	other threads:[~2025-06-21 12:40 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-06-21  9:47 Vijendar Mukunda
2025-06-21 12:39 ` Mukunda,Vijendar [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=feed5d33-63a5-4657-b9d8-34bd7f969ed3@amd.com \
    --to=vijendar.mukunda@amd.com \
    --cc=Basavaraj.Hiregoudar@amd.com \
    --cc=Sunil-kumar.Dommati@amd.com \
    --cc=Syed.SabaKareem@amd.com \
    --cc=alsa-devel@alsa-project.org \
    --cc=broonie@kernel.org \
    --cc=lgirdwood@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-sound@vger.kernel.org \
    --cc=perex@perex.cz \
    --cc=tiwai@suse.com \
    --cc=venkataprasad.potturu@amd.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®