ALSA: hda: Fix cached processing coefficient verbs

JIRA: https://issues.redhat.com/browse/RHEL-193254

commit f67be28fdf8b5d31ac1cc1152bb17250f9f8f513
Author: Xu Rao <raoxu@uniontech.com>
Date: Tue Jul 7 21:24:19 2026 +0800

    ALSA: hda: Fix cached processing coefficient verbs

    Intel HD Audio defines Coefficient Index and Processing Coefficient as
    separate audio widget controls in the Audio Widget Verb Definitions:
    Coefficient Index selects the coefficient slot, while Processing
    Coefficient accesses the value at the selected slot.

    hda_reg_read_coef() selects the slot with AC_VERB_SET_COEF_INDEX, but
    then uses AC_VERB_GET_COEF_INDEX for the value read.  That reads back the
    selected index instead of the coefficient value.  hda_reg_write_coef()
    has the same issue and builds the value write from AC_VERB_GET_COEF_INDEX
    instead of AC_VERB_SET_PROC_COEF.

    This only affects the regmap coefficient cache path used by codecs that
    set codec->cache_coef.  Direct coefficient helpers already use the normal
    SET_COEF_INDEX followed by GET_PROC_COEF or SET_PROC_COEF sequence, which
    is likely why this has not been noticed widely.

    Use AC_VERB_GET_PROC_COEF for cached coefficient reads and
    AC_VERB_SET_PROC_COEF for cached coefficient writes.

    Fixes: 40ba66a702 ("ALSA: hda - Add cache support for COEF read/write")
    Cc: stable@vger.kernel.org
    Signed-off-by: Xu Rao <raoxu@uniontech.com>
    Link: https://patch.msgid.link/DB9023BF2920BA99+20260707132419.1731342-1-raoxu@uniontech.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>

Signed-off-by: Jaroslav Kysela <jkysela@redhat.com>
This commit is contained in:
Jaroslav Kysela
2026-07-30 15:24:16 +02:00
parent 27c7a9be19
commit b1761393c4
+2 -2
View File
@@ -214,7 +214,7 @@ static int hda_reg_read_coef(struct hdac_device *codec, unsigned int reg,
err = snd_hdac_exec_verb(codec, verb, 0, NULL);
if (err < 0)
return err;
verb = (reg & ~0xfffff) | (AC_VERB_GET_COEF_INDEX << 8);
verb = (reg & ~0xfffff) | (AC_VERB_GET_PROC_COEF << 8);
return snd_hdac_exec_verb(codec, verb, 0, val);
}
@@ -232,7 +232,7 @@ static int hda_reg_write_coef(struct hdac_device *codec, unsigned int reg,
err = snd_hdac_exec_verb(codec, verb, 0, NULL);
if (err < 0)
return err;
verb = (reg & ~0xfffff) | (AC_VERB_GET_COEF_INDEX << 8) |
verb = (reg & ~0xfffff) | (AC_VERB_SET_PROC_COEF << 8) |
(val & 0xffff);
return snd_hdac_exec_verb(codec, verb, 0, NULL);
}