Merge tag 'asoc-fix-v5.15-rc5' of https://git.kernel.org/pub/scm/linux/kernel/git...
authorTakashi Iwai <tiwai@suse.de>
Fri, 15 Oct 2021 15:43:46 +0000 (17:43 +0200)
committerTakashi Iwai <tiwai@suse.de>
Fri, 15 Oct 2021 15:43:46 +0000 (17:43 +0200)
ASoC: Fixes for v5.15

A colletion of smallish mostly driver specific fixes, the biggest thing
here is fixing some of the core code to generate change notifications
properly when writing to controls which will fix issues with UIs not
showing the correct values.

There's one build fix here with a slightly misleading changelog saying
it's adding IRQ config support, it's adding a missing select of the
regmap-irq code rather than adding a feature.

12 files changed:
sound/soc/codecs/Kconfig
sound/soc/codecs/cs42l42.c
sound/soc/codecs/cs4341.c
sound/soc/codecs/nau8824.c
sound/soc/codecs/pcm179x-spi.c
sound/soc/codecs/pcm512x.c
sound/soc/codecs/wcd938x.c
sound/soc/codecs/wm8960.c
sound/soc/fsl/fsl_xcvr.c
sound/soc/intel/boards/bytcht_es8316.c
sound/soc/soc-core.c
sound/soc/soc-dapm.c

index 82ee233..216cea0 100644 (file)
@@ -1583,6 +1583,7 @@ config SND_SOC_WCD938X_SDW
        tristate "WCD9380/WCD9385 Codec - SDW"
        select SND_SOC_WCD938X
        select SND_SOC_WCD_MBHC
+       select REGMAP_IRQ
        depends on SOUNDWIRE
        select REGMAP_SOUNDWIRE
        help
index fb1e4c3..9a463ab 100644 (file)
@@ -922,7 +922,6 @@ static int cs42l42_mute_stream(struct snd_soc_dai *dai, int mute, int stream)
        struct snd_soc_component *component = dai->component;
        struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component);
        unsigned int regval;
-       u8 fullScaleVol;
        int ret;
 
        if (mute) {
@@ -993,20 +992,11 @@ static int cs42l42_mute_stream(struct snd_soc_dai *dai, int mute, int stream)
                cs42l42->stream_use |= 1 << stream;
 
                if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
-                       /* Read the headphone load */
-                       regval = snd_soc_component_read(component, CS42L42_LOAD_DET_RCSTAT);
-                       if (((regval & CS42L42_RLA_STAT_MASK) >> CS42L42_RLA_STAT_SHIFT) ==
-                           CS42L42_RLA_STAT_15_OHM) {
-                               fullScaleVol = CS42L42_HP_FULL_SCALE_VOL_MASK;
-                       } else {
-                               fullScaleVol = 0;
-                       }
-
-                       /* Un-mute the headphone, set the full scale volume flag */
+                       /* Un-mute the headphone */
                        snd_soc_component_update_bits(component, CS42L42_HP_CTL,
                                                      CS42L42_HP_ANA_AMUTE_MASK |
-                                                     CS42L42_HP_ANA_BMUTE_MASK |
-                                                     CS42L42_HP_FULL_SCALE_VOL_MASK, fullScaleVol);
+                                                     CS42L42_HP_ANA_BMUTE_MASK,
+                                                     0);
                }
        }
 
index 7d3e54d..29d05e3 100644 (file)
@@ -305,12 +305,19 @@ static int cs4341_spi_probe(struct spi_device *spi)
        return cs4341_probe(&spi->dev);
 }
 
+static const struct spi_device_id cs4341_spi_ids[] = {
+       { "cs4341a" },
+       { }
+};
+MODULE_DEVICE_TABLE(spi, cs4341_spi_ids);
+
 static struct spi_driver cs4341_spi_driver = {
        .driver = {
                .name = "cs4341-spi",
                .of_match_table = of_match_ptr(cs4341_dt_ids),
        },
        .probe = cs4341_spi_probe,
+       .id_table = cs4341_spi_ids,
 };
 #endif
 
index db88be4..f946ef6 100644 (file)
@@ -867,8 +867,8 @@ static void nau8824_jdet_work(struct work_struct *work)
        struct regmap *regmap = nau8824->regmap;
        int adc_value, event = 0, event_mask = 0;
 
-       snd_soc_dapm_enable_pin(dapm, "MICBIAS");
-       snd_soc_dapm_enable_pin(dapm, "SAR");
+       snd_soc_dapm_force_enable_pin(dapm, "MICBIAS");
+       snd_soc_dapm_force_enable_pin(dapm, "SAR");
        snd_soc_dapm_sync(dapm);
 
        msleep(100);
index 0a54292..ebf63ea 100644 (file)
@@ -36,6 +36,7 @@ static const struct of_device_id pcm179x_of_match[] = {
 MODULE_DEVICE_TABLE(of, pcm179x_of_match);
 
 static const struct spi_device_id pcm179x_spi_ids[] = {
+       { "pcm1792a", 0 },
        { "pcm179x", 0 },
        { },
 };
index 4dc844f..60dee41 100644 (file)
@@ -116,6 +116,8 @@ static const struct reg_default pcm512x_reg_defaults[] = {
        { PCM512x_FS_SPEED_MODE,     0x00 },
        { PCM512x_IDAC_1,            0x01 },
        { PCM512x_IDAC_2,            0x00 },
+       { PCM512x_I2S_1,             0x02 },
+       { PCM512x_I2S_2,             0x00 },
 };
 
 static bool pcm512x_readable(struct device *dev, unsigned int reg)
index f0daf8d..52de7d1 100644 (file)
@@ -4144,10 +4144,10 @@ static int wcd938x_codec_set_jack(struct snd_soc_component *comp,
 {
        struct wcd938x_priv *wcd = dev_get_drvdata(comp->dev);
 
-       if (!jack)
+       if (jack)
                return wcd_mbhc_start(wcd->wcd_mbhc, &wcd->mbhc_cfg, jack);
-
-       wcd_mbhc_stop(wcd->wcd_mbhc);
+       else
+               wcd_mbhc_stop(wcd->wcd_mbhc);
 
        return 0;
 }
index 9e621a2..499604f 100644 (file)
@@ -742,9 +742,16 @@ static int wm8960_configure_clocking(struct snd_soc_component *component)
        int i, j, k;
        int ret;
 
-       if (!(iface1 & (1<<6))) {
-               dev_dbg(component->dev,
-                       "Codec is slave mode, no need to configure clock\n");
+       /*
+        * For Slave mode clocking should still be configured,
+        * so this if statement should be removed, but some platform
+        * may not work if the sysclk is not configured, to avoid such
+        * compatible issue, just add '!wm8960->sysclk' condition in
+        * this if statement.
+        */
+       if (!(iface1 & (1 << 6)) && !wm8960->sysclk) {
+               dev_warn(component->dev,
+                        "slave mode, but proceeding with no clock configuration\n");
                return 0;
        }
 
index 7ba2fd1..d0556c7 100644 (file)
@@ -487,8 +487,9 @@ static int fsl_xcvr_prepare(struct snd_pcm_substream *substream,
                return ret;
        }
 
-       /* clear DPATH RESET */
+       /* set DPATH RESET */
        m_ctl |= FSL_XCVR_EXT_CTRL_DPTH_RESET(tx);
+       v_ctl |= FSL_XCVR_EXT_CTRL_DPTH_RESET(tx);
        ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_CTRL, m_ctl, v_ctl);
        if (ret < 0) {
                dev_err(dai->dev, "Error while setting EXT_CTRL: %d\n", ret);
@@ -590,10 +591,6 @@ static void fsl_xcvr_shutdown(struct snd_pcm_substream *substream,
                val  |= FSL_XCVR_EXT_CTRL_CMDC_RESET(tx);
        }
 
-       /* set DPATH RESET */
-       mask |= FSL_XCVR_EXT_CTRL_DPTH_RESET(tx);
-       val  |= FSL_XCVR_EXT_CTRL_DPTH_RESET(tx);
-
        ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_CTRL, mask, val);
        if (ret < 0) {
                dev_err(dai->dev, "Err setting DPATH RESET: %d\n", ret);
@@ -643,6 +640,16 @@ static int fsl_xcvr_trigger(struct snd_pcm_substream *substream, int cmd,
                        dev_err(dai->dev, "Failed to enable DMA: %d\n", ret);
                        return ret;
                }
+
+               /* clear DPATH RESET */
+               ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_CTRL,
+                                        FSL_XCVR_EXT_CTRL_DPTH_RESET(tx),
+                                        0);
+               if (ret < 0) {
+                       dev_err(dai->dev, "Failed to clear DPATH RESET: %d\n", ret);
+                       return ret;
+               }
+
                break;
        case SNDRV_PCM_TRIGGER_STOP:
        case SNDRV_PCM_TRIGGER_SUSPEND:
index 055248f..4d313d0 100644 (file)
@@ -456,12 +456,12 @@ static const struct dmi_system_id byt_cht_es8316_quirk_table[] = {
 
 static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
 {
+       struct device *dev = &pdev->dev;
        static const char * const mic_name[] = { "in1", "in2" };
+       struct snd_soc_acpi_mach *mach = dev_get_platdata(dev);
        struct property_entry props[MAX_NO_PROPS] = {};
        struct byt_cht_es8316_private *priv;
        const struct dmi_system_id *dmi_id;
-       struct device *dev = &pdev->dev;
-       struct snd_soc_acpi_mach *mach;
        struct fwnode_handle *fwnode;
        const char *platform_name;
        struct acpi_device *adev;
@@ -476,7 +476,6 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
        if (!priv)
                return -ENOMEM;
 
-       mach = dev->platform_data;
        /* fix index of codec dai */
        for (i = 0; i < ARRAY_SIZE(byt_cht_es8316_dais); i++) {
                if (!strcmp(byt_cht_es8316_dais[i].codecs->name,
@@ -494,7 +493,7 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
                put_device(&adev->dev);
                byt_cht_es8316_dais[dai_index].codecs->name = codec_name;
        } else {
-               dev_err(&pdev->dev, "Error cannot find '%s' dev\n", mach->id);
+               dev_err(dev, "Error cannot find '%s' dev\n", mach->id);
                return -ENXIO;
        }
 
@@ -533,11 +532,8 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
 
        /* get the clock */
        priv->mclk = devm_clk_get(dev, "pmc_plt_clk_3");
-       if (IS_ERR(priv->mclk)) {
-               ret = PTR_ERR(priv->mclk);
-               dev_err(dev, "clk_get pmc_plt_clk_3 failed: %d\n", ret);
-               return ret;
-       }
+       if (IS_ERR(priv->mclk))
+               return dev_err_probe(dev, PTR_ERR(priv->mclk), "clk_get pmc_plt_clk_3 failed\n");
 
        /* get speaker enable GPIO */
        codec_dev = acpi_get_first_physical_node(adev);
@@ -567,22 +563,13 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
 
        devm_acpi_dev_add_driver_gpios(codec_dev, byt_cht_es8316_gpios);
        priv->speaker_en_gpio =
-               gpiod_get_index(codec_dev, "speaker-enable", 0,
-                               /* see comment in byt_cht_es8316_resume */
-                               GPIOD_OUT_LOW | GPIOD_FLAGS_BIT_NONEXCLUSIVE);
-
+               gpiod_get_optional(codec_dev, "speaker-enable",
+                                  /* see comment in byt_cht_es8316_resume() */
+                                  GPIOD_OUT_LOW | GPIOD_FLAGS_BIT_NONEXCLUSIVE);
        if (IS_ERR(priv->speaker_en_gpio)) {
-               ret = PTR_ERR(priv->speaker_en_gpio);
-               switch (ret) {
-               case -ENOENT:
-                       priv->speaker_en_gpio = NULL;
-                       break;
-               default:
-                       dev_err(dev, "get speaker GPIO failed: %d\n", ret);
-                       fallthrough;
-               case -EPROBE_DEFER:
-                       goto err_put_codec;
-               }
+               ret = dev_err_probe(dev, PTR_ERR(priv->speaker_en_gpio),
+                                   "get speaker GPIO failed\n");
+               goto err_put_codec;
        }
 
        snprintf(components_string, sizeof(components_string),
@@ -597,7 +584,7 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
        byt_cht_es8316_card.long_name = long_name;
 #endif
 
-       sof_parent = snd_soc_acpi_sof_parent(&pdev->dev);
+       sof_parent = snd_soc_acpi_sof_parent(dev);
 
        /* set card and driver name */
        if (sof_parent) {
index c830e96..80ca260 100644 (file)
@@ -2599,6 +2599,7 @@ int snd_soc_component_initialize(struct snd_soc_component *component,
        INIT_LIST_HEAD(&component->dai_list);
        INIT_LIST_HEAD(&component->dobj_list);
        INIT_LIST_HEAD(&component->card_list);
+       INIT_LIST_HEAD(&component->list);
        mutex_init(&component->io_mutex);
 
        component->name = fmt_single_name(dev, &component->id);
index 7b67f1e..59d0764 100644 (file)
@@ -2561,6 +2561,7 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
                                const char *pin, int status)
 {
        struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true);
+       int ret = 0;
 
        dapm_assert_locked(dapm);
 
@@ -2573,13 +2574,14 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
                dapm_mark_dirty(w, "pin configuration");
                dapm_widget_invalidate_input_paths(w);
                dapm_widget_invalidate_output_paths(w);
+               ret = 1;
        }
 
        w->connected = status;
        if (status == 0)
                w->force = 0;
 
-       return 0;
+       return ret;
 }
 
 /**
@@ -3583,14 +3585,15 @@ int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol,
 {
        struct snd_soc_card *card = snd_kcontrol_chip(kcontrol);
        const char *pin = (const char *)kcontrol->private_value;
+       int ret;
 
        if (ucontrol->value.integer.value[0])
-               snd_soc_dapm_enable_pin(&card->dapm, pin);
+               ret = snd_soc_dapm_enable_pin(&card->dapm, pin);
        else
-               snd_soc_dapm_disable_pin(&card->dapm, pin);
+               ret = snd_soc_dapm_disable_pin(&card->dapm, pin);
 
        snd_soc_dapm_sync(&card->dapm);
-       return 0;
+       return ret;
 }
 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_pin_switch);
 
@@ -4023,7 +4026,7 @@ static int snd_soc_dapm_dai_link_put(struct snd_kcontrol *kcontrol,
 
        rtd->params_select = ucontrol->value.enumerated.item[0];
 
-       return 0;
+       return 1;
 }
 
 static void