PSARC 2009/689 Audio DDI Simplifications
[unleashed.git] / usr / src / uts / sun / io / audio / drv / audiocs / audio_4231.h
blobdca17eed8f3416c6b943b6c1739b21148b206b8d
1 /*
2 * CDDL HEADER START
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.
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.
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]
19 * CDDL HEADER END
22 * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 #ifndef _AUDIO_4231_H
27 #define _AUDIO_4231_H
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
34 * Header file for the audiocs device driver.
38 * Values returned by the AUDIO_GETDEV ioctl()
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 */
53 * Driver supported configuration information
55 #define CS4231_NAME "audiocs"
56 #define CS4231_MOD_NAME "CS4231 audio driver"
59 * Implementation specific header file for the audiocs device driver.
62 #ifdef _KERNEL
64 enum {
65 CTL_VOLUME = 0,
66 CTL_IGAIN,
67 CTL_MGAIN,
68 CTL_INPUTS,
69 CTL_OUTPUTS,
70 CTL_MICBOOST,
71 CTL_NUM
74 typedef struct CS_engine CS_engine_t;
75 typedef struct CS_ctrl CS_ctrl_t;
76 typedef struct CS_state CS_state_t;
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.
84 struct 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 */
96 typedef struct cs4231_apc cs4231_apc_t;
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
109 * APC CSR Register bit definitions
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 */
137 #define APC_ID_VALUE 0x7E000000u /* ID read from CSR */
138 #define APC_CLEAR_RESET_VALUE 0x00
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)
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)
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.
158 struct cs4231_eb2regs {
159 uint32_t eb2csr; /* Ebus 2 csr */
160 uint32_t eb2acr; /* ebus 2 Addrs */
161 uint32_t eb2bcr; /* ebus 2 counts */
163 typedef struct cs4231_eb2regs cs4231_eb2regs_t;
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
174 * Audio auxio register definitions
176 #define EB2_AUXIO_COD_PDWN 0x00000001u /* power down Codec */
179 * EBUS 2 CSR definitions
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 */
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)
213 #define EB2_PLAY_ENABLE (EB2_EN_DMA|EB2_EN_CNT|EB2_64|\
214 EB2_PCLEAR_RESET_VALUE)
216 #define EB2_REC_ENABLE (EB2_EN_DMA|EB2_EN_CNT|EB2_64|\
217 EB2_RCLEAR_RESET_VALUE)
219 #define EB2_FIFO_DRAIN (EB2_DRAIN|EB2_CYC_PENDING)
222 * Misc. defines
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)
239 * Supported dma engines and the ops vector
241 enum cs_dmae_types {APC_DMA, EB2_DMA};
242 typedef enum cs_dmae_types cs_dmae_types_e;
245 * Hardware registers
247 struct 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];
257 typedef struct cs4231_pioregs cs4231_pioregs_t;
260 struct 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 */
265 typedef struct cs4231_eb2 cs4231_eb2_t;
267 struct cs4231_regs {
268 cs4231_pioregs_t codec; /* CS4231 CODEC registers */
269 cs4231_apc_t apc; /* gets mapped with CODEC */
271 typedef struct cs4231_regs cs4231_regs_t;
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. */
279 * Misc. state enumerations and structures
281 struct 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 */
287 typedef 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
295 * CS_port_t - per port (playback or record) state
297 struct 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;
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;
312 /* registers (EB2 only) */
313 ddi_acc_handle_t ce_regsh;
314 cs4231_eb2regs_t *ce_eb2regs; /* EB2 registers */
316 /* codec enable */
317 uint8_t ce_codec_en;
320 struct CS_ctrl {
321 CS_state_t *cc_state;
322 audio_ctrl_t *cc_ctrl;
323 uint32_t cc_num;
324 uint64_t cc_val;
328 * CS_state_t - per instance state and operation data
330 struct 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 */
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 */
342 boolean_t cs_suspended; /* power management state */
343 boolean_t cs_powered; /* device powered up? */
345 CS_engine_t *cs_engines[2];
347 boolean_t cs_revA; /* B_TRUE if Rev A CODEC */
348 uint8_t cs_save[CS4231_REGS]; /* PM reg. storage */
351 * Control related fields.
353 uint64_t cs_imask;
354 uint64_t cs_omask;
355 uint64_t cs_omod; /* modifiable ports */
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;
366 * DMA ops vector definition
368 struct 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 *);
380 typedef struct cs4231_dma_ops cs4231_dma_ops_t;
382 extern cs4231_dma_ops_t cs4231_apcdma_ops;
383 extern cs4231_dma_ops_t cs4231_eb2dma_ops;
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)
396 * Useful bit twiddlers
398 #define CS4231_RETRIES 10
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)))
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)))
409 * CS4231 Register Set Definitions
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
611 /* Index 22 and 23 are reserved */
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 */
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 */
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 */
641 /* Index 27 is reserved */
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
660 /* Index 29 is reserved */
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 */
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 */
670 #endif /* _KERNEL */
672 #ifdef __cplusplus
674 #endif
676 #endif /* _AUDIO_4231_H */