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