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