xsk: Fix possible crash when multiple sockets are created
[sfrench/cifs-2.6.git] / sound / pci / rme9652 / hdspm.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *   ALSA driver for RME Hammerfall DSP MADI audio interface(s)
4  *
5  *      Copyright (c) 2003 Winfried Ritsch (IEM)
6  *      code based on hdsp.c   Paul Davis
7  *                             Marcus Andersson
8  *                             Thomas Charbonnel
9  *      Modified 2006-06-01 for AES32 support by Remy Bruno
10  *                                               <remy.bruno@trinnov.com>
11  *
12  *      Modified 2009-04-13 for proper metering by Florian Faber
13  *                                               <faber@faberman.de>
14  *
15  *      Modified 2009-04-14 for native float support by Florian Faber
16  *                                               <faber@faberman.de>
17  *
18  *      Modified 2009-04-26 fixed bug in rms metering by Florian Faber
19  *                                               <faber@faberman.de>
20  *
21  *      Modified 2009-04-30 added hw serial number support by Florian Faber
22  *
23  *      Modified 2011-01-14 added S/PDIF input on RayDATs by Adrian Knoth
24  *
25  *      Modified 2011-01-25 variable period sizes on RayDAT/AIO by Adrian Knoth
26  *
27  *      Modified 2019-05-23 fix AIO single speed ADAT capture and playback
28  *      by Philippe.Bekaert@uhasselt.be
29  */
30
31 /* *************    Register Documentation   *******************************************************
32  *
33  * Work in progress! Documentation is based on the code in this file.
34  *
35  * --------- HDSPM_controlRegister ---------
36  * :7654.3210:7654.3210:7654.3210:7654.3210: bit number per byte
37  * :||||.||||:||||.||||:||||.||||:||||.||||:
38  * :3322.2222:2222.1111:1111.1100:0000.0000: bit number
39  * :1098.7654:3210.9876:5432.1098:7654.3210: 0..31
40  * :||||.||||:||||.||||:||||.||||:||||.||||:
41  * :8421.8421:8421.8421:8421.8421:8421.8421: hex digit
42  * :    .    :    .    :    .    :  x .    :  HDSPM_AudioInterruptEnable \_ setting both bits
43  * :    .    :    .    :    .    :    .   x:  HDSPM_Start                /  enables audio IO
44  * :    .    :    .    :    .    :   x.    :  HDSPM_ClockModeMaster - 1: Master, 0: Slave
45  * :    .    :    .    :    .    :    .210 :  HDSPM_LatencyMask - 3 Bit value for latency
46  * :    .    :    .    :    .    :    .    :      0:64, 1:128, 2:256, 3:512,
47  * :    .    :    .    :    .    :    .    :      4:1024, 5:2048, 6:4096, 7:8192
48  * :x   .    :    .    :    .   x:xx  .    :  HDSPM_FrequencyMask
49  * :    .    :    .    :    .    :10  .    :  HDSPM_Frequency1|HDSPM_Frequency0: 1=32K,2=44.1K,3=48K,0=??
50  * :    .    :    .    :    .   x:    .    :  <MADI> HDSPM_DoubleSpeed
51  * :x   .    :    .    :    .    :    .    :  <MADI> HDSPM_QuadSpeed
52  * :    .  3 :    .  10:  2 .    :    .    :  HDSPM_SyncRefMask :
53  * :    .    :    .   x:    .    :    .    :  HDSPM_SyncRef0
54  * :    .    :    .  x :    .    :    .    :  HDSPM_SyncRef1
55  * :    .    :    .    :  x .    :    .    :  <AES32> HDSPM_SyncRef2
56  * :    .  x :    .    :    .    :    .    :  <AES32> HDSPM_SyncRef3
57  * :    .    :    .  10:    .    :    .    :  <MADI> sync ref: 0:WC, 1:Madi, 2:TCO, 3:SyncIn
58  * :    .  3 :    .  10:  2 .    :    .    :  <AES32>  0:WC, 1:AES1 ... 8:AES8, 9: TCO, 10:SyncIn?
59  * :    .  x :    .    :    .    :    .    :  <MADIe> HDSPe_FLOAT_FORMAT
60  * :    .    :    .    : x  .    :    .    :  <MADI> HDSPM_InputSelect0 : 0=optical,1=coax
61  * :    .    :    .    :x   .    :    .    :  <MADI> HDSPM_InputSelect1
62  * :    .    :    .x   :    .    :    .    :  <MADI> HDSPM_clr_tms
63  * :    .    :    .    :    . x  :    .    :  <MADI> HDSPM_TX_64ch
64  * :    .    :    .    :    . x  :    .    :  <AES32> HDSPM_Emphasis
65  * :    .    :    .    :    .x   :    .    :  <MADI> HDSPM_AutoInp
66  * :    .    :    . x  :    .    :    .    :  <MADI> HDSPM_SMUX
67  * :    .    :    .x   :    .    :    .    :  <MADI> HDSPM_clr_tms
68  * :    .    :   x.    :    .    :    .    :  <MADI> HDSPM_taxi_reset
69  * :    .   x:    .    :    .    :    .    :  <MADI> HDSPM_LineOut
70  * :    .   x:    .    :    .    :    .    :  <AES32> ??????????????????
71  * :    .    :   x.    :    .    :    .    :  <AES32> HDSPM_WCK48
72  * :    .    :    .    :    .x   :    .    :  <AES32> HDSPM_Dolby
73  * :    .    : x  .    :    .    :    .    :  HDSPM_Midi0InterruptEnable
74  * :    .    :x   .    :    .    :    .    :  HDSPM_Midi1InterruptEnable
75  * :    .    :  x .    :    .    :    .    :  HDSPM_Midi2InterruptEnable
76  * :    . x  :    .    :    .    :    .    :  <MADI> HDSPM_Midi3InterruptEnable
77  * :    . x  :    .    :    .    :    .    :  <AES32> HDSPM_DS_DoubleWire
78  * :    .x   :    .    :    .    :    .    :  <AES32> HDSPM_QS_DoubleWire
79  * :   x.    :    .    :    .    :    .    :  <AES32> HDSPM_QS_QuadWire
80  * :    .    :    .    :    .  x :    .    :  <AES32> HDSPM_Professional
81  * : x  .    :    .    :    .    :    .    :  HDSPM_wclk_sel
82  * :    .    :    .    :    .    :    .    :
83  * :7654.3210:7654.3210:7654.3210:7654.3210: bit number per byte
84  * :||||.||||:||||.||||:||||.||||:||||.||||:
85  * :3322.2222:2222.1111:1111.1100:0000.0000: bit number
86  * :1098.7654:3210.9876:5432.1098:7654.3210: 0..31
87  * :||||.||||:||||.||||:||||.||||:||||.||||:
88  * :8421.8421:8421.8421:8421.8421:8421.8421:hex digit
89  *
90  *
91  *
92  * AIO / RayDAT only
93  *
94  * ------------ HDSPM_WR_SETTINGS ----------
95  * :3322.2222:2222.1111:1111.1100:0000.0000: bit number per byte
96  * :1098.7654:3210.9876:5432.1098:7654.3210:
97  * :||||.||||:||||.||||:||||.||||:||||.||||: bit number
98  * :7654.3210:7654.3210:7654.3210:7654.3210: 0..31
99  * :||||.||||:||||.||||:||||.||||:||||.||||:
100  * :8421.8421:8421.8421:8421.8421:8421.8421: hex digit
101  * :    .    :    .    :    .    :    .   x: HDSPM_c0Master 1: Master, 0: Slave
102  * :    .    :    .    :    .    :    .  x : HDSPM_c0_SyncRef0
103  * :    .    :    .    :    .    :    . x  : HDSPM_c0_SyncRef1
104  * :    .    :    .    :    .    :    .x   : HDSPM_c0_SyncRef2
105  * :    .    :    .    :    .    :   x.    : HDSPM_c0_SyncRef3
106  * :    .    :    .    :    .    :   3.210 : HDSPM_c0_SyncRefMask:
107  * :    .    :    .    :    .    :    .    :  RayDat: 0:WC, 1:AES, 2:SPDIF, 3..6: ADAT1..4,
108  * :    .    :    .    :    .    :    .    :          9:TCO, 10:SyncIn
109  * :    .    :    .    :    .    :    .    :  AIO: 0:WC, 1:AES, 2: SPDIF, 3: ATAT,
110  * :    .    :    .    :    .    :    .    :          9:TCO, 10:SyncIn
111  * :    .    :    .    :    .    :    .    :
112  * :    .    :    .    :    .    :    .    :
113  * :3322.2222:2222.1111:1111.1100:0000.0000: bit number per byte
114  * :1098.7654:3210.9876:5432.1098:7654.3210:
115  * :||||.||||:||||.||||:||||.||||:||||.||||: bit number
116  * :7654.3210:7654.3210:7654.3210:7654.3210: 0..31
117  * :||||.||||:||||.||||:||||.||||:||||.||||:
118  * :8421.8421:8421.8421:8421.8421:8421.8421: hex digit
119  *
120  */
121 #include <linux/init.h>
122 #include <linux/delay.h>
123 #include <linux/interrupt.h>
124 #include <linux/module.h>
125 #include <linux/slab.h>
126 #include <linux/pci.h>
127 #include <linux/math64.h>
128 #include <linux/io.h>
129 #include <linux/nospec.h>
130
131 #include <sound/core.h>
132 #include <sound/control.h>
133 #include <sound/pcm.h>
134 #include <sound/pcm_params.h>
135 #include <sound/info.h>
136 #include <sound/asoundef.h>
137 #include <sound/rawmidi.h>
138 #include <sound/hwdep.h>
139 #include <sound/initval.h>
140
141 #include <sound/hdspm.h>
142
143 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;        /* Index 0-MAX */
144 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;         /* ID for this card */
145 static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;/* Enable this card */
146
147 module_param_array(index, int, NULL, 0444);
148 MODULE_PARM_DESC(index, "Index value for RME HDSPM interface.");
149
150 module_param_array(id, charp, NULL, 0444);
151 MODULE_PARM_DESC(id, "ID string for RME HDSPM interface.");
152
153 module_param_array(enable, bool, NULL, 0444);
154 MODULE_PARM_DESC(enable, "Enable/disable specific HDSPM soundcards.");
155
156
157 MODULE_AUTHOR
158 (
159         "Winfried Ritsch <ritsch_AT_iem.at>, "
160         "Paul Davis <paul@linuxaudiosystems.com>, "
161         "Marcus Andersson, Thomas Charbonnel <thomas@undata.org>, "
162         "Remy Bruno <remy.bruno@trinnov.com>, "
163         "Florian Faber <faberman@linuxproaudio.org>, "
164         "Adrian Knoth <adi@drcomp.erfurt.thur.de>"
165 );
166 MODULE_DESCRIPTION("RME HDSPM");
167 MODULE_LICENSE("GPL");
168
169 /* --- Write registers. ---
170   These are defined as byte-offsets from the iobase value.  */
171
172 #define HDSPM_WR_SETTINGS             0
173 #define HDSPM_outputBufferAddress    32
174 #define HDSPM_inputBufferAddress     36
175 #define HDSPM_controlRegister        64
176 #define HDSPM_interruptConfirmation  96
177 #define HDSPM_control2Reg            256  /* not in specs ???????? */
178 #define HDSPM_freqReg                256  /* for setting arbitrary clock values (DDS feature) */
179 #define HDSPM_midiDataOut0           352  /* just believe in old code */
180 #define HDSPM_midiDataOut1           356
181 #define HDSPM_eeprom_wr              384  /* for AES32 */
182
183 /* DMA enable for 64 channels, only Bit 0 is relevant */
184 #define HDSPM_outputEnableBase       512  /* 512-767  input  DMA */
185 #define HDSPM_inputEnableBase        768  /* 768-1023 output DMA */
186
187 /* 16 page addresses for each of the 64 channels DMA buffer in and out
188    (each 64k=16*4k) Buffer must be 4k aligned (which is default i386 ????) */
189 #define HDSPM_pageAddressBufferOut       8192
190 #define HDSPM_pageAddressBufferIn        (HDSPM_pageAddressBufferOut+64*16*4)
191
192 #define HDSPM_MADI_mixerBase    32768   /* 32768-65535 for 2x64x64 Fader */
193
194 #define HDSPM_MATRIX_MIXER_SIZE  8192   /* = 2*64*64 * 4 Byte => 32kB */
195
196 /* --- Read registers. ---
197    These are defined as byte-offsets from the iobase value */
198 #define HDSPM_statusRegister    0
199 /*#define HDSPM_statusRegister2  96 */
200 /* after RME Windows driver sources, status2 is 4-byte word # 48 = word at
201  * offset 192, for AES32 *and* MADI
202  * => need to check that offset 192 is working on MADI */
203 #define HDSPM_statusRegister2  192
204 #define HDSPM_timecodeRegister 128
205
206 /* AIO, RayDAT */
207 #define HDSPM_RD_STATUS_0 0
208 #define HDSPM_RD_STATUS_1 64
209 #define HDSPM_RD_STATUS_2 128
210 #define HDSPM_RD_STATUS_3 192
211
212 #define HDSPM_RD_TCO           256
213 #define HDSPM_RD_PLL_FREQ      512
214 #define HDSPM_WR_TCO           128
215
216 #define HDSPM_TCO1_TCO_lock                     0x00000001
217 #define HDSPM_TCO1_WCK_Input_Range_LSB          0x00000002
218 #define HDSPM_TCO1_WCK_Input_Range_MSB          0x00000004
219 #define HDSPM_TCO1_LTC_Input_valid              0x00000008
220 #define HDSPM_TCO1_WCK_Input_valid              0x00000010
221 #define HDSPM_TCO1_Video_Input_Format_NTSC      0x00000020
222 #define HDSPM_TCO1_Video_Input_Format_PAL       0x00000040
223
224 #define HDSPM_TCO1_set_TC                       0x00000100
225 #define HDSPM_TCO1_set_drop_frame_flag          0x00000200
226 #define HDSPM_TCO1_LTC_Format_LSB               0x00000400
227 #define HDSPM_TCO1_LTC_Format_MSB               0x00000800
228
229 #define HDSPM_TCO2_TC_run                       0x00010000
230 #define HDSPM_TCO2_WCK_IO_ratio_LSB             0x00020000
231 #define HDSPM_TCO2_WCK_IO_ratio_MSB             0x00040000
232 #define HDSPM_TCO2_set_num_drop_frames_LSB      0x00080000
233 #define HDSPM_TCO2_set_num_drop_frames_MSB      0x00100000
234 #define HDSPM_TCO2_set_jam_sync                 0x00200000
235 #define HDSPM_TCO2_set_flywheel                 0x00400000
236
237 #define HDSPM_TCO2_set_01_4                     0x01000000
238 #define HDSPM_TCO2_set_pull_down                0x02000000
239 #define HDSPM_TCO2_set_pull_up                  0x04000000
240 #define HDSPM_TCO2_set_freq                     0x08000000
241 #define HDSPM_TCO2_set_term_75R                 0x10000000
242 #define HDSPM_TCO2_set_input_LSB                0x20000000
243 #define HDSPM_TCO2_set_input_MSB                0x40000000
244 #define HDSPM_TCO2_set_freq_from_app            0x80000000
245
246
247 #define HDSPM_midiDataOut0    352
248 #define HDSPM_midiDataOut1    356
249 #define HDSPM_midiDataOut2    368
250
251 #define HDSPM_midiDataIn0     360
252 #define HDSPM_midiDataIn1     364
253 #define HDSPM_midiDataIn2     372
254 #define HDSPM_midiDataIn3     376
255
256 /* status is data bytes in MIDI-FIFO (0-128) */
257 #define HDSPM_midiStatusOut0  384
258 #define HDSPM_midiStatusOut1  388
259 #define HDSPM_midiStatusOut2  400
260
261 #define HDSPM_midiStatusIn0   392
262 #define HDSPM_midiStatusIn1   396
263 #define HDSPM_midiStatusIn2   404
264 #define HDSPM_midiStatusIn3   408
265
266
267 /* the meters are regular i/o-mapped registers, but offset
268    considerably from the rest. the peak registers are reset
269    when read; the least-significant 4 bits are full-scale counters;
270    the actual peak value is in the most-significant 24 bits.
271 */
272
273 #define HDSPM_MADI_INPUT_PEAK           4096
274 #define HDSPM_MADI_PLAYBACK_PEAK        4352
275 #define HDSPM_MADI_OUTPUT_PEAK          4608
276
277 #define HDSPM_MADI_INPUT_RMS_L          6144
278 #define HDSPM_MADI_PLAYBACK_RMS_L       6400
279 #define HDSPM_MADI_OUTPUT_RMS_L         6656
280
281 #define HDSPM_MADI_INPUT_RMS_H          7168
282 #define HDSPM_MADI_PLAYBACK_RMS_H       7424
283 #define HDSPM_MADI_OUTPUT_RMS_H         7680
284
285 /* --- Control Register bits --------- */
286 #define HDSPM_Start                (1<<0) /* start engine */
287
288 #define HDSPM_Latency0             (1<<1) /* buffer size = 2^n */
289 #define HDSPM_Latency1             (1<<2) /* where n is defined */
290 #define HDSPM_Latency2             (1<<3) /* by Latency{2,1,0} */
291
292 #define HDSPM_ClockModeMaster      (1<<4) /* 1=Master, 0=Autosync */
293 #define HDSPM_c0Master          0x1    /* Master clock bit in settings
294                                           register [RayDAT, AIO] */
295
296 #define HDSPM_AudioInterruptEnable (1<<5) /* what do you think ? */
297
298 #define HDSPM_Frequency0  (1<<6)  /* 0=44.1kHz/88.2kHz 1=48kHz/96kHz */
299 #define HDSPM_Frequency1  (1<<7)  /* 0=32kHz/64kHz */
300 #define HDSPM_DoubleSpeed (1<<8)  /* 0=normal speed, 1=double speed */
301 #define HDSPM_QuadSpeed   (1<<31) /* quad speed bit */
302
303 #define HDSPM_Professional (1<<9) /* Professional */ /* AES32 ONLY */
304 #define HDSPM_TX_64ch     (1<<10) /* Output 64channel MODE=1,
305                                      56channelMODE=0 */ /* MADI ONLY*/
306 #define HDSPM_Emphasis    (1<<10) /* Emphasis */ /* AES32 ONLY */
307
308 #define HDSPM_AutoInp     (1<<11) /* Auto Input (takeover) == Safe Mode,
309                                      0=off, 1=on  */ /* MADI ONLY */
310 #define HDSPM_Dolby       (1<<11) /* Dolby = "NonAudio" ?? */ /* AES32 ONLY */
311
312 #define HDSPM_InputSelect0 (1<<14) /* Input select 0= optical, 1=coax
313                                     * -- MADI ONLY
314                                     */
315 #define HDSPM_InputSelect1 (1<<15) /* should be 0 */
316
317 #define HDSPM_SyncRef2     (1<<13)
318 #define HDSPM_SyncRef3     (1<<25)
319
320 #define HDSPM_SMUX         (1<<18) /* Frame ??? */ /* MADI ONY */
321 #define HDSPM_clr_tms      (1<<19) /* clear track marker, do not use
322                                       AES additional bits in
323                                       lower 5 Audiodatabits ??? */
324 #define HDSPM_taxi_reset   (1<<20) /* ??? */ /* MADI ONLY ? */
325 #define HDSPM_WCK48        (1<<20) /* Frame ??? = HDSPM_SMUX */ /* AES32 ONLY */
326
327 #define HDSPM_Midi0InterruptEnable 0x0400000
328 #define HDSPM_Midi1InterruptEnable 0x0800000
329 #define HDSPM_Midi2InterruptEnable 0x0200000
330 #define HDSPM_Midi3InterruptEnable 0x4000000
331
332 #define HDSPM_LineOut (1<<24) /* Analog Out on channel 63/64 on=1, mute=0 */
333 #define HDSPe_FLOAT_FORMAT         0x2000000
334
335 #define HDSPM_DS_DoubleWire (1<<26) /* AES32 ONLY */
336 #define HDSPM_QS_DoubleWire (1<<27) /* AES32 ONLY */
337 #define HDSPM_QS_QuadWire   (1<<28) /* AES32 ONLY */
338
339 #define HDSPM_wclk_sel (1<<30)
340
341 /* additional control register bits for AIO*/
342 #define HDSPM_c0_Wck48                          0x20 /* also RayDAT */
343 #define HDSPM_c0_Input0                         0x1000
344 #define HDSPM_c0_Input1                         0x2000
345 #define HDSPM_c0_Spdif_Opt                      0x4000
346 #define HDSPM_c0_Pro                            0x8000
347 #define HDSPM_c0_clr_tms                        0x10000
348 #define HDSPM_c0_AEB1                           0x20000
349 #define HDSPM_c0_AEB2                           0x40000
350 #define HDSPM_c0_LineOut                        0x80000
351 #define HDSPM_c0_AD_GAIN0                       0x100000
352 #define HDSPM_c0_AD_GAIN1                       0x200000
353 #define HDSPM_c0_DA_GAIN0                       0x400000
354 #define HDSPM_c0_DA_GAIN1                       0x800000
355 #define HDSPM_c0_PH_GAIN0                       0x1000000
356 #define HDSPM_c0_PH_GAIN1                       0x2000000
357 #define HDSPM_c0_Sym6db                         0x4000000
358
359
360 /* --- bit helper defines */
361 #define HDSPM_LatencyMask    (HDSPM_Latency0|HDSPM_Latency1|HDSPM_Latency2)
362 #define HDSPM_FrequencyMask  (HDSPM_Frequency0|HDSPM_Frequency1|\
363                               HDSPM_DoubleSpeed|HDSPM_QuadSpeed)
364 #define HDSPM_InputMask      (HDSPM_InputSelect0|HDSPM_InputSelect1)
365 #define HDSPM_InputOptical   0
366 #define HDSPM_InputCoaxial   (HDSPM_InputSelect0)
367 #define HDSPM_SyncRefMask    (HDSPM_SyncRef0|HDSPM_SyncRef1|\
368                               HDSPM_SyncRef2|HDSPM_SyncRef3)
369
370 #define HDSPM_c0_SyncRef0      0x2
371 #define HDSPM_c0_SyncRef1      0x4
372 #define HDSPM_c0_SyncRef2      0x8
373 #define HDSPM_c0_SyncRef3      0x10
374 #define HDSPM_c0_SyncRefMask   (HDSPM_c0_SyncRef0 | HDSPM_c0_SyncRef1 |\
375                                 HDSPM_c0_SyncRef2 | HDSPM_c0_SyncRef3)
376
377 #define HDSPM_SYNC_FROM_WORD    0       /* Preferred sync reference */
378 #define HDSPM_SYNC_FROM_MADI    1       /* choices - used by "pref_sync_ref" */
379 #define HDSPM_SYNC_FROM_TCO     2
380 #define HDSPM_SYNC_FROM_SYNC_IN 3
381
382 #define HDSPM_Frequency32KHz    HDSPM_Frequency0
383 #define HDSPM_Frequency44_1KHz  HDSPM_Frequency1
384 #define HDSPM_Frequency48KHz   (HDSPM_Frequency1|HDSPM_Frequency0)
385 #define HDSPM_Frequency64KHz   (HDSPM_DoubleSpeed|HDSPM_Frequency0)
386 #define HDSPM_Frequency88_2KHz (HDSPM_DoubleSpeed|HDSPM_Frequency1)
387 #define HDSPM_Frequency96KHz   (HDSPM_DoubleSpeed|HDSPM_Frequency1|\
388                                 HDSPM_Frequency0)
389 #define HDSPM_Frequency128KHz   (HDSPM_QuadSpeed|HDSPM_Frequency0)
390 #define HDSPM_Frequency176_4KHz   (HDSPM_QuadSpeed|HDSPM_Frequency1)
391 #define HDSPM_Frequency192KHz   (HDSPM_QuadSpeed|HDSPM_Frequency1|\
392                                  HDSPM_Frequency0)
393
394
395 /* Synccheck Status */
396 #define HDSPM_SYNC_CHECK_NO_LOCK 0
397 #define HDSPM_SYNC_CHECK_LOCK    1
398 #define HDSPM_SYNC_CHECK_SYNC    2
399
400 /* AutoSync References - used by "autosync_ref" control switch */
401 #define HDSPM_AUTOSYNC_FROM_WORD      0
402 #define HDSPM_AUTOSYNC_FROM_MADI      1
403 #define HDSPM_AUTOSYNC_FROM_TCO       2
404 #define HDSPM_AUTOSYNC_FROM_SYNC_IN   3
405 #define HDSPM_AUTOSYNC_FROM_NONE      4
406
407 /* Possible sources of MADI input */
408 #define HDSPM_OPTICAL 0         /* optical   */
409 #define HDSPM_COAXIAL 1         /* BNC */
410
411 #define hdspm_encode_latency(x)       (((x)<<1) & HDSPM_LatencyMask)
412 #define hdspm_decode_latency(x)       ((((x) & HDSPM_LatencyMask)>>1))
413
414 #define hdspm_encode_in(x) (((x)&0x3)<<14)
415 #define hdspm_decode_in(x) (((x)>>14)&0x3)
416
417 /* --- control2 register bits --- */
418 #define HDSPM_TMS             (1<<0)
419 #define HDSPM_TCK             (1<<1)
420 #define HDSPM_TDI             (1<<2)
421 #define HDSPM_JTAG            (1<<3)
422 #define HDSPM_PWDN            (1<<4)
423 #define HDSPM_PROGRAM         (1<<5)
424 #define HDSPM_CONFIG_MODE_0   (1<<6)
425 #define HDSPM_CONFIG_MODE_1   (1<<7)
426 /*#define HDSPM_VERSION_BIT     (1<<8) not defined any more*/
427 #define HDSPM_BIGENDIAN_MODE  (1<<9)
428 #define HDSPM_RD_MULTIPLE     (1<<10)
429
430 /* --- Status Register bits --- */ /* MADI ONLY */ /* Bits defined here and
431      that do not conflict with specific bits for AES32 seem to be valid also
432      for the AES32
433  */
434 #define HDSPM_audioIRQPending    (1<<0) /* IRQ is high and pending */
435 #define HDSPM_RX_64ch            (1<<1) /* Input 64chan. MODE=1, 56chn MODE=0 */
436 #define HDSPM_AB_int             (1<<2) /* InputChannel Opt=0, Coax=1
437                                          * (like inp0)
438                                          */
439
440 #define HDSPM_madiLock           (1<<3) /* MADI Locked =1, no=0 */
441 #define HDSPM_madiSync          (1<<18) /* MADI is in sync */
442
443 #define HDSPM_tcoLockMadi    0x00000020 /* Optional TCO locked status for HDSPe MADI*/
444 #define HDSPM_tcoSync    0x10000000 /* Optional TCO sync status for HDSPe MADI and AES32!*/
445
446 #define HDSPM_syncInLock 0x00010000 /* Sync In lock status for HDSPe MADI! */
447 #define HDSPM_syncInSync 0x00020000 /* Sync In sync status for HDSPe MADI! */
448
449 #define HDSPM_BufferPositionMask 0x000FFC0 /* Bit 6..15 : h/w buffer pointer */
450                         /* since 64byte accurate, last 6 bits are not used */
451
452
453
454 #define HDSPM_DoubleSpeedStatus (1<<19) /* (input) card in double speed */
455
456 #define HDSPM_madiFreq0         (1<<22) /* system freq 0=error */
457 #define HDSPM_madiFreq1         (1<<23) /* 1=32, 2=44.1 3=48 */
458 #define HDSPM_madiFreq2         (1<<24) /* 4=64, 5=88.2 6=96 */
459 #define HDSPM_madiFreq3         (1<<25) /* 7=128, 8=176.4 9=192 */
460
461 #define HDSPM_BufferID          (1<<26) /* (Double)Buffer ID toggles with
462                                          * Interrupt
463                                          */
464 #define HDSPM_tco_detect         0x08000000
465 #define HDSPM_tcoLockAes         0x20000000 /* Optional TCO locked status for HDSPe AES */
466
467 #define HDSPM_s2_tco_detect      0x00000040
468 #define HDSPM_s2_AEBO_D          0x00000080
469 #define HDSPM_s2_AEBI_D          0x00000100
470
471
472 #define HDSPM_midi0IRQPending    0x40000000
473 #define HDSPM_midi1IRQPending    0x80000000
474 #define HDSPM_midi2IRQPending    0x20000000
475 #define HDSPM_midi2IRQPendingAES 0x00000020
476 #define HDSPM_midi3IRQPending    0x00200000
477
478 /* --- status bit helpers */
479 #define HDSPM_madiFreqMask  (HDSPM_madiFreq0|HDSPM_madiFreq1|\
480                              HDSPM_madiFreq2|HDSPM_madiFreq3)
481 #define HDSPM_madiFreq32    (HDSPM_madiFreq0)
482 #define HDSPM_madiFreq44_1  (HDSPM_madiFreq1)
483 #define HDSPM_madiFreq48    (HDSPM_madiFreq0|HDSPM_madiFreq1)
484 #define HDSPM_madiFreq64    (HDSPM_madiFreq2)
485 #define HDSPM_madiFreq88_2  (HDSPM_madiFreq0|HDSPM_madiFreq2)
486 #define HDSPM_madiFreq96    (HDSPM_madiFreq1|HDSPM_madiFreq2)
487 #define HDSPM_madiFreq128   (HDSPM_madiFreq0|HDSPM_madiFreq1|HDSPM_madiFreq2)
488 #define HDSPM_madiFreq176_4 (HDSPM_madiFreq3)
489 #define HDSPM_madiFreq192   (HDSPM_madiFreq3|HDSPM_madiFreq0)
490
491 /* Status2 Register bits */ /* MADI ONLY */
492
493 #define HDSPM_version0 (1<<0)   /* not really defined but I guess */
494 #define HDSPM_version1 (1<<1)   /* in former cards it was ??? */
495 #define HDSPM_version2 (1<<2)
496
497 #define HDSPM_wcLock (1<<3)     /* Wordclock is detected and locked */
498 #define HDSPM_wcSync (1<<4)     /* Wordclock is in sync with systemclock */
499
500 #define HDSPM_wc_freq0 (1<<5)   /* input freq detected via autosync  */
501 #define HDSPM_wc_freq1 (1<<6)   /* 001=32, 010==44.1, 011=48, */
502 #define HDSPM_wc_freq2 (1<<7)   /* 100=64, 101=88.2, 110=96, 111=128 */
503 #define HDSPM_wc_freq3 0x800    /* 1000=176.4, 1001=192 */
504
505 #define HDSPM_SyncRef0 0x10000  /* Sync Reference */
506 #define HDSPM_SyncRef1 0x20000
507
508 #define HDSPM_SelSyncRef0 (1<<8)        /* AutoSync Source */
509 #define HDSPM_SelSyncRef1 (1<<9)        /* 000=word, 001=MADI, */
510 #define HDSPM_SelSyncRef2 (1<<10)       /* 111=no valid signal */
511
512 #define HDSPM_wc_valid (HDSPM_wcLock|HDSPM_wcSync)
513
514 #define HDSPM_wcFreqMask  (HDSPM_wc_freq0|HDSPM_wc_freq1|HDSPM_wc_freq2|\
515                             HDSPM_wc_freq3)
516 #define HDSPM_wcFreq32    (HDSPM_wc_freq0)
517 #define HDSPM_wcFreq44_1  (HDSPM_wc_freq1)
518 #define HDSPM_wcFreq48    (HDSPM_wc_freq0|HDSPM_wc_freq1)
519 #define HDSPM_wcFreq64    (HDSPM_wc_freq2)
520 #define HDSPM_wcFreq88_2  (HDSPM_wc_freq0|HDSPM_wc_freq2)
521 #define HDSPM_wcFreq96    (HDSPM_wc_freq1|HDSPM_wc_freq2)
522 #define HDSPM_wcFreq128   (HDSPM_wc_freq0|HDSPM_wc_freq1|HDSPM_wc_freq2)
523 #define HDSPM_wcFreq176_4 (HDSPM_wc_freq3)
524 #define HDSPM_wcFreq192   (HDSPM_wc_freq0|HDSPM_wc_freq3)
525
526 #define HDSPM_status1_F_0 0x0400000
527 #define HDSPM_status1_F_1 0x0800000
528 #define HDSPM_status1_F_2 0x1000000
529 #define HDSPM_status1_F_3 0x2000000
530 #define HDSPM_status1_freqMask (HDSPM_status1_F_0|HDSPM_status1_F_1|HDSPM_status1_F_2|HDSPM_status1_F_3)
531
532
533 #define HDSPM_SelSyncRefMask       (HDSPM_SelSyncRef0|HDSPM_SelSyncRef1|\
534                                     HDSPM_SelSyncRef2)
535 #define HDSPM_SelSyncRef_WORD      0
536 #define HDSPM_SelSyncRef_MADI      (HDSPM_SelSyncRef0)
537 #define HDSPM_SelSyncRef_TCO       (HDSPM_SelSyncRef1)
538 #define HDSPM_SelSyncRef_SyncIn    (HDSPM_SelSyncRef0|HDSPM_SelSyncRef1)
539 #define HDSPM_SelSyncRef_NVALID    (HDSPM_SelSyncRef0|HDSPM_SelSyncRef1|\
540                                     HDSPM_SelSyncRef2)
541
542 /*
543    For AES32, bits for status, status2 and timecode are different
544 */
545 /* status */
546 #define HDSPM_AES32_wcLock      0x0200000
547 #define HDSPM_AES32_wcSync      0x0100000
548 #define HDSPM_AES32_wcFreq_bit  22
549 /* (status >> HDSPM_AES32_wcFreq_bit) & 0xF gives WC frequency (cf function
550   HDSPM_bit2freq */
551 #define HDSPM_AES32_syncref_bit  16
552 /* (status >> HDSPM_AES32_syncref_bit) & 0xF gives sync source */
553
554 #define HDSPM_AES32_AUTOSYNC_FROM_WORD 0
555 #define HDSPM_AES32_AUTOSYNC_FROM_AES1 1
556 #define HDSPM_AES32_AUTOSYNC_FROM_AES2 2
557 #define HDSPM_AES32_AUTOSYNC_FROM_AES3 3
558 #define HDSPM_AES32_AUTOSYNC_FROM_AES4 4
559 #define HDSPM_AES32_AUTOSYNC_FROM_AES5 5
560 #define HDSPM_AES32_AUTOSYNC_FROM_AES6 6
561 #define HDSPM_AES32_AUTOSYNC_FROM_AES7 7
562 #define HDSPM_AES32_AUTOSYNC_FROM_AES8 8
563 #define HDSPM_AES32_AUTOSYNC_FROM_TCO 9
564 #define HDSPM_AES32_AUTOSYNC_FROM_SYNC_IN 10
565 #define HDSPM_AES32_AUTOSYNC_FROM_NONE 11
566
567 /*  status2 */
568 /* HDSPM_LockAES_bit is given by HDSPM_LockAES >> (AES# - 1) */
569 #define HDSPM_LockAES   0x80
570 #define HDSPM_LockAES1  0x80
571 #define HDSPM_LockAES2  0x40
572 #define HDSPM_LockAES3  0x20
573 #define HDSPM_LockAES4  0x10
574 #define HDSPM_LockAES5  0x8
575 #define HDSPM_LockAES6  0x4
576 #define HDSPM_LockAES7  0x2
577 #define HDSPM_LockAES8  0x1
578 /*
579    Timecode
580    After windows driver sources, bits 4*i to 4*i+3 give the input frequency on
581    AES i+1
582  bits 3210
583       0001  32kHz
584       0010  44.1kHz
585       0011  48kHz
586       0100  64kHz
587       0101  88.2kHz
588       0110  96kHz
589       0111  128kHz
590       1000  176.4kHz
591       1001  192kHz
592   NB: Timecode register doesn't seem to work on AES32 card revision 230
593 */
594
595 /* Mixer Values */
596 #define UNITY_GAIN          32768       /* = 65536/2 */
597 #define MINUS_INFINITY_GAIN 0
598
599 /* Number of channels for different Speed Modes */
600 #define MADI_SS_CHANNELS       64
601 #define MADI_DS_CHANNELS       32
602 #define MADI_QS_CHANNELS       16
603
604 #define RAYDAT_SS_CHANNELS     36
605 #define RAYDAT_DS_CHANNELS     20
606 #define RAYDAT_QS_CHANNELS     12
607
608 #define AIO_IN_SS_CHANNELS        14
609 #define AIO_IN_DS_CHANNELS        10
610 #define AIO_IN_QS_CHANNELS        8
611 #define AIO_OUT_SS_CHANNELS        16
612 #define AIO_OUT_DS_CHANNELS        12
613 #define AIO_OUT_QS_CHANNELS        10
614
615 #define AES32_CHANNELS          16
616
617 /* the size of a substream (1 mono data stream) */
618 #define HDSPM_CHANNEL_BUFFER_SAMPLES  (16*1024)
619 #define HDSPM_CHANNEL_BUFFER_BYTES    (4*HDSPM_CHANNEL_BUFFER_SAMPLES)
620
621 /* the size of the area we need to allocate for DMA transfers. the
622    size is the same regardless of the number of channels, and
623    also the latency to use.
624    for one direction !!!
625 */
626 #define HDSPM_DMA_AREA_BYTES (HDSPM_MAX_CHANNELS * HDSPM_CHANNEL_BUFFER_BYTES)
627 #define HDSPM_DMA_AREA_KILOBYTES (HDSPM_DMA_AREA_BYTES/1024)
628
629 #define HDSPM_RAYDAT_REV        211
630 #define HDSPM_AIO_REV           212
631 #define HDSPM_MADIFACE_REV      213
632
633 /* speed factor modes */
634 #define HDSPM_SPEED_SINGLE 0
635 #define HDSPM_SPEED_DOUBLE 1
636 #define HDSPM_SPEED_QUAD   2
637
638 /* names for speed modes */
639 static const char * const hdspm_speed_names[] = { "single", "double", "quad" };
640
641 static const char *const texts_autosync_aes_tco[] = { "Word Clock",
642                                           "AES1", "AES2", "AES3", "AES4",
643                                           "AES5", "AES6", "AES7", "AES8",
644                                           "TCO", "Sync In"
645 };
646 static const char *const texts_autosync_aes[] = { "Word Clock",
647                                       "AES1", "AES2", "AES3", "AES4",
648                                       "AES5", "AES6", "AES7", "AES8",
649                                       "Sync In"
650 };
651 static const char *const texts_autosync_madi_tco[] = { "Word Clock",
652                                            "MADI", "TCO", "Sync In" };
653 static const char *const texts_autosync_madi[] = { "Word Clock",
654                                        "MADI", "Sync In" };
655
656 static const char *const texts_autosync_raydat_tco[] = {
657         "Word Clock",
658         "ADAT 1", "ADAT 2", "ADAT 3", "ADAT 4",
659         "AES", "SPDIF", "TCO", "Sync In"
660 };
661 static const char *const texts_autosync_raydat[] = {
662         "Word Clock",
663         "ADAT 1", "ADAT 2", "ADAT 3", "ADAT 4",
664         "AES", "SPDIF", "Sync In"
665 };
666 static const char *const texts_autosync_aio_tco[] = {
667         "Word Clock",
668         "ADAT", "AES", "SPDIF", "TCO", "Sync In"
669 };
670 static const char *const texts_autosync_aio[] = { "Word Clock",
671                                       "ADAT", "AES", "SPDIF", "Sync In" };
672
673 static const char *const texts_freq[] = {
674         "No Lock",
675         "32 kHz",
676         "44.1 kHz",
677         "48 kHz",
678         "64 kHz",
679         "88.2 kHz",
680         "96 kHz",
681         "128 kHz",
682         "176.4 kHz",
683         "192 kHz"
684 };
685
686 static const char * const texts_ports_madi[] = {
687         "MADI.1", "MADI.2", "MADI.3", "MADI.4", "MADI.5", "MADI.6",
688         "MADI.7", "MADI.8", "MADI.9", "MADI.10", "MADI.11", "MADI.12",
689         "MADI.13", "MADI.14", "MADI.15", "MADI.16", "MADI.17", "MADI.18",
690         "MADI.19", "MADI.20", "MADI.21", "MADI.22", "MADI.23", "MADI.24",
691         "MADI.25", "MADI.26", "MADI.27", "MADI.28", "MADI.29", "MADI.30",
692         "MADI.31", "MADI.32", "MADI.33", "MADI.34", "MADI.35", "MADI.36",
693         "MADI.37", "MADI.38", "MADI.39", "MADI.40", "MADI.41", "MADI.42",
694         "MADI.43", "MADI.44", "MADI.45", "MADI.46", "MADI.47", "MADI.48",
695         "MADI.49", "MADI.50", "MADI.51", "MADI.52", "MADI.53", "MADI.54",
696         "MADI.55", "MADI.56", "MADI.57", "MADI.58", "MADI.59", "MADI.60",
697         "MADI.61", "MADI.62", "MADI.63", "MADI.64",
698 };
699
700
701 static const char * const texts_ports_raydat_ss[] = {
702         "ADAT1.1", "ADAT1.2", "ADAT1.3", "ADAT1.4", "ADAT1.5", "ADAT1.6",
703         "ADAT1.7", "ADAT1.8", "ADAT2.1", "ADAT2.2", "ADAT2.3", "ADAT2.4",
704         "ADAT2.5", "ADAT2.6", "ADAT2.7", "ADAT2.8", "ADAT3.1", "ADAT3.2",
705         "ADAT3.3", "ADAT3.4", "ADAT3.5", "ADAT3.6", "ADAT3.7", "ADAT3.8",
706         "ADAT4.1", "ADAT4.2", "ADAT4.3", "ADAT4.4", "ADAT4.5", "ADAT4.6",
707         "ADAT4.7", "ADAT4.8",
708         "AES.L", "AES.R",
709         "SPDIF.L", "SPDIF.R"
710 };
711
712 static const char * const texts_ports_raydat_ds[] = {
713         "ADAT1.1", "ADAT1.2", "ADAT1.3", "ADAT1.4",
714         "ADAT2.1", "ADAT2.2", "ADAT2.3", "ADAT2.4",
715         "ADAT3.1", "ADAT3.2", "ADAT3.3", "ADAT3.4",
716         "ADAT4.1", "ADAT4.2", "ADAT4.3", "ADAT4.4",
717         "AES.L", "AES.R",
718         "SPDIF.L", "SPDIF.R"
719 };
720
721 static const char * const texts_ports_raydat_qs[] = {
722         "ADAT1.1", "ADAT1.2",
723         "ADAT2.1", "ADAT2.2",
724         "ADAT3.1", "ADAT3.2",
725         "ADAT4.1", "ADAT4.2",
726         "AES.L", "AES.R",
727         "SPDIF.L", "SPDIF.R"
728 };
729
730
731 static const char * const texts_ports_aio_in_ss[] = {
732         "Analogue.L", "Analogue.R",
733         "AES.L", "AES.R",
734         "SPDIF.L", "SPDIF.R",
735         "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4", "ADAT.5", "ADAT.6",
736         "ADAT.7", "ADAT.8",
737         "AEB.1", "AEB.2", "AEB.3", "AEB.4"
738 };
739
740 static const char * const texts_ports_aio_out_ss[] = {
741         "Analogue.L", "Analogue.R",
742         "AES.L", "AES.R",
743         "SPDIF.L", "SPDIF.R",
744         "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4", "ADAT.5", "ADAT.6",
745         "ADAT.7", "ADAT.8",
746         "Phone.L", "Phone.R",
747         "AEB.1", "AEB.2", "AEB.3", "AEB.4"
748 };
749
750 static const char * const texts_ports_aio_in_ds[] = {
751         "Analogue.L", "Analogue.R",
752         "AES.L", "AES.R",
753         "SPDIF.L", "SPDIF.R",
754         "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4",
755         "AEB.1", "AEB.2", "AEB.3", "AEB.4"
756 };
757
758 static const char * const texts_ports_aio_out_ds[] = {
759         "Analogue.L", "Analogue.R",
760         "AES.L", "AES.R",
761         "SPDIF.L", "SPDIF.R",
762         "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4",
763         "Phone.L", "Phone.R",
764         "AEB.1", "AEB.2", "AEB.3", "AEB.4"
765 };
766
767 static const char * const texts_ports_aio_in_qs[] = {
768         "Analogue.L", "Analogue.R",
769         "AES.L", "AES.R",
770         "SPDIF.L", "SPDIF.R",
771         "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4",
772         "AEB.1", "AEB.2", "AEB.3", "AEB.4"
773 };
774
775 static const char * const texts_ports_aio_out_qs[] = {
776         "Analogue.L", "Analogue.R",
777         "AES.L", "AES.R",
778         "SPDIF.L", "SPDIF.R",
779         "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4",
780         "Phone.L", "Phone.R",
781         "AEB.1", "AEB.2", "AEB.3", "AEB.4"
782 };
783
784 static const char * const texts_ports_aes32[] = {
785         "AES.1", "AES.2", "AES.3", "AES.4", "AES.5", "AES.6", "AES.7",
786         "AES.8", "AES.9.", "AES.10", "AES.11", "AES.12", "AES.13", "AES.14",
787         "AES.15", "AES.16"
788 };
789
790 /* These tables map the ALSA channels 1..N to the channels that we
791    need to use in order to find the relevant channel buffer. RME
792    refers to this kind of mapping as between "the ADAT channel and
793    the DMA channel." We index it using the logical audio channel,
794    and the value is the DMA channel (i.e. channel buffer number)
795    where the data for that channel can be read/written from/to.
796 */
797
798 static const char channel_map_unity_ss[HDSPM_MAX_CHANNELS] = {
799         0, 1, 2, 3, 4, 5, 6, 7,
800         8, 9, 10, 11, 12, 13, 14, 15,
801         16, 17, 18, 19, 20, 21, 22, 23,
802         24, 25, 26, 27, 28, 29, 30, 31,
803         32, 33, 34, 35, 36, 37, 38, 39,
804         40, 41, 42, 43, 44, 45, 46, 47,
805         48, 49, 50, 51, 52, 53, 54, 55,
806         56, 57, 58, 59, 60, 61, 62, 63
807 };
808
809 static const char channel_map_raydat_ss[HDSPM_MAX_CHANNELS] = {
810         4, 5, 6, 7, 8, 9, 10, 11,       /* ADAT 1 */
811         12, 13, 14, 15, 16, 17, 18, 19, /* ADAT 2 */
812         20, 21, 22, 23, 24, 25, 26, 27, /* ADAT 3 */
813         28, 29, 30, 31, 32, 33, 34, 35, /* ADAT 4 */
814         0, 1,                   /* AES */
815         2, 3,                   /* SPDIF */
816         -1, -1, -1, -1,
817         -1, -1, -1, -1, -1, -1, -1, -1,
818         -1, -1, -1, -1, -1, -1, -1, -1,
819         -1, -1, -1, -1, -1, -1, -1, -1,
820 };
821
822 static const char channel_map_raydat_ds[HDSPM_MAX_CHANNELS] = {
823         4, 5, 6, 7,             /* ADAT 1 */
824         8, 9, 10, 11,           /* ADAT 2 */
825         12, 13, 14, 15,         /* ADAT 3 */
826         16, 17, 18, 19,         /* ADAT 4 */
827         0, 1,                   /* AES */
828         2, 3,                   /* SPDIF */
829         -1, -1, -1, -1,
830         -1, -1, -1, -1, -1, -1, -1, -1,
831         -1, -1, -1, -1, -1, -1, -1, -1,
832         -1, -1, -1, -1, -1, -1, -1, -1,
833         -1, -1, -1, -1, -1, -1, -1, -1,
834         -1, -1, -1, -1, -1, -1, -1, -1,
835 };
836
837 static const char channel_map_raydat_qs[HDSPM_MAX_CHANNELS] = {
838         4, 5,                   /* ADAT 1 */
839         6, 7,                   /* ADAT 2 */
840         8, 9,                   /* ADAT 3 */
841         10, 11,                 /* ADAT 4 */
842         0, 1,                   /* AES */
843         2, 3,                   /* SPDIF */
844         -1, -1, -1, -1,
845         -1, -1, -1, -1, -1, -1, -1, -1,
846         -1, -1, -1, -1, -1, -1, -1, -1,
847         -1, -1, -1, -1, -1, -1, -1, -1,
848         -1, -1, -1, -1, -1, -1, -1, -1,
849         -1, -1, -1, -1, -1, -1, -1, -1,
850         -1, -1, -1, -1, -1, -1, -1, -1,
851 };
852
853 static const char channel_map_aio_in_ss[HDSPM_MAX_CHANNELS] = {
854         0, 1,                   /* line in */
855         8, 9,                   /* aes in, */
856         10, 11,                 /* spdif in */
857         12, 13, 14, 15, 16, 17, 18, 19, /* ADAT in */
858         2, 3, 4, 5,             /* AEB */
859         -1, -1, -1, -1, -1, -1,
860         -1, -1, -1, -1, -1, -1, -1, -1,
861         -1, -1, -1, -1, -1, -1, -1, -1,
862         -1, -1, -1, -1, -1, -1, -1, -1,
863         -1, -1, -1, -1, -1, -1, -1, -1,
864         -1, -1, -1, -1, -1, -1, -1, -1,
865 };
866
867 static const char channel_map_aio_out_ss[HDSPM_MAX_CHANNELS] = {
868         0, 1,                   /* line out */
869         8, 9,                   /* aes out */
870         10, 11,                 /* spdif out */
871         12, 13, 14, 15, 16, 17, 18, 19, /* ADAT out */
872         6, 7,                   /* phone out */
873         2, 3, 4, 5,             /* AEB */
874         -1, -1, -1, -1,
875         -1, -1, -1, -1, -1, -1, -1, -1,
876         -1, -1, -1, -1, -1, -1, -1, -1,
877         -1, -1, -1, -1, -1, -1, -1, -1,
878         -1, -1, -1, -1, -1, -1, -1, -1,
879         -1, -1, -1, -1, -1, -1, -1, -1,
880 };
881
882 static const char channel_map_aio_in_ds[HDSPM_MAX_CHANNELS] = {
883         0, 1,                   /* line in */
884         8, 9,                   /* aes in */
885         10, 11,                 /* spdif in */
886         12, 14, 16, 18,         /* adat in */
887         2, 3, 4, 5,             /* AEB */
888         -1, -1,
889         -1, -1, -1, -1, -1, -1, -1, -1,
890         -1, -1, -1, -1, -1, -1, -1, -1,
891         -1, -1, -1, -1, -1, -1, -1, -1,
892         -1, -1, -1, -1, -1, -1, -1, -1,
893         -1, -1, -1, -1, -1, -1, -1, -1,
894         -1, -1, -1, -1, -1, -1, -1, -1
895 };
896
897 static const char channel_map_aio_out_ds[HDSPM_MAX_CHANNELS] = {
898         0, 1,                   /* line out */
899         8, 9,                   /* aes out */
900         10, 11,                 /* spdif out */
901         12, 14, 16, 18,         /* adat out */
902         6, 7,                   /* phone out */
903         2, 3, 4, 5,             /* AEB */
904         -1, -1, -1, -1, -1, -1, -1, -1,
905         -1, -1, -1, -1, -1, -1, -1, -1,
906         -1, -1, -1, -1, -1, -1, -1, -1,
907         -1, -1, -1, -1, -1, -1, -1, -1,
908         -1, -1, -1, -1, -1, -1, -1, -1,
909         -1, -1, -1, -1, -1, -1, -1, -1
910 };
911
912 static const char channel_map_aio_in_qs[HDSPM_MAX_CHANNELS] = {
913         0, 1,                   /* line in */
914         8, 9,                   /* aes in */
915         10, 11,                 /* spdif in */
916         12, 16,                 /* adat in */
917         2, 3, 4, 5,             /* AEB */
918         -1, -1, -1, -1,
919         -1, -1, -1, -1, -1, -1, -1, -1,
920         -1, -1, -1, -1, -1, -1, -1, -1,
921         -1, -1, -1, -1, -1, -1, -1, -1,
922         -1, -1, -1, -1, -1, -1, -1, -1,
923         -1, -1, -1, -1, -1, -1, -1, -1,
924         -1, -1, -1, -1, -1, -1, -1, -1
925 };
926
927 static const char channel_map_aio_out_qs[HDSPM_MAX_CHANNELS] = {
928         0, 1,                   /* line out */
929         8, 9,                   /* aes out */
930         10, 11,                 /* spdif out */
931         12, 16,                 /* adat out */
932         6, 7,                   /* phone out */
933         2, 3, 4, 5,             /* AEB */
934         -1, -1,
935         -1, -1, -1, -1, -1, -1, -1, -1,
936         -1, -1, -1, -1, -1, -1, -1, -1,
937         -1, -1, -1, -1, -1, -1, -1, -1,
938         -1, -1, -1, -1, -1, -1, -1, -1,
939         -1, -1, -1, -1, -1, -1, -1, -1,
940         -1, -1, -1, -1, -1, -1, -1, -1
941 };
942
943 static const char channel_map_aes32[HDSPM_MAX_CHANNELS] = {
944         0, 1, 2, 3, 4, 5, 6, 7,
945         8, 9, 10, 11, 12, 13, 14, 15,
946         -1, -1, -1, -1, -1, -1, -1, -1,
947         -1, -1, -1, -1, -1, -1, -1, -1,
948         -1, -1, -1, -1, -1, -1, -1, -1,
949         -1, -1, -1, -1, -1, -1, -1, -1,
950         -1, -1, -1, -1, -1, -1, -1, -1,
951         -1, -1, -1, -1, -1, -1, -1, -1
952 };
953
954 struct hdspm_midi {
955         struct hdspm *hdspm;
956         int id;
957         struct snd_rawmidi *rmidi;
958         struct snd_rawmidi_substream *input;
959         struct snd_rawmidi_substream *output;
960         char istimer;           /* timer in use */
961         struct timer_list timer;
962         spinlock_t lock;
963         int pending;
964         int dataIn;
965         int statusIn;
966         int dataOut;
967         int statusOut;
968         int ie;
969         int irq;
970 };
971
972 struct hdspm_tco {
973         int input; /* 0: LTC, 1:Video, 2: WC*/
974         int framerate; /* 0=24, 1=25, 2=29.97, 3=29.97d, 4=30, 5=30d */
975         int wordclock; /* 0=1:1, 1=44.1->48, 2=48->44.1 */
976         int samplerate; /* 0=44.1, 1=48, 2= freq from app */
977         int pull; /*   0=0, 1=+0.1%, 2=-0.1%, 3=+4%, 4=-4%*/
978         int term; /* 0 = off, 1 = on */
979 };
980
981 struct hdspm {
982         spinlock_t lock;
983         /* only one playback and/or capture stream */
984         struct snd_pcm_substream *capture_substream;
985         struct snd_pcm_substream *playback_substream;
986
987         char *card_name;             /* for procinfo */
988         unsigned short firmware_rev; /* dont know if relevant (yes if AES32)*/
989
990         uint8_t io_type;
991
992         int monitor_outs;       /* set up monitoring outs init flag */
993
994         u32 control_register;   /* cached value */
995         u32 control2_register;  /* cached value */
996         u32 settings_register;  /* cached value for AIO / RayDat (sync reference, master/slave) */
997
998         struct hdspm_midi midi[4];
999         struct work_struct midi_work;
1000
1001         size_t period_bytes;
1002         unsigned char ss_in_channels;
1003         unsigned char ds_in_channels;
1004         unsigned char qs_in_channels;
1005         unsigned char ss_out_channels;
1006         unsigned char ds_out_channels;
1007         unsigned char qs_out_channels;
1008
1009         unsigned char max_channels_in;
1010         unsigned char max_channels_out;
1011
1012         const signed char *channel_map_in;
1013         const signed char *channel_map_out;
1014
1015         const signed char *channel_map_in_ss, *channel_map_in_ds, *channel_map_in_qs;
1016         const signed char *channel_map_out_ss, *channel_map_out_ds, *channel_map_out_qs;
1017
1018         const char * const *port_names_in;
1019         const char * const *port_names_out;
1020
1021         const char * const *port_names_in_ss;
1022         const char * const *port_names_in_ds;
1023         const char * const *port_names_in_qs;
1024         const char * const *port_names_out_ss;
1025         const char * const *port_names_out_ds;
1026         const char * const *port_names_out_qs;
1027
1028         unsigned char *playback_buffer; /* suitably aligned address */
1029         unsigned char *capture_buffer;  /* suitably aligned address */
1030
1031         pid_t capture_pid;      /* process id which uses capture */
1032         pid_t playback_pid;     /* process id which uses capture */
1033         int running;            /* running status */
1034
1035         int last_external_sample_rate;  /* samplerate mystic ... */
1036         int last_internal_sample_rate;
1037         int system_sample_rate;
1038
1039         int dev;                /* Hardware vars... */
1040         int irq;
1041         unsigned long port;
1042         void __iomem *iobase;
1043
1044         int irq_count;          /* for debug */
1045         int midiPorts;
1046
1047         struct snd_card *card;  /* one card */
1048         struct snd_pcm *pcm;            /* has one pcm */
1049         struct snd_hwdep *hwdep;        /* and a hwdep for additional ioctl */
1050         struct pci_dev *pci;    /* and an pci info */
1051
1052         /* Mixer vars */
1053         /* fast alsa mixer */
1054         struct snd_kcontrol *playback_mixer_ctls[HDSPM_MAX_CHANNELS];
1055         /* but input to much, so not used */
1056         struct snd_kcontrol *input_mixer_ctls[HDSPM_MAX_CHANNELS];
1057         /* full mixer accessible over mixer ioctl or hwdep-device */
1058         struct hdspm_mixer *mixer;
1059
1060         struct hdspm_tco *tco;  /* NULL if no TCO detected */
1061
1062         const char *const *texts_autosync;
1063         int texts_autosync_items;
1064
1065         cycles_t last_interrupt;
1066
1067         unsigned int serial;
1068
1069         struct hdspm_peak_rms peak_rms;
1070 };
1071
1072
1073 static const struct pci_device_id snd_hdspm_ids[] = {
1074         {
1075          .vendor = PCI_VENDOR_ID_XILINX,
1076          .device = PCI_DEVICE_ID_XILINX_HAMMERFALL_DSP_MADI,
1077          .subvendor = PCI_ANY_ID,
1078          .subdevice = PCI_ANY_ID,
1079          .class = 0,
1080          .class_mask = 0,
1081          .driver_data = 0},
1082         {0,}
1083 };
1084
1085 MODULE_DEVICE_TABLE(pci, snd_hdspm_ids);
1086
1087 /* prototypes */
1088 static int snd_hdspm_create_alsa_devices(struct snd_card *card,
1089                                          struct hdspm *hdspm);
1090 static int snd_hdspm_create_pcm(struct snd_card *card,
1091                                 struct hdspm *hdspm);
1092
1093 static inline void snd_hdspm_initialize_midi_flush(struct hdspm *hdspm);
1094 static inline int hdspm_get_pll_freq(struct hdspm *hdspm);
1095 static int hdspm_update_simple_mixer_controls(struct hdspm *hdspm);
1096 static int hdspm_autosync_ref(struct hdspm *hdspm);
1097 static int hdspm_set_toggle_setting(struct hdspm *hdspm, u32 regmask, int out);
1098 static int snd_hdspm_set_defaults(struct hdspm *hdspm);
1099 static int hdspm_system_clock_mode(struct hdspm *hdspm);
1100 static void hdspm_set_channel_dma_addr(struct hdspm *hdspm,
1101                                        struct snd_pcm_substream *substream,
1102                                        unsigned int reg, int channels);
1103
1104 static int hdspm_aes_sync_check(struct hdspm *hdspm, int idx);
1105 static int hdspm_wc_sync_check(struct hdspm *hdspm);
1106 static int hdspm_tco_sync_check(struct hdspm *hdspm);
1107 static int hdspm_sync_in_sync_check(struct hdspm *hdspm);
1108
1109 static int hdspm_get_aes_sample_rate(struct hdspm *hdspm, int index);
1110 static int hdspm_get_tco_sample_rate(struct hdspm *hdspm);
1111 static int hdspm_get_wc_sample_rate(struct hdspm *hdspm);
1112
1113
1114
1115 static inline int HDSPM_bit2freq(int n)
1116 {
1117         static const int bit2freq_tab[] = {
1118                 0, 32000, 44100, 48000, 64000, 88200,
1119                 96000, 128000, 176400, 192000 };
1120         if (n < 1 || n > 9)
1121                 return 0;
1122         return bit2freq_tab[n];
1123 }
1124
1125 static bool hdspm_is_raydat_or_aio(struct hdspm *hdspm)
1126 {
1127         return ((AIO == hdspm->io_type) || (RayDAT == hdspm->io_type));
1128 }
1129
1130
1131 /* Write/read to/from HDSPM with Adresses in Bytes
1132    not words but only 32Bit writes are allowed */
1133
1134 static inline void hdspm_write(struct hdspm * hdspm, unsigned int reg,
1135                                unsigned int val)
1136 {
1137         writel(val, hdspm->iobase + reg);
1138 }
1139
1140 static inline unsigned int hdspm_read(struct hdspm * hdspm, unsigned int reg)
1141 {
1142         return readl(hdspm->iobase + reg);
1143 }
1144
1145 /* for each output channel (chan) I have an Input (in) and Playback (pb) Fader
1146    mixer is write only on hardware so we have to cache him for read
1147    each fader is a u32, but uses only the first 16 bit */
1148
1149 static inline int hdspm_read_in_gain(struct hdspm * hdspm, unsigned int chan,
1150                                      unsigned int in)
1151 {
1152         if (chan >= HDSPM_MIXER_CHANNELS || in >= HDSPM_MIXER_CHANNELS)
1153                 return 0;
1154
1155         return hdspm->mixer->ch[chan].in[in];
1156 }
1157
1158 static inline int hdspm_read_pb_gain(struct hdspm * hdspm, unsigned int chan,
1159                                      unsigned int pb)
1160 {
1161         if (chan >= HDSPM_MIXER_CHANNELS || pb >= HDSPM_MIXER_CHANNELS)
1162                 return 0;
1163         return hdspm->mixer->ch[chan].pb[pb];
1164 }
1165
1166 static int hdspm_write_in_gain(struct hdspm *hdspm, unsigned int chan,
1167                                       unsigned int in, unsigned short data)
1168 {
1169         if (chan >= HDSPM_MIXER_CHANNELS || in >= HDSPM_MIXER_CHANNELS)
1170                 return -1;
1171
1172         hdspm_write(hdspm,
1173                     HDSPM_MADI_mixerBase +
1174                     ((in + 128 * chan) * sizeof(u32)),
1175                     (hdspm->mixer->ch[chan].in[in] = data & 0xFFFF));
1176         return 0;
1177 }
1178
1179 static int hdspm_write_pb_gain(struct hdspm *hdspm, unsigned int chan,
1180                                       unsigned int pb, unsigned short data)
1181 {
1182         if (chan >= HDSPM_MIXER_CHANNELS || pb >= HDSPM_MIXER_CHANNELS)
1183                 return -1;
1184
1185         hdspm_write(hdspm,
1186                     HDSPM_MADI_mixerBase +
1187                     ((64 + pb + 128 * chan) * sizeof(u32)),
1188                     (hdspm->mixer->ch[chan].pb[pb] = data & 0xFFFF));
1189         return 0;
1190 }
1191
1192
1193 /* enable DMA for specific channels, now available for DSP-MADI */
1194 static inline void snd_hdspm_enable_in(struct hdspm * hdspm, int i, int v)
1195 {
1196         hdspm_write(hdspm, HDSPM_inputEnableBase + (4 * i), v);
1197 }
1198
1199 static inline void snd_hdspm_enable_out(struct hdspm * hdspm, int i, int v)
1200 {
1201         hdspm_write(hdspm, HDSPM_outputEnableBase + (4 * i), v);
1202 }
1203
1204 /* check if same process is writing and reading */
1205 static int snd_hdspm_use_is_exclusive(struct hdspm *hdspm)
1206 {
1207         unsigned long flags;
1208         int ret = 1;
1209
1210         spin_lock_irqsave(&hdspm->lock, flags);
1211         if ((hdspm->playback_pid != hdspm->capture_pid) &&
1212             (hdspm->playback_pid >= 0) && (hdspm->capture_pid >= 0)) {
1213                 ret = 0;
1214         }
1215         spin_unlock_irqrestore(&hdspm->lock, flags);
1216         return ret;
1217 }
1218
1219 /* round arbitrary sample rates to commonly known rates */
1220 static int hdspm_round_frequency(int rate)
1221 {
1222         if (rate < 38050)
1223                 return 32000;
1224         if (rate < 46008)
1225                 return 44100;
1226         else
1227                 return 48000;
1228 }
1229
1230 /* QS and DS rates normally can not be detected
1231  * automatically by the card. Only exception is MADI
1232  * in 96k frame mode.
1233  *
1234  * So if we read SS values (32 .. 48k), check for
1235  * user-provided DS/QS bits in the control register
1236  * and multiply the base frequency accordingly.
1237  */
1238 static int hdspm_rate_multiplier(struct hdspm *hdspm, int rate)
1239 {
1240         if (rate <= 48000) {
1241                 if (hdspm->control_register & HDSPM_QuadSpeed)
1242                         return rate * 4;
1243                 else if (hdspm->control_register &
1244                                 HDSPM_DoubleSpeed)
1245                         return rate * 2;
1246         }
1247         return rate;
1248 }
1249
1250 /* check for external sample rate, returns the sample rate in Hz*/
1251 static int hdspm_external_sample_rate(struct hdspm *hdspm)
1252 {
1253         unsigned int status, status2;
1254         int syncref, rate = 0, rate_bits;
1255
1256         switch (hdspm->io_type) {
1257         case AES32:
1258                 status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
1259                 status = hdspm_read(hdspm, HDSPM_statusRegister);
1260
1261                 syncref = hdspm_autosync_ref(hdspm);
1262                 switch (syncref) {
1263                 case HDSPM_AES32_AUTOSYNC_FROM_WORD:
1264                 /* Check WC sync and get sample rate */
1265                         if (hdspm_wc_sync_check(hdspm))
1266                                 return HDSPM_bit2freq(hdspm_get_wc_sample_rate(hdspm));
1267                         break;
1268
1269                 case HDSPM_AES32_AUTOSYNC_FROM_AES1:
1270                 case HDSPM_AES32_AUTOSYNC_FROM_AES2:
1271                 case HDSPM_AES32_AUTOSYNC_FROM_AES3:
1272                 case HDSPM_AES32_AUTOSYNC_FROM_AES4:
1273                 case HDSPM_AES32_AUTOSYNC_FROM_AES5:
1274                 case HDSPM_AES32_AUTOSYNC_FROM_AES6:
1275                 case HDSPM_AES32_AUTOSYNC_FROM_AES7:
1276                 case HDSPM_AES32_AUTOSYNC_FROM_AES8:
1277                 /* Check AES sync and get sample rate */
1278                         if (hdspm_aes_sync_check(hdspm, syncref - HDSPM_AES32_AUTOSYNC_FROM_AES1))
1279                                 return HDSPM_bit2freq(hdspm_get_aes_sample_rate(hdspm,
1280                                                         syncref - HDSPM_AES32_AUTOSYNC_FROM_AES1));
1281                         break;
1282
1283
1284                 case HDSPM_AES32_AUTOSYNC_FROM_TCO:
1285                 /* Check TCO sync and get sample rate */
1286                         if (hdspm_tco_sync_check(hdspm))
1287                                 return HDSPM_bit2freq(hdspm_get_tco_sample_rate(hdspm));
1288                         break;
1289                 default:
1290                         return 0;
1291                 } /* end switch(syncref) */
1292                 break;
1293
1294         case MADIface:
1295                 status = hdspm_read(hdspm, HDSPM_statusRegister);
1296
1297                 if (!(status & HDSPM_madiLock)) {
1298                         rate = 0;  /* no lock */
1299                 } else {
1300                         switch (status & (HDSPM_status1_freqMask)) {
1301                         case HDSPM_status1_F_0*1:
1302                                 rate = 32000; break;
1303                         case HDSPM_status1_F_0*2:
1304                                 rate = 44100; break;
1305                         case HDSPM_status1_F_0*3:
1306                                 rate = 48000; break;
1307                         case HDSPM_status1_F_0*4:
1308                                 rate = 64000; break;
1309                         case HDSPM_status1_F_0*5:
1310                                 rate = 88200; break;
1311                         case HDSPM_status1_F_0*6:
1312                                 rate = 96000; break;
1313                         case HDSPM_status1_F_0*7:
1314                                 rate = 128000; break;
1315                         case HDSPM_status1_F_0*8:
1316                                 rate = 176400; break;
1317                         case HDSPM_status1_F_0*9:
1318                                 rate = 192000; break;
1319                         default:
1320                                 rate = 0; break;
1321                         }
1322                 }
1323
1324                 break;
1325
1326         case MADI:
1327         case AIO:
1328         case RayDAT:
1329                 status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
1330                 status = hdspm_read(hdspm, HDSPM_statusRegister);
1331                 rate = 0;
1332
1333                 /* if wordclock has synced freq and wordclock is valid */
1334                 if ((status2 & HDSPM_wcLock) != 0 &&
1335                                 (status2 & HDSPM_SelSyncRef0) == 0) {
1336
1337                         rate_bits = status2 & HDSPM_wcFreqMask;
1338
1339
1340                         switch (rate_bits) {
1341                         case HDSPM_wcFreq32:
1342                                 rate = 32000;
1343                                 break;
1344                         case HDSPM_wcFreq44_1:
1345                                 rate = 44100;
1346                                 break;
1347                         case HDSPM_wcFreq48:
1348                                 rate = 48000;
1349                                 break;
1350                         case HDSPM_wcFreq64:
1351                                 rate = 64000;
1352                                 break;
1353                         case HDSPM_wcFreq88_2:
1354                                 rate = 88200;
1355                                 break;
1356                         case HDSPM_wcFreq96:
1357                                 rate = 96000;
1358                                 break;
1359                         case HDSPM_wcFreq128:
1360                                 rate = 128000;
1361                                 break;
1362                         case HDSPM_wcFreq176_4:
1363                                 rate = 176400;
1364                                 break;
1365                         case HDSPM_wcFreq192:
1366                                 rate = 192000;
1367                                 break;
1368                         default:
1369                                 rate = 0;
1370                                 break;
1371                         }
1372                 }
1373
1374                 /* if rate detected and Syncref is Word than have it,
1375                  * word has priority to MADI
1376                  */
1377                 if (rate != 0 &&
1378                 (status2 & HDSPM_SelSyncRefMask) == HDSPM_SelSyncRef_WORD)
1379                         return hdspm_rate_multiplier(hdspm, rate);
1380
1381                 /* maybe a madi input (which is taken if sel sync is madi) */
1382                 if (status & HDSPM_madiLock) {
1383                         rate_bits = status & HDSPM_madiFreqMask;
1384
1385                         switch (rate_bits) {
1386                         case HDSPM_madiFreq32:
1387                                 rate = 32000;
1388                                 break;
1389                         case HDSPM_madiFreq44_1:
1390                                 rate = 44100;
1391                                 break;
1392                         case HDSPM_madiFreq48:
1393                                 rate = 48000;
1394                                 break;
1395                         case HDSPM_madiFreq64:
1396                                 rate = 64000;
1397                                 break;
1398                         case HDSPM_madiFreq88_2:
1399                                 rate = 88200;
1400                                 break;
1401                         case HDSPM_madiFreq96:
1402                                 rate = 96000;
1403                                 break;
1404                         case HDSPM_madiFreq128:
1405                                 rate = 128000;
1406                                 break;
1407                         case HDSPM_madiFreq176_4:
1408                                 rate = 176400;
1409                                 break;
1410                         case HDSPM_madiFreq192:
1411                                 rate = 192000;
1412                                 break;
1413                         default:
1414                                 rate = 0;
1415                                 break;
1416                         }
1417
1418                 } /* endif HDSPM_madiLock */
1419
1420                 /* check sample rate from TCO or SYNC_IN */
1421                 {
1422                         bool is_valid_input = 0;
1423                         bool has_sync = 0;
1424
1425                         syncref = hdspm_autosync_ref(hdspm);
1426                         if (HDSPM_AUTOSYNC_FROM_TCO == syncref) {
1427                                 is_valid_input = 1;
1428                                 has_sync = (HDSPM_SYNC_CHECK_SYNC ==
1429                                         hdspm_tco_sync_check(hdspm));
1430                         } else if (HDSPM_AUTOSYNC_FROM_SYNC_IN == syncref) {
1431                                 is_valid_input = 1;
1432                                 has_sync = (HDSPM_SYNC_CHECK_SYNC ==
1433                                         hdspm_sync_in_sync_check(hdspm));
1434                         }
1435
1436                         if (is_valid_input && has_sync) {
1437                                 rate = hdspm_round_frequency(
1438                                         hdspm_get_pll_freq(hdspm));
1439                         }
1440                 }
1441
1442                 rate = hdspm_rate_multiplier(hdspm, rate);
1443
1444                 break;
1445         }
1446
1447         return rate;
1448 }
1449
1450 /* return latency in samples per period */
1451 static int hdspm_get_latency(struct hdspm *hdspm)
1452 {
1453         int n;
1454
1455         n = hdspm_decode_latency(hdspm->control_register);
1456
1457         /* Special case for new RME cards with 32 samples period size.
1458          * The three latency bits in the control register
1459          * (HDSP_LatencyMask) encode latency values of 64 samples as
1460          * 0, 128 samples as 1 ... 4096 samples as 6. For old cards, 7
1461          * denotes 8192 samples, but on new cards like RayDAT or AIO,
1462          * it corresponds to 32 samples.
1463          */
1464         if ((7 == n) && (RayDAT == hdspm->io_type || AIO == hdspm->io_type))
1465                 n = -1;
1466
1467         return 1 << (n + 6);
1468 }
1469
1470 /* Latency function */
1471 static inline void hdspm_compute_period_size(struct hdspm *hdspm)
1472 {
1473         hdspm->period_bytes = 4 * hdspm_get_latency(hdspm);
1474 }
1475
1476
1477 static snd_pcm_uframes_t hdspm_hw_pointer(struct hdspm *hdspm)
1478 {
1479         int position;
1480
1481         position = hdspm_read(hdspm, HDSPM_statusRegister);
1482
1483         switch (hdspm->io_type) {
1484         case RayDAT:
1485         case AIO:
1486                 position &= HDSPM_BufferPositionMask;
1487                 position /= 4; /* Bytes per sample */
1488                 break;
1489         default:
1490                 position = (position & HDSPM_BufferID) ?
1491                         (hdspm->period_bytes / 4) : 0;
1492         }
1493
1494         return position;
1495 }
1496
1497
1498 static inline void hdspm_start_audio(struct hdspm * s)
1499 {
1500         s->control_register |= (HDSPM_AudioInterruptEnable | HDSPM_Start);
1501         hdspm_write(s, HDSPM_controlRegister, s->control_register);
1502 }
1503
1504 static inline void hdspm_stop_audio(struct hdspm * s)
1505 {
1506         s->control_register &= ~(HDSPM_Start | HDSPM_AudioInterruptEnable);
1507         hdspm_write(s, HDSPM_controlRegister, s->control_register);
1508 }
1509
1510 /* should I silence all or only opened ones ? doit all for first even is 4MB*/
1511 static void hdspm_silence_playback(struct hdspm *hdspm)
1512 {
1513         int i;
1514         int n = hdspm->period_bytes;
1515         void *buf = hdspm->playback_buffer;
1516
1517         if (!buf)
1518                 return;
1519
1520         for (i = 0; i < HDSPM_MAX_CHANNELS; i++) {
1521                 memset(buf, 0, n);
1522                 buf += HDSPM_CHANNEL_BUFFER_BYTES;
1523         }
1524 }
1525
1526 static int hdspm_set_interrupt_interval(struct hdspm *s, unsigned int frames)
1527 {
1528         int n;
1529
1530         spin_lock_irq(&s->lock);
1531
1532         if (32 == frames) {
1533                 /* Special case for new RME cards like RayDAT/AIO which
1534                  * support period sizes of 32 samples. Since latency is
1535                  * encoded in the three bits of HDSP_LatencyMask, we can only
1536                  * have values from 0 .. 7. While 0 still means 64 samples and
1537                  * 6 represents 4096 samples on all cards, 7 represents 8192
1538                  * on older cards and 32 samples on new cards.
1539                  *
1540                  * In other words, period size in samples is calculated by
1541                  * 2^(n+6) with n ranging from 0 .. 7.
1542                  */
1543                 n = 7;
1544         } else {
1545                 frames >>= 7;
1546                 n = 0;
1547                 while (frames) {
1548                         n++;
1549                         frames >>= 1;
1550                 }
1551         }
1552
1553         s->control_register &= ~HDSPM_LatencyMask;
1554         s->control_register |= hdspm_encode_latency(n);
1555
1556         hdspm_write(s, HDSPM_controlRegister, s->control_register);
1557
1558         hdspm_compute_period_size(s);
1559
1560         spin_unlock_irq(&s->lock);
1561
1562         return 0;
1563 }
1564
1565 static u64 hdspm_calc_dds_value(struct hdspm *hdspm, u64 period)
1566 {
1567         u64 freq_const;
1568
1569         if (period == 0)
1570                 return 0;
1571
1572         switch (hdspm->io_type) {
1573         case MADI:
1574         case AES32:
1575                 freq_const = 110069313433624ULL;
1576                 break;
1577         case RayDAT:
1578         case AIO:
1579                 freq_const = 104857600000000ULL;
1580                 break;
1581         case MADIface:
1582                 freq_const = 131072000000000ULL;
1583                 break;
1584         default:
1585                 snd_BUG();
1586                 return 0;
1587         }
1588
1589         return div_u64(freq_const, period);
1590 }
1591
1592
1593 static void hdspm_set_dds_value(struct hdspm *hdspm, int rate)
1594 {
1595         u64 n;
1596
1597         if (snd_BUG_ON(rate <= 0))
1598                 return;
1599
1600         if (rate >= 112000)
1601                 rate /= 4;
1602         else if (rate >= 56000)
1603                 rate /= 2;
1604
1605         switch (hdspm->io_type) {
1606         case MADIface:
1607                 n = 131072000000000ULL;  /* 125 MHz */
1608                 break;
1609         case MADI:
1610         case AES32:
1611                 n = 110069313433624ULL;  /* 105 MHz */
1612                 break;
1613         case RayDAT:
1614         case AIO:
1615                 n = 104857600000000ULL;  /* 100 MHz */
1616                 break;
1617         default:
1618                 snd_BUG();
1619                 return;
1620         }
1621
1622         n = div_u64(n, rate);
1623         /* n should be less than 2^32 for being written to FREQ register */
1624         snd_BUG_ON(n >> 32);
1625         hdspm_write(hdspm, HDSPM_freqReg, (u32)n);
1626 }
1627
1628 /* dummy set rate lets see what happens */
1629 static int hdspm_set_rate(struct hdspm * hdspm, int rate, int called_internally)
1630 {
1631         int current_rate;
1632         int rate_bits;
1633         int not_set = 0;
1634         int current_speed, target_speed;
1635
1636         /* ASSUMPTION: hdspm->lock is either set, or there is no need for
1637            it (e.g. during module initialization).
1638          */
1639
1640         if (!(hdspm->control_register & HDSPM_ClockModeMaster)) {
1641
1642                 /* SLAVE --- */
1643                 if (called_internally) {
1644
1645                         /* request from ctl or card initialization
1646                            just make a warning an remember setting
1647                            for future master mode switching */
1648
1649                         dev_warn(hdspm->card->dev,
1650                                  "Warning: device is not running as a clock master.\n");
1651                         not_set = 1;
1652                 } else {
1653
1654                         /* hw_param request while in AutoSync mode */
1655                         int external_freq =
1656                             hdspm_external_sample_rate(hdspm);
1657
1658                         if (hdspm_autosync_ref(hdspm) ==
1659                             HDSPM_AUTOSYNC_FROM_NONE) {
1660
1661                                 dev_warn(hdspm->card->dev,
1662                                          "Detected no External Sync\n");
1663                                 not_set = 1;
1664
1665                         } else if (rate != external_freq) {
1666
1667                                 dev_warn(hdspm->card->dev,
1668                                          "Warning: No AutoSync source for requested rate\n");
1669                                 not_set = 1;
1670                         }
1671                 }
1672         }
1673
1674         current_rate = hdspm->system_sample_rate;
1675
1676         /* Changing between Singe, Double and Quad speed is not
1677            allowed if any substreams are open. This is because such a change
1678            causes a shift in the location of the DMA buffers and a reduction
1679            in the number of available buffers.
1680
1681            Note that a similar but essentially insoluble problem exists for
1682            externally-driven rate changes. All we can do is to flag rate
1683            changes in the read/write routines.
1684          */
1685
1686         if (current_rate <= 48000)
1687                 current_speed = HDSPM_SPEED_SINGLE;
1688         else if (current_rate <= 96000)
1689                 current_speed = HDSPM_SPEED_DOUBLE;
1690         else
1691                 current_speed = HDSPM_SPEED_QUAD;
1692
1693         if (rate <= 48000)
1694                 target_speed = HDSPM_SPEED_SINGLE;
1695         else if (rate <= 96000)
1696                 target_speed = HDSPM_SPEED_DOUBLE;
1697         else
1698                 target_speed = HDSPM_SPEED_QUAD;
1699
1700         switch (rate) {
1701         case 32000:
1702                 rate_bits = HDSPM_Frequency32KHz;
1703                 break;
1704         case 44100:
1705                 rate_bits = HDSPM_Frequency44_1KHz;
1706                 break;
1707         case 48000:
1708                 rate_bits = HDSPM_Frequency48KHz;
1709                 break;
1710         case 64000:
1711                 rate_bits = HDSPM_Frequency64KHz;
1712                 break;
1713         case 88200:
1714                 rate_bits = HDSPM_Frequency88_2KHz;
1715                 break;
1716         case 96000:
1717                 rate_bits = HDSPM_Frequency96KHz;
1718                 break;
1719         case 128000:
1720                 rate_bits = HDSPM_Frequency128KHz;
1721                 break;
1722         case 176400:
1723                 rate_bits = HDSPM_Frequency176_4KHz;
1724                 break;
1725         case 192000:
1726                 rate_bits = HDSPM_Frequency192KHz;
1727                 break;
1728         default:
1729                 return -EINVAL;
1730         }
1731
1732         if (current_speed != target_speed
1733             && (hdspm->capture_pid >= 0 || hdspm->playback_pid >= 0)) {
1734                 dev_err(hdspm->card->dev,
1735                         "cannot change from %s speed to %s speed mode (capture PID = %d, playback PID = %d)\n",
1736                         hdspm_speed_names[current_speed],
1737                         hdspm_speed_names[target_speed],
1738                         hdspm->capture_pid, hdspm->playback_pid);
1739                 return -EBUSY;
1740         }
1741
1742         hdspm->control_register &= ~HDSPM_FrequencyMask;
1743         hdspm->control_register |= rate_bits;
1744         hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
1745
1746         /* For AES32, need to set DDS value in FREQ register
1747            For MADI, also apparently */
1748         hdspm_set_dds_value(hdspm, rate);
1749
1750         if (AES32 == hdspm->io_type && rate != current_rate)
1751                 hdspm_write(hdspm, HDSPM_eeprom_wr, 0);
1752
1753         hdspm->system_sample_rate = rate;
1754
1755         if (rate <= 48000) {
1756                 hdspm->channel_map_in = hdspm->channel_map_in_ss;
1757                 hdspm->channel_map_out = hdspm->channel_map_out_ss;
1758                 hdspm->max_channels_in = hdspm->ss_in_channels;
1759                 hdspm->max_channels_out = hdspm->ss_out_channels;
1760                 hdspm->port_names_in = hdspm->port_names_in_ss;
1761                 hdspm->port_names_out = hdspm->port_names_out_ss;
1762         } else if (rate <= 96000) {
1763                 hdspm->channel_map_in = hdspm->channel_map_in_ds;
1764                 hdspm->channel_map_out = hdspm->channel_map_out_ds;
1765                 hdspm->max_channels_in = hdspm->ds_in_channels;
1766                 hdspm->max_channels_out = hdspm->ds_out_channels;
1767                 hdspm->port_names_in = hdspm->port_names_in_ds;
1768                 hdspm->port_names_out = hdspm->port_names_out_ds;
1769         } else {
1770                 hdspm->channel_map_in = hdspm->channel_map_in_qs;
1771                 hdspm->channel_map_out = hdspm->channel_map_out_qs;
1772                 hdspm->max_channels_in = hdspm->qs_in_channels;
1773                 hdspm->max_channels_out = hdspm->qs_out_channels;
1774                 hdspm->port_names_in = hdspm->port_names_in_qs;
1775                 hdspm->port_names_out = hdspm->port_names_out_qs;
1776         }
1777
1778         if (not_set != 0)
1779                 return -1;
1780
1781         return 0;
1782 }
1783
1784 /* mainly for init to 0 on load */
1785 static void all_in_all_mixer(struct hdspm * hdspm, int sgain)
1786 {
1787         int i, j;
1788         unsigned int gain;
1789
1790         if (sgain > UNITY_GAIN)
1791                 gain = UNITY_GAIN;
1792         else if (sgain < 0)
1793                 gain = 0;
1794         else
1795                 gain = sgain;
1796
1797         for (i = 0; i < HDSPM_MIXER_CHANNELS; i++)
1798                 for (j = 0; j < HDSPM_MIXER_CHANNELS; j++) {
1799                         hdspm_write_in_gain(hdspm, i, j, gain);
1800                         hdspm_write_pb_gain(hdspm, i, j, gain);
1801                 }
1802 }
1803
1804 /*----------------------------------------------------------------------------
1805    MIDI
1806   ----------------------------------------------------------------------------*/
1807
1808 static inline unsigned char snd_hdspm_midi_read_byte (struct hdspm *hdspm,
1809                                                       int id)
1810 {
1811         /* the hardware already does the relevant bit-mask with 0xff */
1812         return hdspm_read(hdspm, hdspm->midi[id].dataIn);
1813 }
1814
1815 static inline void snd_hdspm_midi_write_byte (struct hdspm *hdspm, int id,
1816                                               int val)
1817 {
1818         /* the hardware already does the relevant bit-mask with 0xff */
1819         return hdspm_write(hdspm, hdspm->midi[id].dataOut, val);
1820 }
1821
1822 static inline int snd_hdspm_midi_input_available (struct hdspm *hdspm, int id)
1823 {
1824         return hdspm_read(hdspm, hdspm->midi[id].statusIn) & 0xFF;
1825 }
1826
1827 static inline int snd_hdspm_midi_output_possible (struct hdspm *hdspm, int id)
1828 {
1829         int fifo_bytes_used;
1830
1831         fifo_bytes_used = hdspm_read(hdspm, hdspm->midi[id].statusOut) & 0xFF;
1832
1833         if (fifo_bytes_used < 128)
1834                 return  128 - fifo_bytes_used;
1835         else
1836                 return 0;
1837 }
1838
1839 static void snd_hdspm_flush_midi_input(struct hdspm *hdspm, int id)
1840 {
1841         while (snd_hdspm_midi_input_available (hdspm, id))
1842                 snd_hdspm_midi_read_byte (hdspm, id);
1843 }
1844
1845 static int snd_hdspm_midi_output_write (struct hdspm_midi *hmidi)
1846 {
1847         unsigned long flags;
1848         int n_pending;
1849         int to_write;
1850         int i;
1851         unsigned char buf[128];
1852
1853         /* Output is not interrupt driven */
1854
1855         spin_lock_irqsave (&hmidi->lock, flags);
1856         if (hmidi->output &&
1857             !snd_rawmidi_transmit_empty (hmidi->output)) {
1858                 n_pending = snd_hdspm_midi_output_possible (hmidi->hdspm,
1859                                                             hmidi->id);
1860                 if (n_pending > 0) {
1861                         if (n_pending > (int)sizeof (buf))
1862                                 n_pending = sizeof (buf);
1863
1864                         to_write = snd_rawmidi_transmit (hmidi->output, buf,
1865                                                          n_pending);
1866                         if (to_write > 0) {
1867                                 for (i = 0; i < to_write; ++i)
1868                                         snd_hdspm_midi_write_byte (hmidi->hdspm,
1869                                                                    hmidi->id,
1870                                                                    buf[i]);
1871                         }
1872                 }
1873         }
1874         spin_unlock_irqrestore (&hmidi->lock, flags);
1875         return 0;
1876 }
1877
1878 static int snd_hdspm_midi_input_read (struct hdspm_midi *hmidi)
1879 {
1880         unsigned char buf[128]; /* this buffer is designed to match the MIDI
1881                                  * input FIFO size
1882                                  */
1883         unsigned long flags;
1884         int n_pending;
1885         int i;
1886
1887         spin_lock_irqsave (&hmidi->lock, flags);
1888         n_pending = snd_hdspm_midi_input_available (hmidi->hdspm, hmidi->id);
1889         if (n_pending > 0) {
1890                 if (hmidi->input) {
1891                         if (n_pending > (int)sizeof (buf))
1892                                 n_pending = sizeof (buf);
1893                         for (i = 0; i < n_pending; ++i)
1894                                 buf[i] = snd_hdspm_midi_read_byte (hmidi->hdspm,
1895                                                                    hmidi->id);
1896                         if (n_pending)
1897                                 snd_rawmidi_receive (hmidi->input, buf,
1898                                                      n_pending);
1899                 } else {
1900                         /* flush the MIDI input FIFO */
1901                         while (n_pending--)
1902                                 snd_hdspm_midi_read_byte (hmidi->hdspm,
1903                                                           hmidi->id);
1904                 }
1905         }
1906         hmidi->pending = 0;
1907         spin_unlock_irqrestore(&hmidi->lock, flags);
1908
1909         spin_lock_irqsave(&hmidi->hdspm->lock, flags);
1910         hmidi->hdspm->control_register |= hmidi->ie;
1911         hdspm_write(hmidi->hdspm, HDSPM_controlRegister,
1912                     hmidi->hdspm->control_register);
1913         spin_unlock_irqrestore(&hmidi->hdspm->lock, flags);
1914
1915         return snd_hdspm_midi_output_write (hmidi);
1916 }
1917
1918 static void
1919 snd_hdspm_midi_input_trigger(struct snd_rawmidi_substream *substream, int up)
1920 {
1921         struct hdspm *hdspm;
1922         struct hdspm_midi *hmidi;
1923         unsigned long flags;
1924
1925         hmidi = substream->rmidi->private_data;
1926         hdspm = hmidi->hdspm;
1927
1928         spin_lock_irqsave (&hdspm->lock, flags);
1929         if (up) {
1930                 if (!(hdspm->control_register & hmidi->ie)) {
1931                         snd_hdspm_flush_midi_input (hdspm, hmidi->id);
1932                         hdspm->control_register |= hmidi->ie;
1933                 }
1934         } else {
1935                 hdspm->control_register &= ~hmidi->ie;
1936         }
1937
1938         hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
1939         spin_unlock_irqrestore (&hdspm->lock, flags);
1940 }
1941
1942 static void snd_hdspm_midi_output_timer(struct timer_list *t)
1943 {
1944         struct hdspm_midi *hmidi = from_timer(hmidi, t, timer);
1945         unsigned long flags;
1946
1947         snd_hdspm_midi_output_write(hmidi);
1948         spin_lock_irqsave (&hmidi->lock, flags);
1949
1950         /* this does not bump hmidi->istimer, because the
1951            kernel automatically removed the timer when it
1952            expired, and we are now adding it back, thus
1953            leaving istimer wherever it was set before.
1954         */
1955
1956         if (hmidi->istimer)
1957                 mod_timer(&hmidi->timer, 1 + jiffies);
1958
1959         spin_unlock_irqrestore (&hmidi->lock, flags);
1960 }
1961
1962 static void
1963 snd_hdspm_midi_output_trigger(struct snd_rawmidi_substream *substream, int up)
1964 {
1965         struct hdspm_midi *hmidi;
1966         unsigned long flags;
1967
1968         hmidi = substream->rmidi->private_data;
1969         spin_lock_irqsave (&hmidi->lock, flags);
1970         if (up) {
1971                 if (!hmidi->istimer) {
1972                         timer_setup(&hmidi->timer,
1973                                     snd_hdspm_midi_output_timer, 0);
1974                         mod_timer(&hmidi->timer, 1 + jiffies);
1975                         hmidi->istimer++;
1976                 }
1977         } else {
1978                 if (hmidi->istimer && --hmidi->istimer <= 0)
1979                         del_timer (&hmidi->timer);
1980         }
1981         spin_unlock_irqrestore (&hmidi->lock, flags);
1982         if (up)
1983                 snd_hdspm_midi_output_write(hmidi);
1984 }
1985
1986 static int snd_hdspm_midi_input_open(struct snd_rawmidi_substream *substream)
1987 {
1988         struct hdspm_midi *hmidi;
1989
1990         hmidi = substream->rmidi->private_data;
1991         spin_lock_irq (&hmidi->lock);
1992         snd_hdspm_flush_midi_input (hmidi->hdspm, hmidi->id);
1993         hmidi->input = substream;
1994         spin_unlock_irq (&hmidi->lock);
1995
1996         return 0;
1997 }
1998
1999 static int snd_hdspm_midi_output_open(struct snd_rawmidi_substream *substream)
2000 {
2001         struct hdspm_midi *hmidi;
2002
2003         hmidi = substream->rmidi->private_data;
2004         spin_lock_irq (&hmidi->lock);
2005         hmidi->output = substream;
2006         spin_unlock_irq (&hmidi->lock);
2007
2008         return 0;
2009 }
2010
2011 static int snd_hdspm_midi_input_close(struct snd_rawmidi_substream *substream)
2012 {
2013         struct hdspm_midi *hmidi;
2014
2015         snd_hdspm_midi_input_trigger (substream, 0);
2016
2017         hmidi = substream->rmidi->private_data;
2018         spin_lock_irq (&hmidi->lock);
2019         hmidi->input = NULL;
2020         spin_unlock_irq (&hmidi->lock);
2021
2022         return 0;
2023 }
2024
2025 static int snd_hdspm_midi_output_close(struct snd_rawmidi_substream *substream)
2026 {
2027         struct hdspm_midi *hmidi;
2028
2029         snd_hdspm_midi_output_trigger (substream, 0);
2030
2031         hmidi = substream->rmidi->private_data;
2032         spin_lock_irq (&hmidi->lock);
2033         hmidi->output = NULL;
2034         spin_unlock_irq (&hmidi->lock);
2035
2036         return 0;
2037 }
2038
2039 static const struct snd_rawmidi_ops snd_hdspm_midi_output =
2040 {
2041         .open =         snd_hdspm_midi_output_open,
2042         .close =        snd_hdspm_midi_output_close,
2043         .trigger =      snd_hdspm_midi_output_trigger,
2044 };
2045
2046 static const struct snd_rawmidi_ops snd_hdspm_midi_input =
2047 {
2048         .open =         snd_hdspm_midi_input_open,
2049         .close =        snd_hdspm_midi_input_close,
2050         .trigger =      snd_hdspm_midi_input_trigger,
2051 };
2052
2053 static int snd_hdspm_create_midi(struct snd_card *card,
2054                                  struct hdspm *hdspm, int id)
2055 {
2056         int err;
2057         char buf[64];
2058
2059         hdspm->midi[id].id = id;
2060         hdspm->midi[id].hdspm = hdspm;
2061         spin_lock_init (&hdspm->midi[id].lock);
2062
2063         if (0 == id) {
2064                 if (MADIface == hdspm->io_type) {
2065                         /* MIDI-over-MADI on HDSPe MADIface */
2066                         hdspm->midi[0].dataIn = HDSPM_midiDataIn2;
2067                         hdspm->midi[0].statusIn = HDSPM_midiStatusIn2;
2068                         hdspm->midi[0].dataOut = HDSPM_midiDataOut2;
2069                         hdspm->midi[0].statusOut = HDSPM_midiStatusOut2;
2070                         hdspm->midi[0].ie = HDSPM_Midi2InterruptEnable;
2071                         hdspm->midi[0].irq = HDSPM_midi2IRQPending;
2072                 } else {
2073                         hdspm->midi[0].dataIn = HDSPM_midiDataIn0;
2074                         hdspm->midi[0].statusIn = HDSPM_midiStatusIn0;
2075                         hdspm->midi[0].dataOut = HDSPM_midiDataOut0;
2076                         hdspm->midi[0].statusOut = HDSPM_midiStatusOut0;
2077                         hdspm->midi[0].ie = HDSPM_Midi0InterruptEnable;
2078                         hdspm->midi[0].irq = HDSPM_midi0IRQPending;
2079                 }
2080         } else if (1 == id) {
2081                 hdspm->midi[1].dataIn = HDSPM_midiDataIn1;
2082                 hdspm->midi[1].statusIn = HDSPM_midiStatusIn1;
2083                 hdspm->midi[1].dataOut = HDSPM_midiDataOut1;
2084                 hdspm->midi[1].statusOut = HDSPM_midiStatusOut1;
2085                 hdspm->midi[1].ie = HDSPM_Midi1InterruptEnable;
2086                 hdspm->midi[1].irq = HDSPM_midi1IRQPending;
2087         } else if ((2 == id) && (MADI == hdspm->io_type)) {
2088                 /* MIDI-over-MADI on HDSPe MADI */
2089                 hdspm->midi[2].dataIn = HDSPM_midiDataIn2;
2090                 hdspm->midi[2].statusIn = HDSPM_midiStatusIn2;
2091                 hdspm->midi[2].dataOut = HDSPM_midiDataOut2;
2092                 hdspm->midi[2].statusOut = HDSPM_midiStatusOut2;
2093                 hdspm->midi[2].ie = HDSPM_Midi2InterruptEnable;
2094                 hdspm->midi[2].irq = HDSPM_midi2IRQPending;
2095         } else if (2 == id) {
2096                 /* TCO MTC, read only */
2097                 hdspm->midi[2].dataIn = HDSPM_midiDataIn2;
2098                 hdspm->midi[2].statusIn = HDSPM_midiStatusIn2;
2099                 hdspm->midi[2].dataOut = -1;
2100                 hdspm->midi[2].statusOut = -1;
2101                 hdspm->midi[2].ie = HDSPM_Midi2InterruptEnable;
2102                 hdspm->midi[2].irq = HDSPM_midi2IRQPendingAES;
2103         } else if (3 == id) {
2104                 /* TCO MTC on HDSPe MADI */
2105                 hdspm->midi[3].dataIn = HDSPM_midiDataIn3;
2106                 hdspm->midi[3].statusIn = HDSPM_midiStatusIn3;
2107                 hdspm->midi[3].dataOut = -1;
2108                 hdspm->midi[3].statusOut = -1;
2109                 hdspm->midi[3].ie = HDSPM_Midi3InterruptEnable;
2110                 hdspm->midi[3].irq = HDSPM_midi3IRQPending;
2111         }
2112
2113         if ((id < 2) || ((2 == id) && ((MADI == hdspm->io_type) ||
2114                                         (MADIface == hdspm->io_type)))) {
2115                 if ((id == 0) && (MADIface == hdspm->io_type)) {
2116                         snprintf(buf, sizeof(buf), "%s MIDIoverMADI",
2117                                  card->shortname);
2118                 } else if ((id == 2) && (MADI == hdspm->io_type)) {
2119                         snprintf(buf, sizeof(buf), "%s MIDIoverMADI",
2120                                  card->shortname);
2121                 } else {
2122                         snprintf(buf, sizeof(buf), "%s MIDI %d",
2123                                  card->shortname, id+1);
2124                 }
2125                 err = snd_rawmidi_new(card, buf, id, 1, 1,
2126                                 &hdspm->midi[id].rmidi);
2127                 if (err < 0)
2128                         return err;
2129
2130                 snprintf(hdspm->midi[id].rmidi->name,
2131                          sizeof(hdspm->midi[id].rmidi->name),
2132                          "%s MIDI %d", card->id, id+1);
2133                 hdspm->midi[id].rmidi->private_data = &hdspm->midi[id];
2134
2135                 snd_rawmidi_set_ops(hdspm->midi[id].rmidi,
2136                                 SNDRV_RAWMIDI_STREAM_OUTPUT,
2137                                 &snd_hdspm_midi_output);
2138                 snd_rawmidi_set_ops(hdspm->midi[id].rmidi,
2139                                 SNDRV_RAWMIDI_STREAM_INPUT,
2140                                 &snd_hdspm_midi_input);
2141
2142                 hdspm->midi[id].rmidi->info_flags |=
2143                         SNDRV_RAWMIDI_INFO_OUTPUT |
2144                         SNDRV_RAWMIDI_INFO_INPUT |
2145                         SNDRV_RAWMIDI_INFO_DUPLEX;
2146         } else {
2147                 /* TCO MTC, read only */
2148                 snprintf(buf, sizeof(buf), "%s MTC %d",
2149                          card->shortname, id+1);
2150                 err = snd_rawmidi_new(card, buf, id, 1, 1,
2151                                 &hdspm->midi[id].rmidi);
2152                 if (err < 0)
2153                         return err;
2154
2155                 snprintf(hdspm->midi[id].rmidi->name,
2156                          sizeof(hdspm->midi[id].rmidi->name),
2157                          "%s MTC %d", card->id, id+1);
2158                 hdspm->midi[id].rmidi->private_data = &hdspm->midi[id];
2159
2160                 snd_rawmidi_set_ops(hdspm->midi[id].rmidi,
2161                                 SNDRV_RAWMIDI_STREAM_INPUT,
2162                                 &snd_hdspm_midi_input);
2163
2164                 hdspm->midi[id].rmidi->info_flags |= SNDRV_RAWMIDI_INFO_INPUT;
2165         }
2166
2167         return 0;
2168 }
2169
2170
2171 static void hdspm_midi_work(struct work_struct *work)
2172 {
2173         struct hdspm *hdspm = container_of(work, struct hdspm, midi_work);
2174         int i = 0;
2175
2176         while (i < hdspm->midiPorts) {
2177                 if (hdspm->midi[i].pending)
2178                         snd_hdspm_midi_input_read(&hdspm->midi[i]);
2179
2180                 i++;
2181         }
2182 }
2183
2184
2185 /*-----------------------------------------------------------------------------
2186   Status Interface
2187   ----------------------------------------------------------------------------*/
2188
2189 /* get the system sample rate which is set */
2190
2191
2192 static inline int hdspm_get_pll_freq(struct hdspm *hdspm)
2193 {
2194         unsigned int period, rate;
2195
2196         period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ);
2197         rate = hdspm_calc_dds_value(hdspm, period);
2198
2199         return rate;
2200 }
2201
2202 /*
2203  * Calculate the real sample rate from the
2204  * current DDS value.
2205  */
2206 static int hdspm_get_system_sample_rate(struct hdspm *hdspm)
2207 {
2208         unsigned int rate;
2209
2210         rate = hdspm_get_pll_freq(hdspm);
2211
2212         if (rate > 207000) {
2213                 /* Unreasonable high sample rate as seen on PCI MADI cards. */
2214                 if (0 == hdspm_system_clock_mode(hdspm)) {
2215                         /* master mode, return internal sample rate */
2216                         rate = hdspm->system_sample_rate;
2217                 } else {
2218                         /* slave mode, return external sample rate */
2219                         rate = hdspm_external_sample_rate(hdspm);
2220                         if (!rate)
2221                                 rate = hdspm->system_sample_rate;
2222                 }
2223         }
2224
2225         return rate;
2226 }
2227
2228
2229 #define HDSPM_SYSTEM_SAMPLE_RATE(xname, xindex) \
2230 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2231         .name = xname, \
2232         .index = xindex, \
2233         .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
2234                 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2235         .info = snd_hdspm_info_system_sample_rate, \
2236         .put = snd_hdspm_put_system_sample_rate, \
2237         .get = snd_hdspm_get_system_sample_rate \
2238 }
2239
2240 static int snd_hdspm_info_system_sample_rate(struct snd_kcontrol *kcontrol,
2241                                              struct snd_ctl_elem_info *uinfo)
2242 {
2243         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2244         uinfo->count = 1;
2245         uinfo->value.integer.min = 27000;
2246         uinfo->value.integer.max = 207000;
2247         uinfo->value.integer.step = 1;
2248         return 0;
2249 }
2250
2251
2252 static int snd_hdspm_get_system_sample_rate(struct snd_kcontrol *kcontrol,
2253                                             struct snd_ctl_elem_value *
2254                                             ucontrol)
2255 {
2256         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2257
2258         ucontrol->value.integer.value[0] = hdspm_get_system_sample_rate(hdspm);
2259         return 0;
2260 }
2261
2262 static int snd_hdspm_put_system_sample_rate(struct snd_kcontrol *kcontrol,
2263                                             struct snd_ctl_elem_value *
2264                                             ucontrol)
2265 {
2266         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2267         int rate = ucontrol->value.integer.value[0];
2268
2269         if (rate < 27000 || rate > 207000)
2270                 return -EINVAL;
2271         hdspm_set_dds_value(hdspm, ucontrol->value.integer.value[0]);
2272         return 0;
2273 }
2274
2275
2276 /*
2277  * Returns the WordClock sample rate class for the given card.
2278  */
2279 static int hdspm_get_wc_sample_rate(struct hdspm *hdspm)
2280 {
2281         int status;
2282
2283         switch (hdspm->io_type) {
2284         case RayDAT:
2285         case AIO:
2286                 status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
2287                 return (status >> 16) & 0xF;
2288         case AES32:
2289                 status = hdspm_read(hdspm, HDSPM_statusRegister);
2290                 return (status >> HDSPM_AES32_wcFreq_bit) & 0xF;
2291         default:
2292                 break;
2293         }
2294
2295
2296         return 0;
2297 }
2298
2299
2300 /*
2301  * Returns the TCO sample rate class for the given card.
2302  */
2303 static int hdspm_get_tco_sample_rate(struct hdspm *hdspm)
2304 {
2305         int status;
2306
2307         if (hdspm->tco) {
2308                 switch (hdspm->io_type) {
2309                 case RayDAT:
2310                 case AIO:
2311                         status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
2312                         return (status >> 20) & 0xF;
2313                 case AES32:
2314                         status = hdspm_read(hdspm, HDSPM_statusRegister);
2315                         return (status >> 1) & 0xF;
2316                 default:
2317                         break;
2318                 }
2319         }
2320
2321         return 0;
2322 }
2323
2324
2325 /*
2326  * Returns the SYNC_IN sample rate class for the given card.
2327  */
2328 static int hdspm_get_sync_in_sample_rate(struct hdspm *hdspm)
2329 {
2330         int status;
2331
2332         if (hdspm->tco) {
2333                 switch (hdspm->io_type) {
2334                 case RayDAT:
2335                 case AIO:
2336                         status = hdspm_read(hdspm, HDSPM_RD_STATUS_2);
2337                         return (status >> 12) & 0xF;
2338                 default:
2339                         break;
2340                 }
2341         }
2342
2343         return 0;
2344 }
2345
2346 /*
2347  * Returns the AES sample rate class for the given card.
2348  */
2349 static int hdspm_get_aes_sample_rate(struct hdspm *hdspm, int index)
2350 {
2351         int timecode;
2352
2353         switch (hdspm->io_type) {
2354         case AES32:
2355                 timecode = hdspm_read(hdspm, HDSPM_timecodeRegister);
2356                 return (timecode >> (4*index)) & 0xF;
2357         default:
2358                 break;
2359         }
2360         return 0;
2361 }
2362
2363 /*
2364  * Returns the sample rate class for input source <idx> for
2365  * 'new style' cards like the AIO and RayDAT.
2366  */
2367 static int hdspm_get_s1_sample_rate(struct hdspm *hdspm, unsigned int idx)
2368 {
2369         int status = hdspm_read(hdspm, HDSPM_RD_STATUS_2);
2370
2371         return (status >> (idx*4)) & 0xF;
2372 }
2373
2374 #define ENUMERATED_CTL_INFO(info, texts) \
2375         snd_ctl_enum_info(info, 1, ARRAY_SIZE(texts), texts)
2376
2377
2378 /* Helper function to query the external sample rate and return the
2379  * corresponding enum to be returned to userspace.
2380  */
2381 static int hdspm_external_rate_to_enum(struct hdspm *hdspm)
2382 {
2383         int rate = hdspm_external_sample_rate(hdspm);
2384         int i, selected_rate = 0;
2385         for (i = 1; i < 10; i++)
2386                 if (HDSPM_bit2freq(i) == rate) {
2387                         selected_rate = i;
2388                         break;
2389                 }
2390         return selected_rate;
2391 }
2392
2393
2394 #define HDSPM_AUTOSYNC_SAMPLE_RATE(xname, xindex) \
2395 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2396         .name = xname, \
2397         .private_value = xindex, \
2398         .access = SNDRV_CTL_ELEM_ACCESS_READ, \
2399         .info = snd_hdspm_info_autosync_sample_rate, \
2400         .get = snd_hdspm_get_autosync_sample_rate \
2401 }
2402
2403
2404 static int snd_hdspm_info_autosync_sample_rate(struct snd_kcontrol *kcontrol,
2405                                                struct snd_ctl_elem_info *uinfo)
2406 {
2407         ENUMERATED_CTL_INFO(uinfo, texts_freq);
2408         return 0;
2409 }
2410
2411
2412 static int snd_hdspm_get_autosync_sample_rate(struct snd_kcontrol *kcontrol,
2413                                               struct snd_ctl_elem_value *
2414                                               ucontrol)
2415 {
2416         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2417
2418         switch (hdspm->io_type) {
2419         case RayDAT:
2420                 switch (kcontrol->private_value) {
2421                 case 0:
2422                         ucontrol->value.enumerated.item[0] =
2423                                 hdspm_get_wc_sample_rate(hdspm);
2424                         break;
2425                 case 7:
2426                         ucontrol->value.enumerated.item[0] =
2427                                 hdspm_get_tco_sample_rate(hdspm);
2428                         break;
2429                 case 8:
2430                         ucontrol->value.enumerated.item[0] =
2431                                 hdspm_get_sync_in_sample_rate(hdspm);
2432                         break;
2433                 default:
2434                         ucontrol->value.enumerated.item[0] =
2435                                 hdspm_get_s1_sample_rate(hdspm,
2436                                                 kcontrol->private_value-1);
2437                 }
2438                 break;
2439
2440         case AIO:
2441                 switch (kcontrol->private_value) {
2442                 case 0: /* WC */
2443                         ucontrol->value.enumerated.item[0] =
2444                                 hdspm_get_wc_sample_rate(hdspm);
2445                         break;
2446                 case 4: /* TCO */
2447                         ucontrol->value.enumerated.item[0] =
2448                                 hdspm_get_tco_sample_rate(hdspm);
2449                         break;
2450                 case 5: /* SYNC_IN */
2451                         ucontrol->value.enumerated.item[0] =
2452                                 hdspm_get_sync_in_sample_rate(hdspm);
2453                         break;
2454                 default:
2455                         ucontrol->value.enumerated.item[0] =
2456                                 hdspm_get_s1_sample_rate(hdspm,
2457                                                 kcontrol->private_value-1);
2458                 }
2459                 break;
2460
2461         case AES32:
2462
2463                 switch (kcontrol->private_value) {
2464                 case 0: /* WC */
2465                         ucontrol->value.enumerated.item[0] =
2466                                 hdspm_get_wc_sample_rate(hdspm);
2467                         break;
2468                 case 9: /* TCO */
2469                         ucontrol->value.enumerated.item[0] =
2470                                 hdspm_get_tco_sample_rate(hdspm);
2471                         break;
2472                 case 10: /* SYNC_IN */
2473                         ucontrol->value.enumerated.item[0] =
2474                                 hdspm_get_sync_in_sample_rate(hdspm);
2475                         break;
2476                 case 11: /* External Rate */
2477                         ucontrol->value.enumerated.item[0] =
2478                                 hdspm_external_rate_to_enum(hdspm);
2479                         break;
2480                 default: /* AES1 to AES8 */
2481                         ucontrol->value.enumerated.item[0] =
2482                                 hdspm_get_aes_sample_rate(hdspm,
2483                                                 kcontrol->private_value -
2484                                                 HDSPM_AES32_AUTOSYNC_FROM_AES1);
2485                         break;
2486                 }
2487                 break;
2488
2489         case MADI:
2490         case MADIface:
2491                 ucontrol->value.enumerated.item[0] =
2492                         hdspm_external_rate_to_enum(hdspm);
2493                 break;
2494         default:
2495                 break;
2496         }
2497
2498         return 0;
2499 }
2500
2501
2502 #define HDSPM_SYSTEM_CLOCK_MODE(xname, xindex) \
2503 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2504         .name = xname, \
2505         .index = xindex, \
2506         .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
2507                 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2508         .info = snd_hdspm_info_system_clock_mode, \
2509         .get = snd_hdspm_get_system_clock_mode, \
2510         .put = snd_hdspm_put_system_clock_mode, \
2511 }
2512
2513
2514 /*
2515  * Returns the system clock mode for the given card.
2516  * @returns 0 - master, 1 - slave
2517  */
2518 static int hdspm_system_clock_mode(struct hdspm *hdspm)
2519 {
2520         switch (hdspm->io_type) {
2521         case AIO:
2522         case RayDAT:
2523                 if (hdspm->settings_register & HDSPM_c0Master)
2524                         return 0;
2525                 break;
2526
2527         default:
2528                 if (hdspm->control_register & HDSPM_ClockModeMaster)
2529                         return 0;
2530         }
2531
2532         return 1;
2533 }
2534
2535
2536 /*
2537  * Sets the system clock mode.
2538  * @param mode 0 - master, 1 - slave
2539  */
2540 static void hdspm_set_system_clock_mode(struct hdspm *hdspm, int mode)
2541 {
2542         hdspm_set_toggle_setting(hdspm,
2543                         (hdspm_is_raydat_or_aio(hdspm)) ?
2544                         HDSPM_c0Master : HDSPM_ClockModeMaster,
2545                         (0 == mode));
2546 }
2547
2548
2549 static int snd_hdspm_info_system_clock_mode(struct snd_kcontrol *kcontrol,
2550                                             struct snd_ctl_elem_info *uinfo)
2551 {
2552         static const char *const texts[] = { "Master", "AutoSync" };
2553         ENUMERATED_CTL_INFO(uinfo, texts);
2554         return 0;
2555 }
2556
2557 static int snd_hdspm_get_system_clock_mode(struct snd_kcontrol *kcontrol,
2558                                            struct snd_ctl_elem_value *ucontrol)
2559 {
2560         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2561
2562         ucontrol->value.enumerated.item[0] = hdspm_system_clock_mode(hdspm);
2563         return 0;
2564 }
2565
2566 static int snd_hdspm_put_system_clock_mode(struct snd_kcontrol *kcontrol,
2567                                            struct snd_ctl_elem_value *ucontrol)
2568 {
2569         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2570         int val;
2571
2572         if (!snd_hdspm_use_is_exclusive(hdspm))
2573                 return -EBUSY;
2574
2575         val = ucontrol->value.enumerated.item[0];
2576         if (val < 0)
2577                 val = 0;
2578         else if (val > 1)
2579                 val = 1;
2580
2581         hdspm_set_system_clock_mode(hdspm, val);
2582
2583         return 0;
2584 }
2585
2586
2587 #define HDSPM_INTERNAL_CLOCK(xname, xindex) \
2588 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2589         .name = xname, \
2590         .index = xindex, \
2591         .info = snd_hdspm_info_clock_source, \
2592         .get = snd_hdspm_get_clock_source, \
2593         .put = snd_hdspm_put_clock_source \
2594 }
2595
2596
2597 static int hdspm_clock_source(struct hdspm * hdspm)
2598 {
2599         switch (hdspm->system_sample_rate) {
2600         case 32000: return 0;
2601         case 44100: return 1;
2602         case 48000: return 2;
2603         case 64000: return 3;
2604         case 88200: return 4;
2605         case 96000: return 5;
2606         case 128000: return 6;
2607         case 176400: return 7;
2608         case 192000: return 8;
2609         }
2610
2611         return -1;
2612 }
2613
2614 static int hdspm_set_clock_source(struct hdspm * hdspm, int mode)
2615 {
2616         int rate;
2617         switch (mode) {
2618         case 0:
2619                 rate = 32000; break;
2620         case 1:
2621                 rate = 44100; break;
2622         case 2:
2623                 rate = 48000; break;
2624         case 3:
2625                 rate = 64000; break;
2626         case 4:
2627                 rate = 88200; break;
2628         case 5:
2629                 rate = 96000; break;
2630         case 6:
2631                 rate = 128000; break;
2632         case 7:
2633                 rate = 176400; break;
2634         case 8:
2635                 rate = 192000; break;
2636         default:
2637                 rate = 48000;
2638         }
2639         hdspm_set_rate(hdspm, rate, 1);
2640         return 0;
2641 }
2642
2643 static int snd_hdspm_info_clock_source(struct snd_kcontrol *kcontrol,
2644                                        struct snd_ctl_elem_info *uinfo)
2645 {
2646         return snd_ctl_enum_info(uinfo, 1, 9, texts_freq + 1);
2647 }
2648
2649 static int snd_hdspm_get_clock_source(struct snd_kcontrol *kcontrol,
2650                                       struct snd_ctl_elem_value *ucontrol)
2651 {
2652         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2653
2654         ucontrol->value.enumerated.item[0] = hdspm_clock_source(hdspm);
2655         return 0;
2656 }
2657
2658 static int snd_hdspm_put_clock_source(struct snd_kcontrol *kcontrol,
2659                                       struct snd_ctl_elem_value *ucontrol)
2660 {
2661         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2662         int change;
2663         int val;
2664
2665         if (!snd_hdspm_use_is_exclusive(hdspm))
2666                 return -EBUSY;
2667         val = ucontrol->value.enumerated.item[0];
2668         if (val < 0)
2669                 val = 0;
2670         if (val > 9)
2671                 val = 9;
2672         spin_lock_irq(&hdspm->lock);
2673         if (val != hdspm_clock_source(hdspm))
2674                 change = (hdspm_set_clock_source(hdspm, val) == 0) ? 1 : 0;
2675         else
2676                 change = 0;
2677         spin_unlock_irq(&hdspm->lock);
2678         return change;
2679 }
2680
2681
2682 #define HDSPM_PREF_SYNC_REF(xname, xindex) \
2683 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2684         .name = xname, \
2685         .index = xindex, \
2686         .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
2687                         SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2688         .info = snd_hdspm_info_pref_sync_ref, \
2689         .get = snd_hdspm_get_pref_sync_ref, \
2690         .put = snd_hdspm_put_pref_sync_ref \
2691 }
2692
2693
2694 /*
2695  * Returns the current preferred sync reference setting.
2696  * The semantics of the return value are depending on the
2697  * card, please see the comments for clarification.
2698  */
2699 static int hdspm_pref_sync_ref(struct hdspm * hdspm)
2700 {
2701         switch (hdspm->io_type) {
2702         case AES32:
2703                 switch (hdspm->control_register & HDSPM_SyncRefMask) {
2704                 case 0: return 0;  /* WC */
2705                 case HDSPM_SyncRef0: return 1; /* AES 1 */
2706                 case HDSPM_SyncRef1: return 2; /* AES 2 */
2707                 case HDSPM_SyncRef1+HDSPM_SyncRef0: return 3; /* AES 3 */
2708                 case HDSPM_SyncRef2: return 4; /* AES 4 */
2709                 case HDSPM_SyncRef2+HDSPM_SyncRef0: return 5; /* AES 5 */
2710                 case HDSPM_SyncRef2+HDSPM_SyncRef1: return 6; /* AES 6 */
2711                 case HDSPM_SyncRef2+HDSPM_SyncRef1+HDSPM_SyncRef0:
2712                                                     return 7; /* AES 7 */
2713                 case HDSPM_SyncRef3: return 8; /* AES 8 */
2714                 case HDSPM_SyncRef3+HDSPM_SyncRef0: return 9; /* TCO */
2715                 }
2716                 break;
2717
2718         case MADI:
2719         case MADIface:
2720                 if (hdspm->tco) {
2721                         switch (hdspm->control_register & HDSPM_SyncRefMask) {
2722                         case 0: return 0;  /* WC */
2723                         case HDSPM_SyncRef0: return 1;  /* MADI */
2724                         case HDSPM_SyncRef1: return 2;  /* TCO */
2725                         case HDSPM_SyncRef1+HDSPM_SyncRef0:
2726                                              return 3;  /* SYNC_IN */
2727                         }
2728                 } else {
2729                         switch (hdspm->control_register & HDSPM_SyncRefMask) {
2730                         case 0: return 0;  /* WC */
2731                         case HDSPM_SyncRef0: return 1;  /* MADI */
2732                         case HDSPM_SyncRef1+HDSPM_SyncRef0:
2733                                              return 2;  /* SYNC_IN */
2734                         }
2735                 }
2736                 break;
2737
2738         case RayDAT:
2739                 if (hdspm->tco) {
2740                         switch ((hdspm->settings_register &
2741                                 HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2742                         case 0: return 0;  /* WC */
2743                         case 3: return 1;  /* ADAT 1 */
2744                         case 4: return 2;  /* ADAT 2 */
2745                         case 5: return 3;  /* ADAT 3 */
2746                         case 6: return 4;  /* ADAT 4 */
2747                         case 1: return 5;  /* AES */
2748                         case 2: return 6;  /* SPDIF */
2749                         case 9: return 7;  /* TCO */
2750                         case 10: return 8; /* SYNC_IN */
2751                         }
2752                 } else {
2753                         switch ((hdspm->settings_register &
2754                                 HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2755                         case 0: return 0;  /* WC */
2756                         case 3: return 1;  /* ADAT 1 */
2757                         case 4: return 2;  /* ADAT 2 */
2758                         case 5: return 3;  /* ADAT 3 */
2759                         case 6: return 4;  /* ADAT 4 */
2760                         case 1: return 5;  /* AES */
2761                         case 2: return 6;  /* SPDIF */
2762                         case 10: return 7; /* SYNC_IN */
2763                         }
2764                 }
2765
2766                 break;
2767
2768         case AIO:
2769                 if (hdspm->tco) {
2770                         switch ((hdspm->settings_register &
2771                                 HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2772                         case 0: return 0;  /* WC */
2773                         case 3: return 1;  /* ADAT */
2774                         case 1: return 2;  /* AES */
2775                         case 2: return 3;  /* SPDIF */
2776                         case 9: return 4;  /* TCO */
2777                         case 10: return 5; /* SYNC_IN */
2778                         }
2779                 } else {
2780                         switch ((hdspm->settings_register &
2781                                 HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2782                         case 0: return 0;  /* WC */
2783                         case 3: return 1;  /* ADAT */
2784                         case 1: return 2;  /* AES */
2785                         case 2: return 3;  /* SPDIF */
2786                         case 10: return 4; /* SYNC_IN */
2787                         }
2788                 }
2789
2790                 break;
2791         }
2792
2793         return -1;
2794 }
2795
2796
2797 /*
2798  * Set the preferred sync reference to <pref>. The semantics
2799  * of <pref> are depending on the card type, see the comments
2800  * for clarification.
2801  */
2802 static int hdspm_set_pref_sync_ref(struct hdspm * hdspm, int pref)
2803 {
2804         int p = 0;
2805
2806         switch (hdspm->io_type) {
2807         case AES32:
2808                 hdspm->control_register &= ~HDSPM_SyncRefMask;
2809                 switch (pref) {
2810                 case 0: /* WC  */
2811                         break;
2812                 case 1: /* AES 1 */
2813                         hdspm->control_register |= HDSPM_SyncRef0;
2814                         break;
2815                 case 2: /* AES 2 */
2816                         hdspm->control_register |= HDSPM_SyncRef1;
2817                         break;
2818                 case 3: /* AES 3 */
2819                         hdspm->control_register |=
2820                                 HDSPM_SyncRef1+HDSPM_SyncRef0;
2821                         break;
2822                 case 4: /* AES 4 */
2823                         hdspm->control_register |= HDSPM_SyncRef2;
2824                         break;
2825                 case 5: /* AES 5 */
2826                         hdspm->control_register |=
2827                                 HDSPM_SyncRef2+HDSPM_SyncRef0;
2828                         break;
2829                 case 6: /* AES 6 */
2830                         hdspm->control_register |=
2831                                 HDSPM_SyncRef2+HDSPM_SyncRef1;
2832                         break;
2833                 case 7: /* AES 7 */
2834                         hdspm->control_register |=
2835                                 HDSPM_SyncRef2+HDSPM_SyncRef1+HDSPM_SyncRef0;
2836                         break;
2837                 case 8: /* AES 8 */
2838                         hdspm->control_register |= HDSPM_SyncRef3;
2839                         break;
2840                 case 9: /* TCO */
2841                         hdspm->control_register |=
2842                                 HDSPM_SyncRef3+HDSPM_SyncRef0;
2843                         break;
2844                 default:
2845                         return -1;
2846                 }
2847
2848                 break;
2849
2850         case MADI:
2851         case MADIface:
2852                 hdspm->control_register &= ~HDSPM_SyncRefMask;
2853                 if (hdspm->tco) {
2854                         switch (pref) {
2855                         case 0: /* WC */
2856                                 break;
2857                         case 1: /* MADI */
2858                                 hdspm->control_register |= HDSPM_SyncRef0;
2859                                 break;
2860                         case 2: /* TCO */
2861                                 hdspm->control_register |= HDSPM_SyncRef1;
2862                                 break;
2863                         case 3: /* SYNC_IN */
2864                                 hdspm->control_register |=
2865                                         HDSPM_SyncRef0+HDSPM_SyncRef1;
2866                                 break;
2867                         default:
2868                                 return -1;
2869                         }
2870                 } else {
2871                         switch (pref) {
2872                         case 0: /* WC */
2873                                 break;
2874                         case 1: /* MADI */
2875                                 hdspm->control_register |= HDSPM_SyncRef0;
2876                                 break;
2877                         case 2: /* SYNC_IN */
2878                                 hdspm->control_register |=
2879                                         HDSPM_SyncRef0+HDSPM_SyncRef1;
2880                                 break;
2881                         default:
2882                                 return -1;
2883                         }
2884                 }
2885
2886                 break;
2887
2888         case RayDAT:
2889                 if (hdspm->tco) {
2890                         switch (pref) {
2891                         case 0: p = 0; break;  /* WC */
2892                         case 1: p = 3; break;  /* ADAT 1 */
2893                         case 2: p = 4; break;  /* ADAT 2 */
2894                         case 3: p = 5; break;  /* ADAT 3 */
2895                         case 4: p = 6; break;  /* ADAT 4 */
2896                         case 5: p = 1; break;  /* AES */
2897                         case 6: p = 2; break;  /* SPDIF */
2898                         case 7: p = 9; break;  /* TCO */
2899                         case 8: p = 10; break; /* SYNC_IN */
2900                         default: return -1;
2901                         }
2902                 } else {
2903                         switch (pref) {
2904                         case 0: p = 0; break;  /* WC */
2905                         case 1: p = 3; break;  /* ADAT 1 */
2906                         case 2: p = 4; break;  /* ADAT 2 */
2907                         case 3: p = 5; break;  /* ADAT 3 */
2908                         case 4: p = 6; break;  /* ADAT 4 */
2909                         case 5: p = 1; break;  /* AES */
2910                         case 6: p = 2; break;  /* SPDIF */
2911                         case 7: p = 10; break; /* SYNC_IN */
2912                         default: return -1;
2913                         }
2914                 }
2915                 break;
2916
2917         case AIO:
2918                 if (hdspm->tco) {
2919                         switch (pref) {
2920                         case 0: p = 0; break;  /* WC */
2921                         case 1: p = 3; break;  /* ADAT */
2922                         case 2: p = 1; break;  /* AES */
2923                         case 3: p = 2; break;  /* SPDIF */
2924                         case 4: p = 9; break;  /* TCO */
2925                         case 5: p = 10; break; /* SYNC_IN */
2926                         default: return -1;
2927                         }
2928                 } else {
2929                         switch (pref) {
2930                         case 0: p = 0; break;  /* WC */
2931                         case 1: p = 3; break;  /* ADAT */
2932                         case 2: p = 1; break;  /* AES */
2933                         case 3: p = 2; break;  /* SPDIF */
2934                         case 4: p = 10; break; /* SYNC_IN */
2935                         default: return -1;
2936                         }
2937                 }
2938                 break;
2939         }
2940
2941         switch (hdspm->io_type) {
2942         case RayDAT:
2943         case AIO:
2944                 hdspm->settings_register &= ~HDSPM_c0_SyncRefMask;
2945                 hdspm->settings_register |= HDSPM_c0_SyncRef0 * p;
2946                 hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register);
2947                 break;
2948
2949         case MADI:
2950         case MADIface:
2951         case AES32:
2952                 hdspm_write(hdspm, HDSPM_controlRegister,
2953                                 hdspm->control_register);
2954         }
2955
2956         return 0;
2957 }
2958
2959
2960 static int snd_hdspm_info_pref_sync_ref(struct snd_kcontrol *kcontrol,
2961                                         struct snd_ctl_elem_info *uinfo)
2962 {
2963         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2964
2965         snd_ctl_enum_info(uinfo, 1, hdspm->texts_autosync_items, hdspm->texts_autosync);
2966
2967         return 0;
2968 }
2969
2970 static int snd_hdspm_get_pref_sync_ref(struct snd_kcontrol *kcontrol,
2971                                        struct snd_ctl_elem_value *ucontrol)
2972 {
2973         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2974         int psf = hdspm_pref_sync_ref(hdspm);
2975
2976         if (psf >= 0) {
2977                 ucontrol->value.enumerated.item[0] = psf;
2978                 return 0;
2979         }
2980
2981         return -1;
2982 }
2983
2984 static int snd_hdspm_put_pref_sync_ref(struct snd_kcontrol *kcontrol,
2985                                        struct snd_ctl_elem_value *ucontrol)
2986 {
2987         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2988         int val, change = 0;
2989
2990         if (!snd_hdspm_use_is_exclusive(hdspm))
2991                 return -EBUSY;
2992
2993         val = ucontrol->value.enumerated.item[0];
2994
2995         if (val < 0)
2996                 val = 0;
2997         else if (val >= hdspm->texts_autosync_items)
2998                 val = hdspm->texts_autosync_items-1;
2999
3000         spin_lock_irq(&hdspm->lock);
3001         if (val != hdspm_pref_sync_ref(hdspm))
3002                 change = (0 == hdspm_set_pref_sync_ref(hdspm, val)) ? 1 : 0;
3003
3004         spin_unlock_irq(&hdspm->lock);
3005         return change;
3006 }
3007
3008
3009 #define HDSPM_AUTOSYNC_REF(xname, xindex) \
3010 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3011         .name = xname, \
3012         .index = xindex, \
3013         .access = SNDRV_CTL_ELEM_ACCESS_READ, \
3014         .info = snd_hdspm_info_autosync_ref, \
3015         .get = snd_hdspm_get_autosync_ref, \
3016 }
3017
3018 static int hdspm_autosync_ref(struct hdspm *hdspm)
3019 {
3020         /* This looks at the autosync selected sync reference */
3021         if (AES32 == hdspm->io_type) {
3022
3023                 unsigned int status = hdspm_read(hdspm, HDSPM_statusRegister);
3024                 unsigned int syncref = (status >> HDSPM_AES32_syncref_bit) & 0xF;
3025                 /* syncref >= HDSPM_AES32_AUTOSYNC_FROM_WORD is always true */
3026                 if (syncref <= HDSPM_AES32_AUTOSYNC_FROM_SYNC_IN) {
3027                         return syncref;
3028                 }
3029                 return HDSPM_AES32_AUTOSYNC_FROM_NONE;
3030
3031         } else if (MADI == hdspm->io_type) {
3032
3033                 unsigned int status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
3034                 switch (status2 & HDSPM_SelSyncRefMask) {
3035                 case HDSPM_SelSyncRef_WORD:
3036                         return HDSPM_AUTOSYNC_FROM_WORD;
3037                 case HDSPM_SelSyncRef_MADI:
3038                         return HDSPM_AUTOSYNC_FROM_MADI;
3039                 case HDSPM_SelSyncRef_TCO:
3040                         return HDSPM_AUTOSYNC_FROM_TCO;
3041                 case HDSPM_SelSyncRef_SyncIn:
3042                         return HDSPM_AUTOSYNC_FROM_SYNC_IN;
3043                 case HDSPM_SelSyncRef_NVALID:
3044                         return HDSPM_AUTOSYNC_FROM_NONE;
3045                 default:
3046                         return HDSPM_AUTOSYNC_FROM_NONE;
3047                 }
3048
3049         }
3050         return 0;
3051 }
3052
3053
3054 static int snd_hdspm_info_autosync_ref(struct snd_kcontrol *kcontrol,
3055                                        struct snd_ctl_elem_info *uinfo)
3056 {
3057         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3058
3059         if (AES32 == hdspm->io_type) {
3060                 static const char *const texts[] = { "WordClock", "AES1", "AES2", "AES3",
3061                         "AES4", "AES5", "AES6", "AES7", "AES8", "TCO", "Sync In", "None"};
3062
3063                 ENUMERATED_CTL_INFO(uinfo, texts);
3064         } else if (MADI == hdspm->io_type) {
3065                 static const char *const texts[] = {"Word Clock", "MADI", "TCO",
3066                         "Sync In", "None" };
3067
3068                 ENUMERATED_CTL_INFO(uinfo, texts);
3069         }
3070         return 0;
3071 }
3072
3073 static int snd_hdspm_get_autosync_ref(struct snd_kcontrol *kcontrol,
3074                                       struct snd_ctl_elem_value *ucontrol)
3075 {
3076         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3077
3078         ucontrol->value.enumerated.item[0] = hdspm_autosync_ref(hdspm);
3079         return 0;
3080 }
3081
3082
3083
3084 #define HDSPM_TCO_VIDEO_INPUT_FORMAT(xname, xindex) \
3085 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3086         .name = xname, \
3087         .access = SNDRV_CTL_ELEM_ACCESS_READ |\
3088                 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3089         .info = snd_hdspm_info_tco_video_input_format, \
3090         .get = snd_hdspm_get_tco_video_input_format, \
3091 }
3092
3093 static int snd_hdspm_info_tco_video_input_format(struct snd_kcontrol *kcontrol,
3094                                        struct snd_ctl_elem_info *uinfo)
3095 {
3096         static const char *const texts[] = {"No video", "NTSC", "PAL"};
3097         ENUMERATED_CTL_INFO(uinfo, texts);
3098         return 0;
3099 }
3100
3101 static int snd_hdspm_get_tco_video_input_format(struct snd_kcontrol *kcontrol,
3102                                       struct snd_ctl_elem_value *ucontrol)
3103 {
3104         u32 status;
3105         int ret = 0;
3106
3107         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3108         status = hdspm_read(hdspm, HDSPM_RD_TCO + 4);
3109         switch (status & (HDSPM_TCO1_Video_Input_Format_NTSC |
3110                         HDSPM_TCO1_Video_Input_Format_PAL)) {
3111         case HDSPM_TCO1_Video_Input_Format_NTSC:
3112                 /* ntsc */
3113                 ret = 1;
3114                 break;
3115         case HDSPM_TCO1_Video_Input_Format_PAL:
3116                 /* pal */
3117                 ret = 2;
3118                 break;
3119         default:
3120                 /* no video */
3121                 ret = 0;
3122                 break;
3123         }
3124         ucontrol->value.enumerated.item[0] = ret;
3125         return 0;
3126 }
3127
3128
3129
3130 #define HDSPM_TCO_LTC_FRAMES(xname, xindex) \
3131 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3132         .name = xname, \
3133         .access = SNDRV_CTL_ELEM_ACCESS_READ |\
3134                 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3135         .info = snd_hdspm_info_tco_ltc_frames, \
3136         .get = snd_hdspm_get_tco_ltc_frames, \
3137 }
3138
3139 static int snd_hdspm_info_tco_ltc_frames(struct snd_kcontrol *kcontrol,
3140                                        struct snd_ctl_elem_info *uinfo)
3141 {
3142         static const char *const texts[] = {"No lock", "24 fps", "25 fps", "29.97 fps",
3143                                 "30 fps"};
3144         ENUMERATED_CTL_INFO(uinfo, texts);
3145         return 0;
3146 }
3147
3148 static int hdspm_tco_ltc_frames(struct hdspm *hdspm)
3149 {
3150         u32 status;
3151         int ret = 0;
3152
3153         status = hdspm_read(hdspm, HDSPM_RD_TCO + 4);
3154         if (status & HDSPM_TCO1_LTC_Input_valid) {
3155                 switch (status & (HDSPM_TCO1_LTC_Format_LSB |
3156                                         HDSPM_TCO1_LTC_Format_MSB)) {
3157                 case 0:
3158                         /* 24 fps */
3159                         ret = fps_24;
3160                         break;
3161                 case HDSPM_TCO1_LTC_Format_LSB:
3162                         /* 25 fps */
3163                         ret = fps_25;
3164                         break;
3165                 case HDSPM_TCO1_LTC_Format_MSB:
3166                         /* 29.97 fps */
3167                         ret = fps_2997;
3168                         break;
3169                 default:
3170                         /* 30 fps */
3171                         ret = fps_30;
3172                         break;
3173                 }
3174         }
3175
3176         return ret;
3177 }
3178
3179 static int snd_hdspm_get_tco_ltc_frames(struct snd_kcontrol *kcontrol,
3180                                       struct snd_ctl_elem_value *ucontrol)
3181 {
3182         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3183
3184         ucontrol->value.enumerated.item[0] = hdspm_tco_ltc_frames(hdspm);
3185         return 0;
3186 }
3187
3188 #define HDSPM_TOGGLE_SETTING(xname, xindex) \
3189 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3190         .name = xname, \
3191         .private_value = xindex, \
3192         .info = snd_hdspm_info_toggle_setting, \
3193         .get = snd_hdspm_get_toggle_setting, \
3194         .put = snd_hdspm_put_toggle_setting \
3195 }
3196
3197 static int hdspm_toggle_setting(struct hdspm *hdspm, u32 regmask)
3198 {
3199         u32 reg;
3200
3201         if (hdspm_is_raydat_or_aio(hdspm))
3202                 reg = hdspm->settings_register;
3203         else
3204                 reg = hdspm->control_register;
3205
3206         return (reg & regmask) ? 1 : 0;
3207 }
3208
3209 static int hdspm_set_toggle_setting(struct hdspm *hdspm, u32 regmask, int out)
3210 {
3211         u32 *reg;
3212         u32 target_reg;
3213
3214         if (hdspm_is_raydat_or_aio(hdspm)) {
3215                 reg = &(hdspm->settings_register);
3216                 target_reg = HDSPM_WR_SETTINGS;
3217         } else {
3218                 reg = &(hdspm->control_register);
3219                 target_reg = HDSPM_controlRegister;
3220         }
3221
3222         if (out)
3223                 *reg |= regmask;
3224         else
3225                 *reg &= ~regmask;
3226
3227         hdspm_write(hdspm, target_reg, *reg);
3228
3229         return 0;
3230 }
3231
3232 #define snd_hdspm_info_toggle_setting           snd_ctl_boolean_mono_info
3233
3234 static int snd_hdspm_get_toggle_setting(struct snd_kcontrol *kcontrol,
3235                                struct snd_ctl_elem_value *ucontrol)
3236 {
3237         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3238         u32 regmask = kcontrol->private_value;
3239
3240         spin_lock_irq(&hdspm->lock);
3241         ucontrol->value.integer.value[0] = hdspm_toggle_setting(hdspm, regmask);
3242         spin_unlock_irq(&hdspm->lock);
3243         return 0;
3244 }
3245
3246 static int snd_hdspm_put_toggle_setting(struct snd_kcontrol *kcontrol,
3247                                struct snd_ctl_elem_value *ucontrol)
3248 {
3249         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3250         u32 regmask = kcontrol->private_value;
3251         int change;
3252         unsigned int val;
3253
3254         if (!snd_hdspm_use_is_exclusive(hdspm))
3255                 return -EBUSY;
3256         val = ucontrol->value.integer.value[0] & 1;
3257         spin_lock_irq(&hdspm->lock);
3258         change = (int) val != hdspm_toggle_setting(hdspm, regmask);
3259         hdspm_set_toggle_setting(hdspm, regmask, val);
3260         spin_unlock_irq(&hdspm->lock);
3261         return change;
3262 }
3263
3264 #define HDSPM_INPUT_SELECT(xname, xindex) \
3265 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3266         .name = xname, \
3267         .index = xindex, \
3268         .info = snd_hdspm_info_input_select, \
3269         .get = snd_hdspm_get_input_select, \
3270         .put = snd_hdspm_put_input_select \
3271 }
3272
3273 static int hdspm_input_select(struct hdspm * hdspm)
3274 {
3275         return (hdspm->control_register & HDSPM_InputSelect0) ? 1 : 0;
3276 }
3277
3278 static int hdspm_set_input_select(struct hdspm * hdspm, int out)
3279 {
3280         if (out)
3281                 hdspm->control_register |= HDSPM_InputSelect0;
3282         else
3283                 hdspm->control_register &= ~HDSPM_InputSelect0;
3284         hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3285
3286         return 0;
3287 }
3288
3289 static int snd_hdspm_info_input_select(struct snd_kcontrol *kcontrol,
3290                                        struct snd_ctl_elem_info *uinfo)
3291 {
3292         static const char *const texts[] = { "optical", "coaxial" };
3293         ENUMERATED_CTL_INFO(uinfo, texts);
3294         return 0;
3295 }
3296
3297 static int snd_hdspm_get_input_select(struct snd_kcontrol *kcontrol,
3298                                       struct snd_ctl_elem_value *ucontrol)
3299 {
3300         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3301
3302         spin_lock_irq(&hdspm->lock);
3303         ucontrol->value.enumerated.item[0] = hdspm_input_select(hdspm);
3304         spin_unlock_irq(&hdspm->lock);
3305         return 0;
3306 }
3307
3308 static int snd_hdspm_put_input_select(struct snd_kcontrol *kcontrol,
3309                                       struct snd_ctl_elem_value *ucontrol)
3310 {
3311         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3312         int change;
3313         unsigned int val;
3314
3315         if (!snd_hdspm_use_is_exclusive(hdspm))
3316                 return -EBUSY;
3317         val = ucontrol->value.integer.value[0] & 1;
3318         spin_lock_irq(&hdspm->lock);
3319         change = (int) val != hdspm_input_select(hdspm);
3320         hdspm_set_input_select(hdspm, val);
3321         spin_unlock_irq(&hdspm->lock);
3322         return change;
3323 }
3324
3325
3326 #define HDSPM_DS_WIRE(xname, xindex) \
3327 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3328         .name = xname, \
3329         .index = xindex, \
3330         .info = snd_hdspm_info_ds_wire, \
3331         .get = snd_hdspm_get_ds_wire, \
3332         .put = snd_hdspm_put_ds_wire \
3333 }
3334
3335 static int hdspm_ds_wire(struct hdspm * hdspm)
3336 {
3337         return (hdspm->control_register & HDSPM_DS_DoubleWire) ? 1 : 0;
3338 }
3339
3340 static int hdspm_set_ds_wire(struct hdspm * hdspm, int ds)
3341 {
3342         if (ds)
3343                 hdspm->control_register |= HDSPM_DS_DoubleWire;
3344         else
3345                 hdspm->control_register &= ~HDSPM_DS_DoubleWire;
3346         hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3347
3348         return 0;
3349 }
3350
3351 static int snd_hdspm_info_ds_wire(struct snd_kcontrol *kcontrol,
3352                                   struct snd_ctl_elem_info *uinfo)
3353 {
3354         static const char *const texts[] = { "Single", "Double" };
3355         ENUMERATED_CTL_INFO(uinfo, texts);
3356         return 0;
3357 }
3358
3359 static int snd_hdspm_get_ds_wire(struct snd_kcontrol *kcontrol,
3360                                  struct snd_ctl_elem_value *ucontrol)
3361 {
3362         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3363
3364         spin_lock_irq(&hdspm->lock);
3365         ucontrol->value.enumerated.item[0] = hdspm_ds_wire(hdspm);
3366         spin_unlock_irq(&hdspm->lock);
3367         return 0;
3368 }
3369
3370 static int snd_hdspm_put_ds_wire(struct snd_kcontrol *kcontrol,
3371                                  struct snd_ctl_elem_value *ucontrol)
3372 {
3373         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3374         int change;
3375         unsigned int val;
3376
3377         if (!snd_hdspm_use_is_exclusive(hdspm))
3378                 return -EBUSY;
3379         val = ucontrol->value.integer.value[0] & 1;
3380         spin_lock_irq(&hdspm->lock);
3381         change = (int) val != hdspm_ds_wire(hdspm);
3382         hdspm_set_ds_wire(hdspm, val);
3383         spin_unlock_irq(&hdspm->lock);
3384         return change;
3385 }
3386
3387
3388 #define HDSPM_QS_WIRE(xname, xindex) \
3389 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3390         .name = xname, \
3391         .index = xindex, \
3392         .info = snd_hdspm_info_qs_wire, \
3393         .get = snd_hdspm_get_qs_wire, \
3394         .put = snd_hdspm_put_qs_wire \
3395 }
3396
3397 static int hdspm_qs_wire(struct hdspm * hdspm)
3398 {
3399         if (hdspm->control_register & HDSPM_QS_DoubleWire)
3400                 return 1;
3401         if (hdspm->control_register & HDSPM_QS_QuadWire)
3402                 return 2;
3403         return 0;
3404 }
3405
3406 static int hdspm_set_qs_wire(struct hdspm * hdspm, int mode)
3407 {
3408         hdspm->control_register &= ~(HDSPM_QS_DoubleWire | HDSPM_QS_QuadWire);
3409         switch (mode) {
3410         case 0:
3411                 break;
3412         case 1:
3413                 hdspm->control_register |= HDSPM_QS_DoubleWire;
3414                 break;
3415         case 2:
3416                 hdspm->control_register |= HDSPM_QS_QuadWire;
3417                 break;
3418         }
3419         hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3420
3421         return 0;
3422 }
3423
3424 static int snd_hdspm_info_qs_wire(struct snd_kcontrol *kcontrol,
3425                                        struct snd_ctl_elem_info *uinfo)
3426 {
3427         static const char *const texts[] = { "Single", "Double", "Quad" };
3428         ENUMERATED_CTL_INFO(uinfo, texts);
3429         return 0;
3430 }
3431
3432 static int snd_hdspm_get_qs_wire(struct snd_kcontrol *kcontrol,
3433                                       struct snd_ctl_elem_value *ucontrol)
3434 {
3435         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3436
3437         spin_lock_irq(&hdspm->lock);
3438         ucontrol->value.enumerated.item[0] = hdspm_qs_wire(hdspm);
3439         spin_unlock_irq(&hdspm->lock);
3440         return 0;
3441 }
3442
3443 static int snd_hdspm_put_qs_wire(struct snd_kcontrol *kcontrol,
3444                                       struct snd_ctl_elem_value *ucontrol)
3445 {
3446         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3447         int change;
3448         int val;
3449
3450         if (!snd_hdspm_use_is_exclusive(hdspm))
3451                 return -EBUSY;
3452         val = ucontrol->value.integer.value[0];
3453         if (val < 0)
3454                 val = 0;
3455         if (val > 2)
3456                 val = 2;
3457         spin_lock_irq(&hdspm->lock);
3458         change = val != hdspm_qs_wire(hdspm);
3459         hdspm_set_qs_wire(hdspm, val);
3460         spin_unlock_irq(&hdspm->lock);
3461         return change;
3462 }
3463
3464 #define HDSPM_CONTROL_TRISTATE(xname, xindex) \
3465 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3466         .name = xname, \
3467         .private_value = xindex, \
3468         .info = snd_hdspm_info_tristate, \
3469         .get = snd_hdspm_get_tristate, \
3470         .put = snd_hdspm_put_tristate \
3471 }
3472
3473 static int hdspm_tristate(struct hdspm *hdspm, u32 regmask)
3474 {
3475         u32 reg = hdspm->settings_register & (regmask * 3);
3476         return reg / regmask;
3477 }
3478
3479 static int hdspm_set_tristate(struct hdspm *hdspm, int mode, u32 regmask)
3480 {
3481         hdspm->settings_register &= ~(regmask * 3);
3482         hdspm->settings_register |= (regmask * mode);
3483         hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register);
3484
3485         return 0;
3486 }
3487
3488 static int snd_hdspm_info_tristate(struct snd_kcontrol *kcontrol,
3489                                        struct snd_ctl_elem_info *uinfo)
3490 {
3491         u32 regmask = kcontrol->private_value;
3492
3493         static const char *const texts_spdif[] = { "Optical", "Coaxial", "Internal" };
3494         static const char *const texts_levels[] = { "Hi Gain", "+4 dBu", "-10 dBV" };
3495
3496         switch (regmask) {
3497         case HDSPM_c0_Input0:
3498                 ENUMERATED_CTL_INFO(uinfo, texts_spdif);
3499                 break;
3500         default:
3501                 ENUMERATED_CTL_INFO(uinfo, texts_levels);
3502                 break;
3503         }
3504         return 0;
3505 }
3506
3507 static int snd_hdspm_get_tristate(struct snd_kcontrol *kcontrol,
3508                                       struct snd_ctl_elem_value *ucontrol)
3509 {
3510         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3511         u32 regmask = kcontrol->private_value;
3512
3513         spin_lock_irq(&hdspm->lock);
3514         ucontrol->value.enumerated.item[0] = hdspm_tristate(hdspm, regmask);
3515         spin_unlock_irq(&hdspm->lock);
3516         return 0;
3517 }
3518
3519 static int snd_hdspm_put_tristate(struct snd_kcontrol *kcontrol,
3520                                       struct snd_ctl_elem_value *ucontrol)
3521 {
3522         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3523         u32 regmask = kcontrol->private_value;
3524         int change;
3525         int val;
3526
3527         if (!snd_hdspm_use_is_exclusive(hdspm))
3528                 return -EBUSY;
3529         val = ucontrol->value.integer.value[0];
3530         if (val < 0)
3531                 val = 0;
3532         if (val > 2)
3533                 val = 2;
3534
3535         spin_lock_irq(&hdspm->lock);
3536         change = val != hdspm_tristate(hdspm, regmask);
3537         hdspm_set_tristate(hdspm, val, regmask);
3538         spin_unlock_irq(&hdspm->lock);
3539         return change;
3540 }
3541
3542 #define HDSPM_MADI_SPEEDMODE(xname, xindex) \
3543 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3544         .name = xname, \
3545         .index = xindex, \
3546         .info = snd_hdspm_info_madi_speedmode, \
3547         .get = snd_hdspm_get_madi_speedmode, \
3548         .put = snd_hdspm_put_madi_speedmode \
3549 }
3550
3551 static int hdspm_madi_speedmode(struct hdspm *hdspm)
3552 {
3553         if (hdspm->control_register & HDSPM_QuadSpeed)
3554                 return 2;
3555         if (hdspm->control_register & HDSPM_DoubleSpeed)
3556                 return 1;
3557         return 0;
3558 }
3559
3560 static int hdspm_set_madi_speedmode(struct hdspm *hdspm, int mode)
3561 {
3562         hdspm->control_register &= ~(HDSPM_DoubleSpeed | HDSPM_QuadSpeed);
3563         switch (mode) {
3564         case 0:
3565                 break;
3566         case 1:
3567                 hdspm->control_register |= HDSPM_DoubleSpeed;
3568                 break;
3569         case 2:
3570                 hdspm->control_register |= HDSPM_QuadSpeed;
3571                 break;
3572         }
3573         hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3574
3575         return 0;
3576 }
3577
3578 static int snd_hdspm_info_madi_speedmode(struct snd_kcontrol *kcontrol,
3579                                        struct snd_ctl_elem_info *uinfo)
3580 {
3581         static const char *const texts[] = { "Single", "Double", "Quad" };
3582         ENUMERATED_CTL_INFO(uinfo, texts);
3583         return 0;
3584 }
3585
3586 static int snd_hdspm_get_madi_speedmode(struct snd_kcontrol *kcontrol,
3587                                       struct snd_ctl_elem_value *ucontrol)
3588 {
3589         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3590
3591         spin_lock_irq(&hdspm->lock);
3592         ucontrol->value.enumerated.item[0] = hdspm_madi_speedmode(hdspm);
3593         spin_unlock_irq(&hdspm->lock);
3594         return 0;
3595 }
3596
3597 static int snd_hdspm_put_madi_speedmode(struct snd_kcontrol *kcontrol,
3598                                       struct snd_ctl_elem_value *ucontrol)
3599 {
3600         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3601         int change;
3602         int val;
3603
3604         if (!snd_hdspm_use_is_exclusive(hdspm))
3605                 return -EBUSY;
3606         val = ucontrol->value.integer.value[0];
3607         if (val < 0)
3608                 val = 0;
3609         if (val > 2)
3610                 val = 2;
3611         spin_lock_irq(&hdspm->lock);
3612         change = val != hdspm_madi_speedmode(hdspm);
3613         hdspm_set_madi_speedmode(hdspm, val);
3614         spin_unlock_irq(&hdspm->lock);
3615         return change;
3616 }
3617
3618 #define HDSPM_MIXER(xname, xindex) \
3619 {       .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
3620         .name = xname, \
3621         .index = xindex, \
3622         .device = 0, \
3623         .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
3624                 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3625         .info = snd_hdspm_info_mixer, \
3626         .get = snd_hdspm_get_mixer, \
3627         .put = snd_hdspm_put_mixer \
3628 }
3629
3630 static int snd_hdspm_info_mixer(struct snd_kcontrol *kcontrol,
3631                                 struct snd_ctl_elem_info *uinfo)
3632 {
3633         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3634         uinfo->count = 3;
3635         uinfo->value.integer.min = 0;
3636         uinfo->value.integer.max = 65535;
3637         uinfo->value.integer.step = 1;
3638         return 0;
3639 }
3640
3641 static int snd_hdspm_get_mixer(struct snd_kcontrol *kcontrol,
3642                                struct snd_ctl_elem_value *ucontrol)
3643 {
3644         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3645         int source;
3646         int destination;
3647
3648         source = ucontrol->value.integer.value[0];
3649         if (source < 0)
3650                 source = 0;
3651         else if (source >= 2 * HDSPM_MAX_CHANNELS)
3652                 source = 2 * HDSPM_MAX_CHANNELS - 1;
3653
3654         destination = ucontrol->value.integer.value[1];
3655         if (destination < 0)
3656                 destination = 0;
3657         else if (destination >= HDSPM_MAX_CHANNELS)
3658                 destination = HDSPM_MAX_CHANNELS - 1;
3659
3660         spin_lock_irq(&hdspm->lock);
3661         if (source >= HDSPM_MAX_CHANNELS)
3662                 ucontrol->value.integer.value[2] =
3663                     hdspm_read_pb_gain(hdspm, destination,
3664                                        source - HDSPM_MAX_CHANNELS);
3665         else
3666                 ucontrol->value.integer.value[2] =
3667                     hdspm_read_in_gain(hdspm, destination, source);
3668
3669         spin_unlock_irq(&hdspm->lock);
3670
3671         return 0;
3672 }
3673
3674 static int snd_hdspm_put_mixer(struct snd_kcontrol *kcontrol,
3675                                struct snd_ctl_elem_value *ucontrol)
3676 {
3677         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3678         int change;
3679         int source;
3680         int destination;
3681         int gain;
3682
3683         if (!snd_hdspm_use_is_exclusive(hdspm))
3684                 return -EBUSY;
3685
3686         source = ucontrol->value.integer.value[0];
3687         destination = ucontrol->value.integer.value[1];
3688
3689         if (source < 0 || source >= 2 * HDSPM_MAX_CHANNELS)
3690                 return -1;
3691         if (destination < 0 || destination >= HDSPM_MAX_CHANNELS)
3692                 return -1;
3693
3694         gain = ucontrol->value.integer.value[2];
3695
3696         spin_lock_irq(&hdspm->lock);
3697
3698         if (source >= HDSPM_MAX_CHANNELS)
3699                 change = gain != hdspm_read_pb_gain(hdspm, destination,
3700                                                     source -
3701                                                     HDSPM_MAX_CHANNELS);
3702         else
3703                 change = gain != hdspm_read_in_gain(hdspm, destination,
3704                                                     source);
3705
3706         if (change) {
3707                 if (source >= HDSPM_MAX_CHANNELS)
3708                         hdspm_write_pb_gain(hdspm, destination,
3709                                             source - HDSPM_MAX_CHANNELS,
3710                                             gain);
3711                 else
3712                         hdspm_write_in_gain(hdspm, destination, source,
3713                                             gain);
3714         }
3715         spin_unlock_irq(&hdspm->lock);
3716
3717         return change;
3718 }
3719
3720 /* The simple mixer control(s) provide gain control for the
3721    basic 1:1 mappings of playback streams to output
3722    streams.
3723 */
3724
3725 #define HDSPM_PLAYBACK_MIXER \
3726 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3727         .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_WRITE | \
3728                 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3729         .info = snd_hdspm_info_playback_mixer, \
3730         .get = snd_hdspm_get_playback_mixer, \
3731         .put = snd_hdspm_put_playback_mixer \
3732 }
3733
3734 static int snd_hdspm_info_playback_mixer(struct snd_kcontrol *kcontrol,
3735                                          struct snd_ctl_elem_info *uinfo)
3736 {
3737         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3738         uinfo->count = 1;
3739         uinfo->value.integer.min = 0;
3740         uinfo->value.integer.max = 64;
3741         uinfo->value.integer.step = 1;
3742         return 0;
3743 }
3744
3745 static int snd_hdspm_get_playback_mixer(struct snd_kcontrol *kcontrol,
3746                                         struct snd_ctl_elem_value *ucontrol)
3747 {
3748         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3749         int channel;
3750
3751         channel = ucontrol->id.index - 1;
3752
3753         if (snd_BUG_ON(channel < 0 || channel >= HDSPM_MAX_CHANNELS))
3754                 return -EINVAL;
3755
3756         spin_lock_irq(&hdspm->lock);
3757         ucontrol->value.integer.value[0] =
3758           (hdspm_read_pb_gain(hdspm, channel, channel)*64)/UNITY_GAIN;
3759         spin_unlock_irq(&hdspm->lock);
3760
3761         return 0;
3762 }
3763
3764 static int snd_hdspm_put_playback_mixer(struct snd_kcontrol *kcontrol,
3765                                         struct snd_ctl_elem_value *ucontrol)
3766 {
3767         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3768         int change;
3769         int channel;
3770         int gain;
3771
3772         if (!snd_hdspm_use_is_exclusive(hdspm))
3773                 return -EBUSY;
3774
3775         channel = ucontrol->id.index - 1;
3776
3777         if (snd_BUG_ON(channel < 0 || channel >= HDSPM_MAX_CHANNELS))
3778                 return -EINVAL;
3779
3780         gain = ucontrol->value.integer.value[0]*UNITY_GAIN/64;
3781
3782         spin_lock_irq(&hdspm->lock);
3783         change =
3784             gain != hdspm_read_pb_gain(hdspm, channel,
3785                                        channel);
3786         if (change)
3787                 hdspm_write_pb_gain(hdspm, channel, channel,
3788                                     gain);
3789         spin_unlock_irq(&hdspm->lock);
3790         return change;
3791 }
3792
3793 #define HDSPM_SYNC_CHECK(xname, xindex) \
3794 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3795         .name = xname, \
3796         .private_value = xindex, \
3797         .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3798         .info = snd_hdspm_info_sync_check, \
3799         .get = snd_hdspm_get_sync_check \
3800 }
3801
3802 #define HDSPM_TCO_LOCK_CHECK(xname, xindex) \
3803 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3804         .name = xname, \
3805         .private_value = xindex, \
3806         .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3807         .info = snd_hdspm_tco_info_lock_check, \
3808         .get = snd_hdspm_get_sync_check \
3809 }
3810
3811
3812
3813 static int snd_hdspm_info_sync_check(struct snd_kcontrol *kcontrol,
3814                                      struct snd_ctl_elem_info *uinfo)
3815 {
3816         static const char *const texts[] = { "No Lock", "Lock", "Sync", "N/A" };
3817         ENUMERATED_CTL_INFO(uinfo, texts);
3818         return 0;
3819 }
3820
3821 static int snd_hdspm_tco_info_lock_check(struct snd_kcontrol *kcontrol,
3822                                      struct snd_ctl_elem_info *uinfo)
3823 {
3824         static const char *const texts[] = { "No Lock", "Lock" };
3825         ENUMERATED_CTL_INFO(uinfo, texts);
3826         return 0;
3827 }
3828
3829 static int hdspm_wc_sync_check(struct hdspm *hdspm)
3830 {
3831         int status, status2;
3832
3833         switch (hdspm->io_type) {
3834         case AES32:
3835                 status = hdspm_read(hdspm, HDSPM_statusRegister);
3836                 if (status & HDSPM_AES32_wcLock) {
3837                         if (status & HDSPM_AES32_wcSync)
3838                                 return 2;
3839                         else
3840                                 return 1;
3841                 }
3842                 return 0;
3843
3844         case MADI:
3845                 status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
3846                 if (status2 & HDSPM_wcLock) {
3847                         if (status2 & HDSPM_wcSync)
3848                                 return 2;
3849                         else
3850                                 return 1;
3851                 }
3852                 return 0;
3853
3854         case RayDAT:
3855         case AIO:
3856                 status = hdspm_read(hdspm, HDSPM_statusRegister);
3857
3858                 if (status & 0x2000000)
3859                         return 2;
3860                 else if (status & 0x1000000)
3861                         return 1;
3862                 return 0;
3863
3864         case MADIface:
3865                 break;
3866         }
3867
3868
3869         return 3;
3870 }
3871
3872
3873 static int hdspm_madi_sync_check(struct hdspm *hdspm)
3874 {
3875         int status = hdspm_read(hdspm, HDSPM_statusRegister);
3876         if (status & HDSPM_madiLock) {
3877                 if (status & HDSPM_madiSync)
3878                         return 2;
3879                 else
3880                         return 1;
3881         }
3882         return 0;
3883 }
3884
3885
3886 static int hdspm_s1_sync_check(struct hdspm *hdspm, int idx)
3887 {
3888         int status, lock, sync;
3889
3890         status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
3891
3892         lock = (status & (0x1<<idx)) ? 1 : 0;
3893         sync = (status & (0x100<<idx)) ? 1 : 0;
3894
3895         if (lock && sync)
3896                 return 2;
3897         else if (lock)
3898                 return 1;
3899         return 0;
3900 }
3901
3902
3903 static int hdspm_sync_in_sync_check(struct hdspm *hdspm)
3904 {
3905         int status, lock = 0, sync = 0;
3906
3907         switch (hdspm->io_type) {
3908         case RayDAT:
3909         case AIO:
3910                 status = hdspm_read(hdspm, HDSPM_RD_STATUS_3);
3911                 lock = (status & 0x400) ? 1 : 0;
3912                 sync = (status & 0x800) ? 1 : 0;
3913                 break;
3914
3915         case MADI:
3916                 status = hdspm_read(hdspm, HDSPM_statusRegister);
3917                 lock = (status & HDSPM_syncInLock) ? 1 : 0;
3918                 sync = (status & HDSPM_syncInSync) ? 1 : 0;
3919                 break;
3920
3921         case AES32:
3922                 status = hdspm_read(hdspm, HDSPM_statusRegister2);
3923                 lock = (status & 0x100000) ? 1 : 0;
3924                 sync = (status & 0x200000) ? 1 : 0;
3925                 break;
3926
3927         case MADIface:
3928                 break;
3929         }
3930
3931         if (lock && sync)
3932                 return 2;
3933         else if (lock)
3934                 return 1;
3935
3936         return 0;
3937 }
3938
3939 static int hdspm_aes_sync_check(struct hdspm *hdspm, int idx)
3940 {
3941         int status2, lock, sync;
3942         status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
3943
3944         lock = (status2 & (0x0080 >> idx)) ? 1 : 0;
3945         sync = (status2 & (0x8000 >> idx)) ? 1 : 0;
3946
3947         if (sync)
3948                 return 2;
3949         else if (lock)
3950                 return 1;
3951         return 0;
3952 }
3953
3954 static int hdspm_tco_input_check(struct hdspm *hdspm, u32 mask)
3955 {
3956         u32 status;
3957         status = hdspm_read(hdspm, HDSPM_RD_TCO + 4);
3958
3959         return (status & mask) ? 1 : 0;
3960 }
3961
3962
3963 static int hdspm_tco_sync_check(struct hdspm *hdspm)
3964 {
3965         int status;
3966
3967         if (hdspm->tco) {
3968                 switch (hdspm->io_type) {
3969                 case MADI:
3970                         status = hdspm_read(hdspm, HDSPM_statusRegister);
3971                         if (status & HDSPM_tcoLockMadi) {
3972                                 if (status & HDSPM_tcoSync)
3973                                         return 2;
3974                                 else
3975                                         return 1;
3976                         }
3977                         return 0;
3978                 case AES32:
3979                         status = hdspm_read(hdspm, HDSPM_statusRegister);
3980                         if (status & HDSPM_tcoLockAes) {
3981                                 if (status & HDSPM_tcoSync)
3982                                         return 2;
3983                                 else
3984                                         return 1;
3985                         }
3986                         return 0;
3987                 case RayDAT:
3988                 case AIO:
3989                         status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
3990
3991                         if (status & 0x8000000)
3992                                 return 2; /* Sync */
3993                         if (status & 0x4000000)
3994                                 return 1; /* Lock */
3995                         return 0; /* No signal */
3996
3997                 default:
3998                         break;
3999                 }
4000         }
4001
4002         return 3; /* N/A */
4003 }
4004
4005
4006 static int snd_hdspm_get_sync_check(struct snd_kcontrol *kcontrol,
4007                                     struct snd_ctl_elem_value *ucontrol)
4008 {
4009         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4010         int val = -1;
4011
4012         switch (hdspm->io_type) {
4013         case RayDAT:
4014                 switch (kcontrol->private_value) {
4015                 case 0: /* WC */
4016                         val = hdspm_wc_sync_check(hdspm); break;
4017                 case 7: /* TCO */
4018                         val = hdspm_tco_sync_check(hdspm); break;
4019                 case 8: /* SYNC IN */
4020                         val = hdspm_sync_in_sync_check(hdspm); break;
4021                 default:
4022                         val = hdspm_s1_sync_check(hdspm,
4023                                         kcontrol->private_value-1);
4024                 }
4025                 break;
4026
4027         case AIO:
4028                 switch (kcontrol->private_value) {
4029                 case 0: /* WC */
4030                         val = hdspm_wc_sync_check(hdspm); break;
4031                 case 4: /* TCO */
4032                         val = hdspm_tco_sync_check(hdspm); break;
4033                 case 5: /* SYNC IN */
4034                         val = hdspm_sync_in_sync_check(hdspm); break;
4035                 default:
4036                         val = hdspm_s1_sync_check(hdspm,
4037                                         kcontrol->private_value-1);
4038                 }
4039                 break;
4040
4041         case MADI:
4042                 switch (kcontrol->private_value) {
4043                 case 0: /* WC */
4044                         val = hdspm_wc_sync_check(hdspm); break;
4045                 case 1: /* MADI */
4046                         val = hdspm_madi_sync_check(hdspm); break;
4047                 case 2: /* TCO */
4048                         val = hdspm_tco_sync_check(hdspm); break;
4049                 case 3: /* SYNC_IN */
4050                         val = hdspm_sync_in_sync_check(hdspm); break;
4051                 }
4052                 break;
4053
4054         case MADIface:
4055                 val = hdspm_madi_sync_check(hdspm); /* MADI */
4056                 break;
4057
4058         case AES32:
4059                 switch (kcontrol->private_value) {
4060                 case 0: /* WC */
4061                         val = hdspm_wc_sync_check(hdspm); break;
4062                 case 9: /* TCO */
4063                         val = hdspm_tco_sync_check(hdspm); break;
4064                 case 10 /* SYNC IN */:
4065                         val = hdspm_sync_in_sync_check(hdspm); break;
4066                 default: /* AES1 to AES8 */
4067                          val = hdspm_aes_sync_check(hdspm,
4068                                          kcontrol->private_value-1);
4069                 }
4070                 break;
4071
4072         }
4073
4074         if (hdspm->tco) {
4075                 switch (kcontrol->private_value) {
4076                 case 11:
4077                         /* Check TCO for lock state of its current input */
4078                         val = hdspm_tco_input_check(hdspm, HDSPM_TCO1_TCO_lock);
4079                         break;
4080                 case 12:
4081                         /* Check TCO for valid time code on LTC input. */
4082                         val = hdspm_tco_input_check(hdspm,
4083                                 HDSPM_TCO1_LTC_Input_valid);
4084                         break;
4085                 default:
4086                         break;
4087                 }
4088         }
4089
4090         if (-1 == val)
4091                 val = 3;
4092
4093         ucontrol->value.enumerated.item[0] = val;
4094         return 0;
4095 }
4096
4097
4098
4099 /*
4100  * TCO controls
4101  */
4102 static void hdspm_tco_write(struct hdspm *hdspm)
4103 {
4104         unsigned int tc[4] = { 0, 0, 0, 0};
4105
4106         switch (hdspm->tco->input) {
4107         case 0:
4108                 tc[2] |= HDSPM_TCO2_set_input_MSB;
4109                 break;
4110         case 1:
4111                 tc[2] |= HDSPM_TCO2_set_input_LSB;
4112                 break;
4113         default:
4114                 break;
4115         }
4116
4117         switch (hdspm->tco->framerate) {
4118         case 1:
4119                 tc[1] |= HDSPM_TCO1_LTC_Format_LSB;
4120                 break;
4121         case 2:
4122                 tc[1] |= HDSPM_TCO1_LTC_Format_MSB;
4123                 break;
4124         case 3:
4125                 tc[1] |= HDSPM_TCO1_LTC_Format_MSB +
4126                         HDSPM_TCO1_set_drop_frame_flag;
4127                 break;
4128         case 4:
4129                 tc[1] |= HDSPM_TCO1_LTC_Format_LSB +
4130                         HDSPM_TCO1_LTC_Format_MSB;
4131                 break;
4132         case 5:
4133                 tc[1] |= HDSPM_TCO1_LTC_Format_LSB +
4134                         HDSPM_TCO1_LTC_Format_MSB +
4135                         HDSPM_TCO1_set_drop_frame_flag;
4136                 break;
4137         default:
4138                 break;
4139         }
4140
4141         switch (hdspm->tco->wordclock) {
4142         case 1:
4143                 tc[2] |= HDSPM_TCO2_WCK_IO_ratio_LSB;
4144                 break;
4145         case 2:
4146                 tc[2] |= HDSPM_TCO2_WCK_IO_ratio_MSB;
4147                 break;
4148         default:
4149                 break;
4150         }
4151
4152         switch (hdspm->tco->samplerate) {
4153         case 1:
4154                 tc[2] |= HDSPM_TCO2_set_freq;
4155                 break;
4156         case 2:
4157                 tc[2] |= HDSPM_TCO2_set_freq_from_app;
4158                 break;
4159         default:
4160                 break;
4161         }
4162
4163         switch (hdspm->tco->pull) {
4164         case 1:
4165                 tc[2] |= HDSPM_TCO2_set_pull_up;
4166                 break;
4167         case 2:
4168                 tc[2] |= HDSPM_TCO2_set_pull_down;
4169                 break;
4170         case 3:
4171                 tc[2] |= HDSPM_TCO2_set_pull_up + HDSPM_TCO2_set_01_4;
4172                 break;
4173         case 4:
4174                 tc[2] |= HDSPM_TCO2_set_pull_down + HDSPM_TCO2_set_01_4;
4175                 break;
4176         default:
4177                 break;
4178         }
4179
4180         if (1 == hdspm->tco->term) {
4181                 tc[2] |= HDSPM_TCO2_set_term_75R;
4182         }
4183
4184         hdspm_write(hdspm, HDSPM_WR_TCO, tc[0]);
4185         hdspm_write(hdspm, HDSPM_WR_TCO+4, tc[1]);
4186         hdspm_write(hdspm, HDSPM_WR_TCO+8, tc[2]);
4187         hdspm_write(hdspm, HDSPM_WR_TCO+12, tc[3]);
4188 }
4189
4190
4191 #define HDSPM_TCO_SAMPLE_RATE(xname, xindex) \
4192 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4193         .name = xname, \
4194         .index = xindex, \
4195         .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4196                 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4197         .info = snd_hdspm_info_tco_sample_rate, \
4198         .get = snd_hdspm_get_tco_sample_rate, \
4199         .put = snd_hdspm_put_tco_sample_rate \
4200 }
4201
4202 static int snd_hdspm_info_tco_sample_rate(struct snd_kcontrol *kcontrol,
4203                                           struct snd_ctl_elem_info *uinfo)
4204 {
4205         /* TODO freq from app could be supported here, see tco->samplerate */
4206         static const char *const texts[] = { "44.1 kHz", "48 kHz" };
4207         ENUMERATED_CTL_INFO(uinfo, texts);
4208         return 0;
4209 }
4210
4211 static int snd_hdspm_get_tco_sample_rate(struct snd_kcontrol *kcontrol,
4212                                       struct snd_ctl_elem_value *ucontrol)
4213 {
4214         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4215
4216         ucontrol->value.enumerated.item[0] = hdspm->tco->samplerate;
4217
4218         return 0;
4219 }
4220
4221 static int snd_hdspm_put_tco_sample_rate(struct snd_kcontrol *kcontrol,
4222                                          struct snd_ctl_elem_value *ucontrol)
4223 {
4224         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4225
4226         if (hdspm->tco->samplerate != ucontrol->value.enumerated.item[0]) {
4227                 hdspm->tco->samplerate = ucontrol->value.enumerated.item[0];
4228
4229                 hdspm_tco_write(hdspm);
4230
4231                 return 1;
4232         }
4233
4234         return 0;
4235 }
4236
4237
4238 #define HDSPM_TCO_PULL(xname, xindex) \
4239 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4240         .name = xname, \
4241         .index = xindex, \
4242         .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4243                 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4244         .info = snd_hdspm_info_tco_pull, \
4245         .get = snd_hdspm_get_tco_pull, \
4246         .put = snd_hdspm_put_tco_pull \
4247 }
4248
4249 static int snd_hdspm_info_tco_pull(struct snd_kcontrol *kcontrol,
4250                                    struct snd_ctl_elem_info *uinfo)
4251 {
4252         static const char *const texts[] = { "0", "+ 0.1 %", "- 0.1 %",
4253                 "+ 4 %", "- 4 %" };
4254         ENUMERATED_CTL_INFO(uinfo, texts);
4255         return 0;
4256 }
4257
4258 static int snd_hdspm_get_tco_pull(struct snd_kcontrol *kcontrol,
4259                                   struct snd_ctl_elem_value *ucontrol)
4260 {
4261         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4262
4263         ucontrol->value.enumerated.item[0] = hdspm->tco->pull;
4264
4265         return 0;
4266 }
4267
4268 static int snd_hdspm_put_tco_pull(struct snd_kcontrol *kcontrol,
4269                                   struct snd_ctl_elem_value *ucontrol)
4270 {
4271         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4272
4273         if (hdspm->tco->pull != ucontrol->value.enumerated.item[0]) {
4274                 hdspm->tco->pull = ucontrol->value.enumerated.item[0];
4275
4276                 hdspm_tco_write(hdspm);
4277
4278                 return 1;
4279         }
4280
4281         return 0;
4282 }
4283
4284 #define HDSPM_TCO_WCK_CONVERSION(xname, xindex) \
4285 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4286         .name = xname, \
4287         .index = xindex, \
4288         .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4289                         SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4290         .info = snd_hdspm_info_tco_wck_conversion, \
4291         .get = snd_hdspm_get_tco_wck_conversion, \
4292         .put = snd_hdspm_put_tco_wck_conversion \
4293 }
4294
4295 static int snd_hdspm_info_tco_wck_conversion(struct snd_kcontrol *kcontrol,
4296                                              struct snd_ctl_elem_info *uinfo)
4297 {
4298         static const char *const texts[] = { "1:1", "44.1 -> 48", "48 -> 44.1" };
4299         ENUMERATED_CTL_INFO(uinfo, texts);
4300         return 0;
4301 }
4302
4303 static int snd_hdspm_get_tco_wck_conversion(struct snd_kcontrol *kcontrol,
4304                                             struct snd_ctl_elem_value *ucontrol)
4305 {
4306         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4307
4308         ucontrol->value.enumerated.item[0] = hdspm->tco->wordclock;
4309
4310         return 0;
4311 }
4312
4313 static int snd_hdspm_put_tco_wck_conversion(struct snd_kcontrol *kcontrol,
4314                                             struct snd_ctl_elem_value *ucontrol)
4315 {
4316         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4317
4318         if (hdspm->tco->wordclock != ucontrol->value.enumerated.item[0]) {
4319                 hdspm->tco->wordclock = ucontrol->value.enumerated.item[0];
4320
4321                 hdspm_tco_write(hdspm);
4322
4323                 return 1;
4324         }
4325
4326         return 0;
4327 }
4328
4329
4330 #define HDSPM_TCO_FRAME_RATE(xname, xindex) \
4331 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4332         .name = xname, \
4333         .index = xindex, \
4334         .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4335                         SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4336         .info = snd_hdspm_info_tco_frame_rate, \
4337         .get = snd_hdspm_get_tco_frame_rate, \
4338         .put = snd_hdspm_put_tco_frame_rate \
4339 }
4340
4341 static int snd_hdspm_info_tco_frame_rate(struct snd_kcontrol *kcontrol,
4342                                           struct snd_ctl_elem_info *uinfo)
4343 {
4344         static const char *const texts[] = { "24 fps", "25 fps", "29.97fps",
4345                 "29.97 dfps", "30 fps", "30 dfps" };
4346         ENUMERATED_CTL_INFO(uinfo, texts);
4347         return 0;
4348 }
4349
4350 static int snd_hdspm_get_tco_frame_rate(struct snd_kcontrol *kcontrol,
4351                                         struct snd_ctl_elem_value *ucontrol)
4352 {
4353         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4354
4355         ucontrol->value.enumerated.item[0] = hdspm->tco->framerate;
4356
4357         return 0;
4358 }
4359
4360 static int snd_hdspm_put_tco_frame_rate(struct snd_kcontrol *kcontrol,
4361                                         struct snd_ctl_elem_value *ucontrol)
4362 {
4363         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4364
4365         if (hdspm->tco->framerate != ucontrol->value.enumerated.item[0]) {
4366                 hdspm->tco->framerate = ucontrol->value.enumerated.item[0];
4367
4368                 hdspm_tco_write(hdspm);
4369
4370                 return 1;
4371         }
4372
4373         return 0;
4374 }
4375
4376
4377 #define HDSPM_TCO_SYNC_SOURCE(xname, xindex) \
4378 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4379         .name = xname, \
4380         .index = xindex, \
4381         .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4382                         SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4383         .info = snd_hdspm_info_tco_sync_source, \
4384         .get = snd_hdspm_get_tco_sync_source, \
4385         .put = snd_hdspm_put_tco_sync_source \
4386 }
4387
4388 static int snd_hdspm_info_tco_sync_source(struct snd_kcontrol *kcontrol,
4389                                           struct snd_ctl_elem_info *uinfo)
4390 {
4391         static const char *const texts[] = { "LTC", "Video", "WCK" };
4392         ENUMERATED_CTL_INFO(uinfo, texts);
4393         return 0;
4394 }
4395
4396 static int snd_hdspm_get_tco_sync_source(struct snd_kcontrol *kcontrol,
4397                                          struct snd_ctl_elem_value *ucontrol)
4398 {
4399         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4400
4401         ucontrol->value.enumerated.item[0] = hdspm->tco->input;
4402
4403         return 0;
4404 }
4405
4406 static int snd_hdspm_put_tco_sync_source(struct snd_kcontrol *kcontrol,
4407                                          struct snd_ctl_elem_value *ucontrol)
4408 {
4409         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4410
4411         if (hdspm->tco->input != ucontrol->value.enumerated.item[0]) {
4412                 hdspm->tco->input = ucontrol->value.enumerated.item[0];
4413
4414                 hdspm_tco_write(hdspm);
4415
4416                 return 1;
4417         }
4418
4419         return 0;
4420 }
4421
4422
4423 #define HDSPM_TCO_WORD_TERM(xname, xindex) \
4424 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4425         .name = xname, \
4426         .index = xindex, \
4427         .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4428                         SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4429         .info = snd_hdspm_info_tco_word_term, \
4430         .get = snd_hdspm_get_tco_word_term, \
4431         .put = snd_hdspm_put_tco_word_term \
4432 }
4433
4434 static int snd_hdspm_info_tco_word_term(struct snd_kcontrol *kcontrol,
4435                                         struct snd_ctl_elem_info *uinfo)
4436 {
4437         uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
4438         uinfo->count = 1;
4439         uinfo->value.integer.min = 0;
4440         uinfo->value.integer.max = 1;
4441
4442         return 0;
4443 }
4444
4445
4446 static int snd_hdspm_get_tco_word_term(struct snd_kcontrol *kcontrol,
4447                                        struct snd_ctl_elem_value *ucontrol)
4448 {
4449         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4450
4451         ucontrol->value.integer.value[0] = hdspm->tco->term;
4452
4453         return 0;
4454 }
4455
4456
4457 static int snd_hdspm_put_tco_word_term(struct snd_kcontrol *kcontrol,
4458                                        struct snd_ctl_elem_value *ucontrol)
4459 {
4460         struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4461
4462         if (hdspm->tco->term != ucontrol->value.integer.value[0]) {
4463                 hdspm->tco->term = ucontrol->value.integer.value[0];
4464
4465                 hdspm_tco_write(hdspm);
4466
4467                 return 1;
4468         }
4469
4470         return 0;
4471 }
4472
4473
4474
4475
4476 static const struct snd_kcontrol_new snd_hdspm_controls_madi[] = {
4477         HDSPM_MIXER("Mixer", 0),
4478         HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4479         HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4480         HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
4481         HDSPM_AUTOSYNC_REF("AutoSync Reference", 0),
4482         HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4483         HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
4484         HDSPM_SYNC_CHECK("WC SyncCheck", 0),
4485         HDSPM_SYNC_CHECK("MADI SyncCheck", 1),
4486         HDSPM_SYNC_CHECK("TCO SyncCheck", 2),
4487         HDSPM_SYNC_CHECK("SYNC IN SyncCheck", 3),
4488         HDSPM_TOGGLE_SETTING("Line Out", HDSPM_LineOut),
4489         HDSPM_TOGGLE_SETTING("TX 64 channels mode", HDSPM_TX_64ch),
4490         HDSPM_TOGGLE_SETTING("Disable 96K frames", HDSPM_SMUX),
4491         HDSPM_TOGGLE_SETTING("Clear Track Marker", HDSPM_clr_tms),
4492         HDSPM_TOGGLE_SETTING("Safe Mode", HDSPM_AutoInp),
4493         HDSPM_INPUT_SELECT("Input Select", 0),
4494         HDSPM_MADI_SPEEDMODE("MADI Speed Mode", 0)
4495 };
4496
4497
4498 static const struct snd_kcontrol_new snd_hdspm_controls_madiface[] = {
4499         HDSPM_MIXER("Mixer", 0),
4500         HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4501         HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4502         HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4503         HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
4504         HDSPM_SYNC_CHECK("MADI SyncCheck", 0),
4505         HDSPM_TOGGLE_SETTING("TX 64 channels mode", HDSPM_TX_64ch),
4506         HDSPM_TOGGLE_SETTING("Clear Track Marker", HDSPM_clr_tms),
4507         HDSPM_TOGGLE_SETTING("Safe Mode", HDSPM_AutoInp),
4508         HDSPM_MADI_SPEEDMODE("MADI Speed Mode", 0)
4509 };
4510
4511 static const struct snd_kcontrol_new snd_hdspm_controls_aio[] = {
4512         HDSPM_MIXER("Mixer", 0),
4513         HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4514         HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4515         HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
4516         HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4517         HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
4518         HDSPM_SYNC_CHECK("WC SyncCheck", 0),
4519         HDSPM_SYNC_CHECK("AES SyncCheck", 1),
4520         HDSPM_SYNC_CHECK("SPDIF SyncCheck", 2),
4521         HDSPM_SYNC_CHECK("ADAT SyncCheck", 3),
4522         HDSPM_SYNC_CHECK("TCO SyncCheck", 4),
4523         HDSPM_SYNC_CHECK("SYNC IN SyncCheck", 5),
4524         HDSPM_AUTOSYNC_SAMPLE_RATE("WC Frequency", 0),
4525         HDSPM_AUTOSYNC_SAMPLE_RATE("AES Frequency", 1),
4526         HDSPM_AUTOSYNC_SAMPLE_RATE("SPDIF Frequency", 2),
4527         HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT Frequency", 3),
4528         HDSPM_AUTOSYNC_SAMPLE_RATE("TCO Frequency", 4),
4529         HDSPM_AUTOSYNC_SAMPLE_RATE("SYNC IN Frequency", 5),
4530         HDSPM_CONTROL_TRISTATE("S/PDIF Input", HDSPM_c0_Input0),
4531         HDSPM_TOGGLE_SETTING("S/PDIF Out Optical", HDSPM_c0_Spdif_Opt),
4532         HDSPM_TOGGLE_SETTING("S/PDIF Out Professional", HDSPM_c0_Pro),
4533         HDSPM_TOGGLE_SETTING("ADAT internal (AEB/TEB)", HDSPM_c0_AEB1),
4534         HDSPM_TOGGLE_SETTING("XLR Breakout Cable", HDSPM_c0_Sym6db),
4535         HDSPM_TOGGLE_SETTING("Single Speed WordClock Out", HDSPM_c0_Wck48),
4536         HDSPM_CONTROL_TRISTATE("Input Level", HDSPM_c0_AD_GAIN0),
4537         HDSPM_CONTROL_TRISTATE("Output Level", HDSPM_c0_DA_GAIN0),
4538         HDSPM_CONTROL_TRISTATE("Phones Level", HDSPM_c0_PH_GAIN0)
4539
4540                 /*
4541                    HDSPM_INPUT_SELECT("Input Select", 0),
4542                    HDSPM_SPDIF_OPTICAL("SPDIF Out Optical", 0),
4543                    HDSPM_PROFESSIONAL("SPDIF Out Professional", 0);
4544                    HDSPM_SPDIF_IN("SPDIF In", 0);
4545                    HDSPM_BREAKOUT_CABLE("Breakout Cable", 0);
4546                    HDSPM_INPUT_LEVEL("Input Level", 0);
4547                    HDSPM_OUTPUT_LEVEL("Output Level", 0);
4548                    HDSPM_PHONES("Phones", 0);
4549                    */
4550 };
4551
4552 static const struct snd_kcontrol_new snd_hdspm_controls_raydat[] = {
4553         HDSPM_MIXER("Mixer", 0),
4554         HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4555         HDSPM_SYSTEM_CLOCK_MODE("Clock Mode", 0),
4556         HDSPM_PREF_SYNC_REF("Pref Sync Ref", 0),
4557         HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4558         HDSPM_SYNC_CHECK("WC SyncCheck", 0),
4559         HDSPM_SYNC_CHECK("AES SyncCheck", 1),
4560         HDSPM_SYNC_CHECK("SPDIF SyncCheck", 2),
4561         HDSPM_SYNC_CHECK("ADAT1 SyncCheck", 3),
4562         HDSPM_SYNC_CHECK("ADAT2 SyncCheck", 4),
4563         HDSPM_SYNC_CHECK("ADAT3 SyncCheck", 5),
4564         HDSPM_SYNC_CHECK("ADAT4 SyncCheck", 6),
4565         HDSPM_SYNC_CHECK("TCO SyncCheck", 7),
4566         HDSPM_SYNC_CHECK("SYNC IN SyncCheck", 8),
4567         HDSPM_AUTOSYNC_SAMPLE_RATE("WC Frequency", 0),
4568         HDSPM_AUTOSYNC_SAMPLE_RATE("AES Frequency", 1),
4569         HDSPM_AUTOSYNC_SAMPLE_RATE("SPDIF Frequency", 2),
4570         HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT1 Frequency", 3),
4571         HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT2 Frequency", 4),
4572         HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT3 Frequency", 5),
4573         HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT4 Frequency", 6),
4574         HDSPM_AUTOSYNC_SAMPLE_RATE("TCO Frequency", 7),
4575         HDSPM_AUTOSYNC_SAMPLE_RATE("SYNC IN Frequency", 8),
4576         HDSPM_TOGGLE_SETTING("S/PDIF Out Professional", HDSPM_c0_Pro),
4577         HDSPM_TOGGLE_SETTING("Single Speed WordClock Out", HDSPM_c0_Wck48)
4578 };
4579
4580 static const struct snd_kcontrol_new snd_hdspm_controls_aes32[] = {
4581         HDSPM_MIXER("Mixer", 0),
4582         HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4583         HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4584         HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
4585         HDSPM_AUTOSYNC_REF("AutoSync Reference", 0),
4586         HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4587         HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 11),
4588         HDSPM_SYNC_CHECK("WC Sync Check", 0),
4589         HDSPM_SYNC_CHECK("AES1 Sync Check", 1),
4590         HDSPM_SYNC_CHECK("AES2 Sync Check", 2),
4591         HDSPM_SYNC_CHECK("AES3 Sync Check", 3),
4592         HDSPM_SYNC_CHECK("AES4 Sync Check", 4),
4593         HDSPM_SYNC_CHECK("AES5 Sync Check", 5),
4594         HDSPM_SYNC_CHECK("AES6 Sync Check", 6),
4595         HDSPM_SYNC_CHECK("AES7 Sync Check", 7),
4596         HDSPM_SYNC_CHECK("AES8 Sync Check", 8),
4597         HDSPM_SYNC_CHECK("TCO Sync Check", 9),
4598         HDSPM_SYNC_CHECK("SYNC IN Sync Check", 10),
4599         HDSPM_AUTOSYNC_SAMPLE_RATE("WC Frequency", 0),
4600         HDSPM_AUTOSYNC_SAMPLE_RATE("AES1 Frequency", 1),
4601         HDSPM_AUTOSYNC_SAMPLE_RATE("AES2 Frequency", 2),
4602         HDSPM_AUTOSYNC_SAMPLE_RATE("AES3 Frequency", 3),
4603         HDSPM_AUTOSYNC_SAMPLE_RATE("AES4 Frequency", 4),
4604         HDSPM_AUTOSYNC_SAMPLE_RATE("AES5 Frequency", 5),
4605         HDSPM_AUTOSYNC_SAMPLE_RATE("AES6 Frequency", 6),
4606         HDSPM_AUTOSYNC_SAMPLE_RATE("AES7 Frequency", 7),
4607         HDSPM_AUTOSYNC_SAMPLE_RATE("AES8 Frequency", 8),
4608         HDSPM_AUTOSYNC_SAMPLE_RATE("TCO Frequency", 9),
4609         HDSPM_AUTOSYNC_SAMPLE_RATE("SYNC IN Frequency", 10),
4610         HDSPM_TOGGLE_SETTING("Line Out", HDSPM_LineOut),
4611         HDSPM_TOGGLE_SETTING("Emphasis", HDSPM_Emphasis),
4612         HDSPM_TOGGLE_SETTING("Non Audio", HDSPM_Dolby),
4613         HDSPM_TOGGLE_SETTING("Professional", HDSPM_Professional),
4614         HDSPM_TOGGLE_SETTING("Clear Track Marker", HDSPM_clr_tms),
4615         HDSPM_DS_WIRE("Double Speed Wire Mode", 0),
4616         HDSPM_QS_WIRE("Quad Speed Wire Mode", 0),
4617 };
4618
4619
4620
4621 /* Control elements for the optional TCO module */
4622 static const struct snd_kcontrol_new snd_hdspm_controls_tco[] = {
4623         HDSPM_TCO_SAMPLE_RATE("TCO Sample Rate", 0),
4624         HDSPM_TCO_PULL("TCO Pull", 0),
4625         HDSPM_TCO_WCK_CONVERSION("TCO WCK Conversion", 0),
4626         HDSPM_TCO_FRAME_RATE("TCO Frame Rate", 0),
4627         HDSPM_TCO_SYNC_SOURCE("TCO Sync Source", 0),
4628         HDSPM_TCO_WORD_TERM("TCO Word Term", 0),
4629         HDSPM_TCO_LOCK_CHECK("TCO Input Check", 11),
4630         HDSPM_TCO_LOCK_CHECK("TCO LTC Valid", 12),
4631         HDSPM_TCO_LTC_FRAMES("TCO Detected Frame Rate", 0),
4632         HDSPM_TCO_VIDEO_INPUT_FORMAT("Video Input Format", 0)
4633 };
4634
4635
4636 static struct snd_kcontrol_new snd_hdspm_playback_mixer = HDSPM_PLAYBACK_MIXER;
4637
4638
4639 static int hdspm_update_simple_mixer_controls(struct hdspm * hdspm)
4640 {
4641         int i;
4642
4643         for (i = hdspm->ds_out_channels; i < hdspm->ss_out_channels; ++i) {
4644                 if (hdspm->system_sample_rate > 48000) {
4645                         hdspm->playback_mixer_ctls[i]->vd[0].access =
4646                                 SNDRV_CTL_ELEM_ACCESS_INACTIVE |
4647                                 SNDRV_CTL_ELEM_ACCESS_READ |
4648                                 SNDRV_CTL_ELEM_ACCESS_VOLATILE;
4649                 } else {
4650                         hdspm->playback_mixer_ctls[i]->vd[0].access =
4651                                 SNDRV_CTL_ELEM_ACCESS_READWRITE |
4652                                 SNDRV_CTL_ELEM_ACCESS_VOLATILE;
4653                 }
4654                 snd_ctl_notify(hdspm->card, SNDRV_CTL_EVENT_MASK_VALUE |
4655                                 SNDRV_CTL_EVENT_MASK_INFO,
4656                                 &hdspm->playback_mixer_ctls[i]->id);
4657         }
4658
4659         return 0;
4660 }
4661
4662
4663 static int snd_hdspm_create_controls(struct snd_card *card,
4664                                         struct hdspm *hdspm)
4665 {
4666         unsigned int idx, limit;
4667         int err;
4668         struct snd_kcontrol *kctl;
4669         const struct snd_kcontrol_new *list = NULL;
4670
4671         switch (hdspm->io_type) {
4672         case MADI:
4673                 list = snd_hdspm_controls_madi;
4674                 limit = ARRAY_SIZE(snd_hdspm_controls_madi);
4675                 break;
4676         case MADIface:
4677                 list = snd_hdspm_controls_madiface;
4678                 limit = ARRAY_SIZE(snd_hdspm_controls_madiface);
4679                 break;
4680         case AIO:
4681                 list = snd_hdspm_controls_aio;
4682                 limit = ARRAY_SIZE(snd_hdspm_controls_aio);
4683                 break;
4684         case RayDAT:
4685                 list = snd_hdspm_controls_raydat;
4686                 limit = ARRAY_SIZE(snd_hdspm_controls_raydat);
4687                 break;
4688         case AES32:
4689                 list = snd_hdspm_controls_aes32;
4690                 limit = ARRAY_SIZE(snd_hdspm_controls_aes32);
4691                 break;
4692         }
4693
4694         if (list) {
4695                 for (idx = 0; idx < limit; idx++) {
4696                         err = snd_ctl_add(card,
4697                                         snd_ctl_new1(&list[idx], hdspm));
4698                         if (err < 0)
4699                                 return err;
4700                 }
4701         }
4702
4703
4704         /* create simple 1:1 playback mixer controls */
4705         snd_hdspm_playback_mixer.name = "Chn";
4706         if (hdspm->system_sample_rate >= 128000) {
4707                 limit = hdspm->qs_out_channels;
4708         } else if (hdspm->system_sample_rate >= 64000) {
4709                 limit = hdspm->ds_out_channels;
4710         } else {
4711                 limit = hdspm->ss_out_channels;
4712         }
4713         for (idx = 0; idx < limit; ++idx) {
4714                 snd_hdspm_playback_mixer.index = idx + 1;
4715                 kctl = snd_ctl_new1(&snd_hdspm_playback_mixer, hdspm);
4716                 err = snd_ctl_add(card, kctl);
4717                 if (err < 0)
4718                         return err;
4719                 hdspm->playback_mixer_ctls[idx] = kctl;
4720         }
4721
4722
4723         if (hdspm->tco) {
4724                 /* add tco control elements */
4725                 list = snd_hdspm_controls_tco;
4726                 limit = ARRAY_SIZE(snd_hdspm_controls_tco);
4727                 for (idx = 0; idx < limit; idx++) {
4728                         err = snd_ctl_add(card,
4729                                         snd_ctl_new1(&list[idx], hdspm));
4730                         if (err < 0)
4731                                 return err;
4732                 }
4733         }
4734
4735         return 0;
4736 }
4737
4738 /*------------------------------------------------------------
4739    /proc interface
4740  ------------------------------------------------------------*/
4741
4742 static void
4743 snd_hdspm_proc_read_tco(struct snd_info_entry *entry,
4744                                         struct snd_info_buffer *buffer)
4745 {
4746         struct hdspm *hdspm = entry->private_data;
4747         unsigned int status, control;
4748         int a, ltc, frames, seconds, minutes, hours;
4749         unsigned int period;
4750         u64 freq_const = 0;
4751         u32 rate;
4752
4753         snd_iprintf(buffer, "--- TCO ---\n");
4754
4755         status = hdspm_read(hdspm, HDSPM_statusRegister);
4756         control = hdspm->control_register;
4757
4758
4759         if (status & HDSPM_tco_detect) {
4760                 snd_iprintf(buffer, "TCO module detected.\n");
4761                 a = hdspm_read(hdspm, HDSPM_RD_TCO+4);
4762                 if (a & HDSPM_TCO1_LTC_Input_valid) {
4763                         snd_iprintf(buffer, "  LTC valid, ");
4764                         switch (a & (HDSPM_TCO1_LTC_Format_LSB |
4765                                                 HDSPM_TCO1_LTC_Format_MSB)) {
4766                         case 0:
4767                                 snd_iprintf(buffer, "24 fps, ");
4768                                 break;
4769                         case HDSPM_TCO1_LTC_Format_LSB:
4770                                 snd_iprintf(buffer, "25 fps, ");
4771                                 break;
4772                         case HDSPM_TCO1_LTC_Format_MSB:
4773                                 snd_iprintf(buffer, "29.97 fps, ");
4774                                 break;
4775                         default:
4776                                 snd_iprintf(buffer, "30 fps, ");
4777                                 break;
4778                         }
4779                         if (a & HDSPM_TCO1_set_drop_frame_flag) {
4780                                 snd_iprintf(buffer, "drop frame\n");
4781                         } else {
4782                                 snd_iprintf(buffer, "full frame\n");
4783                         }
4784                 } else {
4785                         snd_iprintf(buffer, "  no LTC\n");
4786                 }
4787                 if (a & HDSPM_TCO1_Video_Input_Format_NTSC) {
4788                         snd_iprintf(buffer, "  Video: NTSC\n");
4789                 } else if (a & HDSPM_TCO1_Video_Input_Format_PAL) {
4790                         snd_iprintf(buffer, "  Video: PAL\n");
4791                 } else {
4792                         snd_iprintf(buffer, "  No video\n");
4793                 }
4794                 if (a & HDSPM_TCO1_TCO_lock) {
4795                         snd_iprintf(buffer, "  Sync: lock\n");
4796                 } else {
4797                         snd_iprintf(buffer, "  Sync: no lock\n");
4798                 }
4799
4800                 switch (hdspm->io_type) {
4801                 case MADI:
4802                 case AES32:
4803                         freq_const = 110069313433624ULL;
4804                         break;
4805                 case RayDAT:
4806                 case AIO:
4807                         freq_const = 104857600000000ULL;
4808                         break;
4809                 case MADIface:
4810                         break; /* no TCO possible */
4811                 }
4812
4813                 period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ);
4814                 snd_iprintf(buffer, "    period: %u\n", period);
4815
4816
4817                 /* rate = freq_const/period; */
4818                 rate = div_u64(freq_const, period);
4819
4820                 if (control & HDSPM_QuadSpeed) {
4821                         rate *= 4;
4822                 } else if (control & HDSPM_DoubleSpeed) {
4823                         rate *= 2;
4824                 }
4825
4826                 snd_iprintf(buffer, "  Frequency: %u Hz\n",
4827                                 (unsigned int) rate);
4828
4829                 ltc = hdspm_read(hdspm, HDSPM_RD_TCO);
4830                 frames = ltc & 0xF;
4831                 ltc >>= 4;
4832                 frames += (ltc & 0x3) * 10;
4833                 ltc >>= 4;
4834                 seconds = ltc & 0xF;
4835                 ltc >>= 4;
4836                 seconds += (ltc & 0x7) * 10;
4837                 ltc >>= 4;
4838                 minutes = ltc & 0xF;
4839                 ltc >>= 4;
4840                 minutes += (ltc & 0x7) * 10;
4841                 ltc >>= 4;
4842                 hours = ltc & 0xF;
4843                 ltc >>= 4;
4844                 hours += (ltc & 0x3) * 10;
4845                 snd_iprintf(buffer,
4846                         "  LTC In: %02d:%02d:%02d:%02d\n",
4847                         hours, minutes, seconds, frames);
4848
4849         } else {
4850                 snd_iprintf(buffer, "No TCO module detected.\n");
4851         }
4852 }
4853
4854 static void
4855 snd_hdspm_proc_read_madi(struct snd_info_entry *entry,
4856                          struct snd_info_buffer *buffer)
4857 {
4858         struct hdspm *hdspm = entry->private_data;
4859         unsigned int status, status2;
4860
4861         char *pref_sync_ref;
4862         char *autosync_ref;
4863         char *system_clock_mode;
4864         int x, x2;
4865
4866         status = hdspm_read(hdspm, HDSPM_statusRegister);
4867         status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
4868
4869         snd_iprintf(buffer, "%s (Card #%d) Rev.%x Status2first3bits: %x\n",
4870                         hdspm->card_name, hdspm->card->number + 1,
4871                         hdspm->firmware_rev,
4872                         (status2 & HDSPM_version0) |
4873                         (status2 & HDSPM_version1) | (status2 &
4874                                 HDSPM_version2));
4875
4876         snd_iprintf(buffer, "HW Serial: 0x%06x%06x\n",
4877                         (hdspm_read(hdspm, HDSPM_midiStatusIn1)>>8) & 0xFFFFFF,
4878                         hdspm->serial);
4879
4880         snd_iprintf(buffer, "IRQ: %d Registers bus: 0x%lx VM: 0x%lx\n",
4881                         hdspm->irq, hdspm->port, (unsigned long)hdspm->iobase);
4882
4883         snd_iprintf(buffer, "--- System ---\n");
4884
4885         snd_iprintf(buffer,
4886                 "IRQ Pending: Audio=%d, MIDI0=%d, MIDI1=%d, IRQcount=%d\n",
4887                 status & HDSPM_audioIRQPending,
4888                 (status & HDSPM_midi0IRQPending) ? 1 : 0,
4889                 (status & HDSPM_midi1IRQPending) ? 1 : 0,
4890                 hdspm->irq_count);
4891         snd_iprintf(buffer,
4892                 "HW pointer: id = %d, rawptr = %d (%d->%d) "
4893                 "estimated= %ld (bytes)\n",
4894                 ((status & HDSPM_BufferID) ? 1 : 0),
4895                 (status & HDSPM_BufferPositionMask),
4896                 (status & HDSPM_BufferPositionMask) %
4897                 (2 * (int)hdspm->period_bytes),
4898                 ((status & HDSPM_BufferPositionMask) - 64) %
4899                 (2 * (int)hdspm->period_bytes),
4900                 (long) hdspm_hw_pointer(hdspm) * 4);
4901
4902         snd_iprintf(buffer,
4903                 "MIDI FIFO: Out1=0x%x, Out2=0x%x, In1=0x%x, In2=0x%x \n",
4904                 hdspm_read(hdspm, HDSPM_midiStatusOut0) & 0xFF,
4905                 hdspm_read(hdspm, HDSPM_midiStatusOut1) & 0xFF,
4906                 hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xFF,
4907                 hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xFF);
4908         snd_iprintf(buffer,
4909                 "MIDIoverMADI FIFO: In=0x%x, Out=0x%x \n",
4910                 hdspm_read(hdspm, HDSPM_midiStatusIn2) & 0xFF,
4911                 hdspm_read(hdspm, HDSPM_midiStatusOut2) & 0xFF);
4912         snd_iprintf(buffer,
4913                 "Register: ctrl1=0x%x, ctrl2=0x%x, status1=0x%x, "
4914                 "status2=0x%x\n",
4915                 hdspm->control_register, hdspm->control2_register,
4916                 status, status2);
4917
4918
4919         snd_iprintf(buffer, "--- Settings ---\n");
4920
4921         x = hdspm_get_latency(hdspm);
4922
4923         snd_iprintf(buffer,
4924                 "Size (Latency): %d samples (2 periods of %lu bytes)\n",
4925                 x, (unsigned long) hdspm->period_bytes);
4926
4927         snd_iprintf(buffer, "Line out: %s\n",
4928                 (hdspm->control_register & HDSPM_LineOut) ? "on " : "off");
4929
4930         snd_iprintf(buffer,
4931                 "ClearTrackMarker = %s, Transmit in %s Channel Mode, "
4932                 "Auto Input %s\n",
4933                 (hdspm->control_register & HDSPM_clr_tms) ? "on" : "off",
4934                 (hdspm->control_register & HDSPM_TX_64ch) ? "64" : "56",
4935                 (hdspm->control_register & HDSPM_AutoInp) ? "on" : "off");
4936
4937
4938         if (!(hdspm->control_register & HDSPM_ClockModeMaster))
4939                 system_clock_mode = "AutoSync";
4940         else
4941                 system_clock_mode = "Master";
4942         snd_iprintf(buffer, "AutoSync Reference: %s\n", system_clock_mode);
4943
4944         switch (hdspm_pref_sync_ref(hdspm)) {
4945         case HDSPM_SYNC_FROM_WORD:
4946                 pref_sync_ref = "Word Clock";
4947                 break;
4948         case HDSPM_SYNC_FROM_MADI:
4949                 pref_sync_ref = "MADI Sync";
4950                 break;
4951         case HDSPM_SYNC_FROM_TCO:
4952                 pref_sync_ref = "TCO";
4953                 break;
4954         case HDSPM_SYNC_FROM_SYNC_IN:
4955                 pref_sync_ref = "Sync In";
4956                 break;
4957         default:
4958                 pref_sync_ref = "XXXX Clock";
4959                 break;
4960         }
4961         snd_iprintf(buffer, "Preferred Sync Reference: %s\n",
4962                         pref_sync_ref);
4963
4964         snd_iprintf(buffer, "System Clock Frequency: %d\n",
4965                         hdspm->system_sample_rate);
4966
4967
4968         snd_iprintf(buffer, "--- Status:\n");
4969
4970         x = status & HDSPM_madiSync;
4971         x2 = status2 & HDSPM_wcSync;
4972
4973         snd_iprintf(buffer, "Inputs MADI=%s, WordClock=%s\n",
4974                         (status & HDSPM_madiLock) ? (x ? "Sync" : "Lock") :
4975                         "NoLock",
4976                         (status2 & HDSPM_wcLock) ? (x2 ? "Sync" : "Lock") :
4977                         "NoLock");
4978
4979         switch (hdspm_autosync_ref(hdspm)) {
4980         case HDSPM_AUTOSYNC_FROM_SYNC_IN:
4981                 autosync_ref = "Sync In";
4982                 break;
4983         case HDSPM_AUTOSYNC_FROM_TCO:
4984                 autosync_ref = "TCO";
4985                 break;
4986         case HDSPM_AUTOSYNC_FROM_WORD:
4987                 autosync_ref = "Word Clock";
4988                 break;
4989         case HDSPM_AUTOSYNC_FROM_MADI:
4990                 autosync_ref = "MADI Sync";
4991                 break;
4992         case HDSPM_AUTOSYNC_FROM_NONE:
4993                 autosync_ref = "Input not valid";
4994                 break;
4995         default:
4996                 autosync_ref = "---";
4997                 break;
4998         }
4999         snd_iprintf(buffer,
5000                 "AutoSync: Reference= %s, Freq=%d (MADI = %d, Word = %d)\n",
5001                 autosync_ref, hdspm_external_sample_rate(hdspm),
5002                 (status & HDSPM_madiFreqMask) >> 22,
5003                 (status2 & HDSPM_wcFreqMask) >> 5);
5004
5005         snd_iprintf(buffer, "Input: %s, Mode=%s\n",
5006                 (status & HDSPM_AB_int) ? "Coax" : "Optical",
5007                 (status & HDSPM_RX_64ch) ? "64 channels" :
5008                 "56 channels");
5009
5010         /* call readout function for TCO specific status */
5011         snd_hdspm_proc_read_tco(entry, buffer);
5012
5013         snd_iprintf(buffer, "\n");
5014 }
5015
5016 static void
5017 snd_hdspm_proc_read_aes32(struct snd_info_entry * entry,
5018                           struct snd_info_buffer *buffer)
5019 {
5020         struct hdspm *hdspm = entry->private_data;
5021         unsigned int status;
5022         unsigned int status2;
5023         unsigned int timecode;
5024         unsigned int wcLock, wcSync;
5025         int pref_syncref;
5026         char *autosync_ref;
5027         int x;
5028
5029         status = hdspm_read(hdspm, HDSPM_statusRegister);
5030         status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
5031         timecode = hdspm_read(hdspm, HDSPM_timecodeRegister);
5032
5033         snd_iprintf(buffer, "%s (Card #%d) Rev.%x\n",
5034                     hdspm->card_name, hdspm->card->number + 1,
5035                     hdspm->firmware_rev);
5036
5037         snd_iprintf(buffer, "IRQ: %d Registers bus: 0x%lx VM: 0x%lx\n",
5038                     hdspm->irq, hdspm->port, (unsigned long)hdspm->iobase);
5039
5040         snd_iprintf(buffer, "--- System ---\n");
5041
5042         snd_iprintf(buffer,
5043                     "IRQ Pending: Audio=%d, MIDI0=%d, MIDI1=%d, IRQcount=%d\n",
5044                     status & HDSPM_audioIRQPending,
5045                     (status & HDSPM_midi0IRQPending) ? 1 : 0,
5046                     (status & HDSPM_midi1IRQPending) ? 1 : 0,
5047                     hdspm->irq_count);
5048         snd_iprintf(buffer,
5049                     "HW pointer: id = %d, rawptr = %d (%d->%d) "
5050                     "estimated= %ld (bytes)\n",
5051                     ((status & HDSPM_BufferID) ? 1 : 0),
5052                     (status & HDSPM_BufferPositionMask),
5053                     (status & HDSPM_BufferPositionMask) %
5054                     (2 * (int)hdspm->period_bytes),
5055                     ((status & HDSPM_BufferPositionMask) - 64) %
5056                     (2 * (int)hdspm->period_bytes),
5057                     (long) hdspm_hw_pointer(hdspm) * 4);
5058
5059         snd_iprintf(buffer,
5060                     "MIDI FIFO: Out1=0x%x, Out2=0x%x, In1=0x%x, In2=0x%x \n",
5061                     hdspm_read(hdspm, HDSPM_midiStatusOut0) & 0xFF,
5062                     hdspm_read(hdspm, HDSPM_midiStatusOut1) & 0xFF,
5063                     hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xFF,
5064                     hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xFF);
5065         snd_iprintf(buffer,
5066                     "MIDIoverMADI FIFO: In=0x%x, Out=0x%x \n",
5067                     hdspm_read(hdspm, HDSPM_midiStatusIn2) & 0xFF,
5068                     hdspm_read(hdspm, HDSPM_midiStatusOut2) & 0xFF);
5069         snd_iprintf(buffer,
5070                     "Register: ctrl1=0x%x, ctrl2=0x%x, status1=0x%x, "
5071                     "status2=0x%x\n",
5072                     hdspm->control_register, hdspm->control2_register,
5073                     status, status2);
5074
5075         snd_iprintf(buffer, "--- Settings ---\n");
5076
5077         x = hdspm_get_latency(hdspm);
5078
5079         snd_iprintf(buffer,
5080                     "Size (Latency): %d samples (2 periods of %lu bytes)\n",
5081                     x, (unsigned long) hdspm->period_bytes);
5082
5083         snd_iprintf(buffer, "Line out: %s\n",
5084                     (hdspm->
5085                      control_register & HDSPM_LineOut) ? "on " : "off");
5086
5087         snd_iprintf(buffer,
5088                     "ClearTrackMarker %s, Emphasis %s, Dolby %s\n",
5089                     (hdspm->
5090                      control_register & HDSPM_clr_tms) ? "on" : "off",
5091                     (hdspm->
5092                      control_register & HDSPM_Emphasis) ? "on" : "off",
5093                     (hdspm->
5094                      control_register & HDSPM_Dolby) ? "on" : "off");
5095
5096
5097         pref_syncref = hdspm_pref_sync_ref(hdspm);
5098         if (pref_syncref == 0)
5099                 snd_iprintf(buffer, "Preferred Sync Reference: Word Clock\n");
5100         else
5101                 snd_iprintf(buffer, "Preferred Sync Reference: AES%d\n",
5102                                 pref_syncref);
5103
5104         snd_iprintf(buffer, "System Clock Frequency: %d\n",
5105                     hdspm->system_sample_rate);
5106
5107         snd_iprintf(buffer, "Double speed: %s\n",
5108                         hdspm->control_register & HDSPM_DS_DoubleWire?
5109                         "Double wire" : "Single wire");
5110         snd_iprintf(buffer, "Quad speed: %s\n",
5111                         hdspm->control_register & HDSPM_QS_DoubleWire?
5112                         "Double wire" :
5113                         hdspm->control_register & HDSPM_QS_QuadWire?
5114                         "Quad wire" : "Single wire");
5115
5116         snd_iprintf(buffer, "--- Status:\n");
5117
5118         wcLock = status & HDSPM_AES32_wcLock;
5119         wcSync = wcLock && (status & HDSPM_AES32_wcSync);
5120
5121         snd_iprintf(buffer, "Word: %s  Frequency: %d\n",
5122                     (wcLock) ? (wcSync ? "Sync   " : "Lock   ") : "No Lock",
5123                     HDSPM_bit2freq((status >> HDSPM_AES32_wcFreq_bit) & 0xF));
5124
5125         for (x = 0; x < 8; x++) {
5126                 snd_iprintf(buffer, "AES%d: %s  Frequency: %d\n",
5127                             x+1,
5128                             (status2 & (HDSPM_LockAES >> x)) ?
5129                             "Sync   " : "No Lock",
5130                             HDSPM_bit2freq((timecode >> (4*x)) & 0xF));
5131         }
5132
5133         switch (hdspm_autosync_ref(hdspm)) {
5134         case HDSPM_AES32_AUTOSYNC_FROM_NONE:
5135                 autosync_ref = "None"; break;
5136         case HDSPM_AES32_AUTOSYNC_FROM_WORD:
5137                 autosync_ref = "Word Clock"; break;
5138         case HDSPM_AES32_AUTOSYNC_FROM_AES1:
5139                 autosync_ref = "AES1"; break;
5140         case HDSPM_AES32_AUTOSYNC_FROM_AES2:
5141                 autosync_ref = "AES2"; break;
5142         case HDSPM_AES32_AUTOSYNC_FROM_AES3:
5143                 autosync_ref = "AES3"; break;
5144         case HDSPM_AES32_AUTOSYNC_FROM_AES4:
5145                 autosync_ref = "AES4"; break;
5146         case HDSPM_AES32_AUTOSYNC_FROM_AES5:
5147                 autosync_ref = "AES5"; break;
5148         case HDSPM_AES32_AUTOSYNC_FROM_AES6:
5149                 autosync_ref = "AES6"; break;
5150         case HDSPM_AES32_AUTOSYNC_FROM_AES7:
5151                 autosync_ref = "AES7"; break;
5152         case HDSPM_AES32_AUTOSYNC_FROM_AES8:
5153                 autosync_ref = "AES8"; break;
5154         case HDSPM_AES32_AUTOSYNC_FROM_TCO:
5155                 autosync_ref = "TCO"; break;
5156         case HDSPM_AES32_AUTOSYNC_FROM_SYNC_IN:
5157                 autosync_ref = "Sync In"; break;
5158         default:
5159                 autosync_ref = "---"; break;
5160         }
5161         snd_iprintf(buffer, "AutoSync ref = %s\n", autosync_ref);
5162
5163         /* call readout function for TCO specific status */
5164         snd_hdspm_proc_read_tco(entry, buffer);
5165
5166         snd_iprintf(buffer, "\n");
5167 }
5168
5169 static void
5170 snd_hdspm_proc_read_raydat(struct snd_info_entry *entry,
5171                          struct snd_info_buffer *buffer)
5172 {
5173         struct hdspm *hdspm = entry->private_data;
5174         unsigned int status1, status2, status3, i;
5175         unsigned int lock, sync;
5176
5177         status1 = hdspm_read(hdspm, HDSPM_RD_STATUS_1); /* s1 */
5178         status2 = hdspm_read(hdspm, HDSPM_RD_STATUS_2); /* freq */
5179         status3 = hdspm_read(hdspm, HDSPM_RD_STATUS_3); /* s2 */
5180
5181         snd_iprintf(buffer, "STATUS1: 0x%08x\n", status1);
5182         snd_iprintf(buffer, "STATUS2: 0x%08x\n", status2);
5183         snd_iprintf(buffer, "STATUS3: 0x%08x\n", status3);
5184
5185
5186         snd_iprintf(buffer, "\n*** CLOCK MODE\n\n");
5187
5188         snd_iprintf(buffer, "Clock mode      : %s\n",
5189                 (hdspm_system_clock_mode(hdspm) == 0) ? "master" : "slave");
5190         snd_iprintf(buffer, "System frequency: %d Hz\n",
5191                 hdspm_get_system_sample_rate(hdspm));
5192
5193         snd_iprintf(buffer, "\n*** INPUT STATUS\n\n");
5194
5195         lock = 0x1;
5196         sync = 0x100;
5197
5198         for (i = 0; i < 8; i++) {
5199                 snd_iprintf(buffer, "s1_input %d: Lock %d, Sync %d, Freq %s\n",
5200                                 i,
5201                                 (status1 & lock) ? 1 : 0,
5202                                 (status1 & sync) ? 1 : 0,
5203                                 texts_freq[(status2 >> (i * 4)) & 0xF]);
5204
5205                 lock = lock<<1;
5206                 sync = sync<<1;
5207         }
5208
5209         snd_iprintf(buffer, "WC input: Lock %d, Sync %d, Freq %s\n",
5210                         (status1 & 0x1000000) ? 1 : 0,
5211                         (status1 & 0x2000000) ? 1 : 0,
5212                         texts_freq[(status1 >> 16) & 0xF]);
5213
5214         snd_iprintf(buffer, "TCO input: Lock %d, Sync %d, Freq %s\n",
5215                         (status1 & 0x4000000) ? 1 : 0,
5216                         (status1 & 0x8000000) ? 1 : 0,
5217                         texts_freq[(status1 >> 20) & 0xF]);
5218
5219         snd_iprintf(buffer, "SYNC IN: Lock %d, Sync %d, Freq %s\n",
5220                         (status3 & 0x400) ? 1 : 0,
5221                         (status3 & 0x800) ? 1 : 0,
5222                         texts_freq[(status2 >> 12) & 0xF]);
5223
5224 }
5225
5226 #ifdef CONFIG_SND_DEBUG
5227 static void
5228 snd_hdspm_proc_read_debug(struct snd_info_entry *entry,
5229                           struct snd_info_buffer *buffer)
5230 {
5231         struct hdspm *hdspm = entry->private_data;
5232
5233         int j,i;
5234
5235         for (i = 0; i < 256 /* 1024*64 */; i += j) {
5236                 snd_iprintf(buffer, "0x%08X: ", i);
5237                 for (j = 0; j < 16; j += 4)
5238                         snd_iprintf(buffer, "%08X ", hdspm_read(hdspm, i + j));
5239                 snd_iprintf(buffer, "\n");
5240         }
5241 }
5242 #endif
5243
5244
5245 static void snd_hdspm_proc_ports_in(struct snd_info_entry *entry,
5246                           struct snd_info_buffer *buffer)
5247 {
5248         struct hdspm *hdspm = entry->private_data;
5249         int i;
5250
5251         snd_iprintf(buffer, "# generated by hdspm\n");
5252
5253         for (i = 0; i < hdspm->max_channels_in; i++) {
5254                 snd_iprintf(buffer, "%d=%s\n", i+1, hdspm->port_names_in[i]);
5255         }
5256 }
5257
5258 static void snd_hdspm_proc_ports_out(struct snd_info_entry *entry,
5259                           struct snd_info_buffer *buffer)
5260 {
5261         struct hdspm *hdspm = entry->private_data;
5262         int i;
5263
5264         snd_iprintf(buffer, "# generated by hdspm\n");
5265
5266         for (i = 0; i < hdspm->max_channels_out; i++) {
5267                 snd_iprintf(buffer, "%d=%s\n", i+1, hdspm->port_names_out[i]);
5268         }
5269 }
5270
5271
5272 static void snd_hdspm_proc_init(struct hdspm *hdspm)
5273 {
5274         void (*read)(struct snd_info_entry *, struct snd_info_buffer *) = NULL;
5275
5276         switch (hdspm->io_type) {
5277         case AES32:
5278                 read = snd_hdspm_proc_read_aes32;
5279                 break;
5280         case MADI:
5281                 read = snd_hdspm_proc_read_madi;
5282                 break;
5283         case MADIface:
5284                 /* read = snd_hdspm_proc_read_madiface; */
5285                 break;
5286         case RayDAT:
5287                 read = snd_hdspm_proc_read_raydat;
5288                 break;
5289         case AIO:
5290                 break;
5291         }
5292
5293         snd_card_ro_proc_new(hdspm->card, "hdspm", hdspm, read);
5294         snd_card_ro_proc_new(hdspm->card, "ports.in", hdspm,
5295                              snd_hdspm_proc_ports_in);
5296         snd_card_ro_proc_new(hdspm->card, "ports.out", hdspm,
5297                              snd_hdspm_proc_ports_out);
5298
5299 #ifdef CONFIG_SND_DEBUG
5300         /* debug file to read all hdspm registers */
5301         snd_card_ro_proc_new(hdspm->card, "debug", hdspm,
5302                              snd_hdspm_proc_read_debug);
5303 #endif
5304 }
5305
5306 /*------------------------------------------------------------
5307    hdspm intitialize
5308  ------------------------------------------------------------*/
5309
5310 static int snd_hdspm_set_defaults(struct hdspm * hdspm)
5311 {
5312         /* ASSUMPTION: hdspm->lock is either held, or there is no need to
5313            hold it (e.g. during module initialization).
5314            */
5315
5316         /* set defaults:       */
5317
5318         hdspm->settings_register = 0;
5319
5320         switch (hdspm->io_type) {
5321         case MADI:
5322         case MADIface:
5323                 hdspm->control_register =
5324                         0x2 + 0x8 + 0x10 + 0x80 + 0x400 + 0x4000 + 0x1000000;
5325                 break;
5326
5327         case RayDAT:
5328         case AIO:
5329                 hdspm->settings_register = 0x1 + 0x1000;
5330                 /* Magic values are: LAT_0, LAT_2, Master, freq1, tx64ch, inp_0,
5331                  * line_out */
5332                 hdspm->control_register =
5333                         0x2 + 0x8 + 0x10 + 0x80 + 0x400 + 0x4000 + 0x1000000;
5334                 break;
5335
5336         case AES32:
5337                 hdspm->control_register =
5338                         HDSPM_ClockModeMaster | /* Master Clock Mode on */
5339                         hdspm_encode_latency(7) | /* latency max=8192samples */
5340                         HDSPM_SyncRef0 |        /* AES1 is syncclock */
5341                         HDSPM_LineOut | /* Analog output in */
5342                         HDSPM_Professional;  /* Professional mode */
5343                 break;
5344         }
5345
5346         hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
5347
5348         if (AES32 == hdspm->io_type) {
5349                 /* No control2 register for AES32 */
5350 #ifdef SNDRV_BIG_ENDIAN
5351                 hdspm->control2_register = HDSPM_BIGENDIAN_MODE;
5352 #else
5353                 hdspm->control2_register = 0;
5354 #endif
5355
5356                 hdspm_write(hdspm, HDSPM_control2Reg, hdspm->control2_register);
5357         }
5358         hdspm_compute_period_size(hdspm);
5359
5360         /* silence everything */
5361
5362         all_in_all_mixer(hdspm, 0 * UNITY_GAIN);
5363
5364         if (hdspm_is_raydat_or_aio(hdspm))
5365                 hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register);
5366
5367         /* set a default rate so that the channel map is set up. */
5368         hdspm_set_rate(hdspm, 48000, 1);
5369
5370         return 0;
5371 }
5372
5373
5374 /*------------------------------------------------------------
5375    interrupt
5376  ------------------------------------------------------------*/
5377
5378 static irqreturn_t snd_hdspm_interrupt(int irq, void *dev_id)
5379 {
5380         struct hdspm *hdspm = (struct hdspm *) dev_id;
5381         unsigned int status;
5382         int i, audio, midi, schedule = 0;
5383         /* cycles_t now; */
5384
5385         status = hdspm_read(hdspm, HDSPM_statusRegister);
5386
5387         audio = status & HDSPM_audioIRQPending;
5388         midi = status & (HDSPM_midi0IRQPending | HDSPM_midi1IRQPending |
5389                         HDSPM_midi2IRQPending | HDSPM_midi3IRQPending);
5390
5391         /* now = get_cycles(); */
5392         /*
5393          *   LAT_2..LAT_0 period  counter (win)  counter (mac)
5394          *          6       4096   ~256053425     ~514672358
5395          *          5       2048   ~128024983     ~257373821
5396          *          4       1024    ~64023706     ~128718089
5397          *          3        512    ~32005945      ~64385999
5398          *          2        256    ~16003039      ~32260176
5399          *          1        128     ~7998738      ~16194507
5400          *          0         64     ~3998231       ~8191558
5401          */
5402         /*
5403           dev_info(hdspm->card->dev, "snd_hdspm_interrupt %llu @ %llx\n",
5404            now-hdspm->last_interrupt, status & 0xFFC0);
5405            hdspm->last_interrupt = now;
5406         */
5407
5408         if (!audio && !midi)
5409                 return IRQ_NONE;
5410
5411         hdspm_write(hdspm, HDSPM_interruptConfirmation, 0);
5412         hdspm->irq_count++;
5413
5414
5415         if (audio) {
5416                 if (hdspm->capture_substream)
5417                         snd_pcm_period_elapsed(hdspm->capture_substream);
5418
5419                 if (hdspm->playback_substream)
5420                         snd_pcm_period_elapsed(hdspm->playback_substream);
5421         }
5422
5423         if (midi) {
5424                 i = 0;
5425                 while (i < hdspm->midiPorts) {
5426                         if ((hdspm_read(hdspm,
5427                                 hdspm->midi[i].statusIn) & 0xff) &&
5428                                         (status & hdspm->midi[i].irq)) {
5429                                 /* we disable interrupts for this input until
5430                                  * processing is done
5431                                  */
5432                                 hdspm->control_register &= ~hdspm->midi[i].ie;
5433                                 hdspm_write(hdspm, HDSPM_controlRegister,
5434                                                 hdspm->control_register);
5435                                 hdspm->midi[i].pending = 1;
5436                                 schedule = 1;
5437                         }
5438
5439                         i++;
5440                 }
5441
5442                 if (schedule)
5443                         queue_work(system_highpri_wq, &hdspm->midi_work);
5444         }
5445
5446         return IRQ_HANDLED;
5447 }
5448
5449 /*------------------------------------------------------------
5450    pcm interface
5451   ------------------------------------------------------------*/
5452
5453
5454 static snd_pcm_uframes_t snd_hdspm_hw_pointer(struct snd_pcm_substream
5455                                               *substream)
5456 {
5457         struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5458         return hdspm_hw_pointer(hdspm);
5459 }
5460
5461
5462 static int snd_hdspm_reset(struct snd_pcm_substream *substream)
5463 {
5464         struct snd_pcm_runtime *runtime = substream->runtime;
5465         struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5466         struct snd_pcm_substream *other;
5467
5468         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
5469                 other = hdspm->capture_substream;
5470         else
5471                 other = hdspm->playback_substream;
5472
5473         if (hdspm->running)
5474                 runtime->status->hw_ptr = hdspm_hw_pointer(hdspm);
5475         else
5476                 runtime->status->hw_ptr = 0;
5477         if (other) {
5478                 struct snd_pcm_substream *s;
5479                 struct snd_pcm_runtime *oruntime = other->runtime;
5480                 snd_pcm_group_for_each_entry(s, substream) {
5481                         if (s == other) {
5482                                 oruntime->status->hw_ptr =
5483                                         runtime->status->hw_ptr;
5484                                 break;
5485                         }
5486                 }
5487         }
5488         return 0;
5489 }
5490
5491 static int snd_hdspm_hw_params(struct snd_pcm_substream *substream,
5492                                struct snd_pcm_hw_params *params)
5493 {
5494         struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5495         int err;
5496         int i;
5497         pid_t this_pid;
5498         pid_t other_pid;
5499
5500         spin_lock_irq(&hdspm->lock);
5501
5502         if (substream->pstr->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5503                 this_pid = hdspm->playback_pid;
5504                 other_pid = hdspm->capture_pid;
5505         } else {
5506                 this_pid = hdspm->capture_pid;
5507                 other_pid = hdspm->playback_pid;
5508         }
5509
5510         if (other_pid > 0 && this_pid != other_pid) {
5511
5512                 /* The other stream is open, and not by the same
5513                    task as this one. Make sure that the parameters
5514                    that matter are the same.
5515                    */
5516
5517                 if (params_rate(params) != hdspm->system_sample_rate) {
5518                         spin_unlock_irq(&hdspm->lock);
5519                         _snd_pcm_hw_param_setempty(params,
5520                                         SNDRV_PCM_HW_PARAM_RATE);
5521                         return -EBUSY;
5522                 }
5523
5524                 if (params_period_size(params) != hdspm->period_bytes / 4) {
5525                         spin_unlock_irq(&hdspm->lock);
5526                         _snd_pcm_hw_param_setempty(params,
5527                                         SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
5528                         return -EBUSY;
5529                 }
5530
5531         }
5532         /* We're fine. */
5533         spin_unlock_irq(&hdspm->lock);
5534
5535         /* how to make sure that the rate matches an externally-set one ?   */
5536
5537         spin_lock_irq(&hdspm->lock);
5538         err = hdspm_set_rate(hdspm, params_rate(params), 0);
5539         if (err < 0) {
5540                 dev_info(hdspm->card->dev, "err on hdspm_set_rate: %d\n", err);
5541                 spin_unlock_irq(&hdspm->lock);
5542                 _snd_pcm_hw_param_setempty(params,
5543                                 SNDRV_PCM_HW_PARAM_RATE);
5544                 return err;
5545         }
5546         spin_unlock_irq(&hdspm->lock);
5547
5548         err = hdspm_set_interrupt_interval(hdspm,
5549                         params_period_size(params));
5550         if (err < 0) {
5551                 dev_info(hdspm->card->dev,
5552                          "err on hdspm_set_interrupt_interval: %d\n", err);
5553                 _snd_pcm_hw_param_setempty(params,
5554                                 SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
5555                 return err;
5556         }
5557
5558         /* Memory allocation, takashi's method, dont know if we should
5559          * spinlock
5560          */
5561         /* malloc all buffer even if not enabled to get sure */
5562         /* Update for MADI rev 204: we need to allocate for all channels,
5563          * otherwise it doesn't work at 96kHz */
5564
5565         err =
5566                 snd_pcm_lib_malloc_pages(substream, HDSPM_DMA_AREA_BYTES);
5567         if (err < 0) {
5568                 dev_info(hdspm->card->dev,
5569                          "err on snd_pcm_lib_malloc_pages: %d\n", err);
5570                 return err;
5571         }
5572
5573         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5574
5575                 for (i = 0; i < params_channels(params); ++i) {
5576                         int c = hdspm->channel_map_out[i];
5577
5578                         if (c < 0)
5579                                 continue;      /* just make sure */
5580                         hdspm_set_channel_dma_addr(hdspm, substream,
5581                                                    HDSPM_pageAddressBufferOut,
5582                                                    c);
5583                         snd_hdspm_enable_out(hdspm, c, 1);
5584                 }
5585
5586                 hdspm->playback_buffer =
5587                         (unsigned char *) substream->runtime->dma_area;
5588                 dev_dbg(hdspm->card->dev,
5589                         "Allocated sample buffer for playback at %p\n",
5590                                 hdspm->playback_buffer);
5591         } else {
5592                 for (i = 0; i < params_channels(params); ++i) {
5593                         int c = hdspm->channel_map_in[i];
5594
5595                         if (c < 0)
5596                                 continue;
5597                         hdspm_set_channel_dma_addr(hdspm, substream,
5598                                                    HDSPM_pageAddressBufferIn,
5599                                                    c);
5600                         snd_hdspm_enable_in(hdspm, c, 1);
5601                 }
5602
5603                 hdspm->capture_buffer =
5604                         (unsigned char *) substream->runtime->dma_area;
5605                 dev_dbg(hdspm->card->dev,
5606                         "Allocated sample buffer for capture at %p\n",
5607                                 hdspm->capture_buffer);
5608         }
5609
5610         /*
5611            dev_dbg(hdspm->card->dev,
5612            "Allocated sample buffer for %s at 0x%08X\n",
5613            substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
5614            "playback" : "capture",
5615            snd_pcm_sgbuf_get_addr(substream, 0));
5616            */
5617         /*
5618            dev_dbg(hdspm->card->dev,
5619            "set_hwparams: %s %d Hz, %d channels, bs = %d\n",
5620            substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
5621            "playback" : "capture",
5622            params_rate(params), params_channels(params),
5623            params_buffer_size(params));
5624            */
5625
5626
5627         /*  For AES cards, the float format bit is the same as the
5628          *  preferred sync reference. Since we don't want to break
5629          *  sync settings, we have to skip the remaining part of this
5630          *  function.
5631          */
5632         if (hdspm->io_type == AES32) {
5633                 return 0;
5634         }
5635
5636
5637         /* Switch to native float format if requested */
5638         if (SNDRV_PCM_FORMAT_FLOAT_LE == params_format(params)) {
5639                 if (!(hdspm->control_register & HDSPe_FLOAT_FORMAT))
5640                         dev_info(hdspm->card->dev,
5641                                  "Switching to native 32bit LE float format.\n");
5642
5643                 hdspm->control_register |= HDSPe_FLOAT_FORMAT;
5644         } else if (SNDRV_PCM_FORMAT_S32_LE == params_format(params)) {
5645                 if (hdspm->control_register & HDSPe_FLOAT_FORMAT)
5646                         dev_info(hdspm->card->dev,
5647                                  "Switching to native 32bit LE integer format.\n");
5648
5649                 hdspm->control_register &= ~HDSPe_FLOAT_FORMAT;
5650         }
5651         hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
5652
5653         return 0;
5654 }
5655
5656 static int snd_hdspm_hw_free(struct snd_pcm_substream *substream)
5657 {
5658         int i;
5659         struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5660
5661         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5662                 /* Just disable all channels. The saving when disabling a */
5663                 /* smaller set is not worth the trouble. */
5664                 for (i = 0; i < HDSPM_MAX_CHANNELS; ++i)
5665                         snd_hdspm_enable_out(hdspm, i, 0);
5666
5667                 hdspm->playback_buffer = NULL;
5668         } else {
5669                 for (i = 0; i < HDSPM_MAX_CHANNELS; ++i)
5670                         snd_hdspm_enable_in(hdspm, i, 0);
5671
5672                 hdspm->capture_buffer = NULL;
5673         }
5674
5675         snd_pcm_lib_free_pages(substream);
5676
5677         return 0;
5678 }
5679
5680
5681 static int snd_hdspm_channel_info(struct snd_pcm_substream *substream,
5682                 struct snd_pcm_channel_info *info)
5683 {
5684         struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5685         unsigned int channel = info->channel;
5686
5687         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5688                 if (snd_BUG_ON(channel >= hdspm->max_channels_out)) {
5689                         dev_info(hdspm->card->dev,
5690                                  "snd_hdspm_channel_info: output channel out of range (%d)\n",
5691                                  channel);
5692                         return -EINVAL;
5693                 }
5694
5695                 channel = array_index_nospec(channel, hdspm->max_channels_out);
5696                 if (hdspm->channel_map_out[channel] < 0) {
5697                         dev_info(hdspm->card->dev,
5698                                  "snd_hdspm_channel_info: output channel %d mapped out\n",
5699                                  channel);
5700                         return -EINVAL;
5701                 }
5702
5703                 info->offset = hdspm->channel_map_out[channel] *
5704                         HDSPM_CHANNEL_BUFFER_BYTES;
5705         } else {
5706                 if (snd_BUG_ON(channel >= hdspm->max_channels_in)) {
5707                         dev_info(hdspm->card->dev,
5708                                  "snd_hdspm_channel_info: input channel out of range (%d)\n",
5709                                  channel);
5710                         return -EINVAL;
5711                 }
5712
5713                 channel = array_index_nospec(channel, hdspm->max_channels_in);
5714                 if (hdspm->channel_map_in[channel] < 0) {
5715                         dev_info(hdspm->card->dev,
5716                                  "snd_hdspm_channel_info: input channel %d mapped out\n",
5717                                  channel);
5718                         return -EINVAL;
5719                 }
5720
5721                 info->offset = hdspm->channel_map_in[channel] *
5722                         HDSPM_CHANNEL_BUFFER_BYTES;
5723         }
5724
5725         info->first = 0;
5726         info->step = 32;
5727         return 0;
5728 }
5729
5730
5731 static int snd_hdspm_ioctl(struct snd_pcm_substream *substream,
5732                 unsigned int cmd, void *arg)
5733 {
5734         switch (cmd) {
5735         case SNDRV_PCM_IOCTL1_RESET:
5736                 return snd_hdspm_reset(substream);
5737
5738         case SNDRV_PCM_IOCTL1_CHANNEL_INFO:
5739                 {
5740                         struct snd_pcm_channel_info *info = arg;
5741                         return snd_hdspm_channel_info(substream, info);
5742                 }
5743         default:
5744                 break;
5745         }
5746
5747         return snd_pcm_lib_ioctl(substream, cmd, arg);
5748 }
5749
5750 static int snd_hdspm_trigger(struct snd_pcm_substream *substream, int cmd)
5751 {
5752         struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5753         struct snd_pcm_substream *other;
5754         int running;
5755
5756         spin_lock(&hdspm->lock);
5757         running = hdspm->running;
5758         switch (cmd) {
5759         case SNDRV_PCM_TRIGGER_START:
5760                 running |= 1 << substream->stream;
5761                 break;
5762         case SNDRV_PCM_TRIGGER_STOP:
5763                 running &= ~(1 << substream->stream);
5764                 break;
5765         default:
5766                 snd_BUG();
5767                 spin_unlock(&hdspm->lock);
5768                 return -EINVAL;
5769         }
5770         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
5771                 other = hdspm->capture_substream;
5772         else
5773                 other = hdspm->playback_substream;
5774
5775         if (other) {
5776                 struct snd_pcm_substream *s;
5777                 snd_pcm_group_for_each_entry(s, substream) {
5778                         if (s == other) {
5779                                 snd_pcm_trigger_done(s, substream);
5780                                 if (cmd == SNDRV_PCM_TRIGGER_START)
5781                                         running |= 1 << s->stream;
5782                                 else
5783                                         running &= ~(1 << s->stream);
5784                                 goto _ok;
5785                         }
5786                 }
5787                 if (cmd == SNDRV_PCM_TRIGGER_START) {
5788                         if (!(running & (1 << SNDRV_PCM_STREAM_PLAYBACK))
5789                                         && substream->stream ==
5790                                         SNDRV_PCM_STREAM_CAPTURE)
5791                                 hdspm_silence_playback(hdspm);
5792                 } else {
5793                         if (running &&
5794                                 substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
5795                                 hdspm_silence_playback(hdspm);
5796                 }
5797         } else {
5798                 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
5799                         hdspm_silence_playback(hdspm);
5800         }
5801 _ok:
5802         snd_pcm_trigger_done(substream, substream);
5803         if (!hdspm->running && running)
5804                 hdspm_start_audio(hdspm);
5805         else if (hdspm->running && !running)
5806                 hdspm_stop_audio(hdspm);
5807         hdspm->running = running;
5808         spin_unlock(&hdspm->lock);
5809
5810         return 0;
5811 }
5812
5813 static int snd_hdspm_prepare(struct snd_pcm_substream *substream)
5814 {
5815         return 0;
5816 }
5817
5818 static const struct snd_pcm_hardware snd_hdspm_playback_subinfo = {
5819         .info = (SNDRV_PCM_INFO_MMAP |
5820                  SNDRV_PCM_INFO_MMAP_VALID |
5821                  SNDRV_PCM_INFO_NONINTERLEAVED |
5822                  SNDRV_PCM_INFO_SYNC_START | SNDRV_PCM_INFO_DOUBLE),
5823         .formats = SNDRV_PCM_FMTBIT_S32_LE,
5824         .rates = (SNDRV_PCM_RATE_32000 |
5825                   SNDRV_PCM_RATE_44100 |
5826                   SNDRV_PCM_RATE_48000 |
5827                   SNDRV_PCM_RATE_64000 |
5828                   SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 |
5829                   SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000 ),
5830         .rate_min = 32000,
5831         .rate_max = 192000,
5832         .channels_min = 1,
5833         .channels_max = HDSPM_MAX_CHANNELS,
5834         .buffer_bytes_max =
5835             HDSPM_CHANNEL_BUFFER_BYTES * HDSPM_MAX_CHANNELS,
5836         .period_bytes_min = (32 * 4),
5837         .period_bytes_max = (8192 * 4) * HDSPM_MAX_CHANNELS,
5838         .periods_min = 2,
5839         .periods_max = 512,
5840         .fifo_size = 0
5841 };
5842
5843 static const struct snd_pcm_hardware snd_hdspm_capture_subinfo = {
5844         .info = (SNDRV_PCM_INFO_MMAP |
5845                  SNDRV_PCM_INFO_MMAP_VALID |
5846                  SNDRV_PCM_INFO_NONINTERLEAVED |
5847                  SNDRV_PCM_INFO_SYNC_START),
5848         .formats = SNDRV_PCM_FMTBIT_S32_LE,
5849         .rates = (SNDRV_PCM_RATE_32000 |
5850                   SNDRV_PCM_RATE_44100 |
5851                   SNDRV_PCM_RATE_48000 |
5852                   SNDRV_PCM_RATE_64000 |
5853                   SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 |
5854                   SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000),
5855         .rate_min = 32000,
5856         .rate_max = 192000,
5857         .channels_min = 1,
5858         .channels_max = HDSPM_MAX_CHANNELS,
5859         .buffer_bytes_max =
5860             HDSPM_CHANNEL_BUFFER_BYTES * HDSPM_MAX_CHANNELS,
5861         .period_bytes_min = (32 * 4),
5862         .period_bytes_max = (8192 * 4) * HDSPM_MAX_CHANNELS,
5863         .periods_min = 2,
5864         .periods_max = 512,
5865         .fifo_size = 0
5866 };
5867
5868 static int snd_hdspm_hw_rule_in_channels_rate(struct snd_pcm_hw_params *params,
5869                                            struct snd_pcm_hw_rule *rule)
5870 {
5871         struct hdspm *hdspm = rule->private;
5872         struct snd_interval *c =
5873             hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5874         struct snd_interval *r =
5875             hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5876
5877         if (r->min > 96000 && r->max <= 192000) {
5878                 struct snd_interval t = {
5879                         .min = hdspm->qs_in_channels,
5880                         .max = hdspm->qs_in_channels,
5881                         .integer = 1,
5882                 };
5883                 return snd_interval_refine(c, &t);
5884         } else if (r->min > 48000 && r->max <= 96000) {
5885                 struct snd_interval t = {
5886                         .min = hdspm->ds_in_channels,
5887                         .max = hdspm->ds_in_channels,
5888                         .integer = 1,
5889                 };
5890                 return snd_interval_refine(c, &t);
5891         } else if (r->max < 64000) {
5892                 struct snd_interval t = {
5893                         .min = hdspm->ss_in_channels,
5894                         .max = hdspm->ss_in_channels,
5895                         .integer = 1,
5896                 };
5897                 return snd_interval_refine(c, &t);
5898         }
5899
5900         return 0;
5901 }
5902
5903 static int snd_hdspm_hw_rule_out_channels_rate(struct snd_pcm_hw_params *params,
5904                                            struct snd_pcm_hw_rule * rule)
5905 {
5906         struct hdspm *hdspm = rule->private;
5907         struct snd_interval *c =
5908             hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5909         struct snd_interval *r =
5910             hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5911
5912         if (r->min > 96000 && r->max <= 192000) {
5913                 struct snd_interval t = {
5914                         .min = hdspm->qs_out_channels,
5915                         .max = hdspm->qs_out_channels,
5916                         .integer = 1,
5917                 };
5918                 return snd_interval_refine(c, &t);
5919         } else if (r->min > 48000 && r->max <= 96000) {
5920                 struct snd_interval t = {
5921                         .min = hdspm->ds_out_channels,
5922                         .max = hdspm->ds_out_channels,
5923                         .integer = 1,
5924                 };
5925                 return snd_interval_refine(c, &t);
5926         } else if (r->max < 64000) {
5927                 struct snd_interval t = {
5928                         .min = hdspm->ss_out_channels,
5929                         .max = hdspm->ss_out_channels,
5930                         .integer = 1,
5931                 };
5932                 return snd_interval_refine(c, &t);
5933         } else {
5934         }
5935         return 0;
5936 }
5937
5938 static int snd_hdspm_hw_rule_rate_in_channels(struct snd_pcm_hw_params *params,
5939                                            struct snd_pcm_hw_rule * rule)
5940 {
5941         struct hdspm *hdspm = rule->private;
5942         struct snd_interval *c =
5943             hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5944         struct snd_interval *r =
5945             hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5946
5947         if (c->min >= hdspm->ss_in_channels) {
5948                 struct snd_interval t = {
5949                         .min = 32000,
5950                         .max = 48000,
5951                         .integer = 1,
5952                 };
5953                 return snd_interval_refine(r, &t);
5954         } else if (c->max <= hdspm->qs_in_channels) {
5955                 struct snd_interval t = {
5956                         .min = 128000,
5957                         .max = 192000,
5958                         .integer = 1,
5959                 };
5960                 return snd_interval_refine(r, &t);
5961         } else if (c->max <= hdspm->ds_in_channels) {
5962                 struct snd_interval t = {
5963                         .min = 64000,
5964                         .max = 96000,
5965                         .integer = 1,
5966                 };
5967                 return snd_interval_refine(r, &t);
5968         }
5969
5970         return 0;
5971 }
5972 static int snd_hdspm_hw_rule_rate_out_channels(struct snd_pcm_hw_params *params,
5973                                            struct snd_pcm_hw_rule *rule)
5974 {
5975         struct hdspm *hdspm = rule->private;
5976         struct snd_interval *c =
5977             hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5978         struct snd_interval *r =
5979             hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5980
5981         if (c->min >= hdspm->ss_out_channels) {
5982                 struct snd_interval t = {
5983                         .min = 32000,
5984                         .max = 48000,
5985                         .integer = 1,
5986                 };
5987                 return snd_interval_refine(r, &t);
5988         } else if (c->max <= hdspm->qs_out_channels) {
5989                 struct snd_interval t = {
5990                         .min = 128000,
5991                         .max = 192000,
5992                         .integer = 1,
5993                 };
5994                 return snd_interval_refine(r, &t);
5995         } else if (c->max <= hdspm->ds_out_channels) {
5996                 struct snd_interval t = {
5997                         .min = 64000,
5998                         .max = 96000,
5999                         .integer = 1,
6000                 };
6001                 return snd_interval_refine(r, &t);
6002         }
6003
6004         return 0;
6005 }
6006
6007 static int snd_hdspm_hw_rule_in_channels(struct snd_pcm_hw_params *params,
6008                                       struct snd_pcm_hw_rule *rule)
6009 {
6010         unsigned int list[3];
6011         struct hdspm *hdspm = rule->private;
6012         struct snd_interval *c = hw_param_interval(params,
6013                         SNDRV_PCM_HW_PARAM_CHANNELS);
6014
6015         list[0] = hdspm->qs_in_channels;
6016         list[1] = hdspm->ds_in_channels;
6017         list[2] = hdspm->ss_in_channels;
6018         return snd_interval_list(c, 3, list, 0);
6019 }
6020
6021 static int snd_hdspm_hw_rule_out_channels(struct snd_pcm_hw_params *params,
6022                                       struct snd_pcm_hw_rule *rule)
6023 {
6024         unsigned int list[3];
6025         struct hdspm *hdspm = rule->private;
6026         struct snd_interval *c = hw_param_interval(params,
6027                         SNDRV_PCM_HW_PARAM_CHANNELS);
6028
6029         list[0] = hdspm->qs_out_channels;
6030         list[1] = hdspm->ds_out_channels;
6031         list[2] = hdspm->ss_out_channels;
6032         return snd_interval_list(c, 3, list, 0);
6033 }
6034
6035
6036 static const unsigned int hdspm_aes32_sample_rates[] = {
6037         32000, 44100, 48000, 64000, 88200, 96000, 128000, 176400, 192000
6038 };
6039
6040 static const struct snd_pcm_hw_constraint_list
6041 hdspm_hw_constraints_aes32_sample_rates = {
6042         .count = ARRAY_SIZE(hdspm_aes32_sample_rates),
6043         .list = hdspm_aes32_sample_rates,
6044         .mask = 0
6045 };
6046
6047 static int snd_hdspm_open(struct snd_pcm_substream *substream)
6048 {
6049         struct hdspm *hdspm = snd_pcm_substream_chip(substream);
6050         struct snd_pcm_runtime *runtime = substream->runtime;
6051         bool playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
6052
6053         spin_lock_irq(&hdspm->lock);
6054         snd_pcm_set_sync(substream);
6055         runtime->hw = (playback) ? snd_hdspm_playback_subinfo :
6056                 snd_hdspm_capture_subinfo;
6057
6058         if (playback) {
6059                 if (!hdspm->capture_substream)
6060                         hdspm_stop_audio(hdspm);
6061
6062                 hdspm->playback_pid = current->pid;
6063                 hdspm->playback_substream = substream;
6064         } else {
6065                 if (!hdspm->playback_substream)
6066                         hdspm_stop_audio(hdspm);
6067
6068                 hdspm->capture_pid = current->pid;
6069                 hdspm->capture_substream = substream;
6070         }
6071
6072         spin_unlock_irq(&hdspm->lock);
6073
6074         snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
6075         snd_pcm_hw_constraint_pow2(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
6076
6077         switch (hdspm->io_type) {
6078         case AIO:
6079         case RayDAT:
6080                 snd_pcm_hw_constraint_minmax(runtime,
6081                                              SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
6082                                              32, 4096);
6083                 /* RayDAT & AIO have a fixed buffer of 16384 samples per channel */
6084                 snd_pcm_hw_constraint_single(runtime,
6085                                              SNDRV_PCM_HW_PARAM_BUFFER_SIZE,
6086                                              16384);
6087                 break;
6088
6089         default:
6090                 snd_pcm_hw_constraint_minmax(runtime,
6091                                              SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
6092                                              64, 8192);
6093                 snd_pcm_hw_constraint_single(runtime,
6094                                              SNDRV_PCM_HW_PARAM_PERIODS, 2);
6095                 break;
6096         }
6097
6098         if (AES32 == hdspm->io_type) {
6099                 runtime->hw.rates |= SNDRV_PCM_RATE_KNOT;
6100                 snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
6101                                 &hdspm_hw_constraints_aes32_sample_rates);
6102         } else {
6103                 snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
6104                                 (playback ?
6105                                  snd_hdspm_hw_rule_rate_out_channels :
6106                                  snd_hdspm_hw_rule_rate_in_channels), hdspm,
6107                                 SNDRV_PCM_HW_PARAM_CHANNELS, -1);
6108         }
6109
6110         snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
6111                         (playback ? snd_hdspm_hw_rule_out_channels :
6112                          snd_hdspm_hw_rule_in_channels), hdspm,
6113                         SNDRV_PCM_HW_PARAM_CHANNELS, -1);
6114
6115         snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
6116                         (playback ? snd_hdspm_hw_rule_out_channels_rate :
6117                          snd_hdspm_hw_rule_in_channels_rate), hdspm,
6118                         SNDRV_PCM_HW_PARAM_RATE, -1);
6119
6120         return 0;
6121 }
6122
6123 static int snd_hdspm_release(struct snd_pcm_substream *substream)
6124 {
6125         struct hdspm *hdspm = snd_pcm_substream_chip(substream);
6126         bool playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
6127
6128         spin_lock_irq(&hdspm->lock);
6129
6130         if (playback) {
6131                 hdspm->playback_pid = -1;
6132                 hdspm->playback_substream = NULL;
6133         } else {
6134                 hdspm->capture_pid = -1;
6135                 hdspm->capture_substream = NULL;
6136         }
6137
6138         spin_unlock_irq(&hdspm->lock);
6139
6140         return 0;
6141 }
6142
6143 static int snd_hdspm_hwdep_dummy_op(struct snd_hwdep *hw, struct file *file)
6144 {
6145         /* we have nothing to initialize but the call is required */
6146         return 0;
6147 }
6148
6149 static inline int copy_u32_le(void __user *dest, void __iomem *src)
6150 {
6151         u32 val = readl(src);
6152         return copy_to_user(dest, &val, 4);
6153 }
6154
6155 static int snd_hdspm_hwdep_ioctl(struct snd_hwdep *hw, struct file *file,
6156                 unsigned int cmd, unsigned long arg)
6157 {
6158         void __user *argp = (void __user *)arg;
6159         struct hdspm *hdspm = hw->private_data;
6160         struct hdspm_mixer_ioctl mixer;
6161         struct hdspm_config info;
6162         struct hdspm_status status;
6163         struct hdspm_version hdspm_version;
6164         struct hdspm_peak_rms *levels;
6165         struct hdspm_ltc ltc;
6166         unsigned int statusregister;
6167         long unsigned int s;
6168         int i = 0;
6169
6170         switch (cmd) {
6171
6172         case SNDRV_HDSPM_IOCTL_GET_PEAK_RMS:
6173                 levels = &hdspm->peak_rms;
6174                 for (i = 0; i < HDSPM_MAX_CHANNELS; i++) {
6175                         levels->input_peaks[i] =
6176                                 readl(hdspm->iobase +
6177                                                 HDSPM_MADI_INPUT_PEAK + i*4);
6178                         levels->playback_peaks[i] =
6179                                 readl(hdspm->iobase +
6180                                                 HDSPM_MADI_PLAYBACK_PEAK + i*4);
6181                         levels->output_peaks[i] =
6182                                 readl(hdspm->iobase +
6183                                                 HDSPM_MADI_OUTPUT_PEAK + i*4);
6184
6185                         levels->input_rms[i] =
6186                                 ((uint64_t) readl(hdspm->iobase +
6187                                         HDSPM_MADI_INPUT_RMS_H + i*4) << 32) |
6188                                 (uint64_t) readl(hdspm->iobase +
6189                                                 HDSPM_MADI_INPUT_RMS_L + i*4);
6190                         levels->playback_rms[i] =
6191                                 ((uint64_t)readl(hdspm->iobase +
6192                                         HDSPM_MADI_PLAYBACK_RMS_H+i*4) << 32) |
6193                                 (uint64_t)readl(hdspm->iobase +
6194                                         HDSPM_MADI_PLAYBACK_RMS_L + i*4);
6195                         levels->output_rms[i] =
6196                                 ((uint64_t)readl(hdspm->iobase +
6197                                         HDSPM_MADI_OUTPUT_RMS_H + i*4) << 32) |
6198                                 (uint64_t)readl(hdspm->iobase +
6199                                                 HDSPM_MADI_OUTPUT_RMS_L + i*4);
6200                 }
6201
6202                 if (hdspm->system_sample_rate > 96000) {
6203                         levels->speed = qs;
6204                 } else if (hdspm->system_sample_rate > 48000) {
6205                         levels->speed = ds;
6206                 } else {
6207                         levels->speed = ss;
6208                 }
6209                 levels->status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
6210
6211                 s = copy_to_user(argp, levels, sizeof(*levels));
6212                 if (0 != s) {
6213                         /* dev_err(hdspm->card->dev, "copy_to_user(.., .., %lu): %lu
6214                          [Levels]\n", sizeof(struct hdspm_peak_rms), s);
6215                          */
6216                         return -EFAULT;
6217                 }
6218                 break;
6219
6220         case SNDRV_HDSPM_IOCTL_GET_LTC:
6221                 ltc.ltc = hdspm_read(hdspm, HDSPM_RD_TCO);
6222                 i = hdspm_read(hdspm, HDSPM_RD_TCO + 4);
6223                 if (i & HDSPM_TCO1_LTC_Input_valid) {
6224                         switch (i & (HDSPM_TCO1_LTC_Format_LSB |
6225                                 HDSPM_TCO1_LTC_Format_MSB)) {
6226                         case 0:
6227                                 ltc.format = fps_24;
6228                                 break;
6229                         case HDSPM_TCO1_LTC_Format_LSB:
6230                                 ltc.format = fps_25;
6231                                 break;
6232                         case HDSPM_TCO1_LTC_Format_MSB:
6233                                 ltc.format = fps_2997;
6234                                 break;
6235                         default:
6236                                 ltc.format = fps_30;
6237                                 break;
6238                         }
6239                         if (i & HDSPM_TCO1_set_drop_frame_flag) {
6240                                 ltc.frame = drop_frame;
6241                         } else {
6242                                 ltc.frame = full_frame;
6243                         }
6244                 } else {
6245                         ltc.format = format_invalid;
6246                         ltc.frame = frame_invalid;
6247                 }
6248                 if (i & HDSPM_TCO1_Video_Input_Format_NTSC) {
6249                         ltc.input_format = ntsc;
6250                 } else if (i & HDSPM_TCO1_Video_Input_Format_PAL) {
6251                         ltc.input_format = pal;
6252                 } else {
6253                         ltc.input_format = no_video;
6254                 }
6255
6256                 s = copy_to_user(argp, &ltc, sizeof(ltc));
6257                 if (0 != s) {
6258                         /*
6259                           dev_err(hdspm->card->dev, "copy_to_user(.., .., %lu): %lu [LTC]\n", sizeof(struct hdspm_ltc), s); */
6260                         return -EFAULT;
6261                 }
6262
6263                 break;
6264
6265         case SNDRV_HDSPM_IOCTL_GET_CONFIG:
6266
6267                 memset(&info, 0, sizeof(info));
6268                 spin_lock_irq(&hdspm->lock);
6269                 info.pref_sync_ref = hdspm_pref_sync_ref(hdspm);
6270                 info.wordclock_sync_check = hdspm_wc_sync_check(hdspm);
6271
6272                 info.system_sample_rate = hdspm->system_sample_rate;
6273                 info.autosync_sample_rate =
6274                         hdspm_external_sample_rate(hdspm);
6275                 info.system_clock_mode = hdspm_system_clock_mode(hdspm);
6276                 info.clock_source = hdspm_clock_source(hdspm);
6277                 info.autosync_ref = hdspm_autosync_ref(hdspm);
6278                 info.line_out = hdspm_toggle_setting(hdspm, HDSPM_LineOut);
6279                 info.passthru = 0;
6280                 spin_unlock_irq(&hdspm->lock);
6281                 if (copy_to_user(argp, &info, sizeof(info)))
6282                         return -EFAULT;
6283                 break;
6284
6285         case SNDRV_HDSPM_IOCTL_GET_STATUS:
6286                 memset(&status, 0, sizeof(status));
6287
6288                 status.card_type = hdspm->io_type;
6289
6290                 status.autosync_source = hdspm_autosync_ref(hdspm);
6291
6292                 status.card_clock = 110069313433624ULL;
6293                 status.master_period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ);
6294
6295                 switch (hdspm->io_type) {
6296                 case MADI:
6297                 case MADIface:
6298                         status.card_specific.madi.sync_wc =
6299                                 hdspm_wc_sync_check(hdspm);
6300                         status.card_specific.madi.sync_madi =
6301                                 hdspm_madi_sync_check(hdspm);
6302                         status.card_specific.madi.sync_tco =
6303                                 hdspm_tco_sync_check(hdspm);
6304                         status.card_specific.madi.sync_in =
6305                                 hdspm_sync_in_sync_check(hdspm);
6306
6307                         statusregister =
6308                                 hdspm_read(hdspm, HDSPM_statusRegister);
6309                         status.card_specific.madi.madi_input =
6310                                 (statusregister & HDSPM_AB_int) ? 1 : 0;
6311                         status.card_specific.madi.channel_format =
6312                                 (statusregister & HDSPM_RX_64ch) ? 1 : 0;
6313                         /* TODO: Mac driver sets it when f_s>48kHz */
6314                         status.card_specific.madi.frame_format = 0;
6315                         break;
6316
6317                 default:
6318                         break;
6319                 }
6320
6321                 if (copy_to_user(argp, &status, sizeof(status)))
6322                         return -EFAULT;
6323
6324
6325                 break;
6326
6327         case SNDRV_HDSPM_IOCTL_GET_VERSION:
6328                 memset(&hdspm_version, 0, sizeof(hdspm_version));
6329
6330                 hdspm_version.card_type = hdspm->io_type;
6331                 strscpy(hdspm_version.cardname, hdspm->card_name,
6332                                 sizeof(hdspm_version.cardname));
6333                 hdspm_version.serial = hdspm->serial;
6334                 hdspm_version.firmware_rev = hdspm->firmware_rev;
6335                 hdspm_version.addons = 0;
6336                 if (hdspm->tco)
6337                         hdspm_version.addons |= HDSPM_ADDON_TCO;
6338
6339                 if (copy_to_user(argp, &hdspm_version,
6340                                         sizeof(hdspm_version)))
6341                         return -EFAULT;
6342                 break;
6343
6344         case SNDRV_HDSPM_IOCTL_GET_MIXER:
6345                 if (copy_from_user(&mixer, argp, sizeof(mixer)))
6346                         return -EFAULT;
6347                 if (copy_to_user((void __user *)mixer.mixer, hdspm->mixer,
6348                                  sizeof(*mixer.mixer)))
6349                         return -EFAULT;
6350                 break;
6351
6352         default:
6353                 return -EINVAL;
6354         }
6355         return 0;
6356 }
6357
6358 static const struct snd_pcm_ops snd_hdspm_ops = {
6359         .open = snd_hdspm_open,
6360         .close = snd_hdspm_release,
6361         .ioctl = snd_hdspm_ioctl,
6362         .hw_params = snd_hdspm_hw_params,
6363         .hw_free = snd_hdspm_hw_free,
6364         .prepare = snd_hdspm_prepare,
6365         .trigger = snd_hdspm_trigger,
6366         .pointer = snd_hdspm_hw_pointer,
6367 };
6368
6369 static int snd_hdspm_create_hwdep(struct snd_card *card,
6370                                   struct hdspm *hdspm)
6371 {
6372         struct snd_hwdep *hw;
6373         int err;
6374
6375         err = snd_hwdep_new(card, "HDSPM hwdep", 0, &hw);
6376         if (err < 0)
6377                 return err;
6378
6379         hdspm->hwdep = hw;
6380         hw->private_data = hdspm;
6381         strcpy(hw->name, "HDSPM hwdep interface");
6382
6383         hw->ops.open = snd_hdspm_hwdep_dummy_op;
6384         hw->ops.ioctl = snd_hdspm_hwdep_ioctl;
6385         hw->ops.ioctl_compat = snd_hdspm_hwdep_ioctl;
6386         hw->ops.release = snd_hdspm_hwdep_dummy_op;
6387
6388         return 0;
6389 }
6390
6391
6392 /*------------------------------------------------------------
6393    memory interface
6394  ------------------------------------------------------------*/
6395 static int snd_hdspm_preallocate_memory(struct hdspm *hdspm)
6396 {
6397         struct snd_pcm *pcm;
6398         size_t wanted;
6399
6400         pcm = hdspm->pcm;
6401
6402         wanted = HDSPM_DMA_AREA_BYTES;
6403
6404         snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
6405                                               &hdspm->pci->dev,
6406                                               wanted, wanted);
6407         dev_dbg(hdspm->card->dev, " Preallocated %zd Bytes\n", wanted);
6408         return 0;
6409 }
6410
6411 /* Inform the card what DMA addresses to use for the indicated channel. */
6412 /* Each channel got 16 4K pages allocated for DMA transfers. */
6413 static void hdspm_set_channel_dma_addr(struct hdspm *hdspm,
6414                                        struct snd_pcm_substream *substream,
6415                                        unsigned int reg, int channel)
6416 {
6417         int i;
6418
6419         for (i = channel * 16; i < channel * 16 + 16; i++)
6420                 hdspm_write(hdspm, reg + 4 * i,
6421                             snd_pcm_sgbuf_get_addr(substream, 4096 * i));
6422 }
6423
6424
6425 /* ------------- ALSA Devices ---------------------------- */
6426 static int snd_hdspm_create_pcm(struct snd_card *card,
6427                                 struct hdspm *hdspm)
6428 {
6429         struct snd_pcm *pcm;
6430         int err;
6431
6432         err = snd_pcm_new(card, hdspm->card_name, 0, 1, 1, &pcm);
6433         if (err < 0)
6434                 return err;
6435
6436         hdspm->pcm = pcm;
6437         pcm->private_data = hdspm;
6438         strcpy(pcm->name, hdspm->card_name);
6439
6440         snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
6441                         &snd_hdspm_ops);
6442         snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
6443                         &snd_hdspm_ops);
6444
6445         pcm->info_flags = SNDRV_PCM_INFO_JOINT_DUPLEX;
6446
6447         err = snd_hdspm_preallocate_memory(hdspm);
6448         if (err < 0)
6449                 return err;
6450
6451         return 0;
6452 }
6453
6454 static inline void snd_hdspm_initialize_midi_flush(struct hdspm * hdspm)
6455 {
6456         int i;
6457
6458         for (i = 0; i < hdspm->midiPorts; i++)
6459                 snd_hdspm_flush_midi_input(hdspm, i);
6460 }
6461
6462 static int snd_hdspm_create_alsa_devices(struct snd_card *card,
6463                                          struct hdspm *hdspm)
6464 {
6465         int err, i;
6466
6467         dev_dbg(card->dev, "Create card...\n");
6468         err = snd_hdspm_create_pcm(card, hdspm);
6469         if (err < 0)
6470                 return err;
6471
6472         i = 0;
6473         while (i < hdspm->midiPorts) {
6474                 err = snd_hdspm_create_midi(card, hdspm, i);
6475                 if (err < 0) {
6476                         return err;
6477                 }
6478                 i++;
6479         }
6480
6481         err = snd_hdspm_create_controls(card, hdspm);
6482         if (err < 0)
6483                 return err;
6484
6485         err = snd_hdspm_create_hwdep(card, hdspm);
6486         if (err < 0)
6487                 return err;
6488
6489         dev_dbg(card->dev, "proc init...\n");
6490         snd_hdspm_proc_init(hdspm);
6491
6492         hdspm->system_sample_rate = -1;
6493         hdspm->last_external_sample_rate = -1;
6494         hdspm->last_internal_sample_rate = -1;
6495         hdspm->playback_pid = -1;
6496         hdspm->capture_pid = -1;
6497         hdspm->capture_substream = NULL;
6498         hdspm->playback_substream = NULL;
6499
6500         dev_dbg(card->dev, "Set defaults...\n");
6501         err = snd_hdspm_set_defaults(hdspm);
6502         if (err < 0)
6503                 return err;
6504
6505         dev_dbg(card->dev, "Update mixer controls...\n");
6506         hdspm_update_simple_mixer_controls(hdspm);
6507
6508         dev_dbg(card->dev, "Initializing complete?\n");
6509
6510         err = snd_card_register(card);
6511         if (err < 0) {
6512                 dev_err(card->dev, "error registering card\n");
6513                 return err;
6514         }
6515
6516         dev_dbg(card->dev, "... yes now\n");
6517
6518         return 0;
6519 }
6520
6521 static int snd_hdspm_create(struct snd_card *card,
6522                             struct hdspm *hdspm)
6523 {
6524
6525         struct pci_dev *pci = hdspm->pci;
6526         int err;
6527         unsigned long io_extent;
6528
6529         hdspm->irq = -1;
6530         hdspm->card = card;
6531
6532         spin_lock_init(&hdspm->lock);
6533         INIT_WORK(&hdspm->midi_work, hdspm_midi_work);
6534
6535         pci_read_config_word(hdspm->pci,
6536                         PCI_CLASS_REVISION, &hdspm->firmware_rev);
6537
6538         strcpy(card->mixername, "Xilinx FPGA");
6539         strcpy(card->driver, "HDSPM");
6540
6541         switch (hdspm->firmware_rev) {
6542         case HDSPM_RAYDAT_REV:
6543                 hdspm->io_type = RayDAT;
6544                 hdspm->card_name = "RME RayDAT";
6545                 hdspm->midiPorts = 2;
6546                 break;
6547         case HDSPM_AIO_REV:
6548                 hdspm->io_type = AIO;
6549                 hdspm->card_name = "RME AIO";
6550                 hdspm->midiPorts = 1;
6551                 break;
6552         case HDSPM_MADIFACE_REV:
6553                 hdspm->io_type = MADIface;
6554                 hdspm->card_name = "RME MADIface";
6555                 hdspm->midiPorts = 1;
6556                 break;
6557         default:
6558                 if ((hdspm->firmware_rev == 0xf0) ||
6559                         ((hdspm->firmware_rev >= 0xe6) &&
6560                                         (hdspm->firmware_rev <= 0xea))) {
6561                         hdspm->io_type = AES32;
6562                         hdspm->card_name = "RME AES32";
6563                         hdspm->midiPorts = 2;
6564                 } else if ((hdspm->firmware_rev == 0xd2) ||
6565                         ((hdspm->firmware_rev >= 0xc8)  &&
6566                                 (hdspm->firmware_rev <= 0xcf))) {
6567                         hdspm->io_type = MADI;
6568                         hdspm->card_name = "RME MADI";
6569                         hdspm->midiPorts = 3;
6570                 } else {
6571                         dev_err(card->dev,
6572                                 "unknown firmware revision %x\n",
6573                                 hdspm->firmware_rev);
6574                         return -ENODEV;
6575                 }
6576         }
6577
6578         err = pcim_enable_device(pci);
6579         if (err < 0)
6580                 return err;
6581
6582         pci_set_master(hdspm->pci);
6583
6584         err = pcim_iomap_regions(pci, 1 << 0, "hdspm");
6585         if (err < 0)
6586                 return err;
6587
6588         hdspm->port = pci_resource_start(pci, 0);
6589         io_extent = pci_resource_len(pci, 0);
6590         hdspm->iobase = pcim_iomap_table(pci)[0];
6591         dev_dbg(card->dev, "remapped region (0x%lx) 0x%lx-0x%lx\n",
6592                         (unsigned long)hdspm->iobase, hdspm->port,
6593                         hdspm->port + io_extent - 1);
6594
6595         if (devm_request_irq(&pci->dev, pci->irq, snd_hdspm_interrupt,
6596                              IRQF_SHARED, KBUILD_MODNAME, hdspm)) {
6597                 dev_err(card->dev, "unable to use IRQ %d\n", pci->irq);
6598                 return -EBUSY;
6599         }
6600
6601         dev_dbg(card->dev, "use IRQ %d\n", pci->irq);
6602
6603         hdspm->irq = pci->irq;
6604         card->sync_irq = hdspm->irq;
6605
6606         dev_dbg(card->dev, "kmalloc Mixer memory of %zd Bytes\n",
6607                 sizeof(*hdspm->mixer));
6608         hdspm->mixer = devm_kzalloc(&pci->dev, sizeof(*hdspm->mixer), GFP_KERNEL);
6609         if (!hdspm->mixer)
6610                 return -ENOMEM;
6611
6612         hdspm->port_names_in = NULL;
6613         hdspm->port_names_out = NULL;
6614
6615         switch (hdspm->io_type) {
6616         case AES32:
6617                 hdspm->ss_in_channels = hdspm->ss_out_channels = AES32_CHANNELS;
6618                 hdspm->ds_in_channels = hdspm->ds_out_channels = AES32_CHANNELS;
6619                 hdspm->qs_in_channels = hdspm->qs_out_channels = AES32_CHANNELS;
6620
6621                 hdspm->channel_map_in_ss = hdspm->channel_map_out_ss =
6622                         channel_map_aes32;
6623                 hdspm->channel_map_in_ds = hdspm->channel_map_out_ds =
6624                         channel_map_aes32;
6625                 hdspm->channel_map_in_qs = hdspm->channel_map_out_qs =
6626                         channel_map_aes32;
6627                 hdspm->port_names_in_ss = hdspm->port_names_out_ss =
6628                         texts_ports_aes32;
6629                 hdspm->port_names_in_ds = hdspm->port_names_out_ds =
6630                         texts_ports_aes32;
6631                 hdspm->port_names_in_qs = hdspm->port_names_out_qs =
6632                         texts_ports_aes32;
6633
6634                 hdspm->max_channels_out = hdspm->max_channels_in =
6635                         AES32_CHANNELS;
6636                 hdspm->port_names_in = hdspm->port_names_out =
6637                         texts_ports_aes32;
6638                 hdspm->channel_map_in = hdspm->channel_map_out =
6639                         channel_map_aes32;
6640
6641                 break;
6642
6643         case MADI:
6644         case MADIface:
6645                 hdspm->ss_in_channels = hdspm->ss_out_channels =
6646                         MADI_SS_CHANNELS;
6647                 hdspm->ds_in_channels = hdspm->ds_out_channels =
6648                         MADI_DS_CHANNELS;
6649                 hdspm->qs_in_channels = hdspm->qs_out_channels =
6650                         MADI_QS_CHANNELS;
6651
6652                 hdspm->channel_map_in_ss = hdspm->channel_map_out_ss =
6653                         channel_map_unity_ss;
6654                 hdspm->channel_map_in_ds = hdspm->channel_map_out_ds =
6655                         channel_map_unity_ss;
6656                 hdspm->channel_map_in_qs = hdspm->channel_map_out_qs =
6657                         channel_map_unity_ss;
6658
6659                 hdspm->port_names_in_ss = hdspm->port_names_out_ss =
6660                         texts_ports_madi;
6661                 hdspm->port_names_in_ds = hdspm->port_names_out_ds =
6662                         texts_ports_madi;
6663                 hdspm->port_names_in_qs = hdspm->port_names_out_qs =
6664                         texts_ports_madi;
6665                 break;
6666
6667         case AIO:
6668                 hdspm->ss_in_channels = AIO_IN_SS_CHANNELS;
6669                 hdspm->ds_in_channels = AIO_IN_DS_CHANNELS;
6670                 hdspm->qs_in_channels = AIO_IN_QS_CHANNELS;
6671                 hdspm->ss_out_channels = AIO_OUT_SS_CHANNELS;
6672                 hdspm->ds_out_channels = AIO_OUT_DS_CHANNELS;
6673                 hdspm->qs_out_channels = AIO_OUT_QS_CHANNELS;
6674
6675                 if (0 == (hdspm_read(hdspm, HDSPM_statusRegister2) & HDSPM_s2_AEBI_D)) {
6676                         dev_info(card->dev, "AEB input board found\n");
6677                         hdspm->ss_in_channels += 4;
6678                         hdspm->ds_in_channels += 4;
6679                         hdspm->qs_in_channels += 4;
6680                 }
6681
6682                 if (0 == (hdspm_read(hdspm, HDSPM_statusRegister2) & HDSPM_s2_AEBO_D)) {
6683                         dev_info(card->dev, "AEB output board found\n");
6684                         hdspm->ss_out_channels += 4;
6685                         hdspm->ds_out_channels += 4;
6686                         hdspm->qs_out_channels += 4;
6687                 }
6688
6689                 hdspm->channel_map_out_ss = channel_map_aio_out_ss;
6690                 hdspm->channel_map_out_ds = channel_map_aio_out_ds;
6691                 hdspm->channel_map_out_qs = channel_map_aio_out_qs;
6692
6693                 hdspm->channel_map_in_ss = channel_map_aio_in_ss;
6694                 hdspm->channel_map_in_ds = channel_map_aio_in_ds;
6695                 hdspm->channel_map_in_qs = channel_map_aio_in_qs;
6696
6697                 hdspm->port_names_in_ss = texts_ports_aio_in_ss;
6698                 hdspm->port_names_out_ss = texts_ports_aio_out_ss;
6699                 hdspm->port_names_in_ds = texts_ports_aio_in_ds;
6700                 hdspm->port_names_out_ds = texts_ports_aio_out_ds;
6701                 hdspm->port_names_in_qs = texts_ports_aio_in_qs;
6702                 hdspm->port_names_out_qs = texts_ports_aio_out_qs;
6703
6704                 break;
6705
6706         case RayDAT:
6707                 hdspm->ss_in_channels = hdspm->ss_out_channels =
6708                         RAYDAT_SS_CHANNELS;
6709                 hdspm->ds_in_channels = hdspm->ds_out_channels =
6710                         RAYDAT_DS_CHANNELS;
6711                 hdspm->qs_in_channels = hdspm->qs_out_channels =
6712                         RAYDAT_QS_CHANNELS;
6713
6714                 hdspm->max_channels_in = RAYDAT_SS_CHANNELS;
6715                 hdspm->max_channels_out = RAYDAT_SS_CHANNELS;
6716
6717                 hdspm->channel_map_in_ss = hdspm->channel_map_out_ss =
6718                         channel_map_raydat_ss;
6719                 hdspm->channel_map_in_ds = hdspm->channel_map_out_ds =
6720                         channel_map_raydat_ds;
6721                 hdspm->channel_map_in_qs = hdspm->channel_map_out_qs =
6722                         channel_map_raydat_qs;
6723                 hdspm->channel_map_in = hdspm->channel_map_out =
6724                         channel_map_raydat_ss;
6725
6726                 hdspm->port_names_in_ss = hdspm->port_names_out_ss =
6727                         texts_ports_raydat_ss;
6728                 hdspm->port_names_in_ds = hdspm->port_names_out_ds =
6729                         texts_ports_raydat_ds;
6730                 hdspm->port_names_in_qs = hdspm->port_names_out_qs =
6731                         texts_ports_raydat_qs;
6732
6733
6734                 break;
6735
6736         }
6737
6738         /* TCO detection */
6739         switch (hdspm->io_type) {
6740         case AIO:
6741         case RayDAT:
6742                 if (hdspm_read(hdspm, HDSPM_statusRegister2) &
6743                                 HDSPM_s2_tco_detect) {
6744                         hdspm->midiPorts++;
6745                         hdspm->tco = kzalloc(sizeof(*hdspm->tco), GFP_KERNEL);
6746                         if (hdspm->tco)
6747                                 hdspm_tco_write(hdspm);
6748
6749                         dev_info(card->dev, "AIO/RayDAT TCO module found\n");
6750                 } else {
6751                         hdspm->tco = NULL;
6752                 }
6753                 break;
6754
6755         case MADI:
6756         case AES32:
6757                 if (hdspm_read(hdspm, HDSPM_statusRegister) & HDSPM_tco_detect) {
6758                         hdspm->midiPorts++;
6759                         hdspm->tco = kzalloc(sizeof(*hdspm->tco), GFP_KERNEL);
6760                         if (hdspm->tco)
6761                                 hdspm_tco_write(hdspm);
6762
6763                         dev_info(card->dev, "MADI/AES TCO module found\n");
6764                 } else {
6765                         hdspm->tco = NULL;
6766                 }
6767                 break;
6768
6769         default:
6770                 hdspm->tco = NULL;
6771         }
6772
6773         /* texts */
6774         switch (hdspm->io_type) {
6775         case AES32:
6776                 if (hdspm->tco) {
6777                         hdspm->texts_autosync = texts_autosync_aes_tco;
6778                         hdspm->texts_autosync_items =
6779                                 ARRAY_SIZE(texts_autosync_aes_tco);
6780                 } else {
6781                         hdspm->texts_autosync = texts_autosync_aes;
6782                         hdspm->texts_autosync_items =
6783                                 ARRAY_SIZE(texts_autosync_aes);
6784                 }
6785                 break;
6786
6787         case MADI:
6788                 if (hdspm->tco) {
6789                         hdspm->texts_autosync = texts_autosync_madi_tco;
6790                         hdspm->texts_autosync_items = 4;
6791                 } else {
6792                         hdspm->texts_autosync = texts_autosync_madi;
6793                         hdspm->texts_autosync_items = 3;
6794                 }
6795                 break;
6796
6797         case MADIface:
6798
6799                 break;
6800
6801         case RayDAT:
6802                 if (hdspm->tco) {
6803                         hdspm->texts_autosync = texts_autosync_raydat_tco;
6804                         hdspm->texts_autosync_items = 9;
6805                 } else {
6806                         hdspm->texts_autosync = texts_autosync_raydat;
6807                         hdspm->texts_autosync_items = 8;
6808                 }
6809                 break;
6810
6811         case AIO:
6812                 if (hdspm->tco) {
6813                         hdspm->texts_autosync = texts_autosync_aio_tco;
6814                         hdspm->texts_autosync_items = 6;
6815                 } else {
6816                         hdspm->texts_autosync = texts_autosync_aio;
6817                         hdspm->texts_autosync_items = 5;
6818                 }
6819                 break;
6820
6821         }
6822
6823         if (hdspm->io_type != MADIface) {
6824                 hdspm->serial = (hdspm_read(hdspm,
6825                                 HDSPM_midiStatusIn0)>>8) & 0xFFFFFF;
6826                 /* id contains either a user-provided value or the default
6827                  * NULL. If it's the default, we're safe to
6828                  * fill card->id with the serial number.
6829                  *
6830                  * If the serial number is 0xFFFFFF, then we're dealing with
6831                  * an old PCI revision that comes without a sane number. In
6832                  * this case, we don't set card->id to avoid collisions
6833                  * when running with multiple cards.
6834                  */
6835                 if (!id[hdspm->dev] && hdspm->serial != 0xFFFFFF) {
6836                         snprintf(card->id, sizeof(card->id),
6837                                  "HDSPMx%06x", hdspm->serial);
6838                         snd_card_set_id(card, card->id);
6839                 }
6840         }
6841
6842         dev_dbg(card->dev, "create alsa devices.\n");
6843         err = snd_hdspm_create_alsa_devices(card, hdspm);
6844         if (err < 0)
6845                 return err;
6846
6847         snd_hdspm_initialize_midi_flush(hdspm);
6848
6849         return 0;
6850 }
6851
6852
6853 static void snd_hdspm_card_free(struct snd_card *card)
6854 {
6855         struct hdspm *hdspm = card->private_data;
6856
6857         if (hdspm->port) {
6858                 cancel_work_sync(&hdspm->midi_work);
6859
6860                 /* stop th audio, and cancel all interrupts */
6861                 hdspm->control_register &=
6862                     ~(HDSPM_Start | HDSPM_AudioInterruptEnable |
6863                       HDSPM_Midi0InterruptEnable | HDSPM_Midi1InterruptEnable |
6864                       HDSPM_Midi2InterruptEnable | HDSPM_Midi3InterruptEnable);
6865                 hdspm_write(hdspm, HDSPM_controlRegister,
6866                             hdspm->control_register);
6867         }
6868 }
6869
6870
6871 static int snd_hdspm_probe(struct pci_dev *pci,
6872                            const struct pci_device_id *pci_id)
6873 {
6874         static int dev;
6875         struct hdspm *hdspm;
6876         struct snd_card *card;
6877         int err;
6878
6879         if (dev >= SNDRV_CARDS)
6880                 return -ENODEV;
6881         if (!enable[dev]) {
6882                 dev++;
6883                 return -ENOENT;
6884         }
6885
6886         err = snd_devm_card_new(&pci->dev, index[dev], id[dev],
6887                                 THIS_MODULE, sizeof(*hdspm), &card);
6888         if (err < 0)
6889                 return err;
6890
6891         hdspm = card->private_data;
6892         card->private_free = snd_hdspm_card_free;
6893         hdspm->dev = dev;
6894         hdspm->pci = pci;
6895
6896         err = snd_hdspm_create(card, hdspm);
6897         if (err < 0)
6898                 return err;
6899
6900         if (hdspm->io_type != MADIface) {
6901                 snprintf(card->shortname, sizeof(card->shortname), "%s_%x",
6902                         hdspm->card_name, hdspm->serial);
6903                 snprintf(card->longname, sizeof(card->longname),
6904                          "%s S/N 0x%x at 0x%lx, irq %d",
6905                          hdspm->card_name, hdspm->serial,
6906                          hdspm->port, hdspm->irq);
6907         } else {
6908                 snprintf(card->shortname, sizeof(card->shortname), "%s",
6909                          hdspm->card_name);
6910                 snprintf(card->longname, sizeof(card->longname),
6911                          "%s at 0x%lx, irq %d",
6912                          hdspm->card_name, hdspm->port, hdspm->irq);
6913         }
6914
6915         err = snd_card_register(card);
6916         if (err < 0)
6917                 return err;
6918
6919         pci_set_drvdata(pci, card);
6920
6921         dev++;
6922         return 0;
6923 }
6924
6925 static struct pci_driver hdspm_driver = {
6926         .name = KBUILD_MODNAME,
6927         .id_table = snd_hdspm_ids,
6928         .probe = snd_hdspm_probe,
6929 };
6930
6931 module_pci_driver(hdspm_driver);