| From 79b0618304c9a7512aba223ae187a8405656aa8e Mon Sep 17 00:00:00 2001 |
| From: Colin Ian King <colin.king@canonical.com> |
| Date: Sun, 25 Nov 2018 23:12:08 +0000 |
| Subject: [PATCH 001/109] ALSA: usb-audio: fix spelling mistake "Frequence" -> |
| "Frequency" |
| |
| There are spelling mistakes in equalizer name fields, fix them. |
| |
| Signed-off-by: Colin Ian King <colin.king@canonical.com> |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 940f457392e684bf0005628f6a155040648c5894) |
| Bugzilla: 1772498 |
| |
| sound/usb/mixer_us16x08.c | 8 ++++---- |
| 1 file changed, 4 insertions(+), 4 deletions(-) |
| |
| diff --git a/sound/usb/mixer_us16x08.c b/sound/usb/mixer_us16x08.c |
| index f0e8e1539450..aea3b4ad7ded 100644 |
| |
| |
| @@ -1109,7 +1109,7 @@ static const struct snd_us16x08_control_params eq_controls[] = { |
| .control_id = SND_US16X08_ID_EQLOWFREQ, |
| .type = USB_MIXER_U8, |
| .num_channels = 16, |
| - .name = "EQ Low Frequence", |
| + .name = "EQ Low Frequency", |
| }, |
| { /* EQ mid low gain */ |
| .kcontrol_new = &snd_us16x08_eq_gain_ctl, |
| @@ -1123,7 +1123,7 @@ static const struct snd_us16x08_control_params eq_controls[] = { |
| .control_id = SND_US16X08_ID_EQLOWMIDFREQ, |
| .type = USB_MIXER_U8, |
| .num_channels = 16, |
| - .name = "EQ MidLow Frequence", |
| + .name = "EQ MidLow Frequency", |
| }, |
| { /* EQ mid low Q */ |
| .kcontrol_new = &snd_us16x08_eq_mid_width_ctl, |
| @@ -1144,7 +1144,7 @@ static const struct snd_us16x08_control_params eq_controls[] = { |
| .control_id = SND_US16X08_ID_EQHIGHMIDFREQ, |
| .type = USB_MIXER_U8, |
| .num_channels = 16, |
| - .name = "EQ MidHigh Frequence", |
| + .name = "EQ MidHigh Frequency", |
| }, |
| { /* EQ mid high Q */ |
| .kcontrol_new = &snd_us16x08_eq_mid_width_ctl, |
| @@ -1165,7 +1165,7 @@ static const struct snd_us16x08_control_params eq_controls[] = { |
| .control_id = SND_US16X08_ID_EQHIGHFREQ, |
| .type = USB_MIXER_U8, |
| .num_channels = 16, |
| - .name = "EQ High Frequence", |
| + .name = "EQ High Frequency", |
| }, |
| }; |
| |
| -- |
| 2.24.1 |
| |
| From 17bbbd02508acda4df32c4f0668434dccb56bdca Mon Sep 17 00:00:00 2001 |
| From: Saurav Girepunje <saurav.girepunje@gmail.com> |
| Date: Tue, 29 Oct 2019 23:22:00 +0530 |
| Subject: [PATCH 002/109] ALSA: usb-audio: sound: usb: usb true/false for bool |
| return type |
| |
| Use true/false for bool type return in uac_clock_source_is_valid(). |
| |
| Signed-off-by: Saurav Girepunje <saurav.girepunje@gmail.com> |
| Link: https://lore.kernel.org/r/20191029175200.GA7320@saurav |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 1d4961d9eb1aaa498dfb44779b7e4b95d79112d0) |
| Bugzilla: 1772498 |
| |
| sound/usb/clock.c | 10 +++++----- |
| 1 file changed, 5 insertions(+), 5 deletions(-) |
| |
| diff --git a/sound/usb/clock.c b/sound/usb/clock.c |
| index 6b8c14f9b5d4..018b1ecb5404 100644 |
| |
| |
| @@ -165,21 +165,21 @@ static bool uac_clock_source_is_valid(struct snd_usb_audio *chip, |
| snd_usb_find_clock_source_v3(chip->ctrl_intf, source_id); |
| |
| if (!cs_desc) |
| - return 0; |
| + return false; |
| bmControls = le32_to_cpu(cs_desc->bmControls); |
| } else { /* UAC_VERSION_1/2 */ |
| struct uac_clock_source_descriptor *cs_desc = |
| snd_usb_find_clock_source(chip->ctrl_intf, source_id); |
| |
| if (!cs_desc) |
| - return 0; |
| + return false; |
| bmControls = cs_desc->bmControls; |
| } |
| |
| /* If a clock source can't tell us whether it's valid, we assume it is */ |
| if (!uac_v2v3_control_is_readable(bmControls, |
| UAC2_CS_CONTROL_CLOCK_VALID)) |
| - return 1; |
| + return true; |
| |
| err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_CUR, |
| USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, |
| @@ -191,10 +191,10 @@ static bool uac_clock_source_is_valid(struct snd_usb_audio *chip, |
| dev_warn(&dev->dev, |
| "%s(): cannot get clock validity for id %d\n", |
| __func__, source_id); |
| - return 0; |
| + return false; |
| } |
| |
| - return !!data; |
| + return data ? true : false; |
| } |
| |
| static int __uac_clock_find_source(struct snd_usb_audio *chip, int entity_id, |
| -- |
| 2.24.1 |
| |
| From 042dd0cc1f179d52acfea699239b87ef93dbd70d Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Thu, 14 Nov 2019 17:56:13 +0100 |
| Subject: [PATCH 003/109] ALSA: usb-audio: Add skip_validation option |
| |
| The unit descriptor validation may lead to a probe error when the |
| device provides a buggy descriptor or the validator detected |
| incorrectly. For identifying such an error and band-aiding, give a |
| new module option, skip_validation. With this option, the driver |
| ignores the validation errors with the hexdump of the unit |
| descriptor, so we can check it in a bit more details. |
| |
| Link: https://lore.kernel.org/r/20191114165613.7422-2-tiwai@suse.de |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit f35ef592477c5347b8f780a5f0d4970671e22c61) |
| Bugzilla: 1772498 |
| |
| sound/usb/card.c | 3 +++ |
| sound/usb/usbaudio.h | 1 + |
| sound/usb/validate.c | 23 ++++++++++++++++++++--- |
| 3 files changed, 24 insertions(+), 3 deletions(-) |
| |
| diff --git a/sound/usb/card.c b/sound/usb/card.c |
| index db91dc76cc91..9f743ebae615 100644 |
| |
| |
| @@ -74,6 +74,7 @@ static bool autoclock = true; |
| static char *quirk_alias[SNDRV_CARDS]; |
| |
| bool snd_usb_use_vmalloc = true; |
| +bool snd_usb_skip_validation; |
| |
| module_param_array(index, int, NULL, 0444); |
| MODULE_PARM_DESC(index, "Index value for the USB audio adapter."); |
| @@ -96,6 +97,8 @@ module_param_array(quirk_alias, charp, NULL, 0444); |
| MODULE_PARM_DESC(quirk_alias, "Quirk aliases, e.g. 0123abcd:5678beef."); |
| module_param_named(use_vmalloc, snd_usb_use_vmalloc, bool, 0444); |
| MODULE_PARM_DESC(use_vmalloc, "Use vmalloc for PCM intermediate buffers (default: yes)."); |
| +module_param_named(skip_validation, snd_usb_skip_validation, bool, 0444); |
| +MODULE_PARM_DESC(skip_validation, "Skip unit descriptor validation (default: no)."); |
| |
| /* |
| * we keep the snd_usb_audio_t instances by ourselves for merging |
| diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h |
| index e360680f45f3..6fe3ab582ec6 100644 |
| |
| |
| @@ -121,5 +121,6 @@ int snd_usb_lock_shutdown(struct snd_usb_audio *chip); |
| void snd_usb_unlock_shutdown(struct snd_usb_audio *chip); |
| |
| extern bool snd_usb_use_vmalloc; |
| +extern bool snd_usb_skip_validation; |
| |
| #endif /* __USBAUDIO_H */ |
| diff --git a/sound/usb/validate.c b/sound/usb/validate.c |
| index 5a3c4f7882b0..c43d8c3895a9 100644 |
| |
| |
| @@ -322,11 +322,28 @@ static bool validate_desc(unsigned char *hdr, int protocol, |
| |
| bool snd_usb_validate_audio_desc(void *p, int protocol) |
| { |
| - return validate_desc(p, protocol, audio_validators); |
| + unsigned char *c = p; |
| + bool valid; |
| + |
| + valid = validate_desc(p, protocol, audio_validators); |
| + if (!valid && snd_usb_skip_validation) { |
| + print_hex_dump(KERN_ERR, "USB-audio: buggy audio desc: ", |
| + DUMP_PREFIX_NONE, 16, 1, c, c[0], true); |
| + valid = true; |
| + } |
| + return valid; |
| } |
| |
| bool snd_usb_validate_midi_desc(void *p) |
| { |
| - return validate_desc(p, UAC_VERSION_1, midi_validators); |
| + unsigned char *c = p; |
| + bool valid; |
| + |
| + valid = validate_desc(p, UAC_VERSION_1, midi_validators); |
| + if (!valid && snd_usb_skip_validation) { |
| + print_hex_dump(KERN_ERR, "USB-audio: buggy midi desc: ", |
| + DUMP_PREFIX_NONE, 16, 1, c, c[0], true); |
| + valid = true; |
| + } |
| + return valid; |
| } |
| - |
| -- |
| 2.24.1 |
| |
| From 8d5568b5492d468acd4a49eefccaaed28dc62d22 Mon Sep 17 00:00:00 2001 |
| From: Jaroslav Kysela <perex@perex.cz> |
| Date: Tue, 22 Oct 2019 19:43:12 +0200 |
| Subject: [PATCH 004/109] ALSA: hda: add Intel DSP configuration / probe code |
| |
| For distributions, we need one place where we can decide |
| which driver will be activated for the auto-configation of the |
| Intel's HDA hardware with DSP. Actually, we cover three drivers: |
| |
| * Legacy HDA |
| * Intel SST |
| * Intel Sound Open Firmware (SOF) |
| |
| All those drivers registers similar PCI IDs, so the first |
| driver probed from the PCI stack can win. But... it is not |
| guaranteed that the correct driver wins. |
| |
| This commit changes Intel's NHLT ACPI module to a common |
| DSP probe module for the Intel's hardware. All above sound |
| drivers calls this code. The user can force another behaviour |
| using the module parameter 'dsp_driver' located in |
| the 'snd-intel-dspcfg' module. |
| |
| This change allows to add specific dmi checks for the specific |
| systems. The examples are taken from the pull request: |
| |
| https://github.com/thesofproject/linux/pull/927 |
| |
| Tested on Lenovo Carbon X1 7th gen. |
| |
| Signed-off-by: Jaroslav Kysela <perex@perex.cz> |
| Tested-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191022174313.29087-1-perex@perex.cz |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 82d9d54a6c0ee8b12211fa4e59fd940a2da4e063) |
| Bugzilla: 1772498 |
| |
| include/sound/intel-dsp-config.h | 34 +++++ |
| sound/hda/Kconfig | 10 +- |
| sound/hda/Makefile | 5 +- |
| sound/hda/intel-dsp-config.c | 249 +++++++++++++++++++++++++++++++ |
| sound/hda/intel-nhlt.c | 3 - |
| sound/pci/hda/Kconfig | 11 +- |
| sound/pci/hda/hda_intel.c | 49 ++---- |
| sound/soc/intel/Kconfig | 2 +- |
| sound/soc/intel/skylake/skl.c | 19 +-- |
| sound/soc/sof/intel/Kconfig | 2 +- |
| sound/soc/sof/sof-pci-dev.c | 6 + |
| 11 files changed, 322 insertions(+), 68 deletions(-) |
| create mode 100644 include/sound/intel-dsp-config.h |
| create mode 100644 sound/hda/intel-dsp-config.c |
| |
| diff --git a/include/sound/intel-dsp-config.h b/include/sound/intel-dsp-config.h |
| new file mode 100644 |
| index 000000000000..c36622bee3f8 |
| |
| |
| @@ -0,0 +1,34 @@ |
| +/* SPDX-License-Identifier: GPL-2.0-only */ |
| +/* |
| + * intel-dsp-config.h - Intel DSP config |
| + * |
| + * Copyright (c) 2019 Jaroslav Kysela <perex@perex.cz> |
| + */ |
| + |
| +#ifndef __INTEL_DSP_CONFIG_H__ |
| +#define __INTEL_DSP_CONFIG_H__ |
| + |
| +struct pci_dev; |
| + |
| +enum { |
| + SND_INTEL_DSP_DRIVER_ANY = 0, |
| + SND_INTEL_DSP_DRIVER_LEGACY, |
| + SND_INTEL_DSP_DRIVER_SST, |
| + SND_INTEL_DSP_DRIVER_SOF, |
| + SND_INTEL_DSP_DRIVER_LAST = SND_INTEL_DSP_DRIVER_SOF |
| +}; |
| + |
| +#if IS_ENABLED(CONFIG_SND_INTEL_DSP_CONFIG) |
| + |
| +int snd_intel_dsp_driver_probe(struct pci_dev *pci); |
| + |
| +#else |
| + |
| +static inline int snd_intel_dsp_driver_probe(struct pci_dev *pci) |
| +{ |
| + return SND_INTEL_DSP_DRIVER_ANY; |
| +} |
| + |
| +#endif |
| + |
| +#endif |
| diff --git a/sound/hda/Kconfig b/sound/hda/Kconfig |
| index 3d33fc1757ba..b0c88fe040ee 100644 |
| |
| |
| @@ -34,6 +34,12 @@ config SND_HDA_PREALLOC_SIZE |
| via a proc file (/proc/asound/card*/pcm*/sub*/prealloc), too. |
| |
| config SND_INTEL_NHLT |
| - tristate |
| + bool |
| # this config should be selected only for Intel ACPI platforms. |
| - # A fallback is provided so that the code compiles in all cases. |
| \ No newline at end of file |
| + # A fallback is provided so that the code compiles in all cases. |
| + |
| +config SND_INTEL_DSP_CONFIG |
| + tristate |
| + select SND_INTEL_NHLT if ACPI |
| + # this config should be selected only for Intel DSP platforms. |
| + # A fallback is provided so that the code compiles in all cases. |
| diff --git a/sound/hda/Makefile b/sound/hda/Makefile |
| index 8560f6ef1b19..601e617918b8 100644 |
| |
| |
| @@ -14,5 +14,6 @@ obj-$(CONFIG_SND_HDA_CORE) += snd-hda-core.o |
| #extended hda |
| obj-$(CONFIG_SND_HDA_EXT_CORE) += ext/ |
| |
| -snd-intel-nhlt-objs := intel-nhlt.o |
| -obj-$(CONFIG_SND_INTEL_NHLT) += snd-intel-nhlt.o |
| +snd-intel-dspcfg-objs := intel-dsp-config.o |
| +snd-intel-dspcfg-$(CONFIG_SND_INTEL_NHLT) += intel-nhlt.o |
| +obj-$(CONFIG_SND_INTEL_DSP_CONFIG) += snd-intel-dspcfg.o |
| diff --git a/sound/hda/intel-dsp-config.c b/sound/hda/intel-dsp-config.c |
| new file mode 100644 |
| index 000000000000..d9f6d9e872b4 |
| |
| |
| @@ -0,0 +1,249 @@ |
| +// SPDX-License-Identifier: GPL-2.0 |
| +// Copyright (c) 2019 Jaroslav Kysela <perex@perex.cz> |
| + |
| +#include <linux/bits.h> |
| +#include <linux/dmi.h> |
| +#include <linux/module.h> |
| +#include <linux/pci.h> |
| +#include <sound/core.h> |
| +#include <sound/intel-dsp-config.h> |
| +#include <sound/intel-nhlt.h> |
| + |
| +static int dsp_driver; |
| + |
| +module_param(dsp_driver, int, 0444); |
| +MODULE_PARM_DESC(dsp_driver, "Force the DSP driver for Intel DSP (0=auto, 1=legacy, 2=SST, 3=SOF)"); |
| + |
| +#define FLAG_SST BIT(0) |
| +#define FLAG_SOF BIT(1) |
| +#define FLAG_SOF_ONLY_IF_DMIC BIT(16) |
| + |
| +struct config_entry { |
| + u32 flags; |
| + u16 device; |
| + const struct dmi_system_id *dmi_table; |
| +}; |
| + |
| +/* |
| + * configuration table |
| + * - the order of similar PCI ID entries is important! |
| + * - the first successful match will win |
| + */ |
| +static const struct config_entry config_table[] = { |
| +/* Cometlake-LP */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_INTEL_CML_LP) |
| + { |
| + /* prefer SST */ |
| + .flags = FLAG_SST, |
| + .device = 0x02c8, |
| + }, |
| +#elif IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_LP) |
| + { |
| + .flags = FLAG_SOF, |
| + .device = 0x02c8, |
| + }, |
| +#endif |
| +/* Cometlake-H */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_INTEL_CML_H) |
| + { |
| + .flags = FLAG_SST, |
| + .device = 0x06c8, |
| + }, |
| +#elif IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_H) |
| + { |
| + .flags = FLAG_SOF, |
| + .device = 0x06c8, |
| + }, |
| +#endif |
| +/* Merrifield */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_MERRIFIELD) |
| + { |
| + .flags = FLAG_SOF, |
| + .device = 0x119a, |
| + }, |
| +#endif |
| +/* Broxton-T */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_APOLLOLAKE) |
| + { |
| + .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC, |
| + .device = 0x1a98, |
| + }, |
| +#endif |
| +/* Geminilake */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_GEMINILAKE) |
| + { |
| + .flags = FLAG_SOF, |
| + .device = 0x3198, |
| + .dmi_table = (const struct dmi_system_id []) { |
| + { |
| + .ident = "Google Chromebooks", |
| + .matches = { |
| + DMI_MATCH(DMI_SYS_VENDOR, "Google"), |
| + } |
| + }, |
| + {} |
| + } |
| + }, |
| +#endif |
| +#if IS_ENABLED(CONFIG_SND_SOC_INTEL_GLK) |
| + { |
| + .flags = FLAG_SST, |
| + .device = 0x3198, |
| + }, |
| +#endif |
| +/* Icelake */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_ICELAKE) |
| + { |
| + .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC, |
| + .device = 0x34c8, |
| + }, |
| +#endif |
| +/* Elkhart Lake */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_ELKHARTLAKE) |
| + { |
| + .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC, |
| + .device = 0x4b55, |
| + }, |
| +#endif |
| +/* Appololake (Broxton-P) */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_APOLLOLAKE) |
| + { |
| + .flags = FLAG_SOF, |
| + .device = 0x5a98, |
| + .dmi_table = (const struct dmi_system_id []) { |
| + { |
| + .ident = "Up Squared", |
| + .matches = { |
| + DMI_MATCH(DMI_SYS_VENDOR, "AAEON"), |
| + DMI_MATCH(DMI_BOARD_NAME, "UP-APL01"), |
| + } |
| + }, |
| + {} |
| + } |
| + }, |
| +#endif |
| +#if IS_ENABLED(CONFIG_SND_SOC_INTEL_APL) |
| + { |
| + .flags = FLAG_SST, |
| + .device = 0x5a98, |
| + }, |
| +#endif |
| +/* Cannonlake */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_CANNONLAKE) |
| + { |
| + .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC, |
| + .device = 0x9dc8, |
| + }, |
| +#endif |
| +/* Sunrise Point-LP */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_SKYLAKE) |
| + { |
| + .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC, |
| + .device = 0x9d70, |
| + }, |
| +#endif |
| +/* Kabylake-LP */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_KABYLAKE) |
| + { |
| + .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC, |
| + .device = 0x9d71, |
| + }, |
| +#endif |
| +/* Tigerlake */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_TIGERLAKE) |
| + { |
| + .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC, |
| + .device = 0xa0c8, |
| + }, |
| +#endif |
| +/* Coffelake */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_COFFEELAKE) |
| + { |
| + .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC, |
| + .device = 0xa348, |
| + }, |
| +#endif |
| +}; |
| + |
| +static const struct config_entry *snd_intel_dsp_find_config |
| + (struct pci_dev *pci, const struct config_entry *table, u32 len) |
| +{ |
| + u16 device; |
| + |
| + device = pci->device; |
| + for (; len > 0; len--, table++) { |
| + if (table->device != device) |
| + continue; |
| + if (table->dmi_table && !dmi_check_system(table->dmi_table)) |
| + continue; |
| + return table; |
| + } |
| + return NULL; |
| +} |
| + |
| +static int snd_intel_dsp_check_dmic(struct pci_dev *pci) |
| +{ |
| + struct nhlt_acpi_table *nhlt; |
| + int ret = 0; |
| + |
| + nhlt = intel_nhlt_init(&pci->dev); |
| + if (nhlt) { |
| + if (intel_nhlt_get_dmic_geo(&pci->dev, nhlt)) |
| + ret = 1; |
| + intel_nhlt_free(nhlt); |
| + } |
| + return ret; |
| +} |
| + |
| +int snd_intel_dsp_driver_probe(struct pci_dev *pci) |
| +{ |
| + const struct config_entry *cfg; |
| + |
| + if (dsp_driver > 0 && dsp_driver <= SND_INTEL_DSP_DRIVER_LAST) |
| + return dsp_driver; |
| + |
| + /* Intel vendor only */ |
| + if (snd_BUG_ON(pci->vendor != 0x8086)) |
| + return SND_INTEL_DSP_DRIVER_ANY; |
| + |
| + /* |
| + * detect DSP by checking class/subclass/prog-id information |
| + * class=04 subclass 03 prog-if 00: no DSP, use legacy driver |
| + * class=04 subclass 01 prog-if 00: DSP is present |
| + * (and may be required e.g. for DMIC or SSP support) |
| + * class=04 subclass 03 prog-if 80: use DSP or legacy mode |
| + */ |
| + if (pci->class == 0x040300) |
| + return SND_INTEL_DSP_DRIVER_LEGACY; |
| + if (pci->class != 0x040100 && pci->class != 0x040380) { |
| + dev_err(&pci->dev, "Unknown PCI class/subclass/prog-if information (0x%06x) found, selecting HDA legacy driver\n", pci->class); |
| + return SND_INTEL_DSP_DRIVER_LEGACY; |
| + } |
| + |
| + dev_info(&pci->dev, "DSP detected with PCI class/subclass/prog-if info 0x%06x\n", pci->class); |
| + |
| + /* find the configuration for the specific device */ |
| + cfg = snd_intel_dsp_find_config(pci, config_table, ARRAY_SIZE(config_table)); |
| + if (!cfg) |
| + return SND_INTEL_DSP_DRIVER_ANY; |
| + |
| + if (cfg->flags & FLAG_SOF) { |
| + if (cfg->flags & FLAG_SOF_ONLY_IF_DMIC) { |
| + if (snd_intel_dsp_check_dmic(pci)) { |
| + dev_info(&pci->dev, "Digital mics found on Skylake+ platform, using SOF driver\n"); |
| + return SND_INTEL_DSP_DRIVER_SOF; |
| + } |
| + } else { |
| + return SND_INTEL_DSP_DRIVER_SOF; |
| + } |
| + } |
| + |
| + if (cfg->flags & FLAG_SST) |
| + return SND_INTEL_DSP_DRIVER_SST; |
| + |
| + return SND_INTEL_DSP_DRIVER_LEGACY; |
| +} |
| +EXPORT_SYMBOL_GPL(snd_intel_dsp_driver_probe); |
| + |
| +MODULE_LICENSE("GPL v2"); |
| +MODULE_DESCRIPTION("Intel DSP config driver"); |
| diff --git a/sound/hda/intel-nhlt.c b/sound/hda/intel-nhlt.c |
| index daede96f28ee..097ff6c10099 100644 |
| |
| |
| @@ -102,6 +102,3 @@ int intel_nhlt_get_dmic_geo(struct device *dev, struct nhlt_acpi_table *nhlt) |
| return dmic_geo; |
| } |
| EXPORT_SYMBOL_GPL(intel_nhlt_get_dmic_geo); |
| - |
| -MODULE_LICENSE("GPL v2"); |
| -MODULE_DESCRIPTION("Intel NHLT driver"); |
| diff --git a/sound/pci/hda/Kconfig b/sound/pci/hda/Kconfig |
| index dae47a45b2b8..bd48335d09d7 100644 |
| |
| |
| @@ -12,7 +12,7 @@ config SND_HDA_INTEL |
| tristate "HD Audio PCI" |
| depends on SND_PCI |
| select SND_HDA |
| - select SND_INTEL_NHLT if ACPI |
| + select SND_INTEL_DSP_CONFIG |
| help |
| Say Y here to include support for Intel "High Definition |
| Audio" (Azalia) and its compatible devices. |
| @@ -23,15 +23,6 @@ config SND_HDA_INTEL |
| To compile this driver as a module, choose M here: the module |
| will be called snd-hda-intel. |
| |
| -config SND_HDA_INTEL_DETECT_DMIC |
| - bool "DMIC detection and probe abort" |
| - depends on SND_HDA_INTEL |
| - help |
| - Say Y to detect digital microphones on SKL+ devices. DMICs |
| - cannot be handled by the HDaudio legacy driver and are |
| - currently only supported by the SOF driver. |
| - If unsure say N. |
| - |
| config SND_HDA_TEGRA |
| tristate "NVIDIA Tegra HD Audio" |
| depends on ARCH_TEGRA |
| diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
| index 85beb172d810..2888f710e7e1 100644 |
| |
| |
| @@ -46,7 +46,7 @@ |
| #include <sound/initval.h> |
| #include <sound/hdaudio.h> |
| #include <sound/hda_i915.h> |
| -#include <sound/intel-nhlt.h> |
| +#include <sound/intel-dsp-config.h> |
| #include <linux/vgaarb.h> |
| #include <linux/vga_switcheroo.h> |
| #include <linux/firmware.h> |
| @@ -124,7 +124,7 @@ static char *patch[SNDRV_CARDS]; |
| static bool beep_mode[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = |
| CONFIG_SND_HDA_INPUT_BEEP_MODE}; |
| #endif |
| -static bool dmic_detect = IS_ENABLED(CONFIG_SND_HDA_INTEL_DETECT_DMIC); |
| +static bool dsp_driver = 1; |
| |
| module_param_array(index, int, NULL, 0444); |
| MODULE_PARM_DESC(index, "Index value for Intel HD audio interface."); |
| @@ -159,8 +159,9 @@ module_param_array(beep_mode, bool, NULL, 0444); |
| MODULE_PARM_DESC(beep_mode, "Select HDA Beep registration mode " |
| "(0=off, 1=on) (default=1)."); |
| #endif |
| -module_param(dmic_detect, bool, 0444); |
| -MODULE_PARM_DESC(dmic_detect, "DMIC detect on SKL+ platforms"); |
| +module_param(dsp_driver, bool, 0444); |
| +MODULE_PARM_DESC(dsp_driver, "Allow DSP driver selection (bypass this driver) " |
| + "(0=off, 1=on) (default=1)"); |
| |
| #ifdef CONFIG_PM |
| static int param_set_xint(const char *val, const struct kernel_param *kp); |
| @@ -2030,25 +2031,6 @@ static const struct hda_controller_ops pci_hda_ops = { |
| .position_check = azx_position_check, |
| }; |
| |
| -static int azx_check_dmic(struct pci_dev *pci, struct azx *chip) |
| -{ |
| - struct nhlt_acpi_table *nhlt; |
| - int ret = 0; |
| - |
| - if (chip->driver_type == AZX_DRIVER_SKL && |
| - pci->class != 0x040300) { |
| - nhlt = intel_nhlt_init(&pci->dev); |
| - if (nhlt) { |
| - if (intel_nhlt_get_dmic_geo(&pci->dev, nhlt)) { |
| - ret = -ENODEV; |
| - dev_info(&pci->dev, "Digital mics found on Skylake+ platform, aborting probe\n"); |
| - } |
| - intel_nhlt_free(nhlt); |
| - } |
| - } |
| - return ret; |
| -} |
| - |
| static int azx_probe(struct pci_dev *pci, |
| const struct pci_device_id *pci_id) |
| { |
| @@ -2066,6 +2048,16 @@ static int azx_probe(struct pci_dev *pci, |
| return -ENOENT; |
| } |
| |
| + /* |
| + * stop probe if another Intel's DSP driver should be activated |
| + */ |
| + if (dsp_driver) { |
| + err = snd_intel_dsp_driver_probe(pci); |
| + if (err != SND_INTEL_DSP_DRIVER_ANY && |
| + err != SND_INTEL_DSP_DRIVER_LEGACY) |
| + return -ENODEV; |
| + } |
| + |
| err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, |
| 0, &card); |
| if (err < 0) { |
| @@ -2079,17 +2071,6 @@ static int azx_probe(struct pci_dev *pci, |
| card->private_data = chip; |
| hda = container_of(chip, struct hda_intel, chip); |
| |
| - /* |
| - * stop probe if digital microphones detected on Skylake+ platform |
| - * with the DSP enabled. This is an opt-in behavior defined at build |
| - * time or at run-time with a module parameter |
| - */ |
| - if (dmic_detect) { |
| - err = azx_check_dmic(pci, chip); |
| - if (err < 0) |
| - goto out_free; |
| - } |
| - |
| pci_set_drvdata(pci, card); |
| |
| err = register_vga_switcheroo(chip); |
| diff --git a/sound/soc/intel/Kconfig b/sound/soc/intel/Kconfig |
| index ef493cae78ff..c15230cec851 100644 |
| |
| |
| @@ -218,7 +218,7 @@ config SND_SOC_INTEL_SKYLAKE_COMMON |
| select SND_SOC_INTEL_SST |
| select SND_SOC_HDAC_HDA if SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC |
| select SND_SOC_ACPI_INTEL_MATCH |
| - select SND_INTEL_NHLT if ACPI |
| + select SND_INTEL_DSP_CONFIG |
| help |
| If you have a Intel Skylake/Broxton/ApolloLake/KabyLake/ |
| GeminiLake or CannonLake platform with the DSP enabled in the BIOS |
| diff --git a/sound/soc/intel/skylake/skl.c b/sound/soc/intel/skylake/skl.c |
| index 141dbbf975ac..58ba3e9469ba 100644 |
| |
| |
| @@ -27,6 +27,7 @@ |
| #include <sound/hda_i915.h> |
| #include <sound/hda_codec.h> |
| #include <sound/intel-nhlt.h> |
| +#include <sound/intel-dsp-config.h> |
| #include "skl.h" |
| #include "skl-sst-dsp.h" |
| #include "skl-sst-ipc.h" |
| @@ -987,22 +988,10 @@ static int skl_probe(struct pci_dev *pci, |
| |
| switch (skl_pci_binding) { |
| case SND_SKL_PCI_BIND_AUTO: |
| - /* |
| - * detect DSP by checking class/subclass/prog-id information |
| - * class=04 subclass 03 prog-if 00: no DSP, use legacy driver |
| - * class=04 subclass 01 prog-if 00: DSP is present |
| - * (and may be required e.g. for DMIC or SSP support) |
| - * class=04 subclass 03 prog-if 80: use DSP or legacy mode |
| - */ |
| - if (pci->class == 0x040300) { |
| - dev_info(&pci->dev, "The DSP is not enabled on this platform, aborting probe\n"); |
| + err = snd_intel_dsp_driver_probe(pci); |
| + if (err != SND_INTEL_DSP_DRIVER_ANY && |
| + err != SND_INTEL_DSP_DRIVER_SST) |
| return -ENODEV; |
| - } |
| - if (pci->class != 0x040100 && pci->class != 0x040380) { |
| - dev_err(&pci->dev, "Unknown PCI class/subclass/prog-if information (0x%06x) found, aborting probe\n", pci->class); |
| - return -ENODEV; |
| - } |
| - dev_info(&pci->dev, "DSP detected with PCI class/subclass/prog-if info 0x%06x\n", pci->class); |
| break; |
| case SND_SKL_PCI_BIND_LEGACY: |
| dev_info(&pci->dev, "Module parameter forced binding with HDaudio legacy, aborting probe\n"); |
| diff --git a/sound/soc/sof/intel/Kconfig b/sound/soc/sof/intel/Kconfig |
| index 8421b97d949e..d6d65e70eebb 100644 |
| |
| |
| @@ -304,7 +304,7 @@ config SND_SOC_SOF_HDA |
| tristate |
| select SND_HDA_EXT_CORE if SND_SOC_SOF_HDA_LINK |
| select SND_SOC_HDAC_HDA if SND_SOC_SOF_HDA_AUDIO_CODEC |
| - select SND_INTEL_NHLT if ACPI |
| + select SND_INTEL_DSP_CONFIG |
| help |
| This option is not user-selectable but automagically handled by |
| 'select' statements at a higher level |
| diff --git a/sound/soc/sof/sof-pci-dev.c b/sound/soc/sof/sof-pci-dev.c |
| index d66412a77873..3a9e0e2a150d 100644 |
| |
| |
| @@ -12,6 +12,7 @@ |
| #include <linux/module.h> |
| #include <linux/pci.h> |
| #include <linux/pm_runtime.h> |
| +#include <sound/intel-dsp-config.h> |
| #include <sound/soc-acpi.h> |
| #include <sound/soc-acpi-intel-match.h> |
| #include <sound/sof.h> |
| @@ -277,6 +278,11 @@ static int sof_pci_probe(struct pci_dev *pci, |
| const struct snd_sof_dsp_ops *ops; |
| int ret; |
| |
| + ret = snd_intel_dsp_driver_probe(pci); |
| + if (ret != SND_INTEL_DSP_DRIVER_ANY && |
| + ret != SND_INTEL_DSP_DRIVER_SOF) |
| + return -ENODEV; |
| + |
| dev_dbg(&pci->dev, "PCI DSP detected"); |
| |
| /* get ops for platform */ |
| -- |
| 2.24.1 |
| |
| From 08086a70efd7f4db4645e2a7b60b2aba4b620b18 Mon Sep 17 00:00:00 2001 |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Date: Tue, 22 Oct 2019 19:43:13 +0200 |
| Subject: [PATCH 005/109] ALSA: hda: fix intel DSP config |
| |
| Reshuffle list of devices by historical order and add correct |
| information as needed. |
| |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Signed-off-by: Jaroslav Kysela <perex@perex.cz> |
| Link: https://lore.kernel.org/r/20191022174313.29087-2-perex@perex.cz |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit cc8f81c7e625168a60843b2b39e3a327cf5170fe) |
| Bugzilla: 1772498 |
| |
| sound/hda/intel-dsp-config.c | 220 ++++++++++++++++++++++++++--------- |
| 1 file changed, 164 insertions(+), 56 deletions(-) |
| |
| diff --git a/sound/hda/intel-dsp-config.c b/sound/hda/intel-dsp-config.c |
| index d9f6d9e872b4..0b2a7201a46a 100644 |
| |
| |
| @@ -30,45 +30,98 @@ struct config_entry { |
| * - the first successful match will win |
| */ |
| static const struct config_entry config_table[] = { |
| -/* Cometlake-LP */ |
| -#if IS_ENABLED(CONFIG_SND_SOC_INTEL_CML_LP) |
| +/* Merrifield */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_MERRIFIELD) |
| { |
| - /* prefer SST */ |
| - .flags = FLAG_SST, |
| - .device = 0x02c8, |
| + .flags = FLAG_SOF, |
| + .device = 0x119a, |
| }, |
| -#elif IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_LP) |
| +#endif |
| +/* Broxton-T */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_APOLLOLAKE) |
| { |
| .flags = FLAG_SOF, |
| - .device = 0x02c8, |
| + .device = 0x1a98, |
| }, |
| #endif |
| -/* Cometlake-H */ |
| -#if IS_ENABLED(CONFIG_SND_SOC_INTEL_CML_H) |
| +/* |
| + * Apollolake (Broxton-P) |
| + * the legacy HDaudio driver is used except on Up Squared (SOF) and |
| + * Chromebooks (SST) |
| + */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_APOLLOLAKE) |
| { |
| - .flags = FLAG_SST, |
| - .device = 0x06c8, |
| + .flags = FLAG_SOF, |
| + .device = 0x5a98, |
| + .dmi_table = (const struct dmi_system_id []) { |
| + { |
| + .ident = "Up Squared", |
| + .matches = { |
| + DMI_MATCH(DMI_SYS_VENDOR, "AAEON"), |
| + DMI_MATCH(DMI_BOARD_NAME, "UP-APL01"), |
| + } |
| + }, |
| + {} |
| + } |
| }, |
| -#elif IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_H) |
| +#endif |
| +#if IS_ENABLED(CONFIG_SND_SOC_INTEL_APL) |
| { |
| - .flags = FLAG_SOF, |
| - .device = 0x06c8, |
| + .flags = FLAG_SST, |
| + .device = 0x5a98, |
| + .dmi_table = (const struct dmi_system_id []) { |
| + { |
| + .ident = "Google Chromebooks", |
| + .matches = { |
| + DMI_MATCH(DMI_SYS_VENDOR, "Google"), |
| + } |
| + }, |
| + {} |
| + } |
| }, |
| #endif |
| -/* Merrifield */ |
| -#if IS_ENABLED(CONFIG_SND_SOC_SOF_MERRIFIELD) |
| +/* |
| + * Skylake and Kabylake use legacy HDaudio driver except for Google |
| + * Chromebooks (SST) |
| + */ |
| + |
| +/* Sunrise Point-LP */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_INTEL_SKL) |
| { |
| - .flags = FLAG_SOF, |
| - .device = 0x119a, |
| + .flags = FLAG_SST, |
| + .device = 0x9d70, |
| + .dmi_table = (const struct dmi_system_id []) { |
| + { |
| + .ident = "Google Chromebooks", |
| + .matches = { |
| + DMI_MATCH(DMI_SYS_VENDOR, "Google"), |
| + } |
| + }, |
| + {} |
| + } |
| }, |
| #endif |
| -/* Broxton-T */ |
| -#if IS_ENABLED(CONFIG_SND_SOC_SOF_APOLLOLAKE) |
| +/* Kabylake-LP */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_INTEL_KBL) |
| { |
| - .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC, |
| - .device = 0x1a98, |
| + .flags = FLAG_SST, |
| + .device = 0x9d71, |
| + .dmi_table = (const struct dmi_system_id []) { |
| + { |
| + .ident = "Google Chromebooks", |
| + .matches = { |
| + DMI_MATCH(DMI_SYS_VENDOR, "Google"), |
| + } |
| + }, |
| + {} |
| + } |
| }, |
| #endif |
| + |
| +/* |
| + * Geminilake uses legacy HDaudio driver except for Google |
| + * Chromebooks |
| + */ |
| /* Geminilake */ |
| #if IS_ENABLED(CONFIG_SND_SOC_SOF_GEMINILAKE) |
| { |
| @@ -85,84 +138,139 @@ static const struct config_entry config_table[] = { |
| } |
| }, |
| #endif |
| -#if IS_ENABLED(CONFIG_SND_SOC_INTEL_GLK) |
| + |
| +/* |
| + * CoffeeLake, CannonLake, CometLake, IceLake, TigerLake use legacy |
| + * HDaudio driver except for Google Chromebooks and when DMICs are |
| + * present. Two cases are required since Coreboot does not expose NHLT |
| + * tables. |
| + * |
| + * When the Chromebook quirk is not present, it's based on information |
| + * that no such device exists. When the quirk is present, it could be |
| + * either based on product information or a placeholder. |
| + */ |
| + |
| +/* Cannonlake */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_CANNONLAKE) |
| { |
| - .flags = FLAG_SST, |
| - .device = 0x3198, |
| + .flags = FLAG_SOF, |
| + .device = 0x9dc8, |
| + .dmi_table = (const struct dmi_system_id []) { |
| + { |
| + .ident = "Google Chromebooks", |
| + .matches = { |
| + DMI_MATCH(DMI_SYS_VENDOR, "Google"), |
| + } |
| + }, |
| + {} |
| + } |
| }, |
| -#endif |
| -/* Icelake */ |
| -#if IS_ENABLED(CONFIG_SND_SOC_SOF_ICELAKE) |
| { |
| .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC, |
| - .device = 0x34c8, |
| + .device = 0x9dc8, |
| }, |
| #endif |
| -/* Elkhart Lake */ |
| -#if IS_ENABLED(CONFIG_SND_SOC_SOF_ELKHARTLAKE) |
| + |
| +/* Coffelake */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_COFFEELAKE) |
| + { |
| + .flags = FLAG_SOF, |
| + .device = 0xa348, |
| + .dmi_table = (const struct dmi_system_id []) { |
| + { |
| + .ident = "Google Chromebooks", |
| + .matches = { |
| + DMI_MATCH(DMI_SYS_VENDOR, "Google"), |
| + } |
| + }, |
| + {} |
| + } |
| + }, |
| { |
| .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC, |
| - .device = 0x4b55, |
| + .device = 0xa348, |
| }, |
| #endif |
| -/* Appololake (Broxton-P) */ |
| -#if IS_ENABLED(CONFIG_SND_SOC_SOF_APOLLOLAKE) |
| + |
| +/* Cometlake-LP */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_LP) |
| { |
| .flags = FLAG_SOF, |
| - .device = 0x5a98, |
| + .device = 0x02c8, |
| .dmi_table = (const struct dmi_system_id []) { |
| { |
| - .ident = "Up Squared", |
| + .ident = "Google Chromebooks", |
| .matches = { |
| - DMI_MATCH(DMI_SYS_VENDOR, "AAEON"), |
| - DMI_MATCH(DMI_BOARD_NAME, "UP-APL01"), |
| + DMI_MATCH(DMI_SYS_VENDOR, "Google"), |
| } |
| }, |
| {} |
| } |
| }, |
| -#endif |
| -#if IS_ENABLED(CONFIG_SND_SOC_INTEL_APL) |
| { |
| - .flags = FLAG_SST, |
| - .device = 0x5a98, |
| + .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC, |
| + .device = 0x02c8, |
| }, |
| #endif |
| -/* Cannonlake */ |
| -#if IS_ENABLED(CONFIG_SND_SOC_SOF_CANNONLAKE) |
| +/* Cometlake-H */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_H) |
| { |
| .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC, |
| - .device = 0x9dc8, |
| + .device = 0x06c8, |
| }, |
| #endif |
| -/* Sunrise Point-LP */ |
| -#if IS_ENABLED(CONFIG_SND_SOC_SOF_SKYLAKE) |
| + |
| +/* Icelake */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_ICELAKE) |
| { |
| - .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC, |
| - .device = 0x9d70, |
| + .flags = FLAG_SOF, |
| + .device = 0x34c8, |
| + .dmi_table = (const struct dmi_system_id []) { |
| + { |
| + .ident = "Google Chromebooks", |
| + .matches = { |
| + DMI_MATCH(DMI_SYS_VENDOR, "Google"), |
| + } |
| + }, |
| + {} |
| + } |
| }, |
| -#endif |
| -/* Kabylake-LP */ |
| -#if IS_ENABLED(CONFIG_SND_SOC_SOF_KABYLAKE) |
| { |
| .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC, |
| - .device = 0x9d71, |
| + .device = 0x34c8, |
| }, |
| #endif |
| + |
| /* Tigerlake */ |
| #if IS_ENABLED(CONFIG_SND_SOC_SOF_TIGERLAKE) |
| + { |
| + .flags = FLAG_SOF, |
| + .device = 0xa0c8, |
| + .dmi_table = (const struct dmi_system_id []) { |
| + { |
| + .ident = "Google Chromebooks", |
| + .matches = { |
| + DMI_MATCH(DMI_SYS_VENDOR, "Google"), |
| + } |
| + }, |
| + {} |
| + } |
| + }, |
| + |
| { |
| .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC, |
| .device = 0xa0c8, |
| }, |
| #endif |
| -/* Coffelake */ |
| -#if IS_ENABLED(CONFIG_SND_SOC_SOF_COFFEELAKE) |
| + |
| +/* Elkhart Lake */ |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_ELKHARTLAKE) |
| { |
| .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC, |
| - .device = 0xa348, |
| + .device = 0x4b55, |
| }, |
| #endif |
| + |
| }; |
| |
| static const struct config_entry *snd_intel_dsp_find_config |
| -- |
| 2.24.1 |
| |
| From 5cd51df6f836090343aadd7ea4eacfde511660ad Mon Sep 17 00:00:00 2001 |
| From: Jaroslav Kysela <perex@perex.cz> |
| Date: Mon, 28 Oct 2019 17:46:24 +0100 |
| Subject: [PATCH 006/109] ASoC: intel - fix the card names |
| |
| Those strings are exposed to the user space as the |
| card name thus used in the GUIs. The common |
| standard is to avoid '_' here. The worst case |
| is 'sof-skl_hda_card' string. |
| |
| Signed-off-by: Jaroslav Kysela <perex@perex.cz> |
| Cc: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Cc: Mark Brown <broonie@kernel.org> |
| Acked-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191028164624.14334-1-perex@perex.cz |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit d745cc1ab65945b2d17ec9c5652f38299c054649) |
| Bugzilla: 1772498 |
| |
| sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c | 2 +- |
| sound/soc/intel/boards/skl_hda_dsp_generic.c | 2 +- |
| sound/soc/intel/boards/sof_rt5682.c | 2 +- |
| 3 files changed, 3 insertions(+), 3 deletions(-) |
| |
| diff --git a/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c b/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c |
| index 67b276a65a8d..8ad31c91fc75 100644 |
| |
| |
| @@ -626,7 +626,7 @@ static int kabylake_card_late_probe(struct snd_soc_card *card) |
| * kabylake audio machine driver for MAX98927 + RT5514 + RT5663 |
| */ |
| static struct snd_soc_card kabylake_audio_card = { |
| - .name = "kbl_r5514_5663_max", |
| + .name = "kbl-r5514-5663-max", |
| .owner = THIS_MODULE, |
| .dai_link = kabylake_dais, |
| .num_links = ARRAY_SIZE(kabylake_dais), |
| diff --git a/sound/soc/intel/boards/skl_hda_dsp_generic.c b/sound/soc/intel/boards/skl_hda_dsp_generic.c |
| index 1778acdc367c..e8d676c192f6 100644 |
| |
| |
| @@ -90,7 +90,7 @@ skl_hda_add_dai_link(struct snd_soc_card *card, struct snd_soc_dai_link *link) |
| } |
| |
| static struct snd_soc_card hda_soc_card = { |
| - .name = "skl_hda_card", |
| + .name = "hda-dsp", |
| .owner = THIS_MODULE, |
| .dai_link = skl_hda_be_dai_links, |
| .dapm_widgets = skl_hda_widgets, |
| diff --git a/sound/soc/intel/boards/sof_rt5682.c b/sound/soc/intel/boards/sof_rt5682.c |
| index 4f6e58c3954a..320a9b9273db 100644 |
| |
| |
| @@ -370,7 +370,7 @@ static int dmic_init(struct snd_soc_pcm_runtime *rtd) |
| |
| /* sof audio machine driver for rt5682 codec */ |
| static struct snd_soc_card sof_audio_card_rt5682 = { |
| - .name = "sof_rt5682", |
| + .name = "rt5682", /* the sof- prefix is added by the core */ |
| .owner = THIS_MODULE, |
| .controls = sof_controls, |
| .num_controls = ARRAY_SIZE(sof_controls), |
| -- |
| 2.24.1 |
| |
| From 6d7c3f54de921a90a4ec08f5c9570222d9f647f3 Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Mon, 28 Oct 2019 14:06:34 +0100 |
| Subject: [PATCH 007/109] ALSA: hda: Allow non-Intel device probe gracefully |
| |
| The recent addition of snd_intel_dsp_driver_probe() check caused a |
| spurious kernel warning when the driver is loaded for a non-Intel |
| hardware due to snd_BUG_ON(). Moreover, for such a hardware, we |
| should always return SND_INTEL_DSP_DRIVER_ANY, not check the |
| dsp_driver option at all. |
| |
| This patch fixes these issues for non-Intel devices. |
| |
| Fixes: 82d9d54a6c0e ("ALSA: hda: add Intel DSP configuration / probe code") |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Link: https://lore.kernel.org/r/20191028130634.3501-1-tiwai@suse.de |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 91636a82044a2821201b54faac4d1d2425260842) |
| Bugzilla: 1772498 |
| |
| sound/hda/intel-dsp-config.c | 8 ++++---- |
| 1 file changed, 4 insertions(+), 4 deletions(-) |
| |
| diff --git a/sound/hda/intel-dsp-config.c b/sound/hda/intel-dsp-config.c |
| index 0b2a7201a46a..be1df80ed013 100644 |
| |
| |
| @@ -307,13 +307,13 @@ int snd_intel_dsp_driver_probe(struct pci_dev *pci) |
| { |
| const struct config_entry *cfg; |
| |
| - if (dsp_driver > 0 && dsp_driver <= SND_INTEL_DSP_DRIVER_LAST) |
| - return dsp_driver; |
| - |
| /* Intel vendor only */ |
| - if (snd_BUG_ON(pci->vendor != 0x8086)) |
| + if (pci->vendor != 0x8086) |
| return SND_INTEL_DSP_DRIVER_ANY; |
| |
| + if (dsp_driver > 0 && dsp_driver <= SND_INTEL_DSP_DRIVER_LAST) |
| + return dsp_driver; |
| + |
| /* |
| * detect DSP by checking class/subclass/prog-id information |
| * class=04 subclass 03 prog-if 00: no DSP, use legacy driver |
| -- |
| 2.24.1 |
| |
| From d1e23b8b780640a6bcf75c854857034c45cd99f2 Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Tue, 5 Nov 2019 09:18:06 +0100 |
| Subject: [PATCH 008/109] ALSA: hda: Disable regmap internal locking |
| |
| Since we apply the own mutex (bus->cmd_mutex) in HDA core side, the |
| internal locking in regmap is superfluous. This patch adds the flag |
| to indicate that. |
| |
| Also, an infamous side-effect by this change is that it disables the |
| regmap debugfs, too, and this is seen rather good; the regmap debugfs |
| isn't quite useful for HD-audio as it provides the very sparse |
| registers and its debugfs access tends to lead to the way too high |
| resource usages or sometimes hang up. So it'd be rather safe to |
| disable it altogether. |
| |
| Link: https://lore.kernel.org/r/2029139028.10333037.1572874551626.JavaMail.zimbra@redhat.com |
| Link: https://lore.kernel.org/r/20191105081806.4896-1-tiwai@suse.de |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 42ec336f1f9d54049811b749f729e9e01c152ade) |
| Bugzilla: 1772498 |
| |
| sound/hda/hdac_regmap.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| diff --git a/sound/hda/hdac_regmap.c b/sound/hda/hdac_regmap.c |
| index 286361ecd640..906b1e20bae0 100644 |
| |
| |
| @@ -363,6 +363,7 @@ static const struct regmap_config hda_regmap_cfg = { |
| .reg_write = hda_reg_write, |
| .use_single_read = true, |
| .use_single_write = true, |
| + .disable_locking = true, |
| }; |
| |
| /** |
| -- |
| 2.24.1 |
| |
| From 0f9c61a795f0ad4faab0582c7b792cebd85976c2 Mon Sep 17 00:00:00 2001 |
| From: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Date: Tue, 29 Oct 2019 15:40:09 +0200 |
| Subject: [PATCH 009/109] ALSA: hda/hdmi - implement mst_no_extra_pcms flag |
| |
| To support the DP-MST multiple streams via single connector feature, |
| the HDMI driver was extended with the concept of backup PCMs. See |
| commit 9152085defb6 ("ALSA: hda - add DP MST audio support"). |
| |
| This implementation works fine with snd_hda_intel.c as PCM topology |
| is fully managed within the single driver. |
| |
| When the HDA codec driver is used from ASoC components, the concept |
| of backup PCMs no longer fits. For ASoC topologies, the physical |
| HDMI converters are presented as backend DAIs and these should match |
| with hardware capabilities. The ASoC topology may define arbitrary |
| PCMs (i.e. frontend DAIs) and have processing elements before eventual |
| routing to the HDMI BE DAIs. With backup PCMs, the link between |
| FE and BE DAIs would become dynamic and change when monitors are |
| (un)plugged. This would lead to modifying the topology every time |
| hotplug events happen, which is not currently possible in ASoC and |
| there does not seem to be any obvious benefits from this design. |
| |
| To overcome above problems and enable the HDMI driver to be used |
| from ASoC, this patch adds a new mode (mst_no_extra_pcms flags) to |
| patch_hdmi.c. In this mode, the codec driver does not assume |
| the backup PCMs to be created. |
| |
| Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Reviewed-by: Takashi Iwai <tiwai@suse.de> |
| Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191029134017.18901-2-kai.vehmanen@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 2a2edfbbfee47947dd05f5860c66c0e80ee5e09d) |
| Bugzilla: 1772498 |
| |
| include/sound/hda_codec.h | 1 + |
| sound/pci/hda/patch_hdmi.c | 19 ++++++++++++++----- |
| 2 files changed, 15 insertions(+), 5 deletions(-) |
| |
| diff --git a/include/sound/hda_codec.h b/include/sound/hda_codec.h |
| index 9a0393cf024c..ac18f428eda6 100644 |
| |
| |
| @@ -254,6 +254,7 @@ struct hda_codec { |
| unsigned int force_pin_prefix:1; /* Add location prefix */ |
| unsigned int link_down_at_suspend:1; /* link down at runtime suspend */ |
| unsigned int relaxed_resume:1; /* don't resume forcibly for jack */ |
| + unsigned int mst_no_extra_pcms:1; /* no backup PCMs for DP-MST */ |
| |
| #ifdef CONFIG_PM |
| unsigned long power_on_acct; |
| diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c |
| index 8ac805a634f4..1a29453bc26f 100644 |
| |
| |
| @@ -2082,15 +2082,24 @@ static bool is_hdmi_pcm_attached(struct hdac_device *hdac, int pcm_idx) |
| static int generic_hdmi_build_pcms(struct hda_codec *codec) |
| { |
| struct hdmi_spec *spec = codec->spec; |
| - int idx; |
| + int idx, pcm_num; |
| |
| /* |
| * for non-mst mode, pcm number is the same as before |
| - * for DP MST mode, pcm number is (nid number + dev_num - 1) |
| - * dev_num is the device entry number in a pin |
| - * |
| + * for DP MST mode without extra PCM, pcm number is same |
| + * for DP MST mode with extra PCMs, pcm number is |
| + * (nid number + dev_num - 1) |
| + * dev_num is the device entry number in a pin |
| */ |
| - for (idx = 0; idx < spec->num_nids + spec->dev_num - 1; idx++) { |
| + |
| + if (codec->mst_no_extra_pcms) |
| + pcm_num = spec->num_nids; |
| + else |
| + pcm_num = spec->num_nids + spec->dev_num - 1; |
| + |
| + codec_dbg(codec, "hdmi: pcm_num set to %d\n", pcm_num); |
| + |
| + for (idx = 0; idx < pcm_num; idx++) { |
| struct hda_pcm *info; |
| struct hda_pcm_stream *pstr; |
| |
| -- |
| 2.24.1 |
| |
| From 33115cd895693c04723026e19a9eee0f34c4b853 Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Mon, 11 Nov 2019 20:09:37 +0100 |
| Subject: [PATCH 010/109] ALSA: hda/hdmi - Clean up Intel platform-specific |
| fixup checks |
| |
| Introduce a new flag in hdmi_spec to indicate the Intel platform- |
| specific fixups so that we can get rid of the lengthy codec ID |
| checks. The flag is set in intel_hsw_common_init() commonly. |
| |
| Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191111190937.19186-1-tiwai@suse.de |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit cb45722b289b54476b68883985c2824c69a7fba9) |
| Bugzilla: 1772498 |
| |
| sound/pci/hda/patch_hdmi.c | 27 +++++---------------------- |
| 1 file changed, 5 insertions(+), 22 deletions(-) |
| |
| diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c |
| index 1a29453bc26f..3f97a04de197 100644 |
| |
| |
| @@ -38,25 +38,6 @@ static bool static_hdmi_pcm; |
| module_param(static_hdmi_pcm, bool, 0644); |
| MODULE_PARM_DESC(static_hdmi_pcm, "Don't restrict PCM parameters per ELD info"); |
| |
| -#define is_haswell(codec) ((codec)->core.vendor_id == 0x80862807) |
| -#define is_broadwell(codec) ((codec)->core.vendor_id == 0x80862808) |
| -#define is_skylake(codec) ((codec)->core.vendor_id == 0x80862809) |
| -#define is_broxton(codec) ((codec)->core.vendor_id == 0x8086280a) |
| -#define is_kabylake(codec) ((codec)->core.vendor_id == 0x8086280b) |
| -#define is_geminilake(codec) (((codec)->core.vendor_id == 0x8086280d) || \ |
| - ((codec)->core.vendor_id == 0x80862800)) |
| -#define is_cannonlake(codec) ((codec)->core.vendor_id == 0x8086280c) |
| -#define is_icelake(codec) ((codec)->core.vendor_id == 0x8086280f) |
| -#define is_tigerlake(codec) ((codec)->core.vendor_id == 0x80862812) |
| -#define is_haswell_plus(codec) (is_haswell(codec) || is_broadwell(codec) \ |
| - || is_skylake(codec) || is_broxton(codec) \ |
| - || is_kabylake(codec) || is_geminilake(codec) \ |
| - || is_cannonlake(codec) || is_icelake(codec) \ |
| - || is_tigerlake(codec)) |
| -#define is_valleyview(codec) ((codec)->core.vendor_id == 0x80862882) |
| -#define is_cherryview(codec) ((codec)->core.vendor_id == 0x80862883) |
| -#define is_valleyview_plus(codec) (is_valleyview(codec) || is_cherryview(codec)) |
| - |
| struct hdmi_spec_per_cvt { |
| hda_nid_t cvt_nid; |
| int assigned; |
| @@ -163,6 +144,7 @@ struct hdmi_spec { |
| |
| bool dyn_pin_out; |
| bool dyn_pcm_assign; |
| + bool intel_hsw_fixup; /* apply Intel platform-specific fixups */ |
| /* |
| * Non-generic VIA/NVIDIA specific |
| */ |
| @@ -926,7 +908,7 @@ static int hdmi_setup_stream(struct hda_codec *codec, hda_nid_t cvt_nid, |
| return err; |
| } |
| |
| - if (is_haswell_plus(codec)) { |
| + if (spec->intel_hsw_fixup) { |
| |
| /* |
| * on recent platforms IEC Coding Type is required for HBR |
| @@ -1714,7 +1696,7 @@ static int hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid) |
| * To simplify the implementation, malloc all |
| * the virtual pins in the initialization statically |
| */ |
| - if (is_haswell_plus(codec)) { |
| + if (spec->intel_hsw_fixup) { |
| /* |
| * On Intel platforms, device entries number is |
| * changed dynamically. If there is a DP MST |
| @@ -1763,7 +1745,7 @@ static int hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid) |
| per_pin->dev_id = i; |
| per_pin->non_pcm = false; |
| snd_hda_set_dev_select(codec, pin_nid, i); |
| - if (is_haswell_plus(codec)) |
| + if (spec->intel_hsw_fixup) |
| intel_haswell_fixup_connect_list(codec, pin_nid); |
| err = hdmi_read_pin_conn(codec, pin_idx); |
| if (err < 0) |
| @@ -2832,6 +2814,7 @@ static int intel_hsw_common_init(struct hda_codec *codec, hda_nid_t vendor_nid, |
| spec->vendor_nid = vendor_nid; |
| spec->port_map = port_map; |
| spec->port_num = port_num; |
| + spec->intel_hsw_fixup = true; |
| |
| intel_haswell_enable_all_pins(codec, true); |
| intel_haswell_fixup_enable_dp12(codec); |
| -- |
| 2.24.1 |
| |
| From 75ce7bbf2d5d1de529a07eca217e02a9897d0277 Mon Sep 17 00:00:00 2001 |
| From: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Date: Fri, 15 Nov 2019 14:44:47 +0200 |
| Subject: [PATCH 011/109] ALSA: hda: hdmi - fix port numbering for ICL and TGL |
| platforms |
| |
| Semantics of port#0 differ between ICL and TGL: |
| |
| ICL port#0 -> never used for HDAudio |
| ICL port#1 -> should be mapped to first pin (0x04) |
| TGL port#0 -> typically not used, but HW has the support, |
| so should be mapped to first pin (0x04) |
| TGL port#1 -> should be mapped to 2nd pin (0x06) |
| |
| Refactor the port mapping logic to allow to take the above |
| differences into account. Fixes issues with HDAudio on some |
| TGL platforms. |
| |
| Co-developed-by: Pan Xiuli <xiuli.pan@linux.intel.com> |
| Signed-off-by: Pan Xiuli <xiuli.pan@linux.intel.com> |
| Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191115124449.20512-2-kai.vehmanen@linux.intel.com |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit d577cf76fa3192f9e656bb101aa54d25a6a71347) |
| Bugzilla: 1772498 |
| |
| sound/pci/hda/patch_hdmi.c | 12 ++++++------ |
| 1 file changed, 6 insertions(+), 6 deletions(-) |
| |
| diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c |
| index 3f97a04de197..75f0d2799847 100644 |
| |
| |
| @@ -2671,7 +2671,7 @@ static int intel_pin2port(void *audio_ptr, int pin_nid) |
| */ |
| for (i = 0; i < spec->port_num; i++) { |
| if (pin_nid == spec->port_map[i]) |
| - return i + 1; |
| + return i; |
| } |
| |
| /* return -1 if pin number exceeds our expectation */ |
| @@ -2691,9 +2691,9 @@ static int intel_port2pin(struct hda_codec *codec, int port) |
| return port + intel_base_nid(codec) - 1; |
| } |
| |
| - if (port < 1 || port > spec->port_num) |
| + if (port < 0 || port >= spec->port_num) |
| return 0; |
| - return spec->port_map[port - 1]; |
| + return spec->port_map[port]; |
| } |
| |
| static void intel_pin_eld_notify(void *audio_ptr, int port, int pipe) |
| @@ -2845,9 +2845,9 @@ static int patch_i915_icl_hdmi(struct hda_codec *codec) |
| { |
| /* |
| * pin to port mapping table where the value indicate the pin number and |
| - * the index indicate the port number with 1 base. |
| + * the index indicate the port number. |
| */ |
| - static const int map[] = {0x4, 0x6, 0x8, 0xa, 0xb}; |
| + static const int map[] = {0x0, 0x4, 0x6, 0x8, 0xa, 0xb}; |
| |
| return intel_hsw_common_init(codec, 0x02, map, ARRAY_SIZE(map)); |
| } |
| @@ -2856,7 +2856,7 @@ static int patch_i915_tgl_hdmi(struct hda_codec *codec) |
| { |
| /* |
| * pin to port mapping table where the value indicate the pin number and |
| - * the index indicate the port number with 1 base. |
| + * the index indicate the port number. |
| */ |
| static const int map[] = {0x4, 0x6, 0x8, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf}; |
| |
| -- |
| 2.24.1 |
| |
| From a8196a93444f3ff34e15c254f68ee046bef27109 Mon Sep 17 00:00:00 2001 |
| From: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Date: Fri, 15 Nov 2019 14:44:48 +0200 |
| Subject: [PATCH 012/109] ALSA: hda: hdmi - remove redundant code comments |
| |
| Remove unnecessary comments related to pin mapping on |
| Intel platforms. |
| |
| Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191115124449.20512-3-kai.vehmanen@linux.intel.com |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit c8e3eb9be57f91751aeb9397118755390dbff9a4) |
| Bugzilla: 1772498 |
| |
| sound/pci/hda/patch_hdmi.c | 5 +---- |
| 1 file changed, 1 insertion(+), 4 deletions(-) |
| |
| diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c |
| index 75f0d2799847..2044bbb830f9 100644 |
| |
| |
| @@ -2662,7 +2662,7 @@ static int intel_pin2port(void *audio_ptr, int pin_nid) |
| base_nid = intel_base_nid(codec); |
| if (WARN_ON(pin_nid < base_nid || pin_nid >= base_nid + 3)) |
| return -1; |
| - return pin_nid - base_nid + 1; /* intel port is 1-based */ |
| + return pin_nid - base_nid + 1; |
| } |
| |
| /* |
| @@ -2674,7 +2674,6 @@ static int intel_pin2port(void *audio_ptr, int pin_nid) |
| return i; |
| } |
| |
| - /* return -1 if pin number exceeds our expectation */ |
| codec_info(codec, "Can't find the HDMI/DP port for pin %d\n", pin_nid); |
| return -1; |
| } |
| @@ -2687,7 +2686,6 @@ static int intel_port2pin(struct hda_codec *codec, int port) |
| /* we assume only from port-B to port-D */ |
| if (port < 1 || port > 3) |
| return 0; |
| - /* intel port is 1-based */ |
| return port + intel_base_nid(codec) - 1; |
| } |
| |
| @@ -2863,7 +2861,6 @@ static int patch_i915_tgl_hdmi(struct hda_codec *codec) |
| return intel_hsw_common_init(codec, 0x02, map, ARRAY_SIZE(map)); |
| } |
| |
| - |
| /* Intel Baytrail and Braswell; with eld notifier */ |
| static int patch_i915_byt_hdmi(struct hda_codec *codec) |
| { |
| -- |
| 2.24.1 |
| |
| From ad0389ef5e486a09a98cbfacd2bf56090b1346f1 Mon Sep 17 00:00:00 2001 |
| From: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Date: Fri, 15 Nov 2019 14:44:49 +0200 |
| Subject: [PATCH 013/109] ALSA: hda - remove forced polling workaround for CFL |
| and CNL |
| |
| Remove the workarounds added in commit fa763f1b2858 ("ALSA: |
| hda - Force polling mode on CNL for fixing codec communication") |
| and commit a8d7bde23e71 ("ALSA: hda - Force polling mode on CFL |
| for fixing codec communication"). |
| |
| The workarounds are no longer needed after the more generic |
| change done in commit 2756d9143aa5 ("ALSA: hda - Fix intermittent |
| CORB/RIRB stall on Intel chips"). This change applies to a larger |
| set of hardware and covers CFL and CNL as well. |
| |
| Similar change was already done to SOF DSP HDA driver with |
| no regressions detected. |
| |
| Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191115124449.20512-4-kai.vehmanen@linux.intel.com |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit ee906c6b9c6e7e4ad749f5cfdf65768455f4bf43) |
| Bugzilla: 1772498 |
| |
| sound/pci/hda/hda_intel.c | 6 ------ |
| 1 file changed, 6 deletions(-) |
| |
| diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
| index 2888f710e7e1..e2c08517a24c 100644 |
| |
| |
| @@ -370,8 +370,6 @@ enum { |
| ((pci)->device == 0x160c)) |
| |
| #define IS_BXT(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x5a98) |
| -#define IS_CFL(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0xa348) |
| -#define IS_CNL(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x9dc8) |
| |
| static char *driver_short_names[] = { |
| [AZX_DRIVER_ICH] = "HDA Intel", |
| @@ -1764,10 +1762,6 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci, |
| if (!azx_snoop(chip)) |
| azx_bus(chip)->dma_type = SNDRV_DMA_TYPE_DEV_UC; |
| |
| - /* Workaround for a communication error on CFL (bko#199007) and CNL */ |
| - if (IS_CFL(pci) || IS_CNL(pci)) |
| - azx_bus(chip)->polling_mode = 1; |
| - |
| if (chip->driver_type == AZX_DRIVER_NVIDIA) { |
| dev_dbg(chip->card->dev, "Enable delay in RIRB handling\n"); |
| chip->bus.needs_damn_long_delay = 1; |
| -- |
| 2.24.1 |
| |
| From 588faa6b4c0d18c504e6c32863ef82b63b6531ec Mon Sep 17 00:00:00 2001 |
| From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Date: Tue, 15 Oct 2019 14:44:09 +0900 |
| Subject: [PATCH 014/109] ASoC: sof: include types.h at header.h |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| Content-Transfer-Encoding: 8bit |
| |
| Without <types.h> we will get these error |
| |
| linux/include/sound/sof/header.h:125:2: error: unknown type name ‘uint32_t’uint32_t size; |
| linux/include/sound/sof/header.h:136:2: error: unknown type name ‘uint32_t’uint32_t size; |
| linux/include/sound/sof/header.h:137:2: error: unknown type name ‘uint32_t’uint32_t cmd; |
| ... |
| linux/include/sound/sof/dai-imx.h:18:2: error: unknown type name ‘uint16_t’uint16_t reserved1; |
| linux/include/sound/sof/dai-imx.h:30:2: error: unknown type name ‘uint16_t’uint16_t tdm_slot_width; |
| linux/include/sound/sof/dai-imx.h:31:2: error: unknown type name ‘uint16_t’uint16_t reserved2; |
| |
| Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Link: https://lore.kernel.org/r/87a7a24l7r.wl-kuninori.morimoto.gx@renesas.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 03048217624a9472c1c7a205c8ea9bf8d4026e59) |
| Bugzilla: 1772498 |
| |
| include/sound/sof/header.h | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| diff --git a/include/sound/sof/header.h b/include/sound/sof/header.h |
| index 10f00c08dbb7..332143ff7278 100644 |
| |
| |
| @@ -9,6 +9,7 @@ |
| #ifndef __INCLUDE_SOUND_SOF_HEADER_H__ |
| #define __INCLUDE_SOUND_SOF_HEADER_H__ |
| |
| +#include <linux/types.h> |
| #include <uapi/sound/sof/abi.h> |
| |
| /** \addtogroup sof_uapi uAPI |
| -- |
| 2.24.1 |
| |
| From 0378a1586c604515d4084c29ae689b5700315b7f Mon Sep 17 00:00:00 2001 |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Date: Fri, 27 Sep 2019 15:05:28 -0500 |
| Subject: [PATCH 015/109] ASoC: SOF: trace: move to opt-in with Kconfig and |
| module parameter |
| |
| In a number of debug cases, the DMA-based trace can add problems |
| (e.g. with HDaudio channel allocation). It also generates additional |
| traffic on the bus and if the DMA handling is unreliable will prevent |
| audio use-cases from working normally. Using the trace also requires |
| tools to be installed on the target. |
| |
| The trace can be instead handled as dynamic debug. We can use a |
| Kconfig to force the trace to be enabled in all cases, or use a module |
| parameter to enable it on a need-basis, e.g. by setting "options |
| snd_sof sof_debug=0x1" in a /etc/modprobe.d file. |
| |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20190927200538.660-4-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 2ab4c50f6955514150f83b47b7aee3ba5fe3ac1d) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/Kconfig | 8 ++++++++ |
| sound/soc/sof/core.c | 25 +++++++++++++++++++------ |
| sound/soc/sof/sof-priv.h | 13 +++++++++---- |
| sound/soc/sof/trace.c | 17 ++++++++++++++++- |
| 4 files changed, 52 insertions(+), 11 deletions(-) |
| |
| diff --git a/sound/soc/sof/Kconfig b/sound/soc/sof/Kconfig |
| index bb8036ae567e..cc592bcadae7 100644 |
| |
| |
| @@ -142,6 +142,14 @@ config SND_SOC_SOF_DEBUG_ENABLE_DEBUGFS_CACHE |
| Say Y if you want to enable caching the memory windows. |
| If unsure, select "N". |
| |
| +config SND_SOC_SOF_DEBUG_ENABLE_FIRMWARE_TRACE |
| + bool "SOF enable firmware trace" |
| + help |
| + The firmware trace can be enabled either at build-time with |
| + this option, or dynamically by setting flags in the SOF core |
| + module parameter (similar to dynamic debug) |
| + If unsure, select "N". |
| + |
| config SND_SOC_SOF_DEBUG_IPC_FLOOD_TEST |
| bool "SOF enable IPC flood test" |
| help |
| diff --git a/sound/soc/sof/core.c b/sound/soc/sof/core.c |
| index 12aec140819a..1e7addfc0f61 100644 |
| |
| |
| @@ -16,6 +16,11 @@ |
| #include "sof-priv.h" |
| #include "ops.h" |
| |
| +/* see SOF_DBG_ flags */ |
| +int sof_core_debug; |
| +module_param_named(sof_debug, sof_core_debug, int, 0444); |
| +MODULE_PARM_DESC(sof_debug, "SOF core debug options (0x0 all off)"); |
| + |
| /* SOF defaults if not provided by the platform in ms */ |
| #define TIMEOUT_DEFAULT_IPC_MS 500 |
| #define TIMEOUT_DEFAULT_BOOT_MS 2000 |
| @@ -397,12 +402,20 @@ static int sof_probe_continue(struct snd_sof_dev *sdev) |
| goto fw_run_err; |
| } |
| |
| - /* init DMA trace */ |
| - ret = snd_sof_init_trace(sdev); |
| - if (ret < 0) { |
| - /* non fatal */ |
| - dev_warn(sdev->dev, |
| - "warning: failed to initialize trace %d\n", ret); |
| + if (IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG_ENABLE_FIRMWARE_TRACE) || |
| + (sof_core_debug & SOF_DBG_ENABLE_TRACE)) { |
| + sdev->dtrace_is_supported = true; |
| + |
| + /* init DMA trace */ |
| + ret = snd_sof_init_trace(sdev); |
| + if (ret < 0) { |
| + /* non fatal */ |
| + dev_warn(sdev->dev, |
| + "warning: failed to initialize trace %d\n", |
| + ret); |
| + } |
| + } else { |
| + dev_dbg(sdev->dev, "SOF firmware trace disabled\n"); |
| } |
| |
| /* hereafter all FW boot flows are for PM reasons */ |
| diff --git a/sound/soc/sof/sof-priv.h b/sound/soc/sof/sof-priv.h |
| index 7b329bd99674..e68f3cb78cda 100644 |
| |
| |
| @@ -28,10 +28,14 @@ |
| #include <uapi/sound/sof/fw.h> |
| |
| /* debug flags */ |
| -#define SOF_DBG_REGS BIT(1) |
| -#define SOF_DBG_MBOX BIT(2) |
| -#define SOF_DBG_TEXT BIT(3) |
| -#define SOF_DBG_PCI BIT(4) |
| +#define SOF_DBG_ENABLE_TRACE BIT(0) |
| +#define SOF_DBG_REGS BIT(1) |
| +#define SOF_DBG_MBOX BIT(2) |
| +#define SOF_DBG_TEXT BIT(3) |
| +#define SOF_DBG_PCI BIT(4) |
| + |
| +/* global debug state set by SOF_DBG_ flags */ |
| +extern int sof_core_debug; |
| |
| /* max BARs mmaped devices can use */ |
| #define SND_SOF_BARS 8 |
| @@ -443,6 +447,7 @@ struct snd_sof_dev { |
| int dma_trace_pages; |
| wait_queue_head_t trace_sleep; |
| u32 host_offset; |
| + u32 dtrace_is_supported; /* set with Kconfig or module parameter */ |
| u32 dtrace_is_enabled; |
| u32 dtrace_error; |
| u32 dtrace_draining; |
| diff --git a/sound/soc/sof/trace.c b/sound/soc/sof/trace.c |
| index 4c3cff031fd6..b0e4556c8536 100644 |
| |
| |
| @@ -162,6 +162,9 @@ int snd_sof_init_trace_ipc(struct snd_sof_dev *sdev) |
| struct sof_ipc_reply ipc_reply; |
| int ret; |
| |
| + if (!sdev->dtrace_is_supported) |
| + return 0; |
| + |
| if (sdev->dtrace_is_enabled || !sdev->dma_trace_pages) |
| return -EINVAL; |
| |
| @@ -222,6 +225,9 @@ int snd_sof_init_trace(struct snd_sof_dev *sdev) |
| { |
| int ret; |
| |
| + if (!sdev->dtrace_is_supported) |
| + return 0; |
| + |
| /* set false before start initialization */ |
| sdev->dtrace_is_enabled = false; |
| |
| @@ -277,6 +283,9 @@ EXPORT_SYMBOL(snd_sof_init_trace); |
| int snd_sof_trace_update_pos(struct snd_sof_dev *sdev, |
| struct sof_ipc_dma_trace_posn *posn) |
| { |
| + if (!sdev->dtrace_is_supported) |
| + return 0; |
| + |
| if (sdev->dtrace_is_enabled && sdev->host_offset != posn->host_offset) { |
| sdev->host_offset = posn->host_offset; |
| wake_up(&sdev->trace_sleep); |
| @@ -293,6 +302,9 @@ int snd_sof_trace_update_pos(struct snd_sof_dev *sdev, |
| /* an error has occurred within the DSP that prevents further trace */ |
| void snd_sof_trace_notify_for_error(struct snd_sof_dev *sdev) |
| { |
| + if (!sdev->dtrace_is_supported) |
| + return; |
| + |
| if (sdev->dtrace_is_enabled) { |
| dev_err(sdev->dev, "error: waking up any trace sleepers\n"); |
| sdev->dtrace_error = true; |
| @@ -305,7 +317,7 @@ void snd_sof_release_trace(struct snd_sof_dev *sdev) |
| { |
| int ret; |
| |
| - if (!sdev->dtrace_is_enabled) |
| + if (!sdev->dtrace_is_supported || !sdev->dtrace_is_enabled) |
| return; |
| |
| ret = snd_sof_dma_trace_trigger(sdev, SNDRV_PCM_TRIGGER_STOP); |
| @@ -326,6 +338,9 @@ EXPORT_SYMBOL(snd_sof_release_trace); |
| |
| void snd_sof_free_trace(struct snd_sof_dev *sdev) |
| { |
| + if (!sdev->dtrace_is_supported) |
| + return; |
| + |
| snd_sof_release_trace(sdev); |
| |
| snd_dma_free_pages(&sdev->dmatb); |
| -- |
| 2.24.1 |
| |
| From 2e85462e14f0f736f4cace881c704ac8fa050475 Mon Sep 17 00:00:00 2001 |
| From: Liam Girdwood <liam.r.girdwood@linux.intel.com> |
| Date: Fri, 27 Sep 2019 15:05:29 -0500 |
| Subject: [PATCH 016/109] ASoC: SOF: ipc: retain DSP context after FW |
| exception. |
| |
| Add config option to prevent DSP entering D3 after any FW exception. |
| This can then be used to dump FW context for debug. |
| |
| Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20190927200538.660-5-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 9a06508bf7824ba34f2e1e9e08df505ac14a44c2) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/Kconfig | 8 ++++++++ |
| sound/soc/sof/debug.c | 16 ++++++++++++++++ |
| sound/soc/sof/ipc.c | 4 +--- |
| sound/soc/sof/sof-priv.h | 2 ++ |
| 4 files changed, 27 insertions(+), 3 deletions(-) |
| |
| diff --git a/sound/soc/sof/Kconfig b/sound/soc/sof/Kconfig |
| index cc592bcadae7..56a3ab66b46b 100644 |
| |
| |
| @@ -158,6 +158,14 @@ config SND_SOC_SOF_DEBUG_IPC_FLOOD_TEST |
| Say Y if you want to enable IPC flood test. |
| If unsure, select "N". |
| |
| +config SND_SOC_SOF_DEBUG_RETAIN_DSP_CONTEXT |
| + bool "SOF retain DSP context on any FW exceptions" |
| + help |
| + This option keeps the DSP in D0 state so that firmware debug |
| + information can be retained and dumped to userspace. |
| + Say Y if you want to retain DSP context for FW exceptions. |
| + If unsure, select "N". |
| + |
| endif ## SND_SOC_SOF_DEBUG |
| |
| endif ## SND_SOC_SOF_OPTIONS |
| diff --git a/sound/soc/sof/debug.c b/sound/soc/sof/debug.c |
| index 5529e8eeca46..d2b3b99d3a20 100644 |
| |
| |
| @@ -463,3 +463,19 @@ void snd_sof_free_debug(struct snd_sof_dev *sdev) |
| debugfs_remove_recursive(sdev->debugfs_root); |
| } |
| EXPORT_SYMBOL_GPL(snd_sof_free_debug); |
| + |
| +void snd_sof_handle_fw_exception(struct snd_sof_dev *sdev) |
| +{ |
| + if (IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG_RETAIN_DSP_CONTEXT) || |
| + (sof_core_debug & SOF_DBG_RETAIN_CTX)) { |
| + /* should we prevent DSP entering D3 ? */ |
| + dev_info(sdev->dev, "info: preventing DSP entering D3 state to preserve context\n"); |
| + pm_runtime_get_noresume(sdev->dev); |
| + } |
| + |
| + /* dump vital information to the logs */ |
| + snd_sof_dsp_dbg_dump(sdev, SOF_DBG_REGS | SOF_DBG_MBOX); |
| + snd_sof_ipc_dump(sdev); |
| + snd_sof_trace_notify_for_error(sdev); |
| +} |
| +EXPORT_SYMBOL(snd_sof_handle_fw_exception); |
| diff --git a/sound/soc/sof/ipc.c b/sound/soc/sof/ipc.c |
| index 8984d965037d..bc292f071a4f 100644 |
| |
| |
| @@ -210,9 +210,7 @@ static int tx_wait_done(struct snd_sof_ipc *ipc, struct snd_sof_ipc_msg *msg, |
| if (ret == 0) { |
| dev_err(sdev->dev, "error: ipc timed out for 0x%x size %d\n", |
| hdr->cmd, hdr->size); |
| - snd_sof_dsp_dbg_dump(ipc->sdev, SOF_DBG_REGS | SOF_DBG_MBOX); |
| - snd_sof_ipc_dump(ipc->sdev); |
| - snd_sof_trace_notify_for_error(ipc->sdev); |
| + snd_sof_handle_fw_exception(ipc->sdev); |
| ret = -ETIMEDOUT; |
| } else { |
| /* copy the data returned from DSP */ |
| diff --git a/sound/soc/sof/sof-priv.h b/sound/soc/sof/sof-priv.h |
| index e68f3cb78cda..a769687b576d 100644 |
| |
| |
| @@ -33,6 +33,7 @@ |
| #define SOF_DBG_MBOX BIT(2) |
| #define SOF_DBG_TEXT BIT(3) |
| #define SOF_DBG_PCI BIT(4) |
| +#define SOF_DBG_RETAIN_CTX BIT(5) /* prevent DSP D3 on FW exception */ |
| |
| /* global debug state set by SOF_DBG_ flags */ |
| extern int sof_core_debug; |
| @@ -589,6 +590,7 @@ void snd_sof_get_status(struct snd_sof_dev *sdev, u32 panic_code, |
| struct sof_ipc_panic_info *panic_info, |
| void *stack, size_t stack_words); |
| int snd_sof_init_trace_ipc(struct snd_sof_dev *sdev); |
| +void snd_sof_handle_fw_exception(struct snd_sof_dev *sdev); |
| |
| /* |
| * Platform specific ops. |
| -- |
| 2.24.1 |
| |
| From d55d009f0d9c4ef5c4b693b1f5ec6a0ae1f84c1d Mon Sep 17 00:00:00 2001 |
| From: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> |
| Date: Fri, 27 Sep 2019 15:05:32 -0500 |
| Subject: [PATCH 017/109] ASoC: SOF: core: check for mandatory fw_ready op |
| during SOF probe |
| |
| fw_ready should be a mandatory op. Make sure fw_ready ops is set |
| during probe. |
| |
| Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20190927200538.660-8-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 8692d498d675e2e1433274c5f03b855824f3f35d) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/core.c | 3 ++- |
| sound/soc/sof/ipc.c | 6 ------ |
| sound/soc/sof/sof-priv.h | 2 +- |
| 3 files changed, 3 insertions(+), 8 deletions(-) |
| |
| diff --git a/sound/soc/sof/core.c b/sound/soc/sof/core.c |
| index 1e7addfc0f61..8a23739aa545 100644 |
| |
| |
| @@ -504,7 +504,8 @@ int snd_sof_device_probe(struct device *dev, struct snd_sof_pdata *plat_data) |
| if (!sof_ops(sdev) || !sof_ops(sdev)->probe || !sof_ops(sdev)->run || |
| !sof_ops(sdev)->block_read || !sof_ops(sdev)->block_write || |
| !sof_ops(sdev)->send_msg || !sof_ops(sdev)->load_firmware || |
| - !sof_ops(sdev)->ipc_msg_data || !sof_ops(sdev)->ipc_pcm_params) |
| + !sof_ops(sdev)->ipc_msg_data || !sof_ops(sdev)->ipc_pcm_params || |
| + !sof_ops(sdev)->fw_ready) |
| return -EINVAL; |
| |
| INIT_LIST_HEAD(&sdev->pcm_list); |
| diff --git a/sound/soc/sof/ipc.c b/sound/soc/sof/ipc.c |
| index bc292f071a4f..dfe429f9e33f 100644 |
| |
| |
| @@ -787,12 +787,6 @@ struct snd_sof_ipc *snd_sof_ipc_init(struct snd_sof_dev *sdev) |
| struct snd_sof_ipc *ipc; |
| struct snd_sof_ipc_msg *msg; |
| |
| - /* check if mandatory ops required for ipc are defined */ |
| - if (!sof_ops(sdev)->fw_ready) { |
| - dev_err(sdev->dev, "error: ipc mandatory ops not defined\n"); |
| - return NULL; |
| - } |
| - |
| ipc = devm_kzalloc(sdev->dev, sizeof(*ipc), GFP_KERNEL); |
| if (!ipc) |
| return NULL; |
| diff --git a/sound/soc/sof/sof-priv.h b/sound/soc/sof/sof-priv.h |
| index a769687b576d..eb919527dd21 100644 |
| |
| |
| @@ -133,7 +133,7 @@ struct snd_sof_dsp_ops { |
| * FW ready checks for ABI compatibility and creates |
| * memory windows at first boot |
| */ |
| - int (*fw_ready)(struct snd_sof_dev *sdev, u32 msg_id); /* optional */ |
| + int (*fw_ready)(struct snd_sof_dev *sdev, u32 msg_id); /* mandatory */ |
| |
| /* connect pcm substream to a host stream */ |
| int (*pcm_open)(struct snd_sof_dev *sdev, |
| -- |
| 2.24.1 |
| |
| From bed2180906afe06547bc434b4101da52ef5ef912 Mon Sep 17 00:00:00 2001 |
| From: Marcin Rajwa <marcin.rajwa@linux.intel.com> |
| Date: Fri, 27 Sep 2019 15:05:33 -0500 |
| Subject: [PATCH 018/109] ASoC: SOF: ipc: introduce no_stream_position in |
| sof_ipc_stream_params struct |
| |
| The host period bytes value needs to be passed to firmware. |
| However current implementation uses this field for different |
| purpose - to indicate whether FW should send stream position |
| to the host. Therefore this patch introduces another field |
| "no_stream_position", a boolean value aimed to store information |
| about position tracking. This way host_period_bytes preserves its |
| original value. |
| |
| Signed-off-by: Marcin Rajwa <marcin.rajwa@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20190927200538.660-9-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit e3ebfd0ab5b4880bfb6a9f32614c2e389cc3da56) |
| Bugzilla: 1772498 |
| |
| include/sound/sof/stream.h | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/include/sound/sof/stream.h b/include/sound/sof/stream.h |
| index 0b71b381b952..7facefb541b3 100644 |
| |
| |
| @@ -83,10 +83,10 @@ struct sof_ipc_stream_params { |
| uint16_t sample_valid_bytes; |
| uint16_t sample_container_bytes; |
| |
| - /* for notifying host period has completed - 0 means no period IRQ */ |
| uint32_t host_period_bytes; |
| + uint16_t no_stream_position; /**< 1 means don't send stream position */ |
| |
| - uint32_t reserved[2]; |
| + uint16_t reserved[3]; |
| uint16_t chmap[SOF_IPC_MAX_CHANNELS]; /**< channel map - SOF_CHMAP_ */ |
| } __packed; |
| |
| -- |
| 2.24.1 |
| |
| From 621e4be575f4ab56711478b4306ea7ba78cc922a Mon Sep 17 00:00:00 2001 |
| From: Marcin Rajwa <marcin.rajwa@linux.intel.com> |
| Date: Fri, 27 Sep 2019 15:05:34 -0500 |
| Subject: [PATCH 019/109] ASoC: SOF: Intel: hda: fix reset of host_period_bytes |
| |
| This patch prevents the reset of host period bytes |
| and uses no_stream_position to record requests |
| for stream position. |
| |
| Signed-off-by: Marcin Rajwa <marcin.rajwa@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20190927200538.660-10-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit f567ff6c76f7e9b317248fcab7a0eb3ef432dc9e) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/intel/hda-pcm.c | 15 ++++++++++++--- |
| 1 file changed, 12 insertions(+), 3 deletions(-) |
| |
| diff --git a/sound/soc/sof/intel/hda-pcm.c b/sound/soc/sof/intel/hda-pcm.c |
| index 9b730f183529..575f5f5877d8 100644 |
| |
| |
| @@ -89,6 +89,7 @@ int hda_dsp_pcm_hw_params(struct snd_sof_dev *sdev, |
| struct hdac_ext_stream *stream = stream_to_hdac_ext_stream(hstream); |
| struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; |
| struct snd_dma_buffer *dmab; |
| + struct sof_ipc_fw_version *v = &sdev->fw_ready.version; |
| int ret; |
| u32 size, rate, bits; |
| |
| @@ -116,9 +117,17 @@ int hda_dsp_pcm_hw_params(struct snd_sof_dev *sdev, |
| /* disable SPIB, to enable buffer wrap for stream */ |
| hda_dsp_stream_spib_config(sdev, stream, HDA_DSP_SPIB_DISABLE, 0); |
| |
| - /* set host_period_bytes to 0 if no IPC position */ |
| - if (hda && hda->no_ipc_position) |
| - ipc_params->host_period_bytes = 0; |
| + /* update no_stream_position flag for ipc params */ |
| + if (hda && hda->no_ipc_position) { |
| + /* For older ABIs set host_period_bytes to zero to inform |
| + * FW we don't want position updates. Newer versions use |
| + * no_stream_position for this purpose. |
| + */ |
| + if (v->abi_version < SOF_ABI_VER(3, 10, 0)) |
| + ipc_params->host_period_bytes = 0; |
| + else |
| + ipc_params->no_stream_position = 1; |
| + } |
| |
| ipc_params->stream_tag = hstream->stream_tag; |
| |
| -- |
| 2.24.1 |
| |
| From 244e3dece4e48b1aac798f9b1bf49565697cba87 Mon Sep 17 00:00:00 2001 |
| From: Liam Girdwood <liam.r.girdwood@linux.intel.com> |
| Date: Fri, 27 Sep 2019 15:05:37 -0500 |
| Subject: [PATCH 020/109] ASoC: SOF: Intel: Add context data to any IPC |
| timeout. |
| |
| Helps with FW debug as it provides DSP IPC processing context. |
| |
| Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20190927200538.660-13-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 3a9e204d4e36904a464a2e53206b053a7ffc7bad) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/intel/bdw.c | 22 +++++++++++++++++++++- |
| sound/soc/sof/intel/byt.c | 23 ++++++++++++++++++++++- |
| 2 files changed, 43 insertions(+), 2 deletions(-) |
| |
| diff --git a/sound/soc/sof/intel/bdw.c b/sound/soc/sof/intel/bdw.c |
| index 80e2826fb447..f395d0638876 100644 |
| |
| |
| @@ -247,7 +247,7 @@ static void bdw_dump(struct snd_sof_dev *sdev, u32 flags) |
| struct sof_ipc_dsp_oops_xtensa xoops; |
| struct sof_ipc_panic_info panic_info; |
| u32 stack[BDW_STACK_DUMP_SIZE]; |
| - u32 status, panic; |
| + u32 status, panic, imrx, imrd; |
| |
| /* now try generic SOF status messages */ |
| status = snd_sof_dsp_read(sdev, BDW_DSP_BAR, SHIM_IPCD); |
| @@ -256,6 +256,26 @@ static void bdw_dump(struct snd_sof_dev *sdev, u32 flags) |
| BDW_STACK_DUMP_SIZE); |
| snd_sof_get_status(sdev, status, panic, &xoops, &panic_info, stack, |
| BDW_STACK_DUMP_SIZE); |
| + |
| + /* provide some context for firmware debug */ |
| + imrx = snd_sof_dsp_read(sdev, BDW_DSP_BAR, SHIM_IMRX); |
| + imrd = snd_sof_dsp_read(sdev, BDW_DSP_BAR, SHIM_IMRD); |
| + dev_err(sdev->dev, |
| + "error: ipc host -> DSP: pending %s complete %s raw 0x%8.8x\n", |
| + panic & SHIM_IPCX_BUSY ? "yes" : "no", |
| + panic & SHIM_IPCX_DONE ? "yes" : "no", panic); |
| + dev_err(sdev->dev, |
| + "error: mask host: pending %s complete %s raw 0x%8.8x\n", |
| + imrx & SHIM_IMRX_BUSY ? "yes" : "no", |
| + imrx & SHIM_IMRX_DONE ? "yes" : "no", imrx); |
| + dev_err(sdev->dev, |
| + "error: ipc DSP -> host: pending %s complete %s raw 0x%8.8x\n", |
| + status & SHIM_IPCD_BUSY ? "yes" : "no", |
| + status & SHIM_IPCD_DONE ? "yes" : "no", status); |
| + dev_err(sdev->dev, |
| + "error: mask DSP: pending %s complete %s raw 0x%8.8x\n", |
| + imrd & SHIM_IMRD_BUSY ? "yes" : "no", |
| + imrd & SHIM_IMRD_DONE ? "yes" : "no", imrd); |
| } |
| |
| /* |
| diff --git a/sound/soc/sof/intel/byt.c b/sound/soc/sof/intel/byt.c |
| index 41008c974ac6..3138d9a2c621 100644 |
| |
| |
| @@ -146,7 +146,7 @@ static void byt_dump(struct snd_sof_dev *sdev, u32 flags) |
| struct sof_ipc_dsp_oops_xtensa xoops; |
| struct sof_ipc_panic_info panic_info; |
| u32 stack[BYT_STACK_DUMP_SIZE]; |
| - u32 status, panic; |
| + u32 status, panic, imrd, imrx; |
| |
| /* now try generic SOF status messages */ |
| status = snd_sof_dsp_read(sdev, BYT_DSP_BAR, SHIM_IPCD); |
| @@ -155,6 +155,27 @@ static void byt_dump(struct snd_sof_dev *sdev, u32 flags) |
| BYT_STACK_DUMP_SIZE); |
| snd_sof_get_status(sdev, status, panic, &xoops, &panic_info, stack, |
| BYT_STACK_DUMP_SIZE); |
| + |
| + /* provide some context for firmware debug */ |
| + imrx = snd_sof_dsp_read(sdev, BYT_DSP_BAR, SHIM_IMRX); |
| + imrd = snd_sof_dsp_read(sdev, BYT_DSP_BAR, SHIM_IMRD); |
| + dev_err(sdev->dev, |
| + "error: ipc host -> DSP: pending %s complete %s raw 0x%8.8x\n", |
| + panic & SHIM_IPCX_BUSY ? "yes" : "no", |
| + panic & SHIM_IPCX_DONE ? "yes" : "no", panic); |
| + dev_err(sdev->dev, |
| + "error: mask host: pending %s complete %s raw 0x%8.8x\n", |
| + imrx & SHIM_IMRX_BUSY ? "yes" : "no", |
| + imrx & SHIM_IMRX_DONE ? "yes" : "no", imrx); |
| + dev_err(sdev->dev, |
| + "error: ipc DSP -> host: pending %s complete %s raw 0x%8.8x\n", |
| + status & SHIM_IPCD_BUSY ? "yes" : "no", |
| + status & SHIM_IPCD_DONE ? "yes" : "no", status); |
| + dev_err(sdev->dev, |
| + "error: mask DSP: pending %s complete %s raw 0x%8.8x\n", |
| + imrd & SHIM_IMRD_BUSY ? "yes" : "no", |
| + imrd & SHIM_IMRD_DONE ? "yes" : "no", imrd); |
| + |
| } |
| |
| /* |
| -- |
| 2.24.1 |
| |
| From 2ce45551453d13f25f89c4273934efd179c34195 Mon Sep 17 00:00:00 2001 |
| From: Jaska Uimonen <jaska.uimonen@linux.intel.com> |
| Date: Tue, 8 Oct 2019 11:44:41 -0500 |
| Subject: [PATCH 021/109] ASoC: SOF: enable dual control for pga |
| |
| Currently sof pga element supports only 1 kcontrol and you can't create |
| for example a mixer element with combined volume slider and mute switch. |
| So enable sof pga to have more than 1 kcontrol associated with it. Also |
| check for possible NULL tlv pointer as switch element might not have it. |
| |
| Signed-off-by: Jaska Uimonen <jaska.uimonen@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191008164443.1358-8-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit a68c6b6cc77b841dc37c17a5d9a7074e26801af5) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/topology.c | 5 +++-- |
| 1 file changed, 3 insertions(+), 2 deletions(-) |
| |
| diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c |
| index fa299e078156..96c20c889fa4 100644 |
| |
| |
| @@ -1581,7 +1581,7 @@ static int sof_widget_load_pga(struct snd_soc_component *scomp, int index, |
| if (!volume) |
| return -ENOMEM; |
| |
| - if (le32_to_cpu(tw->num_kcontrols) != 1) { |
| + if (!le32_to_cpu(tw->num_kcontrols)) { |
| dev_err(sdev->dev, "error: invalid kcontrol count %d for volume\n", |
| tw->num_kcontrols); |
| ret = -EINVAL; |
| @@ -1618,7 +1618,8 @@ static int sof_widget_load_pga(struct snd_soc_component *scomp, int index, |
| swidget->private = volume; |
| |
| list_for_each_entry(scontrol, &sdev->kcontrol_list, list) { |
| - if (scontrol->comp_id == swidget->comp_id) { |
| + if (scontrol->comp_id == swidget->comp_id && |
| + scontrol->volume_table) { |
| min_step = scontrol->min_volume_step; |
| max_step = scontrol->max_volume_step; |
| volume->min_value = scontrol->volume_table[min_step]; |
| -- |
| 2.24.1 |
| |
| From 1abf144571f2f8791c1d6b5f9242da41e3ed8c2e Mon Sep 17 00:00:00 2001 |
| From: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Date: Tue, 8 Oct 2019 11:44:36 -0500 |
| Subject: [PATCH 022/109] Revert "ASoC: SOF: Force polling mode on CFL and CNL" |
| |
| This reverts commit 64ca9d9fcb3e3c86b1417e3d17a90b43dd660f81. |
| |
| The workaround is no longer needed after configuring HDAC |
| bus with sync_write=1. |
| |
| Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191008164443.1358-3-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 902fd492d5ea2c02666ddadc1da977ca94e6b52c) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/intel/hda.c | 7 ------- |
| 1 file changed, 7 deletions(-) |
| |
| diff --git a/sound/soc/sof/intel/hda.c b/sound/soc/sof/intel/hda.c |
| index 3c4b604412f0..ff3fa8670fd8 100644 |
| |
| |
| @@ -32,9 +32,6 @@ |
| /* platform specific devices */ |
| #include "shim.h" |
| |
| -#define IS_CFL(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0xa348) |
| -#define IS_CNL(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x9dc8) |
| - |
| #define EXCEPT_MAX_HDR_SIZE 0x400 |
| |
| /* |
| @@ -262,10 +259,6 @@ static int hda_init(struct snd_sof_dev *sdev) |
| /* HDA bus init */ |
| sof_hda_bus_init(bus, &pci->dev); |
| |
| - /* Workaround for a communication error on CFL (bko#199007) and CNL */ |
| - if (IS_CFL(pci) || IS_CNL(pci)) |
| - bus->polling_mode = 1; |
| - |
| bus->use_posbuf = 1; |
| bus->bdl_pos_adj = 0; |
| bus->sync_write = 1; |
| -- |
| 2.24.1 |
| |
| From 7947c07881d4fa46b74c5884d5e0a5ecbd2825b3 Mon Sep 17 00:00:00 2001 |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Date: Tue, 8 Oct 2019 11:44:37 -0500 |
| Subject: [PATCH 023/109] ASoC: SOF: acpi: add debug module param |
| |
| Add debug parameter for snd-sof-acpi. |
| |
| One of the usages for this debug parameter to disable pm_runtime, |
| which can be useful for platform bringup, or keep the parent device |
| active while enabling pm_runtime for child devices (e.g. with |
| SoundWire or MFD). This can also be useful to measure suspend-resume |
| latencies or child devices. |
| |
| Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191008164443.1358-4-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 70b0c75ae1e3d35f829b5fe7ae5692efae63ca71) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/sof-acpi-dev.c | 12 +++++++++++- |
| 1 file changed, 11 insertions(+), 1 deletion(-) |
| |
| diff --git a/sound/soc/sof/sof-acpi-dev.c b/sound/soc/sof/sof-acpi-dev.c |
| index ea7b8b895412..df318f50dd0b 100644 |
| |
| |
| @@ -29,6 +29,12 @@ static char *tplg_path; |
| module_param(tplg_path, charp, 0444); |
| MODULE_PARM_DESC(tplg_path, "alternate path for SOF topology."); |
| |
| +static int sof_acpi_debug; |
| +module_param_named(sof_acpi_debug, sof_acpi_debug, int, 0444); |
| +MODULE_PARM_DESC(sof_acpi_debug, "SOF ACPI debug options (0x0 all off)"); |
| + |
| +#define SOF_ACPI_DISABLE_PM_RUNTIME BIT(0) |
| + |
| #if IS_ENABLED(CONFIG_SND_SOC_SOF_HASWELL) |
| static const struct sof_dev_desc sof_acpi_haswell_desc = { |
| .machines = snd_soc_acpi_intel_haswell_machines, |
| @@ -121,6 +127,9 @@ static const struct dev_pm_ops sof_acpi_pm = { |
| |
| static void sof_acpi_probe_complete(struct device *dev) |
| { |
| + if (sof_acpi_debug & SOF_ACPI_DISABLE_PM_RUNTIME) |
| + return; |
| + |
| /* allow runtime_pm */ |
| pm_runtime_set_autosuspend_delay(dev, SND_SOF_SUSPEND_DELAY_MS); |
| pm_runtime_use_autosuspend(dev); |
| @@ -221,7 +230,8 @@ static int sof_acpi_probe(struct platform_device *pdev) |
| |
| static int sof_acpi_remove(struct platform_device *pdev) |
| { |
| - pm_runtime_disable(&pdev->dev); |
| + if (!(sof_acpi_debug & SOF_ACPI_DISABLE_PM_RUNTIME)) |
| + pm_runtime_disable(&pdev->dev); |
| |
| /* call sof helper for DSP hardware remove */ |
| snd_sof_device_remove(&pdev->dev); |
| -- |
| 2.24.1 |
| |
| From 21db8b682a3384a910d054fd8795b6dec380d700 Mon Sep 17 00:00:00 2001 |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Date: Tue, 8 Oct 2019 11:44:38 -0500 |
| Subject: [PATCH 024/109] ASoC: SOF: pci: add debug module param |
| |
| Add debug parameter for snd-sof-pci. |
| |
| One of the usages for this debug parameter to disable pm_runtime, |
| which can be useful for platform bringup, or keep the parent device |
| active while enabling pm_runtime for child devices (e.g. with |
| SoundWire or MFD). This can also be useful to measure suspend-resume |
| latencies or child devices. |
| |
| Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191008164443.1358-5-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 8b160dc2a92c83a566b0596c79febb5933f9a6b5) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/sof-pci-dev.c | 12 +++++++++++- |
| 1 file changed, 11 insertions(+), 1 deletion(-) |
| |
| diff --git a/sound/soc/sof/sof-pci-dev.c b/sound/soc/sof/sof-pci-dev.c |
| index 3a9e0e2a150d..be5a8da504c5 100644 |
| |
| |
| @@ -30,6 +30,12 @@ static char *tplg_path; |
| module_param(tplg_path, charp, 0444); |
| MODULE_PARM_DESC(tplg_path, "alternate path for SOF topology."); |
| |
| +static int sof_pci_debug; |
| +module_param_named(sof_pci_debug, sof_pci_debug, int, 0444); |
| +MODULE_PARM_DESC(sof_pci_debug, "SOF PCI debug options (0x0 all off)"); |
| + |
| +#define SOF_PCI_DISABLE_PM_RUNTIME BIT(0) |
| + |
| #if IS_ENABLED(CONFIG_SND_SOC_SOF_APOLLOLAKE) |
| static const struct sof_dev_desc bxt_desc = { |
| .machines = snd_soc_acpi_intel_bxt_machines, |
| @@ -250,6 +256,9 @@ static void sof_pci_probe_complete(struct device *dev) |
| { |
| dev_dbg(dev, "Completing SOF PCI probe"); |
| |
| + if (sof_pci_debug & SOF_PCI_DISABLE_PM_RUNTIME) |
| + return; |
| + |
| /* allow runtime_pm */ |
| pm_runtime_set_autosuspend_delay(dev, SND_SOF_SUSPEND_DELAY_MS); |
| pm_runtime_use_autosuspend(dev); |
| @@ -376,7 +385,8 @@ static void sof_pci_remove(struct pci_dev *pci) |
| snd_sof_device_remove(&pci->dev); |
| |
| /* follow recommendation in pci-driver.c to increment usage counter */ |
| - pm_runtime_get_noresume(&pci->dev); |
| + if (!(sof_pci_debug & SOF_PCI_DISABLE_PM_RUNTIME)) |
| + pm_runtime_get_noresume(&pci->dev); |
| |
| /* release pci regions and disable device */ |
| pci_release_regions(pci); |
| -- |
| 2.24.1 |
| |
| From 7b65ba0fedde4554a709dce46318543f07b8fd5a Mon Sep 17 00:00:00 2001 |
| From: Jaska Uimonen <jaska.uimonen@linux.intel.com> |
| Date: Tue, 8 Oct 2019 11:44:43 -0500 |
| Subject: [PATCH 025/109] ASoC: SOF: acpi led support for switch controls |
| |
| Currently sof doesn't support acpi leds with mute switches. So implement |
| acpi leds following quite shamelessly existing HDA implementation by |
| Takashi Iwai. |
| |
| Mute leds can be enabled in topology by adding led and direction token |
| in switch control private data. |
| |
| Signed-off-by: Jaska Uimonen <jaska.uimonen@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191008164443.1358-10-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 5d43001ae43606dc525f55c482c545afba01bb55) |
| Bugzilla: 1772498 |
| |
| include/uapi/sound/sof/tokens.h | 4 ++++ |
| sound/soc/sof/control.c | 32 ++++++++++++++++++++++++++++++++ |
| sound/soc/sof/sof-priv.h | 9 +++++++++ |
| sound/soc/sof/topology.c | 13 +++++++++++++ |
| 4 files changed, 58 insertions(+) |
| |
| diff --git a/include/uapi/sound/sof/tokens.h b/include/uapi/sound/sof/tokens.h |
| index 8f996857fb24..28ef01a67765 100644 |
| |
| |
| @@ -114,4 +114,8 @@ |
| #define SOF_TKN_IMX_ESAI_FIRST_TOKEN 1100 |
| /* TODO: Add ESAI tokens */ |
| |
| +/* Led control for mute switches */ |
| +#define SOF_TKN_MUTE_LED_USE 1300 |
| +#define SOF_TKN_MUTE_LED_DIRECTION 1301 |
| + |
| #endif |
| diff --git a/sound/soc/sof/control.c b/sound/soc/sof/control.c |
| index 2b8711eda362..b73d4587c5da 100644 |
| |
| |
| @@ -11,8 +11,37 @@ |
| /* Mixer Controls */ |
| |
| #include <linux/pm_runtime.h> |
| +#include <linux/leds.h> |
| #include "sof-priv.h" |
| |
| +static void update_mute_led(struct snd_sof_control *scontrol, |
| + struct snd_kcontrol *kcontrol, |
| + struct snd_ctl_elem_value *ucontrol) |
| +{ |
| + unsigned int temp = 0; |
| + unsigned int mask; |
| + int i; |
| + |
| + mask = 1U << snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); |
| + |
| + for (i = 0; i < scontrol->num_channels; i++) { |
| + if (ucontrol->value.integer.value[i]) { |
| + temp |= mask; |
| + break; |
| + } |
| + } |
| + |
| + if (temp == scontrol->led_ctl.led_value) |
| + return; |
| + |
| + scontrol->led_ctl.led_value = temp; |
| + |
| + if (!scontrol->led_ctl.direction) |
| + ledtrig_audio_set(LED_AUDIO_MUTE, temp ? LED_OFF : LED_ON); |
| + else |
| + ledtrig_audio_set(LED_AUDIO_MICMUTE, temp ? LED_OFF : LED_ON); |
| +} |
| + |
| static inline u32 mixer_to_ipc(unsigned int value, u32 *volume_map, int size) |
| { |
| if (value >= size) |
| @@ -118,6 +147,9 @@ int snd_sof_switch_put(struct snd_kcontrol *kcontrol, |
| cdata->chanv[i].value = value; |
| } |
| |
| + if (scontrol->led_ctl.use_led) |
| + update_mute_led(scontrol, kcontrol, ucontrol); |
| + |
| /* notify DSP of mixer updates */ |
| if (pm_runtime_active(sdev->dev)) |
| snd_sof_ipc_set_get_comp_data(sdev->ipc, scontrol, |
| diff --git a/sound/soc/sof/sof-priv.h b/sound/soc/sof/sof-priv.h |
| index eb919527dd21..9729deafec08 100644 |
| |
| |
| @@ -15,6 +15,7 @@ |
| |
| #include <sound/hdaudio.h> |
| #include <sound/soc.h> |
| +#include <sound/control.h> |
| |
| #include <sound/sof.h> |
| #include <sound/sof/stream.h> /* needs to be included before control.h */ |
| @@ -310,6 +311,12 @@ struct snd_sof_pcm { |
| bool prepared[2]; /* PCM_PARAMS set successfully */ |
| }; |
| |
| +struct snd_sof_led_control { |
| + unsigned int use_led; |
| + unsigned int direction; |
| + unsigned int led_value; |
| +}; |
| + |
| /* ALSA SOF Kcontrol device */ |
| struct snd_sof_control { |
| struct snd_sof_dev *sdev; |
| @@ -324,6 +331,8 @@ struct snd_sof_control { |
| u32 *volume_table; /* volume table computed from tlv data*/ |
| |
| struct list_head list; /* list in sdev control list */ |
| + |
| + struct snd_sof_led_control led_ctl; |
| }; |
| |
| /* ASoC SOF DAPM widget */ |
| diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c |
| index 96c20c889fa4..a1493961b51c 100644 |
| |
| |
| @@ -494,6 +494,11 @@ static int sof_control_load_volume(struct snd_soc_component *scomp, |
| } |
| |
| out: |
| + /* set up possible led control from mixer private data */ |
| + ret = sof_parse_tokens(scomp, &scontrol->led_ctl, led_tokens, |
| + ARRAY_SIZE(led_tokens), mc->priv.array, |
| + le32_to_cpu(mc->priv.size)); |
| + |
| dev_dbg(sdev->dev, "tplg: load kcontrol index %d chans %d\n", |
| scontrol->comp_id, scontrol->num_channels); |
| |
| @@ -840,6 +845,14 @@ static const struct sof_topology_token dmic_pdm_tokens[] = { |
| static const struct sof_topology_token hda_tokens[] = { |
| }; |
| |
| +/* Leds */ |
| +static const struct sof_topology_token led_tokens[] = { |
| + {SOF_TKN_MUTE_LED_USE, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32, |
| + offsetof(struct snd_sof_led_control, use_led), 0}, |
| + {SOF_TKN_MUTE_LED_DIRECTION, SND_SOC_TPLG_TUPLE_TYPE_WORD, |
| + get_token_u32, offsetof(struct snd_sof_led_control, direction), 0}, |
| +}; |
| + |
| static void sof_parse_uuid_tokens(struct snd_soc_component *scomp, |
| void *object, |
| const struct sof_topology_token *tokens, |
| -- |
| 2.24.1 |
| |
| From 0017ac5f09b9a689a6f1b2ec3f0aa2f95753a1c1 Mon Sep 17 00:00:00 2001 |
| From: Daniel Baluta <daniel.baluta@nxp.com> |
| Date: Tue, 8 Oct 2019 11:44:39 -0500 |
| Subject: [PATCH 026/109] ASoC: SOF: imx: Describe ESAI parameters to be sent |
| to DSP |
| |
| Introduce sof_ipc_dai_esai_params to keep information that |
| we get from topology and we send to DSP FW. |
| |
| Also bump the ABI minor to reflect the changes on DSP FW. |
| |
| Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191008164443.1358-6-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit b4be427683cf6debda331a5d6a4af34885851d19) |
| Bugzilla: 1772498 |
| |
| include/sound/sof/dai-imx.h | 34 +++++++++++++++++++++++++++++++++ |
| include/sound/sof/dai.h | 2 ++ |
| include/uapi/sound/sof/abi.h | 2 +- |
| include/uapi/sound/sof/tokens.h | 3 +-- |
| 4 files changed, 38 insertions(+), 3 deletions(-) |
| create mode 100644 include/sound/sof/dai-imx.h |
| |
| diff --git a/include/sound/sof/dai-imx.h b/include/sound/sof/dai-imx.h |
| new file mode 100644 |
| index 000000000000..e02fb0b0fae1 |
| |
| |
| @@ -0,0 +1,34 @@ |
| +/* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */ |
| +/* |
| + * Copyright 2019 NXP |
| + * |
| + * Author: Daniel Baluta <daniel.baluta@nxp.com> |
| + */ |
| + |
| +#ifndef __INCLUDE_SOUND_SOF_DAI_IMX_H__ |
| +#define __INCLUDE_SOUND_SOF_DAI_IMX_H__ |
| + |
| +#include <sound/sof/header.h> |
| + |
| +/* ESAI Configuration Request - SOF_IPC_DAI_ESAI_CONFIG */ |
| +struct sof_ipc_dai_esai_params { |
| + struct sof_ipc_hdr hdr; |
| + |
| + /* MCLK */ |
| + uint16_t reserved1; |
| + uint16_t mclk_id; |
| + uint32_t mclk_direction; |
| + |
| + uint32_t mclk_rate; /* MCLK frequency in Hz */ |
| + uint32_t fsync_rate; /* FSYNC frequency in Hz */ |
| + uint32_t bclk_rate; /* BCLK frequency in Hz */ |
| + |
| + /* TDM */ |
| + uint32_t tdm_slots; |
| + uint32_t rx_slots; |
| + uint32_t tx_slots; |
| + uint16_t tdm_slot_width; |
| + uint16_t reserved2; /* alignment */ |
| +} __packed; |
| + |
| +#endif |
| diff --git a/include/sound/sof/dai.h b/include/sound/sof/dai.h |
| index 0f1235022146..c229565767e5 100644 |
| |
| |
| @@ -11,6 +11,7 @@ |
| |
| #include <sound/sof/header.h> |
| #include <sound/sof/dai-intel.h> |
| +#include <sound/sof/dai-imx.h> |
| |
| /* |
| * DAI Configuration. |
| @@ -73,6 +74,7 @@ struct sof_ipc_dai_config { |
| struct sof_ipc_dai_dmic_params dmic; |
| struct sof_ipc_dai_hda_params hda; |
| struct sof_ipc_dai_alh_params alh; |
| + struct sof_ipc_dai_esai_params esai; |
| }; |
| } __packed; |
| |
| diff --git a/include/uapi/sound/sof/abi.h b/include/uapi/sound/sof/abi.h |
| index a0fe0d4c4b66..ebfdc20ca081 100644 |
| |
| |
| @@ -26,7 +26,7 @@ |
| |
| /* SOF ABI version major, minor and patch numbers */ |
| #define SOF_ABI_MAJOR 3 |
| -#define SOF_ABI_MINOR 10 |
| +#define SOF_ABI_MINOR 11 |
| #define SOF_ABI_PATCH 0 |
| |
| /* SOF ABI version number. Format within 32bit word is MMmmmppp */ |
| diff --git a/include/uapi/sound/sof/tokens.h b/include/uapi/sound/sof/tokens.h |
| index 28ef01a67765..d65406f34361 100644 |
| |
| |
| @@ -111,8 +111,7 @@ |
| /* TODO: Add SAI tokens */ |
| |
| /* ESAI */ |
| -#define SOF_TKN_IMX_ESAI_FIRST_TOKEN 1100 |
| -/* TODO: Add ESAI tokens */ |
| +#define SOF_TKN_IMX_ESAI_MCLK_ID 1100 |
| |
| /* Led control for mute switches */ |
| #define SOF_TKN_MUTE_LED_USE 1300 |
| -- |
| 2.24.1 |
| |
| From 8a031dfe901dd997df316c2138153edff7af5731 Mon Sep 17 00:00:00 2001 |
| From: Daniel Baluta <daniel.baluta@nxp.com> |
| Date: Tue, 8 Oct 2019 11:44:40 -0500 |
| Subject: [PATCH 027/109] ASoC: SOF: imx: Read ESAI parameters and send them to |
| DSP |
| |
| ESAI parameters are read for topology file, packed into |
| sof_ipc_dai_esai_parms struct and then sent to DSP. |
| |
| Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191008164443.1358-7-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit a4eff5f86c9c5e7d07d880bd86ce8faad19d7063) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/pcm.c | 8 +++++ |
| sound/soc/sof/topology.c | 69 ++++++++++++++++++++++++++++++++++++++-- |
| 2 files changed, 75 insertions(+), 2 deletions(-) |
| |
| diff --git a/sound/soc/sof/pcm.c b/sound/soc/sof/pcm.c |
| index 2b876d497447..b0f4217433e5 100644 |
| |
| |
| @@ -691,6 +691,14 @@ static int sof_pcm_dai_link_fixup(struct snd_soc_pcm_runtime *rtd, |
| case SOF_DAI_INTEL_ALH: |
| /* do nothing for ALH dai_link */ |
| break; |
| + case SOF_DAI_IMX_ESAI: |
| + channels->min = dai->dai_config->esai.tdm_slots; |
| + channels->max = dai->dai_config->esai.tdm_slots; |
| + |
| + dev_dbg(sdev->dev, |
| + "channels_min: %d channels_max: %d\n", |
| + channels->min, channels->max); |
| + break; |
| default: |
| dev_err(sdev->dev, "error: invalid DAI type %d\n", |
| dai->dai_config->type); |
| diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c |
| index a1493961b51c..b2cf450f763f 100644 |
| |
| |
| @@ -804,6 +804,13 @@ static const struct sof_topology_token dmic_tokens[] = { |
| |
| }; |
| |
| +/* ESAI */ |
| +static const struct sof_topology_token esai_tokens[] = { |
| + {SOF_TKN_IMX_ESAI_MCLK_ID, |
| + SND_SOC_TPLG_TUPLE_TYPE_SHORT, get_token_u16, |
| + offsetof(struct sof_ipc_dai_esai_params, mclk_id), 0}, |
| +}; |
| + |
| /* |
| * DMIC PDM Tokens |
| * SOF_TKN_INTEL_DMIC_PDM_CTRL_ID should be the first token |
| @@ -2550,8 +2557,66 @@ static int sof_link_esai_load(struct snd_soc_component *scomp, int index, |
| struct snd_soc_tplg_hw_config *hw_config, |
| struct sof_ipc_dai_config *config) |
| { |
| - /*TODO: Add implementation */ |
| - return 0; |
| + struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp); |
| + struct snd_soc_tplg_private *private = &cfg->priv; |
| + struct sof_ipc_reply reply; |
| + u32 size = sizeof(*config); |
| + int ret; |
| + |
| + /* handle master/slave and inverted clocks */ |
| + sof_dai_set_format(hw_config, config); |
| + |
| + /* init IPC */ |
| + memset(&config->esai, 0, sizeof(struct sof_ipc_dai_esai_params)); |
| + config->hdr.size = size; |
| + |
| + ret = sof_parse_tokens(scomp, &config->esai, esai_tokens, |
| + ARRAY_SIZE(esai_tokens), private->array, |
| + le32_to_cpu(private->size)); |
| + if (ret != 0) { |
| + dev_err(sdev->dev, "error: parse esai tokens failed %d\n", |
| + le32_to_cpu(private->size)); |
| + return ret; |
| + } |
| + |
| + config->esai.mclk_rate = le32_to_cpu(hw_config->mclk_rate); |
| + config->esai.bclk_rate = le32_to_cpu(hw_config->bclk_rate); |
| + config->esai.fsync_rate = le32_to_cpu(hw_config->fsync_rate); |
| + config->esai.mclk_direction = hw_config->mclk_direction; |
| + config->esai.tdm_slots = le32_to_cpu(hw_config->tdm_slots); |
| + config->esai.tdm_slot_width = le32_to_cpu(hw_config->tdm_slot_width); |
| + config->esai.rx_slots = le32_to_cpu(hw_config->rx_slots); |
| + config->esai.tx_slots = le32_to_cpu(hw_config->tx_slots); |
| + |
| + dev_info(sdev->dev, |
| + "tplg: config ESAI%d fmt 0x%x mclk %d width %d slots %d mclk id %d\n", |
| + config->dai_index, config->format, |
| + config->esai.mclk_rate, config->esai.tdm_slot_width, |
| + config->esai.tdm_slots, config->esai.mclk_id); |
| + |
| + if (config->esai.tdm_slots < 1 || config->esai.tdm_slots > 8) { |
| + dev_err(sdev->dev, "error: invalid channel count for ESAI%d\n", |
| + config->dai_index); |
| + return -EINVAL; |
| + } |
| + |
| + /* send message to DSP */ |
| + ret = sof_ipc_tx_message(sdev->ipc, |
| + config->hdr.cmd, config, size, &reply, |
| + sizeof(reply)); |
| + if (ret < 0) { |
| + dev_err(sdev->dev, "error: failed to set DAI config for ESAI%d\n", |
| + config->dai_index); |
| + return ret; |
| + } |
| + |
| + /* set config for all DAI's with name matching the link name */ |
| + ret = sof_set_dai_config(sdev, size, link, config); |
| + if (ret < 0) |
| + dev_err(sdev->dev, "error: failed to save DAI config for ESAI%d\n", |
| + config->dai_index); |
| + |
| + return ret; |
| } |
| |
| static int sof_link_dmic_load(struct snd_soc_component *scomp, int index, |
| -- |
| 2.24.1 |
| |
| From 752cbeda2b3ac929a9b0891fa3a8fdd9a8bcc5d5 Mon Sep 17 00:00:00 2001 |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Date: Fri, 11 Oct 2019 11:43:09 -0500 |
| Subject: [PATCH 028/109] ASoC: SOF: Intel: byt: fix operator precedence |
| warnings |
| |
| Address cppcheck warnings |
| |
| sound/soc/sof/intel/byt.c:163:26: style: Clarify calculation |
| precedence for '&' and '?'. [clarifyCalculation] |
| panic & SHIM_IPCX_BUSY ? "yes" : "no", |
| ^ |
| |
| sound/soc/sof/intel/byt.c:164:26: style: Clarify calculation |
| precedence for '&' and '?'. [clarifyCalculation] |
| panic & SHIM_IPCX_DONE ? "yes" : "no", panic); |
| ^ |
| |
| sound/soc/sof/intel/byt.c:167:25: style: Clarify calculation |
| precedence for '&' and '?'. [clarifyCalculation] |
| imrx & SHIM_IMRX_BUSY ? "yes" : "no", |
| ^ |
| |
| sound/soc/sof/intel/byt.c:168:25: style: Clarify calculation |
| precedence for '&' and '?'. [clarifyCalculation] |
| imrx & SHIM_IMRX_DONE ? "yes" : "no", imrx); |
| ^ |
| |
| sound/soc/sof/intel/byt.c:171:27: style: Clarify calculation |
| precedence for '&' and '?'. [clarifyCalculation] |
| status & SHIM_IPCD_BUSY ? "yes" : "no", |
| ^ |
| |
| sound/soc/sof/intel/byt.c:172:27: style: Clarify calculation |
| precedence for '&' and '?'. [clarifyCalculation] |
| status & SHIM_IPCD_DONE ? "yes" : "no", status); |
| ^ |
| |
| sound/soc/sof/intel/byt.c:175:25: style: Clarify calculation |
| precedence for '&' and '?'. [clarifyCalculation] |
| imrd & SHIM_IMRD_BUSY ? "yes" : "no", |
| ^ |
| |
| sound/soc/sof/intel/byt.c:176:25: style: Clarify calculation |
| precedence for '&' and '?'. [clarifyCalculation] |
| imrd & SHIM_IMRD_DONE ? "yes" : "no", imrd); |
| ^ |
| |
| Fixes: 3a9e204d4e369 ("ASoC: SOF: Intel: Add context data to any IPC timeout.") |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191011164312.7988-2-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit f9f618e7128e834db3f54d290a926c4a71104e02) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/intel/byt.c | 16 ++++++++-------- |
| 1 file changed, 8 insertions(+), 8 deletions(-) |
| |
| diff --git a/sound/soc/sof/intel/byt.c b/sound/soc/sof/intel/byt.c |
| index 3138d9a2c621..84d6069b5075 100644 |
| |
| |
| @@ -161,20 +161,20 @@ static void byt_dump(struct snd_sof_dev *sdev, u32 flags) |
| imrd = snd_sof_dsp_read(sdev, BYT_DSP_BAR, SHIM_IMRD); |
| dev_err(sdev->dev, |
| "error: ipc host -> DSP: pending %s complete %s raw 0x%8.8x\n", |
| - panic & SHIM_IPCX_BUSY ? "yes" : "no", |
| - panic & SHIM_IPCX_DONE ? "yes" : "no", panic); |
| + (panic & SHIM_IPCX_BUSY) ? "yes" : "no", |
| + (panic & SHIM_IPCX_DONE) ? "yes" : "no", panic); |
| dev_err(sdev->dev, |
| "error: mask host: pending %s complete %s raw 0x%8.8x\n", |
| - imrx & SHIM_IMRX_BUSY ? "yes" : "no", |
| - imrx & SHIM_IMRX_DONE ? "yes" : "no", imrx); |
| + (imrx & SHIM_IMRX_BUSY) ? "yes" : "no", |
| + (imrx & SHIM_IMRX_DONE) ? "yes" : "no", imrx); |
| dev_err(sdev->dev, |
| "error: ipc DSP -> host: pending %s complete %s raw 0x%8.8x\n", |
| - status & SHIM_IPCD_BUSY ? "yes" : "no", |
| - status & SHIM_IPCD_DONE ? "yes" : "no", status); |
| + (status & SHIM_IPCD_BUSY) ? "yes" : "no", |
| + (status & SHIM_IPCD_DONE) ? "yes" : "no", status); |
| dev_err(sdev->dev, |
| "error: mask DSP: pending %s complete %s raw 0x%8.8x\n", |
| - imrd & SHIM_IMRD_BUSY ? "yes" : "no", |
| - imrd & SHIM_IMRD_DONE ? "yes" : "no", imrd); |
| + (imrd & SHIM_IMRD_BUSY) ? "yes" : "no", |
| + (imrd & SHIM_IMRD_DONE) ? "yes" : "no", imrd); |
| |
| } |
| |
| -- |
| 2.24.1 |
| |
| From a825e9f8825891dfd84867f2916b0b69cda0de6a Mon Sep 17 00:00:00 2001 |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Date: Fri, 11 Oct 2019 11:43:10 -0500 |
| Subject: [PATCH 029/109] ASoC: SOF: Intel: bdw: fix operator precedence |
| warnings |
| |
| Address cppcheck warnings |
| |
| sound/soc/sof/intel/bdw.c:265:26: style: Clarify calculation precedence |
| for '&' and '?'. [clarifyCalculation] |
| panic & SHIM_IPCX_BUSY ? "yes" : "no", |
| ^ |
| |
| sound/soc/sof/intel/bdw.c:266:26: style: Clarify calculation |
| precedence for '&' and '?'. [clarifyCalculation] |
| panic & SHIM_IPCX_DONE ? "yes" : "no", panic); |
| ^ |
| |
| sound/soc/sof/intel/bdw.c:269:25: style: Clarify calculation |
| precedence for '&' and '?'. [clarifyCalculation] |
| imrx & SHIM_IMRX_BUSY ? "yes" : "no", |
| ^ |
| |
| sound/soc/sof/intel/bdw.c:270:25: style: Clarify calculation |
| precedence for '&' and '?'. [clarifyCalculation] |
| imrx & SHIM_IMRX_DONE ? "yes" : "no", imrx); |
| ^ |
| |
| sound/soc/sof/intel/bdw.c:273:27: style: Clarify calculation |
| precedence for '&' and '?'. [clarifyCalculation] |
| status & SHIM_IPCD_BUSY ? "yes" : "no", |
| ^ |
| |
| sound/soc/sof/intel/bdw.c:274:27: style: Clarify calculation |
| precedence for '&' and '?'. [clarifyCalculation] |
| status & SHIM_IPCD_DONE ? "yes" : "no", status); |
| ^ |
| |
| sound/soc/sof/intel/bdw.c:277:25: style: Clarify calculation |
| precedence for '&' and '?'. [clarifyCalculation] |
| imrd & SHIM_IMRD_BUSY ? "yes" : "no", |
| ^ |
| |
| sound/soc/sof/intel/bdw.c:278:25: style: Clarify calculation |
| precedence for '&' and '?'. [clarifyCalculation] |
| imrd & SHIM_IMRD_DONE ? "yes" : "no", imrd); |
| ^ |
| |
| Fixes: 3a9e204d4e369 ("ASoC: SOF: Intel: Add context data to any IPC timeout.") |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191011164312.7988-3-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 7ad03a2c848f6fb0a8dea656c9c161929696878e) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/intel/bdw.c | 16 ++++++++-------- |
| 1 file changed, 8 insertions(+), 8 deletions(-) |
| |
| diff --git a/sound/soc/sof/intel/bdw.c b/sound/soc/sof/intel/bdw.c |
| index f395d0638876..bf961a8798a7 100644 |
| |
| |
| @@ -262,20 +262,20 @@ static void bdw_dump(struct snd_sof_dev *sdev, u32 flags) |
| imrd = snd_sof_dsp_read(sdev, BDW_DSP_BAR, SHIM_IMRD); |
| dev_err(sdev->dev, |
| "error: ipc host -> DSP: pending %s complete %s raw 0x%8.8x\n", |
| - panic & SHIM_IPCX_BUSY ? "yes" : "no", |
| - panic & SHIM_IPCX_DONE ? "yes" : "no", panic); |
| + (panic & SHIM_IPCX_BUSY) ? "yes" : "no", |
| + (panic & SHIM_IPCX_DONE) ? "yes" : "no", panic); |
| dev_err(sdev->dev, |
| "error: mask host: pending %s complete %s raw 0x%8.8x\n", |
| - imrx & SHIM_IMRX_BUSY ? "yes" : "no", |
| - imrx & SHIM_IMRX_DONE ? "yes" : "no", imrx); |
| + (imrx & SHIM_IMRX_BUSY) ? "yes" : "no", |
| + (imrx & SHIM_IMRX_DONE) ? "yes" : "no", imrx); |
| dev_err(sdev->dev, |
| "error: ipc DSP -> host: pending %s complete %s raw 0x%8.8x\n", |
| - status & SHIM_IPCD_BUSY ? "yes" : "no", |
| - status & SHIM_IPCD_DONE ? "yes" : "no", status); |
| + (status & SHIM_IPCD_BUSY) ? "yes" : "no", |
| + (status & SHIM_IPCD_DONE) ? "yes" : "no", status); |
| dev_err(sdev->dev, |
| "error: mask DSP: pending %s complete %s raw 0x%8.8x\n", |
| - imrd & SHIM_IMRD_BUSY ? "yes" : "no", |
| - imrd & SHIM_IMRD_DONE ? "yes" : "no", imrd); |
| + (imrd & SHIM_IMRD_BUSY) ? "yes" : "no", |
| + (imrd & SHIM_IMRD_DONE) ? "yes" : "no", imrd); |
| } |
| |
| /* |
| -- |
| 2.24.1 |
| |
| From b130f3834c22757c7d8da463e77bc80c31035cd8 Mon Sep 17 00:00:00 2001 |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Date: Fri, 11 Oct 2019 11:43:11 -0500 |
| Subject: [PATCH 030/109] ASoC: SOF: topology: remove always-true redundant |
| test |
| |
| Address cppcheck warning: |
| |
| sound/soc/sof/topology.c:2322:6: style: Condition 'pcm' is always true |
| [knownConditionTrueFalse] |
| if (pcm) { |
| ^ |
| |
| sound/soc/sof/topology.c:2311:6: note: Assuming that condition '!pcm' |
| is not redundant |
| if (!pcm) |
| ^ |
| |
| sound/soc/sof/topology.c:2322:6: note: Condition 'pcm' is always true |
| if (pcm) { |
| ^ |
| |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191011164312.7988-4-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 494e8f65da24d550a5e7c6a85b9433ffb181705c) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/topology.c | 7 +++---- |
| 1 file changed, 3 insertions(+), 4 deletions(-) |
| |
| diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c |
| index b2cf450f763f..4fa38719c703 100644 |
| |
| |
| @@ -2309,10 +2309,9 @@ static int sof_dai_load(struct snd_soc_component *scomp, int index, |
| spcm->stream[SNDRV_PCM_STREAM_PLAYBACK].comp_id = COMP_ID_UNASSIGNED; |
| spcm->stream[SNDRV_PCM_STREAM_CAPTURE].comp_id = COMP_ID_UNASSIGNED; |
| |
| - if (pcm) { |
| - spcm->pcm = *pcm; |
| - dev_dbg(sdev->dev, "tplg: load pcm %s\n", pcm->dai_name); |
| - } |
| + spcm->pcm = *pcm; |
| + dev_dbg(sdev->dev, "tplg: load pcm %s\n", pcm->dai_name); |
| + |
| dai_drv->dobj.private = spcm; |
| list_add(&spcm->list, &sdev->pcm_list); |
| |
| -- |
| 2.24.1 |
| |
| From b23994307d4c6bea1226d7d84c78de8f5a5f9afd Mon Sep 17 00:00:00 2001 |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Date: Fri, 11 Oct 2019 11:43:12 -0500 |
| Subject: [PATCH 031/109] ASoC: SOF: topology: check errors when parsing LED |
| tokens |
| |
| sof_parse_tokens() returns a value that is checked on every call |
| except for LED tokens, fix with explicit test. |
| |
| Detected with cppcheck warning: |
| |
| sound/soc/sof/topology.c:973:6: style: Variable 'ret' is assigned a |
| value that is never used. [unreadVariable] |
| ret = sof_parse_tokens(scomp, &scontrol->led_ctl, led_tokens, |
| ^ |
| |
| Fixes: 5d43001ae4360 ("ASoC: SOF: acpi led support for switch controls") |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191011164312.7988-5-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 8a3ab38c36926ddbda3d2a3086c0a741fa175cff) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/topology.c | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c |
| index 4fa38719c703..6a4b59a0d8e6 100644 |
| |
| |
| @@ -498,6 +498,11 @@ static int sof_control_load_volume(struct snd_soc_component *scomp, |
| ret = sof_parse_tokens(scomp, &scontrol->led_ctl, led_tokens, |
| ARRAY_SIZE(led_tokens), mc->priv.array, |
| le32_to_cpu(mc->priv.size)); |
| + if (ret != 0) { |
| + dev_err(sdev->dev, "error: parse led tokens failed %d\n", |
| + le32_to_cpu(mc->priv.size)); |
| + return ret; |
| + } |
| |
| dev_dbg(sdev->dev, "tplg: load kcontrol index %d chans %d\n", |
| scontrol->comp_id, scontrol->num_channels); |
| -- |
| 2.24.1 |
| |
| From 0fce4bacf9c669391c8e149a1d50feeea8e7b45a Mon Sep 17 00:00:00 2001 |
| From: YueHaibing <yuehaibing@huawei.com> |
| Date: Mon, 14 Oct 2019 17:13:08 +0800 |
| Subject: [PATCH 032/109] ASoC: SOF: Fix randbuild error |
| |
| When LEDS_TRIGGER_AUDIO is m and SND_SOC_SOF is y, |
| |
| sound/soc/sof/control.o: In function `snd_sof_switch_put': |
| control.c:(.text+0x587): undefined reference to `ledtrig_audio_set' |
| control.c:(.text+0x593): undefined reference to `ledtrig_audio_set' |
| |
| Reported-by: Hulk Robot <hulkci@huawei.com> |
| Fixes: 5d43001ae436 ("ASoC: SOF: acpi led support for switch controls") |
| Signed-off-by: YueHaibing <yuehaibing@huawei.com> |
| Acked-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191014091308.23688-1-yuehaibing@huawei.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 9899a7a869935c4c93247b290ac7a70e0deab202) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/control.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| diff --git a/sound/soc/sof/control.c b/sound/soc/sof/control.c |
| index b73d4587c5da..7baf7f1507c3 100644 |
| |
| |
| @@ -36,10 +36,12 @@ static void update_mute_led(struct snd_sof_control *scontrol, |
| |
| scontrol->led_ctl.led_value = temp; |
| |
| +#if IS_REACHABLE(CONFIG_LEDS_TRIGGER_AUDIO) |
| if (!scontrol->led_ctl.direction) |
| ledtrig_audio_set(LED_AUDIO_MUTE, temp ? LED_OFF : LED_ON); |
| else |
| ledtrig_audio_set(LED_AUDIO_MICMUTE, temp ? LED_OFF : LED_ON); |
| +#endif |
| } |
| |
| static inline u32 mixer_to_ipc(unsigned int value, u32 *volume_map, int size) |
| -- |
| 2.24.1 |
| |
| From c0ad6198c8bf64123877e61ebff462fff7c37402 Mon Sep 17 00:00:00 2001 |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Date: Tue, 22 Oct 2019 14:28:43 -0500 |
| Subject: [PATCH 033/109] ASoC: SOF: Intel: hda-loader: improve error handling |
| |
| If a ROM timeout is detected, we still stop the DMA but will return |
| the initial error should the DMA stop also fail. |
| |
| Likewise the cleanup is handled regardless of the status, but we |
| return the initial error. |
| |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191022192844.21022-2-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 76dc6a2b312d15c91ff4b4d171e98cdc73ba3745) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/intel/hda-loader.c | 12 ++++++++++-- |
| 1 file changed, 10 insertions(+), 2 deletions(-) |
| |
| diff --git a/sound/soc/sof/intel/hda-loader.c b/sound/soc/sof/intel/hda-loader.c |
| index 356bb134ae93..e24b99fd7d39 100644 |
| |
| |
| @@ -253,10 +253,16 @@ static int cl_copy_fw(struct snd_sof_dev *sdev, struct hdac_ext_stream *stream) |
| HDA_DSP_REG_POLL_INTERVAL_US, |
| HDA_DSP_BASEFW_TIMEOUT_US); |
| |
| + /* |
| + * even in case of errors we still need to stop the DMAs, |
| + * but we return the initial error should the DMA stop also fail |
| + */ |
| + |
| ret = cl_trigger(sdev, stream, SNDRV_PCM_TRIGGER_STOP); |
| if (ret < 0) { |
| dev_err(sdev->dev, "error: DMA trigger stop failed\n"); |
| - return ret; |
| + if (!status) |
| + status = ret; |
| } |
| |
| return status; |
| @@ -340,13 +346,15 @@ int hda_dsp_cl_boot_firmware(struct snd_sof_dev *sdev) |
| /* |
| * Perform codeloader stream cleanup. |
| * This should be done even if firmware loading fails. |
| + * If the cleanup also fails, we return the initial error |
| */ |
| ret1 = cl_cleanup(sdev, &sdev->dmab, stream); |
| if (ret1 < 0) { |
| dev_err(sdev->dev, "error: Code loader DSP cleanup failed\n"); |
| |
| /* set return value to indicate cleanup failure */ |
| - ret = ret1; |
| + if (!ret) |
| + ret = ret1; |
| } |
| |
| /* |
| -- |
| 2.24.1 |
| |
| From e057b265445a38082f2f566809c98b4615cadbb6 Mon Sep 17 00:00:00 2001 |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Date: Tue, 22 Oct 2019 14:28:44 -0500 |
| Subject: [PATCH 034/109] ASoC: SOF: Intel: hda: add dev_err() traces for |
| snd_sof_dsp_read_poll_timeout() |
| |
| Such traces should be extremely rare but extremely useful for debug. |
| |
| Report errors for all calls to sdn_sof_dsp_read_poll_timeout(), but |
| only on negative values for consistency. |
| |
| Add traces that enable each timeout to be uniquely identified. |
| |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191022192844.21022-3-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 6a414489e0f3309a221f26b3d11c19d1a96a3635) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/intel/hda-dsp.c | 30 +++++++++++++++++++++++++++--- |
| sound/soc/sof/intel/hda-loader.c | 13 ++++++++++++- |
| sound/soc/sof/intel/hda-stream.c | 24 ++++++++++++++++++++---- |
| 3 files changed, 59 insertions(+), 8 deletions(-) |
| |
| diff --git a/sound/soc/sof/intel/hda-dsp.c b/sound/soc/sof/intel/hda-dsp.c |
| index fb55a3c5afd0..3ea401646e0c 100644 |
| |
| |
| @@ -42,6 +42,12 @@ int hda_dsp_core_reset_enter(struct snd_sof_dev *sdev, unsigned int core_mask) |
| ((adspcs & reset) == reset), |
| HDA_DSP_REG_POLL_INTERVAL_US, |
| HDA_DSP_RESET_TIMEOUT_US); |
| + if (ret < 0) { |
| + dev_err(sdev->dev, |
| + "error: %s: timeout on HDA_DSP_REG_ADSPCS read\n", |
| + __func__); |
| + return ret; |
| + } |
| |
| /* has core entered reset ? */ |
| adspcs = snd_sof_dsp_read(sdev, HDA_DSP_BAR, |
| @@ -77,6 +83,13 @@ int hda_dsp_core_reset_leave(struct snd_sof_dev *sdev, unsigned int core_mask) |
| HDA_DSP_REG_POLL_INTERVAL_US, |
| HDA_DSP_RESET_TIMEOUT_US); |
| |
| + if (ret < 0) { |
| + dev_err(sdev->dev, |
| + "error: %s: timeout on HDA_DSP_REG_ADSPCS read\n", |
| + __func__); |
| + return ret; |
| + } |
| + |
| /* has core left reset ? */ |
| adspcs = snd_sof_dsp_read(sdev, HDA_DSP_BAR, |
| HDA_DSP_REG_ADSPCS); |
| @@ -151,8 +164,12 @@ int hda_dsp_core_power_up(struct snd_sof_dev *sdev, unsigned int core_mask) |
| (adspcs & cpa) == cpa, |
| HDA_DSP_REG_POLL_INTERVAL_US, |
| HDA_DSP_RESET_TIMEOUT_US); |
| - if (ret < 0) |
| - dev_err(sdev->dev, "error: timeout on core powerup\n"); |
| + if (ret < 0) { |
| + dev_err(sdev->dev, |
| + "error: %s: timeout on HDA_DSP_REG_ADSPCS read\n", |
| + __func__); |
| + return ret; |
| + } |
| |
| /* did core power up ? */ |
| adspcs = snd_sof_dsp_read(sdev, HDA_DSP_BAR, |
| @@ -171,17 +188,24 @@ int hda_dsp_core_power_up(struct snd_sof_dev *sdev, unsigned int core_mask) |
| int hda_dsp_core_power_down(struct snd_sof_dev *sdev, unsigned int core_mask) |
| { |
| u32 adspcs; |
| + int ret; |
| |
| /* update bits */ |
| snd_sof_dsp_update_bits_unlocked(sdev, HDA_DSP_BAR, |
| HDA_DSP_REG_ADSPCS, |
| HDA_DSP_ADSPCS_SPA_MASK(core_mask), 0); |
| |
| - return snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR, |
| + ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR, |
| HDA_DSP_REG_ADSPCS, adspcs, |
| !(adspcs & HDA_DSP_ADSPCS_SPA_MASK(core_mask)), |
| HDA_DSP_REG_POLL_INTERVAL_US, |
| HDA_DSP_PD_TIMEOUT * USEC_PER_MSEC); |
| + if (ret < 0) |
| + dev_err(sdev->dev, |
| + "error: %s: timeout on HDA_DSP_REG_ADSPCS read\n", |
| + __func__); |
| + |
| + return ret; |
| } |
| |
| bool hda_dsp_core_is_enabled(struct snd_sof_dev *sdev, |
| diff --git a/sound/soc/sof/intel/hda-loader.c b/sound/soc/sof/intel/hda-loader.c |
| index e24b99fd7d39..1782f5092639 100644 |
| |
| |
| @@ -126,7 +126,8 @@ static int cl_dsp_init(struct snd_sof_dev *sdev, const void *fwdata, |
| HDA_DSP_INIT_TIMEOUT_US); |
| |
| if (ret < 0) { |
| - dev_err(sdev->dev, "error: waiting for HIPCIE done\n"); |
| + dev_err(sdev->dev, "error: %s: timeout for HIPCIE done\n", |
| + __func__); |
| goto err; |
| } |
| |
| @@ -152,6 +153,10 @@ static int cl_dsp_init(struct snd_sof_dev *sdev, const void *fwdata, |
| if (!ret) |
| return 0; |
| |
| + dev_err(sdev->dev, |
| + "error: %s: timeout HDA_DSP_SRAM_REG_ROM_STATUS read\n", |
| + __func__); |
| + |
| err: |
| hda_dsp_dump(sdev, SOF_DBG_REGS | SOF_DBG_PCI | SOF_DBG_MBOX); |
| hda_dsp_core_reset_power_down(sdev, chip->cores_mask); |
| @@ -258,6 +263,12 @@ static int cl_copy_fw(struct snd_sof_dev *sdev, struct hdac_ext_stream *stream) |
| * but we return the initial error should the DMA stop also fail |
| */ |
| |
| + if (status < 0) { |
| + dev_err(sdev->dev, |
| + "error: %s: timeout HDA_DSP_SRAM_REG_ROM_STATUS read\n", |
| + __func__); |
| + } |
| + |
| ret = cl_trigger(sdev, stream, SNDRV_PCM_TRIGGER_STOP); |
| if (ret < 0) { |
| dev_err(sdev->dev, "error: DMA trigger stop failed\n"); |
| diff --git a/sound/soc/sof/intel/hda-stream.c b/sound/soc/sof/intel/hda-stream.c |
| index 0c11fceb28a7..29ab43281670 100644 |
| |
| |
| @@ -275,8 +275,12 @@ int hda_dsp_stream_trigger(struct snd_sof_dev *sdev, |
| HDA_DSP_REG_POLL_INTERVAL_US, |
| HDA_DSP_STREAM_RUN_TIMEOUT); |
| |
| - if (ret) |
| + if (ret < 0) { |
| + dev_err(sdev->dev, |
| + "error: %s: cmd %d: timeout on STREAM_SD_OFFSET read\n", |
| + __func__, cmd); |
| return ret; |
| + } |
| |
| hstream->running = true; |
| break; |
| @@ -294,8 +298,12 @@ int hda_dsp_stream_trigger(struct snd_sof_dev *sdev, |
| HDA_DSP_REG_POLL_INTERVAL_US, |
| HDA_DSP_STREAM_RUN_TIMEOUT); |
| |
| - if (ret) |
| + if (ret < 0) { |
| + dev_err(sdev->dev, |
| + "error: %s: cmd %d: timeout on STREAM_SD_OFFSET read\n", |
| + __func__, cmd); |
| return ret; |
| + } |
| |
| snd_sof_dsp_write(sdev, HDA_DSP_HDA_BAR, sd_offset + |
| SOF_HDA_ADSP_REG_CL_SD_STS, |
| @@ -356,8 +364,12 @@ int hda_dsp_stream_hw_params(struct snd_sof_dev *sdev, |
| HDA_DSP_REG_POLL_INTERVAL_US, |
| HDA_DSP_STREAM_RUN_TIMEOUT); |
| |
| - if (ret) |
| + if (ret < 0) { |
| + dev_err(sdev->dev, |
| + "error: %s: timeout on STREAM_SD_OFFSET read1\n", |
| + __func__); |
| return ret; |
| + } |
| |
| snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR, |
| sd_offset + SOF_HDA_ADSP_REG_CL_SD_STS, |
| @@ -418,8 +430,12 @@ int hda_dsp_stream_hw_params(struct snd_sof_dev *sdev, |
| HDA_DSP_REG_POLL_INTERVAL_US, |
| HDA_DSP_STREAM_RUN_TIMEOUT); |
| |
| - if (ret) |
| + if (ret < 0) { |
| + dev_err(sdev->dev, |
| + "error: %s: timeout on STREAM_SD_OFFSET read2\n", |
| + __func__); |
| return ret; |
| + } |
| |
| snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR, |
| sd_offset + SOF_HDA_ADSP_REG_CL_SD_STS, |
| -- |
| 2.24.1 |
| |
| From 9ab29db3973a89c482f1ae7bee4d7800d77f45c2 Mon Sep 17 00:00:00 2001 |
| From: Pan Xiuli <xiuli.pan@linux.intel.com> |
| Date: Tue, 22 Oct 2019 14:47:05 -0500 |
| Subject: [PATCH 035/109] ASoC: SOF: Intel: initial support to JasperLake. |
| |
| Add Kconfig, PCI ID and chip info for JSL platform. |
| The DSP only has 2 cores for this platform. |
| |
| Signed-off-by: Pan Xiuli <xiuli.pan@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191022194705.23347-3-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 6fd9903527bf103167004022a0199b8fac1b8b29) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/intel/Kconfig | 16 ++++++++++++++++ |
| sound/soc/sof/intel/cnl.c | 17 +++++++++++++++++ |
| sound/soc/sof/intel/hda.h | 1 + |
| sound/soc/sof/sof-pci-dev.c | 22 ++++++++++++++++++++++ |
| 4 files changed, 56 insertions(+) |
| |
| diff --git a/sound/soc/sof/intel/Kconfig b/sound/soc/sof/intel/Kconfig |
| index d6d65e70eebb..a40e10dc80d5 100644 |
| |
| |
| @@ -29,6 +29,7 @@ config SND_SOC_SOF_INTEL_PCI |
| select SND_SOC_SOF_COMETLAKE_H if SND_SOC_SOF_COMETLAKE_H_SUPPORT |
| select SND_SOC_SOF_TIGERLAKE if SND_SOC_SOF_TIGERLAKE_SUPPORT |
| select SND_SOC_SOF_ELKHARTLAKE if SND_SOC_SOF_ELKHARTLAKE_SUPPORT |
| + select SND_SOC_SOF_JASPERLAKE if SND_SOC_SOF_JASPERLAKE_SUPPORT |
| help |
| This option is not user-selectable but automagically handled by |
| 'select' statements at a higher level |
| @@ -252,6 +253,21 @@ config SND_SOC_SOF_ELKHARTLAKE |
| This option is not user-selectable but automagically handled by |
| 'select' statements at a higher level |
| |
| +config SND_SOC_SOF_JASPERLAKE_SUPPORT |
| + bool "SOF support for JasperLake" |
| + help |
| + This adds support for Sound Open Firmware for Intel(R) platforms |
| + using the JasperLake processors. |
| + Say Y if you have such a device. |
| + If unsure select "N". |
| + |
| +config SND_SOC_SOF_JASPERLAKE |
| + tristate |
| + select SND_SOC_SOF_HDA_COMMON |
| + help |
| + This option is not user-selectable but automagically handled by |
| + 'select' statements at a higher level |
| + |
| config SND_SOC_SOF_HDA_COMMON |
| tristate |
| select SND_SOC_SOF_INTEL_COMMON |
| diff --git a/sound/soc/sof/intel/cnl.c b/sound/soc/sof/intel/cnl.c |
| index 4ddd73762d81..5b97bdfba823 100644 |
| |
| |
| @@ -327,3 +327,20 @@ const struct sof_intel_dsp_desc ehl_chip_info = { |
| .ssp_base_offset = CNL_SSP_BASE_OFFSET, |
| }; |
| EXPORT_SYMBOL(ehl_chip_info); |
| + |
| +const struct sof_intel_dsp_desc jsl_chip_info = { |
| + /* Jasperlake */ |
| + .cores_num = 2, |
| + .init_core_mask = 1, |
| + .cores_mask = HDA_DSP_CORE_MASK(0) | |
| + HDA_DSP_CORE_MASK(1), |
| + .ipc_req = CNL_DSP_REG_HIPCIDR, |
| + .ipc_req_mask = CNL_DSP_REG_HIPCIDR_BUSY, |
| + .ipc_ack = CNL_DSP_REG_HIPCIDA, |
| + .ipc_ack_mask = CNL_DSP_REG_HIPCIDA_DONE, |
| + .ipc_ctl = CNL_DSP_REG_HIPCCTL, |
| + .rom_init_timeout = 300, |
| + .ssp_count = ICL_SSP_COUNT, |
| + .ssp_base_offset = CNL_SSP_BASE_OFFSET, |
| +}; |
| +EXPORT_SYMBOL(jsl_chip_info); |
| diff --git a/sound/soc/sof/intel/hda.h b/sound/soc/sof/intel/hda.h |
| index 23e430d3e056..ea02bf40cb25 100644 |
| |
| |
| @@ -604,5 +604,6 @@ extern const struct sof_intel_dsp_desc skl_chip_info; |
| extern const struct sof_intel_dsp_desc icl_chip_info; |
| extern const struct sof_intel_dsp_desc tgl_chip_info; |
| extern const struct sof_intel_dsp_desc ehl_chip_info; |
| +extern const struct sof_intel_dsp_desc jsl_chip_info; |
| |
| #endif |
| diff --git a/sound/soc/sof/sof-pci-dev.c b/sound/soc/sof/sof-pci-dev.c |
| index be5a8da504c5..e0b150f29e81 100644 |
| |
| |
| @@ -246,6 +246,24 @@ static const struct sof_dev_desc ehl_desc = { |
| }; |
| #endif |
| |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_JASPERLAKE) |
| +static const struct sof_dev_desc jsl_desc = { |
| + .machines = snd_soc_acpi_intel_jsl_machines, |
| + .resindex_lpe_base = 0, |
| + .resindex_pcicfg_base = -1, |
| + .resindex_imr_base = -1, |
| + .irqindex_host_ipc = -1, |
| + .resindex_dma_base = -1, |
| + .chip_info = &jsl_chip_info, |
| + .default_fw_path = "intel/sof", |
| + .default_tplg_path = "intel/sof-tplg", |
| + .nocodec_fw_filename = "sof-jsl.ri", |
| + .nocodec_tplg_filename = "sof-jsl-nocodec.tplg", |
| + .ops = &sof_cnl_ops, |
| + .arch_ops = &sof_xtensa_arch_ops |
| +}; |
| +#endif |
| + |
| static const struct dev_pm_ops sof_pci_pm = { |
| SET_SYSTEM_SLEEP_PM_OPS(snd_sof_suspend, snd_sof_resume) |
| SET_RUNTIME_PM_OPS(snd_sof_runtime_suspend, snd_sof_runtime_resume, |
| @@ -429,6 +447,10 @@ static const struct pci_device_id sof_pci_ids[] = { |
| { PCI_DEVICE(0x8086, 0x34C8), |
| .driver_data = (unsigned long)&icl_desc}, |
| #endif |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_JASPERLAKE) |
| + { PCI_DEVICE(0x8086, 0x38c8), |
| + .driver_data = (unsigned long)&jsl_desc}, |
| +#endif |
| #if IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_LP) |
| { PCI_DEVICE(0x8086, 0x02c8), |
| .driver_data = (unsigned long)&cml_desc}, |
| -- |
| 2.24.1 |
| |
| From 8944590a924791652dc14b2e7cffb7102f366ad5 Mon Sep 17 00:00:00 2001 |
| From: Pan Xiuli <xiuli.pan@linux.intel.com> |
| Date: Tue, 22 Oct 2019 14:47:04 -0500 |
| Subject: [PATCH 036/109] ASoC: Intel: common: add ACPI matching tables for JSL |
| |
| There are no upstream machine drivers just yet so just add dummy table |
| for compilation in nocodec-mode. |
| |
| Signed-off-by: Pan Xiuli <xiuli.pan@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191022194705.23347-2-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 4f0637eae56f02ef648de5ed839d572259d396e9) |
| Bugzilla: 1772498 |
| |
| include/sound/soc-acpi-intel-match.h | 1 + |
| sound/soc/intel/common/Makefile | 1 + |
| .../intel/common/soc-acpi-intel-jsl-match.c | 18 ++++++++++++++++++ |
| 3 files changed, 20 insertions(+) |
| create mode 100644 sound/soc/intel/common/soc-acpi-intel-jsl-match.c |
| |
| diff --git a/include/sound/soc-acpi-intel-match.h b/include/sound/soc-acpi-intel-match.h |
| index 6c9929abd90b..4e44782862df 100644 |
| |
| |
| @@ -27,6 +27,7 @@ extern struct snd_soc_acpi_mach snd_soc_acpi_intel_cnl_machines[]; |
| extern struct snd_soc_acpi_mach snd_soc_acpi_intel_icl_machines[]; |
| extern struct snd_soc_acpi_mach snd_soc_acpi_intel_tgl_machines[]; |
| extern struct snd_soc_acpi_mach snd_soc_acpi_intel_ehl_machines[]; |
| +extern struct snd_soc_acpi_mach snd_soc_acpi_intel_jsl_machines[]; |
| |
| /* |
| * generic table used for HDA codec-based platforms, possibly with |
| diff --git a/sound/soc/intel/common/Makefile b/sound/soc/intel/common/Makefile |
| index 18d9630ae9a2..eafe95ead49b 100644 |
| |
| |
| @@ -9,6 +9,7 @@ snd-soc-acpi-intel-match-objs := soc-acpi-intel-byt-match.o soc-acpi-intel-cht-m |
| soc-acpi-intel-bxt-match.o soc-acpi-intel-glk-match.o \ |
| soc-acpi-intel-cnl-match.o soc-acpi-intel-icl-match.o \ |
| soc-acpi-intel-tgl-match.o soc-acpi-intel-ehl-match.o \ |
| + soc-acpi-intel-jsl-match.o \ |
| soc-acpi-intel-hda-match.o |
| |
| obj-$(CONFIG_SND_SOC_INTEL_SST) += snd-soc-sst-dsp.o snd-soc-sst-ipc.o |
| diff --git a/sound/soc/intel/common/soc-acpi-intel-jsl-match.c b/sound/soc/intel/common/soc-acpi-intel-jsl-match.c |
| new file mode 100644 |
| index 000000000000..1c68a04f0c6e |
| |
| |
| @@ -0,0 +1,18 @@ |
| +// SPDX-License-Identifier: GPL-2.0 |
| +/* |
| + * soc-apci-intel-jsl-match.c - tables and support for JSL ACPI enumeration. |
| + * |
| + * Copyright (c) 2019, Intel Corporation. |
| + * |
| + */ |
| + |
| +#include <sound/soc-acpi.h> |
| +#include <sound/soc-acpi-intel-match.h> |
| + |
| +struct snd_soc_acpi_mach snd_soc_acpi_intel_jsl_machines[] = { |
| + {}, |
| +}; |
| +EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_jsl_machines); |
| + |
| +MODULE_LICENSE("GPL v2"); |
| +MODULE_DESCRIPTION("Intel Common ACPI Match module"); |
| -- |
| 2.24.1 |
| |
| From 4ab80912a87e828850601ac1d0d2804467e3e7f9 Mon Sep 17 00:00:00 2001 |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Date: Thu, 24 Oct 2019 16:03:17 -0500 |
| Subject: [PATCH 037/109] ASoC: SOF: define INFO_ flags in dsp_ops |
| |
| Currently the INFO_ flags such as PAUSE/NO_PERIOD_WAKEUP are defined |
| in the SOF PCM core, which doesn't scale. To account for platform |
| variations, these flags need to be set in DSP ops. |
| |
| This patch only moves the definitions and does not change any |
| functionality. |
| |
| Reviewed-by: Jaska Uimonen <jaska.uimonen@intel.com> |
| Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191024210318.30068-2-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 27e322fabd508ba73ced625fc41f0b7ceee26416) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/imx/imx8.c | 7 +++++++ |
| sound/soc/sof/intel/apl.c | 7 +++++++ |
| sound/soc/sof/intel/bdw.c | 9 ++++++++- |
| sound/soc/sof/intel/byt.c | 21 +++++++++++++++++++++ |
| sound/soc/sof/intel/cnl.c | 7 +++++++ |
| sound/soc/sof/pcm.c | 8 +++----- |
| sound/soc/sof/sof-priv.h | 3 +++ |
| 7 files changed, 56 insertions(+), 6 deletions(-) |
| |
| diff --git a/sound/soc/sof/imx/imx8.c b/sound/soc/sof/imx/imx8.c |
| index 69785f688ddf..aef6ca167b9c 100644 |
| |
| |
| @@ -391,6 +391,13 @@ struct snd_sof_dsp_ops sof_imx8_ops = { |
| /* DAI drivers */ |
| .drv = imx8_dai, |
| .num_drv = 1, /* we have only 1 ESAI interface on i.MX8 */ |
| + |
| + /* ALSA HW info flags */ |
| + .hw_info = SNDRV_PCM_INFO_MMAP | |
| + SNDRV_PCM_INFO_MMAP_VALID | |
| + SNDRV_PCM_INFO_INTERLEAVED | |
| + SNDRV_PCM_INFO_PAUSE | |
| + SNDRV_PCM_INFO_NO_PERIOD_WAKEUP |
| }; |
| EXPORT_SYMBOL(sof_imx8_ops); |
| |
| diff --git a/sound/soc/sof/intel/apl.c b/sound/soc/sof/intel/apl.c |
| index 8dc7a5558da4..15d26e8d90a9 100644 |
| |
| |
| @@ -97,6 +97,13 @@ const struct snd_sof_dsp_ops sof_apl_ops = { |
| .runtime_resume = hda_dsp_runtime_resume, |
| .runtime_idle = hda_dsp_runtime_idle, |
| .set_hw_params_upon_resume = hda_dsp_set_hw_params_upon_resume, |
| + |
| + /* ALSA HW info flags */ |
| + .hw_info = SNDRV_PCM_INFO_MMAP | |
| + SNDRV_PCM_INFO_MMAP_VALID | |
| + SNDRV_PCM_INFO_INTERLEAVED | |
| + SNDRV_PCM_INFO_PAUSE | |
| + SNDRV_PCM_INFO_NO_PERIOD_WAKEUP, |
| }; |
| EXPORT_SYMBOL(sof_apl_ops); |
| |
| diff --git a/sound/soc/sof/intel/bdw.c b/sound/soc/sof/intel/bdw.c |
| index bf961a8798a7..7b4cd1f456bf 100644 |
| |
| |
| @@ -591,7 +591,14 @@ const struct snd_sof_dsp_ops sof_bdw_ops = { |
| |
| /* DAI drivers */ |
| .drv = bdw_dai, |
| - .num_drv = ARRAY_SIZE(bdw_dai) |
| + .num_drv = ARRAY_SIZE(bdw_dai), |
| + |
| + /* ALSA HW info flags */ |
| + .hw_info = SNDRV_PCM_INFO_MMAP | |
| + SNDRV_PCM_INFO_MMAP_VALID | |
| + SNDRV_PCM_INFO_INTERLEAVED | |
| + SNDRV_PCM_INFO_PAUSE | |
| + SNDRV_PCM_INFO_NO_PERIOD_WAKEUP, |
| }; |
| EXPORT_SYMBOL(sof_bdw_ops); |
| |
| diff --git a/sound/soc/sof/intel/byt.c b/sound/soc/sof/intel/byt.c |
| index 84d6069b5075..514cf4b9ebf4 100644 |
| |
| |
| @@ -533,6 +533,13 @@ const struct snd_sof_dsp_ops sof_tng_ops = { |
| /* DAI drivers */ |
| .drv = byt_dai, |
| .num_drv = 3, /* we have only 3 SSPs on byt*/ |
| + |
| + /* ALSA HW info flags */ |
| + .hw_info = SNDRV_PCM_INFO_MMAP | |
| + SNDRV_PCM_INFO_MMAP_VALID | |
| + SNDRV_PCM_INFO_INTERLEAVED | |
| + SNDRV_PCM_INFO_PAUSE | |
| + SNDRV_PCM_INFO_NO_PERIOD_WAKEUP, |
| }; |
| EXPORT_SYMBOL(sof_tng_ops); |
| |
| @@ -694,6 +701,13 @@ const struct snd_sof_dsp_ops sof_byt_ops = { |
| /* DAI drivers */ |
| .drv = byt_dai, |
| .num_drv = 3, /* we have only 3 SSPs on byt*/ |
| + |
| + /* ALSA HW info flags */ |
| + .hw_info = SNDRV_PCM_INFO_MMAP | |
| + SNDRV_PCM_INFO_MMAP_VALID | |
| + SNDRV_PCM_INFO_INTERLEAVED | |
| + SNDRV_PCM_INFO_PAUSE | |
| + SNDRV_PCM_INFO_NO_PERIOD_WAKEUP, |
| }; |
| EXPORT_SYMBOL(sof_byt_ops); |
| |
| @@ -754,6 +768,13 @@ const struct snd_sof_dsp_ops sof_cht_ops = { |
| .drv = byt_dai, |
| /* all 6 SSPs may be available for cherrytrail */ |
| .num_drv = ARRAY_SIZE(byt_dai), |
| + |
| + /* ALSA HW info flags */ |
| + .hw_info = SNDRV_PCM_INFO_MMAP | |
| + SNDRV_PCM_INFO_MMAP_VALID | |
| + SNDRV_PCM_INFO_INTERLEAVED | |
| + SNDRV_PCM_INFO_PAUSE | |
| + SNDRV_PCM_INFO_NO_PERIOD_WAKEUP, |
| }; |
| EXPORT_SYMBOL(sof_cht_ops); |
| |
| diff --git a/sound/soc/sof/intel/cnl.c b/sound/soc/sof/intel/cnl.c |
| index 5b97bdfba823..e9cdcc040fb5 100644 |
| |
| |
| @@ -255,6 +255,13 @@ const struct snd_sof_dsp_ops sof_cnl_ops = { |
| .runtime_resume = hda_dsp_runtime_resume, |
| .runtime_idle = hda_dsp_runtime_idle, |
| .set_hw_params_upon_resume = hda_dsp_set_hw_params_upon_resume, |
| + |
| + /* ALSA HW info flags */ |
| + .hw_info = SNDRV_PCM_INFO_MMAP | |
| + SNDRV_PCM_INFO_MMAP_VALID | |
| + SNDRV_PCM_INFO_INTERLEAVED | |
| + SNDRV_PCM_INFO_PAUSE | |
| + SNDRV_PCM_INFO_NO_PERIOD_WAKEUP, |
| }; |
| EXPORT_SYMBOL(sof_cnl_ops); |
| |
| diff --git a/sound/soc/sof/pcm.c b/sound/soc/sof/pcm.c |
| index b0f4217433e5..b33928e1385b 100644 |
| |
| |
| @@ -435,6 +435,7 @@ static int sof_pcm_open(struct snd_pcm_substream *substream) |
| struct snd_soc_component *component = |
| snd_soc_rtdcom_lookup(rtd, DRV_NAME); |
| struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component); |
| + const struct snd_sof_dsp_ops *ops = sof_ops(sdev); |
| struct snd_sof_pcm *spcm; |
| struct snd_soc_tplg_stream_caps *caps; |
| int ret; |
| @@ -464,11 +465,8 @@ static int sof_pcm_open(struct snd_pcm_substream *substream) |
| le32_to_cpu(caps->period_size_min)); |
| |
| /* set runtime config */ |
| - runtime->hw.info = SNDRV_PCM_INFO_MMAP | |
| - SNDRV_PCM_INFO_MMAP_VALID | |
| - SNDRV_PCM_INFO_INTERLEAVED | |
| - SNDRV_PCM_INFO_PAUSE | |
| - SNDRV_PCM_INFO_NO_PERIOD_WAKEUP; |
| + runtime->hw.info = ops->hw_info; /* platform-specific */ |
| + |
| runtime->hw.formats = le64_to_cpu(caps->formats); |
| runtime->hw.period_bytes_min = le32_to_cpu(caps->period_size_min); |
| runtime->hw.period_bytes_max = le32_to_cpu(caps->period_size_max); |
| diff --git a/sound/soc/sof/sof-priv.h b/sound/soc/sof/sof-priv.h |
| index 9729deafec08..26ea5099bf4e 100644 |
| |
| |
| @@ -211,6 +211,9 @@ struct snd_sof_dsp_ops { |
| /* DAI ops */ |
| struct snd_soc_dai_driver *drv; |
| int num_drv; |
| + |
| + /* ALSA HW info flags, will be stored in snd_pcm_runtime.hw.info */ |
| + u32 hw_info; |
| }; |
| |
| /* DSP architecture specific callbacks for oops and stack dumps */ |
| -- |
| 2.24.1 |
| |
| From 70c1d574a342bb625ac80e233531188121ecb526 Mon Sep 17 00:00:00 2001 |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Date: Thu, 24 Oct 2019 16:03:18 -0500 |
| Subject: [PATCH 038/109] ASoC: SOF: Intel: only support INFO_BATCH for legacy |
| platforms |
| |
| The current position update is not precise enough for PulseAudio to |
| work reliably with the timer-based scheduling on Baytrail, |
| Cherrytrail, Broadwell. |
| |
| Disable the NO_PERIOD_WAKEUP capability and use BATCH to signal that |
| the position is only reliable and updated during period_elapsed |
| events. |
| |
| This will be reverted when the firmware provides a more accurate |
| position for those platforms. |
| |
| Reviewed-by: Jaska Uimonen <jaska.uimonen@intel.com> |
| Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191024210318.30068-3-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 4c02a7bd43e22f4de53ad55b94d24e4388f712f0) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/intel/bdw.c | 2 +- |
| sound/soc/sof/intel/byt.c | 6 +++--- |
| 2 files changed, 4 insertions(+), 4 deletions(-) |
| |
| diff --git a/sound/soc/sof/intel/bdw.c b/sound/soc/sof/intel/bdw.c |
| index 7b4cd1f456bf..141dad554764 100644 |
| |
| |
| @@ -598,7 +598,7 @@ const struct snd_sof_dsp_ops sof_bdw_ops = { |
| SNDRV_PCM_INFO_MMAP_VALID | |
| SNDRV_PCM_INFO_INTERLEAVED | |
| SNDRV_PCM_INFO_PAUSE | |
| - SNDRV_PCM_INFO_NO_PERIOD_WAKEUP, |
| + SNDRV_PCM_INFO_BATCH, |
| }; |
| EXPORT_SYMBOL(sof_bdw_ops); |
| |
| diff --git a/sound/soc/sof/intel/byt.c b/sound/soc/sof/intel/byt.c |
| index 514cf4b9ebf4..a39a90d61b8f 100644 |
| |
| |
| @@ -539,7 +539,7 @@ const struct snd_sof_dsp_ops sof_tng_ops = { |
| SNDRV_PCM_INFO_MMAP_VALID | |
| SNDRV_PCM_INFO_INTERLEAVED | |
| SNDRV_PCM_INFO_PAUSE | |
| - SNDRV_PCM_INFO_NO_PERIOD_WAKEUP, |
| + SNDRV_PCM_INFO_BATCH, |
| }; |
| EXPORT_SYMBOL(sof_tng_ops); |
| |
| @@ -707,7 +707,7 @@ const struct snd_sof_dsp_ops sof_byt_ops = { |
| SNDRV_PCM_INFO_MMAP_VALID | |
| SNDRV_PCM_INFO_INTERLEAVED | |
| SNDRV_PCM_INFO_PAUSE | |
| - SNDRV_PCM_INFO_NO_PERIOD_WAKEUP, |
| + SNDRV_PCM_INFO_BATCH, |
| }; |
| EXPORT_SYMBOL(sof_byt_ops); |
| |
| @@ -774,7 +774,7 @@ const struct snd_sof_dsp_ops sof_cht_ops = { |
| SNDRV_PCM_INFO_MMAP_VALID | |
| SNDRV_PCM_INFO_INTERLEAVED | |
| SNDRV_PCM_INFO_PAUSE | |
| - SNDRV_PCM_INFO_NO_PERIOD_WAKEUP, |
| + SNDRV_PCM_INFO_BATCH, |
| }; |
| EXPORT_SYMBOL(sof_cht_ops); |
| |
| -- |
| 2.24.1 |
| |
| From ba899e9f4bddd20463b3ba20ba77918ada567e5a Mon Sep 17 00:00:00 2001 |
| From: Jaroslav Kysela <perex@perex.cz> |
| Date: Mon, 28 Oct 2019 18:33:29 +0100 |
| Subject: [PATCH 039/109] ASoC: SOF - remove the dead code (skylake/kabylake) |
| |
| Appearently the CONFIG_SND_SOC_SOF_KABYLAKE and CONFIG_SND_SOC_SOF_SKYLAKE |
| options are not present in Kconfig and 'struct snd_sof_dsp_ops sof_skl_ops' |
| is not declared in the code, too. |
| |
| Signed-off-by: Jaroslav Kysela <perex@perex.cz> |
| Cc: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Cc: Mark Brown <broonie@kernel.org> |
| Link: https://lore.kernel.org/r/20191028173329.29538-1-perex@perex.cz |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit c3ad1092e1069f27d0ca110dcaada8a5435ea3e0) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/intel/hda.h | 1 - |
| sound/soc/sof/sof-pci-dev.c | 44 ------------------------------------- |
| 2 files changed, 45 deletions(-) |
| |
| diff --git a/sound/soc/sof/intel/hda.h b/sound/soc/sof/intel/hda.h |
| index ea02bf40cb25..8e03d876a0ac 100644 |
| |
| |
| @@ -596,7 +596,6 @@ extern struct snd_soc_dai_driver skl_dai[]; |
| */ |
| extern const struct snd_sof_dsp_ops sof_apl_ops; |
| extern const struct snd_sof_dsp_ops sof_cnl_ops; |
| -extern const struct snd_sof_dsp_ops sof_skl_ops; |
| |
| extern const struct sof_intel_dsp_desc apl_chip_info; |
| extern const struct sof_intel_dsp_desc cnl_chip_info; |
| diff --git a/sound/soc/sof/sof-pci-dev.c b/sound/soc/sof/sof-pci-dev.c |
| index e0b150f29e81..067acf389af7 100644 |
| |
| |
| @@ -174,42 +174,6 @@ static const struct sof_dev_desc icl_desc = { |
| }; |
| #endif |
| |
| -#if IS_ENABLED(CONFIG_SND_SOC_SOF_SKYLAKE) |
| -static const struct sof_dev_desc skl_desc = { |
| - .machines = snd_soc_acpi_intel_skl_machines, |
| - .resindex_lpe_base = 0, |
| - .resindex_pcicfg_base = -1, |
| - .resindex_imr_base = -1, |
| - .irqindex_host_ipc = -1, |
| - .resindex_dma_base = -1, |
| - .chip_info = &skl_chip_info, |
| - .default_fw_path = "intel/sof", |
| - .default_tplg_path = "intel/sof-tplg", |
| - .nocodec_fw_filename = "sof-skl.ri", |
| - .nocodec_tplg_filename = "sof-skl-nocodec.tplg", |
| - .ops = &sof_skl_ops, |
| - .arch_ops = &sof_xtensa_arch_ops |
| -}; |
| -#endif |
| - |
| -#if IS_ENABLED(CONFIG_SND_SOC_SOF_KABYLAKE) |
| -static const struct sof_dev_desc kbl_desc = { |
| - .machines = snd_soc_acpi_intel_kbl_machines, |
| - .resindex_lpe_base = 0, |
| - .resindex_pcicfg_base = -1, |
| - .resindex_imr_base = -1, |
| - .irqindex_host_ipc = -1, |
| - .resindex_dma_base = -1, |
| - .chip_info = &skl_chip_info, |
| - .default_fw_path = "intel/sof", |
| - .default_tplg_path = "intel/sof-tplg", |
| - .nocodec_fw_filename = "sof-kbl.ri", |
| - .nocodec_tplg_filename = "sof-kbl-nocodec.tplg", |
| - .ops = &sof_skl_ops, |
| - .arch_ops = &sof_xtensa_arch_ops |
| -}; |
| -#endif |
| - |
| #if IS_ENABLED(CONFIG_SND_SOC_SOF_TIGERLAKE) |
| static const struct sof_dev_desc tgl_desc = { |
| .machines = snd_soc_acpi_intel_tgl_machines, |
| @@ -435,14 +399,6 @@ static const struct pci_device_id sof_pci_ids[] = { |
| { PCI_DEVICE(0x8086, 0xa348), |
| .driver_data = (unsigned long)&cfl_desc}, |
| #endif |
| -#if IS_ENABLED(CONFIG_SND_SOC_SOF_KABYLAKE) |
| - { PCI_DEVICE(0x8086, 0x9d71), |
| - .driver_data = (unsigned long)&kbl_desc}, |
| -#endif |
| -#if IS_ENABLED(CONFIG_SND_SOC_SOF_SKYLAKE) |
| - { PCI_DEVICE(0x8086, 0x9d70), |
| - .driver_data = (unsigned long)&skl_desc}, |
| -#endif |
| #if IS_ENABLED(CONFIG_SND_SOC_SOF_ICELAKE) |
| { PCI_DEVICE(0x8086, 0x34C8), |
| .driver_data = (unsigned long)&icl_desc}, |
| -- |
| 2.24.1 |
| |
| From daeba620beb2a67339b7043c2804cf7f1833dbef Mon Sep 17 00:00:00 2001 |
| From: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Date: Tue, 29 Oct 2019 15:40:10 +0200 |
| Subject: [PATCH 040/109] ASoC: hdac_hda: add support for HDMI/DP as a HDA |
| codec |
| |
| Handle all HDA codecs using same logic, including HDMI/DP. |
| |
| Call to snd_hda_codec_build_controls() is delayed for HDMI/DP HDA |
| devices. This is needed to discover the PCM device numbers as |
| defined in topology. |
| |
| Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Reviewed-by: Takashi Iwai <tiwai@suse.de> |
| Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191029134017.18901-3-kai.vehmanen@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 608b8c36c37114289e3ea328783161f542fdf71d) |
| Bugzilla: 1772498 |
| |
| sound/soc/codecs/hdac_hda.c | 114 ++++++++++++++++++++++++++++++++---- |
| sound/soc/codecs/hdac_hda.h | 13 +++- |
| 2 files changed, 114 insertions(+), 13 deletions(-) |
| |
| diff --git a/sound/soc/codecs/hdac_hda.c b/sound/soc/codecs/hdac_hda.c |
| index d78f4d856aaf..43110151e928 100644 |
| |
| |
| @@ -14,13 +14,11 @@ |
| #include <sound/pcm_params.h> |
| #include <sound/soc.h> |
| #include <sound/hdaudio_ext.h> |
| +#include <sound/hda_i915.h> |
| #include <sound/hda_codec.h> |
| #include <sound/hda_register.h> |
| -#include "hdac_hda.h" |
| |
| -#define HDAC_ANALOG_DAI_ID 0 |
| -#define HDAC_DIGITAL_DAI_ID 1 |
| -#define HDAC_ALT_ANALOG_DAI_ID 2 |
| +#include "hdac_hda.h" |
| |
| #define STUB_FORMATS (SNDRV_PCM_FMTBIT_S8 | \ |
| SNDRV_PCM_FMTBIT_U8 | \ |
| @@ -32,6 +30,11 @@ |
| SNDRV_PCM_FMTBIT_U32_LE | \ |
| SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE) |
| |
| +#define STUB_HDMI_RATES (SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |\ |
| + SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 |\ |
| + SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 |\ |
| + SNDRV_PCM_RATE_192000) |
| + |
| static int hdac_hda_dai_open(struct snd_pcm_substream *substream, |
| struct snd_soc_dai *dai); |
| static void hdac_hda_dai_close(struct snd_pcm_substream *substream, |
| @@ -121,7 +124,46 @@ static struct snd_soc_dai_driver hdac_hda_dais[] = { |
| .formats = STUB_FORMATS, |
| .sig_bits = 24, |
| }, |
| -} |
| +}, |
| +{ |
| + .id = HDAC_HDMI_0_DAI_ID, |
| + .name = "intel-hdmi-hifi1", |
| + .ops = &hdac_hda_dai_ops, |
| + .playback = { |
| + .stream_name = "hifi1", |
| + .channels_min = 1, |
| + .channels_max = 32, |
| + .rates = STUB_HDMI_RATES, |
| + .formats = STUB_FORMATS, |
| + .sig_bits = 24, |
| + }, |
| +}, |
| +{ |
| + .id = HDAC_HDMI_1_DAI_ID, |
| + .name = "intel-hdmi-hifi2", |
| + .ops = &hdac_hda_dai_ops, |
| + .playback = { |
| + .stream_name = "hifi2", |
| + .channels_min = 1, |
| + .channels_max = 32, |
| + .rates = STUB_HDMI_RATES, |
| + .formats = STUB_FORMATS, |
| + .sig_bits = 24, |
| + }, |
| +}, |
| +{ |
| + .id = HDAC_HDMI_2_DAI_ID, |
| + .name = "intel-hdmi-hifi3", |
| + .ops = &hdac_hda_dai_ops, |
| + .playback = { |
| + .stream_name = "hifi3", |
| + .channels_min = 1, |
| + .channels_max = 32, |
| + .rates = STUB_HDMI_RATES, |
| + .formats = STUB_FORMATS, |
| + .sig_bits = 24, |
| + }, |
| +}, |
| |
| }; |
| |
| @@ -135,10 +177,11 @@ static int hdac_hda_dai_set_tdm_slot(struct snd_soc_dai *dai, |
| |
| hda_pvt = snd_soc_component_get_drvdata(component); |
| pcm = &hda_pvt->pcm[dai->id]; |
| + |
| if (tx_mask) |
| - pcm[dai->id].stream_tag[SNDRV_PCM_STREAM_PLAYBACK] = tx_mask; |
| + pcm->stream_tag[SNDRV_PCM_STREAM_PLAYBACK] = tx_mask; |
| else |
| - pcm[dai->id].stream_tag[SNDRV_PCM_STREAM_CAPTURE] = rx_mask; |
| + pcm->stream_tag[SNDRV_PCM_STREAM_CAPTURE] = rx_mask; |
| |
| return 0; |
| } |
| @@ -278,6 +321,12 @@ static struct hda_pcm *snd_soc_find_pcm_from_dai(struct hdac_hda_priv *hda_pvt, |
| struct hda_pcm *cpcm; |
| const char *pcm_name; |
| |
| + /* |
| + * map DAI ID to the closest matching PCM name, using the naming |
| + * scheme used by hda-codec snd_hda_gen_build_pcms() and for |
| + * HDMI in hda_codec patch_hdmi.c) |
| + */ |
| + |
| switch (dai->id) { |
| case HDAC_ANALOG_DAI_ID: |
| pcm_name = "Analog"; |
| @@ -288,13 +337,22 @@ static struct hda_pcm *snd_soc_find_pcm_from_dai(struct hdac_hda_priv *hda_pvt, |
| case HDAC_ALT_ANALOG_DAI_ID: |
| pcm_name = "Alt Analog"; |
| break; |
| + case HDAC_HDMI_0_DAI_ID: |
| + pcm_name = "HDMI 0"; |
| + break; |
| + case HDAC_HDMI_1_DAI_ID: |
| + pcm_name = "HDMI 1"; |
| + break; |
| + case HDAC_HDMI_2_DAI_ID: |
| + pcm_name = "HDMI 2"; |
| + break; |
| default: |
| dev_err(&hcodec->core.dev, "invalid dai id %d\n", dai->id); |
| return NULL; |
| } |
| |
| list_for_each_entry(cpcm, &hcodec->pcm_list_head, list) { |
| - if (strpbrk(cpcm->name, pcm_name)) |
| + if (strstr(cpcm->name, pcm_name)) |
| return cpcm; |
| } |
| |
| @@ -302,6 +360,18 @@ static struct hda_pcm *snd_soc_find_pcm_from_dai(struct hdac_hda_priv *hda_pvt, |
| return NULL; |
| } |
| |
| +static bool is_hdmi_codec(struct hda_codec *hcodec) |
| +{ |
| + struct hda_pcm *cpcm; |
| + |
| + list_for_each_entry(cpcm, &hcodec->pcm_list_head, list) { |
| + if (cpcm->pcm_type == HDA_PCM_TYPE_HDMI) |
| + return true; |
| + } |
| + |
| + return false; |
| +} |
| + |
| static int hdac_hda_codec_probe(struct snd_soc_component *component) |
| { |
| struct hdac_hda_priv *hda_pvt = |
| @@ -322,6 +392,15 @@ static int hdac_hda_codec_probe(struct snd_soc_component *component) |
| |
| snd_hdac_ext_bus_link_get(hdev->bus, hlink); |
| |
| + /* |
| + * Ensure any HDA display is powered at codec probe. |
| + * After snd_hda_codec_device_new(), display power is |
| + * managed by runtime PM. |
| + */ |
| + if (hda_pvt->need_display_power) |
| + snd_hdac_display_power(hdev->bus, |
| + HDA_CODEC_IDX_CONTROLLER, true); |
| + |
| ret = snd_hda_codec_device_new(hcodec->bus, component->card->snd_card, |
| hdev->addr, hcodec); |
| if (ret < 0) { |
| @@ -366,20 +445,31 @@ static int hdac_hda_codec_probe(struct snd_soc_component *component) |
| dev_dbg(&hdev->dev, "no patch file found\n"); |
| } |
| |
| + /* configure codec for 1:1 PCM:DAI mapping */ |
| + hcodec->mst_no_extra_pcms = 1; |
| + |
| ret = snd_hda_codec_parse_pcms(hcodec); |
| if (ret < 0) { |
| dev_err(&hdev->dev, "unable to map pcms to dai %d\n", ret); |
| goto error; |
| } |
| |
| - ret = snd_hda_codec_build_controls(hcodec); |
| - if (ret < 0) { |
| - dev_err(&hdev->dev, "unable to create controls %d\n", ret); |
| - goto error; |
| + /* HDMI controls need to be created in machine drivers */ |
| + if (!is_hdmi_codec(hcodec)) { |
| + ret = snd_hda_codec_build_controls(hcodec); |
| + if (ret < 0) { |
| + dev_err(&hdev->dev, "unable to create controls %d\n", |
| + ret); |
| + goto error; |
| + } |
| } |
| |
| hcodec->core.lazy_cache = true; |
| |
| + if (hda_pvt->need_display_power) |
| + snd_hdac_display_power(hdev->bus, |
| + HDA_CODEC_IDX_CONTROLLER, false); |
| + |
| /* |
| * hdac_device core already sets the state to active and calls |
| * get_noresume. So enable runtime and set the device to suspend. |
| diff --git a/sound/soc/codecs/hdac_hda.h b/sound/soc/codecs/hdac_hda.h |
| index 6b1bd4f428e7..e145cec085b8 100644 |
| |
| |
| @@ -6,6 +6,16 @@ |
| #ifndef __HDAC_HDA_H__ |
| #define __HDAC_HDA_H__ |
| |
| +enum { |
| + HDAC_ANALOG_DAI_ID = 0, |
| + HDAC_DIGITAL_DAI_ID, |
| + HDAC_ALT_ANALOG_DAI_ID, |
| + HDAC_HDMI_0_DAI_ID, |
| + HDAC_HDMI_1_DAI_ID, |
| + HDAC_HDMI_2_DAI_ID, |
| + HDAC_LAST_DAI_ID = HDAC_HDMI_2_DAI_ID, |
| +}; |
| + |
| struct hdac_hda_pcm { |
| int stream_tag[2]; |
| unsigned int format_val[2]; |
| @@ -13,7 +23,8 @@ struct hdac_hda_pcm { |
| |
| struct hdac_hda_priv { |
| struct hda_codec codec; |
| - struct hdac_hda_pcm pcm[2]; |
| + struct hdac_hda_pcm pcm[HDAC_LAST_DAI_ID]; |
| + bool need_display_power; |
| }; |
| |
| #define hdac_to_hda_priv(_hdac) \ |
| -- |
| 2.24.1 |
| |
| From c8494550b526e38b4db5ad1b3248d5713984ee72 Mon Sep 17 00:00:00 2001 |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Date: Fri, 1 Nov 2019 12:30:35 -0500 |
| Subject: [PATCH 041/109] ASoC: SOF: Intel: Baytrail: clarify mutual exclusion |
| with Atom/SST driver |
| |
| Some distros select all options blindly, which leads to confusion and |
| bug reports. Since SOF does not support Baytrail-CR for now, and |
| UCM/topology files are still being propagated to downstream distros, |
| make SOF on Baytrail an opt-in option that first require distros to |
| opt-out of existing defaults. |
| |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191101173045.27099-2-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit df7257e544faf838c3e7ad6b4e89ffe59e87f5e1) |
| Bugzilla: 1772498 |
| |
| sound/soc/intel/Kconfig | 3 +++ |
| sound/soc/sof/intel/Kconfig | 10 +++++++++- |
| 2 files changed, 12 insertions(+), 1 deletion(-) |
| |
| diff --git a/sound/soc/intel/Kconfig b/sound/soc/intel/Kconfig |
| index c15230cec851..658eff2daf4e 100644 |
| |
| |
| @@ -104,6 +104,9 @@ config SND_SST_ATOM_HIFI2_PLATFORM_ACPI |
| If you have a Intel Baytrail or Cherrytrail platform with an I2S |
| codec, then enable this option by saying Y or m. This is a |
| recommended option |
| + This option is mutually exclusive with the SOF support on |
| + Baytrail/Cherrytrail. If you want to enable SOF on |
| + Baytrail/Cherrytrail, you need to deselect this option first. |
| |
| config SND_SOC_INTEL_SKYLAKE |
| tristate "All Skylake/SST Platforms" |
| diff --git a/sound/soc/sof/intel/Kconfig b/sound/soc/sof/intel/Kconfig |
| index a40e10dc80d5..6e9a2633871f 100644 |
| |
| |
| @@ -62,10 +62,18 @@ if SND_SOC_SOF_INTEL_ACPI |
| |
| config SND_SOC_SOF_BAYTRAIL_SUPPORT |
| bool "SOF support for Baytrail, Braswell and Cherrytrail" |
| + depends on SND_SST_ATOM_HIFI2_PLATFORM_ACPI=n |
| help |
| This adds support for Sound Open Firmware for Intel(R) platforms |
| using the Baytrail, Braswell or Cherrytrail processors. |
| - Say Y if you have such a device. |
| + This option is mutually exclusive with the Atom/SST and Baytrail |
| + legacy drivers. If you want to enable SOF on Baytrail/Cherrytrail, |
| + you need to deselect those options first. |
| + SOF does not support Baytrail-CR for now, so this option is not |
| + recommended for distros. At some point all legacy drivers will be |
| + deprecated but not before all userspace firmware/topology/UCM files |
| + are made available to downstream distros. |
| + Say Y if you want to enable SOF on Baytrail/Cherrytrail |
| If unsure select "N". |
| |
| config SND_SOC_SOF_BAYTRAIL |
| -- |
| 2.24.1 |
| |
| From a83dca7b0d30f65ef5a06c46ce2140ead3a3443e Mon Sep 17 00:00:00 2001 |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Date: Fri, 1 Nov 2019 12:30:38 -0500 |
| Subject: [PATCH 042/109] ASoC: SOF: Kconfig: add EXPERT dependency for |
| developer options, clarify help |
| |
| Some distros select all possible options, despite existing warnings to |
| be careful. This leads to e.g. user reports that the HDaudio codec and |
| DMIC are not handled by SOF. |
| |
| Add an explicit menu item to unlock developer options, and make them |
| dependent on CONFIG_EXPERT. Hopefully with this double-lock these |
| options will only be selected by developers. |
| |
| GitHub issue: https://github.com/thesofproject/sof/issues/1885 |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191101173045.27099-5-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 70ae4eb540af32ee6a6260143ccae6054ebd433f) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/Kconfig | 25 ++++++++++++++++--------- |
| 1 file changed, 16 insertions(+), 9 deletions(-) |
| |
| diff --git a/sound/soc/sof/Kconfig b/sound/soc/sof/Kconfig |
| index 56a3ab66b46b..6435eb531668 100644 |
| |
| |
| @@ -14,7 +14,6 @@ config SND_SOC_SOF_PCI |
| depends on PCI |
| select SND_SOC_SOF |
| select SND_SOC_ACPI if ACPI |
| - select SND_SOC_SOF_OPTIONS |
| select SND_SOC_SOF_INTEL_PCI if SND_SOC_SOF_INTEL_TOPLEVEL |
| help |
| This adds support for PCI enumeration. This option is |
| @@ -27,7 +26,6 @@ config SND_SOC_SOF_ACPI |
| depends on ACPI || COMPILE_TEST |
| select SND_SOC_SOF |
| select SND_SOC_ACPI if ACPI |
| - select SND_SOC_SOF_OPTIONS |
| select SND_SOC_SOF_INTEL_ACPI if SND_SOC_SOF_INTEL_TOPLEVEL |
| select IOSF_MBI if X86 && PCI |
| help |
| @@ -40,19 +38,23 @@ config SND_SOC_SOF_OF |
| tristate "SOF OF enumeration support" |
| depends on OF || COMPILE_TEST |
| select SND_SOC_SOF |
| - select SND_SOC_SOF_OPTIONS |
| help |
| This adds support for Device Tree enumeration. This option is |
| required to enable i.MX8 devices. |
| Say Y if you need this option. If unsure select "N". |
| |
| -config SND_SOC_SOF_OPTIONS |
| - tristate |
| +config SND_SOC_SOF_DEVELOPER_SUPPORT |
| + bool "SOF developer options support" |
| + depends on EXPERT |
| help |
| - This option is not user-selectable but automagically handled by |
| - 'select' statements at a higher level |
| + This option unlock SOF developer options for debug/performance/ |
| + code hardening. |
| + Distributions should not select this option, only SOF development |
| + teams should select it. |
| + Say Y if you are involved in SOF development and need this option |
| + If not, select N |
| |
| -if SND_SOC_SOF_OPTIONS |
| +if SND_SOC_SOF_DEVELOPER_SUPPORT |
| |
| config SND_SOC_SOF_NOCODEC |
| tristate |
| @@ -64,6 +66,11 @@ config SND_SOC_SOF_NOCODEC_SUPPORT |
| option if no known codec is detected. This is typically only |
| enabled for developers or devices where the sound card is |
| controlled externally |
| + This option is mutually exclusive with the Intel HDaudio support, |
| + selecting it may have negative impacts and prevent e.g. microphone |
| + functionality from being enabled on Intel CoffeeLake and later |
| + platforms. |
| + Distributions should not select this option! |
| Say Y if you need this nocodec fallback option |
| If unsure select "N". |
| |
| @@ -168,7 +175,7 @@ config SND_SOC_SOF_DEBUG_RETAIN_DSP_CONTEXT |
| |
| endif ## SND_SOC_SOF_DEBUG |
| |
| -endif ## SND_SOC_SOF_OPTIONS |
| +endif ## SND_SOC_SOF_DEVELOPER_SUPPORT |
| |
| config SND_SOC_SOF |
| tristate |
| -- |
| 2.24.1 |
| |
| From 43b263fd28a8cae9172f26bc6d35c5cee916f1e0 Mon Sep 17 00:00:00 2001 |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Date: Fri, 1 Nov 2019 12:30:40 -0500 |
| Subject: [PATCH 043/109] ASoC: SOF: Intel: use def_tristate, avoid using |
| select |
| |
| So far we used select to use the relevant built-in/module options, but |
| this led to blurring layers between core and Intel Kconfigs. |
| |
| Use def_tristate works just as well and removes Intel stuff from the code. |
| |
| Suggested-by: Arnd Bergmann <arnd@arndb.de> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191101173045.27099-7-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit b000135e5f272118e576e9720590e5979f0abe49) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/Kconfig | 2 -- |
| sound/soc/sof/intel/Kconfig | 4 ++-- |
| 2 files changed, 2 insertions(+), 4 deletions(-) |
| |
| diff --git a/sound/soc/sof/Kconfig b/sound/soc/sof/Kconfig |
| index 6435eb531668..71a0fc075a63 100644 |
| |
| |
| @@ -14,7 +14,6 @@ config SND_SOC_SOF_PCI |
| depends on PCI |
| select SND_SOC_SOF |
| select SND_SOC_ACPI if ACPI |
| - select SND_SOC_SOF_INTEL_PCI if SND_SOC_SOF_INTEL_TOPLEVEL |
| help |
| This adds support for PCI enumeration. This option is |
| required to enable Intel Skylake+ devices |
| @@ -26,7 +25,6 @@ config SND_SOC_SOF_ACPI |
| depends on ACPI || COMPILE_TEST |
| select SND_SOC_SOF |
| select SND_SOC_ACPI if ACPI |
| - select SND_SOC_SOF_INTEL_ACPI if SND_SOC_SOF_INTEL_TOPLEVEL |
| select IOSF_MBI if X86 && PCI |
| help |
| This adds support for ACPI enumeration. This option is required |
| diff --git a/sound/soc/sof/intel/Kconfig b/sound/soc/sof/intel/Kconfig |
| index 6e9a2633871f..acc3e91d9244 100644 |
| |
| |
| @@ -10,7 +10,7 @@ config SND_SOC_SOF_INTEL_TOPLEVEL |
| if SND_SOC_SOF_INTEL_TOPLEVEL |
| |
| config SND_SOC_SOF_INTEL_ACPI |
| - tristate |
| + def_tristate SND_SOC_SOF_ACPI |
| select SND_SOC_SOF_BAYTRAIL if SND_SOC_SOF_BAYTRAIL_SUPPORT |
| select SND_SOC_SOF_BROADWELL if SND_SOC_SOF_BROADWELL_SUPPORT |
| help |
| @@ -18,7 +18,7 @@ config SND_SOC_SOF_INTEL_ACPI |
| 'select' statements at a higher level |
| |
| config SND_SOC_SOF_INTEL_PCI |
| - tristate |
| + def_tristate SND_SOC_SOF_PCI |
| select SND_SOC_SOF_MERRIFIELD if SND_SOC_SOF_MERRIFIELD_SUPPORT |
| select SND_SOC_SOF_APOLLOLAKE if SND_SOC_SOF_APOLLOLAKE_SUPPORT |
| select SND_SOC_SOF_GEMINILAKE if SND_SOC_SOF_GEMINILAKE_SUPPORT |
| -- |
| 2.24.1 |
| |
| From cedd030ba9990481d92f7461439460d1e93ac6f7 Mon Sep 17 00:00:00 2001 |
| From: Krzysztof Kozlowski <krzk@kernel.org> |
| Date: Fri, 4 Oct 2019 16:49:31 +0200 |
| Subject: [PATCH 044/109] sound: Fix Kconfig indentation |
| |
| Adjust indentation from spaces to tab (+optional two spaces) as in |
| coding style with command like: |
| $ sed -e 's/^ /\t/' -i */Kconfig |
| |
| Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org> |
| Acked-by: Mark Brown <broonie@kernel.org> |
| Link: https://lore.kernel.org/r/20191004144931.3851-1-krzk@kernel.org |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 82e8d723e9e6698572098bf2976223d5069b34b5) |
| Bugzilla: 1772498 |
| |
| sound/core/Kconfig | 28 ++++++++++---------- |
| sound/drivers/Kconfig | 20 +++++++------- |
| sound/firewire/Kconfig | 6 ++--- |
| sound/isa/Kconfig | 18 ++++++------- |
| sound/mips/Kconfig | 12 ++++----- |
| sound/pci/Kconfig | 2 +- |
| sound/soc/cirrus/Kconfig | 14 +++++----- |
| sound/soc/codecs/Kconfig | 32 +++++++++++------------ |
| sound/soc/intel/Kconfig | 2 +- |
| sound/soc/intel/boards/Kconfig | 48 +++++++++++++++++----------------- |
| sound/soc/pxa/Kconfig | 16 ++++++------ |
| sound/soc/qcom/Kconfig | 20 +++++++------- |
| sound/soc/samsung/Kconfig | 8 +++--- |
| sound/soc/sof/imx/Kconfig | 12 ++++----- |
| sound/soc/sof/intel/Kconfig | 22 ++++++++-------- |
| sound/soc/xilinx/Kconfig | 20 +++++++------- |
| sound/soc/zte/Kconfig | 12 ++++----- |
| sound/usb/Kconfig | 32 +++++++++++------------ |
| 18 files changed, 162 insertions(+), 162 deletions(-) |
| |
| diff --git a/sound/core/Kconfig b/sound/core/Kconfig |
| index 4ee79ad6ae22..4044c42d8595 100644 |
| |
| |
| @@ -72,11 +72,11 @@ config SND_PCM_OSS |
| config SND_PCM_OSS_PLUGINS |
| bool "OSS PCM (digital audio) API - Include plugin system" |
| depends on SND_PCM_OSS |
| - default y |
| + default y |
| help |
| - If you disable this option, the ALSA's OSS PCM API will not |
| - support conversion of channels, formats and rates. It will |
| - behave like most of new OSS/Free drivers in 2.4/2.6 kernels. |
| + If you disable this option, the ALSA's OSS PCM API will not |
| + support conversion of channels, formats and rates. It will |
| + behave like most of new OSS/Free drivers in 2.4/2.6 kernels. |
| |
| config SND_PCM_TIMER |
| bool "PCM timer interface" if EXPERT |
| @@ -128,13 +128,13 @@ config SND_SUPPORT_OLD_API |
| or older). |
| |
| config SND_PROC_FS |
| - bool "Sound Proc FS Support" if EXPERT |
| - depends on PROC_FS |
| - default y |
| - help |
| - Say 'N' to disable Sound proc FS, which may reduce code size about |
| - 9KB on x86_64 platform. |
| - If unsure say Y. |
| + bool "Sound Proc FS Support" if EXPERT |
| + depends on PROC_FS |
| + default y |
| + help |
| + Say 'N' to disable Sound proc FS, which may reduce code size about |
| + 9KB on x86_64 platform. |
| + If unsure say Y. |
| |
| config SND_VERBOSE_PROCFS |
| bool "Verbose procfs contents" |
| @@ -142,8 +142,8 @@ config SND_VERBOSE_PROCFS |
| default y |
| help |
| Say Y here to include code for verbose procfs contents (provides |
| - useful information to developers when a problem occurs). On the |
| - other side, it makes the ALSA subsystem larger. |
| + useful information to developers when a problem occurs). On the |
| + other side, it makes the ALSA subsystem larger. |
| |
| config SND_VERBOSE_PRINTK |
| bool "Verbose printk" |
| @@ -164,7 +164,7 @@ config SND_DEBUG_VERBOSE |
| depends on SND_DEBUG |
| help |
| Say Y here to enable extra-verbose debugging messages. |
| - |
| + |
| Let me repeat: it enables EXTRA-VERBOSE DEBUGGING messages. |
| So, say Y only if you are ready to be annoyed. |
| |
| diff --git a/sound/drivers/Kconfig b/sound/drivers/Kconfig |
| index 09932cc98e9d..15d6d46acf9c 100644 |
| |
| |
| @@ -1,7 +1,7 @@ |
| # SPDX-License-Identifier: GPL-2.0-only |
| config SND_MPU401_UART |
| - tristate |
| - select SND_RAWMIDI |
| + tristate |
| + select SND_RAWMIDI |
| |
| config SND_OPL3_LIB |
| tristate |
| @@ -90,16 +90,16 @@ config SND_DUMMY |
| will be called snd-dummy. |
| |
| config SND_ALOOP |
| - tristate "Generic loopback driver (PCM)" |
| - select SND_PCM |
| - help |
| - Say 'Y' or 'M' to include support for the PCM loopback device. |
| + tristate "Generic loopback driver (PCM)" |
| + select SND_PCM |
| + help |
| + Say 'Y' or 'M' to include support for the PCM loopback device. |
| This module returns played samples back to the user space using |
| the standard ALSA PCM device. The devices are routed 0->1 and |
| - 1->0, where first number is the playback PCM device and second |
| + 1->0, where first number is the playback PCM device and second |
| number is the capture device. Module creates two PCM devices and |
| configured number of substreams (see the pcm_substreams module |
| - parameter). |
| + parameter). |
| |
| The loopback device allows time sychronization with an external |
| timing source using the time shift universal control (+-20% |
| @@ -142,12 +142,12 @@ config SND_MTS64 |
| select SND_RAWMIDI |
| help |
| The ESI Miditerminal 4140 is a 4 In 4 Out MIDI Interface with |
| - additional SMPTE Timecode capabilities for the parallel port. |
| + additional SMPTE Timecode capabilities for the parallel port. |
| |
| Say 'Y' to include support for this device. |
| |
| To compile this driver as a module, chose 'M' here: the module |
| - will be called snd-mts64. |
| + will be called snd-mts64. |
| |
| config SND_SERIAL_U16550 |
| tristate "UART16550 serial MIDI driver" |
| diff --git a/sound/firewire/Kconfig b/sound/firewire/Kconfig |
| index b0a904cdb932..995c2cefc222 100644 |
| |
| |
| @@ -77,7 +77,7 @@ config SND_BEBOB |
| tristate "BridgeCo DM1000/DM1100/DM1500 with BeBoB firmware" |
| select SND_FIREWIRE_LIB |
| select SND_HWDEP |
| - help |
| + help |
| Say Y here to include support for FireWire devices based |
| on BridgeCo DM1000/DM1100/DM1500 with BeBoB firmware: |
| * Edirol FA-66/FA-101 |
| @@ -111,8 +111,8 @@ config SND_BEBOB |
| * M-Audio FireWire 1814/ProjectMix IO |
| * Digidesign Mbox 2 Pro |
| |
| - To compile this driver as a module, choose M here: the module |
| - will be called snd-bebob. |
| + To compile this driver as a module, choose M here: the module |
| + will be called snd-bebob. |
| |
| config SND_FIREWIRE_DIGI00X |
| tristate "Digidesign Digi 002/003 family support" |
| diff --git a/sound/isa/Kconfig b/sound/isa/Kconfig |
| index b690ed937cbe..6ffa48dd5983 100644 |
| |
| |
| @@ -2,22 +2,22 @@ |
| # ALSA ISA drivers |
| |
| config SND_WSS_LIB |
| - tristate |
| - select SND_PCM |
| + tristate |
| + select SND_PCM |
| select SND_TIMER |
| |
| config SND_SB_COMMON |
| - tristate |
| + tristate |
| |
| config SND_SB8_DSP |
| - tristate |
| - select SND_PCM |
| - select SND_SB_COMMON |
| + tristate |
| + select SND_PCM |
| + select SND_SB_COMMON |
| |
| config SND_SB16_DSP |
| - tristate |
| - select SND_PCM |
| - select SND_SB_COMMON |
| + tristate |
| + select SND_PCM |
| + select SND_SB_COMMON |
| |
| menuconfig SND_ISA |
| bool "ISA sound devices" |
| diff --git a/sound/mips/Kconfig b/sound/mips/Kconfig |
| index 8a33402fd415..b497b803c834 100644 |
| |
| |
| @@ -14,15 +14,15 @@ config SND_SGI_O2 |
| tristate "SGI O2 Audio" |
| depends on SGI_IP32 |
| select SND_PCM |
| - help |
| - Sound support for the SGI O2 Workstation. |
| + help |
| + Sound support for the SGI O2 Workstation. |
| |
| config SND_SGI_HAL2 |
| - tristate "SGI HAL2 Audio" |
| - depends on SGI_HAS_HAL2 |
| + tristate "SGI HAL2 Audio" |
| + depends on SGI_HAS_HAL2 |
| select SND_PCM |
| - help |
| - Sound support for the SGI Indy and Indigo2 Workstation. |
| + help |
| + Sound support for the SGI Indy and Indigo2 Workstation. |
| |
| endif # SND_MIPS |
| |
| diff --git a/sound/pci/Kconfig b/sound/pci/Kconfig |
| index 7630f808d087..93bc9bef7641 100644 |
| |
| |
| @@ -217,7 +217,7 @@ config SND_CMIPCI |
| will be called snd-cmipci. |
| |
| config SND_OXYGEN_LIB |
| - tristate |
| + tristate |
| |
| config SND_OXYGEN |
| tristate "C-Media 8786, 8787, 8788 (Oxygen)" |
| diff --git a/sound/soc/cirrus/Kconfig b/sound/soc/cirrus/Kconfig |
| index 2333efac758a..8039a8febefa 100644 |
| |
| |
| @@ -33,13 +33,13 @@ config SND_EP93XX_SOC_AC97 |
| select SND_SOC_AC97_BUS |
| |
| config SND_EP93XX_SOC_SNAPPERCL15 |
| - tristate "SoC Audio support for Bluewater Systems Snapper CL15 module" |
| - depends on SND_EP93XX_SOC && MACH_SNAPPER_CL15 && I2C |
| - select SND_EP93XX_SOC_I2S |
| - select SND_SOC_TLV320AIC23_I2C |
| - help |
| - Say Y or M here if you want to add support for I2S audio on the |
| - Bluewater Systems Snapper CL15 module. |
| + tristate "SoC Audio support for Bluewater Systems Snapper CL15 module" |
| + depends on SND_EP93XX_SOC && MACH_SNAPPER_CL15 && I2C |
| + select SND_EP93XX_SOC_I2S |
| + select SND_SOC_TLV320AIC23_I2C |
| + help |
| + Say Y or M here if you want to add support for I2S audio on the |
| + Bluewater Systems Snapper CL15 module. |
| |
| config SND_EP93XX_SOC_SIMONE |
| tristate "SoC Audio support for Simplemachines Sim.One board" |
| diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig |
| index 229cc89f8c5a..ef9d73b89623 100644 |
| |
| |
| @@ -257,16 +257,16 @@ config SND_SOC_ALL_CODECS |
| select SND_SOC_WM9705 if (SND_SOC_AC97_BUS || SND_SOC_AC97_BUS_NEW) |
| select SND_SOC_WM9712 if (SND_SOC_AC97_BUS || SND_SOC_AC97_BUS_NEW) |
| select SND_SOC_WM9713 if (SND_SOC_AC97_BUS || SND_SOC_AC97_BUS_NEW) |
| - help |
| - Normally ASoC codec drivers are only built if a machine driver which |
| - uses them is also built since they are only usable with a machine |
| - driver. Selecting this option will allow these drivers to be built |
| - without an explicit machine driver for test and development purposes. |
| + help |
| + Normally ASoC codec drivers are only built if a machine driver which |
| + uses them is also built since they are only usable with a machine |
| + driver. Selecting this option will allow these drivers to be built |
| + without an explicit machine driver for test and development purposes. |
| |
| Support for the bus types used to access the codecs to be built must |
| be selected separately. |
| |
| - If unsure select "N". |
| + If unsure select "N". |
| |
| config SND_SOC_88PM860X |
| tristate |
| @@ -570,8 +570,8 @@ config SND_SOC_CS42XX8_I2C |
| |
| # Cirrus Logic CS43130 HiFi DAC |
| config SND_SOC_CS43130 |
| - tristate "Cirrus Logic CS43130 CODEC" |
| - depends on I2C |
| + tristate "Cirrus Logic CS43130 CODEC" |
| + depends on I2C |
| |
| config SND_SOC_CS4341 |
| tristate "Cirrus Logic CS4341 CODEC" |
| @@ -643,19 +643,19 @@ config SND_SOC_L3 |
| tristate |
| |
| config SND_SOC_DA7210 |
| - tristate |
| + tristate |
| |
| config SND_SOC_DA7213 |
| - tristate |
| + tristate |
| |
| config SND_SOC_DA7218 |
| tristate |
| |
| config SND_SOC_DA7219 |
| - tristate |
| + tristate |
| |
| config SND_SOC_DA732X |
| - tristate |
| + tristate |
| |
| config SND_SOC_DA9055 |
| tristate |
| @@ -717,7 +717,7 @@ config SND_SOC_INNO_RK3036 |
| select REGMAP_MMIO |
| |
| config SND_SOC_ISABELLE |
| - tristate |
| + tristate |
| |
| config SND_SOC_LM49453 |
| tristate |
| @@ -988,7 +988,7 @@ config SND_SOC_RT5640 |
| tristate |
| |
| config SND_SOC_RT5645 |
| - tristate |
| + tristate |
| |
| config SND_SOC_RT5651 |
| tristate |
| @@ -1220,7 +1220,7 @@ config SND_SOC_UDA134X |
| tristate |
| |
| config SND_SOC_UDA1380 |
| - tristate |
| + tristate |
| depends on I2C |
| |
| config SND_SOC_WCD9335 |
| @@ -1348,7 +1348,7 @@ config SND_SOC_WM8904 |
| depends on I2C |
| |
| config SND_SOC_WM8940 |
| - tristate |
| + tristate |
| |
| config SND_SOC_WM8955 |
| tristate |
| diff --git a/sound/soc/intel/Kconfig b/sound/soc/intel/Kconfig |
| index 658eff2daf4e..7e9feca333b7 100644 |
| |
| |
| @@ -119,7 +119,7 @@ config SND_SOC_INTEL_SKYLAKE |
| select SND_SOC_INTEL_CNL |
| select SND_SOC_INTEL_CFL |
| help |
| - This is a backwards-compatible option to select all devices |
| + This is a backwards-compatible option to select all devices |
| supported by the Intel SST/Skylake driver. This option is no |
| longer recommended and will be deprecated when the SOF |
| driver is introduced. Distributions should explicitly |
| diff --git a/sound/soc/intel/boards/Kconfig b/sound/soc/intel/boards/Kconfig |
| index 5c27f7ab4a5f..882ff36a7c9c 100644 |
| |
| |
| @@ -3,13 +3,13 @@ menuconfig SND_SOC_INTEL_MACH |
| bool "Intel Machine drivers" |
| depends on SND_SOC_INTEL_SST_TOPLEVEL || SND_SOC_SOF_INTEL_TOPLEVEL |
| help |
| - Intel ASoC Machine Drivers. If you have a Intel machine that |
| - has an audio controller with a DSP and I2S or DMIC port, then |
| - enable this option by saying Y |
| + Intel ASoC Machine Drivers. If you have a Intel machine that |
| + has an audio controller with a DSP and I2S or DMIC port, then |
| + enable this option by saying Y |
| |
| - Note that the answer to this question doesn't directly affect the |
| - kernel: saying N will just cause the configurator to skip all |
| - the questions about Intel ASoC machine drivers. |
| + Note that the answer to this question doesn't directly affect the |
| + kernel: saying N will just cause the configurator to skip all |
| + the questions about Intel ASoC machine drivers. |
| |
| if SND_SOC_INTEL_MACH |
| |
| @@ -114,11 +114,11 @@ config SND_SOC_INTEL_CHT_BSW_RT5672_MACH |
| depends on X86_INTEL_LPSS || COMPILE_TEST |
| select SND_SOC_ACPI |
| select SND_SOC_RT5670 |
| - help |
| - This adds support for ASoC machine driver for Intel(R) Cherrytrail & Braswell |
| - platforms with RT5672 audio codec. |
| - Say Y or m if you have such a device. This is a recommended option. |
| - If unsure select "N". |
| + help |
| + This adds support for ASoC machine driver for Intel(R) Cherrytrail & Braswell |
| + platforms with RT5672 audio codec. |
| + Say Y or m if you have such a device. This is a recommended option. |
| + If unsure select "N". |
| |
| config SND_SOC_INTEL_CHT_BSW_RT5645_MACH |
| tristate "Cherrytrail & Braswell with RT5645/5650 codec" |
| @@ -311,20 +311,20 @@ config SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH |
| If unsure select "N". |
| |
| config SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH |
| - tristate "KBL with RT5663, RT5514 and MAX98927 in I2S Mode" |
| + tristate "KBL with RT5663, RT5514 and MAX98927 in I2S Mode" |
| depends on I2C && ACPI |
| depends on MFD_INTEL_LPSS || COMPILE_TEST |
| - depends on SPI |
| - select SND_SOC_RT5663 |
| - select SND_SOC_RT5514 |
| - select SND_SOC_RT5514_SPI |
| - select SND_SOC_MAX98927 |
| - select SND_SOC_HDAC_HDMI |
| - help |
| - This adds support for ASoC Onboard Codec I2S machine driver. This will |
| - create an alsa sound card for RT5663 + RT5514 + MAX98927. |
| - Say Y or m if you have such a device. This is a recommended option. |
| - If unsure select "N". |
| + depends on SPI |
| + select SND_SOC_RT5663 |
| + select SND_SOC_RT5514 |
| + select SND_SOC_RT5514_SPI |
| + select SND_SOC_MAX98927 |
| + select SND_SOC_HDAC_HDMI |
| + help |
| + This adds support for ASoC Onboard Codec I2S machine driver. This will |
| + create an alsa sound card for RT5663 + RT5514 + MAX98927. |
| + Say Y or m if you have such a device. This is a recommended option. |
| + If unsure select "N". |
| |
| config SND_SOC_INTEL_KBL_DA7219_MAX98357A_MACH |
| tristate "KBL with DA7219 and MAX98357A in I2S Mode" |
| @@ -393,7 +393,7 @@ config SND_SOC_INTEL_SKL_HDA_DSP_GENERIC_MACH |
| help |
| This adds support for ASoC machine driver for Intel platforms |
| SKL/KBL/BXT/APL with iDisp, HDA audio codecs. |
| - Say Y or m if you have such a device. This is a recommended option. |
| + Say Y or m if you have such a device. This is a recommended option. |
| If unsure select "N". |
| |
| endif ## SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC || SND_SOC_SOF_HDA_AUDIO_CODEC |
| diff --git a/sound/soc/pxa/Kconfig b/sound/soc/pxa/Kconfig |
| index 213d4dab0346..295cfffa4646 100644 |
| |
| |
| @@ -190,14 +190,14 @@ config SND_PXA2XX_SOC_MAGICIAN |
| HTC Magician. |
| |
| config SND_PXA2XX_SOC_MIOA701 |
| - tristate "SoC Audio support for MIO A701" |
| - depends on SND_PXA2XX_SOC && MACH_MIOA701 |
| + tristate "SoC Audio support for MIO A701" |
| + depends on SND_PXA2XX_SOC && MACH_MIOA701 |
| depends on AC97_BUS=n |
| - select SND_PXA2XX_SOC_AC97 |
| - select SND_SOC_WM9713 |
| - help |
| - Say Y if you want to add support for SoC audio on the |
| - MIO A701. |
| + select SND_PXA2XX_SOC_AC97 |
| + select SND_SOC_WM9713 |
| + help |
| + Say Y if you want to add support for SoC audio on the |
| + MIO A701. |
| |
| config SND_PXA2XX_SOC_IMOTE2 |
| tristate "SoC Audio support for IMote 2" |
| @@ -205,7 +205,7 @@ config SND_PXA2XX_SOC_IMOTE2 |
| select SND_PXA2XX_SOC_I2S |
| select SND_SOC_WM8940 |
| help |
| - Say Y if you want to add support for SoC audio on the |
| + Say Y if you want to add support for SoC audio on the |
| IMote 2. |
| |
| config SND_MMP_SOC_BROWNSTONE |
| diff --git a/sound/soc/qcom/Kconfig b/sound/soc/qcom/Kconfig |
| index 60086858e920..6530d2462a9e 100644 |
| |
| |
| @@ -3,8 +3,8 @@ config SND_SOC_QCOM |
| tristate "ASoC support for QCOM platforms" |
| depends on ARCH_QCOM || COMPILE_TEST |
| help |
| - Say Y or M if you want to add support to use audio devices |
| - in Qualcomm Technologies SOC-based platforms. |
| + Say Y or M if you want to add support to use audio devices |
| + in Qualcomm Technologies SOC-based platforms. |
| |
| config SND_SOC_LPASS_CPU |
| tristate |
| @@ -30,17 +30,17 @@ config SND_SOC_STORM |
| select SND_SOC_LPASS_IPQ806X |
| select SND_SOC_MAX98357A |
| help |
| - Say Y or M if you want add support for SoC audio on the |
| - Qualcomm Technologies IPQ806X-based Storm board. |
| + Say Y or M if you want add support for SoC audio on the |
| + Qualcomm Technologies IPQ806X-based Storm board. |
| |
| config SND_SOC_APQ8016_SBC |
| tristate "SoC Audio support for APQ8016 SBC platforms" |
| depends on SND_SOC_QCOM |
| select SND_SOC_LPASS_APQ8016 |
| help |
| - Support for Qualcomm Technologies LPASS audio block in |
| - APQ8016 SOC-based systems. |
| - Say Y if you want to use audio devices on MI2S. |
| + Support for Qualcomm Technologies LPASS audio block in |
| + APQ8016 SOC-based systems. |
| + Say Y if you want to use audio devices on MI2S. |
| |
| config SND_SOC_QCOM_COMMON |
| tristate |
| @@ -93,9 +93,9 @@ config SND_SOC_MSM8996 |
| select SND_SOC_QDSP6 |
| select SND_SOC_QCOM_COMMON |
| help |
| - Support for Qualcomm Technologies LPASS audio block in |
| - APQ8096 SoC-based systems. |
| - Say Y if you want to use audio device on this SoCs |
| + Support for Qualcomm Technologies LPASS audio block in |
| + APQ8096 SoC-based systems. |
| + Say Y if you want to use audio device on this SoCs |
| |
| config SND_SOC_SDM845 |
| tristate "SoC Machine driver for SDM845 boards" |
| diff --git a/sound/soc/samsung/Kconfig b/sound/soc/samsung/Kconfig |
| index 638983123d8f..9304177de78a 100644 |
| |
| |
| @@ -195,10 +195,10 @@ config SND_SOC_ODROID |
| Say Y here to enable audio support for the Odroid XU3/XU4. |
| |
| config SND_SOC_ARNDALE_RT5631_ALC5631 |
| - tristate "Audio support for RT5631(ALC5631) on Arndale Board" |
| - depends on I2C |
| - select SND_SAMSUNG_I2S |
| - select SND_SOC_RT5631 |
| + tristate "Audio support for RT5631(ALC5631) on Arndale Board" |
| + depends on I2C |
| + select SND_SAMSUNG_I2S |
| + select SND_SOC_RT5631 |
| |
| config SND_SOC_SAMSUNG_TM2_WM5110 |
| tristate "SoC I2S Audio support for WM5110 on TM2 board" |
| diff --git a/sound/soc/sof/imx/Kconfig b/sound/soc/sof/imx/Kconfig |
| index 71f318bc2c74..bae4f7bf5f75 100644 |
| |
| |
| @@ -5,9 +5,9 @@ config SND_SOC_SOF_IMX_TOPLEVEL |
| depends on ARM64|| COMPILE_TEST |
| depends on SND_SOC_SOF_OF |
| help |
| - This adds support for Sound Open Firmware for NXP i.MX platforms. |
| - Say Y if you have such a device. |
| - If unsure select "N". |
| + This adds support for Sound Open Firmware for NXP i.MX platforms. |
| + Say Y if you have such a device. |
| + If unsure select "N". |
| |
| if SND_SOC_SOF_IMX_TOPLEVEL |
| |
| @@ -16,9 +16,9 @@ config SND_SOC_SOF_IMX8_SUPPORT |
| depends on IMX_SCU |
| depends on IMX_DSP |
| help |
| - This adds support for Sound Open Firmware for NXP i.MX8 platforms |
| - Say Y if you have such a device. |
| - If unsure select "N". |
| + This adds support for Sound Open Firmware for NXP i.MX8 platforms |
| + Say Y if you have such a device. |
| + If unsure select "N". |
| |
| config SND_SOC_SOF_IMX8 |
| def_tristate SND_SOC_SOF_OF |
| diff --git a/sound/soc/sof/intel/Kconfig b/sound/soc/sof/intel/Kconfig |
| index acc3e91d9244..c263a8feff0a 100644 |
| |
| |
| @@ -37,7 +37,7 @@ config SND_SOC_SOF_INTEL_PCI |
| config SND_SOC_SOF_INTEL_HIFI_EP_IPC |
| tristate |
| help |
| - This option is not user-selectable but automagically handled by |
| + This option is not user-selectable but automagically handled by |
| 'select' statements at a higher level |
| |
| config SND_SOC_SOF_INTEL_ATOM_HIFI_EP |
| @@ -234,31 +234,31 @@ config SND_SOC_SOF_COMETLAKE_H_SUPPORT |
| config SND_SOC_SOF_TIGERLAKE_SUPPORT |
| bool "SOF support for Tigerlake" |
| help |
| - This adds support for Sound Open Firmware for Intel(R) platforms |
| - using the Tigerlake processors. |
| - Say Y if you have such a device. |
| - If unsure select "N". |
| + This adds support for Sound Open Firmware for Intel(R) platforms |
| + using the Tigerlake processors. |
| + Say Y if you have such a device. |
| + If unsure select "N". |
| |
| config SND_SOC_SOF_TIGERLAKE |
| tristate |
| select SND_SOC_SOF_HDA_COMMON |
| help |
| - This option is not user-selectable but automagically handled by |
| + This option is not user-selectable but automagically handled by |
| 'select' statements at a higher level |
| |
| config SND_SOC_SOF_ELKHARTLAKE_SUPPORT |
| bool "SOF support for ElkhartLake" |
| help |
| - This adds support for Sound Open Firmware for Intel(R) platforms |
| - using the ElkhartLake processors. |
| - Say Y if you have such a device. |
| - If unsure select "N". |
| + This adds support for Sound Open Firmware for Intel(R) platforms |
| + using the ElkhartLake processors. |
| + Say Y if you have such a device. |
| + If unsure select "N". |
| |
| config SND_SOC_SOF_ELKHARTLAKE |
| tristate |
| select SND_SOC_SOF_HDA_COMMON |
| help |
| - This option is not user-selectable but automagically handled by |
| + This option is not user-selectable but automagically handled by |
| 'select' statements at a higher level |
| |
| config SND_SOC_SOF_JASPERLAKE_SUPPORT |
| diff --git a/sound/soc/xilinx/Kconfig b/sound/soc/xilinx/Kconfig |
| index 69973179ef15..1d3586b68db7 100644 |
| |
| |
| @@ -9,15 +9,15 @@ config SND_SOC_XILINX_I2S |
| encapsulates PCM in AES format and sends AES data. |
| |
| config SND_SOC_XILINX_AUDIO_FORMATTER |
| - tristate "Audio support for the the Xilinx audio formatter" |
| - help |
| - Select this option to enable Xilinx audio formatter |
| - support. This provides DMA platform device support for |
| - audio functionality. |
| + tristate "Audio support for the the Xilinx audio formatter" |
| + help |
| + Select this option to enable Xilinx audio formatter |
| + support. This provides DMA platform device support for |
| + audio functionality. |
| |
| config SND_SOC_XILINX_SPDIF |
| - tristate "Audio support for the the Xilinx SPDIF" |
| - help |
| - Select this option to enable Xilinx SPDIF Audio. |
| - This provides playback and capture of SPDIF audio in |
| - AES format. |
| + tristate "Audio support for the the Xilinx SPDIF" |
| + help |
| + Select this option to enable Xilinx SPDIF Audio. |
| + This provides playback and capture of SPDIF audio in |
| + AES format. |
| diff --git a/sound/soc/zte/Kconfig b/sound/soc/zte/Kconfig |
| index a7842e4b791c..a23d4f13ca19 100644 |
| |
| |
| @@ -18,9 +18,9 @@ config ZX_I2S |
| ZTE ZX I2S interface |
| |
| config ZX_TDM |
| - tristate "ZTE ZX TDM Driver Support" |
| - depends on COMMON_CLK |
| - select SND_SOC_GENERIC_DMAENGINE_PCM |
| - help |
| - Say Y or M if you want to add support for codecs attached to the |
| - ZTE ZX TDM interface |
| + tristate "ZTE ZX TDM Driver Support" |
| + depends on COMMON_CLK |
| + select SND_SOC_GENERIC_DMAENGINE_PCM |
| + help |
| + Say Y or M if you want to add support for codecs attached to the |
| + ZTE ZX TDM interface |
| diff --git a/sound/usb/Kconfig b/sound/usb/Kconfig |
| index e2c53a0841da..059242f15d75 100644 |
| |
| |
| @@ -107,24 +107,24 @@ config SND_USB_US122L |
| will be called snd-usb-us122l. |
| |
| config SND_USB_6FIRE |
| - tristate "TerraTec DMX 6Fire USB" |
| - select FW_LOADER |
| - select BITREVERSE |
| - select SND_RAWMIDI |
| - select SND_PCM |
| - select SND_VMASTER |
| - help |
| - Say Y here to include support for TerraTec 6fire DMX USB interface. |
| - |
| - You will need firmware files in order to be able to use the device |
| - after it has been coldstarted. An install script for the firmware |
| - and further help can be found at |
| - http://sixfireusb.sourceforge.net |
| + tristate "TerraTec DMX 6Fire USB" |
| + select FW_LOADER |
| + select BITREVERSE |
| + select SND_RAWMIDI |
| + select SND_PCM |
| + select SND_VMASTER |
| + help |
| + Say Y here to include support for TerraTec 6fire DMX USB interface. |
| + |
| + You will need firmware files in order to be able to use the device |
| + after it has been coldstarted. An install script for the firmware |
| + and further help can be found at |
| + http://sixfireusb.sourceforge.net |
| |
| config SND_USB_HIFACE |
| - tristate "M2Tech hiFace USB-SPDIF driver" |
| - select SND_PCM |
| - help |
| + tristate "M2Tech hiFace USB-SPDIF driver" |
| + select SND_PCM |
| + help |
| Select this option to include support for M2Tech hiFace USB-SPDIF |
| interface. |
| |
| -- |
| 2.24.1 |
| |
| From d18fc5e6651042a56faa06beb92034728b751e7a Mon Sep 17 00:00:00 2001 |
| From: Naveen M <naveen.m@intel.com> |
| Date: Tue, 15 Oct 2019 00:28:00 +0800 |
| Subject: [PATCH 045/109] ASoC: Intel: eve: Enable mclk and ssp sclk early |
| |
| rt5663 and rt5514 needs mclk/sclk early to synchronize its internal |
| clocks. |
| |
| Signed-off-by: Naveen M <naveen.m@intel.com> |
| Signed-off-by: Harsha Priya <harshapriya.n@intel.com> |
| Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty@intel.com> |
| Signed-off-by: Brent Lu <brent.lu@intel.com> |
| Acked-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/1571070480-25666-1-git-send-email-brent.lu@intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 47cbea21628187c32efad562867aa2b6760d83cc) |
| Bugzilla: 1772498 |
| |
| sound/soc/intel/boards/Kconfig | 1 + |
| .../intel/boards/kbl_rt5663_rt5514_max98927.c | 94 +++++++++++++++++++ |
| 2 files changed, 95 insertions(+) |
| |
| diff --git a/sound/soc/intel/boards/Kconfig b/sound/soc/intel/boards/Kconfig |
| index 882ff36a7c9c..778422d36e61 100644 |
| |
| |
| @@ -320,6 +320,7 @@ config SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH |
| select SND_SOC_RT5514_SPI |
| select SND_SOC_MAX98927 |
| select SND_SOC_HDAC_HDMI |
| + select SND_SOC_INTEL_SKYLAKE_SSP_CLK |
| help |
| This adds support for ASoC Onboard Codec I2S machine driver. This will |
| create an alsa sound card for RT5663 + RT5514 + MAX98927. |
| diff --git a/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c b/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c |
| index 8ad31c91fc75..7b970219f39a 100644 |
| |
| |
| @@ -22,6 +22,9 @@ |
| #include "../../codecs/rt5514.h" |
| #include "../../codecs/rt5663.h" |
| #include "../../codecs/hdac_hdmi.h" |
| +#include <linux/clk.h> |
| +#include <linux/clk-provider.h> |
| +#include <linux/clkdev.h> |
| |
| #define KBL_REALTEK_CODEC_DAI "rt5663-aif" |
| #define KBL_REALTEK_DMIC_CODEC_DAI "rt5514-aif1" |
| @@ -50,6 +53,8 @@ struct kbl_codec_private { |
| struct snd_soc_jack kabylake_headset; |
| struct list_head hdmi_pcm_list; |
| struct snd_soc_jack kabylake_hdmi[2]; |
| + struct clk *mclk; |
| + struct clk *sclk; |
| }; |
| |
| enum { |
| @@ -71,6 +76,61 @@ static const struct snd_kcontrol_new kabylake_controls[] = { |
| SOC_DAPM_PIN_SWITCH("DMIC"), |
| }; |
| |
| +static int platform_clock_control(struct snd_soc_dapm_widget *w, |
| + struct snd_kcontrol *k, int event) |
| +{ |
| + struct snd_soc_dapm_context *dapm = w->dapm; |
| + struct snd_soc_card *card = dapm->card; |
| + struct kbl_codec_private *priv = snd_soc_card_get_drvdata(card); |
| + int ret = 0; |
| + |
| + /* |
| + * MCLK/SCLK need to be ON early for a successful synchronization of |
| + * codec internal clock. And the clocks are turned off during |
| + * POST_PMD after the stream is stopped. |
| + */ |
| + switch (event) { |
| + case SND_SOC_DAPM_PRE_PMU: |
| + /* Enable MCLK */ |
| + ret = clk_set_rate(priv->mclk, 24000000); |
| + if (ret < 0) { |
| + dev_err(card->dev, "Can't set rate for mclk, err: %d\n", |
| + ret); |
| + return ret; |
| + } |
| + |
| + ret = clk_prepare_enable(priv->mclk); |
| + if (ret < 0) { |
| + dev_err(card->dev, "Can't enable mclk, err: %d\n", ret); |
| + return ret; |
| + } |
| + |
| + /* Enable SCLK */ |
| + ret = clk_set_rate(priv->sclk, 3072000); |
| + if (ret < 0) { |
| + dev_err(card->dev, "Can't set rate for sclk, err: %d\n", |
| + ret); |
| + clk_disable_unprepare(priv->mclk); |
| + return ret; |
| + } |
| + |
| + ret = clk_prepare_enable(priv->sclk); |
| + if (ret < 0) { |
| + dev_err(card->dev, "Can't enable sclk, err: %d\n", ret); |
| + clk_disable_unprepare(priv->mclk); |
| + } |
| + break; |
| + case SND_SOC_DAPM_POST_PMD: |
| + clk_disable_unprepare(priv->mclk); |
| + clk_disable_unprepare(priv->sclk); |
| + break; |
| + default: |
| + return 0; |
| + } |
| + |
| + return 0; |
| +} |
| + |
| static const struct snd_soc_dapm_widget kabylake_widgets[] = { |
| SND_SOC_DAPM_HP("Headphone Jack", NULL), |
| SND_SOC_DAPM_MIC("Headset Mic", NULL), |
| @@ -79,11 +139,15 @@ static const struct snd_soc_dapm_widget kabylake_widgets[] = { |
| SND_SOC_DAPM_MIC("DMIC", NULL), |
| SND_SOC_DAPM_SPK("HDMI1", NULL), |
| SND_SOC_DAPM_SPK("HDMI2", NULL), |
| + SND_SOC_DAPM_SUPPLY("Platform Clock", SND_SOC_NOPM, 0, 0, |
| + platform_clock_control, SND_SOC_DAPM_PRE_PMU | |
| + SND_SOC_DAPM_POST_PMD), |
| |
| }; |
| |
| static const struct snd_soc_dapm_route kabylake_map[] = { |
| /* Headphones */ |
| + { "Headphone Jack", NULL, "Platform Clock" }, |
| { "Headphone Jack", NULL, "HPOL" }, |
| { "Headphone Jack", NULL, "HPOR" }, |
| |
| @@ -92,6 +156,7 @@ static const struct snd_soc_dapm_route kabylake_map[] = { |
| { "Right Spk", NULL, "Right BE_OUT" }, |
| |
| /* other jacks */ |
| + { "Headset Mic", NULL, "Platform Clock" }, |
| { "IN1P", NULL, "Headset Mic" }, |
| { "IN1N", NULL, "Headset Mic" }, |
| |
| @@ -646,6 +711,7 @@ static int kabylake_audio_probe(struct platform_device *pdev) |
| { |
| struct kbl_codec_private *ctx; |
| struct snd_soc_acpi_mach *mach; |
| + int ret = 0; |
| |
| ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); |
| if (!ctx) |
| @@ -661,6 +727,34 @@ static int kabylake_audio_probe(struct platform_device *pdev) |
| dmic_constraints = mach->mach_params.dmic_num == 2 ? |
| &constraints_dmic_2ch : &constraints_dmic_channels; |
| |
| + ctx->mclk = devm_clk_get(&pdev->dev, "ssp1_mclk"); |
| + if (IS_ERR(ctx->mclk)) { |
| + ret = PTR_ERR(ctx->mclk); |
| + if (ret == -ENOENT) { |
| + dev_info(&pdev->dev, |
| + "Failed to get ssp1_mclk, defer probe\n"); |
| + return -EPROBE_DEFER; |
| + } |
| + |
| + dev_err(&pdev->dev, "Failed to get ssp1_mclk with err:%d\n", |
| + ret); |
| + return ret; |
| + } |
| + |
| + ctx->sclk = devm_clk_get(&pdev->dev, "ssp1_sclk"); |
| + if (IS_ERR(ctx->sclk)) { |
| + ret = PTR_ERR(ctx->sclk); |
| + if (ret == -ENOENT) { |
| + dev_info(&pdev->dev, |
| + "Failed to get ssp1_sclk, defer probe\n"); |
| + return -EPROBE_DEFER; |
| + } |
| + |
| + dev_err(&pdev->dev, "Failed to get ssp1_sclk with err:%d\n", |
| + ret); |
| + return ret; |
| + } |
| + |
| return devm_snd_soc_register_card(&pdev->dev, &kabylake_audio_card); |
| } |
| |
| -- |
| 2.24.1 |
| |
| From 58f6613059870eaa99a493cb3deaf49183b39092 Mon Sep 17 00:00:00 2001 |
| From: Brent Lu <brent.lu@intel.com> |
| Date: Fri, 25 Oct 2019 17:11:31 +0800 |
| Subject: [PATCH 046/109] ASoC: eve: implement set_bias_level function for |
| rt5514 |
| |
| The first DMIC capture always fail (zero sequence data from PCM port) |
| after using DSP hotwording function (i.e. Google assistant). |
| |
| This rt5514 codec requires to control mclk directly in the set_bias_level |
| function. Implement this function in machine driver to control the |
| ssp1_mclk clock explicitly could fix this issue. |
| |
| Signed-off-by: Brent Lu <brent.lu@intel.com> |
| Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/1571994691-20199-1-git-send-email-brent.lu@intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 15747a80207585fe942416025540c0ff34e2aef8) |
| Bugzilla: 1772498 |
| |
| .../intel/boards/kbl_rt5663_rt5514_max98927.c | 50 +++++++++++++++++++ |
| 1 file changed, 50 insertions(+) |
| |
| diff --git a/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c b/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c |
| index 7b970219f39a..3e5f6bead229 100644 |
| |
| |
| @@ -656,6 +656,55 @@ static struct snd_soc_dai_link kabylake_dais[] = { |
| }, |
| }; |
| |
| +static int kabylake_set_bias_level(struct snd_soc_card *card, |
| + struct snd_soc_dapm_context *dapm, enum snd_soc_bias_level level) |
| +{ |
| + struct snd_soc_component *component = dapm->component; |
| + struct kbl_codec_private *priv = snd_soc_card_get_drvdata(card); |
| + int ret = 0; |
| + |
| + if (!component || strcmp(component->name, RT5514_DEV_NAME)) |
| + return 0; |
| + |
| + if (IS_ERR(priv->mclk)) |
| + return 0; |
| + |
| + /* |
| + * It's required to control mclk directly in the set_bias_level |
| + * function for rt5514 codec or the recording function could |
| + * break. |
| + */ |
| + switch (level) { |
| + case SND_SOC_BIAS_PREPARE: |
| + if (dapm->bias_level == SND_SOC_BIAS_ON) { |
| + dev_dbg(card->dev, "Disable mclk"); |
| + clk_disable_unprepare(priv->mclk); |
| + } else { |
| + dev_dbg(card->dev, "Enable mclk"); |
| + ret = clk_set_rate(priv->mclk, 24000000); |
| + if (ret) { |
| + dev_err(card->dev, "Can't set rate for mclk, err: %d\n", |
| + ret); |
| + return ret; |
| + } |
| + |
| + ret = clk_prepare_enable(priv->mclk); |
| + if (ret) { |
| + dev_err(card->dev, "Can't enable mclk, err: %d\n", |
| + ret); |
| + |
| + /* mclk is already enabled in FW */ |
| + ret = 0; |
| + } |
| + } |
| + break; |
| + default: |
| + break; |
| + } |
| + |
| + return ret; |
| +} |
| + |
| static int kabylake_card_late_probe(struct snd_soc_card *card) |
| { |
| struct kbl_codec_private *ctx = snd_soc_card_get_drvdata(card); |
| @@ -695,6 +744,7 @@ static struct snd_soc_card kabylake_audio_card = { |
| .owner = THIS_MODULE, |
| .dai_link = kabylake_dais, |
| .num_links = ARRAY_SIZE(kabylake_dais), |
| + .set_bias_level = kabylake_set_bias_level, |
| .controls = kabylake_controls, |
| .num_controls = ARRAY_SIZE(kabylake_controls), |
| .dapm_widgets = kabylake_widgets, |
| -- |
| 2.24.1 |
| |
| From b8bcd22339ac11192d875837907233f6a5a6e781 Mon Sep 17 00:00:00 2001 |
| From: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Date: Tue, 29 Oct 2019 15:40:11 +0200 |
| Subject: [PATCH 047/109] ASoC: Intel: skl-hda-dsp-generic: use |
| snd-hda-codec-hdmi |
| |
| Add support for using snd-hda-codec-hdmi driver for HDMI/DP |
| instead of ASoC hdac-hdmi. This is aligned with how other |
| HDA codecs are already handled. |
| |
| When snd-hda-codec-hdmi is used, the PCM device numbers are |
| parsed from card topology and passed to the codec driver. |
| This needs to be done at runtime as topology changes may |
| affect PCM device allocation. |
| |
| Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Reviewed-by: Takashi Iwai <tiwai@suse.de> |
| Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191029134017.18901-4-kai.vehmanen@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 7de9a47c8971bdec07cc9a62e948382003c5908f) |
| Bugzilla: 1772498 |
| |
| include/sound/soc-acpi.h | 2 + |
| sound/soc/intel/boards/Makefile | 2 +- |
| sound/soc/intel/boards/hda_dsp_common.c | 85 ++++++++++++++++++++ |
| sound/soc/intel/boards/hda_dsp_common.h | 32 ++++++++ |
| sound/soc/intel/boards/skl_hda_dsp_common.c | 6 ++ |
| sound/soc/intel/boards/skl_hda_dsp_common.h | 23 ++++++ |
| sound/soc/intel/boards/skl_hda_dsp_generic.c | 1 + |
| 7 files changed, 150 insertions(+), 1 deletion(-) |
| create mode 100644 sound/soc/intel/boards/hda_dsp_common.c |
| create mode 100644 sound/soc/intel/boards/hda_dsp_common.h |
| |
| diff --git a/include/sound/soc-acpi.h b/include/sound/soc-acpi.h |
| index 35b38e41e5b2..26d57bc9a91e 100644 |
| |
| |
| @@ -60,12 +60,14 @@ static inline struct snd_soc_acpi_mach *snd_soc_acpi_codec_list(void *arg) |
| * @acpi_ipc_irq_index: used for BYT-CR detection |
| * @platform: string used for HDaudio codec support |
| * @codec_mask: used for HDAudio support |
| + * @common_hdmi_codec_drv: use commom HDAudio HDMI codec driver |
| */ |
| struct snd_soc_acpi_mach_params { |
| u32 acpi_ipc_irq_index; |
| const char *platform; |
| u32 codec_mask; |
| u32 dmic_num; |
| + bool common_hdmi_codec_drv; |
| }; |
| |
| /** |
| diff --git a/sound/soc/intel/boards/Makefile b/sound/soc/intel/boards/Makefile |
| index 6445f90ea542..52e990b16b0d 100644 |
| |
| |
| @@ -24,7 +24,7 @@ snd-soc-kbl_rt5663_max98927-objs := kbl_rt5663_max98927.o |
| snd-soc-kbl_rt5663_rt5514_max98927-objs := kbl_rt5663_rt5514_max98927.o |
| snd-soc-kbl_rt5660-objs := kbl_rt5660.o |
| snd-soc-skl_rt286-objs := skl_rt286.o |
| -snd-soc-skl_hda_dsp-objs := skl_hda_dsp_generic.o skl_hda_dsp_common.o |
| +snd-soc-skl_hda_dsp-objs := skl_hda_dsp_generic.o skl_hda_dsp_common.o hda_dsp_common.o |
| snd-skl_nau88l25_max98357a-objs := skl_nau88l25_max98357a.o |
| snd-soc-skl_nau88l25_ssm4567-objs := skl_nau88l25_ssm4567.o |
| |
| diff --git a/sound/soc/intel/boards/hda_dsp_common.c b/sound/soc/intel/boards/hda_dsp_common.c |
| new file mode 100644 |
| index 000000000000..ed36b68d6705 |
| |
| |
| @@ -0,0 +1,85 @@ |
| +// SPDX-License-Identifier: GPL-2.0 |
| +// |
| +// Copyright(c) 2019 Intel Corporation. All rights reserved. |
| + |
| +#include <sound/pcm.h> |
| +#include <sound/soc.h> |
| +#include <sound/hda_codec.h> |
| +#include <sound/hda_i915.h> |
| +#include "../../codecs/hdac_hda.h" |
| + |
| +#include "hda_dsp_common.h" |
| + |
| +/* |
| + * Search card topology and return PCM device number |
| + * matching Nth HDMI device (zero-based index). |
| + */ |
| +struct snd_pcm *hda_dsp_hdmi_pcm_handle(struct snd_soc_card *card, |
| + int hdmi_idx) |
| +{ |
| + struct snd_soc_pcm_runtime *rtd; |
| + struct snd_pcm *spcm; |
| + int i = 0; |
| + |
| + for_each_card_rtds(card, rtd) { |
| + spcm = rtd->pcm ? |
| + rtd->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].pcm : NULL; |
| + if (spcm && strstr(spcm->id, "HDMI")) { |
| + if (i == hdmi_idx) |
| + return rtd->pcm; |
| + ++i; |
| + } |
| + } |
| + |
| + return NULL; |
| +} |
| + |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA_AUDIO_CODEC) |
| +/* |
| + * Search card topology and register HDMI PCM related controls |
| + * to codec driver. |
| + */ |
| +int hda_dsp_hdmi_build_controls(struct snd_soc_card *card, |
| + struct snd_soc_component *comp) |
| +{ |
| + struct hdac_hda_priv *hda_pvt; |
| + struct hda_codec *hcodec; |
| + struct snd_pcm *spcm; |
| + struct hda_pcm *hpcm; |
| + int err = 0, i = 0; |
| + |
| + if (!comp) |
| + return -EINVAL; |
| + |
| + hda_pvt = snd_soc_component_get_drvdata(comp); |
| + hcodec = &hda_pvt->codec; |
| + |
| + list_for_each_entry(hpcm, &hcodec->pcm_list_head, list) { |
| + spcm = hda_dsp_hdmi_pcm_handle(card, i); |
| + if (spcm) { |
| + hpcm->pcm = spcm; |
| + hpcm->device = spcm->device; |
| + dev_dbg(card->dev, |
| + "%s: mapping HDMI converter %d to PCM %d (%p)\n", |
| + __func__, i, hpcm->device, spcm); |
| + } else { |
| + hpcm->pcm = 0; |
| + hpcm->device = SNDRV_PCM_INVALID_DEVICE; |
| + dev_warn(card->dev, |
| + "%s: no PCM in topology for HDMI converter %d\n\n", |
| + __func__, i); |
| + } |
| + i++; |
| + } |
| + snd_hdac_display_power(hcodec->core.bus, |
| + HDA_CODEC_IDX_CONTROLLER, true); |
| + err = snd_hda_codec_build_controls(hcodec); |
| + if (err < 0) |
| + dev_err(card->dev, "unable to create controls %d\n", err); |
| + snd_hdac_display_power(hcodec->core.bus, |
| + HDA_CODEC_IDX_CONTROLLER, false); |
| + |
| + return err; |
| +} |
| + |
| +#endif |
| diff --git a/sound/soc/intel/boards/hda_dsp_common.h b/sound/soc/intel/boards/hda_dsp_common.h |
| new file mode 100644 |
| index 000000000000..431f7f09dccb |
| |
| |
| @@ -0,0 +1,32 @@ |
| +/* SPDX-License-Identifier: GPL-2.0 */ |
| +/* |
| + * Copyright(c) 2019 Intel Corporation. |
| + */ |
| + |
| +/* |
| + * This file defines helper functions used by multiple |
| + * Intel HDA based machine drivers. |
| + */ |
| + |
| +#ifndef __HDA_DSP_COMMON_H |
| +#define __HDA_DSP_COMMON_H |
| + |
| +#include <sound/hda_codec.h> |
| +#include <sound/hda_i915.h> |
| +#include "../../codecs/hdac_hda.h" |
| + |
| +struct snd_pcm *hda_dsp_hdmi_pcm_handle(struct snd_soc_card *card, |
| + int hdmi_idx); |
| + |
| +#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA_AUDIO_CODEC) |
| +int hda_dsp_hdmi_build_controls(struct snd_soc_card *card, |
| + struct snd_soc_component *comp); |
| +#else |
| +static inline int hda_dsp_hdmi_build_controls(struct snd_soc_card *card, |
| + struct snd_soc_component *comp) |
| +{ |
| + return -EINVAL; |
| +} |
| +#endif |
| + |
| +#endif /* __HDA_DSP_COMMON_H */ |
| diff --git a/sound/soc/intel/boards/skl_hda_dsp_common.c b/sound/soc/intel/boards/skl_hda_dsp_common.c |
| index e3d405e57c5f..78ff5f24c40e 100644 |
| |
| |
| @@ -14,6 +14,9 @@ |
| #include "../../codecs/hdac_hdmi.h" |
| #include "skl_hda_dsp_common.h" |
| |
| +#include <sound/hda_codec.h> |
| +#include "../../codecs/hdac_hda.h" |
| + |
| #define NAME_SIZE 32 |
| |
| int skl_hda_hdmi_add_pcm(struct snd_soc_card *card, int device) |
| @@ -139,6 +142,9 @@ int skl_hda_hdmi_jack_init(struct snd_soc_card *card) |
| char jack_name[NAME_SIZE]; |
| int err; |
| |
| + if (ctx->common_hdmi_codec_drv) |
| + return skl_hda_hdmi_build_controls(card); |
| + |
| list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) { |
| component = pcm->codec_dai->component; |
| snprintf(jack_name, sizeof(jack_name), |
| diff --git a/sound/soc/intel/boards/skl_hda_dsp_common.h b/sound/soc/intel/boards/skl_hda_dsp_common.h |
| index daa582e513b2..bbe6e2acfda3 100644 |
| |
| |
| @@ -14,6 +14,9 @@ |
| #include <linux/platform_device.h> |
| #include <sound/core.h> |
| #include <sound/jack.h> |
| +#include <sound/hda_codec.h> |
| +#include "../../codecs/hdac_hda.h" |
| +#include "hda_dsp_common.h" |
| |
| #define HDA_DSP_MAX_BE_DAI_LINKS 7 |
| |
| @@ -29,10 +32,30 @@ struct skl_hda_private { |
| int pcm_count; |
| int dai_index; |
| const char *platform_name; |
| + bool common_hdmi_codec_drv; |
| }; |
| |
| extern struct snd_soc_dai_link skl_hda_be_dai_links[HDA_DSP_MAX_BE_DAI_LINKS]; |
| int skl_hda_hdmi_jack_init(struct snd_soc_card *card); |
| int skl_hda_hdmi_add_pcm(struct snd_soc_card *card, int device); |
| |
| +/* |
| + * Search card topology and register HDMI PCM related controls |
| + * to codec driver. |
| + */ |
| +static inline int skl_hda_hdmi_build_controls(struct snd_soc_card *card) |
| +{ |
| + struct skl_hda_private *ctx = snd_soc_card_get_drvdata(card); |
| + struct snd_soc_component *component; |
| + struct skl_hda_hdmi_pcm *pcm; |
| + |
| + pcm = list_first_entry(&ctx->hdmi_pcm_list, struct skl_hda_hdmi_pcm, |
| + head); |
| + component = pcm->codec_dai->component; |
| + if (!component) |
| + return -EINVAL; |
| + |
| + return hda_dsp_hdmi_build_controls(card, component); |
| +} |
| + |
| #endif /* __SOUND_SOC_HDA_DSP_COMMON_H */ |
| diff --git a/sound/soc/intel/boards/skl_hda_dsp_generic.c b/sound/soc/intel/boards/skl_hda_dsp_generic.c |
| index e8d676c192f6..4e45901e3a2f 100644 |
| |
| |
| @@ -178,6 +178,7 @@ static int skl_hda_audio_probe(struct platform_device *pdev) |
| ctx->pcm_count = hda_soc_card.num_links; |
| ctx->dai_index = 1; /* hdmi codec dai name starts from index 1 */ |
| ctx->platform_name = mach->mach_params.platform; |
| + ctx->common_hdmi_codec_drv = mach->mach_params.common_hdmi_codec_drv; |
| |
| hda_soc_card.dev = &pdev->dev; |
| snd_soc_card_set_drvdata(&hda_soc_card, ctx); |
| -- |
| 2.24.1 |
| |
| From 092c14f640de2cfdef47fc3991cb8a6c752cfecd Mon Sep 17 00:00:00 2001 |
| From: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Date: Tue, 29 Oct 2019 15:40:12 +0200 |
| Subject: [PATCH 048/109] ASoC: Intel: skl-hda-dsp-generic: fix include guard |
| name |
| |
| Match the include guard define to actual filename. The source |
| directory now has an actual hda_dsp_common.h header, so the old |
| include guard may cause confusion. |
| |
| Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Reviewed-by: Takashi Iwai <tiwai@suse.de> |
| Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191029134017.18901-5-kai.vehmanen@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 0f163110256ac91aee562da149838fcb8a39d518) |
| Bugzilla: 1772498 |
| |
| sound/soc/intel/boards/skl_hda_dsp_common.h | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/sound/soc/intel/boards/skl_hda_dsp_common.h b/sound/soc/intel/boards/skl_hda_dsp_common.h |
| index bbe6e2acfda3..d6150670ca05 100644 |
| |
| |
| @@ -8,8 +8,8 @@ |
| * platforms with HDA Codecs. |
| */ |
| |
| -#ifndef __SOUND_SOC_HDA_DSP_COMMON_H |
| -#define __SOUND_SOC_HDA_DSP_COMMON_H |
| +#ifndef __SKL_HDA_DSP_COMMON_H |
| +#define __SKL_HDA_DSP_COMMON_H |
| #include <linux/module.h> |
| #include <linux/platform_device.h> |
| #include <sound/core.h> |
| -- |
| 2.24.1 |
| |
| From 7abc02e54cfed33f105c33d20e1d9de2cae51978 Mon Sep 17 00:00:00 2001 |
| From: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Date: Tue, 29 Oct 2019 15:40:14 +0200 |
| Subject: [PATCH 049/109] ASoC: Intel: bxt-da7219-max98357a: common hdmi codec |
| support |
| |
| Add support for using snd-hda-codec-hdmi driver for HDMI/DP |
| instead of ASoC hdac-hdmi. This is aligned with how other |
| HDA codecs are already handled. |
| |
| Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Reviewed-by: Takashi Iwai <tiwai@suse.de> |
| Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191029134017.18901-7-kai.vehmanen@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 57ad18906f24278893b128967551fe7fa0996129) |
| Bugzilla: 1772498 |
| |
| sound/soc/intel/boards/Makefile | 2 +- |
| sound/soc/intel/boards/bxt_da7219_max98357a.c | 11 +++++++++++ |
| 2 files changed, 12 insertions(+), 1 deletion(-) |
| |
| diff --git a/sound/soc/intel/boards/Makefile b/sound/soc/intel/boards/Makefile |
| index 52e990b16b0d..0cf4a984f083 100644 |
| |
| |
| @@ -4,7 +4,7 @@ snd-soc-sst-byt-rt5640-mach-objs := byt-rt5640.o |
| snd-soc-sst-byt-max98090-mach-objs := byt-max98090.o |
| snd-soc-sst-bdw-rt5677-mach-objs := bdw-rt5677.o |
| snd-soc-sst-broadwell-objs := broadwell.o |
| -snd-soc-sst-bxt-da7219_max98357a-objs := bxt_da7219_max98357a.o |
| +snd-soc-sst-bxt-da7219_max98357a-objs := bxt_da7219_max98357a.o hda_dsp_common.o |
| snd-soc-sst-bxt-rt298-objs := bxt_rt298.o |
| snd-soc-sst-glk-rt5682_max98357a-objs := glk_rt5682_max98357a.o |
| snd-soc-sst-bytcr-rt5640-objs := bytcr_rt5640.o |
| diff --git a/sound/soc/intel/boards/bxt_da7219_max98357a.c b/sound/soc/intel/boards/bxt_da7219_max98357a.c |
| index ac1dea5f9d11..5873abb46441 100644 |
| |
| |
| @@ -21,6 +21,7 @@ |
| #include "../../codecs/da7219.h" |
| #include "../../codecs/da7219-aad.h" |
| #include "../common/soc-intel-quirks.h" |
| +#include "hda_dsp_common.h" |
| |
| #define BXT_DIALOG_CODEC_DAI "da7219-hifi" |
| #define BXT_MAXIM_CODEC_DAI "HiFi" |
| @@ -38,6 +39,7 @@ struct bxt_hdmi_pcm { |
| |
| struct bxt_card_private { |
| struct list_head hdmi_pcm_list; |
| + bool common_hdmi_codec_drv; |
| }; |
| |
| enum { |
| @@ -615,6 +617,13 @@ static int bxt_card_late_probe(struct snd_soc_card *card) |
| snd_soc_dapm_add_routes(&card->dapm, broxton_map, |
| ARRAY_SIZE(broxton_map)); |
| |
| + pcm = list_first_entry(&ctx->hdmi_pcm_list, struct bxt_hdmi_pcm, |
| + head); |
| + component = pcm->codec_dai->component; |
| + |
| + if (ctx->common_hdmi_codec_drv) |
| + return hda_dsp_hdmi_build_controls(card, component); |
| + |
| list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) { |
| component = pcm->codec_dai->component; |
| snprintf(jack_name, sizeof(jack_name), |
| @@ -720,6 +729,8 @@ static int broxton_audio_probe(struct platform_device *pdev) |
| if (ret) |
| return ret; |
| |
| + ctx->common_hdmi_codec_drv = mach->mach_params.common_hdmi_codec_drv; |
| + |
| return devm_snd_soc_register_card(&pdev->dev, &broxton_audio_card); |
| } |
| |
| -- |
| 2.24.1 |
| |
| From 66a2d02030cb6cd534ef17a3fddab4f0ac54838e Mon Sep 17 00:00:00 2001 |
| From: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Date: Tue, 29 Oct 2019 15:40:15 +0200 |
| Subject: [PATCH 050/109] ASoC: Intel: glk_rt5682_max98357a: common hdmi codec |
| support |
| |
| Add support for using snd-hda-codec-hdmi driver for HDMI/DP |
| instead of ASoC hdac-hdmi. This is aligned with how other |
| HDA codecs are already handled. |
| |
| Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Reviewed-by: Takashi Iwai <tiwai@suse.de> |
| Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191029134017.18901-8-kai.vehmanen@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit dfe87aa86cd92d21603d64f4035fecae19c92e7a) |
| Bugzilla: 1772498 |
| |
| sound/soc/intel/boards/Makefile | 2 +- |
| sound/soc/intel/boards/glk_rt5682_max98357a.c | 11 +++++++++++ |
| 2 files changed, 12 insertions(+), 1 deletion(-) |
| |
| diff --git a/sound/soc/intel/boards/Makefile b/sound/soc/intel/boards/Makefile |
| index 0cf4a984f083..b36f44906c91 100644 |
| |
| |
| @@ -6,7 +6,7 @@ snd-soc-sst-bdw-rt5677-mach-objs := bdw-rt5677.o |
| snd-soc-sst-broadwell-objs := broadwell.o |
| snd-soc-sst-bxt-da7219_max98357a-objs := bxt_da7219_max98357a.o hda_dsp_common.o |
| snd-soc-sst-bxt-rt298-objs := bxt_rt298.o |
| -snd-soc-sst-glk-rt5682_max98357a-objs := glk_rt5682_max98357a.o |
| +snd-soc-sst-glk-rt5682_max98357a-objs := glk_rt5682_max98357a.o hda_dsp_common.o |
| snd-soc-sst-bytcr-rt5640-objs := bytcr_rt5640.o |
| snd-soc-sst-bytcr-rt5651-objs := bytcr_rt5651.o |
| snd-soc-sst-cht-bsw-rt5672-objs := cht_bsw_rt5672.o |
| diff --git a/sound/soc/intel/boards/glk_rt5682_max98357a.c b/sound/soc/intel/boards/glk_rt5682_max98357a.c |
| index bd2d371f2acd..b36264d1d1cd 100644 |
| |
| |
| @@ -19,6 +19,7 @@ |
| #include <sound/soc-acpi.h> |
| #include "../../codecs/rt5682.h" |
| #include "../../codecs/hdac_hdmi.h" |
| +#include "hda_dsp_common.h" |
| |
| /* The platform clock outputs 19.2Mhz clock to codec as I2S MCLK */ |
| #define GLK_PLAT_CLK_FREQ 19200000 |
| @@ -41,6 +42,7 @@ struct glk_hdmi_pcm { |
| struct glk_card_private { |
| struct snd_soc_jack geminilake_headset; |
| struct list_head hdmi_pcm_list; |
| + bool common_hdmi_codec_drv; |
| }; |
| |
| enum { |
| @@ -545,6 +547,13 @@ static int glk_card_late_probe(struct snd_soc_card *card) |
| int err = 0; |
| int i = 0; |
| |
| + pcm = list_first_entry(&ctx->hdmi_pcm_list, struct glk_hdmi_pcm, |
| + head); |
| + component = pcm->codec_dai->component; |
| + |
| + if (ctx->common_hdmi_codec_drv) |
| + return hda_dsp_hdmi_build_controls(card, component); |
| + |
| list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) { |
| component = pcm->codec_dai->component; |
| snprintf(jack_name, sizeof(jack_name), |
| @@ -612,6 +621,8 @@ static int geminilake_audio_probe(struct platform_device *pdev) |
| if (ret) |
| return ret; |
| |
| + ctx->common_hdmi_codec_drv = mach->mach_params.common_hdmi_codec_drv; |
| + |
| return devm_snd_soc_register_card(&pdev->dev, card); |
| } |
| |
| -- |
| 2.24.1 |
| |
| From bac23a9db964cffffb22223e1f1c6cc690c37f7e Mon Sep 17 00:00:00 2001 |
| From: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Date: Tue, 29 Oct 2019 15:40:16 +0200 |
| Subject: [PATCH 051/109] ASoC: intel: sof_rt5682: common hdmi codec support |
| |
| Add support for using snd-hda-codec-hdmi driver for HDMI/DP |
| instead of ASoC hdac-hdmi. This is aligned with how other |
| HDA codecs are already handled. |
| |
| Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Reviewed-by: Takashi Iwai <tiwai@suse.de> |
| Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191029134017.18901-9-kai.vehmanen@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 59bbd703ea2eae7c2766713135e4742c07fbbad7) |
| Bugzilla: 1772498 |
| |
| sound/soc/intel/boards/Makefile | 2 +- |
| sound/soc/intel/boards/sof_rt5682.c | 11 +++++++++++ |
| 2 files changed, 12 insertions(+), 1 deletion(-) |
| |
| diff --git a/sound/soc/intel/boards/Makefile b/sound/soc/intel/boards/Makefile |
| index b36f44906c91..255cee8c7906 100644 |
| |
| |
| @@ -17,7 +17,7 @@ snd-soc-sst-byt-cht-cx2072x-objs := bytcht_cx2072x.o |
| snd-soc-sst-byt-cht-da7213-objs := bytcht_da7213.o |
| snd-soc-sst-byt-cht-es8316-objs := bytcht_es8316.o |
| snd-soc-sst-byt-cht-nocodec-objs := bytcht_nocodec.o |
| -snd-soc-sof_rt5682-objs := sof_rt5682.o |
| +snd-soc-sof_rt5682-objs := sof_rt5682.o hda_dsp_common.o |
| snd-soc-kbl_da7219_max98357a-objs := kbl_da7219_max98357a.o |
| snd-soc-kbl_da7219_max98927-objs := kbl_da7219_max98927.o |
| snd-soc-kbl_rt5663_max98927-objs := kbl_rt5663_max98927.o |
| diff --git a/sound/soc/intel/boards/sof_rt5682.c b/sound/soc/intel/boards/sof_rt5682.c |
| index 320a9b9273db..751b8ea6ae1f 100644 |
| |
| |
| @@ -21,6 +21,7 @@ |
| #include "../../codecs/rt5682.h" |
| #include "../../codecs/hdac_hdmi.h" |
| #include "../common/soc-intel-quirks.h" |
| +#include "hda_dsp_common.h" |
| |
| #define NAME_SIZE 32 |
| |
| @@ -53,6 +54,7 @@ struct sof_card_private { |
| struct clk *mclk; |
| struct snd_soc_jack sof_headset; |
| struct list_head hdmi_pcm_list; |
| + bool common_hdmi_codec_drv; |
| }; |
| |
| static int sof_rt5682_quirk_cb(const struct dmi_system_id *id) |
| @@ -274,6 +276,13 @@ static int sof_card_late_probe(struct snd_soc_card *card) |
| if (is_legacy_cpu) |
| return 0; |
| |
| + pcm = list_first_entry(&ctx->hdmi_pcm_list, struct sof_hdmi_pcm, |
| + head); |
| + component = pcm->codec_dai->component; |
| + |
| + if (ctx->common_hdmi_codec_drv) |
| + return hda_dsp_hdmi_build_controls(card, component); |
| + |
| list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) { |
| component = pcm->codec_dai->component; |
| snprintf(jack_name, sizeof(jack_name), |
| @@ -651,6 +660,8 @@ static int sof_audio_probe(struct platform_device *pdev) |
| if (ret) |
| return ret; |
| |
| + ctx->common_hdmi_codec_drv = mach->mach_params.common_hdmi_codec_drv; |
| + |
| snd_soc_card_set_drvdata(&sof_audio_card_rt5682, ctx); |
| |
| return devm_snd_soc_register_card(&pdev->dev, |
| -- |
| 2.24.1 |
| |
| From 8526042dff63e9e4f6f6bde4f4b0fd3274240ce1 Mon Sep 17 00:00:00 2001 |
| From: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Date: Tue, 29 Oct 2019 15:40:17 +0200 |
| Subject: [PATCH 052/109] ASoC: Intel: bxt_rt298: common hdmi codec support |
| |
| Add support for using snd-hda-codec-hdmi driver for HDMI/DP |
| instead of ASoC hdac-hdmi. This is aligned with how other |
| HDA codecs are already handled. |
| |
| Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Reviewed-by: Takashi Iwai <tiwai@suse.de> |
| Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191029134017.18901-10-kai.vehmanen@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 7d2ae58376658a3ca0d8f9a53f6f065df126c432) |
| Bugzilla: 1772498 |
| |
| sound/soc/intel/boards/Makefile | 2 +- |
| sound/soc/intel/boards/bxt_rt298.c | 11 +++++++++++ |
| 2 files changed, 12 insertions(+), 1 deletion(-) |
| |
| diff --git a/sound/soc/intel/boards/Makefile b/sound/soc/intel/boards/Makefile |
| index 255cee8c7906..8bddf379cef1 100644 |
| |
| |
| @@ -5,7 +5,7 @@ snd-soc-sst-byt-max98090-mach-objs := byt-max98090.o |
| snd-soc-sst-bdw-rt5677-mach-objs := bdw-rt5677.o |
| snd-soc-sst-broadwell-objs := broadwell.o |
| snd-soc-sst-bxt-da7219_max98357a-objs := bxt_da7219_max98357a.o hda_dsp_common.o |
| -snd-soc-sst-bxt-rt298-objs := bxt_rt298.o |
| +snd-soc-sst-bxt-rt298-objs := bxt_rt298.o hda_dsp_common.o |
| snd-soc-sst-glk-rt5682_max98357a-objs := glk_rt5682_max98357a.o hda_dsp_common.o |
| snd-soc-sst-bytcr-rt5640-objs := bytcr_rt5640.o |
| snd-soc-sst-bytcr-rt5651-objs := bytcr_rt5651.o |
| diff --git a/sound/soc/intel/boards/bxt_rt298.c b/sound/soc/intel/boards/bxt_rt298.c |
| index adf416a49b48..eabf9d8468ae 100644 |
| |
| |
| @@ -18,6 +18,7 @@ |
| #include <sound/pcm_params.h> |
| #include "../../codecs/hdac_hdmi.h" |
| #include "../../codecs/rt298.h" |
| +#include "hda_dsp_common.h" |
| |
| /* Headset jack detection DAPM pins */ |
| static struct snd_soc_jack broxton_headset; |
| @@ -31,6 +32,7 @@ struct bxt_hdmi_pcm { |
| |
| struct bxt_rt286_private { |
| struct list_head hdmi_pcm_list; |
| + bool common_hdmi_codec_drv; |
| }; |
| |
| enum { |
| @@ -527,6 +529,13 @@ static int bxt_card_late_probe(struct snd_soc_card *card) |
| int err, i = 0; |
| char jack_name[NAME_SIZE]; |
| |
| + pcm = list_first_entry(&ctx->hdmi_pcm_list, struct bxt_hdmi_pcm, |
| + head); |
| + component = pcm->codec_dai->component; |
| + |
| + if (ctx->common_hdmi_codec_drv) |
| + return hda_dsp_hdmi_build_controls(card, component); |
| + |
| list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) { |
| component = pcm->codec_dai->component; |
| snprintf(jack_name, sizeof(jack_name), |
| @@ -626,6 +635,8 @@ static int broxton_audio_probe(struct platform_device *pdev) |
| if (ret) |
| return ret; |
| |
| + ctx->common_hdmi_codec_drv = mach->mach_params.common_hdmi_codec_drv; |
| + |
| return devm_snd_soc_register_card(&pdev->dev, card); |
| } |
| |
| -- |
| 2.24.1 |
| |
| From 628db9e1d5fea0baf512cfb523d45d81d8dc12f8 Mon Sep 17 00:00:00 2001 |
| From: Naveen Manohar <naveen.m@intel.com> |
| Date: Fri, 1 Nov 2019 12:18:46 -0500 |
| Subject: [PATCH 053/109] ASoC: Intel: Add acpi match for rt1011 based m/c |
| driver |
| |
| Add match for CML m/c with RT1011 and RT5682 |
| |
| Signed-off-by: Naveen Manohar <naveen.m@intel.com> |
| Signed-off-by: Sathya Prakash M R <sathya.prakash.m.r@intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191101171847.26767-2-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit f95ce1355944189c26e4182c813d7f018b434dbd) |
| Bugzilla: 1772498 |
| |
| sound/soc/intel/common/soc-acpi-intel-cnl-match.c | 7 +++++++ |
| 1 file changed, 7 insertions(+) |
| |
| diff --git a/sound/soc/intel/common/soc-acpi-intel-cnl-match.c b/sound/soc/intel/common/soc-acpi-intel-cnl-match.c |
| index 985aa366c9e8..16d0bae8b316 100644 |
| |
| |
| @@ -47,6 +47,13 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_cnl_machines[] = { |
| .sof_fw_filename = "sof-cnl.ri", |
| .sof_tplg_filename = "sof-cml-rt5682-max98357a.tplg", |
| }, |
| + { |
| + .id = "10EC1011", |
| + .drv_name = "cml_rt1011_rt5682", |
| + .quirk_data = &cml_codecs, |
| + .sof_fw_filename = "sof-cnl.ri", |
| + .sof_tplg_filename = "sof-cml-rt1011-rt5682.tplg", |
| + }, |
| { |
| .id = "10EC5682", |
| .drv_name = "sof_rt5682", |
| -- |
| 2.24.1 |
| |
| From 97082f367654546944ff5e2be8b8f12ab4ff1929 Mon Sep 17 00:00:00 2001 |
| From: Naveen Manohar <naveen.m@intel.com> |
| Date: Fri, 1 Nov 2019 12:18:47 -0500 |
| Subject: [PATCH 054/109] ASoC: Intel: boards: Add CML m/c using RT1011 and |
| RT5682 |
| |
| Machine driver to enable |
| RT5682 on SSP0, DMIC, HDMI and |
| RT1011 AMP on SSP1 with |
| 2 CH / 24 bit TDM Playback over 4 individual codecs and |
| 4 CH / 24 bit Capture to provide feedback. |
| |
| Signed-off-by: Naveen Manohar <naveen.m@intel.com> |
| Signed-off-by: Sathya Prakash M R <sathya.prakash.m.r@intel.com> |
| Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191101171847.26767-3-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 17fe95d6df9320409015e5114309a3c05e31b736) |
| Bugzilla: 1772498 |
| |
| sound/soc/intel/boards/Kconfig | 14 + |
| sound/soc/intel/boards/Makefile | 2 + |
| sound/soc/intel/boards/cml_rt1011_rt5682.c | 487 +++++++++++++++++++++ |
| 3 files changed, 503 insertions(+) |
| create mode 100644 sound/soc/intel/boards/cml_rt1011_rt5682.c |
| |
| diff --git a/sound/soc/intel/boards/Kconfig b/sound/soc/intel/boards/Kconfig |
| index 778422d36e61..ef40f83e0a3b 100644 |
| |
| |
| @@ -423,6 +423,20 @@ config SND_SOC_INTEL_CML_LP_DA7219_MAX98357A_MACH |
| depends on MFD_INTEL_LPSS || COMPILE_TEST |
| select SND_SOC_INTEL_DA7219_MAX98357A_GENERIC |
| |
| +config SND_SOC_INTEL_SOF_CML_RT1011_RT5682_MACH |
| + tristate "CML with RT1011 and RT5682 in I2S Mode" |
| + depends on I2C && ACPI |
| + depends on MFD_INTEL_LPSS || COMPILE_TEST |
| + select SND_SOC_RT1011 |
| + select SND_SOC_RT5682 |
| + select SND_SOC_DMIC |
| + select SND_SOC_HDAC_HDMI |
| + help |
| + This adds support for ASoC machine driver for SOF platform with |
| + RT1011 + RT5682 I2S codec. |
| + Say Y if you have such a device. |
| + If unsure select "N". |
| + |
| endif ## SND_SOC_SOF_COMETLAKE_LP && SND_SOC_SOF_HDA_LINK |
| |
| endif ## SND_SOC_INTEL_MACH |
| diff --git a/sound/soc/intel/boards/Makefile b/sound/soc/intel/boards/Makefile |
| index 8bddf379cef1..9ae6544c6f3b 100644 |
| |
| |
| @@ -18,6 +18,7 @@ snd-soc-sst-byt-cht-da7213-objs := bytcht_da7213.o |
| snd-soc-sst-byt-cht-es8316-objs := bytcht_es8316.o |
| snd-soc-sst-byt-cht-nocodec-objs := bytcht_nocodec.o |
| snd-soc-sof_rt5682-objs := sof_rt5682.o hda_dsp_common.o |
| +snd-soc-cml_rt1011_rt5682-objs := cml_rt1011_rt5682.o hda_dsp_common.o |
| snd-soc-kbl_da7219_max98357a-objs := kbl_da7219_max98357a.o |
| snd-soc-kbl_da7219_max98927-objs := kbl_da7219_max98927.o |
| snd-soc-kbl_rt5663_max98927-objs := kbl_rt5663_max98927.o |
| @@ -47,6 +48,7 @@ obj-$(CONFIG_SND_SOC_INTEL_BYT_CHT_CX2072X_MACH) += snd-soc-sst-byt-cht-cx2072x. |
| obj-$(CONFIG_SND_SOC_INTEL_BYT_CHT_DA7213_MACH) += snd-soc-sst-byt-cht-da7213.o |
| obj-$(CONFIG_SND_SOC_INTEL_BYT_CHT_ES8316_MACH) += snd-soc-sst-byt-cht-es8316.o |
| obj-$(CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH) += snd-soc-sst-byt-cht-nocodec.o |
| +obj-$(CONFIG_SND_SOC_INTEL_SOF_CML_RT1011_RT5682_MACH) += snd-soc-cml_rt1011_rt5682.o |
| obj-$(CONFIG_SND_SOC_INTEL_KBL_DA7219_MAX98357A_MACH) += snd-soc-kbl_da7219_max98357a.o |
| obj-$(CONFIG_SND_SOC_INTEL_KBL_DA7219_MAX98927_MACH) += snd-soc-kbl_da7219_max98927.o |
| obj-$(CONFIG_SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH) += snd-soc-kbl_rt5663_max98927.o |
| diff --git a/sound/soc/intel/boards/cml_rt1011_rt5682.c b/sound/soc/intel/boards/cml_rt1011_rt5682.c |
| new file mode 100644 |
| index 000000000000..a22f97234201 |
| |
| |
| @@ -0,0 +1,487 @@ |
| +// SPDX-License-Identifier: GPL-2.0 |
| +// Copyright(c) 2019 Intel Corporation. |
| + |
| +/* |
| + * Intel Cometlake I2S Machine driver for RT1011 + RT5682 codec |
| + */ |
| + |
| +#include <linux/input.h> |
| +#include <linux/module.h> |
| +#include <linux/platform_device.h> |
| +#include <linux/clk.h> |
| +#include <linux/dmi.h> |
| +#include <linux/slab.h> |
| +#include <asm/cpu_device_id.h> |
| +#include <linux/acpi.h> |
| +#include <sound/core.h> |
| +#include <sound/jack.h> |
| +#include <sound/pcm.h> |
| +#include <sound/pcm_params.h> |
| +#include <sound/soc.h> |
| +#include <sound/rt5682.h> |
| +#include <sound/soc-acpi.h> |
| +#include "../../codecs/rt1011.h" |
| +#include "../../codecs/rt5682.h" |
| +#include "../../codecs/hdac_hdmi.h" |
| +#include "hda_dsp_common.h" |
| + |
| +/* The platform clock outputs 24Mhz clock to codec as I2S MCLK */ |
| +#define CML_PLAT_CLK 24000000 |
| +#define CML_RT1011_CODEC_DAI "rt1011-aif" |
| +#define CML_RT5682_CODEC_DAI "rt5682-aif1" |
| +#define NAME_SIZE 32 |
| + |
| +static struct snd_soc_jack hdmi_jack[3]; |
| + |
| +struct hdmi_pcm { |
| + struct list_head head; |
| + struct snd_soc_dai *codec_dai; |
| + int device; |
| +}; |
| + |
| +struct card_private { |
| + char codec_name[SND_ACPI_I2C_ID_LEN]; |
| + struct snd_soc_jack headset; |
| + struct list_head hdmi_pcm_list; |
| + bool common_hdmi_codec_drv; |
| +}; |
| + |
| +static const struct snd_kcontrol_new cml_controls[] = { |
| + SOC_DAPM_PIN_SWITCH("Headphone Jack"), |
| + SOC_DAPM_PIN_SWITCH("Headset Mic"), |
| + SOC_DAPM_PIN_SWITCH("TL Ext Spk"), |
| + SOC_DAPM_PIN_SWITCH("TR Ext Spk"), |
| + SOC_DAPM_PIN_SWITCH("WL Ext Spk"), |
| + SOC_DAPM_PIN_SWITCH("WR Ext Spk"), |
| +}; |
| + |
| +static const struct snd_soc_dapm_widget cml_rt1011_rt5682_widgets[] = { |
| + SND_SOC_DAPM_SPK("TL Ext Spk", NULL), |
| + SND_SOC_DAPM_SPK("TR Ext Spk", NULL), |
| + SND_SOC_DAPM_SPK("WL Ext Spk", NULL), |
| + SND_SOC_DAPM_SPK("WR Ext Spk", NULL), |
| + SND_SOC_DAPM_HP("Headphone Jack", NULL), |
| + SND_SOC_DAPM_MIC("Headset Mic", NULL), |
| + SND_SOC_DAPM_MIC("SoC DMIC", NULL), |
| +}; |
| + |
| +static const struct snd_soc_dapm_route cml_rt1011_rt5682_map[] = { |
| + /*speaker*/ |
| + {"TL Ext Spk", NULL, "TL SPO"}, |
| + {"TR Ext Spk", NULL, "TR SPO"}, |
| + {"WL Ext Spk", NULL, "WL SPO"}, |
| + {"WR Ext Spk", NULL, "WR SPO"}, |
| + |
| + /* HP jack connectors - unknown if we have jack detection */ |
| + { "Headphone Jack", NULL, "HPOL" }, |
| + { "Headphone Jack", NULL, "HPOR" }, |
| + |
| + /* other jacks */ |
| + { "IN1P", NULL, "Headset Mic" }, |
| + |
| + /* DMIC */ |
| + {"DMic", NULL, "SoC DMIC"}, |
| +}; |
| + |
| +static int cml_rt5682_codec_init(struct snd_soc_pcm_runtime *rtd) |
| +{ |
| + struct card_private *ctx = snd_soc_card_get_drvdata(rtd->card); |
| + struct snd_soc_component *component = rtd->codec_dai->component; |
| + struct snd_soc_jack *jack; |
| + int ret; |
| + |
| + /* need to enable ASRC function for 24MHz mclk rate */ |
| + rt5682_sel_asrc_clk_src(component, RT5682_DA_STEREO1_FILTER | |
| + RT5682_AD_STEREO1_FILTER, |
| + RT5682_CLK_SEL_I2S1_ASRC); |
| + |
| + /* |
| + * Headset buttons map to the google Reference headset. |
| + * These can be configured by userspace. |
| + */ |
| + ret = snd_soc_card_jack_new(rtd->card, "Headset Jack", |
| + SND_JACK_HEADSET | SND_JACK_BTN_0 | |
| + SND_JACK_BTN_1 | SND_JACK_BTN_2 | |
| + SND_JACK_BTN_3, |
| + &ctx->headset, NULL, 0); |
| + if (ret) { |
| + dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret); |
| + return ret; |
| + } |
| + |
| + jack = &ctx->headset; |
| + |
| + snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); |
| + snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND); |
| + snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP); |
| + snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN); |
| + ret = snd_soc_component_set_jack(component, jack, NULL); |
| + if (ret) |
| + dev_err(rtd->dev, "Headset Jack call-back failed: %d\n", ret); |
| + |
| + return ret; |
| +}; |
| + |
| +static int cml_rt5682_hw_params(struct snd_pcm_substream *substream, |
| + struct snd_pcm_hw_params *params) |
| +{ |
| + struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| + struct snd_soc_dai *codec_dai = rtd->codec_dai; |
| + int clk_id, clk_freq, pll_out, ret; |
| + |
| + clk_id = RT5682_PLL1_S_MCLK; |
| + clk_freq = CML_PLAT_CLK; |
| + |
| + pll_out = params_rate(params) * 512; |
| + |
| + ret = snd_soc_dai_set_pll(codec_dai, 0, clk_id, clk_freq, pll_out); |
| + if (ret < 0) |
| + dev_warn(rtd->dev, "snd_soc_dai_set_pll err = %d\n", ret); |
| + |
| + /* Configure sysclk for codec */ |
| + ret = snd_soc_dai_set_sysclk(codec_dai, RT5682_SCLK_S_PLL1, |
| + pll_out, SND_SOC_CLOCK_IN); |
| + if (ret < 0) |
| + dev_warn(rtd->dev, "snd_soc_dai_set_sysclk err = %d\n", ret); |
| + |
| + /* |
| + * slot_width should be equal or large than data length, set them |
| + * be the same |
| + */ |
| + ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x0, 0x0, 2, |
| + params_width(params)); |
| + if (ret < 0) |
| + dev_warn(rtd->dev, "set TDM slot err:%d\n", ret); |
| + return ret; |
| +} |
| + |
| +static int cml_rt1011_hw_params(struct snd_pcm_substream *substream, |
| + struct snd_pcm_hw_params *params) |
| +{ |
| + struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| + struct snd_soc_dai *codec_dai; |
| + struct snd_soc_card *card = rtd->card; |
| + int srate, i, ret = 0; |
| + |
| + srate = params_rate(params); |
| + |
| + for (i = 0; i < rtd->num_codecs; i++) { |
| + codec_dai = rtd->codec_dais[i]; |
| + |
| + /* 100 Fs to drive 24 bit data */ |
| + ret = snd_soc_dai_set_pll(codec_dai, 0, RT1011_PLL1_S_BCLK, |
| + 100 * srate, 256 * srate); |
| + if (ret < 0) { |
| + dev_err(card->dev, "codec_dai clock not set\n"); |
| + return ret; |
| + } |
| + |
| + ret = snd_soc_dai_set_sysclk(codec_dai, |
| + RT1011_FS_SYS_PRE_S_PLL1, |
| + 256 * srate, SND_SOC_CLOCK_IN); |
| + if (ret < 0) { |
| + dev_err(card->dev, "codec_dai clock not set\n"); |
| + return ret; |
| + } |
| + |
| + /* |
| + * Codec TDM is configured as 24 bit capture/ playback. |
| + * 2 CH PB is done over 4 codecs - 2 Woofers and 2 Tweeters. |
| + * The Left woofer and tweeter plays the Left playback data |
| + * and similar by the Right. |
| + * Hence 2 codecs (1 T and 1 W pair) share same Rx slot. |
| + * The feedback is captured for each codec individually. |
| + * Hence all 4 codecs use 1 Tx slot each for feedback. |
| + */ |
| + if (!strcmp(codec_dai->component->name, "i2c-10EC1011:00")) { |
| + ret = snd_soc_dai_set_tdm_slot(codec_dai, |
| + 0x4, 0x1, 4, 24); |
| + if (ret < 0) |
| + break; |
| + } |
| + if (!strcmp(codec_dai->component->name, "i2c-10EC1011:02")) { |
| + ret = snd_soc_dai_set_tdm_slot(codec_dai, |
| + 0x1, 0x1, 4, 24); |
| + if (ret < 0) |
| + break; |
| + } |
| + /* TDM Rx slot 2 is used for Right Woofer & Tweeters pair */ |
| + if (!strcmp(codec_dai->component->name, "i2c-10EC1011:01")) { |
| + ret = snd_soc_dai_set_tdm_slot(codec_dai, |
| + 0x8, 0x2, 4, 24); |
| + if (ret < 0) |
| + break; |
| + } |
| + if (!strcmp(codec_dai->component->name, "i2c-10EC1011:03")) { |
| + ret = snd_soc_dai_set_tdm_slot(codec_dai, |
| + 0x2, 0x2, 4, 24); |
| + if (ret < 0) |
| + break; |
| + } |
| + } |
| + if (ret < 0) |
| + dev_err(rtd->dev, |
| + "set codec TDM slot for %s failed with error %d\n", |
| + codec_dai->component->name, ret); |
| + return ret; |
| +} |
| + |
| +static struct snd_soc_ops cml_rt5682_ops = { |
| + .hw_params = cml_rt5682_hw_params, |
| +}; |
| + |
| +static const struct snd_soc_ops cml_rt1011_ops = { |
| + .hw_params = cml_rt1011_hw_params, |
| +}; |
| + |
| +static int sof_card_late_probe(struct snd_soc_card *card) |
| +{ |
| + struct card_private *ctx = snd_soc_card_get_drvdata(card); |
| + struct snd_soc_component *component = NULL; |
| + char jack_name[NAME_SIZE]; |
| + struct hdmi_pcm *pcm; |
| + int ret, i = 0; |
| + |
| + pcm = list_first_entry(&ctx->hdmi_pcm_list, struct hdmi_pcm, |
| + head); |
| + component = pcm->codec_dai->component; |
| + |
| + if (ctx->common_hdmi_codec_drv) |
| + return hda_dsp_hdmi_build_controls(card, component); |
| + |
| + list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) { |
| + component = pcm->codec_dai->component; |
| + snprintf(jack_name, sizeof(jack_name), |
| + "HDMI/DP, pcm=%d Jack", pcm->device); |
| + ret = snd_soc_card_jack_new(card, jack_name, |
| + SND_JACK_AVOUT, &hdmi_jack[i], |
| + NULL, 0); |
| + if (ret) |
| + return ret; |
| + |
| + ret = hdac_hdmi_jack_init(pcm->codec_dai, pcm->device, |
| + &hdmi_jack[i]); |
| + if (ret < 0) |
| + return ret; |
| + |
| + i++; |
| + } |
| + if (!component) |
| + return -EINVAL; |
| + |
| + return hdac_hdmi_jack_port_init(component, &card->dapm); |
| +} |
| + |
| +static int hdmi_init(struct snd_soc_pcm_runtime *rtd) |
| +{ |
| + struct card_private *ctx = snd_soc_card_get_drvdata(rtd->card); |
| + struct snd_soc_dai *dai = rtd->codec_dai; |
| + struct hdmi_pcm *pcm; |
| + |
| + pcm = devm_kzalloc(rtd->card->dev, sizeof(*pcm), GFP_KERNEL); |
| + if (!pcm) |
| + return -ENOMEM; |
| + |
| + pcm->device = dai->id; |
| + pcm->codec_dai = dai; |
| + |
| + list_add_tail(&pcm->head, &ctx->hdmi_pcm_list); |
| + |
| + return 0; |
| +} |
| + |
| +/* Cometlake digital audio interface glue - connects codec <--> CPU */ |
| + |
| +SND_SOC_DAILINK_DEF(ssp0_pin, |
| + DAILINK_COMP_ARRAY(COMP_CPU("SSP0 Pin"))); |
| +SND_SOC_DAILINK_DEF(ssp0_codec, |
| + DAILINK_COMP_ARRAY(COMP_CODEC("i2c-10EC5682:00", |
| + CML_RT5682_CODEC_DAI))); |
| + |
| +SND_SOC_DAILINK_DEF(ssp1_pin, |
| + DAILINK_COMP_ARRAY(COMP_CPU("SSP1 Pin"))); |
| +SND_SOC_DAILINK_DEF(ssp1_codec, |
| + DAILINK_COMP_ARRAY( |
| + /* WL */ COMP_CODEC("i2c-10EC1011:00", CML_RT1011_CODEC_DAI), |
| + /* WR */ COMP_CODEC("i2c-10EC1011:01", CML_RT1011_CODEC_DAI), |
| + /* TL */ COMP_CODEC("i2c-10EC1011:02", CML_RT1011_CODEC_DAI), |
| + /* TR */ COMP_CODEC("i2c-10EC1011:03", CML_RT1011_CODEC_DAI))); |
| + |
| +SND_SOC_DAILINK_DEF(dmic_pin, |
| + DAILINK_COMP_ARRAY(COMP_CPU("DMIC01 Pin"))); |
| + |
| +SND_SOC_DAILINK_DEF(dmic16k_pin, |
| + DAILINK_COMP_ARRAY(COMP_CPU("DMIC16k Pin"))); |
| + |
| +SND_SOC_DAILINK_DEF(dmic_codec, |
| + DAILINK_COMP_ARRAY(COMP_CODEC("dmic-codec", "dmic-hifi"))); |
| + |
| +SND_SOC_DAILINK_DEF(idisp1_pin, |
| + DAILINK_COMP_ARRAY(COMP_CPU("iDisp1 Pin"))); |
| +SND_SOC_DAILINK_DEF(idisp1_codec, |
| + DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi1"))); |
| + |
| +SND_SOC_DAILINK_DEF(idisp2_pin, |
| + DAILINK_COMP_ARRAY(COMP_CPU("iDisp2 Pin"))); |
| +SND_SOC_DAILINK_DEF(idisp2_codec, |
| + DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi2"))); |
| + |
| +SND_SOC_DAILINK_DEF(idisp3_pin, |
| + DAILINK_COMP_ARRAY(COMP_CPU("iDisp3 Pin"))); |
| +SND_SOC_DAILINK_DEF(idisp3_codec, |
| + DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi3"))); |
| + |
| +SND_SOC_DAILINK_DEF(platform, |
| + DAILINK_COMP_ARRAY(COMP_PLATFORM("0000:00:1f.3"))); |
| + |
| +static struct snd_soc_dai_link cml_rt1011_rt5682_dailink[] = { |
| + /* Back End DAI links */ |
| + { |
| + /* SSP0 - Codec */ |
| + .name = "SSP0-Codec", |
| + .id = 0, |
| + .init = cml_rt5682_codec_init, |
| + .ignore_pmdown_time = 1, |
| + .ops = &cml_rt5682_ops, |
| + .dpcm_playback = 1, |
| + .dpcm_capture = 1, |
| + .no_pcm = 1, |
| + SND_SOC_DAILINK_REG(ssp0_pin, ssp0_codec, platform), |
| + }, |
| + { |
| + .name = "dmic01", |
| + .id = 1, |
| + .ignore_suspend = 1, |
| + .dpcm_capture = 1, |
| + .no_pcm = 1, |
| + SND_SOC_DAILINK_REG(dmic_pin, dmic_codec, platform), |
| + }, |
| + { |
| + .name = "dmic16k", |
| + .id = 2, |
| + .ignore_suspend = 1, |
| + .dpcm_capture = 1, |
| + .no_pcm = 1, |
| + SND_SOC_DAILINK_REG(dmic16k_pin, dmic_codec, platform), |
| + }, |
| + { |
| + .name = "iDisp1", |
| + .id = 3, |
| + .init = hdmi_init, |
| + .dpcm_playback = 1, |
| + .no_pcm = 1, |
| + SND_SOC_DAILINK_REG(idisp1_pin, idisp1_codec, platform), |
| + }, |
| + { |
| + .name = "iDisp2", |
| + .id = 4, |
| + .init = hdmi_init, |
| + .dpcm_playback = 1, |
| + .no_pcm = 1, |
| + SND_SOC_DAILINK_REG(idisp2_pin, idisp2_codec, platform), |
| + }, |
| + { |
| + .name = "iDisp3", |
| + .id = 5, |
| + .init = hdmi_init, |
| + .dpcm_playback = 1, |
| + .no_pcm = 1, |
| + SND_SOC_DAILINK_REG(idisp3_pin, idisp3_codec, platform), |
| + }, |
| + { |
| + /* |
| + * SSP1 - Codec : added to end of list ensuring |
| + * reuse of common topologies for other end points |
| + * and changing only SSP1's codec |
| + */ |
| + .name = "SSP1-Codec", |
| + .id = 6, |
| + .dpcm_playback = 1, |
| + .dpcm_capture = 1, /* Capture stream provides Feedback */ |
| + .no_pcm = 1, |
| + .ops = &cml_rt1011_ops, |
| + SND_SOC_DAILINK_REG(ssp1_pin, ssp1_codec, platform), |
| + }, |
| +}; |
| + |
| +static struct snd_soc_codec_conf rt1011_conf[] = { |
| + { |
| + .dev_name = "i2c-10EC1011:00", |
| + .name_prefix = "WL", |
| + }, |
| + { |
| + .dev_name = "i2c-10EC1011:01", |
| + .name_prefix = "WR", |
| + }, |
| + { |
| + .dev_name = "i2c-10EC1011:02", |
| + .name_prefix = "TL", |
| + }, |
| + { |
| + .dev_name = "i2c-10EC1011:03", |
| + .name_prefix = "TR", |
| + }, |
| +}; |
| + |
| +/* Cometlake audio machine driver for RT1011 and RT5682 */ |
| +static struct snd_soc_card snd_soc_card_cml = { |
| + .name = "cml_rt1011_rt5682", |
| + .dai_link = cml_rt1011_rt5682_dailink, |
| + .num_links = ARRAY_SIZE(cml_rt1011_rt5682_dailink), |
| + .codec_conf = rt1011_conf, |
| + .num_configs = ARRAY_SIZE(rt1011_conf), |
| + .dapm_widgets = cml_rt1011_rt5682_widgets, |
| + .num_dapm_widgets = ARRAY_SIZE(cml_rt1011_rt5682_widgets), |
| + .dapm_routes = cml_rt1011_rt5682_map, |
| + .num_dapm_routes = ARRAY_SIZE(cml_rt1011_rt5682_map), |
| + .controls = cml_controls, |
| + .num_controls = ARRAY_SIZE(cml_controls), |
| + .fully_routed = true, |
| + .late_probe = sof_card_late_probe, |
| +}; |
| + |
| +static int snd_cml_rt1011_probe(struct platform_device *pdev) |
| +{ |
| + struct card_private *ctx; |
| + struct snd_soc_acpi_mach *mach; |
| + const char *platform_name; |
| + int ret; |
| + |
| + ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_ATOMIC); |
| + if (!ctx) |
| + return -ENOMEM; |
| + |
| + INIT_LIST_HEAD(&ctx->hdmi_pcm_list); |
| + mach = (&pdev->dev)->platform_data; |
| + snd_soc_card_cml.dev = &pdev->dev; |
| + platform_name = mach->mach_params.platform; |
| + |
| + /* set platform name for each dailink */ |
| + ret = snd_soc_fixup_dai_links_platform_name(&snd_soc_card_cml, |
| + platform_name); |
| + if (ret) |
| + return ret; |
| + |
| + ctx->common_hdmi_codec_drv = mach->mach_params.common_hdmi_codec_drv; |
| + |
| + snd_soc_card_set_drvdata(&snd_soc_card_cml, ctx); |
| + |
| + return devm_snd_soc_register_card(&pdev->dev, &snd_soc_card_cml); |
| +} |
| + |
| +static struct platform_driver snd_cml_rt1011_rt5682_driver = { |
| + .probe = snd_cml_rt1011_probe, |
| + .driver = { |
| + .name = "cml_rt1011_rt5682", |
| + .pm = &snd_soc_pm_ops, |
| + }, |
| +}; |
| +module_platform_driver(snd_cml_rt1011_rt5682_driver); |
| + |
| +/* Module information */ |
| +MODULE_DESCRIPTION("Cometlake Audio Machine driver - RT1011 and RT5682 in I2S mode"); |
| +MODULE_AUTHOR("Naveen Manohar <naveen.m@intel.com>"); |
| +MODULE_AUTHOR("Sathya Prakash M R <sathya.prakash.m.r@intel.com>"); |
| +MODULE_AUTHOR("Shuming Fan <shumingf@realtek.com>"); |
| +MODULE_LICENSE("GPL v2"); |
| +MODULE_ALIAS("platform:cml_rt1011_rt5682"); |
| -- |
| 2.24.1 |
| |
| From 19bae513625e312c4f6a26d967fe6421585aa144 Mon Sep 17 00:00:00 2001 |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Date: Fri, 1 Nov 2019 12:30:37 -0500 |
| Subject: [PATCH 055/109] ASoC: Intel: add mutual exclusion between SOF and |
| legacy Baytrail driver |
| |
| This legacy driver is already deprecated, let's make sure there is no |
| conflict with SOF. |
| |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191101173045.27099-4-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 280393b712b7e338addc2f7f60b4e4da787ba19b) |
| Bugzilla: 1772498 |
| |
| sound/soc/intel/Kconfig | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/sound/soc/intel/Kconfig b/sound/soc/intel/Kconfig |
| index 7e9feca333b7..d6c5c68b7499 100644 |
| |
| |
| @@ -65,7 +65,7 @@ config SND_SOC_INTEL_HASWELL |
| |
| config SND_SOC_INTEL_BAYTRAIL |
| tristate "Baytrail (legacy) Platforms" |
| - depends on DMADEVICES && ACPI && SND_SST_ATOM_HIFI2_PLATFORM=n |
| + depends on DMADEVICES && ACPI && SND_SST_ATOM_HIFI2_PLATFORM=n && SND_SOC_SOF_BAYTRAIL=n |
| select SND_SOC_INTEL_SST |
| select SND_SOC_INTEL_SST_ACPI |
| select SND_SOC_INTEL_SST_FIRMWARE |
| -- |
| 2.24.1 |
| |
| From 6d47735bff19d37abfcf32194eb61177209c4eef Mon Sep 17 00:00:00 2001 |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Date: Fri, 1 Nov 2019 12:30:41 -0500 |
| Subject: [PATCH 056/109] ASoC: Intel: Skylake: mark HDAudio codec support as |
| deprecated. |
| |
| This option famously broke audio on Linus' laptop and the problem have |
| not been fixed. |
| |
| Mark as DEPRECATED to avoid any ambiguity with distros. |
| |
| Use SOF if you need HDaudio support w/ the DSP enabled, e.g. for DMIC |
| capture. |
| |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191101173045.27099-8-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 02701b909c2fab4b49f9c9545ab921c9b2c7a768) |
| Bugzilla: 1772498 |
| |
| sound/soc/intel/Kconfig | 9 ++++++--- |
| 1 file changed, 6 insertions(+), 3 deletions(-) |
| |
| diff --git a/sound/soc/intel/Kconfig b/sound/soc/intel/Kconfig |
| index d6c5c68b7499..c8de0bb5bed9 100644 |
| |
| |
| @@ -209,9 +209,12 @@ config SND_SOC_INTEL_SKYLAKE_SSP_CLK |
| config SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC |
| bool "HDAudio codec support" |
| help |
| - If you have a Intel Skylake/Broxton/ApolloLake/KabyLake/ |
| - GeminiLake or CannonLake platform with an HDaudio codec |
| - then enable this option by saying Y |
| + This option broke audio on Linus' Skylake laptop in December 2018 |
| + and the race conditions during the probe were not fixed since. |
| + This option is DEPRECATED, all HDaudio codec support needs |
| + to be handled by the SOF driver. |
| + Distributions should not enable this option and there are no known |
| + users of this capability. |
| |
| config SND_SOC_INTEL_SKYLAKE_COMMON |
| tristate |
| -- |
| 2.24.1 |
| |
| From e3ba0216af000f40e8578867a3ec02014612fda7 Mon Sep 17 00:00:00 2001 |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Date: Fri, 1 Nov 2019 12:30:42 -0500 |
| Subject: [PATCH 057/109] ASoC: Intel: boards: remove select SND_HDA_DSP_LOADER |
| |
| This option is only required with the Skylake platform driver, there |
| is no reason to have this option in machine drivers. This is |
| e.g. useless for SOF-based solutions. |
| |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191101173045.27099-9-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 9e7301762f6df44bb4a452b6aecbe0f322b370ee) |
| Bugzilla: 1772498 |
| |
| sound/soc/intel/boards/Kconfig | 3 --- |
| 1 file changed, 3 deletions(-) |
| |
| diff --git a/sound/soc/intel/boards/Kconfig b/sound/soc/intel/boards/Kconfig |
| index ef40f83e0a3b..91952ffc0b67 100644 |
| |
| |
| @@ -270,7 +270,6 @@ config SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH |
| depends on I2C && ACPI |
| depends on MFD_INTEL_LPSS || COMPILE_TEST |
| select SND_SOC_INTEL_DA7219_MAX98357A_GENERIC |
| - select SND_HDA_DSP_LOADER |
| help |
| This adds support for ASoC machine driver for Broxton-P platforms |
| with DA7219 + MAX98357A I2S audio codec. |
| @@ -284,7 +283,6 @@ config SND_SOC_INTEL_BXT_RT298_MACH |
| select SND_SOC_RT298 |
| select SND_SOC_DMIC |
| select SND_SOC_HDAC_HDMI |
| - select SND_HDA_DSP_LOADER |
| help |
| This adds support for ASoC machine driver for Broxton platforms |
| with RT286 I2S audio codec. |
| @@ -375,7 +373,6 @@ config SND_SOC_INTEL_GLK_RT5682_MAX98357A_MACH |
| select SND_SOC_MAX98357A |
| select SND_SOC_DMIC |
| select SND_SOC_HDAC_HDMI |
| - select SND_HDA_DSP_LOADER |
| help |
| This adds support for ASoC machine driver for Geminilake platforms |
| with RT5682 + MAX98357A I2S audio codec. |
| -- |
| 2.24.1 |
| |
| From 65ff2363e23c1f5e743b3781b8abf0abd0a4447c Mon Sep 17 00:00:00 2001 |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Date: Fri, 1 Nov 2019 12:30:43 -0500 |
| Subject: [PATCH 058/109] ASoC: Intel: boards: fix configs for |
| bxt-da7219-max98057a |
| |
| The same driver is reused for 3 different configurations, but the |
| driver will only be build if ApolloLake is selected. |
| |
| Fix and make sure each device can work without dependencies on others |
| (useful for minimal configurations). |
| |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191101173045.27099-10-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit c4a09f9a523e674ef9a046e05d99c90f2c9513b1) |
| Bugzilla: 1772498 |
| |
| sound/soc/intel/boards/Kconfig | 24 ++++++++++++++++++++++-- |
| sound/soc/intel/boards/Makefile | 2 +- |
| 2 files changed, 23 insertions(+), 3 deletions(-) |
| |
| diff --git a/sound/soc/intel/boards/Kconfig b/sound/soc/intel/boards/Kconfig |
| index 91952ffc0b67..826694ecfdbf 100644 |
| |
| |
| @@ -263,13 +263,17 @@ config SND_SOC_INTEL_DA7219_MAX98357A_GENERIC |
| select SND_SOC_DMIC |
| select SND_SOC_HDAC_HDMI |
| |
| +config SND_SOC_INTEL_BXT_DA7219_MAX98357A_COMMON |
| + tristate |
| + select SND_SOC_INTEL_DA7219_MAX98357A_GENERIC |
| + |
| if SND_SOC_INTEL_APL |
| |
| config SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH |
| tristate "Broxton with DA7219 and MAX98357A in I2S Mode" |
| depends on I2C && ACPI |
| depends on MFD_INTEL_LPSS || COMPILE_TEST |
| - select SND_SOC_INTEL_DA7219_MAX98357A_GENERIC |
| + select SND_SOC_INTEL_BXT_DA7219_MAX98357A_COMMON |
| help |
| This adds support for ASoC machine driver for Broxton-P platforms |
| with DA7219 + MAX98357A I2S audio codec. |
| @@ -365,6 +369,17 @@ endif ## SND_SOC_INTEL_KBL |
| |
| if SND_SOC_INTEL_GLK || (SND_SOC_SOF_GEMINILAKE && SND_SOC_SOF_HDA_LINK) |
| |
| +config SND_SOC_INTEL_GLK_DA7219_MAX98357A_MACH |
| + tristate "GLK with DA7219 and MAX98357A in I2S Mode" |
| + depends on I2C && ACPI |
| + depends on MFD_INTEL_LPSS || COMPILE_TEST |
| + select SND_SOC_INTEL_BXT_DA7219_MAX98357A_COMMON |
| + help |
| + This adds support for ASoC machine driver for Geminilake platforms |
| + with DA7219 + MAX98357A I2S audio codec. |
| + Say Y or m if you have such a device. This is a recommended option. |
| + If unsure select "N". |
| + |
| config SND_SOC_INTEL_GLK_RT5682_MAX98357A_MACH |
| tristate "GLK with RT5682 and MAX98357A in I2S Mode" |
| depends on I2C && ACPI |
| @@ -418,7 +433,12 @@ config SND_SOC_INTEL_CML_LP_DA7219_MAX98357A_MACH |
| tristate "CML_LP with DA7219 and MAX98357A in I2S Mode" |
| depends on I2C && ACPI |
| depends on MFD_INTEL_LPSS || COMPILE_TEST |
| - select SND_SOC_INTEL_DA7219_MAX98357A_GENERIC |
| + select SND_SOC_INTEL_BXT_DA7219_MAX98357A_COMMON |
| + help |
| + This adds support for ASoC machine driver for Cometlake platforms |
| + with DA7219 + MAX98357A I2S audio codec. |
| + Say Y or m if you have such a device. This is a recommended option. |
| + If unsure select "N". |
| |
| config SND_SOC_INTEL_SOF_CML_RT1011_RT5682_MACH |
| tristate "CML with RT1011 and RT5682 in I2S Mode" |
| diff --git a/sound/soc/intel/boards/Makefile b/sound/soc/intel/boards/Makefile |
| index 9ae6544c6f3b..ba1aa89db09d 100644 |
| |
| |
| @@ -33,7 +33,7 @@ obj-$(CONFIG_SND_SOC_INTEL_SOF_RT5682_MACH) += snd-soc-sof_rt5682.o |
| obj-$(CONFIG_SND_SOC_INTEL_HASWELL_MACH) += snd-soc-sst-haswell.o |
| obj-$(CONFIG_SND_SOC_INTEL_BYT_RT5640_MACH) += snd-soc-sst-byt-rt5640-mach.o |
| obj-$(CONFIG_SND_SOC_INTEL_BYT_MAX98090_MACH) += snd-soc-sst-byt-max98090-mach.o |
| -obj-$(CONFIG_SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH) += snd-soc-sst-bxt-da7219_max98357a.o |
| +obj-$(CONFIG_SND_SOC_INTEL_BXT_DA7219_MAX98357A_COMMON) += snd-soc-sst-bxt-da7219_max98357a.o |
| obj-$(CONFIG_SND_SOC_INTEL_BXT_RT298_MACH) += snd-soc-sst-bxt-rt298.o |
| obj-$(CONFIG_SND_SOC_INTEL_GLK_RT5682_MAX98357A_MACH) += snd-soc-sst-glk-rt5682_max98357a.o |
| obj-$(CONFIG_SND_SOC_INTEL_BROADWELL_MACH) += snd-soc-sst-broadwell.o |
| -- |
| 2.24.1 |
| |
| From 63fe227888be39183df411fc2032181a1d50408a Mon Sep 17 00:00:00 2001 |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Date: Fri, 1 Nov 2019 12:30:44 -0500 |
| Subject: [PATCH 059/109] ASoC: Intel: boards: Geminilake is only supported by |
| SOF |
| |
| Geminilake machine drivers are only tested and recommended with SOF. |
| |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191101173045.27099-11-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 3315e5b40f59d1aab6543773d99b1f19c3ea1848) |
| Bugzilla: 1772498 |
| |
| sound/soc/intel/boards/Kconfig | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/sound/soc/intel/boards/Kconfig b/sound/soc/intel/boards/Kconfig |
| index 826694ecfdbf..76d1e6ab30b5 100644 |
| |
| |
| @@ -367,7 +367,7 @@ config SND_SOC_INTEL_KBL_RT5660_MACH |
| |
| endif ## SND_SOC_INTEL_KBL |
| |
| -if SND_SOC_INTEL_GLK || (SND_SOC_SOF_GEMINILAKE && SND_SOC_SOF_HDA_LINK) |
| +if SND_SOC_SOF_GEMINILAKE && SND_SOC_SOF_HDA_LINK |
| |
| config SND_SOC_INTEL_GLK_DA7219_MAX98357A_MACH |
| tristate "GLK with DA7219 and MAX98357A in I2S Mode" |
| @@ -394,7 +394,7 @@ config SND_SOC_INTEL_GLK_RT5682_MAX98357A_MACH |
| Say Y if you have such a device. |
| If unsure select "N". |
| |
| -endif ## SND_SOC_INTEL_GLK || (SND_SOC_SOF_GEMINILAKE && SND_SOC_SOF_HDA_LINK) |
| +endif ## SND_SOC_SOF_GEMINILAKE && SND_SOC_SOF_HDA_LINK |
| |
| if SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC || SND_SOC_SOF_HDA_AUDIO_CODEC |
| |
| -- |
| 2.24.1 |
| |
| From 400e61db419050e17d2eb05129ed548b2b3a817a Mon Sep 17 00:00:00 2001 |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Date: Fri, 1 Nov 2019 12:30:45 -0500 |
| Subject: [PATCH 060/109] ASoC: Intel: boards: sof_rt5682: use dependency on |
| SOF_HDA_LINK |
| |
| The wrong dependency is used and the build can be broken |
| |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191101173045.27099-12-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 8039105987fcd8dda39074df013cfdf0025dd297) |
| Bugzilla: 1772498 |
| |
| sound/soc/intel/boards/Kconfig | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| diff --git a/sound/soc/intel/boards/Kconfig b/sound/soc/intel/boards/Kconfig |
| index 76d1e6ab30b5..2702aefee775 100644 |
| |
| |
| @@ -411,11 +411,11 @@ config SND_SOC_INTEL_SKL_HDA_DSP_GENERIC_MACH |
| |
| endif ## SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC || SND_SOC_SOF_HDA_AUDIO_CODEC |
| |
| -if SND_SOC_SOF_HDA_COMMON || SND_SOC_SOF_BAYTRAIL |
| +if SND_SOC_SOF_HDA_LINK || SND_SOC_SOF_BAYTRAIL |
| config SND_SOC_INTEL_SOF_RT5682_MACH |
| tristate "SOF with rt5682 codec in I2S Mode" |
| depends on I2C && ACPI |
| - depends on (SND_SOC_SOF_HDA_COMMON && (MFD_INTEL_LPSS || COMPILE_TEST)) ||\ |
| + depends on (SND_SOC_SOF_HDA_LINK && (MFD_INTEL_LPSS || COMPILE_TEST)) ||\ |
| (SND_SOC_SOF_BAYTRAIL && (X86_INTEL_LPSS || COMPILE_TEST)) |
| select SND_SOC_RT5682 |
| select SND_SOC_DMIC |
| @@ -425,7 +425,7 @@ config SND_SOC_INTEL_SOF_RT5682_MACH |
| with rt5682 codec. |
| Say Y if you have such a device. |
| If unsure select "N". |
| -endif ## SND_SOC_SOF_HDA_COMMON || SND_SOC_SOF_BAYTRAIL |
| +endif ## SND_SOC_SOF_HDA_LINK || SND_SOC_SOF_BAYTRAIL |
| |
| if (SND_SOC_SOF_COMETLAKE_LP && SND_SOC_SOF_HDA_LINK) |
| |
| -- |
| 2.24.1 |
| |
| From dc32112887d49cac7f705357c92a9abf390d438b Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Fri, 8 Nov 2019 10:46:37 +0100 |
| Subject: [PATCH 061/109] ASoC: intel: Avoid non-standard macro usage |
| |
| Pass the device pointer from the PCI pointer directly, instead of a |
| non-standard macro. The macro didn't give any better readability. |
| |
| Acked-by: Mark Brown <broonie@kernel.org> |
| Link: https://lore.kernel.org/r/20191108094641.20086-5-tiwai@suse.de |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 6420c24a30006e2fdbc292f88d37db56ca28f6e8) |
| Bugzilla: 1772498 |
| |
| sound/soc/intel/skylake/skl-pcm.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/sound/soc/intel/skylake/skl-pcm.c b/sound/soc/intel/skylake/skl-pcm.c |
| index 7f287424af9b..07bc047f077e 100644 |
| |
| |
| @@ -1310,7 +1310,7 @@ static int skl_pcm_new(struct snd_soc_pcm_runtime *rtd) |
| size = MAX_PREALLOC_SIZE; |
| snd_pcm_lib_preallocate_pages_for_all(pcm, |
| SNDRV_DMA_TYPE_DEV_SG, |
| - snd_dma_pci_data(skl->pci), |
| + &skl->pci->dev, |
| size, MAX_PREALLOC_SIZE); |
| } |
| |
| -- |
| 2.24.1 |
| |
| From 11af41ca977482d5d5f6a312eced0f4e50ef898c Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:41:09 -0500 |
| Subject: [PATCH 062/109] ASoC: SOF: ipc: introduce message for DSP power |
| gating |
| |
| Add new ipc messages which will be sent from driver to FW, to ask FW to |
| enter specific power saving state. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-14-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 10992004e1e960c7e256ec70c7ab22895a7003d7) |
| Bugzilla: 1772498 |
| |
| include/sound/sof/header.h | 1 + |
| include/sound/sof/pm.h | 8 ++++++++ |
| 2 files changed, 9 insertions(+) |
| |
| diff --git a/include/sound/sof/header.h b/include/sound/sof/header.h |
| index 332143ff7278..bf3edd9c08b4 100644 |
| |
| |
| @@ -75,6 +75,7 @@ |
| #define SOF_IPC_PM_CLK_GET SOF_CMD_TYPE(0x005) |
| #define SOF_IPC_PM_CLK_REQ SOF_CMD_TYPE(0x006) |
| #define SOF_IPC_PM_CORE_ENABLE SOF_CMD_TYPE(0x007) |
| +#define SOF_IPC_PM_GATE SOF_CMD_TYPE(0x008) |
| |
| /* component runtime config - multiple different types */ |
| #define SOF_IPC_COMP_SET_VALUE SOF_CMD_TYPE(0x001) |
| diff --git a/include/sound/sof/pm.h b/include/sound/sof/pm.h |
| index 003879401d63..3cf2e0f39d94 100644 |
| |
| |
| @@ -45,4 +45,12 @@ struct sof_ipc_pm_core_config { |
| uint32_t enable_mask; |
| } __packed; |
| |
| +struct sof_ipc_pm_gate { |
| + struct sof_ipc_cmd_hdr hdr; |
| + uint32_t flags; /* platform specific */ |
| + |
| + /* reserved for future use */ |
| + uint32_t reserved[5]; |
| +} __packed; |
| + |
| #endif |
| -- |
| 2.24.1 |
| |
| From 26ec2e5a52d27d29ea31bdf2fedfa19a76712f12 Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:40:57 -0500 |
| Subject: [PATCH 063/109] ASoC: SOF: add a field to store the current D0 |
| substate of DSP |
| |
| Add field d0_substate to struct snd_sof_dev to store the current DSP |
| D0 sub-state(only meaningful when DSP in D0), which could be D0I0 or |
| D0I3. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-2-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 4c19030c511fd6eab029bae838f736256d2f43cd) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/sof-priv.h | 9 +++++++++ |
| 1 file changed, 9 insertions(+) |
| |
| diff --git a/sound/soc/sof/sof-priv.h b/sound/soc/sof/sof-priv.h |
| index 26ea5099bf4e..90a6def3b8d3 100644 |
| |
| |
| @@ -68,6 +68,12 @@ extern int sof_core_debug; |
| |
| #define DMA_CHAN_INVALID 0xFFFFFFFF |
| |
| +/* DSP D0ix sub-state */ |
| +enum sof_d0_substate { |
| + SOF_DSP_D0I0 = 0, /* DSP default D0 substate */ |
| + SOF_DSP_D0I3, /* DSP D0i3(low power) substate*/ |
| +}; |
| + |
| struct snd_sof_dev; |
| struct snd_sof_ipc_msg; |
| struct snd_sof_ipc; |
| @@ -396,6 +402,9 @@ struct snd_sof_dev { |
| */ |
| struct snd_soc_component_driver plat_drv; |
| |
| + /* power states related */ |
| + enum sof_d0_substate d0_substate; |
| + |
| /* DSP firmware boot */ |
| wait_queue_head_t boot_wait; |
| enum snd_sof_fw_state fw_state; |
| -- |
| 2.24.1 |
| |
| From 88b10cf888bbaccc413dfec7e82a5d642bf0d71f Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:40:58 -0500 |
| Subject: [PATCH 064/109] ASoC: SOF: reset default d0_substate at probe() and |
| resume() |
| |
| We initialize/reset d0_substate to default d0i0 value when doing |
| transition D3-->D0, e.g. at success of probing and resuming. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-3-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 09fe6b528886c0d07ce539b837749edcc46618d0) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/core.c | 3 +++ |
| sound/soc/sof/pm.c | 3 +++ |
| 2 files changed, 6 insertions(+) |
| |
| diff --git a/sound/soc/sof/core.c b/sound/soc/sof/core.c |
| index 8a23739aa545..d6b827de26d4 100644 |
| |
| |
| @@ -495,6 +495,9 @@ int snd_sof_device_probe(struct device *dev, struct snd_sof_pdata *plat_data) |
| /* initialize sof device */ |
| sdev->dev = dev; |
| |
| + /* initialize default D0 sub-state */ |
| + sdev->d0_substate = SOF_DSP_D0I0; |
| + |
| sdev->pdata = plat_data; |
| sdev->first_boot = true; |
| sdev->fw_state = SOF_FW_BOOT_NOT_STARTED; |
| diff --git a/sound/soc/sof/pm.c b/sound/soc/sof/pm.c |
| index 195af259e78e..f13a2eb28732 100644 |
| |
| |
| @@ -337,6 +337,9 @@ static int sof_resume(struct device *dev, bool runtime_resume) |
| "error: ctx_restore ipc error during resume %d\n", |
| ret); |
| |
| + /* initialize default D0 sub-state */ |
| + sdev->d0_substate = SOF_DSP_D0I0; |
| + |
| return ret; |
| } |
| |
| -- |
| 2.24.1 |
| |
| From f082a124cb84e3a83d8ae35aa201698eea020e3b Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:40:59 -0500 |
| Subject: [PATCH 065/109] ASoC: SOF: add set_power_state() to dsp_ops for power |
| state update |
| |
| D0i3 is a platform-defined substate of D0, so we need a |
| platform-specific callback in dsp_ops to handle the relevant |
| configurations. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-4-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit e8f112d8c29f44ded83f97828c104bf0904871ec) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/ops.h | 9 +++++++++ |
| sound/soc/sof/sof-priv.h | 2 ++ |
| 2 files changed, 11 insertions(+) |
| |
| diff --git a/sound/soc/sof/ops.h b/sound/soc/sof/ops.h |
| index 824d36fe59fd..d7c8fc06f961 100644 |
| |
| |
| @@ -193,6 +193,15 @@ static inline int snd_sof_dsp_set_clk(struct snd_sof_dev *sdev, u32 freq) |
| return 0; |
| } |
| |
| +static inline int snd_sof_dsp_set_power_state(struct snd_sof_dev *sdev, |
| + enum sof_d0_substate substate) |
| +{ |
| + if (sof_ops(sdev)->set_power_state) |
| + return sof_ops(sdev)->set_power_state(sdev, substate); |
| + |
| + return 0; |
| +} |
| + |
| /* debug */ |
| static inline void snd_sof_dsp_dbg_dump(struct snd_sof_dev *sdev, u32 flags) |
| { |
| diff --git a/sound/soc/sof/sof-priv.h b/sound/soc/sof/sof-priv.h |
| index 90a6def3b8d3..e0adc34d4dec 100644 |
| |
| |
| @@ -189,6 +189,8 @@ struct snd_sof_dsp_ops { |
| int (*runtime_resume)(struct snd_sof_dev *sof_dev); /* optional */ |
| int (*runtime_idle)(struct snd_sof_dev *sof_dev); /* optional */ |
| int (*set_hw_params_upon_resume)(struct snd_sof_dev *sdev); /* optional */ |
| + int (*set_power_state)(struct snd_sof_dev *sdev, |
| + enum sof_d0_substate d0_substate); /* optional */ |
| |
| /* DSP clocking */ |
| int (*set_clk)(struct snd_sof_dev *sof_dev, u32 freq); /* optional */ |
| -- |
| 2.24.1 |
| |
| From f637c49894fcc4a5f363661c369c17c41c676d58 Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:41:00 -0500 |
| Subject: [PATCH 066/109] ASoC: SOF: Intel: hda-dsp: Add helper for setting DSP |
| D0ix substate |
| |
| Adding helper to implement setting dsp to d0i3 or d0i0 status, this will |
| be needed for driver D0ix support. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-5-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 62f8f76604623980d41cf73691ca45288871efd9) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/intel/hda-dsp.c | 46 +++++++++++++++++++++++++++++++++++ |
| sound/soc/sof/intel/hda.h | 10 ++++++++ |
| 2 files changed, 56 insertions(+) |
| |
| diff --git a/sound/soc/sof/intel/hda-dsp.c b/sound/soc/sof/intel/hda-dsp.c |
| index 3ea401646e0c..fa2f1f66c72c 100644 |
| |
| |
| @@ -306,6 +306,52 @@ void hda_dsp_ipc_int_disable(struct snd_sof_dev *sdev) |
| HDA_DSP_REG_HIPCCTL_BUSY | HDA_DSP_REG_HIPCCTL_DONE, 0); |
| } |
| |
| +static int hda_dsp_wait_d0i3c_done(struct snd_sof_dev *sdev, int retry) |
| +{ |
| + struct hdac_bus *bus = sof_to_bus(sdev); |
| + |
| + while (snd_hdac_chip_readb(bus, VS_D0I3C) & SOF_HDA_VS_D0I3C_CIP) { |
| + if (!retry--) |
| + return -ETIMEDOUT; |
| + usleep_range(10, 15); |
| + } |
| + |
| + return 0; |
| +} |
| + |
| +int hda_dsp_set_power_state(struct snd_sof_dev *sdev, |
| + enum sof_d0_substate d0_substate) |
| +{ |
| + struct hdac_bus *bus = sof_to_bus(sdev); |
| + int retry = 50; |
| + int ret; |
| + u8 value; |
| + |
| + /* Write to D0I3C after Command-In-Progress bit is cleared */ |
| + ret = hda_dsp_wait_d0i3c_done(sdev, retry); |
| + if (ret < 0) { |
| + dev_err(bus->dev, "CIP timeout before update D0I3C!\n"); |
| + return ret; |
| + } |
| + |
| + /* Update D0I3C register */ |
| + value = d0_substate == SOF_DSP_D0I3 ? SOF_HDA_VS_D0I3C_I3 : 0; |
| + snd_hdac_chip_updateb(bus, VS_D0I3C, SOF_HDA_VS_D0I3C_I3, value); |
| + |
| + /* Wait for cmd in progress to be cleared before exiting the function */ |
| + retry = 50; |
| + ret = hda_dsp_wait_d0i3c_done(sdev, retry); |
| + if (ret < 0) { |
| + dev_err(bus->dev, "CIP timeout after D0I3C updated!\n"); |
| + return ret; |
| + } |
| + |
| + dev_vdbg(bus->dev, "D0I3C updated, register = 0x%x\n", |
| + snd_hdac_chip_readb(bus, VS_D0I3C)); |
| + |
| + return 0; |
| +} |
| + |
| static int hda_suspend(struct snd_sof_dev *sdev, bool runtime_suspend) |
| { |
| struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; |
| diff --git a/sound/soc/sof/intel/hda.h b/sound/soc/sof/intel/hda.h |
| index 8e03d876a0ac..bc8b58ad2704 100644 |
| |
| |
| @@ -64,6 +64,13 @@ |
| #define SOF_HDA_PPCTL_PIE BIT(31) |
| #define SOF_HDA_PPCTL_GPROCEN BIT(30) |
| |
| +/*Vendor Specific Registers*/ |
| +#define SOF_HDA_VS_D0I3C 0x104A |
| + |
| +/* D0I3C Register fields */ |
| +#define SOF_HDA_VS_D0I3C_CIP BIT(0) /* Command-In-Progress */ |
| +#define SOF_HDA_VS_D0I3C_I3 BIT(2) /* D0i3 enable bit */ |
| + |
| /* DPIB entry size: 8 Bytes = 2 DWords */ |
| #define SOF_HDA_DPIB_ENTRY_SIZE 0x8 |
| |
| @@ -455,6 +462,9 @@ int hda_dsp_core_reset_power_down(struct snd_sof_dev *sdev, |
| void hda_dsp_ipc_int_enable(struct snd_sof_dev *sdev); |
| void hda_dsp_ipc_int_disable(struct snd_sof_dev *sdev); |
| |
| +int hda_dsp_set_power_state(struct snd_sof_dev *sdev, |
| + enum sof_d0_substate d0_substate); |
| + |
| int hda_dsp_suspend(struct snd_sof_dev *sdev); |
| int hda_dsp_resume(struct snd_sof_dev *sdev); |
| int hda_dsp_runtime_suspend(struct snd_sof_dev *sdev); |
| -- |
| 2.24.1 |
| |
| From 36bec5216fd616441e694d1793752a83b6e728e3 Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:41:01 -0500 |
| Subject: [PATCH 067/109] ASoC: SOF: Intel: CNL: add set_power_state() ops |
| |
| Using hda_dsp_set_power_state() as set_power_state() ops for cnl to do |
| d0ix platform configuration updates. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-6-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 73b51957122dc47a40325a5359b44ef337cbf217) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/intel/cnl.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| diff --git a/sound/soc/sof/intel/cnl.c b/sound/soc/sof/intel/cnl.c |
| index e9cdcc040fb5..982b81a0b13a 100644 |
| |
| |
| @@ -255,6 +255,7 @@ const struct snd_sof_dsp_ops sof_cnl_ops = { |
| .runtime_resume = hda_dsp_runtime_resume, |
| .runtime_idle = hda_dsp_runtime_idle, |
| .set_hw_params_upon_resume = hda_dsp_set_hw_params_upon_resume, |
| + .set_power_state = hda_dsp_set_power_state, |
| |
| /* ALSA HW info flags */ |
| .hw_info = SNDRV_PCM_INFO_MMAP | |
| -- |
| 2.24.1 |
| |
| From b094a6b925b36ec414772cf4ac7320597e30f592 Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:41:02 -0500 |
| Subject: [PATCH 068/109] ASoC: SOF: Intel: APL: add set_power_state() ops |
| |
| Using hda_dsp_set_power_state() as set_power_state() ops for apl to do |
| d0ix platform configuration updates. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-7-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 35c930ba6025964ac71f041065ae212a0fcc7cca) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/intel/apl.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| diff --git a/sound/soc/sof/intel/apl.c b/sound/soc/sof/intel/apl.c |
| index 15d26e8d90a9..7daa8eb456c8 100644 |
| |
| |
| @@ -97,6 +97,7 @@ const struct snd_sof_dsp_ops sof_apl_ops = { |
| .runtime_resume = hda_dsp_runtime_resume, |
| .runtime_idle = hda_dsp_runtime_idle, |
| .set_hw_params_upon_resume = hda_dsp_set_hw_params_upon_resume, |
| + .set_power_state = hda_dsp_set_power_state, |
| |
| /* ALSA HW info flags */ |
| .hw_info = SNDRV_PCM_INFO_MMAP | |
| -- |
| 2.24.1 |
| |
| From 3e61bd7113167792591babd06550cacd30b547d6 Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:41:03 -0500 |
| Subject: [PATCH 069/109] ASoC: SOF: add flag to snd_sof_pcm_stream for D0i3 |
| compatible stream |
| |
| Add flag d0i3_compatible to struct snd_sof_pcm_stream to denote if the |
| stream can tolerate a transition to the D0i3 substate while opened (thus |
| seen as 'active' by pm_runtime). |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-8-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit e5c97e88084b8dca6850eba5d2937716b88306c1) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/sof-priv.h | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| diff --git a/sound/soc/sof/sof-priv.h b/sound/soc/sof/sof-priv.h |
| index e0adc34d4dec..35cdeb923898 100644 |
| |
| |
| @@ -310,6 +310,7 @@ struct snd_sof_pcm_stream { |
| struct sof_ipc_stream_posn posn; |
| struct snd_pcm_substream *substream; |
| struct work_struct period_elapsed_work; |
| + bool d0i3_compatible; /* DSP can be in D0I3 when this pcm is opened */ |
| }; |
| |
| /* ALSA SOF PCM device */ |
| -- |
| 2.24.1 |
| |
| From 4a15ac8bae70390fdc72e96468526989be68a818 Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:41:04 -0500 |
| Subject: [PATCH 070/109] ASoC: SOF: token: add tokens for PCM compatible with |
| D0i3 substate |
| |
| Add stream token SOF_TKN_STREAM_PLAYBACK_COMPATIBLE_D0I3 and |
| SOF_TKN_STREAM_CAPTURE_COMPATIBLE_D0I3 to denote if the stream can be |
| opened at low power d0i3 status or not. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-9-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 4a94940988cc44adeb383401dea0beeac4abbe63) |
| Bugzilla: 1772498 |
| |
| include/uapi/sound/sof/tokens.h | 4 ++++ |
| sound/soc/sof/topology.c | 10 ++++++++++ |
| 2 files changed, 14 insertions(+) |
| |
| diff --git a/include/uapi/sound/sof/tokens.h b/include/uapi/sound/sof/tokens.h |
| index d65406f34361..76883e6fb750 100644 |
| |
| |
| @@ -113,6 +113,10 @@ |
| /* ESAI */ |
| #define SOF_TKN_IMX_ESAI_MCLK_ID 1100 |
| |
| +/* Stream */ |
| +#define SOF_TKN_STREAM_PLAYBACK_COMPATIBLE_D0I3 1200 |
| +#define SOF_TKN_STREAM_CAPTURE_COMPATIBLE_D0I3 1201 |
| + |
| /* Led control for mute switches */ |
| #define SOF_TKN_MUTE_LED_USE 1300 |
| #define SOF_TKN_MUTE_LED_DIRECTION 1301 |
| diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c |
| index 6a4b59a0d8e6..8f73481fcdae 100644 |
| |
| |
| @@ -735,6 +735,16 @@ static const struct sof_topology_token pcm_tokens[] = { |
| offsetof(struct sof_ipc_comp_host, dmac_config), 0}, |
| }; |
| |
| +/* PCM */ |
| +static const struct sof_topology_token stream_tokens[] = { |
| + {SOF_TKN_STREAM_PLAYBACK_COMPATIBLE_D0I3, |
| + SND_SOC_TPLG_TUPLE_TYPE_BOOL, get_token_u16, |
| + offsetof(struct snd_sof_pcm, stream[0].d0i3_compatible), 0}, |
| + {SOF_TKN_STREAM_CAPTURE_COMPATIBLE_D0I3, |
| + SND_SOC_TPLG_TUPLE_TYPE_BOOL, get_token_u16, |
| + offsetof(struct snd_sof_pcm, stream[1].d0i3_compatible), 0}, |
| +}; |
| + |
| /* Generic components */ |
| static const struct sof_topology_token comp_tokens[] = { |
| {SOF_TKN_COMP_PERIOD_SINK_COUNT, |
| -- |
| 2.24.1 |
| |
| From b8955ca3f2a8eaa1130d2d6163bd9e6ad574133b Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:41:05 -0500 |
| Subject: [PATCH 071/109] ASoC: SOF: topology: parse and store d0i3_compatible |
| flag |
| |
| Parses the token from tplg file and store it to snd_sof_pcm_stream |
| d0i3_compatible flag, which can be used later for d0ix transition |
| management. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-10-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit c5232c0171428f005a3204e1c264231fb5999b28) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/topology.c | 16 ++++++++++++++++ |
| 1 file changed, 16 insertions(+) |
| |
| diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c |
| index 8f73481fcdae..58c32e8e478e 100644 |
| |
| |
| @@ -2308,6 +2308,7 @@ static int sof_dai_load(struct snd_soc_component *scomp, int index, |
| { |
| struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp); |
| struct snd_soc_tplg_stream_caps *caps; |
| + struct snd_soc_tplg_private *private = &pcm->priv; |
| struct snd_sof_pcm *spcm; |
| int stream = SNDRV_PCM_STREAM_PLAYBACK; |
| int ret = 0; |
| @@ -2330,10 +2331,22 @@ static int sof_dai_load(struct snd_soc_component *scomp, int index, |
| dai_drv->dobj.private = spcm; |
| list_add(&spcm->list, &sdev->pcm_list); |
| |
| + ret = sof_parse_tokens(scomp, spcm, stream_tokens, |
| + ARRAY_SIZE(stream_tokens), private->array, |
| + le32_to_cpu(private->size)); |
| + if (ret) { |
| + dev_err(sdev->dev, "error: parse stream tokens failed %d\n", |
| + le32_to_cpu(private->size)); |
| + return ret; |
| + } |
| + |
| /* do we need to allocate playback PCM DMA pages */ |
| if (!spcm->pcm.playback) |
| goto capture; |
| |
| + dev_vdbg(sdev->dev, "tplg: pcm %s stream tokens: playback d0i3:%d\n", |
| + spcm->pcm.pcm_name, spcm->stream[0].d0i3_compatible); |
| + |
| caps = &spcm->pcm.caps[stream]; |
| |
| /* allocate playback page table buffer */ |
| @@ -2361,6 +2374,9 @@ static int sof_dai_load(struct snd_soc_component *scomp, int index, |
| if (!spcm->pcm.capture) |
| return ret; |
| |
| + dev_vdbg(sdev->dev, "tplg: pcm %s stream tokens: capture d0i3:%d\n", |
| + spcm->pcm.pcm_name, spcm->stream[1].d0i3_compatible); |
| + |
| caps = &spcm->pcm.caps[stream]; |
| |
| /* allocate capture page table buffer */ |
| -- |
| 2.24.1 |
| |
| From c732dc51c229ed52e16df4a7ea41abcc8e07be5e Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:41:06 -0500 |
| Subject: [PATCH 072/109] ASoC: SOF: Intel: hda-dsp: align the comments for |
| D0I3C update |
| |
| Align the logs for CIP timeout at D0I3C.I3 updating. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-11-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit aae7c82d01219bf568a7b12f5839d7ca52b17d59) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/intel/hda-dsp.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/sound/soc/sof/intel/hda-dsp.c b/sound/soc/sof/intel/hda-dsp.c |
| index fa2f1f66c72c..74805a066183 100644 |
| |
| |
| @@ -330,7 +330,7 @@ int hda_dsp_set_power_state(struct snd_sof_dev *sdev, |
| /* Write to D0I3C after Command-In-Progress bit is cleared */ |
| ret = hda_dsp_wait_d0i3c_done(sdev, retry); |
| if (ret < 0) { |
| - dev_err(bus->dev, "CIP timeout before update D0I3C!\n"); |
| + dev_err(bus->dev, "CIP timeout before D0I3C update!\n"); |
| return ret; |
| } |
| |
| @@ -342,7 +342,7 @@ int hda_dsp_set_power_state(struct snd_sof_dev *sdev, |
| retry = 50; |
| ret = hda_dsp_wait_d0i3c_done(sdev, retry); |
| if (ret < 0) { |
| - dev_err(bus->dev, "CIP timeout after D0I3C updated!\n"); |
| + dev_err(bus->dev, "CIP timeout after D0I3C update!\n"); |
| return ret; |
| } |
| |
| -- |
| 2.24.1 |
| |
| From b729c392295ac0bbe1c74a0dd2d616eb06be40af Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:41:07 -0500 |
| Subject: [PATCH 073/109] ASoC: SOF: Intel: HDA: use macro for register polling |
| retry count |
| |
| Define macro and use it for the register polling retry count. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-12-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 92f4beb718d76e93b76343a3ba872df6cb210672) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/intel/hda-dsp.c | 6 ++---- |
| sound/soc/sof/intel/hda.h | 1 + |
| 2 files changed, 3 insertions(+), 4 deletions(-) |
| |
| diff --git a/sound/soc/sof/intel/hda-dsp.c b/sound/soc/sof/intel/hda-dsp.c |
| index 74805a066183..936361bd25e9 100644 |
| |
| |
| @@ -323,12 +323,11 @@ int hda_dsp_set_power_state(struct snd_sof_dev *sdev, |
| enum sof_d0_substate d0_substate) |
| { |
| struct hdac_bus *bus = sof_to_bus(sdev); |
| - int retry = 50; |
| int ret; |
| u8 value; |
| |
| /* Write to D0I3C after Command-In-Progress bit is cleared */ |
| - ret = hda_dsp_wait_d0i3c_done(sdev, retry); |
| + ret = hda_dsp_wait_d0i3c_done(sdev, HDA_DSP_REG_POLL_RETRY_COUNT); |
| if (ret < 0) { |
| dev_err(bus->dev, "CIP timeout before D0I3C update!\n"); |
| return ret; |
| @@ -339,8 +338,7 @@ int hda_dsp_set_power_state(struct snd_sof_dev *sdev, |
| snd_hdac_chip_updateb(bus, VS_D0I3C, SOF_HDA_VS_D0I3C_I3, value); |
| |
| /* Wait for cmd in progress to be cleared before exiting the function */ |
| - retry = 50; |
| - ret = hda_dsp_wait_d0i3c_done(sdev, retry); |
| + ret = hda_dsp_wait_d0i3c_done(sdev, HDA_DSP_REG_POLL_RETRY_COUNT); |
| if (ret < 0) { |
| dev_err(bus->dev, "CIP timeout after D0I3C update!\n"); |
| return ret; |
| diff --git a/sound/soc/sof/intel/hda.h b/sound/soc/sof/intel/hda.h |
| index bc8b58ad2704..f1054e24cac0 100644 |
| |
| |
| @@ -214,6 +214,7 @@ |
| #define HDA_DSP_CTRL_RESET_TIMEOUT 100 |
| #define HDA_DSP_WAIT_TIMEOUT 500 /* 500 msec */ |
| #define HDA_DSP_REG_POLL_INTERVAL_US 500 /* 0.5 msec */ |
| +#define HDA_DSP_REG_POLL_RETRY_COUNT 50 |
| |
| #define HDA_DSP_ADSPIC_IPC 1 |
| #define HDA_DSP_ADSPIS_IPC 1 |
| -- |
| 2.24.1 |
| |
| From 3ff8fd98199773620f7dda6069019036a734644b Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:41:08 -0500 |
| Subject: [PATCH 074/109] ASoC: SOF: PM: rename sof_send_pm_ipc to |
| sof_send_pm_ctx_ipc |
| |
| The helper sof_send_pm_ipc() is only suitable for context save/restore |
| IPCs' sending, so rename it to sof_send_pm_ctx_ipc here. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-13-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 7c7eba2402c11137d1fa1d3fb964a2c6fc1ded3e) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/pm.c | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| diff --git a/sound/soc/sof/pm.c b/sound/soc/sof/pm.c |
| index f13a2eb28732..76a6785d17aa 100644 |
| |
| |
| @@ -197,7 +197,7 @@ static int sof_restore_pipelines(struct snd_sof_dev *sdev) |
| return ret; |
| } |
| |
| -static int sof_send_pm_ipc(struct snd_sof_dev *sdev, int cmd) |
| +static int sof_send_pm_ctx_ipc(struct snd_sof_dev *sdev, int cmd) |
| { |
| struct sof_ipc_pm_ctx pm_ctx; |
| struct sof_ipc_reply reply; |
| @@ -331,7 +331,7 @@ static int sof_resume(struct device *dev, bool runtime_resume) |
| } |
| |
| /* notify DSP of system resume */ |
| - ret = sof_send_pm_ipc(sdev, SOF_IPC_PM_CTX_RESTORE); |
| + ret = sof_send_pm_ctx_ipc(sdev, SOF_IPC_PM_CTX_RESTORE); |
| if (ret < 0) |
| dev_err(sdev->dev, |
| "error: ctx_restore ipc error during resume %d\n", |
| @@ -375,7 +375,7 @@ static int sof_suspend(struct device *dev, bool runtime_suspend) |
| sof_cache_debugfs(sdev); |
| #endif |
| /* notify DSP of upcoming power down */ |
| - ret = sof_send_pm_ipc(sdev, SOF_IPC_PM_CTX_SAVE); |
| + ret = sof_send_pm_ctx_ipc(sdev, SOF_IPC_PM_CTX_SAVE); |
| if (ret == -EBUSY || ret == -EAGAIN) { |
| /* |
| * runtime PM has logic to handle -EBUSY/-EAGAIN so |
| -- |
| 2.24.1 |
| |
| From f894ca4b705a92558268b6d828f6a0ac36032dcf Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:41:10 -0500 |
| Subject: [PATCH 075/109] ASoC: SOF: Intel: hda-ipc: Don't read mailbox for |
| PM_GATE reply |
| |
| Memory windows could be powered off before receiving PM_GATE IPC reply |
| from FW, we can't read the mailbox to get reply. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-15-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 463fbf6dc03aff41e973602bbad6cb135fa6d48a) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/intel/hda-ipc.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| diff --git a/sound/soc/sof/intel/hda-ipc.c b/sound/soc/sof/intel/hda-ipc.c |
| index 6aae6f18b3dc..0fd2153c1769 100644 |
| |
| |
| @@ -83,10 +83,12 @@ void hda_dsp_ipc_get_reply(struct snd_sof_dev *sdev) |
| } |
| |
| hdr = msg->msg_data; |
| - if (hdr->cmd == (SOF_IPC_GLB_PM_MSG | SOF_IPC_PM_CTX_SAVE)) { |
| + if (hdr->cmd == (SOF_IPC_GLB_PM_MSG | SOF_IPC_PM_CTX_SAVE) || |
| + hdr->cmd == (SOF_IPC_GLB_PM_MSG | SOF_IPC_PM_GATE)) { |
| /* |
| * memory windows are powered off before sending IPC reply, |
| - * so we can't read the mailbox for CTX_SAVE reply. |
| + * so we can't read the mailbox for CTX_SAVE and PM_GATE |
| + * replies. |
| */ |
| reply.error = 0; |
| reply.hdr.cmd = SOF_IPC_GLB_REPLY; |
| -- |
| 2.24.1 |
| |
| From 39aecb24d8443afda51fa9d3402a76a422e5c2fd Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:41:11 -0500 |
| Subject: [PATCH 076/109] ASoC: SOF: Intel: HDA: add cAVS specific compact IPC |
| header file |
| |
| On cAVS platforms, some IPCs are required to be sent via IPC registers |
| only(e.g. when in D0i3, mailbox is unaccessible), add hda-ipc.h to hold |
| definition of those compact IPCs. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-16-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 5056193d4d1a8b73087145add21141c46027d6a2) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/intel/hda-ipc.h | 51 +++++++++++++++++++++++++++++++++++ |
| 1 file changed, 51 insertions(+) |
| create mode 100644 sound/soc/sof/intel/hda-ipc.h |
| |
| diff --git a/sound/soc/sof/intel/hda-ipc.h b/sound/soc/sof/intel/hda-ipc.h |
| new file mode 100644 |
| index 000000000000..aef0ceac9803 |
| |
| |
| @@ -0,0 +1,51 @@ |
| +/* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */ |
| +/* |
| + * This file is provided under a dual BSD/GPLv2 license. When using or |
| + * redistributing this file, you may do so under either license. |
| + * |
| + * Copyright(c) 2019 Intel Corporation. All rights reserved. |
| + * |
| + * Author: Keyon Jie <yang.jie@linux.intel.com> |
| + */ |
| + |
| +#ifndef __SOF_INTEL_HDA_IPC_H |
| +#define __SOF_INTEL_HDA_IPC_H |
| + |
| +/* |
| + * Primary register, mapped to |
| + * - DIPCTDR (HIPCIDR) in sideband IPC (cAVS 1.8+) |
| + * - DIPCT in cAVS 1.5 IPC |
| + * |
| + * Secondary register, mapped to: |
| + * - DIPCTDD (HIPCIDD) in sideband IPC (cAVS 1.8+) |
| + * - DIPCTE in cAVS 1.5 IPC |
| + */ |
| + |
| +/* Common bits in primary register */ |
| + |
| +/* Reserved for doorbell */ |
| +#define HDA_IPC_RSVD_31 BIT(31) |
| +/* Target, 0 - normal message, 1 - compact message(cAVS compatible) */ |
| +#define HDA_IPC_MSG_COMPACT BIT(30) |
| +/* Direction, 0 - request, 1 - response */ |
| +#define HDA_IPC_RSP BIT(29) |
| + |
| +#define HDA_IPC_TYPE_SHIFT 24 |
| +#define HDA_IPC_TYPE_MASK GENMASK(28, 24) |
| +#define HDA_IPC_TYPE(x) ((x) << HDA_IPC_TYPE_SHIFT) |
| + |
| +#define HDA_IPC_PM_GATE HDA_IPC_TYPE(0x8U) |
| + |
| +/* Command specific payload bits in secondary register */ |
| + |
| +/* Disable DMA tracing (0 - keep tracing, 1 - to disable DMA trace) */ |
| +#define HDA_PM_NO_DMA_TRACE BIT(4) |
| +/* Prevent clock gating (0 - cg allowed, 1 - DSP clock always on) */ |
| +#define HDA_PM_PCG BIT(3) |
| +/* Prevent power gating (0 - deep power state transitions allowed) */ |
| +#define HDA_PM_PPG BIT(2) |
| +/* Indicates whether streaming is active */ |
| +#define HDA_PM_PG_STREAMING BIT(1) |
| +#define HDA_PM_PG_RSVD BIT(0) |
| + |
| +#endif |
| -- |
| 2.24.1 |
| |
| From faae0bada8e833d6dd8df487cef4b2ede5d6fa6b Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:41:12 -0500 |
| Subject: [PATCH 077/109] ASoC: SOF: configure D0ix IPC flags in |
| set_power_state |
| |
| The configuration for D0ix in FW is platform specific, let's do this and |
| send IPC in the platform set_power_state() ops. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-17-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 534037fddd34b58be86a826d449a5a6635ecdbf5) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/intel/hda-dsp.c | 32 +++++++++++++++++++++++++++++++- |
| 1 file changed, 31 insertions(+), 1 deletion(-) |
| |
| diff --git a/sound/soc/sof/intel/hda-dsp.c b/sound/soc/sof/intel/hda-dsp.c |
| index 936361bd25e9..b5070409a5e3 100644 |
| |
| |
| @@ -19,6 +19,7 @@ |
| #include <sound/hda_register.h> |
| #include "../ops.h" |
| #include "hda.h" |
| +#include "hda-ipc.h" |
| |
| /* |
| * DSP Core control. |
| @@ -319,10 +320,28 @@ static int hda_dsp_wait_d0i3c_done(struct snd_sof_dev *sdev, int retry) |
| return 0; |
| } |
| |
| +static int hda_dsp_send_pm_gate_ipc(struct snd_sof_dev *sdev, u32 flags) |
| +{ |
| + struct sof_ipc_pm_gate pm_gate; |
| + struct sof_ipc_reply reply; |
| + |
| + memset(&pm_gate, 0, sizeof(pm_gate)); |
| + |
| + /* configure pm_gate ipc message */ |
| + pm_gate.hdr.size = sizeof(pm_gate); |
| + pm_gate.hdr.cmd = SOF_IPC_GLB_PM_MSG | SOF_IPC_PM_GATE; |
| + pm_gate.flags = flags; |
| + |
| + /* send pm_gate ipc to dsp */ |
| + return sof_ipc_tx_message(sdev->ipc, pm_gate.hdr.cmd, &pm_gate, |
| + sizeof(pm_gate), &reply, sizeof(reply)); |
| +} |
| + |
| int hda_dsp_set_power_state(struct snd_sof_dev *sdev, |
| enum sof_d0_substate d0_substate) |
| { |
| struct hdac_bus *bus = sof_to_bus(sdev); |
| + u32 flags; |
| int ret; |
| u8 value; |
| |
| @@ -347,7 +366,18 @@ int hda_dsp_set_power_state(struct snd_sof_dev *sdev, |
| dev_vdbg(bus->dev, "D0I3C updated, register = 0x%x\n", |
| snd_hdac_chip_readb(bus, VS_D0I3C)); |
| |
| - return 0; |
| + if (d0_substate == SOF_DSP_D0I0) |
| + flags = HDA_PM_PPG;/* prevent power gating in D0 */ |
| + else |
| + flags = HDA_PM_NO_DMA_TRACE;/* disable DMA trace in D0I3*/ |
| + |
| + /* sending pm_gate IPC */ |
| + ret = hda_dsp_send_pm_gate_ipc(sdev, flags); |
| + if (ret < 0) |
| + dev_err(sdev->dev, |
| + "error: PM_GATE ipc error %d\n", ret); |
| + |
| + return ret; |
| } |
| |
| static int hda_suspend(struct snd_sof_dev *sdev, bool runtime_suspend) |
| -- |
| 2.24.1 |
| |
| From 4cd64496be339c452c3de5602cd5d72e238cc34a Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:41:13 -0500 |
| Subject: [PATCH 078/109] ASoC: SOF: PM: add helpers for setting D0 substate |
| for ADSP |
| |
| Add snd_sof_set_d0_substate() helper for setting ADSP to a specific D0 |
| substate, it will call into the platform specific implementation, and |
| update the d0_substate at success. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-18-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 601252869f50af6f5ab377e7f4846d7b09cc66c0) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/pm.c | 17 +++++++++++++++++ |
| sound/soc/sof/sof-priv.h | 2 ++ |
| 2 files changed, 19 insertions(+) |
| |
| diff --git a/sound/soc/sof/pm.c b/sound/soc/sof/pm.c |
| index 76a6785d17aa..86bd2ffadfe5 100644 |
| |
| |
| @@ -434,6 +434,23 @@ int snd_sof_runtime_resume(struct device *dev) |
| } |
| EXPORT_SYMBOL(snd_sof_runtime_resume); |
| |
| +int snd_sof_set_d0_substate(struct snd_sof_dev *sdev, |
| + enum sof_d0_substate d0_substate) |
| +{ |
| + int ret; |
| + |
| + /* do platform specific set_state */ |
| + ret = snd_sof_dsp_set_power_state(sdev, d0_substate); |
| + if (ret < 0) |
| + return ret; |
| + |
| + /* update dsp D0 sub-state */ |
| + sdev->d0_substate = d0_substate; |
| + |
| + return 0; |
| +} |
| +EXPORT_SYMBOL(snd_sof_set_d0_substate); |
| + |
| int snd_sof_resume(struct device *dev) |
| { |
| return sof_resume(dev, false); |
| diff --git a/sound/soc/sof/sof-priv.h b/sound/soc/sof/sof-priv.h |
| index 35cdeb923898..548cba7ac571 100644 |
| |
| |
| @@ -494,6 +494,8 @@ int snd_sof_runtime_resume(struct device *dev); |
| int snd_sof_runtime_idle(struct device *dev); |
| int snd_sof_resume(struct device *dev); |
| int snd_sof_suspend(struct device *dev); |
| +int snd_sof_set_d0_substate(struct snd_sof_dev *sdev, |
| + enum sof_d0_substate d0_substate); |
| |
| void snd_sof_new_platform_drv(struct snd_sof_dev *sdev); |
| |
| -- |
| 2.24.1 |
| |
| From b6d13fd241298270085e89880958c9d846413116 Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:41:14 -0500 |
| Subject: [PATCH 079/109] ASoC: SOF: Intel: CNL: add support for sending |
| compact IPC |
| |
| For compact IPCs, we will send the IPC header/command via the HIPCIDR |
| register and the first 32bit payload via the HIPCIDD register, no |
| mailbox will be used. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-19-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 0267de58acfe5059ace739741f1533dd605ed22f) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/intel/cnl.c | 42 ++++++++++++++++++++++++++++++++++----- |
| sound/soc/sof/intel/hda.h | 1 + |
| 2 files changed, 38 insertions(+), 5 deletions(-) |
| |
| diff --git a/sound/soc/sof/intel/cnl.c b/sound/soc/sof/intel/cnl.c |
| index 982b81a0b13a..0e1e265f3f3b 100644 |
| |
| |
| @@ -17,6 +17,7 @@ |
| |
| #include "../ops.h" |
| #include "hda.h" |
| +#include "hda-ipc.h" |
| |
| static const struct snd_sof_debugfs_map cnl_dsp_debugfs[] = { |
| {"hda", HDA_DSP_HDA_BAR, 0, 0x4000, SOF_DEBUGFS_ACCESS_ALWAYS}, |
| @@ -150,14 +151,45 @@ static void cnl_ipc_dsp_done(struct snd_sof_dev *sdev) |
| CNL_DSP_REG_HIPCCTL_DONE); |
| } |
| |
| +static bool cnl_compact_ipc_compress(struct snd_sof_ipc_msg *msg, |
| + u32 *dr, u32 *dd) |
| +{ |
| + struct sof_ipc_pm_gate *pm_gate; |
| + |
| + if (msg->header == (SOF_IPC_GLB_PM_MSG | SOF_IPC_PM_GATE)) { |
| + pm_gate = msg->msg_data; |
| + |
| + /* send the compact message via the primary register */ |
| + *dr = HDA_IPC_MSG_COMPACT | HDA_IPC_PM_GATE; |
| + |
| + /* send payload via the extended data register */ |
| + *dd = pm_gate->flags; |
| + |
| + return true; |
| + } |
| + |
| + return false; |
| +} |
| + |
| static int cnl_ipc_send_msg(struct snd_sof_dev *sdev, |
| struct snd_sof_ipc_msg *msg) |
| { |
| - /* send the message */ |
| - sof_mailbox_write(sdev, sdev->host_box.offset, msg->msg_data, |
| - msg->msg_size); |
| - snd_sof_dsp_write(sdev, HDA_DSP_BAR, CNL_DSP_REG_HIPCIDR, |
| - CNL_DSP_REG_HIPCIDR_BUSY); |
| + u32 dr = 0; |
| + u32 dd = 0; |
| + |
| + if (cnl_compact_ipc_compress(msg, &dr, &dd)) { |
| + /* send the message via IPC registers */ |
| + snd_sof_dsp_write(sdev, HDA_DSP_BAR, CNL_DSP_REG_HIPCIDD, |
| + dd); |
| + snd_sof_dsp_write(sdev, HDA_DSP_BAR, CNL_DSP_REG_HIPCIDR, |
| + CNL_DSP_REG_HIPCIDR_BUSY | dr); |
| + } else { |
| + /* send the message via mailbox */ |
| + sof_mailbox_write(sdev, sdev->host_box.offset, msg->msg_data, |
| + msg->msg_size); |
| + snd_sof_dsp_write(sdev, HDA_DSP_BAR, CNL_DSP_REG_HIPCIDR, |
| + CNL_DSP_REG_HIPCIDR_BUSY); |
| + } |
| |
| return 0; |
| } |
| diff --git a/sound/soc/sof/intel/hda.h b/sound/soc/sof/intel/hda.h |
| index f1054e24cac0..16376f55e420 100644 |
| |
| |
| @@ -312,6 +312,7 @@ |
| #define CNL_DSP_REG_HIPCTDD (CNL_DSP_IPC_BASE + 0x08) |
| #define CNL_DSP_REG_HIPCIDR (CNL_DSP_IPC_BASE + 0x10) |
| #define CNL_DSP_REG_HIPCIDA (CNL_DSP_IPC_BASE + 0x14) |
| +#define CNL_DSP_REG_HIPCIDD (CNL_DSP_IPC_BASE + 0x18) |
| #define CNL_DSP_REG_HIPCCTL (CNL_DSP_IPC_BASE + 0x28) |
| |
| /* HIPCI */ |
| -- |
| 2.24.1 |
| |
| From c4cf471d27ee3a0f30c4bcb894ce1b9a3254c350 Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:41:15 -0500 |
| Subject: [PATCH 080/109] ASoC: SOF: add a flag to indicate the system suspend |
| target |
| |
| Add flag 's0_suspend' to indicate if the system is entering S0ix or |
| not. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-20-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 7367d3096b1443e55a2c730d1966f423b15d5cad) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/sof-priv.h | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| diff --git a/sound/soc/sof/sof-priv.h b/sound/soc/sof/sof-priv.h |
| index 548cba7ac571..f6ecd9f0fbc6 100644 |
| |
| |
| @@ -407,6 +407,8 @@ struct snd_sof_dev { |
| |
| /* power states related */ |
| enum sof_d0_substate d0_substate; |
| + /* flag to track if the intended power target of suspend is S0ix */ |
| + bool s0_suspend; |
| |
| /* DSP firmware boot */ |
| wait_queue_head_t boot_wait; |
| -- |
| 2.24.1 |
| |
| From 30c0391c903f66e9b1b921712900593c64510466 Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:41:16 -0500 |
| Subject: [PATCH 081/109] ASoC: SOF: add a flag suspend_ignored for sof stream |
| |
| Add a suspend_ignored flag to snd_sof_pcm_stream that will be used to |
| decide if the corresponding FW pipeline should be kept active to perform |
| always on tasks when the system is entering the S0ix state. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-21-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 4cd933abd4820da7eefe672ff439b32d199a07be) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/sof-priv.h | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| diff --git a/sound/soc/sof/sof-priv.h b/sound/soc/sof/sof-priv.h |
| index f6ecd9f0fbc6..47420d184b53 100644 |
| |
| |
| @@ -311,6 +311,11 @@ struct snd_sof_pcm_stream { |
| struct snd_pcm_substream *substream; |
| struct work_struct period_elapsed_work; |
| bool d0i3_compatible; /* DSP can be in D0I3 when this pcm is opened */ |
| + /* |
| + * flag to indicate that the DSP pipelines should be kept |
| + * active or not while suspending the stream |
| + */ |
| + bool suspend_ignored; |
| }; |
| |
| /* ALSA SOF PCM device */ |
| -- |
| 2.24.1 |
| |
| From da323444a5345a0d95fb943b8af039623df2a36c Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:41:17 -0500 |
| Subject: [PATCH 082/109] ASoC: SOF: PM: implement prepare/complete callbacks |
| |
| Implement the prepare() and complete() callbacks for power management, |
| initialize s0_suspend flag at prepare(), and reset it at complete(). |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-22-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 0b50b3b1c3bc2a2c9eeab418b3de3e60e0530cf4) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/pm.c | 23 +++++++++++++++++++++++ |
| sound/soc/sof/sof-priv.h | 2 ++ |
| 2 files changed, 25 insertions(+) |
| |
| diff --git a/sound/soc/sof/pm.c b/sound/soc/sof/pm.c |
| index 86bd2ffadfe5..02189eb2e89a 100644 |
| |
| |
| @@ -462,3 +462,26 @@ int snd_sof_suspend(struct device *dev) |
| return sof_suspend(dev, false); |
| } |
| EXPORT_SYMBOL(snd_sof_suspend); |
| + |
| +int snd_sof_prepare(struct device *dev) |
| +{ |
| + struct snd_sof_dev *sdev = dev_get_drvdata(dev); |
| + |
| +#if defined(CONFIG_ACPI) |
| + sdev->s0_suspend = acpi_target_system_state() == ACPI_STATE_S0; |
| +#else |
| + /* will suspend to S3 by default */ |
| + sdev->s0_suspend = false; |
| +#endif |
| + |
| + return 0; |
| +} |
| +EXPORT_SYMBOL(snd_sof_prepare); |
| + |
| +void snd_sof_complete(struct device *dev) |
| +{ |
| + struct snd_sof_dev *sdev = dev_get_drvdata(dev); |
| + |
| + sdev->s0_suspend = false; |
| +} |
| +EXPORT_SYMBOL(snd_sof_complete); |
| diff --git a/sound/soc/sof/sof-priv.h b/sound/soc/sof/sof-priv.h |
| index 47420d184b53..9bded2e48fba 100644 |
| |
| |
| @@ -501,6 +501,8 @@ int snd_sof_runtime_resume(struct device *dev); |
| int snd_sof_runtime_idle(struct device *dev); |
| int snd_sof_resume(struct device *dev); |
| int snd_sof_suspend(struct device *dev); |
| +int snd_sof_prepare(struct device *dev); |
| +void snd_sof_complete(struct device *dev); |
| int snd_sof_set_d0_substate(struct snd_sof_dev *sdev, |
| enum sof_d0_substate d0_substate); |
| |
| -- |
| 2.24.1 |
| |
| From 78ecf411b770ea954e2bcd18b22b7c43ece9f54f Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:41:18 -0500 |
| Subject: [PATCH 083/109] ASoC: SOF: ignore suspend/resume for D0ix compatible |
| streams |
| |
| During system suspend, the PM framework will freeze all applications and |
| the ALSA/ASoC core will suspend all RUNNING PCM streams. |
| |
| However, D0ix-compatible PCM streams should keep the related pipelines |
| active in the DSP when the system is entering S0ix. The TRIGGER_SUSPEND |
| event is trapped in such cases to prevent the pipelines from being |
| stopped. Likewise, the TRIGGER_RESUME/START events should not affect the |
| pipeline state. |
| |
| The SOF driver also triggers some DSP Firmware pipelines based on the |
| DAPM widgets power events. In such cases, we also ignore PRE_PMU and |
| POST_PMD events to keep the pipelines active. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-23-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit ac8c046f19f94ec419c60d7a073af75a71386e97) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/pcm.c | 31 +++++++++++++++++++++++++++++++ |
| sound/soc/sof/topology.c | 17 ++++++++++++++++- |
| 2 files changed, 47 insertions(+), 1 deletion(-) |
| |
| diff --git a/sound/soc/sof/pcm.c b/sound/soc/sof/pcm.c |
| index b33928e1385b..927b197c2c8d 100644 |
| |
| |
| @@ -350,6 +350,16 @@ static int sof_pcm_trigger(struct snd_pcm_substream *substream, int cmd) |
| stream.hdr.cmd |= SOF_IPC_STREAM_TRIG_RELEASE; |
| break; |
| case SNDRV_PCM_TRIGGER_RESUME: |
| + if (spcm->stream[substream->stream].suspend_ignored) { |
| + /* |
| + * this case will be triggered when INFO_RESUME is |
| + * supported, no need to resume streams that remained |
| + * enabled in D0ix. |
| + */ |
| + spcm->stream[substream->stream].suspend_ignored = false; |
| + return 0; |
| + } |
| + |
| /* set up hw_params */ |
| ret = sof_pcm_prepare(substream); |
| if (ret < 0) { |
| @@ -360,9 +370,30 @@ static int sof_pcm_trigger(struct snd_pcm_substream *substream, int cmd) |
| |
| /* fallthrough */ |
| case SNDRV_PCM_TRIGGER_START: |
| + if (spcm->stream[substream->stream].suspend_ignored) { |
| + /* |
| + * This case will be triggered when INFO_RESUME is |
| + * not supported, no need to re-start streams that |
| + * remained enabled in D0ix. |
| + */ |
| + spcm->stream[substream->stream].suspend_ignored = false; |
| + return 0; |
| + } |
| stream.hdr.cmd |= SOF_IPC_STREAM_TRIG_START; |
| break; |
| case SNDRV_PCM_TRIGGER_SUSPEND: |
| + if (sdev->s0_suspend && |
| + spcm->stream[substream->stream].d0i3_compatible) { |
| + /* |
| + * trap the event, not sending trigger stop to |
| + * prevent the FW pipelines from being stopped, |
| + * and mark the flag to ignore the upcoming DAPM |
| + * PM events. |
| + */ |
| + spcm->stream[substream->stream].suspend_ignored = true; |
| + return 0; |
| + } |
| + /* fallthrough */ |
| case SNDRV_PCM_TRIGGER_STOP: |
| stream.hdr.cmd |= SOF_IPC_STREAM_TRIG_STOP; |
| ipc_first = true; |
| diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c |
| index 58c32e8e478e..82d8cae44a9c 100644 |
| |
| |
| @@ -135,7 +135,9 @@ static int sof_keyword_dapm_event(struct snd_soc_dapm_widget *w, |
| struct snd_kcontrol *k, int event) |
| { |
| struct snd_sof_widget *swidget = w->dobj.private; |
| + int stream = SNDRV_PCM_STREAM_CAPTURE; |
| struct snd_sof_dev *sdev; |
| + struct snd_sof_pcm *spcm; |
| int ret = 0; |
| |
| if (!swidget) |
| @@ -146,11 +148,19 @@ static int sof_keyword_dapm_event(struct snd_soc_dapm_widget *w, |
| dev_dbg(sdev->dev, "received event %d for widget %s\n", |
| event, w->name); |
| |
| + /* get runtime PCM params using widget's stream name */ |
| + spcm = snd_sof_find_spcm_name(sdev, swidget->widget->sname); |
| + |
| /* process events */ |
| switch (event) { |
| case SND_SOC_DAPM_PRE_PMU: |
| + if (spcm->stream[stream].suspend_ignored) { |
| + dev_dbg(sdev->dev, "PRE_PMU event ignored, KWD pipeline is already RUNNING\n"); |
| + return 0; |
| + } |
| + |
| /* set pcm params */ |
| - ret = ipc_pcm_params(swidget, SOF_IPC_STREAM_CAPTURE); |
| + ret = ipc_pcm_params(swidget, stream); |
| if (ret < 0) { |
| dev_err(sdev->dev, |
| "error: failed to set pcm params for widget %s\n", |
| @@ -166,6 +176,11 @@ static int sof_keyword_dapm_event(struct snd_soc_dapm_widget *w, |
| swidget->widget->name); |
| break; |
| case SND_SOC_DAPM_POST_PMD: |
| + if (spcm->stream[stream].suspend_ignored) { |
| + dev_dbg(sdev->dev, "POST_PMD even ignored, KWD pipeline will remain RUNNING\n"); |
| + return 0; |
| + } |
| + |
| /* stop trigger */ |
| ret = ipc_trigger(swidget, SOF_IPC_STREAM_TRIG_STOP); |
| if (ret < 0) |
| -- |
| 2.24.1 |
| |
| From 86489b5d1ebcdf9e23a2827d82f2fd7506946662 Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:41:19 -0500 |
| Subject: [PATCH 084/109] ASoC: SOF: Intel: hda-dsp: implement suspend/resume |
| for S0ix<->S0 transition |
| |
| Enable system wake up via IPC interrupt from DSP when the system is |
| suspending to the S0ix state, and disable it in the corresponding |
| resuming. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-24-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 66e40876ddc325d892c493a6d83574bbba5770ce) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/intel/hda-dsp.c | 17 +++++++++++++++++ |
| 1 file changed, 17 insertions(+) |
| |
| diff --git a/sound/soc/sof/intel/hda-dsp.c b/sound/soc/sof/intel/hda-dsp.c |
| index b5070409a5e3..d23573d9e9c4 100644 |
| |
| |
| @@ -477,6 +477,15 @@ static int hda_resume(struct snd_sof_dev *sdev, bool runtime_resume) |
| |
| int hda_dsp_resume(struct snd_sof_dev *sdev) |
| { |
| + struct pci_dev *pci = to_pci_dev(sdev->dev); |
| + |
| + if (sdev->s0_suspend) { |
| + /* restore and disable the system wakeup */ |
| + pci_restore_state(pci); |
| + disable_irq_wake(pci->irq); |
| + return 0; |
| + } |
| + |
| /* init hda controller. DSP cores will be powered up during fw boot */ |
| return hda_resume(sdev, false); |
| } |
| @@ -509,8 +518,16 @@ int hda_dsp_runtime_suspend(struct snd_sof_dev *sdev) |
| int hda_dsp_suspend(struct snd_sof_dev *sdev) |
| { |
| struct hdac_bus *bus = sof_to_bus(sdev); |
| + struct pci_dev *pci = to_pci_dev(sdev->dev); |
| int ret; |
| |
| + if (sdev->s0_suspend) { |
| + /* enable the system waking up via IPC IRQ */ |
| + enable_irq_wake(pci->irq); |
| + pci_save_state(pci); |
| + return 0; |
| + } |
| + |
| /* stop hda controller and power dsp off */ |
| ret = hda_suspend(sdev, false); |
| if (ret < 0) { |
| -- |
| 2.24.1 |
| |
| From 76547aaa1c920a91b99114d24945a2bf17974d0a Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:41:20 -0500 |
| Subject: [PATCH 085/109] ASoC: SOF: return -ENOTSUPP if D0I3 is not supported |
| |
| No set_power_state ops means that the platform doesn't support D0i3, |
| return -ENOTSUPP for the case. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-25-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 5655ce660a6d3eec4a3ad37feb99fb228540d1a9) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/ops.h | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| diff --git a/sound/soc/sof/ops.h b/sound/soc/sof/ops.h |
| index d7c8fc06f961..93512dcbaacd 100644 |
| |
| |
| @@ -199,7 +199,8 @@ static inline int snd_sof_dsp_set_power_state(struct snd_sof_dev *sdev, |
| if (sof_ops(sdev)->set_power_state) |
| return sof_ops(sdev)->set_power_state(sdev, substate); |
| |
| - return 0; |
| + /* D0 substate is not supported */ |
| + return -ENOTSUPP; |
| } |
| |
| /* debug */ |
| -- |
| 2.24.1 |
| |
| From 6708194b3b3c49c2bf0370b2a69543c3fa98d513 Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:41:21 -0500 |
| Subject: [PATCH 086/109] ASoC: SOF: PM: Add support for DSP D0i3 state when |
| entering S0ix |
| |
| When system is entering into S0ix, the PCI device may transition to the |
| D0i3 substate instead of D3. In D0i3, some always-on functionality can |
| be enabled, such as acoustic event detection, voice activity detection |
| or hotwording. When an event is detected, the DSP firmware can wake-up |
| the device for a transition to D0 with an interrupt. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-26-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit c470fc3f61b25e955f8ba90fc9dc554881e4e72c) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/pm.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ |
| 1 file changed, 46 insertions(+) |
| |
| diff --git a/sound/soc/sof/pm.c b/sound/soc/sof/pm.c |
| index 02189eb2e89a..4f8db8367d0a 100644 |
| |
| |
| @@ -453,12 +453,58 @@ EXPORT_SYMBOL(snd_sof_set_d0_substate); |
| |
| int snd_sof_resume(struct device *dev) |
| { |
| + struct snd_sof_dev *sdev = dev_get_drvdata(dev); |
| + int ret; |
| + |
| + if (sdev->s0_suspend) { |
| + /* resume from D0I3 */ |
| + dev_dbg(sdev->dev, "DSP will exit from D0i3...\n"); |
| + ret = snd_sof_set_d0_substate(sdev, SOF_DSP_D0I0); |
| + if (ret == -ENOTSUPP) { |
| + /* fallback to resume from D3 */ |
| + dev_dbg(sdev->dev, "D0i3 not supported, fall back to resume from D3...\n"); |
| + goto d3_resume; |
| + } else if (ret < 0) { |
| + dev_err(sdev->dev, "error: failed to exit from D0I3 %d\n", |
| + ret); |
| + return ret; |
| + } |
| + |
| + /* platform-specific resume from D0i3 */ |
| + return snd_sof_dsp_resume(sdev); |
| + } |
| + |
| +d3_resume: |
| + /* resume from D3 */ |
| return sof_resume(dev, false); |
| } |
| EXPORT_SYMBOL(snd_sof_resume); |
| |
| int snd_sof_suspend(struct device *dev) |
| { |
| + struct snd_sof_dev *sdev = dev_get_drvdata(dev); |
| + int ret; |
| + |
| + if (sdev->s0_suspend) { |
| + /* suspend to D0i3 */ |
| + dev_dbg(sdev->dev, "DSP is trying to enter D0i3...\n"); |
| + ret = snd_sof_set_d0_substate(sdev, SOF_DSP_D0I3); |
| + if (ret == -ENOTSUPP) { |
| + /* fallback to D3 suspend */ |
| + dev_dbg(sdev->dev, "D0i3 not supported, fall back to D3...\n"); |
| + goto d3_suspend; |
| + } else if (ret < 0) { |
| + dev_err(sdev->dev, "error: failed to enter D0I3, %d\n", |
| + ret); |
| + return ret; |
| + } |
| + |
| + /* platform-specific suspend to D0i3 */ |
| + return snd_sof_dsp_suspend(sdev); |
| + } |
| + |
| +d3_suspend: |
| + /* suspend to D3 */ |
| return sof_suspend(dev, false); |
| } |
| EXPORT_SYMBOL(snd_sof_suspend); |
| -- |
| 2.24.1 |
| |
| From 19f37f08da2c5bc26d8f5df3f66fb71cf3d9f831 Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 25 Oct 2019 17:41:22 -0500 |
| Subject: [PATCH 087/109] ASoC: SOF: pci: Add prepare/complete PM callbacks |
| |
| Use the new implemented snd_sof_prepare() and snd_sof_complete() as the |
| power management callbacks for pci probing platforms. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191025224122.7718-27-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 6d407a39cc9619d0088b44333c6526924be00f8d) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/sof-pci-dev.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| diff --git a/sound/soc/sof/sof-pci-dev.c b/sound/soc/sof/sof-pci-dev.c |
| index 067acf389af7..3b58b91e7b9e 100644 |
| |
| |
| @@ -229,6 +229,8 @@ static const struct sof_dev_desc jsl_desc = { |
| #endif |
| |
| static const struct dev_pm_ops sof_pci_pm = { |
| + .prepare = snd_sof_prepare, |
| + .complete = snd_sof_complete, |
| SET_SYSTEM_SLEEP_PM_OPS(snd_sof_suspend, snd_sof_resume) |
| SET_RUNTIME_PM_OPS(snd_sof_runtime_suspend, snd_sof_runtime_resume, |
| snd_sof_runtime_idle) |
| -- |
| 2.24.1 |
| |
| From b6a2d55961bfc8c9eafdc520b34109420084b274 Mon Sep 17 00:00:00 2001 |
| From: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> |
| Date: Fri, 1 Nov 2019 12:09:16 -0500 |
| Subject: [PATCH 088/109] ASoC: SOF: Intel: hda: Simplify the |
| hda_dsp_wait_d0i3c_done() function |
| |
| Remove the retry argument for the hda_dsp_wait_d0i3c_done() |
| function and use the HDA_DSP_REG_POLL_RETRY_COUNT macro |
| directly. |
| |
| Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191101170916.26517-4-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 65c56f5dccc87ca2993a50672e144c7378189f2c) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/intel/hda-dsp.c | 7 ++++--- |
| 1 file changed, 4 insertions(+), 3 deletions(-) |
| |
| diff --git a/sound/soc/sof/intel/hda-dsp.c b/sound/soc/sof/intel/hda-dsp.c |
| index d23573d9e9c4..8cd5ecc01b62 100644 |
| |
| |
| @@ -307,9 +307,10 @@ void hda_dsp_ipc_int_disable(struct snd_sof_dev *sdev) |
| HDA_DSP_REG_HIPCCTL_BUSY | HDA_DSP_REG_HIPCCTL_DONE, 0); |
| } |
| |
| -static int hda_dsp_wait_d0i3c_done(struct snd_sof_dev *sdev, int retry) |
| +static int hda_dsp_wait_d0i3c_done(struct snd_sof_dev *sdev) |
| { |
| struct hdac_bus *bus = sof_to_bus(sdev); |
| + int retry = HDA_DSP_REG_POLL_RETRY_COUNT; |
| |
| while (snd_hdac_chip_readb(bus, VS_D0I3C) & SOF_HDA_VS_D0I3C_CIP) { |
| if (!retry--) |
| @@ -346,7 +347,7 @@ int hda_dsp_set_power_state(struct snd_sof_dev *sdev, |
| u8 value; |
| |
| /* Write to D0I3C after Command-In-Progress bit is cleared */ |
| - ret = hda_dsp_wait_d0i3c_done(sdev, HDA_DSP_REG_POLL_RETRY_COUNT); |
| + ret = hda_dsp_wait_d0i3c_done(sdev); |
| if (ret < 0) { |
| dev_err(bus->dev, "CIP timeout before D0I3C update!\n"); |
| return ret; |
| @@ -357,7 +358,7 @@ int hda_dsp_set_power_state(struct snd_sof_dev *sdev, |
| snd_hdac_chip_updateb(bus, VS_D0I3C, SOF_HDA_VS_D0I3C_I3, value); |
| |
| /* Wait for cmd in progress to be cleared before exiting the function */ |
| - ret = hda_dsp_wait_d0i3c_done(sdev, HDA_DSP_REG_POLL_RETRY_COUNT); |
| + ret = hda_dsp_wait_d0i3c_done(sdev); |
| if (ret < 0) { |
| dev_err(bus->dev, "CIP timeout after D0I3C update!\n"); |
| return ret; |
| -- |
| 2.24.1 |
| |
| From 4260fe05dea091d2de9257f29c604c8b9530aa47 Mon Sep 17 00:00:00 2001 |
| From: Jaska Uimonen <jaska.uimonen@linux.intel.com> |
| Date: Tue, 8 Oct 2019 11:44:42 -0500 |
| Subject: [PATCH 089/109] AsoC: SOF: refactor control load code |
| |
| Move code around to enable token parsing in control load. |
| |
| Signed-off-by: Jaska Uimonen <jaska.uimonen@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191008164443.1358-9-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit acf1b71cb693263c7c9373296e872a8fa61a5cf3) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/topology.c | 336 +++++++++++++++++++-------------------- |
| 1 file changed, 168 insertions(+), 168 deletions(-) |
| |
| diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c |
| index 82d8cae44a9c..143b8259a70a 100644 |
| |
| |
| @@ -447,174 +447,6 @@ static enum sof_comp_type find_process_comp_type(enum sof_ipc_process_type type) |
| return SOF_COMP_NONE; |
| } |
| |
| -/* |
| - * Standard Kcontrols. |
| - */ |
| - |
| -static int sof_control_load_volume(struct snd_soc_component *scomp, |
| - struct snd_sof_control *scontrol, |
| - struct snd_kcontrol_new *kc, |
| - struct snd_soc_tplg_ctl_hdr *hdr) |
| -{ |
| - struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp); |
| - struct snd_soc_tplg_mixer_control *mc = |
| - container_of(hdr, struct snd_soc_tplg_mixer_control, hdr); |
| - struct sof_ipc_ctrl_data *cdata; |
| - int tlv[TLV_ITEMS]; |
| - unsigned int i; |
| - int ret; |
| - |
| - /* validate topology data */ |
| - if (le32_to_cpu(mc->num_channels) > SND_SOC_TPLG_MAX_CHAN) |
| - return -EINVAL; |
| - |
| - /* init the volume get/put data */ |
| - scontrol->size = struct_size(scontrol->control_data, chanv, |
| - le32_to_cpu(mc->num_channels)); |
| - scontrol->control_data = kzalloc(scontrol->size, GFP_KERNEL); |
| - if (!scontrol->control_data) |
| - return -ENOMEM; |
| - |
| - scontrol->comp_id = sdev->next_comp_id; |
| - scontrol->min_volume_step = le32_to_cpu(mc->min); |
| - scontrol->max_volume_step = le32_to_cpu(mc->max); |
| - scontrol->num_channels = le32_to_cpu(mc->num_channels); |
| - |
| - /* set cmd for mixer control */ |
| - if (le32_to_cpu(mc->max) == 1) { |
| - scontrol->cmd = SOF_CTRL_CMD_SWITCH; |
| - goto out; |
| - } |
| - |
| - scontrol->cmd = SOF_CTRL_CMD_VOLUME; |
| - |
| - /* extract tlv data */ |
| - if (get_tlv_data(kc->tlv.p, tlv) < 0) { |
| - dev_err(sdev->dev, "error: invalid TLV data\n"); |
| - return -EINVAL; |
| - } |
| - |
| - /* set up volume table */ |
| - ret = set_up_volume_table(scontrol, tlv, le32_to_cpu(mc->max) + 1); |
| - if (ret < 0) { |
| - dev_err(sdev->dev, "error: setting up volume table\n"); |
| - return ret; |
| - } |
| - |
| - /* set default volume values to 0dB in control */ |
| - cdata = scontrol->control_data; |
| - for (i = 0; i < scontrol->num_channels; i++) { |
| - cdata->chanv[i].channel = i; |
| - cdata->chanv[i].value = VOL_ZERO_DB; |
| - } |
| - |
| -out: |
| - /* set up possible led control from mixer private data */ |
| - ret = sof_parse_tokens(scomp, &scontrol->led_ctl, led_tokens, |
| - ARRAY_SIZE(led_tokens), mc->priv.array, |
| - le32_to_cpu(mc->priv.size)); |
| - if (ret != 0) { |
| - dev_err(sdev->dev, "error: parse led tokens failed %d\n", |
| - le32_to_cpu(mc->priv.size)); |
| - return ret; |
| - } |
| - |
| - dev_dbg(sdev->dev, "tplg: load kcontrol index %d chans %d\n", |
| - scontrol->comp_id, scontrol->num_channels); |
| - |
| - return 0; |
| -} |
| - |
| -static int sof_control_load_enum(struct snd_soc_component *scomp, |
| - struct snd_sof_control *scontrol, |
| - struct snd_kcontrol_new *kc, |
| - struct snd_soc_tplg_ctl_hdr *hdr) |
| -{ |
| - struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp); |
| - struct snd_soc_tplg_enum_control *ec = |
| - container_of(hdr, struct snd_soc_tplg_enum_control, hdr); |
| - |
| - /* validate topology data */ |
| - if (le32_to_cpu(ec->num_channels) > SND_SOC_TPLG_MAX_CHAN) |
| - return -EINVAL; |
| - |
| - /* init the enum get/put data */ |
| - scontrol->size = struct_size(scontrol->control_data, chanv, |
| - le32_to_cpu(ec->num_channels)); |
| - scontrol->control_data = kzalloc(scontrol->size, GFP_KERNEL); |
| - if (!scontrol->control_data) |
| - return -ENOMEM; |
| - |
| - scontrol->comp_id = sdev->next_comp_id; |
| - scontrol->num_channels = le32_to_cpu(ec->num_channels); |
| - |
| - scontrol->cmd = SOF_CTRL_CMD_ENUM; |
| - |
| - dev_dbg(sdev->dev, "tplg: load kcontrol index %d chans %d comp_id %d\n", |
| - scontrol->comp_id, scontrol->num_channels, scontrol->comp_id); |
| - |
| - return 0; |
| -} |
| - |
| -static int sof_control_load_bytes(struct snd_soc_component *scomp, |
| - struct snd_sof_control *scontrol, |
| - struct snd_kcontrol_new *kc, |
| - struct snd_soc_tplg_ctl_hdr *hdr) |
| -{ |
| - struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp); |
| - struct sof_ipc_ctrl_data *cdata; |
| - struct snd_soc_tplg_bytes_control *control = |
| - container_of(hdr, struct snd_soc_tplg_bytes_control, hdr); |
| - struct soc_bytes_ext *sbe = (struct soc_bytes_ext *)kc->private_value; |
| - int max_size = sbe->max; |
| - |
| - /* init the get/put bytes data */ |
| - scontrol->size = sizeof(struct sof_ipc_ctrl_data) + |
| - le32_to_cpu(control->priv.size); |
| - |
| - if (scontrol->size > max_size) { |
| - dev_err(sdev->dev, "err: bytes data size %d exceeds max %d.\n", |
| - scontrol->size, max_size); |
| - return -EINVAL; |
| - } |
| - |
| - scontrol->control_data = kzalloc(max_size, GFP_KERNEL); |
| - cdata = scontrol->control_data; |
| - if (!scontrol->control_data) |
| - return -ENOMEM; |
| - |
| - scontrol->comp_id = sdev->next_comp_id; |
| - scontrol->cmd = SOF_CTRL_CMD_BINARY; |
| - |
| - dev_dbg(sdev->dev, "tplg: load kcontrol index %d chans %d\n", |
| - scontrol->comp_id, scontrol->num_channels); |
| - |
| - if (le32_to_cpu(control->priv.size) > 0) { |
| - memcpy(cdata->data, control->priv.data, |
| - le32_to_cpu(control->priv.size)); |
| - |
| - if (cdata->data->magic != SOF_ABI_MAGIC) { |
| - dev_err(sdev->dev, "error: Wrong ABI magic 0x%08x.\n", |
| - cdata->data->magic); |
| - return -EINVAL; |
| - } |
| - if (SOF_ABI_VERSION_INCOMPATIBLE(SOF_ABI_VERSION, |
| - cdata->data->abi)) { |
| - dev_err(sdev->dev, |
| - "error: Incompatible ABI version 0x%08x.\n", |
| - cdata->data->abi); |
| - return -EINVAL; |
| - } |
| - if (cdata->data->size + sizeof(const struct sof_abi_hdr) != |
| - le32_to_cpu(control->priv.size)) { |
| - dev_err(sdev->dev, |
| - "error: Conflict in bytes vs. priv size.\n"); |
| - return -EINVAL; |
| - } |
| - } |
| - return 0; |
| -} |
| - |
| /* |
| * Topology Token Parsing. |
| * New tokens should be added to headers and parsing tables below. |
| @@ -1090,6 +922,174 @@ static void sof_dbg_comp_config(struct snd_soc_component *scomp, |
| config->frame_fmt); |
| } |
| |
| +/* |
| + * Standard Kcontrols. |
| + */ |
| + |
| +static int sof_control_load_volume(struct snd_soc_component *scomp, |
| + struct snd_sof_control *scontrol, |
| + struct snd_kcontrol_new *kc, |
| + struct snd_soc_tplg_ctl_hdr *hdr) |
| +{ |
| + struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp); |
| + struct snd_soc_tplg_mixer_control *mc = |
| + container_of(hdr, struct snd_soc_tplg_mixer_control, hdr); |
| + struct sof_ipc_ctrl_data *cdata; |
| + int tlv[TLV_ITEMS]; |
| + unsigned int i; |
| + int ret; |
| + |
| + /* validate topology data */ |
| + if (le32_to_cpu(mc->num_channels) > SND_SOC_TPLG_MAX_CHAN) |
| + return -EINVAL; |
| + |
| + /* init the volume get/put data */ |
| + scontrol->size = struct_size(scontrol->control_data, chanv, |
| + le32_to_cpu(mc->num_channels)); |
| + scontrol->control_data = kzalloc(scontrol->size, GFP_KERNEL); |
| + if (!scontrol->control_data) |
| + return -ENOMEM; |
| + |
| + scontrol->comp_id = sdev->next_comp_id; |
| + scontrol->min_volume_step = le32_to_cpu(mc->min); |
| + scontrol->max_volume_step = le32_to_cpu(mc->max); |
| + scontrol->num_channels = le32_to_cpu(mc->num_channels); |
| + |
| + /* set cmd for mixer control */ |
| + if (le32_to_cpu(mc->max) == 1) { |
| + scontrol->cmd = SOF_CTRL_CMD_SWITCH; |
| + goto out; |
| + } |
| + |
| + scontrol->cmd = SOF_CTRL_CMD_VOLUME; |
| + |
| + /* extract tlv data */ |
| + if (get_tlv_data(kc->tlv.p, tlv) < 0) { |
| + dev_err(sdev->dev, "error: invalid TLV data\n"); |
| + return -EINVAL; |
| + } |
| + |
| + /* set up volume table */ |
| + ret = set_up_volume_table(scontrol, tlv, le32_to_cpu(mc->max) + 1); |
| + if (ret < 0) { |
| + dev_err(sdev->dev, "error: setting up volume table\n"); |
| + return ret; |
| + } |
| + |
| + /* set default volume values to 0dB in control */ |
| + cdata = scontrol->control_data; |
| + for (i = 0; i < scontrol->num_channels; i++) { |
| + cdata->chanv[i].channel = i; |
| + cdata->chanv[i].value = VOL_ZERO_DB; |
| + } |
| + |
| +out: |
| + /* set up possible led control from mixer private data */ |
| + ret = sof_parse_tokens(scomp, &scontrol->led_ctl, led_tokens, |
| + ARRAY_SIZE(led_tokens), mc->priv.array, |
| + le32_to_cpu(mc->priv.size)); |
| + if (ret != 0) { |
| + dev_err(sdev->dev, "error: parse led tokens failed %d\n", |
| + le32_to_cpu(mc->priv.size)); |
| + return ret; |
| + } |
| + |
| + dev_dbg(sdev->dev, "tplg: load kcontrol index %d chans %d\n", |
| + scontrol->comp_id, scontrol->num_channels); |
| + |
| + return 0; |
| +} |
| + |
| +static int sof_control_load_enum(struct snd_soc_component *scomp, |
| + struct snd_sof_control *scontrol, |
| + struct snd_kcontrol_new *kc, |
| + struct snd_soc_tplg_ctl_hdr *hdr) |
| +{ |
| + struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp); |
| + struct snd_soc_tplg_enum_control *ec = |
| + container_of(hdr, struct snd_soc_tplg_enum_control, hdr); |
| + |
| + /* validate topology data */ |
| + if (le32_to_cpu(ec->num_channels) > SND_SOC_TPLG_MAX_CHAN) |
| + return -EINVAL; |
| + |
| + /* init the enum get/put data */ |
| + scontrol->size = struct_size(scontrol->control_data, chanv, |
| + le32_to_cpu(ec->num_channels)); |
| + scontrol->control_data = kzalloc(scontrol->size, GFP_KERNEL); |
| + if (!scontrol->control_data) |
| + return -ENOMEM; |
| + |
| + scontrol->comp_id = sdev->next_comp_id; |
| + scontrol->num_channels = le32_to_cpu(ec->num_channels); |
| + |
| + scontrol->cmd = SOF_CTRL_CMD_ENUM; |
| + |
| + dev_dbg(sdev->dev, "tplg: load kcontrol index %d chans %d comp_id %d\n", |
| + scontrol->comp_id, scontrol->num_channels, scontrol->comp_id); |
| + |
| + return 0; |
| +} |
| + |
| +static int sof_control_load_bytes(struct snd_soc_component *scomp, |
| + struct snd_sof_control *scontrol, |
| + struct snd_kcontrol_new *kc, |
| + struct snd_soc_tplg_ctl_hdr *hdr) |
| +{ |
| + struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp); |
| + struct sof_ipc_ctrl_data *cdata; |
| + struct snd_soc_tplg_bytes_control *control = |
| + container_of(hdr, struct snd_soc_tplg_bytes_control, hdr); |
| + struct soc_bytes_ext *sbe = (struct soc_bytes_ext *)kc->private_value; |
| + int max_size = sbe->max; |
| + |
| + /* init the get/put bytes data */ |
| + scontrol->size = sizeof(struct sof_ipc_ctrl_data) + |
| + le32_to_cpu(control->priv.size); |
| + |
| + if (scontrol->size > max_size) { |
| + dev_err(sdev->dev, "err: bytes data size %d exceeds max %d.\n", |
| + scontrol->size, max_size); |
| + return -EINVAL; |
| + } |
| + |
| + scontrol->control_data = kzalloc(max_size, GFP_KERNEL); |
| + cdata = scontrol->control_data; |
| + if (!scontrol->control_data) |
| + return -ENOMEM; |
| + |
| + scontrol->comp_id = sdev->next_comp_id; |
| + scontrol->cmd = SOF_CTRL_CMD_BINARY; |
| + |
| + dev_dbg(sdev->dev, "tplg: load kcontrol index %d chans %d\n", |
| + scontrol->comp_id, scontrol->num_channels); |
| + |
| + if (le32_to_cpu(control->priv.size) > 0) { |
| + memcpy(cdata->data, control->priv.data, |
| + le32_to_cpu(control->priv.size)); |
| + |
| + if (cdata->data->magic != SOF_ABI_MAGIC) { |
| + dev_err(sdev->dev, "error: Wrong ABI magic 0x%08x.\n", |
| + cdata->data->magic); |
| + return -EINVAL; |
| + } |
| + if (SOF_ABI_VERSION_INCOMPATIBLE(SOF_ABI_VERSION, |
| + cdata->data->abi)) { |
| + dev_err(sdev->dev, |
| + "error: Incompatible ABI version 0x%08x.\n", |
| + cdata->data->abi); |
| + return -EINVAL; |
| + } |
| + if (cdata->data->size + sizeof(const struct sof_abi_hdr) != |
| + le32_to_cpu(control->priv.size)) { |
| + dev_err(sdev->dev, |
| + "error: Conflict in bytes vs. priv size.\n"); |
| + return -EINVAL; |
| + } |
| + } |
| + return 0; |
| +} |
| + |
| /* external kcontrol init - used for any driver specific init */ |
| static int sof_control_load(struct snd_soc_component *scomp, int index, |
| struct snd_kcontrol_new *kc, |
| -- |
| 2.24.1 |
| |
| From 15c0bca54b7988f8f114d48e0b059ac02d729a90 Mon Sep 17 00:00:00 2001 |
| From: Jaroslav Kysela <perex@perex.cz> |
| Date: Tue, 19 Nov 2019 18:49:32 +0100 |
| Subject: [PATCH 090/109] ASoC: add control components management |
| |
| This ASCII string can carry additional information about |
| soundcard components or configuration. Add the possibility |
| to set this string via the ASoC card. |
| |
| Signed-off-by: Jaroslav Kysela <perex@perex.cz> |
| Cc: Mark Brown <broonie@kernel.org> |
| Link: https://lore.kernel.org/r/20191119174933.25526-1-perex@perex.cz |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit dc73d73aa7145f55412611f3eead1e85ae026785) |
| Bugzilla: 1772498 |
| |
| include/sound/soc.h | 1 + |
| sound/soc/soc-core.c | 13 +++++++++++++ |
| 2 files changed, 14 insertions(+) |
| |
| diff --git a/include/sound/soc.h b/include/sound/soc.h |
| index f264c6509f00..efc5fb8f3d64 100644 |
| |
| |
| @@ -978,6 +978,7 @@ struct snd_soc_card { |
| const char *name; |
| const char *long_name; |
| const char *driver_name; |
| + const char *components; |
| char dmi_longname[80]; |
| char topology_shortname[32]; |
| |
| diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c |
| index 9d3b546bae7b..da5111985a56 100644 |
| |
| |
| @@ -2097,6 +2097,19 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card) |
| } |
| } |
| |
| + if (card->components) { |
| + /* the current implementation of snd_component_add() accepts */ |
| + /* multiple components in the string separated by space, */ |
| + /* but the string collision (identical string) check might */ |
| + /* not work correctly */ |
| + ret = snd_component_add(card->snd_card, card->components); |
| + if (ret < 0) { |
| + dev_err(card->dev, "ASoC: %s snd_component_add() failed: %d\n", |
| + card->name, ret); |
| + goto probe_end; |
| + } |
| + } |
| + |
| if (card->late_probe) { |
| ret = card->late_probe(card); |
| if (ret < 0) { |
| -- |
| 2.24.1 |
| |
| From 4f4361e40a15f13cf9a8f55121265f34cca25539 Mon Sep 17 00:00:00 2001 |
| From: Jaroslav Kysela <perex@perex.cz> |
| Date: Wed, 20 Nov 2019 18:44:34 +0100 |
| Subject: [PATCH 091/109] ASoC: improve the DMI long card code in asoc-core |
| |
| Add append_dmi_string() function and make the code more readable. |
| |
| Signed-off-by: Jaroslav Kysela <perex@perex.cz> |
| Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191120174435.30920-1-perex@perex.cz |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 4e01e5dbba96f731119f3f1a6bf51b54c98c5940) |
| Bugzilla: 1772498 |
| |
| sound/soc/soc-core.c | 66 +++++++++++++++++--------------------------- |
| 1 file changed, 25 insertions(+), 41 deletions(-) |
| |
| diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c |
| index da5111985a56..fbe641ef8ed7 100644 |
| |
| |
| @@ -1729,6 +1729,23 @@ static int is_dmi_valid(const char *field) |
| return 1; |
| } |
| |
| +/* |
| + * Append a string to card->dmi_longname with character cleanups. |
| + */ |
| +static void append_dmi_string(struct snd_soc_card *card, const char *str) |
| +{ |
| + char *dst = card->dmi_longname; |
| + size_t dst_len = sizeof(card->dmi_longname); |
| + size_t len; |
| + |
| + len = strlen(dst); |
| + snprintf(dst + len, dst_len - len, "-%s", str); |
| + |
| + len++; /* skip the separator "-" */ |
| + if (len < dst_len) |
| + cleanup_dmi_name(dst + len); |
| +} |
| + |
| /** |
| * snd_soc_set_dmi_name() - Register DMI names to card |
| * @card: The card to register DMI names |
| @@ -1763,61 +1780,36 @@ static int is_dmi_valid(const char *field) |
| int snd_soc_set_dmi_name(struct snd_soc_card *card, const char *flavour) |
| { |
| const char *vendor, *product, *product_version, *board; |
| - size_t longname_buf_size = sizeof(card->snd_card->longname); |
| - size_t len; |
| |
| if (card->long_name) |
| return 0; /* long name already set by driver or from DMI */ |
| |
| - /* make up dmi long name as: vendor.product.version.board */ |
| + /* make up dmi long name as: vendor-product-version-board */ |
| vendor = dmi_get_system_info(DMI_BOARD_VENDOR); |
| if (!vendor || !is_dmi_valid(vendor)) { |
| dev_warn(card->dev, "ASoC: no DMI vendor name!\n"); |
| return 0; |
| } |
| |
| - snprintf(card->dmi_longname, sizeof(card->snd_card->longname), |
| - "%s", vendor); |
| + snprintf(card->dmi_longname, sizeof(card->dmi_longname), "%s", vendor); |
| cleanup_dmi_name(card->dmi_longname); |
| |
| product = dmi_get_system_info(DMI_PRODUCT_NAME); |
| if (product && is_dmi_valid(product)) { |
| - len = strlen(card->dmi_longname); |
| - snprintf(card->dmi_longname + len, |
| - longname_buf_size - len, |
| - "-%s", product); |
| - |
| - len++; /* skip the separator "-" */ |
| - if (len < longname_buf_size) |
| - cleanup_dmi_name(card->dmi_longname + len); |
| + append_dmi_string(card, product); |
| |
| /* |
| * some vendors like Lenovo may only put a self-explanatory |
| * name in the product version field |
| */ |
| product_version = dmi_get_system_info(DMI_PRODUCT_VERSION); |
| - if (product_version && is_dmi_valid(product_version)) { |
| - len = strlen(card->dmi_longname); |
| - snprintf(card->dmi_longname + len, |
| - longname_buf_size - len, |
| - "-%s", product_version); |
| - |
| - len++; |
| - if (len < longname_buf_size) |
| - cleanup_dmi_name(card->dmi_longname + len); |
| - } |
| + if (product_version && is_dmi_valid(product_version)) |
| + append_dmi_string(card, product_version); |
| } |
| |
| board = dmi_get_system_info(DMI_BOARD_NAME); |
| if (board && is_dmi_valid(board)) { |
| - len = strlen(card->dmi_longname); |
| - snprintf(card->dmi_longname + len, |
| - longname_buf_size - len, |
| - "-%s", board); |
| - |
| - len++; |
| - if (len < longname_buf_size) |
| - cleanup_dmi_name(card->dmi_longname + len); |
| + append_dmi_string(card, board); |
| } else if (!product) { |
| /* fall back to using legacy name */ |
| dev_warn(card->dev, "ASoC: no DMI board/product name!\n"); |
| @@ -1825,16 +1817,8 @@ int snd_soc_set_dmi_name(struct snd_soc_card *card, const char *flavour) |
| } |
| |
| /* Add flavour to dmi long name */ |
| - if (flavour) { |
| - len = strlen(card->dmi_longname); |
| - snprintf(card->dmi_longname + len, |
| - longname_buf_size - len, |
| - "-%s", flavour); |
| - |
| - len++; |
| - if (len < longname_buf_size) |
| - cleanup_dmi_name(card->dmi_longname + len); |
| - } |
| + if (flavour) |
| + append_dmi_string(card, flavour); |
| |
| /* set the card long name */ |
| card->long_name = card->dmi_longname; |
| -- |
| 2.24.1 |
| |
| From f51fdb4ea9b75970096dc818c7737b6c6d611483 Mon Sep 17 00:00:00 2001 |
| From: Jaroslav Kysela <perex@perex.cz> |
| Date: Wed, 20 Nov 2019 18:44:35 +0100 |
| Subject: [PATCH 092/109] ASoC: DMI long name - avoid to add board name if |
| matches with product name |
| |
| Current code: |
| |
| LENOVO-20QE000VMC-ThinkPadX1Carbon7th-20QE000VMC |
| |
| With the patch: |
| |
| LENOVO-20QE000VMC-ThinkPadX1Carbon7th |
| |
| Signed-off-by: Jaroslav Kysela <perex@perex.cz> |
| Link: https://lore.kernel.org/r/20191120174435.30920-2-perex@perex.cz |
| Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 39870b0dec68ed7dd814beb697e541670975c7d8) |
| Bugzilla: 1772498 |
| |
| sound/soc/soc-core.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c |
| index fbe641ef8ed7..f61e5b50a66f 100644 |
| |
| |
| @@ -1809,7 +1809,8 @@ int snd_soc_set_dmi_name(struct snd_soc_card *card, const char *flavour) |
| |
| board = dmi_get_system_info(DMI_BOARD_NAME); |
| if (board && is_dmi_valid(board)) { |
| - append_dmi_string(card, board); |
| + if (!product || strcasecmp(board, product)) |
| + append_dmi_string(card, board); |
| } else if (!product) { |
| /* fall back to using legacy name */ |
| dev_warn(card->dev, "ASoC: no DMI board/product name!\n"); |
| -- |
| 2.24.1 |
| |
| From 2cc756fee053d7a99a683ba0636ce2dc37ef164a Mon Sep 17 00:00:00 2001 |
| From: Jens Verwiebe <info@jensverwiebe.de> |
| Date: Sun, 24 Nov 2019 13:35:44 +0100 |
| Subject: [PATCH 093/109] ALSA: usb-audio: Fix Focusrite Scarlett 6i6 gen1 - |
| input handling |
| |
| The Scarlett 6i6 has no padding on rear inputs 3/4 but a gainstage. |
| This patch introduces this functionality as to be seen in the mac |
| or windows scarlett control. |
| |
| The correct address could already be found in the dump info, but was |
| never used. Without this patch inputs 3/4 are quite unusable else. |
| |
| Signed-off-by: Jens Verwiebe <info@jensverwiebe.de> |
| Link: https://lore.kernel.org/r/384d65cd-5e87-91eb-9fc3-e57226f534c6@jensverwiebe.de |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit bf2aa5cadd1c7bb91af4b5b1218e643cfffb5c9a) |
| Bugzilla: 1772498 |
| |
| sound/usb/mixer_scarlett.c | 23 +++++++++++++++++++++-- |
| 1 file changed, 21 insertions(+), 2 deletions(-) |
| |
| diff --git a/sound/usb/mixer_scarlett.c b/sound/usb/mixer_scarlett.c |
| index 83715fd8dfd6..9d10cbf1b5ed 100644 |
| |
| |
| @@ -142,6 +142,7 @@ enum { |
| SCARLETT_OUTPUTS, |
| SCARLETT_SWITCH_IMPEDANCE, |
| SCARLETT_SWITCH_PAD, |
| + SCARLETT_SWITCH_GAIN, |
| }; |
| |
| enum { |
| @@ -192,6 +193,15 @@ static const struct scarlett_mixer_elem_enum_info opt_pad = { |
| } |
| }; |
| |
| +static const struct scarlett_mixer_elem_enum_info opt_gain = { |
| + .start = 0, |
| + .len = 2, |
| + .offsets = {}, |
| + .names = (char const * const []){ |
| + "Lo", "Hi" |
| + } |
| +}; |
| + |
| static const struct scarlett_mixer_elem_enum_info opt_impedance = { |
| .start = 0, |
| .len = 2, |
| @@ -652,8 +662,8 @@ static struct scarlett_device_info s6i6_info = { |
| { .num = 1, .type = SCARLETT_SWITCH_PAD, .name = NULL}, |
| { .num = 2, .type = SCARLETT_SWITCH_IMPEDANCE, .name = NULL}, |
| { .num = 2, .type = SCARLETT_SWITCH_PAD, .name = NULL}, |
| - { .num = 3, .type = SCARLETT_SWITCH_PAD, .name = NULL}, |
| - { .num = 4, .type = SCARLETT_SWITCH_PAD, .name = NULL}, |
| + { .num = 3, .type = SCARLETT_SWITCH_GAIN, .name = NULL}, |
| + { .num = 4, .type = SCARLETT_SWITCH_GAIN, .name = NULL}, |
| }, |
| |
| .matrix_mux_init = { |
| @@ -883,6 +893,15 @@ static int scarlett_controls_create_generic(struct usb_mixer_interface *mixer, |
| if (err < 0) |
| return err; |
| break; |
| + case SCARLETT_SWITCH_GAIN: |
| + sprintf(mx, "Input %d Gain Switch", ctl->num); |
| + err = add_new_ctl(mixer, &usb_scarlett_ctl_enum, |
| + scarlett_ctl_enum_resume, 0x01, |
| + 0x08, ctl->num, USB_MIXER_S16, 1, mx, |
| + &opt_gain, &elem); |
| + if (err < 0) |
| + return err; |
| + break; |
| } |
| } |
| |
| -- |
| 2.24.1 |
| |
| From 217f33a7c631a8bfa8af1d3a3ddf448d614d2c33 Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 1 Nov 2019 12:09:14 -0500 |
| Subject: [PATCH 094/109] ASoC: SOF: topology: fix missing NULL pointer check |
| |
| Add check to avoid possible NULL pointer dereference issue. |
| |
| This issue was reported by static analysis tools, we didn't face this |
| issue but we can't rule it out either as a false positive. |
| |
| Reported-by: Keqiao Zhang <keqiao.zhang@intel.com> |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191101170916.26517-2-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 8cd73ce7ba6381feb9df763240dee3a6d4aff1ca) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/topology.c | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c |
| index 143b8259a70a..6096731e89ce 100644 |
| |
| |
| @@ -150,6 +150,11 @@ static int sof_keyword_dapm_event(struct snd_soc_dapm_widget *w, |
| |
| /* get runtime PCM params using widget's stream name */ |
| spcm = snd_sof_find_spcm_name(sdev, swidget->widget->sname); |
| + if (!spcm) { |
| + dev_err(sdev->dev, "error: cannot find PCM for %s\n", |
| + swidget->widget->name); |
| + return -EINVAL; |
| + } |
| |
| /* process events */ |
| switch (event) { |
| -- |
| 2.24.1 |
| |
| From 74dfe62b453b1472c56e3b2f9692394212e860e8 Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Fri, 1 Nov 2019 12:09:15 -0500 |
| Subject: [PATCH 095/109] ASoC: SOF: Intel: hda: set L1SEN on S0ix suspend |
| |
| Set L1SEN to make sure the system can enter S0ix, and restore it on |
| resume. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191101170916.26517-3-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 16299326a0cbbc88d4d6491a8ceebbfca81064c5) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/intel/hda-dsp.c | 15 +++++++++++++++ |
| sound/soc/sof/intel/hda.h | 3 +++ |
| 2 files changed, 18 insertions(+) |
| |
| diff --git a/sound/soc/sof/intel/hda-dsp.c b/sound/soc/sof/intel/hda-dsp.c |
| index 8cd5ecc01b62..4a4d318f97ff 100644 |
| |
| |
| @@ -478,9 +478,16 @@ static int hda_resume(struct snd_sof_dev *sdev, bool runtime_resume) |
| |
| int hda_dsp_resume(struct snd_sof_dev *sdev) |
| { |
| + struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; |
| struct pci_dev *pci = to_pci_dev(sdev->dev); |
| |
| if (sdev->s0_suspend) { |
| + /* restore L1SEN bit */ |
| + if (hda->l1_support_changed) |
| + snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR, |
| + HDA_VS_INTEL_EM2, |
| + HDA_VS_INTEL_EM2_L1SEN, 0); |
| + |
| /* restore and disable the system wakeup */ |
| pci_restore_state(pci); |
| disable_irq_wake(pci->irq); |
| @@ -518,11 +525,19 @@ int hda_dsp_runtime_suspend(struct snd_sof_dev *sdev) |
| |
| int hda_dsp_suspend(struct snd_sof_dev *sdev) |
| { |
| + struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; |
| struct hdac_bus *bus = sof_to_bus(sdev); |
| struct pci_dev *pci = to_pci_dev(sdev->dev); |
| int ret; |
| |
| if (sdev->s0_suspend) { |
| + /* enable L1SEN to make sure the system can enter S0Ix */ |
| + hda->l1_support_changed = |
| + snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR, |
| + HDA_VS_INTEL_EM2, |
| + HDA_VS_INTEL_EM2_L1SEN, |
| + HDA_VS_INTEL_EM2_L1SEN); |
| + |
| /* enable the system waking up via IPC IRQ */ |
| enable_irq_wake(pci->irq); |
| pci_save_state(pci); |
| diff --git a/sound/soc/sof/intel/hda.h b/sound/soc/sof/intel/hda.h |
| index 16376f55e420..50e037f2973f 100644 |
| |
| |
| @@ -408,6 +408,9 @@ struct sof_intel_hda_dev { |
| |
| int irq; |
| |
| + /* PM related */ |
| + bool l1_support_changed;/* during suspend, is L1SEN changed or not */ |
| + |
| /* DMIC device */ |
| struct platform_device *dmic_dev; |
| }; |
| -- |
| 2.24.1 |
| |
| From 9298cb2df525d2f7e42fe14a257a2ae758302559 Mon Sep 17 00:00:00 2001 |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Date: Mon, 11 Nov 2019 16:29:01 -0600 |
| Subject: [PATCH 096/109] ASoC: SOF: Intel: hda: use fallback for firmware name |
| |
| We have platforms such as CFL with no known I2S codec being used, and |
| the ACPI tables are currently empty, so fall-back to using the |
| firmware filename used in nocodec mode |
| |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191111222901.19892-4-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 0af237d51a4e734db959a158185f79019f022f59) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/intel/hda.c | 11 +++++++++-- |
| 1 file changed, 9 insertions(+), 2 deletions(-) |
| |
| diff --git a/sound/soc/sof/intel/hda.c b/sound/soc/sof/intel/hda.c |
| index ff3fa8670fd8..78c3de74c401 100644 |
| |
| |
| @@ -410,9 +410,16 @@ static int hda_init_caps(struct snd_sof_dev *sdev) |
| pdata->tplg_filename = |
| hda_mach->sof_tplg_filename; |
| |
| - /* firmware: pick the first in machine list */ |
| + /* |
| + * firmware: pick the first in machine list, |
| + * or use nocodec firmware name if list is empty |
| + */ |
| mach = pdata->desc->machines; |
| - pdata->fw_filename = mach->sof_fw_filename; |
| + if (mach->id[0]) |
| + pdata->fw_filename = mach->sof_fw_filename; |
| + else |
| + pdata->fw_filename = |
| + pdata->desc->nocodec_fw_filename; |
| |
| dev_info(bus->dev, "using HDA machine driver %s now\n", |
| hda_mach->drv_name); |
| -- |
| 2.24.1 |
| |
| From d4d3a9762c6ef736427a427f40dac50f8e17f625 Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Mon, 11 Nov 2019 16:33:40 -0600 |
| Subject: [PATCH 097/109] ASoC: SOF: PM: add state machine to comments |
| |
| Add Audio DSP state machine with comments. Note that the |
| 'D0<-->runtime D0I3' part is not implemented yet. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191111223343.19986-2-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 74b4dd04b19cc03e1cc369d9c371cf4206367df4) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/pm.c | 32 ++++++++++++++++++++++++++++++++ |
| 1 file changed, 32 insertions(+) |
| |
| diff --git a/sound/soc/sof/pm.c b/sound/soc/sof/pm.c |
| index 4f8db8367d0a..420615dff5ae 100644 |
| |
| |
| @@ -451,6 +451,38 @@ int snd_sof_set_d0_substate(struct snd_sof_dev *sdev, |
| } |
| EXPORT_SYMBOL(snd_sof_set_d0_substate); |
| |
| +/* |
| + * Audio DSP states may transform as below:- |
| + * |
| + * D0I3 compatible stream |
| + * Runtime +---------------------+ opened only, timeout |
| + * suspend | +--------------------+ |
| + * +------------+ D0(active) | | |
| + * | | <---------------+ | |
| + * | +--------> | | | |
| + * | |Runtime +--^--+---------^--+--+ The last | | |
| + * | |resume | | | | opened D0I3 | | |
| + * | | | | | | compatible | | |
| + * | | resume| | | | stream closed | | |
| + * | | from | | D3 | | | | |
| + * | | D3 | |suspend | | d0i3 | | |
| + * | | | | | |suspend | | |
| + * | | | | | | | | |
| + * | | | | | | | | |
| + * +-v---+-----------+--v-------+ | | +------+----v----+ |
| + * | | | +-----------> | |
| + * | D3 (suspended) | | | D0I3 +-----+ |
| + * | | +--------------+ | | |
| + * | | resume from | | | |
| + * +-------------------^--------+ d0i3 suspend +----------------+ | |
| + * | | |
| + * | D3 suspend | |
| + * +------------------------------------------------+ |
| + * |
| + * d0i3_suspend = s0_suspend && D0I3 stream opened, |
| + * D3 suspend = !d0i3_suspend, |
| + */ |
| + |
| int snd_sof_resume(struct device *dev) |
| { |
| struct snd_sof_dev *sdev = dev_get_drvdata(dev); |
| -- |
| 2.24.1 |
| |
| From 2ce44c4ffc5b1ee7b84d53f5d18eefe35a06092d Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Mon, 11 Nov 2019 16:33:41 -0600 |
| Subject: [PATCH 098/109] ASoC: SOF: PM: add check before setting d0_substate |
| |
| Add check before seeting d0_substate and return success if Audio DSP is |
| already in the target substate. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191111223343.19986-3-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 58a972efd21bb5adadd97f2546693ec64bfc99b9) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/pm.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| diff --git a/sound/soc/sof/pm.c b/sound/soc/sof/pm.c |
| index 420615dff5ae..ff966d004692 100644 |
| |
| |
| @@ -439,6 +439,9 @@ int snd_sof_set_d0_substate(struct snd_sof_dev *sdev, |
| { |
| int ret; |
| |
| + if (sdev->d0_substate == d0_substate) |
| + return 0; |
| + |
| /* do platform specific set_state */ |
| ret = snd_sof_dsp_set_power_state(sdev, d0_substate); |
| if (ret < 0) |
| -- |
| 2.24.1 |
| |
| From 2dbd8810f4d48ed09aa2be1e53f50fac7045ebc2 Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Mon, 11 Nov 2019 16:33:42 -0600 |
| Subject: [PATCH 099/109] ASoC: SOF: add helper to check if we should enter |
| d0i3 suspend |
| |
| Add helper to check if the DSP should be put in D0i3. This function |
| returns true if a stream has ignored the SUSPEND trigger to keep the |
| pipelines running in the DSP. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191111223343.19986-4-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit a77e5d573f847d2f984c38eb711351326bc55258) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/core.c | 13 +++++++++++++ |
| sound/soc/sof/sof-priv.h | 2 ++ |
| 2 files changed, 15 insertions(+) |
| |
| diff --git a/sound/soc/sof/core.c b/sound/soc/sof/core.c |
| index d6b827de26d4..a06a54f423dd 100644 |
| |
| |
| @@ -132,6 +132,19 @@ struct snd_sof_dai *snd_sof_find_dai(struct snd_sof_dev *sdev, |
| return NULL; |
| } |
| |
| +bool snd_sof_dsp_d0i3_on_suspend(struct snd_sof_dev *sdev) |
| +{ |
| + struct snd_sof_pcm *spcm; |
| + |
| + list_for_each_entry(spcm, &sdev->pcm_list, list) { |
| + if (spcm->stream[SNDRV_PCM_STREAM_PLAYBACK].suspend_ignored || |
| + spcm->stream[SNDRV_PCM_STREAM_CAPTURE].suspend_ignored) |
| + return true; |
| + } |
| + |
| + return false; |
| +} |
| + |
| /* |
| * FW Panic/fault handling. |
| */ |
| diff --git a/sound/soc/sof/sof-priv.h b/sound/soc/sof/sof-priv.h |
| index 9bded2e48fba..59cc711e99ff 100644 |
| |
| |
| @@ -562,6 +562,8 @@ struct snd_sof_pcm *snd_sof_find_spcm_dai(struct snd_sof_dev *sdev, |
| return NULL; |
| } |
| |
| +bool snd_sof_dsp_d0i3_on_suspend(struct snd_sof_dev *sdev); |
| + |
| struct snd_sof_pcm *snd_sof_find_spcm_name(struct snd_sof_dev *sdev, |
| const char *name); |
| struct snd_sof_pcm *snd_sof_find_spcm_comp(struct snd_sof_dev *sdev, |
| -- |
| 2.24.1 |
| |
| From 156227215cacd87bfdeaa27ead855ff2310c1a9d Mon Sep 17 00:00:00 2001 |
| From: Keyon Jie <yang.jie@linux.intel.com> |
| Date: Mon, 11 Nov 2019 16:33:43 -0600 |
| Subject: [PATCH 100/109] ASoC: SOF: PM: only suspend to D0I3 when needed |
| |
| We should suspend audio to D3 by default, for the sake of power saving, |
| change the condition of D0I3 suspending here to that when there is |
| stream with suspend_ignored specified. |
| |
| Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191111223343.19986-5-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 5e35d5f4224adb24c2bfa814b9fb562050aba3ea) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/pm.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/sound/soc/sof/pm.c b/sound/soc/sof/pm.c |
| index ff966d004692..bc09cb5f458b 100644 |
| |
| |
| @@ -491,7 +491,7 @@ int snd_sof_resume(struct device *dev) |
| struct snd_sof_dev *sdev = dev_get_drvdata(dev); |
| int ret; |
| |
| - if (sdev->s0_suspend) { |
| + if (snd_sof_dsp_d0i3_on_suspend(sdev)) { |
| /* resume from D0I3 */ |
| dev_dbg(sdev->dev, "DSP will exit from D0i3...\n"); |
| ret = snd_sof_set_d0_substate(sdev, SOF_DSP_D0I0); |
| @@ -520,7 +520,7 @@ int snd_sof_suspend(struct device *dev) |
| struct snd_sof_dev *sdev = dev_get_drvdata(dev); |
| int ret; |
| |
| - if (sdev->s0_suspend) { |
| + if (snd_sof_dsp_d0i3_on_suspend(sdev)) { |
| /* suspend to D0i3 */ |
| dev_dbg(sdev->dev, "DSP is trying to enter D0i3...\n"); |
| ret = snd_sof_set_d0_substate(sdev, SOF_DSP_D0I3); |
| -- |
| 2.24.1 |
| |
| From 39aa2d2215c31b1b9f6c3e77d00702c9dfa5e66d Mon Sep 17 00:00:00 2001 |
| From: Dragos Tarcatu <dragos_tarcatu@mentor.com> |
| Date: Mon, 11 Nov 2019 16:20:38 -0600 |
| Subject: [PATCH 101/109] ASoC: SOF: topology: free kcontrol memory on error |
| |
| The volume and bytes kcontrols are currently not freeing their |
| memory on initialization failures. When an error occurs, all the |
| widgets loaded so far are unloaded via sof_widget_unload(). |
| But this only happens for the widgets that got successfully loaded. |
| |
| Fix that by kfree()-ing the allocated memory on load error. |
| |
| Fixes: 311ce4fe7637d ("ASoC: SOF: Add support for loading topologies") |
| Reviewed-by: Paul Olaru <paul.olaru@nxp.com> |
| Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> |
| Signed-off-by: Dragos Tarcatu <dragos_tarcatu@mentor.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191111222039.19651-1-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 1b4efdaf6d6053c8944cee0edba0969dc1be7d4b) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/topology.c | 67 +++++++++++++++++++++++++++++----------- |
| 1 file changed, 49 insertions(+), 18 deletions(-) |
| |
| diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c |
| index 6096731e89ce..d82ab981e840 100644 |
| |
| |
| @@ -942,18 +942,22 @@ static int sof_control_load_volume(struct snd_soc_component *scomp, |
| struct sof_ipc_ctrl_data *cdata; |
| int tlv[TLV_ITEMS]; |
| unsigned int i; |
| - int ret; |
| + int ret = 0; |
| |
| /* validate topology data */ |
| - if (le32_to_cpu(mc->num_channels) > SND_SOC_TPLG_MAX_CHAN) |
| - return -EINVAL; |
| + if (le32_to_cpu(mc->num_channels) > SND_SOC_TPLG_MAX_CHAN) { |
| + ret = -EINVAL; |
| + goto out; |
| + } |
| |
| /* init the volume get/put data */ |
| scontrol->size = struct_size(scontrol->control_data, chanv, |
| le32_to_cpu(mc->num_channels)); |
| scontrol->control_data = kzalloc(scontrol->size, GFP_KERNEL); |
| - if (!scontrol->control_data) |
| - return -ENOMEM; |
| + if (!scontrol->control_data) { |
| + ret = -ENOMEM; |
| + goto out; |
| + } |
| |
| scontrol->comp_id = sdev->next_comp_id; |
| scontrol->min_volume_step = le32_to_cpu(mc->min); |
| @@ -963,7 +967,7 @@ static int sof_control_load_volume(struct snd_soc_component *scomp, |
| /* set cmd for mixer control */ |
| if (le32_to_cpu(mc->max) == 1) { |
| scontrol->cmd = SOF_CTRL_CMD_SWITCH; |
| - goto out; |
| + goto skip; |
| } |
| |
| scontrol->cmd = SOF_CTRL_CMD_VOLUME; |
| @@ -971,14 +975,15 @@ static int sof_control_load_volume(struct snd_soc_component *scomp, |
| /* extract tlv data */ |
| if (get_tlv_data(kc->tlv.p, tlv) < 0) { |
| dev_err(sdev->dev, "error: invalid TLV data\n"); |
| - return -EINVAL; |
| + ret = -EINVAL; |
| + goto out_free; |
| } |
| |
| /* set up volume table */ |
| ret = set_up_volume_table(scontrol, tlv, le32_to_cpu(mc->max) + 1); |
| if (ret < 0) { |
| dev_err(sdev->dev, "error: setting up volume table\n"); |
| - return ret; |
| + goto out_free; |
| } |
| |
| /* set default volume values to 0dB in control */ |
| @@ -988,7 +993,7 @@ static int sof_control_load_volume(struct snd_soc_component *scomp, |
| cdata->chanv[i].value = VOL_ZERO_DB; |
| } |
| |
| -out: |
| +skip: |
| /* set up possible led control from mixer private data */ |
| ret = sof_parse_tokens(scomp, &scontrol->led_ctl, led_tokens, |
| ARRAY_SIZE(led_tokens), mc->priv.array, |
| @@ -996,13 +1001,21 @@ static int sof_control_load_volume(struct snd_soc_component *scomp, |
| if (ret != 0) { |
| dev_err(sdev->dev, "error: parse led tokens failed %d\n", |
| le32_to_cpu(mc->priv.size)); |
| - return ret; |
| + goto out_free_table; |
| } |
| |
| dev_dbg(sdev->dev, "tplg: load kcontrol index %d chans %d\n", |
| scontrol->comp_id, scontrol->num_channels); |
| |
| - return 0; |
| + return ret; |
| + |
| +out_free_table: |
| + if (le32_to_cpu(mc->max) > 1) |
| + kfree(scontrol->volume_table); |
| +out_free: |
| + kfree(scontrol->control_data); |
| +out: |
| + return ret; |
| } |
| |
| static int sof_control_load_enum(struct snd_soc_component *scomp, |
| @@ -1047,6 +1060,7 @@ static int sof_control_load_bytes(struct snd_soc_component *scomp, |
| container_of(hdr, struct snd_soc_tplg_bytes_control, hdr); |
| struct soc_bytes_ext *sbe = (struct soc_bytes_ext *)kc->private_value; |
| int max_size = sbe->max; |
| + int ret = 0; |
| |
| /* init the get/put bytes data */ |
| scontrol->size = sizeof(struct sof_ipc_ctrl_data) + |
| @@ -1055,13 +1069,16 @@ static int sof_control_load_bytes(struct snd_soc_component *scomp, |
| if (scontrol->size > max_size) { |
| dev_err(sdev->dev, "err: bytes data size %d exceeds max %d.\n", |
| scontrol->size, max_size); |
| - return -EINVAL; |
| + ret = -EINVAL; |
| + goto out; |
| } |
| |
| scontrol->control_data = kzalloc(max_size, GFP_KERNEL); |
| cdata = scontrol->control_data; |
| - if (!scontrol->control_data) |
| - return -ENOMEM; |
| + if (!scontrol->control_data) { |
| + ret = -ENOMEM; |
| + goto out; |
| + } |
| |
| scontrol->comp_id = sdev->next_comp_id; |
| scontrol->cmd = SOF_CTRL_CMD_BINARY; |
| @@ -1076,23 +1093,32 @@ static int sof_control_load_bytes(struct snd_soc_component *scomp, |
| if (cdata->data->magic != SOF_ABI_MAGIC) { |
| dev_err(sdev->dev, "error: Wrong ABI magic 0x%08x.\n", |
| cdata->data->magic); |
| - return -EINVAL; |
| + ret = -EINVAL; |
| + goto out_free; |
| } |
| if (SOF_ABI_VERSION_INCOMPATIBLE(SOF_ABI_VERSION, |
| cdata->data->abi)) { |
| dev_err(sdev->dev, |
| "error: Incompatible ABI version 0x%08x.\n", |
| cdata->data->abi); |
| - return -EINVAL; |
| + ret = -EINVAL; |
| + goto out_free; |
| } |
| if (cdata->data->size + sizeof(const struct sof_abi_hdr) != |
| le32_to_cpu(control->priv.size)) { |
| dev_err(sdev->dev, |
| "error: Conflict in bytes vs. priv size.\n"); |
| - return -EINVAL; |
| + ret = -EINVAL; |
| + goto out_free; |
| } |
| } |
| - return 0; |
| + |
| + return ret; |
| + |
| +out_free: |
| + kfree(scontrol->control_data); |
| +out: |
| + return ret; |
| } |
| |
| /* external kcontrol init - used for any driver specific init */ |
| @@ -1150,6 +1176,11 @@ static int sof_control_load(struct snd_soc_component *scomp, int index, |
| return 0; |
| } |
| |
| + if (ret < 0) { |
| + kfree(scontrol); |
| + return ret; |
| + } |
| + |
| dobj->private = scontrol; |
| list_add(&scontrol->list, &sdev->kcontrol_list); |
| return ret; |
| -- |
| 2.24.1 |
| |
| From 88ecf253337ee8d8f0418e68af64d3dba6df27c1 Mon Sep 17 00:00:00 2001 |
| From: Liam Girdwood <liam.r.girdwood@linux.intel.com> |
| Date: Mon, 11 Nov 2019 16:29:00 -0600 |
| Subject: [PATCH 102/109] ASoC: SOF: Intel: Fix CFL and CML FW nocodec binary |
| names. |
| |
| The manifest information is different between CNL, CML and CFL platforms |
| hence we need to load different files. |
| |
| Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191111222901.19892-3-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 653c28afa76b45c570370c3c3a89975c68c5fc8e) |
| Bugzilla: 1772498 |
| |
| sound/soc/sof/sof-pci-dev.c | 8 ++++---- |
| 1 file changed, 4 insertions(+), 4 deletions(-) |
| |
| diff --git a/sound/soc/sof/sof-pci-dev.c b/sound/soc/sof/sof-pci-dev.c |
| index 3b58b91e7b9e..bbeffd932de7 100644 |
| |
| |
| @@ -120,7 +120,7 @@ static const struct sof_dev_desc cnl_desc = { |
| |
| #if IS_ENABLED(CONFIG_SND_SOC_SOF_COFFEELAKE) |
| static const struct sof_dev_desc cfl_desc = { |
| - .machines = snd_soc_acpi_intel_cnl_machines, |
| + .machines = snd_soc_acpi_intel_cfl_machines, |
| .resindex_lpe_base = 0, |
| .resindex_pcicfg_base = -1, |
| .resindex_imr_base = -1, |
| @@ -129,7 +129,7 @@ static const struct sof_dev_desc cfl_desc = { |
| .chip_info = &cnl_chip_info, |
| .default_fw_path = "intel/sof", |
| .default_tplg_path = "intel/sof-tplg", |
| - .nocodec_fw_filename = "sof-cnl.ri", |
| + .nocodec_fw_filename = "sof-cfl.ri", |
| .nocodec_tplg_filename = "sof-cnl-nocodec.tplg", |
| .ops = &sof_cnl_ops, |
| .arch_ops = &sof_xtensa_arch_ops |
| @@ -140,7 +140,7 @@ static const struct sof_dev_desc cfl_desc = { |
| IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_H) |
| |
| static const struct sof_dev_desc cml_desc = { |
| - .machines = snd_soc_acpi_intel_cnl_machines, |
| + .machines = snd_soc_acpi_intel_cml_machines, |
| .resindex_lpe_base = 0, |
| .resindex_pcicfg_base = -1, |
| .resindex_imr_base = -1, |
| @@ -149,7 +149,7 @@ static const struct sof_dev_desc cml_desc = { |
| .chip_info = &cnl_chip_info, |
| .default_fw_path = "intel/sof", |
| .default_tplg_path = "intel/sof-tplg", |
| - .nocodec_fw_filename = "sof-cnl.ri", |
| + .nocodec_fw_filename = "sof-cml.ri", |
| .nocodec_tplg_filename = "sof-cnl-nocodec.tplg", |
| .ops = &sof_cnl_ops, |
| .arch_ops = &sof_xtensa_arch_ops |
| -- |
| 2.24.1 |
| |
| From 64f7bbb57783645861b9d05d5f54c590e70f58ab Mon Sep 17 00:00:00 2001 |
| From: Krzysztof Kozlowski <krzk@kernel.org> |
| Date: Wed, 20 Nov 2019 21:32:52 +0800 |
| Subject: [PATCH 103/109] ASoC: Fix Kconfig indentation |
| |
| Adjust indentation from spaces to tab (+optional two spaces) as in |
| coding style with command like: |
| $ sed -e 's/^ /\t/' -i */Kconfig |
| |
| Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org> |
| Acked-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191120133252.6365-1-krzk@kernel.org |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 3efd72330543da44e82e9371dfb639802c886f6c) |
| Bugzilla: 1772498 |
| |
| sound/soc/intel/boards/Kconfig | 24 ++++++++++++------------ |
| sound/soc/sof/intel/Kconfig | 10 +++++----- |
| 2 files changed, 17 insertions(+), 17 deletions(-) |
| |
| diff --git a/sound/soc/intel/boards/Kconfig b/sound/soc/intel/boards/Kconfig |
| index 2702aefee775..ef20316e83d1 100644 |
| |
| |
| @@ -441,18 +441,18 @@ config SND_SOC_INTEL_CML_LP_DA7219_MAX98357A_MACH |
| If unsure select "N". |
| |
| config SND_SOC_INTEL_SOF_CML_RT1011_RT5682_MACH |
| - tristate "CML with RT1011 and RT5682 in I2S Mode" |
| - depends on I2C && ACPI |
| - depends on MFD_INTEL_LPSS || COMPILE_TEST |
| - select SND_SOC_RT1011 |
| - select SND_SOC_RT5682 |
| - select SND_SOC_DMIC |
| - select SND_SOC_HDAC_HDMI |
| - help |
| - This adds support for ASoC machine driver for SOF platform with |
| - RT1011 + RT5682 I2S codec. |
| - Say Y if you have such a device. |
| - If unsure select "N". |
| + tristate "CML with RT1011 and RT5682 in I2S Mode" |
| + depends on I2C && ACPI |
| + depends on MFD_INTEL_LPSS || COMPILE_TEST |
| + select SND_SOC_RT1011 |
| + select SND_SOC_RT5682 |
| + select SND_SOC_DMIC |
| + select SND_SOC_HDAC_HDMI |
| + help |
| + This adds support for ASoC machine driver for SOF platform with |
| + RT1011 + RT5682 I2S codec. |
| + Say Y if you have such a device. |
| + If unsure select "N". |
| |
| endif ## SND_SOC_SOF_COMETLAKE_LP && SND_SOC_SOF_HDA_LINK |
| |
| diff --git a/sound/soc/sof/intel/Kconfig b/sound/soc/sof/intel/Kconfig |
| index c263a8feff0a..0db92d81ea85 100644 |
| |
| |
| @@ -264,16 +264,16 @@ config SND_SOC_SOF_ELKHARTLAKE |
| config SND_SOC_SOF_JASPERLAKE_SUPPORT |
| bool "SOF support for JasperLake" |
| help |
| - This adds support for Sound Open Firmware for Intel(R) platforms |
| - using the JasperLake processors. |
| - Say Y if you have such a device. |
| - If unsure select "N". |
| + This adds support for Sound Open Firmware for Intel(R) platforms |
| + using the JasperLake processors. |
| + Say Y if you have such a device. |
| + If unsure select "N". |
| |
| config SND_SOC_SOF_JASPERLAKE |
| tristate |
| select SND_SOC_SOF_HDA_COMMON |
| help |
| - This option is not user-selectable but automagically handled by |
| + This option is not user-selectable but automagically handled by |
| 'select' statements at a higher level |
| |
| config SND_SOC_SOF_HDA_COMMON |
| -- |
| 2.24.1 |
| |
| From 07dfab3db6e4005c03903fe59c272da69678c40a Mon Sep 17 00:00:00 2001 |
| From: Ben Zhang <benzh@chromium.org> |
| Date: Tue, 5 Nov 2019 17:13:27 -0800 |
| Subject: [PATCH 104/109] ASoC: bdw-rt5677: Add a DAI link for rt5677 SPI PCM |
| device |
| |
| This link is needed for the RT5677 DSP to do hotwording |
| |
| Signed-off-by: Ben Zhang <benzh@chromium.org> |
| Signed-off-by: Curtis Malainey <cujomalainey@chromium.org> |
| Link: https://lore.kernel.org/r/20191106011335.223061-3-cujomalainey@chromium.org |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 157b006f6be46be833b2941856b86e0a9d8bfb0e) |
| Bugzilla: 1772498 |
| |
| sound/soc/intel/boards/bdw-rt5677.c | 14 ++++++++++++++ |
| 1 file changed, 14 insertions(+) |
| |
| diff --git a/sound/soc/intel/boards/bdw-rt5677.c b/sound/soc/intel/boards/bdw-rt5677.c |
| index 4a4d3353e26d..eeb9a11e4e14 100644 |
| |
| |
| @@ -74,6 +74,7 @@ static const struct snd_soc_dapm_route bdw_rt5677_map[] = { |
| /* CODEC BE connections */ |
| {"SSP0 CODEC IN", NULL, "AIF1 Capture"}, |
| {"AIF1 Playback", NULL, "SSP0 CODEC OUT"}, |
| + {"DSP Capture", NULL, "DSP Buffer"}, |
| }; |
| |
| static const struct snd_kcontrol_new bdw_rt5677_controls[] = { |
| @@ -258,6 +259,12 @@ SND_SOC_DAILINK_DEF(platform, |
| SND_SOC_DAILINK_DEF(be, |
| DAILINK_COMP_ARRAY(COMP_CODEC("i2c-RT5677CE:00", "rt5677-aif1"))); |
| |
| +/* Wake on voice interface */ |
| +SND_SOC_DAILINK_DEFS(dsp, |
| + DAILINK_COMP_ARRAY(COMP_CPU("spi-RT5677AA:00")), |
| + DAILINK_COMP_ARRAY(COMP_CODEC("i2c-RT5677CE:00", "rt5677-dspbuffer")), |
| + DAILINK_COMP_ARRAY(COMP_PLATFORM("spi-RT5677AA:00"))); |
| + |
| static struct snd_soc_dai_link bdw_rt5677_dais[] = { |
| /* Front End DAI links */ |
| { |
| @@ -276,6 +283,13 @@ static struct snd_soc_dai_link bdw_rt5677_dais[] = { |
| SND_SOC_DAILINK_REG(fe, dummy, platform), |
| }, |
| |
| + /* Non-DPCM links */ |
| + { |
| + .name = "Codec DSP", |
| + .stream_name = "Wake on Voice", |
| + SND_SOC_DAILINK_REG(dsp), |
| + }, |
| + |
| /* Back End DAI links */ |
| { |
| /* SSP0 - Codec */ |
| -- |
| 2.24.1 |
| |
| From a21e2d41236808ea4fb355aaff8bb4012d539779 Mon Sep 17 00:00:00 2001 |
| From: Curtis Malainey <cujomalainey@chromium.org> |
| Date: Tue, 5 Nov 2019 17:13:34 -0800 |
| Subject: [PATCH 105/109] ASoC: bdw-rt5677: Turn on MCLK1 for DSP via DAPM |
| |
| The RT5677 DSP needs the I2S MCLK1 to run its DSP. Add a dapm route to |
| SSP0 CODEC IN so the clock is turned on automatically when the DSP is |
| turned on. |
| |
| Signed-off-by: Curtis Malainey <cujomalainey@chromium.org> |
| Link: https://lore.kernel.org/r/20191106011335.223061-10-cujomalainey@chromium.org |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 55229597a94531726878229ccfcd3fe4ec572dc3) |
| Bugzilla: 1772498 |
| |
| sound/soc/intel/boards/bdw-rt5677.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| diff --git a/sound/soc/intel/boards/bdw-rt5677.c b/sound/soc/intel/boards/bdw-rt5677.c |
| index eeb9a11e4e14..b2475e3eff7b 100644 |
| |
| |
| @@ -75,6 +75,10 @@ static const struct snd_soc_dapm_route bdw_rt5677_map[] = { |
| {"SSP0 CODEC IN", NULL, "AIF1 Capture"}, |
| {"AIF1 Playback", NULL, "SSP0 CODEC OUT"}, |
| {"DSP Capture", NULL, "DSP Buffer"}, |
| + |
| + /* DSP Clock Connections */ |
| + { "DSP Buffer", NULL, "SSP0 CODEC IN" }, |
| + { "SSP0 CODEC IN", NULL, "DSPTX" }, |
| }; |
| |
| static const struct snd_kcontrol_new bdw_rt5677_controls[] = { |
| -- |
| 2.24.1 |
| |
| From 71fffb28eefd175b6b84026a2d0f5fb79996f84b Mon Sep 17 00:00:00 2001 |
| From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Date: Mon, 11 Nov 2019 16:28:59 -0600 |
| Subject: [PATCH 106/109] ASoC: Intel: acpi-match: split CNL tables in three |
| |
| Due to firmware manifest/signature differences, we have to use |
| different firmware names, so split CNL machine table in three (CNL, |
| CFL, CML). |
| |
| The CFL table is currently empty since all known platforms use |
| HDaudio, but let's plan ahead. |
| |
| Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> |
| Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20191111222901.19892-2-pierre-louis.bossart@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 1f24d93c4f4ec0bb0b73c5b020060aa2d9faa756) |
| Bugzilla: 1772498 |
| |
| include/sound/soc-acpi-intel-match.h | 2 + |
| sound/soc/intel/common/Makefile | 3 +- |
| .../intel/common/soc-acpi-intel-cfl-match.c | 18 ++++++ |
| .../intel/common/soc-acpi-intel-cml-match.c | 56 +++++++++++++++++++ |
| .../intel/common/soc-acpi-intel-cnl-match.c | 38 ------------- |
| 5 files changed, 78 insertions(+), 39 deletions(-) |
| create mode 100644 sound/soc/intel/common/soc-acpi-intel-cfl-match.c |
| create mode 100644 sound/soc/intel/common/soc-acpi-intel-cml-match.c |
| |
| diff --git a/include/sound/soc-acpi-intel-match.h b/include/sound/soc-acpi-intel-match.h |
| index 4e44782862df..20c0bee3b959 100644 |
| |
| |
| @@ -24,6 +24,8 @@ extern struct snd_soc_acpi_mach snd_soc_acpi_intel_kbl_machines[]; |
| extern struct snd_soc_acpi_mach snd_soc_acpi_intel_bxt_machines[]; |
| extern struct snd_soc_acpi_mach snd_soc_acpi_intel_glk_machines[]; |
| extern struct snd_soc_acpi_mach snd_soc_acpi_intel_cnl_machines[]; |
| +extern struct snd_soc_acpi_mach snd_soc_acpi_intel_cfl_machines[]; |
| +extern struct snd_soc_acpi_mach snd_soc_acpi_intel_cml_machines[]; |
| extern struct snd_soc_acpi_mach snd_soc_acpi_intel_icl_machines[]; |
| extern struct snd_soc_acpi_mach snd_soc_acpi_intel_tgl_machines[]; |
| extern struct snd_soc_acpi_mach snd_soc_acpi_intel_ehl_machines[]; |
| diff --git a/sound/soc/intel/common/Makefile b/sound/soc/intel/common/Makefile |
| index eafe95ead49b..bd352878f89a 100644 |
| |
| |
| @@ -7,7 +7,8 @@ snd-soc-acpi-intel-match-objs := soc-acpi-intel-byt-match.o soc-acpi-intel-cht-m |
| soc-acpi-intel-hsw-bdw-match.o \ |
| soc-acpi-intel-skl-match.o soc-acpi-intel-kbl-match.o \ |
| soc-acpi-intel-bxt-match.o soc-acpi-intel-glk-match.o \ |
| - soc-acpi-intel-cnl-match.o soc-acpi-intel-icl-match.o \ |
| + soc-acpi-intel-cnl-match.o soc-acpi-intel-cfl-match.o \ |
| + soc-acpi-intel-cml-match.o soc-acpi-intel-icl-match.o \ |
| soc-acpi-intel-tgl-match.o soc-acpi-intel-ehl-match.o \ |
| soc-acpi-intel-jsl-match.o \ |
| soc-acpi-intel-hda-match.o |
| diff --git a/sound/soc/intel/common/soc-acpi-intel-cfl-match.c b/sound/soc/intel/common/soc-acpi-intel-cfl-match.c |
| new file mode 100644 |
| index 000000000000..d6fd2026d0b8 |
| |
| |
| @@ -0,0 +1,18 @@ |
| +// SPDX-License-Identifier: GPL-2.0 |
| +/* |
| + * soc-apci-intel-cfl-match.c - tables and support for CFL ACPI enumeration. |
| + * |
| + * Copyright (c) 2019, Intel Corporation. |
| + * |
| + */ |
| + |
| +#include <sound/soc-acpi.h> |
| +#include <sound/soc-acpi-intel-match.h> |
| + |
| +struct snd_soc_acpi_mach snd_soc_acpi_intel_cfl_machines[] = { |
| + {}, |
| +}; |
| +EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_cfl_machines); |
| + |
| +MODULE_LICENSE("GPL v2"); |
| +MODULE_DESCRIPTION("Intel Common ACPI Match module"); |
| diff --git a/sound/soc/intel/common/soc-acpi-intel-cml-match.c b/sound/soc/intel/common/soc-acpi-intel-cml-match.c |
| new file mode 100644 |
| index 000000000000..5d08ae066738 |
| |
| |
| @@ -0,0 +1,56 @@ |
| +// SPDX-License-Identifier: GPL-2.0 |
| +/* |
| + * soc-acpi-intel-cml-match.c - tables and support for CML ACPI enumeration. |
| + * |
| + * Copyright (c) 2019, Intel Corporation. |
| + * |
| + */ |
| + |
| +#include <sound/soc-acpi.h> |
| +#include <sound/soc-acpi-intel-match.h> |
| + |
| +static struct snd_soc_acpi_codecs cml_codecs = { |
| + .num_codecs = 1, |
| + .codecs = {"10EC5682"} |
| +}; |
| + |
| +static struct snd_soc_acpi_codecs cml_spk_codecs = { |
| + .num_codecs = 1, |
| + .codecs = {"MX98357A"} |
| +}; |
| + |
| +struct snd_soc_acpi_mach snd_soc_acpi_intel_cml_machines[] = { |
| + { |
| + .id = "DLGS7219", |
| + .drv_name = "cml_da7219_max98357a", |
| + .quirk_data = &cml_spk_codecs, |
| + .sof_fw_filename = "sof-cml.ri", |
| + .sof_tplg_filename = "sof-cml-da7219-max98357a.tplg", |
| + }, |
| + { |
| + .id = "MX98357A", |
| + .drv_name = "sof_rt5682", |
| + .quirk_data = &cml_codecs, |
| + .sof_fw_filename = "sof-cml.ri", |
| + .sof_tplg_filename = "sof-cml-rt5682-max98357a.tplg", |
| + }, |
| + { |
| + .id = "10EC1011", |
| + .drv_name = "cml_rt1011_rt5682", |
| + .quirk_data = &cml_codecs, |
| + .sof_fw_filename = "sof-cml.ri", |
| + .sof_tplg_filename = "sof-cml-rt1011-rt5682.tplg", |
| + }, |
| + { |
| + .id = "10EC5682", |
| + .drv_name = "sof_rt5682", |
| + .sof_fw_filename = "sof-cml.ri", |
| + .sof_tplg_filename = "sof-cml-rt5682.tplg", |
| + }, |
| + |
| + {}, |
| +}; |
| +EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_cml_machines); |
| + |
| +MODULE_LICENSE("GPL v2"); |
| +MODULE_DESCRIPTION("Intel Common ACPI Match module"); |
| diff --git a/sound/soc/intel/common/soc-acpi-intel-cnl-match.c b/sound/soc/intel/common/soc-acpi-intel-cnl-match.c |
| index 16d0bae8b316..27588841c8b0 100644 |
| |
| |
| @@ -14,16 +14,6 @@ static struct skl_machine_pdata cnl_pdata = { |
| .use_tplg_pcm = true, |
| }; |
| |
| -static struct snd_soc_acpi_codecs cml_codecs = { |
| - .num_codecs = 1, |
| - .codecs = {"10EC5682"} |
| -}; |
| - |
| -static struct snd_soc_acpi_codecs cml_spk_codecs = { |
| - .num_codecs = 1, |
| - .codecs = {"MX98357A"} |
| -}; |
| - |
| struct snd_soc_acpi_mach snd_soc_acpi_intel_cnl_machines[] = { |
| { |
| .id = "INT34C2", |
| @@ -33,34 +23,6 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_cnl_machines[] = { |
| .sof_fw_filename = "sof-cnl.ri", |
| .sof_tplg_filename = "sof-cnl-rt274.tplg", |
| }, |
| - { |
| - .id = "DLGS7219", |
| - .drv_name = "cml_da7219_max98357a", |
| - .quirk_data = &cml_spk_codecs, |
| - .sof_fw_filename = "sof-cnl.ri", |
| - .sof_tplg_filename = "sof-cml-da7219-max98357a.tplg", |
| - }, |
| - { |
| - .id = "MX98357A", |
| - .drv_name = "sof_rt5682", |
| - .quirk_data = &cml_codecs, |
| - .sof_fw_filename = "sof-cnl.ri", |
| - .sof_tplg_filename = "sof-cml-rt5682-max98357a.tplg", |
| - }, |
| - { |
| - .id = "10EC1011", |
| - .drv_name = "cml_rt1011_rt5682", |
| - .quirk_data = &cml_codecs, |
| - .sof_fw_filename = "sof-cnl.ri", |
| - .sof_tplg_filename = "sof-cml-rt1011-rt5682.tplg", |
| - }, |
| - { |
| - .id = "10EC5682", |
| - .drv_name = "sof_rt5682", |
| - .sof_fw_filename = "sof-cnl.ri", |
| - .sof_tplg_filename = "sof-cml-rt5682.tplg", |
| - }, |
| - |
| {}, |
| }; |
| EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_cnl_machines); |
| -- |
| 2.24.1 |
| |
| From b623e68eabe32651fb346bb3f1d89f3705f051df Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Fri, 22 Nov 2019 14:26:24 +0100 |
| Subject: [PATCH 107/109] ALSA: hda/hdmi - Clear codec->relaxed_resume flag at |
| unbinding |
| |
| The HDMI codec may leave codec->relaxed_resume flag set even after |
| unbinding. Clear it unconditionally. |
| |
| It's very unlikely that this actually matters in the real use case, |
| so just a fix for consistency. |
| |
| Fixes: ade49db337a9 ("ALSA: hda/hdmi - Allow audio component for AMD/ATI and Nvidia HDMI") |
| Link: https://lore.kernel.org/r/20191122132624.5482-1-tiwai@suse.de |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 10a9594563415855bd99678ea4f91dea792e5499) |
| Bugzilla: 1772498 |
| |
| sound/pci/hda/patch_hdmi.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c |
| index 2044bbb830f9..1242fba0da89 100644 |
| |
| |
| @@ -2313,8 +2313,8 @@ static void generic_hdmi_free(struct hda_codec *codec) |
| snd_hdac_acomp_exit(&codec->bus->core); |
| } else if (codec_has_acomp(codec)) { |
| snd_hdac_acomp_register_notifier(&codec->bus->core, NULL); |
| - codec->relaxed_resume = 0; |
| } |
| + codec->relaxed_resume = 0; |
| |
| for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { |
| struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); |
| -- |
| 2.24.1 |
| |
| From d0b0fa3f390ed93d017767c2b562ad587ecf62d7 Mon Sep 17 00:00:00 2001 |
| From: Alex Deucher <alexander.deucher@amd.com> |
| Date: Fri, 22 Nov 2019 16:43:50 -0500 |
| Subject: [PATCH 108/109] ALSA: hda/hdmi - fix vgaswitcheroo detection for AMD |
| |
| Only enable the vga_switcheroo logic on systems with the |
| ATPX ACPI method. This logic is not needed for asics |
| that are not part of a PX (PowerXpress)/HG (Hybrid Graphics) |
| platform. |
| |
| Reviewed-by: Takashi Iwai <tiwai@suse.de> |
| Acked-by: Evan Quan <evan.quan@amd.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Link: https://lore.kernel.org/r/20191122214353.582899-2-alexander.deucher@amd.com |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 586bc4aab878efcf672536f0cdec3d04b6990c94) |
| Bugzilla: 1772498 |
| |
| sound/pci/hda/hda_intel.c | 45 +++++++++++++++++++++++++++++++++++++++ |
| 1 file changed, 45 insertions(+) |
| |
| diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
| index e2c08517a24c..1803475c6cd2 100644 |
| |
| |
| @@ -35,6 +35,7 @@ |
| #include <linux/clocksource.h> |
| #include <linux/time.h> |
| #include <linux/completion.h> |
| +#include <linux/acpi.h> |
| |
| #ifdef CONFIG_X86 |
| /* for snoop control */ |
| @@ -1402,6 +1403,34 @@ static int azx_dev_free(struct snd_device *device) |
| } |
| |
| #ifdef SUPPORT_VGA_SWITCHEROO |
| +#ifdef CONFIG_ACPI |
| +/* ATPX is in the integrated GPU's namespace */ |
| +static bool atpx_present(void) |
| +{ |
| + struct pci_dev *pdev = NULL; |
| + acpi_handle dhandle, atpx_handle; |
| + acpi_status status; |
| + |
| + while ((pdev = pci_get_class(PCI_BASE_CLASS_DISPLAY << 16, pdev)) != NULL) { |
| + dhandle = ACPI_HANDLE(&pdev->dev); |
| + if (dhandle) { |
| + status = acpi_get_handle(dhandle, "ATPX", &atpx_handle); |
| + if (!ACPI_FAILURE(status)) { |
| + pci_dev_put(pdev); |
| + return true; |
| + } |
| + } |
| + pci_dev_put(pdev); |
| + } |
| + return false; |
| +} |
| +#else |
| +static bool atpx_present(void) |
| +{ |
| + return false; |
| +} |
| +#endif |
| + |
| /* |
| * Check of disabled HDMI controller by vga_switcheroo |
| */ |
| @@ -1413,6 +1442,22 @@ static struct pci_dev *get_bound_vga(struct pci_dev *pci) |
| switch (pci->vendor) { |
| case PCI_VENDOR_ID_ATI: |
| case PCI_VENDOR_ID_AMD: |
| + if (pci->devfn == 1) { |
| + p = pci_get_domain_bus_and_slot(pci_domain_nr(pci->bus), |
| + pci->bus->number, 0); |
| + if (p) { |
| + /* ATPX is in the integrated GPU's ACPI namespace |
| + * rather than the dGPU's namespace. However, |
| + * the dGPU is the one who is involved in |
| + * vgaswitcheroo. |
| + */ |
| + if (((p->class >> 16) == PCI_BASE_CLASS_DISPLAY) && |
| + atpx_present()) |
| + return p; |
| + pci_dev_put(p); |
| + } |
| + } |
| + break; |
| case PCI_VENDOR_ID_NVIDIA: |
| if (pci->devfn == 1) { |
| p = pci_get_domain_bus_and_slot(pci_domain_nr(pci->bus), |
| -- |
| 2.24.1 |
| |
| From 424e3c917da439f446b6398cc9e053890619eac9 Mon Sep 17 00:00:00 2001 |
| From: Alex Deucher <alexander.deucher@amd.com> |
| Date: Fri, 22 Nov 2019 16:43:51 -0500 |
| Subject: [PATCH 109/109] ALSA: hda/hdmi - Add new pci ids for AMD GPU display |
| audio |
| |
| These are needed so we can enable runtime pm in a subsequent |
| patch. |
| |
| Reviewed-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Link: https://lore.kernel.org/r/20191122214353.582899-3-alexander.deucher@amd.com |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| |
| Signed-off-by: Jaroslav Kysela <jkysela@redhat.com> |
| (cherry picked from commit 8d68a87244a812323ce3f7d5022f9deda9db54b5) |
| Bugzilla: 1772498 |
| |
| sound/pci/hda/hda_intel.c | 14 ++++++++++++++ |
| 1 file changed, 14 insertions(+) |
| |
| diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
| index 1803475c6cd2..91c76ef381c6 100644 |
| |
| |
| @@ -2604,6 +2604,20 @@ static const struct pci_device_id azx_ids[] = { |
| .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, |
| { PCI_DEVICE(0x1002, 0xaaf0), |
| .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, |
| + { PCI_DEVICE(0x1002, 0xaaf8), |
| + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, |
| + { PCI_DEVICE(0x1002, 0xab00), |
| + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, |
| + { PCI_DEVICE(0x1002, 0xab08), |
| + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, |
| + { PCI_DEVICE(0x1002, 0xab10), |
| + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, |
| + { PCI_DEVICE(0x1002, 0xab18), |
| + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, |
| + { PCI_DEVICE(0x1002, 0xab20), |
| + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, |
| + { PCI_DEVICE(0x1002, 0xab38), |
| + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, |
| /* VIA VT8251/VT8237A */ |
| { PCI_DEVICE(0x1106, 0x3288), .driver_data = AZX_DRIVER_VIA }, |
| /* VIA GFX VT7122/VX900 */ |
| -- |
| 2.24.1 |
| |