diff mbox series

[v2] ASoC: rsnd: Fix probe failure on HiHope boards due to endpoint parsing

Message ID 20241011131040.1059130-1-prabhakar.mahadev-lad.rj@bp.renesas.com (mailing list archive)
State New, archived
Headers show
Series [v2] ASoC: rsnd: Fix probe failure on HiHope boards due to endpoint parsing | expand

Commit Message

Lad, Prabhakar Oct. 11, 2024, 1:10 p.m. UTC
From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>

On HiHope boards, the audio configuration uses a single port with one
endpoint, defined as:

    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>;
        };
    };

Commit 547b02f74e4a ("ASoC: rsnd: enable multi Component support for Audio
Graph Card/Card2") added support for multiple ports. This caused probe
failures on HiHope boards because the device node pointers used to
retrieve the endpoint were incorrect.

This patch resolves the issue by introducing a new helper function,
`rsnd_pick_endpoint_node_for_ports()`, which retrieves the correct device
node pointer by checking if the port is named 'port' or 'ports'. The
`rsnd_dai_of_node()` and `rsnd_dai_probe()` functions are updated to use
this helper, ensuring proper endpoint parsing in both single-port and
multi-port configurations. This restores 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>
---
v1->v2
- Added a helper function rsnd_pick_endpoint_node_for_ports()
- Updated commit message
- Dropped ACK from Morimoto-san
---
 sound/soc/sh/rcar/core.c | 26 ++++++++++++++++++++------
 1 file changed, 20 insertions(+), 6 deletions(-)

Comments

Mark Brown Oct. 11, 2024, 1:46 p.m. UTC | #1
On Fri, Oct 11, 2024 at 02:10:40PM +0100, Prabhakar wrote:

> v1->v2
> - Added a helper function rsnd_pick_endpoint_node_for_ports()
> - Updated commit message
> - Dropped ACK from Morimoto-san

v1 was already applied, can you please send an incremental patch
instead?
Lad, Prabhakar Oct. 11, 2024, 1:57 p.m. UTC | #2
Hi Mark,

On Fri, Oct 11, 2024 at 2:46 PM Mark Brown <broonie@kernel.org> wrote:
>
> On Fri, Oct 11, 2024 at 02:10:40PM +0100, Prabhakar wrote:
>
> > v1->v2
> > - Added a helper function rsnd_pick_endpoint_node_for_ports()
> > - Updated commit message
> > - Dropped ACK from Morimoto-san
>
> v1 was already applied, can you please send an incremental patch
> instead?

Sure, I will do that.

Cheers,
Prabhakar
diff mbox series

Patch

diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index 9784718a2b6f..b74061b04968 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -1233,6 +1233,19 @@  int rsnd_node_count(struct rsnd_priv *priv, struct device_node *node, char *name
 	return i;
 }
 
+static struct device_node*
+	rsnd_pick_endpoint_node_for_ports(struct device_node *e_ports,
+					  struct device_node *e_port)
+{
+	if (of_node_name_eq(e_ports, "ports"))
+		return e_ports;
+
+	if (of_node_name_eq(e_ports, "port"))
+		return e_port;
+
+	return NULL;
+}
+
 static int rsnd_dai_of_node(struct rsnd_priv *priv, int *is_graph)
 {
 	struct device *dev = rsnd_priv_to_dev(priv);
@@ -1278,10 +1291,10 @@  static int rsnd_dai_of_node(struct rsnd_priv *priv, int *is_graph)
 	 * Audio-Graph-Card
 	 */
 	for_each_child_of_node(np, ports) {
-		if (!of_node_name_eq(ports, "ports") &&
-		    !of_node_name_eq(ports, "port"))
+		node = rsnd_pick_endpoint_node_for_ports(ports, np);
+		if (!node)
 			continue;
-		priv->component_dais[i] = of_graph_get_endpoint_count(ports);
+		priv->component_dais[i] = of_graph_get_endpoint_count(node);
 		nr += priv->component_dais[i];
 		i++;
 		if (i >= RSND_MAX_COMPONENT) {
@@ -1486,14 +1499,15 @@  static int rsnd_dai_probe(struct rsnd_priv *priv)
 	 */
 	dai_i = 0;
 	if (is_graph) {
+		struct device_node *dai_np_port;
 		struct device_node *ports;
 		struct device_node *dai_np;
 
 		for_each_child_of_node(np, ports) {
-			if (!of_node_name_eq(ports, "ports") &&
-			    !of_node_name_eq(ports, "port"))
+			dai_np_port = rsnd_pick_endpoint_node_for_ports(ports, np);
+			if (!dai_np_port)
 				continue;
-			for_each_endpoint_of_node(ports, dai_np) {
+			for_each_endpoint_of_node(dai_np_port, 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);