summaryrefslogtreecommitdiffstats
path: root/sys/dev/pci/cmpcivar.h
blob: 17d8dcdafedf7765cc2abb5f53511bbdc346f01c (plain) (blame)
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 */