ASoC: rsnd: Don't treat master SSI in multi SSI setup as parent

The master SSI of a multi-SSI setup was attached both to the
RSND_MOD_SSI slot and the RSND_MOD_SSIP slot of the rsnd_dai_stream.
This is not correct wrt. the meaning of being "parent" in the rest of
the SSI code, where it seems to indicate an SSI that provides clock and
word sync but is not transmitting/receiving audio data.

Not treating the multi-SSI master as parent allows removal of various
special cases to the rsnd_ssi_is_parent conditions introduced in commit
a09fb3f28a ("ASoC: rsnd: Fix parent SSI start/stop in multi-SSI mode").
It also fixes the issue that operations performed via rsnd_dai_call()
were performed twice for the master SSI. This caused some "status check
failed" spam when stopping a multi-SSI stream as the driver attempted to
stop the master SSI twice.

Signed-off-by: Matthias Blankertz <matthias.blankertz@cetitec.com>
Acked-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Link: https://lore.kernel.org/r/20200417153017.1744454-2-matthias.blankertz@cetitec.com
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Matthias Blankertz 2020-04-17 17:30:16 +02:00 committed by Mark Brown
parent 15a5760cb8
commit 0c258657dd
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0

View File

@ -407,7 +407,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) && !rsnd_ssi_multi_slaves(io))
if (rsnd_ssi_is_parent(mod, io))
goto init_end;
if (rsnd_io_is_play(io))
@ -559,7 +559,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) && !rsnd_ssi_multi_slaves(io))
if (rsnd_ssi_is_parent(mod, io))
return 0;
ssi->cr_en = EN;
@ -582,7 +582,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) && !rsnd_ssi_multi_slaves(io))
if (rsnd_ssi_is_parent(mod, io))
return 0;
cr = ssi->cr_own |
@ -620,7 +620,7 @@ static int rsnd_ssi_irq(struct rsnd_mod *mod,
if (rsnd_is_gen1(priv))
return 0;
if (rsnd_ssi_is_parent(mod, io) && !rsnd_ssi_multi_slaves(io))
if (rsnd_ssi_is_parent(mod, io))
return 0;
if (!rsnd_ssi_is_run_mods(mod, io))
@ -737,6 +737,9 @@ static void rsnd_ssi_parent_attach(struct rsnd_mod *mod,
if (!rsnd_rdai_is_clk_master(rdai))
return;
if (rsnd_ssi_is_multi_slave(mod, io))
return;
switch (rsnd_mod_id(mod)) {
case 1:
case 2: