ASoC: cs35l56: Avoid uninitialized variable in cs35l56_set_asp_slot_positions()

Re-implement setting of ASP TDM slots so that only the common loop to
build the register word is factored out.

The original cs35l56_set_asp_slot_positions() had an apparent
uninitialized variable if the passed register address was neither of the
ASP slot registers. In fact this would never happen because the calling
code passed valid registers.

While it's trivial to initialize the variable or add a default case,
actually the only common code was the loop at the end of the function,
which simply manipulates some mask values and is identical for either
register. Factoring out the regmap_write() didn't really gain anything.

So instead re-implement the code to replace the original function with
cs35l56_make_tdm_config_word() that only does the loop, and change the
calling code to call regmap_write() directly.

Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20230808164702.21272-2-rf@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Richard Fitzgerald 2023-08-08 17:46:58 +01:00 committed by Mark Brown
parent a932f45a18
commit ebd0f7b08e
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0

View File

@ -358,22 +358,11 @@ static int cs35l56_asp_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int f
return 0;
}
static void cs35l56_set_asp_slot_positions(struct cs35l56_private *cs35l56,
unsigned int reg, unsigned long mask)
static unsigned int cs35l56_make_tdm_config_word(unsigned int reg_val, unsigned long mask)
{
unsigned int reg_val, channel_shift;
unsigned int channel_shift;
int bit_num;
/* Init all slots to 63 */
switch (reg) {
case CS35L56_ASP1_FRAME_CONTROL1:
reg_val = 0x3f3f3f3f;
break;
case CS35L56_ASP1_FRAME_CONTROL5:
reg_val = 0x3f3f3f;
break;
}
/* Enable consecutive TX1..TXn for each of the slots set in mask */
channel_shift = 0;
for_each_set_bit(bit_num, &mask, 32) {
@ -382,7 +371,7 @@ static void cs35l56_set_asp_slot_positions(struct cs35l56_private *cs35l56,
channel_shift += 8;
}
regmap_write(cs35l56->base.regmap, reg, reg_val);
return reg_val;
}
static int cs35l56_asp_dai_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
@ -418,8 +407,11 @@ static int cs35l56_asp_dai_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx
if (rx_mask == 0)
rx_mask = 0xf; // ASPTX1..TX4 in slots 0..3
cs35l56_set_asp_slot_positions(cs35l56, CS35L56_ASP1_FRAME_CONTROL1, rx_mask);
cs35l56_set_asp_slot_positions(cs35l56, CS35L56_ASP1_FRAME_CONTROL5, tx_mask);
/* Default unused slots to 63 */
regmap_write(cs35l56->base.regmap, CS35L56_ASP1_FRAME_CONTROL1,
cs35l56_make_tdm_config_word(0x3f3f3f3f, rx_mask));
regmap_write(cs35l56->base.regmap, CS35L56_ASP1_FRAME_CONTROL5,
cs35l56_make_tdm_config_word(0x3f3f3f, tx_mask));
dev_dbg(cs35l56->base.dev, "tdm slot width: %u count: %u tx_mask: %#x rx_mask: %#x\n",
cs35l56->asp_slot_width, cs35l56->asp_slot_count, tx_mask, rx_mask);