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