1/*-
2 * Copyright (c) 1999 Cameron Grant <gandalf@vilnya.demon.co.uk>
3 * Copyright (c) 2003-2006 Yuriy Tsibizov <yuriy.tsibizov@gfk.ru>
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHERIN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 *
27 * $FreeBSD$
28 */
29
30#ifndef EMU10KX_H
31#define	EMU10KX_H
32
33#define	SND_EMU10KX_MINVER	1
34#define	SND_EMU10KX_PREFVER	1
35#define	SND_EMU10KX_MAXVER	1
36
37#ifdef _KERNEL
38
39#define	EMUPAGESIZE	4096
40#define	NUM_G		64
41/* XXX some (empty) samples are played when play buffer is > EMUPAGESIZE */
42#define	EMU_PLAY_BUFSZ	EMUPAGESIZE
43/* Recording is limited by EMUPAGESIZE*16=64K buffer */
44#define	EMU_REC_BUFSZ	EMUPAGESIZE*16
45#define	EMU_MAX_BUFSZ	EMUPAGESIZE*16
46#define	EMU_MAXPAGES	8192
47
48
49#define	EMU_VAR_FUNC		0
50#define	EMU_VAR_ROUTE		1
51#define	EMU_VAR_ISEMU10K1 	2
52#define	EMU_VAR_MCH_DISABLED 	3
53#define	EMU_VAR_MCH_REC 	4
54
55#define EMU_A_IOCFG_DISABLE_ANALOG	0x0040	/* = 'enable' for Audigy2 */
56#define EMU_A_IOCFG_GPOUT2	0x0001
57#define EMU_AC97SLOT_REAR_RIGHT	0x01
58#define EMU_AC97SLOT_REAR_LEFT	0x02
59#define EMU_HCFG_GPOUT0		0x00001000
60#define EMU_HCFG_GPOUT1		0x00000800
61#define EMU_HCFG_GPOUT2		0x00000400
62
63#define	RT_FRONT		0
64#define	RT_REAR			1
65#define	RT_CENTER		2
66#define	RT_SUB			3
67#define	RT_SIDE			4
68#define	RT_MCHRECORD		5
69#define	RT_COUNT		6
70
71/* mixer controls */
72/* fx play */
73#define	M_FX0_FRONT_L		0
74#define	M_FX1_FRONT_R		1
75#define	M_FX2_REAR_L		2
76#define	M_FX3_REAR_R		3
77#define	M_FX4_CENTER		4
78#define	M_FX5_SUBWOOFER		5
79#define	M_FX6_SIDE_L		6
80#define	M_FX7_SIDE_R		7
81/* fx rec */
82#define	M_FX0_REC_L		8
83#define	M_FX1_REC_R		9
84/* inputs play */
85#define	M_IN0_FRONT_L		10
86#define	M_IN0_FRONT_R		11
87#define	M_IN1_FRONT_L		12
88#define	M_IN1_FRONT_R		13
89#define	M_IN2_FRONT_L		14
90#define	M_IN2_FRONT_R		15
91#define	M_IN3_FRONT_L		16
92#define	M_IN3_FRONT_R		17
93#define	M_IN4_FRONT_L		18
94#define	M_IN4_FRONT_R		19
95#define	M_IN5_FRONT_L		20
96#define	M_IN5_FRONT_R		21
97#define	M_IN6_FRONT_L		22
98#define	M_IN6_FRONT_R		23
99#define	M_IN7_FRONT_L		24
100#define	M_IN7_FRONT_R		25
101/* inputs rec */
102#define	M_IN0_REC_L		26
103#define	M_IN0_REC_R		27
104#define	M_IN1_REC_L		28
105#define	M_IN1_REC_R		29
106#define	M_IN2_REC_L		30
107#define	M_IN2_REC_R		31
108#define	M_IN3_REC_L		32
109#define	M_IN3_REC_R		33
110#define	M_IN4_REC_L		34
111#define	M_IN4_REC_R		35
112#define	M_IN5_REC_L		36
113#define	M_IN5_REC_R		37
114#define	M_IN6_REC_L		38
115#define	M_IN6_REC_R		39
116#define	M_IN7_REC_L		40
117#define	M_IN7_REC_R		41
118/* master volume */
119#define	M_MASTER_FRONT_L	42
120#define	M_MASTER_FRONT_R	43
121#define	M_MASTER_REAR_L		44
122#define	M_MASTER_REAR_R		45
123#define	M_MASTER_CENTER		46
124#define	M_MASTER_SUBWOOFER	47
125#define	M_MASTER_SIDE_L		48
126#define	M_MASTER_SIDE_R		49
127/* master rec volume */
128#define	M_MASTER_REC_L		50
129#define	M_MASTER_REC_R		51
130
131#define	NUM_MIXERS		52
132
133struct emu_sc_info;
134
135/* MIDI device parameters */
136struct emu_midiinfo {
137	struct emu_sc_info *card;
138	int		port;
139	int		portnr;
140};
141
142/* PCM device parameters */
143struct emu_pcminfo {
144	struct emu_sc_info *card;
145	int		route;
146};
147
148int	emu_intr_register(struct emu_sc_info *sc, uint32_t inte_mask, uint32_t intr_mask, uint32_t(*func) (void *softc, uint32_t irq), void *isc);
149int	emu_intr_unregister(struct emu_sc_info *sc, int ihandle);
150
151uint32_t emu_rd(struct emu_sc_info *sc, unsigned int regno, unsigned int size);
152void	emu_wr(struct emu_sc_info *sc, unsigned int regno, uint32_t data, unsigned int size);
153
154uint32_t emu_rdptr(struct emu_sc_info *sc, unsigned int chn, unsigned int reg);
155void	emu_wrptr(struct emu_sc_info *sc, unsigned int chn, unsigned int reg, uint32_t data);
156
157uint32_t emu_rd_p16vptr(struct emu_sc_info *sc, uint16_t chn, uint16_t reg);
158void	emu_wr_p16vptr(struct emu_sc_info *sc, uint16_t chn, uint16_t reg, uint32_t data);
159
160int	emu_timer_create(struct emu_sc_info *sc);
161int	emu_timer_set(struct emu_sc_info *sc, int timer, int delay);
162int	emu_timer_enable(struct emu_sc_info *sc, int timer, int go);
163int	emu_timer_clear(struct emu_sc_info *sc, int timer);
164
165struct emu_voice;
166
167struct emu_route {
168	int	routing_left[8];
169	int	amounts_left[8];
170	int	routing_right[8];
171	int	amounts_right[8];
172};
173
174struct emu_voice* emu_valloc(struct emu_sc_info *sc);
175void 	emu_vfree(struct emu_sc_info *sc, struct emu_voice *v);
176int	emu_vinit(struct emu_sc_info *sc, struct emu_voice *m, struct emu_voice *s,
177    uint32_t sz, struct snd_dbuf *b);
178void	emu_vroute(struct emu_sc_info *sc, struct emu_route *rt,  struct emu_voice *v);
179void	emu_vsetup(struct emu_voice *v, int fmt, int spd);
180void	emu_vwrite(struct emu_sc_info *sc, struct emu_voice *v);
181void	emu_vtrigger(struct emu_sc_info *sc, struct emu_voice *v, int go);
182int	emu_vpos(struct emu_sc_info *sc, struct emu_voice *v);
183
184bus_dma_tag_t emu_gettag(struct emu_sc_info *sc);
185
186void	emumix_set_volume(struct emu_sc_info *sc, int mixer_idx, int volume);
187int	emumix_get_volume(struct emu_sc_info *sc, int mixer_idx);
188
189void	emu_enable_ir(struct emu_sc_info *sc);
190#endif				/* _KERNEL */
191#endif				/* EMU10K1_H */
192