--- /dev/null
+From 0586f3b2e1bd332bc455b41bc5e19028c0fa2228 Mon Sep 17 00:00:00 2001
+From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Date: Thu, 18 Jan 2024 11:14:14 +0100
+Subject: Revert "ASoC: atmel: Remove system clock tree configuration for at91sam9g20ek"
+
+From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+This reverts commit 6eb9b4a36d08da0230e6a7712b17eafdfd996991 which is
+commit c775cbf62ed4911e4f0f23880f01815753123690 upstream.
+
+It is reported to cause problems, so drop it from the 5.15.y tree for now.
+
+Link: https://lore.kernel.org/r/845b3053-d47b-4717-9665-79b120da133b@sirena.org.uk
+Reported-by: Mark Brown <broonie@kernel.org>
+Cc: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
+Cc: Sasha Levin <sashal@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ sound/soc/atmel/sam9g20_wm8731.c | 61 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 61 insertions(+)
+
+--- a/sound/soc/atmel/sam9g20_wm8731.c
++++ b/sound/soc/atmel/sam9g20_wm8731.c
+@@ -59,6 +59,35 @@
+ */
+ #undef ENABLE_MIC_INPUT
+
++static struct clk *mclk;
++
++static int at91sam9g20ek_set_bias_level(struct snd_soc_card *card,
++ struct snd_soc_dapm_context *dapm,
++ enum snd_soc_bias_level level)
++{
++ static int mclk_on;
++ int ret = 0;
++
++ switch (level) {
++ case SND_SOC_BIAS_ON:
++ case SND_SOC_BIAS_PREPARE:
++ if (!mclk_on)
++ ret = clk_enable(mclk);
++ if (ret == 0)
++ mclk_on = 1;
++ break;
++
++ case SND_SOC_BIAS_OFF:
++ case SND_SOC_BIAS_STANDBY:
++ if (mclk_on)
++ clk_disable(mclk);
++ mclk_on = 0;
++ break;
++ }
++
++ return ret;
++}
++
+ static const struct snd_soc_dapm_widget at91sam9g20ek_dapm_widgets[] = {
+ SND_SOC_DAPM_MIC("Int Mic", NULL),
+ SND_SOC_DAPM_SPK("Ext Spk", NULL),
+@@ -117,6 +146,7 @@ static struct snd_soc_card snd_soc_at91s
+ .owner = THIS_MODULE,
+ .dai_link = &at91sam9g20ek_dai,
+ .num_links = 1,
++ .set_bias_level = at91sam9g20ek_set_bias_level,
+
+ .dapm_widgets = at91sam9g20ek_dapm_widgets,
+ .num_dapm_widgets = ARRAY_SIZE(at91sam9g20ek_dapm_widgets),
+@@ -129,6 +159,7 @@ static int at91sam9g20ek_audio_probe(str
+ {
+ struct device_node *np = pdev->dev.of_node;
+ struct device_node *codec_np, *cpu_np;
++ struct clk *pllb;
+ struct snd_soc_card *card = &snd_soc_at91sam9g20ek;
+ int ret;
+
+@@ -142,6 +173,31 @@ static int at91sam9g20ek_audio_probe(str
+ return -EINVAL;
+ }
+
++ /*
++ * Codec MCLK is supplied by PCK0 - set it up.
++ */
++ mclk = clk_get(NULL, "pck0");
++ if (IS_ERR(mclk)) {
++ dev_err(&pdev->dev, "Failed to get MCLK\n");
++ ret = PTR_ERR(mclk);
++ goto err;
++ }
++
++ pllb = clk_get(NULL, "pllb");
++ if (IS_ERR(pllb)) {
++ dev_err(&pdev->dev, "Failed to get PLLB\n");
++ ret = PTR_ERR(pllb);
++ goto err_mclk;
++ }
++ ret = clk_set_parent(mclk, pllb);
++ clk_put(pllb);
++ if (ret != 0) {
++ dev_err(&pdev->dev, "Failed to set MCLK parent\n");
++ goto err_mclk;
++ }
++
++ clk_set_rate(mclk, MCLK_RATE);
++
+ card->dev = &pdev->dev;
+
+ /* Parse device node info */
+@@ -185,6 +241,9 @@ static int at91sam9g20ek_audio_probe(str
+
+ return ret;
+
++err_mclk:
++ clk_put(mclk);
++ mclk = NULL;
+ err:
+ atmel_ssc_put_audio(0);
+ return ret;
+@@ -194,6 +253,8 @@ static int at91sam9g20ek_audio_remove(st
+ {
+ struct snd_soc_card *card = platform_get_drvdata(pdev);
+
++ clk_disable(mclk);
++ mclk = NULL;
+ snd_soc_unregister_card(card);
+ atmel_ssc_put_audio(0);
+