diff --git a/sound/hda/hdac_regmap.c b/sound/hda/hdac_regmap.c index fb4a02e0319f..2eea8d4e6a7f 100644 --- a/sound/hda/hdac_regmap.c +++ b/sound/hda/hdac_regmap.c @@ -191,13 +191,24 @@ static int hda_reg_write_stereo_amp(struct hdac_device *codec, static int hda_reg_read(void *context, unsigned int reg, unsigned int *val) { struct hdac_device *codec = context; + int err; if (!codec_is_running(codec)) return -EAGAIN; reg |= (codec->addr << 28); if (is_stereo_amp_verb(reg)) return hda_reg_read_stereo_amp(codec, reg, val); - return snd_hdac_exec_verb(codec, reg, 0, val); + err = snd_hdac_exec_verb(codec, reg, 0, val); + if (err < 0) + return err; + /* special handling for asymmetric reads */ + if (get_verb(reg) == AC_VERB_GET_POWER_STATE) { + if (*val & AC_PWRST_ERROR) + *val = -1; + else /* take only the actual state */ + *val = (*val >> 4) & 0x0f; + } + return 0; } static int hda_reg_write(void *context, unsigned int reg, unsigned int val)