On Mon, Jun 1, 2026 at 4:33 PM <[email protected]> wrote: > > From: Chancel Liu <[email protected]> > > When configuring 32 slots TDM (channels == slots == 32), the xMR > (Mask Register) write used: > ~0UL - ((1 << min(channels, slots)) - 1) > > The literal "1" is a signed 32-bit int. Shifting it by 32 positions is > undefined behaviour which may set this register to 0xFFFFFFFF, masking > all 32 slots. > > Use GENMASK_U32() macro instead. For 32 slots this produces a zero mask: > ~GENMASK_U32(31, 0) = ~0xFFFFFFFF = 0x00000000 > Behaviour for fewer than 32 slots is unchanged. > > Fixes: 770f58d7d2c5 ("ASoC: fsl_sai: Support multiple data channel enable > bits") > Cc: [email protected] > Signed-off-by: Chancel Liu <[email protected]>
Reviewed-by: Shengjiu Wang <[email protected]> Best regards Shengjiu Wang > --- > Changes in v3 > - Fix patch can't be applied > > Changes in v2 > - Use GENMASK_U32() macro instead to make it clearer and safer > > sound/soc/fsl/fsl_sai.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/sound/soc/fsl/fsl_sai.c b/sound/soc/fsl/fsl_sai.c > index d6dd95680892..9661602b53c5 100644 > --- a/sound/soc/fsl/fsl_sai.c > +++ b/sound/soc/fsl/fsl_sai.c > @@ -797,7 +797,7 @@ static int fsl_sai_hw_params(struct snd_pcm_substream > *substream, > FSL_SAI_CR4_FSD_MSTR, > FSL_SAI_CR4_FSD_MSTR); > > regmap_write(sai->regmap, FSL_SAI_xMR(tx), > - ~0UL - ((1 << min(channels, slots)) - 1)); > + ~GENMASK_U32(min(channels, slots) - 1, 0)); > > return 0; > } > -- > 2.50.1 >
