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

Kunal Gangakhedkar kunal.gangakhedkar at gmail.com
Fri Jan 15 14:05:19 CET 2010


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.

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