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