ASoC: meson: axg-tdm-interface: Fix formatters in trigger"
authorNeil Armstrong <narmstrong@baylibre.com>
Thu, 21 Apr 2022 15:57:24 +0000 (17:57 +0200)
committerMark Brown <broonie@kernel.org>
Thu, 21 Apr 2022 17:25:13 +0000 (18:25 +0100)
This reverts commit bf5e4887eeddb48480568466536aa08ec7f179a5 because
the following and required commit e138233e56e9829e65b6293887063a1a3ccb2d68
causes the following system crash when using audio:
 BUG: sleeping function called from invalid context at kernel/locking/mutex.c:282

Fixes: bf5e4887eeddb4848056846 ("ASoC: meson: axg-tdm-interface: manage formatters in trigger")
Reported-by: Dmitry Shmidt <dimitrysh@google.com>
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
Acked-by: Jerome Brunet <jbrunet@baylibre.com>
Link: https://lore.kernel.org/r/20220421155725.2589089-1-narmstrong@baylibre.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/meson/axg-tdm-interface.c

index 0c31934..e076ced 100644 (file)
@@ -351,29 +351,13 @@ static int axg_tdm_iface_hw_free(struct snd_pcm_substream *substream,
        return 0;
 }
 
-static int axg_tdm_iface_trigger(struct snd_pcm_substream *substream,
-                                int cmd,
+static int axg_tdm_iface_prepare(struct snd_pcm_substream *substream,
                                 struct snd_soc_dai *dai)
 {
-       struct axg_tdm_stream *ts =
-               snd_soc_dai_get_dma_data(dai, substream);
-
-       switch (cmd) {
-       case SNDRV_PCM_TRIGGER_START:
-       case SNDRV_PCM_TRIGGER_RESUME:
-       case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
-               axg_tdm_stream_start(ts);
-               break;
-       case SNDRV_PCM_TRIGGER_SUSPEND:
-       case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
-       case SNDRV_PCM_TRIGGER_STOP:
-               axg_tdm_stream_stop(ts);
-               break;
-       default:
-               return -EINVAL;
-       }
+       struct axg_tdm_stream *ts = snd_soc_dai_get_dma_data(dai, substream);
 
-       return 0;
+       /* Force all attached formatters to update */
+       return axg_tdm_stream_reset(ts);
 }
 
 static int axg_tdm_iface_remove_dai(struct snd_soc_dai *dai)
@@ -413,8 +397,8 @@ static const struct snd_soc_dai_ops axg_tdm_iface_ops = {
        .set_fmt        = axg_tdm_iface_set_fmt,
        .startup        = axg_tdm_iface_startup,
        .hw_params      = axg_tdm_iface_hw_params,
+       .prepare        = axg_tdm_iface_prepare,
        .hw_free        = axg_tdm_iface_hw_free,
-       .trigger        = axg_tdm_iface_trigger,
 };
 
 /* TDM Backend DAIs */