]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ASoC: rt721-sdca: fix boost gain calculation error
authorJack Yu <jack.yu@realtek.com>
Tue, 24 Jun 2025 02:59:28 +0000 (02:59 +0000)
committerMark Brown <broonie@kernel.org>
Tue, 24 Jun 2025 12:55:18 +0000 (13:55 +0100)
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 <jack.yu@realtek.com>
Link: https://patch.msgid.link/1b18fcde41c64d6fa85451d523c0434a@realtek.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/rt721-sdca.c

index 1c9f32e405cf95f7e5d9a3aef7e68fdd9b294f7b..ba080957e9336181dbba71df28b736a232ae7518 100644 (file)
@@ -430,6 +430,7 @@ static int rt721_sdca_set_gain_get(struct snd_kcontrol *kcontrol,
        unsigned int read_l, read_r, ctl_l = 0, ctl_r = 0;
        unsigned int adc_vol_flag = 0;
        const unsigned int interval_offset = 0xc0;
+       const unsigned int tendA = 0x200;
        const unsigned int tendB = 0xa00;
 
        if (strstr(ucontrol->id.name, "FU1E Capture Volume") ||
@@ -439,9 +440,16 @@ static int rt721_sdca_set_gain_get(struct snd_kcontrol *kcontrol,
        regmap_read(rt721->mbq_regmap, mc->reg, &read_l);
        regmap_read(rt721->mbq_regmap, mc->rreg, &read_r);
 
-       if (mc->shift == 8) /* boost gain */
+       if (mc->shift == 8) {
+               /* boost gain */
                ctl_l = read_l / tendB;
-       else {
+       } else if (mc->shift == 1) {
+               /* FU33 boost gain */
+               if (read_l == 0x8000 || read_l == 0xfe00)
+                       ctl_l = 0;
+               else
+                       ctl_l = read_l / tendA + 1;
+       } else {
                if (adc_vol_flag)
                        ctl_l = mc->max - (((0x1e00 - read_l) & 0xffff) / interval_offset);
                else
@@ -449,9 +457,16 @@ static int rt721_sdca_set_gain_get(struct snd_kcontrol *kcontrol,
        }
 
        if (read_l != read_r) {
-               if (mc->shift == 8) /* boost gain */
+               if (mc->shift == 8) {
+                       /* boost gain */
                        ctl_r = read_r / tendB;
-               else { /* ADC/DAC gain */
+               } else if (mc->shift == 1) {
+                       /* FU33 boost gain */
+                       if (read_r == 0x8000 || read_r == 0xfe00)
+                               ctl_r = 0;
+                       else
+                               ctl_r = read_r / tendA + 1;
+               } else { /* ADC/DAC gain */
                        if (adc_vol_flag)
                                ctl_r = mc->max - (((0x1e00 - read_r) & 0xffff) / interval_offset);
                        else