Merge series "ASoC: rsnd: Fixes for multichannel HDMI audio output" from Matthias Blankertz <matthias.blankertz@cetitec.com>:
This fixes two issues in the snd-soc-rcar driver blocking multichannel
HDMI audio out: The parent SSI in a multi-SSI configuration is not
correctly set up and started, and the SSI->HDMI channel mapping is
wrong.
With these patches, the following device tree snippet can be used on an
r8a7795-based platform (Salvator-X) to enable multichannel HDMI audio on
HDMI0:
rsnd_port1: port@1 {
rsnd_endpoint1: endpoint {
remote-endpoint = <&dw_hdmi0_snd_in>;
dai-format = "i2s";
bitclock-master = <&rsnd_endpoint1>;
frame-master = <&rsnd_endpoint1>;
playback = <&ssi0 &ssi1 &ssi2 &ssi9>;
};
};
With a capable receiver attached, all of 2ch (stereo), 6ch (e.g. 5.1)
and 8ch audio output should work.
Matthias Blankertz (2):
ASoC: rsnd: Fix parent SSI start/stop in multi-SSI mode
ASoC: rsnd: Fix HDMI channel mapping for multi-SSI mode
sound/soc/sh/rcar/ssi.c | 8 ++++----
sound/soc/sh/rcar/ssiu.c | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
base-commit: 7111951b8d
--
2.26.0
This commit is contained in:
commit
15a5760cb8
|
@ -407,7 +407,7 @@ static void rsnd_ssi_config_init(struct rsnd_mod *mod,
|
||||||
* We shouldn't exchange SWSP after running.
|
* We shouldn't exchange SWSP after running.
|
||||||
* This means, parent needs to care it.
|
* 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;
|
goto init_end;
|
||||||
|
|
||||||
if (rsnd_io_is_play(io))
|
if (rsnd_io_is_play(io))
|
||||||
|
@ -559,7 +559,7 @@ static int rsnd_ssi_start(struct rsnd_mod *mod,
|
||||||
* EN is for data output.
|
* EN is for data output.
|
||||||
* SSI parent EN is not needed.
|
* 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;
|
return 0;
|
||||||
|
|
||||||
ssi->cr_en = EN;
|
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))
|
if (!rsnd_ssi_is_run_mods(mod, io))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (rsnd_ssi_is_parent(mod, io))
|
if (rsnd_ssi_is_parent(mod, io) && !rsnd_ssi_multi_slaves(io))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
cr = ssi->cr_own |
|
cr = ssi->cr_own |
|
||||||
|
@ -620,7 +620,7 @@ static int rsnd_ssi_irq(struct rsnd_mod *mod,
|
||||||
if (rsnd_is_gen1(priv))
|
if (rsnd_is_gen1(priv))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (rsnd_ssi_is_parent(mod, io))
|
if (rsnd_ssi_is_parent(mod, io) && !rsnd_ssi_multi_slaves(io))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!rsnd_ssi_is_run_mods(mod, io))
|
if (!rsnd_ssi_is_run_mods(mod, io))
|
||||||
|
|
|
@ -221,7 +221,7 @@ static int rsnd_ssiu_init_gen2(struct rsnd_mod *mod,
|
||||||
i;
|
i;
|
||||||
|
|
||||||
for_each_rsnd_mod_array(i, pos, io, rsnd_ssi_array) {
|
for_each_rsnd_mod_array(i, pos, io, rsnd_ssi_array) {
|
||||||
shift = (i * 4) + 16;
|
shift = (i * 4) + 20;
|
||||||
val = (val & ~(0xF << shift)) |
|
val = (val & ~(0xF << shift)) |
|
||||||
rsnd_mod_id(pos) << shift;
|
rsnd_mod_id(pos) << shift;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue