From: phucduc.bui@gmail.com
To: Binbin Zhou <zhoubinbin@loongson.cn>, Mark Brown <broonie@kernel.org>
Cc: Liam Girdwood <lgirdwood@gmail.com>,
Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.com>,
Yingkun Meng <mengyingkun@loongson.cn>,
linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org,
bui duc phuc <phucduc.bui@gmail.com>
Subject: [RFC PATCH 1/2] ASoC: loongson: Fix IISConfig0 update in hw_params for rev 1
Date: Thu, 22 Oct 2026 15:40:39 +0700 [thread overview]
Message-ID: <20261022084040.31181-2-phucduc.bui@gmail.com> (raw)
In-Reply-To: <20261022084040.31181-1-phucduc.bui@gmail.com>
From: bui duc phuc <phucduc.bui@gmail.com>
On revision 1 controllers, loongson_i2s_hw_params() reads LS_I2S_CFG
and ORs the new LR_LEN, BCLK_RATIO and RES_DEPTH values into it
without clearing the old ones.
The first stream after boot is configured correctly, but any later
stream with a different rate or sample width ends up with a mix of
old and new bits, so it may run with the wrong rate or sample width.
Use regmap_update_bits() to replace LR_LEN, BCLK_RATIO and the
RES_DEPTH field for the current direction while preserving the
other direction's RES_DEPTH field.
Fixes: d84881e06836 ("ASoC: Add support for Loongson I2S controller")
Signed-off-by: bui duc phuc <phucduc.bui@gmail.com>
---
Compile-tested only, I don't have the hardware.
A Tested-by from someone with a 2K0300, 2K2000 board would be appreciated.
The field layout follows the Loongson-2K0300 user manual (IISConfig0) [1].
Not sure whether concurrent playback and capture is supported on this controller.
If it is, note that LR_LEN and BCLK_RATIO are shared, so the stream started later
would overwrite them when the sample width or channel count differs.
I can follow up with symmetric_channels and symmetric_sample_bits if that is
the right fix.
[1] https://github.com/loongson-community/docs/blob/master/2K0300/2025060909243029508.%E9%BE%99%E8%8A%AF2K0300%E5%A4%84%E7%90%86%E5%99%A8%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C_V1.01.pdf
sound/soc/loongson/loongson_i2s.c | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/sound/soc/loongson/loongson_i2s.c b/sound/soc/loongson/loongson_i2s.c
index da0d029c028a..109cb61c6ddf 100644
--- a/sound/soc/loongson/loongson_i2s.c
+++ b/sound/soc/loongson/loongson_i2s.c
@@ -69,6 +69,7 @@ static int loongson_i2s_hw_params(struct snd_pcm_substream *substream,
u32 fs = params_rate(params);
u32 bclk_ratio, mclk_ratio;
u32 mclk_ratio_frac;
+ u32 mask;
u32 val = 0;
switch (i2s->rev_id) {
@@ -92,14 +93,19 @@ static int loongson_i2s_hw_params(struct snd_pcm_substream *substream,
mclk_ratio_frac = DIV_ROUND_CLOSEST_ULL(((u64)clk_rate << 16),
sysclk) - (mclk_ratio << 16);
- regmap_read(i2s->regmap, LS_I2S_CFG, &val);
- val |= (bits << 24);
- val |= (bclk_ratio << 8);
- if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+ /* Shared fields: LR_LEN [31:24], BCLK_RATIO [15:8] */
+ mask = GENMASK(31, 24) | GENMASK(15, 8);
+ val = (bits << 24) | (bclk_ratio << 8);
+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+ /* TX_RES_DEPTH */
+ mask |= GENMASK(23, 16);
val |= (bits << 16);
- else
+ } else {
+ /* RX_RES_DEPTH */
+ mask |= GENMASK(7, 0);
val |= bits;
- regmap_write(i2s->regmap, LS_I2S_CFG, val);
+ }
+ regmap_update_bits(i2s->regmap, LS_I2S_CFG, mask, val);
val = (mclk_ratio_frac << 16) | mclk_ratio;
regmap_write(i2s->regmap, LS_I2S_CFG1, val);
--
2.43.0
next prev parent reply other threads:[~2026-10-22 8:41 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-22 8:40 [RFC PATCH 0/2] ASoC: loongson: Fix configuration and clock error handling phucduc.bui
2026-10-22 8:40 ` phucduc.bui [this message]
2026-10-28 3:03 ` [RFC PATCH 1/2] ASoC: loongson: Fix IISConfig0 update in hw_params for rev 1 Binbin Zhou
2026-10-28 10:15 ` Bui Duc Phuc
2026-10-22 8:40 ` [RFC PATCH 2/2] ASoC: loongson: Handle clock enable errors in set_fmt phucduc.bui
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=20261022084040.31181-2-phucduc.bui@gmail.com \
--to=phucduc.bui@gmail.com \
--cc=broonie@kernel.org \
--cc=lgirdwood@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sound@vger.kernel.org \
--cc=mengyingkun@loongson.cn \
--cc=perex@perex.cz \
--cc=tiwai@suse.com \
--cc=zhoubinbin@loongson.cn \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.