2 * Copyright (c) 2006 Stephane E. Potvin <sepotvin@videotron.ca>
3 * Copyright (c) 2006 Ariff Abdullah <ariff@FreeBSD.org>
4 * Copyright (c) 2008-2012 Alexander Motin <mav@FreeBSD.org>
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * Intel High Definition Audio (Audio function quirks) driver for FreeBSD.
33 #ifdef HAVE_KERNEL_OPTION_HEADERS
37 #include <dev/sound/pcm/sound.h>
39 #include <sys/ctype.h>
41 #include <dev/sound/pci/hda/hdac.h>
42 #include <dev/sound/pci/hda/hdaa.h>
43 #include <dev/sound/pci/hda/hda_reg.h>
45 SND_DECLARE_FILE("$FreeBSD$");
55 * XXX Force stereo quirk. Monoural recording / playback
56 * on few codecs (especially ALC880) seems broken or
57 * perhaps unsupported.
59 { HDA_MATCH_ALL, HDA_MATCH_ALL, HDA_MATCH_ALL,
60 HDAA_QUIRK_FORCESTEREO | HDAA_QUIRK_IVREF, 0,
62 { ACER_ALL_SUBVENDOR, HDA_MATCH_ALL, HDA_MATCH_ALL,
65 { ASUS_G2K_SUBVENDOR, HDA_CODEC_ALC660, HDA_MATCH_ALL,
68 { ASUS_M5200_SUBVENDOR, HDA_CODEC_ALC880, HDA_MATCH_ALL,
71 { ASUS_A7M_SUBVENDOR, HDA_CODEC_ALC880, HDA_MATCH_ALL,
74 { ASUS_A7T_SUBVENDOR, HDA_CODEC_ALC882, HDA_MATCH_ALL,
77 { ASUS_W2J_SUBVENDOR, HDA_CODEC_ALC882, HDA_MATCH_ALL,
80 { ASUS_U5F_SUBVENDOR, HDA_CODEC_AD1986A, HDA_MATCH_ALL,
81 HDAA_QUIRK_EAPDINV, 0,
83 { ASUS_A8X_SUBVENDOR, HDA_CODEC_AD1986A, HDA_MATCH_ALL,
84 HDAA_QUIRK_EAPDINV, 0,
86 { ASUS_F3JC_SUBVENDOR, HDA_CODEC_ALC861, HDA_MATCH_ALL,
89 { UNIWILL_9075_SUBVENDOR, HDA_CODEC_ALC861, HDA_MATCH_ALL,
92 /*{ ASUS_M2N_SUBVENDOR, HDA_CODEC_AD1988, HDA_MATCH_ALL,
93 HDAA_QUIRK_IVREF80, HDAA_QUIRK_IVREF50 | HDAA_QUIRK_IVREF100,
95 { MEDION_MD95257_SUBVENDOR, HDA_CODEC_ALC880, HDA_MATCH_ALL,
98 { LENOVO_3KN100_SUBVENDOR, HDA_CODEC_AD1986A, HDA_MATCH_ALL,
99 HDAA_QUIRK_EAPDINV | HDAA_QUIRK_SENSEINV, 0,
101 { SAMSUNG_Q1_SUBVENDOR, HDA_CODEC_AD1986A, HDA_MATCH_ALL,
102 HDAA_QUIRK_EAPDINV, 0,
104 { APPLE_MB3_SUBVENDOR, HDA_CODEC_ALC885, HDA_MATCH_ALL,
105 HDAA_QUIRK_OVREF50, 0,
107 { APPLE_INTEL_MAC, HDA_CODEC_STAC9221, HDA_MATCH_ALL,
109 HDAA_GPIO_SET(0) | HDAA_GPIO_SET(1) },
110 { APPLE_MACBOOKAIR31, HDA_CODEC_CS4206, HDA_MATCH_ALL,
112 HDAA_GPIO_SET(1) | HDAA_GPIO_SET(3) },
113 { APPLE_MACBOOKPRO55, HDA_CODEC_CS4206, HDA_MATCH_ALL,
115 HDAA_GPIO_SET(1) | HDAA_GPIO_SET(3) },
116 { APPLE_MACBOOKPRO71, HDA_CODEC_CS4206, HDA_MATCH_ALL,
118 HDAA_GPIO_SET(1) | HDAA_GPIO_SET(3) },
119 { HDA_INTEL_MACBOOKPRO92, HDA_CODEC_CS4206, HDA_MATCH_ALL,
121 HDAA_GPIO_SET(1) | HDAA_GPIO_SET(3) },
122 { DELL_D630_SUBVENDOR, HDA_CODEC_STAC9205X, HDA_MATCH_ALL,
125 { DELL_V1400_SUBVENDOR, HDA_CODEC_STAC9228X, HDA_MATCH_ALL,
128 { DELL_V1500_SUBVENDOR, HDA_CODEC_STAC9205X, HDA_MATCH_ALL,
131 { HDA_MATCH_ALL, HDA_CODEC_AD1988, HDA_MATCH_ALL,
132 HDAA_QUIRK_IVREF80, HDAA_QUIRK_IVREF50 | HDAA_QUIRK_IVREF100,
134 { HDA_MATCH_ALL, HDA_CODEC_AD1988B, HDA_MATCH_ALL,
135 HDAA_QUIRK_IVREF80, HDAA_QUIRK_IVREF50 | HDAA_QUIRK_IVREF100,
137 { HDA_MATCH_ALL, HDA_CODEC_CX20549, HDA_MATCH_ALL,
138 0, HDAA_QUIRK_FORCESTEREO,
140 /* Mac Pro 1,1 requires ovref for proper volume level. */
141 { 0x00000000, HDA_CODEC_ALC885, 0x106b0c00,
145 #define HDAC_QUIRKS_LEN (sizeof(hdac_quirks) / sizeof(hdac_quirks[0]))
148 hdac_pin_patch(struct hdaa_widget *w)
150 const char *patch = NULL;
151 uint32_t config, orig, id, subid;
154 config = orig = w->wclass.pin.config;
155 id = hdaa_codec_id(w->devinfo);
156 subid = hdaa_card_id(w->devinfo);
158 /* XXX: Old patches require complete review.
159 * Now they may create more problem then solve due to
160 * incorrect associations.
162 if (id == HDA_CODEC_ALC880 && subid == LG_LW20_SUBVENDOR) {
165 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK;
166 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_IN;
169 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK;
170 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT;
175 } else if (id == HDA_CODEC_ALC880 &&
176 (subid == CLEVO_D900T_SUBVENDOR ||
177 subid == ASUS_M5200_SUBVENDOR)) {
183 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK;
184 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN;
186 case 25: /* XXX MIC2 */
187 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK;
188 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN;
191 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK;
192 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_IN;
194 case 27: /* XXX LINE2 */
195 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK;
196 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_IN;
199 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK;
200 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_CD;
203 } else if (id == HDA_CODEC_ALC883 &&
204 (subid == MSI_MS034A_SUBVENDOR ||
205 HDA_DEV_MATCH(ACER_ALL_SUBVENDOR, subid))) {
208 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
209 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
210 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN |
211 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED);
214 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
215 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
216 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_CD |
217 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED);
220 } else if (id == HDA_CODEC_CX20549 && subid ==
221 HP_V3000_SUBVENDOR) {
224 config &= ~HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK;
225 config |= HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_NONE;
228 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
229 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
230 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN |
231 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED);
234 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
235 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
236 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_CD |
237 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED);
240 } else if (id == HDA_CODEC_CX20551 && subid ==
241 HP_DV5000_SUBVENDOR) {
245 config &= ~HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK;
246 config |= HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_NONE;
249 } else if (id == HDA_CODEC_ALC861 && subid ==
250 ASUS_W6F_SUBVENDOR) {
253 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
254 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
255 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_OUT |
256 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED);
263 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
264 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
265 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN |
266 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED);
269 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
270 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
271 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT |
272 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_JACK);
275 } else if (id == HDA_CODEC_ALC861 && subid ==
276 UNIWILL_9075_SUBVENDOR) {
279 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
280 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
281 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT |
282 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_JACK);
288 if (id == HDA_CODEC_AD1984A &&
289 subid == LENOVO_X300_SUBVENDOR) {
291 case 17: /* Headphones with redirection */
292 patch = "as=1 seq=15";
294 case 20: /* Two mics together */
295 patch = "as=2 seq=15";
298 } else if (id == HDA_CODEC_AD1986A &&
299 (subid == ASUS_M2NPVMX_SUBVENDOR ||
300 subid == ASUS_A8NVMCSM_SUBVENDOR ||
301 subid == ASUS_P5PL2_SUBVENDOR)) {
303 case 26: /* Headphones with redirection */
304 patch = "as=1 seq=15";
306 case 28: /* 5.1 out => 2.0 out + 1 input */
307 patch = "device=Line-in as=8 seq=1";
309 case 29: /* Can't use this as input, as the only available mic
310 * preamplifier is busy by front panel mic (nid 31).
311 * If you want to use this rear connector as mic input,
312 * you have to disable the front panel one. */
315 case 31: /* Lot of inputs configured with as=15 and unusable */
316 patch = "as=8 seq=3";
319 patch = "as=8 seq=4";
322 patch = "as=8 seq=5";
325 patch = "as=8 seq=6";
328 } else if (id == HDA_CODEC_ALC260 &&
329 HDA_DEV_MATCH(SONY_S5_SUBVENDOR, subid)) {
332 patch = "seq=15 device=Headphones";
335 } else if (id == HDA_CODEC_ALC268) {
336 if (subid == ACER_T5320_SUBVENDOR) {
338 case 20: /* Headphones Jack */
339 patch = "as=1 seq=15";
343 } else if (id == HDA_CODEC_CX20561 &&
344 subid == LENOVO_B450_SUBVENDOR) {
347 patch = "as=1 seq=15";
350 } else if (id == HDA_CODEC_CX20590 &&
351 (subid == LENOVO_X1_SUBVENDOR ||
352 subid == LENOVO_X220_SUBVENDOR ||
353 subid == LENOVO_T420_SUBVENDOR ||
354 subid == LENOVO_T520_SUBVENDOR ||
355 subid == LENOVO_G580_SUBVENDOR)) {
358 patch = "as=1 seq=15";
361 * Group onboard mic and headphone mic
362 * together. Fixes onboard mic.
365 patch = "as=2 seq=15";
371 } else if (id == HDA_CODEC_ALC269 &&
372 (subid == LENOVO_X1CRBN_SUBVENDOR ||
373 subid == LENOVO_T430_SUBVENDOR ||
374 subid == LENOVO_T430S_SUBVENDOR ||
375 subid == LENOVO_T530_SUBVENDOR)) {
378 patch = "as=1 seq=15";
381 } else if (id == HDA_CODEC_ALC269 &&
382 subid == ASUS_UX31A_SUBVENDOR) {
385 patch = "as=1 seq=15";
388 } else if (id == HDA_CODEC_ALC892 &&
389 subid == INTEL_DH87RL_SUBVENDOR) {
392 patch = "as=1 seq=15";
395 } else if (id == HDA_CODEC_ALC292 &&
396 subid == LENOVO_X120BS_SUBVENDOR) {
399 patch = "as=1 seq=15";
405 config = hdaa_widget_pin_patch(config, patch);
408 device_printf(w->devinfo->dev,
409 "Patching pin config nid=%u 0x%08x -> 0x%08x\n",
412 w->wclass.pin.config = config;
416 hdaa_widget_patch(struct hdaa_widget *w)
418 struct hdaa_devinfo *devinfo = w->devinfo;
422 orig = w->param.widget_cap;
423 /* On some codecs beeper is an input pin, but it is not recordable
424 alone. Also most of BIOSes does not declare beeper pin.
425 Change beeper pin node type to beeper to help parser. */
426 switch (hdaa_codec_id(devinfo)) {
427 case HDA_CODEC_AD1882:
428 case HDA_CODEC_AD1883:
429 case HDA_CODEC_AD1984:
430 case HDA_CODEC_AD1984A:
431 case HDA_CODEC_AD1984B:
432 case HDA_CODEC_AD1987:
433 case HDA_CODEC_AD1988:
434 case HDA_CODEC_AD1988B:
435 case HDA_CODEC_AD1989B:
438 case HDA_CODEC_ALC260:
442 if (hda_get_vendor_id(devinfo->dev) == REALTEK_VENDORID &&
443 hdaa_codec_id(devinfo) != HDA_CODEC_ALC260)
445 if (w->nid == beeper) {
446 w->param.widget_cap &= ~HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_MASK;
447 w->param.widget_cap |= HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_BEEP_WIDGET <<
448 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_SHIFT;
452 * Clear "digital" flag from digital mic input, as its signal then goes
453 * to "analog" mixer and this separation just limits functionaity.
455 if (hdaa_codec_id(devinfo) == HDA_CODEC_AD1984A &&
457 w->param.widget_cap &= ~HDA_PARAM_AUDIO_WIDGET_CAP_DIGITAL_MASK;
459 if (w->param.widget_cap != orig) {
460 device_printf(w->devinfo->dev,
461 "Patching widget caps nid=%u 0x%08x -> 0x%08x\n",
462 w->nid, orig, w->param.widget_cap);
466 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX)
471 hdaa_patch(struct hdaa_devinfo *devinfo)
473 struct hdaa_widget *w;
474 uint32_t id, subid, subsystemid;
477 id = hdaa_codec_id(devinfo);
478 subid = hdaa_card_id(devinfo);
479 subsystemid = hda_get_subsystem_id(devinfo->dev);
484 for (i = 0; i < HDAC_QUIRKS_LEN; i++) {
485 if (!(HDA_DEV_MATCH(hdac_quirks[i].model, subid) &&
486 HDA_DEV_MATCH(hdac_quirks[i].id, id) &&
487 HDA_DEV_MATCH(hdac_quirks[i].subsystemid, subsystemid)))
489 devinfo->quirks |= hdac_quirks[i].set;
490 devinfo->quirks &= ~(hdac_quirks[i].unset);
491 devinfo->gpio = hdac_quirks[i].gpio;
494 /* Apply per-widget patch. */
495 for (i = devinfo->startnode; i < devinfo->endnode; i++) {
496 w = hdaa_widget_get(devinfo, i);
499 hdaa_widget_patch(w);
503 case HDA_CODEC_AD1983:
505 * This CODEC has several possible usages, but none
506 * fit the parser best. Help parser to choose better.
508 /* Disable direct unmixed playback to get pcm volume. */
509 w = hdaa_widget_get(devinfo, 5);
511 w->connsenable[0] = 0;
512 w = hdaa_widget_get(devinfo, 6);
514 w->connsenable[0] = 0;
515 w = hdaa_widget_get(devinfo, 11);
517 w->connsenable[0] = 0;
518 /* Disable mic and line selectors. */
519 w = hdaa_widget_get(devinfo, 12);
521 w->connsenable[1] = 0;
522 w = hdaa_widget_get(devinfo, 13);
524 w->connsenable[1] = 0;
525 /* Disable recording from mono playback mix. */
526 w = hdaa_widget_get(devinfo, 20);
528 w->connsenable[3] = 0;
530 case HDA_CODEC_AD1986A:
532 * This CODEC has overcomplicated input mixing.
533 * Make some cleaning there.
535 /* Disable input mono mixer. Not needed and not supported. */
536 w = hdaa_widget_get(devinfo, 43);
539 /* Disable any with any input mixing mesh. Use separately. */
540 w = hdaa_widget_get(devinfo, 39);
543 w = hdaa_widget_get(devinfo, 40);
546 w = hdaa_widget_get(devinfo, 41);
549 w = hdaa_widget_get(devinfo, 42);
552 /* Disable duplicate mixer node connector. */
553 w = hdaa_widget_get(devinfo, 15);
555 w->connsenable[3] = 0;
556 /* There is only one mic preamplifier, use it effectively. */
557 w = hdaa_widget_get(devinfo, 31);
559 if ((w->wclass.pin.config &
560 HDA_CONFIG_DEFAULTCONF_DEVICE_MASK) ==
561 HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN) {
562 w = hdaa_widget_get(devinfo, 16);
564 w->connsenable[2] = 0;
566 w = hdaa_widget_get(devinfo, 15);
568 w->connsenable[0] = 0;
571 w = hdaa_widget_get(devinfo, 32);
573 if ((w->wclass.pin.config &
574 HDA_CONFIG_DEFAULTCONF_DEVICE_MASK) ==
575 HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN) {
576 w = hdaa_widget_get(devinfo, 16);
578 w->connsenable[0] = 0;
580 w = hdaa_widget_get(devinfo, 15);
582 w->connsenable[1] = 0;
586 if (subid == ASUS_A8X_SUBVENDOR) {
588 * This is just plain ridiculous.. There
589 * are several A8 series that share the same
590 * pci id but works differently (EAPD).
592 w = hdaa_widget_get(devinfo, 26);
593 if (w != NULL && w->type ==
594 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX &&
595 (w->wclass.pin.config &
596 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK) !=
597 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_NONE)
602 case HDA_CODEC_AD1981HD:
604 * This CODEC has very unusual design with several
605 * points inappropriate for the present parser.
607 /* Disable recording from mono playback mix. */
608 w = hdaa_widget_get(devinfo, 21);
610 w->connsenable[3] = 0;
611 /* Disable rear to front mic mixer, use separately. */
612 w = hdaa_widget_get(devinfo, 31);
615 /* Disable direct playback, use mixer. */
616 w = hdaa_widget_get(devinfo, 5);
618 w->connsenable[0] = 0;
619 w = hdaa_widget_get(devinfo, 6);
621 w->connsenable[0] = 0;
622 w = hdaa_widget_get(devinfo, 9);
624 w->connsenable[0] = 0;
625 w = hdaa_widget_get(devinfo, 24);
627 w->connsenable[0] = 0;
629 case HDA_CODEC_ALC269:
631 * ASUS EeePC 1001px has strange variant of ALC269 CODEC,
632 * that mutes speaker if unused mixer at NID 15 is muted.
633 * Probably CODEC incorrectly reports internal connections.
634 * Hide that muter from the driver. There are several CODECs
635 * sharing this ID and I have not enough information about
636 * them to implement more universal solution.
638 if (subid == 0x84371043) {
639 w = hdaa_widget_get(devinfo, 15);
641 w->param.inamp_cap = 0;
644 case HDA_CODEC_CX20582:
645 case HDA_CODEC_CX20583:
646 case HDA_CODEC_CX20584:
647 case HDA_CODEC_CX20585:
648 case HDA_CODEC_CX20590:
650 * These codecs have extra connectivity on record side
651 * too reach for the present parser.
653 w = hdaa_widget_get(devinfo, 20);
655 w->connsenable[1] = 0;
656 w = hdaa_widget_get(devinfo, 21);
658 w->connsenable[1] = 0;
659 w = hdaa_widget_get(devinfo, 22);
661 w->connsenable[0] = 0;
663 case HDA_CODEC_VT1708S_0:
664 case HDA_CODEC_VT1708S_1:
665 case HDA_CODEC_VT1708S_2:
666 case HDA_CODEC_VT1708S_3:
667 case HDA_CODEC_VT1708S_4:
668 case HDA_CODEC_VT1708S_5:
669 case HDA_CODEC_VT1708S_6:
670 case HDA_CODEC_VT1708S_7:
672 * These codecs have hidden mic boost controls.
674 w = hdaa_widget_get(devinfo, 26);
677 (40 << HDA_PARAM_OUTPUT_AMP_CAP_STEPSIZE_SHIFT) |
678 (3 << HDA_PARAM_OUTPUT_AMP_CAP_NUMSTEPS_SHIFT) |
679 (0 << HDA_PARAM_OUTPUT_AMP_CAP_OFFSET_SHIFT);
680 w = hdaa_widget_get(devinfo, 30);
683 (40 << HDA_PARAM_OUTPUT_AMP_CAP_STEPSIZE_SHIFT) |
684 (3 << HDA_PARAM_OUTPUT_AMP_CAP_NUMSTEPS_SHIFT) |
685 (0 << HDA_PARAM_OUTPUT_AMP_CAP_OFFSET_SHIFT);
691 hdaa_patch_direct(struct hdaa_devinfo *devinfo)
693 device_t dev = devinfo->dev;
694 uint32_t id, subid, val;
696 id = hdaa_codec_id(devinfo);
697 subid = hdaa_card_id(devinfo);
700 case HDA_CODEC_VT1708S_0:
701 case HDA_CODEC_VT1708S_1:
702 case HDA_CODEC_VT1708S_2:
703 case HDA_CODEC_VT1708S_3:
704 case HDA_CODEC_VT1708S_4:
705 case HDA_CODEC_VT1708S_5:
706 case HDA_CODEC_VT1708S_6:
707 case HDA_CODEC_VT1708S_7:
708 /* Enable Mic Boost Volume controls. */
709 hda_command(dev, HDA_CMD_12BIT(0, devinfo->nid,
712 case HDA_CODEC_VT1818S:
713 /* Don't bypass mixer. */
714 hda_command(dev, HDA_CMD_12BIT(0, devinfo->nid,
718 if (subid == APPLE_INTEL_MAC)
719 hda_command(dev, HDA_CMD_12BIT(0, devinfo->nid,
721 if (id == HDA_CODEC_ALC269) {
722 if (subid == 0x16e31043 || subid == 0x831a1043 ||
723 subid == 0x834a1043 || subid == 0x83981043 ||
724 subid == 0x83ce1043) {
726 * The ditital mics on some Asus laptops produce
727 * differential signals instead of expected stereo.
728 * That results in silence if downmix it to mono.
729 * To workaround, make codec to handle signal as mono.
731 hda_command(dev, HDA_CMD_SET_COEFF_INDEX(0, 0x20, 0x07));
732 val = hda_command(dev, HDA_CMD_GET_PROCESSING_COEFF(0, 0x20));
733 hda_command(dev, HDA_CMD_SET_COEFF_INDEX(0, 0x20, 0x07));
734 hda_command(dev, HDA_CMD_SET_PROCESSING_COEFF(0, 0x20, val|0x80));