[alsa-devel] [PATCH v2] ALSA: Fix mute led GPIO on HP dv-series notebooks.

Takashi Iwai tiwai at suse.de
Fri Jan 15 14:21:30 CET 2010


At Fri, 15 Jan 2010 18:35:19 +0530,
Kunal Gangakhedkar wrote:
> 
> On my laptop (HP dv6-1110ax), there are no OEM strings in SMBIOS of type
> "HP_Mute_LED*". Hence, the GPIO for the mute button LED doesn't get set
> properly. I didn't find the strings in my cousin's laptop (HP dv9500t CTO)
> either.
> 
> As per the documentation of find_mute_led_gpio(), these strings occur
> in HP B-series systems - so, before scanning the SMBIOS strings, we need to
> check if we're dealing with a B-series system.
> Need to get confirmation from HP if this logic takes care of all the
> systems. I'm trying to poke a friend there.
> 
> Please let me know if this looks OK or needs changes.

Well, the open switch() for blike-system should be replaced with
set_hp_led_gpio().  That's the very purpose I proposed to create a
function.

Thinking the logic again, however, it might be safer to check DMI
entries no matter which model is.  Then set statically if it's DV
series (i.e. !hp_blike_system()) as fallback.  I suppose HP will
implement the DMI entry for their new BIOS on other models in future,
too, so the chance is high that the right setup is detected through
DMI check instead of blindly fixed setup.


thanks,

Takashi

> 
> Signed-off-by: Kunal Gangakhedkar <kunal.gangakhedkar at gmail.com>
> ---
>  sound/pci/hda/patch_sigmatel.c |   88 +++++++++++++++++++++++++++++++---------
>  1 files changed, 68 insertions(+), 20 deletions(-)
> 
> diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
> index 117919a..85abf14 100644
> --- a/sound/pci/hda/patch_sigmatel.c
> +++ b/sound/pci/hda/patch_sigmatel.c
> @@ -4737,6 +4737,26 @@ static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res)
>  	}
>  }
>  
> +static int hp_blike_system(u32 subsystem_id);
> +
> +static void set_hp_led_gpio(struct hda_codec *codec)
> +{
> +	struct sigmatel_spec *spec = codec->spec;
> +	switch (codec->vendor_id) {
> +	case 0x111d7608:
> +		/* GPIO 0 */
> +		spec->gpio_led = 0x01;
> +		break;
> +	case 0x111d7600:
> +	case 0x111d7601:
> +	case 0x111d7602:
> +	case 0x111d7603:
> +		/* GPIO 3 */
> +		spec->gpio_led = 0x08;
> +		break;
> +	}
> +}
> +
>  /*
>   * This method searches for the mute LED GPIO configuration
>   * provided as OEM string in SMBIOS. The format of that string
> @@ -4748,6 +4768,19 @@ static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res)
>   *
>   * So, HP B-series like systems may have HP_Mute_LED_0 (current models)
>   * or  HP_Mute_LED_0_3 (future models) OEM SMBIOS strings
> + *
> + *
> + * The dv-series laptops don't seem to have the HP_Mute_LED* strings in
> + * SMBIOS - at least the ones I have seen do not have them - which include
> + * my own system (HP Pavilion dv6-1110ax) and my cousin's
> + * HP Pavilion dv9500t CTO.
> + * Need more information on whether it is true across the entire series.
> + *
> + * The "else" could be converted into a conditional check for dv-series -
> + * say, hp_dv_series_system() - just like hp_blike_system(); however,
> + * I don't have all the PCI ids to identify the dv-series machines - maybe,
> + * we can add that later.
> + * -- kunal
>   */
>  static int find_mute_led_gpio(struct hda_codec *codec)
>  {
> @@ -4755,30 +4788,43 @@ static int find_mute_led_gpio(struct hda_codec *codec)
>  	const struct dmi_device *dev = NULL;
>  
>  	if ((codec->subsystem_id >> 16) == PCI_VENDOR_ID_HP) {
> -		while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING,
> +		if (hp_blike_system(codec->subsystem_id)) {
> +			while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING,
>  								NULL, dev))) {
> -			if (sscanf(dev->name, "HP_Mute_LED_%d_%d",
> -			      &spec->gpio_led_polarity,
> -			      &spec->gpio_led) == 2) {
> -				spec->gpio_led = 1 << spec->gpio_led;
> -				return 1;
> -			}
> -			if (sscanf(dev->name, "HP_Mute_LED_%d",
> -			      &spec->gpio_led_polarity) == 1) {
> -				switch (codec->vendor_id) {
> -				case 0x111d7608:
> -					/* GPIO 0 */
> -					spec->gpio_led = 0x01;
> -					return 1;
> -				case 0x111d7600:
> -				case 0x111d7601:
> -				case 0x111d7602:
> -				case 0x111d7603:
> -					/* GPIO 3 */
> -					spec->gpio_led = 0x08;
> +				if (sscanf(dev->name, "HP_Mute_LED_%d_%d",
> +					  &spec->gpio_led_polarity,
> +					  &spec->gpio_led) == 2) {
> +					spec->gpio_led = 1 << spec->gpio_led;
>  					return 1;
>  				}
> +				if (sscanf(dev->name, "HP_Mute_LED_%d",
> +					  &spec->gpio_led_polarity) == 1) {
> +					switch (codec->vendor_id) {
> +					case 0x111d7608:
> +						/* GPIO 0 */
> +						spec->gpio_led = 0x01;
> +						return 1;
> +					case 0x111d7600:
> +					case 0x111d7601:
> +					case 0x111d7602:
> +					case 0x111d7603:
> +						/* GPIO 3 */
> +						spec->gpio_led = 0x08;
> +						return 1;
> +					}
> +				}
>  			}
> +		} else {
> +			/*
> +			 * Pavilion dv series notebooks do not seem to have
> +			 * HP_Mute_LED* in SMBIOS.
> +			 * If HP decides to add it in dv series,
> +			 * we'll need to fix this part
> +			 * - or merge it with the B-like check above.
> +			 */
> +			set_hp_led_gpio(codec);
> +			spec->gpio_led_polarity = 1;
> +			return 1;
>  		}
>  	}
>  	return 0;
> @@ -5603,6 +5649,8 @@ again:
>  	spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids);
>  	spec->num_smuxes = stac92hd71bxx_connected_smuxes(codec, 0x1e);
>  
> +	snd_printd("Found board config: %d\n", spec->board_config);
> +
>  	switch (spec->board_config) {
>  	case STAC_HP_M4:
>  		/* enable internal microphone */
> -- 
> 1.6.6.60.gc2ff1
> 


More information about the Alsa-devel mailing list