aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/hda/patch_realtek.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-07-06 13:56:51 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-07-06 13:56:51 -0400
commit920f2ecdf6c3b3526f60fbd38c68597953cad3ee (patch)
tree18188922ba38a5c53ee8d17032eb5c46dffc7fa2 /sound/pci/hda/patch_realtek.c
parent9ced560b82606b35adb33a27012a148d418a4c1f (diff)
parentfc18282cdcba984ab89c74d7e844c10114ae0795 (diff)
Merge tag 'sound-4.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound updates from Takashi Iwai: "This development cycle resulted in a fair amount of changes in both core and driver sides. The most significant change in ALSA core is about PCM. Also the support of of-graph card and the new DAPM widget for DSP are noteworthy changes in ASoC core. And there're lots of small changes splat over the tree, as you can see in diffstat. Below are a few highlights: ALSA core: - Removal of set_fs() hackery from PCM core stuff, and the code reorganization / optimization thereafter - Improved support of PCM ack ops, and a new ABI for improved control/status mmap handling - Lots of constifications in various codes ASoC core: - The support of of-graph card, which may work as a better generic device for a replacement of simple-card - New widget types intended mainly for use with DSPs ASoC drivers: - New drivers for Allwinner V3s SoCs - Ensonic ES8316 codec support - More Intel SKL and KBL works - More device support for Intel SST Atom (mostly for cheap tablets and 2-in-1 devices) - Support for Rockchip PDM controllers - Support for STM32 I2S and S/PDIF controllers - Support for ZTE AUD96P22 codecs HD-audio: - Support of new Realtek codecs (ALC215/ALC285/ALC289), more quirks for HP and Dell machines - A few more fixes for i915 component binding" * tag 'sound-4.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (418 commits) ALSA: hda - Fix unbalance of i915 module refcount ASoC: Intel: Skylake: Remove driver debugfs exit ASoC: Intel: Skylake: explicitly add the headers sst-dsp.h ALSA: hda/realtek - Remove GPIO_MASK ALSA: hda/realtek - Fix typo of pincfg for Dell quirk ALSA: pcm: add a documentation for tracepoints ALSA: atmel: ac97c: fix error return code in atmel_ac97c_probe() ALSA: x86: fix error return code in hdmi_lpe_audio_probe() ASoC: Intel: Skylake: Add support to read firmware registers ASoC: Intel: Skylake: Add sram address to sst_addr structure ASoC: Intel: Skylake: Debugfs facility to dump module config ASoC: Intel: Skylake: Add debugfs support ASoC: fix semicolon.cocci warnings ASoC: rt5645: Add quirk override by module option ASoC: rsnd: make arrays path and cmd_case static const ASoC: audio-graph-card: add widgets and routing for external amplifier support ASoC: audio-graph-card: update bindings for amplifier support ASoC: rt5665: calibration should be done before jack detection ASoC: rsnd: constify dev_pm_ops structures. ASoC: nau8825: change crosstalk-bypass property to bool type ...
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
-rw-r--r--sound/pci/hda/patch_realtek.c281
1 files changed, 262 insertions, 19 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index cbeebc0a9711..cd6987b5c6d9 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -41,9 +41,6 @@
41/* keep halting ALC5505 DSP, for power saving */ 41/* keep halting ALC5505 DSP, for power saving */
42#define HALT_REALTEK_ALC5505 42#define HALT_REALTEK_ALC5505
43 43
44/* for GPIO Poll */
45#define GPIO_MASK 0x03
46
47/* extra amp-initialization sequence types */ 44/* extra amp-initialization sequence types */
48enum { 45enum {
49 ALC_INIT_NONE, 46 ALC_INIT_NONE,
@@ -327,6 +324,7 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)
327 case 0x10ec0292: 324 case 0x10ec0292:
328 alc_update_coef_idx(codec, 0x4, 1<<15, 0); 325 alc_update_coef_idx(codec, 0x4, 1<<15, 0);
329 break; 326 break;
327 case 0x10ec0215:
330 case 0x10ec0225: 328 case 0x10ec0225:
331 case 0x10ec0233: 329 case 0x10ec0233:
332 case 0x10ec0255: 330 case 0x10ec0255:
@@ -335,12 +333,13 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)
335 case 0x10ec0283: 333 case 0x10ec0283:
336 case 0x10ec0286: 334 case 0x10ec0286:
337 case 0x10ec0288: 335 case 0x10ec0288:
336 case 0x10ec0285:
338 case 0x10ec0295: 337 case 0x10ec0295:
339 case 0x10ec0298: 338 case 0x10ec0298:
339 case 0x10ec0289:
340 case 0x10ec0299: 340 case 0x10ec0299:
341 alc_update_coef_idx(codec, 0x10, 1<<9, 0); 341 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
342 break; 342 break;
343 case 0x10ec0285:
344 case 0x10ec0293: 343 case 0x10ec0293:
345 alc_update_coef_idx(codec, 0xa, 1<<13, 0); 344 alc_update_coef_idx(codec, 0xa, 1<<13, 0);
346 break; 345 break;
@@ -2575,18 +2574,37 @@ static int patch_alc262(struct hda_codec *codec)
2575 * ALC268 2574 * ALC268
2576 */ 2575 */
2577/* bind Beep switches of both NID 0x0f and 0x10 */ 2576/* bind Beep switches of both NID 0x0f and 0x10 */
2578static const struct hda_bind_ctls alc268_bind_beep_sw = { 2577static int alc268_beep_switch_put(struct snd_kcontrol *kcontrol,
2579 .ops = &snd_hda_bind_sw, 2578 struct snd_ctl_elem_value *ucontrol)
2580 .values = { 2579{
2581 HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT), 2580 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2582 HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT), 2581 unsigned long pval;
2583 0 2582 int err;
2584 }, 2583
2585}; 2584 mutex_lock(&codec->control_mutex);
2585 pval = kcontrol->private_value;
2586 kcontrol->private_value = (pval & ~0xff) | 0x0f;
2587 err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2588 if (err >= 0) {
2589 kcontrol->private_value = (pval & ~0xff) | 0x10;
2590 err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2591 }
2592 kcontrol->private_value = pval;
2593 mutex_unlock(&codec->control_mutex);
2594 return err;
2595}
2586 2596
2587static const struct snd_kcontrol_new alc268_beep_mixer[] = { 2597static const struct snd_kcontrol_new alc268_beep_mixer[] = {
2588 HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT), 2598 HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
2589 HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw), 2599 {
2600 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2601 .name = "Beep Playback Switch",
2602 .subdevice = HDA_SUBDEV_AMP_FLAG,
2603 .info = snd_hda_mixer_amp_switch_info,
2604 .get = snd_hda_mixer_amp_switch_get,
2605 .put = alc268_beep_switch_put,
2606 .private_value = HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT)
2607 },
2590 { } 2608 { }
2591}; 2609};
2592 2610
@@ -2719,11 +2737,12 @@ enum {
2719 ALC269_TYPE_ALC282, 2737 ALC269_TYPE_ALC282,
2720 ALC269_TYPE_ALC283, 2738 ALC269_TYPE_ALC283,
2721 ALC269_TYPE_ALC284, 2739 ALC269_TYPE_ALC284,
2722 ALC269_TYPE_ALC285, 2740 ALC269_TYPE_ALC293,
2723 ALC269_TYPE_ALC286, 2741 ALC269_TYPE_ALC286,
2724 ALC269_TYPE_ALC298, 2742 ALC269_TYPE_ALC298,
2725 ALC269_TYPE_ALC255, 2743 ALC269_TYPE_ALC255,
2726 ALC269_TYPE_ALC256, 2744 ALC269_TYPE_ALC256,
2745 ALC269_TYPE_ALC215,
2727 ALC269_TYPE_ALC225, 2746 ALC269_TYPE_ALC225,
2728 ALC269_TYPE_ALC294, 2747 ALC269_TYPE_ALC294,
2729 ALC269_TYPE_ALC700, 2748 ALC269_TYPE_ALC700,
@@ -2745,7 +2764,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec)
2745 case ALC269_TYPE_ALC269VC: 2764 case ALC269_TYPE_ALC269VC:
2746 case ALC269_TYPE_ALC280: 2765 case ALC269_TYPE_ALC280:
2747 case ALC269_TYPE_ALC284: 2766 case ALC269_TYPE_ALC284:
2748 case ALC269_TYPE_ALC285: 2767 case ALC269_TYPE_ALC293:
2749 ssids = alc269va_ssids; 2768 ssids = alc269va_ssids;
2750 break; 2769 break;
2751 case ALC269_TYPE_ALC269VB: 2770 case ALC269_TYPE_ALC269VB:
@@ -2756,6 +2775,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec)
2756 case ALC269_TYPE_ALC298: 2775 case ALC269_TYPE_ALC298:
2757 case ALC269_TYPE_ALC255: 2776 case ALC269_TYPE_ALC255:
2758 case ALC269_TYPE_ALC256: 2777 case ALC269_TYPE_ALC256:
2778 case ALC269_TYPE_ALC215:
2759 case ALC269_TYPE_ALC225: 2779 case ALC269_TYPE_ALC225:
2760 case ALC269_TYPE_ALC294: 2780 case ALC269_TYPE_ALC294:
2761 case ALC269_TYPE_ALC700: 2781 case ALC269_TYPE_ALC700:
@@ -3043,6 +3063,135 @@ static void alc283_shutup(struct hda_codec *codec)
3043 alc_write_coef_idx(codec, 0x43, 0x9614); 3063 alc_write_coef_idx(codec, 0x43, 0x9614);
3044} 3064}
3045 3065
3066static void alc256_init(struct hda_codec *codec)
3067{
3068 struct alc_spec *spec = codec->spec;
3069 hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
3070 bool hp_pin_sense;
3071
3072 if (!hp_pin)
3073 return;
3074
3075 msleep(30);
3076
3077 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3078
3079 if (hp_pin_sense)
3080 msleep(2);
3081
3082 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3083
3084 snd_hda_codec_write(codec, hp_pin, 0,
3085 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3086
3087 if (hp_pin_sense)
3088 msleep(85);
3089
3090 snd_hda_codec_write(codec, hp_pin, 0,
3091 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3092
3093 if (hp_pin_sense)
3094 msleep(100);
3095
3096 alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3097 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
3098}
3099
3100static void alc256_shutup(struct hda_codec *codec)
3101{
3102 struct alc_spec *spec = codec->spec;
3103 hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
3104 bool hp_pin_sense;
3105
3106 if (!hp_pin) {
3107 alc269_shutup(codec);
3108 return;
3109 }
3110
3111 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3112
3113 if (hp_pin_sense)
3114 msleep(2);
3115
3116 snd_hda_codec_write(codec, hp_pin, 0,
3117 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3118
3119 if (hp_pin_sense)
3120 msleep(85);
3121
3122 snd_hda_codec_write(codec, hp_pin, 0,
3123 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3124
3125 alc_update_coef_idx(codec, 0x46, 0, 3 << 12); /* 3k pull low control for Headset jack. */
3126
3127 if (hp_pin_sense)
3128 msleep(100);
3129
3130 alc_auto_setup_eapd(codec, false);
3131 snd_hda_shutup_pins(codec);
3132}
3133
3134static void alc_default_init(struct hda_codec *codec)
3135{
3136 struct alc_spec *spec = codec->spec;
3137 hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
3138 bool hp_pin_sense;
3139
3140 if (!hp_pin)
3141 return;
3142
3143 msleep(30);
3144
3145 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3146
3147 if (hp_pin_sense)
3148 msleep(2);
3149
3150 snd_hda_codec_write(codec, hp_pin, 0,
3151 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3152
3153 if (hp_pin_sense)
3154 msleep(85);
3155
3156 snd_hda_codec_write(codec, hp_pin, 0,
3157 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3158
3159 if (hp_pin_sense)
3160 msleep(100);
3161}
3162
3163static void alc_default_shutup(struct hda_codec *codec)
3164{
3165 struct alc_spec *spec = codec->spec;
3166 hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
3167 bool hp_pin_sense;
3168
3169 if (!hp_pin) {
3170 alc269_shutup(codec);
3171 return;
3172 }
3173
3174 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3175
3176 if (hp_pin_sense)
3177 msleep(2);
3178
3179 snd_hda_codec_write(codec, hp_pin, 0,
3180 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3181
3182 if (hp_pin_sense)
3183 msleep(85);
3184
3185 snd_hda_codec_write(codec, hp_pin, 0,
3186 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3187
3188 if (hp_pin_sense)
3189 msleep(100);
3190
3191 alc_auto_setup_eapd(codec, false);
3192 snd_hda_shutup_pins(codec);
3193}
3194
3046static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg, 3195static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,
3047 unsigned int val) 3196 unsigned int val)
3048{ 3197{
@@ -3754,6 +3903,16 @@ static void alc_headset_mode_unplugged(struct hda_codec *codec)
3754 UPDATE_COEF(0x4a, 3<<10, 0), 3903 UPDATE_COEF(0x4a, 3<<10, 0),
3755 {} 3904 {}
3756 }; 3905 };
3906 static struct coef_fw coef0274[] = {
3907 UPDATE_COEF(0x4a, 0x0100, 0),
3908 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0),
3909 UPDATE_COEF(0x6b, 0xf000, 0x5000),
3910 UPDATE_COEF(0x4a, 0x0010, 0),
3911 UPDATE_COEF(0x4a, 0x0c00, 0x0c00),
3912 WRITE_COEF(0x45, 0x5289),
3913 UPDATE_COEF(0x4a, 0x0c00, 0),
3914 {}
3915 };
3757 3916
3758 switch (codec->core.vendor_id) { 3917 switch (codec->core.vendor_id) {
3759 case 0x10ec0255: 3918 case 0x10ec0255:
@@ -3764,6 +3923,11 @@ static void alc_headset_mode_unplugged(struct hda_codec *codec)
3764 alc_process_coef_fw(codec, coef0256); 3923 alc_process_coef_fw(codec, coef0256);
3765 alc_process_coef_fw(codec, coef0255); 3924 alc_process_coef_fw(codec, coef0255);
3766 break; 3925 break;
3926 case 0x10ec0234:
3927 case 0x10ec0274:
3928 case 0x10ec0294:
3929 alc_process_coef_fw(codec, coef0274);
3930 break;
3767 case 0x10ec0233: 3931 case 0x10ec0233:
3768 case 0x10ec0283: 3932 case 0x10ec0283:
3769 alc_process_coef_fw(codec, coef0233); 3933 alc_process_coef_fw(codec, coef0233);
@@ -3841,7 +4005,12 @@ static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
3841 UPDATE_COEF(0x63, 3<<14, 0), 4005 UPDATE_COEF(0x63, 3<<14, 0),
3842 {} 4006 {}
3843 }; 4007 };
3844 4008 static struct coef_fw coef0274[] = {
4009 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0x4000),
4010 UPDATE_COEF(0x4a, 0x0010, 0),
4011 UPDATE_COEF(0x6b, 0xf000, 0),
4012 {}
4013 };
3845 4014
3846 switch (codec->core.vendor_id) { 4015 switch (codec->core.vendor_id) {
3847 case 0x10ec0255: 4016 case 0x10ec0255:
@@ -3851,6 +4020,14 @@ static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
3851 alc_process_coef_fw(codec, coef0255); 4020 alc_process_coef_fw(codec, coef0255);
3852 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50); 4021 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
3853 break; 4022 break;
4023 case 0x10ec0234:
4024 case 0x10ec0274:
4025 case 0x10ec0294:
4026 alc_write_coef_idx(codec, 0x45, 0x4689);
4027 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4028 alc_process_coef_fw(codec, coef0274);
4029 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4030 break;
3854 case 0x10ec0233: 4031 case 0x10ec0233:
3855 case 0x10ec0283: 4032 case 0x10ec0283:
3856 alc_write_coef_idx(codec, 0x45, 0xc429); 4033 alc_write_coef_idx(codec, 0x45, 0xc429);
@@ -3948,6 +4125,13 @@ static void alc_headset_mode_default(struct hda_codec *codec)
3948 WRITE_COEF(0xb7, 0x802b), 4125 WRITE_COEF(0xb7, 0x802b),
3949 {} 4126 {}
3950 }; 4127 };
4128 static struct coef_fw coef0274[] = {
4129 WRITE_COEF(0x45, 0x4289),
4130 UPDATE_COEF(0x4a, 0x0010, 0x0010),
4131 UPDATE_COEF(0x6b, 0x0f00, 0),
4132 UPDATE_COEF(0x49, 0x0300, 0x0300),
4133 {}
4134 };
3951 4135
3952 switch (codec->core.vendor_id) { 4136 switch (codec->core.vendor_id) {
3953 case 0x10ec0225: 4137 case 0x10ec0225:
@@ -3959,6 +4143,11 @@ static void alc_headset_mode_default(struct hda_codec *codec)
3959 case 0x10ec0256: 4143 case 0x10ec0256:
3960 alc_process_coef_fw(codec, coef0255); 4144 alc_process_coef_fw(codec, coef0255);
3961 break; 4145 break;
4146 case 0x10ec0234:
4147 case 0x10ec0274:
4148 case 0x10ec0294:
4149 alc_process_coef_fw(codec, coef0274);
4150 break;
3962 case 0x10ec0233: 4151 case 0x10ec0233:
3963 case 0x10ec0283: 4152 case 0x10ec0283:
3964 alc_process_coef_fw(codec, coef0233); 4153 alc_process_coef_fw(codec, coef0233);
@@ -4044,6 +4233,11 @@ static void alc_headset_mode_ctia(struct hda_codec *codec)
4044 case 0x10ec0256: 4233 case 0x10ec0256:
4045 alc_process_coef_fw(codec, coef0256); 4234 alc_process_coef_fw(codec, coef0256);
4046 break; 4235 break;
4236 case 0x10ec0234:
4237 case 0x10ec0274:
4238 case 0x10ec0294:
4239 alc_write_coef_idx(codec, 0x45, 0xd689);
4240 break;
4047 case 0x10ec0233: 4241 case 0x10ec0233:
4048 case 0x10ec0283: 4242 case 0x10ec0283:
4049 alc_process_coef_fw(codec, coef0233); 4243 alc_process_coef_fw(codec, coef0233);
@@ -4138,6 +4332,11 @@ static void alc_headset_mode_omtp(struct hda_codec *codec)
4138 case 0x10ec0256: 4332 case 0x10ec0256:
4139 alc_process_coef_fw(codec, coef0256); 4333 alc_process_coef_fw(codec, coef0256);
4140 break; 4334 break;
4335 case 0x10ec0234:
4336 case 0x10ec0274:
4337 case 0x10ec0294:
4338 alc_write_coef_idx(codec, 0x45, 0xe689);
4339 break;
4141 case 0x10ec0233: 4340 case 0x10ec0233:
4142 case 0x10ec0283: 4341 case 0x10ec0283:
4143 alc_process_coef_fw(codec, coef0233); 4342 alc_process_coef_fw(codec, coef0233);
@@ -4201,6 +4400,13 @@ static void alc_determine_headset_type(struct hda_codec *codec)
4201 UPDATE_COEF(0x49, 1<<8, 1<<8), 4400 UPDATE_COEF(0x49, 1<<8, 1<<8),
4202 {} 4401 {}
4203 }; 4402 };
4403 static struct coef_fw coef0274[] = {
4404 UPDATE_COEF(0x4a, 0x0010, 0),
4405 UPDATE_COEF(0x4a, 0x8000, 0),
4406 WRITE_COEF(0x45, 0xd289),
4407 UPDATE_COEF(0x49, 0x0300, 0x0300),
4408 {}
4409 };
4204 4410
4205 switch (codec->core.vendor_id) { 4411 switch (codec->core.vendor_id) {
4206 case 0x10ec0255: 4412 case 0x10ec0255:
@@ -4210,6 +4416,14 @@ static void alc_determine_headset_type(struct hda_codec *codec)
4210 val = alc_read_coef_idx(codec, 0x46); 4416 val = alc_read_coef_idx(codec, 0x46);
4211 is_ctia = (val & 0x0070) == 0x0070; 4417 is_ctia = (val & 0x0070) == 0x0070;
4212 break; 4418 break;
4419 case 0x10ec0234:
4420 case 0x10ec0274:
4421 case 0x10ec0294:
4422 alc_process_coef_fw(codec, coef0274);
4423 msleep(80);
4424 val = alc_read_coef_idx(codec, 0x46);
4425 is_ctia = (val & 0x00f0) == 0x00f0;
4426 break;
4213 case 0x10ec0233: 4427 case 0x10ec0233:
4214 case 0x10ec0283: 4428 case 0x10ec0283:
4215 alc_write_coef_idx(codec, 0x45, 0xd029); 4429 alc_write_coef_idx(codec, 0x45, 0xd029);
@@ -4892,6 +5106,7 @@ enum {
4892 ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, 5106 ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
4893 ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, 5107 ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
4894 ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, 5108 ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
5109 ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
4895 ALC269_FIXUP_HEADSET_MODE, 5110 ALC269_FIXUP_HEADSET_MODE,
4896 ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, 5111 ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
4897 ALC269_FIXUP_ASPIRE_HEADSET_MIC, 5112 ALC269_FIXUP_ASPIRE_HEADSET_MIC,
@@ -5192,6 +5407,16 @@ static const struct hda_fixup alc269_fixups[] = {
5192 .chained = true, 5407 .chained = true,
5193 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC 5408 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
5194 }, 5409 },
5410 [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = {
5411 .type = HDA_FIXUP_PINS,
5412 .v.pins = (const struct hda_pintbl[]) {
5413 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5414 { 0x1b, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
5415 { }
5416 },
5417 .chained = true,
5418 .chain_id = ALC269_FIXUP_HEADSET_MODE
5419 },
5195 [ALC269_FIXUP_HEADSET_MODE] = { 5420 [ALC269_FIXUP_HEADSET_MODE] = {
5196 .type = HDA_FIXUP_FUNC, 5421 .type = HDA_FIXUP_FUNC,
5197 .v.func = alc_fixup_headset_mode, 5422 .v.func = alc_fixup_headset_mode,
@@ -6322,6 +6547,11 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
6322 {0x17, 0x90170110}, 6547 {0x17, 0x90170110},
6323 {0x1a, 0x03011020}, 6548 {0x1a, 0x03011020},
6324 {0x21, 0x03211030}), 6549 {0x21, 0x03211030}),
6550 SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
6551 ALC225_STANDARD_PINS,
6552 {0x12, 0xb7a60130},
6553 {0x13, 0xb8a61140},
6554 {0x17, 0x90170110}),
6325 {} 6555 {}
6326}; 6556};
6327 6557
@@ -6384,7 +6614,8 @@ static int patch_alc269(struct hda_codec *codec)
6384 codec->patch_ops.suspend = alc269_suspend; 6614 codec->patch_ops.suspend = alc269_suspend;
6385 codec->patch_ops.resume = alc269_resume; 6615 codec->patch_ops.resume = alc269_resume;
6386#endif 6616#endif
6387 spec->shutup = alc269_shutup; 6617 spec->shutup = alc_default_shutup;
6618 spec->init_hook = alc_default_init;
6388 6619
6389 snd_hda_pick_fixup(codec, alc269_fixup_models, 6620 snd_hda_pick_fixup(codec, alc269_fixup_models,
6390 alc269_fixup_tbl, alc269_fixups); 6621 alc269_fixup_tbl, alc269_fixups);
@@ -6424,6 +6655,7 @@ static int patch_alc269(struct hda_codec *codec)
6424 } 6655 }
6425 if (err < 0) 6656 if (err < 0)
6426 goto error; 6657 goto error;
6658 spec->shutup = alc269_shutup;
6427 spec->init_hook = alc269_fill_coef; 6659 spec->init_hook = alc269_fill_coef;
6428 alc269_fill_coef(codec); 6660 alc269_fill_coef(codec);
6429 break; 6661 break;
@@ -6447,9 +6679,8 @@ static int patch_alc269(struct hda_codec *codec)
6447 case 0x10ec0292: 6679 case 0x10ec0292:
6448 spec->codec_variant = ALC269_TYPE_ALC284; 6680 spec->codec_variant = ALC269_TYPE_ALC284;
6449 break; 6681 break;
6450 case 0x10ec0285:
6451 case 0x10ec0293: 6682 case 0x10ec0293:
6452 spec->codec_variant = ALC269_TYPE_ALC285; 6683 spec->codec_variant = ALC269_TYPE_ALC293;
6453 break; 6684 break;
6454 case 0x10ec0286: 6685 case 0x10ec0286:
6455 case 0x10ec0288: 6686 case 0x10ec0288:
@@ -6464,9 +6695,17 @@ static int patch_alc269(struct hda_codec *codec)
6464 break; 6695 break;
6465 case 0x10ec0256: 6696 case 0x10ec0256:
6466 spec->codec_variant = ALC269_TYPE_ALC256; 6697 spec->codec_variant = ALC269_TYPE_ALC256;
6698 spec->shutup = alc256_shutup;
6699 spec->init_hook = alc256_init;
6467 spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */ 6700 spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
6468 alc_update_coef_idx(codec, 0x36, 1 << 13, 1 << 5); /* Switch pcbeep path to Line in path*/ 6701 alc_update_coef_idx(codec, 0x36, 1 << 13, 1 << 5); /* Switch pcbeep path to Line in path*/
6469 break; 6702 break;
6703 case 0x10ec0215:
6704 case 0x10ec0285:
6705 case 0x10ec0289:
6706 spec->codec_variant = ALC269_TYPE_ALC215;
6707 spec->gen.mixer_nid = 0;
6708 break;
6470 case 0x10ec0225: 6709 case 0x10ec0225:
6471 case 0x10ec0295: 6710 case 0x10ec0295:
6472 spec->codec_variant = ALC269_TYPE_ALC225; 6711 spec->codec_variant = ALC269_TYPE_ALC225;
@@ -6479,6 +6718,8 @@ static int patch_alc269(struct hda_codec *codec)
6479 case 0x10ec0274: 6718 case 0x10ec0274:
6480 case 0x10ec0294: 6719 case 0x10ec0294:
6481 spec->codec_variant = ALC269_TYPE_ALC294; 6720 spec->codec_variant = ALC269_TYPE_ALC294;
6721 spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */
6722 alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */
6482 break; 6723 break;
6483 case 0x10ec0700: 6724 case 0x10ec0700:
6484 case 0x10ec0701: 6725 case 0x10ec0701:
@@ -7495,6 +7736,7 @@ static int patch_alc680(struct hda_codec *codec)
7495 * patch entries 7736 * patch entries
7496 */ 7737 */
7497static const struct hda_device_id snd_hda_id_realtek[] = { 7738static const struct hda_device_id snd_hda_id_realtek[] = {
7739 HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269),
7498 HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269), 7740 HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
7499 HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269), 7741 HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
7500 HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269), 7742 HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
@@ -7520,6 +7762,7 @@ static const struct hda_device_id snd_hda_id_realtek[] = {
7520 HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269), 7762 HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),
7521 HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269), 7763 HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),
7522 HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269), 7764 HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),
7765 HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269),
7523 HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269), 7766 HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),
7524 HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269), 7767 HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269),
7525 HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269), 7768 HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269),