@ -4961,29 +4961,19 @@ static int stac92xx_resume(struct hda_codec *codec)
stac_issue_unsol_event ( codec ,
spec - > autocfg . line_out_pins [ 0 ] ) ;
}
/* sync mute LED */
if ( spec - > gpio_led )
hda_call_check_power_status ( codec , 0x01 ) ;
return 0 ;
}
# ifdef CONFIG_SND_HDA_POWER_SAVE
/*
* using power check for controlling mute led of HP notebooks
* check for mute state only on Speakers ( nid = 0x10 )
*
* For this feature CONFIG_SND_HDA_POWER_SAVE is needed , otherwise
* the LED is NOT working properly !
*
* Changed name to reflect that it now works for any designated
* model , not just HP HDX .
* For this feature CONFIG_SND_HDA_POWER_SAVE is needed
* as mute LED state is updated in check_power_status hook
*/
# ifdef CONFIG_SND_HDA_POWER_SAVE
static int stac92xx_hp_check_power_status ( struct hda_codec * codec ,
hda_nid_t nid )
static int stac92xx_update_led_status ( struct hda_codec * codec )
{
struct sigmatel_spec * spec = codec - > spec ;
int i , muted = 1 ;
int i , num_ext_dacs , muted = 1 ;
hda_nid_t nid ;
for ( i = 0 ; i < spec - > multiout . num_dacs ; i + + ) {
nid = spec - > multiout . dac_nids [ i ] ;
@ -4993,6 +4983,22 @@ static int stac92xx_hp_check_power_status(struct hda_codec *codec,
break ;
}
}
if ( muted & & spec - > multiout . hp_nid )
if ( ! ( snd_hda_codec_amp_read ( codec ,
spec - > multiout . hp_nid , 0 , HDA_OUTPUT , 0 ) &
HDA_AMP_MUTE ) ) {
muted = 0 ; /* HP is not muted */
}
num_ext_dacs = ARRAY_SIZE ( spec - > multiout . extra_out_nid ) ;
for ( i = 0 ; muted & & i < num_ext_dacs ; i + + ) {
nid = spec - > multiout . extra_out_nid [ i ] ;
if ( nid = = 0 )
break ;
if ( ! ( snd_hda_codec_amp_read ( codec , nid , 0 , HDA_OUTPUT , 0 ) &
HDA_AMP_MUTE ) ) {
muted = 0 ; /* extra output is not muted */
}
}
if ( muted )
spec - > gpio_data & = ~ spec - > gpio_led ; /* orange */
else
@ -5006,6 +5012,17 @@ static int stac92xx_hp_check_power_status(struct hda_codec *codec,
stac_gpio_set ( codec , spec - > gpio_mask , spec - > gpio_dir , spec - > gpio_data ) ;
return 0 ;
}
/*
* use power check for controlling mute led of HP notebooks
*/
static int stac92xx_check_power_status ( struct hda_codec * codec ,
hda_nid_t nid )
{
stac92xx_update_led_status ( codec ) ;
return 0 ;
}
# endif
static int stac92xx_suspend ( struct hda_codec * codec , pm_message_t state )
@ -5543,7 +5560,7 @@ again:
spec - > gpio_data | = spec - > gpio_led ;
/* register check_power_status callback. */
codec - > patch_ops . check_power_status =
stac92xx_hp_ check_power_status ;
stac92xx_check_power_status ;
}
# endif
@ -5871,7 +5888,7 @@ again:
spec - > gpio_data | = spec - > gpio_led ;
/* register check_power_status callback. */
codec - > patch_ops . check_power_status =
stac92xx_hp_ check_power_status ;
stac92xx_check_power_status ;
}
# endif