From 3357e04d30eebbb65170295373aabe14e07fb8f0 Mon Sep 17 00:00:00 2001 From: Sam Stephenson Date: Fri, 3 Dec 2021 15:38:13 +1300 Subject: [PATCH] ASoC: madera: Unset SYSCLK_ENA while configuring system clock Resolves a fequency shift issue where audio was produced consistently 10% below the desired frequency, presumably due to the value of the SYSCLK_FRAC register not being applied. --- sound/soc/codecs/madera.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/sound/soc/codecs/madera.c b/sound/soc/codecs/madera.c index 3fce9caf8a753..c385fe80c025c 100644 --- a/sound/soc/codecs/madera.c +++ b/sound/soc/codecs/madera.c @@ -2911,7 +2911,7 @@ int madera_set_sysclk(struct snd_soc_component *component, int clk_id, reg = MADERA_SYSTEM_CLOCK_1; clk = &priv->sysclk; clk_freq_sel = madera_get_sysclk_setting(freq); - mask |= MADERA_SYSCLK_FRAC; + mask |= MADERA_SYSCLK_FRAC | MADERA_SYSCLK_ENA; break; case MADERA_CLK_ASYNCCLK_1: name = "ASYNCCLK"; @@ -2971,7 +2971,24 @@ int madera_set_sysclk(struct snd_soc_component *component, int clk_id, dev_dbg(madera->dev, "%s set to %uHz\n", name, freq); - return regmap_update_bits(madera->regmap, reg, mask, val); + ret = regmap_update_bits(madera->regmap, reg, mask, val); + if (ret) + { + dev_err(madera->dev, "Failed to set sysclk\n"); + return ret; + } + + if (clk_id == MADERA_CLK_SYSCLK_1) + { + ret = regmap_update_bits(madera->regmap, reg, MADERA_SYSCLK_ENA_MASK, MADERA_SYSCLK_ENA); + if (ret) + { + dev_err(madera->dev, "Failed to set SYSCLK_ENA"); + return ret; + } + } + + return 0; } EXPORT_SYMBOL_GPL(madera_set_sysclk);