At Fri, 15 Jan 2010 12:04:11 +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. The lengthy case for checking gpio_led can be a single function, e.g. set_hp_gpio_led(), so that we don't need to add to multiple places if new codec chip appears. Then the else section (dv) can be simply set_hp_gpio_led(codec); spec->gpio_led_polarity = 1; return 1; Could you change in that way, test and repost? thanks, Takashi > > Signed-off-by: Kunal Gangakhedkar <kunal.gangakhedkar@xxxxxxxxx> > --- > sound/pci/hda/patch_sigmatel.c | 82 ++++++++++++++++++++++++++++++---------- > 1 files changed, 62 insertions(+), 20 deletions(-) > > diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c > index 117919a..d421b3b 100644 > --- a/sound/pci/hda/patch_sigmatel.c > +++ b/sound/pci/hda/patch_sigmatel.c > @@ -4737,6 +4737,8 @@ static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res) > } > } > > +static int hp_blike_system(u32 subsystem_id); > + > /* > * This method searches for the mute LED GPIO configuration > * provided as OEM string in SMBIOS. The format of that string > @@ -4748,6 +4750,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,29 +4770,54 @@ 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. > + */ > + switch (codec->vendor_id) { > + case 0x111d7608: > + /* GPIO 0 */ > + spec->gpio_led = 0x01; > + spec->gpio_led_polarity |= spec->gpio_led; > + return 1; > + case 0x111d7600: > + case 0x111d7601: > + case 0x111d7602: > + case 0x111d7603: > + /* GPIO 3 */ > + spec->gpio_led = 0x08; > + spec->gpio_led_polarity |= spec->gpio_led; > + return 1; > } > } > } > @@ -5603,6 +5643,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 > > _______________________________________________ > Alsa-devel mailing list > Alsa-devel@xxxxxxxxxxxxxxxx > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel > _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel