1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
|
/* $OpenBSD: cmpcivar.h,v 1.7 2010/10/08 14:01:07 jakemsr Exp $ */
/* $NetBSD: cmpcivar.h,v 1.9 2005/12/11 12:22:48 christos Exp $ */
/*
* Copyright (c) 2000, 2001 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Takuya SHIOZAKI <tshiozak@NetBSD.org> .
*
* This code is derived from software contributed to The NetBSD Foundation
* by ITOH Yasufumi.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*/
/* C-Media CMI8x38 Audio Chip Support */
#ifndef _DEV_PCI_CMPCIVAR_H_
#define _DEV_PCI_CMPCIVAR_H_
/*
* DMA pool
*/
struct cmpci_dmanode {
bus_dma_tag_t cd_tag;
int cd_nsegs;
bus_dma_segment_t cd_segs[1];
bus_dmamap_t cd_map;
caddr_t cd_addr;
size_t cd_size;
struct cmpci_dmanode *cd_next;
};
typedef struct cmpci_dmanode *cmpci_dmapool_t;
#define KVADDR(dma) ((void *)(dma)->cd_addr)
#define DMAADDR(dma) ((dma)->cd_map->dm_segs[0].ds_addr)
/*
* Mixer device
*
* Note that cmpci_query_devinfo() is optimized depending on
* the order of this. Be careful if you change the values.
*/
#define CMPCI_DAC_VOL 0 /* inputs.dac */
#define CMPCI_FM_VOL 1 /* inputs.fmsynth */
#define CMPCI_CD_VOL 2 /* inputs.cd */
#define CMPCI_LINE_IN_VOL 3 /* inputs.line */
#define CMPCI_AUX_IN_VOL 4 /* inputs.aux */
#define CMPCI_MIC_VOL 5 /* inputs.mic */
#define CMPCI_DAC_MUTE 6 /* inputs.dac.mute */
#define CMPCI_FM_MUTE 7 /* inputs.fmsynth.mute */
#define CMPCI_CD_MUTE 8 /* inputs.cd.mute */
#define CMPCI_LINE_IN_MUTE 9 /* inputs.line.mute */
#define CMPCI_AUX_IN_MUTE 10 /* inputs.aux.mute */
#define CMPCI_MIC_MUTE 11 /* inputs.mic.mute */
#define CMPCI_MIC_PREAMP 12 /* inputs.mic.preamp */
#define CMPCI_PCSPEAKER 13 /* inputs.speaker */
#define CMPCI_RECORD_SOURCE 14 /* record.source */
#define CMPCI_MIC_RECVOL 15 /* record.mic */
#define CMPCI_PLAYBACK_MODE 16 /* playback.mode */
#define CMPCI_SPDIF_IN_SELECT 17 /* spdif.input */
#define CMPCI_SPDIF_IN_PHASE 18 /* spdif.input.phase */
#define CMPCI_SPDIF_LOOP 19 /* spdif.output */
#define CMPCI_SPDIF_OUT_PLAYBACK 20 /* spdif.output.playback */
#define CMPCI_SPDIF_OUT_VOLTAGE 21 /* spdif.output.voltage */
#define CMPCI_MONITOR_DAC 22 /* spdif.monitor */
#define CMPCI_MASTER_VOL 23 /* outputs.master */
#define CMPCI_REAR 24 /* outputs.rear */
#define CMPCI_INDIVIDUAL 25 /* outputs.rear.individual */
#define CMPCI_REVERSE 26 /* outputs.rear.reverse */
#define CMPCI_SURROUND 27 /* outputs.surround */
#define CMPCI_NDEVS 28
#define CMPCI_INPUT_CLASS 28
#define CMPCI_OUTPUT_CLASS 29
#define CMPCI_RECORD_CLASS 30
#define CMPCI_PLAYBACK_CLASS 31
#define CMPCI_SPDIF_CLASS 32
#define CmpciNspdif "spdif"
#define CmpciCspdif "spdif"
#define CmpciNspdin "spdin"
#define CmpciNspdin1 "spdin1"
#define CmpciNspdin2 "spdin2"
#define CmpciNspdout "spdout"
#define CmpciNplayback "playback"
#define CmpciCplayback "playback"
#define CmpciNlegacy "legacy"
#define CmpciNvoltage "voltage"
#define CmpciNphase "phase"
#define CmpciNpositive "positive"
#define CmpciNnegative "negative"
#define CmpciNrear "rear"
#define CmpciNindividual "individual"
#define CmpciNreverse "reverse"
#define CmpciNhigh_v "5V"
#define CmpciNlow_v "0.5V"
#define CmpciNsurround "surround"
/* record.source bitmap (see cmpci_set_in_ports()) */
#define CMPCI_RECORD_SOURCE_MIC CMPCI_SB16_MIXER_MIC_SRC /* mic */
#define CMPCI_RECORD_SOURCE_CD CMPCI_SB16_MIXER_CD_SRC_R /* cd */
#define CMPCI_RECORD_SOURCE_LINE_IN CMPCI_SB16_MIXER_LINE_SRC_R /* line */
#define CMPCI_RECORD_SOURCE_AUX_IN (1 << 8) /* aux */
#define CMPCI_RECORD_SOURCE_WAVE (1 << 9) /* wave */
#define CMPCI_RECORD_SOURCE_FM CMPCI_SB16_MIXER_FM_SRC_R /* fmsynth*/
#define CMPCI_RECORD_SOURCE_SPDIF (1 << 10) /* spdif */
/* playback.mode */
#define CMPCI_PLAYBACK_MODE_WAVE 0 /* dac */
#define CMPCI_PLAYBACK_MODE_SPDIF 1 /* spdif */
/* spdif.input */
#define CMPCI_SPDIFIN_SPDIFIN2 0x01
#define CMPCI_SPDIFIN_SPDIFOUT 0x02
#define CMPCI_SPDIF_IN_SPDIN1 0 /* spdin1 */
#define CMPCI_SPDIF_IN_SPDIN2 CMPCI_SPDIFIN_SPDIFIN2 /* spdin2 */
#define CMPCI_SPDIF_IN_SPDOUT (CMPCI_SPDIFIN_SPDIFIN2|CMPCI_SPDIFIN_SPDIFOUT)
/* spdout */
/* spdif.input.phase */
#define CMPCI_SPDIF_IN_PHASE_POSITIVE 0 /* positive */
#define CMPCI_SPDIF_IN_PHASE_NEGATIVE 1 /* negative */
/* spdif.output */
#define CMPCI_SPDIF_LOOP_OFF 0 /* playback */
#define CMPCI_SPDIF_LOOP_ON 1 /* spdin */
/* spdif.output.playback */
#define CMPCI_SPDIF_OUT_PLAYBACK_WAVE 0 /* wave */
#define CMPCI_SPDIF_OUT_PLAYBACK_LEGACY 1 /* legacy */
/* spdif.output.voltage */
#define CMPCI_SPDIF_OUT_VOLTAGE_HIGH 0 /* 5V */
#define CMPCI_SPDIF_OUT_VOLTAGE_LOW 1 /* 0.5V */
/* spdif.monitor */
#define CMPCI_MONDAC_ENABLE 0x01
#define CMPCI_MONDAC_SPDOUT 0x02
#define CMPCI_MONITOR_DAC_OFF 0 /* off */
#define CMPCI_MONITOR_DAC_SPDIN CMPCI_MONDAC_ENABLE /* spdin */
#define CMPCI_MONITOR_DAC_SPDOUT (CMPCI_MONDAC_ENABLE | CMPCI_MONDAC_SPDOUT)
/* spdout */
/*
* softc
*/
/* each channel */
struct cmpci_channel {
void (*intr)(void *);
void *intr_arg;
int md_divide;
int bps;
int blksize;
int nblocks;
int swpos;
};
struct cmpci_softc {
struct device sc_dev;
/* model/rev */
uint32_t sc_id;
uint32_t sc_class;
uint32_t sc_capable;
#define CMPCI_CAP_SPDIN 0x00000001
#define CMPCI_CAP_SPDOUT 0x00000002
#define CMPCI_CAP_SPDLOOP 0x00000004
#define CMPCI_CAP_SPDLEGACY 0x00000008
#define CMPCI_CAP_SPDIN_MONITOR 0x00000010
#define CMPCI_CAP_XSPDOUT 0x00000020
#define CMPCI_CAP_SPDOUT_VOLTAGE 0x00000040
#define CMPCI_CAP_SPDOUT_48K 0x00000080
#define CMPCI_CAP_SURROUND 0x00000100
#define CMPCI_CAP_REAR 0x00000200
#define CMPCI_CAP_INDIVIDUAL_REAR 0x00000400
#define CMPCI_CAP_REVERSE_FR 0x00000800
#define CMPCI_CAP_SPDIN_PHASE 0x00001000
#define CMPCI_CAP_2ND_SPDIN 0x00002000
#define CMPCI_CAP_4CH 0x00004000
#define CMPCI_CAP_6CH 0x00008000
#define CMPCI_CAP_8CH 0x00010000
#define CMPCI_CAP_CMI8338 (CMPCI_CAP_SPDIN | CMPCI_CAP_SPDOUT | \
CMPCI_CAP_SPDLOOP | CMPCI_CAP_SPDLEGACY)
#define CMPCI_CAP_CMI8738 (CMPCI_CAP_CMI8338 | \
CMPCI_CAP_SPDIN_MONITOR | \
CMPCI_CAP_XSPDOUT | \
CMPCI_CAP_SPDOUT_VOLTAGE | \
CMPCI_CAP_SPDOUT_48K | CMPCI_CAP_SURROUND |\
CMPCI_CAP_REAR | \
CMPCI_CAP_INDIVIDUAL_REAR | \
CMPCI_CAP_REVERSE_FR | \
CMPCI_CAP_SPDIN_PHASE | \
CMPCI_CAP_2ND_SPDIN /* XXX 6ch only */)
#define CMPCI_ISCAP(sc, name) (sc->sc_capable & CMPCI_CAP_ ## name)
/* I/O Base device */
bus_space_tag_t sc_iot;
bus_space_handle_t sc_ioh;
bus_space_handle_t sc_mpu_ioh;
struct device *sc_mpudev;
/* intr handle */
pci_intr_handle_t *sc_ih;
/* DMA */
bus_dma_tag_t sc_dmat;
cmpci_dmapool_t sc_dmap;
/* each channel */
struct cmpci_channel sc_ch0, sc_ch1;
/* which channel is used for playback */
uint32_t sc_play_channel;
/* value of CMPCI_REG_MISC register */
uint32_t sc_reg_misc;
/* chip version */
uint32_t sc_version;
/* mixer */
uint8_t sc_gain[CMPCI_NDEVS][2];
#define CMPCI_LEFT 0
#define CMPCI_RIGHT 1
#define CMPCI_LR 0
uint16_t sc_in_mask;
};
#endif /* _DEV_PCI_CMPCIVAR_H_ */
/* end of file */
|