diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-05-19 23:41:32 +0300 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-05-19 23:41:32 +0300 |
commit | f4c80d5a16eb4b08a0d9ade154af1ebdc63f5752 (patch) | |
tree | 5334acabf48210285333bc80d4a3e326efb36750 /sound/soc/intel/skylake/skl.c | |
parent | 7afd16f882887c9adc69cd1794f5e57777723217 (diff) | |
parent | 17e1717c11a34f9b0956e33e0c4a4e4ae8c51a57 (diff) | |
download | linux-f4c80d5a16eb4b08a0d9ade154af1ebdc63f5752.tar.xz |
Merge tag 'sound-4.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound updates from Takashi Iwai:
"This time was again a relatively calm development cycle; most of
updates are about drivers, and no radical changes are seen in any core
code. Here are some highlights:
ALSA core:
- Continued hardening of ALSA hrtimer
- A few leak fixes in timer interface
- Fix poll error handling in PCM and compress
- Add error propagation in compress API
- Removal of dead rtctimer driver
HD-audio:
- Native ELD notify support for i915 HDMI
- Realtek ALC234 & co support
- Code refactoring to standardize chmap support
- Continued development for SKL HDMI core support
Firewire:
- Apply delayed card registration to all drivers
- Improved / stabilized the handling of PCM stream start / stop
- Add tracepoints to dump a part of isochronous packet data
- Fixed incoming/outgoing packet parameter usages
- Add support for M-Audio profire series
USB-audio:
- Fixes for UAC2 clock source
- SS+ support
- Workaround for oft-seen repeated sample rate read errors
ASoC:
- Further slow progress on the topology code
- Substantial updates and improvements for the da7219, es8328,
fsl-ssi, Intel and rcar drivers.
- Compress error handling in WM ADSP driver"
* tag 'sound-4.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (177 commits)
ALSA: firewire-lib: change a member of event structure to suppress sparse wanings to bool type
sound: oss: Use setup_timer and mod_timer.
ASoC: hdac_hdmi: Remove the unused 'timeout' variable
ASoC: fsl_ssi: Fix channel slipping on capture (or playback) restart in full duplex.
ASoC: fsl_ssi: Fix channel slipping in Playback at startup
ASoC: fsl_ssi: Fix samples being dropped at Playback startup
ASoC: fsl_ssi: Save a dev reference for dev_err() purpose.
ASoC: fsl_ssi: The IPG/5 limitation concerns the bitclk, not the sysclk.
ASoC: fsl_ssi: Real hardware channels max number is 32
ASoC: pcm5102a: Add support for PCM5102A codec
ASoC: hdac_hdmi: add link management
ASoC: Intel: Skylake: add link management
ALSA: hdac: add link pm and ref counting
ALSA: au88x0: Fix zero clear of stream->resources
ASoC: rt298: Add DMI match for Broxton-P reference platform
ASoC: rt298: fix null deref on acpi driver data
ASoC: dapm: deprecate MICBIAS widget type
ALSA: firewire-lib: drop skip argument from helper functions to queue a packet
ALSA: firewire-lib: add context information to tracepoints
ALSA: firewire-lib: permit to flush queued packets only in process context for better PCM period granularity
...
Diffstat (limited to 'sound/soc/intel/skylake/skl.c')
-rw-r--r-- | sound/soc/intel/skylake/skl.c | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/sound/soc/intel/skylake/skl.c b/sound/soc/intel/skylake/skl.c index 3982f5536f2d..06d8c263c68f 100644 --- a/sound/soc/intel/skylake/skl.c +++ b/sound/soc/intel/skylake/skl.c @@ -229,7 +229,12 @@ static int skl_suspend(struct device *dev) * running, we need to save the state for these and continue */ if (skl->supend_active) { + /* turn off the links and stop the CORB/RIRB DMA if it is On */ snd_hdac_ext_bus_link_power_down_all(ebus); + + if (ebus->cmd_dma_state) + snd_hdac_bus_stop_cmd_io(&ebus->bus); + enable_irq_wake(bus->irq); pci_save_state(pci); pci_disable_device(pci); @@ -255,6 +260,7 @@ static int skl_resume(struct device *dev) struct hdac_ext_bus *ebus = pci_get_drvdata(pci); struct skl *skl = ebus_to_skl(ebus); struct hdac_bus *bus = ebus_to_hbus(ebus); + struct hdac_ext_link *hlink = NULL; int ret; /* Turned OFF in HDMI codec driver after codec reconfiguration */ @@ -276,8 +282,29 @@ static int skl_resume(struct device *dev) ret = pci_enable_device(pci); snd_hdac_ext_bus_link_power_up_all(ebus); disable_irq_wake(bus->irq); + /* + * turn On the links which are On before active suspend + * and start the CORB/RIRB DMA if On before + * active suspend. + */ + list_for_each_entry(hlink, &ebus->hlink_list, list) { + if (hlink->ref_count) + snd_hdac_ext_bus_link_power_up(hlink); + } + + if (ebus->cmd_dma_state) + snd_hdac_bus_init_cmd_io(&ebus->bus); } else { ret = _skl_resume(ebus); + + /* turn off the links which are off before suspend */ + list_for_each_entry(hlink, &ebus->hlink_list, list) { + if (!hlink->ref_count) + snd_hdac_ext_bus_link_power_down(hlink); + } + + if (!ebus->cmd_dma_state) + snd_hdac_bus_stop_cmd_io(&ebus->bus); } return ret; @@ -613,6 +640,7 @@ static int skl_probe(struct pci_dev *pci, struct skl *skl; struct hdac_ext_bus *ebus = NULL; struct hdac_bus *bus = NULL; + struct hdac_ext_link *hlink = NULL; int err; /* we use ext core ops, so provide NULL for ops here */ @@ -643,7 +671,7 @@ static int skl_probe(struct pci_dev *pci, err = skl_machine_device_register(skl, (void *)pci_id->driver_data); if (err < 0) - goto out_free; + goto out_nhlt_free; err = skl_init_dsp(skl); if (err < 0) { @@ -679,6 +707,12 @@ static int skl_probe(struct pci_dev *pci, } } + /* + * we are done probling so decrement link counts + */ + list_for_each_entry(hlink, &ebus->hlink_list, list) + snd_hdac_ext_bus_link_put(ebus, hlink); + /*configure PM */ pm_runtime_put_noidle(bus->dev); pm_runtime_allow(bus->dev); @@ -693,6 +727,8 @@ out_dsp_free: skl_free_dsp(skl); out_mach_free: skl_machine_device_unregister(skl); +out_nhlt_free: + skl_nhlt_free(skl->nhlt); out_free: skl->init_failed = 1; skl_free(ebus); @@ -743,6 +779,7 @@ static void skl_remove(struct pci_dev *pci) skl_free_dsp(skl); skl_machine_device_unregister(skl); skl_dmic_device_unregister(skl); + skl_nhlt_free(skl->nhlt); skl_free(ebus); dev_set_drvdata(&pci->dev, NULL); } |