1582eadeeSfl /*
2582eadeeSfl  * CDDL HEADER START
3582eadeeSfl  *
4582eadeeSfl  * The contents of this file are subject to the terms of the
5582eadeeSfl  * Common Development and Distribution License (the "License").
6582eadeeSfl  * You may not use this file except in compliance with the License.
7582eadeeSfl  *
8582eadeeSfl  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9582eadeeSfl  * or http://www.opensolaris.org/os/licensing.
10582eadeeSfl  * See the License for the specific language governing permissions
11582eadeeSfl  * and limitations under the License.
12582eadeeSfl  *
13582eadeeSfl  * When distributing Covered Code, include this CDDL HEADER in each
14582eadeeSfl  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15582eadeeSfl  * If applicable, add the following below this CDDL HEADER, with the
16582eadeeSfl  * fields enclosed by brackets "[]" replaced with your own identifying
17582eadeeSfl  * information: Portions Copyright [yyyy] [name of copyright owner]
18582eadeeSfl  *
19582eadeeSfl  * CDDL HEADER END
20582eadeeSfl  */
21582eadeeSfl /*
22b96a6eceSZhao Edgar Liu - Sun Microsystems  * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
23582eadeeSfl  */
24582eadeeSfl #ifndef _SYS_AUDIOHD_IMPL_H_
25582eadeeSfl #define	_SYS_AUDIOHD_IMPL_H_
26582eadeeSfl 
27582eadeeSfl #ifdef __cplusplus
28582eadeeSfl extern "C" {
29582eadeeSfl #endif
30582eadeeSfl 
317253a143Scg /*
323a49c214SYang-Rong Jerry Zhou  * vendor IDs of PCI audio controllers
337253a143Scg  */
3414707ff3Scg #define	AUDIOHD_VID_ATI		0x1002
350c240c64SZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_VID_CIRRUS	0x1013
363a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_VID_NVIDIA	0x10de
3789e1f902SZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_VID_REALTEK	0x10ec
3870feb41cSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_VID_CREATIVE	0x1102
3926ae4a35SZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_VID_IDT		0x111d
4007bec7ccSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_VID_ANALOG	0x11d4
410c240c64SZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_VID_CONEXANT	0x14f1
4242c41cf8Slipeng sang - Sun Microsystems - Beijing China #define	AUDIOHD_VID_SIGMATEL	0x8384
4326ae4a35SZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_VID_INTEL	0x8086
4414707ff3Scg 
4589e1f902SZhao Edgar Liu - Sun Microsystems /*
4689e1f902SZhao Edgar Liu - Sun Microsystems  * specific audiohd controller device id
4789e1f902SZhao Edgar Liu - Sun Microsystems  */
4889e1f902SZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_CONTROLLER_MCP51	0x10de026c
4989e1f902SZhao Edgar Liu - Sun Microsystems 
5088447a05SGarrett D'Amore /*
51cbe6566fSZhao Edgar Liu - Sun Microsystems  * codec special initial flags
5288447a05SGarrett D'Amore  */
53cbe6566fSZhao Edgar Liu - Sun Microsystems #define	NO_GPIO		0x00000001
54cbe6566fSZhao Edgar Liu - Sun Microsystems #define	NO_MIXER	0x00000002
55cbe6566fSZhao Edgar Liu - Sun Microsystems #define	NO_SPDIF	0x00000004
56ee97b734SZhao Edgar Liu - Sun Microsystems #define	EN_PIN_BEEP	0x00000008
5788447a05SGarrett D'Amore 
5888447a05SGarrett D'Amore #define	AUDIOHD_DEV_CONFIG	"onboard1"
5988447a05SGarrett D'Amore #define	AUDIOHD_DEV_VERSION	"a"
6088447a05SGarrett D'Amore 
61555989a4Scg /*
62555989a4Scg  * Only for Intel hardware:
63555989a4Scg  * PCI Express traffic class select register in PCI configure space
64555989a4Scg  */
65555989a4Scg #define	AUDIOHD_INTEL_PCI_TCSEL 0x44
66b96a6eceSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_INTEL_TCS_MASK	0xf8
67555989a4Scg 
6814707ff3Scg /*
6914707ff3Scg  * Only for ATI SB450:
7014707ff3Scg  * MISC control register 2
7114707ff3Scg  */
7214707ff3Scg #define	AUDIOHD_ATI_PCI_MISC2	0x42
73b96a6eceSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_ATI_MISC2_MASK	0xf8
7414707ff3Scg #define	AUDIOHD_ATI_MISC2_SNOOP	0x02
75b96a6eceSZhao Edgar Liu - Sun Microsystems 
76b96a6eceSZhao Edgar Liu - Sun Microsystems /* NVIDIA snoop */
77b96a6eceSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_NVIDIA_SNOOP	0x0f
78b96a6eceSZhao Edgar Liu - Sun Microsystems 
79582eadeeSfl #define	AUDIOHDC_NID(x)		x
80644f3c1fScg #define	AUDIOHDC_NULL_NODE	-1
813a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_NULL_CONN	((uint_t)(-1))
82582eadeeSfl 
83feccaf6dSYang-Rong Jerry Zhou #define	AUDIOHD_EXT_AMP_MASK	0x00010000
84feccaf6dSYang-Rong Jerry Zhou #define	AUDIOHD_EXT_AMP_ENABLE	0x02
853a49c214SYang-Rong Jerry Zhou 
863a49c214SYang-Rong Jerry Zhou /* Power On/Off */
873a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PW_D0		0
883a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PW_D2		2
893a49c214SYang-Rong Jerry Zhou 
903a49c214SYang-Rong Jerry Zhou /* Pin speaker On/Off */
913a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_SP_ON		1
923a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_SP_OFF		0
933a49c214SYang-Rong Jerry Zhou 
9489e1f902SZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_PORT_MAX	15
953a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_CODEC_MAX	16
96582eadeeSfl #define	AUDIOHD_MEMIO_LEN	0x4000
97582eadeeSfl 
983a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_RETRY_TIMES	60
9916600ba1SYang-Rong Jerry Zhou #define	AUDIOHD_TEST_TIMES	500
1003a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_OUTSTR_NUM_OFF	12
1013a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_INSTR_NUM_OFF	8
1023a49c214SYang-Rong Jerry Zhou 
1033a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_CORB_SIZE_OFF	0x4e
1043a49c214SYang-Rong Jerry Zhou 
10516600ba1SYang-Rong Jerry Zhou #define	AUDIOHD_URCAP_MASK	0x80
10616600ba1SYang-Rong Jerry Zhou #define	AUDIOHD_DTCCAP_MASK	0x4
1073a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_UR_ENABLE_OFF	8
108989b958fSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_UR_TAG_MASK	0x3f
1093a49c214SYang-Rong Jerry Zhou 
11016600ba1SYang-Rong Jerry Zhou #define	AUDIOHD_CIS_MASK	0x40000000
1113a49c214SYang-Rong Jerry Zhou 
11216600ba1SYang-Rong Jerry Zhou #define	AUDIOHD_RIRB_UR_MASK	0x10
1133a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_RIRB_CODEC_MASK	0xf
1143a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_RIRB_WID_OFF	27
11516600ba1SYang-Rong Jerry Zhou #define	AUDIOHD_RIRB_INTRCNT	0x0
11616600ba1SYang-Rong Jerry Zhou #define	AUDIOHD_RIRB_WPMASK	0xff
1173a49c214SYang-Rong Jerry Zhou 
1183a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_FORM_MASK	0x0080
1193a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_LEN_MASK	0x007f
1203a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_CAP_MASK	0x00000010
1213a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_CONF_MASK	0xc0000000
1223a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_CON_MASK	3
1233a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_CON_STEP	30
1243a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_IO_MASK	0X0018
1253a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_SEQ_MASK	0x0000000f
1263a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_ASO_MASK	0x000000f0
1273a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_ASO_OFF	0x4
1283a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_DEV_MASK	0x00f00000
1293a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_DEV_OFF	20
1303a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_NUMS	6
1313a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_NO_CONN	0x40000000
1323a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_IN_ENABLE	0x20
13316600ba1SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_OUT_ENABLE	0x40
134989b958fSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_PIN_PRES_MASK	0x80000000
1353a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_CONTP_OFF	0x1e
1363a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_CON_JACK	0
1373a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_CON_FIXED	0x2
1383a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_CONTP_MASK	0x3
139d5145224SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_VREF_L1	0x20
140d5145224SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_VREF_L2	0x10
141d5145224SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_VREF_L3	0x04
142d5145224SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_VREF_L4	0x02
143d5145224SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_VREF_OFF	8
144d5145224SYang-Rong Jerry Zhou #define	AUDIOHD_PIN_VREF_MASK	0xff
14589e1f902SZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_PIN_CLR_MASK	0xf
14689e1f902SZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_PIN_CLR_OFF	12
14788447a05SGarrett D'Amore 
1483a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_VERB_ADDR_OFF	28
1493a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_VERB_NID_OFF	20
1503a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_VERB_CMD_OFF	8
1513a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_VERB_CMD16_OFF	16
1523a49c214SYang-Rong Jerry Zhou 
1533a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_RING_MAX_SIZE	0x00ff
1543a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_REC_TAG_OFF	4
1553a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PLAY_TAG_OFF	4
1563a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PLAY_CTL_OFF	2
1573a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_REC_CTL_OFF	2
1583a49c214SYang-Rong Jerry Zhou 
1593a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_SPDIF_ON	1
1603a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_SPDIF_MASK	0x00ff
1613a49c214SYang-Rong Jerry Zhou 
1623a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_GAIN_OFF	8
1633a49c214SYang-Rong Jerry Zhou 
1643a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_CODEC_STR_OFF	16
1653a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_CODEC_STR_MASK	0x000000ff
1663a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_CODEC_NUM_MASK	0x000000ff
1673a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_CODEC_TYPE_MASK	0x000000ff
1683a49c214SYang-Rong Jerry Zhou 
1690c240c64SZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_ROUNDUP(x, algn)	(((x) + ((algn) - 1)) & ~((algn) - 1))
170582eadeeSfl #define	AUDIOHD_BDLE_BUF_ALIGN	128
171582eadeeSfl #define	AUDIOHD_CMDIO_ENT_MASK	0x00ff	/* 256 entries for CORB/RIRB */
172582eadeeSfl #define	AUDIOHD_CDBIO_CORB_LEN	1024	/* 256 entries for CORB, 1024B */
173582eadeeSfl #define	AUDIOHD_CDBIO_RIRB_LEN	2048	/* 256 entries for RIRB, 2048B */
174582eadeeSfl #define	AUDIOHD_BDLE_NUMS	4	/* 4 entires for record/play BD list */
175582eadeeSfl 
176582eadeeSfl #define	AUDIOHD_PORT_UNMUTE	(0xffffffff)
177582eadeeSfl 
178582eadeeSfl /*
179582eadeeSfl  * Audio registers of high definition
180582eadeeSfl  */
181582eadeeSfl #define	AUDIOHD_REG_GCAP		0x00
182582eadeeSfl #define	AUDIOHDR_GCAP_OUTSTREAMS	0xf000
183582eadeeSfl #define	AUDIOHDR_GCAP_INSTREAMS		0x0f00
184582eadeeSfl #define	AUDIOHDR_GCAP_BSTREAMS		0x00f8
185582eadeeSfl #define	AUDIOHDR_GCAP_NSDO		0x0006
186582eadeeSfl #define	AUDIOHDR_GCAP_64OK		0x0001
187582eadeeSfl 
188582eadeeSfl #define	AUDIOHD_REG_VMIN		0x02
189582eadeeSfl #define	AUDIOHD_REG_VMAJ		0x03
190582eadeeSfl #define	AUDIOHD_REG_OUTPAY		0x04
191582eadeeSfl #define	AUDIOHD_REG_INPAY		0x06
192582eadeeSfl #define	AUDIOHD_REG_GCTL		0x08
193582eadeeSfl #define	AUDIOHD_REG_WAKEEN		0x0C
194582eadeeSfl #define	AUDIOHD_REG_STATESTS		0x0E
195582eadeeSfl #define	AUDIOHD_STATESTS_BIT_SDINS	0x7F
196582eadeeSfl 
197582eadeeSfl #define	AUDIOHD_REG_GSTS		0x10
198582eadeeSfl #define	AUDIOHD_REG_INTCTL		0x20
199582eadeeSfl #define	AUDIOHD_INTCTL_BIT_GIE		0x80000000
200582eadeeSfl #define	AUDIOHD_INTCTL_BIT_CIE		0x40000000
201582eadeeSfl #define	AUDIOHD_INTCTL_BIT_SIE		0x3FFFFFFF
202582eadeeSfl 
203582eadeeSfl 
204582eadeeSfl #define	AUDIOHD_REG_INTSTS		0x24
205582eadeeSfl #define	AUDIOHD_INTSTS_BIT_GIS		0x80000000
206582eadeeSfl #define	AUDIOHD_INTSTS_BIT_CIS		0x40000000
207582eadeeSfl #define	AUDIOHD_INTSTS_BIT_SINTS	(0x3fffffff)
208582eadeeSfl 
209582eadeeSfl #define	AUDIOHD_REG_WALCLK		0x30
210555989a4Scg #define	AUDIOHD_REG_SYNC		0x38
211582eadeeSfl 
212582eadeeSfl #define	AUDIOHD_REG_CORBLBASE		0x40
213582eadeeSfl #define	AUDIOHD_REG_CORBUBASE		0x44
214582eadeeSfl #define	AUDIOHD_REG_CORBWP		0x48
215582eadeeSfl #define	AUDIOHD_REG_CORBRP		0x4A
216582eadeeSfl #define	AUDIOHD_REG_CORBCTL		0x4C
217582eadeeSfl #define	AUDIOHD_REG_CORBST		0x4D
218582eadeeSfl #define	AUDIOHD_REG_CORBSIZE		0x4E
219582eadeeSfl 
220582eadeeSfl #define	AUDIOHD_REG_RIRBLBASE		0x50
221582eadeeSfl #define	AUDIOHD_REG_RIRBUBASE		0x54
222582eadeeSfl #define	AUDIOHD_REG_RIRBWP		0x58
223582eadeeSfl #define	AUDIOHD_REG_RINTCNT		0x5A
224582eadeeSfl #define	AUDIOHD_REG_RIRBCTL		0x5C
225582eadeeSfl #define	AUDIOHD_REG_RIRBSTS		0x5D
226582eadeeSfl #define	AUDIOHD_REG_RIRBSIZE		0x5E
227582eadeeSfl 
228582eadeeSfl #define	AUDIOHD_REG_IC			0x60
229582eadeeSfl #define	AUDIOHD_REG_IR			0x64
230582eadeeSfl #define	AUDIOHD_REG_IRS			0x68
231582eadeeSfl #define	AUDIOHD_REG_DPLBASE		0x70
232582eadeeSfl #define	AUDIOHD_REG_DPUBASE		0x74
233582eadeeSfl 
234582eadeeSfl #define	AUDIOHD_REG_SD_BASE		0x80
235582eadeeSfl #define	AUDIOHD_REG_SD_LEN		0x20
236582eadeeSfl 
237582eadeeSfl /*
238582eadeeSfl  * Offset of Stream Descriptor Registers
239582eadeeSfl  */
240582eadeeSfl #define	AUDIOHD_SDREG_OFFSET_CTL		0x00
241582eadeeSfl #define	AUDIOHD_SDREG_OFFSET_STS		0x03
242582eadeeSfl #define	AUDIOHD_SDREG_OFFSET_LPIB		0x04
243582eadeeSfl #define	AUDIOHD_SDREG_OFFSET_CBL		0x08
244582eadeeSfl #define	AUDIOHD_SDREG_OFFSET_LVI		0x0c
245582eadeeSfl #define	AUDIOHD_SDREG_OFFSET_FIFOW		0x0e
246582eadeeSfl #define	AUDIOHD_SDREG_OFFSET_FIFOSIZE		0x10
247582eadeeSfl #define	AUDIOHD_SDREG_OFFSET_FORMAT		0x12
248582eadeeSfl #define	AUDIOHD_SDREG_OFFSET_BDLPL		0x18
249582eadeeSfl #define	AUDIOHD_SDREG_OFFSET_BDLPU		0x1c
250582eadeeSfl 
251582eadeeSfl /* bits for stream descriptor control reg */
252582eadeeSfl #define	AUDIOHDR_SD_CTL_DEIE		0x000010
253582eadeeSfl #define	AUDIOHDR_SD_CTL_FEIE		0x000008
254582eadeeSfl #define	AUDIOHDR_SD_CTL_IOCE		0x000004
255582eadeeSfl #define	AUDIOHDR_SD_CTL_SRUN		0x000002
256582eadeeSfl #define	AUDIOHDR_SD_CTL_SRST		0x000001
257582eadeeSfl 
258582eadeeSfl /* bits for stream descriptor status register */
259582eadeeSfl #define	AUDIOHDR_SD_STS_BCIS		0x0004
260582eadeeSfl #define	AUDIOHDR_SD_STS_FIFOE		0x0008
261582eadeeSfl #define	AUDIOHDR_SD_STS_DESE		0x0010
262582eadeeSfl #define	AUDIOHDR_SD_STS_FIFORY		0x0020
263582eadeeSfl #define	AUDIOHDR_SD_STS_INTRS	\
264582eadeeSfl 	(AUDIOHDR_SD_STS_BCIS | \
265582eadeeSfl 	AUDIOHDR_SD_STS_FIFOE |	\
266582eadeeSfl 	AUDIOHDR_SD_STS_DESE)
267582eadeeSfl 
268582eadeeSfl /* bits for GCTL register */
269582eadeeSfl #define	AUDIOHDR_GCTL_CRST		0x00000001
270582eadeeSfl #define	AUDIOHDR_GCTL_URESPE		0x00000100
271582eadeeSfl 
272582eadeeSfl /* bits for CORBRP register */
273582eadeeSfl #define	AUDIOHDR_CORBRP_RESET		0x8000
274582eadeeSfl #define	AUDIOHDR_CORBRP_WPTR		0x00ff
275582eadeeSfl 
276582eadeeSfl /* bits for CORBCTL register */
277582eadeeSfl #define	AUDIOHDR_CORBCTL_CMEIE		0x01
278582eadeeSfl #define	AUDIOHDR_CORBCTL_DMARUN		0x02
279582eadeeSfl 
280582eadeeSfl /* bits for CORB SIZE register */
281582eadeeSfl #define	AUDIOHDR_CORBSZ_8		0
282582eadeeSfl #define	AUDIOHDR_CORBSZ_16		1
283582eadeeSfl #define	AUDIOHDR_CORBSZ_256		2
284582eadeeSfl 
285582eadeeSfl /* bits for RIRBCTL register */
286582eadeeSfl #define	AUDIOHDR_RIRBCTL_RINTCTL	0x01
287582eadeeSfl #define	AUDIOHDR_RIRBCTL_DMARUN		0x02
288582eadeeSfl #define	AUDIOHDR_RIRBCTL_RIRBOIC	0x04
2893a49c214SYang-Rong Jerry Zhou #define	AUDIOHDR_RIRBCTL_RSTINT		0xfe
290582eadeeSfl 
291582eadeeSfl /* bits for RIRBWP register */
292582eadeeSfl #define	AUDIOHDR_RIRBWP_RESET		0x8000
293582eadeeSfl #define	AUDIOHDR_RIRBWP_WPTR		0x00ff
294582eadeeSfl 
295582eadeeSfl /* bits for RIRB SIZE register */
296582eadeeSfl #define	AUDIOHDR_RIRBSZ_8		0
297582eadeeSfl #define	AUDIOHDR_RIRBSZ_16		1
298582eadeeSfl #define	AUDIOHDR_RIRBSZ_256		2
299582eadeeSfl 
300582eadeeSfl #define	AUDIOHD_BDLE_RIRB_SDI		0x0000000f
301582eadeeSfl #define	AUDIOHD_BDLE_RIRB_UNSOLICIT	0x00000010
302582eadeeSfl 
303582eadeeSfl /* HD spec: ID of Root node is 0 */
304582eadeeSfl #define	AUDIOHDC_NODE_ROOT		0x00
305582eadeeSfl 
306582eadeeSfl /* HD spec: ID of audio function group is "1" */
307582eadeeSfl #define	AUDIOHDC_AUDIO_FUNC_GROUP	1
308582eadeeSfl 
3095d06ce36Scg /*
3105d06ce36Scg  * HD audio verbs can be either 12-bit or 4-bit in length.
3115d06ce36Scg  */
3125d06ce36Scg #define	AUDIOHDC_12BIT_VERB_MASK	0xfffff000
3135d06ce36Scg #define	AUDIOHDC_4BIT_VERB_MASK		0xfffffff0
3145d06ce36Scg 
31542c41cf8Slipeng sang - Sun Microsystems - Beijing China #define	AUDIOHDC_SAMPR48000		48000
31642c41cf8Slipeng sang - Sun Microsystems - Beijing China #define	AUDIOHDC_MAX_BEEP_GEN		12000
31742c41cf8Slipeng sang - Sun Microsystems - Beijing China #define	AUDIOHDC_MIX_BEEP_GEN		47
31842c41cf8Slipeng sang - Sun Microsystems - Beijing China #define	AUDIOHDC_MUTE_BEEP_GEN		0x0
31942c41cf8Slipeng sang - Sun Microsystems - Beijing China 
320582eadeeSfl /*
321582eadeeSfl  * 12-bit verbs
322582eadeeSfl  */
323582eadeeSfl #define	AUDIOHDC_VERB_GET_PARAM			0xf00
324582eadeeSfl 
325582eadeeSfl #define	AUDIOHDC_VERB_GET_CONN_SEL		0xf01
326582eadeeSfl #define	AUDIOHDC_VERB_SET_CONN_SEL		0x701
327582eadeeSfl 
328582eadeeSfl #define	AUDIOHDC_VERB_GET_CONN_LIST_ENT		0xf02
329582eadeeSfl #define	AUDIOHDC_VERB_GET_PROCESS_STATE		0xf03
330582eadeeSfl #define	AUDIOHDC_VERB_GET_SDI_SEL		0xf04
3317253a143Scg 
332582eadeeSfl #define	AUDIOHDC_VERB_GET_POWER_STATE		0xf05
3337253a143Scg #define	AUDIOHDC_VERB_SET_POWER_STATE		0x705
334582eadeeSfl 
335582eadeeSfl #define	AUDIOHDC_VERB_GET_STREAM_CHANN		0xf06
336582eadeeSfl #define	AUDIOHDC_VERB_SET_STREAM_CHANN		0x706
337582eadeeSfl 
338582eadeeSfl #define	AUDIOHDC_VERB_GET_PIN_CTRL		0xf07
339582eadeeSfl #define	AUDIOHDC_VERB_SET_PIN_CTRL		0x707
340582eadeeSfl 
341582eadeeSfl #define	AUDIOHDC_VERB_GET_UNS_ENABLE		0xf08
342989b958fSZhao Edgar Liu - Sun Microsystems #define	AUDIOHDC_VERB_SET_UNS_ENABLE		0x708
3433a49c214SYang-Rong Jerry Zhou 
344989b958fSZhao Edgar Liu - Sun Microsystems #define	AUDIOHDC_VERB_GET_PIN_SENSE		0xf09
345582eadeeSfl #define	AUDIOHDC_VERB_GET_PIN_SENSE		0xf09
346644f3c1fScg #define	AUDIOHDC_VERB_EXEC_PIN_SENSE		0x709
3473a49c214SYang-Rong Jerry Zhou 
348582eadeeSfl #define	AUDIOHDC_VERB_GET_BEEP_GEN		0xf0a
34942c41cf8Slipeng sang - Sun Microsystems - Beijing China #define	AUDIOHDC_VERB_SET_BEEP_GEN		0x70a
3503a49c214SYang-Rong Jerry Zhou 
3513a49c214SYang-Rong Jerry Zhou #define	AUDIOHDC_VERB_GET_EAPD			0xf0c
3523a49c214SYang-Rong Jerry Zhou #define	AUDIOHDC_VERB_SET_EAPD			0x70c
3533a49c214SYang-Rong Jerry Zhou 
354582eadeeSfl #define	AUDIOHDC_VERB_GET_DEFAULT_CONF		0xf1c
35588447a05SGarrett D'Amore #define	AUDIOHDC_VERB_GET_SPDIF_CTL		0xf0d
35688447a05SGarrett D'Amore #define	AUDIOHDC_VERB_SET_SPDIF_LCL		0x70d
3573a49c214SYang-Rong Jerry Zhou 
35816600ba1SYang-Rong Jerry Zhou #define	AUDIOHDC_VERB_GET_GPIO_MASK		0xf16
35916600ba1SYang-Rong Jerry Zhou #define	AUDIOHDC_VERB_SET_GPIO_MASK		0x716
36016600ba1SYang-Rong Jerry Zhou 
361989b958fSZhao Edgar Liu - Sun Microsystems #define	AUDIOHDC_VERB_GET_UNSOL_ENABLE_MASK	0xf19
362989b958fSZhao Edgar Liu - Sun Microsystems #define	AUDIOHDC_VERB_SET_UNSOL_ENABLE_MASK	0x719
363989b958fSZhao Edgar Liu - Sun Microsystems 
36416600ba1SYang-Rong Jerry Zhou #define	AUDIOHDC_VERB_GET_GPIO_DIREC		0xf17
36516600ba1SYang-Rong Jerry Zhou #define	AUDIOHDC_VERB_SET_GPIO_DIREC		0x717
36616600ba1SYang-Rong Jerry Zhou 
367dfb9eac9SYang-Rong Jerry Zhou #define	AUDIOHDC_VERB_GET_GPIO_DATA		0xf15
368dfb9eac9SYang-Rong Jerry Zhou #define	AUDIOHDC_VERB_SET_GPIO_DATA		0x715
369dfb9eac9SYang-Rong Jerry Zhou 
370dfb9eac9SYang-Rong Jerry Zhou #define	AUDIOHDC_VERB_GET_GPIO_STCK		0xf1a
371dfb9eac9SYang-Rong Jerry Zhou #define	AUDIOHDC_VERB_SET_GPIO_STCK		0x71a
372dfb9eac9SYang-Rong Jerry Zhou 
37316600ba1SYang-Rong Jerry Zhou #define	AUDIOHDC_GPIO_ENABLE			0xff
374dfb9eac9SYang-Rong Jerry Zhou #define	AUDIOHDC_GPIO_DIRECT			0xf1
37516600ba1SYang-Rong Jerry Zhou 
376dfb9eac9SYang-Rong Jerry Zhou #define	AUDIOHDC_GPIO_DATA_CTRL			0xff
377dfb9eac9SYang-Rong Jerry Zhou #define	AUDIOHDC_GPIO_STCK_CTRL			0xff
378582eadeeSfl /*
379582eadeeSfl  * 4-bit verbs
380582eadeeSfl  */
381d5145224SYang-Rong Jerry Zhou #define	AUDIOHDC_VERB_GET_CONV_FMT		0xa
382d5145224SYang-Rong Jerry Zhou #define	AUDIOHDC_VERB_SET_CONV_FMT		0x2
383582eadeeSfl 
384582eadeeSfl #define	AUDIOHDC_VERB_GET_AMP_MUTE		0xb
385582eadeeSfl #define	AUDIOHDC_VERB_SET_AMP_MUTE		0x3
38642c41cf8Slipeng sang - Sun Microsystems - Beijing China #define	AUDIOHDC_VERB_SET_BEEP_VOL		0x3A0
387582eadeeSfl 
388582eadeeSfl /*
389582eadeeSfl  * parameters of nodes
390582eadeeSfl  */
391582eadeeSfl #define	AUDIOHDC_PAR_VENDOR_ID			0x00
392582eadeeSfl #define	AUDIOHDC_PAR_SUBSYS_ID			0x01
393582eadeeSfl #define	AUDIOHDC_PAR_REV_ID			0x02
394582eadeeSfl #define	AUDIOHDC_PAR_NODE_COUNT			0x04
395582eadeeSfl #define	AUDIOHDC_PAR_FUNCTION_TYPE		0x05
396582eadeeSfl #define	AUDIOHDC_PAR_AUDIO_FG_CAP		0x08
397582eadeeSfl #define	AUDIOHDC_PAR_AUDIO_WID_CAP		0x09
398582eadeeSfl #define	AUDIOHDC_PAR_PCM			0x0a
399582eadeeSfl #define	AUDIOHDC_PAR_STREAM			0x0b
400582eadeeSfl #define	AUDIOHDC_PAR_PIN_CAP			0x0c
4013a49c214SYang-Rong Jerry Zhou #define	AUDIOHDC_PAR_INAMP_CAP			0x0d
402582eadeeSfl #define	AUDIOHDC_PAR_CONNLIST_LEN		0x0e
403582eadeeSfl #define	AUDIOHDC_PAR_POWER_STATE		0x0f
404582eadeeSfl #define	AUDIOHDC_PAR_PROC_CAP			0x10
405582eadeeSfl #define	AUDIOHDC_PAR_GPIO_CAP			0x11
4063a49c214SYang-Rong Jerry Zhou #define	AUDIOHDC_PAR_OUTAMP_CAP			0x12
407582eadeeSfl 
408582eadeeSfl /*
409582eadeeSfl  * bits for get/set amplifier gain/mute
410582eadeeSfl  */
411582eadeeSfl #define	AUDIOHDC_AMP_SET_OUTPUT			0x8000
412582eadeeSfl #define	AUDIOHDC_AMP_SET_INPUT			0x4000
413582eadeeSfl #define	AUDIOHDC_AMP_SET_LEFT			0x2000
414582eadeeSfl #define	AUDIOHDC_AMP_SET_RIGHT			0x1000
415582eadeeSfl #define	AUDIOHDC_AMP_SET_MUTE			0x0080
4163a49c214SYang-Rong Jerry Zhou #define	AUDIOHDC_AMP_SET_LNR			0x3000
417a234d95bScg #define	AUDIOHDC_AMP_SET_LR_INPUT		0x7000
418a234d95bScg #define	AUDIOHDC_AMP_SET_LR_OUTPUT		0xb000
419a234d95bScg #define	AUDIOHDC_AMP_SET_INDEX_OFFSET		8
420582eadeeSfl #define	AUDIOHDC_AMP_SET_GAIN_MASK		0x007f
421582eadeeSfl #define	AUDIOHDC_GAIN_MAX			0x7f
422582eadeeSfl #define	AUDIOHDC_GAIN_BITS			7
423582eadeeSfl #define	AUDIOHDC_GAIN_DEFAULT			0x0f
424582eadeeSfl 
4253a49c214SYang-Rong Jerry Zhou #define	AUDIOHDC_AMP_GET_OUTPUT			0x8000
4263a49c214SYang-Rong Jerry Zhou #define	AUDIOHDC_AMP_GET_INPUT			0x0000
4273a49c214SYang-Rong Jerry Zhou 
4287253a143Scg /* value used to set max volume for left output */
4297253a143Scg #define	AUDIOHDC_AMP_LOUT_MAX	\
4307253a143Scg 	(AUDIOHDC_AMP_SET_OUTPUT | \
4317253a143Scg 	AUDIOHDC_AMP_SET_LEFT | \
4327253a143Scg 	AUDIOHDC_GAIN_MAX)
4337253a143Scg 
4347253a143Scg /* value used to set max volume for right output */
4357253a143Scg #define	AUDIOHDC_AMP_ROUT_MAX	\
4367253a143Scg 	(AUDIOHDC_AMP_SET_OUTPUT | \
4377253a143Scg 	AUDIOHDC_AMP_SET_RIGHT | \
4387253a143Scg 	AUDIOHDC_GAIN_MAX)
4397253a143Scg 
4407253a143Scg 
441582eadeeSfl /*
442582eadeeSfl  * Bits for pin widget control verb
443582eadeeSfl  */
444582eadeeSfl #define	AUDIOHDC_PIN_CONTROL_HP_ENABLE		0x80
445582eadeeSfl #define	AUDIOHDC_PIN_CONTROL_OUT_ENABLE		0x40
446582eadeeSfl #define	AUDIOHDC_PIN_CONTROL_IN_ENABLE		0x20
447582eadeeSfl 
448a234d95bScg /*
449a234d95bScg  * Bits for Amplifier capabilities
450a234d95bScg  */
451a234d95bScg #define	AUDIOHDC_AMP_CAP_MUTE_CAP		0x80000000
452a234d95bScg #define	AUDIOHDC_AMP_CAP_STEP_SIZE		0x007f0000
453a234d95bScg #define	AUDIOHDC_AMP_CAP_STEP_NUMS		0x00007f00
454a234d95bScg #define	AUDIOHDC_AMP_CAP_0DB_OFFSET		0x0000007f
455a234d95bScg 
456a234d95bScg 
457644f3c1fScg /*
4583a49c214SYang-Rong Jerry Zhou  * Bits for Audio Widget Capabilities
459644f3c1fScg  */
4603a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_WIDCAP_STEREO		0x00000001
4613a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_WIDCAP_INAMP		0x00000002
4623a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_WIDCAP_OUTAMP		0x00000004
4633a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_WIDCAP_AMP_OVRIDE	0x00000008
4643a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_WIDCAP_FMT_OVRIDE	0x00000010
4653a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_WIDCAP_STRIP		0x00000020
4663a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_WIDCAP_PROC_WID		0x00000040
4673a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_WIDCAP_UNSOL		0x00000080
4683a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_WIDCAP_CONNLIST		0x00000100
4693a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_WIDCAP_DIGIT		0x00000200
4703a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_WIDCAP_PWRCTRL		0x00000400
4713a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_WIDCAP_LRSWAP		0x00000800
4723a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_WIDCAP_TYPE		0x00f00000
4733a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_WIDCAP_TO_WIDTYPE(wcap)		\
4743a49c214SYang-Rong Jerry Zhou 	((wcap & AUDIOHD_WIDCAP_TYPE) >> 20)
475582eadeeSfl 
4763a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_CODEC_FAILURE	(uint32_t)(-1)
477582eadeeSfl 
478a33ad26eSZhao Edgar Liu - Sun Microsystems /* Higher sample/bits support */
479a33ad26eSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_BIT_DEPTH16	0x00020000
480a33ad26eSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_BIT_DEPTH24	0x00080000
481a33ad26eSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_SAMP_RATE48	0x00000040
482a33ad26eSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_SAMP_RATE96	0x00000100
483a33ad26eSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_SAMP_RATE192	0x00000400
484a33ad26eSZhao Edgar Liu - Sun Microsystems 
485582eadeeSfl /*
486582eadeeSfl  * buffer descriptor list entry of stream descriptor
487582eadeeSfl  */
488582eadeeSfl typedef struct {
489582eadeeSfl 	uint64_t	sbde_addr;
490582eadeeSfl 	uint32_t	sbde_len;
491582eadeeSfl 	uint32_t
492582eadeeSfl 		sbde_ioc: 1,
493582eadeeSfl 		reserved: 31;
494582eadeeSfl }sd_bdle_t;
495582eadeeSfl 
496582eadeeSfl 
497582eadeeSfl #define	AUDIOHD_PLAY_STARTED		0x00000001
498582eadeeSfl #define	AUDIOHD_PLAY_EMPTY		0x00000002
499582eadeeSfl #define	AUDIOHD_PLAY_PAUSED		0x00000004
500582eadeeSfl #define	AUDIOHD_RECORD_STARTED		0x00000008
501582eadeeSfl 
5023a49c214SYang-Rong Jerry Zhou enum audiohda_widget_type {
5033a49c214SYang-Rong Jerry Zhou 	WTYPE_AUDIO_OUT = 0,
5043a49c214SYang-Rong Jerry Zhou 	WTYPE_AUDIO_IN,
5053a49c214SYang-Rong Jerry Zhou 	WTYPE_AUDIO_MIX,
5063a49c214SYang-Rong Jerry Zhou 	WTYPE_AUDIO_SEL,
5073a49c214SYang-Rong Jerry Zhou 	WTYPE_PIN,
5083a49c214SYang-Rong Jerry Zhou 	WTYPE_POWER,
5093a49c214SYang-Rong Jerry Zhou 	WTYPE_VOL_KNOB,
5103a49c214SYang-Rong Jerry Zhou 	WTYPE_BEEP,
5113a49c214SYang-Rong Jerry Zhou 	WTYPE_VENDOR = 0xf
5123a49c214SYang-Rong Jerry Zhou };
5133a49c214SYang-Rong Jerry Zhou 
5143a49c214SYang-Rong Jerry Zhou enum audiohda_device_type {
5153a49c214SYang-Rong Jerry Zhou 	DTYPE_LINEOUT = 0,
5163a49c214SYang-Rong Jerry Zhou 	DTYPE_SPEAKER,
5173a49c214SYang-Rong Jerry Zhou 	DTYPE_HP_OUT,
5183a49c214SYang-Rong Jerry Zhou 	DTYPE_CD,
5193a49c214SYang-Rong Jerry Zhou 	DTYPE_SPDIF_OUT,
5203a49c214SYang-Rong Jerry Zhou 	DTYPE_DIGIT_OUT,
5213a49c214SYang-Rong Jerry Zhou 	DTYPE_MODEM_SIDE,
5223a49c214SYang-Rong Jerry Zhou 	DTYPE_MODEM_HNAD_SIDE,
5233a49c214SYang-Rong Jerry Zhou 	DTYPE_LINE_IN,
5243a49c214SYang-Rong Jerry Zhou 	DTYPE_AUX,
5253a49c214SYang-Rong Jerry Zhou 	DTYPE_MIC_IN,
5263a49c214SYang-Rong Jerry Zhou 	DTYPE_TEL,
5273a49c214SYang-Rong Jerry Zhou 	DTYPE_SPDIF_IN,
5283a49c214SYang-Rong Jerry Zhou 	DTYPE_DIGIT_IN,
5293a49c214SYang-Rong Jerry Zhou 	DTYPE_OTHER = 0x0f,
5303a49c214SYang-Rong Jerry Zhou };
5313a49c214SYang-Rong Jerry Zhou 
53288447a05SGarrett D'Amore enum audiohd_pin_color {
53388447a05SGarrett D'Amore 	AUDIOHD_PIN_UNKNOWN = 0,
53488447a05SGarrett D'Amore 	AUDIOHD_PIN_BLACK,
53588447a05SGarrett D'Amore 	AUDIOHD_PIN_GREY,
53688447a05SGarrett D'Amore 	AUDIOHD_PIN_BLUE,
53788447a05SGarrett D'Amore 	AUDIOHD_PIN_GREEN,
53888447a05SGarrett D'Amore 	AUDIOHD_PIN_RED,
53988447a05SGarrett D'Amore 	AUDIOHD_PIN_ORANGE,
54088447a05SGarrett D'Amore 	AUDIOHD_PIN_YELLOW,
54188447a05SGarrett D'Amore 	AUDIOHD_PIN_PURPLE,
54288447a05SGarrett D'Amore 	AUDIOHD_PIN_PINK,
54388447a05SGarrett D'Amore 	AUDIOHD_PIN_WHITE = 0xe,
54488447a05SGarrett D'Amore 	AUDIOHD_PIN_OTHER = 0xf,
54588447a05SGarrett D'Amore };
54688447a05SGarrett D'Amore 
5473a49c214SYang-Rong Jerry Zhou /* values for audiohd_widget.path_flags */
5483a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PATH_DAC	(1 << 0)
5493a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PATH_ADC	(1 << 1)
5503a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PATH_MON	(1 << 2)
5513a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_PATH_NOMON	(1 << 3)
55242c41cf8Slipeng sang - Sun Microsystems - Beijing China #define	AUDIOHD_PATH_BEEP	(1 << 4)
553*e7236f70SZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_PATH_LOOPBACK	(1 << 5)
5543a49c214SYang-Rong Jerry Zhou 
555cbe6566fSZhao Edgar Liu - Sun Microsystems typedef struct audiohd_path	audiohd_path_t;
5563a49c214SYang-Rong Jerry Zhou typedef struct audiohd_widget	audiohd_widget_t;
5573a49c214SYang-Rong Jerry Zhou typedef struct audiohd_state	audiohd_state_t;
558cbe6566fSZhao Edgar Liu - Sun Microsystems typedef struct audiohd_codec_info	audiohd_codec_info_t;
5593a49c214SYang-Rong Jerry Zhou typedef struct audiohd_pin	audiohd_pin_t;
5603a49c214SYang-Rong Jerry Zhou typedef struct hda_codec	hda_codec_t;
5613a49c214SYang-Rong Jerry Zhou typedef uint32_t	wid_t;		/* id of widget */
5623a49c214SYang-Rong Jerry Zhou typedef	struct audiohd_entry_prop	audiohd_entry_prop_t;
56388447a05SGarrett D'Amore typedef	enum audiohda_device_type	audiohda_device_type_t;
56488447a05SGarrett D'Amore typedef	enum audiohd_pin_color		audiohd_pin_color_t;
5653a49c214SYang-Rong Jerry Zhou 
5663a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_MAX_WIDGET		128
5673a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_MAX_CONN		16
5683a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_MAX_PINS		16
5693a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_MAX_DEPTH		8
5703a49c214SYang-Rong Jerry Zhou 
5713a49c214SYang-Rong Jerry Zhou struct audiohd_entry_prop {
5723a49c214SYang-Rong Jerry Zhou 	uint32_t	conn_len;
5733a49c214SYang-Rong Jerry Zhou 	uint32_t	mask_range;
5743a49c214SYang-Rong Jerry Zhou 	uint32_t	mask_wid;
5753a49c214SYang-Rong Jerry Zhou 	wid_t		input_wid;
5763a49c214SYang-Rong Jerry Zhou 	int		conns_per_entry;
5773a49c214SYang-Rong Jerry Zhou 	int		bits_per_conn;
5783a49c214SYang-Rong Jerry Zhou };
5793a49c214SYang-Rong Jerry Zhou struct audiohd_widget {
5803a49c214SYang-Rong Jerry Zhou 	wid_t		wid_wid;
5813a49c214SYang-Rong Jerry Zhou 	hda_codec_t	*codec;
5823a49c214SYang-Rong Jerry Zhou 	enum audiohda_widget_type type;
5833a49c214SYang-Rong Jerry Zhou 
5843a49c214SYang-Rong Jerry Zhou 	uint32_t	widget_cap;
5853a49c214SYang-Rong Jerry Zhou 	uint32_t	pcm_format;
5863a49c214SYang-Rong Jerry Zhou 	uint32_t	inamp_cap;
5873a49c214SYang-Rong Jerry Zhou 	uint32_t	outamp_cap;
5883a49c214SYang-Rong Jerry Zhou 
5893a49c214SYang-Rong Jerry Zhou 	uint32_t	path_flags;
5903a49c214SYang-Rong Jerry Zhou 
5913a49c214SYang-Rong Jerry Zhou 	int		out_weight;
5923a49c214SYang-Rong Jerry Zhou 	int		in_weight;
5933a49c214SYang-Rong Jerry Zhou 	int		finish;
5943a49c214SYang-Rong Jerry Zhou 
5953a49c214SYang-Rong Jerry Zhou 	/*
5963a49c214SYang-Rong Jerry Zhou 	 * available (input) connections. 0 means this widget
5973a49c214SYang-Rong Jerry Zhou 	 * has fixed connection
5983a49c214SYang-Rong Jerry Zhou 	 */
5993a49c214SYang-Rong Jerry Zhou 	int		nconns;
6003a49c214SYang-Rong Jerry Zhou 
601b96a6eceSZhao Edgar Liu - Sun Microsystems 	/*
602b96a6eceSZhao Edgar Liu - Sun Microsystems 	 * wid of possible & selected input & output connections
603b96a6eceSZhao Edgar Liu - Sun Microsystems 	 */
604b96a6eceSZhao Edgar Liu - Sun Microsystems 	wid_t		avail_conn[AUDIOHD_MAX_CONN];
605b96a6eceSZhao Edgar Liu - Sun Microsystems 	wid_t		output_path_next;	/* output pin -> DAC */
606b96a6eceSZhao Edgar Liu - Sun Microsystems 	wid_t		input_path_next;	/* ADC -> input pin */
607b96a6eceSZhao Edgar Liu - Sun Microsystems 	wid_t		monitor_path_next[AUDIOHD_MAX_CONN];
608b96a6eceSZhao Edgar Liu - Sun Microsystems 						/* output pin -> input pin */
609b96a6eceSZhao Edgar Liu - Sun Microsystems 	wid_t		beep_path_next;		/* output pin -> beep widget */
610*e7236f70SZhao Edgar Liu - Sun Microsystems 	wid_t		loopback_path_next;	/* ADC -> output pin */
611b96a6eceSZhao Edgar Liu - Sun Microsystems 
612b96a6eceSZhao Edgar Liu - Sun Microsystems 	uint16_t 	used;
613b96a6eceSZhao Edgar Liu - Sun Microsystems 
6143a49c214SYang-Rong Jerry Zhou 	/*
6153a49c214SYang-Rong Jerry Zhou 	 * pointer to struct depending on widget type:
616*e7236f70SZhao Edgar Liu - Sun Microsystems 	 *	1. DAC	audiohd_path_t
617*e7236f70SZhao Edgar Liu - Sun Microsystems 	 *	2. ADC	audiohd_path_t
6183a49c214SYang-Rong Jerry Zhou 	 *	3. PIN	audiohd_pin_t
6193a49c214SYang-Rong Jerry Zhou 	 */
6203a49c214SYang-Rong Jerry Zhou 	void	*priv;
6213a49c214SYang-Rong Jerry Zhou };
6223a49c214SYang-Rong Jerry Zhou 
6233a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_FLAG_LINEOUT		(1 << 0)
6243a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_FLAG_SPEAKER		(1 << 1)
6253a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_FLAG_HP			(1 << 2)
6263a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_FLAG_MONO		(1 << 3)
6273a49c214SYang-Rong Jerry Zhou 
6283a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_MAX_MIXER		5
6293a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_MAX_PIN			4
6303a49c214SYang-Rong Jerry Zhou 
63188447a05SGarrett D'Amore #define	PORT_DAC		0
63288447a05SGarrett D'Amore #define	PORT_ADC		1
63388447a05SGarrett D'Amore #define	PORT_MAX		2
63488447a05SGarrett D'Amore typedef enum {
63588447a05SGarrett D'Amore 	PLAY = 0,
63688447a05SGarrett D'Amore 	RECORD = 1,
63742c41cf8Slipeng sang - Sun Microsystems - Beijing China 	BEEP = 2,
638*e7236f70SZhao Edgar Liu - Sun Microsystems 	LOOPBACK = 3,
63988447a05SGarrett D'Amore } path_type_t;
6403a49c214SYang-Rong Jerry Zhou 
64188447a05SGarrett D'Amore struct audiohd_path {
64288447a05SGarrett D'Amore 	wid_t			adda_wid;
64342c41cf8Slipeng sang - Sun Microsystems - Beijing China 	wid_t			beep_wid;
6443a49c214SYang-Rong Jerry Zhou 
64588447a05SGarrett D'Amore 	wid_t			pin_wid[AUDIOHD_MAX_PINS];
64688447a05SGarrett D'Amore 	int			sum_selconn[AUDIOHD_MAX_PINS];
64788447a05SGarrett D'Amore 	int			mon_wid[AUDIOHD_MAX_PIN][AUDIOHD_MAX_MIXER];
64888447a05SGarrett D'Amore 	int			pin_nums;
64988447a05SGarrett D'Amore 	int			maxmixer[AUDIOHD_MAX_PINS];
6503a49c214SYang-Rong Jerry Zhou 
65188447a05SGarrett D'Amore 	path_type_t		path_type;
6523a49c214SYang-Rong Jerry Zhou 
65388447a05SGarrett D'Amore 	wid_t			mute_wid;
65488447a05SGarrett D'Amore 	int			mute_dir;
65588447a05SGarrett D'Amore 	wid_t			gain_wid;
65688447a05SGarrett D'Amore 	int			gain_dir;
65788447a05SGarrett D'Amore 	uint32_t		gain_bits;
6583a49c214SYang-Rong Jerry Zhou 
65988447a05SGarrett D'Amore 	uint32_t		pin_outputs;
66088447a05SGarrett D'Amore 	uint8_t			tag;
6613a49c214SYang-Rong Jerry Zhou 
66288447a05SGarrett D'Amore 	hda_codec_t		*codec;
6633a49c214SYang-Rong Jerry Zhou 
66488447a05SGarrett D'Amore 	wid_t			sum_wid;
6653a49c214SYang-Rong Jerry Zhou 
66688447a05SGarrett D'Amore 	audiohd_state_t		*statep;
6673a49c214SYang-Rong Jerry Zhou };
6683a49c214SYang-Rong Jerry Zhou 
66988447a05SGarrett D'Amore typedef struct audiohd_port
67088447a05SGarrett D'Amore {
67188447a05SGarrett D'Amore 	uint8_t			nchan;
67288447a05SGarrett D'Amore 	int			index;
67388447a05SGarrett D'Amore 	uint16_t		regoff;
67488447a05SGarrett D'Amore 
67588447a05SGarrett D'Amore 	unsigned		nframes;
67668c47f65SGarrett D'Amore 	size_t			bufsize;
67768c47f65SGarrett D'Amore 	size_t			fragsize;
67888447a05SGarrett D'Amore 	uint64_t		count;
67988447a05SGarrett D'Amore 	int			curpos;
68088447a05SGarrett D'Amore 
68188447a05SGarrett D'Amore 	uint_t			format;
68288447a05SGarrett D'Amore 	unsigned		sync_dir;
68388447a05SGarrett D'Amore 
68488447a05SGarrett D'Amore 	ddi_dma_handle_t	samp_dmah;
68588447a05SGarrett D'Amore 	ddi_acc_handle_t	samp_acch;
68688447a05SGarrett D'Amore 	caddr_t			samp_kaddr;
68788447a05SGarrett D'Amore 	uint64_t		samp_paddr;
68888447a05SGarrett D'Amore 
68988447a05SGarrett D'Amore 	ddi_dma_handle_t	bdl_dmah;
69088447a05SGarrett D'Amore 	ddi_acc_handle_t	bdl_acch;
69188447a05SGarrett D'Amore 	size_t			bdl_size;
69288447a05SGarrett D'Amore 	caddr_t			bdl_kaddr;
69388447a05SGarrett D'Amore 	uint64_t		bdl_paddr;
69488447a05SGarrett D'Amore 
69588447a05SGarrett D'Amore 	audio_engine_t		*engine;
69688447a05SGarrett D'Amore 	audiohd_state_t		*statep;
69788447a05SGarrett D'Amore }audiohd_port_t;
69888447a05SGarrett D'Amore 
699c1cfefcdSZhao Edgar Liu - Sun Microsystems enum {
700c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_VOLUME = 0,
701c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_FRONT,
702c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_SPEAKER,
703c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_HEADPHONE,
704c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_REAR,
705c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_CENTER,
706c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_SURROUND,
707c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_LFE,
708c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_IGAIN,
709c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_LINEIN,
710c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_MIC,
711c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_CD,
712c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_MONGAIN,
713c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_MONSRC,
714c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_RECSRC,
715c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_BEEP,
716*e7236f70SZhao Edgar Liu - Sun Microsystems 	CTL_LOOP,
717c1cfefcdSZhao Edgar Liu - Sun Microsystems 
718c1cfefcdSZhao Edgar Liu - Sun Microsystems 	/* this one must be last */
719c1cfefcdSZhao Edgar Liu - Sun Microsystems 	CTL_MAX
720c1cfefcdSZhao Edgar Liu - Sun Microsystems };
721c1cfefcdSZhao Edgar Liu - Sun Microsystems 
72288447a05SGarrett D'Amore typedef struct audiohd_ctrl
72388447a05SGarrett D'Amore {
72488447a05SGarrett D'Amore 	audiohd_state_t		*statep;
72588447a05SGarrett D'Amore 	audio_ctrl_t		*ctrl;
726c1cfefcdSZhao Edgar Liu - Sun Microsystems 	int			num;
72788447a05SGarrett D'Amore 	uint64_t		val;
72888447a05SGarrett D'Amore } audiohd_ctrl_t;
72988447a05SGarrett D'Amore 
7303a49c214SYang-Rong Jerry Zhou struct audiohd_pin {
7313a49c214SYang-Rong Jerry Zhou 	audiohd_pin_t	*next;
7323a49c214SYang-Rong Jerry Zhou 	wid_t		wid;
7333a49c214SYang-Rong Jerry Zhou 	wid_t		mute_wid;	/* node used to mute this pin */
7343a49c214SYang-Rong Jerry Zhou 	int		mute_dir;	/* 1: input, 2: output */
7353a49c214SYang-Rong Jerry Zhou 	wid_t		gain_wid;	/* node for gain control */
7363a49c214SYang-Rong Jerry Zhou 	int		gain_dir;	/* _OUTPUT/_INPUT */
7373a49c214SYang-Rong Jerry Zhou 	uint32_t	gain_bits;
7383a49c214SYang-Rong Jerry Zhou 
739d5145224SYang-Rong Jerry Zhou 	uint8_t		vrefvalue;	/* value of VRef */
740d5145224SYang-Rong Jerry Zhou 
7413a49c214SYang-Rong Jerry Zhou 	uint32_t	cap;
7423a49c214SYang-Rong Jerry Zhou 	uint32_t	config;
7433a49c214SYang-Rong Jerry Zhou 	uint32_t	ctrl;
7443a49c214SYang-Rong Jerry Zhou 	uint32_t	assoc;
7453a49c214SYang-Rong Jerry Zhou 	uint32_t	seq;
746*e7236f70SZhao Edgar Liu - Sun Microsystems 	wid_t		adc_wid;
747*e7236f70SZhao Edgar Liu - Sun Microsystems 	wid_t		dac_wid;
74842c41cf8Slipeng sang - Sun Microsystems - Beijing China 	wid_t		beep_wid;
7493a49c214SYang-Rong Jerry Zhou 	int		no_phys_conn;
75088447a05SGarrett D'Amore 	enum audiohda_device_type	device;
75188447a05SGarrett D'Amore 
7523a49c214SYang-Rong Jerry Zhou 	/*
7533a49c214SYang-Rong Jerry Zhou 	 * mg_dir, mg_gain, mg_wid are used to store the monitor gain control
7543a49c214SYang-Rong Jerry Zhou 	 * widget wid.
7553a49c214SYang-Rong Jerry Zhou 	 */
7563a49c214SYang-Rong Jerry Zhou 	int		mg_dir[AUDIOHD_MAX_CONN];
7573a49c214SYang-Rong Jerry Zhou 	int		mg_gain[AUDIOHD_MAX_CONN];
7583a49c214SYang-Rong Jerry Zhou 	int		mg_wid[AUDIOHD_MAX_CONN];
7593a49c214SYang-Rong Jerry Zhou 	int		num;
7603a49c214SYang-Rong Jerry Zhou 	int		finish;
7613a49c214SYang-Rong Jerry Zhou 
7623a49c214SYang-Rong Jerry Zhou };
7633a49c214SYang-Rong Jerry Zhou 
764582eadeeSfl typedef struct {
765582eadeeSfl 	ddi_dma_handle_t	ad_dmahdl;
766582eadeeSfl 	ddi_acc_handle_t	ad_acchdl;
76788447a05SGarrett D'Amore 	caddr_t			ad_vaddr;	/* virtual addr */
76888447a05SGarrett D'Amore 	uint64_t		ad_paddr;	/* physical addr */
76988447a05SGarrett D'Amore 	size_t			ad_req_sz;	/* required size of memory */
77088447a05SGarrett D'Amore 	size_t			ad_real_sz;	/* real size of memory */
771582eadeeSfl } audiohd_dma_t;
772582eadeeSfl 
7733a49c214SYang-Rong Jerry Zhou struct hda_codec {
7743a49c214SYang-Rong Jerry Zhou 	uint8_t		index;		/* codec address */
7753a49c214SYang-Rong Jerry Zhou 	uint32_t	vid;		/* vendor id and device id */
7763a49c214SYang-Rong Jerry Zhou 	uint32_t	revid;		/* revision id */
7773a49c214SYang-Rong Jerry Zhou 	wid_t		wid_afg;	/* id of AFG */
7783a49c214SYang-Rong Jerry Zhou 	wid_t		first_wid;	/* wid of 1st subnode of AFG */
7793a49c214SYang-Rong Jerry Zhou 	wid_t		last_wid;	/* wid of the last subnode of AFG */
7803a49c214SYang-Rong Jerry Zhou 	int		nnodes;		/* # of subnodes of AFG */
78116600ba1SYang-Rong Jerry Zhou 	uint8_t		nistream;
7823a49c214SYang-Rong Jerry Zhou 
7833a49c214SYang-Rong Jerry Zhou 	uint32_t	outamp_cap;
7843a49c214SYang-Rong Jerry Zhou 	uint32_t	inamp_cap;
7853a49c214SYang-Rong Jerry Zhou 	uint32_t	stream_format;
7863a49c214SYang-Rong Jerry Zhou 	uint32_t	pcm_format;
7873a49c214SYang-Rong Jerry Zhou 
788ea463888SZhao Edgar Liu - Sun Microsystems 	audiohd_state_t		*statep;
789cbe6566fSZhao Edgar Liu - Sun Microsystems 	audiohd_codec_info_t	*codec_info;
7903a49c214SYang-Rong Jerry Zhou 
7913a49c214SYang-Rong Jerry Zhou 	/* use wid as index to the array of widget pointers */
7923a49c214SYang-Rong Jerry Zhou 	audiohd_widget_t	*widget[AUDIOHD_MAX_WIDGET];
79388447a05SGarrett D'Amore 
79488447a05SGarrett D'Amore 	audiohd_port_t		*port[AUDIOHD_PORT_MAX];
79588447a05SGarrett D'Amore 	uint8_t			portnum;
7963a49c214SYang-Rong Jerry Zhou 	audiohd_pin_t		*first_pin;
7973a49c214SYang-Rong Jerry Zhou };
7983a49c214SYang-Rong Jerry Zhou 
79988447a05SGarrett D'Amore #define	AUDIOHD_MAX_ASSOC	15
8004ebb14b2Sfrits struct audiohd_state {
801582eadeeSfl 	dev_info_t	*hda_dip;
802582eadeeSfl 	kstat_t		*hda_ksp;
803582eadeeSfl 	kmutex_t	hda_mutex;
804582eadeeSfl 	uint32_t	hda_flags;
805582eadeeSfl 
806c7b817cfSZhao Edgar Liu - Sun Microsystems 	caddr_t			hda_reg_base;
807c7b817cfSZhao Edgar Liu - Sun Microsystems 	ddi_acc_handle_t	hda_pci_handle;
808c7b817cfSZhao Edgar Liu - Sun Microsystems 	ddi_acc_handle_t	hda_reg_handle;
809368517c9SYang-Rong Jerry Zhou 
810582eadeeSfl 	audiohd_dma_t	hda_dma_corb;
811582eadeeSfl 	audiohd_dma_t	hda_dma_rirb;
812582eadeeSfl 
813582eadeeSfl 	uint8_t		hda_rirb_rp;		/* read pointer for rirb */
814582eadeeSfl 	uint16_t	hda_codec_mask;
815582eadeeSfl 
81688447a05SGarrett D'Amore 	audio_dev_t	*adev;
81789e1f902SZhao Edgar Liu - Sun Microsystems 	uint32_t	devid;
81888447a05SGarrett D'Amore 
81988447a05SGarrett D'Amore 	int		hda_input_streams;	/* # of input stream */
82088447a05SGarrett D'Amore 	int		hda_output_streams;	/* # of output stream */
82188447a05SGarrett D'Amore 	int		hda_streams_nums;	/* # of stream */
82288447a05SGarrett D'Amore 
82388447a05SGarrett D'Amore 	uint_t		hda_play_regbase;
82488447a05SGarrett D'Amore 	uint_t		hda_record_regbase;
82588447a05SGarrett D'Amore 
826a234d95bScg 	uint_t		hda_play_stag;		/* tag of playback stream */
827582eadeeSfl 	uint_t		hda_record_stag;	/* tag of record stream */
828a234d95bScg 	uint_t		hda_play_lgain;		/* left gain for playback */
829a234d95bScg 	uint_t		hda_play_rgain;		/* right gain for playback */
830d5247f45Sgs 
8313a49c214SYang-Rong Jerry Zhou 	/*
8323a49c214SYang-Rong Jerry Zhou 	 * Now, for the time being, we add some fields
8333a49c214SYang-Rong Jerry Zhou 	 * for parsing codec topology
8343a49c214SYang-Rong Jerry Zhou 	 */
8353a49c214SYang-Rong Jerry Zhou 	hda_codec_t	*codec[AUDIOHD_CODEC_MAX];
836b96a6eceSZhao Edgar Liu - Sun Microsystems 
8373a49c214SYang-Rong Jerry Zhou 	/*
8383a49c214SYang-Rong Jerry Zhou 	 * Suspend/Resume used fields
8393a49c214SYang-Rong Jerry Zhou 	 */
8403a49c214SYang-Rong Jerry Zhou 	boolean_t	suspended;
84188447a05SGarrett D'Amore 
84288447a05SGarrett D'Amore 	audiohd_path_t	*path[AUDIOHD_PORT_MAX];
84388447a05SGarrett D'Amore 	uint8_t		pathnum;
84488447a05SGarrett D'Amore 	audiohd_port_t	*port[PORT_MAX];
84588447a05SGarrett D'Amore 	uint8_t		pchan;
84688447a05SGarrett D'Amore 	uint8_t		rchan;
84788447a05SGarrett D'Amore 
84888447a05SGarrett D'Amore 	uint64_t	inmask;
84988447a05SGarrett D'Amore 
85088447a05SGarrett D'Amore 	uint_t		hda_out_ports;
85188447a05SGarrett D'Amore 	uint_t		in_port;
85288447a05SGarrett D'Amore 
853a33ad26eSZhao Edgar Liu - Sun Microsystems 	/* Higher sample/rate */
854a33ad26eSZhao Edgar Liu - Sun Microsystems 	uint32_t	sample_rate;
855a33ad26eSZhao Edgar Liu - Sun Microsystems 	uint32_t	sample_bit_depth;
856a33ad26eSZhao Edgar Liu - Sun Microsystems 	uint8_t		sample_packed_bytes;
857a33ad26eSZhao Edgar Liu - Sun Microsystems 
85888447a05SGarrett D'Amore 	/*
85988447a05SGarrett D'Amore 	 * Controls
86088447a05SGarrett D'Amore 	 */
861*e7236f70SZhao Edgar Liu - Sun Microsystems 	audiohd_ctrl_t	ctrls[CTL_MAX];
862*e7236f70SZhao Edgar Liu - Sun Microsystems 	boolean_t	monitor_supported;
863*e7236f70SZhao Edgar Liu - Sun Microsystems 	boolean_t	loopback_supported;
86488447a05SGarrett D'Amore 
86588447a05SGarrett D'Amore 	/* for multichannel */
86688447a05SGarrett D'Amore 	uint8_t			chann[AUDIOHD_MAX_ASSOC];
86788447a05SGarrett D'Amore 	uint8_t			assoc;
8684ebb14b2Sfrits 
869582eadeeSfl };
870582eadeeSfl 
871cbe6566fSZhao Edgar Liu - Sun Microsystems struct audiohd_codec_info {
872cbe6566fSZhao Edgar Liu - Sun Microsystems 	uint32_t	devid;
873cbe6566fSZhao Edgar Liu - Sun Microsystems 	const char	*buf;
874cbe6566fSZhao Edgar Liu - Sun Microsystems 	uint32_t	flags;
875cbe6566fSZhao Edgar Liu - Sun Microsystems };
876a234d95bScg 
877582eadeeSfl /*
878582eadeeSfl  * Operation for high definition audio control system bus
879582eadeeSfl  * interface registers
880582eadeeSfl  */
881582eadeeSfl #define	AUDIOHD_REG_GET8(reg)	\
882582eadeeSfl 	ddi_get8(statep->hda_reg_handle, \
883582eadeeSfl 	(void *)((char *)statep->hda_reg_base + (reg)))
884582eadeeSfl 
885582eadeeSfl #define	AUDIOHD_REG_GET16(reg)	\
886582eadeeSfl 	ddi_get16(statep->hda_reg_handle, \
887582eadeeSfl 	(void *)((char *)statep->hda_reg_base + (reg)))
888582eadeeSfl 
889582eadeeSfl #define	AUDIOHD_REG_GET32(reg)	\
890582eadeeSfl 	ddi_get32(statep->hda_reg_handle, \
891582eadeeSfl 	(void *)((char *)statep->hda_reg_base + (reg)))
892582eadeeSfl 
893582eadeeSfl #define	AUDIOHD_REG_GET64(reg)	\
894582eadeeSfl 	ddi_get64(statep->hda_reg_handle, \
895582eadeeSfl 	(void *)((char *)statep->hda_reg_base + (reg)))
896582eadeeSfl 
897582eadeeSfl #define	AUDIOHD_REG_SET8(reg, val)	\
898582eadeeSfl 	ddi_put8(statep->hda_reg_handle, \
899582eadeeSfl 	(void *)((char *)statep->hda_reg_base + (reg)), (val))
900582eadeeSfl 
901582eadeeSfl #define	AUDIOHD_REG_SET16(reg, val)	\
902582eadeeSfl 	ddi_put16(statep->hda_reg_handle, \
903582eadeeSfl 	(void *)((char *)statep->hda_reg_base + (reg)), (val))
904582eadeeSfl 
905582eadeeSfl #define	AUDIOHD_REG_SET32(reg, val)	\
906582eadeeSfl 	ddi_put32(statep->hda_reg_handle, \
907582eadeeSfl 	(void *)((char *)statep->hda_reg_base + (reg)), (val))
908582eadeeSfl 
909582eadeeSfl #define	AUDIOHD_REG_SET64(reg, val)	\
910582eadeeSfl 	ddi_put64(statep->hda_reg_handle, \
911582eadeeSfl 	(void *)((char *)statep->hda_reg_base + (reg)), (val))
912582eadeeSfl 
913582eadeeSfl 
9147253a143Scg /*
9157253a143Scg  * enable a pin widget to input
9167253a143Scg  */
9173a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_ENABLE_PIN_IN(statep, caddr, wid) \
9187253a143Scg { \
9193a49c214SYang-Rong Jerry Zhou 	(void) audioha_codec_verb_get(statep, caddr, wid, \
9207253a143Scg 	    AUDIOHDC_VERB_SET_PIN_CTRL, AUDIOHDC_PIN_CONTROL_IN_ENABLE | 4); \
9217253a143Scg }
9227253a143Scg 
9237253a143Scg /*
9247253a143Scg  * disable input pin
9257253a143Scg  */
9263a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_DISABLE_PIN_IN(statep, caddr, wid) \
9277253a143Scg { \
9287253a143Scg 	uint32_t	lTmp; \
9297253a143Scg \
9303a49c214SYang-Rong Jerry Zhou 	lTmp = audioha_codec_verb_get(statep, caddr, wid, \
9317253a143Scg 	    AUDIOHDC_VERB_GET_PIN_CTRL, 0); \
9327253a143Scg 	if (lTmp == AUDIOHD_CODEC_FAILURE) \
933c6e681c0SYang-Rong Jerry Zhou 		return (DDI_FAILURE); \
9343a49c214SYang-Rong Jerry Zhou 	lTmp = audioha_codec_verb_get(statep, caddr, wid, \
9357253a143Scg 	    AUDIOHDC_VERB_SET_PIN_CTRL, \
9367253a143Scg 	    (lTmp & ~AUDIOHDC_PIN_CONTROL_IN_ENABLE)); \
9377253a143Scg 	if (lTmp == AUDIOHD_CODEC_FAILURE) \
938c6e681c0SYang-Rong Jerry Zhou 		return (DDI_FAILURE); \
9397253a143Scg }
9407253a143Scg 
9417253a143Scg /*
9427253a143Scg  * unmute an output pin
9437253a143Scg  */
9443a49c214SYang-Rong Jerry Zhou #define	AUDIOHD_NODE_UNMUTE_OUT(statep, caddr, wid) \
9457253a143Scg { \
9467253a143Scg 	if (audioha_codec_4bit_verb_get(statep, \
9473a49c214SYang-Rong Jerry Zhou 	    caddr, wid, AUDIOHDC_VERB_SET_AMP_MUTE, \
9487253a143Scg 	    AUDIOHDC_AMP_SET_LR_OUTPUT | AUDIOHDC_GAIN_MAX) == \
9497253a143Scg 	    AUDIOHD_CODEC_FAILURE) \
950c6e681c0SYang-Rong Jerry Zhou 		return (DDI_FAILURE); \
9517253a143Scg }
9527253a143Scg 
953c7b817cfSZhao Edgar Liu - Sun Microsystems /*
954c7b817cfSZhao Edgar Liu - Sun Microsystems  * check volume adjust value of 2 channels control
955c7b817cfSZhao Edgar Liu - Sun Microsystems  */
956c7b817cfSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_CHECK_2CHANNELS_VOLUME(value) \
957c7b817cfSZhao Edgar Liu - Sun Microsystems { \
958c7b817cfSZhao Edgar Liu - Sun Microsystems 	if ((value) & ~0xffff) \
959c7b817cfSZhao Edgar Liu - Sun Microsystems 		return (EINVAL); \
960c7b817cfSZhao Edgar Liu - Sun Microsystems 	if ((((value) & 0xff00) >> 8) > 100 || \
961c7b817cfSZhao Edgar Liu - Sun Microsystems 	    ((value) & 0xff) > 100) \
962c7b817cfSZhao Edgar Liu - Sun Microsystems 		return (EINVAL); \
963c7b817cfSZhao Edgar Liu - Sun Microsystems }
964c7b817cfSZhao Edgar Liu - Sun Microsystems 
965c7b817cfSZhao Edgar Liu - Sun Microsystems /*
966c7b817cfSZhao Edgar Liu - Sun Microsystems  * check volume adjust value of mono channel control
967c7b817cfSZhao Edgar Liu - Sun Microsystems  */
968c7b817cfSZhao Edgar Liu - Sun Microsystems #define	AUDIOHD_CHECK_CHANNEL_VOLUME(value) \
969c7b817cfSZhao Edgar Liu - Sun Microsystems { \
970c7b817cfSZhao Edgar Liu - Sun Microsystems 	if ((value) & ~0xff) \
971c7b817cfSZhao Edgar Liu - Sun Microsystems 		return (EINVAL); \
972c7b817cfSZhao Edgar Liu - Sun Microsystems 	if (((value) & 0xff) > 100) \
973c7b817cfSZhao Edgar Liu - Sun Microsystems 		return (EINVAL); \
974c7b817cfSZhao Edgar Liu - Sun Microsystems }
975c7b817cfSZhao Edgar Liu - Sun Microsystems 
976582eadeeSfl #ifdef __cplusplus
977582eadeeSfl }
978582eadeeSfl #endif
979582eadeeSfl 
980ea463888SZhao Edgar Liu - Sun Microsystems /* Warlock annotation */
981ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(audiohd_ctrl::statep))
982ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(audiohd_state::inmask))
983ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(audiohd_state::adev))
984ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(audiohd_state::sample_bit_depth))
985ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(audiohd_state::sample_rate))
986ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(READ_ONLY_DATA(audiohd_state::hda_reg_handle))
987ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(audiohd_widget::codec))
988ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(audiohd_widget::wid_wid))
989ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(hda_codec::index))
990ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(hda_codec::statep))
991ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(hda_codec::vid))
992ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(audiohd_port::nchan))
993ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(audiohd_port::statep))
994ea463888SZhao Edgar Liu - Sun Microsystems _NOTE(DATA_READABLE_WITHOUT_LOCK(audiohd_port::sync_dir))
995ea463888SZhao Edgar Liu - Sun Microsystems 
996582eadeeSfl #endif	/* _SYS_AUDIOHD_IMPL_H_ */
997