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: 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>

authored by

Vijendar Mukunda and committed by
Mark Brown
3c697ced eaf82503

+28 -21
+2 -3
sound/soc/amd/ps/acp63.h
··· 226 226 * @is_pdm_dev: flag set to true when ACP PDM controller exists 227 227 * @is_pdm_config: flat set to true when PDM configuration is selected from BIOS 228 228 * @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 229 230 * @addr: pci ioremap address 230 231 * @reg_range: ACP reigister range 231 232 * @sdw0-dma_intr_stat: DMA interrupt status array for SoundWire manager-SW0 instance 232 233 * @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 235 234 */ 236 235 237 236 struct acp63_dev_data { ··· 247 248 bool is_pdm_dev; 248 249 bool is_pdm_config; 249 250 bool is_sdw_config; 251 + bool sdw_en_stat; 250 252 u32 addr; 251 253 u32 reg_range; 252 254 u16 sdw0_dma_intr_stat[ACP63_SDW0_DMA_MAX_STREAMS]; 253 255 u16 sdw1_dma_intr_stat[ACP63_SDW1_DMA_MAX_STREAMS]; 254 - bool acp_reset; 255 256 }; 256 257 257 258 int snd_amd_acp_find_config(struct pci_dev *pci);
+26 -18
sound/soc/amd/ps/pci-ps.c
··· 503 503 } 504 504 adata->addr = addr; 505 505 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; 513 506 pci_set_master(pci); 514 507 pci_set_drvdata(pci, adata); 515 508 mutex_init(&adata->acp_lock); ··· 545 552 return ret; 546 553 } 547 554 555 + static bool check_acp_sdw_enable_status(struct acp63_dev_data *adata) 556 + { 557 + u32 sdw0_en, sdw1_en; 558 + 559 + sdw0_en = readl(adata->acp63_base + ACP_SW0_EN); 560 + sdw1_en = readl(adata->acp63_base + ACP_SW1_EN); 561 + return (sdw0_en || sdw1_en); 562 + } 563 + 548 564 static int __maybe_unused snd_acp63_suspend(struct device *dev) 549 565 { 550 566 struct acp63_dev_data *adata; 551 - int ret = 0; 567 + int ret; 552 568 553 569 adata = dev_get_drvdata(dev); 554 - if (adata->acp_reset) { 555 - ret = acp63_deinit(adata->acp63_base, dev); 556 - if (ret) 557 - dev_err(dev, "ACP de-init failed\n"); 570 + if (adata->is_sdw_dev) { 571 + adata->sdw_en_stat = check_acp_sdw_enable_status(adata); 572 + if (adata->sdw_en_stat) 573 + return 0; 558 574 } 575 + ret = acp63_deinit(adata->acp63_base, dev); 576 + if (ret) 577 + dev_err(dev, "ACP de-init failed\n"); 578 + 559 579 return ret; 560 580 } 561 581 562 582 static int __maybe_unused snd_acp63_resume(struct device *dev) 563 583 { 564 584 struct acp63_dev_data *adata; 565 - int ret = 0; 585 + int ret; 566 586 567 587 adata = dev_get_drvdata(dev); 568 - if (adata->acp_reset) { 569 - ret = acp63_init(adata->acp63_base, dev); 570 - if (ret) 571 - dev_err(dev, "ACP init failed\n"); 572 - } 588 + if (adata->sdw_en_stat) 589 + return 0; 590 + 591 + ret = acp63_init(adata->acp63_base, dev); 592 + if (ret) 593 + dev_err(dev, "ACP init failed\n"); 594 + 573 595 return ret; 574 596 } 575 597