From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-ed1-f45.google.com (mail-ed1-f45.google.com [209.85.208.45]) (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 1681D14B07A for ; Mon, 13 Jan 2025 05:55:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.45 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736747737; cv=none; b=XvI1WZHDNTk+cbmBxy4NdmjidS3agZ7i5UL++t3UCNeXoGk9OqgpExa8x0m/aVjlVd0do404g8q29lpgCH/GbORju8mXzVNHYpnYQBMKnDzglPtAqkBuCYZ+bTXPTanhCt6M2ZYUepgK/+axWp8JbyoGvGE1JaYjw2+X2I7TtK8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736747737; c=relaxed/simple; bh=fa8HZsJ3T5Bjo4OSf8OOsBtUydRcEuo4H0Nj9ULNofI=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=N0LGhtJXRutetl4Upy05wKnfosTqQ5UbIlVlxNOSHoDafmCtcjOMiwcNwOeQfh/5G9/YdW58vnx+M+sJUY8mvRf01pSauilhDF2j/Ln4gvaSbxlaKxTdheR86Gnr1Rq8hzMocPl30vqF/sSH6MWOpmKxnYCzQkNY6fVePBRj9ao= 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=TejtWOG7; arc=none smtp.client-ip=209.85.208.45 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="TejtWOG7" Received: by mail-ed1-f45.google.com with SMTP id 4fb4d7f45d1cf-5d7e3f1fc01so7873980a12.2 for ; Sun, 12 Jan 2025 21:55:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1736747732; x=1737352532; darn=vger.kernel.org; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=N4vQNusUmZAkLzXeYbfJ0r4HHkCe6vVP33VineDuAo8=; b=TejtWOG7LWRiejIxYdCqeXZflYxCSOSjWL8026ExW5MMnR0CHt91IaPafwYs/q8vQ2 eqUXe0HTEdtjzIv6C1oldZKX8Q6PKD37bj+2EgQtMWgoNoItDGsddI5EqQ5p/S1CVdNr 3/7pBwuXWOS8X+qniwGo3gL0I6PxTp+PSXy6QNWtG4lsdbzJrpDa7JRfrQ17ItJLVzE5 MNlo3j+Kju35P8DnKMOcQD+wwsjpqOfTpqGz6wZixnKgB4hKxZM1K0zJAMCO+Kbq3b4H jc7PAz1Pw4ccZ6ZSTKLcC60a2kyPS/7QQ/vSgCmX+mlFcVGJBPUpwHuo0WfpP91QJMjw z2uA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736747732; x=1737352532; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=N4vQNusUmZAkLzXeYbfJ0r4HHkCe6vVP33VineDuAo8=; b=fHmVjy6p8XTBdsT/VyFVtZDW3pllLEx0iFUxBjvn4o4KLN0aDCCrZUsdEcx6IDd3sj TycIxLPPEXSHcjUK4kmLqfU4LQm+8LSoEKIaLO6WL3ZxOqAaA4EJOQ+6KcMiXf6rro1I iFFJHT+FxKOD94bXd8vP4t/odD/QKI1MgrDaM86A7TCgWZ9Pf1Ct9qUPgVPFcG3GyBtj gBu4wOQapGrVnHFuvMMdXB9yX0WZFH+fXnWJIv1EXm2pW0Vk8IUkyXX7R2IacJR34+hg bS3L+pdm6aDpPRyecKaO6TxNiWEQ/LSfWtsduKMp1Abd94ZBFnau3dH5hnVrsf65DLqq 66ng== X-Forwarded-Encrypted: i=1; AJvYcCWB3/3tCRVQKMsA/xOy+7bWBgpIuJgN2WfEzpdVH7356/3zNjsDvysNY+4aIW8xlvAt6/WJORGqBe8jQKY=@vger.kernel.org X-Gm-Message-State: AOJu0Yx5mkP3k6AHA1qzUmvM/RmBRM+DWCr/JLTBVcL39EIrWmanP0Ee L19YXVxtqRlHt486QuWg5dFYxFX9g+fTwTwLXfwgzaI+PgNbIa1Z X-Gm-Gg: ASbGncvID8gpHCd9WIPDUQDeEaf3BqtapSUl8OsumeA950hCiCH1kbC4AdKyrDtsmAZ QzCYSK3YY+3Iu8aH9gHc2VA61ub8usrPyRxgpC+HkD6g/W64xWrOLjQpvAImx9AsRQVxzqwc7xX sHaWODn9eF1VYqbtyWQQAsL/hOD+77FSG6+Cuzk5PHlS2I68v+OHQjmwKB7Fn54nQIn6NoptwHr 2tSCCg3kwxsCnwZ66wbCsV8NLuB39fF9QHlQ9xr3icxHcGheK2RKPsiUxeugumPbK+Llg== X-Google-Smtp-Source: AGHT+IHHDjzYEn5VmjKBCEbcSi6Bm+0MjLFulYvO92cR0rmLIAiatEhlM1Jl2TgpnNeRlQjm4KQ3Vw== X-Received: by 2002:a17:907:7ea2:b0:aa6:becf:b26a with SMTP id a640c23a62f3a-ab2ab66d9a0mr1600953066b.9.1736747732023; Sun, 12 Jan 2025 21:55:32 -0800 (PST) Received: from [192.168.1.10] ([95.43.220.235]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-ab2e57251fesm337068866b.53.2025.01.12.21.55.31 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 12 Jan 2025 21:55:31 -0800 (PST) Message-ID: Date: Mon, 13 Jan 2025 07:55:30 +0200 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [RFC PATCH] soc: audio-graph-card2: use correct endpoint when getting link parameters 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 References: <20241220071126.1066691-1-ivo.g.dimitrov.75@gmail.com> Content-Language: en-GB From: Ivaylo Dimitrov In-Reply-To: <20241220071126.1066691-1-ivo.g.dimitrov.75@gmail.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit ping On 20.12.24 г. 9:11 ч., Ivaylo Dimitrov wrote: > 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. > > 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/audio-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, > > 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 = 0; > + struct device_node *port = of_get_parent(ep); > + bool is_multi = graph_lnk_is_multi(port); > > - if (graph_lnk_is_multi(port)) { > + if (is_multi) { > int idx; > > - of_node_get(port); > - > for (idx = 0;; idx++) { > ep = graph_get_next_multi_ep(&port); > if (!ep) > @@ -532,9 +531,8 @@ static int graph_parse_node(struct asoc_simple_priv *priv, > } > } else { > /* Single CPU / Codec */ > - ep = port_to_endpoint(port); > + of_node_put(port); > ret = __graph_parse_node(priv, gtype, ep, li, is_cpu, 0); > - of_node_put(ep); > } > > return ret; > @@ -591,22 +589,20 @@ static void graph_parse_daifmt(struct device_node *node, > } > > 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 = simple_priv_to_link(priv, li->link); > - struct device_node *ep; > + struct device_node *port = of_get_parent(ep); > + bool is_multi = graph_lnk_is_multi(port); > struct device_node *ports; > unsigned int daifmt = 0, daiclk = 0; > unsigned int bit_frame = 0; > > - if (graph_lnk_is_multi(port)) { > - of_node_get(port); > + if (is_multi) { > ep = graph_get_next_multi_ep(&port); > port = of_get_parent(ep); > - } else { > - ep = port_to_endpoint(port); > } > > ports = of_get_parent(port); > @@ -642,6 +638,9 @@ static void graph_link_init(struct asoc_simple_priv *priv, > dai_link->ops = &graph_ops; > if (priv->ops) > dai_link->ops = priv->ops; > + > + of_node_put(port); > + of_node_put(ports); > } > > int audio_graph2_link_normal(struct asoc_simple_priv *priv, > @@ -650,7 +649,7 @@ int audio_graph2_link_normal(struct asoc_simple_priv *priv, > { > struct device_node *cpu_port = lnk; > struct device_node *cpu_ep = port_to_endpoint(cpu_port); > - struct device_node *codec_port = of_graph_get_remote_port(cpu_ep); > + struct device_node *codec_ep = of_graph_get_remote_endpoint(cpu_ep); > int ret; > > /* > @@ -658,20 +657,20 @@ int audio_graph2_link_normal(struct asoc_simple_priv *priv, > * see > * __graph_parse_node() :: DAI Naming > */ > - ret = graph_parse_node(priv, GRAPH_NORMAL, codec_port, li, 0); > + ret = graph_parse_node(priv, GRAPH_NORMAL, codec_ep, li, 0); > if (ret < 0) > goto err; > > /* > * call CPU, and set DAI Name > */ > - ret = graph_parse_node(priv, GRAPH_NORMAL, cpu_port, li, 1); > + ret = graph_parse_node(priv, GRAPH_NORMAL, cpu_ep, li, 1); > if (ret < 0) > goto err; > > - 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); > > return ret; > @@ -684,7 +683,6 @@ int audio_graph2_link_dpcm(struct asoc_simple_priv *priv, > { > struct device_node *ep = port_to_endpoint(lnk); > struct device_node *rep = of_graph_get_remote_endpoint(ep); > - struct device_node *rport = of_graph_get_remote_port(ep); > struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link); > struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link); > int is_cpu = asoc_graph_is_ports0(lnk); > @@ -718,7 +716,7 @@ int audio_graph2_link_dpcm(struct asoc_simple_priv *priv, > dai_link->dynamic = 1; > dai_link->dpcm_merged_format = 1; > > - ret = graph_parse_node(priv, GRAPH_DPCM, rport, li, 1); > + ret = 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 *priv, > dai_link->no_pcm = 1; > dai_link->be_hw_params_fixup = asoc_simple_be_hw_params_fixup; > > - ret = graph_parse_node(priv, GRAPH_DPCM, rport, li, 0); > + ret = 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 *priv, > > snd_soc_dai_link_set_capabilities(dai_link); > > - 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); > > return ret; > } > @@ -777,7 +774,7 @@ int audio_graph2_link_c2c(struct asoc_simple_priv *priv, > { > struct snd_soc_dai_link *dai_link = 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 = 0; > int ret = -EINVAL; > @@ -834,31 +831,31 @@ int audio_graph2_link_c2c(struct asoc_simple_priv *priv, > ep0 = port_to_endpoint(port0); > ep1 = port_to_endpoint(port1); > > - codec0_port = of_graph_get_remote_port(ep0); > - codec1_port = of_graph_get_remote_port(ep1); > + codec0_ep = of_graph_get_remote_endpoint(ep0); > + codec1_ep = of_graph_get_remote_endpoint(ep1); > > /* > * call Codec first. > * see > * __graph_parse_node() :: DAI Naming > */ > - ret = graph_parse_node(priv, GRAPH_C2C, codec1_port, li, 0); > + ret = graph_parse_node(priv, GRAPH_C2C, codec1_ep, li, 0); > if (ret < 0) > goto err2; > > /* > * call CPU, and set DAI Name > */ > - ret = graph_parse_node(priv, GRAPH_C2C, codec0_port, li, 1); > + ret = graph_parse_node(priv, GRAPH_C2C, codec0_ep, li, 1); > if (ret < 0) > goto err2; > > - 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);