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