]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ASoC: rsnd: Fix probe failure on HiHope boards due to endpoint parsing
authorLad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Thu, 10 Oct 2024 14:14:32 +0000 (15:14 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 1 Nov 2024 01:02:38 +0000 (02:02 +0100)
[ Upstream commit 9b064d200aa8fee9d1d7ced05d8a617e45966715 ]

On the HiHope boards, we have a single port with a single endpoint defined
as below:
....
        rsnd_port: port {
                rsnd_endpoint: endpoint {
                        remote-endpoint = <&dw_hdmi0_snd_in>;

                        dai-format = "i2s";
                        bitclock-master = <&rsnd_endpoint>;
                        frame-master = <&rsnd_endpoint>;

                        playback = <&ssi2>;
                };
        };
....

With commit 547b02f74e4a ("ASoC: rsnd: enable multi Component support for
Audio Graph Card/Card2"), support for multiple ports was added. This caused
probe failures on HiHope boards, as the endpoint could not be retrieved due
to incorrect device node pointers being used.

This patch fixes the issue by updating the `rsnd_dai_of_node()` and
`rsnd_dai_probe()` functions to use the correct device node pointers based
on the port names ('port' or 'ports'). It ensures that the endpoint is
properly parsed for both single and multi-port configurations, restoring
compatibility with HiHope boards.

Fixes: 547b02f74e4a ("ASoC: rsnd: enable multi Component support for Audio Graph Card/Card2")
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Acked-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Link: https://patch.msgid.link/20241010141432.716868-1-prabhakar.mahadev-lad.rj@bp.renesas.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
sound/soc/sh/rcar/core.c

index 63b3c8bf0fdef5f57c36cf462069baa4400f360a..eda8de226439506cb7ab1baad7854f1d15c7bb4c 100644 (file)
@@ -1298,7 +1298,9 @@ audio_graph:
                if (!of_node_name_eq(ports, "ports") &&
                    !of_node_name_eq(ports, "port"))
                        continue;
-               priv->component_dais[i] = of_graph_get_endpoint_count(ports);
+               priv->component_dais[i] =
+                       of_graph_get_endpoint_count(of_node_name_eq(ports, "ports") ?
+                                                   ports : np);
                nr += priv->component_dais[i];
                i++;
                if (i >= RSND_MAX_COMPONENT) {
@@ -1510,7 +1512,8 @@ static int rsnd_dai_probe(struct rsnd_priv *priv)
                        if (!of_node_name_eq(ports, "ports") &&
                            !of_node_name_eq(ports, "port"))
                                continue;
-                       for_each_endpoint_of_node(ports, dai_np) {
+                       for_each_endpoint_of_node(of_node_name_eq(ports, "ports") ?
+                                                 ports : np, dai_np) {
                                __rsnd_dai_probe(priv, dai_np, dai_np, 0, dai_i);
                                if (!rsnd_is_gen1(priv) && !rsnd_is_gen2(priv)) {
                                        rdai = rsnd_rdai_get(priv, dai_i);