]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
ASoC: rsnd: fixup SSI clock during suspend/resume modes
authorDmytro Prokopchuk <dmytro.prokopchuk@globallogic.com>
Fri, 21 Sep 2018 04:59:59 +0000 (04:59 +0000)
committerMark Brown <broonie@kernel.org>
Fri, 21 Sep 2018 17:03:54 +0000 (10:03 -0700)
Prepare <-> Cleanup functions pair has balanced calls.
But in case of suspend mode no call to rsnd_soc_dai_shutdown()
function, so cleanup isn't called. OTOH during resume mode
function rsnd_soc_dai_prepare() is called, but calling
rsnd_ssi_prepare() is skipped (rsnd_status_update() returns zero,
bacause was not cleanup before).
We need to call rsnd_ssi_prepare(), because it enables SSI clocks
by calling rsnd_ssi_master_clk_start().

This patch allows to call prepare/cleanup functions always.

Signed-off-by: Dmytro Prokopchuk <dmytro.prokopchuk@globallogic.com>
Tested-by: Hiroyuki Yokoyama <hiroyuki.yokoyama.vx@renesas.com>
[kuninori: adjusted to upstream]
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sh/rcar/dma.c
sound/soc/sh/rcar/rsnd.h

index 0bbc4b0ea2c6d65daf62cff46489bdc9bf20e3ec..6d1947515dc8fce87a95eb21a2f2f8bf635ea7a1 100644 (file)
@@ -134,10 +134,9 @@ static int rsnd_dmaen_prepare(struct rsnd_mod *mod,
        struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
        struct device *dev = rsnd_priv_to_dev(priv);
 
-       if (dmaen->chan) {
-               dev_err(dev, "it already has dma channel\n");
-               return -EIO;
-       }
+       /* maybe suspended */
+       if (dmaen->chan)
+               return 0;
 
        /*
         * DMAEngine request uses mutex lock.
index e857311ee5c1de724640d92fc10d69cc2abf7bbe..4464d1d0a042c55449615b32f7c174b041a9242b 100644 (file)
@@ -318,9 +318,8 @@ struct rsnd_mod {
 /*
  * status
  *
- * 0xH0000CBA
+ * 0xH0000CB0
  *
- * A   0: prepare      1: cleanup
  * B   0: init         1: quit
  * C   0: start        1: stop
  *
@@ -331,9 +330,8 @@ struct rsnd_mod {
  * H   0: hw_params
  * H   0: pointer
  * H   0: prepare
+ * H   0: cleanup
  */
-#define __rsnd_mod_shift_prepare       0
-#define __rsnd_mod_shift_cleanup       0
 #define __rsnd_mod_shift_init          4
 #define __rsnd_mod_shift_quit          4
 #define __rsnd_mod_shift_start         8
@@ -345,11 +343,13 @@ struct rsnd_mod {
 #define __rsnd_mod_shift_fallback      28 /* always called */
 #define __rsnd_mod_shift_hw_params     28 /* always called */
 #define __rsnd_mod_shift_pointer       28 /* always called */
+#define __rsnd_mod_shift_prepare       28 /* always called */
+#define __rsnd_mod_shift_cleanup       28 /* always called */
 
 #define __rsnd_mod_add_probe           0
 #define __rsnd_mod_add_remove          0
-#define __rsnd_mod_add_prepare          1
-#define __rsnd_mod_add_cleanup         -1
+#define __rsnd_mod_add_prepare         0
+#define __rsnd_mod_add_cleanup         0
 #define __rsnd_mod_add_init             1
 #define __rsnd_mod_add_quit            -1
 #define __rsnd_mod_add_start            1
@@ -363,7 +363,7 @@ struct rsnd_mod {
 #define __rsnd_mod_call_probe          0
 #define __rsnd_mod_call_remove         0
 #define __rsnd_mod_call_prepare                0
-#define __rsnd_mod_call_cleanup                1
+#define __rsnd_mod_call_cleanup                0
 #define __rsnd_mod_call_init           0
 #define __rsnd_mod_call_quit           1
 #define __rsnd_mod_call_start          0