Skip to content

Commit ff21a6e

Browse files
Jack Yubroonie
authored andcommitted
ASoC: rt721-sdca: fix boost gain calculation error
Fix the boost gain calculation error in rt721_sdca_set_gain_get. This patch is specific for "FU33 Boost Volume". Signed-off-by: Jack Yu <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent dc6458e commit ff21a6e

File tree

1 file changed

+19
-4
lines changed

1 file changed

+19
-4
lines changed

sound/soc/codecs/rt721-sdca.c

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,7 @@ static int rt721_sdca_set_gain_get(struct snd_kcontrol *kcontrol,
430430
unsigned int read_l, read_r, ctl_l = 0, ctl_r = 0;
431431
unsigned int adc_vol_flag = 0;
432432
const unsigned int interval_offset = 0xc0;
433+
const unsigned int tendA = 0x200;
433434
const unsigned int tendB = 0xa00;
434435

435436
if (strstr(ucontrol->id.name, "FU1E Capture Volume") ||
@@ -439,19 +440,33 @@ static int rt721_sdca_set_gain_get(struct snd_kcontrol *kcontrol,
439440
regmap_read(rt721->mbq_regmap, mc->reg, &read_l);
440441
regmap_read(rt721->mbq_regmap, mc->rreg, &read_r);
441442

442-
if (mc->shift == 8) /* boost gain */
443+
if (mc->shift == 8) {
444+
/* boost gain */
443445
ctl_l = read_l / tendB;
444-
else {
446+
} else if (mc->shift == 1) {
447+
/* FU33 boost gain */
448+
if (read_l == 0x8000 || read_l == 0xfe00)
449+
ctl_l = 0;
450+
else
451+
ctl_l = read_l / tendA + 1;
452+
} else {
445453
if (adc_vol_flag)
446454
ctl_l = mc->max - (((0x1e00 - read_l) & 0xffff) / interval_offset);
447455
else
448456
ctl_l = mc->max - (((0 - read_l) & 0xffff) / interval_offset);
449457
}
450458

451459
if (read_l != read_r) {
452-
if (mc->shift == 8) /* boost gain */
460+
if (mc->shift == 8) {
461+
/* boost gain */
453462
ctl_r = read_r / tendB;
454-
else { /* ADC/DAC gain */
463+
} else if (mc->shift == 1) {
464+
/* FU33 boost gain */
465+
if (read_r == 0x8000 || read_r == 0xfe00)
466+
ctl_r = 0;
467+
else
468+
ctl_r = read_r / tendA + 1;
469+
} else { /* ADC/DAC gain */
455470
if (adc_vol_flag)
456471
ctl_r = mc->max - (((0x1e00 - read_r) & 0xffff) / interval_offset);
457472
else

0 commit comments

Comments
 (0)