xref: /freebsd/sys/dev/sound/pci/hda/hdac.c (revision 4ed925457ab06e83238a5db33e89ccc94b99a713)
1 /*-
2  * Copyright (c) 2006 Stephane E. Potvin <sepotvin@videotron.ca>
3  * Copyright (c) 2006 Ariff Abdullah <ariff@FreeBSD.org>
4  * Copyright (c) 2008 Alexander Motin <mav@FreeBSD.org>
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
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.
15  *
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
26  * SUCH DAMAGE.
27  */
28 
29 /*
30  * Intel High Definition Audio (Controller) driver for FreeBSD. Be advised
31  * that this driver still in its early stage, and possible of rewrite are
32  * pretty much guaranteed. There are supposedly several distinct parent/child
33  * busses to make this "perfect", but as for now and for the sake of
34  * simplicity, everything is gobble up within single source.
35  *
36  * List of subsys:
37  *     1) HDA Controller support
38  *     2) HDA Codecs support, which may include
39  *        - HDA
40  *        - Modem
41  *     3) Widget parser - the real magic of why this driver works on so
42  *        many hardwares with minimal vendor specific quirk. The original
43  *        parser was written using Ruby and can be found at
44  *        http://people.freebsd.org/~ariff/HDA/parser.rb . This crude
45  *        ruby parser take the verbose dmesg dump as its input. Refer to
46  *        http://www.microsoft.com/whdc/device/audio/default.mspx for various
47  *        interesting documents, especially UAA (Universal Audio Architecture).
48  *     4) Possible vendor specific support.
49  *        (snd_hda_intel, snd_hda_ati, etc..)
50  *
51  * Thanks to Ahmad Ubaidah Omar @ Defenxis Sdn. Bhd. for the
52  * Compaq V3000 with Conexant HDA.
53  *
54  *    * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
55  *    *                                                                 *
56  *    *        This driver is a collaborative effort made by:           *
57  *    *                                                                 *
58  *    *          Stephane E. Potvin <sepotvin@videotron.ca>             *
59  *    *               Andrea Bittau <a.bittau@cs.ucl.ac.uk>             *
60  *    *               Wesley Morgan <morganw@chemikals.org>             *
61  *    *              Daniel Eischen <deischen@FreeBSD.org>              *
62  *    *             Maxime Guillaud <bsd-ports@mguillaud.net>           *
63  *    *              Ariff Abdullah <ariff@FreeBSD.org>                 *
64  *    *             Alexander Motin <mav@FreeBSD.org>                   *
65  *    *                                                                 *
66  *    *   ....and various people from freebsd-multimedia@FreeBSD.org    *
67  *    *                                                                 *
68  *    * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
69  */
70 
71 #ifdef HAVE_KERNEL_OPTION_HEADERS
72 #include "opt_snd.h"
73 #endif
74 
75 #include <dev/sound/pcm/sound.h>
76 #include <dev/pci/pcireg.h>
77 #include <dev/pci/pcivar.h>
78 
79 #include <sys/ctype.h>
80 #include <sys/taskqueue.h>
81 
82 #include <dev/sound/pci/hda/hdac_private.h>
83 #include <dev/sound/pci/hda/hdac_reg.h>
84 #include <dev/sound/pci/hda/hda_reg.h>
85 #include <dev/sound/pci/hda/hdac.h>
86 
87 #include "mixer_if.h"
88 
89 #define HDA_DRV_TEST_REV	"20100122_0141"
90 
91 SND_DECLARE_FILE("$FreeBSD$");
92 
93 #define HDA_BOOTVERBOSE(stmt)	do {			\
94 	if (bootverbose != 0 || snd_verbose > 3) {	\
95 		stmt					\
96 	}						\
97 } while (0)
98 
99 #define HDA_BOOTHVERBOSE(stmt)	do {			\
100 	if (snd_verbose > 3) {				\
101 		stmt					\
102 	}						\
103 } while (0)
104 
105 #if 1
106 #undef HDAC_INTR_EXTRA
107 #define HDAC_INTR_EXTRA		1
108 #endif
109 
110 #define hdac_lock(sc)		snd_mtxlock((sc)->lock)
111 #define hdac_unlock(sc)		snd_mtxunlock((sc)->lock)
112 #define hdac_lockassert(sc)	snd_mtxassert((sc)->lock)
113 #define hdac_lockowned(sc)	mtx_owned((sc)->lock)
114 
115 #define HDA_FLAG_MATCH(fl, v)	(((fl) & (v)) == (v))
116 #define HDA_DEV_MATCH(fl, v)	((fl) == (v) || \
117 				(fl) == 0xffffffff || \
118 				(((fl) & 0xffff0000) == 0xffff0000 && \
119 				((fl) & 0x0000ffff) == ((v) & 0x0000ffff)) || \
120 				(((fl) & 0x0000ffff) == 0x0000ffff && \
121 				((fl) & 0xffff0000) == ((v) & 0xffff0000)))
122 #define HDA_MATCH_ALL		0xffffffff
123 #define HDAC_INVALID		0xffffffff
124 
125 /* Default controller / jack sense poll: 250ms */
126 #define HDAC_POLL_INTERVAL	max(hz >> 2, 1)
127 
128 /*
129  * Make room for possible 4096 playback/record channels, in 100 years to come.
130  */
131 #define HDAC_TRIGGER_NONE	0x00000000
132 #define HDAC_TRIGGER_PLAY	0x00000fff
133 #define HDAC_TRIGGER_REC	0x00fff000
134 #define HDAC_TRIGGER_UNSOL	0x80000000
135 
136 #define HDA_MODEL_CONSTRUCT(vendor, model)	\
137 		(((uint32_t)(model) << 16) | ((vendor##_VENDORID) & 0xffff))
138 
139 /* Controller models */
140 
141 /* Intel */
142 #define INTEL_VENDORID		0x8086
143 #define HDA_INTEL_82801F	HDA_MODEL_CONSTRUCT(INTEL, 0x2668)
144 #define HDA_INTEL_63XXESB	HDA_MODEL_CONSTRUCT(INTEL, 0x269a)
145 #define HDA_INTEL_82801G	HDA_MODEL_CONSTRUCT(INTEL, 0x27d8)
146 #define HDA_INTEL_82801H	HDA_MODEL_CONSTRUCT(INTEL, 0x284b)
147 #define HDA_INTEL_82801I	HDA_MODEL_CONSTRUCT(INTEL, 0x293e)
148 #define HDA_INTEL_82801JI	HDA_MODEL_CONSTRUCT(INTEL, 0x3a3e)
149 #define HDA_INTEL_82801JD	HDA_MODEL_CONSTRUCT(INTEL, 0x3a6e)
150 #define HDA_INTEL_PCH		HDA_MODEL_CONSTRUCT(INTEL, 0x3b56)
151 #define HDA_INTEL_SCH		HDA_MODEL_CONSTRUCT(INTEL, 0x811b)
152 #define HDA_INTEL_ALL		HDA_MODEL_CONSTRUCT(INTEL, 0xffff)
153 
154 /* Nvidia */
155 #define NVIDIA_VENDORID		0x10de
156 #define HDA_NVIDIA_MCP51	HDA_MODEL_CONSTRUCT(NVIDIA, 0x026c)
157 #define HDA_NVIDIA_MCP55	HDA_MODEL_CONSTRUCT(NVIDIA, 0x0371)
158 #define HDA_NVIDIA_MCP61_1	HDA_MODEL_CONSTRUCT(NVIDIA, 0x03e4)
159 #define HDA_NVIDIA_MCP61_2	HDA_MODEL_CONSTRUCT(NVIDIA, 0x03f0)
160 #define HDA_NVIDIA_MCP65_1	HDA_MODEL_CONSTRUCT(NVIDIA, 0x044a)
161 #define HDA_NVIDIA_MCP65_2	HDA_MODEL_CONSTRUCT(NVIDIA, 0x044b)
162 #define HDA_NVIDIA_MCP67_1	HDA_MODEL_CONSTRUCT(NVIDIA, 0x055c)
163 #define HDA_NVIDIA_MCP67_2	HDA_MODEL_CONSTRUCT(NVIDIA, 0x055d)
164 #define HDA_NVIDIA_MCP78_1	HDA_MODEL_CONSTRUCT(NVIDIA, 0x0774)
165 #define HDA_NVIDIA_MCP78_2	HDA_MODEL_CONSTRUCT(NVIDIA, 0x0775)
166 #define HDA_NVIDIA_MCP78_3	HDA_MODEL_CONSTRUCT(NVIDIA, 0x0776)
167 #define HDA_NVIDIA_MCP78_4	HDA_MODEL_CONSTRUCT(NVIDIA, 0x0777)
168 #define HDA_NVIDIA_MCP73_1	HDA_MODEL_CONSTRUCT(NVIDIA, 0x07fc)
169 #define HDA_NVIDIA_MCP73_2	HDA_MODEL_CONSTRUCT(NVIDIA, 0x07fd)
170 #define HDA_NVIDIA_MCP79_1	HDA_MODEL_CONSTRUCT(NVIDIA, 0x0ac0)
171 #define HDA_NVIDIA_MCP79_2	HDA_MODEL_CONSTRUCT(NVIDIA, 0x0ac1)
172 #define HDA_NVIDIA_MCP79_3	HDA_MODEL_CONSTRUCT(NVIDIA, 0x0ac2)
173 #define HDA_NVIDIA_MCP79_4	HDA_MODEL_CONSTRUCT(NVIDIA, 0x0ac3)
174 #define HDA_NVIDIA_MCP89_1	HDA_MODEL_CONSTRUCT(NVIDIA, 0x0d94)
175 #define HDA_NVIDIA_MCP89_2	HDA_MODEL_CONSTRUCT(NVIDIA, 0x0d95)
176 #define HDA_NVIDIA_MCP89_3	HDA_MODEL_CONSTRUCT(NVIDIA, 0x0d96)
177 #define HDA_NVIDIA_MCP89_4	HDA_MODEL_CONSTRUCT(NVIDIA, 0x0d97)
178 #define HDA_NVIDIA_ALL		HDA_MODEL_CONSTRUCT(NVIDIA, 0xffff)
179 
180 /* ATI */
181 #define ATI_VENDORID		0x1002
182 #define HDA_ATI_SB450		HDA_MODEL_CONSTRUCT(ATI, 0x437b)
183 #define HDA_ATI_SB600		HDA_MODEL_CONSTRUCT(ATI, 0x4383)
184 #define HDA_ATI_RS600		HDA_MODEL_CONSTRUCT(ATI, 0x793b)
185 #define HDA_ATI_RS690		HDA_MODEL_CONSTRUCT(ATI, 0x7919)
186 #define HDA_ATI_RS780		HDA_MODEL_CONSTRUCT(ATI, 0x960f)
187 #define HDA_ATI_R600		HDA_MODEL_CONSTRUCT(ATI, 0xaa00)
188 #define HDA_ATI_RV630		HDA_MODEL_CONSTRUCT(ATI, 0xaa08)
189 #define HDA_ATI_RV610		HDA_MODEL_CONSTRUCT(ATI, 0xaa10)
190 #define HDA_ATI_RV670		HDA_MODEL_CONSTRUCT(ATI, 0xaa18)
191 #define HDA_ATI_RV635		HDA_MODEL_CONSTRUCT(ATI, 0xaa20)
192 #define HDA_ATI_RV620		HDA_MODEL_CONSTRUCT(ATI, 0xaa28)
193 #define HDA_ATI_RV770		HDA_MODEL_CONSTRUCT(ATI, 0xaa30)
194 #define HDA_ATI_RV730		HDA_MODEL_CONSTRUCT(ATI, 0xaa38)
195 #define HDA_ATI_RV710		HDA_MODEL_CONSTRUCT(ATI, 0xaa40)
196 #define HDA_ATI_RV740		HDA_MODEL_CONSTRUCT(ATI, 0xaa48)
197 #define HDA_ATI_ALL		HDA_MODEL_CONSTRUCT(ATI, 0xffff)
198 
199 /* VIA */
200 #define VIA_VENDORID		0x1106
201 #define HDA_VIA_VT82XX		HDA_MODEL_CONSTRUCT(VIA, 0x3288)
202 #define HDA_VIA_ALL		HDA_MODEL_CONSTRUCT(VIA, 0xffff)
203 
204 /* SiS */
205 #define SIS_VENDORID		0x1039
206 #define HDA_SIS_966		HDA_MODEL_CONSTRUCT(SIS, 0x7502)
207 #define HDA_SIS_ALL		HDA_MODEL_CONSTRUCT(SIS, 0xffff)
208 
209 /* ULI */
210 #define ULI_VENDORID		0x10b9
211 #define HDA_ULI_M5461		HDA_MODEL_CONSTRUCT(ULI, 0x5461)
212 #define HDA_ULI_ALL		HDA_MODEL_CONSTRUCT(ULI, 0xffff)
213 
214 /* OEM/subvendors */
215 
216 /* Intel */
217 #define INTEL_D101GGC_SUBVENDOR	HDA_MODEL_CONSTRUCT(INTEL, 0xd600)
218 
219 /* HP/Compaq */
220 #define HP_VENDORID		0x103c
221 #define HP_V3000_SUBVENDOR	HDA_MODEL_CONSTRUCT(HP, 0x30b5)
222 #define HP_NX7400_SUBVENDOR	HDA_MODEL_CONSTRUCT(HP, 0x30a2)
223 #define HP_NX6310_SUBVENDOR	HDA_MODEL_CONSTRUCT(HP, 0x30aa)
224 #define HP_NX6325_SUBVENDOR	HDA_MODEL_CONSTRUCT(HP, 0x30b0)
225 #define HP_XW4300_SUBVENDOR	HDA_MODEL_CONSTRUCT(HP, 0x3013)
226 #define HP_3010_SUBVENDOR	HDA_MODEL_CONSTRUCT(HP, 0x3010)
227 #define HP_DV5000_SUBVENDOR	HDA_MODEL_CONSTRUCT(HP, 0x30a5)
228 #define HP_DC7700S_SUBVENDOR	HDA_MODEL_CONSTRUCT(HP, 0x2801)
229 #define HP_DC7700_SUBVENDOR	HDA_MODEL_CONSTRUCT(HP, 0x2802)
230 #define HP_ALL_SUBVENDOR	HDA_MODEL_CONSTRUCT(HP, 0xffff)
231 /* What is wrong with XN 2563 anyway? (Got the picture ?) */
232 #define HP_NX6325_SUBVENDORX	0x103c30b0
233 
234 /* Dell */
235 #define DELL_VENDORID		0x1028
236 #define DELL_D630_SUBVENDOR	HDA_MODEL_CONSTRUCT(DELL, 0x01f9)
237 #define DELL_D820_SUBVENDOR	HDA_MODEL_CONSTRUCT(DELL, 0x01cc)
238 #define DELL_V1400_SUBVENDOR	HDA_MODEL_CONSTRUCT(DELL, 0x0227)
239 #define DELL_V1500_SUBVENDOR	HDA_MODEL_CONSTRUCT(DELL, 0x0228)
240 #define DELL_I1300_SUBVENDOR	HDA_MODEL_CONSTRUCT(DELL, 0x01c9)
241 #define DELL_XPSM1210_SUBVENDOR	HDA_MODEL_CONSTRUCT(DELL, 0x01d7)
242 #define DELL_OPLX745_SUBVENDOR	HDA_MODEL_CONSTRUCT(DELL, 0x01da)
243 #define DELL_ALL_SUBVENDOR	HDA_MODEL_CONSTRUCT(DELL, 0xffff)
244 
245 /* Clevo */
246 #define CLEVO_VENDORID		0x1558
247 #define CLEVO_D900T_SUBVENDOR	HDA_MODEL_CONSTRUCT(CLEVO, 0x0900)
248 #define CLEVO_ALL_SUBVENDOR	HDA_MODEL_CONSTRUCT(CLEVO, 0xffff)
249 
250 /* Acer */
251 #define ACER_VENDORID		0x1025
252 #define ACER_A5050_SUBVENDOR	HDA_MODEL_CONSTRUCT(ACER, 0x010f)
253 #define ACER_A4520_SUBVENDOR	HDA_MODEL_CONSTRUCT(ACER, 0x0127)
254 #define ACER_A4710_SUBVENDOR	HDA_MODEL_CONSTRUCT(ACER, 0x012f)
255 #define ACER_A4715_SUBVENDOR	HDA_MODEL_CONSTRUCT(ACER, 0x0133)
256 #define ACER_3681WXM_SUBVENDOR	HDA_MODEL_CONSTRUCT(ACER, 0x0110)
257 #define ACER_T6292_SUBVENDOR	HDA_MODEL_CONSTRUCT(ACER, 0x011b)
258 #define ACER_T5320_SUBVENDOR	HDA_MODEL_CONSTRUCT(ACER, 0x011f)
259 #define ACER_ALL_SUBVENDOR	HDA_MODEL_CONSTRUCT(ACER, 0xffff)
260 
261 /* Asus */
262 #define ASUS_VENDORID		0x1043
263 #define ASUS_A8X_SUBVENDOR	HDA_MODEL_CONSTRUCT(ASUS, 0x1153)
264 #define ASUS_U5F_SUBVENDOR	HDA_MODEL_CONSTRUCT(ASUS, 0x1263)
265 #define ASUS_W6F_SUBVENDOR	HDA_MODEL_CONSTRUCT(ASUS, 0x1263)
266 #define ASUS_A7M_SUBVENDOR	HDA_MODEL_CONSTRUCT(ASUS, 0x1323)
267 #define ASUS_F3JC_SUBVENDOR	HDA_MODEL_CONSTRUCT(ASUS, 0x1338)
268 #define ASUS_G2K_SUBVENDOR	HDA_MODEL_CONSTRUCT(ASUS, 0x1339)
269 #define ASUS_A7T_SUBVENDOR	HDA_MODEL_CONSTRUCT(ASUS, 0x13c2)
270 #define ASUS_W2J_SUBVENDOR	HDA_MODEL_CONSTRUCT(ASUS, 0x1971)
271 #define ASUS_M5200_SUBVENDOR	HDA_MODEL_CONSTRUCT(ASUS, 0x1993)
272 #define ASUS_P5PL2_SUBVENDOR	HDA_MODEL_CONSTRUCT(ASUS, 0x817f)
273 #define ASUS_P1AH2_SUBVENDOR	HDA_MODEL_CONSTRUCT(ASUS, 0x81cb)
274 #define ASUS_M2NPVMX_SUBVENDOR	HDA_MODEL_CONSTRUCT(ASUS, 0x81cb)
275 #define ASUS_M2V_SUBVENDOR	HDA_MODEL_CONSTRUCT(ASUS, 0x81e7)
276 #define ASUS_P5BWD_SUBVENDOR	HDA_MODEL_CONSTRUCT(ASUS, 0x81ec)
277 #define ASUS_M2N_SUBVENDOR	HDA_MODEL_CONSTRUCT(ASUS, 0x8234)
278 #define ASUS_A8NVMCSM_SUBVENDOR	HDA_MODEL_CONSTRUCT(NVIDIA, 0xcb84)
279 #define ASUS_ALL_SUBVENDOR	HDA_MODEL_CONSTRUCT(ASUS, 0xffff)
280 
281 /* IBM / Lenovo */
282 #define IBM_VENDORID		0x1014
283 #define IBM_M52_SUBVENDOR	HDA_MODEL_CONSTRUCT(IBM, 0x02f6)
284 #define IBM_ALL_SUBVENDOR	HDA_MODEL_CONSTRUCT(IBM, 0xffff)
285 
286 /* Lenovo */
287 #define LENOVO_VENDORID		0x17aa
288 #define LENOVO_3KN100_SUBVENDOR	HDA_MODEL_CONSTRUCT(LENOVO, 0x2066)
289 #define LENOVO_3KN200_SUBVENDOR	HDA_MODEL_CONSTRUCT(LENOVO, 0x384e)
290 #define LENOVO_TCA55_SUBVENDOR	HDA_MODEL_CONSTRUCT(LENOVO, 0x1015)
291 #define LENOVO_ALL_SUBVENDOR	HDA_MODEL_CONSTRUCT(LENOVO, 0xffff)
292 
293 /* Samsung */
294 #define SAMSUNG_VENDORID	0x144d
295 #define SAMSUNG_Q1_SUBVENDOR	HDA_MODEL_CONSTRUCT(SAMSUNG, 0xc027)
296 #define SAMSUNG_ALL_SUBVENDOR	HDA_MODEL_CONSTRUCT(SAMSUNG, 0xffff)
297 
298 /* Medion ? */
299 #define MEDION_VENDORID			0x161f
300 #define MEDION_MD95257_SUBVENDOR	HDA_MODEL_CONSTRUCT(MEDION, 0x203d)
301 #define MEDION_ALL_SUBVENDOR		HDA_MODEL_CONSTRUCT(MEDION, 0xffff)
302 
303 /* Apple Computer Inc. */
304 #define APPLE_VENDORID		0x106b
305 #define APPLE_MB3_SUBVENDOR	HDA_MODEL_CONSTRUCT(APPLE, 0x00a1)
306 
307 /* Sony */
308 #define SONY_VENDORID		0x104d
309 #define SONY_S5_SUBVENDOR	HDA_MODEL_CONSTRUCT(SONY, 0x81cc)
310 #define SONY_ALL_SUBVENDOR	HDA_MODEL_CONSTRUCT(SONY, 0xffff)
311 
312 /*
313  * Apple Intel MacXXXX seems using Sigmatel codec/vendor id
314  * instead of their own, which is beyond my comprehension
315  * (see HDA_CODEC_STAC9221 below).
316  */
317 #define APPLE_INTEL_MAC		0x76808384
318 #define APPLE_MACBOOKPRO55	0xcb7910de
319 
320 /* LG Electronics */
321 #define LG_VENDORID		0x1854
322 #define LG_LW20_SUBVENDOR	HDA_MODEL_CONSTRUCT(LG, 0x0018)
323 #define LG_ALL_SUBVENDOR	HDA_MODEL_CONSTRUCT(LG, 0xffff)
324 
325 /* Fujitsu Siemens */
326 #define FS_VENDORID		0x1734
327 #define FS_PA1510_SUBVENDOR	HDA_MODEL_CONSTRUCT(FS, 0x10b8)
328 #define FS_SI1848_SUBVENDOR	HDA_MODEL_CONSTRUCT(FS, 0x10cd)
329 #define FS_ALL_SUBVENDOR	HDA_MODEL_CONSTRUCT(FS, 0xffff)
330 
331 /* Fujitsu Limited */
332 #define FL_VENDORID		0x10cf
333 #define FL_S7020D_SUBVENDOR	HDA_MODEL_CONSTRUCT(FL, 0x1326)
334 #define FL_U1010_SUBVENDOR	HDA_MODEL_CONSTRUCT(FL, 0x142d)
335 #define FL_ALL_SUBVENDOR	HDA_MODEL_CONSTRUCT(FL, 0xffff)
336 
337 /* Toshiba */
338 #define TOSHIBA_VENDORID	0x1179
339 #define TOSHIBA_U200_SUBVENDOR	HDA_MODEL_CONSTRUCT(TOSHIBA, 0x0001)
340 #define TOSHIBA_A135_SUBVENDOR	HDA_MODEL_CONSTRUCT(TOSHIBA, 0xff01)
341 #define TOSHIBA_ALL_SUBVENDOR	HDA_MODEL_CONSTRUCT(TOSHIBA, 0xffff)
342 
343 /* Micro-Star International (MSI) */
344 #define MSI_VENDORID		0x1462
345 #define MSI_MS1034_SUBVENDOR	HDA_MODEL_CONSTRUCT(MSI, 0x0349)
346 #define MSI_MS034A_SUBVENDOR	HDA_MODEL_CONSTRUCT(MSI, 0x034a)
347 #define MSI_ALL_SUBVENDOR	HDA_MODEL_CONSTRUCT(MSI, 0xffff)
348 
349 /* Giga-Byte Technology */
350 #define GB_VENDORID		0x1458
351 #define GB_G33S2H_SUBVENDOR	HDA_MODEL_CONSTRUCT(GB, 0xa022)
352 #define GP_ALL_SUBVENDOR	HDA_MODEL_CONSTRUCT(GB, 0xffff)
353 
354 /* Uniwill ? */
355 #define UNIWILL_VENDORID	0x1584
356 #define UNIWILL_9075_SUBVENDOR	HDA_MODEL_CONSTRUCT(UNIWILL, 0x9075)
357 #define UNIWILL_9080_SUBVENDOR	HDA_MODEL_CONSTRUCT(UNIWILL, 0x9080)
358 
359 
360 /* Misc constants.. */
361 #define HDA_AMP_VOL_DEFAULT	(-1)
362 #define HDA_AMP_MUTE_DEFAULT	(0xffffffff)
363 #define HDA_AMP_MUTE_NONE	(0)
364 #define HDA_AMP_MUTE_LEFT	(1 << 0)
365 #define HDA_AMP_MUTE_RIGHT	(1 << 1)
366 #define HDA_AMP_MUTE_ALL	(HDA_AMP_MUTE_LEFT | HDA_AMP_MUTE_RIGHT)
367 
368 #define HDA_AMP_LEFT_MUTED(v)	((v) & (HDA_AMP_MUTE_LEFT))
369 #define HDA_AMP_RIGHT_MUTED(v)	(((v) & HDA_AMP_MUTE_RIGHT) >> 1)
370 
371 #define HDA_ADC_MONITOR		(1 << 0)
372 
373 #define HDA_CTL_OUT		1
374 #define HDA_CTL_IN		2
375 
376 #define HDA_GPIO_MAX		8
377 /* 0 - 7 = GPIO , 8 = Flush */
378 #define HDA_QUIRK_GPIO0		(1 << 0)
379 #define HDA_QUIRK_GPIO1		(1 << 1)
380 #define HDA_QUIRK_GPIO2		(1 << 2)
381 #define HDA_QUIRK_GPIO3		(1 << 3)
382 #define HDA_QUIRK_GPIO4		(1 << 4)
383 #define HDA_QUIRK_GPIO5		(1 << 5)
384 #define HDA_QUIRK_GPIO6		(1 << 6)
385 #define HDA_QUIRK_GPIO7		(1 << 7)
386 #define HDA_QUIRK_GPIOFLUSH	(1 << 8)
387 
388 /* 9 - 25 = anything else */
389 #define HDA_QUIRK_SOFTPCMVOL	(1 << 9)
390 #define HDA_QUIRK_FIXEDRATE	(1 << 10)
391 #define HDA_QUIRK_FORCESTEREO	(1 << 11)
392 #define HDA_QUIRK_EAPDINV	(1 << 12)
393 #define HDA_QUIRK_DMAPOS	(1 << 13)
394 #define HDA_QUIRK_SENSEINV	(1 << 14)
395 
396 /* 26 - 31 = vrefs */
397 #define HDA_QUIRK_IVREF50	(1 << 26)
398 #define HDA_QUIRK_IVREF80	(1 << 27)
399 #define HDA_QUIRK_IVREF100	(1 << 28)
400 #define HDA_QUIRK_OVREF50	(1 << 29)
401 #define HDA_QUIRK_OVREF80	(1 << 30)
402 #define HDA_QUIRK_OVREF100	(1 << 31)
403 
404 #define HDA_QUIRK_IVREF		(HDA_QUIRK_IVREF50 | HDA_QUIRK_IVREF80 | \
405 							HDA_QUIRK_IVREF100)
406 #define HDA_QUIRK_OVREF		(HDA_QUIRK_OVREF50 | HDA_QUIRK_OVREF80 | \
407 							HDA_QUIRK_OVREF100)
408 #define HDA_QUIRK_VREF		(HDA_QUIRK_IVREF | HDA_QUIRK_OVREF)
409 
410 #if __FreeBSD_version < 600000
411 #define taskqueue_drain(...)
412 #endif
413 
414 static const struct {
415 	char *key;
416 	uint32_t value;
417 } hdac_quirks_tab[] = {
418 	{ "gpio0", HDA_QUIRK_GPIO0 },
419 	{ "gpio1", HDA_QUIRK_GPIO1 },
420 	{ "gpio2", HDA_QUIRK_GPIO2 },
421 	{ "gpio3", HDA_QUIRK_GPIO3 },
422 	{ "gpio4", HDA_QUIRK_GPIO4 },
423 	{ "gpio5", HDA_QUIRK_GPIO5 },
424 	{ "gpio6", HDA_QUIRK_GPIO6 },
425 	{ "gpio7", HDA_QUIRK_GPIO7 },
426 	{ "gpioflush", HDA_QUIRK_GPIOFLUSH },
427 	{ "softpcmvol", HDA_QUIRK_SOFTPCMVOL },
428 	{ "fixedrate", HDA_QUIRK_FIXEDRATE },
429 	{ "forcestereo", HDA_QUIRK_FORCESTEREO },
430 	{ "eapdinv", HDA_QUIRK_EAPDINV },
431 	{ "dmapos", HDA_QUIRK_DMAPOS },
432 	{ "senseinv", HDA_QUIRK_SENSEINV },
433 	{ "ivref50", HDA_QUIRK_IVREF50 },
434 	{ "ivref80", HDA_QUIRK_IVREF80 },
435 	{ "ivref100", HDA_QUIRK_IVREF100 },
436 	{ "ovref50", HDA_QUIRK_OVREF50 },
437 	{ "ovref80", HDA_QUIRK_OVREF80 },
438 	{ "ovref100", HDA_QUIRK_OVREF100 },
439 	{ "ivref", HDA_QUIRK_IVREF },
440 	{ "ovref", HDA_QUIRK_OVREF },
441 	{ "vref", HDA_QUIRK_VREF },
442 };
443 #define HDAC_QUIRKS_TAB_LEN	\
444 		(sizeof(hdac_quirks_tab) / sizeof(hdac_quirks_tab[0]))
445 
446 #define HDA_BDL_MIN	2
447 #define HDA_BDL_MAX	256
448 #define HDA_BDL_DEFAULT	HDA_BDL_MIN
449 
450 #define HDA_BLK_MIN	HDAC_DMA_ALIGNMENT
451 #define HDA_BLK_ALIGN	(~(HDA_BLK_MIN - 1))
452 
453 #define HDA_BUFSZ_MIN		4096
454 #define HDA_BUFSZ_MAX		65536
455 #define HDA_BUFSZ_DEFAULT	16384
456 
457 #define HDA_PARSE_MAXDEPTH	10
458 
459 #define HDAC_UNSOLTAG_EVENT_HP		0x00
460 
461 MALLOC_DEFINE(M_HDAC, "hdac", "High Definition Audio Controller");
462 
463 const char *HDA_COLORS[16] = {"Unknown", "Black", "Grey", "Blue", "Green", "Red",
464     "Orange", "Yellow", "Purple", "Pink", "Res.A", "Res.B", "Res.C", "Res.D",
465     "White", "Other"};
466 
467 const char *HDA_DEVS[16] = {"Line-out", "Speaker", "Headphones", "CD",
468     "SPDIF-out", "Digital-out", "Modem-line", "Modem-handset", "Line-in",
469     "AUX", "Mic", "Telephony", "SPDIF-in", "Digital-in", "Res.E", "Other"};
470 
471 const char *HDA_CONNS[4] = {"Jack", "None", "Fixed", "Both"};
472 
473 /* Default */
474 static uint32_t hdac_fmt[] = {
475 	SND_FORMAT(AFMT_S16_LE, 2, 0),
476 	0
477 };
478 
479 static struct pcmchan_caps hdac_caps = {48000, 48000, hdac_fmt, 0};
480 
481 #define HDAC_NO_MSI	1
482 #define HDAC_NO_64BIT	2
483 
484 static const struct {
485 	uint32_t	model;
486 	char		*desc;
487 	char		flags;
488 } hdac_devices[] = {
489 	{ HDA_INTEL_82801F,  "Intel 82801F",	0 },
490 	{ HDA_INTEL_63XXESB, "Intel 631x/632xESB",	0 },
491 	{ HDA_INTEL_82801G,  "Intel 82801G",	0 },
492 	{ HDA_INTEL_82801H,  "Intel 82801H",	0 },
493 	{ HDA_INTEL_82801I,  "Intel 82801I",	0 },
494 	{ HDA_INTEL_82801JI, "Intel 82801JI",	0 },
495 	{ HDA_INTEL_82801JD, "Intel 82801JD",	0 },
496 	{ HDA_INTEL_PCH,     "Intel PCH",	0 },
497 	{ HDA_INTEL_SCH,     "Intel SCH",	0 },
498 	{ HDA_NVIDIA_MCP51,  "NVidia MCP51",	HDAC_NO_MSI },
499 	{ HDA_NVIDIA_MCP55,  "NVidia MCP55",	HDAC_NO_MSI },
500 	{ HDA_NVIDIA_MCP61_1, "NVidia MCP61",	0 },
501 	{ HDA_NVIDIA_MCP61_2, "NVidia MCP61",	0 },
502 	{ HDA_NVIDIA_MCP65_1, "NVidia MCP65",	0 },
503 	{ HDA_NVIDIA_MCP65_2, "NVidia MCP65",	0 },
504 	{ HDA_NVIDIA_MCP67_1, "NVidia MCP67",	0 },
505 	{ HDA_NVIDIA_MCP67_2, "NVidia MCP67",	0 },
506 	{ HDA_NVIDIA_MCP73_1, "NVidia MCP73",	0 },
507 	{ HDA_NVIDIA_MCP73_2, "NVidia MCP73",	0 },
508 	{ HDA_NVIDIA_MCP78_1, "NVidia MCP78",	HDAC_NO_64BIT },
509 	{ HDA_NVIDIA_MCP78_2, "NVidia MCP78",	HDAC_NO_64BIT },
510 	{ HDA_NVIDIA_MCP78_3, "NVidia MCP78",	HDAC_NO_64BIT },
511 	{ HDA_NVIDIA_MCP78_4, "NVidia MCP78",	HDAC_NO_64BIT },
512 	{ HDA_NVIDIA_MCP79_1, "NVidia MCP79",	0 },
513 	{ HDA_NVIDIA_MCP79_2, "NVidia MCP79",	0 },
514 	{ HDA_NVIDIA_MCP79_3, "NVidia MCP79",	0 },
515 	{ HDA_NVIDIA_MCP79_4, "NVidia MCP79",	0 },
516 	{ HDA_NVIDIA_MCP89_1, "NVidia MCP89",	0 },
517 	{ HDA_NVIDIA_MCP89_2, "NVidia MCP89",	0 },
518 	{ HDA_NVIDIA_MCP89_3, "NVidia MCP89",	0 },
519 	{ HDA_NVIDIA_MCP89_4, "NVidia MCP89",	0 },
520 	{ HDA_ATI_SB450,     "ATI SB450",	0 },
521 	{ HDA_ATI_SB600,     "ATI SB600",	0 },
522 	{ HDA_ATI_RS600,     "ATI RS600",	0 },
523 	{ HDA_ATI_RS690,     "ATI RS690",	0 },
524 	{ HDA_ATI_RS780,     "ATI RS780",	0 },
525 	{ HDA_ATI_R600,      "ATI R600",	0 },
526 	{ HDA_ATI_RV610,     "ATI RV610",	0 },
527 	{ HDA_ATI_RV620,     "ATI RV620",	0 },
528 	{ HDA_ATI_RV630,     "ATI RV630",	0 },
529 	{ HDA_ATI_RV635,     "ATI RV635",	0 },
530 	{ HDA_ATI_RV710,     "ATI RV710",	0 },
531 	{ HDA_ATI_RV730,     "ATI RV730",	0 },
532 	{ HDA_ATI_RV740,     "ATI RV740",	0 },
533 	{ HDA_ATI_RV770,     "ATI RV770",	0 },
534 	{ HDA_VIA_VT82XX,    "VIA VT8251/8237A",0 },
535 	{ HDA_SIS_966,       "SiS 966",		0 },
536 	{ HDA_ULI_M5461,     "ULI M5461",	0 },
537 	/* Unknown */
538 	{ HDA_INTEL_ALL,  "Intel (Unknown)"  },
539 	{ HDA_NVIDIA_ALL, "NVidia (Unknown)" },
540 	{ HDA_ATI_ALL,    "ATI (Unknown)"    },
541 	{ HDA_VIA_ALL,    "VIA (Unknown)"    },
542 	{ HDA_SIS_ALL,    "SiS (Unknown)"    },
543 	{ HDA_ULI_ALL,    "ULI (Unknown)"    },
544 };
545 #define HDAC_DEVICES_LEN (sizeof(hdac_devices) / sizeof(hdac_devices[0]))
546 
547 static const struct {
548 	uint16_t vendor;
549 	uint8_t reg;
550 	uint8_t mask;
551 	uint8_t enable;
552 } hdac_pcie_snoop[] = {
553 	{  INTEL_VENDORID, 0x00, 0x00, 0x00 },
554 	{    ATI_VENDORID, 0x42, 0xf8, 0x02 },
555 	{ NVIDIA_VENDORID, 0x4e, 0xf0, 0x0f },
556 };
557 #define HDAC_PCIESNOOP_LEN	\
558 			(sizeof(hdac_pcie_snoop) / sizeof(hdac_pcie_snoop[0]))
559 
560 static const struct {
561 	uint32_t	rate;
562 	int		valid;
563 	uint16_t	base;
564 	uint16_t	mul;
565 	uint16_t	div;
566 } hda_rate_tab[] = {
567 	{   8000, 1, 0x0000, 0x0000, 0x0500 },	/* (48000 * 1) / 6 */
568 	{   9600, 0, 0x0000, 0x0000, 0x0400 },	/* (48000 * 1) / 5 */
569 	{  12000, 0, 0x0000, 0x0000, 0x0300 },	/* (48000 * 1) / 4 */
570 	{  16000, 1, 0x0000, 0x0000, 0x0200 },	/* (48000 * 1) / 3 */
571 	{  18000, 0, 0x0000, 0x1000, 0x0700 },	/* (48000 * 3) / 8 */
572 	{  19200, 0, 0x0000, 0x0800, 0x0400 },	/* (48000 * 2) / 5 */
573 	{  24000, 0, 0x0000, 0x0000, 0x0100 },	/* (48000 * 1) / 2 */
574 	{  28800, 0, 0x0000, 0x1000, 0x0400 },	/* (48000 * 3) / 5 */
575 	{  32000, 1, 0x0000, 0x0800, 0x0200 },	/* (48000 * 2) / 3 */
576 	{  36000, 0, 0x0000, 0x1000, 0x0300 },	/* (48000 * 3) / 4 */
577 	{  38400, 0, 0x0000, 0x1800, 0x0400 },	/* (48000 * 4) / 5 */
578 	{  48000, 1, 0x0000, 0x0000, 0x0000 },	/* (48000 * 1) / 1 */
579 	{  64000, 0, 0x0000, 0x1800, 0x0200 },	/* (48000 * 4) / 3 */
580 	{  72000, 0, 0x0000, 0x1000, 0x0100 },	/* (48000 * 3) / 2 */
581 	{  96000, 1, 0x0000, 0x0800, 0x0000 },	/* (48000 * 2) / 1 */
582 	{ 144000, 0, 0x0000, 0x1000, 0x0000 },	/* (48000 * 3) / 1 */
583 	{ 192000, 1, 0x0000, 0x1800, 0x0000 },	/* (48000 * 4) / 1 */
584 	{   8820, 0, 0x4000, 0x0000, 0x0400 },	/* (44100 * 1) / 5 */
585 	{  11025, 1, 0x4000, 0x0000, 0x0300 },	/* (44100 * 1) / 4 */
586 	{  12600, 0, 0x4000, 0x0800, 0x0600 },	/* (44100 * 2) / 7 */
587 	{  14700, 0, 0x4000, 0x0000, 0x0200 },	/* (44100 * 1) / 3 */
588 	{  17640, 0, 0x4000, 0x0800, 0x0400 },	/* (44100 * 2) / 5 */
589 	{  18900, 0, 0x4000, 0x1000, 0x0600 },	/* (44100 * 3) / 7 */
590 	{  22050, 1, 0x4000, 0x0000, 0x0100 },	/* (44100 * 1) / 2 */
591 	{  25200, 0, 0x4000, 0x1800, 0x0600 },	/* (44100 * 4) / 7 */
592 	{  26460, 0, 0x4000, 0x1000, 0x0400 },	/* (44100 * 3) / 5 */
593 	{  29400, 0, 0x4000, 0x0800, 0x0200 },	/* (44100 * 2) / 3 */
594 	{  33075, 0, 0x4000, 0x1000, 0x0300 },	/* (44100 * 3) / 4 */
595 	{  35280, 0, 0x4000, 0x1800, 0x0400 },	/* (44100 * 4) / 5 */
596 	{  44100, 1, 0x4000, 0x0000, 0x0000 },	/* (44100 * 1) / 1 */
597 	{  58800, 0, 0x4000, 0x1800, 0x0200 },	/* (44100 * 4) / 3 */
598 	{  66150, 0, 0x4000, 0x1000, 0x0100 },	/* (44100 * 3) / 2 */
599 	{  88200, 1, 0x4000, 0x0800, 0x0000 },	/* (44100 * 2) / 1 */
600 	{ 132300, 0, 0x4000, 0x1000, 0x0000 },	/* (44100 * 3) / 1 */
601 	{ 176400, 1, 0x4000, 0x1800, 0x0000 },	/* (44100 * 4) / 1 */
602 };
603 #define HDA_RATE_TAB_LEN (sizeof(hda_rate_tab) / sizeof(hda_rate_tab[0]))
604 
605 /* All codecs you can eat... */
606 #define HDA_CODEC_CONSTRUCT(vendor, id) \
607 		(((uint32_t)(vendor##_VENDORID) << 16) | ((id) & 0xffff))
608 
609 /* Cirrus Logic */
610 #define CIRRUSLOGIC_VENDORID	0x1013
611 #define HDA_CODEC_CS4206	HDA_CODEC_CONSTRUCT(CIRRUSLOGIC, 0x4206)
612 #define HDA_CODEC_CS4207	HDA_CODEC_CONSTRUCT(CIRRUSLOGIC, 0x4207)
613 #define HDA_CODEC_CSXXXX	HDA_CODEC_CONSTRUCT(CIRRUSLOGIC, 0xffff)
614 
615 /* Realtek */
616 #define REALTEK_VENDORID	0x10ec
617 #define HDA_CODEC_ALC260	HDA_CODEC_CONSTRUCT(REALTEK, 0x0260)
618 #define HDA_CODEC_ALC262	HDA_CODEC_CONSTRUCT(REALTEK, 0x0262)
619 #define HDA_CODEC_ALC267	HDA_CODEC_CONSTRUCT(REALTEK, 0x0267)
620 #define HDA_CODEC_ALC268	HDA_CODEC_CONSTRUCT(REALTEK, 0x0268)
621 #define HDA_CODEC_ALC269	HDA_CODEC_CONSTRUCT(REALTEK, 0x0269)
622 #define HDA_CODEC_ALC272	HDA_CODEC_CONSTRUCT(REALTEK, 0x0272)
623 #define HDA_CODEC_ALC660	HDA_CODEC_CONSTRUCT(REALTEK, 0x0660)
624 #define HDA_CODEC_ALC662	HDA_CODEC_CONSTRUCT(REALTEK, 0x0662)
625 #define HDA_CODEC_ALC663	HDA_CODEC_CONSTRUCT(REALTEK, 0x0663)
626 #define HDA_CODEC_ALC861	HDA_CODEC_CONSTRUCT(REALTEK, 0x0861)
627 #define HDA_CODEC_ALC861VD	HDA_CODEC_CONSTRUCT(REALTEK, 0x0862)
628 #define HDA_CODEC_ALC880	HDA_CODEC_CONSTRUCT(REALTEK, 0x0880)
629 #define HDA_CODEC_ALC882	HDA_CODEC_CONSTRUCT(REALTEK, 0x0882)
630 #define HDA_CODEC_ALC883	HDA_CODEC_CONSTRUCT(REALTEK, 0x0883)
631 #define HDA_CODEC_ALC885	HDA_CODEC_CONSTRUCT(REALTEK, 0x0885)
632 #define HDA_CODEC_ALC887	HDA_CODEC_CONSTRUCT(REALTEK, 0x0887)
633 #define HDA_CODEC_ALC888	HDA_CODEC_CONSTRUCT(REALTEK, 0x0888)
634 #define HDA_CODEC_ALC889	HDA_CODEC_CONSTRUCT(REALTEK, 0x0889)
635 #define HDA_CODEC_ALCXXXX	HDA_CODEC_CONSTRUCT(REALTEK, 0xffff)
636 
637 /* Analog Devices */
638 #define ANALOGDEVICES_VENDORID	0x11d4
639 #define HDA_CODEC_AD1884A	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x184a)
640 #define HDA_CODEC_AD1882	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1882)
641 #define HDA_CODEC_AD1883	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1883)
642 #define HDA_CODEC_AD1884	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1884)
643 #define HDA_CODEC_AD1984A	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x194a)
644 #define HDA_CODEC_AD1984B	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x194b)
645 #define HDA_CODEC_AD1981HD	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1981)
646 #define HDA_CODEC_AD1983	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1983)
647 #define HDA_CODEC_AD1984	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1984)
648 #define HDA_CODEC_AD1986A	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1986)
649 #define HDA_CODEC_AD1987	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1987)
650 #define HDA_CODEC_AD1988	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1988)
651 #define HDA_CODEC_AD1988B	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x198b)
652 #define HDA_CODEC_AD1882A	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x882a)
653 #define HDA_CODEC_AD1989B	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x989b)
654 #define HDA_CODEC_ADXXXX	HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0xffff)
655 
656 /* CMedia */
657 #define CMEDIA_VENDORID		0x434d
658 #define HDA_CODEC_CMI9880	HDA_CODEC_CONSTRUCT(CMEDIA, 0x4980)
659 #define HDA_CODEC_CMIXXXX	HDA_CODEC_CONSTRUCT(CMEDIA, 0xffff)
660 
661 /* Sigmatel */
662 #define SIGMATEL_VENDORID	0x8384
663 #define HDA_CODEC_STAC9230X	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7612)
664 #define HDA_CODEC_STAC9230D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7613)
665 #define HDA_CODEC_STAC9229X	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7614)
666 #define HDA_CODEC_STAC9229D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7615)
667 #define HDA_CODEC_STAC9228X	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7616)
668 #define HDA_CODEC_STAC9228D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7617)
669 #define HDA_CODEC_STAC9227X	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7618)
670 #define HDA_CODEC_STAC9227D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7619)
671 #define HDA_CODEC_STAC9274	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7620)
672 #define HDA_CODEC_STAC9274D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7621)
673 #define HDA_CODEC_STAC9273X	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7622)
674 #define HDA_CODEC_STAC9273D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7623)
675 #define HDA_CODEC_STAC9272X	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7624)
676 #define HDA_CODEC_STAC9272D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7625)
677 #define HDA_CODEC_STAC9271X	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7626)
678 #define HDA_CODEC_STAC9271D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7627)
679 #define HDA_CODEC_STAC9274X5NH	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7628)
680 #define HDA_CODEC_STAC9274D5NH	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7629)
681 #define HDA_CODEC_STAC9250	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7634)
682 #define HDA_CODEC_STAC9251	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7636)
683 #define HDA_CODEC_IDT92HD700X	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7638)
684 #define HDA_CODEC_IDT92HD700D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7639)
685 #define HDA_CODEC_IDT92HD206X	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7645)
686 #define HDA_CODEC_IDT92HD206D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7646)
687 #define HDA_CODEC_CXD9872RDK	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7661)
688 #define HDA_CODEC_STAC9872AK	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7662)
689 #define HDA_CODEC_CXD9872AKD	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7664)
690 #define HDA_CODEC_STAC9221	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7680)
691 #define HDA_CODEC_STAC922XD	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7681)
692 #define HDA_CODEC_STAC9221_A2	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7682)
693 #define HDA_CODEC_STAC9221D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7683)
694 #define HDA_CODEC_STAC9220	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7690)
695 #define HDA_CODEC_STAC9200D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7691)
696 #define HDA_CODEC_IDT92HD005	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7698)
697 #define HDA_CODEC_IDT92HD005D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7699)
698 #define HDA_CODEC_STAC9205X	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a0)
699 #define HDA_CODEC_STAC9205D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a1)
700 #define HDA_CODEC_STAC9204X	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a2)
701 #define HDA_CODEC_STAC9204D	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a3)
702 #define HDA_CODEC_STAC9220_A2	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7880)
703 #define HDA_CODEC_STAC9220_A1	HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7882)
704 #define HDA_CODEC_STACXXXX	HDA_CODEC_CONSTRUCT(SIGMATEL, 0xffff)
705 
706 /* IDT */
707 #define IDT_VENDORID		0x111d
708 #define HDA_CODEC_IDT92HD75BX	HDA_CODEC_CONSTRUCT(IDT, 0x7603)
709 #define HDA_CODEC_IDT92HD83C1X	HDA_CODEC_CONSTRUCT(IDT, 0x7604)
710 #define HDA_CODEC_IDT92HD81B1X	HDA_CODEC_CONSTRUCT(IDT, 0x7605)
711 #define HDA_CODEC_IDT92HD75B3	HDA_CODEC_CONSTRUCT(IDT, 0x7608)
712 #define HDA_CODEC_IDT92HD73D1	HDA_CODEC_CONSTRUCT(IDT, 0x7674)
713 #define HDA_CODEC_IDT92HD73C1	HDA_CODEC_CONSTRUCT(IDT, 0x7675)
714 #define HDA_CODEC_IDT92HD73E1	HDA_CODEC_CONSTRUCT(IDT, 0x7676)
715 #define HDA_CODEC_IDT92HD71B8	HDA_CODEC_CONSTRUCT(IDT, 0x76b0)
716 #define HDA_CODEC_IDT92HD71B7	HDA_CODEC_CONSTRUCT(IDT, 0x76b2)
717 #define HDA_CODEC_IDT92HD71B5	HDA_CODEC_CONSTRUCT(IDT, 0x76b6)
718 #define HDA_CODEC_IDT92HD83C1C	HDA_CODEC_CONSTRUCT(IDT, 0x76d4)
719 #define HDA_CODEC_IDT92HD81B1C	HDA_CODEC_CONSTRUCT(IDT, 0x76d5)
720 #define HDA_CODEC_IDTXXXX	HDA_CODEC_CONSTRUCT(IDT, 0xffff)
721 
722 /* Silicon Image */
723 #define SII_VENDORID	0x1095
724 #define HDA_CODEC_SII1390	HDA_CODEC_CONSTRUCT(SII, 0x1390)
725 #define HDA_CODEC_SII1392	HDA_CODEC_CONSTRUCT(SII, 0x1392)
726 #define HDA_CODEC_SIIXXXX	HDA_CODEC_CONSTRUCT(SII, 0xffff)
727 
728 /* Lucent/Agere */
729 #define AGERE_VENDORID	0x11c1
730 #define HDA_CODEC_AGEREXXXX	HDA_CODEC_CONSTRUCT(AGERE, 0xffff)
731 
732 /* Conexant */
733 #define CONEXANT_VENDORID	0x14f1
734 #define HDA_CODEC_CX20549	HDA_CODEC_CONSTRUCT(CONEXANT, 0x5045)
735 #define HDA_CODEC_CX20551	HDA_CODEC_CONSTRUCT(CONEXANT, 0x5047)
736 #define HDA_CODEC_CX20561	HDA_CODEC_CONSTRUCT(CONEXANT, 0x5051)
737 #define HDA_CODEC_CX20582	HDA_CODEC_CONSTRUCT(CONEXANT, 0x5066)
738 #define HDA_CODEC_CXXXXX	HDA_CODEC_CONSTRUCT(CONEXANT, 0xffff)
739 
740 /* VIA */
741 #define HDA_CODEC_VT1708_8	HDA_CODEC_CONSTRUCT(VIA, 0x1708)
742 #define HDA_CODEC_VT1708_9	HDA_CODEC_CONSTRUCT(VIA, 0x1709)
743 #define HDA_CODEC_VT1708_A	HDA_CODEC_CONSTRUCT(VIA, 0x170a)
744 #define HDA_CODEC_VT1708_B	HDA_CODEC_CONSTRUCT(VIA, 0x170b)
745 #define HDA_CODEC_VT1709_0	HDA_CODEC_CONSTRUCT(VIA, 0xe710)
746 #define HDA_CODEC_VT1709_1	HDA_CODEC_CONSTRUCT(VIA, 0xe711)
747 #define HDA_CODEC_VT1709_2	HDA_CODEC_CONSTRUCT(VIA, 0xe712)
748 #define HDA_CODEC_VT1709_3	HDA_CODEC_CONSTRUCT(VIA, 0xe713)
749 #define HDA_CODEC_VT1709_4	HDA_CODEC_CONSTRUCT(VIA, 0xe714)
750 #define HDA_CODEC_VT1709_5	HDA_CODEC_CONSTRUCT(VIA, 0xe715)
751 #define HDA_CODEC_VT1709_6	HDA_CODEC_CONSTRUCT(VIA, 0xe716)
752 #define HDA_CODEC_VT1709_7	HDA_CODEC_CONSTRUCT(VIA, 0xe717)
753 #define HDA_CODEC_VT1708B_0	HDA_CODEC_CONSTRUCT(VIA, 0xe720)
754 #define HDA_CODEC_VT1708B_1	HDA_CODEC_CONSTRUCT(VIA, 0xe721)
755 #define HDA_CODEC_VT1708B_2	HDA_CODEC_CONSTRUCT(VIA, 0xe722)
756 #define HDA_CODEC_VT1708B_3	HDA_CODEC_CONSTRUCT(VIA, 0xe723)
757 #define HDA_CODEC_VT1708B_4	HDA_CODEC_CONSTRUCT(VIA, 0xe724)
758 #define HDA_CODEC_VT1708B_5	HDA_CODEC_CONSTRUCT(VIA, 0xe725)
759 #define HDA_CODEC_VT1708B_6	HDA_CODEC_CONSTRUCT(VIA, 0xe726)
760 #define HDA_CODEC_VT1708B_7	HDA_CODEC_CONSTRUCT(VIA, 0xe727)
761 #define HDA_CODEC_VT1708S_0	HDA_CODEC_CONSTRUCT(VIA, 0x0397)
762 #define HDA_CODEC_VT1708S_1	HDA_CODEC_CONSTRUCT(VIA, 0x1397)
763 #define HDA_CODEC_VT1708S_2	HDA_CODEC_CONSTRUCT(VIA, 0x2397)
764 #define HDA_CODEC_VT1708S_3	HDA_CODEC_CONSTRUCT(VIA, 0x3397)
765 #define HDA_CODEC_VT1708S_4	HDA_CODEC_CONSTRUCT(VIA, 0x4397)
766 #define HDA_CODEC_VT1708S_5	HDA_CODEC_CONSTRUCT(VIA, 0x5397)
767 #define HDA_CODEC_VT1708S_6	HDA_CODEC_CONSTRUCT(VIA, 0x6397)
768 #define HDA_CODEC_VT1708S_7	HDA_CODEC_CONSTRUCT(VIA, 0x7397)
769 #define HDA_CODEC_VT1702_0	HDA_CODEC_CONSTRUCT(VIA, 0x0398)
770 #define HDA_CODEC_VT1702_1	HDA_CODEC_CONSTRUCT(VIA, 0x1398)
771 #define HDA_CODEC_VT1702_2	HDA_CODEC_CONSTRUCT(VIA, 0x2398)
772 #define HDA_CODEC_VT1702_3	HDA_CODEC_CONSTRUCT(VIA, 0x3398)
773 #define HDA_CODEC_VT1702_4	HDA_CODEC_CONSTRUCT(VIA, 0x4398)
774 #define HDA_CODEC_VT1702_5	HDA_CODEC_CONSTRUCT(VIA, 0x5398)
775 #define HDA_CODEC_VT1702_6	HDA_CODEC_CONSTRUCT(VIA, 0x6398)
776 #define HDA_CODEC_VT1702_7	HDA_CODEC_CONSTRUCT(VIA, 0x7398)
777 #define HDA_CODEC_VT1716S_0	HDA_CODEC_CONSTRUCT(VIA, 0x0433)
778 #define HDA_CODEC_VT1716S_1	HDA_CODEC_CONSTRUCT(VIA, 0xa721)
779 #define HDA_CODEC_VT1718S_0	HDA_CODEC_CONSTRUCT(VIA, 0x0428)
780 #define HDA_CODEC_VT1718S_1	HDA_CODEC_CONSTRUCT(VIA, 0x4428)
781 #define HDA_CODEC_VT1812	HDA_CODEC_CONSTRUCT(VIA, 0x0448)
782 #define HDA_CODEC_VT1818S	HDA_CODEC_CONSTRUCT(VIA, 0x0440)
783 #define HDA_CODEC_VT1828S	HDA_CODEC_CONSTRUCT(VIA, 0x4441)
784 #define HDA_CODEC_VT2002P_0	HDA_CODEC_CONSTRUCT(VIA, 0x0438)
785 #define HDA_CODEC_VT2002P_1	HDA_CODEC_CONSTRUCT(VIA, 0x4438)
786 #define HDA_CODEC_VT2020	HDA_CODEC_CONSTRUCT(VIA, 0x0441)
787 #define HDA_CODEC_VTXXXX	HDA_CODEC_CONSTRUCT(VIA, 0xffff)
788 
789 /* ATI */
790 #define HDA_CODEC_ATIRS600_1	HDA_CODEC_CONSTRUCT(ATI, 0x793c)
791 #define HDA_CODEC_ATIRS600_2	HDA_CODEC_CONSTRUCT(ATI, 0x7919)
792 #define HDA_CODEC_ATIRS690	HDA_CODEC_CONSTRUCT(ATI, 0x791a)
793 #define HDA_CODEC_ATIR6XX	HDA_CODEC_CONSTRUCT(ATI, 0xaa01)
794 #define HDA_CODEC_ATIXXXX	HDA_CODEC_CONSTRUCT(ATI, 0xffff)
795 
796 /* NVIDIA */
797 #define HDA_CODEC_NVIDIAMCP78	HDA_CODEC_CONSTRUCT(NVIDIA, 0x0002)
798 #define HDA_CODEC_NVIDIAMCP78_2	HDA_CODEC_CONSTRUCT(NVIDIA, 0x0006)
799 #define HDA_CODEC_NVIDIAMCP7A	HDA_CODEC_CONSTRUCT(NVIDIA, 0x0007)
800 #define HDA_CODEC_NVIDIAMCP67	HDA_CODEC_CONSTRUCT(NVIDIA, 0x0067)
801 #define HDA_CODEC_NVIDIAMCP73	HDA_CODEC_CONSTRUCT(NVIDIA, 0x8001)
802 #define HDA_CODEC_NVIDIAXXXX	HDA_CODEC_CONSTRUCT(NVIDIA, 0xffff)
803 
804 /* INTEL */
805 #define HDA_CODEC_INTELG45_1	HDA_CODEC_CONSTRUCT(INTEL, 0x2801)
806 #define HDA_CODEC_INTELG45_2	HDA_CODEC_CONSTRUCT(INTEL, 0x2802)
807 #define HDA_CODEC_INTELG45_3	HDA_CODEC_CONSTRUCT(INTEL, 0x2803)
808 #define HDA_CODEC_INTELG45_4	HDA_CODEC_CONSTRUCT(INTEL, 0x29fb)
809 #define HDA_CODEC_INTELQ57	HDA_CODEC_CONSTRUCT(INTEL, 0x0054)
810 #define HDA_CODEC_INTELXXXX	HDA_CODEC_CONSTRUCT(INTEL, 0xffff)
811 
812 /* Codecs */
813 static const struct {
814 	uint32_t id;
815 	char *name;
816 } hdac_codecs[] = {
817 	{ HDA_CODEC_CS4206,    "Cirrus Logic CS4206" },
818 	{ HDA_CODEC_CS4207,    "Cirrus Logic CS4207" },
819 	{ HDA_CODEC_ALC260,    "Realtek ALC260" },
820 	{ HDA_CODEC_ALC262,    "Realtek ALC262" },
821 	{ HDA_CODEC_ALC267,    "Realtek ALC267" },
822 	{ HDA_CODEC_ALC268,    "Realtek ALC268" },
823 	{ HDA_CODEC_ALC269,    "Realtek ALC269" },
824 	{ HDA_CODEC_ALC272,    "Realtek ALC272" },
825 	{ HDA_CODEC_ALC660,    "Realtek ALC660" },
826 	{ HDA_CODEC_ALC662,    "Realtek ALC662" },
827 	{ HDA_CODEC_ALC663,    "Realtek ALC663" },
828 	{ HDA_CODEC_ALC861,    "Realtek ALC861" },
829 	{ HDA_CODEC_ALC861VD,  "Realtek ALC861-VD" },
830 	{ HDA_CODEC_ALC880,    "Realtek ALC880" },
831 	{ HDA_CODEC_ALC882,    "Realtek ALC882" },
832 	{ HDA_CODEC_ALC883,    "Realtek ALC883" },
833 	{ HDA_CODEC_ALC885,    "Realtek ALC885" },
834 	{ HDA_CODEC_ALC887,    "Realtek ALC887" },
835 	{ HDA_CODEC_ALC888,    "Realtek ALC888" },
836 	{ HDA_CODEC_ALC889,    "Realtek ALC889" },
837 	{ HDA_CODEC_AD1882,    "Analog Devices AD1882" },
838 	{ HDA_CODEC_AD1882A,   "Analog Devices AD1882A" },
839 	{ HDA_CODEC_AD1883,    "Analog Devices AD1883" },
840 	{ HDA_CODEC_AD1884,    "Analog Devices AD1884" },
841 	{ HDA_CODEC_AD1884A,   "Analog Devices AD1884A" },
842 	{ HDA_CODEC_AD1981HD,  "Analog Devices AD1981HD" },
843 	{ HDA_CODEC_AD1983,    "Analog Devices AD1983" },
844 	{ HDA_CODEC_AD1984,    "Analog Devices AD1984" },
845 	{ HDA_CODEC_AD1984A,   "Analog Devices AD1984A" },
846 	{ HDA_CODEC_AD1984B,   "Analog Devices AD1984B" },
847 	{ HDA_CODEC_AD1986A,   "Analog Devices AD1986A" },
848 	{ HDA_CODEC_AD1987,    "Analog Devices AD1987" },
849 	{ HDA_CODEC_AD1988,    "Analog Devices AD1988A" },
850 	{ HDA_CODEC_AD1988B,   "Analog Devices AD1988B" },
851 	{ HDA_CODEC_AD1989B,   "Analog Devices AD1989B" },
852 	{ HDA_CODEC_CMI9880,   "CMedia CMI9880" },
853 	{ HDA_CODEC_CXD9872RDK, "Sigmatel CXD9872RD/K" },
854 	{ HDA_CODEC_CXD9872AKD, "Sigmatel CXD9872AKD" },
855 	{ HDA_CODEC_STAC9200D, "Sigmatel STAC9200D" },
856 	{ HDA_CODEC_STAC9204X, "Sigmatel STAC9204X" },
857 	{ HDA_CODEC_STAC9204D, "Sigmatel STAC9204D" },
858 	{ HDA_CODEC_STAC9205X, "Sigmatel STAC9205X" },
859 	{ HDA_CODEC_STAC9205D, "Sigmatel STAC9205D" },
860 	{ HDA_CODEC_STAC9220,  "Sigmatel STAC9220" },
861 	{ HDA_CODEC_STAC9220_A1, "Sigmatel STAC9220_A1" },
862 	{ HDA_CODEC_STAC9220_A2, "Sigmatel STAC9220_A2" },
863 	{ HDA_CODEC_STAC9221,  "Sigmatel STAC9221" },
864 	{ HDA_CODEC_STAC9221_A2, "Sigmatel STAC9221_A2" },
865 	{ HDA_CODEC_STAC9221D, "Sigmatel STAC9221D" },
866 	{ HDA_CODEC_STAC922XD, "Sigmatel STAC9220D/9223D" },
867 	{ HDA_CODEC_STAC9227X, "Sigmatel STAC9227X" },
868 	{ HDA_CODEC_STAC9227D, "Sigmatel STAC9227D" },
869 	{ HDA_CODEC_STAC9228X, "Sigmatel STAC9228X" },
870 	{ HDA_CODEC_STAC9228D, "Sigmatel STAC9228D" },
871 	{ HDA_CODEC_STAC9229X, "Sigmatel STAC9229X" },
872 	{ HDA_CODEC_STAC9229D, "Sigmatel STAC9229D" },
873 	{ HDA_CODEC_STAC9230X, "Sigmatel STAC9230X" },
874 	{ HDA_CODEC_STAC9230D, "Sigmatel STAC9230D" },
875 	{ HDA_CODEC_STAC9250,  "Sigmatel STAC9250" },
876 	{ HDA_CODEC_STAC9251,  "Sigmatel STAC9251" },
877 	{ HDA_CODEC_STAC9271X, "Sigmatel STAC9271X" },
878 	{ HDA_CODEC_STAC9271D, "Sigmatel STAC9271D" },
879 	{ HDA_CODEC_STAC9272X, "Sigmatel STAC9272X" },
880 	{ HDA_CODEC_STAC9272D, "Sigmatel STAC9272D" },
881 	{ HDA_CODEC_STAC9273X, "Sigmatel STAC9273X" },
882 	{ HDA_CODEC_STAC9273D, "Sigmatel STAC9273D" },
883 	{ HDA_CODEC_STAC9274,  "Sigmatel STAC9274" },
884 	{ HDA_CODEC_STAC9274D, "Sigmatel STAC9274D" },
885 	{ HDA_CODEC_STAC9274X5NH, "Sigmatel STAC9274X5NH" },
886 	{ HDA_CODEC_STAC9274D5NH, "Sigmatel STAC9274D5NH" },
887 	{ HDA_CODEC_STAC9872AK, "Sigmatel STAC9872AK" },
888 	{ HDA_CODEC_IDT92HD005, "IDT 92HD005" },
889 	{ HDA_CODEC_IDT92HD005D, "IDT 92HD005D" },
890 	{ HDA_CODEC_IDT92HD206X, "IDT 92HD206X" },
891 	{ HDA_CODEC_IDT92HD206D, "IDT 92HD206D" },
892 	{ HDA_CODEC_IDT92HD700X, "IDT 92HD700X" },
893 	{ HDA_CODEC_IDT92HD700D, "IDT 92HD700D" },
894 	{ HDA_CODEC_IDT92HD71B5, "IDT 92HD71B5" },
895 	{ HDA_CODEC_IDT92HD71B7, "IDT 92HD71B7" },
896 	{ HDA_CODEC_IDT92HD71B8, "IDT 92HD71B8" },
897 	{ HDA_CODEC_IDT92HD73C1, "IDT 92HD73C1" },
898 	{ HDA_CODEC_IDT92HD73D1, "IDT 92HD73D1" },
899 	{ HDA_CODEC_IDT92HD73E1, "IDT 92HD73E1" },
900 	{ HDA_CODEC_IDT92HD75B3, "IDT 92HD75B3" },
901 	{ HDA_CODEC_IDT92HD75BX, "IDT 92HD75BX" },
902 	{ HDA_CODEC_IDT92HD81B1C, "IDT 92HD81B1C" },
903 	{ HDA_CODEC_IDT92HD81B1X, "IDT 92HD81B1X" },
904 	{ HDA_CODEC_IDT92HD83C1C, "IDT 92HD83C1C" },
905 	{ HDA_CODEC_IDT92HD83C1X, "IDT 92HD83C1X" },
906 	{ HDA_CODEC_CX20549,   "Conexant CX20549 (Venice)" },
907 	{ HDA_CODEC_CX20551,   "Conexant CX20551 (Waikiki)" },
908 	{ HDA_CODEC_CX20561,   "Conexant CX20561 (Hermosa)" },
909 	{ HDA_CODEC_CX20582,   "Conexant CX20582 (Pebble)" },
910 	{ HDA_CODEC_VT1708_8,  "VIA VT1708_8" },
911 	{ HDA_CODEC_VT1708_9,  "VIA VT1708_9" },
912 	{ HDA_CODEC_VT1708_A,  "VIA VT1708_A" },
913 	{ HDA_CODEC_VT1708_B,  "VIA VT1708_B" },
914 	{ HDA_CODEC_VT1709_0,  "VIA VT1709_0" },
915 	{ HDA_CODEC_VT1709_1,  "VIA VT1709_1" },
916 	{ HDA_CODEC_VT1709_2,  "VIA VT1709_2" },
917 	{ HDA_CODEC_VT1709_3,  "VIA VT1709_3" },
918 	{ HDA_CODEC_VT1709_4,  "VIA VT1709_4" },
919 	{ HDA_CODEC_VT1709_5,  "VIA VT1709_5" },
920 	{ HDA_CODEC_VT1709_6,  "VIA VT1709_6" },
921 	{ HDA_CODEC_VT1709_7,  "VIA VT1709_7" },
922 	{ HDA_CODEC_VT1708B_0, "VIA VT1708B_0" },
923 	{ HDA_CODEC_VT1708B_1, "VIA VT1708B_1" },
924 	{ HDA_CODEC_VT1708B_2, "VIA VT1708B_2" },
925 	{ HDA_CODEC_VT1708B_3, "VIA VT1708B_3" },
926 	{ HDA_CODEC_VT1708B_4, "VIA VT1708B_4" },
927 	{ HDA_CODEC_VT1708B_5, "VIA VT1708B_5" },
928 	{ HDA_CODEC_VT1708B_6, "VIA VT1708B_6" },
929 	{ HDA_CODEC_VT1708B_7, "VIA VT1708B_7" },
930 	{ HDA_CODEC_VT1708S_0, "VIA VT1708S_0" },
931 	{ HDA_CODEC_VT1708S_1, "VIA VT1708S_1" },
932 	{ HDA_CODEC_VT1708S_2, "VIA VT1708S_2" },
933 	{ HDA_CODEC_VT1708S_3, "VIA VT1708S_3" },
934 	{ HDA_CODEC_VT1708S_4, "VIA VT1708S_4" },
935 	{ HDA_CODEC_VT1708S_5, "VIA VT1708S_5" },
936 	{ HDA_CODEC_VT1708S_6, "VIA VT1708S_6" },
937 	{ HDA_CODEC_VT1708S_7, "VIA VT1708S_7" },
938 	{ HDA_CODEC_VT1702_0, "VIA VT1702_0" },
939 	{ HDA_CODEC_VT1702_1, "VIA VT1702_1" },
940 	{ HDA_CODEC_VT1702_2, "VIA VT1702_2" },
941 	{ HDA_CODEC_VT1702_3, "VIA VT1702_3" },
942 	{ HDA_CODEC_VT1702_4, "VIA VT1702_4" },
943 	{ HDA_CODEC_VT1702_5, "VIA VT1702_5" },
944 	{ HDA_CODEC_VT1702_6, "VIA VT1702_6" },
945 	{ HDA_CODEC_VT1702_7, "VIA VT1702_7" },
946 	{ HDA_CODEC_VT1716S_0, "VIA VT1716S_0" },
947 	{ HDA_CODEC_VT1716S_1, "VIA VT1716S_1" },
948 	{ HDA_CODEC_VT1718S_0, "VIA VT1718S_0" },
949 	{ HDA_CODEC_VT1718S_1, "VIA VT1718S_1" },
950 	{ HDA_CODEC_VT1812, "VIA VT1812" },
951 	{ HDA_CODEC_VT1818S, "VIA VT1818S" },
952 	{ HDA_CODEC_VT1828S, "VIA VT1828S" },
953 	{ HDA_CODEC_VT2002P_0, "VIA VT2002P_0" },
954 	{ HDA_CODEC_VT2002P_1, "VIA VT2002P_1" },
955 	{ HDA_CODEC_VT2020, "VIA VT2020" },
956 	{ HDA_CODEC_ATIRS600_1,"ATI RS600 HDMI" },
957 	{ HDA_CODEC_ATIRS600_2,"ATI RS600 HDMI" },
958 	{ HDA_CODEC_ATIRS690,  "ATI RS690/780 HDMI" },
959 	{ HDA_CODEC_ATIR6XX,   "ATI R6xx HDMI" },
960 	{ HDA_CODEC_NVIDIAMCP67, "NVidia MCP67 HDMI" },
961 	{ HDA_CODEC_NVIDIAMCP73, "NVidia MCP73 HDMI" },
962 	{ HDA_CODEC_NVIDIAMCP78, "NVidia MCP78 HDMI" },
963 	{ HDA_CODEC_NVIDIAMCP78_2, "NVidia MCP78 HDMI" },
964 	{ HDA_CODEC_NVIDIAMCP7A, "NVidia MCP7A HDMI" },
965 	{ HDA_CODEC_INTELG45_1, "Intel G45 HDMI" },
966 	{ HDA_CODEC_INTELG45_2, "Intel G45 HDMI" },
967 	{ HDA_CODEC_INTELG45_3, "Intel G45 HDMI" },
968 	{ HDA_CODEC_INTELG45_4, "Intel G45 HDMI" },
969 	{ HDA_CODEC_INTELQ57, "Intel Q57 HDMI" },
970 	{ HDA_CODEC_SII1390,   "Silicon Image SiI1390 HDMI" },
971 	{ HDA_CODEC_SII1392,   "Silicon Image SiI1392 HDMI" },
972 	/* Unknown codec */
973 	{ HDA_CODEC_ALCXXXX,   "Realtek (Unknown)" },
974 	{ HDA_CODEC_ADXXXX,    "Analog Devices (Unknown)" },
975 	{ HDA_CODEC_CSXXXX,    "Cirrus Logic (Unknown)" },
976 	{ HDA_CODEC_CMIXXXX,   "CMedia (Unknown)" },
977 	{ HDA_CODEC_STACXXXX,  "Sigmatel (Unknown)" },
978 	{ HDA_CODEC_SIIXXXX,   "Silicon Image (Unknown)" },
979 	{ HDA_CODEC_AGEREXXXX, "Lucent/Agere Systems (Unknown)" },
980 	{ HDA_CODEC_CXXXXX,    "Conexant (Unknown)" },
981 	{ HDA_CODEC_VTXXXX,    "VIA (Unknown)" },
982 	{ HDA_CODEC_ATIXXXX,   "ATI (Unknown)" },
983 	{ HDA_CODEC_NVIDIAXXXX,"NVidia (Unknown)" },
984 	{ HDA_CODEC_INTELXXXX, "Intel (Unknown)" },
985 	{ HDA_CODEC_IDTXXXX,   "IDT (Unknown)" },
986 };
987 #define HDAC_CODECS_LEN	(sizeof(hdac_codecs) / sizeof(hdac_codecs[0]))
988 
989 
990 /****************************************************************************
991  * Function prototypes
992  ****************************************************************************/
993 static void	hdac_intr_handler(void *);
994 static int	hdac_reset(struct hdac_softc *, int);
995 static int	hdac_get_capabilities(struct hdac_softc *);
996 static void	hdac_dma_cb(void *, bus_dma_segment_t *, int, int);
997 static int	hdac_dma_alloc(struct hdac_softc *,
998 					struct hdac_dma *, bus_size_t);
999 static void	hdac_dma_free(struct hdac_softc *, struct hdac_dma *);
1000 static int	hdac_mem_alloc(struct hdac_softc *);
1001 static void	hdac_mem_free(struct hdac_softc *);
1002 static int	hdac_irq_alloc(struct hdac_softc *);
1003 static void	hdac_irq_free(struct hdac_softc *);
1004 static void	hdac_corb_init(struct hdac_softc *);
1005 static void	hdac_rirb_init(struct hdac_softc *);
1006 static void	hdac_corb_start(struct hdac_softc *);
1007 static void	hdac_rirb_start(struct hdac_softc *);
1008 static void	hdac_scan_codecs(struct hdac_softc *);
1009 static void	hdac_probe_codec(struct hdac_codec *);
1010 static void	hdac_probe_function(struct hdac_codec *, nid_t);
1011 static int	hdac_pcmchannel_setup(struct hdac_chan *);
1012 
1013 static void	hdac_attach2(void *);
1014 
1015 static uint32_t	hdac_command_sendone_internal(struct hdac_softc *,
1016 							uint32_t, int);
1017 static void	hdac_command_send_internal(struct hdac_softc *,
1018 					struct hdac_command_list *, int);
1019 
1020 static int	hdac_probe(device_t);
1021 static int	hdac_attach(device_t);
1022 static int	hdac_detach(device_t);
1023 static int	hdac_suspend(device_t);
1024 static int	hdac_resume(device_t);
1025 static void	hdac_widget_connection_select(struct hdac_widget *, uint8_t);
1026 static void	hdac_audio_ctl_amp_set(struct hdac_audio_ctl *,
1027 						uint32_t, int, int);
1028 static struct	hdac_audio_ctl *hdac_audio_ctl_amp_get(struct hdac_devinfo *,
1029 							nid_t, int, int, int);
1030 static void	hdac_audio_ctl_amp_set_internal(struct hdac_softc *,
1031 				nid_t, nid_t, int, int, int, int, int, int);
1032 static struct	hdac_widget *hdac_widget_get(struct hdac_devinfo *, nid_t);
1033 
1034 static int	hdac_rirb_flush(struct hdac_softc *sc);
1035 static int	hdac_unsolq_flush(struct hdac_softc *sc);
1036 
1037 static void	hdac_dump_pin_config(struct hdac_widget *w, uint32_t conf);
1038 
1039 #define hdac_command(a1, a2, a3)	\
1040 		hdac_command_sendone_internal(a1, a2, a3)
1041 
1042 #define hdac_codec_id(c)							\
1043 		((uint32_t)((c == NULL) ? 0x00000000 :	\
1044 		((((uint32_t)(c)->vendor_id & 0x0000ffff) << 16) |	\
1045 		((uint32_t)(c)->device_id & 0x0000ffff))))
1046 
1047 static char *
1048 hdac_codec_name(struct hdac_codec *codec)
1049 {
1050 	uint32_t id;
1051 	int i;
1052 
1053 	id = hdac_codec_id(codec);
1054 
1055 	for (i = 0; i < HDAC_CODECS_LEN; i++) {
1056 		if (HDA_DEV_MATCH(hdac_codecs[i].id, id))
1057 			return (hdac_codecs[i].name);
1058 	}
1059 
1060 	return ((id == 0x00000000) ? "NULL Codec" : "Unknown Codec");
1061 }
1062 
1063 static char *
1064 hdac_audio_ctl_ossmixer_mask2allname(uint32_t mask, char *buf, size_t len)
1065 {
1066 	static char *ossname[] = SOUND_DEVICE_NAMES;
1067 	int i, first = 1;
1068 
1069 	bzero(buf, len);
1070 	for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
1071 		if (mask & (1 << i)) {
1072 			if (first == 0)
1073 				strlcat(buf, ", ", len);
1074 			strlcat(buf, ossname[i], len);
1075 			first = 0;
1076 		}
1077 	}
1078 	return (buf);
1079 }
1080 
1081 static struct hdac_audio_ctl *
1082 hdac_audio_ctl_each(struct hdac_devinfo *devinfo, int *index)
1083 {
1084 	if (devinfo == NULL ||
1085 	    devinfo->node_type != HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO ||
1086 	    index == NULL || devinfo->function.audio.ctl == NULL ||
1087 	    devinfo->function.audio.ctlcnt < 1 ||
1088 	    *index < 0 || *index >= devinfo->function.audio.ctlcnt)
1089 		return (NULL);
1090 	return (&devinfo->function.audio.ctl[(*index)++]);
1091 }
1092 
1093 static struct hdac_audio_ctl *
1094 hdac_audio_ctl_amp_get(struct hdac_devinfo *devinfo, nid_t nid, int dir,
1095 						int index, int cnt)
1096 {
1097 	struct hdac_audio_ctl *ctl;
1098 	int i, found = 0;
1099 
1100 	if (devinfo == NULL || devinfo->function.audio.ctl == NULL)
1101 		return (NULL);
1102 
1103 	i = 0;
1104 	while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) {
1105 		if (ctl->enable == 0)
1106 			continue;
1107 		if (ctl->widget->nid != nid)
1108 			continue;
1109 		if (dir && ctl->ndir != dir)
1110 			continue;
1111 		if (index >= 0 && ctl->ndir == HDA_CTL_IN &&
1112 		    ctl->dir == ctl->ndir && ctl->index != index)
1113 			continue;
1114 		found++;
1115 		if (found == cnt || cnt <= 0)
1116 			return (ctl);
1117 	}
1118 
1119 	return (NULL);
1120 }
1121 
1122 /*
1123  * Jack detection (Speaker/HP redirection) event handler.
1124  */
1125 static void
1126 hdac_hp_switch_handler(struct hdac_devinfo *devinfo)
1127 {
1128 	struct hdac_audio_as *as;
1129 	struct hdac_softc *sc;
1130 	struct hdac_widget *w;
1131 	struct hdac_audio_ctl *ctl;
1132 	uint32_t val, res;
1133 	int i, j;
1134 	nid_t cad;
1135 
1136 	if (devinfo == NULL || devinfo->codec == NULL ||
1137 	    devinfo->codec->sc == NULL)
1138 		return;
1139 
1140 	sc = devinfo->codec->sc;
1141 	cad = devinfo->codec->cad;
1142 	as = devinfo->function.audio.as;
1143 	for (i = 0; i < devinfo->function.audio.ascnt; i++) {
1144 		if (as[i].hpredir < 0)
1145 			continue;
1146 
1147 		w = hdac_widget_get(devinfo, as[i].pins[15]);
1148 		if (w == NULL || w->enable == 0 || w->type !=
1149 		    HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX)
1150 			continue;
1151 
1152 		res = hdac_command(sc,
1153 		    HDA_CMD_GET_PIN_SENSE(cad, as[i].pins[15]), cad);
1154 
1155 		HDA_BOOTVERBOSE(
1156 			device_printf(sc->dev,
1157 			    "Pin sense: nid=%d res=0x%08x\n",
1158 			    as[i].pins[15], res);
1159 		);
1160 
1161 		res = HDA_CMD_GET_PIN_SENSE_PRESENCE_DETECT(res);
1162 		if (devinfo->function.audio.quirks & HDA_QUIRK_SENSEINV)
1163 			res ^= 1;
1164 
1165 		/* (Un)Mute headphone pin. */
1166 		ctl = hdac_audio_ctl_amp_get(devinfo,
1167 		    as[i].pins[15], HDA_CTL_IN, -1, 1);
1168 		if (ctl != NULL && ctl->mute) {
1169 			/* If pin has muter - use it. */
1170 			val = (res != 0) ? 0 : 1;
1171 			if (val != ctl->forcemute) {
1172 				ctl->forcemute = val;
1173 				hdac_audio_ctl_amp_set(ctl,
1174 				    HDA_AMP_MUTE_DEFAULT,
1175 				    HDA_AMP_VOL_DEFAULT, HDA_AMP_VOL_DEFAULT);
1176 			}
1177 		} else {
1178 			/* If there is no muter - disable pin output. */
1179 			w = hdac_widget_get(devinfo, as[i].pins[15]);
1180 			if (w != NULL && w->type ==
1181 			    HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) {
1182 				if (res != 0)
1183 					val = w->wclass.pin.ctrl |
1184 					    HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE;
1185 				else
1186 					val = w->wclass.pin.ctrl &
1187 					    ~HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE;
1188 				if (val != w->wclass.pin.ctrl) {
1189 					w->wclass.pin.ctrl = val;
1190 					hdac_command(sc,
1191 					    HDA_CMD_SET_PIN_WIDGET_CTRL(cad,
1192 					    w->nid, w->wclass.pin.ctrl), cad);
1193 				}
1194 			}
1195 		}
1196 		/* (Un)Mute other pins. */
1197 		for (j = 0; j < 15; j++) {
1198 			if (as[i].pins[j] <= 0)
1199 				continue;
1200 			ctl = hdac_audio_ctl_amp_get(devinfo,
1201 			    as[i].pins[j], HDA_CTL_IN, -1, 1);
1202 			if (ctl != NULL && ctl->mute) {
1203 				/* If pin has muter - use it. */
1204 				val = (res != 0) ? 1 : 0;
1205 				if (val == ctl->forcemute)
1206 					continue;
1207 				ctl->forcemute = val;
1208 				hdac_audio_ctl_amp_set(ctl,
1209 				    HDA_AMP_MUTE_DEFAULT,
1210 				    HDA_AMP_VOL_DEFAULT, HDA_AMP_VOL_DEFAULT);
1211 				continue;
1212 			}
1213 			/* If there is no muter - disable pin output. */
1214 			w = hdac_widget_get(devinfo, as[i].pins[j]);
1215 			if (w != NULL && w->type ==
1216 			    HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) {
1217 				if (res != 0)
1218 					val = w->wclass.pin.ctrl &
1219 					    ~HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE;
1220 				else
1221 					val = w->wclass.pin.ctrl |
1222 					    HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE;
1223 				if (val != w->wclass.pin.ctrl) {
1224 					w->wclass.pin.ctrl = val;
1225 					hdac_command(sc,
1226 					    HDA_CMD_SET_PIN_WIDGET_CTRL(cad,
1227 					    w->nid, w->wclass.pin.ctrl), cad);
1228 				}
1229 			}
1230 		}
1231 	}
1232 }
1233 
1234 /*
1235  * Callback for poll based jack detection.
1236  */
1237 static void
1238 hdac_jack_poll_callback(void *arg)
1239 {
1240 	struct hdac_devinfo *devinfo = arg;
1241 	struct hdac_softc *sc;
1242 
1243 	if (devinfo == NULL || devinfo->codec == NULL ||
1244 	    devinfo->codec->sc == NULL)
1245 		return;
1246 	sc = devinfo->codec->sc;
1247 	hdac_lock(sc);
1248 	if (sc->poll_ival == 0) {
1249 		hdac_unlock(sc);
1250 		return;
1251 	}
1252 	hdac_hp_switch_handler(devinfo);
1253 	callout_reset(&sc->poll_jack, sc->poll_ival,
1254 	    hdac_jack_poll_callback, devinfo);
1255 	hdac_unlock(sc);
1256 }
1257 
1258 /*
1259  * Jack detection initializer.
1260  */
1261 static void
1262 hdac_hp_switch_init(struct hdac_devinfo *devinfo)
1263 {
1264         struct hdac_softc *sc = devinfo->codec->sc;
1265 	struct hdac_audio_as *as = devinfo->function.audio.as;
1266         struct hdac_widget *w;
1267         uint32_t id;
1268         int i, enable = 0, poll = 0;
1269         nid_t cad;
1270 
1271 	id = hdac_codec_id(devinfo->codec);
1272 	cad = devinfo->codec->cad;
1273 	for (i = 0; i < devinfo->function.audio.ascnt; i++) {
1274 		if (as[i].hpredir < 0)
1275 			continue;
1276 
1277 		w = hdac_widget_get(devinfo, as[i].pins[15]);
1278 		if (w == NULL || w->enable == 0 || w->type !=
1279 		    HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX)
1280 			continue;
1281 		if (HDA_PARAM_PIN_CAP_PRESENCE_DETECT_CAP(w->wclass.pin.cap) == 0 ||
1282 		    (HDA_CONFIG_DEFAULTCONF_MISC(w->wclass.pin.config) & 1) != 0) {
1283 			device_printf(sc->dev,
1284 			    "No jack detection support at pin %d\n",
1285 			    as[i].pins[15]);
1286 			continue;
1287 		}
1288 		enable = 1;
1289 		if (HDA_PARAM_AUDIO_WIDGET_CAP_UNSOL_CAP(w->param.widget_cap)) {
1290 			hdac_command(sc,
1291 			    HDA_CMD_SET_UNSOLICITED_RESPONSE(cad, w->nid,
1292 			    HDA_CMD_SET_UNSOLICITED_RESPONSE_ENABLE |
1293 			    HDAC_UNSOLTAG_EVENT_HP), cad);
1294 		} else
1295 			poll = 1;
1296 		HDA_BOOTVERBOSE(
1297 			device_printf(sc->dev,
1298 			    "Enabling headphone/speaker "
1299 			    "audio routing switching:\n");
1300 			device_printf(sc->dev, "\tas=%d sense nid=%d [%s]\n",
1301 			    i, w->nid, (poll != 0) ? "POLL" : "UNSOL");
1302 		);
1303 	}
1304 	if (enable) {
1305 		hdac_hp_switch_handler(devinfo);
1306 		if (poll) {
1307 			callout_reset(&sc->poll_jack, 1,
1308 			    hdac_jack_poll_callback, devinfo);
1309 		}
1310 	}
1311 }
1312 
1313 /*
1314  * Unsolicited messages handler.
1315  */
1316 static void
1317 hdac_unsolicited_handler(struct hdac_codec *codec, uint32_t tag)
1318 {
1319 	struct hdac_softc *sc;
1320 	struct hdac_devinfo *devinfo = NULL;
1321 	int i;
1322 
1323 	if (codec == NULL || codec->sc == NULL)
1324 		return;
1325 
1326 	sc = codec->sc;
1327 
1328 	HDA_BOOTVERBOSE(
1329 		device_printf(sc->dev, "Unsol Tag: 0x%08x\n", tag);
1330 	);
1331 
1332 	for (i = 0; i < codec->num_fgs; i++) {
1333 		if (codec->fgs[i].node_type ==
1334 		    HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO) {
1335 			devinfo = &codec->fgs[i];
1336 			break;
1337 		}
1338 	}
1339 
1340 	if (devinfo == NULL)
1341 		return;
1342 
1343 	switch (tag) {
1344 	case HDAC_UNSOLTAG_EVENT_HP:
1345 		hdac_hp_switch_handler(devinfo);
1346 		break;
1347 	default:
1348 		device_printf(sc->dev, "Unknown unsol tag: 0x%08x!\n", tag);
1349 		break;
1350 	}
1351 }
1352 
1353 static int
1354 hdac_stream_intr(struct hdac_softc *sc, struct hdac_chan *ch)
1355 {
1356 	/* XXX to be removed */
1357 #ifdef HDAC_INTR_EXTRA
1358 	uint32_t res;
1359 #endif
1360 
1361 	if (!(ch->flags & HDAC_CHN_RUNNING))
1362 		return (0);
1363 
1364 	/* XXX to be removed */
1365 #ifdef HDAC_INTR_EXTRA
1366 	res = HDAC_READ_1(&sc->mem, ch->off + HDAC_SDSTS);
1367 #endif
1368 
1369 	/* XXX to be removed */
1370 #ifdef HDAC_INTR_EXTRA
1371 	HDA_BOOTVERBOSE(
1372 		if (res & (HDAC_SDSTS_DESE | HDAC_SDSTS_FIFOE))
1373 			device_printf(ch->pdevinfo->dev,
1374 			    "PCMDIR_%s intr triggered beyond stream boundary:"
1375 			    "%08x\n",
1376 			    (ch->dir == PCMDIR_PLAY) ? "PLAY" : "REC", res);
1377 	);
1378 #endif
1379 
1380 	HDAC_WRITE_1(&sc->mem, ch->off + HDAC_SDSTS,
1381 	    HDAC_SDSTS_DESE | HDAC_SDSTS_FIFOE | HDAC_SDSTS_BCIS );
1382 
1383 	/* XXX to be removed */
1384 #ifdef HDAC_INTR_EXTRA
1385 	if (res & HDAC_SDSTS_BCIS) {
1386 #endif
1387 		return (1);
1388 	/* XXX to be removed */
1389 #ifdef HDAC_INTR_EXTRA
1390 	}
1391 #endif
1392 
1393 	return (0);
1394 }
1395 
1396 /****************************************************************************
1397  * void hdac_intr_handler(void *)
1398  *
1399  * Interrupt handler. Processes interrupts received from the hdac.
1400  ****************************************************************************/
1401 static void
1402 hdac_intr_handler(void *context)
1403 {
1404 	struct hdac_softc *sc;
1405 	uint32_t intsts;
1406 	uint8_t rirbsts;
1407 	struct hdac_rirb *rirb_base;
1408 	uint32_t trigger;
1409 	int i;
1410 
1411 	sc = (struct hdac_softc *)context;
1412 
1413 	hdac_lock(sc);
1414 	if (sc->polling != 0) {
1415 		hdac_unlock(sc);
1416 		return;
1417 	}
1418 
1419 	/* Do we have anything to do? */
1420 	intsts = HDAC_READ_4(&sc->mem, HDAC_INTSTS);
1421 	if (!HDA_FLAG_MATCH(intsts, HDAC_INTSTS_GIS)) {
1422 		hdac_unlock(sc);
1423 		return;
1424 	}
1425 
1426 	trigger = 0;
1427 
1428 	/* Was this a controller interrupt? */
1429 	if (HDA_FLAG_MATCH(intsts, HDAC_INTSTS_CIS)) {
1430 		rirb_base = (struct hdac_rirb *)sc->rirb_dma.dma_vaddr;
1431 		rirbsts = HDAC_READ_1(&sc->mem, HDAC_RIRBSTS);
1432 		/* Get as many responses that we can */
1433 		while (HDA_FLAG_MATCH(rirbsts, HDAC_RIRBSTS_RINTFL)) {
1434 			HDAC_WRITE_1(&sc->mem,
1435 			    HDAC_RIRBSTS, HDAC_RIRBSTS_RINTFL);
1436 			if (hdac_rirb_flush(sc) != 0)
1437 				trigger |= HDAC_TRIGGER_UNSOL;
1438 			rirbsts = HDAC_READ_1(&sc->mem, HDAC_RIRBSTS);
1439 		}
1440 		/* XXX to be removed */
1441 		/* Clear interrupt and exit */
1442 #ifdef HDAC_INTR_EXTRA
1443 		HDAC_WRITE_4(&sc->mem, HDAC_INTSTS, HDAC_INTSTS_CIS);
1444 #endif
1445 	}
1446 
1447 	if (intsts & HDAC_INTSTS_SIS_MASK) {
1448 		for (i = 0; i < sc->num_chans; i++) {
1449 			if ((intsts & (1 << (sc->chans[i].off >> 5))) &&
1450 			    hdac_stream_intr(sc, &sc->chans[i]) != 0)
1451 				trigger |= (1 << i);
1452 		}
1453 		/* XXX to be removed */
1454 #ifdef HDAC_INTR_EXTRA
1455 		HDAC_WRITE_4(&sc->mem, HDAC_INTSTS, intsts &
1456 		    HDAC_INTSTS_SIS_MASK);
1457 #endif
1458 	}
1459 
1460 	hdac_unlock(sc);
1461 
1462 	for (i = 0; i < sc->num_chans; i++) {
1463 		if (trigger & (1 << i))
1464 			chn_intr(sc->chans[i].c);
1465 	}
1466 	if (trigger & HDAC_TRIGGER_UNSOL)
1467 		taskqueue_enqueue(taskqueue_thread, &sc->unsolq_task);
1468 }
1469 
1470 /****************************************************************************
1471  * int hdac_reset(hdac_softc *, int)
1472  *
1473  * Reset the hdac to a quiescent and known state.
1474  ****************************************************************************/
1475 static int
1476 hdac_reset(struct hdac_softc *sc, int wakeup)
1477 {
1478 	uint32_t gctl;
1479 	int count, i;
1480 
1481 	/*
1482 	 * Stop all Streams DMA engine
1483 	 */
1484 	for (i = 0; i < sc->num_iss; i++)
1485 		HDAC_WRITE_4(&sc->mem, HDAC_ISDCTL(sc, i), 0x0);
1486 	for (i = 0; i < sc->num_oss; i++)
1487 		HDAC_WRITE_4(&sc->mem, HDAC_OSDCTL(sc, i), 0x0);
1488 	for (i = 0; i < sc->num_bss; i++)
1489 		HDAC_WRITE_4(&sc->mem, HDAC_BSDCTL(sc, i), 0x0);
1490 
1491 	/*
1492 	 * Stop Control DMA engines.
1493 	 */
1494 	HDAC_WRITE_1(&sc->mem, HDAC_CORBCTL, 0x0);
1495 	HDAC_WRITE_1(&sc->mem, HDAC_RIRBCTL, 0x0);
1496 
1497 	/*
1498 	 * Reset DMA position buffer.
1499 	 */
1500 	HDAC_WRITE_4(&sc->mem, HDAC_DPIBLBASE, 0x0);
1501 	HDAC_WRITE_4(&sc->mem, HDAC_DPIBUBASE, 0x0);
1502 
1503 	/*
1504 	 * Reset the controller. The reset must remain asserted for
1505 	 * a minimum of 100us.
1506 	 */
1507 	gctl = HDAC_READ_4(&sc->mem, HDAC_GCTL);
1508 	HDAC_WRITE_4(&sc->mem, HDAC_GCTL, gctl & ~HDAC_GCTL_CRST);
1509 	count = 10000;
1510 	do {
1511 		gctl = HDAC_READ_4(&sc->mem, HDAC_GCTL);
1512 		if (!(gctl & HDAC_GCTL_CRST))
1513 			break;
1514 		DELAY(10);
1515 	} while	(--count);
1516 	if (gctl & HDAC_GCTL_CRST) {
1517 		device_printf(sc->dev, "Unable to put hdac in reset\n");
1518 		return (ENXIO);
1519 	}
1520 
1521 	/* If wakeup is not requested - leave the controller in reset state. */
1522 	if (!wakeup)
1523 		return (0);
1524 
1525 	DELAY(100);
1526 	gctl = HDAC_READ_4(&sc->mem, HDAC_GCTL);
1527 	HDAC_WRITE_4(&sc->mem, HDAC_GCTL, gctl | HDAC_GCTL_CRST);
1528 	count = 10000;
1529 	do {
1530 		gctl = HDAC_READ_4(&sc->mem, HDAC_GCTL);
1531 		if (gctl & HDAC_GCTL_CRST)
1532 			break;
1533 		DELAY(10);
1534 	} while (--count);
1535 	if (!(gctl & HDAC_GCTL_CRST)) {
1536 		device_printf(sc->dev, "Device stuck in reset\n");
1537 		return (ENXIO);
1538 	}
1539 
1540 	/*
1541 	 * Wait for codecs to finish their own reset sequence. The delay here
1542 	 * should be of 250us but for some reasons, on it's not enough on my
1543 	 * computer. Let's use twice as much as necessary to make sure that
1544 	 * it's reset properly.
1545 	 */
1546 	DELAY(1000);
1547 
1548 	return (0);
1549 }
1550 
1551 
1552 /****************************************************************************
1553  * int hdac_get_capabilities(struct hdac_softc *);
1554  *
1555  * Retreive the general capabilities of the hdac;
1556  *	Number of Input Streams
1557  *	Number of Output Streams
1558  *	Number of bidirectional Streams
1559  *	64bit ready
1560  *	CORB and RIRB sizes
1561  ****************************************************************************/
1562 static int
1563 hdac_get_capabilities(struct hdac_softc *sc)
1564 {
1565 	uint16_t gcap;
1566 	uint8_t corbsize, rirbsize;
1567 
1568 	gcap = HDAC_READ_2(&sc->mem, HDAC_GCAP);
1569 	sc->num_iss = HDAC_GCAP_ISS(gcap);
1570 	sc->num_oss = HDAC_GCAP_OSS(gcap);
1571 	sc->num_bss = HDAC_GCAP_BSS(gcap);
1572 	sc->num_sdo = HDAC_GCAP_NSDO(gcap);
1573 	sc->support_64bit = HDA_FLAG_MATCH(gcap, HDAC_GCAP_64OK);
1574 
1575 	corbsize = HDAC_READ_1(&sc->mem, HDAC_CORBSIZE);
1576 	if ((corbsize & HDAC_CORBSIZE_CORBSZCAP_256) ==
1577 	    HDAC_CORBSIZE_CORBSZCAP_256)
1578 		sc->corb_size = 256;
1579 	else if ((corbsize & HDAC_CORBSIZE_CORBSZCAP_16) ==
1580 	    HDAC_CORBSIZE_CORBSZCAP_16)
1581 		sc->corb_size = 16;
1582 	else if ((corbsize & HDAC_CORBSIZE_CORBSZCAP_2) ==
1583 	    HDAC_CORBSIZE_CORBSZCAP_2)
1584 		sc->corb_size = 2;
1585 	else {
1586 		device_printf(sc->dev, "%s: Invalid corb size (%x)\n",
1587 		    __func__, corbsize);
1588 		return (ENXIO);
1589 	}
1590 
1591 	rirbsize = HDAC_READ_1(&sc->mem, HDAC_RIRBSIZE);
1592 	if ((rirbsize & HDAC_RIRBSIZE_RIRBSZCAP_256) ==
1593 	    HDAC_RIRBSIZE_RIRBSZCAP_256)
1594 		sc->rirb_size = 256;
1595 	else if ((rirbsize & HDAC_RIRBSIZE_RIRBSZCAP_16) ==
1596 	    HDAC_RIRBSIZE_RIRBSZCAP_16)
1597 		sc->rirb_size = 16;
1598 	else if ((rirbsize & HDAC_RIRBSIZE_RIRBSZCAP_2) ==
1599 	    HDAC_RIRBSIZE_RIRBSZCAP_2)
1600 		sc->rirb_size = 2;
1601 	else {
1602 		device_printf(sc->dev, "%s: Invalid rirb size (%x)\n",
1603 		    __func__, rirbsize);
1604 		return (ENXIO);
1605 	}
1606 
1607 	HDA_BOOTVERBOSE(
1608 		device_printf(sc->dev, "Caps: OSS %d, ISS %d, BSS %d, "
1609 		    "NSDO %d%s, CORB %d, RIRB %d\n",
1610 		    sc->num_oss, sc->num_iss, sc->num_bss, 1 << sc->num_sdo,
1611 		    sc->support_64bit ? ", 64bit" : "",
1612 		    sc->corb_size, sc->rirb_size);
1613 	);
1614 
1615 	return (0);
1616 }
1617 
1618 
1619 /****************************************************************************
1620  * void hdac_dma_cb
1621  *
1622  * This function is called by bus_dmamap_load when the mapping has been
1623  * established. We just record the physical address of the mapping into
1624  * the struct hdac_dma passed in.
1625  ****************************************************************************/
1626 static void
1627 hdac_dma_cb(void *callback_arg, bus_dma_segment_t *segs, int nseg, int error)
1628 {
1629 	struct hdac_dma *dma;
1630 
1631 	if (error == 0) {
1632 		dma = (struct hdac_dma *)callback_arg;
1633 		dma->dma_paddr = segs[0].ds_addr;
1634 	}
1635 }
1636 
1637 
1638 /****************************************************************************
1639  * int hdac_dma_alloc
1640  *
1641  * This function allocate and setup a dma region (struct hdac_dma).
1642  * It must be freed by a corresponding hdac_dma_free.
1643  ****************************************************************************/
1644 static int
1645 hdac_dma_alloc(struct hdac_softc *sc, struct hdac_dma *dma, bus_size_t size)
1646 {
1647 	bus_size_t roundsz;
1648 	int result;
1649 
1650 	roundsz = roundup2(size, HDAC_DMA_ALIGNMENT);
1651 	bzero(dma, sizeof(*dma));
1652 
1653 	/*
1654 	 * Create a DMA tag
1655 	 */
1656 	result = bus_dma_tag_create(
1657 	    bus_get_dma_tag(sc->dev),		/* parent */
1658 	    HDAC_DMA_ALIGNMENT,			/* alignment */
1659 	    0,					/* boundary */
1660 	    (sc->support_64bit) ? BUS_SPACE_MAXADDR :
1661 		BUS_SPACE_MAXADDR_32BIT,	/* lowaddr */
1662 	    BUS_SPACE_MAXADDR,			/* highaddr */
1663 	    NULL,				/* filtfunc */
1664 	    NULL,				/* fistfuncarg */
1665 	    roundsz, 				/* maxsize */
1666 	    1,					/* nsegments */
1667 	    roundsz, 				/* maxsegsz */
1668 	    0,					/* flags */
1669 	    NULL,				/* lockfunc */
1670 	    NULL,				/* lockfuncarg */
1671 	    &dma->dma_tag);			/* dmat */
1672 	if (result != 0) {
1673 		device_printf(sc->dev, "%s: bus_dma_tag_create failed (%x)\n",
1674 		    __func__, result);
1675 		goto hdac_dma_alloc_fail;
1676 	}
1677 
1678 	/*
1679 	 * Allocate DMA memory
1680 	 */
1681 	result = bus_dmamem_alloc(dma->dma_tag, (void **)&dma->dma_vaddr,
1682 	    BUS_DMA_NOWAIT | BUS_DMA_ZERO |
1683 	    ((sc->flags & HDAC_F_DMA_NOCACHE) ? BUS_DMA_NOCACHE : 0),
1684 	    &dma->dma_map);
1685 	if (result != 0) {
1686 		device_printf(sc->dev, "%s: bus_dmamem_alloc failed (%x)\n",
1687 		    __func__, result);
1688 		goto hdac_dma_alloc_fail;
1689 	}
1690 
1691 	dma->dma_size = roundsz;
1692 
1693 	/*
1694 	 * Map the memory
1695 	 */
1696 	result = bus_dmamap_load(dma->dma_tag, dma->dma_map,
1697 	    (void *)dma->dma_vaddr, roundsz, hdac_dma_cb, (void *)dma, 0);
1698 	if (result != 0 || dma->dma_paddr == 0) {
1699 		if (result == 0)
1700 			result = ENOMEM;
1701 		device_printf(sc->dev, "%s: bus_dmamem_load failed (%x)\n",
1702 		    __func__, result);
1703 		goto hdac_dma_alloc_fail;
1704 	}
1705 
1706 	HDA_BOOTHVERBOSE(
1707 		device_printf(sc->dev, "%s: size=%ju -> roundsz=%ju\n",
1708 		    __func__, (uintmax_t)size, (uintmax_t)roundsz);
1709 	);
1710 
1711 	return (0);
1712 
1713 hdac_dma_alloc_fail:
1714 	hdac_dma_free(sc, dma);
1715 
1716 	return (result);
1717 }
1718 
1719 
1720 /****************************************************************************
1721  * void hdac_dma_free(struct hdac_softc *, struct hdac_dma *)
1722  *
1723  * Free a struct dhac_dma that has been previously allocated via the
1724  * hdac_dma_alloc function.
1725  ****************************************************************************/
1726 static void
1727 hdac_dma_free(struct hdac_softc *sc, struct hdac_dma *dma)
1728 {
1729 	if (dma->dma_map != NULL) {
1730 #if 0
1731 		/* Flush caches */
1732 		bus_dmamap_sync(dma->dma_tag, dma->dma_map,
1733 		    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
1734 #endif
1735 		bus_dmamap_unload(dma->dma_tag, dma->dma_map);
1736 	}
1737 	if (dma->dma_vaddr != NULL) {
1738 		bus_dmamem_free(dma->dma_tag, dma->dma_vaddr, dma->dma_map);
1739 		dma->dma_vaddr = NULL;
1740 	}
1741 	dma->dma_map = NULL;
1742 	if (dma->dma_tag != NULL) {
1743 		bus_dma_tag_destroy(dma->dma_tag);
1744 		dma->dma_tag = NULL;
1745 	}
1746 	dma->dma_size = 0;
1747 }
1748 
1749 /****************************************************************************
1750  * int hdac_mem_alloc(struct hdac_softc *)
1751  *
1752  * Allocate all the bus resources necessary to speak with the physical
1753  * controller.
1754  ****************************************************************************/
1755 static int
1756 hdac_mem_alloc(struct hdac_softc *sc)
1757 {
1758 	struct hdac_mem *mem;
1759 
1760 	mem = &sc->mem;
1761 	mem->mem_rid = PCIR_BAR(0);
1762 	mem->mem_res = bus_alloc_resource_any(sc->dev, SYS_RES_MEMORY,
1763 	    &mem->mem_rid, RF_ACTIVE);
1764 	if (mem->mem_res == NULL) {
1765 		device_printf(sc->dev,
1766 		    "%s: Unable to allocate memory resource\n", __func__);
1767 		return (ENOMEM);
1768 	}
1769 	mem->mem_tag = rman_get_bustag(mem->mem_res);
1770 	mem->mem_handle = rman_get_bushandle(mem->mem_res);
1771 
1772 	return (0);
1773 }
1774 
1775 /****************************************************************************
1776  * void hdac_mem_free(struct hdac_softc *)
1777  *
1778  * Free up resources previously allocated by hdac_mem_alloc.
1779  ****************************************************************************/
1780 static void
1781 hdac_mem_free(struct hdac_softc *sc)
1782 {
1783 	struct hdac_mem *mem;
1784 
1785 	mem = &sc->mem;
1786 	if (mem->mem_res != NULL)
1787 		bus_release_resource(sc->dev, SYS_RES_MEMORY, mem->mem_rid,
1788 		    mem->mem_res);
1789 	mem->mem_res = NULL;
1790 }
1791 
1792 /****************************************************************************
1793  * int hdac_irq_alloc(struct hdac_softc *)
1794  *
1795  * Allocate and setup the resources necessary for interrupt handling.
1796  ****************************************************************************/
1797 static int
1798 hdac_irq_alloc(struct hdac_softc *sc)
1799 {
1800 	struct hdac_irq *irq;
1801 	int result;
1802 
1803 	irq = &sc->irq;
1804 	irq->irq_rid = 0x0;
1805 
1806 	if ((sc->flags & HDAC_F_MSI) &&
1807 	    (result = pci_msi_count(sc->dev)) == 1 &&
1808 	    pci_alloc_msi(sc->dev, &result) == 0)
1809 		irq->irq_rid = 0x1;
1810 	else
1811 		sc->flags &= ~HDAC_F_MSI;
1812 
1813 	irq->irq_res = bus_alloc_resource_any(sc->dev, SYS_RES_IRQ,
1814 	    &irq->irq_rid, RF_SHAREABLE | RF_ACTIVE);
1815 	if (irq->irq_res == NULL) {
1816 		device_printf(sc->dev, "%s: Unable to allocate irq\n",
1817 		    __func__);
1818 		goto hdac_irq_alloc_fail;
1819 	}
1820 	result = bus_setup_intr(sc->dev, irq->irq_res, INTR_MPSAFE | INTR_TYPE_AV,
1821 	    NULL, hdac_intr_handler, sc, &irq->irq_handle);
1822 	if (result != 0) {
1823 		device_printf(sc->dev,
1824 		    "%s: Unable to setup interrupt handler (%x)\n",
1825 		    __func__, result);
1826 		goto hdac_irq_alloc_fail;
1827 	}
1828 
1829 	return (0);
1830 
1831 hdac_irq_alloc_fail:
1832 	hdac_irq_free(sc);
1833 
1834 	return (ENXIO);
1835 }
1836 
1837 /****************************************************************************
1838  * void hdac_irq_free(struct hdac_softc *)
1839  *
1840  * Free up resources previously allocated by hdac_irq_alloc.
1841  ****************************************************************************/
1842 static void
1843 hdac_irq_free(struct hdac_softc *sc)
1844 {
1845 	struct hdac_irq *irq;
1846 
1847 	irq = &sc->irq;
1848 	if (irq->irq_res != NULL && irq->irq_handle != NULL)
1849 		bus_teardown_intr(sc->dev, irq->irq_res, irq->irq_handle);
1850 	if (irq->irq_res != NULL)
1851 		bus_release_resource(sc->dev, SYS_RES_IRQ, irq->irq_rid,
1852 		    irq->irq_res);
1853 	if (irq->irq_rid == 0x1)
1854 		pci_release_msi(sc->dev);
1855 	irq->irq_handle = NULL;
1856 	irq->irq_res = NULL;
1857 	irq->irq_rid = 0x0;
1858 }
1859 
1860 /****************************************************************************
1861  * void hdac_corb_init(struct hdac_softc *)
1862  *
1863  * Initialize the corb registers for operations but do not start it up yet.
1864  * The CORB engine must not be running when this function is called.
1865  ****************************************************************************/
1866 static void
1867 hdac_corb_init(struct hdac_softc *sc)
1868 {
1869 	uint8_t corbsize;
1870 	uint64_t corbpaddr;
1871 
1872 	/* Setup the CORB size. */
1873 	switch (sc->corb_size) {
1874 	case 256:
1875 		corbsize = HDAC_CORBSIZE_CORBSIZE(HDAC_CORBSIZE_CORBSIZE_256);
1876 		break;
1877 	case 16:
1878 		corbsize = HDAC_CORBSIZE_CORBSIZE(HDAC_CORBSIZE_CORBSIZE_16);
1879 		break;
1880 	case 2:
1881 		corbsize = HDAC_CORBSIZE_CORBSIZE(HDAC_CORBSIZE_CORBSIZE_2);
1882 		break;
1883 	default:
1884 		panic("%s: Invalid CORB size (%x)\n", __func__, sc->corb_size);
1885 	}
1886 	HDAC_WRITE_1(&sc->mem, HDAC_CORBSIZE, corbsize);
1887 
1888 	/* Setup the CORB Address in the hdac */
1889 	corbpaddr = (uint64_t)sc->corb_dma.dma_paddr;
1890 	HDAC_WRITE_4(&sc->mem, HDAC_CORBLBASE, (uint32_t)corbpaddr);
1891 	HDAC_WRITE_4(&sc->mem, HDAC_CORBUBASE, (uint32_t)(corbpaddr >> 32));
1892 
1893 	/* Set the WP and RP */
1894 	sc->corb_wp = 0;
1895 	HDAC_WRITE_2(&sc->mem, HDAC_CORBWP, sc->corb_wp);
1896 	HDAC_WRITE_2(&sc->mem, HDAC_CORBRP, HDAC_CORBRP_CORBRPRST);
1897 	/*
1898 	 * The HDA specification indicates that the CORBRPRST bit will always
1899 	 * read as zero. Unfortunately, it seems that at least the 82801G
1900 	 * doesn't reset the bit to zero, which stalls the corb engine.
1901 	 * manually reset the bit to zero before continuing.
1902 	 */
1903 	HDAC_WRITE_2(&sc->mem, HDAC_CORBRP, 0x0);
1904 
1905 	/* Enable CORB error reporting */
1906 #if 0
1907 	HDAC_WRITE_1(&sc->mem, HDAC_CORBCTL, HDAC_CORBCTL_CMEIE);
1908 #endif
1909 }
1910 
1911 /****************************************************************************
1912  * void hdac_rirb_init(struct hdac_softc *)
1913  *
1914  * Initialize the rirb registers for operations but do not start it up yet.
1915  * The RIRB engine must not be running when this function is called.
1916  ****************************************************************************/
1917 static void
1918 hdac_rirb_init(struct hdac_softc *sc)
1919 {
1920 	uint8_t rirbsize;
1921 	uint64_t rirbpaddr;
1922 
1923 	/* Setup the RIRB size. */
1924 	switch (sc->rirb_size) {
1925 	case 256:
1926 		rirbsize = HDAC_RIRBSIZE_RIRBSIZE(HDAC_RIRBSIZE_RIRBSIZE_256);
1927 		break;
1928 	case 16:
1929 		rirbsize = HDAC_RIRBSIZE_RIRBSIZE(HDAC_RIRBSIZE_RIRBSIZE_16);
1930 		break;
1931 	case 2:
1932 		rirbsize = HDAC_RIRBSIZE_RIRBSIZE(HDAC_RIRBSIZE_RIRBSIZE_2);
1933 		break;
1934 	default:
1935 		panic("%s: Invalid RIRB size (%x)\n", __func__, sc->rirb_size);
1936 	}
1937 	HDAC_WRITE_1(&sc->mem, HDAC_RIRBSIZE, rirbsize);
1938 
1939 	/* Setup the RIRB Address in the hdac */
1940 	rirbpaddr = (uint64_t)sc->rirb_dma.dma_paddr;
1941 	HDAC_WRITE_4(&sc->mem, HDAC_RIRBLBASE, (uint32_t)rirbpaddr);
1942 	HDAC_WRITE_4(&sc->mem, HDAC_RIRBUBASE, (uint32_t)(rirbpaddr >> 32));
1943 
1944 	/* Setup the WP and RP */
1945 	sc->rirb_rp = 0;
1946 	HDAC_WRITE_2(&sc->mem, HDAC_RIRBWP, HDAC_RIRBWP_RIRBWPRST);
1947 
1948 	/* Setup the interrupt threshold */
1949 	HDAC_WRITE_2(&sc->mem, HDAC_RINTCNT, sc->rirb_size / 2);
1950 
1951 	/* Enable Overrun and response received reporting */
1952 #if 0
1953 	HDAC_WRITE_1(&sc->mem, HDAC_RIRBCTL,
1954 	    HDAC_RIRBCTL_RIRBOIC | HDAC_RIRBCTL_RINTCTL);
1955 #else
1956 	HDAC_WRITE_1(&sc->mem, HDAC_RIRBCTL, HDAC_RIRBCTL_RINTCTL);
1957 #endif
1958 
1959 #if 0
1960 	/*
1961 	 * Make sure that the Host CPU cache doesn't contain any dirty
1962 	 * cache lines that falls in the rirb. If I understood correctly, it
1963 	 * should be sufficient to do this only once as the rirb is purely
1964 	 * read-only from now on.
1965 	 */
1966 	bus_dmamap_sync(sc->rirb_dma.dma_tag, sc->rirb_dma.dma_map,
1967 	    BUS_DMASYNC_PREREAD);
1968 #endif
1969 }
1970 
1971 /****************************************************************************
1972  * void hdac_corb_start(hdac_softc *)
1973  *
1974  * Startup the corb DMA engine
1975  ****************************************************************************/
1976 static void
1977 hdac_corb_start(struct hdac_softc *sc)
1978 {
1979 	uint32_t corbctl;
1980 
1981 	corbctl = HDAC_READ_1(&sc->mem, HDAC_CORBCTL);
1982 	corbctl |= HDAC_CORBCTL_CORBRUN;
1983 	HDAC_WRITE_1(&sc->mem, HDAC_CORBCTL, corbctl);
1984 }
1985 
1986 /****************************************************************************
1987  * void hdac_rirb_start(hdac_softc *)
1988  *
1989  * Startup the rirb DMA engine
1990  ****************************************************************************/
1991 static void
1992 hdac_rirb_start(struct hdac_softc *sc)
1993 {
1994 	uint32_t rirbctl;
1995 
1996 	rirbctl = HDAC_READ_1(&sc->mem, HDAC_RIRBCTL);
1997 	rirbctl |= HDAC_RIRBCTL_RIRBDMAEN;
1998 	HDAC_WRITE_1(&sc->mem, HDAC_RIRBCTL, rirbctl);
1999 }
2000 
2001 
2002 /****************************************************************************
2003  * void hdac_scan_codecs(struct hdac_softc *, int)
2004  *
2005  * Scan the bus for available codecs, starting with num.
2006  ****************************************************************************/
2007 static void
2008 hdac_scan_codecs(struct hdac_softc *sc)
2009 {
2010 	struct hdac_codec *codec;
2011 	int i;
2012 	uint16_t statests;
2013 
2014 	statests = HDAC_READ_2(&sc->mem, HDAC_STATESTS);
2015 	for (i = 0; i < HDAC_CODEC_MAX; i++) {
2016 		if (HDAC_STATESTS_SDIWAKE(statests, i)) {
2017 			/* We have found a codec. */
2018 			codec = (struct hdac_codec *)malloc(sizeof(*codec),
2019 			    M_HDAC, M_ZERO | M_NOWAIT);
2020 			if (codec == NULL) {
2021 				device_printf(sc->dev,
2022 				    "Unable to allocate memory for codec\n");
2023 				continue;
2024 			}
2025 			codec->commands = NULL;
2026 			codec->responses_received = 0;
2027 			codec->verbs_sent = 0;
2028 			codec->sc = sc;
2029 			codec->cad = i;
2030 			sc->codecs[i] = codec;
2031 			hdac_probe_codec(codec);
2032 		}
2033 	}
2034 	/* All codecs have been probed, now try to attach drivers to them */
2035 	/* bus_generic_attach(sc->dev); */
2036 }
2037 
2038 /****************************************************************************
2039  * void hdac_probe_codec(struct hdac_softc *, int)
2040  *
2041  * Probe a the given codec_id for available function groups.
2042  ****************************************************************************/
2043 static void
2044 hdac_probe_codec(struct hdac_codec *codec)
2045 {
2046 	struct hdac_softc *sc = codec->sc;
2047 	uint32_t vendorid, revisionid, subnode;
2048 	int startnode;
2049 	int endnode;
2050 	int i;
2051 	nid_t cad = codec->cad;
2052 
2053 	HDA_BOOTVERBOSE(
2054 		device_printf(sc->dev, "Probing codec #%d...\n", cad);
2055 	);
2056 	vendorid = hdac_command(sc,
2057 	    HDA_CMD_GET_PARAMETER(cad, 0x0, HDA_PARAM_VENDOR_ID),
2058 	    cad);
2059 	revisionid = hdac_command(sc,
2060 	    HDA_CMD_GET_PARAMETER(cad, 0x0, HDA_PARAM_REVISION_ID),
2061 	    cad);
2062 	codec->vendor_id = HDA_PARAM_VENDOR_ID_VENDOR_ID(vendorid);
2063 	codec->device_id = HDA_PARAM_VENDOR_ID_DEVICE_ID(vendorid);
2064 	codec->revision_id = HDA_PARAM_REVISION_ID_REVISION_ID(revisionid);
2065 	codec->stepping_id = HDA_PARAM_REVISION_ID_STEPPING_ID(revisionid);
2066 
2067 	if (vendorid == HDAC_INVALID && revisionid == HDAC_INVALID) {
2068 		device_printf(sc->dev, "Codec #%d is not responding!"
2069 		    " Probing aborted.\n", cad);
2070 		return;
2071 	}
2072 
2073 	device_printf(sc->dev, "HDA Codec #%d: %s\n",
2074 	    cad, hdac_codec_name(codec));
2075 	HDA_BOOTVERBOSE(
2076 		device_printf(sc->dev, " HDA Codec ID: 0x%08x\n",
2077 		    hdac_codec_id(codec));
2078 		device_printf(sc->dev, "       Vendor: 0x%04x\n",
2079 		    codec->vendor_id);
2080 		device_printf(sc->dev, "       Device: 0x%04x\n",
2081 		    codec->device_id);
2082 		device_printf(sc->dev, "     Revision: 0x%02x\n",
2083 		    codec->revision_id);
2084 		device_printf(sc->dev, "     Stepping: 0x%02x\n",
2085 		    codec->stepping_id);
2086 		device_printf(sc->dev, "PCI Subvendor: 0x%08x\n",
2087 		    sc->pci_subvendor);
2088 	);
2089 	subnode = hdac_command(sc,
2090 	    HDA_CMD_GET_PARAMETER(cad, 0x0, HDA_PARAM_SUB_NODE_COUNT),
2091 	    cad);
2092 	startnode = HDA_PARAM_SUB_NODE_COUNT_START(subnode);
2093 	endnode = startnode + HDA_PARAM_SUB_NODE_COUNT_TOTAL(subnode);
2094 
2095 	HDA_BOOTHVERBOSE(
2096 		device_printf(sc->dev, "\tstartnode=%d endnode=%d\n",
2097 		    startnode, endnode);
2098 	);
2099 
2100 	codec->fgs = (struct hdac_devinfo *)malloc(sizeof(struct hdac_devinfo) *
2101 	    (endnode - startnode), M_HDAC, M_NOWAIT | M_ZERO);
2102 	if (codec->fgs == NULL) {
2103 		device_printf(sc->dev, "%s: Unable to allocate function groups\n",
2104 		    __func__);
2105 		return;
2106 	}
2107 
2108 	for (i = startnode; i < endnode; i++)
2109 		hdac_probe_function(codec, i);
2110 	return;
2111 }
2112 
2113 /*
2114  * Probe codec function and add it to the list.
2115  */
2116 static void
2117 hdac_probe_function(struct hdac_codec *codec, nid_t nid)
2118 {
2119 	struct hdac_softc *sc = codec->sc;
2120 	struct hdac_devinfo *devinfo = &codec->fgs[codec->num_fgs];
2121 	uint32_t fctgrptype;
2122 	uint32_t res;
2123 	nid_t cad = codec->cad;
2124 
2125 	fctgrptype = HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE(hdac_command(sc,
2126 	    HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_FCT_GRP_TYPE), cad));
2127 
2128 	devinfo->nid = nid;
2129 	devinfo->node_type = fctgrptype;
2130 	devinfo->codec = codec;
2131 
2132 	res = hdac_command(sc,
2133 	    HDA_CMD_GET_PARAMETER(cad , nid, HDA_PARAM_SUB_NODE_COUNT), cad);
2134 
2135 	devinfo->nodecnt = HDA_PARAM_SUB_NODE_COUNT_TOTAL(res);
2136 	devinfo->startnode = HDA_PARAM_SUB_NODE_COUNT_START(res);
2137 	devinfo->endnode = devinfo->startnode + devinfo->nodecnt;
2138 
2139 	HDA_BOOTVERBOSE(
2140 		device_printf(sc->dev,
2141 		    "\tFound %s FG nid=%d startnode=%d endnode=%d total=%d\n",
2142 		    (fctgrptype == HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO) ? "audio":
2143 		    (fctgrptype == HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_MODEM) ? "modem":
2144 		    "unknown", nid, devinfo->startnode, devinfo->endnode,
2145 		    devinfo->nodecnt);
2146 	);
2147 
2148 	if (devinfo->nodecnt > 0)
2149 		devinfo->widget = (struct hdac_widget *)malloc(
2150 		    sizeof(*(devinfo->widget)) * devinfo->nodecnt, M_HDAC,
2151 		    M_NOWAIT | M_ZERO);
2152 	else
2153 		devinfo->widget = NULL;
2154 
2155 	if (devinfo->widget == NULL) {
2156 		device_printf(sc->dev, "unable to allocate widgets!\n");
2157 		devinfo->endnode = devinfo->startnode;
2158 		devinfo->nodecnt = 0;
2159 		return;
2160 	}
2161 
2162 	codec->num_fgs++;
2163 }
2164 
2165 static void
2166 hdac_widget_connection_parse(struct hdac_widget *w)
2167 {
2168 	struct hdac_softc *sc = w->devinfo->codec->sc;
2169 	uint32_t res;
2170 	int i, j, max, ents, entnum;
2171 	nid_t cad = w->devinfo->codec->cad;
2172 	nid_t nid = w->nid;
2173 	nid_t cnid, addcnid, prevcnid;
2174 
2175 	w->nconns = 0;
2176 
2177 	res = hdac_command(sc,
2178 	    HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_CONN_LIST_LENGTH), cad);
2179 
2180 	ents = HDA_PARAM_CONN_LIST_LENGTH_LIST_LENGTH(res);
2181 
2182 	if (ents < 1)
2183 		return;
2184 
2185 	entnum = HDA_PARAM_CONN_LIST_LENGTH_LONG_FORM(res) ? 2 : 4;
2186 	max = (sizeof(w->conns) / sizeof(w->conns[0])) - 1;
2187 	prevcnid = 0;
2188 
2189 #define CONN_RMASK(e)		(1 << ((32 / (e)) - 1))
2190 #define CONN_NMASK(e)		(CONN_RMASK(e) - 1)
2191 #define CONN_RESVAL(r, e, n)	((r) >> ((32 / (e)) * (n)))
2192 #define CONN_RANGE(r, e, n)	(CONN_RESVAL(r, e, n) & CONN_RMASK(e))
2193 #define CONN_CNID(r, e, n)	(CONN_RESVAL(r, e, n) & CONN_NMASK(e))
2194 
2195 	for (i = 0; i < ents; i += entnum) {
2196 		res = hdac_command(sc,
2197 		    HDA_CMD_GET_CONN_LIST_ENTRY(cad, nid, i), cad);
2198 		for (j = 0; j < entnum; j++) {
2199 			cnid = CONN_CNID(res, entnum, j);
2200 			if (cnid == 0) {
2201 				if (w->nconns < ents)
2202 					device_printf(sc->dev,
2203 					    "%s: nid=%d WARNING: zero cnid "
2204 					    "entnum=%d j=%d index=%d "
2205 					    "entries=%d found=%d res=0x%08x\n",
2206 					    __func__, nid, entnum, j, i,
2207 					    ents, w->nconns, res);
2208 				else
2209 					goto getconns_out;
2210 			}
2211 			if (cnid < w->devinfo->startnode ||
2212 			    cnid >= w->devinfo->endnode) {
2213 				HDA_BOOTVERBOSE(
2214 					device_printf(sc->dev,
2215 					    "GHOST: nid=%d j=%d "
2216 					    "entnum=%d index=%d res=0x%08x\n",
2217 					    nid, j, entnum, i, res);
2218 				);
2219 			}
2220 			if (CONN_RANGE(res, entnum, j) == 0)
2221 				addcnid = cnid;
2222 			else if (prevcnid == 0 || prevcnid >= cnid) {
2223 				device_printf(sc->dev,
2224 				    "%s: WARNING: Invalid child range "
2225 				    "nid=%d index=%d j=%d entnum=%d "
2226 				    "prevcnid=%d cnid=%d res=0x%08x\n",
2227 				    __func__, nid, i, j, entnum, prevcnid,
2228 				    cnid, res);
2229 				addcnid = cnid;
2230 			} else
2231 				addcnid = prevcnid + 1;
2232 			while (addcnid <= cnid) {
2233 				if (w->nconns > max) {
2234 					device_printf(sc->dev,
2235 					    "Adding %d (nid=%d): "
2236 					    "Max connection reached! max=%d\n",
2237 					    addcnid, nid, max + 1);
2238 					goto getconns_out;
2239 				}
2240 				w->connsenable[w->nconns] = 1;
2241 				w->conns[w->nconns++] = addcnid++;
2242 			}
2243 			prevcnid = cnid;
2244 		}
2245 	}
2246 
2247 getconns_out:
2248 	return;
2249 }
2250 
2251 static uint32_t
2252 hdac_widget_pin_patch(uint32_t config, const char *str)
2253 {
2254 	char buf[256];
2255 	char *key, *value, *rest, *bad;
2256 	int ival, i;
2257 
2258 	strlcpy(buf, str, sizeof(buf));
2259 	rest = buf;
2260 	while ((key = strsep(&rest, "=")) != NULL) {
2261 		value = strsep(&rest, " \t");
2262 		if (value == NULL)
2263 			break;
2264 		ival = strtol(value, &bad, 10);
2265 		if (strcmp(key, "seq") == 0) {
2266 			config &= ~HDA_CONFIG_DEFAULTCONF_SEQUENCE_MASK;
2267 			config |= ((ival << HDA_CONFIG_DEFAULTCONF_SEQUENCE_SHIFT) &
2268 			    HDA_CONFIG_DEFAULTCONF_SEQUENCE_MASK);
2269 		} else if (strcmp(key, "as") == 0) {
2270 			config &= ~HDA_CONFIG_DEFAULTCONF_ASSOCIATION_MASK;
2271 			config |= ((ival << HDA_CONFIG_DEFAULTCONF_ASSOCIATION_SHIFT) &
2272 			    HDA_CONFIG_DEFAULTCONF_ASSOCIATION_MASK);
2273 		} else if (strcmp(key, "misc") == 0) {
2274 			config &= ~HDA_CONFIG_DEFAULTCONF_MISC_MASK;
2275 			config |= ((ival << HDA_CONFIG_DEFAULTCONF_MISC_SHIFT) &
2276 			    HDA_CONFIG_DEFAULTCONF_MISC_MASK);
2277 		} else if (strcmp(key, "color") == 0) {
2278 			config &= ~HDA_CONFIG_DEFAULTCONF_COLOR_MASK;
2279 			if (bad[0] == 0) {
2280 				config |= ((ival << HDA_CONFIG_DEFAULTCONF_COLOR_SHIFT) &
2281 				    HDA_CONFIG_DEFAULTCONF_COLOR_MASK);
2282 			};
2283 			for (i = 0; i < 16; i++) {
2284 				if (strcasecmp(HDA_COLORS[i], value) == 0) {
2285 					config |= (i << HDA_CONFIG_DEFAULTCONF_COLOR_SHIFT);
2286 					break;
2287 				}
2288 			}
2289 		} else if (strcmp(key, "ctype") == 0) {
2290 			config &= ~HDA_CONFIG_DEFAULTCONF_CONNECTION_TYPE_MASK;
2291 			config |= ((ival << HDA_CONFIG_DEFAULTCONF_CONNECTION_TYPE_SHIFT) &
2292 			    HDA_CONFIG_DEFAULTCONF_CONNECTION_TYPE_MASK);
2293 		} else if (strcmp(key, "device") == 0) {
2294 			config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK;
2295 			if (bad[0] == 0) {
2296 				config |= ((ival << HDA_CONFIG_DEFAULTCONF_DEVICE_SHIFT) &
2297 				    HDA_CONFIG_DEFAULTCONF_DEVICE_MASK);
2298 				continue;
2299 			};
2300 			for (i = 0; i < 16; i++) {
2301 				if (strcasecmp(HDA_DEVS[i], value) == 0) {
2302 					config |= (i << HDA_CONFIG_DEFAULTCONF_DEVICE_SHIFT);
2303 					break;
2304 				}
2305 			}
2306 		} else if (strcmp(key, "loc") == 0) {
2307 			config &= ~HDA_CONFIG_DEFAULTCONF_LOCATION_MASK;
2308 			config |= ((ival << HDA_CONFIG_DEFAULTCONF_LOCATION_SHIFT) &
2309 			    HDA_CONFIG_DEFAULTCONF_LOCATION_MASK);
2310 		} else if (strcmp(key, "conn") == 0) {
2311 			config &= ~HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK;
2312 			if (bad[0] == 0) {
2313 				config |= ((ival << HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_SHIFT) &
2314 				    HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
2315 				continue;
2316 			};
2317 			for (i = 0; i < 4; i++) {
2318 				if (strcasecmp(HDA_CONNS[i], value) == 0) {
2319 					config |= (i << HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_SHIFT);
2320 					break;
2321 				}
2322 			}
2323 		}
2324 	}
2325 	return (config);
2326 }
2327 
2328 static uint32_t
2329 hdac_widget_pin_getconfig(struct hdac_widget *w)
2330 {
2331 	struct hdac_softc *sc;
2332 	uint32_t config, orig, id;
2333 	nid_t cad, nid;
2334 	char buf[32];
2335 	const char *res = NULL, *patch = NULL;
2336 
2337 	sc = w->devinfo->codec->sc;
2338 	cad = w->devinfo->codec->cad;
2339 	nid = w->nid;
2340 	id = hdac_codec_id(w->devinfo->codec);
2341 
2342 	config = hdac_command(sc,
2343 	    HDA_CMD_GET_CONFIGURATION_DEFAULT(cad, nid),
2344 	    cad);
2345 	orig = config;
2346 
2347 	HDA_BOOTVERBOSE(
2348 		hdac_dump_pin_config(w, orig);
2349 	);
2350 
2351 	/* XXX: Old patches require complete review.
2352 	 * Now they may create more problem then solve due to
2353 	 * incorrect associations.
2354 	 */
2355 	if (id == HDA_CODEC_ALC880 && sc->pci_subvendor == LG_LW20_SUBVENDOR) {
2356 		switch (nid) {
2357 		case 26:
2358 			config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK;
2359 			config |= HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_IN;
2360 			break;
2361 		case 27:
2362 			config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK;
2363 			config |= HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT;
2364 			break;
2365 		default:
2366 			break;
2367 		}
2368 	} else if (id == HDA_CODEC_ALC880 &&
2369 	    (sc->pci_subvendor == CLEVO_D900T_SUBVENDOR ||
2370 	    sc->pci_subvendor == ASUS_M5200_SUBVENDOR)) {
2371 		/*
2372 		 * Super broken BIOS
2373 		 */
2374 		switch (nid) {
2375 		case 24:	/* MIC1 */
2376 			config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK;
2377 			config |= HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN;
2378 			break;
2379 		case 25:	/* XXX MIC2 */
2380 			config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK;
2381 			config |= HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN;
2382 			break;
2383 		case 26:	/* LINE1 */
2384 			config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK;
2385 			config |= HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_IN;
2386 			break;
2387 		case 27:	/* XXX LINE2 */
2388 			config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK;
2389 			config |= HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_IN;
2390 			break;
2391 		case 28:	/* CD */
2392 			config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK;
2393 			config |= HDA_CONFIG_DEFAULTCONF_DEVICE_CD;
2394 			break;
2395 		}
2396 	} else if (id == HDA_CODEC_ALC883 &&
2397 	    (sc->pci_subvendor == MSI_MS034A_SUBVENDOR ||
2398 	    HDA_DEV_MATCH(ACER_ALL_SUBVENDOR, sc->pci_subvendor))) {
2399 		switch (nid) {
2400 		case 25:
2401 			config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
2402 			    HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
2403 			config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN |
2404 			    HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED);
2405 			break;
2406 		case 28:
2407 			config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
2408 			    HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
2409 			config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_CD |
2410 			    HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED);
2411 			break;
2412 		}
2413 	} else if (id == HDA_CODEC_CX20549 && sc->pci_subvendor ==
2414 	    HP_V3000_SUBVENDOR) {
2415 		switch (nid) {
2416 		case 18:
2417 			config &= ~HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK;
2418 			config |= HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_NONE;
2419 			break;
2420 		case 20:
2421 			config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
2422 			    HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
2423 			config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN |
2424 			    HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED);
2425 			break;
2426 		case 21:
2427 			config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
2428 			    HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
2429 			config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_CD |
2430 			    HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED);
2431 			break;
2432 		}
2433 	} else if (id == HDA_CODEC_CX20551 && sc->pci_subvendor ==
2434 	    HP_DV5000_SUBVENDOR) {
2435 		switch (nid) {
2436 		case 20:
2437 		case 21:
2438 			config &= ~HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK;
2439 			config |= HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_NONE;
2440 			break;
2441 		}
2442 	} else if (id == HDA_CODEC_ALC861 && sc->pci_subvendor ==
2443 	    ASUS_W6F_SUBVENDOR) {
2444 		switch (nid) {
2445 		case 11:
2446 			config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
2447 			    HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
2448 			config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_OUT |
2449 			    HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED);
2450 			break;
2451 		case 12:
2452 		case 14:
2453 		case 16:
2454 		case 31:
2455 		case 32:
2456 			config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
2457 			    HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
2458 			config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN |
2459 			    HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED);
2460 			break;
2461 		case 15:
2462 			config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
2463 			    HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
2464 			config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT |
2465 			    HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_JACK);
2466 			break;
2467 		}
2468 	} else if (id == HDA_CODEC_ALC861 && sc->pci_subvendor ==
2469 	    UNIWILL_9075_SUBVENDOR) {
2470 		switch (nid) {
2471 		case 15:
2472 			config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK |
2473 			    HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK);
2474 			config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT |
2475 			    HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_JACK);
2476 			break;
2477 		}
2478 	}
2479 
2480 	/* New patches */
2481 	if (id == HDA_CODEC_AD1986A &&
2482 	    (sc->pci_subvendor == ASUS_M2NPVMX_SUBVENDOR ||
2483 	    sc->pci_subvendor == ASUS_A8NVMCSM_SUBVENDOR ||
2484 	    sc->pci_subvendor == ASUS_P5PL2_SUBVENDOR)) {
2485 		switch (nid) {
2486 		case 26: /* Headphones with redirection */
2487 			patch = "as=1 seq=15";
2488 			break;
2489 		case 28: /* 5.1 out => 2.0 out + 1 input */
2490 			patch = "device=Line-in as=8 seq=1";
2491 			break;
2492 		case 29: /* Can't use this as input, as the only available mic
2493 			  * preamplifier is busy by front panel mic (nid 31).
2494 			  * If you want to use this rear connector as mic input,
2495 			  * you have to disable the front panel one. */
2496 			patch = "as=0";
2497 			break;
2498 		case 31: /* Lot of inputs configured with as=15 and unusable */
2499 			patch = "as=8 seq=3";
2500 			break;
2501 		case 32:
2502 			patch = "as=8 seq=4";
2503 			break;
2504 		case 34:
2505 			patch = "as=8 seq=5";
2506 			break;
2507 		case 36:
2508 			patch = "as=8 seq=6";
2509 			break;
2510 		}
2511 	} else if (id == HDA_CODEC_ALC260 &&
2512 	    HDA_DEV_MATCH(SONY_S5_SUBVENDOR, sc->pci_subvendor)) {
2513 		switch (nid) {
2514 		case 16:
2515 			patch = "seq=15 device=Headphones";
2516 			break;
2517 		}
2518 	} else if (id == HDA_CODEC_ALC268) {
2519 	    if (sc->pci_subvendor == ACER_T5320_SUBVENDOR) {
2520 		switch (nid) {
2521 		case 20: /* Headphones Jack */
2522 			patch = "as=1 seq=15";
2523 			break;
2524 		}
2525 	    }
2526 	}
2527 
2528 	if (patch != NULL)
2529 		config = hdac_widget_pin_patch(config, patch);
2530 
2531 	snprintf(buf, sizeof(buf), "cad%u.nid%u.config", cad, nid);
2532 	if (resource_string_value(device_get_name(sc->dev),
2533 	    device_get_unit(sc->dev), buf, &res) == 0) {
2534 		if (strncmp(res, "0x", 2) == 0) {
2535 			config = strtol(res + 2, NULL, 16);
2536 		} else {
2537 			config = hdac_widget_pin_patch(config, res);
2538 		}
2539 	}
2540 
2541 	HDA_BOOTVERBOSE(
2542 		if (config != orig)
2543 			device_printf(sc->dev,
2544 			    "Patching pin config nid=%u 0x%08x -> 0x%08x\n",
2545 			    nid, orig, config);
2546 	);
2547 
2548 	return (config);
2549 }
2550 
2551 static uint32_t
2552 hdac_widget_pin_getcaps(struct hdac_widget *w)
2553 {
2554 	struct hdac_softc *sc;
2555 	uint32_t caps, orig, id;
2556 	nid_t cad, nid;
2557 
2558 	sc = w->devinfo->codec->sc;
2559 	cad = w->devinfo->codec->cad;
2560 	nid = w->nid;
2561 	id = hdac_codec_id(w->devinfo->codec);
2562 
2563 	caps = hdac_command(sc,
2564 	    HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_PIN_CAP), cad);
2565 	orig = caps;
2566 
2567 	HDA_BOOTVERBOSE(
2568 		if (caps != orig)
2569 			device_printf(sc->dev,
2570 			    "Patching pin caps nid=%u 0x%08x -> 0x%08x\n",
2571 			    nid, orig, caps);
2572 	);
2573 
2574 	return (caps);
2575 }
2576 
2577 static void
2578 hdac_widget_pin_parse(struct hdac_widget *w)
2579 {
2580 	struct hdac_softc *sc = w->devinfo->codec->sc;
2581 	uint32_t config, pincap;
2582 	const char *devstr;
2583 	nid_t cad = w->devinfo->codec->cad;
2584 	nid_t nid = w->nid;
2585 	int conn, color;
2586 
2587 	config = hdac_widget_pin_getconfig(w);
2588 	w->wclass.pin.config = config;
2589 
2590 	pincap = hdac_widget_pin_getcaps(w);
2591 	w->wclass.pin.cap = pincap;
2592 
2593 	w->wclass.pin.ctrl = hdac_command(sc,
2594 	    HDA_CMD_GET_PIN_WIDGET_CTRL(cad, nid), cad);
2595 
2596 	if (HDA_PARAM_PIN_CAP_EAPD_CAP(pincap)) {
2597 		w->param.eapdbtl = hdac_command(sc,
2598 		    HDA_CMD_GET_EAPD_BTL_ENABLE(cad, nid), cad);
2599 		w->param.eapdbtl &= 0x7;
2600 		w->param.eapdbtl |= HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD;
2601 	} else
2602 		w->param.eapdbtl = HDAC_INVALID;
2603 
2604 	devstr = HDA_DEVS[(config & HDA_CONFIG_DEFAULTCONF_DEVICE_MASK) >>
2605 	    HDA_CONFIG_DEFAULTCONF_DEVICE_SHIFT];
2606 
2607 	conn = (config & HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK) >>
2608 	    HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_SHIFT;
2609 	color = (config & HDA_CONFIG_DEFAULTCONF_COLOR_MASK) >>
2610 	    HDA_CONFIG_DEFAULTCONF_COLOR_SHIFT;
2611 
2612 	strlcat(w->name, ": ", sizeof(w->name));
2613 	strlcat(w->name, devstr, sizeof(w->name));
2614 	strlcat(w->name, " (", sizeof(w->name));
2615 	if (conn == 0 && color != 0 && color != 15) {
2616 		strlcat(w->name, HDA_COLORS[color], sizeof(w->name));
2617 		strlcat(w->name, " ", sizeof(w->name));
2618 	}
2619 	strlcat(w->name, HDA_CONNS[conn], sizeof(w->name));
2620 	strlcat(w->name, ")", sizeof(w->name));
2621 }
2622 
2623 static uint32_t
2624 hdac_widget_getcaps(struct hdac_widget *w, int *waspin)
2625 {
2626 	struct hdac_softc *sc;
2627 	uint32_t caps, orig, id;
2628 	nid_t cad, nid, beeper = -1;
2629 
2630 	sc = w->devinfo->codec->sc;
2631 	cad = w->devinfo->codec->cad;
2632 	nid = w->nid;
2633 	id = hdac_codec_id(w->devinfo->codec);
2634 
2635 	caps = hdac_command(sc,
2636 	    HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_AUDIO_WIDGET_CAP),
2637 	    cad);
2638 	orig = caps;
2639 
2640 	/* On some codecs beeper is an input pin, but it is not recordable
2641 	   alone. Also most of BIOSes does not declare beeper pin.
2642 	   Change beeper pin node type to beeper to help parser. */
2643 	*waspin = 0;
2644 	switch (id) {
2645 	case HDA_CODEC_AD1882:
2646 	case HDA_CODEC_AD1883:
2647 	case HDA_CODEC_AD1984:
2648 	case HDA_CODEC_AD1984A:
2649 	case HDA_CODEC_AD1984B:
2650 	case HDA_CODEC_AD1987:
2651 	case HDA_CODEC_AD1988:
2652 	case HDA_CODEC_AD1988B:
2653 	case HDA_CODEC_AD1989B:
2654 		beeper = 26;
2655 		break;
2656 	case HDA_CODEC_ALC260:
2657 		beeper = 23;
2658 		break;
2659 	case HDA_CODEC_ALC262:
2660 	case HDA_CODEC_ALC268:
2661 	case HDA_CODEC_ALC880:
2662 	case HDA_CODEC_ALC882:
2663 	case HDA_CODEC_ALC883:
2664 	case HDA_CODEC_ALC885:
2665 	case HDA_CODEC_ALC888:
2666 	case HDA_CODEC_ALC889:
2667 		beeper = 29;
2668 		break;
2669 	}
2670 	if (nid == beeper) {
2671 		caps &= ~HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_MASK;
2672 		caps |= HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_BEEP_WIDGET <<
2673 		    HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_SHIFT;
2674 		*waspin = 1;
2675 	}
2676 
2677 	HDA_BOOTVERBOSE(
2678 		if (caps != orig) {
2679 			device_printf(sc->dev,
2680 			    "Patching widget caps nid=%u 0x%08x -> 0x%08x\n",
2681 			    nid, orig, caps);
2682 		}
2683 	);
2684 
2685 	return (caps);
2686 }
2687 
2688 static void
2689 hdac_widget_parse(struct hdac_widget *w)
2690 {
2691 	struct hdac_softc *sc = w->devinfo->codec->sc;
2692 	uint32_t wcap, cap;
2693 	char *typestr;
2694 	nid_t cad = w->devinfo->codec->cad;
2695 	nid_t nid = w->nid;
2696 
2697 	wcap = hdac_widget_getcaps(w, &w->waspin);
2698 
2699 	w->param.widget_cap = wcap;
2700 	w->type = HDA_PARAM_AUDIO_WIDGET_CAP_TYPE(wcap);
2701 
2702 	switch (w->type) {
2703 	case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_OUTPUT:
2704 		typestr = "audio output";
2705 		break;
2706 	case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT:
2707 		typestr = "audio input";
2708 		break;
2709 	case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER:
2710 		typestr = "audio mixer";
2711 		break;
2712 	case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR:
2713 		typestr = "audio selector";
2714 		break;
2715 	case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX:
2716 		typestr = "pin";
2717 		break;
2718 	case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_POWER_WIDGET:
2719 		typestr = "power widget";
2720 		break;
2721 	case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_VOLUME_WIDGET:
2722 		typestr = "volume widget";
2723 		break;
2724 	case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_BEEP_WIDGET:
2725 		typestr = "beep widget";
2726 		break;
2727 	case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_VENDOR_WIDGET:
2728 		typestr = "vendor widget";
2729 		break;
2730 	default:
2731 		typestr = "unknown type";
2732 		break;
2733 	}
2734 
2735 	strlcpy(w->name, typestr, sizeof(w->name));
2736 
2737 	hdac_widget_connection_parse(w);
2738 
2739 	if (HDA_PARAM_AUDIO_WIDGET_CAP_OUT_AMP(wcap)) {
2740 		if (HDA_PARAM_AUDIO_WIDGET_CAP_AMP_OVR(wcap))
2741 			w->param.outamp_cap =
2742 			    hdac_command(sc,
2743 			    HDA_CMD_GET_PARAMETER(cad, nid,
2744 			    HDA_PARAM_OUTPUT_AMP_CAP), cad);
2745 		else
2746 			w->param.outamp_cap =
2747 			    w->devinfo->function.audio.outamp_cap;
2748 	} else
2749 		w->param.outamp_cap = 0;
2750 
2751 	if (HDA_PARAM_AUDIO_WIDGET_CAP_IN_AMP(wcap)) {
2752 		if (HDA_PARAM_AUDIO_WIDGET_CAP_AMP_OVR(wcap))
2753 			w->param.inamp_cap =
2754 			    hdac_command(sc,
2755 			    HDA_CMD_GET_PARAMETER(cad, nid,
2756 			    HDA_PARAM_INPUT_AMP_CAP), cad);
2757 		else
2758 			w->param.inamp_cap =
2759 			    w->devinfo->function.audio.inamp_cap;
2760 	} else
2761 		w->param.inamp_cap = 0;
2762 
2763 	if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_OUTPUT ||
2764 	    w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT) {
2765 		if (HDA_PARAM_AUDIO_WIDGET_CAP_FORMAT_OVR(wcap)) {
2766 			cap = hdac_command(sc,
2767 			    HDA_CMD_GET_PARAMETER(cad, nid,
2768 			    HDA_PARAM_SUPP_STREAM_FORMATS), cad);
2769 			w->param.supp_stream_formats = (cap != 0) ? cap :
2770 			    w->devinfo->function.audio.supp_stream_formats;
2771 			cap = hdac_command(sc,
2772 			    HDA_CMD_GET_PARAMETER(cad, nid,
2773 			    HDA_PARAM_SUPP_PCM_SIZE_RATE), cad);
2774 			w->param.supp_pcm_size_rate = (cap != 0) ? cap :
2775 			    w->devinfo->function.audio.supp_pcm_size_rate;
2776 		} else {
2777 			w->param.supp_stream_formats =
2778 			    w->devinfo->function.audio.supp_stream_formats;
2779 			w->param.supp_pcm_size_rate =
2780 			    w->devinfo->function.audio.supp_pcm_size_rate;
2781 		}
2782 	} else {
2783 		w->param.supp_stream_formats = 0;
2784 		w->param.supp_pcm_size_rate = 0;
2785 	}
2786 
2787 	if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX)
2788 		hdac_widget_pin_parse(w);
2789 }
2790 
2791 static struct hdac_widget *
2792 hdac_widget_get(struct hdac_devinfo *devinfo, nid_t nid)
2793 {
2794 	if (devinfo == NULL || devinfo->widget == NULL ||
2795 		    nid < devinfo->startnode || nid >= devinfo->endnode)
2796 		return (NULL);
2797 	return (&devinfo->widget[nid - devinfo->startnode]);
2798 }
2799 
2800 static __inline int
2801 hda_poll_channel(struct hdac_chan *ch)
2802 {
2803 	uint32_t sz, delta;
2804 	volatile uint32_t ptr;
2805 
2806 	if (!(ch->flags & HDAC_CHN_RUNNING))
2807 		return (0);
2808 
2809 	sz = ch->blksz * ch->blkcnt;
2810 	if (ch->dmapos != NULL)
2811 		ptr = *(ch->dmapos);
2812 	else
2813 		ptr = HDAC_READ_4(&ch->devinfo->codec->sc->mem,
2814 		    ch->off + HDAC_SDLPIB);
2815 	ch->ptr = ptr;
2816 	ptr %= sz;
2817 	ptr &= ~(ch->blksz - 1);
2818 	delta = (sz + ptr - ch->prevptr) % sz;
2819 
2820 	if (delta < ch->blksz)
2821 		return (0);
2822 
2823 	ch->prevptr = ptr;
2824 
2825 	return (1);
2826 }
2827 
2828 static void
2829 hda_poll_callback(void *arg)
2830 {
2831 	struct hdac_softc *sc = arg;
2832 	uint32_t trigger;
2833 	int i, active = 0;
2834 
2835 	if (sc == NULL)
2836 		return;
2837 
2838 	hdac_lock(sc);
2839 	if (sc->polling == 0) {
2840 		hdac_unlock(sc);
2841 		return;
2842 	}
2843 
2844 	trigger = 0;
2845 	for (i = 0; i < sc->num_chans; i++) {
2846 		if ((sc->chans[i].flags & HDAC_CHN_RUNNING) == 0)
2847 		    continue;
2848 		active = 1;
2849 		if (hda_poll_channel(&sc->chans[i]))
2850 		    trigger |= (1 << i);
2851 	}
2852 
2853 	/* XXX */
2854 	if (active)
2855 		callout_reset(&sc->poll_hda, sc->poll_ticks,
2856 		    hda_poll_callback, sc);
2857 
2858 	hdac_unlock(sc);
2859 
2860 	for (i = 0; i < sc->num_chans; i++) {
2861 		if (trigger & (1 << i))
2862 			chn_intr(sc->chans[i].c);
2863 	}
2864 }
2865 
2866 static int
2867 hdac_rirb_flush(struct hdac_softc *sc)
2868 {
2869 	struct hdac_rirb *rirb_base, *rirb;
2870 	struct hdac_codec *codec;
2871 	struct hdac_command_list *commands;
2872 	nid_t cad;
2873 	uint32_t resp;
2874 	uint8_t rirbwp;
2875 	int ret;
2876 
2877 	rirb_base = (struct hdac_rirb *)sc->rirb_dma.dma_vaddr;
2878 	rirbwp = HDAC_READ_1(&sc->mem, HDAC_RIRBWP);
2879 #if 0
2880 	bus_dmamap_sync(sc->rirb_dma.dma_tag, sc->rirb_dma.dma_map,
2881 	    BUS_DMASYNC_POSTREAD);
2882 #endif
2883 
2884 	ret = 0;
2885 
2886 	while (sc->rirb_rp != rirbwp) {
2887 		sc->rirb_rp++;
2888 		sc->rirb_rp %= sc->rirb_size;
2889 		rirb = &rirb_base[sc->rirb_rp];
2890 		cad = HDAC_RIRB_RESPONSE_EX_SDATA_IN(rirb->response_ex);
2891 		if (cad < 0 || cad >= HDAC_CODEC_MAX ||
2892 		    sc->codecs[cad] == NULL)
2893 			continue;
2894 		resp = rirb->response;
2895 		codec = sc->codecs[cad];
2896 		commands = codec->commands;
2897 		if (rirb->response_ex & HDAC_RIRB_RESPONSE_EX_UNSOLICITED) {
2898 			sc->unsolq[sc->unsolq_wp++] = (cad << 16) |
2899 			    ((resp >> 26) & 0xffff);
2900 			sc->unsolq_wp %= HDAC_UNSOLQ_MAX;
2901 		} else if (commands != NULL && commands->num_commands > 0 &&
2902 		    codec->responses_received < commands->num_commands)
2903 			commands->responses[codec->responses_received++] =
2904 			    resp;
2905 		ret++;
2906 	}
2907 
2908 	return (ret);
2909 }
2910 
2911 static int
2912 hdac_unsolq_flush(struct hdac_softc *sc)
2913 {
2914 	nid_t cad;
2915 	uint32_t tag;
2916 	int ret = 0;
2917 
2918 	if (sc->unsolq_st == HDAC_UNSOLQ_READY) {
2919 		sc->unsolq_st = HDAC_UNSOLQ_BUSY;
2920 		while (sc->unsolq_rp != sc->unsolq_wp) {
2921 			cad = sc->unsolq[sc->unsolq_rp] >> 16;
2922 			tag = sc->unsolq[sc->unsolq_rp++] & 0xffff;
2923 			sc->unsolq_rp %= HDAC_UNSOLQ_MAX;
2924 			hdac_unsolicited_handler(sc->codecs[cad], tag);
2925 			ret++;
2926 		}
2927 		sc->unsolq_st = HDAC_UNSOLQ_READY;
2928 	}
2929 
2930 	return (ret);
2931 }
2932 
2933 static void
2934 hdac_poll_callback(void *arg)
2935 {
2936 	struct hdac_softc *sc = arg;
2937 	if (sc == NULL)
2938 		return;
2939 
2940 	hdac_lock(sc);
2941 	if (sc->polling == 0 || sc->poll_ival == 0) {
2942 		hdac_unlock(sc);
2943 		return;
2944 	}
2945 	if (hdac_rirb_flush(sc) != 0)
2946 		hdac_unsolq_flush(sc);
2947 	callout_reset(&sc->poll_hdac, sc->poll_ival, hdac_poll_callback, sc);
2948 	hdac_unlock(sc);
2949 }
2950 
2951 static void
2952 hdac_poll_reinit(struct hdac_softc *sc)
2953 {
2954 	int i, pollticks, min = 1000000;
2955 	struct hdac_chan *ch;
2956 
2957 	for (i = 0; i < sc->num_chans; i++) {
2958 		if ((sc->chans[i].flags & HDAC_CHN_RUNNING) == 0)
2959 			continue;
2960 		ch = &sc->chans[i];
2961 		pollticks = ((uint64_t)hz * ch->blksz) /
2962 		    ((uint64_t)sndbuf_getalign(ch->b) * sndbuf_getspd(ch->b));
2963 		pollticks >>= 1;
2964 		if (pollticks > hz)
2965 			pollticks = hz;
2966 		if (pollticks < 1) {
2967 			HDA_BOOTVERBOSE(
2968 				device_printf(sc->dev,
2969 				    "%s: pollticks=%d < 1 !\n",
2970 				    __func__, pollticks);
2971 			);
2972 			pollticks = 1;
2973 		}
2974 		if (min > pollticks)
2975 			min = pollticks;
2976 	}
2977 	HDA_BOOTVERBOSE(
2978 		device_printf(sc->dev,
2979 		    "%s: pollticks %d -> %d\n",
2980 		    __func__, sc->poll_ticks, min);
2981 	);
2982 	sc->poll_ticks = min;
2983 	if (min == 1000000)
2984 		callout_stop(&sc->poll_hda);
2985 	else
2986 		callout_reset(&sc->poll_hda, 1, hda_poll_callback, sc);
2987 }
2988 
2989 static void
2990 hdac_stream_stop(struct hdac_chan *ch)
2991 {
2992 	struct hdac_softc *sc = ch->devinfo->codec->sc;
2993 	uint32_t ctl;
2994 
2995 	ctl = HDAC_READ_1(&sc->mem, ch->off + HDAC_SDCTL0);
2996 	ctl &= ~(HDAC_SDCTL_IOCE | HDAC_SDCTL_FEIE | HDAC_SDCTL_DEIE |
2997 	    HDAC_SDCTL_RUN);
2998 	HDAC_WRITE_1(&sc->mem, ch->off + HDAC_SDCTL0, ctl);
2999 
3000 	ch->flags &= ~HDAC_CHN_RUNNING;
3001 
3002 	if (sc->polling != 0)
3003 		hdac_poll_reinit(sc);
3004 
3005 	ctl = HDAC_READ_4(&sc->mem, HDAC_INTCTL);
3006 	ctl &= ~(1 << (ch->off >> 5));
3007 	HDAC_WRITE_4(&sc->mem, HDAC_INTCTL, ctl);
3008 }
3009 
3010 static void
3011 hdac_stream_start(struct hdac_chan *ch)
3012 {
3013 	struct hdac_softc *sc = ch->devinfo->codec->sc;
3014 	uint32_t ctl;
3015 
3016 	ch->flags |= HDAC_CHN_RUNNING;
3017 
3018 	if (sc->polling != 0)
3019 		hdac_poll_reinit(sc);
3020 
3021 	ctl = HDAC_READ_4(&sc->mem, HDAC_INTCTL);
3022 	ctl |= 1 << (ch->off >> 5);
3023 	HDAC_WRITE_4(&sc->mem, HDAC_INTCTL, ctl);
3024 
3025 	ctl = HDAC_READ_1(&sc->mem, ch->off + HDAC_SDCTL0);
3026 	ctl |= HDAC_SDCTL_IOCE | HDAC_SDCTL_FEIE | HDAC_SDCTL_DEIE |
3027 	    HDAC_SDCTL_RUN;
3028 	HDAC_WRITE_1(&sc->mem, ch->off + HDAC_SDCTL0, ctl);
3029 }
3030 
3031 static void
3032 hdac_stream_reset(struct hdac_chan *ch)
3033 {
3034 	struct hdac_softc *sc = ch->devinfo->codec->sc;
3035 	int timeout = 1000;
3036 	int to = timeout;
3037 	uint32_t ctl;
3038 
3039 	ctl = HDAC_READ_1(&sc->mem, ch->off + HDAC_SDCTL0);
3040 	ctl |= HDAC_SDCTL_SRST;
3041 	HDAC_WRITE_1(&sc->mem, ch->off + HDAC_SDCTL0, ctl);
3042 	do {
3043 		ctl = HDAC_READ_1(&sc->mem, ch->off + HDAC_SDCTL0);
3044 		if (ctl & HDAC_SDCTL_SRST)
3045 			break;
3046 		DELAY(10);
3047 	} while (--to);
3048 	if (!(ctl & HDAC_SDCTL_SRST)) {
3049 		device_printf(sc->dev, "timeout in reset\n");
3050 	}
3051 	ctl &= ~HDAC_SDCTL_SRST;
3052 	HDAC_WRITE_1(&sc->mem, ch->off + HDAC_SDCTL0, ctl);
3053 	to = timeout;
3054 	do {
3055 		ctl = HDAC_READ_1(&sc->mem, ch->off + HDAC_SDCTL0);
3056 		if (!(ctl & HDAC_SDCTL_SRST))
3057 			break;
3058 		DELAY(10);
3059 	} while (--to);
3060 	if (ctl & HDAC_SDCTL_SRST)
3061 		device_printf(sc->dev, "can't reset!\n");
3062 }
3063 
3064 static void
3065 hdac_stream_setid(struct hdac_chan *ch)
3066 {
3067 	struct hdac_softc *sc = ch->devinfo->codec->sc;
3068 	uint32_t ctl;
3069 
3070 	ctl = HDAC_READ_1(&sc->mem, ch->off + HDAC_SDCTL2);
3071 	ctl &= ~HDAC_SDCTL2_STRM_MASK;
3072 	ctl |= ch->sid << HDAC_SDCTL2_STRM_SHIFT;
3073 	HDAC_WRITE_1(&sc->mem, ch->off + HDAC_SDCTL2, ctl);
3074 }
3075 
3076 static void
3077 hdac_bdl_setup(struct hdac_chan *ch)
3078 {
3079 	struct hdac_softc *sc = ch->devinfo->codec->sc;
3080 	struct hdac_bdle *bdle;
3081 	uint64_t addr;
3082 	uint32_t blksz, blkcnt;
3083 	int i;
3084 
3085 	addr = (uint64_t)sndbuf_getbufaddr(ch->b);
3086 	bdle = (struct hdac_bdle *)ch->bdl_dma.dma_vaddr;
3087 
3088 	blksz = ch->blksz;
3089 	blkcnt = ch->blkcnt;
3090 
3091 	for (i = 0; i < blkcnt; i++, bdle++) {
3092 		bdle->addrl = (uint32_t)addr;
3093 		bdle->addrh = (uint32_t)(addr >> 32);
3094 		bdle->len = blksz;
3095 		bdle->ioc = 1;
3096 		addr += blksz;
3097 	}
3098 
3099 	HDAC_WRITE_4(&sc->mem, ch->off + HDAC_SDCBL, blksz * blkcnt);
3100 	HDAC_WRITE_2(&sc->mem, ch->off + HDAC_SDLVI, blkcnt - 1);
3101 	addr = ch->bdl_dma.dma_paddr;
3102 	HDAC_WRITE_4(&sc->mem, ch->off + HDAC_SDBDPL, (uint32_t)addr);
3103 	HDAC_WRITE_4(&sc->mem, ch->off + HDAC_SDBDPU, (uint32_t)(addr >> 32));
3104 	if (ch->dmapos != NULL &&
3105 	    !(HDAC_READ_4(&sc->mem, HDAC_DPIBLBASE) & 0x00000001)) {
3106 		addr = sc->pos_dma.dma_paddr;
3107 		HDAC_WRITE_4(&sc->mem, HDAC_DPIBLBASE,
3108 		    ((uint32_t)addr & HDAC_DPLBASE_DPLBASE_MASK) | 0x00000001);
3109 		HDAC_WRITE_4(&sc->mem, HDAC_DPIBUBASE, (uint32_t)(addr >> 32));
3110 	}
3111 }
3112 
3113 static int
3114 hdac_bdl_alloc(struct hdac_chan *ch)
3115 {
3116 	struct hdac_softc *sc = ch->devinfo->codec->sc;
3117 	int rc;
3118 
3119 	rc = hdac_dma_alloc(sc, &ch->bdl_dma,
3120 	    sizeof(struct hdac_bdle) * HDA_BDL_MAX);
3121 	if (rc) {
3122 		device_printf(sc->dev, "can't alloc bdl\n");
3123 		return (rc);
3124 	}
3125 
3126 	return (0);
3127 }
3128 
3129 static void
3130 hdac_audio_ctl_amp_set_internal(struct hdac_softc *sc, nid_t cad, nid_t nid,
3131 					int index, int lmute, int rmute,
3132 					int left, int right, int dir)
3133 {
3134 	uint16_t v = 0;
3135 
3136 	if (sc == NULL)
3137 		return;
3138 
3139 	if (left != right || lmute != rmute) {
3140 		v = (1 << (15 - dir)) | (1 << 13) | (index << 8) |
3141 		    (lmute << 7) | left;
3142 		hdac_command(sc,
3143 		    HDA_CMD_SET_AMP_GAIN_MUTE(cad, nid, v), cad);
3144 		v = (1 << (15 - dir)) | (1 << 12) | (index << 8) |
3145 		    (rmute << 7) | right;
3146 	} else
3147 		v = (1 << (15 - dir)) | (3 << 12) | (index << 8) |
3148 		    (lmute << 7) | left;
3149 
3150 	hdac_command(sc,
3151 	    HDA_CMD_SET_AMP_GAIN_MUTE(cad, nid, v), cad);
3152 }
3153 
3154 static void
3155 hdac_audio_ctl_amp_set(struct hdac_audio_ctl *ctl, uint32_t mute,
3156 						int left, int right)
3157 {
3158 	struct hdac_softc *sc;
3159 	nid_t nid, cad;
3160 	int lmute, rmute;
3161 
3162 	sc = ctl->widget->devinfo->codec->sc;
3163 	cad = ctl->widget->devinfo->codec->cad;
3164 	nid = ctl->widget->nid;
3165 
3166 	/* Save new values if valid. */
3167 	if (mute != HDA_AMP_MUTE_DEFAULT)
3168 		ctl->muted = mute;
3169 	if (left != HDA_AMP_VOL_DEFAULT)
3170 		ctl->left = left;
3171 	if (right != HDA_AMP_VOL_DEFAULT)
3172 		ctl->right = right;
3173 	/* Prepare effective values */
3174 	if (ctl->forcemute) {
3175 		lmute = 1;
3176 		rmute = 1;
3177 		left = 0;
3178 		right = 0;
3179 	} else {
3180 		lmute = HDA_AMP_LEFT_MUTED(ctl->muted);
3181 		rmute = HDA_AMP_RIGHT_MUTED(ctl->muted);
3182 		left = ctl->left;
3183 		right = ctl->right;
3184 	}
3185 	/* Apply effective values */
3186 	if (ctl->dir & HDA_CTL_OUT)
3187 		hdac_audio_ctl_amp_set_internal(sc, cad, nid, ctl->index,
3188 		    lmute, rmute, left, right, 0);
3189 	if (ctl->dir & HDA_CTL_IN)
3190     		hdac_audio_ctl_amp_set_internal(sc, cad, nid, ctl->index,
3191 		    lmute, rmute, left, right, 1);
3192 }
3193 
3194 static void
3195 hdac_widget_connection_select(struct hdac_widget *w, uint8_t index)
3196 {
3197 	if (w == NULL || w->nconns < 1 || index > (w->nconns - 1))
3198 		return;
3199 	hdac_command(w->devinfo->codec->sc,
3200 	    HDA_CMD_SET_CONNECTION_SELECT_CONTROL(w->devinfo->codec->cad,
3201 	    w->nid, index), w->devinfo->codec->cad);
3202 	w->selconn = index;
3203 }
3204 
3205 
3206 /****************************************************************************
3207  * uint32_t hdac_command_sendone_internal
3208  *
3209  * Wrapper function that sends only one command to a given codec
3210  ****************************************************************************/
3211 static uint32_t
3212 hdac_command_sendone_internal(struct hdac_softc *sc, uint32_t verb, nid_t cad)
3213 {
3214 	struct hdac_command_list cl;
3215 	uint32_t response = HDAC_INVALID;
3216 
3217 	if (!hdac_lockowned(sc))
3218 		device_printf(sc->dev, "WARNING!!!! mtx not owned!!!!\n");
3219 	cl.num_commands = 1;
3220 	cl.verbs = &verb;
3221 	cl.responses = &response;
3222 
3223 	hdac_command_send_internal(sc, &cl, cad);
3224 
3225 	return (response);
3226 }
3227 
3228 /****************************************************************************
3229  * hdac_command_send_internal
3230  *
3231  * Send a command list to the codec via the corb. We queue as much verbs as
3232  * we can and msleep on the codec. When the interrupt get the responses
3233  * back from the rirb, it will wake us up so we can queue the remaining verbs
3234  * if any.
3235  ****************************************************************************/
3236 static void
3237 hdac_command_send_internal(struct hdac_softc *sc,
3238 			struct hdac_command_list *commands, nid_t cad)
3239 {
3240 	struct hdac_codec *codec;
3241 	int corbrp;
3242 	uint32_t *corb;
3243 	int timeout;
3244 	int retry = 10;
3245 	struct hdac_rirb *rirb_base;
3246 
3247 	if (sc == NULL || sc->codecs[cad] == NULL || commands == NULL ||
3248 	    commands->num_commands < 1)
3249 		return;
3250 
3251 	codec = sc->codecs[cad];
3252 	codec->commands = commands;
3253 	codec->responses_received = 0;
3254 	codec->verbs_sent = 0;
3255 	corb = (uint32_t *)sc->corb_dma.dma_vaddr;
3256 	rirb_base = (struct hdac_rirb *)sc->rirb_dma.dma_vaddr;
3257 
3258 	do {
3259 		if (codec->verbs_sent != commands->num_commands) {
3260 			/* Queue as many verbs as possible */
3261 			corbrp = HDAC_READ_2(&sc->mem, HDAC_CORBRP);
3262 #if 0
3263 			bus_dmamap_sync(sc->corb_dma.dma_tag,
3264 			    sc->corb_dma.dma_map, BUS_DMASYNC_PREWRITE);
3265 #endif
3266 			while (codec->verbs_sent != commands->num_commands &&
3267 			    ((sc->corb_wp + 1) % sc->corb_size) != corbrp) {
3268 				sc->corb_wp++;
3269 				sc->corb_wp %= sc->corb_size;
3270 				corb[sc->corb_wp] =
3271 				    commands->verbs[codec->verbs_sent++];
3272 			}
3273 
3274 			/* Send the verbs to the codecs */
3275 #if 0
3276 			bus_dmamap_sync(sc->corb_dma.dma_tag,
3277 			    sc->corb_dma.dma_map, BUS_DMASYNC_POSTWRITE);
3278 #endif
3279 			HDAC_WRITE_2(&sc->mem, HDAC_CORBWP, sc->corb_wp);
3280 		}
3281 
3282 		timeout = 1000;
3283 		while (hdac_rirb_flush(sc) == 0 && --timeout)
3284 			DELAY(10);
3285 	} while ((codec->verbs_sent != commands->num_commands ||
3286 	    codec->responses_received != commands->num_commands) && --retry);
3287 
3288 	if (retry == 0)
3289 		device_printf(sc->dev,
3290 		    "%s: TIMEOUT numcmd=%d, sent=%d, received=%d\n",
3291 		    __func__, commands->num_commands, codec->verbs_sent,
3292 		    codec->responses_received);
3293 
3294 	codec->commands = NULL;
3295 	codec->responses_received = 0;
3296 	codec->verbs_sent = 0;
3297 
3298 	hdac_unsolq_flush(sc);
3299 }
3300 
3301 
3302 /****************************************************************************
3303  * Device Methods
3304  ****************************************************************************/
3305 
3306 /****************************************************************************
3307  * int hdac_probe(device_t)
3308  *
3309  * Probe for the presence of an hdac. If none is found, check for a generic
3310  * match using the subclass of the device.
3311  ****************************************************************************/
3312 static int
3313 hdac_probe(device_t dev)
3314 {
3315 	int i, result;
3316 	uint32_t model;
3317 	uint16_t class, subclass;
3318 	char desc[64];
3319 
3320 	model = (uint32_t)pci_get_device(dev) << 16;
3321 	model |= (uint32_t)pci_get_vendor(dev) & 0x0000ffff;
3322 	class = pci_get_class(dev);
3323 	subclass = pci_get_subclass(dev);
3324 
3325 	bzero(desc, sizeof(desc));
3326 	result = ENXIO;
3327 	for (i = 0; i < HDAC_DEVICES_LEN; i++) {
3328 		if (hdac_devices[i].model == model) {
3329 		    	strlcpy(desc, hdac_devices[i].desc, sizeof(desc));
3330 		    	result = BUS_PROBE_DEFAULT;
3331 			break;
3332 		}
3333 		if (HDA_DEV_MATCH(hdac_devices[i].model, model) &&
3334 		    class == PCIC_MULTIMEDIA &&
3335 		    subclass == PCIS_MULTIMEDIA_HDA) {
3336 		    	strlcpy(desc, hdac_devices[i].desc, sizeof(desc));
3337 		    	result = BUS_PROBE_GENERIC;
3338 			break;
3339 		}
3340 	}
3341 	if (result == ENXIO && class == PCIC_MULTIMEDIA &&
3342 	    subclass == PCIS_MULTIMEDIA_HDA) {
3343 		strlcpy(desc, "Generic", sizeof(desc));
3344 	    	result = BUS_PROBE_GENERIC;
3345 	}
3346 	if (result != ENXIO) {
3347 		strlcat(desc, " High Definition Audio Controller",
3348 		    sizeof(desc));
3349 		device_set_desc_copy(dev, desc);
3350 	}
3351 
3352 	return (result);
3353 }
3354 
3355 static void *
3356 hdac_channel_init(kobj_t obj, void *data, struct snd_dbuf *b,
3357 					struct pcm_channel *c, int dir)
3358 {
3359 	struct hdac_pcm_devinfo *pdevinfo = data;
3360 	struct hdac_devinfo *devinfo = pdevinfo->devinfo;
3361 	struct hdac_softc *sc = devinfo->codec->sc;
3362 	struct hdac_chan *ch;
3363 	int i, ord = 0, chid;
3364 
3365 	hdac_lock(sc);
3366 
3367 	chid = (dir == PCMDIR_PLAY)?pdevinfo->play:pdevinfo->rec;
3368 	ch = &sc->chans[chid];
3369 	for (i = 0; i < sc->num_chans && i < chid; i++) {
3370 		if (ch->dir == sc->chans[i].dir)
3371 			ord++;
3372 	}
3373 	if (dir == PCMDIR_PLAY) {
3374 		ch->off = (sc->num_iss + ord) << 5;
3375 	} else {
3376 		ch->off = ord << 5;
3377 	}
3378 
3379 	if (devinfo->function.audio.quirks & HDA_QUIRK_FIXEDRATE) {
3380 		ch->caps.minspeed = ch->caps.maxspeed = 48000;
3381 		ch->pcmrates[0] = 48000;
3382 		ch->pcmrates[1] = 0;
3383 	}
3384 	if (sc->pos_dma.dma_vaddr != NULL)
3385 		ch->dmapos = (uint32_t *)(sc->pos_dma.dma_vaddr +
3386 		    (sc->streamcnt * 8));
3387 	else
3388 		ch->dmapos = NULL;
3389 	ch->sid = ++sc->streamcnt;
3390 	ch->dir = dir;
3391 	ch->b = b;
3392 	ch->c = c;
3393 	ch->blksz = pdevinfo->chan_size / pdevinfo->chan_blkcnt;
3394 	ch->blkcnt = pdevinfo->chan_blkcnt;
3395 	hdac_unlock(sc);
3396 
3397 	if (hdac_bdl_alloc(ch) != 0) {
3398 		ch->blkcnt = 0;
3399 		return (NULL);
3400 	}
3401 
3402 	if (sndbuf_alloc(ch->b, sc->chan_dmat,
3403 	    (sc->flags & HDAC_F_DMA_NOCACHE) ? BUS_DMA_NOCACHE : 0,
3404 	    pdevinfo->chan_size) != 0)
3405 		return (NULL);
3406 
3407 	return (ch);
3408 }
3409 
3410 static int
3411 hdac_channel_setformat(kobj_t obj, void *data, uint32_t format)
3412 {
3413 	struct hdac_chan *ch = data;
3414 	int i;
3415 
3416 	for (i = 0; ch->caps.fmtlist[i] != 0; i++) {
3417 		if (format == ch->caps.fmtlist[i]) {
3418 			ch->fmt = format;
3419 			return (0);
3420 		}
3421 	}
3422 
3423 	return (EINVAL);
3424 }
3425 
3426 static uint32_t
3427 hdac_channel_setspeed(kobj_t obj, void *data, uint32_t speed)
3428 {
3429 	struct hdac_chan *ch = data;
3430 	uint32_t spd = 0, threshold;
3431 	int i;
3432 
3433 	for (i = 0; ch->pcmrates[i] != 0; i++) {
3434 		spd = ch->pcmrates[i];
3435 		threshold = spd + ((ch->pcmrates[i + 1] != 0) ?
3436 		    ((ch->pcmrates[i + 1] - spd) >> 1) : 0);
3437 		if (speed < threshold)
3438 			break;
3439 	}
3440 
3441 	if (spd == 0)	/* impossible */
3442 		ch->spd = 48000;
3443 	else
3444 		ch->spd = spd;
3445 
3446 	return (ch->spd);
3447 }
3448 
3449 static void
3450 hdac_stream_setup(struct hdac_chan *ch)
3451 {
3452 	struct hdac_softc *sc = ch->devinfo->codec->sc;
3453 	struct hdac_audio_as *as = &ch->devinfo->function.audio.as[ch->as];
3454 	struct hdac_widget *w;
3455 	int i, chn, totalchn, c;
3456 	nid_t cad = ch->devinfo->codec->cad;
3457 	uint16_t fmt, dfmt;
3458 	uint16_t chmap[2][5] = {{ 0x0010, 0x0001, 0x0201, 0x0231, 0x0231 }, /* 5.1 */
3459 				{ 0x0010, 0x0001, 0x2001, 0x2031, 0x2431 }};/* 7.1 */
3460 	int map = -1;
3461 
3462 	totalchn = AFMT_CHANNEL(ch->fmt);
3463 	HDA_BOOTHVERBOSE(
3464 		device_printf(ch->pdevinfo->dev,
3465 		    "PCMDIR_%s: Stream setup fmt=%08x speed=%d\n",
3466 		    (ch->dir == PCMDIR_PLAY) ? "PLAY" : "REC",
3467 		    ch->fmt, ch->spd);
3468 	);
3469 	fmt = 0;
3470 	if (ch->fmt & AFMT_S16_LE)
3471 		fmt |= ch->bit16 << 4;
3472 	else if (ch->fmt & AFMT_S32_LE)
3473 		fmt |= ch->bit32 << 4;
3474 	else
3475 		fmt |= 1 << 4;
3476 	for (i = 0; i < HDA_RATE_TAB_LEN; i++) {
3477 		if (hda_rate_tab[i].valid && ch->spd == hda_rate_tab[i].rate) {
3478 			fmt |= hda_rate_tab[i].base;
3479 			fmt |= hda_rate_tab[i].mul;
3480 			fmt |= hda_rate_tab[i].div;
3481 			break;
3482 		}
3483 	}
3484 	fmt |= (totalchn - 1);
3485 
3486 	/* Set channel mapping for known speaker setups. */
3487 	if (as->pinset == 0x0007 || as->pinset == 0x0013) /* Standard 5.1 */
3488 		map = 0;
3489 	else if (as->pinset == 0x0017) /* Standard 7.1 */
3490 		map = 1;
3491 
3492 	HDAC_WRITE_2(&sc->mem, ch->off + HDAC_SDFMT, fmt);
3493 
3494 	dfmt = HDA_CMD_SET_DIGITAL_CONV_FMT1_DIGEN;
3495 	if (ch->fmt & AFMT_AC3)
3496 		dfmt |= HDA_CMD_SET_DIGITAL_CONV_FMT1_NAUDIO;
3497 
3498 	chn = 0;
3499 	for (i = 0; ch->io[i] != -1; i++) {
3500 		w = hdac_widget_get(ch->devinfo, ch->io[i]);
3501 		if (w == NULL)
3502 			continue;
3503 
3504 		/* If HP redirection is enabled, but failed to use same
3505 		   DAC, make last DAC to duplicate first one. */
3506 		if (as->hpredir >= 0 && i == as->pincnt) {
3507 			c = (ch->sid << 4);
3508 		} else {
3509 			if (map >= 0) /* Map known speaker setups. */
3510 				chn = (((chmap[map][totalchn / 2] >> i * 4) &
3511 				    0xf) - 1) * 2;
3512 			if (chn < 0 || chn >= totalchn) {
3513 				c = 0;
3514 			} else {
3515 				c = (ch->sid << 4) | chn;
3516 			}
3517 		}
3518 		HDA_BOOTHVERBOSE(
3519 			device_printf(ch->pdevinfo->dev,
3520 			    "PCMDIR_%s: Stream setup nid=%d: "
3521 			    "fmt=0x%04x, dfmt=0x%04x, chan=0x%04x\n",
3522 			    (ch->dir == PCMDIR_PLAY) ? "PLAY" : "REC",
3523 			    ch->io[i], fmt, dfmt, c);
3524 		);
3525 		hdac_command(sc,
3526 		    HDA_CMD_SET_CONV_FMT(cad, ch->io[i], fmt), cad);
3527 		if (HDA_PARAM_AUDIO_WIDGET_CAP_DIGITAL(w->param.widget_cap)) {
3528 			hdac_command(sc,
3529 			    HDA_CMD_SET_DIGITAL_CONV_FMT1(cad, ch->io[i], dfmt),
3530 			    cad);
3531 		}
3532 		hdac_command(sc,
3533 		    HDA_CMD_SET_CONV_STREAM_CHAN(cad, ch->io[i], c), cad);
3534 #if 0
3535 		hdac_command(sc,
3536 		    HDA_CMD_SET_CONV_CHAN_COUNT(cad, ch->io[i], 1), cad);
3537 		hdac_command(sc,
3538 		    HDA_CMD_SET_HDMI_CHAN_SLOT(cad, ch->io[i], 0x00), cad);
3539 		hdac_command(sc,
3540 		    HDA_CMD_SET_HDMI_CHAN_SLOT(cad, ch->io[i], 0x11), cad);
3541 #endif
3542 		chn += HDA_PARAM_AUDIO_WIDGET_CAP_CC(w->param.widget_cap) + 1;
3543 	}
3544 }
3545 
3546 /*
3547  * Greatest Common Divisor.
3548  */
3549 static unsigned
3550 gcd(unsigned a, unsigned b)
3551 {
3552 	u_int c;
3553 
3554 	while (b != 0) {
3555 		c = a;
3556 		a = b;
3557 		b = (c % b);
3558 	}
3559 	return (a);
3560 }
3561 
3562 /*
3563  * Least Common Multiple.
3564  */
3565 static unsigned
3566 lcm(unsigned a, unsigned b)
3567 {
3568 
3569 	return ((a * b) / gcd(a, b));
3570 }
3571 
3572 static int
3573 hdac_channel_setfragments(kobj_t obj, void *data,
3574 					uint32_t blksz, uint32_t blkcnt)
3575 {
3576 	struct hdac_chan *ch = data;
3577 	struct hdac_softc *sc = ch->devinfo->codec->sc;
3578 
3579 	blksz -= blksz % lcm(HDAC_DMA_ALIGNMENT, sndbuf_getalign(ch->b));
3580 
3581 	if (blksz > (sndbuf_getmaxsize(ch->b) / HDA_BDL_MIN))
3582 		blksz = sndbuf_getmaxsize(ch->b) / HDA_BDL_MIN;
3583 	if (blksz < HDA_BLK_MIN)
3584 		blksz = HDA_BLK_MIN;
3585 	if (blkcnt > HDA_BDL_MAX)
3586 		blkcnt = HDA_BDL_MAX;
3587 	if (blkcnt < HDA_BDL_MIN)
3588 		blkcnt = HDA_BDL_MIN;
3589 
3590 	while ((blksz * blkcnt) > sndbuf_getmaxsize(ch->b)) {
3591 		if ((blkcnt >> 1) >= HDA_BDL_MIN)
3592 			blkcnt >>= 1;
3593 		else if ((blksz >> 1) >= HDA_BLK_MIN)
3594 			blksz >>= 1;
3595 		else
3596 			break;
3597 	}
3598 
3599 	if ((sndbuf_getblksz(ch->b) != blksz ||
3600 	    sndbuf_getblkcnt(ch->b) != blkcnt) &&
3601 	    sndbuf_resize(ch->b, blkcnt, blksz) != 0)
3602 		device_printf(sc->dev, "%s: failed blksz=%u blkcnt=%u\n",
3603 		    __func__, blksz, blkcnt);
3604 
3605 	ch->blksz = sndbuf_getblksz(ch->b);
3606 	ch->blkcnt = sndbuf_getblkcnt(ch->b);
3607 
3608 	return (0);
3609 }
3610 
3611 static uint32_t
3612 hdac_channel_setblocksize(kobj_t obj, void *data, uint32_t blksz)
3613 {
3614 	struct hdac_chan *ch = data;
3615 
3616 	hdac_channel_setfragments(obj, data, blksz, ch->pdevinfo->chan_blkcnt);
3617 
3618 	return (ch->blksz);
3619 }
3620 
3621 static void
3622 hdac_channel_stop(struct hdac_softc *sc, struct hdac_chan *ch)
3623 {
3624 	struct hdac_devinfo *devinfo = ch->devinfo;
3625 	struct hdac_widget *w;
3626 	nid_t cad = devinfo->codec->cad;
3627 	int i;
3628 
3629 	hdac_stream_stop(ch);
3630 
3631 	for (i = 0; ch->io[i] != -1; i++) {
3632 		w = hdac_widget_get(ch->devinfo, ch->io[i]);
3633 		if (w == NULL)
3634 			continue;
3635 		if (HDA_PARAM_AUDIO_WIDGET_CAP_DIGITAL(w->param.widget_cap)) {
3636 			hdac_command(sc,
3637 			    HDA_CMD_SET_DIGITAL_CONV_FMT1(cad, ch->io[i], 0),
3638 			    cad);
3639 		}
3640 		hdac_command(sc,
3641 		    HDA_CMD_SET_CONV_STREAM_CHAN(cad, ch->io[i],
3642 		    0), cad);
3643 	}
3644 }
3645 
3646 static void
3647 hdac_channel_start(struct hdac_softc *sc, struct hdac_chan *ch)
3648 {
3649 	ch->ptr = 0;
3650 	ch->prevptr = 0;
3651 	hdac_stream_stop(ch);
3652 	hdac_stream_reset(ch);
3653 	hdac_bdl_setup(ch);
3654 	hdac_stream_setid(ch);
3655 	hdac_stream_setup(ch);
3656 	hdac_stream_start(ch);
3657 }
3658 
3659 static int
3660 hdac_channel_trigger(kobj_t obj, void *data, int go)
3661 {
3662 	struct hdac_chan *ch = data;
3663 	struct hdac_softc *sc = ch->devinfo->codec->sc;
3664 
3665 	if (!PCMTRIG_COMMON(go))
3666 		return (0);
3667 
3668 	hdac_lock(sc);
3669 	switch (go) {
3670 	case PCMTRIG_START:
3671 		hdac_channel_start(sc, ch);
3672 		break;
3673 	case PCMTRIG_STOP:
3674 	case PCMTRIG_ABORT:
3675 		hdac_channel_stop(sc, ch);
3676 		break;
3677 	default:
3678 		break;
3679 	}
3680 	hdac_unlock(sc);
3681 
3682 	return (0);
3683 }
3684 
3685 static uint32_t
3686 hdac_channel_getptr(kobj_t obj, void *data)
3687 {
3688 	struct hdac_chan *ch = data;
3689 	struct hdac_softc *sc = ch->devinfo->codec->sc;
3690 	uint32_t ptr;
3691 
3692 	hdac_lock(sc);
3693 	if (sc->polling != 0)
3694 		ptr = ch->ptr;
3695 	else if (ch->dmapos != NULL)
3696 		ptr = *(ch->dmapos);
3697 	else
3698 		ptr = HDAC_READ_4(&sc->mem, ch->off + HDAC_SDLPIB);
3699 	hdac_unlock(sc);
3700 
3701 	/*
3702 	 * Round to available space and force 128 bytes aligment.
3703 	 */
3704 	ptr %= ch->blksz * ch->blkcnt;
3705 	ptr &= HDA_BLK_ALIGN;
3706 
3707 	return (ptr);
3708 }
3709 
3710 static struct pcmchan_caps *
3711 hdac_channel_getcaps(kobj_t obj, void *data)
3712 {
3713 	return (&((struct hdac_chan *)data)->caps);
3714 }
3715 
3716 static kobj_method_t hdac_channel_methods[] = {
3717 	KOBJMETHOD(channel_init,		hdac_channel_init),
3718 	KOBJMETHOD(channel_setformat,		hdac_channel_setformat),
3719 	KOBJMETHOD(channel_setspeed,		hdac_channel_setspeed),
3720 	KOBJMETHOD(channel_setblocksize,	hdac_channel_setblocksize),
3721 	KOBJMETHOD(channel_setfragments,	hdac_channel_setfragments),
3722 	KOBJMETHOD(channel_trigger,		hdac_channel_trigger),
3723 	KOBJMETHOD(channel_getptr,		hdac_channel_getptr),
3724 	KOBJMETHOD(channel_getcaps,		hdac_channel_getcaps),
3725 	KOBJMETHOD_END
3726 };
3727 CHANNEL_DECLARE(hdac_channel);
3728 
3729 static int
3730 hdac_audio_ctl_ossmixer_init(struct snd_mixer *m)
3731 {
3732 	struct hdac_pcm_devinfo *pdevinfo = mix_getdevinfo(m);
3733 	struct hdac_devinfo *devinfo = pdevinfo->devinfo;
3734 	struct hdac_softc *sc = devinfo->codec->sc;
3735 	struct hdac_widget *w, *cw;
3736 	struct hdac_audio_ctl *ctl;
3737 	uint32_t mask, recmask, id;
3738 	int i, j, softpcmvol;
3739 
3740 	hdac_lock(sc);
3741 
3742 	/* Make sure that in case of soft volume it won't stay muted. */
3743 	for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
3744 		pdevinfo->left[i] = 100;
3745 		pdevinfo->right[i] = 100;
3746 	}
3747 
3748 	mask = 0;
3749 	recmask = 0;
3750 	id = hdac_codec_id(devinfo->codec);
3751 
3752 	/* Declate EAPD as ogain control. */
3753 	if (pdevinfo->play >= 0) {
3754 		for (i = devinfo->startnode; i < devinfo->endnode; i++) {
3755 			w = hdac_widget_get(devinfo, i);
3756 			if (w == NULL || w->enable == 0)
3757 				continue;
3758 			if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX ||
3759 			    w->param.eapdbtl == HDAC_INVALID ||
3760 			    w->bindas != sc->chans[pdevinfo->play].as)
3761 				continue;
3762 			mask |= SOUND_MASK_OGAIN;
3763 			break;
3764 		}
3765 	}
3766 
3767 	/* Declare volume controls assigned to this association. */
3768 	i = 0;
3769 	ctl = NULL;
3770 	while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) {
3771 		if (ctl->enable == 0)
3772 			continue;
3773 		if ((pdevinfo->play >= 0 &&
3774 		    ctl->widget->bindas == sc->chans[pdevinfo->play].as) ||
3775 		    (pdevinfo->rec >= 0 &&
3776 		    ctl->widget->bindas == sc->chans[pdevinfo->rec].as) ||
3777 		    (ctl->widget->bindas == -2 && pdevinfo->index == 0))
3778 			mask |= ctl->ossmask;
3779 	}
3780 
3781 	/* Declare record sources available to this association. */
3782 	if (pdevinfo->rec >= 0) {
3783 		struct hdac_chan *ch = &sc->chans[pdevinfo->rec];
3784 		for (i = 0; ch->io[i] != -1; i++) {
3785 			w = hdac_widget_get(devinfo, ch->io[i]);
3786 			if (w == NULL || w->enable == 0)
3787 				continue;
3788 			for (j = 0; j < w->nconns; j++) {
3789 				if (w->connsenable[j] == 0)
3790 					continue;
3791 				cw = hdac_widget_get(devinfo, w->conns[j]);
3792 				if (cw == NULL || cw->enable == 0)
3793 					continue;
3794 				if (cw->bindas != sc->chans[pdevinfo->rec].as &&
3795 				    cw->bindas != -2)
3796 					continue;
3797 				recmask |= cw->ossmask;
3798 			}
3799 		}
3800 	}
3801 
3802 	/* Declare soft PCM volume if needed. */
3803 	if (pdevinfo->play >= 0) {
3804 		ctl = NULL;
3805 		if ((mask & SOUND_MASK_PCM) == 0 ||
3806 		    (devinfo->function.audio.quirks & HDA_QUIRK_SOFTPCMVOL)) {
3807 			softpcmvol = 1;
3808 			mask |= SOUND_MASK_PCM;
3809 		} else {
3810 			softpcmvol = 0;
3811 			i = 0;
3812 			while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) {
3813 				if (ctl->enable == 0)
3814 					continue;
3815 				if (ctl->widget->bindas != sc->chans[pdevinfo->play].as &&
3816 				    (ctl->widget->bindas != -2 || pdevinfo->index != 0))
3817 					continue;
3818 				if (!(ctl->ossmask & SOUND_MASK_PCM))
3819 					continue;
3820 				if (ctl->step > 0)
3821 					break;
3822 			}
3823 		}
3824 
3825 		if (softpcmvol == 1 || ctl == NULL) {
3826 			pcm_setflags(pdevinfo->dev, pcm_getflags(pdevinfo->dev) | SD_F_SOFTPCMVOL);
3827 			HDA_BOOTVERBOSE(
3828 				device_printf(pdevinfo->dev,
3829 				    "%s Soft PCM volume\n",
3830 				    (softpcmvol == 1) ? "Forcing" : "Enabling");
3831 			);
3832 		}
3833 	}
3834 
3835 	/* Declare master volume if needed. */
3836 	if (pdevinfo->play >= 0) {
3837 		if ((mask & (SOUND_MASK_VOLUME | SOUND_MASK_PCM)) ==
3838 		    SOUND_MASK_PCM) {
3839 			mask |= SOUND_MASK_VOLUME;
3840 			mix_setparentchild(m, SOUND_MIXER_VOLUME,
3841 			    SOUND_MASK_PCM);
3842 			mix_setrealdev(m, SOUND_MIXER_VOLUME,
3843 			    SOUND_MIXER_NONE);
3844 			HDA_BOOTVERBOSE(
3845 				device_printf(pdevinfo->dev,
3846 				    "Forcing master volume with PCM\n");
3847 			);
3848 		}
3849 	}
3850 
3851 	recmask &= (1 << SOUND_MIXER_NRDEVICES) - 1;
3852 	mask &= (1 << SOUND_MIXER_NRDEVICES) - 1;
3853 
3854 	mix_setrecdevs(m, recmask);
3855 	mix_setdevs(m, mask);
3856 
3857 	hdac_unlock(sc);
3858 
3859 	return (0);
3860 }
3861 
3862 static int
3863 hdac_audio_ctl_ossmixer_set(struct snd_mixer *m, unsigned dev,
3864 					unsigned left, unsigned right)
3865 {
3866 	struct hdac_pcm_devinfo *pdevinfo = mix_getdevinfo(m);
3867 	struct hdac_devinfo *devinfo = pdevinfo->devinfo;
3868 	struct hdac_softc *sc = devinfo->codec->sc;
3869 	struct hdac_widget *w;
3870 	struct hdac_audio_ctl *ctl;
3871 	uint32_t mute;
3872 	int lvol, rvol;
3873 	int i, j;
3874 
3875 	hdac_lock(sc);
3876 	/* Save new values. */
3877 	pdevinfo->left[dev] = left;
3878 	pdevinfo->right[dev] = right;
3879 
3880 	/* 'ogain' is the special case implemented with EAPD. */
3881 	if (dev == SOUND_MIXER_OGAIN) {
3882 		uint32_t orig;
3883 		w = NULL;
3884 		for (i = devinfo->startnode; i < devinfo->endnode; i++) {
3885 			w = hdac_widget_get(devinfo, i);
3886 			if (w == NULL || w->enable == 0)
3887 				continue;
3888 			if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX ||
3889 			    w->param.eapdbtl == HDAC_INVALID)
3890 				continue;
3891 			break;
3892 		}
3893 		if (i >= devinfo->endnode) {
3894 			hdac_unlock(sc);
3895 			return (-1);
3896 		}
3897 		orig = w->param.eapdbtl;
3898 		if (left == 0)
3899 			w->param.eapdbtl &= ~HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD;
3900 		else
3901 			w->param.eapdbtl |= HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD;
3902 		if (orig != w->param.eapdbtl) {
3903 			uint32_t val;
3904 
3905 			val = w->param.eapdbtl;
3906 			if (devinfo->function.audio.quirks & HDA_QUIRK_EAPDINV)
3907 				val ^= HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD;
3908 			hdac_command(sc,
3909 			    HDA_CMD_SET_EAPD_BTL_ENABLE(devinfo->codec->cad,
3910 			    w->nid, val), devinfo->codec->cad);
3911 		}
3912 		hdac_unlock(sc);
3913 		return (left | (left << 8));
3914 	}
3915 
3916 	/* Recalculate all controls related to this OSS device. */
3917 	i = 0;
3918 	while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) {
3919 		if (ctl->enable == 0 ||
3920 		    !(ctl->ossmask & (1 << dev)))
3921 			continue;
3922 		if (!((pdevinfo->play >= 0 &&
3923 		    ctl->widget->bindas == sc->chans[pdevinfo->play].as) ||
3924 		    (pdevinfo->rec >= 0 &&
3925 		    ctl->widget->bindas == sc->chans[pdevinfo->rec].as) ||
3926 		    ctl->widget->bindas == -2))
3927 			continue;
3928 
3929 		lvol = 100;
3930 		rvol = 100;
3931 		for (j = 0; j < SOUND_MIXER_NRDEVICES; j++) {
3932 			if (ctl->ossmask & (1 << j)) {
3933 				lvol = lvol * pdevinfo->left[j] / 100;
3934 				rvol = rvol * pdevinfo->right[j] / 100;
3935 			}
3936 		}
3937 		mute = (lvol == 0) ? HDA_AMP_MUTE_LEFT : 0;
3938 		mute |= (rvol == 0) ? HDA_AMP_MUTE_RIGHT : 0;
3939 		lvol = (lvol * ctl->step + 50) / 100;
3940 		rvol = (rvol * ctl->step + 50) / 100;
3941 		hdac_audio_ctl_amp_set(ctl, mute, lvol, rvol);
3942 	}
3943 	hdac_unlock(sc);
3944 
3945 	return (left | (right << 8));
3946 }
3947 
3948 /*
3949  * Commutate specified record source.
3950  */
3951 static uint32_t
3952 hdac_audio_ctl_recsel_comm(struct hdac_pcm_devinfo *pdevinfo, uint32_t src, nid_t nid, int depth)
3953 {
3954 	struct hdac_devinfo *devinfo = pdevinfo->devinfo;
3955 	struct hdac_widget *w, *cw;
3956 	struct hdac_audio_ctl *ctl;
3957 	char buf[64];
3958 	int i, muted;
3959 	uint32_t res = 0;
3960 
3961 	if (depth > HDA_PARSE_MAXDEPTH)
3962 		return (0);
3963 
3964 	w = hdac_widget_get(devinfo, nid);
3965 	if (w == NULL || w->enable == 0)
3966 		return (0);
3967 
3968 	for (i = 0; i < w->nconns; i++) {
3969 		if (w->connsenable[i] == 0)
3970 			continue;
3971 		cw = hdac_widget_get(devinfo, w->conns[i]);
3972 		if (cw == NULL || cw->enable == 0 || cw->bindas == -1)
3973 			continue;
3974 		/* Call recursively to trace signal to it's source if needed. */
3975 		if ((src & cw->ossmask) != 0) {
3976 			if (cw->ossdev < 0) {
3977 				res |= hdac_audio_ctl_recsel_comm(pdevinfo, src,
3978 				    w->conns[i], depth + 1);
3979 			} else {
3980 				res |= cw->ossmask;
3981 			}
3982 		}
3983 		/* We have two special cases: mixers and others (selectors). */
3984 		if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER) {
3985 			ctl = hdac_audio_ctl_amp_get(devinfo,
3986 			    w->nid, HDA_CTL_IN, i, 1);
3987 			if (ctl == NULL)
3988 				continue;
3989 			/* If we have input control on this node mute them
3990 			 * according to requested sources. */
3991 			muted = (src & cw->ossmask) ? 0 : 1;
3992 	    		if (muted != ctl->forcemute) {
3993 				ctl->forcemute = muted;
3994 				hdac_audio_ctl_amp_set(ctl,
3995 				    HDA_AMP_MUTE_DEFAULT,
3996 				    HDA_AMP_VOL_DEFAULT, HDA_AMP_VOL_DEFAULT);
3997 			}
3998 			HDA_BOOTHVERBOSE(
3999 				device_printf(pdevinfo->dev,
4000 				    "Recsel (%s): nid %d source %d %s\n",
4001 				    hdac_audio_ctl_ossmixer_mask2allname(
4002 				    src, buf, sizeof(buf)),
4003 				    nid, i, muted?"mute":"unmute");
4004 			);
4005 		} else {
4006 			if (w->nconns == 1)
4007 				break;
4008 			if ((src & cw->ossmask) == 0)
4009 				continue;
4010 			/* If we found requested source - select it and exit. */
4011 			hdac_widget_connection_select(w, i);
4012 			HDA_BOOTHVERBOSE(
4013 				device_printf(pdevinfo->dev,
4014 				    "Recsel (%s): nid %d source %d select\n",
4015 				    hdac_audio_ctl_ossmixer_mask2allname(
4016 			    	    src, buf, sizeof(buf)),
4017 				    nid, i);
4018 			);
4019 			break;
4020 		}
4021 	}
4022 	return (res);
4023 }
4024 
4025 static uint32_t
4026 hdac_audio_ctl_ossmixer_setrecsrc(struct snd_mixer *m, uint32_t src)
4027 {
4028 	struct hdac_pcm_devinfo *pdevinfo = mix_getdevinfo(m);
4029 	struct hdac_devinfo *devinfo = pdevinfo->devinfo;
4030 	struct hdac_widget *w;
4031 	struct hdac_softc *sc = devinfo->codec->sc;
4032 	struct hdac_chan *ch;
4033 	int i;
4034 	uint32_t ret = 0xffffffff;
4035 
4036 	hdac_lock(sc);
4037 
4038 	/* Commutate requested recsrc for each ADC. */
4039 	ch = &sc->chans[pdevinfo->rec];
4040 	for (i = 0; ch->io[i] != -1; i++) {
4041 		w = hdac_widget_get(devinfo, ch->io[i]);
4042 		if (w == NULL || w->enable == 0)
4043 			continue;
4044 		ret &= hdac_audio_ctl_recsel_comm(pdevinfo, src, ch->io[i], 0);
4045 	}
4046 
4047 	hdac_unlock(sc);
4048 
4049 	return ((ret == 0xffffffff)? 0 : ret);
4050 }
4051 
4052 static kobj_method_t hdac_audio_ctl_ossmixer_methods[] = {
4053 	KOBJMETHOD(mixer_init,		hdac_audio_ctl_ossmixer_init),
4054 	KOBJMETHOD(mixer_set,		hdac_audio_ctl_ossmixer_set),
4055 	KOBJMETHOD(mixer_setrecsrc,	hdac_audio_ctl_ossmixer_setrecsrc),
4056 	KOBJMETHOD_END
4057 };
4058 MIXER_DECLARE(hdac_audio_ctl_ossmixer);
4059 
4060 static void
4061 hdac_unsolq_task(void *context, int pending)
4062 {
4063 	struct hdac_softc *sc;
4064 
4065 	sc = (struct hdac_softc *)context;
4066 
4067 	hdac_lock(sc);
4068 	hdac_unsolq_flush(sc);
4069 	hdac_unlock(sc);
4070 }
4071 
4072 /****************************************************************************
4073  * int hdac_attach(device_t)
4074  *
4075  * Attach the device into the kernel. Interrupts usually won't be enabled
4076  * when this function is called. Setup everything that doesn't require
4077  * interrupts and defer probing of codecs until interrupts are enabled.
4078  ****************************************************************************/
4079 static int
4080 hdac_attach(device_t dev)
4081 {
4082 	struct hdac_softc *sc;
4083 	int result;
4084 	int i, devid = -1;
4085 	uint32_t model;
4086 	uint16_t class, subclass;
4087 	uint16_t vendor;
4088 	uint8_t v;
4089 
4090 	device_printf(dev, "HDA Driver Revision: %s\n", HDA_DRV_TEST_REV);
4091 
4092 	model = (uint32_t)pci_get_device(dev) << 16;
4093 	model |= (uint32_t)pci_get_vendor(dev) & 0x0000ffff;
4094 	class = pci_get_class(dev);
4095 	subclass = pci_get_subclass(dev);
4096 
4097 	for (i = 0; i < HDAC_DEVICES_LEN; i++) {
4098 		if (hdac_devices[i].model == model) {
4099 			devid = i;
4100 			break;
4101 		}
4102 		if (HDA_DEV_MATCH(hdac_devices[i].model, model) &&
4103 		    class == PCIC_MULTIMEDIA &&
4104 		    subclass == PCIS_MULTIMEDIA_HDA) {
4105 			devid = i;
4106 			break;
4107 		}
4108 	}
4109 
4110 	sc = device_get_softc(dev);
4111 	sc->lock = snd_mtxcreate(device_get_nameunit(dev), HDAC_MTX_NAME);
4112 	sc->dev = dev;
4113 	sc->pci_subvendor = (uint32_t)pci_get_subdevice(sc->dev) << 16;
4114 	sc->pci_subvendor |= (uint32_t)pci_get_subvendor(sc->dev) & 0x0000ffff;
4115 	vendor = pci_get_vendor(dev);
4116 
4117 	if (sc->pci_subvendor == HP_NX6325_SUBVENDORX) {
4118 		/* Screw nx6325 - subdevice/subvendor swapped */
4119 		sc->pci_subvendor = HP_NX6325_SUBVENDOR;
4120 	}
4121 
4122 	callout_init(&sc->poll_hda, CALLOUT_MPSAFE);
4123 	callout_init(&sc->poll_hdac, CALLOUT_MPSAFE);
4124 	callout_init(&sc->poll_jack, CALLOUT_MPSAFE);
4125 
4126 	TASK_INIT(&sc->unsolq_task, 0, hdac_unsolq_task, sc);
4127 
4128 	sc->poll_ticks = 1000000;
4129 	sc->poll_ival = HDAC_POLL_INTERVAL;
4130 	if (resource_int_value(device_get_name(dev),
4131 	    device_get_unit(dev), "polling", &i) == 0 && i != 0)
4132 		sc->polling = 1;
4133 	else
4134 		sc->polling = 0;
4135 
4136 	sc->hdabus = NULL;
4137 	for (i = 0; i < HDAC_CODEC_MAX; i++)
4138 		sc->codecs[i] = NULL;
4139 
4140 	pci_enable_busmaster(dev);
4141 
4142 	if (vendor == INTEL_VENDORID) {
4143 		/* TCSEL -> TC0 */
4144 		v = pci_read_config(dev, 0x44, 1);
4145 		pci_write_config(dev, 0x44, v & 0xf8, 1);
4146 		HDA_BOOTHVERBOSE(
4147 			device_printf(dev, "TCSEL: 0x%02d -> 0x%02d\n", v,
4148 			    pci_read_config(dev, 0x44, 1));
4149 		);
4150 	}
4151 
4152 	if (devid >= 0 && (hdac_devices[devid].flags & HDAC_NO_MSI))
4153 		sc->flags &= ~HDAC_F_MSI;
4154 	else
4155 		sc->flags |= HDAC_F_MSI;
4156 	if (resource_int_value(device_get_name(dev),
4157 	    device_get_unit(dev), "msi", &i) == 0) {
4158 		if (i == 0)
4159 			sc->flags &= ~HDAC_F_MSI;
4160 		else
4161 			sc->flags |= HDAC_F_MSI;
4162 	}
4163 
4164 #if defined(__i386__) || defined(__amd64__)
4165 	sc->flags |= HDAC_F_DMA_NOCACHE;
4166 
4167 	if (resource_int_value(device_get_name(dev),
4168 	    device_get_unit(dev), "snoop", &i) == 0 && i != 0) {
4169 #else
4170 	sc->flags &= ~HDAC_F_DMA_NOCACHE;
4171 #endif
4172 		/*
4173 		 * Try to enable PCIe snoop to avoid messing around with
4174 		 * uncacheable DMA attribute. Since PCIe snoop register
4175 		 * config is pretty much vendor specific, there are no
4176 		 * general solutions on how to enable it, forcing us (even
4177 		 * Microsoft) to enable uncacheable or write combined DMA
4178 		 * by default.
4179 		 *
4180 		 * http://msdn2.microsoft.com/en-us/library/ms790324.aspx
4181 		 */
4182 		for (i = 0; i < HDAC_PCIESNOOP_LEN; i++) {
4183 			if (hdac_pcie_snoop[i].vendor != vendor)
4184 				continue;
4185 			sc->flags &= ~HDAC_F_DMA_NOCACHE;
4186 			if (hdac_pcie_snoop[i].reg == 0x00)
4187 				break;
4188 			v = pci_read_config(dev, hdac_pcie_snoop[i].reg, 1);
4189 			if ((v & hdac_pcie_snoop[i].enable) ==
4190 			    hdac_pcie_snoop[i].enable)
4191 				break;
4192 			v &= hdac_pcie_snoop[i].mask;
4193 			v |= hdac_pcie_snoop[i].enable;
4194 			pci_write_config(dev, hdac_pcie_snoop[i].reg, v, 1);
4195 			v = pci_read_config(dev, hdac_pcie_snoop[i].reg, 1);
4196 			if ((v & hdac_pcie_snoop[i].enable) !=
4197 			    hdac_pcie_snoop[i].enable) {
4198 				HDA_BOOTVERBOSE(
4199 					device_printf(dev,
4200 					    "WARNING: Failed to enable PCIe "
4201 					    "snoop!\n");
4202 				);
4203 #if defined(__i386__) || defined(__amd64__)
4204 				sc->flags |= HDAC_F_DMA_NOCACHE;
4205 #endif
4206 			}
4207 			break;
4208 		}
4209 #if defined(__i386__) || defined(__amd64__)
4210 	}
4211 #endif
4212 
4213 	HDA_BOOTHVERBOSE(
4214 		device_printf(dev, "DMA Coherency: %s / vendor=0x%04x\n",
4215 		    (sc->flags & HDAC_F_DMA_NOCACHE) ?
4216 		    "Uncacheable" : "PCIe snoop", vendor);
4217 	);
4218 
4219 	/* Allocate resources */
4220 	result = hdac_mem_alloc(sc);
4221 	if (result != 0)
4222 		goto hdac_attach_fail;
4223 	result = hdac_irq_alloc(sc);
4224 	if (result != 0)
4225 		goto hdac_attach_fail;
4226 
4227 	/* Get Capabilities */
4228 	result = hdac_get_capabilities(sc);
4229 	if (result != 0)
4230 		goto hdac_attach_fail;
4231 
4232 	if (devid >= 0 && (hdac_devices[devid].flags & HDAC_NO_64BIT))
4233 		sc->support_64bit = 0;
4234 
4235 	/* Allocate CORB and RIRB dma memory */
4236 	result = hdac_dma_alloc(sc, &sc->corb_dma,
4237 	    sc->corb_size * sizeof(uint32_t));
4238 	if (result != 0)
4239 		goto hdac_attach_fail;
4240 	result = hdac_dma_alloc(sc, &sc->rirb_dma,
4241 	    sc->rirb_size * sizeof(struct hdac_rirb));
4242 	if (result != 0)
4243 		goto hdac_attach_fail;
4244 
4245 	result = bus_dma_tag_create(
4246 	    bus_get_dma_tag(sc->dev),		/* parent */
4247 	    HDAC_DMA_ALIGNMENT,			/* alignment */
4248 	    0,					/* boundary */
4249 	    (sc->support_64bit) ? BUS_SPACE_MAXADDR :
4250 		BUS_SPACE_MAXADDR_32BIT,	/* lowaddr */
4251 	    BUS_SPACE_MAXADDR,			/* highaddr */
4252 	    NULL,				/* filtfunc */
4253 	    NULL,				/* fistfuncarg */
4254 	    HDA_BUFSZ_MAX, 			/* maxsize */
4255 	    1,					/* nsegments */
4256 	    HDA_BUFSZ_MAX, 			/* maxsegsz */
4257 	    0,					/* flags */
4258 	    NULL,				/* lockfunc */
4259 	    NULL,				/* lockfuncarg */
4260 	    &sc->chan_dmat);			/* dmat */
4261 	if (result != 0) {
4262 		device_printf(dev, "%s: bus_dma_tag_create failed (%x)\n",
4263 		     __func__, result);
4264 		goto hdac_attach_fail;
4265 	}
4266 
4267 	/* Quiesce everything */
4268 	HDA_BOOTHVERBOSE(
4269 		device_printf(dev, "Reset controller...\n");
4270 	);
4271 	hdac_reset(sc, 1);
4272 
4273 	/* Initialize the CORB and RIRB */
4274 	hdac_corb_init(sc);
4275 	hdac_rirb_init(sc);
4276 
4277 	/* Defer remaining of initialization until interrupts are enabled */
4278 	sc->intrhook.ich_func = hdac_attach2;
4279 	sc->intrhook.ich_arg = (void *)sc;
4280 	if (cold == 0 || config_intrhook_establish(&sc->intrhook) != 0) {
4281 		sc->intrhook.ich_func = NULL;
4282 		hdac_attach2((void *)sc);
4283 	}
4284 
4285 	return (0);
4286 
4287 hdac_attach_fail:
4288 	hdac_irq_free(sc);
4289 	hdac_dma_free(sc, &sc->rirb_dma);
4290 	hdac_dma_free(sc, &sc->corb_dma);
4291 	hdac_mem_free(sc);
4292 	snd_mtxfree(sc->lock);
4293 	free(sc, M_DEVBUF);
4294 
4295 	return (ENXIO);
4296 }
4297 
4298 static void
4299 hdac_audio_parse(struct hdac_devinfo *devinfo)
4300 {
4301 	struct hdac_codec *codec = devinfo->codec;
4302 	struct hdac_softc *sc = codec->sc;
4303 	struct hdac_widget *w;
4304 	uint32_t res;
4305 	int i;
4306 	nid_t cad, nid;
4307 
4308 	cad = devinfo->codec->cad;
4309 	nid = devinfo->nid;
4310 
4311 	res = hdac_command(sc,
4312 	    HDA_CMD_GET_PARAMETER(cad , nid, HDA_PARAM_GPIO_COUNT), cad);
4313 	devinfo->function.audio.gpio = res;
4314 
4315 	HDA_BOOTVERBOSE(
4316 		device_printf(sc->dev, "GPIO: 0x%08x "
4317 		    "NumGPIO=%d NumGPO=%d "
4318 		    "NumGPI=%d GPIWake=%d GPIUnsol=%d\n",
4319 		    devinfo->function.audio.gpio,
4320 		    HDA_PARAM_GPIO_COUNT_NUM_GPIO(devinfo->function.audio.gpio),
4321 		    HDA_PARAM_GPIO_COUNT_NUM_GPO(devinfo->function.audio.gpio),
4322 		    HDA_PARAM_GPIO_COUNT_NUM_GPI(devinfo->function.audio.gpio),
4323 		    HDA_PARAM_GPIO_COUNT_GPI_WAKE(devinfo->function.audio.gpio),
4324 		    HDA_PARAM_GPIO_COUNT_GPI_UNSOL(devinfo->function.audio.gpio));
4325 	);
4326 
4327 	res = hdac_command(sc,
4328 	    HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_SUPP_STREAM_FORMATS),
4329 	    cad);
4330 	devinfo->function.audio.supp_stream_formats = res;
4331 
4332 	res = hdac_command(sc,
4333 	    HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_SUPP_PCM_SIZE_RATE),
4334 	    cad);
4335 	devinfo->function.audio.supp_pcm_size_rate = res;
4336 
4337 	res = hdac_command(sc,
4338 	    HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_OUTPUT_AMP_CAP),
4339 	    cad);
4340 	devinfo->function.audio.outamp_cap = res;
4341 
4342 	res = hdac_command(sc,
4343 	    HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_INPUT_AMP_CAP),
4344 	    cad);
4345 	devinfo->function.audio.inamp_cap = res;
4346 
4347 	for (i = devinfo->startnode; i < devinfo->endnode; i++) {
4348 		w = hdac_widget_get(devinfo, i);
4349 		if (w == NULL)
4350 			device_printf(sc->dev, "Ghost widget! nid=%d!\n", i);
4351 		else {
4352 			w->devinfo = devinfo;
4353 			w->nid = i;
4354 			w->enable = 1;
4355 			w->selconn = -1;
4356 			w->pflags = 0;
4357 			w->ossdev = -1;
4358 			w->bindas = -1;
4359 			w->param.eapdbtl = HDAC_INVALID;
4360 			hdac_widget_parse(w);
4361 		}
4362 	}
4363 }
4364 
4365 static void
4366 hdac_audio_ctl_parse(struct hdac_devinfo *devinfo)
4367 {
4368 	struct hdac_softc *sc = devinfo->codec->sc;
4369 	struct hdac_audio_ctl *ctls;
4370 	struct hdac_widget *w, *cw;
4371 	int i, j, cnt, max, ocap, icap;
4372 	int mute, offset, step, size;
4373 
4374 	/* XXX This is redundant */
4375 	max = 0;
4376 	for (i = devinfo->startnode; i < devinfo->endnode; i++) {
4377 		w = hdac_widget_get(devinfo, i);
4378 		if (w == NULL || w->enable == 0)
4379 			continue;
4380 		if (w->param.outamp_cap != 0)
4381 			max++;
4382 		if (w->param.inamp_cap != 0) {
4383 			switch (w->type) {
4384 			case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR:
4385 			case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER:
4386 				for (j = 0; j < w->nconns; j++) {
4387 					cw = hdac_widget_get(devinfo,
4388 					    w->conns[j]);
4389 					if (cw == NULL || cw->enable == 0)
4390 						continue;
4391 					max++;
4392 				}
4393 				break;
4394 			default:
4395 				max++;
4396 				break;
4397 			}
4398 		}
4399 	}
4400 
4401 	devinfo->function.audio.ctlcnt = max;
4402 
4403 	if (max < 1)
4404 		return;
4405 
4406 	ctls = (struct hdac_audio_ctl *)malloc(
4407 	    sizeof(*ctls) * max, M_HDAC, M_ZERO | M_NOWAIT);
4408 
4409 	if (ctls == NULL) {
4410 		/* Blekh! */
4411 		device_printf(sc->dev, "unable to allocate ctls!\n");
4412 		devinfo->function.audio.ctlcnt = 0;
4413 		return;
4414 	}
4415 
4416 	cnt = 0;
4417 	for (i = devinfo->startnode; cnt < max && i < devinfo->endnode; i++) {
4418 		if (cnt >= max) {
4419 			device_printf(sc->dev, "%s: Ctl overflow!\n",
4420 			    __func__);
4421 			break;
4422 		}
4423 		w = hdac_widget_get(devinfo, i);
4424 		if (w == NULL || w->enable == 0)
4425 			continue;
4426 		ocap = w->param.outamp_cap;
4427 		icap = w->param.inamp_cap;
4428 		if (ocap != 0) {
4429 			mute = HDA_PARAM_OUTPUT_AMP_CAP_MUTE_CAP(ocap);
4430 			step = HDA_PARAM_OUTPUT_AMP_CAP_NUMSTEPS(ocap);
4431 			size = HDA_PARAM_OUTPUT_AMP_CAP_STEPSIZE(ocap);
4432 			offset = HDA_PARAM_OUTPUT_AMP_CAP_OFFSET(ocap);
4433 			/*if (offset > step) {
4434 				HDA_BOOTVERBOSE(
4435 					device_printf(sc->dev,
4436 					    "BUGGY outamp: nid=%d "
4437 					    "[offset=%d > step=%d]\n",
4438 					    w->nid, offset, step);
4439 				);
4440 				offset = step;
4441 			}*/
4442 			ctls[cnt].enable = 1;
4443 			ctls[cnt].widget = w;
4444 			ctls[cnt].mute = mute;
4445 			ctls[cnt].step = step;
4446 			ctls[cnt].size = size;
4447 			ctls[cnt].offset = offset;
4448 			ctls[cnt].left = offset;
4449 			ctls[cnt].right = offset;
4450 			if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX ||
4451 			    w->waspin)
4452 				ctls[cnt].ndir = HDA_CTL_IN;
4453 			else
4454 				ctls[cnt].ndir = HDA_CTL_OUT;
4455 			ctls[cnt++].dir = HDA_CTL_OUT;
4456 		}
4457 
4458 		if (icap != 0) {
4459 			mute = HDA_PARAM_OUTPUT_AMP_CAP_MUTE_CAP(icap);
4460 			step = HDA_PARAM_OUTPUT_AMP_CAP_NUMSTEPS(icap);
4461 			size = HDA_PARAM_OUTPUT_AMP_CAP_STEPSIZE(icap);
4462 			offset = HDA_PARAM_OUTPUT_AMP_CAP_OFFSET(icap);
4463 			/*if (offset > step) {
4464 				HDA_BOOTVERBOSE(
4465 					device_printf(sc->dev,
4466 					    "BUGGY inamp: nid=%d "
4467 					    "[offset=%d > step=%d]\n",
4468 					    w->nid, offset, step);
4469 				);
4470 				offset = step;
4471 			}*/
4472 			switch (w->type) {
4473 			case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR:
4474 			case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER:
4475 				for (j = 0; j < w->nconns; j++) {
4476 					if (cnt >= max) {
4477 						device_printf(sc->dev,
4478 						    "%s: Ctl overflow!\n",
4479 						    __func__);
4480 						break;
4481 					}
4482 					cw = hdac_widget_get(devinfo,
4483 					    w->conns[j]);
4484 					if (cw == NULL || cw->enable == 0)
4485 						continue;
4486 					ctls[cnt].enable = 1;
4487 					ctls[cnt].widget = w;
4488 					ctls[cnt].childwidget = cw;
4489 					ctls[cnt].index = j;
4490 					ctls[cnt].mute = mute;
4491 					ctls[cnt].step = step;
4492 					ctls[cnt].size = size;
4493 					ctls[cnt].offset = offset;
4494 					ctls[cnt].left = offset;
4495 					ctls[cnt].right = offset;
4496 	    				ctls[cnt].ndir = HDA_CTL_IN;
4497 					ctls[cnt++].dir = HDA_CTL_IN;
4498 				}
4499 				break;
4500 			default:
4501 				if (cnt >= max) {
4502 					device_printf(sc->dev,
4503 					    "%s: Ctl overflow!\n",
4504 					    __func__);
4505 					break;
4506 				}
4507 				ctls[cnt].enable = 1;
4508 				ctls[cnt].widget = w;
4509 				ctls[cnt].mute = mute;
4510 				ctls[cnt].step = step;
4511 				ctls[cnt].size = size;
4512 				ctls[cnt].offset = offset;
4513 				ctls[cnt].left = offset;
4514 				ctls[cnt].right = offset;
4515 				if (w->type ==
4516 				    HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX)
4517 					ctls[cnt].ndir = HDA_CTL_OUT;
4518 				else
4519 					ctls[cnt].ndir = HDA_CTL_IN;
4520 				ctls[cnt++].dir = HDA_CTL_IN;
4521 				break;
4522 			}
4523 		}
4524 	}
4525 
4526 	devinfo->function.audio.ctl = ctls;
4527 }
4528 
4529 static void
4530 hdac_audio_as_parse(struct hdac_devinfo *devinfo)
4531 {
4532 	struct hdac_softc *sc = devinfo->codec->sc;
4533 	struct hdac_audio_as *as;
4534 	struct hdac_widget *w;
4535 	int i, j, cnt, max, type, dir, assoc, seq, first, hpredir;
4536 
4537 	/* Count present associations */
4538 	max = 0;
4539 	for (j = 1; j < 16; j++) {
4540 		for (i = devinfo->startnode; i < devinfo->endnode; i++) {
4541 			w = hdac_widget_get(devinfo, i);
4542 			if (w == NULL || w->enable == 0)
4543 				continue;
4544 			if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX)
4545 				continue;
4546 			if (HDA_CONFIG_DEFAULTCONF_ASSOCIATION(w->wclass.pin.config)
4547 			    != j)
4548 				continue;
4549 			max++;
4550 			if (j != 15)  /* There could be many 1-pin assocs #15 */
4551 				break;
4552 		}
4553 	}
4554 
4555 	devinfo->function.audio.ascnt = max;
4556 
4557 	if (max < 1)
4558 		return;
4559 
4560 	as = (struct hdac_audio_as *)malloc(
4561 	    sizeof(*as) * max, M_HDAC, M_ZERO | M_NOWAIT);
4562 
4563 	if (as == NULL) {
4564 		/* Blekh! */
4565 		device_printf(sc->dev, "unable to allocate assocs!\n");
4566 		devinfo->function.audio.ascnt = 0;
4567 		return;
4568 	}
4569 
4570 	for (i = 0; i < max; i++) {
4571 		as[i].hpredir = -1;
4572 		as[i].chan = -1;
4573 		as[i].digital = 0;
4574 	}
4575 
4576 	/* Scan associations skipping as=0. */
4577 	cnt = 0;
4578 	for (j = 1; j < 16; j++) {
4579 		first = 16;
4580 		hpredir = 0;
4581 		for (i = devinfo->startnode; i < devinfo->endnode; i++) {
4582 			w = hdac_widget_get(devinfo, i);
4583 			if (w == NULL || w->enable == 0)
4584 				continue;
4585 			if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX)
4586 				continue;
4587 			assoc = HDA_CONFIG_DEFAULTCONF_ASSOCIATION(w->wclass.pin.config);
4588 			seq = HDA_CONFIG_DEFAULTCONF_SEQUENCE(w->wclass.pin.config);
4589 			if (assoc != j) {
4590 				continue;
4591 			}
4592 			KASSERT(cnt < max,
4593 			    ("%s: Associations owerflow (%d of %d)",
4594 			    __func__, cnt, max));
4595 			type = w->wclass.pin.config &
4596 			    HDA_CONFIG_DEFAULTCONF_DEVICE_MASK;
4597 			/* Get pin direction. */
4598 			if (type == HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_OUT ||
4599 			    type == HDA_CONFIG_DEFAULTCONF_DEVICE_SPEAKER ||
4600 			    type == HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT ||
4601 			    type == HDA_CONFIG_DEFAULTCONF_DEVICE_SPDIF_OUT ||
4602 			    type == HDA_CONFIG_DEFAULTCONF_DEVICE_DIGITAL_OTHER_OUT)
4603 				dir = HDA_CTL_OUT;
4604 			else
4605 				dir = HDA_CTL_IN;
4606 			/* If this is a first pin - create new association. */
4607 			if (as[cnt].pincnt == 0) {
4608 				as[cnt].enable = 1;
4609 				as[cnt].index = j;
4610 				as[cnt].dir = dir;
4611 			}
4612 			if (seq < first)
4613 				first = seq;
4614 			/* Check association correctness. */
4615 			if (as[cnt].pins[seq] != 0) {
4616 				device_printf(sc->dev, "%s: Duplicate pin %d (%d) "
4617 				    "in association %d! Disabling association.\n",
4618 				    __func__, seq, w->nid, j);
4619 				as[cnt].enable = 0;
4620 			}
4621 			if (dir != as[cnt].dir) {
4622 				device_printf(sc->dev, "%s: Pin %d has wrong "
4623 				    "direction for association %d! Disabling "
4624 				    "association.\n",
4625 				    __func__, w->nid, j);
4626 				as[cnt].enable = 0;
4627 			}
4628 			if (HDA_PARAM_AUDIO_WIDGET_CAP_DIGITAL(w->param.widget_cap)) {
4629 				if (HDA_PARAM_PIN_CAP_DP(w->wclass.pin.cap))
4630 					as[cnt].digital = 3;
4631 				else if (HDA_PARAM_PIN_CAP_HDMI(w->wclass.pin.cap))
4632 					as[cnt].digital = 2;
4633 				else
4634 					as[cnt].digital = 1;
4635 			}
4636 			/* Headphones with seq=15 may mean redirection. */
4637 			if (type == HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT &&
4638 			    seq == 15)
4639 				hpredir = 1;
4640 			as[cnt].pins[seq] = w->nid;
4641 			as[cnt].pincnt++;
4642 			/* Association 15 is a multiple unassociated pins. */
4643 			if (j == 15)
4644 				cnt++;
4645 		}
4646 		if (j != 15 && as[cnt].pincnt > 0) {
4647 			if (hpredir && as[cnt].pincnt > 1)
4648 				as[cnt].hpredir = first;
4649 			cnt++;
4650 		}
4651 	}
4652 	HDA_BOOTVERBOSE(
4653 		device_printf(sc->dev,
4654 		    "%d associations found:\n", max);
4655 		for (i = 0; i < max; i++) {
4656 			device_printf(sc->dev,
4657 			    "Association %d (%d) %s%s:\n",
4658 			    i, as[i].index, (as[i].dir == HDA_CTL_IN)?"in":"out",
4659 			    as[i].enable?"":" (disabled)");
4660 			for (j = 0; j < 16; j++) {
4661 				if (as[i].pins[j] == 0)
4662 					continue;
4663 				device_printf(sc->dev,
4664 				    " Pin nid=%d seq=%d\n",
4665 				    as[i].pins[j], j);
4666 			}
4667 		}
4668 	);
4669 
4670 	devinfo->function.audio.as = as;
4671 }
4672 
4673 static const struct {
4674 	uint32_t model;
4675 	uint32_t id;
4676 	uint32_t set, unset;
4677 } hdac_quirks[] = {
4678 	/*
4679 	 * XXX Force stereo quirk. Monoural recording / playback
4680 	 *     on few codecs (especially ALC880) seems broken or
4681 	 *     perhaps unsupported.
4682 	 */
4683 	{ HDA_MATCH_ALL, HDA_MATCH_ALL,
4684 	    HDA_QUIRK_FORCESTEREO | HDA_QUIRK_IVREF, 0 },
4685 	{ ACER_ALL_SUBVENDOR, HDA_MATCH_ALL,
4686 	    HDA_QUIRK_GPIO0, 0 },
4687 	{ ASUS_G2K_SUBVENDOR, HDA_CODEC_ALC660,
4688 	    HDA_QUIRK_GPIO0, 0 },
4689 	{ ASUS_M5200_SUBVENDOR, HDA_CODEC_ALC880,
4690 	    HDA_QUIRK_GPIO0, 0 },
4691 	{ ASUS_A7M_SUBVENDOR, HDA_CODEC_ALC880,
4692 	    HDA_QUIRK_GPIO0, 0 },
4693 	{ ASUS_A7T_SUBVENDOR, HDA_CODEC_ALC882,
4694 	    HDA_QUIRK_GPIO0, 0 },
4695 	{ ASUS_W2J_SUBVENDOR, HDA_CODEC_ALC882,
4696 	    HDA_QUIRK_GPIO0, 0 },
4697 	{ ASUS_U5F_SUBVENDOR, HDA_CODEC_AD1986A,
4698 	    HDA_QUIRK_EAPDINV, 0 },
4699 	{ ASUS_A8X_SUBVENDOR, HDA_CODEC_AD1986A,
4700 	    HDA_QUIRK_EAPDINV, 0 },
4701 	{ ASUS_F3JC_SUBVENDOR, HDA_CODEC_ALC861,
4702 	    HDA_QUIRK_OVREF, 0 },
4703 	{ UNIWILL_9075_SUBVENDOR, HDA_CODEC_ALC861,
4704 	    HDA_QUIRK_OVREF, 0 },
4705 	/*{ ASUS_M2N_SUBVENDOR, HDA_CODEC_AD1988,
4706 	    HDA_QUIRK_IVREF80, HDA_QUIRK_IVREF50 | HDA_QUIRK_IVREF100 },*/
4707 	{ MEDION_MD95257_SUBVENDOR, HDA_CODEC_ALC880,
4708 	    HDA_QUIRK_GPIO1, 0 },
4709 	{ LENOVO_3KN100_SUBVENDOR, HDA_CODEC_AD1986A,
4710 	    HDA_QUIRK_EAPDINV | HDA_QUIRK_SENSEINV, 0 },
4711 	{ SAMSUNG_Q1_SUBVENDOR, HDA_CODEC_AD1986A,
4712 	    HDA_QUIRK_EAPDINV, 0 },
4713 	{ APPLE_MB3_SUBVENDOR, HDA_CODEC_ALC885,
4714 	    HDA_QUIRK_GPIO0 | HDA_QUIRK_OVREF50, 0},
4715 	{ APPLE_INTEL_MAC, HDA_CODEC_STAC9221,
4716 	    HDA_QUIRK_GPIO0 | HDA_QUIRK_GPIO1, 0 },
4717 	{ APPLE_MACBOOKPRO55, HDA_CODEC_CS4206,
4718 	    HDA_QUIRK_GPIO1 | HDA_QUIRK_GPIO3, 0 },
4719 	{ DELL_D630_SUBVENDOR, HDA_CODEC_STAC9205X,
4720 	    HDA_QUIRK_GPIO0, 0 },
4721 	{ DELL_V1400_SUBVENDOR, HDA_CODEC_STAC9228X,
4722 	    HDA_QUIRK_GPIO2, 0 },
4723 	{ DELL_V1500_SUBVENDOR, HDA_CODEC_STAC9205X,
4724 	    HDA_QUIRK_GPIO0, 0 },
4725 	{ HDA_MATCH_ALL, HDA_CODEC_AD1988,
4726 	    HDA_QUIRK_IVREF80, HDA_QUIRK_IVREF50 | HDA_QUIRK_IVREF100 },
4727 	{ HDA_MATCH_ALL, HDA_CODEC_AD1988B,
4728 	    HDA_QUIRK_IVREF80, HDA_QUIRK_IVREF50 | HDA_QUIRK_IVREF100 },
4729 	{ HDA_MATCH_ALL, HDA_CODEC_CX20549,
4730 	    0, HDA_QUIRK_FORCESTEREO }
4731 };
4732 #define HDAC_QUIRKS_LEN (sizeof(hdac_quirks) / sizeof(hdac_quirks[0]))
4733 
4734 static void
4735 hdac_vendor_patch_parse(struct hdac_devinfo *devinfo)
4736 {
4737 	struct hdac_widget *w;
4738 	uint32_t id, subvendor;
4739 	int i;
4740 
4741 	id = hdac_codec_id(devinfo->codec);
4742 	subvendor = devinfo->codec->sc->pci_subvendor;
4743 
4744 	/*
4745 	 * Quirks
4746 	 */
4747 	for (i = 0; i < HDAC_QUIRKS_LEN; i++) {
4748 		if (!(HDA_DEV_MATCH(hdac_quirks[i].model, subvendor) &&
4749 		    HDA_DEV_MATCH(hdac_quirks[i].id, id)))
4750 			continue;
4751 		if (hdac_quirks[i].set != 0)
4752 			devinfo->function.audio.quirks |=
4753 			    hdac_quirks[i].set;
4754 		if (hdac_quirks[i].unset != 0)
4755 			devinfo->function.audio.quirks &=
4756 			    ~(hdac_quirks[i].unset);
4757 	}
4758 
4759 	switch (id) {
4760 	case HDA_CODEC_AD1983:
4761 		/*
4762 		 * This codec has several possible usages, but none
4763 		 * fit the parser best. Help parser to choose better.
4764 		 */
4765 		/* Disable direct unmixed playback to get pcm volume. */
4766 		w = hdac_widget_get(devinfo, 5);
4767 		if (w != NULL)
4768 			w->connsenable[0] = 0;
4769 		w = hdac_widget_get(devinfo, 6);
4770 		if (w != NULL)
4771 			w->connsenable[0] = 0;
4772 		w = hdac_widget_get(devinfo, 11);
4773 		if (w != NULL)
4774 			w->connsenable[0] = 0;
4775 		/* Disable mic and line selectors. */
4776 		w = hdac_widget_get(devinfo, 12);
4777 		if (w != NULL)
4778 			w->connsenable[1] = 0;
4779 		w = hdac_widget_get(devinfo, 13);
4780 		if (w != NULL)
4781 			w->connsenable[1] = 0;
4782 		/* Disable recording from mono playback mix. */
4783 		w = hdac_widget_get(devinfo, 20);
4784 		if (w != NULL)
4785 			w->connsenable[3] = 0;
4786 		break;
4787 	case HDA_CODEC_AD1986A:
4788 		/*
4789 		 * This codec has overcomplicated input mixing.
4790 		 * Make some cleaning there.
4791 		 */
4792 		/* Disable input mono mixer. Not needed and not supported. */
4793 		w = hdac_widget_get(devinfo, 43);
4794 		if (w != NULL)
4795 			w->enable = 0;
4796 		/* Disable any with any input mixing mesh. Use separately. */
4797 		w = hdac_widget_get(devinfo, 39);
4798 		if (w != NULL)
4799 			w->enable = 0;
4800 		w = hdac_widget_get(devinfo, 40);
4801 		if (w != NULL)
4802 			w->enable = 0;
4803 		w = hdac_widget_get(devinfo, 41);
4804 		if (w != NULL)
4805 			w->enable = 0;
4806 		w = hdac_widget_get(devinfo, 42);
4807 		if (w != NULL)
4808 			w->enable = 0;
4809 		/* Disable duplicate mixer node connector. */
4810 		w = hdac_widget_get(devinfo, 15);
4811 		if (w != NULL)
4812 			w->connsenable[3] = 0;
4813 		/* There is only one mic preamplifier, use it effectively. */
4814 		w = hdac_widget_get(devinfo, 31);
4815 		if (w != NULL) {
4816 			if ((w->wclass.pin.config &
4817 			    HDA_CONFIG_DEFAULTCONF_DEVICE_MASK) ==
4818 			    HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN) {
4819 				w = hdac_widget_get(devinfo, 16);
4820 				if (w != NULL)
4821 				    w->connsenable[2] = 0;
4822 			} else {
4823 				w = hdac_widget_get(devinfo, 15);
4824 				if (w != NULL)
4825 				    w->connsenable[0] = 0;
4826 			}
4827 		}
4828 		w = hdac_widget_get(devinfo, 32);
4829 		if (w != NULL) {
4830 			if ((w->wclass.pin.config &
4831 			    HDA_CONFIG_DEFAULTCONF_DEVICE_MASK) ==
4832 			    HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN) {
4833 				w = hdac_widget_get(devinfo, 16);
4834 				if (w != NULL)
4835 				    w->connsenable[0] = 0;
4836 			} else {
4837 				w = hdac_widget_get(devinfo, 15);
4838 				if (w != NULL)
4839 				    w->connsenable[1] = 0;
4840 			}
4841 		}
4842 
4843 		if (subvendor == ASUS_A8X_SUBVENDOR) {
4844 			/*
4845 			 * This is just plain ridiculous.. There
4846 			 * are several A8 series that share the same
4847 			 * pci id but works differently (EAPD).
4848 			 */
4849 			w = hdac_widget_get(devinfo, 26);
4850 			if (w != NULL && w->type ==
4851 			    HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX &&
4852 			    (w->wclass.pin.config &
4853 			    HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK) !=
4854 			    HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_NONE)
4855 				devinfo->function.audio.quirks &=
4856 				    ~HDA_QUIRK_EAPDINV;
4857 		}
4858 		break;
4859 	case HDA_CODEC_AD1981HD:
4860 		/*
4861 		 * This codec has very unusual design with several
4862 		 * points inappropriate for the present parser.
4863 		 */
4864 		/* Disable recording from mono playback mix. */
4865 		w = hdac_widget_get(devinfo, 21);
4866 		if (w != NULL)
4867 			w->connsenable[3] = 0;
4868 		/* Disable rear to front mic mixer, use separately. */
4869 		w = hdac_widget_get(devinfo, 31);
4870 		if (w != NULL)
4871 			w->enable = 0;
4872 		/* Disable direct playback, use mixer. */
4873 		w = hdac_widget_get(devinfo, 5);
4874 		if (w != NULL)
4875 			w->connsenable[0] = 0;
4876 		w = hdac_widget_get(devinfo, 6);
4877 		if (w != NULL)
4878 			w->connsenable[0] = 0;
4879 		w = hdac_widget_get(devinfo, 9);
4880 		if (w != NULL)
4881 			w->connsenable[0] = 0;
4882 		w = hdac_widget_get(devinfo, 24);
4883 		if (w != NULL)
4884 			w->connsenable[0] = 0;
4885 		break;
4886 	}
4887 }
4888 
4889 /*
4890  * Trace path from DAC to pin.
4891  */
4892 static nid_t
4893 hdac_audio_trace_dac(struct hdac_devinfo *devinfo, int as, int seq, nid_t nid,
4894     int dupseq, int min, int only, int depth)
4895 {
4896 	struct hdac_widget *w;
4897 	int i, im = -1;
4898 	nid_t m = 0, ret;
4899 
4900 	if (depth > HDA_PARSE_MAXDEPTH)
4901 		return (0);
4902 	w = hdac_widget_get(devinfo, nid);
4903 	if (w == NULL || w->enable == 0)
4904 		return (0);
4905 	HDA_BOOTHVERBOSE(
4906 		if (!only) {
4907 			device_printf(devinfo->codec->sc->dev,
4908 			    " %*stracing via nid %d\n",
4909 				depth + 1, "", w->nid);
4910 		}
4911 	);
4912 	/* Use only unused widgets */
4913 	if (w->bindas >= 0 && w->bindas != as) {
4914 		HDA_BOOTHVERBOSE(
4915 			if (!only) {
4916 				device_printf(devinfo->codec->sc->dev,
4917 				    " %*snid %d busy by association %d\n",
4918 					depth + 1, "", w->nid, w->bindas);
4919 			}
4920 		);
4921 		return (0);
4922 	}
4923 	if (dupseq < 0) {
4924 		if (w->bindseqmask != 0) {
4925 			HDA_BOOTHVERBOSE(
4926 				if (!only) {
4927 					device_printf(devinfo->codec->sc->dev,
4928 					    " %*snid %d busy by seqmask %x\n",
4929 						depth + 1, "", w->nid, w->bindseqmask);
4930 				}
4931 			);
4932 			return (0);
4933 		}
4934 	} else {
4935 		/* If this is headphones - allow duplicate first pin. */
4936 		if (w->bindseqmask != 0 &&
4937 		    (w->bindseqmask & (1 << dupseq)) == 0) {
4938 			HDA_BOOTHVERBOSE(
4939 				device_printf(devinfo->codec->sc->dev,
4940 				    " %*snid %d busy by seqmask %x\n",
4941 					depth + 1, "", w->nid, w->bindseqmask);
4942 			);
4943 			return (0);
4944 		}
4945 	}
4946 
4947 	switch (w->type) {
4948 	case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT:
4949 		/* Do not traverse input. AD1988 has digital monitor
4950 		for which we are not ready. */
4951 		break;
4952 	case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_OUTPUT:
4953 		/* If we are tracing HP take only dac of first pin. */
4954 		if ((only == 0 || only == w->nid) &&
4955 		    (w->nid >= min) && (dupseq < 0 || w->nid ==
4956 		    devinfo->function.audio.as[as].dacs[dupseq]))
4957 			m = w->nid;
4958 		break;
4959 	case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX:
4960 		if (depth > 0)
4961 			break;
4962 		/* Fall */
4963 	default:
4964 		/* Find reachable DACs with smallest nid respecting constraints. */
4965 		for (i = 0; i < w->nconns; i++) {
4966 			if (w->connsenable[i] == 0)
4967 				continue;
4968 			if (w->selconn != -1 && w->selconn != i)
4969 				continue;
4970 			if ((ret = hdac_audio_trace_dac(devinfo, as, seq,
4971 			    w->conns[i], dupseq, min, only, depth + 1)) != 0) {
4972 				if (m == 0 || ret < m) {
4973 					m = ret;
4974 					im = i;
4975 				}
4976 				if (only || dupseq >= 0)
4977 					break;
4978 			}
4979 		}
4980 		if (m && only && ((w->nconns > 1 &&
4981 		    w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER) ||
4982 		    w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR))
4983 			w->selconn = im;
4984 		break;
4985 	}
4986 	if (m && only) {
4987 		w->bindas = as;
4988 		w->bindseqmask |= (1 << seq);
4989 	}
4990 	HDA_BOOTHVERBOSE(
4991 		if (!only) {
4992 			device_printf(devinfo->codec->sc->dev,
4993 			    " %*snid %d returned %d\n",
4994 				depth + 1, "", w->nid, m);
4995 		}
4996 	);
4997 	return (m);
4998 }
4999 
5000 /*
5001  * Trace path from widget to ADC.
5002  */
5003 static nid_t
5004 hdac_audio_trace_adc(struct hdac_devinfo *devinfo, int as, int seq, nid_t nid,
5005     int only, int depth)
5006 {
5007 	struct hdac_widget *w, *wc;
5008 	int i, j;
5009 	nid_t res = 0;
5010 
5011 	if (depth > HDA_PARSE_MAXDEPTH)
5012 		return (0);
5013 	w = hdac_widget_get(devinfo, nid);
5014 	if (w == NULL || w->enable == 0)
5015 		return (0);
5016 	HDA_BOOTHVERBOSE(
5017 		device_printf(devinfo->codec->sc->dev,
5018 		    " %*stracing via nid %d\n",
5019 			depth + 1, "", w->nid);
5020 	);
5021 	/* Use only unused widgets */
5022 	if (w->bindas >= 0 && w->bindas != as) {
5023 		HDA_BOOTHVERBOSE(
5024 			device_printf(devinfo->codec->sc->dev,
5025 			    " %*snid %d busy by association %d\n",
5026 				depth + 1, "", w->nid, w->bindas);
5027 		);
5028 		return (0);
5029 	}
5030 
5031 	switch (w->type) {
5032 	case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT:
5033 		/* If we are tracing HP take only dac of first pin. */
5034 		if (only == w->nid)
5035 			res = 1;
5036 		break;
5037 	case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX:
5038 		if (depth > 0)
5039 			break;
5040 		/* Fall */
5041 	default:
5042 		/* Try to find reachable ADCs with specified nid. */
5043 		for (j = devinfo->startnode; j < devinfo->endnode; j++) {
5044 			wc = hdac_widget_get(devinfo, j);
5045 			if (wc == NULL || wc->enable == 0)
5046 				continue;
5047 			for (i = 0; i < wc->nconns; i++) {
5048 				if (wc->connsenable[i] == 0)
5049 					continue;
5050 				if (wc->conns[i] != nid)
5051 					continue;
5052 				if (hdac_audio_trace_adc(devinfo, as, seq,
5053 				    j, only, depth + 1) != 0) {
5054 					res = 1;
5055 					if (((wc->nconns > 1 &&
5056 					    wc->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER) ||
5057 					    wc->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR) &&
5058 					    wc->selconn == -1)
5059 						wc->selconn = i;
5060 				}
5061 			}
5062 		}
5063 		break;
5064 	}
5065 	if (res) {
5066 		w->bindas = as;
5067 		w->bindseqmask |= (1 << seq);
5068 	}
5069 	HDA_BOOTHVERBOSE(
5070 		device_printf(devinfo->codec->sc->dev,
5071 		    " %*snid %d returned %d\n",
5072 			depth + 1, "", w->nid, res);
5073 	);
5074 	return (res);
5075 }
5076 
5077 /*
5078  * Erase trace path of the specified association.
5079  */
5080 static void
5081 hdac_audio_undo_trace(struct hdac_devinfo *devinfo, int as, int seq)
5082 {
5083 	struct hdac_widget *w;
5084 	int i;
5085 
5086 	for (i = devinfo->startnode; i < devinfo->endnode; i++) {
5087 		w = hdac_widget_get(devinfo, i);
5088 		if (w == NULL || w->enable == 0)
5089 			continue;
5090 		if (w->bindas == as) {
5091 			if (seq >= 0) {
5092 				w->bindseqmask &= ~(1 << seq);
5093 				if (w->bindseqmask == 0) {
5094 					w->bindas = -1;
5095 					w->selconn = -1;
5096 				}
5097 			} else {
5098 				w->bindas = -1;
5099 				w->bindseqmask = 0;
5100 				w->selconn = -1;
5101 			}
5102 		}
5103 	}
5104 }
5105 
5106 /*
5107  * Trace association path from DAC to output
5108  */
5109 static int
5110 hdac_audio_trace_as_out(struct hdac_devinfo *devinfo, int as, int seq)
5111 {
5112 	struct hdac_audio_as *ases = devinfo->function.audio.as;
5113 	int i, hpredir;
5114 	nid_t min, res;
5115 
5116 	/* Find next pin */
5117 	for (i = seq; i < 16 && ases[as].pins[i] == 0; i++)
5118 		;
5119 	/* Check if there is no any left. If so - we succeeded. */
5120 	if (i == 16)
5121 		return (1);
5122 
5123 	hpredir = (i == 15 && ases[as].fakeredir == 0)?ases[as].hpredir:-1;
5124 	min = 0;
5125 	res = 0;
5126 	do {
5127 		HDA_BOOTHVERBOSE(
5128 			device_printf(devinfo->codec->sc->dev,
5129 			    " Tracing pin %d with min nid %d",
5130 			    ases[as].pins[i], min);
5131 			if (hpredir >= 0)
5132 				printf(" and hpredir %d", hpredir);
5133 			printf("\n");
5134 		);
5135 		/* Trace this pin taking min nid into account. */
5136 		res = hdac_audio_trace_dac(devinfo, as, i,
5137 		    ases[as].pins[i], hpredir, min, 0, 0);
5138 		if (res == 0) {
5139 			/* If we failed - return to previous and redo it. */
5140 			HDA_BOOTVERBOSE(
5141 				device_printf(devinfo->codec->sc->dev,
5142 				    " Unable to trace pin %d seq %d with min "
5143 				    "nid %d",
5144 				    ases[as].pins[i], i, min);
5145 				if (hpredir >= 0)
5146 					printf(" and hpredir %d", hpredir);
5147 				printf("\n");
5148 			);
5149 			return (0);
5150 		}
5151 		HDA_BOOTVERBOSE(
5152 			device_printf(devinfo->codec->sc->dev,
5153 			    " Pin %d traced to DAC %d",
5154 			    ases[as].pins[i], res);
5155 			if (hpredir >= 0)
5156 				printf(" and hpredir %d", hpredir);
5157 			if (ases[as].fakeredir)
5158 				printf(" with fake redirection");
5159 			printf("\n");
5160 		);
5161 		/* Trace again to mark the path */
5162 		hdac_audio_trace_dac(devinfo, as, i,
5163 		    ases[as].pins[i], hpredir, min, res, 0);
5164 		ases[as].dacs[i] = res;
5165 		/* We succeeded, so call next. */
5166 		if (hdac_audio_trace_as_out(devinfo, as, i + 1))
5167 			return (1);
5168 		/* If next failed, we should retry with next min */
5169 		hdac_audio_undo_trace(devinfo, as, i);
5170 		ases[as].dacs[i] = 0;
5171 		min = res + 1;
5172 	} while (1);
5173 }
5174 
5175 /*
5176  * Trace association path from input to ADC
5177  */
5178 static int
5179 hdac_audio_trace_as_in(struct hdac_devinfo *devinfo, int as)
5180 {
5181 	struct hdac_audio_as *ases = devinfo->function.audio.as;
5182 	struct hdac_widget *w;
5183 	int i, j, k;
5184 
5185 	for (j = devinfo->startnode; j < devinfo->endnode; j++) {
5186 		w = hdac_widget_get(devinfo, j);
5187 		if (w == NULL || w->enable == 0)
5188 			continue;
5189 		if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT)
5190 			continue;
5191 		if (w->bindas >= 0 && w->bindas != as)
5192 			continue;
5193 
5194 		/* Find next pin */
5195 		for (i = 0; i < 16; i++) {
5196 			if (ases[as].pins[i] == 0)
5197 				continue;
5198 
5199 			HDA_BOOTHVERBOSE(
5200 				device_printf(devinfo->codec->sc->dev,
5201 				    " Tracing pin %d to ADC %d\n",
5202 				    ases[as].pins[i], j);
5203 			);
5204 			/* Trace this pin taking goal into account. */
5205 			if (hdac_audio_trace_adc(devinfo, as, i,
5206 			    ases[as].pins[i], j, 0) == 0) {
5207 				/* If we failed - return to previous and redo it. */
5208 				HDA_BOOTVERBOSE(
5209 					device_printf(devinfo->codec->sc->dev,
5210 					    " Unable to trace pin %d to ADC %d, undo traces\n",
5211 					    ases[as].pins[i], j);
5212 				);
5213 				hdac_audio_undo_trace(devinfo, as, -1);
5214 				for (k = 0; k < 16; k++)
5215 					ases[as].dacs[k] = 0;
5216 				break;
5217 			}
5218 			HDA_BOOTVERBOSE(
5219 				device_printf(devinfo->codec->sc->dev,
5220 				    " Pin %d traced to ADC %d\n",
5221 				    ases[as].pins[i], j);
5222 			);
5223 			ases[as].dacs[i] = j;
5224 		}
5225 		if (i == 16)
5226 			return (1);
5227 	}
5228 	return (0);
5229 }
5230 
5231 /*
5232  * Trace input monitor path from mixer to output association.
5233  */
5234 static int
5235 hdac_audio_trace_to_out(struct hdac_devinfo *devinfo, nid_t nid, int depth)
5236 {
5237 	struct hdac_audio_as *ases = devinfo->function.audio.as;
5238 	struct hdac_widget *w, *wc;
5239 	int i, j;
5240 	nid_t res = 0;
5241 
5242 	if (depth > HDA_PARSE_MAXDEPTH)
5243 		return (0);
5244 	w = hdac_widget_get(devinfo, nid);
5245 	if (w == NULL || w->enable == 0)
5246 		return (0);
5247 	HDA_BOOTHVERBOSE(
5248 		device_printf(devinfo->codec->sc->dev,
5249 		    " %*stracing via nid %d\n",
5250 			depth + 1, "", w->nid);
5251 	);
5252 	/* Use only unused widgets */
5253 	if (depth > 0 && w->bindas != -1) {
5254 		if (w->bindas < 0 || ases[w->bindas].dir == HDA_CTL_OUT) {
5255 			HDA_BOOTHVERBOSE(
5256 				device_printf(devinfo->codec->sc->dev,
5257 				    " %*snid %d found output association %d\n",
5258 					depth + 1, "", w->nid, w->bindas);
5259 			);
5260 			if (w->bindas >= 0)
5261 				w->pflags |= HDA_ADC_MONITOR;
5262 			return (1);
5263 		} else {
5264 			HDA_BOOTHVERBOSE(
5265 				device_printf(devinfo->codec->sc->dev,
5266 				    " %*snid %d busy by input association %d\n",
5267 					depth + 1, "", w->nid, w->bindas);
5268 			);
5269 			return (0);
5270 		}
5271 	}
5272 
5273 	switch (w->type) {
5274 	case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT:
5275 		/* Do not traverse input. AD1988 has digital monitor
5276 		for which we are not ready. */
5277 		break;
5278 	case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX:
5279 		if (depth > 0)
5280 			break;
5281 		/* Fall */
5282 	default:
5283 		/* Try to find reachable ADCs with specified nid. */
5284 		for (j = devinfo->startnode; j < devinfo->endnode; j++) {
5285 			wc = hdac_widget_get(devinfo, j);
5286 			if (wc == NULL || wc->enable == 0)
5287 				continue;
5288 			for (i = 0; i < wc->nconns; i++) {
5289 				if (wc->connsenable[i] == 0)
5290 					continue;
5291 				if (wc->conns[i] != nid)
5292 					continue;
5293 				if (hdac_audio_trace_to_out(devinfo,
5294 				    j, depth + 1) != 0) {
5295 					res = 1;
5296 					if (wc->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR &&
5297 					    wc->selconn == -1)
5298 						wc->selconn = i;
5299 				}
5300 			}
5301 		}
5302 		break;
5303 	}
5304 	if (res && w->bindas == -1)
5305 		w->bindas = -2;
5306 
5307 	HDA_BOOTHVERBOSE(
5308 		device_printf(devinfo->codec->sc->dev,
5309 		    " %*snid %d returned %d\n",
5310 			depth + 1, "", w->nid, res);
5311 	);
5312 	return (res);
5313 }
5314 
5315 /*
5316  * Trace extra associations (beeper, monitor)
5317  */
5318 static void
5319 hdac_audio_trace_as_extra(struct hdac_devinfo *devinfo)
5320 {
5321 	struct hdac_audio_as *as = devinfo->function.audio.as;
5322 	struct hdac_widget *w;
5323 	int j;
5324 
5325 	/* Input monitor */
5326 	/* Find mixer associated with input, but supplying signal
5327 	   for output associations. Hope it will be input monitor. */
5328 	HDA_BOOTVERBOSE(
5329 		device_printf(devinfo->codec->sc->dev,
5330 		    "Tracing input monitor\n");
5331 	);
5332 	for (j = devinfo->startnode; j < devinfo->endnode; j++) {
5333 		w = hdac_widget_get(devinfo, j);
5334 		if (w == NULL || w->enable == 0)
5335 			continue;
5336 		if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER)
5337 			continue;
5338 		if (w->bindas < 0 || as[w->bindas].dir != HDA_CTL_IN)
5339 			continue;
5340 		HDA_BOOTVERBOSE(
5341 			device_printf(devinfo->codec->sc->dev,
5342 			    " Tracing nid %d to out\n",
5343 			    j);
5344 		);
5345 		if (hdac_audio_trace_to_out(devinfo, w->nid, 0)) {
5346 			HDA_BOOTVERBOSE(
5347 				device_printf(devinfo->codec->sc->dev,
5348 				    " nid %d is input monitor\n",
5349 					w->nid);
5350 			);
5351 			w->ossdev = SOUND_MIXER_IMIX;
5352 		}
5353 	}
5354 
5355 	/* Other inputs monitor */
5356 	/* Find input pins supplying signal for output associations.
5357 	   Hope it will be input monitoring. */
5358 	HDA_BOOTVERBOSE(
5359 		device_printf(devinfo->codec->sc->dev,
5360 		    "Tracing other input monitors\n");
5361 	);
5362 	for (j = devinfo->startnode; j < devinfo->endnode; j++) {
5363 		w = hdac_widget_get(devinfo, j);
5364 		if (w == NULL || w->enable == 0)
5365 			continue;
5366 		if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX)
5367 			continue;
5368 		if (w->bindas < 0 || as[w->bindas].dir != HDA_CTL_IN)
5369 			continue;
5370 		HDA_BOOTVERBOSE(
5371 			device_printf(devinfo->codec->sc->dev,
5372 			    " Tracing nid %d to out\n",
5373 			    j);
5374 		);
5375 		if (hdac_audio_trace_to_out(devinfo, w->nid, 0)) {
5376 			HDA_BOOTVERBOSE(
5377 				device_printf(devinfo->codec->sc->dev,
5378 				    " nid %d is input monitor\n",
5379 					w->nid);
5380 			);
5381 		}
5382 	}
5383 
5384 	/* Beeper */
5385 	HDA_BOOTVERBOSE(
5386 		device_printf(devinfo->codec->sc->dev,
5387 		    "Tracing beeper\n");
5388 	);
5389 	for (j = devinfo->startnode; j < devinfo->endnode; j++) {
5390 		w = hdac_widget_get(devinfo, j);
5391 		if (w == NULL || w->enable == 0)
5392 			continue;
5393 		if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_BEEP_WIDGET)
5394 			continue;
5395 		HDA_BOOTHVERBOSE(
5396 			device_printf(devinfo->codec->sc->dev,
5397 			    " Tracing nid %d to out\n",
5398 			    j);
5399 		);
5400 		if (hdac_audio_trace_to_out(devinfo, w->nid, 0)) {
5401 			HDA_BOOTVERBOSE(
5402 				device_printf(devinfo->codec->sc->dev,
5403 				    " nid %d traced to out\n",
5404 				    j);
5405 			);
5406 		}
5407 		w->bindas = -2;
5408 	}
5409 }
5410 
5411 /*
5412  * Bind assotiations to PCM channels
5413  */
5414 static void
5415 hdac_audio_bind_as(struct hdac_devinfo *devinfo)
5416 {
5417 	struct hdac_softc *sc = devinfo->codec->sc;
5418 	struct hdac_audio_as *as = devinfo->function.audio.as;
5419 	int j, cnt = 0, free;
5420 
5421 	for (j = 0; j < devinfo->function.audio.ascnt; j++) {
5422 		if (as[j].enable)
5423 			cnt++;
5424 	}
5425 	if (sc->num_chans == 0) {
5426 		sc->chans = (struct hdac_chan *)malloc(
5427 		    sizeof(struct hdac_chan) * cnt,
5428 		    M_HDAC, M_ZERO | M_NOWAIT);
5429 		if (sc->chans == NULL) {
5430 			device_printf(sc->dev,
5431 			    "Channels memory allocation failed!\n");
5432 			return;
5433 		}
5434 	} else {
5435 		sc->chans = (struct hdac_chan *)realloc(sc->chans,
5436 		    sizeof(struct hdac_chan) * (sc->num_chans + cnt),
5437 		    M_HDAC, M_ZERO | M_NOWAIT);
5438 		if (sc->chans == NULL) {
5439 			sc->num_chans = 0;
5440 			device_printf(sc->dev,
5441 			    "Channels memory allocation failed!\n");
5442 			return;
5443 		}
5444 		/* Fixup relative pointers after realloc */
5445 		for (j = 0; j < sc->num_chans; j++)
5446 			sc->chans[j].caps.fmtlist = sc->chans[j].fmtlist;
5447 	}
5448 	free = sc->num_chans;
5449 	sc->num_chans += cnt;
5450 
5451 	for (j = free; j < free + cnt; j++) {
5452 		sc->chans[j].devinfo = devinfo;
5453 		sc->chans[j].as = -1;
5454 	}
5455 
5456 	/* Assign associations in order of their numbers, */
5457 	for (j = 0; j < devinfo->function.audio.ascnt; j++) {
5458 		if (as[j].enable == 0)
5459 			continue;
5460 
5461 		as[j].chan = free;
5462 		sc->chans[free].as = j;
5463 		sc->chans[free].dir =
5464 		    (as[j].dir == HDA_CTL_IN) ? PCMDIR_REC : PCMDIR_PLAY;
5465 		hdac_pcmchannel_setup(&sc->chans[free]);
5466 		free++;
5467 	}
5468 }
5469 
5470 static void
5471 hdac_audio_disable_nonaudio(struct hdac_devinfo *devinfo)
5472 {
5473 	struct hdac_widget *w;
5474 	int i;
5475 
5476 	/* Disable power and volume widgets. */
5477 	for (i = devinfo->startnode; i < devinfo->endnode; i++) {
5478 		w = hdac_widget_get(devinfo, i);
5479 		if (w == NULL || w->enable == 0)
5480 			continue;
5481 		if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_POWER_WIDGET ||
5482 		    w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_VOLUME_WIDGET) {
5483 			w->enable = 0;
5484 			HDA_BOOTHVERBOSE(
5485 				device_printf(devinfo->codec->sc->dev,
5486 				    " Disabling nid %d due to it's"
5487 				    " non-audio type.\n",
5488 				    w->nid);
5489 			);
5490 		}
5491 	}
5492 }
5493 
5494 static void
5495 hdac_audio_disable_useless(struct hdac_devinfo *devinfo)
5496 {
5497 	struct hdac_widget *w, *cw;
5498 	struct hdac_audio_ctl *ctl;
5499 	int done, found, i, j, k;
5500 
5501 	/* Disable useless pins. */
5502 	for (i = devinfo->startnode; i < devinfo->endnode; i++) {
5503 		w = hdac_widget_get(devinfo, i);
5504 		if (w == NULL || w->enable == 0)
5505 			continue;
5506 		if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) {
5507 			if ((w->wclass.pin.config &
5508 			    HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK) ==
5509 			    HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_NONE) {
5510 				w->enable = 0;
5511 				HDA_BOOTHVERBOSE(
5512 					device_printf(devinfo->codec->sc->dev,
5513 					    " Disabling pin nid %d due"
5514 					    " to None connectivity.\n",
5515 					    w->nid);
5516 				);
5517 			} else if ((w->wclass.pin.config &
5518 			    HDA_CONFIG_DEFAULTCONF_ASSOCIATION_MASK) == 0) {
5519 				w->enable = 0;
5520 				HDA_BOOTHVERBOSE(
5521 					device_printf(devinfo->codec->sc->dev,
5522 					    " Disabling unassociated"
5523 					    " pin nid %d.\n",
5524 					    w->nid);
5525 				);
5526 			}
5527 		}
5528 	}
5529 	do {
5530 		done = 1;
5531 		/* Disable and mute controls for disabled widgets. */
5532 		i = 0;
5533 		while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) {
5534 			if (ctl->enable == 0)
5535 				continue;
5536 			if (ctl->widget->enable == 0 ||
5537 			    (ctl->childwidget != NULL &&
5538 			    ctl->childwidget->enable == 0)) {
5539 				ctl->forcemute = 1;
5540 				ctl->muted = HDA_AMP_MUTE_ALL;
5541 				ctl->left = 0;
5542 				ctl->right = 0;
5543 				ctl->enable = 0;
5544 				if (ctl->ndir == HDA_CTL_IN)
5545 					ctl->widget->connsenable[ctl->index] = 0;
5546 				done = 0;
5547 				HDA_BOOTHVERBOSE(
5548 					device_printf(devinfo->codec->sc->dev,
5549 					    " Disabling ctl %d nid %d cnid %d due"
5550 					    " to disabled widget.\n", i,
5551 					    ctl->widget->nid,
5552 					    (ctl->childwidget != NULL)?
5553 					    ctl->childwidget->nid:-1);
5554 				);
5555 			}
5556 		}
5557 		/* Disable useless widgets. */
5558 		for (i = devinfo->startnode; i < devinfo->endnode; i++) {
5559 			w = hdac_widget_get(devinfo, i);
5560 			if (w == NULL || w->enable == 0)
5561 				continue;
5562 			/* Disable inputs with disabled child widgets. */
5563 			for (j = 0; j < w->nconns; j++) {
5564 				if (w->connsenable[j]) {
5565 					cw = hdac_widget_get(devinfo, w->conns[j]);
5566 					if (cw == NULL || cw->enable == 0) {
5567 						w->connsenable[j] = 0;
5568 						HDA_BOOTHVERBOSE(
5569 							device_printf(devinfo->codec->sc->dev,
5570 							    " Disabling nid %d connection %d due"
5571 							    " to disabled child widget.\n",
5572 							    i, j);
5573 						);
5574 					}
5575 				}
5576 			}
5577 			if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR &&
5578 			    w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER)
5579 				continue;
5580 			/* Disable mixers and selectors without inputs. */
5581 			found = 0;
5582 			for (j = 0; j < w->nconns; j++) {
5583 				if (w->connsenable[j]) {
5584 					found = 1;
5585 					break;
5586 				}
5587 			}
5588 			if (found == 0) {
5589 				w->enable = 0;
5590 				done = 0;
5591 				HDA_BOOTHVERBOSE(
5592 					device_printf(devinfo->codec->sc->dev,
5593 					    " Disabling nid %d due to all it's"
5594 					    " inputs disabled.\n", w->nid);
5595 				);
5596 			}
5597 			/* Disable nodes without consumers. */
5598 			if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR &&
5599 			    w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER)
5600 				continue;
5601 			found = 0;
5602 			for (k = devinfo->startnode; k < devinfo->endnode; k++) {
5603 				cw = hdac_widget_get(devinfo, k);
5604 				if (cw == NULL || cw->enable == 0)
5605 					continue;
5606 				for (j = 0; j < cw->nconns; j++) {
5607 					if (cw->connsenable[j] && cw->conns[j] == i) {
5608 						found = 1;
5609 						break;
5610 					}
5611 				}
5612 			}
5613 			if (found == 0) {
5614 				w->enable = 0;
5615 				done = 0;
5616 				HDA_BOOTHVERBOSE(
5617 					device_printf(devinfo->codec->sc->dev,
5618 					    " Disabling nid %d due to all it's"
5619 					    " consumers disabled.\n", w->nid);
5620 				);
5621 			}
5622 		}
5623 	} while (done == 0);
5624 
5625 }
5626 
5627 static void
5628 hdac_audio_disable_unas(struct hdac_devinfo *devinfo)
5629 {
5630 	struct hdac_audio_as *as = devinfo->function.audio.as;
5631 	struct hdac_widget *w, *cw;
5632 	struct hdac_audio_ctl *ctl;
5633 	int i, j, k;
5634 
5635 	/* Disable unassosiated widgets. */
5636 	for (i = devinfo->startnode; i < devinfo->endnode; i++) {
5637 		w = hdac_widget_get(devinfo, i);
5638 		if (w == NULL || w->enable == 0)
5639 			continue;
5640 		if (w->bindas == -1) {
5641 			w->enable = 0;
5642 			HDA_BOOTHVERBOSE(
5643 				device_printf(devinfo->codec->sc->dev,
5644 				    " Disabling unassociated nid %d.\n",
5645 				    w->nid);
5646 			);
5647 		}
5648 	}
5649 	/* Disable input connections on input pin and
5650 	 * output on output. */
5651 	for (i = devinfo->startnode; i < devinfo->endnode; i++) {
5652 		w = hdac_widget_get(devinfo, i);
5653 		if (w == NULL || w->enable == 0)
5654 			continue;
5655 		if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX)
5656 			continue;
5657 		if (w->bindas < 0)
5658 			continue;
5659 		if (as[w->bindas].dir == HDA_CTL_IN) {
5660 			for (j = 0; j < w->nconns; j++) {
5661 				if (w->connsenable[j] == 0)
5662 					continue;
5663 				w->connsenable[j] = 0;
5664 				HDA_BOOTHVERBOSE(
5665 					device_printf(devinfo->codec->sc->dev,
5666 					    " Disabling connection to input pin "
5667 					    "nid %d conn %d.\n",
5668 					    i, j);
5669 				);
5670 			}
5671 			ctl = hdac_audio_ctl_amp_get(devinfo, w->nid,
5672 			    HDA_CTL_IN, -1, 1);
5673 			if (ctl && ctl->enable) {
5674 				ctl->forcemute = 1;
5675 				ctl->muted = HDA_AMP_MUTE_ALL;
5676 				ctl->left = 0;
5677 				ctl->right = 0;
5678 				ctl->enable = 0;
5679 			}
5680 		} else {
5681 			ctl = hdac_audio_ctl_amp_get(devinfo, w->nid,
5682 			    HDA_CTL_OUT, -1, 1);
5683 			if (ctl && ctl->enable) {
5684 				ctl->forcemute = 1;
5685 				ctl->muted = HDA_AMP_MUTE_ALL;
5686 				ctl->left = 0;
5687 				ctl->right = 0;
5688 				ctl->enable = 0;
5689 			}
5690 			for (k = devinfo->startnode; k < devinfo->endnode; k++) {
5691 				cw = hdac_widget_get(devinfo, k);
5692 				if (cw == NULL || cw->enable == 0)
5693 					continue;
5694 				for (j = 0; j < cw->nconns; j++) {
5695 					if (cw->connsenable[j] && cw->conns[j] == i) {
5696 						cw->connsenable[j] = 0;
5697 						HDA_BOOTHVERBOSE(
5698 							device_printf(devinfo->codec->sc->dev,
5699 							    " Disabling connection from output pin "
5700 							    "nid %d conn %d cnid %d.\n",
5701 							    k, j, i);
5702 						);
5703 						if (cw->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX &&
5704 						    cw->nconns > 1)
5705 							continue;
5706 						ctl = hdac_audio_ctl_amp_get(devinfo, k,
5707 		    				    HDA_CTL_IN, j, 1);
5708 						if (ctl && ctl->enable) {
5709 							ctl->forcemute = 1;
5710 							ctl->muted = HDA_AMP_MUTE_ALL;
5711 							ctl->left = 0;
5712 							ctl->right = 0;
5713 							ctl->enable = 0;
5714 						}
5715 					}
5716 				}
5717 			}
5718 		}
5719 	}
5720 }
5721 
5722 static void
5723 hdac_audio_disable_notselected(struct hdac_devinfo *devinfo)
5724 {
5725 	struct hdac_audio_as *as = devinfo->function.audio.as;
5726 	struct hdac_widget *w;
5727 	int i, j;
5728 
5729 	/* On playback path we can safely disable all unseleted inputs. */
5730 	for (i = devinfo->startnode; i < devinfo->endnode; i++) {
5731 		w = hdac_widget_get(devinfo, i);
5732 		if (w == NULL || w->enable == 0)
5733 			continue;
5734 		if (w->nconns <= 1)
5735 			continue;
5736 		if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER)
5737 			continue;
5738 		if (w->bindas < 0 || as[w->bindas].dir == HDA_CTL_IN)
5739 			continue;
5740 		for (j = 0; j < w->nconns; j++) {
5741 			if (w->connsenable[j] == 0)
5742 				continue;
5743 			if (w->selconn < 0 || w->selconn == j)
5744 				continue;
5745 			w->connsenable[j] = 0;
5746 			HDA_BOOTHVERBOSE(
5747 				device_printf(devinfo->codec->sc->dev,
5748 				    " Disabling unselected connection "
5749 				    "nid %d conn %d.\n",
5750 				    i, j);
5751 			);
5752 		}
5753 	}
5754 }
5755 
5756 static void
5757 hdac_audio_disable_crossas(struct hdac_devinfo *devinfo)
5758 {
5759 	struct hdac_audio_as *ases = devinfo->function.audio.as;
5760 	struct hdac_widget *w, *cw;
5761 	struct hdac_audio_ctl *ctl;
5762 	int i, j;
5763 
5764 	/* Disable crossassociatement and unwanted crosschannel connections. */
5765 	/* ... using selectors */
5766 	for (i = devinfo->startnode; i < devinfo->endnode; i++) {
5767 		w = hdac_widget_get(devinfo, i);
5768 		if (w == NULL || w->enable == 0)
5769 			continue;
5770 		if (w->nconns <= 1)
5771 			continue;
5772 		if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER)
5773 			continue;
5774 		if (w->bindas == -2)
5775 			continue;
5776 		for (j = 0; j < w->nconns; j++) {
5777 			if (w->connsenable[j] == 0)
5778 				continue;
5779 			cw = hdac_widget_get(devinfo, w->conns[j]);
5780 			if (cw == NULL || w->enable == 0)
5781 				continue;
5782 			if (cw->bindas == -2 ||
5783 			    ((w->pflags & HDA_ADC_MONITOR) &&
5784 			     cw->bindas >= 0 &&
5785 			     ases[cw->bindas].dir == HDA_CTL_IN))
5786 				continue;
5787 			if (w->bindas == cw->bindas &&
5788 			    (w->bindseqmask & cw->bindseqmask) != 0)
5789 				continue;
5790 			w->connsenable[j] = 0;
5791 			HDA_BOOTHVERBOSE(
5792 				device_printf(devinfo->codec->sc->dev,
5793 				    " Disabling crossassociatement connection "
5794 				    "nid %d conn %d cnid %d.\n",
5795 				    i, j, cw->nid);
5796 			);
5797 		}
5798 	}
5799 	/* ... using controls */
5800 	i = 0;
5801 	while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) {
5802 		if (ctl->enable == 0 || ctl->childwidget == NULL)
5803 			continue;
5804 		if (ctl->widget->bindas == -2)
5805 			continue;
5806 		if (ctl->childwidget->bindas == -2 ||
5807 		    ((ctl->widget->pflags & HDA_ADC_MONITOR) &&
5808 		     ctl->childwidget->bindas >= 0 &&
5809 		     ases[ctl->childwidget->bindas].dir == HDA_CTL_IN))
5810 			continue;
5811 		if (ctl->widget->bindas != ctl->childwidget->bindas ||
5812 		    (ctl->widget->bindseqmask & ctl->childwidget->bindseqmask) == 0) {
5813 			ctl->forcemute = 1;
5814 			ctl->muted = HDA_AMP_MUTE_ALL;
5815 			ctl->left = 0;
5816 			ctl->right = 0;
5817 			ctl->enable = 0;
5818 			if (ctl->ndir == HDA_CTL_IN)
5819 				ctl->widget->connsenable[ctl->index] = 0;
5820 			HDA_BOOTHVERBOSE(
5821 				device_printf(devinfo->codec->sc->dev,
5822 				    " Disabling crossassociatement connection "
5823 				    "ctl %d nid %d cnid %d.\n", i,
5824 				    ctl->widget->nid,
5825 				    ctl->childwidget->nid);
5826 			);
5827 		}
5828 	}
5829 
5830 }
5831 
5832 #define HDA_CTL_GIVE(ctl)	((ctl)->step?1:0)
5833 
5834 /*
5835  * Find controls to control amplification for source.
5836  */
5837 static int
5838 hdac_audio_ctl_source_amp(struct hdac_devinfo *devinfo, nid_t nid, int index,
5839     int ossdev, int ctlable, int depth, int need)
5840 {
5841 	struct hdac_widget *w, *wc;
5842 	struct hdac_audio_ctl *ctl;
5843 	int i, j, conns = 0, rneed;
5844 
5845 	if (depth > HDA_PARSE_MAXDEPTH)
5846 		return (need);
5847 
5848 	w = hdac_widget_get(devinfo, nid);
5849 	if (w == NULL || w->enable == 0)
5850 		return (need);
5851 
5852 	/* Count number of active inputs. */
5853 	if (depth > 0) {
5854 		for (j = 0; j < w->nconns; j++) {
5855 			if (w->connsenable[j])
5856 				conns++;
5857 		}
5858 	}
5859 
5860 	/* If this is not a first step - use input mixer.
5861 	   Pins have common input ctl so care must be taken. */
5862 	if (depth > 0 && ctlable && (conns == 1 ||
5863 	    w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX)) {
5864 		ctl = hdac_audio_ctl_amp_get(devinfo, w->nid, HDA_CTL_IN,
5865 		    index, 1);
5866 		if (ctl) {
5867 			if (HDA_CTL_GIVE(ctl) & need)
5868 				ctl->ossmask |= (1 << ossdev);
5869 			else
5870 				ctl->possmask |= (1 << ossdev);
5871 			need &= ~HDA_CTL_GIVE(ctl);
5872 		}
5873 	}
5874 
5875 	/* If widget has own ossdev - not traverse it.
5876 	   It will be traversed on it's own. */
5877 	if (w->ossdev >= 0 && depth > 0)
5878 		return (need);
5879 
5880 	/* We must not traverse pin */
5881 	if ((w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT ||
5882 	    w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) &&
5883 	    depth > 0)
5884 		return (need);
5885 
5886 	/* record that this widget exports such signal, */
5887 	w->ossmask |= (1 << ossdev);
5888 
5889 	/* If signals mixed, we can't assign controls farther.
5890 	 * Ignore this on depth zero. Caller must knows why.
5891 	 * Ignore this for static selectors if this input selected.
5892 	 */
5893 	if (conns > 1)
5894 		ctlable = 0;
5895 
5896 	if (ctlable) {
5897 		ctl = hdac_audio_ctl_amp_get(devinfo, w->nid, HDA_CTL_OUT, -1, 1);
5898 		if (ctl) {
5899 			if (HDA_CTL_GIVE(ctl) & need)
5900 				ctl->ossmask |= (1 << ossdev);
5901 			else
5902 				ctl->possmask |= (1 << ossdev);
5903 			need &= ~HDA_CTL_GIVE(ctl);
5904 		}
5905 	}
5906 
5907 	rneed = 0;
5908 	for (i = devinfo->startnode; i < devinfo->endnode; i++) {
5909 		wc = hdac_widget_get(devinfo, i);
5910 		if (wc == NULL || wc->enable == 0)
5911 			continue;
5912 		for (j = 0; j < wc->nconns; j++) {
5913 			if (wc->connsenable[j] && wc->conns[j] == nid) {
5914 				rneed |= hdac_audio_ctl_source_amp(devinfo,
5915 				    wc->nid, j, ossdev, ctlable, depth + 1, need);
5916 			}
5917 		}
5918 	}
5919 	rneed &= need;
5920 
5921 	return (rneed);
5922 }
5923 
5924 /*
5925  * Find controls to control amplification for destination.
5926  */
5927 static void
5928 hdac_audio_ctl_dest_amp(struct hdac_devinfo *devinfo, nid_t nid, int index,
5929     int ossdev, int depth, int need)
5930 {
5931 	struct hdac_audio_as *as = devinfo->function.audio.as;
5932 	struct hdac_widget *w, *wc;
5933 	struct hdac_audio_ctl *ctl;
5934 	int i, j, consumers;
5935 
5936 	if (depth > HDA_PARSE_MAXDEPTH)
5937 		return;
5938 
5939 	w = hdac_widget_get(devinfo, nid);
5940 	if (w == NULL || w->enable == 0)
5941 		return;
5942 
5943 	if (depth > 0) {
5944 		/* If this node produce output for several consumers,
5945 		   we can't touch it. */
5946 		consumers = 0;
5947 		for (i = devinfo->startnode; i < devinfo->endnode; i++) {
5948 			wc = hdac_widget_get(devinfo, i);
5949 			if (wc == NULL || wc->enable == 0)
5950 				continue;
5951 			for (j = 0; j < wc->nconns; j++) {
5952 				if (wc->connsenable[j] && wc->conns[j] == nid)
5953 					consumers++;
5954 			}
5955 		}
5956 		/* The only exception is if real HP redirection is configured
5957 		   and this is a duplication point.
5958 		   XXX: Actually exception is not completely correct.
5959 		   XXX: Duplication point check is not perfect. */
5960 		if ((consumers == 2 && (w->bindas < 0 ||
5961 		    as[w->bindas].hpredir < 0 || as[w->bindas].fakeredir ||
5962 		    (w->bindseqmask & (1 << 15)) == 0)) ||
5963 		    consumers > 2)
5964 			return;
5965 
5966 		/* Else use it's output mixer. */
5967 		ctl = hdac_audio_ctl_amp_get(devinfo, w->nid,
5968 		    HDA_CTL_OUT, -1, 1);
5969 		if (ctl) {
5970 			if (HDA_CTL_GIVE(ctl) & need)
5971 				ctl->ossmask |= (1 << ossdev);
5972 			else
5973 				ctl->possmask |= (1 << ossdev);
5974 			need &= ~HDA_CTL_GIVE(ctl);
5975 		}
5976 	}
5977 
5978 	/* We must not traverse pin */
5979 	if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX &&
5980 	    depth > 0)
5981 		return;
5982 
5983 	for (i = 0; i < w->nconns; i++) {
5984 		int tneed = need;
5985 		if (w->connsenable[i] == 0)
5986 			continue;
5987 		if (index >= 0 && i != index)
5988 			continue;
5989 		ctl = hdac_audio_ctl_amp_get(devinfo, w->nid,
5990 		    HDA_CTL_IN, i, 1);
5991 		if (ctl) {
5992 			if (HDA_CTL_GIVE(ctl) & tneed)
5993 				ctl->ossmask |= (1 << ossdev);
5994 			else
5995 				ctl->possmask |= (1 << ossdev);
5996 			tneed &= ~HDA_CTL_GIVE(ctl);
5997 		}
5998 		hdac_audio_ctl_dest_amp(devinfo, w->conns[i], -1, ossdev,
5999 		    depth + 1, tneed);
6000 	}
6001 }
6002 
6003 /*
6004  * Assign OSS names to sound sources
6005  */
6006 static void
6007 hdac_audio_assign_names(struct hdac_devinfo *devinfo)
6008 {
6009 	struct hdac_audio_as *as = devinfo->function.audio.as;
6010 	struct hdac_widget *w;
6011 	int i, j;
6012 	int type = -1, use, used = 0;
6013 	static const int types[7][13] = {
6014 	    { SOUND_MIXER_LINE, SOUND_MIXER_LINE1, SOUND_MIXER_LINE2,
6015 	      SOUND_MIXER_LINE3, -1 },	/* line */
6016 	    { SOUND_MIXER_MONITOR, SOUND_MIXER_MIC, -1 }, /* int mic */
6017 	    { SOUND_MIXER_MIC, SOUND_MIXER_MONITOR, -1 }, /* ext mic */
6018 	    { SOUND_MIXER_CD, -1 },	/* cd */
6019 	    { SOUND_MIXER_SPEAKER, -1 },	/* speaker */
6020 	    { SOUND_MIXER_DIGITAL1, SOUND_MIXER_DIGITAL2, SOUND_MIXER_DIGITAL3,
6021 	      -1 },	/* digital */
6022 	    { SOUND_MIXER_LINE, SOUND_MIXER_LINE1, SOUND_MIXER_LINE2,
6023 	      SOUND_MIXER_LINE3, SOUND_MIXER_PHONEIN, SOUND_MIXER_PHONEOUT,
6024 	      SOUND_MIXER_VIDEO, SOUND_MIXER_RADIO, SOUND_MIXER_DIGITAL1,
6025 	      SOUND_MIXER_DIGITAL2, SOUND_MIXER_DIGITAL3, SOUND_MIXER_MONITOR,
6026 	      -1 }	/* others */
6027 	};
6028 
6029 	/* Surely known names */
6030 	for (i = devinfo->startnode; i < devinfo->endnode; i++) {
6031 		w = hdac_widget_get(devinfo, i);
6032 		if (w == NULL || w->enable == 0)
6033 			continue;
6034 		if (w->bindas == -1)
6035 			continue;
6036 		use = -1;
6037 		switch (w->type) {
6038 		case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX:
6039 			if (as[w->bindas].dir == HDA_CTL_OUT)
6040 				break;
6041 			type = -1;
6042 			switch (w->wclass.pin.config & HDA_CONFIG_DEFAULTCONF_DEVICE_MASK) {
6043 			case HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_IN:
6044 				type = 0;
6045 				break;
6046 			case HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN:
6047 				if ((w->wclass.pin.config & HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK)
6048 				    == HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_JACK)
6049 					break;
6050 				type = 1;
6051 				break;
6052 			case HDA_CONFIG_DEFAULTCONF_DEVICE_CD:
6053 				type = 3;
6054 				break;
6055 			case HDA_CONFIG_DEFAULTCONF_DEVICE_SPEAKER:
6056 				type = 4;
6057 				break;
6058 			case HDA_CONFIG_DEFAULTCONF_DEVICE_SPDIF_IN:
6059 			case HDA_CONFIG_DEFAULTCONF_DEVICE_DIGITAL_OTHER_IN:
6060 				type = 5;
6061 				break;
6062 			}
6063 			if (type == -1)
6064 				break;
6065 			j = 0;
6066 			while (types[type][j] >= 0 &&
6067 			    (used & (1 << types[type][j])) != 0) {
6068 				j++;
6069 			}
6070 			if (types[type][j] >= 0)
6071 				use = types[type][j];
6072 			break;
6073 		case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_OUTPUT:
6074 			use = SOUND_MIXER_PCM;
6075 			break;
6076 		case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_BEEP_WIDGET:
6077 			use = SOUND_MIXER_SPEAKER;
6078 			break;
6079 		default:
6080 			break;
6081 		}
6082 		if (use >= 0) {
6083 			w->ossdev = use;
6084 			used |= (1 << use);
6085 		}
6086 	}
6087 	/* Semi-known names */
6088 	for (i = devinfo->startnode; i < devinfo->endnode; i++) {
6089 		w = hdac_widget_get(devinfo, i);
6090 		if (w == NULL || w->enable == 0)
6091 			continue;
6092 		if (w->ossdev >= 0)
6093 			continue;
6094 		if (w->bindas == -1)
6095 			continue;
6096 		if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX)
6097 			continue;
6098 		if (as[w->bindas].dir == HDA_CTL_OUT)
6099 			continue;
6100 		type = -1;
6101 		switch (w->wclass.pin.config & HDA_CONFIG_DEFAULTCONF_DEVICE_MASK) {
6102 		case HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_OUT:
6103 		case HDA_CONFIG_DEFAULTCONF_DEVICE_SPEAKER:
6104 		case HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT:
6105 		case HDA_CONFIG_DEFAULTCONF_DEVICE_AUX:
6106 			type = 0;
6107 			break;
6108 		case HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN:
6109 			type = 2;
6110 			break;
6111 		case HDA_CONFIG_DEFAULTCONF_DEVICE_SPDIF_OUT:
6112 		case HDA_CONFIG_DEFAULTCONF_DEVICE_DIGITAL_OTHER_OUT:
6113 			type = 5;
6114 			break;
6115 		}
6116 		if (type == -1)
6117 			break;
6118 		j = 0;
6119 		while (types[type][j] >= 0 &&
6120 		    (used & (1 << types[type][j])) != 0) {
6121 			j++;
6122 		}
6123 		if (types[type][j] >= 0) {
6124 			w->ossdev = types[type][j];
6125 			used |= (1 << types[type][j]);
6126 		}
6127 	}
6128 	/* Others */
6129 	for (i = devinfo->startnode; i < devinfo->endnode; i++) {
6130 		w = hdac_widget_get(devinfo, i);
6131 		if (w == NULL || w->enable == 0)
6132 			continue;
6133 		if (w->ossdev >= 0)
6134 			continue;
6135 		if (w->bindas == -1)
6136 			continue;
6137 		if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX)
6138 			continue;
6139 		if (as[w->bindas].dir == HDA_CTL_OUT)
6140 			continue;
6141 		j = 0;
6142 		while (types[6][j] >= 0 &&
6143 		    (used & (1 << types[6][j])) != 0) {
6144 			j++;
6145 		}
6146 		if (types[6][j] >= 0) {
6147 			w->ossdev = types[6][j];
6148 			used |= (1 << types[6][j]);
6149 		}
6150 	}
6151 }
6152 
6153 static void
6154 hdac_audio_build_tree(struct hdac_devinfo *devinfo)
6155 {
6156 	struct hdac_audio_as *as = devinfo->function.audio.as;
6157 	int j, res;
6158 
6159 	/* Trace all associations in order of their numbers, */
6160 	for (j = 0; j < devinfo->function.audio.ascnt; j++) {
6161 		if (as[j].enable == 0)
6162 			continue;
6163 		HDA_BOOTVERBOSE(
6164 			device_printf(devinfo->codec->sc->dev,
6165 			    "Tracing association %d (%d)\n", j, as[j].index);
6166 		);
6167 		if (as[j].dir == HDA_CTL_OUT) {
6168 retry:
6169 			res = hdac_audio_trace_as_out(devinfo, j, 0);
6170 			if (res == 0 && as[j].hpredir >= 0 &&
6171 			    as[j].fakeredir == 0) {
6172 				/* If codec can't do analog HP redirection
6173 				   try to make it using one more DAC. */
6174 				as[j].fakeredir = 1;
6175 				goto retry;
6176 			}
6177 		} else {
6178 			res = hdac_audio_trace_as_in(devinfo, j);
6179 		}
6180 		if (res) {
6181 			HDA_BOOTVERBOSE(
6182 				device_printf(devinfo->codec->sc->dev,
6183 				    "Association %d (%d) trace succeeded\n",
6184 				    j, as[j].index);
6185 			);
6186 		} else {
6187 			HDA_BOOTVERBOSE(
6188 				device_printf(devinfo->codec->sc->dev,
6189 				    "Association %d (%d) trace failed\n",
6190 				    j, as[j].index);
6191 			);
6192 			as[j].enable = 0;
6193 		}
6194 	}
6195 
6196 	/* Trace mixer and beeper pseudo associations. */
6197 	hdac_audio_trace_as_extra(devinfo);
6198 }
6199 
6200 static void
6201 hdac_audio_assign_mixers(struct hdac_devinfo *devinfo)
6202 {
6203 	struct hdac_audio_as *as = devinfo->function.audio.as;
6204 	struct hdac_audio_ctl *ctl;
6205 	struct hdac_widget *w, *cw;
6206 	int i, j;
6207 
6208 	/* Assign mixers to the tree. */
6209 	for (i = devinfo->startnode; i < devinfo->endnode; i++) {
6210 		w = hdac_widget_get(devinfo, i);
6211 		if (w == NULL || w->enable == 0)
6212 			continue;
6213 		if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_OUTPUT ||
6214 		    w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_BEEP_WIDGET ||
6215 		    (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX &&
6216 		    as[w->bindas].dir == HDA_CTL_IN)) {
6217 			if (w->ossdev < 0)
6218 				continue;
6219 			hdac_audio_ctl_source_amp(devinfo, w->nid, -1,
6220 			    w->ossdev, 1, 0, 1);
6221 		} else if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT) {
6222 			hdac_audio_ctl_dest_amp(devinfo, w->nid, -1,
6223 			    SOUND_MIXER_RECLEV, 0, 1);
6224 		} else if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX &&
6225 		    as[w->bindas].dir == HDA_CTL_OUT) {
6226 			hdac_audio_ctl_dest_amp(devinfo, w->nid, -1,
6227 			    SOUND_MIXER_VOLUME, 0, 1);
6228 		}
6229 		if (w->ossdev == SOUND_MIXER_IMIX) {
6230 			if (hdac_audio_ctl_source_amp(devinfo, w->nid, -1,
6231 			    w->ossdev, 1, 0, 1)) {
6232 				/* If we are unable to control input monitor
6233 				   as source - try to control it as destination. */
6234 				hdac_audio_ctl_dest_amp(devinfo, w->nid, -1,
6235 				    w->ossdev, 0, 1);
6236 			}
6237 		}
6238 		if (w->pflags & HDA_ADC_MONITOR) {
6239 			for (j = 0; j < w->nconns; j++) {
6240 				if (!w->connsenable[j])
6241 				    continue;
6242 				cw = hdac_widget_get(devinfo, w->conns[j]);
6243 				if (cw == NULL || cw->enable == 0)
6244 				    continue;
6245 				if (cw->bindas == -1)
6246 				    continue;
6247 				if (cw->bindas >= 0 &&
6248 				    as[cw->bindas].dir != HDA_CTL_IN)
6249 					continue;
6250 				hdac_audio_ctl_dest_amp(devinfo,
6251 				    w->nid, j, SOUND_MIXER_IGAIN, 0, 1);
6252 			}
6253 		}
6254 	}
6255 	/* Treat unrequired as possible. */
6256 	i = 0;
6257 	while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) {
6258 		if (ctl->ossmask == 0)
6259 			ctl->ossmask = ctl->possmask;
6260 	}
6261 }
6262 
6263 static void
6264 hdac_audio_prepare_pin_ctrl(struct hdac_devinfo *devinfo)
6265 {
6266 	struct hdac_audio_as *as = devinfo->function.audio.as;
6267 	struct hdac_widget *w;
6268 	uint32_t pincap;
6269 	int i;
6270 
6271 	for (i = 0; i < devinfo->nodecnt; i++) {
6272 		w = &devinfo->widget[i];
6273 		if (w == NULL)
6274 			continue;
6275 		if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX)
6276 			continue;
6277 
6278 		pincap = w->wclass.pin.cap;
6279 
6280 		/* Disable everything. */
6281 		w->wclass.pin.ctrl &= ~(
6282 		    HDA_CMD_SET_PIN_WIDGET_CTRL_HPHN_ENABLE |
6283 		    HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE |
6284 		    HDA_CMD_SET_PIN_WIDGET_CTRL_IN_ENABLE |
6285 		    HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE_MASK);
6286 
6287 		if (w->enable == 0 ||
6288 		    w->bindas < 0 || as[w->bindas].enable == 0) {
6289 			/* Pin is unused so left it disabled. */
6290 			continue;
6291 		} else if (as[w->bindas].dir == HDA_CTL_IN) {
6292 			/* Input pin, configure for input. */
6293 			if (HDA_PARAM_PIN_CAP_INPUT_CAP(pincap))
6294 				w->wclass.pin.ctrl |=
6295 				    HDA_CMD_SET_PIN_WIDGET_CTRL_IN_ENABLE;
6296 
6297 			if ((devinfo->function.audio.quirks & HDA_QUIRK_IVREF100) &&
6298 			    HDA_PARAM_PIN_CAP_VREF_CTRL_100(pincap))
6299 				w->wclass.pin.ctrl |=
6300 				    HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE(
6301 				    HDA_CMD_PIN_WIDGET_CTRL_VREF_ENABLE_100);
6302 			else if ((devinfo->function.audio.quirks & HDA_QUIRK_IVREF80) &&
6303 			    HDA_PARAM_PIN_CAP_VREF_CTRL_80(pincap))
6304 				w->wclass.pin.ctrl |=
6305 				    HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE(
6306 				    HDA_CMD_PIN_WIDGET_CTRL_VREF_ENABLE_80);
6307 			else if ((devinfo->function.audio.quirks & HDA_QUIRK_IVREF50) &&
6308 			    HDA_PARAM_PIN_CAP_VREF_CTRL_50(pincap))
6309 				w->wclass.pin.ctrl |=
6310 				    HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE(
6311 				    HDA_CMD_PIN_WIDGET_CTRL_VREF_ENABLE_50);
6312 		} else {
6313 			/* Output pin, configure for output. */
6314 			if (HDA_PARAM_PIN_CAP_OUTPUT_CAP(pincap))
6315 				w->wclass.pin.ctrl |=
6316 				    HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE;
6317 
6318 			if (HDA_PARAM_PIN_CAP_HEADPHONE_CAP(pincap) &&
6319 			    (w->wclass.pin.config &
6320 			    HDA_CONFIG_DEFAULTCONF_DEVICE_MASK) ==
6321 			    HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT)
6322 				w->wclass.pin.ctrl |=
6323 				    HDA_CMD_SET_PIN_WIDGET_CTRL_HPHN_ENABLE;
6324 
6325 			if ((devinfo->function.audio.quirks & HDA_QUIRK_OVREF100) &&
6326 			    HDA_PARAM_PIN_CAP_VREF_CTRL_100(pincap))
6327 				w->wclass.pin.ctrl |=
6328 				    HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE(
6329 				    HDA_CMD_PIN_WIDGET_CTRL_VREF_ENABLE_100);
6330 			else if ((devinfo->function.audio.quirks & HDA_QUIRK_OVREF80) &&
6331 			    HDA_PARAM_PIN_CAP_VREF_CTRL_80(pincap))
6332 				w->wclass.pin.ctrl |=
6333 				    HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE(
6334 				    HDA_CMD_PIN_WIDGET_CTRL_VREF_ENABLE_80);
6335 			else if ((devinfo->function.audio.quirks & HDA_QUIRK_OVREF50) &&
6336 			    HDA_PARAM_PIN_CAP_VREF_CTRL_50(pincap))
6337 				w->wclass.pin.ctrl |=
6338 				    HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE(
6339 				    HDA_CMD_PIN_WIDGET_CTRL_VREF_ENABLE_50);
6340 		}
6341 	}
6342 }
6343 
6344 static void
6345 hdac_audio_ctl_commit(struct hdac_devinfo *devinfo)
6346 {
6347 	struct hdac_audio_ctl *ctl;
6348 	int i, z;
6349 
6350 	i = 0;
6351 	while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) {
6352 		if (ctl->enable == 0 || ctl->ossmask != 0) {
6353 			/* Mute disabled and mixer controllable controls.
6354 			 * Last will be initialized by mixer_init().
6355 			 * This expected to reduce click on startup. */
6356 			hdac_audio_ctl_amp_set(ctl, HDA_AMP_MUTE_ALL, 0, 0);
6357 			continue;
6358 		}
6359 		/* Init fixed controls to 0dB amplification. */
6360 		z = ctl->offset;
6361 		if (z > ctl->step)
6362 			z = ctl->step;
6363 		hdac_audio_ctl_amp_set(ctl, HDA_AMP_MUTE_NONE, z, z);
6364 	}
6365 }
6366 
6367 static void
6368 hdac_audio_commit(struct hdac_devinfo *devinfo)
6369 {
6370 	struct hdac_softc *sc = devinfo->codec->sc;
6371 	struct hdac_widget *w;
6372 	nid_t cad;
6373 	uint32_t gdata, gmask, gdir;
6374 	int commitgpio, numgpio;
6375 	int i;
6376 
6377 	cad = devinfo->codec->cad;
6378 
6379 	if (sc->pci_subvendor == APPLE_INTEL_MAC)
6380 		hdac_command(sc, HDA_CMD_12BIT(cad, devinfo->nid,
6381 		    0x7e7, 0), cad);
6382 
6383 	/* Commit controls. */
6384 	hdac_audio_ctl_commit(devinfo);
6385 
6386 	/* Commit selectors, pins and EAPD. */
6387 	for (i = 0; i < devinfo->nodecnt; i++) {
6388 		w = &devinfo->widget[i];
6389 		if (w == NULL)
6390 			continue;
6391 		if (w->selconn == -1)
6392 			w->selconn = 0;
6393 		if (w->nconns > 0)
6394 			hdac_widget_connection_select(w, w->selconn);
6395 		if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) {
6396 			hdac_command(sc,
6397 			    HDA_CMD_SET_PIN_WIDGET_CTRL(cad, w->nid,
6398 			    w->wclass.pin.ctrl), cad);
6399 		}
6400 		if (w->param.eapdbtl != HDAC_INVALID) {
6401 		    	uint32_t val;
6402 
6403 			val = w->param.eapdbtl;
6404 			if (devinfo->function.audio.quirks &
6405 			    HDA_QUIRK_EAPDINV)
6406 				val ^= HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD;
6407 			hdac_command(sc,
6408 			    HDA_CMD_SET_EAPD_BTL_ENABLE(cad, w->nid,
6409 			    val), cad);
6410 		}
6411 	}
6412 
6413 	/* Commit GPIOs. */
6414 	gdata = 0;
6415 	gmask = 0;
6416 	gdir = 0;
6417 	commitgpio = 0;
6418 	numgpio = HDA_PARAM_GPIO_COUNT_NUM_GPIO(
6419 	    devinfo->function.audio.gpio);
6420 
6421 	if (devinfo->function.audio.quirks & HDA_QUIRK_GPIOFLUSH)
6422 		commitgpio = (numgpio > 0) ? 1 : 0;
6423 	else {
6424 		for (i = 0; i < numgpio && i < HDA_GPIO_MAX; i++) {
6425 			if (!(devinfo->function.audio.quirks &
6426 			    (1 << i)))
6427 				continue;
6428 			if (commitgpio == 0) {
6429 				commitgpio = 1;
6430 				HDA_BOOTVERBOSE(
6431 					gdata = hdac_command(sc,
6432 					    HDA_CMD_GET_GPIO_DATA(cad,
6433 					    devinfo->nid), cad);
6434 					gmask = hdac_command(sc,
6435 					    HDA_CMD_GET_GPIO_ENABLE_MASK(cad,
6436 					    devinfo->nid), cad);
6437 					gdir = hdac_command(sc,
6438 					    HDA_CMD_GET_GPIO_DIRECTION(cad,
6439 					    devinfo->nid), cad);
6440 					device_printf(sc->dev,
6441 					    "GPIO init: data=0x%08x "
6442 					    "mask=0x%08x dir=0x%08x\n",
6443 					    gdata, gmask, gdir);
6444 					gdata = 0;
6445 					gmask = 0;
6446 					gdir = 0;
6447 				);
6448 			}
6449 			gdata |= 1 << i;
6450 			gmask |= 1 << i;
6451 			gdir |= 1 << i;
6452 		}
6453 	}
6454 
6455 	if (commitgpio != 0) {
6456 		HDA_BOOTVERBOSE(
6457 			device_printf(sc->dev,
6458 			    "GPIO commit: data=0x%08x mask=0x%08x "
6459 			    "dir=0x%08x\n",
6460 			    gdata, gmask, gdir);
6461 		);
6462 		hdac_command(sc,
6463 		    HDA_CMD_SET_GPIO_ENABLE_MASK(cad, devinfo->nid,
6464 		    gmask), cad);
6465 		hdac_command(sc,
6466 		    HDA_CMD_SET_GPIO_DIRECTION(cad, devinfo->nid,
6467 		    gdir), cad);
6468 		hdac_command(sc,
6469 		    HDA_CMD_SET_GPIO_DATA(cad, devinfo->nid,
6470 		    gdata), cad);
6471 	}
6472 }
6473 
6474 static void
6475 hdac_powerup(struct hdac_devinfo *devinfo)
6476 {
6477 	struct hdac_softc *sc = devinfo->codec->sc;
6478 	nid_t cad = devinfo->codec->cad;
6479 	int i;
6480 
6481 	hdac_command(sc,
6482 	    HDA_CMD_SET_POWER_STATE(cad,
6483 	    devinfo->nid, HDA_CMD_POWER_STATE_D0),
6484 	    cad);
6485 	DELAY(100);
6486 
6487 	for (i = devinfo->startnode; i < devinfo->endnode; i++) {
6488 		hdac_command(sc,
6489 		    HDA_CMD_SET_POWER_STATE(cad,
6490 		    i, HDA_CMD_POWER_STATE_D0),
6491 		    cad);
6492 	}
6493 	DELAY(1000);
6494 }
6495 
6496 static int
6497 hdac_pcmchannel_setup(struct hdac_chan *ch)
6498 {
6499 	struct hdac_devinfo *devinfo = ch->devinfo;
6500 	struct hdac_audio_as *as = devinfo->function.audio.as;
6501 	struct hdac_widget *w;
6502 	uint32_t cap, fmtcap, pcmcap;
6503 	int i, j, ret, channels, onlystereo;
6504 	uint16_t pinset;
6505 
6506 	ch->caps = hdac_caps;
6507 	ch->caps.fmtlist = ch->fmtlist;
6508 	ch->bit16 = 1;
6509 	ch->bit32 = 0;
6510 	ch->pcmrates[0] = 48000;
6511 	ch->pcmrates[1] = 0;
6512 
6513 	ret = 0;
6514 	channels = 0;
6515 	onlystereo = 1;
6516 	pinset = 0;
6517 	fmtcap = devinfo->function.audio.supp_stream_formats;
6518 	pcmcap = devinfo->function.audio.supp_pcm_size_rate;
6519 
6520 	for (i = 0; i < 16; i++) {
6521 		/* Check as is correct */
6522 		if (ch->as < 0)
6523 			break;
6524 		/* Cound only present DACs */
6525 		if (as[ch->as].dacs[i] <= 0)
6526 			continue;
6527 		/* Ignore duplicates */
6528 		for (j = 0; j < ret; j++) {
6529 			if (ch->io[j] == as[ch->as].dacs[i])
6530 				break;
6531 		}
6532 		if (j < ret)
6533 			continue;
6534 
6535 		w = hdac_widget_get(devinfo, as[ch->as].dacs[i]);
6536 		if (w == NULL || w->enable == 0)
6537 			continue;
6538 		cap = w->param.supp_stream_formats;
6539 		if (!HDA_PARAM_SUPP_STREAM_FORMATS_PCM(cap) &&
6540 		    !HDA_PARAM_SUPP_STREAM_FORMATS_AC3(cap))
6541 			continue;
6542 		/* Many CODECs does not declare AC3 support on SPDIF.
6543 		   I don't beleave that they doesn't support it! */
6544 		if (HDA_PARAM_AUDIO_WIDGET_CAP_DIGITAL(w->param.widget_cap))
6545 			cap |= HDA_PARAM_SUPP_STREAM_FORMATS_AC3_MASK;
6546 		if (ret == 0) {
6547 			fmtcap = cap;
6548 			pcmcap = w->param.supp_pcm_size_rate;
6549 		} else {
6550 			fmtcap &= cap;
6551 			pcmcap &= w->param.supp_pcm_size_rate;
6552 		}
6553 		ch->io[ret++] = as[ch->as].dacs[i];
6554 		/* Do not count redirection pin/dac channels. */
6555 		if (i == 15 && as[ch->as].hpredir >= 0)
6556 			continue;
6557 		channels += HDA_PARAM_AUDIO_WIDGET_CAP_CC(w->param.widget_cap) + 1;
6558 		if (HDA_PARAM_AUDIO_WIDGET_CAP_CC(w->param.widget_cap) != 1)
6559 			onlystereo = 0;
6560 		pinset |= (1 << i);
6561 	}
6562 	ch->io[ret] = -1;
6563 
6564 	if (as[ch->as].fakeredir)
6565 		ret--;
6566 	/* Standard speaks only about stereo pins and playback, ... */
6567 	if ((!onlystereo) || as[ch->as].dir != HDA_CTL_OUT)
6568 		pinset = 0;
6569 	/* ..., but there it gives us info about speakers layout. */
6570 	as[ch->as].pinset = pinset;
6571 
6572 	ch->supp_stream_formats = fmtcap;
6573 	ch->supp_pcm_size_rate = pcmcap;
6574 
6575 	/*
6576 	 *  8bit = 0
6577 	 * 16bit = 1
6578 	 * 20bit = 2
6579 	 * 24bit = 3
6580 	 * 32bit = 4
6581 	 */
6582 	if (ret > 0) {
6583 		i = 0;
6584 		if (HDA_PARAM_SUPP_STREAM_FORMATS_PCM(fmtcap)) {
6585 			if (HDA_PARAM_SUPP_PCM_SIZE_RATE_16BIT(pcmcap))
6586 				ch->bit16 = 1;
6587 			else if (HDA_PARAM_SUPP_PCM_SIZE_RATE_8BIT(pcmcap))
6588 				ch->bit16 = 0;
6589 			if (HDA_PARAM_SUPP_PCM_SIZE_RATE_32BIT(pcmcap))
6590 				ch->bit32 = 4;
6591 			else if (HDA_PARAM_SUPP_PCM_SIZE_RATE_24BIT(pcmcap))
6592 				ch->bit32 = 3;
6593 			else if (HDA_PARAM_SUPP_PCM_SIZE_RATE_20BIT(pcmcap))
6594 				ch->bit32 = 2;
6595 			if (!(devinfo->function.audio.quirks & HDA_QUIRK_FORCESTEREO)) {
6596 				ch->fmtlist[i++] = SND_FORMAT(AFMT_S16_LE, 1, 0);
6597 				if (ch->bit32)
6598 					ch->fmtlist[i++] = SND_FORMAT(AFMT_S32_LE, 1, 0);
6599 			}
6600 			if (channels >= 2) {
6601 				ch->fmtlist[i++] = SND_FORMAT(AFMT_S16_LE, 2, 0);
6602 				if (ch->bit32)
6603 					ch->fmtlist[i++] = SND_FORMAT(AFMT_S32_LE, 2, 0);
6604 			}
6605 			if (channels == 4 || /* Any 4-channel */
6606 			    pinset == 0x0007 || /* 5.1 */
6607 			    pinset == 0x0013 || /* 5.1 */
6608 			    pinset == 0x0017) {  /* 7.1 */
6609 				ch->fmtlist[i++] = SND_FORMAT(AFMT_S16_LE, 4, 0);
6610 				if (ch->bit32)
6611 					ch->fmtlist[i++] = SND_FORMAT(AFMT_S32_LE, 4, 0);
6612 			}
6613 			if (channels == 6 || /* Any 6-channel */
6614 			    pinset == 0x0017) {  /* 7.1 */
6615 				ch->fmtlist[i++] = SND_FORMAT(AFMT_S16_LE, 6, 1);
6616 				if (ch->bit32)
6617 					ch->fmtlist[i++] = SND_FORMAT(AFMT_S32_LE, 6, 1);
6618 			}
6619 			if (channels == 8) { /* Any 8-channel */
6620 				ch->fmtlist[i++] = SND_FORMAT(AFMT_S16_LE, 8, 1);
6621 				if (ch->bit32)
6622 					ch->fmtlist[i++] = SND_FORMAT(AFMT_S32_LE, 8, 1);
6623 			}
6624 		}
6625 		if (HDA_PARAM_SUPP_STREAM_FORMATS_AC3(fmtcap)) {
6626 			ch->fmtlist[i++] = SND_FORMAT(AFMT_AC3, 2, 0);
6627 		}
6628 		ch->fmtlist[i] = 0;
6629 		i = 0;
6630 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_8KHZ(pcmcap))
6631 			ch->pcmrates[i++] = 8000;
6632 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_11KHZ(pcmcap))
6633 			ch->pcmrates[i++] = 11025;
6634 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_16KHZ(pcmcap))
6635 			ch->pcmrates[i++] = 16000;
6636 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_22KHZ(pcmcap))
6637 			ch->pcmrates[i++] = 22050;
6638 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_32KHZ(pcmcap))
6639 			ch->pcmrates[i++] = 32000;
6640 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_44KHZ(pcmcap))
6641 			ch->pcmrates[i++] = 44100;
6642 		/* if (HDA_PARAM_SUPP_PCM_SIZE_RATE_48KHZ(pcmcap)) */
6643 		ch->pcmrates[i++] = 48000;
6644 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_88KHZ(pcmcap))
6645 			ch->pcmrates[i++] = 88200;
6646 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_96KHZ(pcmcap))
6647 			ch->pcmrates[i++] = 96000;
6648 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_176KHZ(pcmcap))
6649 			ch->pcmrates[i++] = 176400;
6650 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_192KHZ(pcmcap))
6651 			ch->pcmrates[i++] = 192000;
6652 		/* if (HDA_PARAM_SUPP_PCM_SIZE_RATE_384KHZ(pcmcap)) */
6653 		ch->pcmrates[i] = 0;
6654 		if (i > 0) {
6655 			ch->caps.minspeed = ch->pcmrates[0];
6656 			ch->caps.maxspeed = ch->pcmrates[i - 1];
6657 		}
6658 	}
6659 
6660 	return (ret);
6661 }
6662 
6663 static void
6664 hdac_create_pcms(struct hdac_devinfo *devinfo)
6665 {
6666 	struct hdac_softc *sc = devinfo->codec->sc;
6667 	struct hdac_audio_as *as = devinfo->function.audio.as;
6668 	int i, j, apdev = 0, ardev = 0, dpdev = 0, drdev = 0;
6669 
6670 	for (i = 0; i < devinfo->function.audio.ascnt; i++) {
6671 		if (as[i].enable == 0)
6672 			continue;
6673 		if (as[i].dir == HDA_CTL_IN) {
6674 			if (as[i].digital)
6675 				drdev++;
6676 			else
6677 				ardev++;
6678 		} else {
6679 			if (as[i].digital)
6680 				dpdev++;
6681 			else
6682 				apdev++;
6683 		}
6684 	}
6685 	devinfo->function.audio.num_devs =
6686 	    max(ardev, apdev) + max(drdev, dpdev);
6687 	devinfo->function.audio.devs =
6688 	    (struct hdac_pcm_devinfo *)malloc(
6689 	    devinfo->function.audio.num_devs * sizeof(struct hdac_pcm_devinfo),
6690 	    M_HDAC, M_ZERO | M_NOWAIT);
6691 	if (devinfo->function.audio.devs == NULL) {
6692 		device_printf(sc->dev,
6693 		    "Unable to allocate memory for devices\n");
6694 		return;
6695 	}
6696 	for (i = 0; i < devinfo->function.audio.num_devs; i++) {
6697 		devinfo->function.audio.devs[i].index = i;
6698 		devinfo->function.audio.devs[i].devinfo = devinfo;
6699 		devinfo->function.audio.devs[i].play = -1;
6700 		devinfo->function.audio.devs[i].rec = -1;
6701 		devinfo->function.audio.devs[i].digital = 255;
6702 	}
6703 	for (i = 0; i < devinfo->function.audio.ascnt; i++) {
6704 		if (as[i].enable == 0)
6705 			continue;
6706 		for (j = 0; j < devinfo->function.audio.num_devs; j++) {
6707 			if (devinfo->function.audio.devs[j].digital != 255 &&
6708 			    (!devinfo->function.audio.devs[j].digital) !=
6709 			    (!as[i].digital))
6710 				continue;
6711 			if (as[i].dir == HDA_CTL_IN) {
6712 				if (devinfo->function.audio.devs[j].rec >= 0)
6713 					continue;
6714 				devinfo->function.audio.devs[j].rec
6715 				    = as[i].chan;
6716 			} else {
6717 				if (devinfo->function.audio.devs[j].play >= 0)
6718 					continue;
6719 				devinfo->function.audio.devs[j].play
6720 				    = as[i].chan;
6721 			}
6722 			sc->chans[as[i].chan].pdevinfo =
6723 			    &devinfo->function.audio.devs[j];
6724 			devinfo->function.audio.devs[j].digital =
6725 			    as[i].digital;
6726 			break;
6727 		}
6728 	}
6729 	for (i = 0; i < devinfo->function.audio.num_devs; i++) {
6730 		struct hdac_pcm_devinfo *pdevinfo =
6731 		    &devinfo->function.audio.devs[i];
6732 		pdevinfo->dev =
6733 		    device_add_child(sc->dev, "pcm", -1);
6734 		device_set_ivars(pdevinfo->dev,
6735 		     (void *)pdevinfo);
6736 	}
6737 }
6738 
6739 static void
6740 hdac_dump_ctls(struct hdac_pcm_devinfo *pdevinfo, const char *banner, uint32_t flag)
6741 {
6742 	struct hdac_devinfo *devinfo = pdevinfo->devinfo;
6743 	struct hdac_audio_ctl *ctl;
6744 	struct hdac_softc *sc = devinfo->codec->sc;
6745 	char buf[64];
6746 	int i, j, printed;
6747 
6748 	if (flag == 0) {
6749 		flag = ~(SOUND_MASK_VOLUME | SOUND_MASK_PCM |
6750 		    SOUND_MASK_CD | SOUND_MASK_LINE | SOUND_MASK_RECLEV |
6751 		    SOUND_MASK_MIC | SOUND_MASK_SPEAKER | SOUND_MASK_IGAIN |
6752 		    SOUND_MASK_OGAIN | SOUND_MASK_IMIX | SOUND_MASK_MONITOR);
6753 	}
6754 
6755 	for (j = 0; j < SOUND_MIXER_NRDEVICES; j++) {
6756 		if ((flag & (1 << j)) == 0)
6757 			continue;
6758 		i = 0;
6759 		printed = 0;
6760 		while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) {
6761 			if (ctl->enable == 0 ||
6762 			    ctl->widget->enable == 0)
6763 				continue;
6764 			if (!((pdevinfo->play >= 0 &&
6765 			    ctl->widget->bindas == sc->chans[pdevinfo->play].as) ||
6766 			    (pdevinfo->rec >= 0 &&
6767 			    ctl->widget->bindas == sc->chans[pdevinfo->rec].as) ||
6768 			    (ctl->widget->bindas == -2 && pdevinfo->index == 0)))
6769 				continue;
6770 			if ((ctl->ossmask & (1 << j)) == 0)
6771 				continue;
6772 
6773 	    		if (printed == 0) {
6774 				device_printf(pdevinfo->dev, "\n");
6775 				if (banner != NULL) {
6776 					device_printf(pdevinfo->dev, "%s", banner);
6777 				} else {
6778 					device_printf(pdevinfo->dev, "Unknown Ctl");
6779 				}
6780 				printf(" (OSS: %s)\n",
6781 				    hdac_audio_ctl_ossmixer_mask2allname(1 << j,
6782 				    buf, sizeof(buf)));
6783 				device_printf(pdevinfo->dev, "   |\n");
6784 				printed = 1;
6785 			}
6786 			device_printf(pdevinfo->dev, "   +- ctl %2d (nid %3d %s", i,
6787 				ctl->widget->nid,
6788 				(ctl->ndir == HDA_CTL_IN)?"in ":"out");
6789 			if (ctl->ndir == HDA_CTL_IN && ctl->ndir == ctl->dir)
6790 				printf(" %2d): ", ctl->index);
6791 			else
6792 				printf("):    ");
6793 			if (ctl->step > 0) {
6794 				printf("%+d/%+ddB (%d steps)%s\n",
6795 			    	    (0 - ctl->offset) * (ctl->size + 1) / 4,
6796 				    (ctl->step - ctl->offset) * (ctl->size + 1) / 4,
6797 				    ctl->step + 1,
6798 				    ctl->mute?" + mute":"");
6799 			} else
6800 				printf("%s\n", ctl->mute?"mute":"");
6801 		}
6802 	}
6803 }
6804 
6805 static void
6806 hdac_dump_audio_formats(device_t dev, uint32_t fcap, uint32_t pcmcap)
6807 {
6808 	uint32_t cap;
6809 
6810 	cap = fcap;
6811 	if (cap != 0) {
6812 		device_printf(dev, "     Stream cap: 0x%08x\n", cap);
6813 		device_printf(dev, "                ");
6814 		if (HDA_PARAM_SUPP_STREAM_FORMATS_AC3(cap))
6815 			printf(" AC3");
6816 		if (HDA_PARAM_SUPP_STREAM_FORMATS_FLOAT32(cap))
6817 			printf(" FLOAT32");
6818 		if (HDA_PARAM_SUPP_STREAM_FORMATS_PCM(cap))
6819 			printf(" PCM");
6820 		printf("\n");
6821 	}
6822 	cap = pcmcap;
6823 	if (cap != 0) {
6824 		device_printf(dev, "        PCM cap: 0x%08x\n", cap);
6825 		device_printf(dev, "                ");
6826 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_8BIT(cap))
6827 			printf(" 8");
6828 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_16BIT(cap))
6829 			printf(" 16");
6830 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_20BIT(cap))
6831 			printf(" 20");
6832 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_24BIT(cap))
6833 			printf(" 24");
6834 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_32BIT(cap))
6835 			printf(" 32");
6836 		printf(" bits,");
6837 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_8KHZ(cap))
6838 			printf(" 8");
6839 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_11KHZ(cap))
6840 			printf(" 11");
6841 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_16KHZ(cap))
6842 			printf(" 16");
6843 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_22KHZ(cap))
6844 			printf(" 22");
6845 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_32KHZ(cap))
6846 			printf(" 32");
6847 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_44KHZ(cap))
6848 			printf(" 44");
6849 		printf(" 48");
6850 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_88KHZ(cap))
6851 			printf(" 88");
6852 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_96KHZ(cap))
6853 			printf(" 96");
6854 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_176KHZ(cap))
6855 			printf(" 176");
6856 		if (HDA_PARAM_SUPP_PCM_SIZE_RATE_192KHZ(cap))
6857 			printf(" 192");
6858 		printf(" KHz\n");
6859 	}
6860 }
6861 
6862 static void
6863 hdac_dump_pin(struct hdac_softc *sc, struct hdac_widget *w)
6864 {
6865 	uint32_t pincap;
6866 
6867 	pincap = w->wclass.pin.cap;
6868 
6869 	device_printf(sc->dev, "        Pin cap: 0x%08x\n", pincap);
6870 	device_printf(sc->dev, "                ");
6871 	if (HDA_PARAM_PIN_CAP_IMP_SENSE_CAP(pincap))
6872 		printf(" ISC");
6873 	if (HDA_PARAM_PIN_CAP_TRIGGER_REQD(pincap))
6874 		printf(" TRQD");
6875 	if (HDA_PARAM_PIN_CAP_PRESENCE_DETECT_CAP(pincap))
6876 		printf(" PDC");
6877 	if (HDA_PARAM_PIN_CAP_HEADPHONE_CAP(pincap))
6878 		printf(" HP");
6879 	if (HDA_PARAM_PIN_CAP_OUTPUT_CAP(pincap))
6880 		printf(" OUT");
6881 	if (HDA_PARAM_PIN_CAP_INPUT_CAP(pincap))
6882 		printf(" IN");
6883 	if (HDA_PARAM_PIN_CAP_BALANCED_IO_PINS(pincap))
6884 		printf(" BAL");
6885 	if (HDA_PARAM_PIN_CAP_HDMI(pincap))
6886 		printf(" HDMI");
6887 	if (HDA_PARAM_PIN_CAP_VREF_CTRL(pincap)) {
6888 		printf(" VREF[");
6889 		if (HDA_PARAM_PIN_CAP_VREF_CTRL_50(pincap))
6890 			printf(" 50");
6891 		if (HDA_PARAM_PIN_CAP_VREF_CTRL_80(pincap))
6892 			printf(" 80");
6893 		if (HDA_PARAM_PIN_CAP_VREF_CTRL_100(pincap))
6894 			printf(" 100");
6895 		if (HDA_PARAM_PIN_CAP_VREF_CTRL_GROUND(pincap))
6896 			printf(" GROUND");
6897 		if (HDA_PARAM_PIN_CAP_VREF_CTRL_HIZ(pincap))
6898 			printf(" HIZ");
6899 		printf(" ]");
6900 	}
6901 	if (HDA_PARAM_PIN_CAP_EAPD_CAP(pincap))
6902 		printf(" EAPD");
6903 	if (HDA_PARAM_PIN_CAP_DP(pincap))
6904 		printf(" DP");
6905 	if (HDA_PARAM_PIN_CAP_HBR(pincap))
6906 		printf(" HBR");
6907 	printf("\n");
6908 	device_printf(sc->dev, "     Pin config: 0x%08x\n",
6909 	    w->wclass.pin.config);
6910 	device_printf(sc->dev, "    Pin control: 0x%08x", w->wclass.pin.ctrl);
6911 	if (w->wclass.pin.ctrl & HDA_CMD_SET_PIN_WIDGET_CTRL_HPHN_ENABLE)
6912 		printf(" HP");
6913 	if (w->wclass.pin.ctrl & HDA_CMD_SET_PIN_WIDGET_CTRL_IN_ENABLE)
6914 		printf(" IN");
6915 	if (w->wclass.pin.ctrl & HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE)
6916 		printf(" OUT");
6917 	if (w->wclass.pin.ctrl & HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE_MASK)
6918 		printf(" VREFs");
6919 	printf("\n");
6920 }
6921 
6922 static void
6923 hdac_dump_pin_config(struct hdac_widget *w, uint32_t conf)
6924 {
6925 	struct hdac_softc *sc = w->devinfo->codec->sc;
6926 
6927 	device_printf(sc->dev, " nid %d 0x%08x as %2d seq %2d %13s %5s "
6928 	    "jack %2d loc %2d color %7s misc %d%s\n",
6929 	    w->nid, conf,
6930 	    HDA_CONFIG_DEFAULTCONF_ASSOCIATION(conf),
6931 	    HDA_CONFIG_DEFAULTCONF_SEQUENCE(conf),
6932 	    HDA_DEVS[HDA_CONFIG_DEFAULTCONF_DEVICE(conf)],
6933 	    HDA_CONNS[HDA_CONFIG_DEFAULTCONF_CONNECTIVITY(conf)],
6934 	    HDA_CONFIG_DEFAULTCONF_CONNECTION_TYPE(conf),
6935 	    HDA_CONFIG_DEFAULTCONF_LOCATION(conf),
6936 	    HDA_COLORS[HDA_CONFIG_DEFAULTCONF_COLOR(conf)],
6937 	    HDA_CONFIG_DEFAULTCONF_MISC(conf),
6938 	    (w->enable == 0)?" [DISABLED]":"");
6939 }
6940 
6941 static void
6942 hdac_dump_pin_configs(struct hdac_devinfo *devinfo)
6943 {
6944 	struct hdac_widget *w;
6945 	int i;
6946 
6947 	for (i = devinfo->startnode; i < devinfo->endnode; i++) {
6948 		w = hdac_widget_get(devinfo, i);
6949 		if (w == NULL)
6950 			continue;
6951 		if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX)
6952 			continue;
6953 		hdac_dump_pin_config(w, w->wclass.pin.config);
6954 	}
6955 }
6956 
6957 static void
6958 hdac_dump_amp(struct hdac_softc *sc, uint32_t cap, char *banner)
6959 {
6960 	device_printf(sc->dev, "     %s amp: 0x%08x\n", banner, cap);
6961 	device_printf(sc->dev, "                 "
6962 	    "mute=%d step=%d size=%d offset=%d\n",
6963 	    HDA_PARAM_OUTPUT_AMP_CAP_MUTE_CAP(cap),
6964 	    HDA_PARAM_OUTPUT_AMP_CAP_NUMSTEPS(cap),
6965 	    HDA_PARAM_OUTPUT_AMP_CAP_STEPSIZE(cap),
6966 	    HDA_PARAM_OUTPUT_AMP_CAP_OFFSET(cap));
6967 }
6968 
6969 static void
6970 hdac_dump_nodes(struct hdac_devinfo *devinfo)
6971 {
6972 	struct hdac_softc *sc = devinfo->codec->sc;
6973 	static char *ossname[] = SOUND_DEVICE_NAMES;
6974 	struct hdac_widget *w, *cw;
6975 	char buf[64];
6976 	int i, j;
6977 
6978 	device_printf(sc->dev, "\n");
6979 	device_printf(sc->dev, "Default Parameter\n");
6980 	device_printf(sc->dev, "-----------------\n");
6981 	hdac_dump_audio_formats(sc->dev,
6982 	    devinfo->function.audio.supp_stream_formats,
6983 	    devinfo->function.audio.supp_pcm_size_rate);
6984 	device_printf(sc->dev, "         IN amp: 0x%08x\n",
6985 	    devinfo->function.audio.inamp_cap);
6986 	device_printf(sc->dev, "        OUT amp: 0x%08x\n",
6987 	    devinfo->function.audio.outamp_cap);
6988 	for (i = devinfo->startnode; i < devinfo->endnode; i++) {
6989 		w = hdac_widget_get(devinfo, i);
6990 		if (w == NULL) {
6991 			device_printf(sc->dev, "Ghost widget nid=%d\n", i);
6992 			continue;
6993 		}
6994 		device_printf(sc->dev, "\n");
6995 		device_printf(sc->dev, "            nid: %d%s\n", w->nid,
6996 		    (w->enable == 0) ? " [DISABLED]" : "");
6997 		device_printf(sc->dev, "           Name: %s\n", w->name);
6998 		device_printf(sc->dev, "     Widget cap: 0x%08x\n",
6999 		    w->param.widget_cap);
7000 		if (w->param.widget_cap & 0x0ee1) {
7001 			device_printf(sc->dev, "                ");
7002 			if (HDA_PARAM_AUDIO_WIDGET_CAP_LR_SWAP(w->param.widget_cap))
7003 			    printf(" LRSWAP");
7004 			if (HDA_PARAM_AUDIO_WIDGET_CAP_POWER_CTRL(w->param.widget_cap))
7005 			    printf(" PWR");
7006 			if (HDA_PARAM_AUDIO_WIDGET_CAP_DIGITAL(w->param.widget_cap))
7007 			    printf(" DIGITAL");
7008 			if (HDA_PARAM_AUDIO_WIDGET_CAP_UNSOL_CAP(w->param.widget_cap))
7009 			    printf(" UNSOL");
7010 			if (HDA_PARAM_AUDIO_WIDGET_CAP_PROC_WIDGET(w->param.widget_cap))
7011 			    printf(" PROC");
7012 			if (HDA_PARAM_AUDIO_WIDGET_CAP_STRIPE(w->param.widget_cap))
7013 			    printf(" STRIPE");
7014 			j = HDA_PARAM_AUDIO_WIDGET_CAP_CC(w->param.widget_cap);
7015 			if (j == 1)
7016 			    printf(" STEREO");
7017 			else if (j > 1)
7018 			    printf(" %dCH", j + 1);
7019 			printf("\n");
7020 		}
7021 		if (w->bindas != -1) {
7022 			device_printf(sc->dev, "    Association: %d (0x%08x)\n",
7023 			    w->bindas, w->bindseqmask);
7024 		}
7025 		if (w->ossmask != 0 || w->ossdev >= 0) {
7026 			device_printf(sc->dev, "            OSS: %s",
7027 			    hdac_audio_ctl_ossmixer_mask2allname(w->ossmask, buf, sizeof(buf)));
7028 			if (w->ossdev >= 0)
7029 			    printf(" (%s)", ossname[w->ossdev]);
7030 			printf("\n");
7031 		}
7032 		if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_OUTPUT ||
7033 		    w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT) {
7034 			hdac_dump_audio_formats(sc->dev,
7035 			    w->param.supp_stream_formats,
7036 			    w->param.supp_pcm_size_rate);
7037 		} else if (w->type ==
7038 		    HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX)
7039 			hdac_dump_pin(sc, w);
7040 		if (w->param.eapdbtl != HDAC_INVALID)
7041 			device_printf(sc->dev, "           EAPD: 0x%08x\n",
7042 			    w->param.eapdbtl);
7043 		if (HDA_PARAM_AUDIO_WIDGET_CAP_OUT_AMP(w->param.widget_cap) &&
7044 		    w->param.outamp_cap != 0)
7045 			hdac_dump_amp(sc, w->param.outamp_cap, "Output");
7046 		if (HDA_PARAM_AUDIO_WIDGET_CAP_IN_AMP(w->param.widget_cap) &&
7047 		    w->param.inamp_cap != 0)
7048 			hdac_dump_amp(sc, w->param.inamp_cap, " Input");
7049 		if (w->nconns > 0) {
7050 			device_printf(sc->dev, "    connections: %d\n", w->nconns);
7051 			device_printf(sc->dev, "          |\n");
7052 		}
7053 		for (j = 0; j < w->nconns; j++) {
7054 			cw = hdac_widget_get(devinfo, w->conns[j]);
7055 			device_printf(sc->dev, "          + %s<- nid=%d [%s]",
7056 			    (w->connsenable[j] == 0)?"[DISABLED] ":"",
7057 			    w->conns[j], (cw == NULL) ? "GHOST!" : cw->name);
7058 			if (cw == NULL)
7059 				printf(" [UNKNOWN]");
7060 			else if (cw->enable == 0)
7061 				printf(" [DISABLED]");
7062 			if (w->nconns > 1 && w->selconn == j && w->type !=
7063 			    HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER)
7064 				printf(" (selected)");
7065 			printf("\n");
7066 		}
7067 	}
7068 
7069 }
7070 
7071 static void
7072 hdac_dump_dst_nid(struct hdac_pcm_devinfo *pdevinfo, nid_t nid, int depth)
7073 {
7074 	struct hdac_devinfo *devinfo = pdevinfo->devinfo;
7075 	struct hdac_widget *w, *cw;
7076 	char buf[64];
7077 	int i, printed = 0;
7078 
7079 	if (depth > HDA_PARSE_MAXDEPTH)
7080 		return;
7081 
7082 	w = hdac_widget_get(devinfo, nid);
7083 	if (w == NULL || w->enable == 0)
7084 		return;
7085 
7086 	if (depth == 0)
7087 		device_printf(pdevinfo->dev, "%*s", 4, "");
7088 	else
7089 		device_printf(pdevinfo->dev, "%*s  + <- ", 4 + (depth - 1) * 7, "");
7090 	printf("nid=%d [%s]", w->nid, w->name);
7091 
7092 	if (depth > 0) {
7093 		if (w->ossmask == 0) {
7094 			printf("\n");
7095 			return;
7096 		}
7097 		printf(" [src: %s]",
7098 		    hdac_audio_ctl_ossmixer_mask2allname(
7099 			w->ossmask, buf, sizeof(buf)));
7100 		if (w->ossdev >= 0) {
7101 			printf("\n");
7102 			return;
7103 		}
7104 	}
7105 	printf("\n");
7106 
7107 	for (i = 0; i < w->nconns; i++) {
7108 		if (w->connsenable[i] == 0)
7109 			continue;
7110 		cw = hdac_widget_get(devinfo, w->conns[i]);
7111 		if (cw == NULL || cw->enable == 0 || cw->bindas == -1)
7112 			continue;
7113 		if (printed == 0) {
7114 			device_printf(pdevinfo->dev, "%*s  |\n", 4 + (depth) * 7, "");
7115 			printed = 1;
7116 		}
7117 		hdac_dump_dst_nid(pdevinfo, w->conns[i], depth + 1);
7118 	}
7119 
7120 }
7121 
7122 static void
7123 hdac_dump_dac(struct hdac_pcm_devinfo *pdevinfo)
7124 {
7125 	struct hdac_devinfo *devinfo = pdevinfo->devinfo;
7126 	struct hdac_softc *sc = devinfo->codec->sc;
7127 	struct hdac_audio_as *as;
7128 	struct hdac_widget *w;
7129 	int i, printed = 0;
7130 
7131 	if (pdevinfo->play < 0)
7132 		return;
7133 
7134 	as = &devinfo->function.audio.as[sc->chans[pdevinfo->play].as];
7135 	for (i = 0; i < 16; i++) {
7136 		if (as->pins[i] <= 0)
7137 			continue;
7138 		w = hdac_widget_get(devinfo, as->pins[i]);
7139 		if (w == NULL || w->enable == 0)
7140 			continue;
7141 		if (printed == 0) {
7142 			printed = 1;
7143 			device_printf(pdevinfo->dev, "\n");
7144 			device_printf(pdevinfo->dev, "Playback:\n");
7145 		}
7146 		device_printf(pdevinfo->dev, "\n");
7147 		hdac_dump_dst_nid(pdevinfo, as->pins[i], 0);
7148 	}
7149 }
7150 
7151 static void
7152 hdac_dump_adc(struct hdac_pcm_devinfo *pdevinfo)
7153 {
7154 	struct hdac_devinfo *devinfo = pdevinfo->devinfo;
7155 	struct hdac_softc *sc = devinfo->codec->sc;
7156 	struct hdac_widget *w;
7157 	int i;
7158 	int printed = 0;
7159 
7160 	if (pdevinfo->rec < 0)
7161 		return;
7162 
7163 	for (i = devinfo->startnode; i < devinfo->endnode; i++) {
7164 		w = hdac_widget_get(devinfo, i);
7165 		if (w == NULL || w->enable == 0)
7166 			continue;
7167 		if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT)
7168 			continue;
7169 		if (w->bindas != sc->chans[pdevinfo->rec].as)
7170 			continue;
7171 		if (printed == 0) {
7172 			printed = 1;
7173 			device_printf(pdevinfo->dev, "\n");
7174 			device_printf(pdevinfo->dev, "Record:\n");
7175 		}
7176 		device_printf(pdevinfo->dev, "\n");
7177 		hdac_dump_dst_nid(pdevinfo, i, 0);
7178 	}
7179 }
7180 
7181 static void
7182 hdac_dump_mix(struct hdac_pcm_devinfo *pdevinfo)
7183 {
7184 	struct hdac_devinfo *devinfo = pdevinfo->devinfo;
7185 	struct hdac_widget *w;
7186 	int i;
7187 	int printed = 0;
7188 
7189 	if (pdevinfo->index != 0)
7190 		return;
7191 
7192 	for (i = devinfo->startnode; i < devinfo->endnode; i++) {
7193 		w = hdac_widget_get(devinfo, i);
7194 		if (w == NULL || w->enable == 0)
7195 			continue;
7196 		if (w->ossdev != SOUND_MIXER_IMIX)
7197 			continue;
7198 		if (printed == 0) {
7199 			printed = 1;
7200 			device_printf(pdevinfo->dev, "\n");
7201 			device_printf(pdevinfo->dev, "Input Mix:\n");
7202 		}
7203 		device_printf(pdevinfo->dev, "\n");
7204 		hdac_dump_dst_nid(pdevinfo, i, 0);
7205 	}
7206 }
7207 
7208 static void
7209 hdac_dump_pcmchannels(struct hdac_pcm_devinfo *pdevinfo)
7210 {
7211 	struct hdac_softc *sc = pdevinfo->devinfo->codec->sc;
7212 	nid_t *nids;
7213 	int i;
7214 
7215 	if (pdevinfo->play >= 0) {
7216 		i = pdevinfo->play;
7217 		device_printf(pdevinfo->dev, "\n");
7218 		device_printf(pdevinfo->dev, "Playback:\n");
7219 		device_printf(pdevinfo->dev, "\n");
7220 		hdac_dump_audio_formats(pdevinfo->dev, sc->chans[i].supp_stream_formats,
7221 		    sc->chans[i].supp_pcm_size_rate);
7222 		device_printf(pdevinfo->dev, "            DAC:");
7223 		for (nids = sc->chans[i].io; *nids != -1; nids++)
7224 			printf(" %d", *nids);
7225 		printf("\n");
7226 	}
7227 	if (pdevinfo->rec >= 0) {
7228 		i = pdevinfo->rec;
7229 		device_printf(pdevinfo->dev, "\n");
7230 		device_printf(pdevinfo->dev, "Record:\n");
7231 		device_printf(pdevinfo->dev, "\n");
7232 		hdac_dump_audio_formats(pdevinfo->dev, sc->chans[i].supp_stream_formats,
7233 		    sc->chans[i].supp_pcm_size_rate);
7234 		device_printf(pdevinfo->dev, "            ADC:");
7235 		for (nids = sc->chans[i].io; *nids != -1; nids++)
7236 			printf(" %d", *nids);
7237 		printf("\n");
7238 	}
7239 }
7240 
7241 static void
7242 hdac_release_resources(struct hdac_softc *sc)
7243 {
7244         int i, j;
7245 
7246 	if (sc == NULL)
7247 		return;
7248 
7249 	hdac_lock(sc);
7250 	sc->polling = 0;
7251 	sc->poll_ival = 0;
7252 	callout_stop(&sc->poll_hda);
7253 	callout_stop(&sc->poll_hdac);
7254 	callout_stop(&sc->poll_jack);
7255 	hdac_reset(sc, 0);
7256 	hdac_unlock(sc);
7257 	taskqueue_drain(taskqueue_thread, &sc->unsolq_task);
7258 	callout_drain(&sc->poll_hda);
7259 	callout_drain(&sc->poll_hdac);
7260 	callout_drain(&sc->poll_jack);
7261 
7262 	hdac_irq_free(sc);
7263 
7264 	for (i = 0; i < HDAC_CODEC_MAX; i++) {
7265 		if (sc->codecs[i] == NULL)
7266 			continue;
7267 		for (j = 0; j < sc->codecs[i]->num_fgs; j++) {
7268 			free(sc->codecs[i]->fgs[j].widget, M_HDAC);
7269 			if (sc->codecs[i]->fgs[j].node_type ==
7270 			    HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO) {
7271 				free(sc->codecs[i]->fgs[j].function.audio.ctl,
7272 				    M_HDAC);
7273 				free(sc->codecs[i]->fgs[j].function.audio.as,
7274 				    M_HDAC);
7275 				free(sc->codecs[i]->fgs[j].function.audio.devs,
7276 				    M_HDAC);
7277 			}
7278 		}
7279 		free(sc->codecs[i]->fgs, M_HDAC);
7280 		free(sc->codecs[i], M_HDAC);
7281 		sc->codecs[i] = NULL;
7282 	}
7283 
7284 	hdac_dma_free(sc, &sc->pos_dma);
7285 	hdac_dma_free(sc, &sc->rirb_dma);
7286 	hdac_dma_free(sc, &sc->corb_dma);
7287 	for (i = 0; i < sc->num_chans; i++) {
7288     		if (sc->chans[i].blkcnt > 0)
7289     			hdac_dma_free(sc, &sc->chans[i].bdl_dma);
7290 	}
7291 	free(sc->chans, M_HDAC);
7292 	if (sc->chan_dmat != NULL) {
7293 		bus_dma_tag_destroy(sc->chan_dmat);
7294 		sc->chan_dmat = NULL;
7295 	}
7296 	hdac_mem_free(sc);
7297 	snd_mtxfree(sc->lock);
7298 }
7299 
7300 /* This function surely going to make its way into upper level someday. */
7301 static void
7302 hdac_config_fetch(struct hdac_softc *sc, uint32_t *on, uint32_t *off)
7303 {
7304 	const char *res = NULL;
7305 	int i = 0, j, k, len, inv;
7306 
7307 	if (on != NULL)
7308 		*on = 0;
7309 	if (off != NULL)
7310 		*off = 0;
7311 	if (sc == NULL)
7312 		return;
7313 	if (resource_string_value(device_get_name(sc->dev),
7314 	    device_get_unit(sc->dev), "config", &res) != 0)
7315 		return;
7316 	if (!(res != NULL && strlen(res) > 0))
7317 		return;
7318 	HDA_BOOTVERBOSE(
7319 		device_printf(sc->dev, "HDA Config:");
7320 	);
7321 	for (;;) {
7322 		while (res[i] != '\0' &&
7323 		    (res[i] == ',' || isspace(res[i]) != 0))
7324 			i++;
7325 		if (res[i] == '\0') {
7326 			HDA_BOOTVERBOSE(
7327 				printf("\n");
7328 			);
7329 			return;
7330 		}
7331 		j = i;
7332 		while (res[j] != '\0' &&
7333 		    !(res[j] == ',' || isspace(res[j]) != 0))
7334 			j++;
7335 		len = j - i;
7336 		if (len > 2 && strncmp(res + i, "no", 2) == 0)
7337 			inv = 2;
7338 		else
7339 			inv = 0;
7340 		for (k = 0; len > inv && k < HDAC_QUIRKS_TAB_LEN; k++) {
7341 			if (strncmp(res + i + inv,
7342 			    hdac_quirks_tab[k].key, len - inv) != 0)
7343 				continue;
7344 			if (len - inv != strlen(hdac_quirks_tab[k].key))
7345 				continue;
7346 			HDA_BOOTVERBOSE(
7347 				printf(" %s%s", (inv != 0) ? "no" : "",
7348 				    hdac_quirks_tab[k].key);
7349 			);
7350 			if (inv == 0 && on != NULL)
7351 				*on |= hdac_quirks_tab[k].value;
7352 			else if (inv != 0 && off != NULL)
7353 				*off |= hdac_quirks_tab[k].value;
7354 			break;
7355 		}
7356 		i = j;
7357 	}
7358 }
7359 
7360 static int
7361 sysctl_hdac_polling(SYSCTL_HANDLER_ARGS)
7362 {
7363 	struct hdac_softc *sc;
7364 	device_t dev;
7365 	uint32_t ctl;
7366 	int err, val;
7367 
7368 	dev = oidp->oid_arg1;
7369 	sc = device_get_softc(dev);
7370 	if (sc == NULL)
7371 		return (EINVAL);
7372 	hdac_lock(sc);
7373 	val = sc->polling;
7374 	hdac_unlock(sc);
7375 	err = sysctl_handle_int(oidp, &val, 0, req);
7376 
7377 	if (err != 0 || req->newptr == NULL)
7378 		return (err);
7379 	if (val < 0 || val > 1)
7380 		return (EINVAL);
7381 
7382 	hdac_lock(sc);
7383 	if (val != sc->polling) {
7384 		if (val == 0) {
7385 			callout_stop(&sc->poll_hda);
7386 			callout_stop(&sc->poll_hdac);
7387 			hdac_unlock(sc);
7388 			callout_drain(&sc->poll_hda);
7389 			callout_drain(&sc->poll_hdac);
7390 			hdac_lock(sc);
7391 			sc->polling = 0;
7392 			ctl = HDAC_READ_4(&sc->mem, HDAC_INTCTL);
7393 			ctl |= HDAC_INTCTL_GIE;
7394 			HDAC_WRITE_4(&sc->mem, HDAC_INTCTL, ctl);
7395 		} else {
7396 			ctl = HDAC_READ_4(&sc->mem, HDAC_INTCTL);
7397 			ctl &= ~HDAC_INTCTL_GIE;
7398 			HDAC_WRITE_4(&sc->mem, HDAC_INTCTL, ctl);
7399 			hdac_unlock(sc);
7400 			taskqueue_drain(taskqueue_thread, &sc->unsolq_task);
7401 			hdac_lock(sc);
7402 			sc->polling = 1;
7403 			hdac_poll_reinit(sc);
7404 			callout_reset(&sc->poll_hdac, 1, hdac_poll_callback, sc);
7405 		}
7406 	}
7407 	hdac_unlock(sc);
7408 
7409 	return (err);
7410 }
7411 
7412 static int
7413 sysctl_hdac_polling_interval(SYSCTL_HANDLER_ARGS)
7414 {
7415 	struct hdac_softc *sc;
7416 	device_t dev;
7417 	int err, val;
7418 
7419 	dev = oidp->oid_arg1;
7420 	sc = device_get_softc(dev);
7421 	if (sc == NULL)
7422 		return (EINVAL);
7423 	hdac_lock(sc);
7424 	val = ((uint64_t)sc->poll_ival * 1000) / hz;
7425 	hdac_unlock(sc);
7426 	err = sysctl_handle_int(oidp, &val, 0, req);
7427 
7428 	if (err != 0 || req->newptr == NULL)
7429 		return (err);
7430 
7431 	if (val < 1)
7432 		val = 1;
7433 	if (val > 5000)
7434 		val = 5000;
7435 	val = ((uint64_t)val * hz) / 1000;
7436 	if (val < 1)
7437 		val = 1;
7438 	if (val > (hz * 5))
7439 		val = hz * 5;
7440 
7441 	hdac_lock(sc);
7442 	sc->poll_ival = val;
7443 	hdac_unlock(sc);
7444 
7445 	return (err);
7446 }
7447 
7448 static int
7449 sysctl_hdac_pindump(SYSCTL_HANDLER_ARGS)
7450 {
7451 	struct hdac_softc *sc;
7452 	struct hdac_codec *codec;
7453 	struct hdac_devinfo *devinfo;
7454 	struct hdac_widget *w;
7455 	device_t dev;
7456 	uint32_t res, pincap, delay;
7457 	int codec_index, fg_index;
7458 	int i, err, val;
7459 	nid_t cad;
7460 
7461 	dev = oidp->oid_arg1;
7462 	sc = device_get_softc(dev);
7463 	if (sc == NULL)
7464 		return (EINVAL);
7465 	val = 0;
7466 	err = sysctl_handle_int(oidp, &val, 0, req);
7467 	if (err != 0 || req->newptr == NULL || val == 0)
7468 		return (err);
7469 
7470 	/* XXX: Temporary. For debugging. */
7471 	if (val == 100) {
7472 		hdac_suspend(dev);
7473 		return (0);
7474 	} else if (val == 101) {
7475 		hdac_resume(dev);
7476 		return (0);
7477 	}
7478 
7479 	hdac_lock(sc);
7480 	for (codec_index = 0; codec_index < HDAC_CODEC_MAX; codec_index++) {
7481 		codec = sc->codecs[codec_index];
7482 		if (codec == NULL)
7483 			continue;
7484 		cad = codec->cad;
7485 		for (fg_index = 0; fg_index < codec->num_fgs; fg_index++) {
7486 			devinfo = &codec->fgs[fg_index];
7487 			if (devinfo->node_type !=
7488 			    HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO)
7489 				continue;
7490 
7491 			device_printf(dev, "Dumping AFG cad=%d nid=%d pins:\n",
7492 			    codec_index, devinfo->nid);
7493 			for (i = devinfo->startnode; i < devinfo->endnode; i++) {
7494 					w = hdac_widget_get(devinfo, i);
7495 				if (w == NULL || w->type !=
7496 				    HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX)
7497 					continue;
7498 				hdac_dump_pin_config(w, w->wclass.pin.config);
7499 				pincap = w->wclass.pin.cap;
7500 				device_printf(dev, "       Caps: %2s %3s %2s %4s %4s",
7501 				    HDA_PARAM_PIN_CAP_INPUT_CAP(pincap)?"IN":"",
7502 				    HDA_PARAM_PIN_CAP_OUTPUT_CAP(pincap)?"OUT":"",
7503 				    HDA_PARAM_PIN_CAP_HEADPHONE_CAP(pincap)?"HP":"",
7504 				    HDA_PARAM_PIN_CAP_EAPD_CAP(pincap)?"EAPD":"",
7505 				    HDA_PARAM_PIN_CAP_VREF_CTRL(pincap)?"VREF":"");
7506 				if (HDA_PARAM_PIN_CAP_IMP_SENSE_CAP(pincap) ||
7507 				    HDA_PARAM_PIN_CAP_PRESENCE_DETECT_CAP(pincap)) {
7508 					if (HDA_PARAM_PIN_CAP_TRIGGER_REQD(pincap)) {
7509 						delay = 0;
7510 						hdac_command(sc,
7511 						    HDA_CMD_SET_PIN_SENSE(cad, w->nid, 0), cad);
7512 						do {
7513 							res = hdac_command(sc,
7514 							    HDA_CMD_GET_PIN_SENSE(cad, w->nid), cad);
7515 							if (res != 0x7fffffff && res != 0xffffffff)
7516 								break;
7517 							DELAY(10);
7518 						} while (++delay < 10000);
7519 					} else {
7520 						delay = 0;
7521 						res = hdac_command(sc, HDA_CMD_GET_PIN_SENSE(cad,
7522 						    w->nid), cad);
7523 					}
7524 					printf(" Sense: 0x%08x", res);
7525 					if (delay > 0)
7526 						printf(" delay %dus", delay * 10);
7527 				}
7528 				printf("\n");
7529 			}
7530 			device_printf(dev,
7531 			    "NumGPIO=%d NumGPO=%d NumGPI=%d GPIWake=%d GPIUnsol=%d\n",
7532 			    HDA_PARAM_GPIO_COUNT_NUM_GPIO(devinfo->function.audio.gpio),
7533 			    HDA_PARAM_GPIO_COUNT_NUM_GPO(devinfo->function.audio.gpio),
7534 			    HDA_PARAM_GPIO_COUNT_NUM_GPI(devinfo->function.audio.gpio),
7535 			    HDA_PARAM_GPIO_COUNT_GPI_WAKE(devinfo->function.audio.gpio),
7536 			    HDA_PARAM_GPIO_COUNT_GPI_UNSOL(devinfo->function.audio.gpio));
7537 			if (HDA_PARAM_GPIO_COUNT_NUM_GPI(devinfo->function.audio.gpio) > 0) {
7538 				device_printf(dev, " GPI:");
7539 				res = hdac_command(sc,
7540 				    HDA_CMD_GET_GPI_DATA(cad, devinfo->nid), cad);
7541 				printf(" data=0x%08x", res);
7542 				res = hdac_command(sc,
7543 				    HDA_CMD_GET_GPI_WAKE_ENABLE_MASK(cad, devinfo->nid),
7544 				    cad);
7545 				printf(" wake=0x%08x", res);
7546 				res = hdac_command(sc,
7547 				    HDA_CMD_GET_GPI_UNSOLICITED_ENABLE_MASK(cad, devinfo->nid),
7548 				    cad);
7549 				printf(" unsol=0x%08x", res);
7550 				res = hdac_command(sc,
7551 				    HDA_CMD_GET_GPI_STICKY_MASK(cad, devinfo->nid), cad);
7552 				printf(" sticky=0x%08x\n", res);
7553 			}
7554 			if (HDA_PARAM_GPIO_COUNT_NUM_GPO(devinfo->function.audio.gpio) > 0) {
7555 				device_printf(dev, " GPO:");
7556 				res = hdac_command(sc,
7557 				    HDA_CMD_GET_GPO_DATA(cad, devinfo->nid), cad);
7558 				printf(" data=0x%08x\n", res);
7559 			}
7560 			if (HDA_PARAM_GPIO_COUNT_NUM_GPIO(devinfo->function.audio.gpio) > 0) {
7561 				device_printf(dev, "GPIO:");
7562 				res = hdac_command(sc,
7563 				    HDA_CMD_GET_GPIO_DATA(cad, devinfo->nid), cad);
7564 				printf(" data=0x%08x", res);
7565 				res = hdac_command(sc,
7566 				    HDA_CMD_GET_GPIO_ENABLE_MASK(cad, devinfo->nid), cad);
7567 				printf(" enable=0x%08x", res);
7568 				res = hdac_command(sc,
7569 				    HDA_CMD_GET_GPIO_DIRECTION(cad, devinfo->nid), cad);
7570 				printf(" direction=0x%08x\n", res);
7571 				res = hdac_command(sc,
7572 				    HDA_CMD_GET_GPIO_WAKE_ENABLE_MASK(cad, devinfo->nid), cad);
7573 				device_printf(dev, "      wake=0x%08x", res);
7574 				res = hdac_command(sc,
7575 				    HDA_CMD_GET_GPIO_UNSOLICITED_ENABLE_MASK(cad, devinfo->nid),
7576 				    cad);
7577 				printf("  unsol=0x%08x", res);
7578 				res = hdac_command(sc,
7579 				    HDA_CMD_GET_GPIO_STICKY_MASK(cad, devinfo->nid), cad);
7580 				printf("    sticky=0x%08x\n", res);
7581 			}
7582 		}
7583 	}
7584 	hdac_unlock(sc);
7585 	return (0);
7586 }
7587 
7588 static void
7589 hdac_attach2(void *arg)
7590 {
7591 	struct hdac_codec *codec;
7592 	struct hdac_softc *sc;
7593 	struct hdac_audio_ctl *ctl;
7594 	uint32_t quirks_on, quirks_off;
7595 	int codec_index, fg_index;
7596 	int i, dmaalloc = 0;
7597 	struct hdac_devinfo *devinfo;
7598 
7599 	sc = (struct hdac_softc *)arg;
7600 
7601 	hdac_config_fetch(sc, &quirks_on, &quirks_off);
7602 
7603 	HDA_BOOTHVERBOSE(
7604 		device_printf(sc->dev, "HDA Config: on=0x%08x off=0x%08x\n",
7605 		    quirks_on, quirks_off);
7606 	);
7607 
7608 	hdac_lock(sc);
7609 
7610 	/* Remove ourselves from the config hooks */
7611 	if (sc->intrhook.ich_func != NULL) {
7612 		config_intrhook_disestablish(&sc->intrhook);
7613 		sc->intrhook.ich_func = NULL;
7614 	}
7615 
7616 	/* Start the corb and rirb engines */
7617 	HDA_BOOTHVERBOSE(
7618 		device_printf(sc->dev, "Starting CORB Engine...\n");
7619 	);
7620 	hdac_corb_start(sc);
7621 	HDA_BOOTHVERBOSE(
7622 		device_printf(sc->dev, "Starting RIRB Engine...\n");
7623 	);
7624 	hdac_rirb_start(sc);
7625 
7626 	HDA_BOOTHVERBOSE(
7627 		device_printf(sc->dev,
7628 		    "Enabling controller interrupt...\n");
7629 	);
7630 	HDAC_WRITE_4(&sc->mem, HDAC_GCTL, HDAC_READ_4(&sc->mem, HDAC_GCTL) |
7631 	    HDAC_GCTL_UNSOL);
7632 	if (sc->polling == 0) {
7633 		HDAC_WRITE_4(&sc->mem, HDAC_INTCTL,
7634 		    HDAC_INTCTL_CIE | HDAC_INTCTL_GIE);
7635 	} else {
7636 		callout_reset(&sc->poll_hdac, 1, hdac_poll_callback, sc);
7637 	}
7638 	DELAY(1000);
7639 
7640 	HDA_BOOTHVERBOSE(
7641 		device_printf(sc->dev,
7642 		    "Scanning HDA codecs ...\n");
7643 	);
7644 	hdac_scan_codecs(sc);
7645 
7646 	for (codec_index = 0; codec_index < HDAC_CODEC_MAX; codec_index++) {
7647 		codec = sc->codecs[codec_index];
7648 		if (codec == NULL)
7649 			continue;
7650 		for (fg_index = 0; fg_index < codec->num_fgs; fg_index++) {
7651 			devinfo = &codec->fgs[fg_index];
7652 			HDA_BOOTVERBOSE(
7653 				device_printf(sc->dev, "\n");
7654 				device_printf(sc->dev,
7655 				    "Processing %s FG cad=%d nid=%d...\n",
7656 				    (devinfo->node_type == HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO) ? "audio":
7657 				    (devinfo->node_type == HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_MODEM) ? "modem":
7658 				    "unknown",
7659 				    devinfo->codec->cad, devinfo->nid);
7660 			);
7661 			if (devinfo->node_type !=
7662 			    HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO) {
7663 				HDA_BOOTHVERBOSE(
7664 					device_printf(sc->dev,
7665 					    "Powering down...\n");
7666 				);
7667 				hdac_command(sc,
7668 				    HDA_CMD_SET_POWER_STATE(codec->cad,
7669 				    devinfo->nid, HDA_CMD_POWER_STATE_D3),
7670 				    codec->cad);
7671 				continue;
7672 			}
7673 
7674 			HDA_BOOTHVERBOSE(
7675 				device_printf(sc->dev, "Powering up...\n");
7676 			);
7677 			hdac_powerup(devinfo);
7678 			HDA_BOOTHVERBOSE(
7679 				device_printf(sc->dev, "Parsing audio FG...\n");
7680 			);
7681 			hdac_audio_parse(devinfo);
7682 			HDA_BOOTHVERBOSE(
7683 				device_printf(sc->dev, "Parsing Ctls...\n");
7684 			);
7685 		    	hdac_audio_ctl_parse(devinfo);
7686 			HDA_BOOTHVERBOSE(
7687 				device_printf(sc->dev, "Parsing vendor patch...\n");
7688 			);
7689 			hdac_vendor_patch_parse(devinfo);
7690 			devinfo->function.audio.quirks |= quirks_on;
7691 			devinfo->function.audio.quirks &= ~quirks_off;
7692 
7693 			HDA_BOOTHVERBOSE(
7694 				device_printf(sc->dev, "Disabling nonaudio...\n");
7695 			);
7696 			hdac_audio_disable_nonaudio(devinfo);
7697 			HDA_BOOTHVERBOSE(
7698 				device_printf(sc->dev, "Disabling useless...\n");
7699 			);
7700 			hdac_audio_disable_useless(devinfo);
7701 			HDA_BOOTVERBOSE(
7702 				device_printf(sc->dev, "Patched pins configuration:\n");
7703 				hdac_dump_pin_configs(devinfo);
7704 			);
7705 			HDA_BOOTHVERBOSE(
7706 				device_printf(sc->dev, "Parsing pin associations...\n");
7707 			);
7708 			hdac_audio_as_parse(devinfo);
7709 			HDA_BOOTHVERBOSE(
7710 				device_printf(sc->dev, "Building AFG tree...\n");
7711 			);
7712 			hdac_audio_build_tree(devinfo);
7713 			HDA_BOOTHVERBOSE(
7714 				device_printf(sc->dev, "Disabling unassociated "
7715 				    "widgets...\n");
7716 			);
7717 			hdac_audio_disable_unas(devinfo);
7718 			HDA_BOOTHVERBOSE(
7719 				device_printf(sc->dev, "Disabling nonselected "
7720 				    "inputs...\n");
7721 			);
7722 			hdac_audio_disable_notselected(devinfo);
7723 			HDA_BOOTHVERBOSE(
7724 				device_printf(sc->dev, "Disabling useless...\n");
7725 			);
7726 			hdac_audio_disable_useless(devinfo);
7727 			HDA_BOOTHVERBOSE(
7728 				device_printf(sc->dev, "Disabling "
7729 				    "crossassociatement connections...\n");
7730 			);
7731 			hdac_audio_disable_crossas(devinfo);
7732 			HDA_BOOTHVERBOSE(
7733 				device_printf(sc->dev, "Disabling useless...\n");
7734 			);
7735 			hdac_audio_disable_useless(devinfo);
7736 			HDA_BOOTHVERBOSE(
7737 				device_printf(sc->dev, "Binding associations to channels...\n");
7738 			);
7739 			hdac_audio_bind_as(devinfo);
7740 			HDA_BOOTHVERBOSE(
7741 				device_printf(sc->dev, "Assigning names to signal sources...\n");
7742 			);
7743 			hdac_audio_assign_names(devinfo);
7744 			HDA_BOOTHVERBOSE(
7745 				device_printf(sc->dev, "Assigning mixers to the tree...\n");
7746 			);
7747 			hdac_audio_assign_mixers(devinfo);
7748 			HDA_BOOTHVERBOSE(
7749 				device_printf(sc->dev, "Preparing pin controls...\n");
7750 			);
7751 			hdac_audio_prepare_pin_ctrl(devinfo);
7752 			HDA_BOOTHVERBOSE(
7753 				device_printf(sc->dev, "AFG commit...\n");
7754 		    	);
7755 			hdac_audio_commit(devinfo);
7756 		    	HDA_BOOTHVERBOSE(
7757 				device_printf(sc->dev, "HP switch init...\n");
7758 			);
7759 			hdac_hp_switch_init(devinfo);
7760 
7761 			if ((devinfo->function.audio.quirks & HDA_QUIRK_DMAPOS) &&
7762 			    dmaalloc == 0) {
7763 				if (hdac_dma_alloc(sc, &sc->pos_dma,
7764 				    (sc->num_iss + sc->num_oss + sc->num_bss) * 8) != 0) {
7765 					HDA_BOOTVERBOSE(
7766 						device_printf(sc->dev, "Failed to "
7767 						    "allocate DMA pos buffer "
7768 						    "(non-fatal)\n");
7769 					);
7770 				} else
7771 					dmaalloc = 1;
7772 			}
7773 
7774 		    	HDA_BOOTHVERBOSE(
7775 				device_printf(sc->dev, "Creating PCM devices...\n");
7776 			);
7777 			hdac_create_pcms(devinfo);
7778 
7779 			HDA_BOOTVERBOSE(
7780 				if (devinfo->function.audio.quirks != 0) {
7781 					device_printf(sc->dev, "FG config/quirks:");
7782 					for (i = 0; i < HDAC_QUIRKS_TAB_LEN; i++) {
7783 						if ((devinfo->function.audio.quirks &
7784 						    hdac_quirks_tab[i].value) ==
7785 						    hdac_quirks_tab[i].value)
7786 							printf(" %s", hdac_quirks_tab[i].key);
7787 					}
7788 					printf("\n");
7789 				}
7790 
7791 				device_printf(sc->dev, "\n");
7792 				device_printf(sc->dev, "+-------------------+\n");
7793 				device_printf(sc->dev, "| DUMPING HDA NODES |\n");
7794 				device_printf(sc->dev, "+-------------------+\n");
7795 				hdac_dump_nodes(devinfo);
7796 			);
7797 
7798 			HDA_BOOTHVERBOSE(
7799 				device_printf(sc->dev, "\n");
7800 				device_printf(sc->dev, "+------------------------+\n");
7801 				device_printf(sc->dev, "| DUMPING HDA AMPLIFIERS |\n");
7802 				device_printf(sc->dev, "+------------------------+\n");
7803 				device_printf(sc->dev, "\n");
7804 				i = 0;
7805 				while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) {
7806 					device_printf(sc->dev, "%3d: nid %3d %s (%s) index %d", i,
7807 					    (ctl->widget != NULL) ? ctl->widget->nid : -1,
7808 					    (ctl->ndir == HDA_CTL_IN)?"in ":"out",
7809 					    (ctl->dir == HDA_CTL_IN)?"in ":"out",
7810 					    ctl->index);
7811 					if (ctl->childwidget != NULL)
7812 						printf(" cnid %3d", ctl->childwidget->nid);
7813 					else
7814 						printf("         ");
7815 					printf(" ossmask=0x%08x\n",
7816 					    ctl->ossmask);
7817 					device_printf(sc->dev,
7818 					    "       mute: %d step: %3d size: %3d off: %3d%s\n",
7819 					    ctl->mute, ctl->step, ctl->size, ctl->offset,
7820 					    (ctl->enable == 0) ? " [DISABLED]" :
7821 					    ((ctl->ossmask == 0) ? " [UNUSED]" : ""));
7822 				}
7823 			);
7824 		}
7825 	}
7826 	hdac_unlock(sc);
7827 
7828 	HDA_BOOTVERBOSE(
7829 		device_printf(sc->dev, "\n");
7830 	);
7831 
7832 	bus_generic_attach(sc->dev);
7833 
7834 	SYSCTL_ADD_PROC(device_get_sysctl_ctx(sc->dev),
7835 	    SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev)), OID_AUTO,
7836 	    "polling", CTLTYPE_INT | CTLFLAG_RW, sc->dev, sizeof(sc->dev),
7837 	    sysctl_hdac_polling, "I", "Enable polling mode");
7838 	SYSCTL_ADD_PROC(device_get_sysctl_ctx(sc->dev),
7839 	    SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev)), OID_AUTO,
7840 	    "polling_interval", CTLTYPE_INT | CTLFLAG_RW, sc->dev,
7841 	    sizeof(sc->dev), sysctl_hdac_polling_interval, "I",
7842 	    "Controller/Jack Sense polling interval (1-1000 ms)");
7843 	SYSCTL_ADD_PROC(device_get_sysctl_ctx(sc->dev),
7844 	    SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev)), OID_AUTO,
7845 	    "pindump", CTLTYPE_INT | CTLFLAG_RW, sc->dev, sizeof(sc->dev),
7846 	    sysctl_hdac_pindump, "I", "Dump pin states/data");
7847 }
7848 
7849 /****************************************************************************
7850  * int hdac_suspend(device_t)
7851  *
7852  * Suspend and power down HDA bus and codecs.
7853  ****************************************************************************/
7854 static int
7855 hdac_suspend(device_t dev)
7856 {
7857 	struct hdac_softc *sc;
7858 	struct hdac_codec *codec;
7859 	struct hdac_devinfo *devinfo;
7860 	int codec_index, fg_index, i;
7861 
7862 	HDA_BOOTHVERBOSE(
7863 		device_printf(dev, "Suspend...\n");
7864 	);
7865 
7866 	sc = device_get_softc(dev);
7867 	hdac_lock(sc);
7868 
7869 	HDA_BOOTHVERBOSE(
7870 		device_printf(dev, "Stop streams...\n");
7871 	);
7872 	for (i = 0; i < sc->num_chans; i++) {
7873 		if (sc->chans[i].flags & HDAC_CHN_RUNNING) {
7874 			sc->chans[i].flags |= HDAC_CHN_SUSPEND;
7875 			hdac_channel_stop(sc, &sc->chans[i]);
7876 		}
7877 	}
7878 
7879 	for (codec_index = 0; codec_index < HDAC_CODEC_MAX; codec_index++) {
7880 		codec = sc->codecs[codec_index];
7881 		if (codec == NULL)
7882 			continue;
7883 		for (fg_index = 0; fg_index < codec->num_fgs; fg_index++) {
7884 			devinfo = &codec->fgs[fg_index];
7885 			HDA_BOOTHVERBOSE(
7886 				device_printf(dev,
7887 				    "Power down FG"
7888 				    " cad=%d nid=%d to the D3 state...\n",
7889 				    codec->cad, devinfo->nid);
7890 			);
7891 			hdac_command(sc,
7892 			    HDA_CMD_SET_POWER_STATE(codec->cad,
7893 			    devinfo->nid, HDA_CMD_POWER_STATE_D3),
7894 			    codec->cad);
7895 		}
7896 	}
7897 
7898 	HDA_BOOTHVERBOSE(
7899 		device_printf(dev, "Reset controller...\n");
7900 	);
7901 	callout_stop(&sc->poll_hda);
7902 	callout_stop(&sc->poll_hdac);
7903 	callout_stop(&sc->poll_jack);
7904 	hdac_reset(sc, 0);
7905 	hdac_unlock(sc);
7906 	taskqueue_drain(taskqueue_thread, &sc->unsolq_task);
7907 	callout_drain(&sc->poll_hda);
7908 	callout_drain(&sc->poll_hdac);
7909 	callout_drain(&sc->poll_jack);
7910 
7911 	HDA_BOOTHVERBOSE(
7912 		device_printf(dev, "Suspend done\n");
7913 	);
7914 
7915 	return (0);
7916 }
7917 
7918 /****************************************************************************
7919  * int hdac_resume(device_t)
7920  *
7921  * Powerup and restore HDA bus and codecs state.
7922  ****************************************************************************/
7923 static int
7924 hdac_resume(device_t dev)
7925 {
7926 	struct hdac_softc *sc;
7927 	struct hdac_codec *codec;
7928 	struct hdac_devinfo *devinfo;
7929 	int codec_index, fg_index, i;
7930 
7931 	HDA_BOOTHVERBOSE(
7932 		device_printf(dev, "Resume...\n");
7933 	);
7934 
7935 	sc = device_get_softc(dev);
7936 	hdac_lock(sc);
7937 
7938 	/* Quiesce everything */
7939 	HDA_BOOTHVERBOSE(
7940 		device_printf(dev, "Reset controller...\n");
7941 	);
7942 	hdac_reset(sc, 1);
7943 
7944 	/* Initialize the CORB and RIRB */
7945 	hdac_corb_init(sc);
7946 	hdac_rirb_init(sc);
7947 
7948 	/* Start the corb and rirb engines */
7949 	HDA_BOOTHVERBOSE(
7950 		device_printf(dev, "Starting CORB Engine...\n");
7951 	);
7952 	hdac_corb_start(sc);
7953 	HDA_BOOTHVERBOSE(
7954 		device_printf(dev, "Starting RIRB Engine...\n");
7955 	);
7956 	hdac_rirb_start(sc);
7957 
7958 	HDA_BOOTHVERBOSE(
7959 		device_printf(dev,
7960 		    "Enabling controller interrupt...\n");
7961 	);
7962 	HDAC_WRITE_4(&sc->mem, HDAC_GCTL, HDAC_READ_4(&sc->mem, HDAC_GCTL) |
7963 	    HDAC_GCTL_UNSOL);
7964 	if (sc->polling == 0) {
7965 		HDAC_WRITE_4(&sc->mem, HDAC_INTCTL,
7966 		    HDAC_INTCTL_CIE | HDAC_INTCTL_GIE);
7967 	} else {
7968 		callout_reset(&sc->poll_hdac, 1, hdac_poll_callback, sc);
7969 	}
7970 	DELAY(1000);
7971 
7972 	for (codec_index = 0; codec_index < HDAC_CODEC_MAX; codec_index++) {
7973 		codec = sc->codecs[codec_index];
7974 		if (codec == NULL)
7975 			continue;
7976 		for (fg_index = 0; fg_index < codec->num_fgs; fg_index++) {
7977 			devinfo = &codec->fgs[fg_index];
7978 			if (devinfo->node_type !=
7979 			    HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO) {
7980 				HDA_BOOTHVERBOSE(
7981 					device_printf(dev,
7982 					    "Power down unsupported non-audio FG"
7983 					    " cad=%d nid=%d to the D3 state...\n",
7984 					    codec->cad, devinfo->nid);
7985 				);
7986 				hdac_command(sc,
7987 				    HDA_CMD_SET_POWER_STATE(codec->cad,
7988 				    devinfo->nid, HDA_CMD_POWER_STATE_D3),
7989 				    codec->cad);
7990 				continue;
7991 			}
7992 
7993 			HDA_BOOTHVERBOSE(
7994 				device_printf(dev,
7995 				    "Power up audio FG cad=%d nid=%d...\n",
7996 				    devinfo->codec->cad, devinfo->nid);
7997 			);
7998 			hdac_powerup(devinfo);
7999 			HDA_BOOTHVERBOSE(
8000 				device_printf(dev, "AFG commit...\n");
8001 		    	);
8002 			hdac_audio_commit(devinfo);
8003 		    	HDA_BOOTHVERBOSE(
8004 				device_printf(dev, "HP switch init...\n");
8005 			);
8006 			hdac_hp_switch_init(devinfo);
8007 
8008 			hdac_unlock(sc);
8009 			for (i = 0; i < devinfo->function.audio.num_devs; i++) {
8010 				struct hdac_pcm_devinfo *pdevinfo =
8011 				    &devinfo->function.audio.devs[i];
8012 				HDA_BOOTHVERBOSE(
8013 					device_printf(pdevinfo->dev,
8014 					    "OSS mixer reinitialization...\n");
8015 				);
8016 				if (mixer_reinit(pdevinfo->dev) == -1)
8017 					device_printf(pdevinfo->dev,
8018 					    "unable to reinitialize the mixer\n");
8019 			}
8020 			hdac_lock(sc);
8021 		}
8022 	}
8023 
8024 	HDA_BOOTHVERBOSE(
8025 		device_printf(dev, "Start streams...\n");
8026 	);
8027 	for (i = 0; i < sc->num_chans; i++) {
8028 		if (sc->chans[i].flags & HDAC_CHN_SUSPEND) {
8029 			sc->chans[i].flags &= ~HDAC_CHN_SUSPEND;
8030 			hdac_channel_start(sc, &sc->chans[i]);
8031 		}
8032 	}
8033 
8034 	hdac_unlock(sc);
8035 
8036 	HDA_BOOTHVERBOSE(
8037 		device_printf(dev, "Resume done\n");
8038 	);
8039 
8040 	return (0);
8041 }
8042 /****************************************************************************
8043  * int hdac_detach(device_t)
8044  *
8045  * Detach and free up resources utilized by the hdac device.
8046  ****************************************************************************/
8047 static int
8048 hdac_detach(device_t dev)
8049 {
8050 	struct hdac_softc *sc;
8051 	device_t *devlist;
8052 	int i, devcount, error;
8053 
8054 	if ((error = device_get_children(dev, &devlist, &devcount)) != 0)
8055 		return (error);
8056 	for (i = 0; i < devcount; i++) {
8057 		if ((error = device_delete_child(dev, devlist[i])) != 0) {
8058 			free(devlist, M_TEMP);
8059 			return (error);
8060 		}
8061 	}
8062 	free(devlist, M_TEMP);
8063 
8064 	sc = device_get_softc(dev);
8065 	hdac_release_resources(sc);
8066 
8067 	return (0);
8068 }
8069 
8070 static int
8071 hdac_print_child(device_t dev, device_t child)
8072 {
8073 	struct hdac_pcm_devinfo *pdevinfo =
8074 	    (struct hdac_pcm_devinfo *)device_get_ivars(child);
8075 	int retval;
8076 
8077 	retval = bus_print_child_header(dev, child);
8078 	retval += printf(" at cad %d nid %d",
8079 	    pdevinfo->devinfo->codec->cad, pdevinfo->devinfo->nid);
8080 	retval += bus_print_child_footer(dev, child);
8081 
8082 	return (retval);
8083 }
8084 
8085 static device_method_t hdac_methods[] = {
8086 	/* device interface */
8087 	DEVMETHOD(device_probe,		hdac_probe),
8088 	DEVMETHOD(device_attach,	hdac_attach),
8089 	DEVMETHOD(device_detach,	hdac_detach),
8090 	DEVMETHOD(device_suspend,	hdac_suspend),
8091 	DEVMETHOD(device_resume,	hdac_resume),
8092 	/* Bus interface */
8093 	DEVMETHOD(bus_print_child,	hdac_print_child),
8094 	{ 0, 0 }
8095 };
8096 
8097 static driver_t hdac_driver = {
8098 	"hdac",
8099 	hdac_methods,
8100 	sizeof(struct hdac_softc),
8101 };
8102 
8103 static devclass_t hdac_devclass;
8104 
8105 DRIVER_MODULE(snd_hda, pci, hdac_driver, hdac_devclass, 0, 0);
8106 MODULE_DEPEND(snd_hda, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER);
8107 MODULE_VERSION(snd_hda, 1);
8108 
8109 static int
8110 hdac_pcm_probe(device_t dev)
8111 {
8112 	struct hdac_pcm_devinfo *pdevinfo =
8113 	    (struct hdac_pcm_devinfo *)device_get_ivars(dev);
8114 	char buf[128];
8115 
8116 	snprintf(buf, sizeof(buf), "HDA %s PCM #%d %s",
8117 	    hdac_codec_name(pdevinfo->devinfo->codec),
8118 	    pdevinfo->index,
8119 	    (pdevinfo->digital == 3)?"DisplayPort":
8120 	    ((pdevinfo->digital == 2)?"HDMI":
8121 	    ((pdevinfo->digital)?"Digital":"Analog")));
8122 	device_set_desc_copy(dev, buf);
8123 	return (0);
8124 }
8125 
8126 static int
8127 hdac_pcm_attach(device_t dev)
8128 {
8129 	struct hdac_pcm_devinfo *pdevinfo =
8130 	    (struct hdac_pcm_devinfo *)device_get_ivars(dev);
8131 	struct hdac_softc *sc = pdevinfo->devinfo->codec->sc;
8132 	char status[SND_STATUSLEN];
8133 	int i;
8134 
8135 	pdevinfo->chan_size = pcm_getbuffersize(dev,
8136 	    HDA_BUFSZ_MIN, HDA_BUFSZ_DEFAULT, HDA_BUFSZ_MAX);
8137 
8138 	HDA_BOOTVERBOSE(
8139 		device_printf(dev, "+--------------------------------------+\n");
8140 		device_printf(dev, "| DUMPING PCM Playback/Record Channels |\n");
8141 		device_printf(dev, "+--------------------------------------+\n");
8142 		hdac_dump_pcmchannels(pdevinfo);
8143 		device_printf(dev, "\n");
8144 		device_printf(dev, "+-------------------------------+\n");
8145 		device_printf(dev, "| DUMPING Playback/Record Paths |\n");
8146 		device_printf(dev, "+-------------------------------+\n");
8147 		hdac_dump_dac(pdevinfo);
8148 		hdac_dump_adc(pdevinfo);
8149 		hdac_dump_mix(pdevinfo);
8150 		device_printf(dev, "\n");
8151 		device_printf(dev, "+-------------------------+\n");
8152 		device_printf(dev, "| DUMPING Volume Controls |\n");
8153 		device_printf(dev, "+-------------------------+\n");
8154 		hdac_dump_ctls(pdevinfo, "Master Volume", SOUND_MASK_VOLUME);
8155 		hdac_dump_ctls(pdevinfo, "PCM Volume", SOUND_MASK_PCM);
8156 		hdac_dump_ctls(pdevinfo, "CD Volume", SOUND_MASK_CD);
8157 		hdac_dump_ctls(pdevinfo, "Microphone Volume", SOUND_MASK_MIC);
8158 		hdac_dump_ctls(pdevinfo, "Microphone2 Volume", SOUND_MASK_MONITOR);
8159 		hdac_dump_ctls(pdevinfo, "Line-in Volume", SOUND_MASK_LINE);
8160 		hdac_dump_ctls(pdevinfo, "Speaker/Beep Volume", SOUND_MASK_SPEAKER);
8161 		hdac_dump_ctls(pdevinfo, "Recording Level", SOUND_MASK_RECLEV);
8162 		hdac_dump_ctls(pdevinfo, "Input Mix Level", SOUND_MASK_IMIX);
8163 		hdac_dump_ctls(pdevinfo, "Input Monitoring Level", SOUND_MASK_IGAIN);
8164 		hdac_dump_ctls(pdevinfo, NULL, 0);
8165 		device_printf(dev, "\n");
8166 	);
8167 
8168 	if (resource_int_value(device_get_name(dev),
8169 	    device_get_unit(dev), "blocksize", &i) == 0 && i > 0) {
8170 		i &= HDA_BLK_ALIGN;
8171 		if (i < HDA_BLK_MIN)
8172 			i = HDA_BLK_MIN;
8173 		pdevinfo->chan_blkcnt = pdevinfo->chan_size / i;
8174 		i = 0;
8175 		while (pdevinfo->chan_blkcnt >> i)
8176 			i++;
8177 		pdevinfo->chan_blkcnt = 1 << (i - 1);
8178 		if (pdevinfo->chan_blkcnt < HDA_BDL_MIN)
8179 			pdevinfo->chan_blkcnt = HDA_BDL_MIN;
8180 		else if (pdevinfo->chan_blkcnt > HDA_BDL_MAX)
8181 			pdevinfo->chan_blkcnt = HDA_BDL_MAX;
8182 	} else
8183 		pdevinfo->chan_blkcnt = HDA_BDL_DEFAULT;
8184 
8185 	/*
8186 	 * We don't register interrupt handler with snd_setup_intr
8187 	 * in pcm device. Mark pcm device as MPSAFE manually.
8188 	 */
8189 	pcm_setflags(dev, pcm_getflags(dev) | SD_F_MPSAFE);
8190 
8191 	HDA_BOOTHVERBOSE(
8192 		device_printf(dev, "OSS mixer initialization...\n");
8193 	);
8194 	if (mixer_init(dev, &hdac_audio_ctl_ossmixer_class, pdevinfo) != 0)
8195 		device_printf(dev, "Can't register mixer\n");
8196 
8197 	HDA_BOOTHVERBOSE(
8198 		device_printf(dev, "Registering PCM channels...\n");
8199 	);
8200 	if (pcm_register(dev, pdevinfo, (pdevinfo->play >= 0)?1:0,
8201 	    (pdevinfo->rec >= 0)?1:0) != 0)
8202 		device_printf(dev, "Can't register PCM\n");
8203 
8204 	pdevinfo->registered++;
8205 
8206 	if (pdevinfo->play >= 0)
8207 		pcm_addchan(dev, PCMDIR_PLAY, &hdac_channel_class, pdevinfo);
8208 	if (pdevinfo->rec >= 0)
8209 		pcm_addchan(dev, PCMDIR_REC, &hdac_channel_class, pdevinfo);
8210 
8211 	snprintf(status, SND_STATUSLEN, "at cad %d nid %d on %s %s",
8212 	    pdevinfo->devinfo->codec->cad, pdevinfo->devinfo->nid,
8213 	    device_get_nameunit(sc->dev), PCM_KLDSTRING(snd_hda));
8214 	pcm_setstatus(dev, status);
8215 
8216 	return (0);
8217 }
8218 
8219 static int
8220 hdac_pcm_detach(device_t dev)
8221 {
8222 	struct hdac_pcm_devinfo *pdevinfo =
8223 	    (struct hdac_pcm_devinfo *)device_get_ivars(dev);
8224 	int err;
8225 
8226 	if (pdevinfo->registered > 0) {
8227 		err = pcm_unregister(dev);
8228 		if (err != 0)
8229 			return (err);
8230 	}
8231 
8232 	return (0);
8233 }
8234 
8235 static device_method_t hdac_pcm_methods[] = {
8236 	/* device interface */
8237 	DEVMETHOD(device_probe,		hdac_pcm_probe),
8238 	DEVMETHOD(device_attach,	hdac_pcm_attach),
8239 	DEVMETHOD(device_detach,	hdac_pcm_detach),
8240 	{ 0, 0 }
8241 };
8242 
8243 static driver_t hdac_pcm_driver = {
8244 	"pcm",
8245 	hdac_pcm_methods,
8246 	PCM_SOFTC_SIZE,
8247 };
8248 
8249 DRIVER_MODULE(snd_hda_pcm, hdac, hdac_pcm_driver, pcm_devclass, 0, 0);
8250 
8251