From nobody Sun Feb 8 20:58:47 2026 Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1810417333D for ; Fri, 20 Dec 2024 07:11:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734678722; cv=none; b=cn4Q0R6SMwfDaTMqycwGzmy6Agg3pa8VmxxancsHZd80fffAHAkuBlPKlUsE9gcRq/k2moZBkaqbX1T7i55HxFBLNRSLa99wTNl1baAwXuoCeMtPpWIWwv8GmR0tO5qCOvmcJkH4advAN8VgW/Y1SjzgZsQOyVSvm0vJ7bbQcJM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734678722; c=relaxed/simple; bh=U+lFPXKPpGhCF3pIQJ+J2uM9+UEO3/rE6nofsZnRYG0=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=qGh/yXQEq35f4xBup21d19ITi2KALkfcSSAnATy6D9F1bN1gavfkFEgndp3i+Hc5vsIeraD+/gcIp2QGaoBU9XGPALuOeZK4dKxqJLLyyQjxCbVX5X7Tz2S59q2bOjan+T4ukwB0BTs4fGFiWUaRnwLovBVKJtABw6UOWXgav/0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=H4CwZDPm; arc=none smtp.client-ip=209.85.221.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="H4CwZDPm" Received: by mail-wr1-f44.google.com with SMTP id ffacd0b85a97d-385eed29d17so794029f8f.0 for ; Thu, 19 Dec 2024 23:11:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1734678718; x=1735283518; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=qxJg4W4ceRLI3xU0GNrM6kdx1W1KOEHbJ60meRiAmv8=; b=H4CwZDPm0QO3Nm/BnY8ueUEpPuHl+6ykJH/cl9CdSc3UTW3hwFO2txZHvNb8z2Eca3 nREGGLA0Ug8mOJ1W3yPXnrZgRYql3X35wYOPGM77DKoQ/aQqihanVOFG+IlHzT0Qr8v0 Xe8vsbB30wmISCvqB2VuDu+uhOdO46rR6r/Ew79wkALUuWJ8kbXZPtubfZOhy6AX4SPz DXgRPnVEV8vCzd4INdeeN396bSboZS5hu0ft7hMR4zhSTEnCP8n0O3pbvGnX2oYAV9K+ uWopH1LgAu5IGA31wAGC+05byWXXMjivEMk9YF6HBqI6P3t3+e0OYeDPYw7pYSuRjJFS aYjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734678718; x=1735283518; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=qxJg4W4ceRLI3xU0GNrM6kdx1W1KOEHbJ60meRiAmv8=; b=C+yYJxp7VoFU8PtaGsy8uSZyVfWMVb/RvsfRwPMpCym3DuYSBd61kKgnrwpF2Q8BSE TrLVIlSmTD8lSqPD2OjIAuqrVhXUdBRW2SkaqnCizEDrkZqGkvuqDbGXj24ulDcA8Pos afCmGvwKCpbkMUMouIz03tDuoJcKy/U5FCs5B/5FAOd/OWL2ENiLl9kgpyTEHn2rNL+4 x0jqLAewIzjJNrPbNZu4XOC5wEl5bUCaw+fZ/hBLf3NQn/Acxa1NKNlViI+2syg2fHUn txpm9GQwW1G1fx2xaqbs74XKwPdtqmdijb/OCuFhBBGepzVHBR7+5P4/31adq1GmeO+l xOcA== X-Forwarded-Encrypted: i=1; AJvYcCVbmNIWuXrSo1goStEYkqI3Ky7575ohqwOQoxMOiOQ8XzClkZFTQTjKb8h0IfW8mxFbWkGpAc76XNQ3iVA=@vger.kernel.org X-Gm-Message-State: AOJu0YwPVOH60/9IyiyI17wlQe21Hckr9wdwMe/dyVnmHNJTjQjJsx5/ 5wvLDKKMu07hIIJjkbjix/zywDqNNkjHoR+yY9ELbvT4HQNEhQY8 X-Gm-Gg: ASbGncsr0XMwPw/S+06bCulB9nlnVpHnUD5MOLcCl/BHiXpxaq0xVjoywilM4p6kmbD kip+LJFsARP6/4glYRjFBbbvf4ZsGcGjqKUE6K8fJdo/qNDQwJdez1LxX8i1JZOvHLEIyjn6TaD Zv6gB9IoiiW5ObALKWyaccEknRtKlVp9edfBHNdMW7gTO7Ttzj3D2/CAeuq19S/9uqbOziZZxp0 CEcP8NA3UxfiCgV9A2eWz49tApSiT9lvPJDV0kQZhKs8gmSKXcKrHBH4Q7vDWWEfj4xXYXpAJEp Tso= X-Google-Smtp-Source: AGHT+IH3fSbI2/+wmvOWLHZ/lpyuNVQawnOms/LTI4+/xcIe2KHeAdDdUp7xaLT1ViMFkFD+K/fEFQ== X-Received: by 2002:a5d:5f8b:0:b0:385:fd31:ca34 with SMTP id ffacd0b85a97d-38a223fda01mr1452337f8f.54.1734678718290; Thu, 19 Dec 2024 23:11:58 -0800 (PST) Received: from localhost.localdomain ([95.43.220.235]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38a1c89e1c0sm3349454f8f.77.2024.12.19.23.11.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Dec 2024 23:11:57 -0800 (PST) From: Ivaylo Dimitrov To: lgirdwood@gmail.com, broonie@kernel.org, perex@perex.cz, tiwai@suse.com, tony@atomide.com Cc: alsa-devel@alsa-project.org, linux-kernel@vger.kernel.org, Ivaylo Dimitrov Subject: [RFC PATCH] soc: audio-graph-card2: use correct endpoint when getting link parameters Date: Fri, 20 Dec 2024 09:11:26 +0200 Message-Id: <20241220071126.1066691-1-ivo.g.dimitrov.75@gmail.com> X-Mailer: git-send-email 2.25.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" We may have multiple links between ports, with each link having different parameters. Currently, no matter the topology, it is always port endpoint 0 that is used when setting parameters. On a complex sound system, like the one found on Motorola droid4, hifi and voice DAIs require differents formats (i2s vs dsp_a) and curently it is impossible to use DT to set that. =20 Implementing the change leads to partially dropping of at least 0dedbde5062d (ASoC: cpcap: Implement set_tdm_slot for voice call support), as core does most of what is needed to configure voice DAI. We (on Maemo Leste ) use the patch (along with few others) to have voice calls working properly on d4 through UCM. The patch is for linux 6.6, I want to know whether the approach would be accepted before sending a proper patch for current master. the original commit message follows: When link parameters are parsed, it is always endpoint@0 that is used and parameters set to other endpoints are ignored. Fix that by using endpoint that is set in DT when parsing link parameters. Signed-off-by: Ivaylo Dimitrov --- sound/soc/generic/audio-graph-card2.c | 59 +++++++++++++-------------- 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/sound/soc/generic/audio-graph-card2.c b/sound/soc/generic/audi= o-graph-card2.c index b1c675c6b6db..163a20c8ffee 100644 --- a/sound/soc/generic/audio-graph-card2.c +++ b/sound/soc/generic/audio-graph-card2.c @@ -508,17 +508,16 @@ static int __graph_parse_node(struct asoc_simple_priv= *priv, =20 static int graph_parse_node(struct asoc_simple_priv *priv, enum graph_type gtype, - struct device_node *port, + struct device_node *ep, struct link_info *li, int is_cpu) { - struct device_node *ep; int ret =3D 0; + struct device_node *port =3D of_get_parent(ep); + bool is_multi =3D graph_lnk_is_multi(port); =20 - if (graph_lnk_is_multi(port)) { + if (is_multi) { int idx; =20 - of_node_get(port); - for (idx =3D 0;; idx++) { ep =3D graph_get_next_multi_ep(&port); if (!ep) @@ -532,9 +531,8 @@ static int graph_parse_node(struct asoc_simple_priv *pr= iv, } } else { /* Single CPU / Codec */ - ep =3D port_to_endpoint(port); + of_node_put(port); ret =3D __graph_parse_node(priv, gtype, ep, li, is_cpu, 0); - of_node_put(ep); } =20 return ret; @@ -591,22 +589,20 @@ static void graph_parse_daifmt(struct device_node *no= de, } =20 static void graph_link_init(struct asoc_simple_priv *priv, - struct device_node *port, + struct device_node *ep, struct link_info *li, int is_cpu_node) { struct snd_soc_dai_link *dai_link =3D simple_priv_to_link(priv, li->link); - struct device_node *ep; + struct device_node *port =3D of_get_parent(ep); + bool is_multi =3D graph_lnk_is_multi(port); struct device_node *ports; unsigned int daifmt =3D 0, daiclk =3D 0; unsigned int bit_frame =3D 0; =20 - if (graph_lnk_is_multi(port)) { - of_node_get(port); + if (is_multi) { ep =3D graph_get_next_multi_ep(&port); port =3D of_get_parent(ep); - } else { - ep =3D port_to_endpoint(port); } =20 ports =3D of_get_parent(port); @@ -642,6 +638,9 @@ static void graph_link_init(struct asoc_simple_priv *pr= iv, dai_link->ops =3D &graph_ops; if (priv->ops) dai_link->ops =3D priv->ops; + + of_node_put(port); + of_node_put(ports); } =20 int audio_graph2_link_normal(struct asoc_simple_priv *priv, @@ -650,7 +649,7 @@ int audio_graph2_link_normal(struct asoc_simple_priv *p= riv, { struct device_node *cpu_port =3D lnk; struct device_node *cpu_ep =3D port_to_endpoint(cpu_port); - struct device_node *codec_port =3D of_graph_get_remote_port(cpu_ep); + struct device_node *codec_ep =3D of_graph_get_remote_endpoint(cpu_ep); int ret; =20 /* @@ -658,20 +657,20 @@ int audio_graph2_link_normal(struct asoc_simple_priv = *priv, * see * __graph_parse_node() :: DAI Naming */ - ret =3D graph_parse_node(priv, GRAPH_NORMAL, codec_port, li, 0); + ret =3D graph_parse_node(priv, GRAPH_NORMAL, codec_ep, li, 0); if (ret < 0) goto err; =20 /* * call CPU, and set DAI Name */ - ret =3D graph_parse_node(priv, GRAPH_NORMAL, cpu_port, li, 1); + ret =3D graph_parse_node(priv, GRAPH_NORMAL, cpu_ep, li, 1); if (ret < 0) goto err; =20 - graph_link_init(priv, cpu_port, li, 1); + graph_link_init(priv, cpu_ep, li, 1); err: - of_node_put(codec_port); + of_node_put(codec_ep); of_node_put(cpu_ep); =20 return ret; @@ -684,7 +683,6 @@ int audio_graph2_link_dpcm(struct asoc_simple_priv *pri= v, { struct device_node *ep =3D port_to_endpoint(lnk); struct device_node *rep =3D of_graph_get_remote_endpoint(ep); - struct device_node *rport =3D of_graph_get_remote_port(ep); struct snd_soc_dai_link *dai_link =3D simple_priv_to_link(priv, li->link); struct simple_dai_props *dai_props =3D simple_priv_to_props(priv, li->lin= k); int is_cpu =3D asoc_graph_is_ports0(lnk); @@ -718,7 +716,7 @@ int audio_graph2_link_dpcm(struct asoc_simple_priv *pri= v, dai_link->dynamic =3D 1; dai_link->dpcm_merged_format =3D 1; =20 - ret =3D graph_parse_node(priv, GRAPH_DPCM, rport, li, 1); + ret =3D graph_parse_node(priv, GRAPH_DPCM, rep, li, 1); if (ret) goto err; } else { @@ -751,7 +749,7 @@ int audio_graph2_link_dpcm(struct asoc_simple_priv *pri= v, dai_link->no_pcm =3D 1; dai_link->be_hw_params_fixup =3D asoc_simple_be_hw_params_fixup; =20 - ret =3D graph_parse_node(priv, GRAPH_DPCM, rport, li, 0); + ret =3D graph_parse_node(priv, GRAPH_DPCM, rep, li, 0); if (ret < 0) goto err; } @@ -761,11 +759,10 @@ int audio_graph2_link_dpcm(struct asoc_simple_priv *p= riv, =20 snd_soc_dai_link_set_capabilities(dai_link); =20 - graph_link_init(priv, rport, li, is_cpu); + graph_link_init(priv, rep, li, is_cpu); err: of_node_put(ep); of_node_put(rep); - of_node_put(rport); =20 return ret; } @@ -777,7 +774,7 @@ int audio_graph2_link_c2c(struct asoc_simple_priv *priv, { struct snd_soc_dai_link *dai_link =3D simple_priv_to_link(priv, li->link); struct device_node *port0, *port1, *ports; - struct device_node *codec0_port, *codec1_port; + struct device_node *codec0_ep, *codec1_ep; struct device_node *ep0, *ep1; u32 val =3D 0; int ret =3D -EINVAL; @@ -834,31 +831,31 @@ int audio_graph2_link_c2c(struct asoc_simple_priv *pr= iv, ep0 =3D port_to_endpoint(port0); ep1 =3D port_to_endpoint(port1); =20 - codec0_port =3D of_graph_get_remote_port(ep0); - codec1_port =3D of_graph_get_remote_port(ep1); + codec0_ep =3D of_graph_get_remote_endpoint(ep0); + codec1_ep =3D of_graph_get_remote_endpoint(ep1); =20 /* * call Codec first. * see * __graph_parse_node() :: DAI Naming */ - ret =3D graph_parse_node(priv, GRAPH_C2C, codec1_port, li, 0); + ret =3D graph_parse_node(priv, GRAPH_C2C, codec1_ep, li, 0); if (ret < 0) goto err2; =20 /* * call CPU, and set DAI Name */ - ret =3D graph_parse_node(priv, GRAPH_C2C, codec0_port, li, 1); + ret =3D graph_parse_node(priv, GRAPH_C2C, codec0_ep, li, 1); if (ret < 0) goto err2; =20 - graph_link_init(priv, codec0_port, li, 1); + graph_link_init(priv, codec0_ep, li, 1); err2: of_node_put(ep0); of_node_put(ep1); - of_node_put(codec0_port); - of_node_put(codec1_port); + of_node_put(codec0_ep); + of_node_put(codec1_ep); err1: of_node_put(ports); of_node_put(port0); --=20 2.30.2