xref: /OK3568_Linux_fs/kernel/sound/pci/echoaudio/echoaudio.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /****************************************************************************
2*4882a593Smuzhiyun 
3*4882a593Smuzhiyun    Copyright Echo Digital Audio Corporation (c) 1998 - 2004
4*4882a593Smuzhiyun    All rights reserved
5*4882a593Smuzhiyun    www.echoaudio.com
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun    This file is part of Echo Digital Audio's generic driver library.
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun    Echo Digital Audio's generic driver library is free software;
10*4882a593Smuzhiyun    you can redistribute it and/or modify it under the terms of
11*4882a593Smuzhiyun    the GNU General Public License as published by the Free Software
12*4882a593Smuzhiyun    Foundation.
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun    This program is distributed in the hope that it will be useful,
15*4882a593Smuzhiyun    but WITHOUT ANY WARRANTY; without even the implied warranty of
16*4882a593Smuzhiyun    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17*4882a593Smuzhiyun    GNU General Public License for more details.
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun    You should have received a copy of the GNU General Public License
20*4882a593Smuzhiyun    along with this program; if not, write to the Free Software
21*4882a593Smuzhiyun    Foundation, Inc., 59 Temple Place - Suite 330, Boston,
22*4882a593Smuzhiyun    MA  02111-1307, USA.
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun  ****************************************************************************
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun  Translation from C++ and adaptation for use in ALSA-Driver
27*4882a593Smuzhiyun  were made by Giuliano Pochini <pochini@shiny.it>
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun  ****************************************************************************
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun    Here's a block diagram of how most of the cards work:
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun                   +-----------+
35*4882a593Smuzhiyun            record |           |<-------------------- Inputs
36*4882a593Smuzhiyun           <-------|           |        |
37*4882a593Smuzhiyun      PCI          | Transport |        |
38*4882a593Smuzhiyun      bus          |  engine   |       \|/
39*4882a593Smuzhiyun           ------->|           |    +-------+
40*4882a593Smuzhiyun             play  |           |--->|monitor|-------> Outputs
41*4882a593Smuzhiyun                   +-----------+    | mixer |
42*4882a593Smuzhiyun                                    +-------+
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun    The lines going to and from the PCI bus represent "pipes".  A pipe performs
45*4882a593Smuzhiyun    audio transport - moving audio data to and from buffers on the host via
46*4882a593Smuzhiyun    bus mastering.
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun    The inputs and outputs on the right represent input and output "busses."
49*4882a593Smuzhiyun    A bus is a physical, real connection to the outside world.  An example
50*4882a593Smuzhiyun    of a bus would be the 1/4" analog connectors on the back of Layla or
51*4882a593Smuzhiyun    an RCA S/PDIF connector.
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun    For most cards, there is a one-to-one correspondence between outputs
54*4882a593Smuzhiyun    and busses; that is, each individual pipe is hard-wired to a single bus.
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun    Cards that work this way are Darla20, Gina20, Layla20, Darla24, Gina24,
57*4882a593Smuzhiyun    Layla24, Mona, and Indigo.
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun    Mia has a feature called "virtual outputs."
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun                   +-----------+
64*4882a593Smuzhiyun            record |           |<----------------------------- Inputs
65*4882a593Smuzhiyun           <-------|           |                  |
66*4882a593Smuzhiyun      PCI          | Transport |                  |
67*4882a593Smuzhiyun      bus          |  engine   |                 \|/
68*4882a593Smuzhiyun           ------->|           |   +------+   +-------+
69*4882a593Smuzhiyun             play  |           |-->|vmixer|-->|monitor|-------> Outputs
70*4882a593Smuzhiyun                   +-----------+   +------+   | mixer |
71*4882a593Smuzhiyun                                              +-------+
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun    Obviously, the difference here is the box labeled "vmixer."  Vmixer is
75*4882a593Smuzhiyun    short for "virtual output mixer."  For Mia, pipes are *not* hard-wired
76*4882a593Smuzhiyun    to a single bus; the vmixer lets you mix any pipe to any bus in any
77*4882a593Smuzhiyun    combination.
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun    Note, however, that the left-hand side of the diagram is unchanged.
80*4882a593Smuzhiyun    Transport works exactly the same way - the difference is in the mixer stage.
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun    Pipes and busses are numbered starting at zero.
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun    Pipe index
88*4882a593Smuzhiyun    ==========
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun    A number of calls in CEchoGals refer to a "pipe index".  A pipe index is
91*4882a593Smuzhiyun    a unique number for a pipe that unambiguously refers to a playback or record
92*4882a593Smuzhiyun    pipe.  Pipe indices are numbered starting with analog outputs, followed by
93*4882a593Smuzhiyun    digital outputs, then analog inputs, then digital inputs.
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun    Take Gina24 as an example:
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun    Pipe index
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun    0-7            Analog outputs (0 .. FirstDigitalBusOut-1)
100*4882a593Smuzhiyun    8-15           Digital outputs (FirstDigitalBusOut .. NumBussesOut-1)
101*4882a593Smuzhiyun    16-17          Analog inputs
102*4882a593Smuzhiyun    18-25          Digital inputs
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun    You get the pipe index by calling CEchoGals::OpenAudio; the other transport
106*4882a593Smuzhiyun    functions take the pipe index as a parameter.  If you need a pipe index for
107*4882a593Smuzhiyun    some other reason, use the handy Makepipe_index method.
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun    Some calls take a CChannelMask parameter; CChannelMask is a handy way to
111*4882a593Smuzhiyun    group pipe indices.
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun    Digital mode switch
116*4882a593Smuzhiyun    ===================
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun    Some cards (right now, Gina24, Layla24, and Mona) have a Digital Mode Switch
119*4882a593Smuzhiyun    or DMS.  Cards with a DMS can be set to one of three mutually exclusive
120*4882a593Smuzhiyun    digital modes: S/PDIF RCA, S/PDIF optical, or ADAT optical.
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun    This may create some confusion since ADAT optical is 8 channels wide and
123*4882a593Smuzhiyun    S/PDIF is only two channels wide.  Gina24, Layla24, and Mona handle this
124*4882a593Smuzhiyun    by acting as if they always have 8 digital outs and ins.  If you are in
125*4882a593Smuzhiyun    either S/PDIF mode, the last 6 channels don't do anything - data sent
126*4882a593Smuzhiyun    out these channels is thrown away and you will always record zeros.
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun    Note that with Gina24, Layla24, and Mona, sample rates above 50 kHz are
129*4882a593Smuzhiyun    only available if you have the card configured for S/PDIF optical or S/PDIF
130*4882a593Smuzhiyun    RCA.
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun    Double speed mode
135*4882a593Smuzhiyun    =================
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun    Some of the cards support 88.2 kHz and 96 kHz sampling (Darla24, Gina24,
138*4882a593Smuzhiyun    Layla24, Mona, Mia, and Indigo).  For these cards, the driver sometimes has
139*4882a593Smuzhiyun    to worry about "double speed mode"; double speed mode applies whenever the
140*4882a593Smuzhiyun    sampling rate is above 50 kHz.
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun    For instance, Mona and Layla24 support word clock sync.  However, they
143*4882a593Smuzhiyun    actually support two different word clock modes - single speed (below
144*4882a593Smuzhiyun    50 kHz) and double speed (above 50 kHz).  The hardware detects if a single
145*4882a593Smuzhiyun    or double speed word clock signal is present; the generic code uses that
146*4882a593Smuzhiyun    information to determine which mode to use.
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun    The generic code takes care of all this for you.
149*4882a593Smuzhiyun */
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun #ifndef _ECHOAUDIO_H_
153*4882a593Smuzhiyun #define _ECHOAUDIO_H_
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun #include "echoaudio_dsp.h"
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun /***********************************************************************
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun 	PCI configuration space
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun ***********************************************************************/
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun /*
167*4882a593Smuzhiyun  * PCI vendor ID and device IDs for the hardware
168*4882a593Smuzhiyun  */
169*4882a593Smuzhiyun #define VENDOR_ID		0x1057
170*4882a593Smuzhiyun #define DEVICE_ID_56301		0x1801
171*4882a593Smuzhiyun #define DEVICE_ID_56361		0x3410
172*4882a593Smuzhiyun #define SUBVENDOR_ID		0xECC0
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun /*
176*4882a593Smuzhiyun  * Valid Echo PCI subsystem card IDs
177*4882a593Smuzhiyun  */
178*4882a593Smuzhiyun #define DARLA20			0x0010
179*4882a593Smuzhiyun #define GINA20			0x0020
180*4882a593Smuzhiyun #define LAYLA20			0x0030
181*4882a593Smuzhiyun #define DARLA24			0x0040
182*4882a593Smuzhiyun #define GINA24			0x0050
183*4882a593Smuzhiyun #define LAYLA24			0x0060
184*4882a593Smuzhiyun #define MONA			0x0070
185*4882a593Smuzhiyun #define MIA			0x0080
186*4882a593Smuzhiyun #define INDIGO			0x0090
187*4882a593Smuzhiyun #define INDIGO_IO		0x00a0
188*4882a593Smuzhiyun #define INDIGO_DJ		0x00b0
189*4882a593Smuzhiyun #define DC8			0x00c0
190*4882a593Smuzhiyun #define INDIGO_IOX		0x00d0
191*4882a593Smuzhiyun #define INDIGO_DJX		0x00e0
192*4882a593Smuzhiyun #define ECHO3G			0x0100
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun /************************************************************************
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun 	Array sizes and so forth
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun ***********************************************************************/
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun /*
202*4882a593Smuzhiyun  * Sizes
203*4882a593Smuzhiyun  */
204*4882a593Smuzhiyun #define ECHO_MAXAUDIOINPUTS	32	/* Max audio input channels */
205*4882a593Smuzhiyun #define ECHO_MAXAUDIOOUTPUTS	32	/* Max audio output channels */
206*4882a593Smuzhiyun #define ECHO_MAXAUDIOPIPES	32	/* Max number of input and output
207*4882a593Smuzhiyun 					 * pipes */
208*4882a593Smuzhiyun #define E3G_MAX_OUTPUTS		16
209*4882a593Smuzhiyun #define ECHO_MAXMIDIJACKS	1	/* Max MIDI ports */
210*4882a593Smuzhiyun #define ECHO_MIDI_QUEUE_SZ 	512	/* Max MIDI input queue entries */
211*4882a593Smuzhiyun #define ECHO_MTC_QUEUE_SZ	32	/* Max MIDI time code input queue
212*4882a593Smuzhiyun 					 * entries */
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun /*
215*4882a593Smuzhiyun  * MIDI activity indicator timeout
216*4882a593Smuzhiyun  */
217*4882a593Smuzhiyun #define MIDI_ACTIVITY_TIMEOUT_USEC	200000
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun /****************************************************************************
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun    Clocks
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun *****************************************************************************/
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun /*
227*4882a593Smuzhiyun  * Clock numbers
228*4882a593Smuzhiyun  */
229*4882a593Smuzhiyun #define ECHO_CLOCK_INTERNAL		0
230*4882a593Smuzhiyun #define ECHO_CLOCK_WORD			1
231*4882a593Smuzhiyun #define ECHO_CLOCK_SUPER		2
232*4882a593Smuzhiyun #define ECHO_CLOCK_SPDIF		3
233*4882a593Smuzhiyun #define ECHO_CLOCK_ADAT			4
234*4882a593Smuzhiyun #define ECHO_CLOCK_ESYNC		5
235*4882a593Smuzhiyun #define ECHO_CLOCK_ESYNC96		6
236*4882a593Smuzhiyun #define ECHO_CLOCK_MTC			7
237*4882a593Smuzhiyun #define ECHO_CLOCK_NUMBER		8
238*4882a593Smuzhiyun #define ECHO_CLOCKS			0xffff
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun /*
241*4882a593Smuzhiyun  * Clock bit numbers - used to report capabilities and whatever clocks
242*4882a593Smuzhiyun  * are being detected dynamically.
243*4882a593Smuzhiyun  */
244*4882a593Smuzhiyun #define ECHO_CLOCK_BIT_INTERNAL		(1 << ECHO_CLOCK_INTERNAL)
245*4882a593Smuzhiyun #define ECHO_CLOCK_BIT_WORD		(1 << ECHO_CLOCK_WORD)
246*4882a593Smuzhiyun #define ECHO_CLOCK_BIT_SUPER		(1 << ECHO_CLOCK_SUPER)
247*4882a593Smuzhiyun #define ECHO_CLOCK_BIT_SPDIF		(1 << ECHO_CLOCK_SPDIF)
248*4882a593Smuzhiyun #define ECHO_CLOCK_BIT_ADAT		(1 << ECHO_CLOCK_ADAT)
249*4882a593Smuzhiyun #define ECHO_CLOCK_BIT_ESYNC		(1 << ECHO_CLOCK_ESYNC)
250*4882a593Smuzhiyun #define ECHO_CLOCK_BIT_ESYNC96		(1 << ECHO_CLOCK_ESYNC96)
251*4882a593Smuzhiyun #define ECHO_CLOCK_BIT_MTC		(1<<ECHO_CLOCK_MTC)
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun /***************************************************************************
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun    Digital modes
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun ****************************************************************************/
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun /*
261*4882a593Smuzhiyun  * Digital modes for Mona, Layla24, and Gina24
262*4882a593Smuzhiyun  */
263*4882a593Smuzhiyun #define DIGITAL_MODE_NONE			0xFF
264*4882a593Smuzhiyun #define DIGITAL_MODE_SPDIF_RCA			0
265*4882a593Smuzhiyun #define DIGITAL_MODE_SPDIF_OPTICAL		1
266*4882a593Smuzhiyun #define DIGITAL_MODE_ADAT			2
267*4882a593Smuzhiyun #define DIGITAL_MODE_SPDIF_CDROM		3
268*4882a593Smuzhiyun #define DIGITAL_MODES				4
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun /*
271*4882a593Smuzhiyun  * Digital mode capability masks
272*4882a593Smuzhiyun  */
273*4882a593Smuzhiyun #define ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_RCA	(1 << DIGITAL_MODE_SPDIF_RCA)
274*4882a593Smuzhiyun #define ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_OPTICAL	(1 << DIGITAL_MODE_SPDIF_OPTICAL)
275*4882a593Smuzhiyun #define ECHOCAPS_HAS_DIGITAL_MODE_ADAT		(1 << DIGITAL_MODE_ADAT)
276*4882a593Smuzhiyun #define ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_CDROM	(1 << DIGITAL_MODE_SPDIF_CDROM)
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun #define EXT_3GBOX_NC			0x01	/* 3G box not connected */
280*4882a593Smuzhiyun #define EXT_3GBOX_NOT_SET		0x02	/* 3G box not detected yet */
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun #define ECHOGAIN_MUTED		(-128)	/* Minimum possible gain */
284*4882a593Smuzhiyun #define ECHOGAIN_MINOUT		(-128)	/* Min output gain (dB) */
285*4882a593Smuzhiyun #define ECHOGAIN_MAXOUT		(6)	/* Max output gain (dB) */
286*4882a593Smuzhiyun #define ECHOGAIN_MININP		(-50)	/* Min input gain (0.5 dB) */
287*4882a593Smuzhiyun #define ECHOGAIN_MAXINP		(50)	/* Max input gain (0.5 dB) */
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun #define PIPE_STATE_STOPPED	0	/* Pipe has been reset */
290*4882a593Smuzhiyun #define PIPE_STATE_PAUSED	1	/* Pipe has been stopped */
291*4882a593Smuzhiyun #define PIPE_STATE_STARTED	2	/* Pipe has been started */
292*4882a593Smuzhiyun #define PIPE_STATE_PENDING	3	/* Pipe has pending start */
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun struct audiopipe {
297*4882a593Smuzhiyun 	volatile __le32 *dma_counter;	/* Commpage register that contains
298*4882a593Smuzhiyun 					 * the current dma position
299*4882a593Smuzhiyun 					 * (lower 32 bits only)
300*4882a593Smuzhiyun 					 */
301*4882a593Smuzhiyun 	u32 last_period;                /* Counter position last time a
302*4882a593Smuzhiyun 					 * period elapsed
303*4882a593Smuzhiyun 					 */
304*4882a593Smuzhiyun 	u32 last_counter;		/* Used exclusively by pcm_pointer
305*4882a593Smuzhiyun 					 * under PCM core locks.
306*4882a593Smuzhiyun 					 * The last position, which is used
307*4882a593Smuzhiyun 					 * to compute...
308*4882a593Smuzhiyun 					 */
309*4882a593Smuzhiyun 	u32 position;			/* ...the number of bytes tranferred
310*4882a593Smuzhiyun 					 * by the DMA engine, modulo the
311*4882a593Smuzhiyun 					 * buffer size
312*4882a593Smuzhiyun 					 */
313*4882a593Smuzhiyun 	short index;			/* Index of the first channel or <0
314*4882a593Smuzhiyun 					 * if hw is not configured yet
315*4882a593Smuzhiyun 					 */
316*4882a593Smuzhiyun 	short interleave;
317*4882a593Smuzhiyun 	struct snd_dma_buffer sgpage;	/* Room for the scatter-gather list */
318*4882a593Smuzhiyun 	struct snd_pcm_hardware hw;
319*4882a593Smuzhiyun 	struct snd_pcm_hw_constraint_list constr;
320*4882a593Smuzhiyun 	short sglist_head;
321*4882a593Smuzhiyun 	char state;			/* pipe state */
322*4882a593Smuzhiyun };
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun struct audioformat {
326*4882a593Smuzhiyun 	u8 interleave;			/* How the data is arranged in memory:
327*4882a593Smuzhiyun 					 * mono = 1, stereo = 2, ...
328*4882a593Smuzhiyun 					 */
329*4882a593Smuzhiyun 	u8 bits_per_sample;		/* 8, 16, 24, 32 (24 bits left aligned) */
330*4882a593Smuzhiyun 	char mono_to_stereo;		/* Only used if interleave is 1 and
331*4882a593Smuzhiyun 					 * if this is an output pipe.
332*4882a593Smuzhiyun 					 */
333*4882a593Smuzhiyun 	char data_are_bigendian;	/* 1 = big endian, 0 = little endian */
334*4882a593Smuzhiyun };
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun struct echoaudio {
338*4882a593Smuzhiyun 	spinlock_t lock;
339*4882a593Smuzhiyun 	struct snd_pcm_substream *substream[DSP_MAXPIPES];
340*4882a593Smuzhiyun 	struct mutex mode_mutex;
341*4882a593Smuzhiyun 	u16 num_digital_modes, digital_mode_list[6];
342*4882a593Smuzhiyun 	u16 num_clock_sources, clock_source_list[10];
343*4882a593Smuzhiyun 	unsigned int opencount;  /* protected by mode_mutex */
344*4882a593Smuzhiyun 	struct snd_kcontrol *clock_src_ctl;
345*4882a593Smuzhiyun 	struct snd_pcm *analog_pcm, *digital_pcm;
346*4882a593Smuzhiyun 	struct snd_card *card;
347*4882a593Smuzhiyun 	const char *card_name;
348*4882a593Smuzhiyun 	struct pci_dev *pci;
349*4882a593Smuzhiyun 	unsigned long dsp_registers_phys;
350*4882a593Smuzhiyun 	struct resource *iores;
351*4882a593Smuzhiyun 	struct snd_dma_buffer commpage_dma_buf;
352*4882a593Smuzhiyun 	int irq;
353*4882a593Smuzhiyun #ifdef ECHOCARD_HAS_MIDI
354*4882a593Smuzhiyun 	struct snd_rawmidi *rmidi;
355*4882a593Smuzhiyun 	struct snd_rawmidi_substream *midi_in, *midi_out;
356*4882a593Smuzhiyun #endif
357*4882a593Smuzhiyun 	struct timer_list timer;
358*4882a593Smuzhiyun 	char tinuse;				/* Timer in use */
359*4882a593Smuzhiyun 	char midi_full;				/* MIDI output buffer is full */
360*4882a593Smuzhiyun 	char can_set_rate;                      /* protected by mode_mutex */
361*4882a593Smuzhiyun 	char rate_set;                          /* protected by mode_mutex */
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun 	/* This stuff is used mainly by the lowlevel code */
364*4882a593Smuzhiyun 	struct comm_page *comm_page;	/* Virtual address of the memory
365*4882a593Smuzhiyun 					 * seen by DSP
366*4882a593Smuzhiyun 					 */
367*4882a593Smuzhiyun 	u32 pipe_alloc_mask;		/* Bitmask of allocated pipes */
368*4882a593Smuzhiyun 	u32 pipe_cyclic_mask;		/* Bitmask of pipes with cyclic
369*4882a593Smuzhiyun 					 * buffers
370*4882a593Smuzhiyun 					 */
371*4882a593Smuzhiyun 	u32 sample_rate;		/* Card sample rate in Hz */
372*4882a593Smuzhiyun 	u8 digital_mode;		/* Current digital mode
373*4882a593Smuzhiyun 					 * (see DIGITAL_MODE_*)
374*4882a593Smuzhiyun 					 */
375*4882a593Smuzhiyun 	u8 spdif_status;		/* Gina20, Darla20, Darla24 - only */
376*4882a593Smuzhiyun 	u8 clock_state;			/* Gina20, Darla20, Darla24 - only */
377*4882a593Smuzhiyun 	u8 input_clock;			/* Currently selected sample clock
378*4882a593Smuzhiyun 					 * source
379*4882a593Smuzhiyun 					 */
380*4882a593Smuzhiyun 	u8 output_clock;		/* Layla20 only */
381*4882a593Smuzhiyun 	char meters_enabled;		/* VU-meters status */
382*4882a593Smuzhiyun 	char asic_loaded;		/* Set true when ASIC loaded */
383*4882a593Smuzhiyun 	char bad_board;			/* Set true if DSP won't load */
384*4882a593Smuzhiyun 	char professional_spdif;	/* 0 = consumer; 1 = professional */
385*4882a593Smuzhiyun 	char non_audio_spdif;		/* 3G - only */
386*4882a593Smuzhiyun 	char digital_in_automute;	/* Gina24, Layla24, Mona - only */
387*4882a593Smuzhiyun 	char has_phantom_power;
388*4882a593Smuzhiyun 	char hasnt_input_nominal_level;	/* Gina3G */
389*4882a593Smuzhiyun 	char phantom_power;		/* Gina3G - only */
390*4882a593Smuzhiyun 	char has_midi;
391*4882a593Smuzhiyun 	char midi_input_enabled;
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun #ifdef ECHOCARD_ECHO3G
394*4882a593Smuzhiyun 	/* External module -dependent pipe and bus indexes */
395*4882a593Smuzhiyun 	char px_digital_out, px_analog_in, px_digital_in, px_num;
396*4882a593Smuzhiyun 	char bx_digital_out, bx_analog_in, bx_digital_in, bx_num;
397*4882a593Smuzhiyun #endif
398*4882a593Smuzhiyun 
399*4882a593Smuzhiyun 	char nominal_level[ECHO_MAXAUDIOPIPES];	/* True == -10dBV
400*4882a593Smuzhiyun 						 * False == +4dBu */
401*4882a593Smuzhiyun 	s8 input_gain[ECHO_MAXAUDIOINPUTS];	/* Input level -50..+50
402*4882a593Smuzhiyun 						 * unit is 0.5dB */
403*4882a593Smuzhiyun 	s8 output_gain[ECHO_MAXAUDIOOUTPUTS];	/* Output level -128..+6 dB
404*4882a593Smuzhiyun 						 * (-128=muted) */
405*4882a593Smuzhiyun 	s8 monitor_gain[ECHO_MAXAUDIOOUTPUTS][ECHO_MAXAUDIOINPUTS];
406*4882a593Smuzhiyun 		/* -128..+6 dB */
407*4882a593Smuzhiyun 	s8 vmixer_gain[ECHO_MAXAUDIOOUTPUTS][ECHO_MAXAUDIOOUTPUTS];
408*4882a593Smuzhiyun 		/* -128..+6 dB */
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun 	u16 digital_modes;		/* Bitmask of supported modes
411*4882a593Smuzhiyun 					 * (see ECHOCAPS_HAS_DIGITAL_MODE_*) */
412*4882a593Smuzhiyun 	u16 input_clock_types;		/* Suppoted input clock types */
413*4882a593Smuzhiyun 	u16 output_clock_types;		/* Suppoted output clock types -
414*4882a593Smuzhiyun 					 * Layla20 only */
415*4882a593Smuzhiyun 	u16 device_id, subdevice_id;
416*4882a593Smuzhiyun 	u16 *dsp_code;			/* Current DSP code loaded,
417*4882a593Smuzhiyun 					 * NULL if nothing loaded */
418*4882a593Smuzhiyun 	short dsp_code_to_load;		/* DSP code to load */
419*4882a593Smuzhiyun 	short asic_code;		/* Current ASIC code */
420*4882a593Smuzhiyun 	u32 comm_page_phys;			/* Physical address of the
421*4882a593Smuzhiyun 						 * memory seen by DSP */
422*4882a593Smuzhiyun 	u32 __iomem *dsp_registers;		/* DSP's register base */
423*4882a593Smuzhiyun 	u32 active_mask;			/* Chs. active mask or
424*4882a593Smuzhiyun 						 * punks out */
425*4882a593Smuzhiyun #ifdef CONFIG_PM_SLEEP
426*4882a593Smuzhiyun 	const struct firmware *fw_cache[8];	/* Cached firmwares */
427*4882a593Smuzhiyun #endif
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun #ifdef ECHOCARD_HAS_MIDI
430*4882a593Smuzhiyun 	u16 mtc_state;				/* State for MIDI input parsing state machine */
431*4882a593Smuzhiyun 	u8 midi_buffer[MIDI_IN_BUFFER_SIZE];
432*4882a593Smuzhiyun #endif
433*4882a593Smuzhiyun };
434*4882a593Smuzhiyun 
435*4882a593Smuzhiyun 
436*4882a593Smuzhiyun static int init_dsp_comm_page(struct echoaudio *chip);
437*4882a593Smuzhiyun static int init_line_levels(struct echoaudio *chip);
438*4882a593Smuzhiyun static int free_pipes(struct echoaudio *chip, struct audiopipe *pipe);
439*4882a593Smuzhiyun static int load_firmware(struct echoaudio *chip);
440*4882a593Smuzhiyun static int wait_handshake(struct echoaudio *chip);
441*4882a593Smuzhiyun static int send_vector(struct echoaudio *chip, u32 command);
442*4882a593Smuzhiyun static int get_firmware(const struct firmware **fw_entry,
443*4882a593Smuzhiyun 			struct echoaudio *chip, const short fw_index);
444*4882a593Smuzhiyun static void free_firmware(const struct firmware *fw_entry,
445*4882a593Smuzhiyun 			  struct echoaudio *chip);
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun #ifdef ECHOCARD_HAS_MIDI
448*4882a593Smuzhiyun static int enable_midi_input(struct echoaudio *chip, char enable);
449*4882a593Smuzhiyun static void snd_echo_midi_output_trigger(
450*4882a593Smuzhiyun 			struct snd_rawmidi_substream *substream, int up);
451*4882a593Smuzhiyun static int midi_service_irq(struct echoaudio *chip);
452*4882a593Smuzhiyun static int snd_echo_midi_create(struct snd_card *card,
453*4882a593Smuzhiyun 				struct echoaudio *chip);
454*4882a593Smuzhiyun #endif
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun 
clear_handshake(struct echoaudio * chip)457*4882a593Smuzhiyun static inline void clear_handshake(struct echoaudio *chip)
458*4882a593Smuzhiyun {
459*4882a593Smuzhiyun 	chip->comm_page->handshake = 0;
460*4882a593Smuzhiyun }
461*4882a593Smuzhiyun 
get_dsp_register(struct echoaudio * chip,u32 index)462*4882a593Smuzhiyun static inline u32 get_dsp_register(struct echoaudio *chip, u32 index)
463*4882a593Smuzhiyun {
464*4882a593Smuzhiyun 	return readl(&chip->dsp_registers[index]);
465*4882a593Smuzhiyun }
466*4882a593Smuzhiyun 
set_dsp_register(struct echoaudio * chip,u32 index,u32 value)467*4882a593Smuzhiyun static inline void set_dsp_register(struct echoaudio *chip, u32 index,
468*4882a593Smuzhiyun 				    u32 value)
469*4882a593Smuzhiyun {
470*4882a593Smuzhiyun 	writel(value, &chip->dsp_registers[index]);
471*4882a593Smuzhiyun }
472*4882a593Smuzhiyun 
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun /* Pipe and bus indexes. PX_* and BX_* are defined as chip->px_* and chip->bx_*
475*4882a593Smuzhiyun for 3G cards because they depend on the external box. They are integer
476*4882a593Smuzhiyun constants for all other cards.
477*4882a593Smuzhiyun Never use those defines directly, use the following functions instead. */
478*4882a593Smuzhiyun 
px_digital_out(const struct echoaudio * chip)479*4882a593Smuzhiyun static inline int px_digital_out(const struct echoaudio *chip)
480*4882a593Smuzhiyun {
481*4882a593Smuzhiyun 	return PX_DIGITAL_OUT;
482*4882a593Smuzhiyun }
483*4882a593Smuzhiyun 
px_analog_in(const struct echoaudio * chip)484*4882a593Smuzhiyun static inline int px_analog_in(const struct echoaudio *chip)
485*4882a593Smuzhiyun {
486*4882a593Smuzhiyun 	return PX_ANALOG_IN;
487*4882a593Smuzhiyun }
488*4882a593Smuzhiyun 
px_digital_in(const struct echoaudio * chip)489*4882a593Smuzhiyun static inline int px_digital_in(const struct echoaudio *chip)
490*4882a593Smuzhiyun {
491*4882a593Smuzhiyun 	return PX_DIGITAL_IN;
492*4882a593Smuzhiyun }
493*4882a593Smuzhiyun 
px_num(const struct echoaudio * chip)494*4882a593Smuzhiyun static inline int px_num(const struct echoaudio *chip)
495*4882a593Smuzhiyun {
496*4882a593Smuzhiyun 	return PX_NUM;
497*4882a593Smuzhiyun }
498*4882a593Smuzhiyun 
bx_digital_out(const struct echoaudio * chip)499*4882a593Smuzhiyun static inline int bx_digital_out(const struct echoaudio *chip)
500*4882a593Smuzhiyun {
501*4882a593Smuzhiyun 	return BX_DIGITAL_OUT;
502*4882a593Smuzhiyun }
503*4882a593Smuzhiyun 
bx_analog_in(const struct echoaudio * chip)504*4882a593Smuzhiyun static inline int bx_analog_in(const struct echoaudio *chip)
505*4882a593Smuzhiyun {
506*4882a593Smuzhiyun 	return BX_ANALOG_IN;
507*4882a593Smuzhiyun }
508*4882a593Smuzhiyun 
bx_digital_in(const struct echoaudio * chip)509*4882a593Smuzhiyun static inline int bx_digital_in(const struct echoaudio *chip)
510*4882a593Smuzhiyun {
511*4882a593Smuzhiyun 	return BX_DIGITAL_IN;
512*4882a593Smuzhiyun }
513*4882a593Smuzhiyun 
bx_num(const struct echoaudio * chip)514*4882a593Smuzhiyun static inline int bx_num(const struct echoaudio *chip)
515*4882a593Smuzhiyun {
516*4882a593Smuzhiyun 	return BX_NUM;
517*4882a593Smuzhiyun }
518*4882a593Smuzhiyun 
num_pipes_out(const struct echoaudio * chip)519*4882a593Smuzhiyun static inline int num_pipes_out(const struct echoaudio *chip)
520*4882a593Smuzhiyun {
521*4882a593Smuzhiyun 	return px_analog_in(chip);
522*4882a593Smuzhiyun }
523*4882a593Smuzhiyun 
num_pipes_in(const struct echoaudio * chip)524*4882a593Smuzhiyun static inline int num_pipes_in(const struct echoaudio *chip)
525*4882a593Smuzhiyun {
526*4882a593Smuzhiyun 	return px_num(chip) - px_analog_in(chip);
527*4882a593Smuzhiyun }
528*4882a593Smuzhiyun 
num_busses_out(const struct echoaudio * chip)529*4882a593Smuzhiyun static inline int num_busses_out(const struct echoaudio *chip)
530*4882a593Smuzhiyun {
531*4882a593Smuzhiyun 	return bx_analog_in(chip);
532*4882a593Smuzhiyun }
533*4882a593Smuzhiyun 
num_busses_in(const struct echoaudio * chip)534*4882a593Smuzhiyun static inline int num_busses_in(const struct echoaudio *chip)
535*4882a593Smuzhiyun {
536*4882a593Smuzhiyun 	return bx_num(chip) - bx_analog_in(chip);
537*4882a593Smuzhiyun }
538*4882a593Smuzhiyun 
num_analog_busses_out(const struct echoaudio * chip)539*4882a593Smuzhiyun static inline int num_analog_busses_out(const struct echoaudio *chip)
540*4882a593Smuzhiyun {
541*4882a593Smuzhiyun 	return bx_digital_out(chip);
542*4882a593Smuzhiyun }
543*4882a593Smuzhiyun 
num_analog_busses_in(const struct echoaudio * chip)544*4882a593Smuzhiyun static inline int num_analog_busses_in(const struct echoaudio *chip)
545*4882a593Smuzhiyun {
546*4882a593Smuzhiyun 	return bx_digital_in(chip) - bx_analog_in(chip);
547*4882a593Smuzhiyun }
548*4882a593Smuzhiyun 
num_digital_busses_out(const struct echoaudio * chip)549*4882a593Smuzhiyun static inline int num_digital_busses_out(const struct echoaudio *chip)
550*4882a593Smuzhiyun {
551*4882a593Smuzhiyun 	return num_busses_out(chip) - num_analog_busses_out(chip);
552*4882a593Smuzhiyun }
553*4882a593Smuzhiyun 
num_digital_busses_in(const struct echoaudio * chip)554*4882a593Smuzhiyun static inline int num_digital_busses_in(const struct echoaudio *chip)
555*4882a593Smuzhiyun {
556*4882a593Smuzhiyun 	return num_busses_in(chip) - num_analog_busses_in(chip);
557*4882a593Smuzhiyun }
558*4882a593Smuzhiyun 
559*4882a593Smuzhiyun /* The monitor array is a one-dimensional array; compute the offset
560*4882a593Smuzhiyun  * into the array */
monitor_index(const struct echoaudio * chip,int out,int in)561*4882a593Smuzhiyun static inline int monitor_index(const struct echoaudio *chip, int out, int in)
562*4882a593Smuzhiyun {
563*4882a593Smuzhiyun 	return out * num_busses_in(chip) + in;
564*4882a593Smuzhiyun }
565*4882a593Smuzhiyun 
566*4882a593Smuzhiyun #endif /* _ECHOAUDIO_H_ */
567