diff mbox series

[4.19.y-cip,1/2] ASoC: rsnd: fixup SSI clock during suspend/resume modes

Message ID 1595267543-32854-1-git-send-email-biju.das.jz@bp.renesas.com (mailing list archive)
State Accepted
Delegated to: Nobuhiro Iwamatsu
Headers show
Series [4.19.y-cip,1/2] ASoC: rsnd: fixup SSI clock during suspend/resume modes | expand

Commit Message

Biju Das July 20, 2020, 5:52 p.m. UTC
From: Dmytro Prokopchuk <dmytro.prokopchuk@globallogic.com>

commit 624d1a7cd8991e33dad96ab4629a52c412540e65 upstream.

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>
Signed-off-by: Biju Das <biju.das@bp.renesas.com>
---
 sound/soc/sh/rcar/dma.c  |  7 +++----
 sound/soc/sh/rcar/rsnd.h | 14 +++++++-------
 2 files changed, 10 insertions(+), 11 deletions(-)

Comments

Pavel Machek July 20, 2020, 8:59 p.m. UTC | #1
Hi!

> commit 624d1a7cd8991e33dad96ab4629a52c412540e65 upstream.
> 
> 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.

Ok, this is "interesting". It has something to do with rsnd_dai_call()
macro.

You really should not be programming drivers in preprocessor like
this.

OTOH patch is simple enough, and only affects "your" code, so ... I'll
apply it if there are no other comments.

>  #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
> @@ -365,7 +365,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
diff mbox series

Patch

diff --git a/sound/soc/sh/rcar/dma.c b/sound/soc/sh/rcar/dma.c
index 83bf0f6..58da57e 100644
--- a/sound/soc/sh/rcar/dma.c
+++ b/sound/soc/sh/rcar/dma.c
@@ -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.
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index c449d9f..31bf791 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -320,9 +320,8 @@  struct rsnd_mod {
 /*
  * status
  *
- * 0xH0000CBA
+ * 0xH0000CB0
  *
- * A	0: prepare	1: cleanup
  * B	0: init		1: quit
  * C	0: start	1: stop
  *
@@ -333,9 +332,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
@@ -347,11 +345,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
@@ -365,7 +365,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