From: Sen Wang <sen@ti.com>
To: <peter.ujfalusi@gmail.com>, <broonie@kernel.org>,
<lgirdwood@gmail.com>, <perex@perex.cz>, <tiwai@suse.com>,
<linux-sound@vger.kernel.org>, <linux-kernel@vger.kernel.org>
Cc: <devarsht@ti.com>, <r-donadkar@ti.com>, <s-jain1@ti.com>,
<m-shah@ti.com>, Sen Wang <sen@ti.com>
Subject: [PATCH 2/2] ASoC: ti: davinci-mcasp: improve aux_div selection for mid-range dividers
Date: Thu, 5 Mar 2026 13:58:25 -0600 [thread overview]
Message-ID: <20260305195825.9998-3-sen@ti.com> (raw)
In-Reply-To: <20260305195825.9998-1-sen@ti.com>
When the ideal total divider (sysclk/bclk) is between 33 and 4096 and
AUXCLK is enabled, the driver computes aux_div as ceil(div/32) and then
recomputes bclk_div from the truncated sysclk.
This two-step integer division loses precision due to truncation and can
sometimes produce PPM errors large enough for ALSA's hw_rule_format to
reject otherwise valid sample formats.
For example, on AM62D-EVM (auxclk-fs-ratio=2177, tdm-slots=2, fck=96 MHz),
playing S16_LE at 44100 Hz gives BCLK = 1,411,200 Hz and an ideal total
divider of 68. The old code picks aux_div = ceil(68/32) = 3,
then bclk_div = (96005700/3) / 1411200 = 22, for a total of 3 x 22 =
66 -- two steps from ideal. The resulting error exceeds the PPM threshold
and causes S16_LE, S24_LE to be rejected.
Therefore when the total divider fits in the AHCLKXDIV register alone
(<=4096), use it directly as aux_div with bclk_div=1, and compare floor
and ceil to pick the closer match, to ensure the best ideal total dividers.
Dividers at or below 32 never enter this path, and dividers above 4096
still fall through to the existing DIV_ROUND_UP path, so previously
working configurations remains unaffected.
Signed-off-by: Sen Wang <sen@ti.com>
---
sound/soc/ti/davinci-mcasp.c | 34 ++++++++++++++++++++++------------
1 file changed, 22 insertions(+), 12 deletions(-)
diff --git a/sound/soc/ti/davinci-mcasp.c b/sound/soc/ti/davinci-mcasp.c
index 6d0310f09b12..800c383ed2e1 100644
--- a/sound/soc/ti/davinci-mcasp.c
+++ b/sound/soc/ti/davinci-mcasp.c
@@ -1358,19 +1358,29 @@ static int davinci_mcasp_calc_clk_div(struct davinci_mcasp *mcasp,
auxclk_div_id = MCASP_CLKDIV_AUXCLK;
}
- if (div > (ACLKXDIV_MASK + 1)) {
- if (auxclk_enabled) {
- aux_div = div / (ACLKXDIV_MASK + 1);
- if (div % (ACLKXDIV_MASK + 1))
- aux_div++;
-
- sysclk_freq /= aux_div;
- div = sysclk_freq / bclk_freq;
- rem = sysclk_freq % bclk_freq;
- } else if (set) {
- dev_warn(mcasp->dev, "Too fast reference clock (%u)\n",
- sysclk_freq);
+ if (div > (ACLKXDIV_MASK + 1) && auxclk_enabled) {
+ if (div <= (AHCLKXDIV_MASK + 1)) {
+ /* aux_div absorbs entire division; bclk_div = 1 */
+ aux_div = div;
+ if ((div + 1) <= (AHCLKXDIV_MASK + 1)) {
+ unsigned int err_lo = sysclk_freq / div -
+ bclk_freq;
+ unsigned int err_hi = bclk_freq -
+ sysclk_freq / (div + 1);
+
+ if (err_hi < err_lo)
+ aux_div = div + 1;
+ }
+ } else {
+ aux_div = DIV_ROUND_UP(div, ACLKXDIV_MASK + 1);
}
+
+ sysclk_freq /= aux_div;
+ div = sysclk_freq / bclk_freq;
+ rem = sysclk_freq % bclk_freq;
+ } else if (div > (ACLKXDIV_MASK + 1) && set) {
+ dev_warn(mcasp->dev, "Too fast reference clock (%u)\n",
+ sysclk_freq);
}
if (rem != 0) {
--
2.43.0
next prev parent reply other threads:[~2026-03-05 19:58 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-05 19:58 [PATCH 0/2] ASoC: ti: davinci-mcasp: McASP code cleanup and clk div fixes Sen Wang
2026-03-05 19:58 ` [PATCH 1/2] ASoC: ti: davinci-mcasp: extract mcasp_is_auxclk_enabled() helper Sen Wang
2026-03-05 19:58 ` Sen Wang [this message]
2026-03-10 15:53 ` [PATCH 0/2] ASoC: ti: davinci-mcasp: McASP code cleanup and clk div fixes Mark Brown
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260305195825.9998-3-sen@ti.com \
--to=sen@ti.com \
--cc=broonie@kernel.org \
--cc=devarsht@ti.com \
--cc=lgirdwood@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sound@vger.kernel.org \
--cc=m-shah@ti.com \
--cc=perex@perex.cz \
--cc=peter.ujfalusi@gmail.com \
--cc=r-donadkar@ti.com \
--cc=s-jain1@ti.com \
--cc=tiwai@suse.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox