| From fa31fd451b1bf1d12da230ae2ff12a233e77308c Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 15 Apr 2020 16:10:16 +0200 |
| Subject: ASoC: rsnd: Fix parent SSI start/stop in multi-SSI mode |
| |
| From: Matthias Blankertz <matthias.blankertz@cetitec.com> |
| |
| [ Upstream commit a09fb3f28a60ba3e928a1fa94b0456780800299d ] |
| |
| The parent SSI of a multi-SSI setup must be fully setup, started and |
| stopped since it is also part of the playback/capture setup. So only |
| skip the SSI (as per commit 203cdf51f288 ("ASoC: rsnd: SSI parent cares |
| SWSP bit") and commit 597b046f0d99 ("ASoC: rsnd: control SSICR::EN |
| correctly")) if the SSI is parent outside of a multi-SSI setup. |
| |
| Signed-off-by: Matthias Blankertz <matthias.blankertz@cetitec.com> |
| Acked-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Link: https://lore.kernel.org/r/20200415141017.384017-2-matthias.blankertz@cetitec.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| sound/soc/sh/rcar/ssi.c | 8 ++++---- |
| 1 file changed, 4 insertions(+), 4 deletions(-) |
| |
| diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c |
| index 33dc8d6ad35b2..3fe88f7743824 100644 |
| --- a/sound/soc/sh/rcar/ssi.c |
| +++ b/sound/soc/sh/rcar/ssi.c |
| @@ -375,7 +375,7 @@ static void rsnd_ssi_config_init(struct rsnd_mod *mod, |
| * We shouldn't exchange SWSP after running. |
| * This means, parent needs to care it. |
| */ |
| - if (rsnd_ssi_is_parent(mod, io)) |
| + if (rsnd_ssi_is_parent(mod, io) && !rsnd_ssi_multi_slaves(io)) |
| goto init_end; |
| |
| if (rsnd_io_is_play(io)) |
| @@ -531,7 +531,7 @@ static int rsnd_ssi_start(struct rsnd_mod *mod, |
| * EN is for data output. |
| * SSI parent EN is not needed. |
| */ |
| - if (rsnd_ssi_is_parent(mod, io)) |
| + if (rsnd_ssi_is_parent(mod, io) && !rsnd_ssi_multi_slaves(io)) |
| return 0; |
| |
| ssi->cr_en = EN; |
| @@ -554,7 +554,7 @@ static int rsnd_ssi_stop(struct rsnd_mod *mod, |
| if (!rsnd_ssi_is_run_mods(mod, io)) |
| return 0; |
| |
| - if (rsnd_ssi_is_parent(mod, io)) |
| + if (rsnd_ssi_is_parent(mod, io) && !rsnd_ssi_multi_slaves(io)) |
| return 0; |
| |
| cr = ssi->cr_own | |
| @@ -592,7 +592,7 @@ static int rsnd_ssi_irq(struct rsnd_mod *mod, |
| if (rsnd_is_gen1(priv)) |
| return 0; |
| |
| - if (rsnd_ssi_is_parent(mod, io)) |
| + if (rsnd_ssi_is_parent(mod, io) && !rsnd_ssi_multi_slaves(io)) |
| return 0; |
| |
| if (!rsnd_ssi_is_run_mods(mod, io)) |
| -- |
| 2.20.1 |
| |