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