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$");
54 * XXX Force stereo quirk. Monoural recording / playback
55 * on few codecs (especially ALC880) seems broken or
56 * perhaps unsupported.
58 { HDA_MATCH_ALL, HDA_MATCH_ALL,
59 HDAA_QUIRK_FORCESTEREO | HDAA_QUIRK_IVREF, 0,
61 { ACER_ALL_SUBVENDOR, HDA_MATCH_ALL,
64 { ASUS_G2K_SUBVENDOR, HDA_CODEC_ALC660,
67 { ASUS_M5200_SUBVENDOR, HDA_CODEC_ALC880,
70 { ASUS_A7M_SUBVENDOR, HDA_CODEC_ALC880,
73 { ASUS_A7T_SUBVENDOR, HDA_CODEC_ALC882,
76 { ASUS_W2J_SUBVENDOR, HDA_CODEC_ALC882,
79 { ASUS_U5F_SUBVENDOR, HDA_CODEC_AD1986A,
80 HDAA_QUIRK_EAPDINV, 0,
82 { ASUS_A8X_SUBVENDOR, HDA_CODEC_AD1986A,
83 HDAA_QUIRK_EAPDINV, 0,
85 { ASUS_F3JC_SUBVENDOR, HDA_CODEC_ALC861,
88 { UNIWILL_9075_SUBVENDOR, HDA_CODEC_ALC861,
91 /*{ ASUS_M2N_SUBVENDOR, HDA_CODEC_AD1988,
92 HDAA_QUIRK_IVREF80, HDAA_QUIRK_IVREF50 | HDAA_QUIRK_IVREF100,
94 { MEDION_MD95257_SUBVENDOR, HDA_CODEC_ALC880,
97 { LENOVO_3KN100_SUBVENDOR, HDA_CODEC_AD1986A,
98 HDAA_QUIRK_EAPDINV | HDAA_QUIRK_SENSEINV, 0,
100 { SAMSUNG_Q1_SUBVENDOR, HDA_CODEC_AD1986A,
101 HDAA_QUIRK_EAPDINV, 0,
103 { APPLE_MB3_SUBVENDOR, HDA_CODEC_ALC885,
104 HDAA_QUIRK_OVREF50, 0,
106 { APPLE_INTEL_MAC, HDA_CODEC_STAC9221,
108 HDAA_GPIO_SET(0) | HDAA_GPIO_SET(1) },
109 { APPLE_MACBOOKPRO55, HDA_CODEC_CS4206,
111 HDAA_GPIO_SET(1) | HDAA_GPIO_SET(3) },
112 { DELL_D630_SUBVENDOR, HDA_CODEC_STAC9205X,
115 { DELL_V1400_SUBVENDOR, HDA_CODEC_STAC9228X,
118 { DELL_V1500_SUBVENDOR, HDA_CODEC_STAC9205X,
121 { HDA_MATCH_ALL, HDA_CODEC_AD1988,
122 HDAA_QUIRK_IVREF80, HDAA_QUIRK_IVREF50 | HDAA_QUIRK_IVREF100,
124 { HDA_MATCH_ALL, HDA_CODEC_AD1988B,
125 HDAA_QUIRK_IVREF80, HDAA_QUIRK_IVREF50 | HDAA_QUIRK_IVREF100,
127 { HDA_MATCH_ALL, HDA_CODEC_CX20549,
128 0, HDAA_QUIRK_FORCESTEREO,
131 #define HDAC_QUIRKS_LEN (sizeof(hdac_quirks) / sizeof(hdac_quirks[0]))
134 hdac_pin_patch(struct hdaa_widget *w)
136 const char *patch = NULL;
137 uint32_t config, orig, id, subid;
140 config = orig = w->wclass.pin.config;
141 id = hdaa_codec_id(w->devinfo);
142 subid = hdaa_subvendor_id(w->devinfo);
144 /* XXX: Old patches require complete review.
145 * Now they may create more problem then solve due to
146 * incorrect associations.
148 if (id == HDA_CODEC_ALC880 && subid == LG_LW20_SUBVENDOR) {
151 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK;
152 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_IN;
155 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK;
156 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT;
161 } else if (id == HDA_CODEC_ALC880 &&
162 (subid == CLEVO_D900T_SUBVENDOR ||
163 subid == ASUS_M5200_SUBVENDOR)) {
169 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK;
170 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN;
172 case 25: /* XXX MIC2 */
173 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK;
174 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN;
177 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK;
178 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_IN;
180 case 27: /* XXX LINE2 */
181 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK;
182 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_IN;
185 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK;
186 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_CD;
189 } else if (id == HDA_CODEC_ALC883 &&
190 (subid == MSI_MS034A_SUBVENDOR ||
191 HDA_DEV_MATCH(ACER_ALL_SUBVENDOR, subid))) {
194 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
195 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
196 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN |
197 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED);
200 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
201 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
202 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_CD |
203 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED);
206 } else if (id == HDA_CODEC_CX20549 && subid ==
207 HP_V3000_SUBVENDOR) {
210 config &= ~HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK;
211 config |= HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_NONE;
214 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
215 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
216 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN |
217 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED);
220 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
221 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
222 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_CD |
223 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED);
226 } else if (id == HDA_CODEC_CX20551 && subid ==
227 HP_DV5000_SUBVENDOR) {
231 config &= ~HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK;
232 config |= HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_NONE;
235 } else if (id == HDA_CODEC_ALC861 && subid ==
236 ASUS_W6F_SUBVENDOR) {
239 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
240 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
241 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_OUT |
242 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED);
249 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
250 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
251 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN |
252 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED);
255 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
256 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
257 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT |
258 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_JACK);
261 } else if (id == HDA_CODEC_ALC861 && subid ==
262 UNIWILL_9075_SUBVENDOR) {
265 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
266 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
267 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT |
268 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_JACK);
274 if (id == HDA_CODEC_AD1986A &&
275 (subid == ASUS_M2NPVMX_SUBVENDOR ||
276 subid == ASUS_A8NVMCSM_SUBVENDOR ||
277 subid == ASUS_P5PL2_SUBVENDOR)) {
279 case 26: /* Headphones with redirection */
280 patch = "as=1 seq=15";
282 case 28: /* 5.1 out => 2.0 out + 1 input */
283 patch = "device=Line-in as=8 seq=1";
285 case 29: /* Can't use this as input, as the only available mic
286 * preamplifier is busy by front panel mic (nid 31).
287 * If you want to use this rear connector as mic input,
288 * you have to disable the front panel one. */
291 case 31: /* Lot of inputs configured with as=15 and unusable */
292 patch = "as=8 seq=3";
295 patch = "as=8 seq=4";
298 patch = "as=8 seq=5";
301 patch = "as=8 seq=6";
304 } else if (id == HDA_CODEC_ALC260 &&
305 HDA_DEV_MATCH(SONY_S5_SUBVENDOR, subid)) {
308 patch = "seq=15 device=Headphones";
311 } else if (id == HDA_CODEC_ALC268) {
312 if (subid == ACER_T5320_SUBVENDOR) {
314 case 20: /* Headphones Jack */
315 patch = "as=1 seq=15";
319 } else if (id == HDA_CODEC_CX20561 &&
320 subid == LENOVO_B450_SUBVENDOR) {
323 patch = "as=1 seq=15";
329 config = hdaa_widget_pin_patch(config, patch);
332 device_printf(w->devinfo->dev,
333 "Patching pin config nid=%u 0x%08x -> 0x%08x\n",
336 w->wclass.pin.config = config;
340 hdaa_widget_patch(struct hdaa_widget *w)
342 struct hdaa_devinfo *devinfo = w->devinfo;
346 orig = w->param.widget_cap;
347 /* On some codecs beeper is an input pin, but it is not recordable
348 alone. Also most of BIOSes does not declare beeper pin.
349 Change beeper pin node type to beeper to help parser. */
350 switch (hdaa_codec_id(devinfo)) {
351 case HDA_CODEC_AD1882:
352 case HDA_CODEC_AD1883:
353 case HDA_CODEC_AD1984:
354 case HDA_CODEC_AD1984A:
355 case HDA_CODEC_AD1984B:
356 case HDA_CODEC_AD1987:
357 case HDA_CODEC_AD1988:
358 case HDA_CODEC_AD1988B:
359 case HDA_CODEC_AD1989B:
362 case HDA_CODEC_ALC260:
366 if (hda_get_vendor_id(devinfo->dev) == REALTEK_VENDORID &&
367 hdaa_codec_id(devinfo) != HDA_CODEC_ALC260)
369 if (w->nid == beeper) {
370 w->param.widget_cap &= ~HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_MASK;
371 w->param.widget_cap |= HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_BEEP_WIDGET <<
372 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_SHIFT;
376 if (w->param.widget_cap != orig) {
377 device_printf(w->devinfo->dev,
378 "Patching widget caps nid=%u 0x%08x -> 0x%08x\n",
379 w->nid, orig, w->param.widget_cap);
383 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX)
388 hdaa_patch(struct hdaa_devinfo *devinfo)
390 struct hdaa_widget *w;
394 id = hdaa_codec_id(devinfo);
395 subid = hdaa_subvendor_id(devinfo);
400 for (i = 0; i < HDAC_QUIRKS_LEN; i++) {
401 if (!(HDA_DEV_MATCH(hdac_quirks[i].model, subid) &&
402 HDA_DEV_MATCH(hdac_quirks[i].id, id)))
404 if (hdac_quirks[i].set != 0)
407 if (hdac_quirks[i].unset != 0)
409 ~(hdac_quirks[i].unset);
412 /* Apply per-widget patch. */
413 for (i = devinfo->startnode; i < devinfo->endnode; i++) {
414 w = hdaa_widget_get(devinfo, i);
417 hdaa_widget_patch(w);
421 case HDA_CODEC_AD1983:
423 * This CODEC has several possible usages, but none
424 * fit the parser best. Help parser to choose better.
426 /* Disable direct unmixed playback to get pcm volume. */
427 w = hdaa_widget_get(devinfo, 5);
429 w->connsenable[0] = 0;
430 w = hdaa_widget_get(devinfo, 6);
432 w->connsenable[0] = 0;
433 w = hdaa_widget_get(devinfo, 11);
435 w->connsenable[0] = 0;
436 /* Disable mic and line selectors. */
437 w = hdaa_widget_get(devinfo, 12);
439 w->connsenable[1] = 0;
440 w = hdaa_widget_get(devinfo, 13);
442 w->connsenable[1] = 0;
443 /* Disable recording from mono playback mix. */
444 w = hdaa_widget_get(devinfo, 20);
446 w->connsenable[3] = 0;
448 case HDA_CODEC_AD1986A:
450 * This CODEC has overcomplicated input mixing.
451 * Make some cleaning there.
453 /* Disable input mono mixer. Not needed and not supported. */
454 w = hdaa_widget_get(devinfo, 43);
457 /* Disable any with any input mixing mesh. Use separately. */
458 w = hdaa_widget_get(devinfo, 39);
461 w = hdaa_widget_get(devinfo, 40);
464 w = hdaa_widget_get(devinfo, 41);
467 w = hdaa_widget_get(devinfo, 42);
470 /* Disable duplicate mixer node connector. */
471 w = hdaa_widget_get(devinfo, 15);
473 w->connsenable[3] = 0;
474 /* There is only one mic preamplifier, use it effectively. */
475 w = hdaa_widget_get(devinfo, 31);
477 if ((w->wclass.pin.config &
478 HDA_CONFIG_DEFAULTCONF_DEVICE_MASK) ==
479 HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN) {
480 w = hdaa_widget_get(devinfo, 16);
482 w->connsenable[2] = 0;
484 w = hdaa_widget_get(devinfo, 15);
486 w->connsenable[0] = 0;
489 w = hdaa_widget_get(devinfo, 32);
491 if ((w->wclass.pin.config &
492 HDA_CONFIG_DEFAULTCONF_DEVICE_MASK) ==
493 HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN) {
494 w = hdaa_widget_get(devinfo, 16);
496 w->connsenable[0] = 0;
498 w = hdaa_widget_get(devinfo, 15);
500 w->connsenable[1] = 0;
504 if (subid == ASUS_A8X_SUBVENDOR) {
506 * This is just plain ridiculous.. There
507 * are several A8 series that share the same
508 * pci id but works differently (EAPD).
510 w = hdaa_widget_get(devinfo, 26);
511 if (w != NULL && w->type ==
512 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX &&
513 (w->wclass.pin.config &
514 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK) !=
515 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_NONE)
520 case HDA_CODEC_AD1981HD:
522 * This CODEC has very unusual design with several
523 * points inappropriate for the present parser.
525 /* Disable recording from mono playback mix. */
526 w = hdaa_widget_get(devinfo, 21);
528 w->connsenable[3] = 0;
529 /* Disable rear to front mic mixer, use separately. */
530 w = hdaa_widget_get(devinfo, 31);
533 /* Disable direct playback, use mixer. */
534 w = hdaa_widget_get(devinfo, 5);
536 w->connsenable[0] = 0;
537 w = hdaa_widget_get(devinfo, 6);
539 w->connsenable[0] = 0;
540 w = hdaa_widget_get(devinfo, 9);
542 w->connsenable[0] = 0;
543 w = hdaa_widget_get(devinfo, 24);
545 w->connsenable[0] = 0;
547 case HDA_CODEC_CX20582:
548 case HDA_CODEC_CX20583:
549 case HDA_CODEC_CX20584:
550 case HDA_CODEC_CX20585:
551 case HDA_CODEC_CX20590:
553 * These codecs have extra connectivity on record side
554 * too reach for the present parser.
556 w = hdaa_widget_get(devinfo, 20);
558 w->connsenable[1] = 0;
559 w = hdaa_widget_get(devinfo, 21);
561 w->connsenable[1] = 0;
562 w = hdaa_widget_get(devinfo, 22);
564 w->connsenable[0] = 0;
566 case HDA_CODEC_VT1708S_0:
567 case HDA_CODEC_VT1708S_1:
568 case HDA_CODEC_VT1708S_2:
569 case HDA_CODEC_VT1708S_3:
570 case HDA_CODEC_VT1708S_4:
571 case HDA_CODEC_VT1708S_5:
572 case HDA_CODEC_VT1708S_6:
573 case HDA_CODEC_VT1708S_7:
575 * These codecs have hidden mic boost controls.
577 w = hdaa_widget_get(devinfo, 26);
580 (40 << HDA_PARAM_OUTPUT_AMP_CAP_STEPSIZE_SHIFT) |
581 (3 << HDA_PARAM_OUTPUT_AMP_CAP_NUMSTEPS_SHIFT) |
582 (0 << HDA_PARAM_OUTPUT_AMP_CAP_OFFSET_SHIFT);
583 w = hdaa_widget_get(devinfo, 30);
586 (40 << HDA_PARAM_OUTPUT_AMP_CAP_STEPSIZE_SHIFT) |
587 (3 << HDA_PARAM_OUTPUT_AMP_CAP_NUMSTEPS_SHIFT) |
588 (0 << HDA_PARAM_OUTPUT_AMP_CAP_OFFSET_SHIFT);
594 hdaa_patch_direct(struct hdaa_devinfo *devinfo)
596 device_t dev = devinfo->dev;
597 uint32_t id, subid, val;
599 id = hdaa_codec_id(devinfo);
600 subid = hdaa_subvendor_id(devinfo);
603 case HDA_CODEC_VT1708S_0:
604 case HDA_CODEC_VT1708S_1:
605 case HDA_CODEC_VT1708S_2:
606 case HDA_CODEC_VT1708S_3:
607 case HDA_CODEC_VT1708S_4:
608 case HDA_CODEC_VT1708S_5:
609 case HDA_CODEC_VT1708S_6:
610 case HDA_CODEC_VT1708S_7:
611 /* Enable Mic Boost Volume controls. */
612 hda_command(dev, HDA_CMD_12BIT(0, devinfo->nid,
614 /* Don't bypass mixer. */
615 hda_command(dev, HDA_CMD_12BIT(0, devinfo->nid,
619 if (subid == APPLE_INTEL_MAC)
620 hda_command(dev, HDA_CMD_12BIT(0, devinfo->nid,
622 if (id == HDA_CODEC_ALC269) {
623 if (subid == 0x16e31043 || subid == 0x831a1043 ||
624 subid == 0x834a1043 || subid == 0x83981043 ||
625 subid == 0x83ce1043) {
627 * The ditital mics on some Asus laptops produce
628 * differential signals instead of expected stereo.
629 * That results in silence if downmix it to mono.
630 * To workaround, make codec to handle signal as mono.
632 hda_command(dev, HDA_CMD_SET_COEFF_INDEX(0, 0x20, 0x07));
633 val = hda_command(dev, HDA_CMD_GET_PROCESSING_COEFF(0, 0x20));
634 hda_command(dev, HDA_CMD_SET_COEFF_INDEX(0, 0x20, 0x07));
635 hda_command(dev, HDA_CMD_SET_PROCESSING_COEFF(0, 0x20, val|0x80));