diff options
author | Mark Brown <broonie@kernel.org> | 2023-01-18 15:33:51 +0000 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2023-01-18 15:33:51 +0000 |
commit | 309d401452b96f23abe2572d290c51c548d9f728 (patch) | |
tree | 28aae1adcf60a890dcf17c676b241db07bef98c1 /sound/soc/intel/avs | |
parent | 24b401f3e0b1ddd269969e68e947ab0a6f89b017 (diff) | |
parent | c1619ea22d9509cfbcf5c2c1cc65563179e9dc8e (diff) |
ASoC: Merge up 6.2 fixes
To resolve a conflict and support further development.
Diffstat (limited to 'sound/soc/intel/avs')
-rw-r--r-- | sound/soc/intel/avs/core.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/sound/soc/intel/avs/core.c b/sound/soc/intel/avs/core.c index 2ca24273c491..637501850728 100644 --- a/sound/soc/intel/avs/core.c +++ b/sound/soc/intel/avs/core.c @@ -481,6 +481,29 @@ err_remap_bar0: return ret; } +static void avs_pci_shutdown(struct pci_dev *pci) +{ + struct hdac_bus *bus = pci_get_drvdata(pci); + struct avs_dev *adev = hdac_to_avs(bus); + + cancel_work_sync(&adev->probe_work); + avs_ipc_block(adev->ipc); + + snd_hdac_stop_streams(bus); + avs_dsp_op(adev, int_control, false); + snd_hdac_ext_bus_ppcap_int_enable(bus, false); + snd_hdac_ext_bus_link_power_down_all(bus); + + snd_hdac_bus_stop_chip(bus); + snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, false); + + if (avs_platattr_test(adev, CLDMA)) + pci_free_irq(pci, 0, &code_loader); + pci_free_irq(pci, 0, adev); + pci_free_irq(pci, 0, bus); + pci_free_irq_vectors(pci); +} + static void avs_pci_remove(struct pci_dev *pci) { struct hdac_device *hdev, *save; @@ -739,6 +762,7 @@ static struct pci_driver avs_pci_driver = { .id_table = avs_ids, .probe = avs_pci_probe, .remove = avs_pci_remove, + .shutdown = avs_pci_shutdown, .driver = { .pm = &avs_dev_pm, }, |