ASoC: mchp-i2s-mcc: Fix unprepare of GCLK
authorCodrin Ciubotariu <codrin.ciubotariu@microchip.com>
Tue, 20 Aug 2019 16:24:09 +0000 (19:24 +0300)
committerMark Brown <broonie@kernel.org>
Tue, 20 Aug 2019 17:36:32 +0000 (18:36 +0100)
If hw_free() gets called after hw_params(), GCLK remains prepared,
preventing further use of it. This patch fixes this by unpreparing the
clock in hw_free() or if hw_params() gets an error.

Fixes: 7e0cdf545a55 ("ASoC: mchp-i2s-mcc: add driver for I2SC Multi-Channel Controller")
Signed-off-by: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
Link: https://lore.kernel.org/r/20190820162411.24836-2-codrin.ciubotariu@microchip.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/atmel/mchp-i2s-mcc.c

index 86495883ca3f1c7b1b89672ca2573c86ccf6d3ee..319f975586f1845c3b8f7a38cc209c4c175ef340 100644 (file)
@@ -670,8 +670,13 @@ static int mchp_i2s_mcc_hw_params(struct snd_pcm_substream *substream,
        }
 
        ret = regmap_write(dev->regmap, MCHP_I2SMCC_MRA, mra);
-       if (ret < 0)
+       if (ret < 0) {
+               if (dev->gclk_use) {
+                       clk_unprepare(dev->gclk);
+                       dev->gclk_use = 0;
+               }
                return ret;
+       }
        return regmap_write(dev->regmap, MCHP_I2SMCC_MRB, mrb);
 }
 
@@ -708,9 +713,13 @@ static int mchp_i2s_mcc_hw_free(struct snd_pcm_substream *substream,
                regmap_write(dev->regmap, MCHP_I2SMCC_CR, MCHP_I2SMCC_CR_CKDIS);
 
                if (dev->gclk_running) {
-                       clk_disable_unprepare(dev->gclk);
+                       clk_disable(dev->gclk);
                        dev->gclk_running = 0;
                }
+               if (dev->gclk_use) {
+                       clk_unprepare(dev->gclk);
+                       dev->gclk_use = 0;
+               }
        }
 
        return 0;