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