Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d38cce70 authored by Kunal Gangakhedkar's avatar Kunal Gangakhedkar Committed by Takashi Iwai
Browse files

ALSA: hda - Fix mute led GPIO on HP dv-series notebooks



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.

Signed-off-by: default avatarKunal Gangakhedkar <kunal.gangakhedkar@gmail.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent c7a8eb10
Loading
Loading
Loading
Loading
+45 −16
Original line number Diff line number Diff line
@@ -4730,6 +4730,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
@@ -4741,6 +4761,14 @@ 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.
 * -- kunal
 */
static int find_mute_led_gpio(struct hda_codec *codec)
{
@@ -4758,20 +4786,19 @@ static int find_mute_led_gpio(struct hda_codec *codec)
			}
			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;
				set_hp_led_gpio(codec);
				return 1;
			}
		}

		/*
		 * Fallback case - if we don't find the DMI strings,
		 * we statically set the GPIO - if not a B-series system.
		 */
		if (!hp_blike_system(codec->subsystem_id)) {
			set_hp_led_gpio(codec);
			spec->gpio_led_polarity = 1;
			return 1;
		}
	}
	return 0;
@@ -5548,6 +5575,8 @@ static int patch_stac92hd71bxx(struct hda_codec *codec)
	spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids);
	spec->num_smuxes = stac92hd71bxx_connected_smuxes(codec, 0x1e);

	snd_printdd("Found board config: %d\n", spec->board_config);

	switch (spec->board_config) {
	case STAC_HP_M4:
		/* enable internal microphone */