diff options
| -rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 57 | 
1 files changed, 27 insertions, 30 deletions
| diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 39961879c414..ea254235470d 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -4363,6 +4363,12 @@ static int stac92xx_init(struct hda_codec *codec)  		if (enable_pin_detect(codec, nid, STAC_PWR_EVENT))  			stac_issue_unsol_event(codec, nid);  	} + +#ifdef CONFIG_SND_HDA_POWER_SAVE +	/* sync mute LED */ +	if (spec->gpio_led && codec->patch_ops.check_power_status) +		codec->patch_ops.check_power_status(codec, 0x01); +#endif	  	if (spec->dac_list)  		stac92xx_power_down(codec);  	return 0; @@ -4909,6 +4915,11 @@ static int stac92xx_resume(struct hda_codec *codec)  			stac_issue_unsol_event(codec,  					       spec->autocfg.line_out_pins[0]);  	} +#ifdef CONFIG_SND_HDA_POWER_SAVE +	/* sync mute LED */ +	if (spec->gpio_led && codec->patch_ops.check_power_status) +		codec->patch_ops.check_power_status(codec, 0x01); +#endif	  	return 0;  } @@ -4928,43 +4939,29 @@ static int stac92xx_hp_check_power_status(struct hda_codec *codec,  					      hda_nid_t nid)  {  	struct sigmatel_spec *spec = codec->spec; +	int i, muted = 1; -	if (nid == 0x10) { -		if (snd_hda_codec_amp_read(codec, nid, 0, HDA_OUTPUT, 0) & -		    HDA_AMP_MUTE) -			spec->gpio_data &= ~spec->gpio_led; /* orange */ -		else -			spec->gpio_data |= spec->gpio_led; /* white */ - -		if (!spec->gpio_led_polarity) { -			/* LED state is inverted on these systems */ -			spec->gpio_data ^= spec->gpio_led; +	for (i = 0; i < spec->multiout.num_dacs; i++) { +		nid = spec->multiout.dac_nids[i]; +		if (!(snd_hda_codec_amp_read(codec, nid, 0, HDA_OUTPUT, 0) & +		      HDA_AMP_MUTE)) { +			muted = 0; /* something heard */ +			break;  		} - -		stac_gpio_set(codec, spec->gpio_mask, -			      spec->gpio_dir, -			      spec->gpio_data);  	} +	if (muted) +		spec->gpio_data &= ~spec->gpio_led; /* orange */ +	else +		spec->gpio_data |= spec->gpio_led; /* white */ -	return 0; -} - -static int idt92hd83xxx_hp_check_power_status(struct hda_codec *codec, -					      hda_nid_t nid) -{ -	struct sigmatel_spec *spec = codec->spec; +	if (!spec->gpio_led_polarity) { +		/* LED state is inverted on these systems */ +		spec->gpio_data ^= spec->gpio_led; +	} -	if (nid != 0x13) -		return 0; -	if (snd_hda_codec_amp_read(codec, nid, 0, HDA_OUTPUT, 0) & HDA_AMP_MUTE) -		spec->gpio_data |= spec->gpio_led; /* mute LED on */ -	else -		spec->gpio_data &= ~spec->gpio_led; /* mute LED off */  	stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, spec->gpio_data); -  	return 0;  } -  #endif  static int stac92xx_suspend(struct hda_codec *codec, pm_message_t state) @@ -5361,7 +5358,7 @@ again:  		spec->gpio_data |= spec->gpio_led;  		/* register check_power_status callback. */  		codec->patch_ops.check_power_status = -			idt92hd83xxx_hp_check_power_status; +			stac92xx_hp_check_power_status;  	}  #endif	 | 
