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

Takashi Iwai tiwai at suse.de
Wed Jun 27 11:50:46 CEST 2018


On Wed, 27 Jun 2018 11:36:12 +0200,
Chris Wilson wrote:
> 
> 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?

The power up path is already pm_runtime_get_sync(), so it's a fatal
error.  So I suppose that the failure must be very exceptional, and no
need to complicate things too much.

> 
> > @@ -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>

Thanks!

Takashi


More information about the Alsa-devel mailing list