ALSA: hda - Always allow access for POWER_STATE verbs via regmap
authorTakashi Iwai <tiwai@suse.de>
Thu, 9 Apr 2015 05:58:46 +0000 (07:58 +0200)
committerTakashi Iwai <tiwai@suse.de>
Thu, 9 Apr 2015 06:24:51 +0000 (08:24 +0200)
The hdac regmap code checks whether the codec is powered on while
accessing, but there must be an exception -- the verbs to control the
power state.

Currently HD-audio driver doesn't access them via regmap, so this
patch doesn't fix any current behavior, but it's just for future.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/hda/hdac_regmap.c

index 64876fa357c9f788d642834f8a0ce0558bd20bd2..51f1b5c8a91ccccd37f2d2ad7725111d1a4890a7 100644 (file)
@@ -239,7 +239,7 @@ static int hda_reg_read(void *context, unsigned int reg, unsigned int *val)
        int verb = get_verb(reg);
        int err;
 
-       if (!codec_is_running(codec))
+       if (!codec_is_running(codec) && verb != AC_VERB_GET_POWER_STATE)
                return -EAGAIN;
        reg |= (codec->addr << 28);
        if (is_stereo_amp_verb(reg))
@@ -265,16 +265,16 @@ static int hda_reg_write(void *context, unsigned int reg, unsigned int val)
        unsigned int verb;
        int i, bytes, err;
 
-       if (!codec_is_running(codec))
-               return codec->lazy_cache ? 0 : -EAGAIN;
-
        reg &= ~0x00080000U; /* drop GET bit */
        reg |= (codec->addr << 28);
+       verb = get_verb(reg);
+
+       if (!codec_is_running(codec) && verb != AC_VERB_SET_POWER_STATE)
+               return codec->lazy_cache ? 0 : -EAGAIN;
 
        if (is_stereo_amp_verb(reg))
                return hda_reg_write_stereo_amp(codec, reg, val);
 
-       verb = get_verb(reg);
        if (verb == AC_VERB_SET_PROC_COEF)
                return hda_reg_write_coef(codec, reg, val);