Merge tag 'asoc-v5.6-2' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie...
authorTakashi Iwai <tiwai@suse.de>
Wed, 5 Feb 2020 11:33:45 +0000 (12:33 +0100)
committerTakashi Iwai <tiwai@suse.de>
Wed, 5 Feb 2020 11:33:45 +0000 (12:33 +0100)
ASoC: Fixes for v5.6

A collection of updates for bugs fixed since the initial pull
request, the most important one being the addition of COMMON_CLK
for wcd934x which is needed for MFD to be merged.

25 files changed:
MAINTAINERS
sound/soc/amd/raven/acp3x-i2s.c
sound/soc/amd/raven/acp3x-pcm-dma.c
sound/soc/codecs/Kconfig
sound/soc/codecs/max98090.c
sound/soc/codecs/rt1015.c
sound/soc/codecs/rt1308-sdw.c
sound/soc/codecs/rt700-sdw.c
sound/soc/codecs/rt711-sdw.c
sound/soc/codecs/rt715-sdw.c
sound/soc/intel/boards/bxt_da7219_max98357a.c
sound/soc/intel/boards/bxt_rt298.c
sound/soc/intel/boards/cml_rt1011_rt5682.c
sound/soc/intel/boards/glk_rt5682_max98357a.c
sound/soc/intel/boards/sof_rt5682.c
sound/soc/intel/common/soc-acpi-intel-icl-match.c
sound/soc/sof/core.c
sound/soc/sof/intel/hda-codec.c
sound/soc/sof/intel/hda.c
sound/soc/sof/intel/hda.h
sound/soc/sof/pcm.c
sound/soc/sof/pm.c
sound/soc/sof/sof-pci-dev.c
sound/soc/sof/trace.c
sound/soc/tegra/tegra30_i2s.c

index cf6ccca..9316dcf 100644 (file)
@@ -13947,7 +13947,6 @@ F:      include/linux/platform_data/rtc-*
 F:     tools/testing/selftests/rtc/
 
 REALTEK AUDIO CODECS
-M:     Bard Liao <bardliao@realtek.com>
 M:     Oder Chiou <oder_chiou@realtek.com>
 S:     Maintained
 F:     sound/soc/codecs/rt*
index bf51cad..31cd400 100644 (file)
@@ -234,30 +234,32 @@ static int acp3x_i2s_trigger(struct snd_pcm_substream *substream,
                        switch (rtd->i2s_instance) {
                        case I2S_BT_INSTANCE:
                                reg_val = mmACP_BTTDM_ITER;
-                               ier_val = mmACP_BTTDM_IER;
                                break;
                        case I2S_SP_INSTANCE:
                        default:
                                reg_val = mmACP_I2STDM_ITER;
-                               ier_val = mmACP_I2STDM_IER;
                        }
 
                } else {
                        switch (rtd->i2s_instance) {
                        case I2S_BT_INSTANCE:
                                reg_val = mmACP_BTTDM_IRER;
-                               ier_val = mmACP_BTTDM_IER;
                                break;
                        case I2S_SP_INSTANCE:
                        default:
                                reg_val = mmACP_I2STDM_IRER;
-                               ier_val = mmACP_I2STDM_IER;
                        }
                }
                val = rv_readl(rtd->acp3x_base + reg_val);
                val = val & ~BIT(0);
                rv_writel(val, rtd->acp3x_base + reg_val);
-               rv_writel(0, rtd->acp3x_base + ier_val);
+
+               if (!(rv_readl(rtd->acp3x_base + mmACP_BTTDM_ITER) & BIT(0)) &&
+                    !(rv_readl(rtd->acp3x_base + mmACP_BTTDM_IRER) & BIT(0)))
+                       rv_writel(0, rtd->acp3x_base + mmACP_BTTDM_IER);
+               if (!(rv_readl(rtd->acp3x_base + mmACP_I2STDM_ITER) & BIT(0)) &&
+                    !(rv_readl(rtd->acp3x_base + mmACP_I2STDM_IRER) & BIT(0)))
+                       rv_writel(0, rtd->acp3x_base + mmACP_I2STDM_IER);
                ret = 0;
                break;
        default:
index 5c3ec3c..aecc3c0 100644 (file)
@@ -349,13 +349,6 @@ static int acp3x_dma_close(struct snd_soc_component *component,
        component = snd_soc_rtdcom_lookup(prtd, DRV_NAME);
        adata = dev_get_drvdata(component->dev);
 
-       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
-               adata->play_stream = NULL;
-               adata->i2ssp_play_stream = NULL;
-       } else {
-               adata->capture_stream = NULL;
-               adata->i2ssp_capture_stream = NULL;
-       }
 
        /* Disable ACP irq, when the current stream is being closed and
         * another stream is also not active.
@@ -363,6 +356,13 @@ static int acp3x_dma_close(struct snd_soc_component *component,
        if (!adata->play_stream && !adata->capture_stream &&
                !adata->i2ssp_play_stream && !adata->i2ssp_capture_stream)
                rv_writel(0, adata->acp3x_base + mmACP_EXTERNAL_INTR_ENB);
+       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+               adata->play_stream = NULL;
+               adata->i2ssp_play_stream = NULL;
+       } else {
+               adata->capture_stream = NULL;
+               adata->i2ssp_capture_stream = NULL;
+       }
        return 0;
 }
 
index c9eb683..2865148 100644 (file)
@@ -1334,6 +1334,7 @@ config SND_SOC_WCD9335
 
 config SND_SOC_WCD934X
        tristate "WCD9340/WCD9341 Codec"
+       depends on COMMON_CLK
        depends on MFD_WCD934X
        help
          The WCD9340/9341 is a audio codec IC Integrated in
index 0313e11..5bc2c64 100644 (file)
@@ -52,7 +52,8 @@ static void max98090_shdn_restore_locked(struct max98090_priv *max98090)
 
 static void max98090_shdn_save(struct max98090_priv *max98090)
 {
-       mutex_lock(&max98090->component->card->dapm_mutex);
+       mutex_lock_nested(&max98090->component->card->dapm_mutex,
+                         SND_SOC_DAPM_CLASS_RUNTIME);
        max98090_shdn_save_locked(max98090);
 }
 
index 4a9c5b5..6d490e2 100644 (file)
@@ -389,7 +389,7 @@ static const char * const rt1015_boost_mode[] = {
        "Bypass", "Adaptive", "Fixed Adaptive"
 };
 
-static const SOC_ENUM_SINGLE_DECL(rt1015_boost_mode_enum, 0, 0,
+static SOC_ENUM_SINGLE_DECL(rt1015_boost_mode_enum, 0, 0,
        rt1015_boost_mode);
 
 static int rt1015_boost_mode_get(struct snd_kcontrol *kcontrol,
index 8a03dbf..d930f60 100644 (file)
@@ -673,7 +673,7 @@ static const struct sdw_device_id rt1308_id[] = {
 };
 MODULE_DEVICE_TABLE(sdw, rt1308_id);
 
-static int rt1308_dev_suspend(struct device *dev)
+static int __maybe_unused rt1308_dev_suspend(struct device *dev)
 {
        struct rt1308_sdw_priv *rt1308 = dev_get_drvdata(dev);
 
@@ -687,7 +687,7 @@ static int rt1308_dev_suspend(struct device *dev)
 
 #define RT1308_PROBE_TIMEOUT 2000
 
-static int rt1308_dev_resume(struct device *dev)
+static int __maybe_unused rt1308_dev_resume(struct device *dev)
 {
        struct sdw_slave *slave = dev_to_sdw_dev(dev);
        struct rt1308_sdw_priv *rt1308 = dev_get_drvdata(dev);
index a4b9542..d4e0f95 100644 (file)
@@ -486,7 +486,7 @@ static const struct sdw_device_id rt700_id[] = {
 };
 MODULE_DEVICE_TABLE(sdw, rt700_id);
 
-static int rt700_dev_suspend(struct device *dev)
+static int __maybe_unused rt700_dev_suspend(struct device *dev)
 {
        struct rt700_priv *rt700 = dev_get_drvdata(dev);
 
@@ -500,7 +500,7 @@ static int rt700_dev_suspend(struct device *dev)
 
 #define RT700_PROBE_TIMEOUT 2000
 
-static int rt700_dev_resume(struct device *dev)
+static int __maybe_unused rt700_dev_resume(struct device *dev)
 {
        struct sdw_slave *slave = dev_to_sdw_dev(dev);
        struct rt700_priv *rt700 = dev_get_drvdata(dev);
index 85e62e1..fc3a3fa 100644 (file)
@@ -487,7 +487,7 @@ static const struct sdw_device_id rt711_id[] = {
 };
 MODULE_DEVICE_TABLE(sdw, rt711_id);
 
-static int rt711_dev_suspend(struct device *dev)
+static int __maybe_unused rt711_dev_suspend(struct device *dev)
 {
        struct rt711_priv *rt711 = dev_get_drvdata(dev);
 
@@ -501,7 +501,7 @@ static int rt711_dev_suspend(struct device *dev)
 
 #define RT711_PROBE_TIMEOUT 2000
 
-static int rt711_dev_resume(struct device *dev)
+static int __maybe_unused rt711_dev_resume(struct device *dev)
 {
        struct sdw_slave *slave = dev_to_sdw_dev(dev);
        struct rt711_priv *rt711 = dev_get_drvdata(dev);
index 6d892c4..64ef56e 100644 (file)
@@ -549,7 +549,7 @@ static const struct sdw_device_id rt715_id[] = {
 };
 MODULE_DEVICE_TABLE(sdw, rt715_id);
 
-static int rt715_dev_suspend(struct device *dev)
+static int __maybe_unused rt715_dev_suspend(struct device *dev)
 {
        struct rt715_priv *rt715 = dev_get_drvdata(dev);
 
@@ -563,7 +563,7 @@ static int rt715_dev_suspend(struct device *dev)
 
 #define RT715_PROBE_TIMEOUT 2000
 
-static int rt715_dev_resume(struct device *dev)
+static int __maybe_unused rt715_dev_resume(struct device *dev)
 {
        struct sdw_slave *slave = dev_to_sdw_dev(dev);
        struct rt715_priv *rt715 = dev_get_drvdata(dev);
index 33b13f3..9177401 100644 (file)
@@ -617,12 +617,15 @@ 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 (list_empty(&ctx->hdmi_pcm_list))
+               return -EINVAL;
 
-       if (ctx->common_hdmi_codec_drv)
+       if (ctx->common_hdmi_codec_drv) {
+               pcm = list_first_entry(&ctx->hdmi_pcm_list, struct bxt_hdmi_pcm,
+                                      head);
+               component = pcm->codec_dai->component;
                return hda_dsp_hdmi_build_controls(card, component);
+       }
 
        list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) {
                component = pcm->codec_dai->component;
@@ -643,9 +646,6 @@ static int bxt_card_late_probe(struct snd_soc_card *card)
                i++;
        }
 
-       if (!component)
-               return -EINVAL;
-
        return hdac_hdmi_jack_port_init(component, &card->dapm);
 }
 
index 067a97e..4b67f26 100644 (file)
@@ -529,12 +529,15 @@ 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 (list_empty(&ctx->hdmi_pcm_list))
+               return -EINVAL;
 
-       if (ctx->common_hdmi_codec_drv)
+       if (ctx->common_hdmi_codec_drv) {
+               pcm = list_first_entry(&ctx->hdmi_pcm_list, struct bxt_hdmi_pcm,
+                                      head);
+               component = pcm->codec_dai->component;
                return hda_dsp_hdmi_build_controls(card, component);
+       }
 
        list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) {
                component = pcm->codec_dai->component;
@@ -555,9 +558,6 @@ static int bxt_card_late_probe(struct snd_soc_card *card)
                i++;
        }
 
-       if (!component)
-               return -EINVAL;
-
        return hdac_hdmi_jack_port_init(component, &card->dapm);
 }
 
index d6efc55..dd80d01 100644 (file)
@@ -241,12 +241,15 @@ static int sof_card_late_probe(struct snd_soc_card *card)
        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 (list_empty(&ctx->hdmi_pcm_list))
+               return -EINVAL;
 
-       if (ctx->common_hdmi_codec_drv)
+       if (ctx->common_hdmi_codec_drv) {
+               pcm = list_first_entry(&ctx->hdmi_pcm_list, struct hdmi_pcm,
+                                      head);
+               component = pcm->codec_dai->component;
                return hda_dsp_hdmi_build_controls(card, component);
+       }
 
        list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) {
                component = pcm->codec_dai->component;
@@ -265,8 +268,6 @@ static int sof_card_late_probe(struct snd_soc_card *card)
 
                i++;
        }
-       if (!component)
-               return -EINVAL;
 
        return hdac_hdmi_jack_port_init(component, &card->dapm);
 }
index 4a6d117..8e947ba 100644 (file)
@@ -534,15 +534,18 @@ static int glk_card_late_probe(struct snd_soc_card *card)
        struct snd_soc_component *component = NULL;
        char jack_name[NAME_SIZE];
        struct glk_hdmi_pcm *pcm;
-       int err = 0;
+       int err;
        int i = 0;
 
-       pcm = list_first_entry(&ctx->hdmi_pcm_list, struct glk_hdmi_pcm,
-                              head);
-       component = pcm->codec_dai->component;
+       if (list_empty(&ctx->hdmi_pcm_list))
+               return -EINVAL;
 
-       if (ctx->common_hdmi_codec_drv)
+       if (ctx->common_hdmi_codec_drv) {
+               pcm = list_first_entry(&ctx->hdmi_pcm_list, struct glk_hdmi_pcm,
+                                      head);
+               component = pcm->codec_dai->component;
                return hda_dsp_hdmi_build_controls(card, component);
+       }
 
        list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) {
                component = pcm->codec_dai->component;
@@ -563,9 +566,6 @@ static int glk_card_late_probe(struct snd_soc_card *card)
                i++;
        }
 
-       if (!component)
-               return -EINVAL;
-
        return hdac_hdmi_jack_port_init(component, &card->dapm);
 }
 
index 8a13231..5d87887 100644 (file)
@@ -273,19 +273,22 @@ static int sof_card_late_probe(struct snd_soc_card *card)
        struct snd_soc_component *component = NULL;
        char jack_name[NAME_SIZE];
        struct sof_hdmi_pcm *pcm;
-       int err = 0;
+       int err;
        int i = 0;
 
        /* HDMI is not supported by SOF on Baytrail/CherryTrail */
        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 (list_empty(&ctx->hdmi_pcm_list))
+               return -EINVAL;
 
-       if (ctx->common_hdmi_codec_drv)
+       if (ctx->common_hdmi_codec_drv) {
+               pcm = list_first_entry(&ctx->hdmi_pcm_list, struct sof_hdmi_pcm,
+                                      head);
+               component = pcm->codec_dai->component;
                return hda_dsp_hdmi_build_controls(card, component);
+       }
 
        list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) {
                component = pcm->codec_dai->component;
@@ -305,8 +308,6 @@ static int sof_card_late_probe(struct snd_soc_card *card)
 
                i++;
        }
-       if (!component)
-               return -EINVAL;
 
        return hdac_hdmi_jack_port_init(component, &card->dapm);
 }
index 67e9da4..7527330 100644 (file)
@@ -59,7 +59,7 @@ static const u64 rt1308_2_adr[] = {
 };
 
 static const u64 rt715_3_adr[] = {
-       0x000310025D715000
+       0x000310025D071500
 };
 
 static const struct snd_soc_acpi_link_adr icl_3_in_1_default[] = {
index 44f9c04..34cefba 100644 (file)
@@ -224,12 +224,12 @@ static int sof_probe_continue(struct snd_sof_dev *sdev)
        if (ret < 0) {
                dev_err(sdev->dev,
                        "error: failed to register DSP DAI driver %d\n", ret);
-               goto fw_run_err;
+               goto fw_trace_err;
        }
 
        ret = snd_sof_machine_register(sdev, plat_data);
        if (ret < 0)
-               goto fw_run_err;
+               goto fw_trace_err;
 
        /*
         * Some platforms in SOF, ex: BYT, may not have their platform PM
@@ -244,7 +244,8 @@ static int sof_probe_continue(struct snd_sof_dev *sdev)
 
        return 0;
 
-#if !IS_ENABLED(CONFIG_SND_SOC_SOF_PROBE_WORK_QUEUE)
+fw_trace_err:
+       snd_sof_free_trace(sdev);
 fw_run_err:
        snd_sof_fw_unload(sdev);
 fw_load_err:
@@ -253,21 +254,10 @@ ipc_err:
        snd_sof_free_debug(sdev);
 dbg_err:
        snd_sof_remove(sdev);
-#else
-
-       /*
-        * when the probe_continue is handled in a work queue, the
-        * probe does not fail so we don't release resources here.
-        * They will be released with an explicit call to
-        * snd_sof_device_remove() when the PCI/ACPI device is removed
-        */
-
-fw_run_err:
-fw_load_err:
-ipc_err:
-dbg_err:
 
-#endif
+       /* all resources freed, update state to match */
+       sdev->fw_state = SOF_FW_BOOT_NOT_STARTED;
+       sdev->first_boot = true;
 
        return ret;
 }
@@ -350,10 +340,12 @@ int snd_sof_device_remove(struct device *dev)
        if (IS_ENABLED(CONFIG_SND_SOC_SOF_PROBE_WORK_QUEUE))
                cancel_work_sync(&sdev->probe_work);
 
-       snd_sof_fw_unload(sdev);
-       snd_sof_ipc_free(sdev);
-       snd_sof_free_debug(sdev);
-       snd_sof_free_trace(sdev);
+       if (sdev->fw_state > SOF_FW_BOOT_NOT_STARTED) {
+               snd_sof_fw_unload(sdev);
+               snd_sof_ipc_free(sdev);
+               snd_sof_free_debug(sdev);
+               snd_sof_free_trace(sdev);
+       }
 
        /*
         * Unregister machine driver. This will unbind the snd_card which
@@ -361,13 +353,15 @@ int snd_sof_device_remove(struct device *dev)
         * before freeing the snd_card.
         */
        snd_sof_machine_unregister(sdev, pdata);
+
        /*
         * Unregistering the machine driver results in unloading the topology.
         * Some widgets, ex: scheduler, attempt to power down the core they are
         * scheduled on, when they are unloaded. Therefore, the DSP must be
         * removed only after the topology has been unloaded.
         */
-       snd_sof_remove(sdev);
+       if (sdev->fw_state > SOF_FW_BOOT_NOT_STARTED)
+               snd_sof_remove(sdev);
 
        /* release firmware */
        release_firmware(pdata->fw);
index 78dfd5f..9106ab8 100644 (file)
@@ -170,23 +170,14 @@ EXPORT_SYMBOL_NS(hda_codec_probe_bus, SND_SOC_SOF_HDA_AUDIO_CODEC);
 #if IS_ENABLED(CONFIG_SND_HDA_CODEC_HDMI) || \
        IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI)
 
-void hda_codec_i915_get(struct snd_sof_dev *sdev)
+void hda_codec_i915_display_power(struct snd_sof_dev *sdev, bool enable)
 {
        struct hdac_bus *bus = sof_to_bus(sdev);
 
-       dev_dbg(bus->dev, "Turning i915 HDAC power on\n");
-       snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, true);
+       dev_dbg(bus->dev, "Turning i915 HDAC power %d\n", enable);
+       snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, enable);
 }
-EXPORT_SYMBOL_NS(hda_codec_i915_get, SND_SOC_SOF_HDA_AUDIO_CODEC_I915);
-
-void hda_codec_i915_put(struct snd_sof_dev *sdev)
-{
-       struct hdac_bus *bus = sof_to_bus(sdev);
-
-       dev_dbg(bus->dev, "Turning i915 HDAC power off\n");
-       snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, false);
-}
-EXPORT_SYMBOL_NS(hda_codec_i915_put, SND_SOC_SOF_HDA_AUDIO_CODEC_I915);
+EXPORT_SYMBOL_NS(hda_codec_i915_display_power, SND_SOC_SOF_HDA_AUDIO_CODEC_I915);
 
 int hda_codec_i915_init(struct snd_sof_dev *sdev)
 {
@@ -198,7 +189,7 @@ int hda_codec_i915_init(struct snd_sof_dev *sdev)
        if (ret < 0)
                return ret;
 
-       hda_codec_i915_get(sdev);
+       hda_codec_i915_display_power(sdev, true);
 
        return 0;
 }
@@ -209,7 +200,7 @@ int hda_codec_i915_exit(struct snd_sof_dev *sdev)
        struct hdac_bus *bus = sof_to_bus(sdev);
        int ret;
 
-       hda_codec_i915_put(sdev);
+       hda_codec_i915_display_power(sdev, false);
 
        ret = snd_hdac_i915_exit(bus);
 
index d08462f..65b86dd 100644 (file)
@@ -380,7 +380,8 @@ static int hda_init_caps(struct snd_sof_dev *sdev)
        /* create codec instances */
        hda_codec_probe_bus(sdev, hda_codec_use_common_hdmi);
 
-       hda_codec_i915_put(sdev);
+       if (!HDA_IDISP_CODEC(bus->codec_mask))
+               hda_codec_i915_display_power(sdev, false);
 
        /*
         * we are done probing so decrement link counts
index a4d030b..6191d91 100644 (file)
@@ -586,15 +586,14 @@ void hda_codec_jack_check(struct snd_sof_dev *sdev);
        (IS_ENABLED(CONFIG_SND_HDA_CODEC_HDMI) || \
         IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI))
 
-void hda_codec_i915_get(struct snd_sof_dev *sdev);
-void hda_codec_i915_put(struct snd_sof_dev *sdev);
+void hda_codec_i915_display_power(struct snd_sof_dev *sdev, bool enable);
 int hda_codec_i915_init(struct snd_sof_dev *sdev);
 int hda_codec_i915_exit(struct snd_sof_dev *sdev);
 
 #else
 
-static inline void hda_codec_i915_get(struct snd_sof_dev *sdev)  { }
-static inline void hda_codec_i915_put(struct snd_sof_dev *sdev)  { }
+static inline void hda_codec_i915_display_power(struct snd_sof_dev *sdev,
+                                               bool enable) { }
 static inline int hda_codec_i915_init(struct snd_sof_dev *sdev) { return 0; }
 static inline int hda_codec_i915_exit(struct snd_sof_dev *sdev) { return 0; }
 
index 314f309..29435ba 100644 (file)
@@ -591,6 +591,11 @@ static int sof_pcm_new(struct snd_soc_component *component,
                "spcm: allocate %s playback DMA buffer size 0x%x max 0x%x\n",
                caps->name, caps->buffer_size_min, caps->buffer_size_max);
 
+       if (!pcm->streams[stream].substream) {
+               dev_err(component->dev, "error: NULL playback substream!\n");
+               return -EINVAL;
+       }
+
        snd_pcm_set_managed_buffer(pcm->streams[stream].substream,
                                   SNDRV_DMA_TYPE_DEV_SG, sdev->dev,
                                   le32_to_cpu(caps->buffer_size_min),
@@ -609,6 +614,11 @@ capture:
                "spcm: allocate %s capture DMA buffer size 0x%x max 0x%x\n",
                caps->name, caps->buffer_size_min, caps->buffer_size_max);
 
+       if (!pcm->streams[stream].substream) {
+               dev_err(component->dev, "error: NULL capture substream!\n");
+               return -EINVAL;
+       }
+
        snd_pcm_set_managed_buffer(pcm->streams[stream].substream,
                                   SNDRV_DMA_TYPE_DEV_SG, sdev->dev,
                                   le32_to_cpu(caps->buffer_size_min),
index 84290bb..a0cde05 100644 (file)
@@ -56,6 +56,10 @@ static int sof_resume(struct device *dev, bool runtime_resume)
        if (!sof_ops(sdev)->resume || !sof_ops(sdev)->runtime_resume)
                return 0;
 
+       /* DSP was never successfully started, nothing to resume */
+       if (sdev->first_boot)
+               return 0;
+
        /*
         * if the runtime_resume flag is set, call the runtime_resume routine
         * or else call the system resume routine
index d855bc2..cec631a 100644 (file)
@@ -235,6 +235,7 @@ static const struct sof_dev_desc jsl_desc = {
        .chip_info = &jsl_chip_info,
        .default_fw_path = "intel/sof",
        .default_tplg_path = "intel/sof-tplg",
+       .default_fw_filename = "sof-jsl.ri",
        .nocodec_tplg_filename = "sof-jsl-nocodec.tplg",
        .ops = &sof_cnl_ops,
 };
@@ -416,6 +417,8 @@ static const struct pci_device_id sof_pci_ids[] = {
 #if IS_ENABLED(CONFIG_SND_SOC_SOF_JASPERLAKE)
        { PCI_DEVICE(0x8086, 0x38c8),
                .driver_data = (unsigned long)&jsl_desc},
+       { PCI_DEVICE(0x8086, 0x4dc8),
+               .driver_data = (unsigned long)&jsl_desc},
 #endif
 #if IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_LP)
        { PCI_DEVICE(0x8086, 0x02c8),
index 4bb6503..d815090 100644 (file)
@@ -343,7 +343,10 @@ void snd_sof_free_trace(struct snd_sof_dev *sdev)
 
        snd_sof_release_trace(sdev);
 
-       snd_dma_free_pages(&sdev->dmatb);
-       snd_dma_free_pages(&sdev->dmatp);
+       if (sdev->dma_trace_pages) {
+               snd_dma_free_pages(&sdev->dmatb);
+               snd_dma_free_pages(&sdev->dmatp);
+               sdev->dma_trace_pages = 0;
+       }
 }
 EXPORT_SYMBOL(snd_sof_free_trace);
index dbed3c5..d59882e 100644 (file)
@@ -127,7 +127,7 @@ static int tegra30_i2s_hw_params(struct snd_pcm_substream *substream,
        struct device *dev = dai->dev;
        struct tegra30_i2s *i2s = snd_soc_dai_get_drvdata(dai);
        unsigned int mask, val, reg;
-       int ret, sample_size, srate, i2sclock, bitcnt, audio_bits;
+       int ret, sample_size, srate, i2sclock, bitcnt;
        struct tegra30_ahub_cif_conf cif_conf;
 
        if (params_channels(params) != 2)
@@ -137,19 +137,8 @@ static int tegra30_i2s_hw_params(struct snd_pcm_substream *substream,
        switch (params_format(params)) {
        case SNDRV_PCM_FORMAT_S16_LE:
                val = TEGRA30_I2S_CTRL_BIT_SIZE_16;
-               audio_bits = TEGRA30_AUDIOCIF_BITS_16;
                sample_size = 16;
                break;
-       case SNDRV_PCM_FORMAT_S24_LE:
-               val = TEGRA30_I2S_CTRL_BIT_SIZE_24;
-               audio_bits = TEGRA30_AUDIOCIF_BITS_24;
-               sample_size = 24;
-               break;
-       case SNDRV_PCM_FORMAT_S32_LE:
-               val = TEGRA30_I2S_CTRL_BIT_SIZE_32;
-               audio_bits = TEGRA30_AUDIOCIF_BITS_32;
-               sample_size = 32;
-               break;
        default:
                return -EINVAL;
        }
@@ -181,8 +170,8 @@ static int tegra30_i2s_hw_params(struct snd_pcm_substream *substream,
        cif_conf.threshold = 0;
        cif_conf.audio_channels = 2;
        cif_conf.client_channels = 2;
-       cif_conf.audio_bits = audio_bits;
-       cif_conf.client_bits = audio_bits;
+       cif_conf.audio_bits = TEGRA30_AUDIOCIF_BITS_16;
+       cif_conf.client_bits = TEGRA30_AUDIOCIF_BITS_16;
        cif_conf.expand = 0;
        cif_conf.stereo_conv = 0;
        cif_conf.replicate = 0;
@@ -317,18 +306,14 @@ static const struct snd_soc_dai_driver tegra30_i2s_dai_template = {
                .channels_min = 2,
                .channels_max = 2,
                .rates = SNDRV_PCM_RATE_8000_96000,
-               .formats = SNDRV_PCM_FMTBIT_S32_LE |
-                          SNDRV_PCM_FMTBIT_S24_LE |
-                          SNDRV_PCM_FMTBIT_S16_LE,
+               .formats = SNDRV_PCM_FMTBIT_S16_LE,
        },
        .capture = {
                .stream_name = "Capture",
                .channels_min = 2,
                .channels_max = 2,
                .rates = SNDRV_PCM_RATE_8000_96000,
-               .formats = SNDRV_PCM_FMTBIT_S32_LE |
-                          SNDRV_PCM_FMTBIT_S24_LE |
-                          SNDRV_PCM_FMTBIT_S16_LE,
+               .formats = SNDRV_PCM_FMTBIT_S16_LE,
        },
        .ops = &tegra30_i2s_dai_ops,
        .symmetric_rates = 1,