audio_4231.h revision 11936:54dc8a89ba0d
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#ifndef _AUDIO_4231_H
27#define	_AUDIO_4231_H
28
29#ifdef __cplusplus
30extern "C" {
31#endif
32
33/*
34 * Header file for the audiocs device driver.
35 */
36
37/*
38 * Values returned by the AUDIO_GETDEV ioctl()
39 */
40#define	CS_DEV_NAME		"SUNW,CS4231"
41#define	CS_DEV_CONFIG_ONBRD1	"onboard1"
42#define	CS_DEV_VERSION		"a"	/* SS5 				*/
43#define	CS_DEV_VERSION_A	CS_DEV_VERSION
44#define	CS_DEV_VERSION_B	"b"	/* Electron - internal loopback	*/
45#define	CS_DEV_VERSION_C	"c"	/* Positron			*/
46#define	CS_DEV_VERSION_D	"d"	/* PowerPC - Retired		*/
47#define	CS_DEV_VERSION_E	"e"	/* x86 - Retired		*/
48#define	CS_DEV_VERSION_F	"f"	/* Tazmo			*/
49#define	CS_DEV_VERSION_G	"g"	/* Quark Audio Module		*/
50#define	CS_DEV_VERSION_H	"h"	/* Darwin			*/
51
52/*
53 * Driver supported configuration information
54 */
55#define	CS4231_NAME		"audiocs"
56#define	CS4231_MOD_NAME		"CS4231 audio driver"
57
58/*
59 * Implementation specific header file for the audiocs device driver.
60 */
61
62#ifdef _KERNEL
63
64enum {
65	CTL_VOLUME = 0,
66	CTL_IGAIN,
67	CTL_MGAIN,
68	CTL_INPUTS,
69	CTL_OUTPUTS,
70	CTL_MICBOOST,
71	CTL_NUM
72};
73
74typedef struct CS_engine CS_engine_t;
75typedef struct CS_ctrl CS_ctrl_t;
76typedef struct CS_state CS_state_t;
77
78/*
79 * These are the registers for the APC DMA channel interface to the
80 * 4231. One handle provides access the CODEC and the DMA engine's
81 * registers.
82 */
83
84struct cs4231_apc {
85	uint32_t 	dmacsr;		/* APC CSR */
86	uint32_t	lpad[3];	/* PAD */
87	uint32_t 	dmacva;		/* Capture Virtual Address */
88	uint32_t 	dmacc;		/* Capture Count */
89	uint32_t 	dmacnva;	/* Capture Next VAddress */
90	uint32_t 	dmacnc;		/* Capture next count */
91	uint32_t 	dmapva;		/* Playback Virtual Address */
92	uint32_t 	dmapc;		/* Playback Count */
93	uint32_t 	dmapnva;	/* Playback Next VAddress */
94	uint32_t 	dmapnc;		/* Playback Next Count */
95};
96typedef struct cs4231_apc cs4231_apc_t;
97
98#define	APC_DMACSR	state->cs_regs->apc.dmacsr
99#define	APC_DMACVA	state->cs_regs->apc.dmacva
100#define	APC_DMACC	state->cs_regs->apc.dmacc
101#define	APC_DMACNVA	state->cs_regs->apc.dmacnva
102#define	APC_DMACNC	state->cs_regs->apc.dmacnc
103#define	APC_DMAPVA	state->cs_regs->apc.dmapva
104#define	APC_DMAPC	state->cs_regs->apc.dmapc
105#define	APC_DMAPNVA	state->cs_regs->apc.dmapnva
106#define	APC_DMAPNC	state->cs_regs->apc.dmapnc
107
108/*
109 * APC CSR Register bit definitions
110 */
111
112#define	APC_RESET	0x00000001u	/* Reset the DMA engine, R/W */
113#define	APC_CDMA_GO	0x00000004u	/* Capture DMA go, R/W */
114#define	APC_PDMA_GO	0x00000008u	/* Playback DMA go, R/W */
115#define	APC_LOOP_BACK	0x00000010u	/* Loopback, Capture to Play */
116#define	APC_COD_PDWN	0x00000020u	/* CODEC power down, R/W */
117#define	APC_C_ABORT	0x00000040u	/* Capture abort, R/W */
118#define	APC_P_ABORT	0x00000080u	/* Play abort, R/W */
119#define	APC_CXI_EN	0x00000100u	/* Capture expired int. enable, R/W */
120#define	APC_CXI		0x00000200u	/* Capture expired interrupt, R/W */
121#define	APC_CD		0x00000400u	/* Capture next VA dirty, R/O */
122#define	APC_CX		0x00000800u	/* Capture expired (pipe empty), R/O */
123#define	APC_PMI_EN	0x00001000u	/* Play pipe empty int. enable, R/W */
124#define	APC_PD		0x00002000u	/* Playback next VA dirty, R/O */
125#define	APC_PM		0x00004000u	/* Play pipe empty, R/O */
126#define	APC_PMI		0x00008000u	/* Play pipe empty interrupt, R/W */
127#define	APC_EIE		0x00010000u	/* Error interrupt enable, R/W */
128#define	APC_CIE		0x00020000u	/* Capture interrupt enable, R/W */
129#define	APC_PIE		0x00040000u	/* Playback interrupt enable, R/W */
130#define	APC_IE		0x00080000u	/* Interrupt enable, R/W */
131#define	APC_EI		0x00100000u	/* Error interrupt, R/W */
132#define	APC_CI		0x00200000u	/* Capture interrupt, R/W */
133#define	APC_PI		0x00400000u	/* Playback interrupt, R/W */
134#define	APC_IP		0x00800000u	/* Interrupt Pending, R/O */
135#define	APC_ID		0xff000000u	/* ID bits, set to 7E, R/O */
136
137#define	APC_ID_VALUE	0x7E000000u	/* ID read from CSR */
138#define	APC_CLEAR_RESET_VALUE	0x00
139
140#define	APC_PINTR_MASK		(APC_PI|APC_PMI)
141#define	APC_CINTR_MASK		(APC_CI|APC_CXI)
142#define	APC_COMMON_MASK		(APC_IP|APC_EI)
143#define	APC_PINTR_ENABLE	(APC_PIE|APC_PMI_EN)
144#define	APC_CINTR_ENABLE	(APC_CIE|APC_CXI_EN)
145#define	APC_COMMON_ENABLE	(APC_IE|APC_EIE)
146
147#define	APC_PLAY_ENABLE		(APC_PDMA_GO)
148#define	APC_PLAY_DISABLE	(APC_PDMA_GO)
149#define	APC_CAP_ENABLE		(APC_CDMA_GO)
150#define	APC_CAP_DISABLE		(APC_CDMA_GO)
151
152/*
153 * These are the registers for the EBUS2 DMA channel interface to the
154 * 4231. One struct per channel for playback and record, therefore there
155 * individual handles for the CODEC and the two DMA engines.
156 */
157
158struct cs4231_eb2regs {
159	uint32_t 	eb2csr;		/* Ebus 2 csr */
160	uint32_t 	eb2acr;		/* ebus 2 Addrs */
161	uint32_t 	eb2bcr;		/* ebus 2 counts */
162};
163typedef struct cs4231_eb2regs cs4231_eb2regs_t;
164
165#define	EB2_PLAY_CSR	state->cs_eb2_regs.play->eb2csr
166#define	EB2_PLAY_ACR	state->cs_eb2_regs.play->eb2acr
167#define	EB2_PLAY_BCR	state->cs_eb2_regs.play->eb2bcr
168#define	EB2_REC_CSR	state->cs_eb2_regs.record->eb2csr
169#define	EB2_REC_ACR	state->cs_eb2_regs.record->eb2acr
170#define	EB2_REC_BCR	state->cs_eb2_regs.record->eb2bcr
171#define	EB2_AUXIO_REG	state->cs_eb2_regs.auxio
172
173/*
174 * Audio auxio register definitions
175 */
176#define	EB2_AUXIO_COD_PDWN	0x00000001u	/* power down Codec */
177
178/*
179 * EBUS 2 CSR definitions
180 */
181
182#define	EB2_INT_PEND		0x00000001u	/* Interrupt pending, R/O */
183#define	EB2_ERR_PEND		0x00000002u	/* Error interrupt, R/O */
184#define	EB2_DRAIN		0x00000004u	/* FIFO being drained, R/O */
185#define	EB2_INT_EN		0x00000010u	/* Enable interrupts, R/W */
186#define	EB2_RESET		0x00000080u	/* Reset DMA engine, R/W */
187#define	EB2_WRITE		0x00000100u	/* DMA direction (to mem) R/W */
188#define	EB2_READ		0x00000000u	/* DMA direction (to dev) R/W */
189#define	EB2_EN_DMA		0x00000200u	/* Enable DMA, R/W */
190#define	EB2_CYC_PENDING		0x00000400u	/* DMA cycle pending, R/O */
191#define	EB2_DIAG_RD_DONE	0x00000800u	/* Diag RD done, R/O */
192#define	EB2_DIAG_WR_DONE	0x00001000u	/* Diag WR done, R/O */
193#define	EB2_EN_CNT		0x00002000u	/* Enable byte count, R/W */
194#define	EB2_TC			0x00004000u	/* Terminal count, R/W */
195#define	EB2_DIS_CSR_DRN		0x00010000u	/* Dis. drain with W-CSR, R/W */
196#define	EB2_16			0x00000000u 	/* 19,18 == 0,0, R/W */
197#define	EB2_32			0x00040000u	/* 19,18 == 0,1, R/W */
198#define	EB2_4			0x00080000u	/* 19,18 == 1,0, R/W */
199#define	EB2_64			0x000C0000u	/* 19,18 == 1,1, R/W */
200#define	EB2_DIAG_EN		0x00100000u	/* DMA diag. enable, R/W */
201#define	EB2_DIS_ERR_PEND	0x00400000u	/* Disable Error int., R/W */
202#define	EB2_TCI_DIS		0x00800000u	/* Disable TC int., R/W */
203#define	EB2_EN_NEXT		0x01000000u	/* Next addr. enabled, R/W */
204#define	EB2_DMA_ON		0x02000000u	/* DMA engine enabled, R/O */
205#define	EB2_A_LOADED		0x04000000u	/* Address loaded, R/O */
206#define	EB2_NA_LOADED		0x08000000u	/* Next add. loaded, R/O */
207#define	EB2_DEV_ID		0xf0000000u	/* Device ID -0x0C, R/O */
208
209#define	EB2_ID_VALUE		0xC0000000u	/* ID read from CSR */
210#define	EB2_PCLEAR_RESET_VALUE	(EB2_READ|EB2_EN_NEXT|EB2_EN_CNT)
211#define	EB2_RCLEAR_RESET_VALUE	(EB2_WRITE|EB2_EN_NEXT|EB2_EN_CNT)
212
213#define	EB2_PLAY_ENABLE		(EB2_EN_DMA|EB2_EN_CNT|EB2_64|\
214					EB2_PCLEAR_RESET_VALUE)
215
216#define	EB2_REC_ENABLE		(EB2_EN_DMA|EB2_EN_CNT|EB2_64|\
217					EB2_RCLEAR_RESET_VALUE)
218
219#define	EB2_FIFO_DRAIN		(EB2_DRAIN|EB2_CYC_PENDING)
220
221/*
222 * Misc. defines
223 */
224#define	CS4231_REGS			(32)
225#define	CS4231_NCOMPONENTS		(1)
226#define	CS4231_COMPONENT		(0)
227#define	CS4231_PWR_OFF			(0)
228#define	CS4231_PWR_ON			(1)
229#define	CS4231_TIMEOUT			(100000)
230#define	CS4231_300MS			(300*1000)
231#define	CS4231_PLAY			0
232#define	CS4231_REC			1
233#define	CS4231_NFRAMES			4096
234#define	CS4231_NFRAGS			2
235#define	CS4231_FRAGSZ			((CS4231_NFRAMES / CS4231_NFRAGS) * 4)
236#define	CS4231_BUFSZ			(CS4231_NFRAMES * 4)
237
238/*
239 * Supported dma engines and the ops vector
240 */
241enum cs_dmae_types {APC_DMA, EB2_DMA};
242typedef enum cs_dmae_types cs_dmae_types_e;
243
244/*
245 * Hardware registers
246 */
247struct cs4231_pioregs {
248	uint8_t iar;		/* index address register */
249	uint8_t pad1[3];		/* pad */
250	uint8_t idr;		/* indexed data register */
251	uint8_t pad2[3];		/* pad */
252	uint8_t statr;		/* status register */
253	uint8_t pad3[3];		/* pad */
254	uint8_t piodr;		/* PIO data regsiter */
255	uint8_t pad4[3];
256};
257typedef struct cs4231_pioregs cs4231_pioregs_t;
258
259
260struct cs4231_eb2 {
261	cs4231_eb2regs_t	*play;		/* play EB2 registers */
262	cs4231_eb2regs_t	*record;	/* record EB2 registers */
263	uint_t			*auxio;		/* aux io - power down */
264};
265typedef struct cs4231_eb2 cs4231_eb2_t;
266
267struct cs4231_regs {
268	cs4231_pioregs_t	codec;		/* CS4231 CODEC registers */
269	cs4231_apc_t		apc;		/* gets mapped with CODEC */
270};
271typedef struct cs4231_regs cs4231_regs_t;
272
273#define	CS4231_IAR	state->cs_regs->codec.iar	/* Index Add. Reg. */
274#define	CS4231_IDR	state->cs_regs->codec.idr	/* Index Data Reg. */
275#define	CS4231_STATUS	state->cs_regs->codec.statr	/* Status Reg. */
276#define	CS4231_PIODR	state->cs_regs->codec.piodr	/* PIO Data Reg. */
277
278/*
279 * Misc. state enumerations and structures
280 */
281struct cs4231_handle {
282	ddi_acc_handle_t	cs_codec_hndl;	/* CODEC handle, APC & EB2 */
283	ddi_acc_handle_t	cs_eb2_play_hndl; /* EB2 only, play handle */
284	ddi_acc_handle_t	cs_eb2_rec_hndl; /* EB2 only, record handle */
285	ddi_acc_handle_t	cs_eb2_auxio_hndl; /* EB2 only, auxio handle */
286};
287typedef struct cs4231_handle cs4231_handle_t;
288#define	CODEC_HANDLE	state->cs_handles.cs_codec_hndl
289#define	APC_HANDLE	state->cs_handles.cs_codec_hndl
290#define	EB2_PLAY_HNDL	state->cs_handles.cs_eb2_play_hndl
291#define	EB2_REC_HNDL	state->cs_handles.cs_eb2_rec_hndl
292#define	EB2_AUXIO_HNDL	state->cs_handles.cs_eb2_auxio_hndl
293
294/*
295 * CS_port_t - per port (playback or record) state
296 */
297struct CS_engine {
298	CS_state_t		*ce_state;
299	audio_engine_t		*ce_engine;
300	int			ce_num;
301	unsigned		ce_syncdir;
302	boolean_t		ce_started;
303	uint64_t		ce_count;
304
305	caddr_t			ce_kaddr;
306	ddi_dma_handle_t	ce_dmah;
307	ddi_acc_handle_t	ce_acch;
308	uint32_t		ce_paddr;
309	uint32_t		ce_curoff;
310	int			ce_curidx;
311
312	/* registers (EB2 only) */
313	ddi_acc_handle_t	ce_regsh;
314	cs4231_eb2regs_t	*ce_eb2regs;	/* EB2 registers */
315
316	/* codec enable */
317	uint8_t			ce_codec_en;
318};
319
320struct CS_ctrl {
321	CS_state_t		*cc_state;
322	audio_ctrl_t		*cc_ctrl;
323	uint32_t		cc_num;
324	uint64_t		cc_val;
325};
326
327/*
328 * CS_state_t - per instance state and operation data
329 */
330struct CS_state {
331	kmutex_t		cs_lock;	/* state protection lock */
332	kcondvar_t		cs_cv;		/* suspend/resume cond. var. */
333	dev_info_t		*cs_dip;	/* used by cs4231_getinfo() */
334	audio_dev_t		*cs_adev;	/* audio device state */
335
336	cs_dmae_types_e		cs_dma_engine;	/* dma engine for this h/w */
337	struct cs4231_dma_ops	*cs_dma_ops;	/* dma engine ops vector */
338	cs4231_regs_t		*cs_regs;	/* hardware registers */
339	cs4231_eb2_t		cs_eb2_regs;	/* eb2 DMA registers */
340	cs4231_handle_t		cs_handles;	/* hardware handles */
341
342	boolean_t		cs_suspended;	/* power management state */
343	boolean_t		cs_powered;	/* device powered up? */
344
345	CS_engine_t		*cs_engines[2];
346
347	boolean_t		cs_revA;	/* B_TRUE if Rev A CODEC */
348	uint8_t			cs_save[CS4231_REGS];	/* PM reg. storage */
349
350	/*
351	 * Control related fields.
352	 */
353	uint64_t		cs_imask;
354	uint64_t		cs_omask;
355	uint64_t		cs_omod;	/* modifiable ports */
356
357	CS_ctrl_t		*cs_ogain;
358	CS_ctrl_t		*cs_igain;
359	CS_ctrl_t		*cs_micboost;
360	CS_ctrl_t		*cs_mgain;
361	CS_ctrl_t		*cs_outputs;
362	CS_ctrl_t		*cs_inputs;
363};
364
365/*
366 * DMA ops vector definition
367 */
368struct cs4231_dma_ops {
369	char	*dma_device;
370	ddi_dma_attr_t	*cs_dma_attr;
371	int	(*cs_dma_map_regs)(CS_state_t *);
372	void	(*cs_dma_unmap_regs)(CS_state_t *);
373	void	(*cs_dma_reset)(CS_state_t *);
374	int 	(*cs_dma_start)(CS_engine_t *);
375	void	(*cs_dma_stop)(CS_engine_t *);
376	void	(*cs_dma_power)(CS_state_t *, int);
377	void	(*cs_dma_reload)(CS_engine_t *);
378	uint32_t	(*cs_dma_addr)(CS_engine_t *);
379};
380typedef struct cs4231_dma_ops cs4231_dma_ops_t;
381
382extern cs4231_dma_ops_t cs4231_apcdma_ops;
383extern cs4231_dma_ops_t cs4231_eb2dma_ops;
384
385#define	CS4231_DMA_MAP_REGS(S)		((S)->cs_dma_ops->cs_dma_map_regs)(S)
386#define	CS4231_DMA_UNMAP_REGS(S)	((S)->cs_dma_ops->cs_dma_unmap_regs)(S)
387#define	CS4231_DMA_RESET(S)		((S)->cs_dma_ops->cs_dma_reset)(S)
388#define	CS4231_DMA_START(S, E)		((S)->cs_dma_ops->cs_dma_start)(E)
389#define	CS4231_DMA_STOP(S, E)		((S)->cs_dma_ops->cs_dma_stop)(E)
390#define	CS4231_DMA_POWER(S, L)		((S)->cs_dma_ops->cs_dma_power)(S, L)
391#define	CS4231_DMA_ATTR(S)		((S)->cs_dma_ops->cs_dma_attr)
392#define	CS4231_DMA_RELOAD(S, E)		((S)->cs_dma_ops->cs_dma_reload)(E)
393#define	CS4231_DMA_ADDR(S, E)		((S)->cs_dma_ops->cs_dma_addr)(E)
394
395/*
396 * Useful bit twiddlers
397 */
398#define	CS4231_RETRIES		10
399
400#define	OR_SET_WORD(handle, addr, val)					\
401	ddi_put32((handle), (uint_t *)(addr),				\
402		(ddi_get32((handle), (uint_t *)(addr)) | (uint_t)(val)))
403
404#define	AND_SET_WORD(handle, addr, val)					\
405	ddi_put32((handle), (uint_t *)(addr),				\
406		(ddi_get32((handle), (uint_t *)(addr)) & (uint_t)(val)))
407
408/*
409 * CS4231 Register Set Definitions
410 */
411/* Index Address Register */
412#define	IAR_ADDRESS_MASK	0x1f	/* mask for index addresses, R/W */
413#define	IAR_TRD			0x20	/* Transfer Request Disable, R/W */
414#define	IAR_MCE			0x40	/* Mode Change Enable, R/W */
415#define	IAR_INIT		0x80	/* 4231 init cycle, R/O */
416
417/* Status Register */
418#define	STATUS_INT		0x01	/* Interrupt status, R/O */
419#define	STATUS_PRDY		0x02	/* Playback Data Ready */
420#define	STATUS_PLR		0x04	/* Playback Left/Right sample */
421#define	STATUS_PUL		0x08	/* Playback Upper/Lower byte */
422#define	STATUS_SER		0x10	/* Sample Error, see Index 24 */
423#define	STATUS_CRDY		0x20	/* Capture Data Ready */
424#define	STATUS_CLR		0x40	/* Capture Left/Right sample */
425#define	STATUS_CUL		0x80	/* Capture Upper/Lower byte */
426#define	STATUS_RESET		0x00	/* Reset the status register */
427
428/* Index 00 - Left ADC Input Control, Modes 1&2 */
429#define	LADCI_REG		0x00	/* Left ADC Register */
430#define	LADCI_GAIN_MASK		0x0f	/* Left gain mask, 1.5 dB/step */
431#define	LADCI_LMGE		0x20	/* Left Mic Gain Enable, 20 dB stage */
432#define	LADCI_LLINE		0x00	/* Left Line in enable */
433#define	LADCI_LAUX1		0x40	/* Left AUX1 in enable */
434#define	LADCI_LMIC		0x80	/* Left MIC in enable */
435#define	LADCI_LLOOP		0xc0	/* Left Loopback enable */
436#define	LADCI_IN_MASK		0xc0	/* Left input mask */
437#define	LADCI_VALID_MASK	0xef	/* Left valid bits mask */
438
439/* Index 01 - Right ADC Input Control, Modes 1&2 */
440#define	RADCI_REG		0x01	/* Right ADC Register */
441#define	RADCI_GAIN_MASK		0x0f	/* Right gain mask, 1.5 dB/step */
442#define	RADCI_RMGE		0x20	/* Right Mic Gain Enable, 20 dB stage */
443#define	RADCI_RLINE		0x00	/* Right Line in enable */
444#define	RADCI_RAUX1		0x40	/* Right AUX1 in enable */
445#define	RADCI_RMIC		0x80	/* Right MIC in enable */
446#define	RADCI_RLOOP		0xc0	/* Right Loopback enable */
447#define	RADCI_IN_MASK		0xc0	/* Right input mask */
448#define	RADCI_VALID_MASK	0xef	/* Right valid bits mask */
449
450/* Index 02 - Left Aux #1 Input Control, Modes 1&2 */
451#define	LAUX1_REG		0x02	/* Left Aux#1 Register */
452#define	LAUX1_GAIN_MASK		0x1f	/* Left Aux#1 gain mask, 1.5 dB/step */
453#define	LAUX1_LX1M		0x80	/* Left Aux#1 mute */
454#define	LAUX1_UNITY_GAIN	0x08	/* Left Aux#1 unity gain */
455#define	LAUX1_VALID_MASK	0x9f	/* Left valid bits mask */
456
457/* Index 03 - Right Aux #1 Input Control, Modes 1&2 */
458#define	RAUX1_REG		0x03	/* Right Aux#1 Register */
459#define	RAUX1_GAIN_MASK		0x1f	/* Right Aux#1 gain mask, 1.5 dB/step */
460#define	RAUX1_RX1M		0x80	/* Right Aux#1 mute */
461#define	RAUX1_UNITY_GAIN	0x08	/* Right Aux#1 unity gain */
462#define	RAUX1_VALID_MASK	0x9f	/* Right valid bits mask */
463
464/* Index 04 - Left Aux #2 Input Control, Modes 1&2 */
465#define	LAUX2_REG		0x04	/* Left Aux#2 Register */
466#define	LAUX2_GAIN_MASK		0x1f	/* Left Aux#2 gain mask, 1.5 dB/step */
467#define	LAUX2_LX2M		0x80	/* Left Aux#2 mute */
468#define	LAUX2_UNITY_GAIN	0x08	/* Left Aux#2 unity gain */
469#define	LAUX2_VALID_MASK	0x9f	/* Left valid bits mask */
470
471/* Index 05 - Right Aux #2 Input Control, Modes 1&2 */
472#define	RAUX2_REG		0x05	/* Right Aux#2 Register */
473#define	RAUX2_GAIN_MASK		0x1f	/* Right Aux#2 gain mask, 1.5 dB/step */
474#define	RAUX2_RX2M		0x80	/* Right Aux#2 mute */
475#define	RAUX2_UNITY_GAIN	0x08	/* Right Aux#2 unity gain */
476#define	RAUX2_VALID_MASK	0x9f	/* Right valid bits mask */
477
478/* Index 06 - Left DAC Output Control, Modes 1&2 */
479#define	LDACO_REG		0x06	/* Left DAC Register */
480#define	LDACO_ATTEN_MASK	0x3f	/* Left attenuation mask, 1.5 dB/setp */
481#define	LDACO_LDM		0x80	/* Left mute */
482#define	LDACO_MID_GAIN		0x11	/* Left DAC mid gain */
483#define	LDAC0_VALID_MASK	0xbf	/* Left valid bits mask */
484
485/* Index 07 - Right DAC Output Control, Modes 1&2 */
486#define	RDACO_REG		0x07	/* Right DAC Register */
487#define	RDACO_ATTEN_MASK	0x3f	/* Right atten. mask, 1.5 dB/setp */
488#define	RDACO_RDM		0x80	/* Right mute */
489#define	RDACO_MID_GAIN		0x11	/* Right DAC mid gain */
490#define	RDAC0_VALID_MASK	0xbf	/* Right valid bits mask */
491
492/* Index 08 - Sample Rate and Data Format, Mode 2 only */
493#define	FSDF_REG		0x08	/* Sample Rate & Data Format Register */
494#define	FS_5510			0x01	/* XTAL2, Freq. Divide #0 */
495#define	FS_6620			0x0f	/* XTAL2, Freq. Divide #7 */
496#define	FS_8000			0x00	/* XTAL1, Freq. Divide #0 */
497#define	FS_9600			0x0e	/* XTAL2, Freq. Divide #7 */
498#define	FS_11025		0x03	/* XTAL2, Freq. Divide #1 */
499#define	FS_16000		0x02	/* XTAL1, Freq. Divide #1 */
500#define	FS_18900		0x05	/* XTAL2, Freq. Divide #2 */
501#define	FS_22050		0x07	/* XTAL2, Freq. Divide #3 */
502#define	FS_27420		0x04	/* XTAL1, Freq. Divide #2 */
503#define	FS_32000		0x06	/* XTAL1, Freq. Divide #3 */
504#define	FS_33075		0x0d	/* XTAL2, Freq. Divide #6 */
505#define	FS_37800		0x09	/* XTAL2, Freq. Divide #4 */
506#define	FS_44100		0x0b	/* XTAL2, Freq. Divide #5 */
507#define	FS_48000		0x0c	/* XTAL1, Freq. Divide #6 */
508#define	PDF_STEREO		0x10	/* Stereo Playback */
509#define	PDF_MONO		0x00	/* Mono Playback */
510#define	PDF_LINEAR8		0x00	/* Linear, 8-bit unsigned */
511#define	PDF_ULAW8		0x20	/* u-Law, 8-bit companded */
512#define	PDF_LINEAR16LE		0x40	/* Linear, 16-bit signed, little end. */
513#define	PDF_ALAW8		0x60	/* A-Law, 8-bit companded */
514#define	PDF_ADPCM4		0xa0	/* ADPCM, 4-bit, IMA compatible */
515#define	PDF_LINEAR16BE		0xc0	/* Linear, 16-bit signed, big endian */
516#define	FSDF_VALID_MASK		0xff	/* Valid bits mask */
517#ifdef	_BIG_ENDIAN
518#define	PDF_LINEAR16NE		PDF_LINEAR16BE
519#else
520#define	PDF_LINEAR16NE		PDF_LINEAR16LE
521#endif
522
523/* Index 09 - Interface Configuration, Mode 1&2 */
524#define	INTC_REG		0x09	/* Interrupt Configuration Register */
525#define	INTC_PEN		0x01	/* Playback enable */
526#define	INTC_CEN		0x02	/* Capture enable */
527#define	INTC_SDC		0x04	/* Single DMA channel */
528#define	INTC_DDC		0x00	/* Dual DMA channels */
529#define	INTC_ACAL		0x08	/* Auto-Calibrate Enable */
530#define	INTC_PPIO		0x40	/* Playback vi PIO */
531#define	INTC_PDMA		0x00	/* Playback vi DMA */
532#define	INTC_CPIO		0x80	/* Capture vi PIO */
533#define	INTC_CDMA		0x00	/* Capture vi DMA */
534#define	INTC_VALID_MASK		0xcf	/* Valid bits mask */
535
536/* Index 10 - Pin Control, Mode 1&2 */
537#define	PC_REG			0x0a	/* Pin Control Register */
538#define	PC_IEN			0x02	/* Interrupt Enable */
539#define	PC_DEN			0x04	/* Dither Enable */
540#define	PC_XCTL0		0x40	/* External control 0 */
541#define	PC_LINE_OUT_MUTE	0x40	/* Line Out Mute */
542#define	PC_XCTL1		0x80	/* External control 1 */
543#define	PC_HEADPHONE_MUTE	0x80	/* Headphone Mute */
544#define	PC_VALID_MASK		0xca	/* Valid bits mask */
545
546/* Index 11 - Error Status and Initialization, Mode 1&2 */
547#define	ESI_REG			0x0b	/* Error Status & Init. Register */
548#define	ESI_ORL_MASK		0x03	/* Left ADC Overrange */
549#define	ESI_ORR_MASK		0x0c	/* Right ADC Overrange */
550#define	ESI_DRS			0x10	/* DRQ status */
551#define	ESI_ACI			0x20	/* Auto-Calibrate In Progress */
552#define	ESI_PUR			0x40	/* Playback Underrun */
553#define	ESI_COR			0x80	/* Capture Overrun */
554#define	ESI_VALID_MASK		0xff	/* Valid bits mask */
555
556/* Index 12 - Mode and ID, Modes 1&2 */
557#define	MID_REG			0x0c	/* Mode and ID Register */
558#define	MID_ID_MASK		0x0f	/* CODEC ID */
559#define	MID_MODE2		0x40	/* Mode 2 enable */
560#define	MID_VALID_MASK		0xcf	/* Valid bits mask */
561
562/* Index 13 - Loopback Control, Modes 1&2 */
563#define	LC_REG			0x0d	/* Loopback Control Register */
564#define	LC_LBE			0x01	/* Loopback Enable */
565#define	LC_ATTEN_MASK		0xfc	/* Loopback attenuation mask */
566#define	LC_OFF			0x00	/* Loopback off */
567#define	LC_VALID_MASK		0xfd	/* Valid bits mask */
568
569/* Index 14 - Playback Upper Base, Mode 2 only */
570#define	PUB_REG			0x0e	/* Playback Upper Base Register */
571#define	PUB_VALID_MASK		0xff	/* Valid bits mask */
572
573/* Index 15 - Playback Lower Base, Mode 2 only */
574#define	PLB_REG			0x0f	/* Playback Lower Base Register */
575#define	PLB_VALID_MASK		0xff	/* Valid bits mask */
576
577/* Index 16 - Alternate Feature Enable 1, Mode 2 only */
578#define	AFE1_REG		0x10	/* Alternate Feature Enable 1 Reg */
579#define	AFE1_DACZ		0x01	/* DAC Zero */
580#define	AFE1_TE			0x40	/* Timer Enable */
581#define	AFE1_OLB		0x80	/* Output Level Bit, 1=2.8Vpp, 0=2Vpp */
582#define	AFE1_VALID_MASK		0xc1	/* Valid bits mask */
583
584/* Index 17 - Alternate Feature Enable 2, Mode 2 only */
585#define	AFE2_REG		0x11	/* Alternate Feature Enable 2 Reg */
586#define	AFE2_HPF		0x01	/* High Pass Filter - DC blocking */
587#define	AFE2_VALID_MASK		0x01	/* Valid bits mask */
588
589/* Index 18 - Left Line Input Control, Mode 2 only */
590#define	LLIC_REG		0x12	/* Left Line Input Control Register */
591#define	LLIC_MIX_GAIN_MASK	0x1f	/* Left Mix Gain Mask, 1.5 dB/step */
592#define	LLIC_LLM		0x80	/* Left Line Mute */
593#define	LLIC_UNITY_GAIN		0x08	/* Left unit gain */
594#define	LLIC_VALID_MASK		0x9f	/* Left valid bits mask */
595
596/* Index 19 - Right Line Input Control, Mode 2 only */
597#define	RLIC_REG		0x13	/* Right Line Input Control Register */
598#define	RLIC_MIX_GAIN_MASK	0x1f	/* Right Mix Gain Mask, 1.5 dB/step */
599#define	RLIC_RLM		0x80	/* Right Line Mute */
600#define	RLIC_UNITY_GAIN		0x08	/* Right unit gain */
601#define	RLIC_VALID_MASK		0x9f	/* Right valid bits mask */
602
603/* Index 20 - Timer Lower Byte, Mode 2 only */
604#define	TLB_REG			0x14	/* Timer Lower Byte Register */
605#define	TLB_VALID_MASK		0xff	/* Valid bits mask */
606
607/* Index 21 - Timer Upper Byte, Mode 2 only */
608#define	TUB_REG			0x15	/* Timer Upper Byte Register */
609#define	TUB_VALID_MASK		0xff	/* Valid bits mask */
610
611/* Index 22 and 23 are reserved */
612
613/* Index 24 - Alternate Feature Status, Mode 2 only */
614#define	AFS_REG			0x18	/* Alternate Feature Status Register */
615#define	AFS_PU			0x01	/* Playback Underrun */
616#define	AFS_PO			0x02	/* Playback Overrun */
617#define	AFS_CO			0x04	/* Capture Overrun */
618#define	AFS_CU			0x08	/* Capture Underrun */
619#define	AFS_PI			0x10	/* Playback Interrupt */
620#define	AFS_CI			0x20	/* Capture Interrupt */
621#define	AFS_TI			0x40	/* Timer Interrupt */
622#define	AFS_RESET_STATUS	0x00	/* Reset the status register */
623#define	AFS_VALID_MASK		0x7f	/* Valid bits mask */
624
625/* Index 25 - Version and ID, Mode 2 only */
626#define	VID_REG			0x19	/* Version and ID Register */
627#define	VID_CID_MASK		0x07	/* Chip ID Mask */
628#define	VID_VERSION_MASK	0xe0	/* Version number Mask */
629#define	VID_A			0x20	/* Version A */
630#define	VID_CDE			0x80	/* Versions C, D or E */
631#define	VID_VALID_MASK		0xe7	/* Valid bits mask */
632
633/* Index 26 - Mono I/O Control, Mode 2 only */
634#define	MIOC_REG		0x1a	/* Mono I/O Control Register */
635#define	MIOC_MI_ATTEN_MASK	0x0f	/* Mono In Attenuation Mask */
636#define	MIOC_MOM		0x40	/* Mono Out Mute */
637#define	MIOC_MONO_SPKR_MUTE	0x40	/* Mono (internal) speaker mute */
638#define	MIOC_MIM		0x80	/* Mono In Mute */
639#define	MIOC_VALID_MASK		0xcf	/* Valid bits mask */
640
641/* Index 27 is reserved */
642
643/* Index 28 - Capture Data Format, Mode 2 only */
644#define	CDF_REG			0x1c	/* Capture Date Foramt Register */
645#define	CDF_STEREO		0x10	/* Stereo Capture */
646#define	CDF_MONO		0x00	/* Mono Capture */
647#define	CDF_LINEAR8		0x00	/* Linear, 8-bit unsigned */
648#define	CDF_ULAW8		0x20	/* u-Law, 8-bit companded */
649#define	CDF_LINEAR16LE		0x40	/* Linear, 16-bit signed, little end. */
650#define	CDF_ALAW8		0x60	/* A-Law, 8-bit companded */
651#define	CDF_ADPCM4		0xa0	/* ADPCM, 4-bit, IMA compatible */
652#define	CDF_LINEAR16BE		0xc0	/* Linear, 16-bit signed, big endian */
653#define	CDF_VALID_MASK		0xf0	/* Valid bits mask */
654#ifdef	_BIG_ENDIAN
655#define	CDF_LINEAR16NE		CDF_LINEAR16BE
656#else
657#define	CDF_LINEAR16NE		CDF_LINEAR16LE
658#endif
659
660/* Index 29 is reserved */
661
662/* Index 30 - Capture Upper Base, Mode 2 only */
663#define	CUB_REG			0x1e	/* Capture Upper Base Register */
664#define	CUB_VALID_MASK		0xff	/* Valid bits mask */
665
666/* Index 31 - Capture Lower Base, Mode 2 only */
667#define	CLB_REG			0x1f	/* Capture Lower Base Register */
668#define	CLB_VALID_MASK		0xff	/* Valid bits mask */
669
670#endif	/* _KERNEL */
671
672#ifdef __cplusplus
673}
674#endif
675
676#endif	/* _AUDIO_4231_H */
677