ASoC: fsi: fsi_set_master_clk() was called from fsi_hw_xxx() only
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Mon, 29 Oct 2012 07:37:22 +0000 (00:37 -0700)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Mon, 29 Oct 2012 18:46:39 +0000 (18:46 +0000)
Current FSI driver is using fsi_set_master_clk() if it needs system clock.
But this function was called from
fsi_hw_shutdown()/fsi_dai_trigger()/fsi_resume() without a sense of unity.
Because of this, sound playback after suspend failed sometimes.
To keep consistency, fsi_master_clk() was called from
fsi_hw_start/stop() only now.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/sh/fsi.c

index 1bd0df060afa37d9cfa2dc64095a98bbf8048522..53d1a7c0a6bb2b23bfccce5ae72bb785182d1033 100644 (file)
@@ -1333,12 +1333,17 @@ static int fsi_hw_startup(struct fsi_priv *fsi,
        /* fifo init */
        fsi_fifo_init(fsi, io, dev);
 
+       /* start master clock */
+       if (fsi_is_clk_master(fsi))
+               fsi_set_master_clk(dev, fsi, fsi->rate, 1);
+
        return 0;
 }
 
 static void fsi_hw_shutdown(struct fsi_priv *fsi,
                            struct device *dev)
 {
+       /* stop master clock */
        if (fsi_is_clk_master(fsi))
                fsi_set_master_clk(dev, fsi, fsi->rate, 0);
 }
@@ -1461,19 +1466,11 @@ static int fsi_dai_hw_params(struct snd_pcm_substream *substream,
                             struct snd_soc_dai *dai)
 {
        struct fsi_priv *fsi = fsi_get_priv(substream);
-       long rate = params_rate(params);
-       int ret;
-
-       if (!fsi_is_clk_master(fsi))
-               return 0;
-
-       ret = fsi_set_master_clk(dai->dev, fsi, rate, 1);
-       if (ret < 0)
-               return ret;
 
-       fsi->rate = rate;
+       if (fsi_is_clk_master(fsi))
+               fsi->rate = params_rate(params);
 
-       return ret;
+       return 0;
 }
 
 static const struct snd_soc_dai_ops fsi_dai_ops = {
@@ -1770,10 +1767,6 @@ static void __fsi_resume(struct fsi_priv *fsi,
                return;
 
        fsi_hw_startup(fsi, io, dev);
-
-       if (fsi_is_clk_master(fsi) && fsi->rate)
-               fsi_set_master_clk(dev, fsi, fsi->rate, 1);
-
        fsi_stream_start(fsi, io);
 }