Message ID | 20221019175317.1540919-7-cezary.rojewski@intel.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | ASoC: Intel: avs: PCM power management | expand |
Hi Cezary, Thank you for the patch! Yet something to improve: [auto build test ERROR on broonie-sound/for-next] [also build test ERROR on tiwai-sound/for-next linus/master v6.1-rc1 next-20221020] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Cezary-Rojewski/ASoC-Intel-avs-PCM-power-management/20221020-103921 base: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next patch link: https://lore.kernel.org/r/20221019175317.1540919-7-cezary.rojewski%40intel.com patch subject: [PATCH 6/8] ASoC: Intel: avs: Standby power-state support config: openrisc-randconfig-r024-20221020 compiler: or1k-linux-gcc (GCC) 12.1.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/intel-lab-lkp/linux/commit/52c1923c9d4ae230b55c6c0262e6d6bbe1fc2584 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Cezary-Rojewski/ASoC-Intel-avs-PCM-power-management/20221020-103921 git checkout 52c1923c9d4ae230b55c6c0262e6d6bbe1fc2584 # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=openrisc SHELL=/bin/bash drivers/gpu/drm/ttm/ drivers/pci/controller/ sound/soc/intel/avs/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> All errors (new ones prefixed by >>): sound/soc/intel/avs/core.c: In function 'avs_suspend_common': >> sound/soc/intel/avs/core.c:559:14: error: 'acpi_gbl_FADT' undeclared (first use in this function); did you mean 'acpi_table_fadt'? 559 | if ((acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0) && low_power && adev->num_lp_paths) | ^~~~~~~~~~~~~ | acpi_table_fadt sound/soc/intel/avs/core.c:559:14: note: each undeclared identifier is reported only once for each function it appears in sound/soc/intel/avs/core.c: In function 'avs_resume_common': sound/soc/intel/avs/core.c:619:14: error: 'acpi_gbl_FADT' undeclared (first use in this function); did you mean 'acpi_table_fadt'? 619 | if ((acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0) && low_power && adev->num_lp_paths) | ^~~~~~~~~~~~~ | acpi_table_fadt vim +559 sound/soc/intel/avs/core.c 552 553 static int __maybe_unused avs_suspend_common(struct avs_dev *adev, bool low_power) 554 { 555 struct hdac_bus *bus = &adev->base.core; 556 int ret; 557 558 flush_work(&adev->probe_work); > 559 if ((acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0) && low_power && adev->num_lp_paths) 560 return avs_suspend_standby(adev); 561 562 snd_hdac_ext_bus_link_power_down_all(bus); 563 564 ret = avs_ipc_set_dx(adev, AVS_MAIN_CORE_MASK, false); 565 /* 566 * pm_runtime is blocked on DSP failure but system-wide suspend is not. 567 * Do not block entire system from suspending if that's the case. 568 */ 569 if (ret && ret != -EPERM) { 570 dev_err(adev->dev, "set dx failed: %d\n", ret); 571 return AVS_IPC_RET(ret); 572 } 573 574 avs_ipc_block(adev->ipc); 575 avs_dsp_op(adev, int_control, false); 576 snd_hdac_ext_bus_ppcap_int_enable(bus, false); 577 578 ret = avs_dsp_core_disable(adev, AVS_MAIN_CORE_MASK); 579 if (ret < 0) { 580 dev_err(adev->dev, "core_mask %ld disable failed: %d\n", AVS_MAIN_CORE_MASK, ret); 581 return ret; 582 } 583 584 snd_hdac_ext_bus_ppcap_enable(bus, false); 585 /* disable LP SRAM retention */ 586 avs_hda_power_gating_enable(adev, false); 587 snd_hdac_bus_stop_chip(bus); 588 /* disable CG when putting controller to reset */ 589 avs_hdac_clock_gating_enable(bus, false); 590 snd_hdac_bus_enter_link_reset(bus); 591 avs_hdac_clock_gating_enable(bus, true); 592 593 snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, false); 594 595 return 0; 596 } 597
diff --git a/sound/soc/intel/avs/core.c b/sound/soc/intel/avs/core.c index d067ce951afc..841bc9fa0d3b 100644 --- a/sound/soc/intel/avs/core.c +++ b/sound/soc/intel/avs/core.c @@ -534,12 +534,30 @@ static void avs_pci_remove(struct pci_dev *pci) pm_runtime_get_noresume(&pci->dev); } -static int __maybe_unused avs_suspend_common(struct avs_dev *adev) +static int avs_suspend_standby(struct avs_dev *adev) +{ + struct hdac_bus *bus = &adev->base.core; + struct pci_dev *pci = adev->base.pci; + + if (bus->cmd_dma_state) + snd_hdac_bus_stop_cmd_io(bus); + + snd_hdac_ext_bus_link_power_down_all(bus); + + enable_irq_wake(pci->irq); + pci_save_state(pci); + + return 0; +} + +static int __maybe_unused avs_suspend_common(struct avs_dev *adev, bool low_power) { struct hdac_bus *bus = &adev->base.core; int ret; flush_work(&adev->probe_work); + if ((acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0) && low_power && adev->num_lp_paths) + return avs_suspend_standby(adev); snd_hdac_ext_bus_link_power_down_all(bus); @@ -577,11 +595,30 @@ static int __maybe_unused avs_suspend_common(struct avs_dev *adev) return 0; } -static int __maybe_unused avs_resume_common(struct avs_dev *adev, bool purge) +static int avs_resume_standby(struct avs_dev *adev) +{ + struct hdac_bus *bus = &adev->base.core; + struct pci_dev *pci = adev->base.pci; + + pci_restore_state(pci); + disable_irq_wake(pci->irq); + + snd_hdac_ext_bus_link_power_up_all(bus); + + if (bus->cmd_dma_state) + snd_hdac_bus_init_cmd_io(bus); + + return 0; +} + +static int __maybe_unused avs_resume_common(struct avs_dev *adev, bool low_power, bool purge) { struct hdac_bus *bus = &adev->base.core; int ret; + if ((acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0) && low_power && adev->num_lp_paths) + return avs_resume_standby(adev); + snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, true); avs_hdac_bus_init_chip(bus, true); @@ -599,26 +636,50 @@ static int __maybe_unused avs_resume_common(struct avs_dev *adev, bool purge) static int __maybe_unused avs_suspend(struct device *dev) { - return avs_suspend_common(to_avs_dev(dev)); + return avs_suspend_common(to_avs_dev(dev), true); } static int __maybe_unused avs_resume(struct device *dev) { - return avs_resume_common(to_avs_dev(dev), true); + return avs_resume_common(to_avs_dev(dev), true, true); } static int __maybe_unused avs_runtime_suspend(struct device *dev) { - return avs_suspend_common(to_avs_dev(dev)); + return avs_suspend_common(to_avs_dev(dev), true); } static int __maybe_unused avs_runtime_resume(struct device *dev) { - return avs_resume_common(to_avs_dev(dev), true); + return avs_resume_common(to_avs_dev(dev), true, false); +} + +static int __maybe_unused avs_freeze(struct device *dev) +{ + return avs_suspend_common(to_avs_dev(dev), false); +} +static int __maybe_unused avs_thaw(struct device *dev) +{ + return avs_resume_common(to_avs_dev(dev), false, true); +} + +static int __maybe_unused avs_poweroff(struct device *dev) +{ + return avs_suspend_common(to_avs_dev(dev), false); +} + +static int __maybe_unused avs_restore(struct device *dev) +{ + return avs_resume_common(to_avs_dev(dev), false, true); } static const struct dev_pm_ops avs_dev_pm = { - SET_SYSTEM_SLEEP_PM_OPS(avs_suspend, avs_resume) + .suspend = avs_suspend, + .resume = avs_resume, + .freeze = avs_freeze, + .thaw = avs_thaw, + .poweroff = avs_poweroff, + .restore = avs_restore, SET_RUNTIME_PM_OPS(avs_runtime_suspend, avs_runtime_resume, NULL) };