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