1*f6929eceSGarrett D'Amore /*
2*f6929eceSGarrett D'Amore  * CDDL HEADER START
3*f6929eceSGarrett D'Amore  *
4*f6929eceSGarrett D'Amore  * The contents of this file are subject to the terms of the
5*f6929eceSGarrett D'Amore  * Common Development and Distribution License (the "License").
6*f6929eceSGarrett D'Amore  * You may not use this file except in compliance with the License.
7*f6929eceSGarrett D'Amore  *
8*f6929eceSGarrett D'Amore  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*f6929eceSGarrett D'Amore  * or http://www.opensolaris.org/os/licensing.
10*f6929eceSGarrett D'Amore  * See the License for the specific language governing permissions
11*f6929eceSGarrett D'Amore  * and limitations under the License.
12*f6929eceSGarrett D'Amore  *
13*f6929eceSGarrett D'Amore  * When distributing Covered Code, include this CDDL HEADER in each
14*f6929eceSGarrett D'Amore  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*f6929eceSGarrett D'Amore  * If applicable, add the following below this CDDL HEADER, with the
16*f6929eceSGarrett D'Amore  * fields enclosed by brackets "[]" replaced with your own identifying
17*f6929eceSGarrett D'Amore  * information: Portions Copyright [yyyy] [name of copyright owner]
18*f6929eceSGarrett D'Amore  *
19*f6929eceSGarrett D'Amore  * CDDL HEADER END
20*f6929eceSGarrett D'Amore  */
21*f6929eceSGarrett D'Amore 
22*f6929eceSGarrett D'Amore /*
23*f6929eceSGarrett D'Amore  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24*f6929eceSGarrett D'Amore  * Use is subject to license terms.
25*f6929eceSGarrett D'Amore  */
26*f6929eceSGarrett D'Amore 
27*f6929eceSGarrett D'Amore /*
28*f6929eceSGarrett D'Amore  * Purpose: Definitions for the CMedia 8788 driver.
29*f6929eceSGarrett D'Amore  */
30*f6929eceSGarrett D'Amore /*
31*f6929eceSGarrett D'Amore  * This file is part of Open Sound System
32*f6929eceSGarrett D'Amore  *
33*f6929eceSGarrett D'Amore  * Copyright (C) 4Front Technologies 1996-2011.
34*f6929eceSGarrett D'Amore  *
35*f6929eceSGarrett D'Amore  * This software is released under CDDL 1.0 source license.
36*f6929eceSGarrett D'Amore  * See the COPYING file included in the main directory of this source
37*f6929eceSGarrett D'Amore  * distribution for the license terms and conditions.
38*f6929eceSGarrett D'Amore  */
39*f6929eceSGarrett D'Amore #ifndef	CMEDIAHD_H
40*f6929eceSGarrett D'Amore #define	CMEDIAHD_H
41*f6929eceSGarrett D'Amore 
42*f6929eceSGarrett D'Amore #define	CMEDIAHD_NAME		"audiocmihd"
43*f6929eceSGarrett D'Amore 
44*f6929eceSGarrett D'Amore #define	CMEDIAHD_NUM_PORTC		2
45*f6929eceSGarrett D'Amore #define	CMEDIAHD_PLAY			0
46*f6929eceSGarrett D'Amore #define	CMEDIAHD_REC			1
47*f6929eceSGarrett D'Amore 
48*f6929eceSGarrett D'Amore /*
49*f6929eceSGarrett D'Amore  * Number of fragments must be multiple of 2 because the
50*f6929eceSGarrett D'Amore  * hardware supports only full and half buffer interrupts. In
51*f6929eceSGarrett D'Amore  * addition it looks like 8 fragments is the minimum.
52*f6929eceSGarrett D'Amore  */
53*f6929eceSGarrett D'Amore #define	CMEDIAHD_BUF_LEN		(65536)
54*f6929eceSGarrett D'Amore 
55*f6929eceSGarrett D'Amore #define	PCI_VENDOR_ID_CMEDIA 		0x13F6
56*f6929eceSGarrett D'Amore #define	PCI_DEVICE_ID_CMEDIAHD		0x8788
57*f6929eceSGarrett D'Amore 
58*f6929eceSGarrett D'Amore #define	CMEDIAHD_MAX_INTRS		512
59*f6929eceSGarrett D'Amore #define	CMEDIAHD_MIN_INTRS		48
60*f6929eceSGarrett D'Amore #define	CMEDIAHD_INTRS			100
61*f6929eceSGarrett D'Amore 
62*f6929eceSGarrett D'Amore /*
63*f6929eceSGarrett D'Amore  * PCI registers
64*f6929eceSGarrett D'Amore  */
65*f6929eceSGarrett D'Amore 
66*f6929eceSGarrett D'Amore #define	RECA_ADDR		(devc->base+0x00)
67*f6929eceSGarrett D'Amore #define	RECA_SIZE		(devc->base+0x04)
68*f6929eceSGarrett D'Amore #define	RECA_FRAG		(devc->base+0x06)
69*f6929eceSGarrett D'Amore #define	RECB_ADDR		(devc->base+0x08)
70*f6929eceSGarrett D'Amore #define	RECB_SIZE		(devc->base+0x0C)
71*f6929eceSGarrett D'Amore #define	RECB_FRAG		(devc->base+0x0E)
72*f6929eceSGarrett D'Amore #define	RECC_ADDR		(devc->base+0x10)
73*f6929eceSGarrett D'Amore #define	RECC_SIZE		(devc->base+0x14)
74*f6929eceSGarrett D'Amore #define	RECC_FRAG		(devc->base+0x16)
75*f6929eceSGarrett D'Amore #define	SPDIF_ADDR		(devc->base+0x18)
76*f6929eceSGarrett D'Amore #define	SPDIF_SIZE		(devc->base+0x1C)
77*f6929eceSGarrett D'Amore #define	SPDIF_FRAG		(devc->base+0x1E)
78*f6929eceSGarrett D'Amore #define	MULTICH_ADDR		(devc->base+0x20)
79*f6929eceSGarrett D'Amore #define	MULTICH_SIZE		(devc->base+0x24)
80*f6929eceSGarrett D'Amore #define	MULTICH_FRAG		(devc->base+0x28)
81*f6929eceSGarrett D'Amore #define	FPOUT_ADDR		(devc->base+0x30)
82*f6929eceSGarrett D'Amore #define	FPOUT_SIZE		(devc->base+0x34)
83*f6929eceSGarrett D'Amore #define	FPOUT_FRAG		(devc->base+0x36)
84*f6929eceSGarrett D'Amore 
85*f6929eceSGarrett D'Amore #define	DMA_START		(devc->base+0x40)
86*f6929eceSGarrett D'Amore #define	CHAN_RESET		(devc->base+0x42)
87*f6929eceSGarrett D'Amore #define	MULTICH_MODE		(devc->base+0x43)
88*f6929eceSGarrett D'Amore #define	IRQ_MASK		(devc->base+0x44)
89*f6929eceSGarrett D'Amore #define	IRQ_STAT		(devc->base+0x46)
90*f6929eceSGarrett D'Amore #define	MISC_REG		(devc->base+0x48)
91*f6929eceSGarrett D'Amore #define	REC_FORMAT		(devc->base+0x4A)
92*f6929eceSGarrett D'Amore #define	PLAY_FORMAT		(devc->base+0x4B)
93*f6929eceSGarrett D'Amore #define	REC_MODE		(devc->base+0x4C)
94*f6929eceSGarrett D'Amore #define	FUNCTION		(devc->base+0x50)
95*f6929eceSGarrett D'Amore 
96*f6929eceSGarrett D'Amore #define	I2S_MULTICH_DAC		(devc->base+0x60)
97*f6929eceSGarrett D'Amore #define	I2S_ADC1		(devc->base+0x62)
98*f6929eceSGarrett D'Amore #define	I2S_ADC2		(devc->base+0x64)
99*f6929eceSGarrett D'Amore #define	I2S_ADC3		(devc->base+0x66)
100*f6929eceSGarrett D'Amore 
101*f6929eceSGarrett D'Amore #define	SPDIF_FUNC		(devc->base+0x70)
102*f6929eceSGarrett D'Amore #define	SPDIFOUT_CHAN_STAT	(devc->base+0x74)
103*f6929eceSGarrett D'Amore #define	SPDIFIN_CHAN_STAT	(devc->base+0x78)
104*f6929eceSGarrett D'Amore 
105*f6929eceSGarrett D'Amore #define	TWO_WIRE_ADDR		(devc->base+0x90)
106*f6929eceSGarrett D'Amore #define	TWO_WIRE_MAP		(devc->base+0x91)
107*f6929eceSGarrett D'Amore #define	TWO_WIRE_DATA		(devc->base+0x92)
108*f6929eceSGarrett D'Amore #define	TWO_WIRE_CTRL		(devc->base+0x94)
109*f6929eceSGarrett D'Amore 
110*f6929eceSGarrett D'Amore #define	SPI_CONTROL		(devc->base+0x98)
111*f6929eceSGarrett D'Amore #define	SPI_DATA		(devc->base+0x99)
112*f6929eceSGarrett D'Amore 
113*f6929eceSGarrett D'Amore #define	MPU401_DATA		(devc->base+0xA0)
114*f6929eceSGarrett D'Amore #define	MPU401_COMMAND		(devc->base+0xA1)
115*f6929eceSGarrett D'Amore #define	MPU401_CONTROL		(devc->base+0xA2)
116*f6929eceSGarrett D'Amore 
117*f6929eceSGarrett D'Amore #define	GPI_DATA		(devc->base+0xA4)
118*f6929eceSGarrett D'Amore #define	GPI_IRQ_MASK		(devc->base+0xA5)
119*f6929eceSGarrett D'Amore #define	GPIO_DATA		(devc->base+0xA6)
120*f6929eceSGarrett D'Amore #define	GPIO_CONTROL		(devc->base+0xA8)
121*f6929eceSGarrett D'Amore #define	GPIO_IRQ_MASK		(devc->base+0xAA)
122*f6929eceSGarrett D'Amore #define	DEVICE_SENSE		(devc->base+0xAC)
123*f6929eceSGarrett D'Amore 
124*f6929eceSGarrett D'Amore #define	PLAY_ROUTING		(devc->base+0xC0)
125*f6929eceSGarrett D'Amore #define	REC_ROUTING		(devc->base+0xC2)
126*f6929eceSGarrett D'Amore #define	REC_MONITOR		(devc->base+0xC3)
127*f6929eceSGarrett D'Amore #define	MONITOR_ROUTING		(devc->base+0xC4)
128*f6929eceSGarrett D'Amore 
129*f6929eceSGarrett D'Amore #define	AC97_CTRL		(devc->base+0xD0)
130*f6929eceSGarrett D'Amore #define	AC97_INTR_MASK		(devc->base+0xD2)
131*f6929eceSGarrett D'Amore #define	AC97_INTR_STAT		(devc->base+0xD3)
132*f6929eceSGarrett D'Amore #define	AC97_OUT_CHAN_CONFIG	(devc->base+0xD4)
133*f6929eceSGarrett D'Amore #define	AC97_IN_CHAN_CONFIG	(devc->base+0xD8)
134*f6929eceSGarrett D'Amore #define	AC97_CMD_DATA		(devc->base+0xDC)
135*f6929eceSGarrett D'Amore 
136*f6929eceSGarrett D'Amore #define	CODEC_VERSION		(devc->base+0xE4)
137*f6929eceSGarrett D'Amore #define	CTRL_VERSION		(devc->base+0xE6)
138*f6929eceSGarrett D'Amore 
139*f6929eceSGarrett D'Amore /* Device IDs */
140*f6929eceSGarrett D'Amore #define	ASUS_VENDOR_ID		0x1043
141*f6929eceSGarrett D'Amore #define	SUBID_XONAR_D2		0x8269
142*f6929eceSGarrett D'Amore #define	SUBID_XONAR_D2X		0x82b7
143*f6929eceSGarrett D'Amore #define	SUBID_XONAR_D1		0x834f
144*f6929eceSGarrett D'Amore #define	SUBID_XONAR_DX		0x8275
145*f6929eceSGarrett D'Amore #define	SUBID_XONAR_STX		0x835c
146*f6929eceSGarrett D'Amore #define	SUBID_XONAR_DS		0x838e
147*f6929eceSGarrett D'Amore 
148*f6929eceSGarrett D'Amore 
149*f6929eceSGarrett D'Amore #define	SUBID_GENERIC		0x0000
150*f6929eceSGarrett D'Amore 
151*f6929eceSGarrett D'Amore /* Xonar specific */
152*f6929eceSGarrett D'Amore #define	XONAR_DX_FRONTDAC	0x9e
153*f6929eceSGarrett D'Amore #define	XONAR_DX_SURRDAC	0x30
154*f6929eceSGarrett D'Amore #define	XONAR_STX_FRONTDAC	0x98
155*f6929eceSGarrett D'Amore #define	XONAR_DS_FRONTDAC	0x1
156*f6929eceSGarrett D'Amore #define	XONAR_DS_SURRDAC	0x0
157*f6929eceSGarrett D'Amore 
158*f6929eceSGarrett D'Amore /* defs for AKM 4396 DAC */
159*f6929eceSGarrett D'Amore #define	AK4396_CTL1		0x00
160*f6929eceSGarrett D'Amore #define	AK4396_CTL2		0x01
161*f6929eceSGarrett D'Amore #define	AK4396_CTL3		0x02
162*f6929eceSGarrett D'Amore #define	AK4396_LchATTCtl	0x03
163*f6929eceSGarrett D'Amore #define	AK4396_RchATTCtl	0x04
164*f6929eceSGarrett D'Amore 
165*f6929eceSGarrett D'Amore /* defs for CS4398 DAC */
166*f6929eceSGarrett D'Amore #define	CS4398_CHIP_ID		0x01
167*f6929eceSGarrett D'Amore #define	CS4398_MODE_CTRL	0x02
168*f6929eceSGarrett D'Amore #define	CS4398_MIXING		0x03
169*f6929eceSGarrett D'Amore #define	CS4398_MUTE_CTRL	0x04
170*f6929eceSGarrett D'Amore #define	CS4398_VOLA		0x05
171*f6929eceSGarrett D'Amore #define	CS4398_VOLB		0x06
172*f6929eceSGarrett D'Amore #define	CS4398_RAMP_CTRL	0x07
173*f6929eceSGarrett D'Amore #define	CS4398_MISC_CTRL	0x08
174*f6929eceSGarrett D'Amore #define	CS4398_MISC2_CTRL	0x09
175*f6929eceSGarrett D'Amore #define	CS4398_POWER_DOWN	(1<<7)	/* Obvious */
176*f6929eceSGarrett D'Amore #define	CS4398_CPEN		(1<<6)  /* Control Port Enable */
177*f6929eceSGarrett D'Amore #define	CS4398_FREEZE		(1<<5)	/* Freezes registers, unfreeze to */
178*f6929eceSGarrett D'Amore 					/* accept changed registers */
179*f6929eceSGarrett D'Amore #define	CS4398_MCLKDIV2		(1<<4)	/* Divide MCLK by 2 */
180*f6929eceSGarrett D'Amore #define	CS4398_MCLKDIV3		(1<<3)	/* Divive MCLK by 3 */
181*f6929eceSGarrett D'Amore #define	CS4398_I2S		(1<<4)	/* Set I2S mode */
182*f6929eceSGarrett D'Amore 
183*f6929eceSGarrett D'Amore /* defs for CS4362A DAC */
184*f6929eceSGarrett D'Amore #define	CS4362A_MODE1_CTRL	0x01
185*f6929eceSGarrett D'Amore #define	CS4362A_MODE2_CTRL	0x02
186*f6929eceSGarrett D'Amore #define	CS4362A_MODE3_CTRL	0x03
187*f6929eceSGarrett D'Amore #define	CS4362A_FILTER_CTRL	0x04
188*f6929eceSGarrett D'Amore #define	CS4362A_INVERT_CTRL	0x05
189*f6929eceSGarrett D'Amore #define	CS4362A_MIX1_CTRL	0x06
190*f6929eceSGarrett D'Amore #define	CS4362A_VOLA_1		0x07
191*f6929eceSGarrett D'Amore #define	CS4362A_VOLB_1		0x08
192*f6929eceSGarrett D'Amore #define	CS4362A_MIX2_CTRL	0x09
193*f6929eceSGarrett D'Amore #define	CS4362A_VOLA_2		0x0A
194*f6929eceSGarrett D'Amore #define	CS4362A_VOLB_2		0x0B
195*f6929eceSGarrett D'Amore #define	CS4362A_MIX3_CTRL	0x0C
196*f6929eceSGarrett D'Amore #define	CS4362A_VOLA_3		0x0D
197*f6929eceSGarrett D'Amore #define	CS4362A_VOLB_3		0x0E
198*f6929eceSGarrett D'Amore #define	CS4362A_CHIP_REV	0x12
199*f6929eceSGarrett D'Amore 
200*f6929eceSGarrett D'Amore /* CS4362A Reg 01h */
201*f6929eceSGarrett D'Amore #define	CS4362A_CPEN		(1<<7)
202*f6929eceSGarrett D'Amore #define	CS4362A_FREEZE		(1<<6)
203*f6929eceSGarrett D'Amore #define	CS4362A_MCLKDIV		(1<<5)
204*f6929eceSGarrett D'Amore #define	CS4362A_DAC3_ENABLE	(1<<3)
205*f6929eceSGarrett D'Amore #define	CS4362A_DAC2_ENABLE	(1<<2)
206*f6929eceSGarrett D'Amore #define	CS4362A_DAC1_ENABLE	(1<<1)
207*f6929eceSGarrett D'Amore #define	CS4362A_POWER_DOWN	(1)
208*f6929eceSGarrett D'Amore 
209*f6929eceSGarrett D'Amore /* CS4362A Reg 02h */
210*f6929eceSGarrett D'Amore #define	CS4362A_DIF_LJUST	0x00
211*f6929eceSGarrett D'Amore #define	CS4362A_DIF_I2S		0x10
212*f6929eceSGarrett D'Amore #define	CS4362A_DIF_RJUST16	0x20
213*f6929eceSGarrett D'Amore #define	CS4362A_DIF_RJUST24	0x30
214*f6929eceSGarrett D'Amore #define	CS4362A_DIF_RJUST20	0x40
215*f6929eceSGarrett D'Amore #define	CS4362A_DIF_RJUST18	0x50
216*f6929eceSGarrett D'Amore 
217*f6929eceSGarrett D'Amore /* CS4362A Reg 03h */
218*f6929eceSGarrett D'Amore #define	CS4362A_RAMP_IMMEDIATE	0x00
219*f6929eceSGarrett D'Amore #define	CS4362A_RAMP_ZEROCROSS	0x40
220*f6929eceSGarrett D'Amore #define	CS4362A_RAMP_SOFT	0x80
221*f6929eceSGarrett D'Amore #define	CS4362A_RAMP_SOFTZERO	0xC0
222*f6929eceSGarrett D'Amore #define	CS4362A_SINGLE_VOL	0x20
223*f6929eceSGarrett D'Amore #define	CS4362A_RAMP_ERROR	0x10
224*f6929eceSGarrett D'Amore #define	CS4362A_MUTEC_POL	0x08
225*f6929eceSGarrett D'Amore #define	CS4362A_AUTOMUTE	0x04
226*f6929eceSGarrett D'Amore #define	CS4362A_SIX_MUTE	0x00
227*f6929eceSGarrett D'Amore #define	CS4362A_ONE_MUTE	0x01
228*f6929eceSGarrett D'Amore #define	CS4362A_THREE_MUTE	0x03
229*f6929eceSGarrett D'Amore 
230*f6929eceSGarrett D'Amore /* CS4362A Reg 04h */
231*f6929eceSGarrett D'Amore #define	CS4362A_FILT_SEL	0x10
232*f6929eceSGarrett D'Amore #define	CS4362A_DEM_NONE	0x00
233*f6929eceSGarrett D'Amore #define	CS4362A_DEM_44KHZ	0x02
234*f6929eceSGarrett D'Amore #define	CS4362A_DEM_48KHZ	0x04
235*f6929eceSGarrett D'Amore #define	CS4362A_DEM_32KHZ	0x06
236*f6929eceSGarrett D'Amore #define	CS4362A_RAMPDOWN	0x01
237*f6929eceSGarrett D'Amore 
238*f6929eceSGarrett D'Amore 
239*f6929eceSGarrett D'Amore /* CS4362A Reg 05h */
240*f6929eceSGarrett D'Amore #define	CS4362A_INV_A3		(1<<4)
241*f6929eceSGarrett D'Amore #define	CS4362A_INV_B3		(1<<5)
242*f6929eceSGarrett D'Amore #define	CS4362A_INV_A2		(1<<2)
243*f6929eceSGarrett D'Amore #define	CS4362A_INV_B2		(1<<3)
244*f6929eceSGarrett D'Amore #define	CS4362A_INV_A1		(1)
245*f6929eceSGarrett D'Amore #define	CS4362A_INV_B1		(1<<1)
246*f6929eceSGarrett D'Amore 
247*f6929eceSGarrett D'Amore /* CS4362A Reg 06h, 09h, 0Ch */
248*f6929eceSGarrett D'Amore /* ATAPI crap, does anyone still use analog CD playback? */
249*f6929eceSGarrett D'Amore 
250*f6929eceSGarrett D'Amore /* CS4362A Reg 07h, 08h, 0Ah, 0Bh, 0Dh, 0Eh */
251*f6929eceSGarrett D'Amore /* Volume registers */
252*f6929eceSGarrett D'Amore #define	CS4362A_VOL_MUTE	0x80
253*f6929eceSGarrett D'Amore 
254*f6929eceSGarrett D'Amore /* 0-100. Start at -96dB. */
255*f6929eceSGarrett D'Amore #define	CS4398_VOL(x) \
256*f6929eceSGarrett D'Amore 	((x) == 0 ? 0xFF : (0xC0 - ((x)*192/100)))
257*f6929eceSGarrett D'Amore /* 0-100. Start at -96dB. Bit 7 is mute. */
258*f6929eceSGarrett D'Amore #define	CS4362A_VOL(x) \
259*f6929eceSGarrett D'Amore 	(char)((x) == 0 ? 0xFF : (0x60 - ((x)*96/100)))
260*f6929eceSGarrett D'Amore 
261*f6929eceSGarrett D'Amore /* Xonar D2/D2X codec remap */
262*f6929eceSGarrett D'Amore static const char xd2_codec_map[4] = {
263*f6929eceSGarrett D'Amore 	0, 1, 2, 4
264*f6929eceSGarrett D'Amore };
265*f6929eceSGarrett D'Amore 
266*f6929eceSGarrett D'Amore 
267*f6929eceSGarrett D'Amore typedef struct _cmediahd_devc_t cmediahd_devc_t;
268*f6929eceSGarrett D'Amore typedef struct _cmediahd_portc_t cmediahd_portc_t;
269*f6929eceSGarrett D'Amore 
270*f6929eceSGarrett D'Amore typedef enum {
271*f6929eceSGarrett D'Amore 	CTL_VOLUME = 0,
272*f6929eceSGarrett D'Amore 	CTL_FRONT,
273*f6929eceSGarrett D'Amore 	CTL_REAR,
274*f6929eceSGarrett D'Amore 	CTL_CENTER,
275*f6929eceSGarrett D'Amore 	CTL_LFE,
276*f6929eceSGarrett D'Amore 	CTL_SURROUND,
277*f6929eceSGarrett D'Amore 	CTL_MONITOR,
278*f6929eceSGarrett D'Amore 	CTL_RECSRC,
279*f6929eceSGarrett D'Amore 	CTL_RECGAIN,
280*f6929eceSGarrett D'Amore 	CTL_MICVOL,
281*f6929eceSGarrett D'Amore 	CTL_AUXVOL,
282*f6929eceSGarrett D'Amore 	CTL_CDVOL,
283*f6929eceSGarrett D'Amore 	CTL_LOOP,
284*f6929eceSGarrett D'Amore 	CTL_SPREAD,
285*f6929eceSGarrett D'Amore 	CTL_NUM		/* must be last */
286*f6929eceSGarrett D'Amore } cmediahd_ctrl_num_t;
287*f6929eceSGarrett D'Amore 
288*f6929eceSGarrett D'Amore typedef struct cmediahd_ctrl
289*f6929eceSGarrett D'Amore {
290*f6929eceSGarrett D'Amore 	cmediahd_devc_t		*devc;
291*f6929eceSGarrett D'Amore 	audio_ctrl_t		*ctrl;
292*f6929eceSGarrett D'Amore 	cmediahd_ctrl_num_t	num;
293*f6929eceSGarrett D'Amore 	uint64_t		val;
294*f6929eceSGarrett D'Amore } cmediahd_ctrl_t;
295*f6929eceSGarrett D'Amore 
296*f6929eceSGarrett D'Amore typedef struct cmediahd_regs
297*f6929eceSGarrett D'Amore {
298*f6929eceSGarrett D'Amore 	caddr_t addr;	/* base address */
299*f6929eceSGarrett D'Amore 	caddr_t size;	/* current count */
300*f6929eceSGarrett D'Amore 	caddr_t frag;	/* terminal count */
301*f6929eceSGarrett D'Amore 	caddr_t i2s;    /* i2s reg */
302*f6929eceSGarrett D'Amore 	int chan; 	/* rec a/b/c, play spdif/multi/front */
303*f6929eceSGarrett D'Amore #define	REC_A 0
304*f6929eceSGarrett D'Amore #define	REC_B 1
305*f6929eceSGarrett D'Amore #define	REC_C 2
306*f6929eceSGarrett D'Amore #define	PLAY_SPDIF 3
307*f6929eceSGarrett D'Amore #define	PLAY_MULTI 4
308*f6929eceSGarrett D'Amore #define	PLAY_FRONT 5
309*f6929eceSGarrett D'Amore } cmediahd_regs_t;
310*f6929eceSGarrett D'Amore 
311*f6929eceSGarrett D'Amore struct _cmediahd_portc_t
312*f6929eceSGarrett D'Amore {
313*f6929eceSGarrett D'Amore 	cmediahd_devc_t *devc;
314*f6929eceSGarrett D'Amore 	audio_engine_t *engine;
315*f6929eceSGarrett D'Amore 
316*f6929eceSGarrett D'Amore 	int			chans;
317*f6929eceSGarrett D'Amore 	int			direction;
318*f6929eceSGarrett D'Amore 
319*f6929eceSGarrett D'Amore 	ddi_dma_handle_t	buf_dmah;	/* dma for buffers */
320*f6929eceSGarrett D'Amore 	ddi_acc_handle_t	buf_acch;
321*f6929eceSGarrett D'Amore 	uint32_t		paddr;
322*f6929eceSGarrett D'Amore 	caddr_t			kaddr;
323*f6929eceSGarrett D'Amore 	size_t			buf_size;
324*f6929eceSGarrett D'Amore 	size_t			buf_frames;	/* Buffer size in frames */
325*f6929eceSGarrett D'Amore 	unsigned		fragfr;
326*f6929eceSGarrett D'Amore 	unsigned		nfrags;
327*f6929eceSGarrett D'Amore 	unsigned		nframes;
328*f6929eceSGarrett D'Amore 	unsigned		bufsz;
329*f6929eceSGarrett D'Amore 	size_t			offset;
330*f6929eceSGarrett D'Amore 	uint64_t		count;
331*f6929eceSGarrett D'Amore 	int			syncdir;
332*f6929eceSGarrett D'Amore };
333*f6929eceSGarrett D'Amore 
334*f6929eceSGarrett D'Amore struct _cmediahd_devc_t
335*f6929eceSGarrett D'Amore {
336*f6929eceSGarrett D'Amore 	dev_info_t		*dip;
337*f6929eceSGarrett D'Amore 	audio_dev_t		*adev;
338*f6929eceSGarrett D'Amore 	boolean_t		has_ac97, has_fp_ac97;
339*f6929eceSGarrett D'Amore 	int			model;
340*f6929eceSGarrett D'Amore 	ac97_t			*ac97, *fp_ac97;
341*f6929eceSGarrett D'Amore 
342*f6929eceSGarrett D'Amore 	boolean_t		suspended;
343*f6929eceSGarrett D'Amore 	ddi_acc_handle_t	pcih;
344*f6929eceSGarrett D'Amore 	ddi_acc_handle_t	regsh;
345*f6929eceSGarrett D'Amore 	caddr_t			base;
346*f6929eceSGarrett D'Amore 	kmutex_t		mutex;		/* For normal locking */
347*f6929eceSGarrett D'Amore 	kmutex_t		low_mutex;	/* For low level routines */
348*f6929eceSGarrett D'Amore 	cmediahd_regs_t		rec_eng;	/* which rec engine to use */
349*f6929eceSGarrett D'Amore 	cmediahd_portc_t 	*portc[CMEDIAHD_NUM_PORTC];
350*f6929eceSGarrett D'Amore 	int			gpio_mic, gpio_out, gpio_codec, gpio_alt;
351*f6929eceSGarrett D'Amore 	cmediahd_ctrl_t		controls[CTL_NUM];
352*f6929eceSGarrett D'Amore };
353*f6929eceSGarrett D'Amore 
354*f6929eceSGarrett D'Amore #define	INB(devc, reg)		ddi_get8(devc->regsh, (void *)(reg))
355*f6929eceSGarrett D'Amore #define	OUTB(devc, val, reg)	ddi_put8(devc->regsh, (void *)(reg), (val))
356*f6929eceSGarrett D'Amore 
357*f6929eceSGarrett D'Amore #define	INW(devc, reg)		ddi_get16(devc->regsh, (void *)(reg))
358*f6929eceSGarrett D'Amore #define	OUTW(devc, val, reg)	ddi_put16(devc->regsh, (void *)(reg), (val))
359*f6929eceSGarrett D'Amore 
360*f6929eceSGarrett D'Amore #define	INL(devc, reg)		ddi_get32(devc->regsh, (void *)(reg))
361*f6929eceSGarrett D'Amore #define	OUTL(devc, val, reg)	ddi_put32(devc->regsh, (void *)(reg), (val))
362*f6929eceSGarrett D'Amore 
363*f6929eceSGarrett D'Amore #endif /* CMEDIAHD_H */
364