Merge branch 'fix/hda' into for-linus
Takashi Iwai [Tue, 18 Jan 2011 06:44:55 +0000 (07:44 +0100)]
13 files changed:
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_generic.c
sound/pci/hda/hda_intel.c
sound/pci/hda/hda_local.h
sound/pci/hda/hda_proc.c
sound/pci/hda/patch_analog.c
sound/pci/hda/patch_cirrus.c
sound/pci/hda/patch_cmedia.c
sound/pci/hda/patch_conexant.c
sound/pci/hda/patch_hdmi.c
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_sigmatel.c
sound/pci/hda/patch_via.c

index 05e5ec8..ae5c5d5 100644 (file)
@@ -2134,10 +2134,10 @@ int snd_hda_codec_reset(struct hda_codec *codec)
  * This function returns zero if successful or a negative error code.
  */
 int snd_hda_add_vmaster(struct hda_codec *codec, char *name,
-                       unsigned int *tlv, const char **slaves)
+                       unsigned int *tlv, const char * const *slaves)
 {
        struct snd_kcontrol *kctl;
-       const char **s;
+       const char * const *s;
        int err;
 
        for (s = slaves; *s && !snd_hda_find_mixer_ctl(codec, *s); s++)
@@ -3689,7 +3689,7 @@ EXPORT_SYMBOL_HDA(snd_hda_build_pcms);
  * If no entries are matching, the function returns a negative value.
  */
 int snd_hda_check_board_config(struct hda_codec *codec,
-                              int num_configs, const char **models,
+                              int num_configs, const char * const *models,
                               const struct snd_pci_quirk *tbl)
 {
        if (codec->modelname && models) {
@@ -3753,7 +3753,7 @@ EXPORT_SYMBOL_HDA(snd_hda_check_board_config);
  * If no entries are matching, the function returns a negative value.
  */
 int snd_hda_check_board_codec_sid_config(struct hda_codec *codec,
-                              int num_configs, const char **models,
+                              int num_configs, const char * const *models,
                               const struct snd_pci_quirk *tbl)
 {
        const struct snd_pci_quirk *q;
@@ -4690,7 +4690,7 @@ const char *hda_get_input_pin_label(struct hda_codec *codec, hda_nid_t pin,
                                        int check_location)
 {
        unsigned int def_conf;
-       static const char *mic_names[] = {
+       static const char * const mic_names[] = {
                "Internal Mic", "Dock Mic", "Mic", "Front Mic", "Rear Mic",
        };
        int attr;
index fb0582f..a63c54d 100644 (file)
@@ -762,7 +762,8 @@ static int check_existing_control(struct hda_codec *codec, const char *type, con
 /*
  * build output mixer controls
  */
-static int create_output_mixers(struct hda_codec *codec, const char **names)
+static int create_output_mixers(struct hda_codec *codec,
+                               const char * const *names)
 {
        struct hda_gspec *spec = codec->spec;
        int i, err;
@@ -780,8 +781,8 @@ static int create_output_mixers(struct hda_codec *codec, const char **names)
 static int build_output_controls(struct hda_codec *codec)
 {
        struct hda_gspec *spec = codec->spec;
-       static const char *types_speaker[] = { "Speaker", "Headphone" };
-       static const char *types_line[] = { "Front", "Headphone" };
+       static const char * const types_speaker[] = { "Speaker", "Headphone" };
+       static const char * const types_line[] = { "Front", "Headphone" };
 
        switch (spec->pcm_vol_nodes) {
        case 1:
index d3d18be..2e91a99 100644 (file)
@@ -2809,6 +2809,8 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
 #endif
        /* Vortex86MX */
        { PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC },
+       /* VMware HDAudio */
+       { PCI_DEVICE(0x15ad, 0x1977), .driver_data = AZX_DRIVER_GENERIC },
        /* AMD/ATI Generic, PCI class code and Vendor ID for HD Audio */
        { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID),
          .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
index 46bbefe..3ab5e7a 100644 (file)
@@ -140,7 +140,7 @@ void snd_hda_set_vmaster_tlv(struct hda_codec *codec, hda_nid_t nid, int dir,
 struct snd_kcontrol *snd_hda_find_mixer_ctl(struct hda_codec *codec,
                                            const char *name);
 int snd_hda_add_vmaster(struct hda_codec *codec, char *name,
-                       unsigned int *tlv, const char **slaves);
+                       unsigned int *tlv, const char * const *slaves);
 int snd_hda_codec_reset(struct hda_codec *codec);
 
 /* amp value bits */
@@ -341,10 +341,10 @@ void snd_print_pcm_bits(int pcm, char *buf, int buflen);
  * Misc
  */
 int snd_hda_check_board_config(struct hda_codec *codec, int num_configs,
-                              const char **modelnames,
+                              const char * const *modelnames,
                               const struct snd_pci_quirk *pci_list);
 int snd_hda_check_board_codec_sid_config(struct hda_codec *codec,
-                               int num_configs, const char **models,
+                               int num_configs, const char * const *models,
                                const struct snd_pci_quirk *tbl);
 int snd_hda_add_new_ctls(struct hda_codec *codec,
                         struct snd_kcontrol_new *knew);
index f025200..bfe74c2 100644 (file)
@@ -418,7 +418,7 @@ static void print_digital_conv(struct snd_info_buffer *buffer,
 
 static const char *get_pwr_state(u32 state)
 {
-       static const char *buf[4] = {
+       static const char * const buf[4] = {
                "D0", "D1", "D2", "D3"
        };
        if (state < 4)
index 4678067..8dabab7 100644 (file)
@@ -46,6 +46,9 @@ struct ad198x_spec {
        unsigned int cur_eapd;
        unsigned int need_dac_fix;
 
+       hda_nid_t *alt_dac_nid;
+       struct hda_pcm_stream *stream_analog_alt_playback;
+
        /* capture */
        unsigned int num_adc_nids;
        hda_nid_t *adc_nids;
@@ -81,8 +84,8 @@ struct ad198x_spec {
 #endif
        /* for virtual master */
        hda_nid_t vmaster_nid;
-       const char **slave_vols;
-       const char **slave_sws;
+       const char * const *slave_vols;
+       const char * const *slave_sws;
 };
 
 /*
@@ -130,7 +133,7 @@ static int ad198x_init(struct hda_codec *codec)
        return 0;
 }
 
-static const char *ad_slave_vols[] = {
+static const char * const ad_slave_vols[] = {
        "Front Playback Volume",
        "Surround Playback Volume",
        "Center Playback Volume",
@@ -143,7 +146,7 @@ static const char *ad_slave_vols[] = {
        NULL
 };
 
-static const char *ad_slave_sws[] = {
+static const char * const ad_slave_sws[] = {
        "Front Playback Switch",
        "Surround Playback Switch",
        "Center Playback Switch",
@@ -156,6 +159,25 @@ static const char *ad_slave_sws[] = {
        NULL
 };
 
+static const char * const ad1988_6stack_fp_slave_vols[] = {
+       "Front Playback Volume",
+       "Surround Playback Volume",
+       "Center Playback Volume",
+       "LFE Playback Volume",
+       "Side Playback Volume",
+       "IEC958 Playback Volume",
+       NULL
+};
+
+static const char * const ad1988_6stack_fp_slave_sws[] = {
+       "Front Playback Switch",
+       "Surround Playback Switch",
+       "Center Playback Switch",
+       "LFE Playback Switch",
+       "Side Playback Switch",
+       "IEC958 Playback Switch",
+       NULL
+};
 static void ad198x_free_kctls(struct hda_codec *codec);
 
 #ifdef CONFIG_SND_HDA_INPUT_BEEP
@@ -309,6 +331,38 @@ static int ad198x_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
        return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
 }
 
+static int ad198x_alt_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
+                               struct hda_codec *codec,
+                               unsigned int stream_tag,
+                               unsigned int format,
+                               struct snd_pcm_substream *substream)
+{
+       struct ad198x_spec *spec = codec->spec;
+       snd_hda_codec_setup_stream(codec, spec->alt_dac_nid[0], stream_tag,
+                                       0, format);
+       return 0;
+}
+
+static int ad198x_alt_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
+                               struct hda_codec *codec,
+                               struct snd_pcm_substream *substream)
+{
+       struct ad198x_spec *spec = codec->spec;
+       snd_hda_codec_cleanup_stream(codec, spec->alt_dac_nid[0]);
+       return 0;
+}
+
+static struct hda_pcm_stream ad198x_pcm_analog_alt_playback = {
+       .substreams = 1,
+       .channels_min = 2,
+       .channels_max = 2,
+       /* NID is set in ad198x_build_pcms */
+       .ops = {
+               .prepare = ad198x_alt_playback_pcm_prepare,
+               .cleanup = ad198x_alt_playback_pcm_cleanup
+       },
+};
+
 /*
  * Digital out
  */
@@ -446,6 +500,17 @@ static int ad198x_build_pcms(struct hda_codec *codec)
                }
        }
 
+       if (spec->alt_dac_nid && spec->stream_analog_alt_playback) {
+               codec->num_pcms++;
+               info = spec->pcm_rec + 2;
+               info->name = "AD198x Headphone";
+               info->pcm_type = HDA_PCM_TYPE_AUDIO;
+               info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
+                       *spec->stream_analog_alt_playback;
+               info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
+                       spec->alt_dac_nid[0];
+       }
+
        return 0;
 }
 
@@ -1069,7 +1134,7 @@ enum {
        AD1986A_MODELS
 };
 
-static const char *ad1986a_models[AD1986A_MODELS] = {
+static const char * const ad1986a_models[AD1986A_MODELS] = {
        [AD1986A_6STACK]        = "6stack",
        [AD1986A_3STACK]        = "3stack",
        [AD1986A_LAPTOP]        = "laptop",
@@ -1813,7 +1878,7 @@ enum {
        AD1981_MODELS
 };
 
-static const char *ad1981_models[AD1981_MODELS] = {
+static const char * const ad1981_models[AD1981_MODELS] = {
        [AD1981_HP]             = "hp",
        [AD1981_THINKPAD]       = "thinkpad",
        [AD1981_BASIC]          = "basic",
@@ -2015,6 +2080,7 @@ static int patch_ad1981(struct hda_codec *codec)
 enum {
        AD1988_6STACK,
        AD1988_6STACK_DIG,
+       AD1988_6STACK_DIG_FP,
        AD1988_3STACK,
        AD1988_3STACK_DIG,
        AD1988_LAPTOP,
@@ -2047,6 +2113,10 @@ static hda_nid_t ad1988_6stack_dac_nids_rev2[4] = {
        0x04, 0x05, 0x0a, 0x06
 };
 
+static hda_nid_t ad1988_alt_dac_nid[1] = {
+       0x03
+};
+
 static hda_nid_t ad1988_3stack_dac_nids_rev2[3] = {
        0x04, 0x0a, 0x06
 };
@@ -2166,6 +2236,35 @@ static struct snd_kcontrol_new ad1988_6stack_mixers2[] = {
        { } /* end */
 };
 
+static struct snd_kcontrol_new ad1988_6stack_fp_mixers[] = {
+       HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
+
+       HDA_BIND_MUTE("Front Playback Switch", 0x29, 2, HDA_INPUT),
+       HDA_BIND_MUTE("Surround Playback Switch", 0x2a, 2, HDA_INPUT),
+       HDA_BIND_MUTE_MONO("Center Playback Switch", 0x27, 1, 2, HDA_INPUT),
+       HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x27, 2, 2, HDA_INPUT),
+       HDA_BIND_MUTE("Side Playback Switch", 0x28, 2, HDA_INPUT),
+       HDA_BIND_MUTE("Headphone Playback Switch", 0x22, 2, HDA_INPUT),
+       HDA_BIND_MUTE("Mono Playback Switch", 0x1e, 2, HDA_INPUT),
+
+       HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x6, HDA_INPUT),
+       HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x6, HDA_INPUT),
+       HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x20, 0x0, HDA_INPUT),
+       HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x0, HDA_INPUT),
+       HDA_CODEC_VOLUME("Line Playback Volume", 0x20, 0x1, HDA_INPUT),
+       HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x1, HDA_INPUT),
+       HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x4, HDA_INPUT),
+       HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x4, HDA_INPUT),
+
+       HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT),
+       HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT),
+
+       HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x39, 0x0, HDA_OUTPUT),
+       HDA_CODEC_VOLUME("Mic Boost Volume", 0x3c, 0x0, HDA_OUTPUT),
+
+       { } /* end */
+};
+
 /* 3-stack mode */
 static struct snd_kcontrol_new ad1988_3stack_mixers1[] = {
        HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT),
@@ -2445,6 +2544,68 @@ static struct hda_verb ad1988_6stack_init_verbs[] = {
        { }
 };
 
+static struct hda_verb ad1988_6stack_fp_init_verbs[] = {
+       /* Front, Surround, CLFE, side DAC; unmute as default */
+       {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
+       {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
+       {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
+       {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
+       /* Headphone; unmute as default */
+       {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
+       /* Port-A front headphon path */
+       {0x37, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC0:03h */
+       {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
+       {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
+       {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
+       {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
+       /* Port-D line-out path */
+       {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
+       {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
+       {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
+       {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
+       /* Port-F surround path */
+       {0x2a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
+       {0x2a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
+       {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
+       {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
+       /* Port-G CLFE path */
+       {0x27, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
+       {0x27, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
+       {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
+       {0x24, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
+       /* Port-H side path */
+       {0x28, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
+       {0x28, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
+       {0x25, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
+       {0x25, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
+       /* Mono out path */
+       {0x36, AC_VERB_SET_CONNECT_SEL, 0x1}, /* DAC1:04h */
+       {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
+       {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
+       {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
+       {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb01f}, /* unmute, 0dB */
+       /* Port-B front mic-in path */
+       {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
+       {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
+       {0x39, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
+       /* Port-C line-in path */
+       {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
+       {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
+       {0x3a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
+       {0x33, AC_VERB_SET_CONNECT_SEL, 0x0},
+       /* Port-E mic-in path */
+       {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
+       {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
+       {0x3c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
+       {0x34, AC_VERB_SET_CONNECT_SEL, 0x0},
+       /* Analog CD Input */
+       {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
+       /* Analog Mix output amp */
+       {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x1f}, /* 0dB */
+
+       { }
+};
+
 static struct hda_verb ad1988_capture_init_verbs[] = {
        /* mute analog mix */
        {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
@@ -2792,7 +2953,9 @@ static int ad1988_auto_create_multi_out_ctls(struct ad198x_spec *spec,
                                             const struct auto_pin_cfg *cfg)
 {
        char name[32];
-       static const char *chname[4] = { "Front", "Surround", NULL /*CLFE*/, "Side" };
+       static const char * const chname[4] = {
+               "Front", "Surround", NULL /*CLFE*/, "Side"
+       };
        hda_nid_t nid;
        int i, err;
 
@@ -3074,13 +3237,13 @@ static int ad1988_auto_init(struct hda_codec *codec)
        return 0;
 }
 
-
 /*
  */
 
-static const char *ad1988_models[AD1988_MODEL_LAST] = {
+static const char * const ad1988_models[AD1988_MODEL_LAST] = {
        [AD1988_6STACK]         = "6stack",
        [AD1988_6STACK_DIG]     = "6stack-dig",
+       [AD1988_6STACK_DIG_FP]  = "6stack-dig-fp",
        [AD1988_3STACK]         = "3stack",
        [AD1988_3STACK_DIG]     = "3stack-dig",
        [AD1988_LAPTOP]         = "laptop",
@@ -3140,6 +3303,7 @@ static int patch_ad1988(struct hda_codec *codec)
        switch (board_config) {
        case AD1988_6STACK:
        case AD1988_6STACK_DIG:
+       case AD1988_6STACK_DIG_FP:
                spec->multiout.max_channels = 8;
                spec->multiout.num_dacs = 4;
                if (is_rev2(codec))
@@ -3152,10 +3316,22 @@ static int patch_ad1988(struct hda_codec *codec)
                        spec->mixers[0] = ad1988_6stack_mixers1_rev2;
                else
                        spec->mixers[0] = ad1988_6stack_mixers1;
-               spec->mixers[1] = ad1988_6stack_mixers2;
+               if (board_config == AD1988_6STACK_DIG_FP) {
+                       spec->mixers[1] = ad1988_6stack_fp_mixers;
+                       spec->slave_vols = ad1988_6stack_fp_slave_vols;
+                       spec->slave_sws = ad1988_6stack_fp_slave_sws;
+                       spec->alt_dac_nid = ad1988_alt_dac_nid;
+                       spec->stream_analog_alt_playback =
+                               &ad198x_pcm_analog_alt_playback;
+               } else
+                       spec->mixers[1] = ad1988_6stack_mixers2;
                spec->num_init_verbs = 1;
-               spec->init_verbs[0] = ad1988_6stack_init_verbs;
-               if (board_config == AD1988_6STACK_DIG) {
+               if (board_config == AD1988_6STACK_DIG_FP)
+                       spec->init_verbs[0] = ad1988_6stack_fp_init_verbs;
+               else
+                       spec->init_verbs[0] = ad1988_6stack_init_verbs;
+               if ((board_config == AD1988_6STACK_DIG) ||
+                       (board_config == AD1988_6STACK_DIG_FP)) {
                        spec->multiout.dig_out_nid = AD1988_SPDIF_OUT;
                        spec->dig_in_nid = AD1988_SPDIF_IN;
                }
@@ -3399,7 +3575,7 @@ static struct hda_amp_list ad1884_loopbacks[] = {
 };
 #endif
 
-static const char *ad1884_slave_vols[] = {
+static const char * const ad1884_slave_vols[] = {
        "PCM Playback Volume",
        "Mic Playback Volume",
        "Mono Playback Volume",
@@ -3637,7 +3813,7 @@ enum {
        AD1984_MODELS
 };
 
-static const char *ad1984_models[AD1984_MODELS] = {
+static const char * const ad1984_models[AD1984_MODELS] = {
        [AD1984_BASIC]          = "basic",
        [AD1984_THINKPAD]       = "thinkpad",
        [AD1984_DELL_DESKTOP]   = "dell_desktop",
@@ -4308,7 +4484,7 @@ enum {
        AD1884A_MODELS
 };
 
-static const char *ad1884a_models[AD1884A_MODELS] = {
+static const char * const ad1884a_models[AD1884A_MODELS] = {
        [AD1884A_DESKTOP]       = "desktop",
        [AD1884A_LAPTOP]        = "laptop",
        [AD1884A_MOBILE]        = "mobile",
@@ -4696,7 +4872,7 @@ enum {
        AD1882_MODELS
 };
 
-static const char *ad1882_models[AD1986A_MODELS] = {
+static const char * const ad1882_models[AD1986A_MODELS] = {
        [AD1882_3STACK]         = "3stack",
        [AD1882_6STACK]         = "6stack",
 };
index 18af38e..a07b031 100644 (file)
@@ -490,7 +490,7 @@ static int parse_digital_input(struct hda_codec *codec)
  * create mixer controls
  */
 
-static const char *dir_sfx[2] = { "Playback", "Capture" };
+static const char * const dir_sfx[2] = { "Playback", "Capture" };
 
 static int add_mute(struct hda_codec *codec, const char *name, int index,
                    unsigned int pval, int dir, struct snd_kcontrol **kctlp)
@@ -1156,7 +1156,7 @@ static int cs_parse_auto_config(struct hda_codec *codec)
        return 0;
 }
 
-static const char *cs420x_models[CS420X_MODELS] = {
+static const char * const cs420x_models[CS420X_MODELS] = {
        [CS420X_MBP53] = "mbp53",
        [CS420X_MBP55] = "mbp55",
        [CS420X_IMAC27] = "imac27",
index ff60908..1f8bbcd 100644 (file)
@@ -608,7 +608,7 @@ static void cmi9880_free(struct hda_codec *codec)
 /*
  */
 
-static const char *cmi9880_models[CMI_MODELS] = {
+static const char * const cmi9880_models[CMI_MODELS] = {
        [CMI_MINIMAL]   = "minimal",
        [CMI_MIN_FP]    = "min_fp",
        [CMI_FULL]      = "full",
index e96581f..9bb030a 100644 (file)
@@ -537,13 +537,13 @@ static struct snd_kcontrol_new cxt_beep_mixer[] = {
 };
 #endif
 
-static const char *slave_vols[] = {
+static const char * const slave_vols[] = {
        "Headphone Playback Volume",
        "Speaker Playback Volume",
        NULL
 };
 
-static const char *slave_sws[] = {
+static const char * const slave_sws[] = {
        "Headphone Playback Switch",
        "Speaker Playback Switch",
        NULL
@@ -1134,7 +1134,7 @@ enum {
        CXT5045_MODELS
 };
 
-static const char *cxt5045_models[CXT5045_MODELS] = {
+static const char * const cxt5045_models[CXT5045_MODELS] = {
        [CXT5045_LAPTOP_HPSENSE]        = "laptop-hpsense",
        [CXT5045_LAPTOP_MICSENSE]       = "laptop-micsense",
        [CXT5045_LAPTOP_HPMICSENSE]     = "laptop-hpmicsense",
@@ -1579,7 +1579,7 @@ enum {
        CXT5047_MODELS
 };
 
-static const char *cxt5047_models[CXT5047_MODELS] = {
+static const char * const cxt5047_models[CXT5047_MODELS] = {
        [CXT5047_LAPTOP]        = "laptop",
        [CXT5047_LAPTOP_HP]     = "laptop-hp",
        [CXT5047_LAPTOP_EAPD]   = "laptop-eapd",
@@ -1995,7 +1995,7 @@ enum {
        CXT5051_MODELS
 };
 
-static const char *cxt5051_models[CXT5051_MODELS] = {
+static const char *const cxt5051_models[CXT5051_MODELS] = {
        [CXT5051_LAPTOP]        = "laptop",
        [CXT5051_HP]            = "hp",
        [CXT5051_HP_DV6736]     = "hp-dv6736",
@@ -3084,7 +3084,7 @@ enum {
        CXT5066_MODELS
 };
 
-static const char *cxt5066_models[CXT5066_MODELS] = {
+static const char * const cxt5066_models[CXT5066_MODELS] = {
        [CXT5066_LAPTOP]        = "laptop",
        [CXT5066_DELL_LAPTOP]   = "dell-laptop",
        [CXT5066_OLPC_XO_1_5]   = "olpc-xo-1_5",
@@ -3746,7 +3746,7 @@ static int cx_auto_build_output_controls(struct hda_codec *codec)
        struct conexant_spec *spec = codec->spec;
        int i, err;
        int num_line = 0, num_hp = 0, num_spk = 0;
-       static const char *texts[3] = { "Front", "Surround", "CLFE" };
+       static const char * const texts[3] = { "Front", "Surround", "CLFE" };
 
        if (spec->dac_info_filled == 1)
                return cx_auto_add_pb_volume(codec, spec->dac_info[0].dac,
index f29b97b..2d5b83f 100644 (file)
@@ -817,6 +817,7 @@ static int hdmi_pcm_open(struct hda_pcm_stream *hinfo,
        struct hdmi_spec *spec = codec->spec;
        struct hdmi_eld *eld;
        struct hda_pcm_stream *codec_pars;
+       struct snd_pcm_runtime *runtime = substream->runtime;
        unsigned int idx;
 
        for (idx = 0; idx < spec->num_cvts; idx++)
@@ -844,6 +845,14 @@ static int hdmi_pcm_open(struct hda_pcm_stream *hinfo,
                hinfo->formats = codec_pars->formats;
                hinfo->maxbps = codec_pars->maxbps;
        }
+       /* store the updated parameters */
+       runtime->hw.channels_min = hinfo->channels_min;
+       runtime->hw.channels_max = hinfo->channels_max;
+       runtime->hw.formats = hinfo->formats;
+       runtime->hw.rates = hinfo->rates;
+
+       snd_pcm_hw_constraint_step(substream->runtime, 0,
+                                  SNDRV_PCM_HW_PARAM_CHANNELS, 2);
        return 0;
 }
 
@@ -1238,6 +1247,9 @@ static int simple_playback_pcm_open(struct hda_pcm_stream *hinfo,
                snd_pcm_hw_constraint_list(substream->runtime, 0,
                                SNDRV_PCM_HW_PARAM_CHANNELS,
                                hw_constraints_channels);
+       } else {
+               snd_pcm_hw_constraint_step(substream->runtime, 0,
+                                          SNDRV_PCM_HW_PARAM_CHANNELS, 2);
        }
 
        return snd_hda_multi_out_dig_open(codec, &spec->multiout);
index 51c08ed..269dbff 100644 (file)
@@ -303,6 +303,8 @@ struct alc_customize_define {
        unsigned int  fixup:1; /* Means that this sku is set by driver, not read from hw */
 };
 
+struct alc_fixup;
+
 struct alc_spec {
        /* codec parameterization */
        struct snd_kcontrol_new *mixers[5];     /* mixer arrays */
@@ -404,6 +406,11 @@ struct alc_spec {
        /* for PLL fix */
        hda_nid_t pll_nid;
        unsigned int pll_coef_idx, pll_coef_bit;
+
+       /* fix-up list */
+       int fixup_id;
+       const struct alc_fixup *fixup_list;
+       const char *fixup_name;
 };
 
 /*
@@ -1683,88 +1690,131 @@ struct alc_model_fixup {
 };
 
 struct alc_fixup {
-       unsigned int sku;
-       const struct alc_pincfg *pins;
-       const struct hda_verb *verbs;
-       void (*func)(struct hda_codec *codec, const struct alc_fixup *fix,
-                    int pre_init);
+       int type;
+       bool chained;
+       int chain_id;
+       union {
+               unsigned int sku;
+               const struct alc_pincfg *pins;
+               const struct hda_verb *verbs;
+               void (*func)(struct hda_codec *codec,
+                            const struct alc_fixup *fix,
+                            int action);
+       } v;
 };
 
-static void __alc_pick_fixup(struct hda_codec *codec,
-                            const struct alc_fixup *fix,
-                            const char *modelname,
-                            int pre_init)
+enum {
+       ALC_FIXUP_INVALID,
+       ALC_FIXUP_SKU,
+       ALC_FIXUP_PINS,
+       ALC_FIXUP_VERBS,
+       ALC_FIXUP_FUNC,
+};
+
+enum {
+       ALC_FIXUP_ACT_PRE_PROBE,
+       ALC_FIXUP_ACT_PROBE,
+       ALC_FIXUP_ACT_INIT,
+};
+
+static void alc_apply_fixup(struct hda_codec *codec, int action)
 {
-       const struct alc_pincfg *cfg;
-       struct alc_spec *spec;
+       struct alc_spec *spec = codec->spec;
+       int id = spec->fixup_id;
+       const char *modelname = spec->fixup_name;
+       int depth = 0;
 
-       cfg = fix->pins;
-       if (pre_init && fix->sku) {
-#ifdef CONFIG_SND_DEBUG_VERBOSE
-               snd_printdd(KERN_INFO "hda_codec: %s: Apply sku override for %s\n",
-                           codec->chip_name, modelname);
-#endif
-               spec = codec->spec;
-               spec->cdefine.sku_cfg = fix->sku;
-               spec->cdefine.fixup = 1;
-       }
-       if (pre_init && cfg) {
-#ifdef CONFIG_SND_DEBUG_VERBOSE
-               snd_printdd(KERN_INFO "hda_codec: %s: Apply pincfg for %s\n",
-                           codec->chip_name, modelname);
-#endif
-               for (; cfg->nid; cfg++)
-                       snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
-       }
-       if (!pre_init && fix->verbs) {
-#ifdef CONFIG_SND_DEBUG_VERBOSE
-               snd_printdd(KERN_INFO "hda_codec: %s: Apply fix-verbs for %s\n",
-                           codec->chip_name, modelname);
-#endif
-               add_verb(codec->spec, fix->verbs);
-       }
-       if (fix->func) {
-#ifdef CONFIG_SND_DEBUG_VERBOSE
-               snd_printdd(KERN_INFO "hda_codec: %s: Apply fix-func for %s\n",
-                           codec->chip_name, modelname);
-#endif
-               fix->func(codec, fix, pre_init);
+       if (!spec->fixup_list)
+               return;
+
+       while (id >= 0) {
+               const struct alc_fixup *fix = spec->fixup_list + id;
+               const struct alc_pincfg *cfg;
+
+               switch (fix->type) {
+               case ALC_FIXUP_SKU:
+                       if (action != ALC_FIXUP_ACT_PRE_PROBE || !fix->v.sku)
+                               break;;
+                       snd_printdd(KERN_INFO "hda_codec: %s: "
+                                   "Apply sku override for %s\n",
+                                   codec->chip_name, modelname);
+                       spec->cdefine.sku_cfg = fix->v.sku;
+                       spec->cdefine.fixup = 1;
+                       break;
+               case ALC_FIXUP_PINS:
+                       cfg = fix->v.pins;
+                       if (action != ALC_FIXUP_ACT_PRE_PROBE || !cfg)
+                               break;
+                       snd_printdd(KERN_INFO "hda_codec: %s: "
+                                   "Apply pincfg for %s\n",
+                                   codec->chip_name, modelname);
+                       for (; cfg->nid; cfg++)
+                               snd_hda_codec_set_pincfg(codec, cfg->nid,
+                                                        cfg->val);
+                       break;
+               case ALC_FIXUP_VERBS:
+                       if (action != ALC_FIXUP_ACT_PROBE || !fix->v.verbs)
+                               break;
+                       snd_printdd(KERN_INFO "hda_codec: %s: "
+                                   "Apply fix-verbs for %s\n",
+                                   codec->chip_name, modelname);
+                       add_verb(codec->spec, fix->v.verbs);
+                       break;
+               case ALC_FIXUP_FUNC:
+                       if (!fix->v.func)
+                               break;
+                       snd_printdd(KERN_INFO "hda_codec: %s: "
+                                   "Apply fix-func for %s\n",
+                                   codec->chip_name, modelname);
+                       fix->v.func(codec, fix, action);
+                       break;
+               default:
+                       snd_printk(KERN_ERR "hda_codec: %s: "
+                                  "Invalid fixup type %d\n",
+                                  codec->chip_name, fix->type);
+                       break;
+               }
+               if (!fix[id].chained)
+                       break;
+               if (++depth > 10)
+                       break;
+               id = fix[id].chain_id;
        }
 }
 
 static void alc_pick_fixup(struct hda_codec *codec,
-                                const struct snd_pci_quirk *quirk,
-                                const struct alc_fixup *fix,
-                                int pre_init)
+                          const struct alc_model_fixup *models,
+                          const struct snd_pci_quirk *quirk,
+                          const struct alc_fixup *fixlist)
 {
-       quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
-       if (quirk) {
-               fix += quirk->value;
-#ifdef CONFIG_SND_DEBUG_VERBOSE
-               __alc_pick_fixup(codec, fix, quirk->name, pre_init);
-#else
-               __alc_pick_fixup(codec, fix, NULL, pre_init);
-#endif
-       }
-}
+       struct alc_spec *spec = codec->spec;
+       int id = -1;
+       const char *name = NULL;
 
-static void alc_pick_fixup_model(struct hda_codec *codec,
-                                const struct alc_model_fixup *models,
-                                const struct snd_pci_quirk *quirk,
-                                const struct alc_fixup *fix,
-                                int pre_init)
-{
        if (codec->modelname && models) {
                while (models->name) {
                        if (!strcmp(codec->modelname, models->name)) {
-                               fix += models->id;
+                               id = models->id;
+                               name = models->name;
                                break;
                        }
                        models++;
                }
-               __alc_pick_fixup(codec, fix, codec->modelname, pre_init);
-       } else {
-               alc_pick_fixup(codec, quirk, fix, pre_init);
+       }
+       if (id < 0) {
+               quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
+               if (quirk) {
+                       id = quirk->value;
+#ifdef CONFIG_SND_DEBUG_VERBOSE
+                       name = quirk->name;
+#endif
+               }
+       }
+
+       spec->fixup_id = id;
+       if (id >= 0) {
+               spec->fixup_list = fixlist;
+               spec->fixup_name = name;
        }
 }
 
@@ -2866,7 +2916,7 @@ static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
 /*
  * slave controls for virtual master
  */
-static const char *alc_slave_vols[] = {
+static const char * const alc_slave_vols[] = {
        "Front Playback Volume",
        "Surround Playback Volume",
        "Center Playback Volume",
@@ -2880,7 +2930,7 @@ static const char *alc_slave_vols[] = {
        NULL,
 };
 
-static const char *alc_slave_sws[] = {
+static const char * const alc_slave_sws[] = {
        "Front Playback Switch",
        "Surround Playback Switch",
        "Center Playback Switch",
@@ -3861,6 +3911,8 @@ static int alc_init(struct hda_codec *codec)
        if (spec->init_hook)
                spec->init_hook(codec);
 
+       alc_apply_fixup(codec, ALC_FIXUP_ACT_INIT);
+
        hda_call_check_power_status(codec, 0x01);
        return 0;
 }
@@ -4559,7 +4611,7 @@ static struct hda_verb alc880_test_init_verbs[] = {
 /*
  */
 
-static const char *alc880_models[ALC880_MODEL_LAST] = {
+static const char * const alc880_models[ALC880_MODEL_LAST] = {
        [ALC880_3ST]            = "3stack",
        [ALC880_TCL_S700]       = "tcl",
        [ALC880_3ST_DIG]        = "3stack-digout",
@@ -5092,7 +5144,7 @@ static const char *alc_get_line_out_pfx(const struct auto_pin_cfg *cfg,
 static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
                                             const struct auto_pin_cfg *cfg)
 {
-       static const char *chname[4] = {
+       static const char * const chname[4] = {
                "Front", "Surround", NULL /*CLFE*/, "Side"
        };
        const char *pfx = alc_get_line_out_pfx(cfg, false);
@@ -7090,7 +7142,8 @@ enum {
 
 static const struct alc_fixup alc260_fixups[] = {
        [PINFIX_HP_DC5750] = {
-               .pins = (const struct alc_pincfg[]) {
+               .type = ALC_FIXUP_PINS,
+               .v.pins = (const struct alc_pincfg[]) {
                        { 0x11, 0x90130110 }, /* speaker */
                        { }
                }
@@ -7105,7 +7158,7 @@ static struct snd_pci_quirk alc260_fixup_tbl[] = {
 /*
  * ALC260 configurations
  */
-static const char *alc260_models[ALC260_MODEL_LAST] = {
+static const char * const alc260_models[ALC260_MODEL_LAST] = {
        [ALC260_BASIC]          = "basic",
        [ALC260_HP]             = "hp",
        [ALC260_HP_3013]        = "hp-3013",
@@ -7301,8 +7354,10 @@ static int patch_alc260(struct hda_codec *codec)
                board_config = ALC260_AUTO;
        }
 
-       if (board_config == ALC260_AUTO)
-               alc_pick_fixup(codec, alc260_fixup_tbl, alc260_fixups, 1);
+       if (board_config == ALC260_AUTO) {
+               alc_pick_fixup(codec, NULL, alc260_fixup_tbl, alc260_fixups);
+               alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
+       }
 
        if (board_config == ALC260_AUTO) {
                /* automatic parse from the BIOS config */
@@ -7350,8 +7405,7 @@ static int patch_alc260(struct hda_codec *codec)
        set_capture_mixer(codec);
        set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
 
-       if (board_config == ALC260_AUTO)
-               alc_pick_fixup(codec, alc260_fixup_tbl, alc260_fixups, 0);
+       alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
 
        spec->vmaster_nid = 0x08;
 
@@ -9727,7 +9781,7 @@ static hda_nid_t alc1200_slave_dig_outs[] = {
 /*
  * configuration and preset
  */
-static const char *alc882_models[ALC882_MODEL_LAST] = {
+static const char * const alc882_models[ALC882_MODEL_LAST] = {
        [ALC882_3ST_DIG]        = "3stack-dig",
        [ALC882_6ST_DIG]        = "6stack-dig",
        [ALC882_ARIMA]          = "arima",
@@ -10678,7 +10732,8 @@ enum {
 
 static const struct alc_fixup alc882_fixups[] = {
        [PINFIX_ABIT_AW9D_MAX] = {
-               .pins = (const struct alc_pincfg[]) {
+               .type = ALC_FIXUP_PINS,
+               .v.pins = (const struct alc_pincfg[]) {
                        { 0x15, 0x01080104 }, /* side */
                        { 0x16, 0x01011012 }, /* rear */
                        { 0x17, 0x01016011 }, /* clfe */
@@ -10686,13 +10741,15 @@ static const struct alc_fixup alc882_fixups[] = {
                }
        },
        [PINFIX_PB_M5210] = {
-               .verbs = (const struct hda_verb[]) {
+               .type = ALC_FIXUP_VERBS,
+               .v.verbs = (const struct hda_verb[]) {
                        { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 },
                        {}
                }
        },
        [PINFIX_ACER_ASPIRE_7736] = {
-               .sku = ALC_FIXUP_SKU_IGNORE,
+               .type = ALC_FIXUP_SKU,
+               .v.sku = ALC_FIXUP_SKU_IGNORE,
        },
 };
 
@@ -10984,8 +11041,10 @@ static int patch_alc882(struct hda_codec *codec)
                board_config = ALC882_AUTO;
        }
 
-       if (board_config == ALC882_AUTO)
-               alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 1);
+       if (board_config == ALC882_AUTO) {
+               alc_pick_fixup(codec, NULL, alc882_fixup_tbl, alc882_fixups);
+               alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
+       }
 
        alc_auto_parse_customize_define(codec);
 
@@ -11061,8 +11120,7 @@ static int patch_alc882(struct hda_codec *codec)
        if (has_cdefine_beep(codec))
                set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
 
-       if (board_config == ALC882_AUTO)
-               alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 0);
+       alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
 
        spec->vmaster_nid = 0x0c;
 
@@ -12452,19 +12510,14 @@ enum {
 
 static const struct alc_fixup alc262_fixups[] = {
        [PINFIX_FSC_H270] = {
-               .pins = (const struct alc_pincfg[]) {
+               .type = ALC_FIXUP_PINS,
+               .v.pins = (const struct alc_pincfg[]) {
                        { 0x14, 0x99130110 }, /* speaker */
                        { 0x15, 0x0221142f }, /* front HP */
                        { 0x1b, 0x0121141f }, /* rear HP */
                        { }
                }
        },
-       [PINFIX_PB_M5210] = {
-               .verbs = (const struct hda_verb[]) {
-                       { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 },
-                       {}
-               }
-       },
 };
 
 static struct snd_pci_quirk alc262_fixup_tbl[] = {
@@ -12554,7 +12607,7 @@ static void alc262_auto_init(struct hda_codec *codec)
 /*
  * configuration and preset
  */
-static const char *alc262_models[ALC262_MODEL_LAST] = {
+static const char * const alc262_models[ALC262_MODEL_LAST] = {
        [ALC262_BASIC]          = "basic",
        [ALC262_HIPPO]          = "hippo",
        [ALC262_HIPPO_1]        = "hippo_1",
@@ -12895,8 +12948,10 @@ static int patch_alc262(struct hda_codec *codec)
                board_config = ALC262_AUTO;
        }
 
-       if (board_config == ALC262_AUTO)
-               alc_pick_fixup(codec, alc262_fixup_tbl, alc262_fixups, 1);
+       if (board_config == ALC262_AUTO) {
+               alc_pick_fixup(codec, NULL, alc262_fixup_tbl, alc262_fixups);
+               alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
+       }
 
        if (board_config == ALC262_AUTO) {
                /* automatic parse from the BIOS config */
@@ -12966,8 +13021,7 @@ static int patch_alc262(struct hda_codec *codec)
        if (!spec->no_analog && has_cdefine_beep(codec))
                set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
 
-       if (board_config == ALC262_AUTO)
-               alc_pick_fixup(codec, alc262_fixup_tbl, alc262_fixups, 0);
+       alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
 
        spec->vmaster_nid = 0x0c;
 
@@ -13741,7 +13795,7 @@ static void alc268_auto_init(struct hda_codec *codec)
 /*
  * configuration and preset
  */
-static const char *alc268_models[ALC268_MODEL_LAST] = {
+static const char * const alc268_models[ALC268_MODEL_LAST] = {
        [ALC267_QUANTA_IL1]     = "quanta-il1",
        [ALC268_3ST]            = "3stack",
        [ALC268_TOSHIBA]        = "toshiba",
@@ -14822,17 +14876,19 @@ static int alc269_resume(struct hda_codec *codec)
 #endif /* SND_HDA_NEEDS_RESUME */
 
 static void alc269_fixup_hweq(struct hda_codec *codec,
-                              const struct alc_fixup *fix, int pre_init)
+                              const struct alc_fixup *fix, int action)
 {
        int coef;
 
+       if (action != ALC_FIXUP_ACT_INIT)
+               return;
        coef = alc_read_coef_idx(codec, 0x1e);
        alc_write_coef_idx(codec, 0x1e, coef | 0x80);
 }
 
 enum {
        ALC269_FIXUP_SONY_VAIO,
-       ALC275_FIX_SONY_VAIO_GPIO2,
+       ALC275_FIXUP_SONY_VAIO_GPIO2,
        ALC269_FIXUP_DELL_M101Z,
        ALC269_FIXUP_SKU_IGNORE,
        ALC269_FIXUP_ASUS_G73JW,
@@ -14842,22 +14898,26 @@ enum {
 
 static const struct alc_fixup alc269_fixups[] = {
        [ALC269_FIXUP_SONY_VAIO] = {
-               .verbs = (const struct hda_verb[]) {
+               .type = ALC_FIXUP_VERBS,
+               .v.verbs = (const struct hda_verb[]) {
                        {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD},
                        {}
                }
        },
-       [ALC275_FIX_SONY_VAIO_GPIO2] = {
-               .verbs = (const struct hda_verb[]) {
+       [ALC275_FIXUP_SONY_VAIO_GPIO2] = {
+               .type = ALC_FIXUP_VERBS,
+               .v.verbs = (const struct hda_verb[]) {
                        {0x01, AC_VERB_SET_GPIO_MASK, 0x04},
                        {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04},
                        {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
-                       {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD},
                        { }
-               }
+               },
+               .chained = true,
+               .chain_id = ALC269_FIXUP_SONY_VAIO
        },
        [ALC269_FIXUP_DELL_M101Z] = {
-               .verbs = (const struct hda_verb[]) {
+               .type = ALC_FIXUP_VERBS,
+               .v.verbs = (const struct hda_verb[]) {
                        /* Enables internal speaker */
                        {0x20, AC_VERB_SET_COEF_INDEX, 13},
                        {0x20, AC_VERB_SET_PROC_COEF, 0x4040},
@@ -14865,34 +14925,33 @@ static const struct alc_fixup alc269_fixups[] = {
                }
        },
        [ALC269_FIXUP_SKU_IGNORE] = {
-               .sku = ALC_FIXUP_SKU_IGNORE,
+               .type = ALC_FIXUP_SKU,
+               .v.sku = ALC_FIXUP_SKU_IGNORE,
        },
        [ALC269_FIXUP_ASUS_G73JW] = {
-               .pins = (const struct alc_pincfg[]) {
+               .type = ALC_FIXUP_PINS,
+               .v.pins = (const struct alc_pincfg[]) {
                        { 0x17, 0x99130111 }, /* subwoofer */
                        { }
                }
        },
        [ALC269_FIXUP_LENOVO_EAPD] = {
-               .verbs = (const struct hda_verb[]) {
+               .type = ALC_FIXUP_VERBS,
+               .v.verbs = (const struct hda_verb[]) {
                        {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
                        {}
                }
        },
        [ALC275_FIXUP_SONY_HWEQ] = {
-               .func = alc269_fixup_hweq,
-               .verbs = (const struct hda_verb[]) {
-                       {0x01, AC_VERB_SET_GPIO_MASK, 0x04},
-                       {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04},
-                       {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
-                       {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD},
-                       { }
-               }
+               .type = ALC_FIXUP_FUNC,
+               .v.func = alc269_fixup_hweq,
+               .chained = true,
+               .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
        }
 };
 
 static struct snd_pci_quirk alc269_fixup_tbl[] = {
-       SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIX_SONY_VAIO_GPIO2),
+       SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
        SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
        SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
        SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
@@ -14908,7 +14967,7 @@ static struct snd_pci_quirk alc269_fixup_tbl[] = {
 /*
  * configuration and preset
  */
-static const char *alc269_models[ALC269_MODEL_LAST] = {
+static const char * const alc269_models[ALC269_MODEL_LAST] = {
        [ALC269_BASIC]                  = "basic",
        [ALC269_QUANTA_FL1]             = "quanta",
        [ALC269_AMIC]                   = "laptop-amic",
@@ -15184,8 +15243,10 @@ static int patch_alc269(struct hda_codec *codec)
                board_config = ALC269_AUTO;
        }
 
-       if (board_config == ALC269_AUTO)
-               alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 1);
+       if (board_config == ALC269_AUTO) {
+               alc_pick_fixup(codec, NULL, alc269_fixup_tbl, alc269_fixups);
+               alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
+       }
 
        if (board_config == ALC269_AUTO) {
                /* automatic parse from the BIOS config */
@@ -15246,8 +15307,7 @@ static int patch_alc269(struct hda_codec *codec)
        if (has_cdefine_beep(codec))
                set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
 
-       if (board_config == ALC269_AUTO)
-               alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 0);
+       alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
 
        spec->vmaster_nid = 0x02;
 
@@ -15950,7 +16010,7 @@ static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
                                             const struct auto_pin_cfg *cfg)
 {
        struct alc_spec *spec = codec->spec;
-       static const char *chname[4] = {
+       static const char * const chname[4] = {
                "Front", "Surround", NULL /*CLFE*/, "Side"
        };
        const char *pfx = alc_get_line_out_pfx(cfg, true);
@@ -16156,7 +16216,7 @@ static struct hda_amp_list alc861_loopbacks[] = {
 /*
  * configuration and preset
  */
-static const char *alc861_models[ALC861_MODEL_LAST] = {
+static const char * const alc861_models[ALC861_MODEL_LAST] = {
        [ALC861_3ST]            = "3stack",
        [ALC660_3ST]            = "3stack-660",
        [ALC861_3ST_DIG]        = "3stack-dig",
@@ -16306,7 +16366,8 @@ enum {
 
 static const struct alc_fixup alc861_fixups[] = {
        [PINFIX_FSC_AMILO_PI1505] = {
-               .pins = (const struct alc_pincfg[]) {
+               .type = ALC_FIXUP_PINS,
+               .v.pins = (const struct alc_pincfg[]) {
                        { 0x0b, 0x0221101f }, /* HP */
                        { 0x0f, 0x90170310 }, /* speaker */
                        { }
@@ -16341,8 +16402,10 @@ static int patch_alc861(struct hda_codec *codec)
                board_config = ALC861_AUTO;
        }
 
-       if (board_config == ALC861_AUTO)
-               alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 1);
+       if (board_config == ALC861_AUTO) {
+               alc_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
+               alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
+       }
 
        if (board_config == ALC861_AUTO) {
                /* automatic parse from the BIOS config */
@@ -16379,8 +16442,7 @@ static int patch_alc861(struct hda_codec *codec)
 
        spec->vmaster_nid = 0x03;
 
-       if (board_config == ALC861_AUTO)
-               alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 0);
+       alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
 
        codec->patch_ops = alc_patch_ops;
        if (board_config == ALC861_AUTO) {
@@ -16857,7 +16919,7 @@ static void alc861vd_dallas_setup(struct hda_codec *codec)
 /*
  * configuration and preset
  */
-static const char *alc861vd_models[ALC861VD_MODEL_LAST] = {
+static const char * const alc861vd_models[ALC861VD_MODEL_LAST] = {
        [ALC660VD_3ST]          = "3stack-660",
        [ALC660VD_3ST_DIG]      = "3stack-660-digout",
        [ALC660VD_ASUS_V1S]     = "asus-v1s",
@@ -17077,7 +17139,9 @@ static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
 static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
                                             const struct auto_pin_cfg *cfg)
 {
-       static const char *chname[4] = {"Front", "Surround", "CLFE", "Side"};
+       static const char * const chname[4] = {
+               "Front", "Surround", "CLFE", "Side"
+       };
        const char *pfx = alc_get_line_out_pfx(cfg, true);
        hda_nid_t nid_v, nid_s;
        int i, err;
@@ -17262,7 +17326,8 @@ enum {
 /* reset GPIO1 */
 static const struct alc_fixup alc861vd_fixups[] = {
        [ALC660VD_FIX_ASUS_GPIO1] = {
-               .verbs = (const struct hda_verb[]) {
+               .type = ALC_FIXUP_VERBS,
+               .v.verbs = (const struct hda_verb[]) {
                        {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
                        {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
                        {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
@@ -17297,8 +17362,10 @@ static int patch_alc861vd(struct hda_codec *codec)
                board_config = ALC861VD_AUTO;
        }
 
-       if (board_config == ALC861VD_AUTO)
-               alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 1);
+       if (board_config == ALC861VD_AUTO) {
+               alc_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
+               alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
+       }
 
        if (board_config == ALC861VD_AUTO) {
                /* automatic parse from the BIOS config */
@@ -17346,8 +17413,7 @@ static int patch_alc861vd(struct hda_codec *codec)
 
        spec->vmaster_nid = 0x02;
 
-       if (board_config == ALC861VD_AUTO)
-               alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 0);
+       alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
 
        codec->patch_ops = alc_patch_ops;
 
@@ -18630,7 +18696,7 @@ static struct snd_kcontrol_new alc272_nc10_mixer[] = {
 /*
  * configuration and preset
  */
-static const char *alc662_models[ALC662_MODEL_LAST] = {
+static const char * const alc662_models[ALC662_MODEL_LAST] = {
        [ALC662_3ST_2ch_DIG]    = "3stack-dig",
        [ALC662_3ST_6ch_DIG]    = "3stack-6ch-dig",
        [ALC662_3ST_6ch]        = "3stack-6ch",
@@ -19145,7 +19211,7 @@ static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
                                             const struct auto_pin_cfg *cfg)
 {
        struct alc_spec *spec = codec->spec;
-       static const char *chname[4] = {
+       static const char * const chname[4] = {
                "Front", "Surround", NULL /*CLFE*/, "Side"
        };
        const char *pfx = alc_get_line_out_pfx(cfg, true);
@@ -19378,7 +19444,10 @@ static void alc662_auto_init(struct hda_codec *codec)
 }
 
 static void alc272_fixup_mario(struct hda_codec *codec,
-                              const struct alc_fixup *fix, int pre_init) {
+                              const struct alc_fixup *fix, int action)
+{
+       if (action != ALC_FIXUP_ACT_PROBE)
+               return;
        if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
                                      (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
                                      (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
@@ -19396,19 +19465,22 @@ enum {
 
 static const struct alc_fixup alc662_fixups[] = {
        [ALC662_FIXUP_ASPIRE] = {
-               .pins = (const struct alc_pincfg[]) {
+               .type = ALC_FIXUP_PINS,
+               .v.pins = (const struct alc_pincfg[]) {
                        { 0x15, 0x99130112 }, /* subwoofer */
                        { }
                }
        },
        [ALC662_FIXUP_IDEAPAD] = {
-               .pins = (const struct alc_pincfg[]) {
+               .type = ALC_FIXUP_PINS,
+               .v.pins = (const struct alc_pincfg[]) {
                        { 0x17, 0x99130112 }, /* subwoofer */
                        { }
                }
        },
        [ALC272_FIXUP_MARIO] = {
-               .func = alc272_fixup_mario,
+               .type = ALC_FIXUP_FUNC,
+               .v.func = alc272_fixup_mario,
        }
 };
 
@@ -19462,7 +19534,9 @@ static int patch_alc662(struct hda_codec *codec)
        }
 
        if (board_config == ALC662_AUTO) {
-               alc_pick_fixup(codec, alc662_fixup_tbl, alc662_fixups, 1);
+               alc_pick_fixup(codec, alc662_fixup_models,
+                              alc662_fixup_tbl, alc662_fixups);
+               alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
                /* automatic parse from the BIOS config */
                err = alc662_parse_auto_config(codec);
                if (err < 0) {
@@ -19520,12 +19594,11 @@ static int patch_alc662(struct hda_codec *codec)
        }
        spec->vmaster_nid = 0x02;
 
+       alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
+
        codec->patch_ops = alc_patch_ops;
-       if (board_config == ALC662_AUTO) {
+       if (board_config == ALC662_AUTO)
                spec->init_hook = alc662_auto_init;
-               alc_pick_fixup_model(codec, alc662_fixup_models,
-                                    alc662_fixup_tbl, alc662_fixups, 0);
-       }
 
        alc_init_jacks(codec);
 
@@ -19913,7 +19986,7 @@ static void alc680_auto_init(struct hda_codec *codec)
 /*
  * configuration and preset
  */
-static const char *alc680_models[ALC680_MODEL_LAST] = {
+static const char * const alc680_models[ALC680_MODEL_LAST] = {
        [ALC680_BASE]           = "base",
        [ALC680_AUTO]           = "auto",
 };
index 4ab019d..9ea48b4 100644 (file)
@@ -266,7 +266,7 @@ struct sigmatel_spec {
        struct sigmatel_mic_route int_mic;
        struct sigmatel_mic_route dock_mic;
 
-       const char **spdif_labels;
+       const char * const *spdif_labels;
 
        hda_nid_t dig_in_nid;
        hda_nid_t mono_nid;
@@ -524,7 +524,7 @@ static unsigned long stac927x_capsws[] = {
        HDA_COMPOSE_AMP_VAL(0x1d, 3, 0, HDA_OUTPUT),
 };
 
-static const char *stac927x_spdif_labels[5] = {
+static const char * const stac927x_spdif_labels[5] = {
        "Digital Playback", "ADAT", "Analog Mux 1",
        "Analog Mux 2", "Analog Mux 3"
 };
@@ -1062,7 +1062,7 @@ static struct snd_kcontrol_new stac_smux_mixer = {
        .put = stac92xx_smux_enum_put,
 };
 
-static const char *slave_vols[] = {
+static const char * const slave_vols[] = {
        "Front Playback Volume",
        "Surround Playback Volume",
        "Center Playback Volume",
@@ -1073,7 +1073,7 @@ static const char *slave_vols[] = {
        NULL
 };
 
-static const char *slave_sws[] = {
+static const char * const slave_sws[] = {
        "Front Playback Switch",
        "Surround Playback Switch",
        "Center Playback Switch",
@@ -1354,7 +1354,7 @@ static unsigned int *stac9200_brd_tbl[STAC_9200_MODELS] = {
        [STAC_9200_PANASONIC] = ref9200_pin_configs,
 };
 
-static const char *stac9200_models[STAC_9200_MODELS] = {
+static const char * const stac9200_models[STAC_9200_MODELS] = {
        [STAC_AUTO] = "auto",
        [STAC_REF] = "ref",
        [STAC_9200_OQO] = "oqo",
@@ -1500,7 +1500,7 @@ static unsigned int *stac925x_brd_tbl[STAC_925x_MODELS] = {
        [STAC_M6] = stac925xM6_pin_configs,
 };
 
-static const char *stac925x_models[STAC_925x_MODELS] = {
+static const char * const stac925x_models[STAC_925x_MODELS] = {
        [STAC_925x_AUTO] = "auto",
        [STAC_REF] = "ref",
        [STAC_M1] = "m1",
@@ -1574,7 +1574,7 @@ static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = {
        [STAC_92HD73XX_INTEL]   = intel_dg45id_pin_configs,
 };
 
-static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = {
+static const char * const stac92hd73xx_models[STAC_92HD73XX_MODELS] = {
        [STAC_92HD73XX_AUTO] = "auto",
        [STAC_92HD73XX_NO_JD] = "no-jd",
        [STAC_92HD73XX_REF] = "ref",
@@ -1660,7 +1660,7 @@ static unsigned int *stac92hd83xxx_brd_tbl[STAC_92HD83XXX_MODELS] = {
        [STAC_HP_DV7_4000] = hp_dv7_4000_pin_configs,
 };
 
-static const char *stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = {
+static const char * const stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = {
        [STAC_92HD83XXX_AUTO] = "auto",
        [STAC_92HD83XXX_REF] = "ref",
        [STAC_92HD83XXX_PWR_REF] = "mic-ref",
@@ -1722,7 +1722,7 @@ static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = {
        [STAC_HP_DV4_1222NR]    = NULL,
 };
 
-static const char *stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = {
+static const char * const stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = {
        [STAC_92HD71BXX_AUTO] = "auto",
        [STAC_92HD71BXX_REF] = "ref",
        [STAC_DELL_M4_1] = "dell-m4-1",
@@ -1915,7 +1915,7 @@ static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = {
        [STAC_922X_DELL_M82] = dell_922x_m82_pin_configs,       
 };
 
-static const char *stac922x_models[STAC_922X_MODELS] = {
+static const char * const stac922x_models[STAC_922X_MODELS] = {
        [STAC_922X_AUTO] = "auto",
        [STAC_D945_REF] = "ref",
        [STAC_D945GTP5] = "5stack",
@@ -2077,7 +2077,7 @@ static unsigned int *stac927x_brd_tbl[STAC_927X_MODELS] = {
        [STAC_927X_VOLKNOB] = NULL,
 };
 
-static const char *stac927x_models[STAC_927X_MODELS] = {
+static const char * const stac927x_models[STAC_927X_MODELS] = {
        [STAC_927X_AUTO]        = "auto",
        [STAC_D965_REF_NO_JD]   = "ref-no-jd",
        [STAC_D965_REF]         = "ref",
@@ -2180,7 +2180,7 @@ static unsigned int *stac9205_brd_tbl[STAC_9205_MODELS] = {
        [STAC_9205_EAPD] = NULL,
 };
 
-static const char *stac9205_models[STAC_9205_MODELS] = {
+static const char * const stac9205_models[STAC_9205_MODELS] = {
        [STAC_9205_AUTO] = "auto",
        [STAC_9205_REF] = "ref",
        [STAC_9205_DELL_M42] = "dell-m42",
@@ -3123,7 +3123,7 @@ static int create_multi_out_ctls(struct hda_codec *codec, int num_outs,
                                 int type)
 {
        struct sigmatel_spec *spec = codec->spec;
-       static const char *chname[4] = {
+       static const char * const chname[4] = {
                "Front", "Surround", NULL /*CLFE*/, "Side"
        };
        hda_nid_t nid;
@@ -3256,7 +3256,7 @@ static int stac92xx_auto_create_hp_ctls(struct hda_codec *codec,
 }
 
 /* labels for mono mux outputs */
-static const char *stac92xx_mono_labels[4] = {
+static const char * const stac92xx_mono_labels[4] = {
        "DAC0", "DAC1", "Mixer", "DAC2"
 };
 
@@ -3380,7 +3380,7 @@ static int stac92xx_auto_create_mux_input_ctls(struct hda_codec *codec)
        return 0;
 };
 
-static const char *stac92xx_spdif_labels[3] = {
+static const char * const stac92xx_spdif_labels[3] = {
        "Digital Playback", "Analog Mux 1", "Analog Mux 2",
 };
 
@@ -3388,7 +3388,7 @@ static int stac92xx_auto_create_spdif_mux_ctls(struct hda_codec *codec)
 {
        struct sigmatel_spec *spec = codec->spec;
        struct hda_input_mux *spdif_mux = &spec->private_smux;
-       const char **labels = spec->spdif_labels;
+       const char * const *labels = spec->spdif_labels;
        int i, num_cons;
        hda_nid_t con_lst[HDA_MAX_NUM_INPUTS];
 
@@ -3409,7 +3409,7 @@ static int stac92xx_auto_create_spdif_mux_ctls(struct hda_codec *codec)
 }
 
 /* labels for dmic mux inputs */
-static const char *stac92xx_dmic_labels[5] = {
+static const char * const stac92xx_dmic_labels[5] = {
        "Analog Inputs", "Digital Mic 1", "Digital Mic 2",
        "Digital Mic 3", "Digital Mic 4"
 };
@@ -5333,7 +5333,7 @@ again:
        return 0;
 }
 
-static int stac92hd83xxx_set_system_btl_amp(struct hda_codec *codec)
+static int hp_bnb2011_with_dock(struct hda_codec *codec)
 {
        if (codec->vendor_id != 0x111d7605 &&
            codec->vendor_id != 0x111d76d1)
@@ -5348,10 +5348,6 @@ static int stac92hd83xxx_set_system_btl_amp(struct hda_codec *codec)
        case 0x103c161d:
        case 0x103c161e:
        case 0x103c161f:
-       case 0x103c1620:
-       case 0x103c1621:
-       case 0x103c1622:
-       case 0x103c1623:
 
        case 0x103c162a:
        case 0x103c162b:
@@ -5360,41 +5356,9 @@ static int stac92hd83xxx_set_system_btl_amp(struct hda_codec *codec)
        case 0x103c1631:
 
        case 0x103c1633:
-
+       case 0x103c1634:
        case 0x103c1635:
 
-       case 0x103c164f:
-
-       case 0x103c1676:
-       case 0x103c1677:
-       case 0x103c1678:
-       case 0x103c1679:
-       case 0x103c167a:
-       case 0x103c167b:
-       case 0x103c167c:
-       case 0x103c167d:
-       case 0x103c167e:
-       case 0x103c167f:
-       case 0x103c1680:
-       case 0x103c1681:
-       case 0x103c1682:
-       case 0x103c1683:
-       case 0x103c1684:
-       case 0x103c1685:
-       case 0x103c1686:
-       case 0x103c1687:
-       case 0x103c1688:
-       case 0x103c1689:
-       case 0x103c168a:
-       case 0x103c168b:
-       case 0x103c168c:
-       case 0x103c168d:
-       case 0x103c168e:
-       case 0x103c168f:
-       case 0x103c1690:
-       case 0x103c1691:
-       case 0x103c1692:
-
        case 0x103c3587:
        case 0x103c3588:
        case 0x103c3589:
@@ -5402,9 +5366,9 @@ static int stac92hd83xxx_set_system_btl_amp(struct hda_codec *codec)
 
        case 0x103c3667:
        case 0x103c3668:
-               /* set BTL amp level to 13.43dB for louder speaker output */
-               return snd_hda_codec_write_cache(codec, codec->afg, 0,
-                                                0x7F4, 0x14);
+       case 0x103c3669:
+
+               return 1;
        }
        return 0;
 }
@@ -5420,6 +5384,11 @@ static int patch_stac92hd83xxx(struct hda_codec *codec)
        if (spec == NULL)
                return -ENOMEM;
 
+       if (hp_bnb2011_with_dock(codec)) {
+               snd_hda_codec_set_pincfg(codec, 0xa, 0x2101201f);
+               snd_hda_codec_set_pincfg(codec, 0xf, 0x2181205e);
+       }
+
        /* reset pin power-down; Windows may leave these bits after reboot */
        snd_hda_codec_write_cache(codec, codec->afg, 0, 0x7EC, 0);
        snd_hda_codec_write_cache(codec, codec->afg, 0, 0x7ED, 0);
@@ -5546,8 +5515,6 @@ again:
                        AC_VERB_SET_CONNECT_SEL, num_dacs);
        }
 
-       stac92hd83xxx_set_system_btl_amp(codec);
-
        codec->proc_widget_hook = stac92hd_proc_hook;
 
        return 0;
@@ -6270,7 +6237,7 @@ static unsigned int stac9872_vaio_pin_configs[9] = {
        0x90a7013e
 };
 
-static const char *stac9872_models[STAC_9872_MODELS] = {
+static const char * const stac9872_models[STAC_9872_MODELS] = {
        [STAC_9872_AUTO] = "auto",
        [STAC_9872_VAIO] = "vaio",
 };
index 7f4852a..a76c326 100644 (file)
@@ -2281,7 +2281,9 @@ static int vt1708_auto_create_multi_out_ctls(struct via_spec *spec,
                                             const struct auto_pin_cfg *cfg)
 {
        char name[32];
-       static const char *chname[4] = { "Front", "Surround", "C/LFE", "Side" };
+       static const char * const chname[4] = {
+               "Front", "Surround", "C/LFE", "Side"
+       };
        hda_nid_t nid, nid_vol, nid_vols[] = {0x17, 0x19, 0x1a, 0x1b};
        int i, err;
 
@@ -2370,7 +2372,7 @@ static void create_hp_imux(struct via_spec *spec)
 {
        int i;
        struct hda_input_mux *imux = &spec->private_imux[1];
-       static const char *texts[] = { "OFF", "ON", NULL};
+       static const char * const texts[] = { "OFF", "ON", NULL};
 
        /* for hp mode select */
        for (i = 0; texts[i]; i++)
@@ -2890,7 +2892,9 @@ static int vt1709_auto_create_multi_out_ctls(struct via_spec *spec,
                                             const struct auto_pin_cfg *cfg)
 {
        char name[32];
-       static const char *chname[4] = { "Front", "Surround", "C/LFE", "Side" };
+       static const char * const chname[4] = {
+               "Front", "Surround", "C/LFE", "Side"
+       };
        hda_nid_t nid, nid_vol, nid_vols[] = {0x18, 0x1a, 0x1b, 0x29};
        int i, err;
 
@@ -3433,7 +3437,9 @@ static int vt1708B_auto_create_multi_out_ctls(struct via_spec *spec,
                                             const struct auto_pin_cfg *cfg)
 {
        char name[32];
-       static const char *chname[4] = { "Front", "Surround", "C/LFE", "Side" };
+       static const char * const chname[4] = {
+               "Front", "Surround", "C/LFE", "Side"
+       };
        hda_nid_t nid_vols[] = {0x16, 0x18, 0x26, 0x27};
        hda_nid_t nid, nid_vol = 0;
        int i, err;
@@ -3861,7 +3867,9 @@ static int vt1708S_auto_create_multi_out_ctls(struct via_spec *spec,
                                             const struct auto_pin_cfg *cfg)
 {
        char name[32];
-       static const char *chname[4] = { "Front", "Surround", "C/LFE", "Side" };
+       static const char * const chname[4] = {
+               "Front", "Surround", "C/LFE", "Side"
+       };
        hda_nid_t nid_vols[] = {0x10, 0x11, 0x24, 0x25};
        hda_nid_t nid_mutes[] = {0x1C, 0x18, 0x26, 0x27};
        hda_nid_t nid, nid_vol, nid_mute;
@@ -4304,7 +4312,7 @@ static int vt1702_auto_create_hp_ctls(struct via_spec *spec, hda_nid_t pin)
 {
        int err, i;
        struct hda_input_mux *imux;
-       static const char *texts[] = { "ON", "OFF", NULL};
+       static const char * const texts[] = { "ON", "OFF", NULL};
        if (!pin)
                return 0;
        spec->multiout.hp_nid = 0x1D;
@@ -4615,7 +4623,9 @@ static int vt1718S_auto_create_multi_out_ctls(struct via_spec *spec,
                                             const struct auto_pin_cfg *cfg)
 {
        char name[32];
-       static const char *chname[4] = { "Front", "Surround", "C/LFE", "Side" };
+       static const char * const chname[4] = {
+               "Front", "Surround", "C/LFE", "Side"
+       };
        hda_nid_t nid_vols[] = {0x8, 0x9, 0xa, 0xb};
        hda_nid_t nid_mutes[] = {0x24, 0x25, 0x26, 0x27};
        hda_nid_t nid, nid_vol, nid_mute = 0;
@@ -5064,7 +5074,9 @@ static int vt1716S_auto_create_multi_out_ctls(struct via_spec *spec,
                                              const struct auto_pin_cfg *cfg)
 {
        char name[32];
-       static const char *chname[3] = { "Front", "Surround", "C/LFE" };
+       static const char * const chname[3] = {
+               "Front", "Surround", "C/LFE"
+       };
        hda_nid_t nid_vols[] = {0x10, 0x11, 0x25};
        hda_nid_t nid_mutes[] = {0x1C, 0x18, 0x27};
        hda_nid_t nid, nid_vol, nid_mute;