Commit 33f81940 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: hda - Handle get/set power verb symmetrically via regmap

HD-audio has quite a few asymmetrical ways of accessing verbs, and one
of typical ones is GET/SET_POWER_STATE verbs.  While it takes only the
power state for setting, it returns a combination of states for
getting.  For making the state handling simpler, this patch adds a
code to translate the value returned from GET_POWER_STATE to return
only the actual state or -1 for error.  In that way, the driver can
simplify the power state management.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent d313e0a8
......@@ -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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment