From nobody Mon May 25 05:54:13 2026 Received: from smtpbgeu2.qq.com (smtpbgeu2.qq.com [18.194.254.142]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BF18A3E4C6C; Fri, 22 May 2026 13:35:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=18.194.254.142 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779456945; cv=none; b=Mp+CtGJ0JNRE+rH7R82wo/ebY087jRi2ORpwqZZFUmh167kYKt7rWzTAcnd5urQNWuBo8ZFeED/xwsbjbtjEc2IC2V3Yc0zAN0SHMrLTVP0ZS8+RfU9pZtAV6j3oMoNoLiMOUw/kOjYxvESEZjKHtJfpW1BMHoRw8nipcm4M4Zk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779456945; c=relaxed/simple; bh=HevkQyYoy3kiO1VrBKioDTilzos+sth9T5xZNgNnIUQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JgNWfeSpQS70SYd/tuGSLWlNl+tu/Lwlh92umrSnV7rHP2UCBWXt3OLv2lyN9zOeaxFBnxOthY9nYzrX8FENGxLtIUeBkskfiSM8D9OupJTu6NKFuW74n1IUISXcubCX66nMUMYsmb9HGf9Sgp1gT93dQw3skm2NN+73p+qVsr8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com; spf=none smtp.mailfrom=linux.spacemit.com; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b=F2iauWZ6; arc=none smtp.client-ip=18.194.254.142 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b="F2iauWZ6" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.spacemit.com; s=mxsw2412; t=1779456851; bh=AA/l8RpNRgQWhJKMhQO6AtegRn3p6g7Rx5XU5wAB/G8=; h=From:Date:Subject:MIME-Version:Message-Id:To; b=F2iauWZ6dwN7IOzBaJ8LcHm4UiQ2JyOYvJ/WdrGf9Y4LlwnhxVP5luua/qqSBC99L MLVaVhMiPlB3dMKAp8Lui5OzmfVwB32Mgn8L3hAlB+wX0CbLmVqJbQha0iiOY9JrmN uWPdvEbrYopmibRS7EbtHbN9flhTSobM7ICPP8Yk= X-QQ-mid: zesmtpgz5t1779456843t72186e55 X-QQ-Originating-IP: HtiiAtny7Gj3pQY96fI+38eQMAm2J+SDcdT7dRq28k4= Received: from = ( [61.145.255.150]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 22 May 2026 21:34:00 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 9568325432404899100 EX-QQ-RecipientCnt: 11 From: Troy Mitchell Date: Fri, 22 May 2026 21:33:57 +0800 Subject: [PATCH v4 1/3] ASoC: soc-dai: add shared BCLK clock for cross-DAI rate constraints Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260522-i2s-same-blk-v4-1-a71a86faaa20@linux.spacemit.com> References: <20260522-i2s-same-blk-v4-0-a71a86faaa20@linux.spacemit.com> In-Reply-To: <20260522-i2s-same-blk-v4-0-a71a86faaa20@linux.spacemit.com> To: Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai , Yixun Lan Cc: linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, jinmei.wei@spacemit.com, Troy Mitchell X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779456837; l=3103; i=troy.mitchell@linux.spacemit.com; s=20250710; h=from:subject:message-id; bh=HevkQyYoy3kiO1VrBKioDTilzos+sth9T5xZNgNnIUQ=; b=bJjkuyUf7OoZOlB6339r5wuFJ1/7Qg4nx+Vzb7ic6HD7rgfu5avURReJ3S/Qpn9RAVFt3nEnO wQaMahTPG39DpL6O0XaY3SoqQChMcMvlLVnFOBvBdMfOoO1pqhP1PeL X-Developer-Key: i=troy.mitchell@linux.spacemit.com; a=ed25519; pk=lQa7BzLrq8DfZnChqmwJ5qQk8fP2USmY/4xZ2/MSsXc= X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpgz:linux.spacemit.com:qybglogicsvrgz:qybglogicsvrgz3a-0 X-QQ-XMAILINFO: OKhy7fcgXWEZn4ga0kf4NHu+4n02t8Pum455oBKJEsbaMhgR9Asj26Bf ZxSBRvyyVKwWKbws/FEf88cypXHr5d7LEXYXxY2jGvblGejSyqCXh5hCItwYCm02owsvcgO mxu0bUQ2NEY1ytfEPoyKWQT5RWSi6/9MXsH5J5aL5EuvgwNOub8J9XEzxkJtt1yBY3pJSfa tGirEgkRULhOqbzekgZD3di6Qi+/9GOunuR7O3FA9Z7v5yxEopIzKvEXn2eotB7N0vfphEz o6J7IZAMz9xDHS6r2xaLb3/WHZq+Pm201oNhcdcC/yo7PB1kUxVO4G7m2d/d/++WaaWDRli B8HORZ2octBXIPBCS9R8mfEmboFsRPocNTGtKOn6R04KwCuhhi4rujKbvPYqo9Mm3zO6W7y S4AoKbTIa/ZOItxUiBh0/VvUXUeZ7SmqChYbOQbEUbu4DzCluUWCIC+tqOtYbSFBqbcCBa7 KggguqKHF+EOQYIoNUUa2pHSA/ZBxLqn63Kz/DxTFNYTSQwb4+H5n3iZ8Voyxxc0cTMer7c dgNy9UoBxlNnLEtvMJwGEhTg79s7VziKXBvNz2CQ6lbBReFPADcjvs3n8galO4VHn6rC/TI JQ044uCHo9+wvzyzhNz/jOAqnY8jemmH3Gy2J+ID5YaJCCQMqeSK+0EtgY1HNldJZWGdqXf 8IoYlDlVE5kehIpjzxd0BkR8zFEEfkZWkk+YQTXLnJB/3uNury3PRLFSQ7MdSJ1Vg2AbNJa zV9nzwyB0TkS+RcPIhJaQhZjf5mjWFefDIT/UkBFmKluvfkwjrX5Xn6rBqatVHdL8x23bYM D8BSJLW3DPFyCdH00p6qexlnca+6jJ7s892xptZ1yfTu3b8X6ViUkrnm7fsB5/LJba9sPdu diQ9Qs9UbNayS5p39Kejigvy5zp/qGKmb2UsQ+D8pmqB+1VJ35vN7ec8aRLSNzHHhQk+Au3 15JoW1sDZDtGVy2++yEqPxDXy9609KHYEJjR51ytfgNmmbwqaXPZN9Yf1Z08BFTb9zItBuz 8IewVMaAyWAWx3RYL4aF/C7GvkosdNK3EH7vQBPaodNIGFgWv/ym3n309dV84U6F60oKGzb p5edv/p5/ZWJyoZpsB2S5EySZBH+Bwk087FcbR35tqraUbYyr+4rBjKPPrM6bqk3CCkUHBZ JDLJ9uVIVmVbKGwcg9a8UMIjzg== X-QQ-XMRINFO: OWPUhxQsoeAVwkVaQIEGSKwwgKCxK/fD5g== X-QQ-RECHKSPAM: 0 Add a bclk field to struct snd_soc_dai and a helper function snd_soc_dai_set_bclk_clk() that platform drivers can use to declare which clock is their BCLK. Also cache the bclk_ratio in snd_soc_dai_set_bclk_ratio() so that the framework can use it later in hw_rule evaluation for TDM configurations where BCLK =3D rate * slots * slot_width. When multiple DAIs on the same card share the same physical BCLK (detected via clk_is_match()), the ASoC core can automatically constrain their hw_params so that the resulting BCLK rates are compatible. This commit adds the data structure support; the actual constraint logic follows in the next patch. Signed-off-by: Troy Mitchell --- include/sound/soc-dai.h | 7 +++++++ sound/soc/soc-dai.c | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h index 6a42812bba8c..df010a91b350 100644 --- a/include/sound/soc-dai.h +++ b/include/sound/soc-dai.h @@ -17,6 +17,7 @@ struct snd_pcm_substream; struct snd_soc_dapm_widget; struct snd_compr_stream; +struct clk; =20 /* * DAI hardware audio formats. @@ -188,6 +189,8 @@ int snd_soc_dai_set_pll(struct snd_soc_dai *dai, =20 int snd_soc_dai_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio= ); =20 +void snd_soc_dai_set_bclk_clk(struct snd_soc_dai *dai, struct clk *bclk); + /* Digital Audio interface formatting */ int snd_soc_dai_get_fmt_max_priority(const struct snd_soc_pcm_runtime *rtd= ); u64 snd_soc_dai_get_fmt(const struct snd_soc_dai *dai, int priority); @@ -473,6 +476,10 @@ struct snd_soc_dai { unsigned int symmetric_channels; unsigned int symmetric_sample_bits; =20 + /* shared BCLK clock for cross-DAI rate constraints */ + struct clk *bclk; + unsigned int bclk_ratio; /* BCLK =3D rate * bclk_ratio (0 =3D use channel= s * sample_bits) */ + /* parent platform/codec */ struct snd_soc_component *component; =20 diff --git a/sound/soc/soc-dai.c b/sound/soc/soc-dai.c index 2f370fda1266..1719ddcefa4b 100644 --- a/sound/soc/soc-dai.c +++ b/sound/soc/soc-dai.c @@ -116,10 +116,28 @@ int snd_soc_dai_set_bclk_ratio(struct snd_soc_dai *da= i, unsigned int ratio) dai->driver->ops->set_bclk_ratio) ret =3D dai->driver->ops->set_bclk_ratio(dai, ratio); =20 + if (!ret) + dai->bclk_ratio =3D ratio; + return soc_dai_ret(dai, ret); } EXPORT_SYMBOL_GPL(snd_soc_dai_set_bclk_ratio); =20 +/** + * snd_soc_dai_set_bclk_clk - set the BCLK clock for shared clock detection + * @dai: DAI + * @bclk: BCLK clock pointer (or NULL to clear) + * + * When multiple DAIs share the same physical BCLK (detected via + * clk_is_match()), the ASoC core will automatically constrain their + * hw_params so that the resulting BCLK rates are compatible. + */ +void snd_soc_dai_set_bclk_clk(struct snd_soc_dai *dai, struct clk *bclk) +{ + dai->bclk =3D bclk; +} +EXPORT_SYMBOL_GPL(snd_soc_dai_set_bclk_clk); + int snd_soc_dai_get_fmt_max_priority(const struct snd_soc_pcm_runtime *rtd) { struct snd_soc_dai *dai; --=20 2.54.0 From nobody Mon May 25 05:54:13 2026 Received: from smtpbgjp3.qq.com (smtpbgjp3.qq.com [54.92.39.34]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D63253ED5DC; Fri, 22 May 2026 13:35:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.92.39.34 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779456962; cv=none; b=YDcg6r5AKT9hg/Kjs/mPDVgL//77nmeFuRMqjrcjbOkeGYllYSOUfkuQpF7reehkyjSMli61eNX0Kvi9YHiYql3YLhD4NDQlMonr4Rv67uj5j+Rb60GEJt0RTpZ74Ll/mZcJQRMP1JsYZaJMl0AOpLoo+dcUmsLmsY3phGHrYFA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779456962; c=relaxed/simple; bh=4E68yMd3eSt5QcCRQ/X6OQqgriJicM8enmFAo74DqRk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=b62E5Bwq88QwPXx5mjjxe7d6ue4DPGEQD2Sk8U8irUg1Zorsy4T82XMuxe+ubvutn0RRk+0l/b6YgQ5PlZw+OHp7HAjSS2JgUMQ9ebY1QEFy8x8KQ67eMyLZVMvyTaKLI/+NMqqDWitLroxNQeTXsFswylISZDtJn7MiS6LM7w8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com; spf=none smtp.mailfrom=linux.spacemit.com; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b=tKnDNVJ7; arc=none smtp.client-ip=54.92.39.34 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b="tKnDNVJ7" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.spacemit.com; s=mxsw2412; t=1779456854; bh=IPfPFi70Qm+zWzKp1zbmboEkHwR9Rb5JOffwqU6/ztA=; h=From:Date:Subject:MIME-Version:Message-Id:To; b=tKnDNVJ7zEhiKF66o7yt/onzdqS/shpqCn5DvSK+K2tNMixRWaWl/8/xOpDJj7/tX Q1mTp1MIfWad+Vb2qDZlkcoGtRwxbdGlyZkPetZ5pLQ+LgZsxFGTrB4Qlwe0Y/mPXK rezaYOZVUOOmM/7gffUQTmnKa0aGe5ptZ+FUL2aY= X-QQ-mid: zesmtpgz5t1779456847tc2efd188 X-QQ-Originating-IP: ZC/rMsBumSkgZ+kt8SH8TmvM2M5XUU6pwGD4yaQ75XU= Received: from = ( [61.145.255.150]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 22 May 2026 21:34:04 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 10530091963664582811 EX-QQ-RecipientCnt: 11 From: Troy Mitchell Date: Fri, 22 May 2026 21:33:58 +0800 Subject: [PATCH v4 2/3] ASoC: soc-pcm: add DEFINE_GUARD for snd_soc_card_mutex Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260522-i2s-same-blk-v4-2-a71a86faaa20@linux.spacemit.com> References: <20260522-i2s-same-blk-v4-0-a71a86faaa20@linux.spacemit.com> In-Reply-To: <20260522-i2s-same-blk-v4-0-a71a86faaa20@linux.spacemit.com> To: Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai , Yixun Lan Cc: linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, jinmei.wei@spacemit.com, Troy Mitchell X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779456837; l=887; i=troy.mitchell@linux.spacemit.com; s=20250710; h=from:subject:message-id; bh=4E68yMd3eSt5QcCRQ/X6OQqgriJicM8enmFAo74DqRk=; b=W138CBf31i6kdfNrlYIBg2W3QfM5Y52U4DJE0KvkIRyjXVR+gg7RlXoY5XOJ61Uwx6AJq4PrI RY1Buee0KFcDpY3EO/RKglrKmW0Tboh2jCVvnI3kwLFOFlvvYavC1ng X-Developer-Key: i=troy.mitchell@linux.spacemit.com; a=ed25519; pk=lQa7BzLrq8DfZnChqmwJ5qQk8fP2USmY/4xZ2/MSsXc= X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpgz:linux.spacemit.com:qybglogicsvrgz:qybglogicsvrgz3a-0 X-QQ-XMAILINFO: NZu/AFmKGNRJQKOBYz618w5cy4ScexV6qZ2aboG33Hu8guIapLOb5UzR UkOu1+aa6wv4/Zvb5fSIxQUcCDoYHziNZjTlUqUd6gjnj+dBQ0j9yYh3GzjCyyyXVarxwEl Ow029fy2OofnpVd7Xw+r+ZFmSOxpZd9haKYXGE2Ddc09xTUBla4zV08Ov7fW264QEyyGOhy LLFsdPVzYM1tP81yvfmxcHI69IWm/Y/1KbOzfzrMI6sAsMb4fEATHaAW4PGIQToeuNktm/K S+1pYSO4SnZF67TXDRCEQuQaL8hsnia036vzE9kAhsJuk04qYUeFBIcgwNYI/jLHAXGw1OQ fMWrNNLEB9XJRgCiB+QIeKSjiiRqYdX/KCHBbk4JXXuz+0xnE3o1JKuGuexxRqPODQ2AaEP RiU9qyEGQf/BlA5I8Yqw1OKzOFNwbaDGCjC/KzxJt8kE+xp4B4HDWX2QKQpdw5tTvubcUrt ZNRMjNv6mZBJ3wv7hlMsBExU2VKA3OAo2VDTb/otdvgFN0onyeG25T0ztH3OaDC9N6m2QQp dpPwdF9KfnrA1ZuMzxgqHRmgfC8JwOVf+cMs6lvwgbh3wfS/g5wbSuD4xgPAF8gU5XBWzUd X9Ots9j2ilCJxmVu2+Pcv6ax6fXF+EE1h3AYcc/LxzhnpZRv8ZsD+wEle5x21fUQBF2esoY LLJAoIS0HuVKWNfeIumOgUurPNg9I/bpN1F6/+Dr6XZ646Fbcd4S2H9csYgnuqBpM0hb29k iJGut4VG+DG3oLo7lx6XRqeouQXJd5VhMRUwk2/xLovIwovKPoDRYN+g4UZFUgZzYJVZahO IiJb1YaH4epTtvrfijXWrqP0VRroZXF8k3bUA+bPEwsPWcfF4VUEx0Dlt8PmYxoQIgqjBep ql/FdCQyLcreXyOy/MrUhZk6Y93McHitwRdhvE91YAQUFTxJDcDWk/om8dM0ud/toMYr7IS GKaDlNab5bYfirLGhoEUrsPRZY1dRLGHmQNPwBstPQKaj+Z1huV/P8IW37OJJP+xjQ/L+Uc Zn0/iJNGzUC8vXDieCCiP74WvAa70WuaQ5K60HR0wzw+ttbXOC6lQdPgIk52h0bMVsHSx6O epAdGjstuS3kjA0hQAdPyHZZcEScrEkEi02INg6+TO8OAjwUb5ta99gMy04MVDkL4X7fl0w kNBHy3Ktv10iv20= X-QQ-XMRINFO: OWPUhxQsoeAVwkVaQIEGSKwwgKCxK/fD5g== X-QQ-RECHKSPAM: 0 Define a guard class wrapping snd_soc_card_mutex_lock() and snd_soc_card_mutex_unlock() so that scope-based locking can be used while still picking up the SND_SOC_CARD_CLASS_RUNTIME lockdep subclass. Signed-off-by: Troy Mitchell --- sound/soc/soc-pcm.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c index 9b12eedb77c3..25e494c4ed81 100644 --- a/sound/soc/soc-pcm.c +++ b/sound/soc/soc-pcm.c @@ -26,6 +26,9 @@ #include #include =20 + +DEFINE_GUARD(snd_soc_card_mutex, struct snd_soc_card *, + snd_soc_card_mutex_lock(_T), snd_soc_card_mutex_unlock(_T)) #define soc_pcm_ret(rtd, ret) _soc_pcm_ret(rtd, __func__, ret) static inline int _soc_pcm_ret(struct snd_soc_pcm_runtime *rtd, const char *func, int ret) --=20 2.54.0 From nobody Mon May 25 05:54:13 2026 Received: from smtpbgau1.qq.com (smtpbgau1.qq.com [54.206.16.166]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C15043E8C78; Fri, 22 May 2026 13:35:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.206.16.166 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779456955; cv=none; b=WxU+Z3ZkG/0GpiqUfEzVFAyAhISUpzw5pTMCUPj2SOC+R72NL/GUa833QUZ2hTzRhgV1yC66ttsWkvLuUBJ+syunsaGqmnyLizKbNJV/C2dF6XSTy1sm57EB3yhzqPf65fYFyfC0vrn2DrQapzBHsVnLzeDxJ7v8F3u1fkOUA6U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779456955; c=relaxed/simple; bh=cj1EjUM699n6DwPiNAQ0TESANNZBoZiYy78W+H/j1Vg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XOJOkPkZ/8S4XVY+OMHZvFJzSJSf2vZs+kpSwwhdiWNk0Dmnlyc/JJoyiFDBNZQo/WAtz7W2S30Y1CetNbShPZbTC7W7bHMahk69VcWAOxguctieMyarPIys8BBxfn5RHrSs0ZP4TMvkZJcpuysDmSgNvCnInVnI0KUHl6mkacY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com; spf=none smtp.mailfrom=linux.spacemit.com; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b=VhfbEUny; arc=none smtp.client-ip=54.206.16.166 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b="VhfbEUny" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.spacemit.com; s=mxsw2412; t=1779456858; bh=SiHRNytKmirl6VM5/+dn44k5NGarOBSE2a5i2Emh2UM=; h=From:Date:Subject:MIME-Version:Message-Id:To; b=VhfbEUnynmNAiYrTLWN2vvVceC5mPQvNXoTooui2H43eB3Jz1ZcDtG8Ve2kAfhlDS eCKzpqlBeN4oGOGH8GdNYARTtQNsAyGEE9HY5JOCR9pcyoGIgYHDXLw4ik2v4dmewu cLmtyyNa2X4kBIIq4Txz8kfmoVQ09Bg4N/Z8buOs= X-QQ-mid: esmtpgz15t1779456851tb55d8d6a X-QQ-Originating-IP: IPlNtOEI7DEeqQyoCrxPS7wFFPg4RvZbZXDiILX/i9Q= Received: from = ( [61.145.255.150]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 22 May 2026 21:34:08 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 13054678115676240062 EX-QQ-RecipientCnt: 11 From: Troy Mitchell Date: Fri, 22 May 2026 21:33:59 +0800 Subject: [PATCH v4 3/3] ASoC: soc-pcm: constrain hw_params when DAIs share the same BCLK Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260522-i2s-same-blk-v4-3-a71a86faaa20@linux.spacemit.com> References: <20260522-i2s-same-blk-v4-0-a71a86faaa20@linux.spacemit.com> In-Reply-To: <20260522-i2s-same-blk-v4-0-a71a86faaa20@linux.spacemit.com> To: Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai , Yixun Lan Cc: linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, jinmei.wei@spacemit.com, Troy Mitchell X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779456837; l=5579; i=troy.mitchell@linux.spacemit.com; s=20250710; h=from:subject:message-id; bh=cj1EjUM699n6DwPiNAQ0TESANNZBoZiYy78W+H/j1Vg=; b=5nr4kKimnGwTMoC+FhkfgLS/mCXu5CIsV4L92oHLVF4Z9cLDNqXJ+YtCWKTBwSCCUtV1K4Y2w +ObzqLfWQidAUeS8hvvGl+u1pFf/Tm0FqXAbex1eVk1vc3TTmoGKR0O X-Developer-Key: i=troy.mitchell@linux.spacemit.com; a=ed25519; pk=lQa7BzLrq8DfZnChqmwJ5qQk8fP2USmY/4xZ2/MSsXc= X-QQ-SENDSIZE: 520 Feedback-ID: esmtpgz:linux.spacemit.com:qybglogicsvrgz:qybglogicsvrgz3a-0 X-QQ-XMAILINFO: ONsBhzqno2d9f6zvjxchYgaKjpHhVNUFyHRrfXzStsSHewDf7O/YFDNg ciyaSsIAGLpSPgAfLVXfpZwSBpjSBD9Exb9+NhC+6LQrgSO3LlHYhFTX1qIagdGdvsr25OD wzegeMxEERkUKac2QyCxlMuXW++FObJSfRqClQcJuSG6eCafRjWOf7GEyCNhoIE2/N8KED/ 5+zfxQngA/P6NI8utRGbVDHdBdVyBsIb6pvNfiuh3Fy5T/FC9ODxtoj2UsuT81Vy81dl+SS wJBK3rrZEo5oI3hmagBTnCRxSfjNfuGvxadrE5ib8S3RLLrnWR6t2MhNLWtlVNunC0K2NBy F9dmzaHMza5WMTMt4w5J8OfBWl+ae11+NmwrFVvTvE/4Zm0dQSo0GWKFj9spCh9Elzx9pKc qktOTtnUOKgi9rbfcDcEh8ChiaOtwHu0VBiQ3y8h7v9ObIvK13fSjVIKvjxOq3O7OExSF/W ro0M46riIRDxd/W8jn4qGYfNObdQPbTNpcOprXodkxeH3tuyz1LyP8Mm0RMKZfhwu762Zqm wA457/c94BwgwTjWFMXzHoKt1mEC8+CJ7LBXzYedHS6TlPtQx6PaPBrc+PnutmlitG07Uz1 3d14ZrGiMDY91g8Qyh/dT6L+A0soc2l6QDVFKDCaa6kddxmn8BbVaxexOmAs1sB5D9NHIoD iObTOrRlJ7GjgR2syqFE2Ta5D0k1gxnGMymxZjWZGygtWNgX5eqtea/FGx+o6iIm6W7w5ZX BXUxuC4Y5mUP7oSYf8YQ31edsPBWfRoU0iiDrz4ckH14vYbdYliuIR+gCM0gfpczYWyOcsj 2XSU38IaMgoYYNllWFgJwwZgkr3gxabuRiRpzlJOWzR5iuAmDcxZNOlpJC2kauZkYTWVAto sYaZyW98TC//6py0x1NDu7hi5+nsfVhp4fXYeIoW/8dK4tQjcB2XZPQujxsK5fEBnd9lIrD 68z2TPuy3GmbrgmiVsf/2XyS1hyBwogtWTqSBhKMvx7J68EGVeNZkHa8psdrCrNWVkmi2Zb sCA8KswfiKZVJ+QnAPgyLzmgOqpOT1fg0HawA7fbGHHZ3dbk7OFCswueqDKM8mE5Vhog/ve yPwT1VV/COfSJ3bGJZHG40qYQVKrW/0xAZ4c5z1H6X9s9tzdPbWqFzsPKx4w2crWRCVmfPF NXCzN0n97aMnAj3jemsXZy+Qap8ZNKQh8/jz X-QQ-XMRINFO: MPJ6Tf5t3I/ylTmHUqvI8+Wpn+Gzalws3A== X-QQ-RECHKSPAM: 0 When multiple CPU DAIs on the same sound card share the same physical BCLK, add a hw_rule during PCM open that constrains the sample rate so the resulting BCLK rate stays consistent across all sharing DAIs. The rule callback scans all DAIs on the card at hw_refine time, looking for an active peer that shares the same physical BCLK (via clk_is_match()) and has already completed hw_params (checked via dai->symmetric_rate !=3D 0). This ensures the constraint uses the real BCLK rate established by the peer's clk_set_rate() in hw_params, not a stale boot-time default. The first DAI to complete hw_params is unconstrained (no active peer yet); subsequent DAIs are constrained to match. The rule supports two modes: - If the DAI has an explicit bclk_ratio set (e.g. for TDM where BCLK =3D rate * slots * slot_width), the rate is constrained to active_bclk_rate / bclk_ratio. - Otherwise, the default formula BCLK =3D rate * channels * sample_bits is used to derive the valid rate range. The constraint is purely additive: DAIs that do not set a bclk clock pointer are completely unaffected. Signed-off-by: Troy Mitchell --- sound/soc/soc-pcm.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 116 insertions(+) diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c index 25e494c4ed81..0e49290a8c90 100644 --- a/sound/soc/soc-pcm.c +++ b/sound/soc/soc-pcm.c @@ -12,6 +12,7 @@ =20 #include #include +#include #include #include #include @@ -470,6 +471,114 @@ static int soc_pcm_apply_symmetry(struct snd_pcm_subs= tream *substream, return 0; } =20 +/* + * Shared BCLK constraint: when multiple DAIs share the same physical BCLK, + * constrain hw_params so that the BCLK rate (rate * channels * sample_bit= s, + * or rate * slots * slot_width for TDM) remains consistent. + */ + +static int soc_pcm_shared_bclk_rule_rate(struct snd_pcm_hw_params *params, + struct snd_pcm_hw_rule *rule) +{ + struct snd_soc_dai *dai =3D rule->private; + struct snd_soc_card *card =3D dai->component->card; + struct snd_soc_pcm_runtime *rtd; + struct snd_soc_dai *other_dai; + unsigned long active_bclk_rate =3D 0; + struct snd_interval *rate =3D hw_param_interval(params, SNDRV_PCM_HW_PARA= M_RATE); + struct snd_interval constraint =3D { .empty =3D 1 }; + unsigned int target_rate; + int i; + + /* Protect the rtd list traversal with the ASoC card mutex helper. */ + guard(snd_soc_card_mutex)(card); + + /* Scan all DAIs on the card for an active peer sharing the same BCLK */ + for_each_card_rtds(card, rtd) { + for_each_rtd_cpu_dais(rtd, i, other_dai) { + if (other_dai =3D=3D dai) + continue; + if (!other_dai->bclk) + continue; + if (!snd_soc_dai_active(other_dai)) + continue; + /* + * Skip peers whose hw_params hasn't run yet. + * symmetric_rate is set by soc_pcm_set_dai_params() + * after snd_soc_dai_hw_params(), so non-zero means + * the DAI's clk_set_rate() has already executed. + */ + if (!other_dai->symmetric_rate) + continue; + if (!clk_is_match(dai->bclk, other_dai->bclk)) + continue; + + active_bclk_rate =3D clk_get_rate(other_dai->bclk); + if (active_bclk_rate) + goto found; + } + } + + return 0; + +found: + if (dai->bclk_ratio) { + /* + * Driver has set an explicit BCLK ratio (e.g. for TDM where + * BCLK =3D rate * slots * slot_width). The only valid rate is + * active_bclk_rate / bclk_ratio. + */ + target_rate =3D active_bclk_rate / dai->bclk_ratio; + + constraint.min =3D target_rate; + constraint.max =3D target_rate; + } else { + struct snd_interval *channels =3D hw_param_interval(params, + SNDRV_PCM_HW_PARAM_CHANNELS); + struct snd_interval *sample_bits =3D hw_param_interval(params, + SNDRV_PCM_HW_PARAM_SAMPLE_BITS); + + /* + * Default: BCLK =3D rate * channels * sample_bits. + * Calculate the range of valid rates given the current + * channel and sample_bits intervals. + */ + if (!channels->min || !sample_bits->min) + return 0; + + constraint.max =3D active_bclk_rate / + ((unsigned long)channels->min * sample_bits->min); + + if (channels->max && sample_bits->max) + constraint.min =3D active_bclk_rate / + ((unsigned long)channels->max * sample_bits->max); + else + constraint.min =3D constraint.max; + } + + constraint.integer =3D 1; + constraint.empty =3D 0; + + return snd_interval_refine(rate, &constraint); +} + +static int soc_pcm_apply_shared_bclk(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + if (!dai->bclk) + return 0; + + dev_dbg(dai->dev, + "ASoC: registering shared BCLK rate constraint\n"); + + return snd_pcm_hw_rule_add(substream->runtime, 0, + SNDRV_PCM_HW_PARAM_RATE, + soc_pcm_shared_bclk_rule_rate, dai, + SNDRV_PCM_HW_PARAM_CHANNELS, + SNDRV_PCM_HW_PARAM_SAMPLE_BITS, + -1); +} + static int soc_pcm_params_symmetry(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { @@ -906,6 +1015,13 @@ static int __soc_pcm_open(struct snd_soc_pcm_runtime = *rtd, if (ret !=3D 0) goto err; } + + /* Shared BCLK constraint across DAIs on the same card */ + for_each_rtd_cpu_dais(rtd, i, dai) { + ret =3D soc_pcm_apply_shared_bclk(substream, dai); + if (ret !=3D 0) + goto err; + } dynamic: snd_soc_runtime_activate(rtd, substream->stream); ret =3D 0; --=20 2.54.0