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