| From c7cd0ef66aade29e37ee08821a0e195ee776c6e6 Mon Sep 17 00:00:00 2001 | 
 | From: Takashi Iwai <tiwai@suse.de> | 
 | Date: Mon, 24 Aug 2015 10:52:06 +0200 | 
 | Subject: ALSA: hda - Fix path power activation | 
 |  | 
 | From: Takashi Iwai <tiwai@suse.de> | 
 |  | 
 | commit c7cd0ef66aade29e37ee08821a0e195ee776c6e6 upstream. | 
 |  | 
 | The widget power-saving code tries to turn up/down the power of each | 
 | widget in the I/O paths that are modified at each jack plug/unplug. | 
 | The recent report revealed that the power activation leaves some | 
 | widgets unpowered after plugging.  This is because | 
 | snd_hda_activate_path() turns on path->active flag at the end of the | 
 | function while the path power management is done before that.  Then | 
 | it's regarded as if nothing is active, and the driver turns off the | 
 | power. | 
 |  | 
 | The fix is simply to set the flag at the beginning of the function, | 
 | before trying to power up. | 
 |  | 
 | Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=102521 | 
 | Signed-off-by: Takashi Iwai <tiwai@suse.de> | 
 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 
 |  | 
 | --- | 
 |  sound/pci/hda/hda_generic.c |    6 +----- | 
 |  1 file changed, 1 insertion(+), 5 deletions(-) | 
 |  | 
 | --- a/sound/pci/hda/hda_generic.c | 
 | +++ b/sound/pci/hda/hda_generic.c | 
 | @@ -884,8 +884,7 @@ void snd_hda_activate_path(struct hda_co | 
 |  	struct hda_gen_spec *spec = codec->spec; | 
 |  	int i; | 
 |   | 
 | -	if (!enable) | 
 | -		path->active = false; | 
 | +	path->active = enable; | 
 |   | 
 |  	/* make sure the widget is powered up */ | 
 |  	if (enable && (spec->power_down_unused || codec->power_save_node)) | 
 | @@ -903,9 +902,6 @@ void snd_hda_activate_path(struct hda_co | 
 |  		if (has_amp_out(codec, path, i)) | 
 |  			activate_amp_out(codec, path, i, enable); | 
 |  	} | 
 | - | 
 | -	if (enable) | 
 | -		path->active = true; | 
 |  } | 
 |  EXPORT_SYMBOL_GPL(snd_hda_activate_path); | 
 |   |