Skip to content

Commit 3c697ce

Browse files
vijendarmukundabroonie
authored andcommitted
ASoC: amd: ps: remove acp_reset flag
The earlier acp_reset flag is set to true in two instances as mentioned below. 1. When active SoundWire manager instances power mode is set to Power off mode when SoundWire configuration is selected. 2. For other acp configurations As code being refactored and common function being used for scanning SoundWire controller, acp_reset flag update logic is dropped. Instead of it, check the SoundWire manager instance enable state, based on it update sdw_en_stat flag which will be used to apply ACP init/de-init sequence during suspend/resume callbacks based on flag set value when SoundWire configuration is selected. For other acp configurations, acp init/de-init will be called by default. Refactor existing pm ops logic for SoundWire configuration and use sdw_en_stat flag for invoking acp init/de-init sequence. Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com> Link: https://msgid.link/r/20240214104014.1144668-3-Vijendar.Mukunda@amd.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent eaf8250 commit 3c697ce

2 files changed

Lines changed: 28 additions & 21 deletions

File tree

sound/soc/amd/ps/acp63.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -226,12 +226,11 @@ struct sdw_dma_ring_buf_reg {
226226
* @is_pdm_dev: flag set to true when ACP PDM controller exists
227227
* @is_pdm_config: flat set to true when PDM configuration is selected from BIOS
228228
* @is_sdw_config: flag set to true when SDW configuration is selected from BIOS
229+
* @sdw_en_stat: flag set to true when any one of the SoundWire manager instance is enabled
229230
* @addr: pci ioremap address
230231
* @reg_range: ACP reigister range
231232
* @sdw0-dma_intr_stat: DMA interrupt status array for SoundWire manager-SW0 instance
232233
* @sdw_dma_intr_stat: DMA interrupt status array for SoundWire manager-SW1 instance
233-
* @acp_reset: flag set to true when bus reset is applied across all
234-
* the active SoundWire manager instances
235234
*/
236235

237236
struct acp63_dev_data {
@@ -248,11 +247,11 @@ struct acp63_dev_data {
248247
bool is_pdm_dev;
249248
bool is_pdm_config;
250249
bool is_sdw_config;
250+
bool sdw_en_stat;
251251
u32 addr;
252252
u32 reg_range;
253253
u16 sdw0_dma_intr_stat[ACP63_SDW0_DMA_MAX_STREAMS];
254254
u16 sdw1_dma_intr_stat[ACP63_SDW1_DMA_MAX_STREAMS];
255-
bool acp_reset;
256255
};
257256

258257
int snd_amd_acp_find_config(struct pci_dev *pci);

sound/soc/amd/ps/pci-ps.c

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -503,13 +503,6 @@ static int snd_acp63_probe(struct pci_dev *pci,
503503
}
504504
adata->addr = addr;
505505
adata->reg_range = ACP63_REG_END - ACP63_REG_START;
506-
/*
507-
* By default acp_reset flag is set to true. i.e acp_deinit() and acp_init()
508-
* will be invoked for all ACP configurations during suspend/resume callbacks.
509-
* This flag should be set to false only when SoundWire manager power mode
510-
* set to ClockStopMode.
511-
*/
512-
adata->acp_reset = true;
513506
pci_set_master(pci);
514507
pci_set_drvdata(pci, adata);
515508
mutex_init(&adata->acp_lock);
@@ -552,31 +545,46 @@ static int snd_acp63_probe(struct pci_dev *pci,
552545
return ret;
553546
}
554547

548+
static bool check_acp_sdw_enable_status(struct acp63_dev_data *adata)
549+
{
550+
u32 sdw0_en, sdw1_en;
551+
552+
sdw0_en = readl(adata->acp63_base + ACP_SW0_EN);
553+
sdw1_en = readl(adata->acp63_base + ACP_SW1_EN);
554+
return (sdw0_en || sdw1_en);
555+
}
556+
555557
static int __maybe_unused snd_acp63_suspend(struct device *dev)
556558
{
557559
struct acp63_dev_data *adata;
558-
int ret = 0;
560+
int ret;
559561

560562
adata = dev_get_drvdata(dev);
561-
if (adata->acp_reset) {
562-
ret = acp63_deinit(adata->acp63_base, dev);
563-
if (ret)
564-
dev_err(dev, "ACP de-init failed\n");
563+
if (adata->is_sdw_dev) {
564+
adata->sdw_en_stat = check_acp_sdw_enable_status(adata);
565+
if (adata->sdw_en_stat)
566+
return 0;
565567
}
568+
ret = acp63_deinit(adata->acp63_base, dev);
569+
if (ret)
570+
dev_err(dev, "ACP de-init failed\n");
571+
566572
return ret;
567573
}
568574

569575
static int __maybe_unused snd_acp63_resume(struct device *dev)
570576
{
571577
struct acp63_dev_data *adata;
572-
int ret = 0;
578+
int ret;
573579

574580
adata = dev_get_drvdata(dev);
575-
if (adata->acp_reset) {
576-
ret = acp63_init(adata->acp63_base, dev);
577-
if (ret)
578-
dev_err(dev, "ACP init failed\n");
579-
}
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+
580588
return ret;
581589
}
582590

0 commit comments

Comments
 (0)