Loading sound/pci/hda/hda_codec.c +105 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ #include <sound/asoundef.h> #include <sound/tlv.h> #include <sound/initval.h> #include <sound/jack.h> #include "hda_local.h" #include "hda_beep.h" #include <sound/hda_hwdep.h> Loading Loading @@ -4959,5 +4960,109 @@ void snd_print_pcm_bits(int pcm, char *buf, int buflen) } EXPORT_SYMBOL_HDA(snd_print_pcm_bits); #ifdef CONFIG_SND_HDA_INPUT_JACK /* * Input-jack notification support */ struct hda_jack_item { hda_nid_t nid; int type; struct snd_jack *jack; }; static const char *get_jack_default_name(struct hda_codec *codec, hda_nid_t nid, int type) { switch (type) { case SND_JACK_HEADPHONE: return "Headphone"; case SND_JACK_MICROPHONE: return "Mic"; case SND_JACK_LINEOUT: return "Line-out"; case SND_JACK_HEADSET: return "Headset"; default: return "Misc"; } } static void hda_free_jack_priv(struct snd_jack *jack) { struct hda_jack_item *jacks = jack->private_data; jacks->nid = 0; jacks->jack = NULL; } int snd_hda_input_jack_add(struct hda_codec *codec, hda_nid_t nid, int type, const char *name) { struct hda_jack_item *jack; int err; snd_array_init(&codec->jacks, sizeof(*jack), 32); jack = snd_array_new(&codec->jacks); if (!jack) return -ENOMEM; jack->nid = nid; jack->type = type; if (!name) name = get_jack_default_name(codec, nid, type); err = snd_jack_new(codec->bus->card, name, type, &jack->jack); if (err < 0) { jack->nid = 0; return err; } jack->jack->private_data = jack; jack->jack->private_free = hda_free_jack_priv; return 0; } EXPORT_SYMBOL_HDA(snd_hda_input_jack_add); void snd_hda_input_jack_report(struct hda_codec *codec, hda_nid_t nid) { struct hda_jack_item *jacks = codec->jacks.list; int i; if (!jacks) return; for (i = 0; i < codec->jacks.used; i++, jacks++) { unsigned int pin_ctl; unsigned int present; int type; if (jacks->nid != nid) continue; present = snd_hda_jack_detect(codec, nid); type = jacks->type; if (type == (SND_JACK_HEADPHONE | SND_JACK_LINEOUT)) { pin_ctl = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0); type = (pin_ctl & AC_PINCTL_HP_EN) ? SND_JACK_HEADPHONE : SND_JACK_LINEOUT; } snd_jack_report(jacks->jack, present ? type : 0); } } EXPORT_SYMBOL_HDA(snd_hda_input_jack_report); /* free jack instances manually when clearing/reconfiguring */ void snd_hda_input_jack_free(struct hda_codec *codec) { if (!codec->bus->shutdown && codec->jacks.list) { struct hda_jack_item *jacks = codec->jacks.list; int i; for (i = 0; i < codec->jacks.used; i++, jacks++) { if (jacks->jack) snd_device_free(codec->bus->card, jacks->jack); } } snd_array_free(&codec->jacks); } EXPORT_SYMBOL_HDA(snd_hda_input_jack_free); #endif /* CONFIG_SND_HDA_INPUT_JACK */ MODULE_DESCRIPTION("HDA codec core"); MODULE_LICENSE("GPL"); sound/pci/hda/hda_codec.h +5 −0 Original line number Diff line number Diff line Loading @@ -866,6 +866,11 @@ struct hda_codec { /* codec-specific additional proc output */ void (*proc_widget_hook)(struct snd_info_buffer *buffer, struct hda_codec *codec, hda_nid_t nid); #ifdef CONFIG_SND_HDA_INPUT_JACK /* jack detection */ struct snd_array jacks; #endif }; /* direction */ Loading sound/pci/hda/hda_intel.c +5 −2 Original line number Diff line number Diff line Loading @@ -1052,8 +1052,11 @@ static void azx_init_pci(struct azx *chip) /* Clear bits 0-2 of PCI register TCSEL (at offset 0x44) * TCSEL == Traffic Class Select Register, which sets PCI express QOS * Ensuring these bits are 0 clears playback static on some HD Audio * codecs * codecs. * The PCI register TCSEL is defined in the Intel manuals. */ if (chip->driver_type != AZX_DRIVER_ATI && chip->driver_type != AZX_DRIVER_ATIHDMI) update_pci_byte(chip->pci, ICH6_PCIREG_TCSEL, 0x07, 0); switch (chip->driver_type) { Loading sound/pci/hda/hda_local.h +24 −0 Original line number Diff line number Diff line Loading @@ -656,4 +656,28 @@ static inline void snd_hda_eld_proc_free(struct hda_codec *codec, #define SND_PRINT_CHANNEL_ALLOCATION_ADVISED_BUFSIZE 80 void snd_print_channel_allocation(int spk_alloc, char *buf, int buflen); /* * Input-jack notification support */ #ifdef CONFIG_SND_HDA_INPUT_JACK int snd_hda_input_jack_add(struct hda_codec *codec, hda_nid_t nid, int type, const char *name); void snd_hda_input_jack_report(struct hda_codec *codec, hda_nid_t nid); void snd_hda_input_jack_free(struct hda_codec *codec); #else /* CONFIG_SND_HDA_INPUT_JACK */ static inline int snd_hda_input_jack_add(struct hda_codec *codec, hda_nid_t nid, int type, const char *name) { return 0; } static inline void snd_hda_input_jack_report(struct hda_codec *codec, hda_nid_t nid) { } static inline void snd_hda_input_jack_free(struct hda_codec *codec) { } #endif /* CONFIG_SND_HDA_INPUT_JACK */ #endif /* __SOUND_HDA_LOCAL_H */ sound/pci/hda/patch_analog.c +10 −107 Original line number Diff line number Diff line Loading @@ -30,10 +30,10 @@ #include "hda_beep.h" struct ad198x_spec { struct snd_kcontrol_new *mixers[5]; struct snd_kcontrol_new *mixers[6]; int num_mixers; unsigned int beep_amp; /* beep amp value, set via set_beep_amp() */ const struct hda_verb *init_verbs[5]; /* initialization verbs const struct hda_verb *init_verbs[6]; /* initialization verbs * don't forget NULL termination! */ unsigned int num_init_verbs; Loading Loading @@ -331,36 +331,11 @@ 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 }, }; /* Loading Loading @@ -2239,29 +2214,6 @@ static struct snd_kcontrol_new ad1988_6stack_mixers2[] = { 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 */ }; Loading Loading @@ -2545,11 +2497,6 @@ 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 */ Loading @@ -2558,50 +2505,6 @@ static struct hda_verb ad1988_6stack_fp_init_verbs[] = { {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 */ { } }; Loading Loading @@ -3316,20 +3219,20 @@ 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; spec->num_init_verbs = 1; spec->init_verbs[0] = ad1988_6stack_init_verbs; if (board_config == AD1988_6STACK_DIG_FP) { spec->mixers[1] = ad1988_6stack_fp_mixers; spec->num_mixers++; spec->mixers[2] = ad1988_6stack_fp_mixers; spec->num_init_verbs++; spec->init_verbs[1] = ad1988_6stack_fp_init_verbs; 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; 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; Loading Loading
sound/pci/hda/hda_codec.c +105 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ #include <sound/asoundef.h> #include <sound/tlv.h> #include <sound/initval.h> #include <sound/jack.h> #include "hda_local.h" #include "hda_beep.h" #include <sound/hda_hwdep.h> Loading Loading @@ -4959,5 +4960,109 @@ void snd_print_pcm_bits(int pcm, char *buf, int buflen) } EXPORT_SYMBOL_HDA(snd_print_pcm_bits); #ifdef CONFIG_SND_HDA_INPUT_JACK /* * Input-jack notification support */ struct hda_jack_item { hda_nid_t nid; int type; struct snd_jack *jack; }; static const char *get_jack_default_name(struct hda_codec *codec, hda_nid_t nid, int type) { switch (type) { case SND_JACK_HEADPHONE: return "Headphone"; case SND_JACK_MICROPHONE: return "Mic"; case SND_JACK_LINEOUT: return "Line-out"; case SND_JACK_HEADSET: return "Headset"; default: return "Misc"; } } static void hda_free_jack_priv(struct snd_jack *jack) { struct hda_jack_item *jacks = jack->private_data; jacks->nid = 0; jacks->jack = NULL; } int snd_hda_input_jack_add(struct hda_codec *codec, hda_nid_t nid, int type, const char *name) { struct hda_jack_item *jack; int err; snd_array_init(&codec->jacks, sizeof(*jack), 32); jack = snd_array_new(&codec->jacks); if (!jack) return -ENOMEM; jack->nid = nid; jack->type = type; if (!name) name = get_jack_default_name(codec, nid, type); err = snd_jack_new(codec->bus->card, name, type, &jack->jack); if (err < 0) { jack->nid = 0; return err; } jack->jack->private_data = jack; jack->jack->private_free = hda_free_jack_priv; return 0; } EXPORT_SYMBOL_HDA(snd_hda_input_jack_add); void snd_hda_input_jack_report(struct hda_codec *codec, hda_nid_t nid) { struct hda_jack_item *jacks = codec->jacks.list; int i; if (!jacks) return; for (i = 0; i < codec->jacks.used; i++, jacks++) { unsigned int pin_ctl; unsigned int present; int type; if (jacks->nid != nid) continue; present = snd_hda_jack_detect(codec, nid); type = jacks->type; if (type == (SND_JACK_HEADPHONE | SND_JACK_LINEOUT)) { pin_ctl = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0); type = (pin_ctl & AC_PINCTL_HP_EN) ? SND_JACK_HEADPHONE : SND_JACK_LINEOUT; } snd_jack_report(jacks->jack, present ? type : 0); } } EXPORT_SYMBOL_HDA(snd_hda_input_jack_report); /* free jack instances manually when clearing/reconfiguring */ void snd_hda_input_jack_free(struct hda_codec *codec) { if (!codec->bus->shutdown && codec->jacks.list) { struct hda_jack_item *jacks = codec->jacks.list; int i; for (i = 0; i < codec->jacks.used; i++, jacks++) { if (jacks->jack) snd_device_free(codec->bus->card, jacks->jack); } } snd_array_free(&codec->jacks); } EXPORT_SYMBOL_HDA(snd_hda_input_jack_free); #endif /* CONFIG_SND_HDA_INPUT_JACK */ MODULE_DESCRIPTION("HDA codec core"); MODULE_LICENSE("GPL");
sound/pci/hda/hda_codec.h +5 −0 Original line number Diff line number Diff line Loading @@ -866,6 +866,11 @@ struct hda_codec { /* codec-specific additional proc output */ void (*proc_widget_hook)(struct snd_info_buffer *buffer, struct hda_codec *codec, hda_nid_t nid); #ifdef CONFIG_SND_HDA_INPUT_JACK /* jack detection */ struct snd_array jacks; #endif }; /* direction */ Loading
sound/pci/hda/hda_intel.c +5 −2 Original line number Diff line number Diff line Loading @@ -1052,8 +1052,11 @@ static void azx_init_pci(struct azx *chip) /* Clear bits 0-2 of PCI register TCSEL (at offset 0x44) * TCSEL == Traffic Class Select Register, which sets PCI express QOS * Ensuring these bits are 0 clears playback static on some HD Audio * codecs * codecs. * The PCI register TCSEL is defined in the Intel manuals. */ if (chip->driver_type != AZX_DRIVER_ATI && chip->driver_type != AZX_DRIVER_ATIHDMI) update_pci_byte(chip->pci, ICH6_PCIREG_TCSEL, 0x07, 0); switch (chip->driver_type) { Loading
sound/pci/hda/hda_local.h +24 −0 Original line number Diff line number Diff line Loading @@ -656,4 +656,28 @@ static inline void snd_hda_eld_proc_free(struct hda_codec *codec, #define SND_PRINT_CHANNEL_ALLOCATION_ADVISED_BUFSIZE 80 void snd_print_channel_allocation(int spk_alloc, char *buf, int buflen); /* * Input-jack notification support */ #ifdef CONFIG_SND_HDA_INPUT_JACK int snd_hda_input_jack_add(struct hda_codec *codec, hda_nid_t nid, int type, const char *name); void snd_hda_input_jack_report(struct hda_codec *codec, hda_nid_t nid); void snd_hda_input_jack_free(struct hda_codec *codec); #else /* CONFIG_SND_HDA_INPUT_JACK */ static inline int snd_hda_input_jack_add(struct hda_codec *codec, hda_nid_t nid, int type, const char *name) { return 0; } static inline void snd_hda_input_jack_report(struct hda_codec *codec, hda_nid_t nid) { } static inline void snd_hda_input_jack_free(struct hda_codec *codec) { } #endif /* CONFIG_SND_HDA_INPUT_JACK */ #endif /* __SOUND_HDA_LOCAL_H */
sound/pci/hda/patch_analog.c +10 −107 Original line number Diff line number Diff line Loading @@ -30,10 +30,10 @@ #include "hda_beep.h" struct ad198x_spec { struct snd_kcontrol_new *mixers[5]; struct snd_kcontrol_new *mixers[6]; int num_mixers; unsigned int beep_amp; /* beep amp value, set via set_beep_amp() */ const struct hda_verb *init_verbs[5]; /* initialization verbs const struct hda_verb *init_verbs[6]; /* initialization verbs * don't forget NULL termination! */ unsigned int num_init_verbs; Loading Loading @@ -331,36 +331,11 @@ 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 }, }; /* Loading Loading @@ -2239,29 +2214,6 @@ static struct snd_kcontrol_new ad1988_6stack_mixers2[] = { 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 */ }; Loading Loading @@ -2545,11 +2497,6 @@ 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 */ Loading @@ -2558,50 +2505,6 @@ static struct hda_verb ad1988_6stack_fp_init_verbs[] = { {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 */ { } }; Loading Loading @@ -3316,20 +3219,20 @@ 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; spec->num_init_verbs = 1; spec->init_verbs[0] = ad1988_6stack_init_verbs; if (board_config == AD1988_6STACK_DIG_FP) { spec->mixers[1] = ad1988_6stack_fp_mixers; spec->num_mixers++; spec->mixers[2] = ad1988_6stack_fp_mixers; spec->num_init_verbs++; spec->init_verbs[1] = ad1988_6stack_fp_init_verbs; 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; 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; Loading