[alsa-devel] [PATCH 1/3] ALSA: hda - Handle error from snd_hda_power_up*()

Chris Wilson chris at chris-wilson.co.uk
Wed Jun 27 11:36:12 CEST 2018


Quoting Takashi Iwai (2018-06-27 10:10:32)
> Although snd_hda_power_up() and snd_hda_power_up_pm() may fail, we
> haven't dealt with the error properly in many places.  It's an unusual
> situation but still possible.
> 
> This patch spots these places and adds the proper error paths.
> 
> Signed-off-by: Takashi Iwai <tiwai at suse.de>
> ---
> @@ -5407,7 +5428,9 @@ static int ca0132_volume_put(struct snd_kcontrol *kcontrol,
>                 int dir = get_amp_direction(kcontrol);
>                 unsigned long pval;
>  
> -               snd_hda_power_up(codec);
> +               err = snd_hda_power_up(codec);
> +               if (err < 0)
> +                       return err;
>                 mutex_lock(&codec->control_mutex);
>                 pval = kcontrol->private_value;
>                 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(shared_nid, ch,

Should this be deferred until pm is next acquired?
Or are we regarding pm can only fail nonrecoverably?

> @@ -5436,6 +5459,7 @@ static int ca0132_alt_volume_put(struct snd_kcontrol *kcontrol,
>         long *valp = ucontrol->value.integer.value;
>         hda_nid_t vnid = 0;
>         int changed = 1;
> +       int err;
>  
>         switch (nid) {
>         case 0x02:
> @@ -5456,7 +5480,9 @@ static int ca0132_alt_volume_put(struct snd_kcontrol *kcontrol,
>                 valp++;
>         }
>  
> -       snd_hda_power_up(codec);
> +       err = snd_hda_power_up(codec);
> +       if (err < 0)
> +               return err;
>         ca0132_alt_dsp_volume_put(codec, vnid);
>         mutex_lock(&codec->control_mutex);
>         changed = snd_hda_mixer_amp_volume_put(kcontrol, ucontrol);

> diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
> index 5ad6c7e5f92e..b0d757cf7aab 100644
> --- a/sound/pci/hda/patch_realtek.c
> +++ b/sound/pci/hda/patch_realtek.c
> @@ -3606,7 +3606,8 @@ static void alc269_fixup_mic_mute_hook(void *private_data, int enabled)
>         pinval |= enabled ? AC_PINCTL_VREF_HIZ : AC_PINCTL_VREF_80;
>         if (spec->mute_led_nid) {
>                 /* temporarily power up/down for setting VREF */
> -               snd_hda_power_up_pm(codec);
> +               if (snd_hda_power_up_pm(codec) < 0)
> +                       return;
>                 snd_hda_set_pin_ctl_cache(codec, spec->mute_led_nid, pinval);
>                 snd_hda_power_down_pm(codec);
>         }

Similar questions as for deferred application.

I did not find any imbalance introduced and the error is propagated or
handled,
Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
-Chris


More information about the Alsa-devel mailing list