ALSA: hda - Add a new fixup type to override pinctl values
authorTakashi Iwai <tiwai@suse.de>
Thu, 10 Jan 2013 09:18:14 +0000 (10:18 +0100)
committerTakashi Iwai <tiwai@suse.de>
Sat, 12 Jan 2013 07:44:35 +0000 (08:44 +0100)
Add a new fixup type, HDA_FIXUP_PINCTLS, for overriding the pinctl
values of the given pins.  It takes the same array of struct pintbl
like HDA_FIXUP_PINS, but each entry contains the pinctl value instead
of the pin default config value.

This patch also replaces the corresponding codes in patch_realtek.c.
Without this change, the direct call of verbs may be overridden again
by the later call of pinctl restoration by the driver.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_auto_parser.c
sound/pci/hda/hda_local.h
sound/pci/hda/patch_realtek.c

index e5b2021..55ed857 100644 (file)
@@ -655,6 +655,13 @@ void snd_hda_apply_pincfgs(struct hda_codec *codec,
 }
 EXPORT_SYMBOL_HDA(snd_hda_apply_pincfgs);
 
+static void set_pin_targets(struct hda_codec *codec,
+                           const struct hda_pintbl *cfg)
+{
+       for (; cfg->nid; cfg++)
+               snd_hda_set_pin_ctl_cache(codec, cfg->nid, cfg->val);
+}
+
 void snd_hda_apply_fixup(struct hda_codec *codec, int action)
 {
        int id = codec->fixup_id;
@@ -694,6 +701,14 @@ void snd_hda_apply_fixup(struct hda_codec *codec, int action)
                                    codec->chip_name, modelname);
                        fix->v.func(codec, fix, action);
                        break;
+               case HDA_FIXUP_PINCTLS:
+                       if (action != HDA_FIXUP_ACT_PROBE || !fix->v.pins)
+                               break;
+                       snd_printdd(KERN_INFO SFX
+                                   "%s: Apply pinctl for %s\n",
+                                   codec->chip_name, modelname);
+                       set_pin_targets(codec, fix->v.pins);
+                       break;
                default:
                        snd_printk(KERN_ERR SFX
                                   "%s: Invalid fixup type %d\n",
index aa721aa..c09440d 100644 (file)
@@ -422,6 +422,7 @@ enum {
        HDA_FIXUP_PINS,
        HDA_FIXUP_VERBS,
        HDA_FIXUP_FUNC,
+       HDA_FIXUP_PINCTLS,
 };
 
 /* fixup action definitions */
index 7a4b783..c8fcfa8 100644 (file)
@@ -1794,9 +1794,9 @@ static const struct hda_fixup alc882_fixups[] = {
                }
        },
        [ALC882_FIXUP_PB_M5210] = {
-               .type = HDA_FIXUP_VERBS,
-               .v.verbs = (const struct hda_verb[]) {
-                       { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 },
+               .type = HDA_FIXUP_PINCTLS,
+               .v.pins = (const struct hda_pintbl[]) {
+                       { 0x19, PIN_VREF50 },
                        {}
                }
        },
@@ -2158,9 +2158,9 @@ static const struct hda_fixup alc262_fixups[] = {
                }
        },
        [ALC262_FIXUP_LENOVO_3000] = {
-               .type = HDA_FIXUP_VERBS,
-               .v.verbs = (const struct hda_verb[]) {
-                       { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 },
+               .type = HDA_FIXUP_PINCTLS,
+               .v.pins = (const struct hda_pintbl[]) {
+                       { 0x19, PIN_VREF50 },
                        {}
                },
                .chained = true,
@@ -2715,9 +2715,9 @@ enum {
 
 static const struct hda_fixup alc269_fixups[] = {
        [ALC269_FIXUP_SONY_VAIO] = {
-               .type = HDA_FIXUP_VERBS,
-               .v.verbs = (const struct hda_verb[]) {
-                       {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD},
+               .type = HDA_FIXUP_PINCTLS,
+               .v.pins = (const struct hda_pintbl[]) {
+                       {0x19, PIN_VREFGRD},
                        {}
                }
        },