2 * ALSA driver for RME Hammerfall DSP MADI audio interface(s)
4 * Copyright (c) 2003 Winfried Ritsch (IEM)
5 * code based on hdsp.c Paul Davis
8 * Modified 2006-06-01 for AES32 support by Remy Bruno
9 * <remy.bruno@trinnov.com>
11 * Modified 2009-04-13 for proper metering by Florian Faber
14 * Modified 2009-04-14 for native float support by Florian Faber
17 * Modified 2009-04-26 fixed bug in rms metering by Florian Faber
20 * Modified 2009-04-30 added hw serial number support by Florian Faber
22 * Modified 2011-01-14 added S/PDIF input on RayDATs by Adrian Knoth
24 * Modified 2011-01-25 variable period sizes on RayDAT/AIO by Adrian Knoth
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.
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.
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
41 #include <linux/init.h>
42 #include <linux/delay.h>
43 #include <linux/interrupt.h>
44 #include <linux/module.h>
45 #include <linux/slab.h>
46 #include <linux/pci.h>
47 #include <linux/math64.h>
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>
60 #include <sound/hdspm.h>
62 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
63 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */
64 static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;/* Enable this card */
66 module_param_array(index, int, NULL, 0444);
67 MODULE_PARM_DESC(index, "Index value for RME HDSPM interface.");
69 module_param_array(id, charp, NULL, 0444);
70 MODULE_PARM_DESC(id, "ID string for RME HDSPM interface.");
72 module_param_array(enable, bool, NULL, 0444);
73 MODULE_PARM_DESC(enable, "Enable/disable specific HDSPM soundcards.");
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>"
85 MODULE_DESCRIPTION("RME HDSPM");
86 MODULE_LICENSE("GPL");
87 MODULE_SUPPORTED_DEVICE("{{RME HDSPM-MADI}}");
89 /* --- Write registers. ---
90 These are defined as byte-offsets from the iobase value. */
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 */
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 */
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)
112 #define HDSPM_MADI_mixerBase 32768 /* 32768-65535 for 2x64x64 Fader */
114 #define HDSPM_MATRIX_MIXER_SIZE 8192 /* = 2*64*64 * 4 Byte => 32kB */
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
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
132 #define HDSPM_RD_TCO 256
133 #define HDSPM_RD_PLL_FREQ 512
134 #define HDSPM_WR_TCO 128
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
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
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
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
167 #define HDSPM_midiDataOut0 352
168 #define HDSPM_midiDataOut1 356
169 #define HDSPM_midiDataOut2 368
171 #define HDSPM_midiDataIn0 360
172 #define HDSPM_midiDataIn1 364
173 #define HDSPM_midiDataIn2 372
174 #define HDSPM_midiDataIn3 376
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
181 #define HDSPM_midiStatusIn0 392
182 #define HDSPM_midiStatusIn1 396
183 #define HDSPM_midiStatusIn2 404
184 #define HDSPM_midiStatusIn3 408
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.
193 #define HDSPM_MADI_INPUT_PEAK 4096
194 #define HDSPM_MADI_PLAYBACK_PEAK 4352
195 #define HDSPM_MADI_OUTPUT_PEAK 4608
197 #define HDSPM_MADI_INPUT_RMS_L 6144
198 #define HDSPM_MADI_PLAYBACK_RMS_L 6400
199 #define HDSPM_MADI_OUTPUT_RMS_L 6656
201 #define HDSPM_MADI_INPUT_RMS_H 7168
202 #define HDSPM_MADI_PLAYBACK_RMS_H 7424
203 #define HDSPM_MADI_OUTPUT_RMS_H 7680
205 /* --- Control Register bits --------- */
206 #define HDSPM_Start (1<<0) /* start engine */
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} */
212 #define HDSPM_ClockModeMaster (1<<4) /* 1=Master, 0=Autosync */
213 #define HDSPM_c0Master 0x1 /* Master clock bit in settings
214 register [RayDAT, AIO] */
216 #define HDSPM_AudioInterruptEnable (1<<5) /* what do you think ? */
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 */
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 */
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 */
232 #define HDSPM_InputSelect0 (1<<14) /* Input select 0= optical, 1=coax
235 #define HDSPM_InputSelect1 (1<<15) /* should be 0 */
237 #define HDSPM_SyncRef2 (1<<13)
238 #define HDSPM_SyncRef3 (1<<25)
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 */
247 #define HDSPM_Midi0InterruptEnable 0x0400000
248 #define HDSPM_Midi1InterruptEnable 0x0800000
249 #define HDSPM_Midi2InterruptEnable 0x0200000
250 #define HDSPM_Midi3InterruptEnable 0x4000000
252 #define HDSPM_LineOut (1<<24) /* Analog Out on channel 63/64 on=1, mute=0 */
253 #define HDSPe_FLOAT_FORMAT 0x2000000
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 */
259 #define HDSPM_wclk_sel (1<<30)
261 /* additional control register bits for AIO*/
262 #define HDSPM_c0_Wck48 0x20 /* also RayDAT */
263 #define HDSPM_c0_Input0 0x1000
264 #define HDSPM_c0_Input1 0x2000
265 #define HDSPM_c0_Spdif_Opt 0x4000
266 #define HDSPM_c0_Pro 0x8000
267 #define HDSPM_c0_clr_tms 0x10000
268 #define HDSPM_c0_AEB1 0x20000
269 #define HDSPM_c0_AEB2 0x40000
270 #define HDSPM_c0_LineOut 0x80000
271 #define HDSPM_c0_AD_GAIN0 0x100000
272 #define HDSPM_c0_AD_GAIN1 0x200000
273 #define HDSPM_c0_DA_GAIN0 0x400000
274 #define HDSPM_c0_DA_GAIN1 0x800000
275 #define HDSPM_c0_PH_GAIN0 0x1000000
276 #define HDSPM_c0_PH_GAIN1 0x2000000
277 #define HDSPM_c0_Sym6db 0x4000000
280 /* --- bit helper defines */
281 #define HDSPM_LatencyMask (HDSPM_Latency0|HDSPM_Latency1|HDSPM_Latency2)
282 #define HDSPM_FrequencyMask (HDSPM_Frequency0|HDSPM_Frequency1|\
283 HDSPM_DoubleSpeed|HDSPM_QuadSpeed)
284 #define HDSPM_InputMask (HDSPM_InputSelect0|HDSPM_InputSelect1)
285 #define HDSPM_InputOptical 0
286 #define HDSPM_InputCoaxial (HDSPM_InputSelect0)
287 #define HDSPM_SyncRefMask (HDSPM_SyncRef0|HDSPM_SyncRef1|\
288 HDSPM_SyncRef2|HDSPM_SyncRef3)
290 #define HDSPM_c0_SyncRef0 0x2
291 #define HDSPM_c0_SyncRef1 0x4
292 #define HDSPM_c0_SyncRef2 0x8
293 #define HDSPM_c0_SyncRef3 0x10
294 #define HDSPM_c0_SyncRefMask (HDSPM_c0_SyncRef0 | HDSPM_c0_SyncRef1 |\
295 HDSPM_c0_SyncRef2 | HDSPM_c0_SyncRef3)
297 #define HDSPM_SYNC_FROM_WORD 0 /* Preferred sync reference */
298 #define HDSPM_SYNC_FROM_MADI 1 /* choices - used by "pref_sync_ref" */
299 #define HDSPM_SYNC_FROM_TCO 2
300 #define HDSPM_SYNC_FROM_SYNC_IN 3
302 #define HDSPM_Frequency32KHz HDSPM_Frequency0
303 #define HDSPM_Frequency44_1KHz HDSPM_Frequency1
304 #define HDSPM_Frequency48KHz (HDSPM_Frequency1|HDSPM_Frequency0)
305 #define HDSPM_Frequency64KHz (HDSPM_DoubleSpeed|HDSPM_Frequency0)
306 #define HDSPM_Frequency88_2KHz (HDSPM_DoubleSpeed|HDSPM_Frequency1)
307 #define HDSPM_Frequency96KHz (HDSPM_DoubleSpeed|HDSPM_Frequency1|\
309 #define HDSPM_Frequency128KHz (HDSPM_QuadSpeed|HDSPM_Frequency0)
310 #define HDSPM_Frequency176_4KHz (HDSPM_QuadSpeed|HDSPM_Frequency1)
311 #define HDSPM_Frequency192KHz (HDSPM_QuadSpeed|HDSPM_Frequency1|\
315 /* Synccheck Status */
316 #define HDSPM_SYNC_CHECK_NO_LOCK 0
317 #define HDSPM_SYNC_CHECK_LOCK 1
318 #define HDSPM_SYNC_CHECK_SYNC 2
320 /* AutoSync References - used by "autosync_ref" control switch */
321 #define HDSPM_AUTOSYNC_FROM_WORD 0
322 #define HDSPM_AUTOSYNC_FROM_MADI 1
323 #define HDSPM_AUTOSYNC_FROM_TCO 2
324 #define HDSPM_AUTOSYNC_FROM_SYNC_IN 3
325 #define HDSPM_AUTOSYNC_FROM_NONE 4
327 /* Possible sources of MADI input */
328 #define HDSPM_OPTICAL 0 /* optical */
329 #define HDSPM_COAXIAL 1 /* BNC */
331 #define hdspm_encode_latency(x) (((x)<<1) & HDSPM_LatencyMask)
332 #define hdspm_decode_latency(x) ((((x) & HDSPM_LatencyMask)>>1))
334 #define hdspm_encode_in(x) (((x)&0x3)<<14)
335 #define hdspm_decode_in(x) (((x)>>14)&0x3)
337 /* --- control2 register bits --- */
338 #define HDSPM_TMS (1<<0)
339 #define HDSPM_TCK (1<<1)
340 #define HDSPM_TDI (1<<2)
341 #define HDSPM_JTAG (1<<3)
342 #define HDSPM_PWDN (1<<4)
343 #define HDSPM_PROGRAM (1<<5)
344 #define HDSPM_CONFIG_MODE_0 (1<<6)
345 #define HDSPM_CONFIG_MODE_1 (1<<7)
346 /*#define HDSPM_VERSION_BIT (1<<8) not defined any more*/
347 #define HDSPM_BIGENDIAN_MODE (1<<9)
348 #define HDSPM_RD_MULTIPLE (1<<10)
350 /* --- Status Register bits --- */ /* MADI ONLY */ /* Bits defined here and
351 that do not conflict with specific bits for AES32 seem to be valid also
354 #define HDSPM_audioIRQPending (1<<0) /* IRQ is high and pending */
355 #define HDSPM_RX_64ch (1<<1) /* Input 64chan. MODE=1, 56chn MODE=0 */
356 #define HDSPM_AB_int (1<<2) /* InputChannel Opt=0, Coax=1
360 #define HDSPM_madiLock (1<<3) /* MADI Locked =1, no=0 */
361 #define HDSPM_madiSync (1<<18) /* MADI is in sync */
363 #define HDSPM_tcoLockMadi 0x00000020 /* Optional TCO locked status for HDSPe MADI*/
364 #define HDSPM_tcoSync 0x10000000 /* Optional TCO sync status for HDSPe MADI and AES32!*/
366 #define HDSPM_syncInLock 0x00010000 /* Sync In lock status for HDSPe MADI! */
367 #define HDSPM_syncInSync 0x00020000 /* Sync In sync status for HDSPe MADI! */
369 #define HDSPM_BufferPositionMask 0x000FFC0 /* Bit 6..15 : h/w buffer pointer */
370 /* since 64byte accurate, last 6 bits are not used */
374 #define HDSPM_DoubleSpeedStatus (1<<19) /* (input) card in double speed */
376 #define HDSPM_madiFreq0 (1<<22) /* system freq 0=error */
377 #define HDSPM_madiFreq1 (1<<23) /* 1=32, 2=44.1 3=48 */
378 #define HDSPM_madiFreq2 (1<<24) /* 4=64, 5=88.2 6=96 */
379 #define HDSPM_madiFreq3 (1<<25) /* 7=128, 8=176.4 9=192 */
381 #define HDSPM_BufferID (1<<26) /* (Double)Buffer ID toggles with
384 #define HDSPM_tco_detect 0x08000000
385 #define HDSPM_tcoLockAes 0x20000000 /* Optional TCO locked status for HDSPe AES */
387 #define HDSPM_s2_tco_detect 0x00000040
388 #define HDSPM_s2_AEBO_D 0x00000080
389 #define HDSPM_s2_AEBI_D 0x00000100
392 #define HDSPM_midi0IRQPending 0x40000000
393 #define HDSPM_midi1IRQPending 0x80000000
394 #define HDSPM_midi2IRQPending 0x20000000
395 #define HDSPM_midi2IRQPendingAES 0x00000020
396 #define HDSPM_midi3IRQPending 0x00200000
398 /* --- status bit helpers */
399 #define HDSPM_madiFreqMask (HDSPM_madiFreq0|HDSPM_madiFreq1|\
400 HDSPM_madiFreq2|HDSPM_madiFreq3)
401 #define HDSPM_madiFreq32 (HDSPM_madiFreq0)
402 #define HDSPM_madiFreq44_1 (HDSPM_madiFreq1)
403 #define HDSPM_madiFreq48 (HDSPM_madiFreq0|HDSPM_madiFreq1)
404 #define HDSPM_madiFreq64 (HDSPM_madiFreq2)
405 #define HDSPM_madiFreq88_2 (HDSPM_madiFreq0|HDSPM_madiFreq2)
406 #define HDSPM_madiFreq96 (HDSPM_madiFreq1|HDSPM_madiFreq2)
407 #define HDSPM_madiFreq128 (HDSPM_madiFreq0|HDSPM_madiFreq1|HDSPM_madiFreq2)
408 #define HDSPM_madiFreq176_4 (HDSPM_madiFreq3)
409 #define HDSPM_madiFreq192 (HDSPM_madiFreq3|HDSPM_madiFreq0)
411 /* Status2 Register bits */ /* MADI ONLY */
413 #define HDSPM_version0 (1<<0) /* not really defined but I guess */
414 #define HDSPM_version1 (1<<1) /* in former cards it was ??? */
415 #define HDSPM_version2 (1<<2)
417 #define HDSPM_wcLock (1<<3) /* Wordclock is detected and locked */
418 #define HDSPM_wcSync (1<<4) /* Wordclock is in sync with systemclock */
420 #define HDSPM_wc_freq0 (1<<5) /* input freq detected via autosync */
421 #define HDSPM_wc_freq1 (1<<6) /* 001=32, 010==44.1, 011=48, */
422 #define HDSPM_wc_freq2 (1<<7) /* 100=64, 101=88.2, 110=96, 111=128 */
423 #define HDSPM_wc_freq3 0x800 /* 1000=176.4, 1001=192 */
425 #define HDSPM_SyncRef0 0x10000 /* Sync Reference */
426 #define HDSPM_SyncRef1 0x20000
428 #define HDSPM_SelSyncRef0 (1<<8) /* AutoSync Source */
429 #define HDSPM_SelSyncRef1 (1<<9) /* 000=word, 001=MADI, */
430 #define HDSPM_SelSyncRef2 (1<<10) /* 111=no valid signal */
432 #define HDSPM_wc_valid (HDSPM_wcLock|HDSPM_wcSync)
434 #define HDSPM_wcFreqMask (HDSPM_wc_freq0|HDSPM_wc_freq1|HDSPM_wc_freq2|\
436 #define HDSPM_wcFreq32 (HDSPM_wc_freq0)
437 #define HDSPM_wcFreq44_1 (HDSPM_wc_freq1)
438 #define HDSPM_wcFreq48 (HDSPM_wc_freq0|HDSPM_wc_freq1)
439 #define HDSPM_wcFreq64 (HDSPM_wc_freq2)
440 #define HDSPM_wcFreq88_2 (HDSPM_wc_freq0|HDSPM_wc_freq2)
441 #define HDSPM_wcFreq96 (HDSPM_wc_freq1|HDSPM_wc_freq2)
442 #define HDSPM_wcFreq128 (HDSPM_wc_freq0|HDSPM_wc_freq1|HDSPM_wc_freq2)
443 #define HDSPM_wcFreq176_4 (HDSPM_wc_freq3)
444 #define HDSPM_wcFreq192 (HDSPM_wc_freq0|HDSPM_wc_freq3)
446 #define HDSPM_status1_F_0 0x0400000
447 #define HDSPM_status1_F_1 0x0800000
448 #define HDSPM_status1_F_2 0x1000000
449 #define HDSPM_status1_F_3 0x2000000
450 #define HDSPM_status1_freqMask (HDSPM_status1_F_0|HDSPM_status1_F_1|HDSPM_status1_F_2|HDSPM_status1_F_3)
453 #define HDSPM_SelSyncRefMask (HDSPM_SelSyncRef0|HDSPM_SelSyncRef1|\
455 #define HDSPM_SelSyncRef_WORD 0
456 #define HDSPM_SelSyncRef_MADI (HDSPM_SelSyncRef0)
457 #define HDSPM_SelSyncRef_TCO (HDSPM_SelSyncRef1)
458 #define HDSPM_SelSyncRef_SyncIn (HDSPM_SelSyncRef0|HDSPM_SelSyncRef1)
459 #define HDSPM_SelSyncRef_NVALID (HDSPM_SelSyncRef0|HDSPM_SelSyncRef1|\
463 For AES32, bits for status, status2 and timecode are different
466 #define HDSPM_AES32_wcLock 0x0200000
467 #define HDSPM_AES32_wcSync 0x0100000
468 #define HDSPM_AES32_wcFreq_bit 22
469 /* (status >> HDSPM_AES32_wcFreq_bit) & 0xF gives WC frequency (cf function
471 #define HDSPM_AES32_syncref_bit 16
472 /* (status >> HDSPM_AES32_syncref_bit) & 0xF gives sync source */
474 #define HDSPM_AES32_AUTOSYNC_FROM_WORD 0
475 #define HDSPM_AES32_AUTOSYNC_FROM_AES1 1
476 #define HDSPM_AES32_AUTOSYNC_FROM_AES2 2
477 #define HDSPM_AES32_AUTOSYNC_FROM_AES3 3
478 #define HDSPM_AES32_AUTOSYNC_FROM_AES4 4
479 #define HDSPM_AES32_AUTOSYNC_FROM_AES5 5
480 #define HDSPM_AES32_AUTOSYNC_FROM_AES6 6
481 #define HDSPM_AES32_AUTOSYNC_FROM_AES7 7
482 #define HDSPM_AES32_AUTOSYNC_FROM_AES8 8
483 #define HDSPM_AES32_AUTOSYNC_FROM_TCO 9
484 #define HDSPM_AES32_AUTOSYNC_FROM_SYNC_IN 10
485 #define HDSPM_AES32_AUTOSYNC_FROM_NONE 11
488 /* HDSPM_LockAES_bit is given by HDSPM_LockAES >> (AES# - 1) */
489 #define HDSPM_LockAES 0x80
490 #define HDSPM_LockAES1 0x80
491 #define HDSPM_LockAES2 0x40
492 #define HDSPM_LockAES3 0x20
493 #define HDSPM_LockAES4 0x10
494 #define HDSPM_LockAES5 0x8
495 #define HDSPM_LockAES6 0x4
496 #define HDSPM_LockAES7 0x2
497 #define HDSPM_LockAES8 0x1
500 After windows driver sources, bits 4*i to 4*i+3 give the input frequency on
512 NB: Timecode register doesn't seem to work on AES32 card revision 230
516 #define UNITY_GAIN 32768 /* = 65536/2 */
517 #define MINUS_INFINITY_GAIN 0
519 /* Number of channels for different Speed Modes */
520 #define MADI_SS_CHANNELS 64
521 #define MADI_DS_CHANNELS 32
522 #define MADI_QS_CHANNELS 16
524 #define RAYDAT_SS_CHANNELS 36
525 #define RAYDAT_DS_CHANNELS 20
526 #define RAYDAT_QS_CHANNELS 12
528 #define AIO_IN_SS_CHANNELS 14
529 #define AIO_IN_DS_CHANNELS 10
530 #define AIO_IN_QS_CHANNELS 8
531 #define AIO_OUT_SS_CHANNELS 16
532 #define AIO_OUT_DS_CHANNELS 12
533 #define AIO_OUT_QS_CHANNELS 10
535 #define AES32_CHANNELS 16
537 /* the size of a substream (1 mono data stream) */
538 #define HDSPM_CHANNEL_BUFFER_SAMPLES (16*1024)
539 #define HDSPM_CHANNEL_BUFFER_BYTES (4*HDSPM_CHANNEL_BUFFER_SAMPLES)
541 /* the size of the area we need to allocate for DMA transfers. the
542 size is the same regardless of the number of channels, and
543 also the latency to use.
544 for one direction !!!
546 #define HDSPM_DMA_AREA_BYTES (HDSPM_MAX_CHANNELS * HDSPM_CHANNEL_BUFFER_BYTES)
547 #define HDSPM_DMA_AREA_KILOBYTES (HDSPM_DMA_AREA_BYTES/1024)
549 #define HDSPM_RAYDAT_REV 211
550 #define HDSPM_AIO_REV 212
551 #define HDSPM_MADIFACE_REV 213
553 /* speed factor modes */
554 #define HDSPM_SPEED_SINGLE 0
555 #define HDSPM_SPEED_DOUBLE 1
556 #define HDSPM_SPEED_QUAD 2
558 /* names for speed modes */
559 static char *hdspm_speed_names[] = { "single", "double", "quad" };
561 static char *texts_autosync_aes_tco[] = { "Word Clock",
562 "AES1", "AES2", "AES3", "AES4",
563 "AES5", "AES6", "AES7", "AES8",
566 static char *texts_autosync_aes[] = { "Word Clock",
567 "AES1", "AES2", "AES3", "AES4",
568 "AES5", "AES6", "AES7", "AES8",
571 static char *texts_autosync_madi_tco[] = { "Word Clock",
572 "MADI", "TCO", "Sync In" };
573 static char *texts_autosync_madi[] = { "Word Clock",
576 static char *texts_autosync_raydat_tco[] = {
578 "ADAT 1", "ADAT 2", "ADAT 3", "ADAT 4",
579 "AES", "SPDIF", "TCO", "Sync In"
581 static char *texts_autosync_raydat[] = {
583 "ADAT 1", "ADAT 2", "ADAT 3", "ADAT 4",
584 "AES", "SPDIF", "Sync In"
586 static char *texts_autosync_aio_tco[] = {
588 "ADAT", "AES", "SPDIF", "TCO", "Sync In"
590 static char *texts_autosync_aio[] = { "Word Clock",
591 "ADAT", "AES", "SPDIF", "Sync In" };
593 static char *texts_freq[] = {
606 static char *texts_ports_madi[] = {
607 "MADI.1", "MADI.2", "MADI.3", "MADI.4", "MADI.5", "MADI.6",
608 "MADI.7", "MADI.8", "MADI.9", "MADI.10", "MADI.11", "MADI.12",
609 "MADI.13", "MADI.14", "MADI.15", "MADI.16", "MADI.17", "MADI.18",
610 "MADI.19", "MADI.20", "MADI.21", "MADI.22", "MADI.23", "MADI.24",
611 "MADI.25", "MADI.26", "MADI.27", "MADI.28", "MADI.29", "MADI.30",
612 "MADI.31", "MADI.32", "MADI.33", "MADI.34", "MADI.35", "MADI.36",
613 "MADI.37", "MADI.38", "MADI.39", "MADI.40", "MADI.41", "MADI.42",
614 "MADI.43", "MADI.44", "MADI.45", "MADI.46", "MADI.47", "MADI.48",
615 "MADI.49", "MADI.50", "MADI.51", "MADI.52", "MADI.53", "MADI.54",
616 "MADI.55", "MADI.56", "MADI.57", "MADI.58", "MADI.59", "MADI.60",
617 "MADI.61", "MADI.62", "MADI.63", "MADI.64",
621 static char *texts_ports_raydat_ss[] = {
622 "ADAT1.1", "ADAT1.2", "ADAT1.3", "ADAT1.4", "ADAT1.5", "ADAT1.6",
623 "ADAT1.7", "ADAT1.8", "ADAT2.1", "ADAT2.2", "ADAT2.3", "ADAT2.4",
624 "ADAT2.5", "ADAT2.6", "ADAT2.7", "ADAT2.8", "ADAT3.1", "ADAT3.2",
625 "ADAT3.3", "ADAT3.4", "ADAT3.5", "ADAT3.6", "ADAT3.7", "ADAT3.8",
626 "ADAT4.1", "ADAT4.2", "ADAT4.3", "ADAT4.4", "ADAT4.5", "ADAT4.6",
627 "ADAT4.7", "ADAT4.8",
632 static char *texts_ports_raydat_ds[] = {
633 "ADAT1.1", "ADAT1.2", "ADAT1.3", "ADAT1.4",
634 "ADAT2.1", "ADAT2.2", "ADAT2.3", "ADAT2.4",
635 "ADAT3.1", "ADAT3.2", "ADAT3.3", "ADAT3.4",
636 "ADAT4.1", "ADAT4.2", "ADAT4.3", "ADAT4.4",
641 static char *texts_ports_raydat_qs[] = {
642 "ADAT1.1", "ADAT1.2",
643 "ADAT2.1", "ADAT2.2",
644 "ADAT3.1", "ADAT3.2",
645 "ADAT4.1", "ADAT4.2",
651 static char *texts_ports_aio_in_ss[] = {
652 "Analogue.L", "Analogue.R",
654 "SPDIF.L", "SPDIF.R",
655 "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4", "ADAT.5", "ADAT.6",
657 "AEB.1", "AEB.2", "AEB.3", "AEB.4"
660 static char *texts_ports_aio_out_ss[] = {
661 "Analogue.L", "Analogue.R",
663 "SPDIF.L", "SPDIF.R",
664 "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4", "ADAT.5", "ADAT.6",
666 "Phone.L", "Phone.R",
667 "AEB.1", "AEB.2", "AEB.3", "AEB.4"
670 static char *texts_ports_aio_in_ds[] = {
671 "Analogue.L", "Analogue.R",
673 "SPDIF.L", "SPDIF.R",
674 "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4",
675 "AEB.1", "AEB.2", "AEB.3", "AEB.4"
678 static char *texts_ports_aio_out_ds[] = {
679 "Analogue.L", "Analogue.R",
681 "SPDIF.L", "SPDIF.R",
682 "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4",
683 "Phone.L", "Phone.R",
684 "AEB.1", "AEB.2", "AEB.3", "AEB.4"
687 static char *texts_ports_aio_in_qs[] = {
688 "Analogue.L", "Analogue.R",
690 "SPDIF.L", "SPDIF.R",
691 "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4",
692 "AEB.1", "AEB.2", "AEB.3", "AEB.4"
695 static char *texts_ports_aio_out_qs[] = {
696 "Analogue.L", "Analogue.R",
698 "SPDIF.L", "SPDIF.R",
699 "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4",
700 "Phone.L", "Phone.R",
701 "AEB.1", "AEB.2", "AEB.3", "AEB.4"
704 static char *texts_ports_aes32[] = {
705 "AES.1", "AES.2", "AES.3", "AES.4", "AES.5", "AES.6", "AES.7",
706 "AES.8", "AES.9.", "AES.10", "AES.11", "AES.12", "AES.13", "AES.14",
710 /* These tables map the ALSA channels 1..N to the channels that we
711 need to use in order to find the relevant channel buffer. RME
712 refers to this kind of mapping as between "the ADAT channel and
713 the DMA channel." We index it using the logical audio channel,
714 and the value is the DMA channel (i.e. channel buffer number)
715 where the data for that channel can be read/written from/to.
718 static char channel_map_unity_ss[HDSPM_MAX_CHANNELS] = {
719 0, 1, 2, 3, 4, 5, 6, 7,
720 8, 9, 10, 11, 12, 13, 14, 15,
721 16, 17, 18, 19, 20, 21, 22, 23,
722 24, 25, 26, 27, 28, 29, 30, 31,
723 32, 33, 34, 35, 36, 37, 38, 39,
724 40, 41, 42, 43, 44, 45, 46, 47,
725 48, 49, 50, 51, 52, 53, 54, 55,
726 56, 57, 58, 59, 60, 61, 62, 63
729 static char channel_map_raydat_ss[HDSPM_MAX_CHANNELS] = {
730 4, 5, 6, 7, 8, 9, 10, 11, /* ADAT 1 */
731 12, 13, 14, 15, 16, 17, 18, 19, /* ADAT 2 */
732 20, 21, 22, 23, 24, 25, 26, 27, /* ADAT 3 */
733 28, 29, 30, 31, 32, 33, 34, 35, /* ADAT 4 */
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,
742 static char channel_map_raydat_ds[HDSPM_MAX_CHANNELS] = {
743 4, 5, 6, 7, /* ADAT 1 */
744 8, 9, 10, 11, /* ADAT 2 */
745 12, 13, 14, 15, /* ADAT 3 */
746 16, 17, 18, 19, /* ADAT 4 */
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,
757 static char channel_map_raydat_qs[HDSPM_MAX_CHANNELS] = {
765 -1, -1, -1, -1, -1, -1, -1, -1,
766 -1, -1, -1, -1, -1, -1, -1, -1,
767 -1, -1, -1, -1, -1, -1, -1, -1,
768 -1, -1, -1, -1, -1, -1, -1, -1,
769 -1, -1, -1, -1, -1, -1, -1, -1,
770 -1, -1, -1, -1, -1, -1, -1, -1,
773 static char channel_map_aio_in_ss[HDSPM_MAX_CHANNELS] = {
776 10, 11, /* spdif in */
777 12, 13, 14, 15, 16, 17, 18, 19, /* ADAT in */
778 2, 3, 4, 5, /* AEB */
779 -1, -1, -1, -1, -1, -1,
780 -1, -1, -1, -1, -1, -1, -1, -1,
781 -1, -1, -1, -1, -1, -1, -1, -1,
782 -1, -1, -1, -1, -1, -1, -1, -1,
783 -1, -1, -1, -1, -1, -1, -1, -1,
784 -1, -1, -1, -1, -1, -1, -1, -1,
787 static char channel_map_aio_out_ss[HDSPM_MAX_CHANNELS] = {
790 10, 11, /* spdif out */
791 12, 13, 14, 15, 16, 17, 18, 19, /* ADAT out */
792 6, 7, /* phone out */
793 2, 3, 4, 5, /* AEB */
795 -1, -1, -1, -1, -1, -1, -1, -1,
796 -1, -1, -1, -1, -1, -1, -1, -1,
797 -1, -1, -1, -1, -1, -1, -1, -1,
798 -1, -1, -1, -1, -1, -1, -1, -1,
799 -1, -1, -1, -1, -1, -1, -1, -1,
802 static char channel_map_aio_in_ds[HDSPM_MAX_CHANNELS] = {
805 10, 11, /* spdif in */
806 12, 14, 16, 18, /* adat in */
807 2, 3, 4, 5, /* AEB */
809 -1, -1, -1, -1, -1, -1, -1, -1,
810 -1, -1, -1, -1, -1, -1, -1, -1,
811 -1, -1, -1, -1, -1, -1, -1, -1,
812 -1, -1, -1, -1, -1, -1, -1, -1,
813 -1, -1, -1, -1, -1, -1, -1, -1,
814 -1, -1, -1, -1, -1, -1, -1, -1
817 static char channel_map_aio_out_ds[HDSPM_MAX_CHANNELS] = {
820 10, 11, /* spdif out */
821 12, 14, 16, 18, /* adat out */
822 6, 7, /* phone out */
823 2, 3, 4, 5, /* AEB */
824 -1, -1, -1, -1, -1, -1, -1, -1,
825 -1, -1, -1, -1, -1, -1, -1, -1,
826 -1, -1, -1, -1, -1, -1, -1, -1,
827 -1, -1, -1, -1, -1, -1, -1, -1,
828 -1, -1, -1, -1, -1, -1, -1, -1,
829 -1, -1, -1, -1, -1, -1, -1, -1
832 static char channel_map_aio_in_qs[HDSPM_MAX_CHANNELS] = {
835 10, 11, /* spdif in */
836 12, 16, /* adat in */
837 2, 3, 4, 5, /* AEB */
839 -1, -1, -1, -1, -1, -1, -1, -1,
840 -1, -1, -1, -1, -1, -1, -1, -1,
841 -1, -1, -1, -1, -1, -1, -1, -1,
842 -1, -1, -1, -1, -1, -1, -1, -1,
843 -1, -1, -1, -1, -1, -1, -1, -1,
844 -1, -1, -1, -1, -1, -1, -1, -1
847 static char channel_map_aio_out_qs[HDSPM_MAX_CHANNELS] = {
850 10, 11, /* spdif out */
851 12, 16, /* adat out */
852 6, 7, /* phone out */
853 2, 3, 4, 5, /* AEB */
855 -1, -1, -1, -1, -1, -1, -1, -1,
856 -1, -1, -1, -1, -1, -1, -1, -1,
857 -1, -1, -1, -1, -1, -1, -1, -1,
858 -1, -1, -1, -1, -1, -1, -1, -1,
859 -1, -1, -1, -1, -1, -1, -1, -1,
860 -1, -1, -1, -1, -1, -1, -1, -1
863 static char channel_map_aes32[HDSPM_MAX_CHANNELS] = {
864 0, 1, 2, 3, 4, 5, 6, 7,
865 8, 9, 10, 11, 12, 13, 14, 15,
866 -1, -1, -1, -1, -1, -1, -1, -1,
867 -1, -1, -1, -1, -1, -1, -1, -1,
868 -1, -1, -1, -1, -1, -1, -1, -1,
869 -1, -1, -1, -1, -1, -1, -1, -1,
870 -1, -1, -1, -1, -1, -1, -1, -1,
871 -1, -1, -1, -1, -1, -1, -1, -1
877 struct snd_rawmidi *rmidi;
878 struct snd_rawmidi_substream *input;
879 struct snd_rawmidi_substream *output;
880 char istimer; /* timer in use */
881 struct timer_list timer;
898 int term; /* 0 = off, 1 = on */
903 /* only one playback and/or capture stream */
904 struct snd_pcm_substream *capture_substream;
905 struct snd_pcm_substream *playback_substream;
907 char *card_name; /* for procinfo */
908 unsigned short firmware_rev; /* dont know if relevant (yes if AES32)*/
912 int monitor_outs; /* set up monitoring outs init flag */
914 u32 control_register; /* cached value */
915 u32 control2_register; /* cached value */
916 u32 settings_register;
918 struct hdspm_midi midi[4];
919 struct tasklet_struct midi_tasklet;
922 unsigned char ss_in_channels;
923 unsigned char ds_in_channels;
924 unsigned char qs_in_channels;
925 unsigned char ss_out_channels;
926 unsigned char ds_out_channels;
927 unsigned char qs_out_channels;
929 unsigned char max_channels_in;
930 unsigned char max_channels_out;
932 signed char *channel_map_in;
933 signed char *channel_map_out;
935 signed char *channel_map_in_ss, *channel_map_in_ds, *channel_map_in_qs;
936 signed char *channel_map_out_ss, *channel_map_out_ds, *channel_map_out_qs;
938 char **port_names_in;
939 char **port_names_out;
941 char **port_names_in_ss, **port_names_in_ds, **port_names_in_qs;
942 char **port_names_out_ss, **port_names_out_ds, **port_names_out_qs;
944 unsigned char *playback_buffer; /* suitably aligned address */
945 unsigned char *capture_buffer; /* suitably aligned address */
947 pid_t capture_pid; /* process id which uses capture */
948 pid_t playback_pid; /* process id which uses capture */
949 int running; /* running status */
951 int last_external_sample_rate; /* samplerate mystic ... */
952 int last_internal_sample_rate;
953 int system_sample_rate;
955 int dev; /* Hardware vars... */
958 void __iomem *iobase;
960 int irq_count; /* for debug */
963 struct snd_card *card; /* one card */
964 struct snd_pcm *pcm; /* has one pcm */
965 struct snd_hwdep *hwdep; /* and a hwdep for additional ioctl */
966 struct pci_dev *pci; /* and an pci info */
969 /* fast alsa mixer */
970 struct snd_kcontrol *playback_mixer_ctls[HDSPM_MAX_CHANNELS];
971 /* but input to much, so not used */
972 struct snd_kcontrol *input_mixer_ctls[HDSPM_MAX_CHANNELS];
973 /* full mixer accessible over mixer ioctl or hwdep-device */
974 struct hdspm_mixer *mixer;
976 struct hdspm_tco *tco; /* NULL if no TCO detected */
978 char **texts_autosync;
979 int texts_autosync_items;
981 cycles_t last_interrupt;
985 struct hdspm_peak_rms peak_rms;
989 static DEFINE_PCI_DEVICE_TABLE(snd_hdspm_ids) = {
991 .vendor = PCI_VENDOR_ID_XILINX,
992 .device = PCI_DEVICE_ID_XILINX_HAMMERFALL_DSP_MADI,
993 .subvendor = PCI_ANY_ID,
994 .subdevice = PCI_ANY_ID,
1001 MODULE_DEVICE_TABLE(pci, snd_hdspm_ids);
1004 static int snd_hdspm_create_alsa_devices(struct snd_card *card,
1005 struct hdspm *hdspm);
1006 static int snd_hdspm_create_pcm(struct snd_card *card,
1007 struct hdspm *hdspm);
1009 static inline void snd_hdspm_initialize_midi_flush(struct hdspm *hdspm);
1010 static inline int hdspm_get_pll_freq(struct hdspm *hdspm);
1011 static int hdspm_update_simple_mixer_controls(struct hdspm *hdspm);
1012 static int hdspm_autosync_ref(struct hdspm *hdspm);
1013 static int hdspm_set_toggle_setting(struct hdspm *hdspm, u32 regmask, int out);
1014 static int snd_hdspm_set_defaults(struct hdspm *hdspm);
1015 static int hdspm_system_clock_mode(struct hdspm *hdspm);
1016 static void hdspm_set_sgbuf(struct hdspm *hdspm,
1017 struct snd_pcm_substream *substream,
1018 unsigned int reg, int channels);
1020 static int hdspm_aes_sync_check(struct hdspm *hdspm, int idx);
1021 static int hdspm_wc_sync_check(struct hdspm *hdspm);
1022 static int hdspm_tco_sync_check(struct hdspm *hdspm);
1023 static int hdspm_sync_in_sync_check(struct hdspm *hdspm);
1025 static int hdspm_get_aes_sample_rate(struct hdspm *hdspm, int index);
1026 static int hdspm_get_tco_sample_rate(struct hdspm *hdspm);
1027 static int hdspm_get_wc_sample_rate(struct hdspm *hdspm);
1031 static inline int HDSPM_bit2freq(int n)
1033 static const int bit2freq_tab[] = {
1034 0, 32000, 44100, 48000, 64000, 88200,
1035 96000, 128000, 176400, 192000 };
1038 return bit2freq_tab[n];
1041 static bool hdspm_is_raydat_or_aio(struct hdspm *hdspm)
1043 return ((AIO == hdspm->io_type) || (RayDAT == hdspm->io_type));
1047 /* Write/read to/from HDSPM with Adresses in Bytes
1048 not words but only 32Bit writes are allowed */
1050 static inline void hdspm_write(struct hdspm * hdspm, unsigned int reg,
1053 writel(val, hdspm->iobase + reg);
1056 static inline unsigned int hdspm_read(struct hdspm * hdspm, unsigned int reg)
1058 return readl(hdspm->iobase + reg);
1061 /* for each output channel (chan) I have an Input (in) and Playback (pb) Fader
1062 mixer is write only on hardware so we have to cache him for read
1063 each fader is a u32, but uses only the first 16 bit */
1065 static inline int hdspm_read_in_gain(struct hdspm * hdspm, unsigned int chan,
1068 if (chan >= HDSPM_MIXER_CHANNELS || in >= HDSPM_MIXER_CHANNELS)
1071 return hdspm->mixer->ch[chan].in[in];
1074 static inline int hdspm_read_pb_gain(struct hdspm * hdspm, unsigned int chan,
1077 if (chan >= HDSPM_MIXER_CHANNELS || pb >= HDSPM_MIXER_CHANNELS)
1079 return hdspm->mixer->ch[chan].pb[pb];
1082 static int hdspm_write_in_gain(struct hdspm *hdspm, unsigned int chan,
1083 unsigned int in, unsigned short data)
1085 if (chan >= HDSPM_MIXER_CHANNELS || in >= HDSPM_MIXER_CHANNELS)
1089 HDSPM_MADI_mixerBase +
1090 ((in + 128 * chan) * sizeof(u32)),
1091 (hdspm->mixer->ch[chan].in[in] = data & 0xFFFF));
1095 static int hdspm_write_pb_gain(struct hdspm *hdspm, unsigned int chan,
1096 unsigned int pb, unsigned short data)
1098 if (chan >= HDSPM_MIXER_CHANNELS || pb >= HDSPM_MIXER_CHANNELS)
1102 HDSPM_MADI_mixerBase +
1103 ((64 + pb + 128 * chan) * sizeof(u32)),
1104 (hdspm->mixer->ch[chan].pb[pb] = data & 0xFFFF));
1109 /* enable DMA for specific channels, now available for DSP-MADI */
1110 static inline void snd_hdspm_enable_in(struct hdspm * hdspm, int i, int v)
1112 hdspm_write(hdspm, HDSPM_inputEnableBase + (4 * i), v);
1115 static inline void snd_hdspm_enable_out(struct hdspm * hdspm, int i, int v)
1117 hdspm_write(hdspm, HDSPM_outputEnableBase + (4 * i), v);
1120 /* check if same process is writing and reading */
1121 static int snd_hdspm_use_is_exclusive(struct hdspm *hdspm)
1123 unsigned long flags;
1126 spin_lock_irqsave(&hdspm->lock, flags);
1127 if ((hdspm->playback_pid != hdspm->capture_pid) &&
1128 (hdspm->playback_pid >= 0) && (hdspm->capture_pid >= 0)) {
1131 spin_unlock_irqrestore(&hdspm->lock, flags);
1135 /* round arbitary sample rates to commonly known rates */
1136 static int hdspm_round_frequency(int rate)
1146 /* QS and DS rates normally can not be detected
1147 * automatically by the card. Only exception is MADI
1148 * in 96k frame mode.
1150 * So if we read SS values (32 .. 48k), check for
1151 * user-provided DS/QS bits in the control register
1152 * and multiply the base frequency accordingly.
1154 static int hdspm_rate_multiplier(struct hdspm *hdspm, int rate)
1156 if (rate <= 48000) {
1157 if (hdspm->control_register & HDSPM_QuadSpeed)
1159 else if (hdspm->control_register &
1166 /* check for external sample rate, returns the sample rate in Hz*/
1167 static int hdspm_external_sample_rate(struct hdspm *hdspm)
1169 unsigned int status, status2, timecode;
1170 int syncref, rate = 0, rate_bits;
1172 switch (hdspm->io_type) {
1174 status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
1175 status = hdspm_read(hdspm, HDSPM_statusRegister);
1176 timecode = hdspm_read(hdspm, HDSPM_timecodeRegister);
1178 syncref = hdspm_autosync_ref(hdspm);
1180 if (syncref == HDSPM_AES32_AUTOSYNC_FROM_WORD &&
1181 status & HDSPM_AES32_wcLock)
1182 return HDSPM_bit2freq((status >> HDSPM_AES32_wcFreq_bit) & 0xF);
1184 if (syncref >= HDSPM_AES32_AUTOSYNC_FROM_AES1 &&
1185 syncref <= HDSPM_AES32_AUTOSYNC_FROM_AES8 &&
1186 status2 & (HDSPM_LockAES >>
1187 (syncref - HDSPM_AES32_AUTOSYNC_FROM_AES1)))
1188 return HDSPM_bit2freq((timecode >> (4*(syncref-HDSPM_AES32_AUTOSYNC_FROM_AES1))) & 0xF);
1193 status = hdspm_read(hdspm, HDSPM_statusRegister);
1195 if (!(status & HDSPM_madiLock)) {
1196 rate = 0; /* no lock */
1198 switch (status & (HDSPM_status1_freqMask)) {
1199 case HDSPM_status1_F_0*1:
1200 rate = 32000; break;
1201 case HDSPM_status1_F_0*2:
1202 rate = 44100; break;
1203 case HDSPM_status1_F_0*3:
1204 rate = 48000; break;
1205 case HDSPM_status1_F_0*4:
1206 rate = 64000; break;
1207 case HDSPM_status1_F_0*5:
1208 rate = 88200; break;
1209 case HDSPM_status1_F_0*6:
1210 rate = 96000; break;
1211 case HDSPM_status1_F_0*7:
1212 rate = 128000; break;
1213 case HDSPM_status1_F_0*8:
1214 rate = 176400; break;
1215 case HDSPM_status1_F_0*9:
1216 rate = 192000; break;
1227 status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
1228 status = hdspm_read(hdspm, HDSPM_statusRegister);
1231 /* if wordclock has synced freq and wordclock is valid */
1232 if ((status2 & HDSPM_wcLock) != 0 &&
1233 (status2 & HDSPM_SelSyncRef0) == 0) {
1235 rate_bits = status2 & HDSPM_wcFreqMask;
1238 switch (rate_bits) {
1239 case HDSPM_wcFreq32:
1242 case HDSPM_wcFreq44_1:
1245 case HDSPM_wcFreq48:
1248 case HDSPM_wcFreq64:
1251 case HDSPM_wcFreq88_2:
1254 case HDSPM_wcFreq96:
1257 case HDSPM_wcFreq128:
1260 case HDSPM_wcFreq176_4:
1263 case HDSPM_wcFreq192:
1272 /* if rate detected and Syncref is Word than have it,
1273 * word has priority to MADI
1276 (status2 & HDSPM_SelSyncRefMask) == HDSPM_SelSyncRef_WORD)
1277 return hdspm_rate_multiplier(hdspm, rate);
1279 /* maybe a madi input (which is taken if sel sync is madi) */
1280 if (status & HDSPM_madiLock) {
1281 rate_bits = status & HDSPM_madiFreqMask;
1283 switch (rate_bits) {
1284 case HDSPM_madiFreq32:
1287 case HDSPM_madiFreq44_1:
1290 case HDSPM_madiFreq48:
1293 case HDSPM_madiFreq64:
1296 case HDSPM_madiFreq88_2:
1299 case HDSPM_madiFreq96:
1302 case HDSPM_madiFreq128:
1305 case HDSPM_madiFreq176_4:
1308 case HDSPM_madiFreq192:
1316 } /* endif HDSPM_madiLock */
1318 /* check sample rate from TCO or SYNC_IN */
1320 bool is_valid_input = 0;
1323 syncref = hdspm_autosync_ref(hdspm);
1324 if (HDSPM_AUTOSYNC_FROM_TCO == syncref) {
1326 has_sync = (HDSPM_SYNC_CHECK_SYNC ==
1327 hdspm_tco_sync_check(hdspm));
1328 } else if (HDSPM_AUTOSYNC_FROM_SYNC_IN == syncref) {
1330 has_sync = (HDSPM_SYNC_CHECK_SYNC ==
1331 hdspm_sync_in_sync_check(hdspm));
1334 if (is_valid_input && has_sync) {
1335 rate = hdspm_round_frequency(
1336 hdspm_get_pll_freq(hdspm));
1340 rate = hdspm_rate_multiplier(hdspm, rate);
1348 /* return latency in samples per period */
1349 static int hdspm_get_latency(struct hdspm *hdspm)
1353 n = hdspm_decode_latency(hdspm->control_register);
1355 /* Special case for new RME cards with 32 samples period size.
1356 * The three latency bits in the control register
1357 * (HDSP_LatencyMask) encode latency values of 64 samples as
1358 * 0, 128 samples as 1 ... 4096 samples as 6. For old cards, 7
1359 * denotes 8192 samples, but on new cards like RayDAT or AIO,
1360 * it corresponds to 32 samples.
1362 if ((7 == n) && (RayDAT == hdspm->io_type || AIO == hdspm->io_type))
1365 return 1 << (n + 6);
1368 /* Latency function */
1369 static inline void hdspm_compute_period_size(struct hdspm *hdspm)
1371 hdspm->period_bytes = 4 * hdspm_get_latency(hdspm);
1375 static snd_pcm_uframes_t hdspm_hw_pointer(struct hdspm *hdspm)
1379 position = hdspm_read(hdspm, HDSPM_statusRegister);
1381 switch (hdspm->io_type) {
1384 position &= HDSPM_BufferPositionMask;
1385 position /= 4; /* Bytes per sample */
1388 position = (position & HDSPM_BufferID) ?
1389 (hdspm->period_bytes / 4) : 0;
1396 static inline void hdspm_start_audio(struct hdspm * s)
1398 s->control_register |= (HDSPM_AudioInterruptEnable | HDSPM_Start);
1399 hdspm_write(s, HDSPM_controlRegister, s->control_register);
1402 static inline void hdspm_stop_audio(struct hdspm * s)
1404 s->control_register &= ~(HDSPM_Start | HDSPM_AudioInterruptEnable);
1405 hdspm_write(s, HDSPM_controlRegister, s->control_register);
1408 /* should I silence all or only opened ones ? doit all for first even is 4MB*/
1409 static void hdspm_silence_playback(struct hdspm *hdspm)
1412 int n = hdspm->period_bytes;
1413 void *buf = hdspm->playback_buffer;
1418 for (i = 0; i < HDSPM_MAX_CHANNELS; i++) {
1420 buf += HDSPM_CHANNEL_BUFFER_BYTES;
1424 static int hdspm_set_interrupt_interval(struct hdspm *s, unsigned int frames)
1428 spin_lock_irq(&s->lock);
1431 /* Special case for new RME cards like RayDAT/AIO which
1432 * support period sizes of 32 samples. Since latency is
1433 * encoded in the three bits of HDSP_LatencyMask, we can only
1434 * have values from 0 .. 7. While 0 still means 64 samples and
1435 * 6 represents 4096 samples on all cards, 7 represents 8192
1436 * on older cards and 32 samples on new cards.
1438 * In other words, period size in samples is calculated by
1439 * 2^(n+6) with n ranging from 0 .. 7.
1451 s->control_register &= ~HDSPM_LatencyMask;
1452 s->control_register |= hdspm_encode_latency(n);
1454 hdspm_write(s, HDSPM_controlRegister, s->control_register);
1456 hdspm_compute_period_size(s);
1458 spin_unlock_irq(&s->lock);
1463 static u64 hdspm_calc_dds_value(struct hdspm *hdspm, u64 period)
1470 switch (hdspm->io_type) {
1473 freq_const = 110069313433624ULL;
1477 freq_const = 104857600000000ULL;
1480 freq_const = 131072000000000ULL;
1487 return div_u64(freq_const, period);
1491 static void hdspm_set_dds_value(struct hdspm *hdspm, int rate)
1497 else if (rate >= 56000)
1500 switch (hdspm->io_type) {
1502 n = 131072000000000ULL; /* 125 MHz */
1506 n = 110069313433624ULL; /* 105 MHz */
1510 n = 104857600000000ULL; /* 100 MHz */
1517 n = div_u64(n, rate);
1518 /* n should be less than 2^32 for being written to FREQ register */
1519 snd_BUG_ON(n >> 32);
1520 hdspm_write(hdspm, HDSPM_freqReg, (u32)n);
1523 /* dummy set rate lets see what happens */
1524 static int hdspm_set_rate(struct hdspm * hdspm, int rate, int called_internally)
1529 int current_speed, target_speed;
1531 /* ASSUMPTION: hdspm->lock is either set, or there is no need for
1532 it (e.g. during module initialization).
1535 if (!(hdspm->control_register & HDSPM_ClockModeMaster)) {
1538 if (called_internally) {
1540 /* request from ctl or card initialization
1541 just make a warning an remember setting
1542 for future master mode switching */
1544 snd_printk(KERN_WARNING "HDSPM: "
1545 "Warning: device is not running "
1546 "as a clock master.\n");
1550 /* hw_param request while in AutoSync mode */
1552 hdspm_external_sample_rate(hdspm);
1554 if (hdspm_autosync_ref(hdspm) ==
1555 HDSPM_AUTOSYNC_FROM_NONE) {
1557 snd_printk(KERN_WARNING "HDSPM: "
1558 "Detected no Externel Sync \n");
1561 } else if (rate != external_freq) {
1563 snd_printk(KERN_WARNING "HDSPM: "
1564 "Warning: No AutoSync source for "
1565 "requested rate\n");
1571 current_rate = hdspm->system_sample_rate;
1573 /* Changing between Singe, Double and Quad speed is not
1574 allowed if any substreams are open. This is because such a change
1575 causes a shift in the location of the DMA buffers and a reduction
1576 in the number of available buffers.
1578 Note that a similar but essentially insoluble problem exists for
1579 externally-driven rate changes. All we can do is to flag rate
1580 changes in the read/write routines.
1583 if (current_rate <= 48000)
1584 current_speed = HDSPM_SPEED_SINGLE;
1585 else if (current_rate <= 96000)
1586 current_speed = HDSPM_SPEED_DOUBLE;
1588 current_speed = HDSPM_SPEED_QUAD;
1591 target_speed = HDSPM_SPEED_SINGLE;
1592 else if (rate <= 96000)
1593 target_speed = HDSPM_SPEED_DOUBLE;
1595 target_speed = HDSPM_SPEED_QUAD;
1599 rate_bits = HDSPM_Frequency32KHz;
1602 rate_bits = HDSPM_Frequency44_1KHz;
1605 rate_bits = HDSPM_Frequency48KHz;
1608 rate_bits = HDSPM_Frequency64KHz;
1611 rate_bits = HDSPM_Frequency88_2KHz;
1614 rate_bits = HDSPM_Frequency96KHz;
1617 rate_bits = HDSPM_Frequency128KHz;
1620 rate_bits = HDSPM_Frequency176_4KHz;
1623 rate_bits = HDSPM_Frequency192KHz;
1629 if (current_speed != target_speed
1630 && (hdspm->capture_pid >= 0 || hdspm->playback_pid >= 0)) {
1633 "cannot change from %s speed to %s speed mode "
1634 "(capture PID = %d, playback PID = %d)\n",
1635 hdspm_speed_names[current_speed],
1636 hdspm_speed_names[target_speed],
1637 hdspm->capture_pid, hdspm->playback_pid);
1641 hdspm->control_register &= ~HDSPM_FrequencyMask;
1642 hdspm->control_register |= rate_bits;
1643 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
1645 /* For AES32, need to set DDS value in FREQ register
1646 For MADI, also apparently */
1647 hdspm_set_dds_value(hdspm, rate);
1649 if (AES32 == hdspm->io_type && rate != current_rate)
1650 hdspm_write(hdspm, HDSPM_eeprom_wr, 0);
1652 hdspm->system_sample_rate = rate;
1654 if (rate <= 48000) {
1655 hdspm->channel_map_in = hdspm->channel_map_in_ss;
1656 hdspm->channel_map_out = hdspm->channel_map_out_ss;
1657 hdspm->max_channels_in = hdspm->ss_in_channels;
1658 hdspm->max_channels_out = hdspm->ss_out_channels;
1659 hdspm->port_names_in = hdspm->port_names_in_ss;
1660 hdspm->port_names_out = hdspm->port_names_out_ss;
1661 } else if (rate <= 96000) {
1662 hdspm->channel_map_in = hdspm->channel_map_in_ds;
1663 hdspm->channel_map_out = hdspm->channel_map_out_ds;
1664 hdspm->max_channels_in = hdspm->ds_in_channels;
1665 hdspm->max_channels_out = hdspm->ds_out_channels;
1666 hdspm->port_names_in = hdspm->port_names_in_ds;
1667 hdspm->port_names_out = hdspm->port_names_out_ds;
1669 hdspm->channel_map_in = hdspm->channel_map_in_qs;
1670 hdspm->channel_map_out = hdspm->channel_map_out_qs;
1671 hdspm->max_channels_in = hdspm->qs_in_channels;
1672 hdspm->max_channels_out = hdspm->qs_out_channels;
1673 hdspm->port_names_in = hdspm->port_names_in_qs;
1674 hdspm->port_names_out = hdspm->port_names_out_qs;
1683 /* mainly for init to 0 on load */
1684 static void all_in_all_mixer(struct hdspm * hdspm, int sgain)
1689 if (sgain > UNITY_GAIN)
1696 for (i = 0; i < HDSPM_MIXER_CHANNELS; i++)
1697 for (j = 0; j < HDSPM_MIXER_CHANNELS; j++) {
1698 hdspm_write_in_gain(hdspm, i, j, gain);
1699 hdspm_write_pb_gain(hdspm, i, j, gain);
1703 /*----------------------------------------------------------------------------
1705 ----------------------------------------------------------------------------*/
1707 static inline unsigned char snd_hdspm_midi_read_byte (struct hdspm *hdspm,
1710 /* the hardware already does the relevant bit-mask with 0xff */
1711 return hdspm_read(hdspm, hdspm->midi[id].dataIn);
1714 static inline void snd_hdspm_midi_write_byte (struct hdspm *hdspm, int id,
1717 /* the hardware already does the relevant bit-mask with 0xff */
1718 return hdspm_write(hdspm, hdspm->midi[id].dataOut, val);
1721 static inline int snd_hdspm_midi_input_available (struct hdspm *hdspm, int id)
1723 return hdspm_read(hdspm, hdspm->midi[id].statusIn) & 0xFF;
1726 static inline int snd_hdspm_midi_output_possible (struct hdspm *hdspm, int id)
1728 int fifo_bytes_used;
1730 fifo_bytes_used = hdspm_read(hdspm, hdspm->midi[id].statusOut) & 0xFF;
1732 if (fifo_bytes_used < 128)
1733 return 128 - fifo_bytes_used;
1738 static void snd_hdspm_flush_midi_input(struct hdspm *hdspm, int id)
1740 while (snd_hdspm_midi_input_available (hdspm, id))
1741 snd_hdspm_midi_read_byte (hdspm, id);
1744 static int snd_hdspm_midi_output_write (struct hdspm_midi *hmidi)
1746 unsigned long flags;
1750 unsigned char buf[128];
1752 /* Output is not interrupt driven */
1754 spin_lock_irqsave (&hmidi->lock, flags);
1755 if (hmidi->output &&
1756 !snd_rawmidi_transmit_empty (hmidi->output)) {
1757 n_pending = snd_hdspm_midi_output_possible (hmidi->hdspm,
1759 if (n_pending > 0) {
1760 if (n_pending > (int)sizeof (buf))
1761 n_pending = sizeof (buf);
1763 to_write = snd_rawmidi_transmit (hmidi->output, buf,
1766 for (i = 0; i < to_write; ++i)
1767 snd_hdspm_midi_write_byte (hmidi->hdspm,
1773 spin_unlock_irqrestore (&hmidi->lock, flags);
1777 static int snd_hdspm_midi_input_read (struct hdspm_midi *hmidi)
1779 unsigned char buf[128]; /* this buffer is designed to match the MIDI
1782 unsigned long flags;
1786 spin_lock_irqsave (&hmidi->lock, flags);
1787 n_pending = snd_hdspm_midi_input_available (hmidi->hdspm, hmidi->id);
1788 if (n_pending > 0) {
1790 if (n_pending > (int)sizeof (buf))
1791 n_pending = sizeof (buf);
1792 for (i = 0; i < n_pending; ++i)
1793 buf[i] = snd_hdspm_midi_read_byte (hmidi->hdspm,
1796 snd_rawmidi_receive (hmidi->input, buf,
1799 /* flush the MIDI input FIFO */
1801 snd_hdspm_midi_read_byte (hmidi->hdspm,
1806 spin_unlock_irqrestore(&hmidi->lock, flags);
1808 spin_lock_irqsave(&hmidi->hdspm->lock, flags);
1809 hmidi->hdspm->control_register |= hmidi->ie;
1810 hdspm_write(hmidi->hdspm, HDSPM_controlRegister,
1811 hmidi->hdspm->control_register);
1812 spin_unlock_irqrestore(&hmidi->hdspm->lock, flags);
1814 return snd_hdspm_midi_output_write (hmidi);
1818 snd_hdspm_midi_input_trigger(struct snd_rawmidi_substream *substream, int up)
1820 struct hdspm *hdspm;
1821 struct hdspm_midi *hmidi;
1822 unsigned long flags;
1824 hmidi = substream->rmidi->private_data;
1825 hdspm = hmidi->hdspm;
1827 spin_lock_irqsave (&hdspm->lock, flags);
1829 if (!(hdspm->control_register & hmidi->ie)) {
1830 snd_hdspm_flush_midi_input (hdspm, hmidi->id);
1831 hdspm->control_register |= hmidi->ie;
1834 hdspm->control_register &= ~hmidi->ie;
1837 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
1838 spin_unlock_irqrestore (&hdspm->lock, flags);
1841 static void snd_hdspm_midi_output_timer(unsigned long data)
1843 struct hdspm_midi *hmidi = (struct hdspm_midi *) data;
1844 unsigned long flags;
1846 snd_hdspm_midi_output_write(hmidi);
1847 spin_lock_irqsave (&hmidi->lock, flags);
1849 /* this does not bump hmidi->istimer, because the
1850 kernel automatically removed the timer when it
1851 expired, and we are now adding it back, thus
1852 leaving istimer wherever it was set before.
1855 if (hmidi->istimer) {
1856 hmidi->timer.expires = 1 + jiffies;
1857 add_timer(&hmidi->timer);
1860 spin_unlock_irqrestore (&hmidi->lock, flags);
1864 snd_hdspm_midi_output_trigger(struct snd_rawmidi_substream *substream, int up)
1866 struct hdspm_midi *hmidi;
1867 unsigned long flags;
1869 hmidi = substream->rmidi->private_data;
1870 spin_lock_irqsave (&hmidi->lock, flags);
1872 if (!hmidi->istimer) {
1873 init_timer(&hmidi->timer);
1874 hmidi->timer.function = snd_hdspm_midi_output_timer;
1875 hmidi->timer.data = (unsigned long) hmidi;
1876 hmidi->timer.expires = 1 + jiffies;
1877 add_timer(&hmidi->timer);
1881 if (hmidi->istimer && --hmidi->istimer <= 0)
1882 del_timer (&hmidi->timer);
1884 spin_unlock_irqrestore (&hmidi->lock, flags);
1886 snd_hdspm_midi_output_write(hmidi);
1889 static int snd_hdspm_midi_input_open(struct snd_rawmidi_substream *substream)
1891 struct hdspm_midi *hmidi;
1893 hmidi = substream->rmidi->private_data;
1894 spin_lock_irq (&hmidi->lock);
1895 snd_hdspm_flush_midi_input (hmidi->hdspm, hmidi->id);
1896 hmidi->input = substream;
1897 spin_unlock_irq (&hmidi->lock);
1902 static int snd_hdspm_midi_output_open(struct snd_rawmidi_substream *substream)
1904 struct hdspm_midi *hmidi;
1906 hmidi = substream->rmidi->private_data;
1907 spin_lock_irq (&hmidi->lock);
1908 hmidi->output = substream;
1909 spin_unlock_irq (&hmidi->lock);
1914 static int snd_hdspm_midi_input_close(struct snd_rawmidi_substream *substream)
1916 struct hdspm_midi *hmidi;
1918 snd_hdspm_midi_input_trigger (substream, 0);
1920 hmidi = substream->rmidi->private_data;
1921 spin_lock_irq (&hmidi->lock);
1922 hmidi->input = NULL;
1923 spin_unlock_irq (&hmidi->lock);
1928 static int snd_hdspm_midi_output_close(struct snd_rawmidi_substream *substream)
1930 struct hdspm_midi *hmidi;
1932 snd_hdspm_midi_output_trigger (substream, 0);
1934 hmidi = substream->rmidi->private_data;
1935 spin_lock_irq (&hmidi->lock);
1936 hmidi->output = NULL;
1937 spin_unlock_irq (&hmidi->lock);
1942 static struct snd_rawmidi_ops snd_hdspm_midi_output =
1944 .open = snd_hdspm_midi_output_open,
1945 .close = snd_hdspm_midi_output_close,
1946 .trigger = snd_hdspm_midi_output_trigger,
1949 static struct snd_rawmidi_ops snd_hdspm_midi_input =
1951 .open = snd_hdspm_midi_input_open,
1952 .close = snd_hdspm_midi_input_close,
1953 .trigger = snd_hdspm_midi_input_trigger,
1956 static int snd_hdspm_create_midi(struct snd_card *card,
1957 struct hdspm *hdspm, int id)
1962 hdspm->midi[id].id = id;
1963 hdspm->midi[id].hdspm = hdspm;
1964 spin_lock_init (&hdspm->midi[id].lock);
1967 if (MADIface == hdspm->io_type) {
1968 /* MIDI-over-MADI on HDSPe MADIface */
1969 hdspm->midi[0].dataIn = HDSPM_midiDataIn2;
1970 hdspm->midi[0].statusIn = HDSPM_midiStatusIn2;
1971 hdspm->midi[0].dataOut = HDSPM_midiDataOut2;
1972 hdspm->midi[0].statusOut = HDSPM_midiStatusOut2;
1973 hdspm->midi[0].ie = HDSPM_Midi2InterruptEnable;
1974 hdspm->midi[0].irq = HDSPM_midi2IRQPending;
1976 hdspm->midi[0].dataIn = HDSPM_midiDataIn0;
1977 hdspm->midi[0].statusIn = HDSPM_midiStatusIn0;
1978 hdspm->midi[0].dataOut = HDSPM_midiDataOut0;
1979 hdspm->midi[0].statusOut = HDSPM_midiStatusOut0;
1980 hdspm->midi[0].ie = HDSPM_Midi0InterruptEnable;
1981 hdspm->midi[0].irq = HDSPM_midi0IRQPending;
1983 } else if (1 == id) {
1984 hdspm->midi[1].dataIn = HDSPM_midiDataIn1;
1985 hdspm->midi[1].statusIn = HDSPM_midiStatusIn1;
1986 hdspm->midi[1].dataOut = HDSPM_midiDataOut1;
1987 hdspm->midi[1].statusOut = HDSPM_midiStatusOut1;
1988 hdspm->midi[1].ie = HDSPM_Midi1InterruptEnable;
1989 hdspm->midi[1].irq = HDSPM_midi1IRQPending;
1990 } else if ((2 == id) && (MADI == hdspm->io_type)) {
1991 /* MIDI-over-MADI on HDSPe MADI */
1992 hdspm->midi[2].dataIn = HDSPM_midiDataIn2;
1993 hdspm->midi[2].statusIn = HDSPM_midiStatusIn2;
1994 hdspm->midi[2].dataOut = HDSPM_midiDataOut2;
1995 hdspm->midi[2].statusOut = HDSPM_midiStatusOut2;
1996 hdspm->midi[2].ie = HDSPM_Midi2InterruptEnable;
1997 hdspm->midi[2].irq = HDSPM_midi2IRQPending;
1998 } else if (2 == id) {
1999 /* TCO MTC, read only */
2000 hdspm->midi[2].dataIn = HDSPM_midiDataIn2;
2001 hdspm->midi[2].statusIn = HDSPM_midiStatusIn2;
2002 hdspm->midi[2].dataOut = -1;
2003 hdspm->midi[2].statusOut = -1;
2004 hdspm->midi[2].ie = HDSPM_Midi2InterruptEnable;
2005 hdspm->midi[2].irq = HDSPM_midi2IRQPendingAES;
2006 } else if (3 == id) {
2007 /* TCO MTC on HDSPe MADI */
2008 hdspm->midi[3].dataIn = HDSPM_midiDataIn3;
2009 hdspm->midi[3].statusIn = HDSPM_midiStatusIn3;
2010 hdspm->midi[3].dataOut = -1;
2011 hdspm->midi[3].statusOut = -1;
2012 hdspm->midi[3].ie = HDSPM_Midi3InterruptEnable;
2013 hdspm->midi[3].irq = HDSPM_midi3IRQPending;
2016 if ((id < 2) || ((2 == id) && ((MADI == hdspm->io_type) ||
2017 (MADIface == hdspm->io_type)))) {
2018 if ((id == 0) && (MADIface == hdspm->io_type)) {
2019 sprintf(buf, "%s MIDIoverMADI", card->shortname);
2020 } else if ((id == 2) && (MADI == hdspm->io_type)) {
2021 sprintf(buf, "%s MIDIoverMADI", card->shortname);
2023 sprintf(buf, "%s MIDI %d", card->shortname, id+1);
2025 err = snd_rawmidi_new(card, buf, id, 1, 1,
2026 &hdspm->midi[id].rmidi);
2030 sprintf(hdspm->midi[id].rmidi->name, "%s MIDI %d",
2032 hdspm->midi[id].rmidi->private_data = &hdspm->midi[id];
2034 snd_rawmidi_set_ops(hdspm->midi[id].rmidi,
2035 SNDRV_RAWMIDI_STREAM_OUTPUT,
2036 &snd_hdspm_midi_output);
2037 snd_rawmidi_set_ops(hdspm->midi[id].rmidi,
2038 SNDRV_RAWMIDI_STREAM_INPUT,
2039 &snd_hdspm_midi_input);
2041 hdspm->midi[id].rmidi->info_flags |=
2042 SNDRV_RAWMIDI_INFO_OUTPUT |
2043 SNDRV_RAWMIDI_INFO_INPUT |
2044 SNDRV_RAWMIDI_INFO_DUPLEX;
2046 /* TCO MTC, read only */
2047 sprintf(buf, "%s MTC %d", card->shortname, id+1);
2048 err = snd_rawmidi_new(card, buf, id, 1, 1,
2049 &hdspm->midi[id].rmidi);
2053 sprintf(hdspm->midi[id].rmidi->name,
2054 "%s MTC %d", card->id, id+1);
2055 hdspm->midi[id].rmidi->private_data = &hdspm->midi[id];
2057 snd_rawmidi_set_ops(hdspm->midi[id].rmidi,
2058 SNDRV_RAWMIDI_STREAM_INPUT,
2059 &snd_hdspm_midi_input);
2061 hdspm->midi[id].rmidi->info_flags |= SNDRV_RAWMIDI_INFO_INPUT;
2068 static void hdspm_midi_tasklet(unsigned long arg)
2070 struct hdspm *hdspm = (struct hdspm *)arg;
2073 while (i < hdspm->midiPorts) {
2074 if (hdspm->midi[i].pending)
2075 snd_hdspm_midi_input_read(&hdspm->midi[i]);
2082 /*-----------------------------------------------------------------------------
2084 ----------------------------------------------------------------------------*/
2086 /* get the system sample rate which is set */
2089 static inline int hdspm_get_pll_freq(struct hdspm *hdspm)
2091 unsigned int period, rate;
2093 period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ);
2094 rate = hdspm_calc_dds_value(hdspm, period);
2100 * Calculate the real sample rate from the
2101 * current DDS value.
2103 static int hdspm_get_system_sample_rate(struct hdspm *hdspm)
2107 rate = hdspm_get_pll_freq(hdspm);
2109 if (rate > 207000) {
2110 /* Unreasonable high sample rate as seen on PCI MADI cards. */
2111 if (0 == hdspm_system_clock_mode(hdspm)) {
2112 /* master mode, return internal sample rate */
2113 rate = hdspm->system_sample_rate;
2115 /* slave mode, return external sample rate */
2116 rate = hdspm_external_sample_rate(hdspm);
2124 #define HDSPM_SYSTEM_SAMPLE_RATE(xname, xindex) \
2125 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2128 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
2129 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2130 .info = snd_hdspm_info_system_sample_rate, \
2131 .put = snd_hdspm_put_system_sample_rate, \
2132 .get = snd_hdspm_get_system_sample_rate \
2135 static int snd_hdspm_info_system_sample_rate(struct snd_kcontrol *kcontrol,
2136 struct snd_ctl_elem_info *uinfo)
2138 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2140 uinfo->value.integer.min = 27000;
2141 uinfo->value.integer.max = 207000;
2142 uinfo->value.integer.step = 1;
2147 static int snd_hdspm_get_system_sample_rate(struct snd_kcontrol *kcontrol,
2148 struct snd_ctl_elem_value *
2151 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2153 ucontrol->value.integer.value[0] = hdspm_get_system_sample_rate(hdspm);
2157 static int snd_hdspm_put_system_sample_rate(struct snd_kcontrol *kcontrol,
2158 struct snd_ctl_elem_value *
2161 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2163 hdspm_set_dds_value(hdspm, ucontrol->value.enumerated.item[0]);
2169 * Returns the WordClock sample rate class for the given card.
2171 static int hdspm_get_wc_sample_rate(struct hdspm *hdspm)
2175 switch (hdspm->io_type) {
2178 status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
2179 return (status >> 16) & 0xF;
2182 status = hdspm_read(hdspm, HDSPM_statusRegister);
2183 return (status >> HDSPM_AES32_wcFreq_bit) & 0xF;
2194 * Returns the TCO sample rate class for the given card.
2196 static int hdspm_get_tco_sample_rate(struct hdspm *hdspm)
2201 switch (hdspm->io_type) {
2204 status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
2205 return (status >> 20) & 0xF;
2208 status = hdspm_read(hdspm, HDSPM_statusRegister);
2209 return (status >> 1) & 0xF;
2220 * Returns the SYNC_IN sample rate class for the given card.
2222 static int hdspm_get_sync_in_sample_rate(struct hdspm *hdspm)
2227 switch (hdspm->io_type) {
2230 status = hdspm_read(hdspm, HDSPM_RD_STATUS_2);
2231 return (status >> 12) & 0xF;
2242 * Returns the AES sample rate class for the given card.
2244 static int hdspm_get_aes_sample_rate(struct hdspm *hdspm, int index)
2248 switch (hdspm->io_type) {
2250 timecode = hdspm_read(hdspm, HDSPM_timecodeRegister);
2251 return (timecode >> (4*index)) & 0xF;
2260 * Returns the sample rate class for input source <idx> for
2261 * 'new style' cards like the AIO and RayDAT.
2263 static int hdspm_get_s1_sample_rate(struct hdspm *hdspm, unsigned int idx)
2265 int status = hdspm_read(hdspm, HDSPM_RD_STATUS_2);
2267 return (status >> (idx*4)) & 0xF;
2270 static void snd_hdspm_set_infotext(struct snd_ctl_elem_info *uinfo,
2271 char **texts, const int count)
2273 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2275 uinfo->value.enumerated.items = count;
2276 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2277 uinfo->value.enumerated.item =
2278 uinfo->value.enumerated.items - 1;
2279 strcpy(uinfo->value.enumerated.name,
2280 texts[uinfo->value.enumerated.item]);
2283 #define ENUMERATED_CTL_INFO(info, texts) \
2284 snd_hdspm_set_infotext(info, texts, ARRAY_SIZE(texts))
2288 #define HDSPM_AUTOSYNC_SAMPLE_RATE(xname, xindex) \
2289 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2291 .private_value = xindex, \
2292 .access = SNDRV_CTL_ELEM_ACCESS_READ, \
2293 .info = snd_hdspm_info_autosync_sample_rate, \
2294 .get = snd_hdspm_get_autosync_sample_rate \
2298 static int snd_hdspm_info_autosync_sample_rate(struct snd_kcontrol *kcontrol,
2299 struct snd_ctl_elem_info *uinfo)
2301 ENUMERATED_CTL_INFO(uinfo, texts_freq);
2306 static int snd_hdspm_get_autosync_sample_rate(struct snd_kcontrol *kcontrol,
2307 struct snd_ctl_elem_value *
2310 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2312 switch (hdspm->io_type) {
2314 switch (kcontrol->private_value) {
2316 ucontrol->value.enumerated.item[0] =
2317 hdspm_get_wc_sample_rate(hdspm);
2320 ucontrol->value.enumerated.item[0] =
2321 hdspm_get_tco_sample_rate(hdspm);
2324 ucontrol->value.enumerated.item[0] =
2325 hdspm_get_sync_in_sample_rate(hdspm);
2328 ucontrol->value.enumerated.item[0] =
2329 hdspm_get_s1_sample_rate(hdspm,
2330 kcontrol->private_value-1);
2335 switch (kcontrol->private_value) {
2337 ucontrol->value.enumerated.item[0] =
2338 hdspm_get_wc_sample_rate(hdspm);
2341 ucontrol->value.enumerated.item[0] =
2342 hdspm_get_tco_sample_rate(hdspm);
2344 case 5: /* SYNC_IN */
2345 ucontrol->value.enumerated.item[0] =
2346 hdspm_get_sync_in_sample_rate(hdspm);
2349 ucontrol->value.enumerated.item[0] =
2350 hdspm_get_s1_sample_rate(hdspm,
2351 kcontrol->private_value-1);
2357 switch (kcontrol->private_value) {
2359 ucontrol->value.enumerated.item[0] =
2360 hdspm_get_wc_sample_rate(hdspm);
2363 ucontrol->value.enumerated.item[0] =
2364 hdspm_get_tco_sample_rate(hdspm);
2366 case 10: /* SYNC_IN */
2367 ucontrol->value.enumerated.item[0] =
2368 hdspm_get_sync_in_sample_rate(hdspm);
2370 default: /* AES1 to AES8 */
2371 ucontrol->value.enumerated.item[0] =
2372 hdspm_get_s1_sample_rate(hdspm,
2373 kcontrol->private_value-1);
2381 int rate = hdspm_external_sample_rate(hdspm);
2382 int i, selected_rate = 0;
2383 for (i = 1; i < 10; i++)
2384 if (HDSPM_bit2freq(i) == rate) {
2388 ucontrol->value.enumerated.item[0] = selected_rate;
2400 #define HDSPM_SYSTEM_CLOCK_MODE(xname, xindex) \
2401 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2404 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
2405 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2406 .info = snd_hdspm_info_system_clock_mode, \
2407 .get = snd_hdspm_get_system_clock_mode, \
2408 .put = snd_hdspm_put_system_clock_mode, \
2413 * Returns the system clock mode for the given card.
2414 * @returns 0 - master, 1 - slave
2416 static int hdspm_system_clock_mode(struct hdspm *hdspm)
2418 switch (hdspm->io_type) {
2421 if (hdspm->settings_register & HDSPM_c0Master)
2426 if (hdspm->control_register & HDSPM_ClockModeMaster)
2435 * Sets the system clock mode.
2436 * @param mode 0 - master, 1 - slave
2438 static void hdspm_set_system_clock_mode(struct hdspm *hdspm, int mode)
2440 hdspm_set_toggle_setting(hdspm,
2441 (hdspm_is_raydat_or_aio(hdspm)) ?
2442 HDSPM_c0Master : HDSPM_ClockModeMaster,
2447 static int snd_hdspm_info_system_clock_mode(struct snd_kcontrol *kcontrol,
2448 struct snd_ctl_elem_info *uinfo)
2450 static char *texts[] = { "Master", "AutoSync" };
2451 ENUMERATED_CTL_INFO(uinfo, texts);
2455 static int snd_hdspm_get_system_clock_mode(struct snd_kcontrol *kcontrol,
2456 struct snd_ctl_elem_value *ucontrol)
2458 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2460 ucontrol->value.enumerated.item[0] = hdspm_system_clock_mode(hdspm);
2464 static int snd_hdspm_put_system_clock_mode(struct snd_kcontrol *kcontrol,
2465 struct snd_ctl_elem_value *ucontrol)
2467 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2470 if (!snd_hdspm_use_is_exclusive(hdspm))
2473 val = ucontrol->value.enumerated.item[0];
2479 hdspm_set_system_clock_mode(hdspm, val);
2485 #define HDSPM_INTERNAL_CLOCK(xname, xindex) \
2486 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2489 .info = snd_hdspm_info_clock_source, \
2490 .get = snd_hdspm_get_clock_source, \
2491 .put = snd_hdspm_put_clock_source \
2495 static int hdspm_clock_source(struct hdspm * hdspm)
2497 switch (hdspm->system_sample_rate) {
2498 case 32000: return 0;
2499 case 44100: return 1;
2500 case 48000: return 2;
2501 case 64000: return 3;
2502 case 88200: return 4;
2503 case 96000: return 5;
2504 case 128000: return 6;
2505 case 176400: return 7;
2506 case 192000: return 8;
2512 static int hdspm_set_clock_source(struct hdspm * hdspm, int mode)
2517 rate = 32000; break;
2519 rate = 44100; break;
2521 rate = 48000; break;
2523 rate = 64000; break;
2525 rate = 88200; break;
2527 rate = 96000; break;
2529 rate = 128000; break;
2531 rate = 176400; break;
2533 rate = 192000; break;
2537 hdspm_set_rate(hdspm, rate, 1);
2541 static int snd_hdspm_info_clock_source(struct snd_kcontrol *kcontrol,
2542 struct snd_ctl_elem_info *uinfo)
2544 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2546 uinfo->value.enumerated.items = 9;
2548 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2549 uinfo->value.enumerated.item =
2550 uinfo->value.enumerated.items - 1;
2552 strcpy(uinfo->value.enumerated.name,
2553 texts_freq[uinfo->value.enumerated.item+1]);
2558 static int snd_hdspm_get_clock_source(struct snd_kcontrol *kcontrol,
2559 struct snd_ctl_elem_value *ucontrol)
2561 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2563 ucontrol->value.enumerated.item[0] = hdspm_clock_source(hdspm);
2567 static int snd_hdspm_put_clock_source(struct snd_kcontrol *kcontrol,
2568 struct snd_ctl_elem_value *ucontrol)
2570 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2574 if (!snd_hdspm_use_is_exclusive(hdspm))
2576 val = ucontrol->value.enumerated.item[0];
2581 spin_lock_irq(&hdspm->lock);
2582 if (val != hdspm_clock_source(hdspm))
2583 change = (hdspm_set_clock_source(hdspm, val) == 0) ? 1 : 0;
2586 spin_unlock_irq(&hdspm->lock);
2591 #define HDSPM_PREF_SYNC_REF(xname, xindex) \
2592 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2595 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
2596 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2597 .info = snd_hdspm_info_pref_sync_ref, \
2598 .get = snd_hdspm_get_pref_sync_ref, \
2599 .put = snd_hdspm_put_pref_sync_ref \
2604 * Returns the current preferred sync reference setting.
2605 * The semantics of the return value are depending on the
2606 * card, please see the comments for clarification.
2608 static int hdspm_pref_sync_ref(struct hdspm * hdspm)
2610 switch (hdspm->io_type) {
2612 switch (hdspm->control_register & HDSPM_SyncRefMask) {
2613 case 0: return 0; /* WC */
2614 case HDSPM_SyncRef0: return 1; /* AES 1 */
2615 case HDSPM_SyncRef1: return 2; /* AES 2 */
2616 case HDSPM_SyncRef1+HDSPM_SyncRef0: return 3; /* AES 3 */
2617 case HDSPM_SyncRef2: return 4; /* AES 4 */
2618 case HDSPM_SyncRef2+HDSPM_SyncRef0: return 5; /* AES 5 */
2619 case HDSPM_SyncRef2+HDSPM_SyncRef1: return 6; /* AES 6 */
2620 case HDSPM_SyncRef2+HDSPM_SyncRef1+HDSPM_SyncRef0:
2621 return 7; /* AES 7 */
2622 case HDSPM_SyncRef3: return 8; /* AES 8 */
2623 case HDSPM_SyncRef3+HDSPM_SyncRef0: return 9; /* TCO */
2630 switch (hdspm->control_register & HDSPM_SyncRefMask) {
2631 case 0: return 0; /* WC */
2632 case HDSPM_SyncRef0: return 1; /* MADI */
2633 case HDSPM_SyncRef1: return 2; /* TCO */
2634 case HDSPM_SyncRef1+HDSPM_SyncRef0:
2635 return 3; /* SYNC_IN */
2638 switch (hdspm->control_register & HDSPM_SyncRefMask) {
2639 case 0: return 0; /* WC */
2640 case HDSPM_SyncRef0: return 1; /* MADI */
2641 case HDSPM_SyncRef1+HDSPM_SyncRef0:
2642 return 2; /* SYNC_IN */
2649 switch ((hdspm->settings_register &
2650 HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2651 case 0: return 0; /* WC */
2652 case 3: return 1; /* ADAT 1 */
2653 case 4: return 2; /* ADAT 2 */
2654 case 5: return 3; /* ADAT 3 */
2655 case 6: return 4; /* ADAT 4 */
2656 case 1: return 5; /* AES */
2657 case 2: return 6; /* SPDIF */
2658 case 9: return 7; /* TCO */
2659 case 10: return 8; /* SYNC_IN */
2662 switch ((hdspm->settings_register &
2663 HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2664 case 0: return 0; /* WC */
2665 case 3: return 1; /* ADAT 1 */
2666 case 4: return 2; /* ADAT 2 */
2667 case 5: return 3; /* ADAT 3 */
2668 case 6: return 4; /* ADAT 4 */
2669 case 1: return 5; /* AES */
2670 case 2: return 6; /* SPDIF */
2671 case 10: return 7; /* SYNC_IN */
2679 switch ((hdspm->settings_register &
2680 HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2681 case 0: return 0; /* WC */
2682 case 3: return 1; /* ADAT */
2683 case 1: return 2; /* AES */
2684 case 2: return 3; /* SPDIF */
2685 case 9: return 4; /* TCO */
2686 case 10: return 5; /* SYNC_IN */
2689 switch ((hdspm->settings_register &
2690 HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2691 case 0: return 0; /* WC */
2692 case 3: return 1; /* ADAT */
2693 case 1: return 2; /* AES */
2694 case 2: return 3; /* SPDIF */
2695 case 10: return 4; /* SYNC_IN */
2707 * Set the preferred sync reference to <pref>. The semantics
2708 * of <pref> are depending on the card type, see the comments
2709 * for clarification.
2711 static int hdspm_set_pref_sync_ref(struct hdspm * hdspm, int pref)
2715 switch (hdspm->io_type) {
2717 hdspm->control_register &= ~HDSPM_SyncRefMask;
2722 hdspm->control_register |= HDSPM_SyncRef0;
2725 hdspm->control_register |= HDSPM_SyncRef1;
2728 hdspm->control_register |=
2729 HDSPM_SyncRef1+HDSPM_SyncRef0;
2732 hdspm->control_register |= HDSPM_SyncRef2;
2735 hdspm->control_register |=
2736 HDSPM_SyncRef2+HDSPM_SyncRef0;
2739 hdspm->control_register |=
2740 HDSPM_SyncRef2+HDSPM_SyncRef1;
2743 hdspm->control_register |=
2744 HDSPM_SyncRef2+HDSPM_SyncRef1+HDSPM_SyncRef0;
2747 hdspm->control_register |= HDSPM_SyncRef3;
2750 hdspm->control_register |=
2751 HDSPM_SyncRef3+HDSPM_SyncRef0;
2761 hdspm->control_register &= ~HDSPM_SyncRefMask;
2767 hdspm->control_register |= HDSPM_SyncRef0;
2770 hdspm->control_register |= HDSPM_SyncRef1;
2772 case 3: /* SYNC_IN */
2773 hdspm->control_register |=
2774 HDSPM_SyncRef0+HDSPM_SyncRef1;
2784 hdspm->control_register |= HDSPM_SyncRef0;
2786 case 2: /* SYNC_IN */
2787 hdspm->control_register |=
2788 HDSPM_SyncRef0+HDSPM_SyncRef1;
2800 case 0: p = 0; break; /* WC */
2801 case 1: p = 3; break; /* ADAT 1 */
2802 case 2: p = 4; break; /* ADAT 2 */
2803 case 3: p = 5; break; /* ADAT 3 */
2804 case 4: p = 6; break; /* ADAT 4 */
2805 case 5: p = 1; break; /* AES */
2806 case 6: p = 2; break; /* SPDIF */
2807 case 7: p = 9; break; /* TCO */
2808 case 8: p = 10; break; /* SYNC_IN */
2813 case 0: p = 0; break; /* WC */
2814 case 1: p = 3; break; /* ADAT 1 */
2815 case 2: p = 4; break; /* ADAT 2 */
2816 case 3: p = 5; break; /* ADAT 3 */
2817 case 4: p = 6; break; /* ADAT 4 */
2818 case 5: p = 1; break; /* AES */
2819 case 6: p = 2; break; /* SPDIF */
2820 case 7: p = 10; break; /* SYNC_IN */
2829 case 0: p = 0; break; /* WC */
2830 case 1: p = 3; break; /* ADAT */
2831 case 2: p = 1; break; /* AES */
2832 case 3: p = 2; break; /* SPDIF */
2833 case 4: p = 9; break; /* TCO */
2834 case 5: p = 10; break; /* SYNC_IN */
2839 case 0: p = 0; break; /* WC */
2840 case 1: p = 3; break; /* ADAT */
2841 case 2: p = 1; break; /* AES */
2842 case 3: p = 2; break; /* SPDIF */
2843 case 4: p = 10; break; /* SYNC_IN */
2850 switch (hdspm->io_type) {
2853 hdspm->settings_register &= ~HDSPM_c0_SyncRefMask;
2854 hdspm->settings_register |= HDSPM_c0_SyncRef0 * p;
2855 hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register);
2861 hdspm_write(hdspm, HDSPM_controlRegister,
2862 hdspm->control_register);
2869 static int snd_hdspm_info_pref_sync_ref(struct snd_kcontrol *kcontrol,
2870 struct snd_ctl_elem_info *uinfo)
2872 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2874 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2876 uinfo->value.enumerated.items = hdspm->texts_autosync_items;
2878 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2879 uinfo->value.enumerated.item =
2880 uinfo->value.enumerated.items - 1;
2882 strcpy(uinfo->value.enumerated.name,
2883 hdspm->texts_autosync[uinfo->value.enumerated.item]);
2888 static int snd_hdspm_get_pref_sync_ref(struct snd_kcontrol *kcontrol,
2889 struct snd_ctl_elem_value *ucontrol)
2891 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2892 int psf = hdspm_pref_sync_ref(hdspm);
2895 ucontrol->value.enumerated.item[0] = psf;
2902 static int snd_hdspm_put_pref_sync_ref(struct snd_kcontrol *kcontrol,
2903 struct snd_ctl_elem_value *ucontrol)
2905 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2906 int val, change = 0;
2908 if (!snd_hdspm_use_is_exclusive(hdspm))
2911 val = ucontrol->value.enumerated.item[0];
2915 else if (val >= hdspm->texts_autosync_items)
2916 val = hdspm->texts_autosync_items-1;
2918 spin_lock_irq(&hdspm->lock);
2919 if (val != hdspm_pref_sync_ref(hdspm))
2920 change = (0 == hdspm_set_pref_sync_ref(hdspm, val)) ? 1 : 0;
2922 spin_unlock_irq(&hdspm->lock);
2927 #define HDSPM_AUTOSYNC_REF(xname, xindex) \
2928 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2931 .access = SNDRV_CTL_ELEM_ACCESS_READ, \
2932 .info = snd_hdspm_info_autosync_ref, \
2933 .get = snd_hdspm_get_autosync_ref, \
2936 static int hdspm_autosync_ref(struct hdspm *hdspm)
2938 if (AES32 == hdspm->io_type) {
2939 unsigned int status = hdspm_read(hdspm, HDSPM_statusRegister);
2940 unsigned int syncref =
2941 (status >> HDSPM_AES32_syncref_bit) & 0xF;
2943 return HDSPM_AES32_AUTOSYNC_FROM_WORD;
2946 return HDSPM_AES32_AUTOSYNC_FROM_NONE;
2947 } else if (MADI == hdspm->io_type) {
2948 /* This looks at the autosync selected sync reference */
2949 unsigned int status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
2951 switch (status2 & HDSPM_SelSyncRefMask) {
2952 case HDSPM_SelSyncRef_WORD:
2953 return HDSPM_AUTOSYNC_FROM_WORD;
2954 case HDSPM_SelSyncRef_MADI:
2955 return HDSPM_AUTOSYNC_FROM_MADI;
2956 case HDSPM_SelSyncRef_TCO:
2957 return HDSPM_AUTOSYNC_FROM_TCO;
2958 case HDSPM_SelSyncRef_SyncIn:
2959 return HDSPM_AUTOSYNC_FROM_SYNC_IN;
2960 case HDSPM_SelSyncRef_NVALID:
2961 return HDSPM_AUTOSYNC_FROM_NONE;
2963 return HDSPM_AUTOSYNC_FROM_NONE;
2971 static int snd_hdspm_info_autosync_ref(struct snd_kcontrol *kcontrol,
2972 struct snd_ctl_elem_info *uinfo)
2974 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2976 if (AES32 == hdspm->io_type) {
2977 static char *texts[] = { "WordClock", "AES1", "AES2", "AES3",
2978 "AES4", "AES5", "AES6", "AES7", "AES8", "TCO", "Sync In", "None"};
2980 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2982 uinfo->value.enumerated.items = ARRAY_SIZE(texts);
2983 if (uinfo->value.enumerated.item >=
2984 uinfo->value.enumerated.items)
2985 uinfo->value.enumerated.item =
2986 uinfo->value.enumerated.items - 1;
2987 strcpy(uinfo->value.enumerated.name,
2988 texts[uinfo->value.enumerated.item]);
2989 } else if (MADI == hdspm->io_type) {
2990 static char *texts[] = {"Word Clock", "MADI", "TCO",
2991 "Sync In", "None" };
2993 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2995 uinfo->value.enumerated.items = 5;
2996 if (uinfo->value.enumerated.item >=
2997 uinfo->value.enumerated.items)
2998 uinfo->value.enumerated.item =
2999 uinfo->value.enumerated.items - 1;
3000 strcpy(uinfo->value.enumerated.name,
3001 texts[uinfo->value.enumerated.item]);
3006 static int snd_hdspm_get_autosync_ref(struct snd_kcontrol *kcontrol,
3007 struct snd_ctl_elem_value *ucontrol)
3009 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3011 ucontrol->value.enumerated.item[0] = hdspm_autosync_ref(hdspm);
3017 #define HDSPM_TCO_VIDEO_INPUT_FORMAT(xname, xindex) \
3018 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3020 .access = SNDRV_CTL_ELEM_ACCESS_READ |\
3021 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3022 .info = snd_hdspm_info_tco_video_input_format, \
3023 .get = snd_hdspm_get_tco_video_input_format, \
3026 static int snd_hdspm_info_tco_video_input_format(struct snd_kcontrol *kcontrol,
3027 struct snd_ctl_elem_info *uinfo)
3029 static char *texts[] = {"No video", "NTSC", "PAL"};
3030 ENUMERATED_CTL_INFO(uinfo, texts);
3034 static int snd_hdspm_get_tco_video_input_format(struct snd_kcontrol *kcontrol,
3035 struct snd_ctl_elem_value *ucontrol)
3040 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3041 status = hdspm_read(hdspm, HDSPM_RD_TCO + 4);
3042 switch (status & (HDSPM_TCO1_Video_Input_Format_NTSC |
3043 HDSPM_TCO1_Video_Input_Format_PAL)) {
3044 case HDSPM_TCO1_Video_Input_Format_NTSC:
3048 case HDSPM_TCO1_Video_Input_Format_PAL:
3057 ucontrol->value.enumerated.item[0] = ret;
3063 #define HDSPM_TCO_LTC_FRAMES(xname, xindex) \
3064 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3066 .access = SNDRV_CTL_ELEM_ACCESS_READ |\
3067 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3068 .info = snd_hdspm_info_tco_ltc_frames, \
3069 .get = snd_hdspm_get_tco_ltc_frames, \
3072 static int snd_hdspm_info_tco_ltc_frames(struct snd_kcontrol *kcontrol,
3073 struct snd_ctl_elem_info *uinfo)
3075 static char *texts[] = {"No lock", "24 fps", "25 fps", "29.97 fps",
3077 ENUMERATED_CTL_INFO(uinfo, texts);
3081 static int hdspm_tco_ltc_frames(struct hdspm *hdspm)
3086 status = hdspm_read(hdspm, HDSPM_RD_TCO + 4);
3087 if (status & HDSPM_TCO1_LTC_Input_valid) {
3088 switch (status & (HDSPM_TCO1_LTC_Format_LSB |
3089 HDSPM_TCO1_LTC_Format_MSB)) {
3094 case HDSPM_TCO1_LTC_Format_LSB:
3098 case HDSPM_TCO1_LTC_Format_MSB:
3112 static int snd_hdspm_get_tco_ltc_frames(struct snd_kcontrol *kcontrol,
3113 struct snd_ctl_elem_value *ucontrol)
3115 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3117 ucontrol->value.enumerated.item[0] = hdspm_tco_ltc_frames(hdspm);
3121 #define HDSPM_TOGGLE_SETTING(xname, xindex) \
3122 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3124 .private_value = xindex, \
3125 .info = snd_hdspm_info_toggle_setting, \
3126 .get = snd_hdspm_get_toggle_setting, \
3127 .put = snd_hdspm_put_toggle_setting \
3130 static int hdspm_toggle_setting(struct hdspm *hdspm, u32 regmask)
3134 if (hdspm_is_raydat_or_aio(hdspm))
3135 reg = hdspm->settings_register;
3137 reg = hdspm->control_register;
3139 return (reg & regmask) ? 1 : 0;
3142 static int hdspm_set_toggle_setting(struct hdspm *hdspm, u32 regmask, int out)
3147 if (hdspm_is_raydat_or_aio(hdspm)) {
3148 reg = &(hdspm->settings_register);
3149 target_reg = HDSPM_WR_SETTINGS;
3151 reg = &(hdspm->control_register);
3152 target_reg = HDSPM_controlRegister;
3160 hdspm_write(hdspm, target_reg, *reg);
3165 #define snd_hdspm_info_toggle_setting snd_ctl_boolean_mono_info
3167 static int snd_hdspm_get_toggle_setting(struct snd_kcontrol *kcontrol,
3168 struct snd_ctl_elem_value *ucontrol)
3170 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3171 u32 regmask = kcontrol->private_value;
3173 spin_lock_irq(&hdspm->lock);
3174 ucontrol->value.integer.value[0] = hdspm_toggle_setting(hdspm, regmask);
3175 spin_unlock_irq(&hdspm->lock);
3179 static int snd_hdspm_put_toggle_setting(struct snd_kcontrol *kcontrol,
3180 struct snd_ctl_elem_value *ucontrol)
3182 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3183 u32 regmask = kcontrol->private_value;
3187 if (!snd_hdspm_use_is_exclusive(hdspm))
3189 val = ucontrol->value.integer.value[0] & 1;
3190 spin_lock_irq(&hdspm->lock);
3191 change = (int) val != hdspm_toggle_setting(hdspm, regmask);
3192 hdspm_set_toggle_setting(hdspm, regmask, val);
3193 spin_unlock_irq(&hdspm->lock);
3197 #define HDSPM_INPUT_SELECT(xname, xindex) \
3198 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3201 .info = snd_hdspm_info_input_select, \
3202 .get = snd_hdspm_get_input_select, \
3203 .put = snd_hdspm_put_input_select \
3206 static int hdspm_input_select(struct hdspm * hdspm)
3208 return (hdspm->control_register & HDSPM_InputSelect0) ? 1 : 0;
3211 static int hdspm_set_input_select(struct hdspm * hdspm, int out)
3214 hdspm->control_register |= HDSPM_InputSelect0;
3216 hdspm->control_register &= ~HDSPM_InputSelect0;
3217 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3222 static int snd_hdspm_info_input_select(struct snd_kcontrol *kcontrol,
3223 struct snd_ctl_elem_info *uinfo)
3225 static char *texts[] = { "optical", "coaxial" };
3226 ENUMERATED_CTL_INFO(uinfo, texts);
3230 static int snd_hdspm_get_input_select(struct snd_kcontrol *kcontrol,
3231 struct snd_ctl_elem_value *ucontrol)
3233 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3235 spin_lock_irq(&hdspm->lock);
3236 ucontrol->value.enumerated.item[0] = hdspm_input_select(hdspm);
3237 spin_unlock_irq(&hdspm->lock);
3241 static int snd_hdspm_put_input_select(struct snd_kcontrol *kcontrol,
3242 struct snd_ctl_elem_value *ucontrol)
3244 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3248 if (!snd_hdspm_use_is_exclusive(hdspm))
3250 val = ucontrol->value.integer.value[0] & 1;
3251 spin_lock_irq(&hdspm->lock);
3252 change = (int) val != hdspm_input_select(hdspm);
3253 hdspm_set_input_select(hdspm, val);
3254 spin_unlock_irq(&hdspm->lock);
3259 #define HDSPM_DS_WIRE(xname, xindex) \
3260 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3263 .info = snd_hdspm_info_ds_wire, \
3264 .get = snd_hdspm_get_ds_wire, \
3265 .put = snd_hdspm_put_ds_wire \
3268 static int hdspm_ds_wire(struct hdspm * hdspm)
3270 return (hdspm->control_register & HDSPM_DS_DoubleWire) ? 1 : 0;
3273 static int hdspm_set_ds_wire(struct hdspm * hdspm, int ds)
3276 hdspm->control_register |= HDSPM_DS_DoubleWire;
3278 hdspm->control_register &= ~HDSPM_DS_DoubleWire;
3279 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3284 static int snd_hdspm_info_ds_wire(struct snd_kcontrol *kcontrol,
3285 struct snd_ctl_elem_info *uinfo)
3287 static char *texts[] = { "Single", "Double" };
3288 ENUMERATED_CTL_INFO(uinfo, texts);
3292 static int snd_hdspm_get_ds_wire(struct snd_kcontrol *kcontrol,
3293 struct snd_ctl_elem_value *ucontrol)
3295 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3297 spin_lock_irq(&hdspm->lock);
3298 ucontrol->value.enumerated.item[0] = hdspm_ds_wire(hdspm);
3299 spin_unlock_irq(&hdspm->lock);
3303 static int snd_hdspm_put_ds_wire(struct snd_kcontrol *kcontrol,
3304 struct snd_ctl_elem_value *ucontrol)
3306 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3310 if (!snd_hdspm_use_is_exclusive(hdspm))
3312 val = ucontrol->value.integer.value[0] & 1;
3313 spin_lock_irq(&hdspm->lock);
3314 change = (int) val != hdspm_ds_wire(hdspm);
3315 hdspm_set_ds_wire(hdspm, val);
3316 spin_unlock_irq(&hdspm->lock);
3321 #define HDSPM_QS_WIRE(xname, xindex) \
3322 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3325 .info = snd_hdspm_info_qs_wire, \
3326 .get = snd_hdspm_get_qs_wire, \
3327 .put = snd_hdspm_put_qs_wire \
3330 static int hdspm_qs_wire(struct hdspm * hdspm)
3332 if (hdspm->control_register & HDSPM_QS_DoubleWire)
3334 if (hdspm->control_register & HDSPM_QS_QuadWire)
3339 static int hdspm_set_qs_wire(struct hdspm * hdspm, int mode)
3341 hdspm->control_register &= ~(HDSPM_QS_DoubleWire | HDSPM_QS_QuadWire);
3346 hdspm->control_register |= HDSPM_QS_DoubleWire;
3349 hdspm->control_register |= HDSPM_QS_QuadWire;
3352 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3357 static int snd_hdspm_info_qs_wire(struct snd_kcontrol *kcontrol,
3358 struct snd_ctl_elem_info *uinfo)
3360 static char *texts[] = { "Single", "Double", "Quad" };
3361 ENUMERATED_CTL_INFO(uinfo, texts);
3365 static int snd_hdspm_get_qs_wire(struct snd_kcontrol *kcontrol,
3366 struct snd_ctl_elem_value *ucontrol)
3368 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3370 spin_lock_irq(&hdspm->lock);
3371 ucontrol->value.enumerated.item[0] = hdspm_qs_wire(hdspm);
3372 spin_unlock_irq(&hdspm->lock);
3376 static int snd_hdspm_put_qs_wire(struct snd_kcontrol *kcontrol,
3377 struct snd_ctl_elem_value *ucontrol)
3379 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3383 if (!snd_hdspm_use_is_exclusive(hdspm))
3385 val = ucontrol->value.integer.value[0];
3390 spin_lock_irq(&hdspm->lock);
3391 change = val != hdspm_qs_wire(hdspm);
3392 hdspm_set_qs_wire(hdspm, val);
3393 spin_unlock_irq(&hdspm->lock);
3397 #define HDSPM_CONTROL_TRISTATE(xname, xindex) \
3398 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3400 .private_value = xindex, \
3401 .info = snd_hdspm_info_tristate, \
3402 .get = snd_hdspm_get_tristate, \
3403 .put = snd_hdspm_put_tristate \
3406 static int hdspm_tristate(struct hdspm *hdspm, u32 regmask)
3408 u32 reg = hdspm->settings_register & (regmask * 3);
3409 return reg / regmask;
3412 static int hdspm_set_tristate(struct hdspm *hdspm, int mode, u32 regmask)
3414 hdspm->settings_register &= ~(regmask * 3);
3415 hdspm->settings_register |= (regmask * mode);
3416 hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register);
3421 static int snd_hdspm_info_tristate(struct snd_kcontrol *kcontrol,
3422 struct snd_ctl_elem_info *uinfo)
3424 u32 regmask = kcontrol->private_value;
3426 static char *texts_spdif[] = { "Optical", "Coaxial", "Internal" };
3427 static char *texts_levels[] = { "Hi Gain", "+4 dBu", "-10 dBV" };
3430 case HDSPM_c0_Input0:
3431 ENUMERATED_CTL_INFO(uinfo, texts_spdif);
3434 ENUMERATED_CTL_INFO(uinfo, texts_levels);
3440 static int snd_hdspm_get_tristate(struct snd_kcontrol *kcontrol,
3441 struct snd_ctl_elem_value *ucontrol)
3443 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3444 u32 regmask = kcontrol->private_value;
3446 spin_lock_irq(&hdspm->lock);
3447 ucontrol->value.enumerated.item[0] = hdspm_tristate(hdspm, regmask);
3448 spin_unlock_irq(&hdspm->lock);
3452 static int snd_hdspm_put_tristate(struct snd_kcontrol *kcontrol,
3453 struct snd_ctl_elem_value *ucontrol)
3455 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3456 u32 regmask = kcontrol->private_value;
3460 if (!snd_hdspm_use_is_exclusive(hdspm))
3462 val = ucontrol->value.integer.value[0];
3468 spin_lock_irq(&hdspm->lock);
3469 change = val != hdspm_tristate(hdspm, regmask);
3470 hdspm_set_tristate(hdspm, val, regmask);
3471 spin_unlock_irq(&hdspm->lock);
3475 #define HDSPM_MADI_SPEEDMODE(xname, xindex) \
3476 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3479 .info = snd_hdspm_info_madi_speedmode, \
3480 .get = snd_hdspm_get_madi_speedmode, \
3481 .put = snd_hdspm_put_madi_speedmode \
3484 static int hdspm_madi_speedmode(struct hdspm *hdspm)
3486 if (hdspm->control_register & HDSPM_QuadSpeed)
3488 if (hdspm->control_register & HDSPM_DoubleSpeed)
3493 static int hdspm_set_madi_speedmode(struct hdspm *hdspm, int mode)
3495 hdspm->control_register &= ~(HDSPM_DoubleSpeed | HDSPM_QuadSpeed);
3500 hdspm->control_register |= HDSPM_DoubleSpeed;
3503 hdspm->control_register |= HDSPM_QuadSpeed;
3506 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3511 static int snd_hdspm_info_madi_speedmode(struct snd_kcontrol *kcontrol,
3512 struct snd_ctl_elem_info *uinfo)
3514 static char *texts[] = { "Single", "Double", "Quad" };
3515 ENUMERATED_CTL_INFO(uinfo, texts);
3519 static int snd_hdspm_get_madi_speedmode(struct snd_kcontrol *kcontrol,
3520 struct snd_ctl_elem_value *ucontrol)
3522 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3524 spin_lock_irq(&hdspm->lock);
3525 ucontrol->value.enumerated.item[0] = hdspm_madi_speedmode(hdspm);
3526 spin_unlock_irq(&hdspm->lock);
3530 static int snd_hdspm_put_madi_speedmode(struct snd_kcontrol *kcontrol,
3531 struct snd_ctl_elem_value *ucontrol)
3533 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3537 if (!snd_hdspm_use_is_exclusive(hdspm))
3539 val = ucontrol->value.integer.value[0];
3544 spin_lock_irq(&hdspm->lock);
3545 change = val != hdspm_madi_speedmode(hdspm);
3546 hdspm_set_madi_speedmode(hdspm, val);
3547 spin_unlock_irq(&hdspm->lock);
3551 #define HDSPM_MIXER(xname, xindex) \
3552 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
3556 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
3557 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3558 .info = snd_hdspm_info_mixer, \
3559 .get = snd_hdspm_get_mixer, \
3560 .put = snd_hdspm_put_mixer \
3563 static int snd_hdspm_info_mixer(struct snd_kcontrol *kcontrol,
3564 struct snd_ctl_elem_info *uinfo)
3566 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3568 uinfo->value.integer.min = 0;
3569 uinfo->value.integer.max = 65535;
3570 uinfo->value.integer.step = 1;
3574 static int snd_hdspm_get_mixer(struct snd_kcontrol *kcontrol,
3575 struct snd_ctl_elem_value *ucontrol)
3577 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3581 source = ucontrol->value.integer.value[0];
3584 else if (source >= 2 * HDSPM_MAX_CHANNELS)
3585 source = 2 * HDSPM_MAX_CHANNELS - 1;
3587 destination = ucontrol->value.integer.value[1];
3588 if (destination < 0)
3590 else if (destination >= HDSPM_MAX_CHANNELS)
3591 destination = HDSPM_MAX_CHANNELS - 1;
3593 spin_lock_irq(&hdspm->lock);
3594 if (source >= HDSPM_MAX_CHANNELS)
3595 ucontrol->value.integer.value[2] =
3596 hdspm_read_pb_gain(hdspm, destination,
3597 source - HDSPM_MAX_CHANNELS);
3599 ucontrol->value.integer.value[2] =
3600 hdspm_read_in_gain(hdspm, destination, source);
3602 spin_unlock_irq(&hdspm->lock);
3607 static int snd_hdspm_put_mixer(struct snd_kcontrol *kcontrol,
3608 struct snd_ctl_elem_value *ucontrol)
3610 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3616 if (!snd_hdspm_use_is_exclusive(hdspm))
3619 source = ucontrol->value.integer.value[0];
3620 destination = ucontrol->value.integer.value[1];
3622 if (source < 0 || source >= 2 * HDSPM_MAX_CHANNELS)
3624 if (destination < 0 || destination >= HDSPM_MAX_CHANNELS)
3627 gain = ucontrol->value.integer.value[2];
3629 spin_lock_irq(&hdspm->lock);
3631 if (source >= HDSPM_MAX_CHANNELS)
3632 change = gain != hdspm_read_pb_gain(hdspm, destination,
3634 HDSPM_MAX_CHANNELS);
3636 change = gain != hdspm_read_in_gain(hdspm, destination,
3640 if (source >= HDSPM_MAX_CHANNELS)
3641 hdspm_write_pb_gain(hdspm, destination,
3642 source - HDSPM_MAX_CHANNELS,
3645 hdspm_write_in_gain(hdspm, destination, source,
3648 spin_unlock_irq(&hdspm->lock);
3653 /* The simple mixer control(s) provide gain control for the
3654 basic 1:1 mappings of playback streams to output
3658 #define HDSPM_PLAYBACK_MIXER \
3659 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3660 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_WRITE | \
3661 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3662 .info = snd_hdspm_info_playback_mixer, \
3663 .get = snd_hdspm_get_playback_mixer, \
3664 .put = snd_hdspm_put_playback_mixer \
3667 static int snd_hdspm_info_playback_mixer(struct snd_kcontrol *kcontrol,
3668 struct snd_ctl_elem_info *uinfo)
3670 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3672 uinfo->value.integer.min = 0;
3673 uinfo->value.integer.max = 64;
3674 uinfo->value.integer.step = 1;
3678 static int snd_hdspm_get_playback_mixer(struct snd_kcontrol *kcontrol,
3679 struct snd_ctl_elem_value *ucontrol)
3681 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3684 channel = ucontrol->id.index - 1;
3686 if (snd_BUG_ON(channel < 0 || channel >= HDSPM_MAX_CHANNELS))
3689 spin_lock_irq(&hdspm->lock);
3690 ucontrol->value.integer.value[0] =
3691 (hdspm_read_pb_gain(hdspm, channel, channel)*64)/UNITY_GAIN;
3692 spin_unlock_irq(&hdspm->lock);
3697 static int snd_hdspm_put_playback_mixer(struct snd_kcontrol *kcontrol,
3698 struct snd_ctl_elem_value *ucontrol)
3700 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3705 if (!snd_hdspm_use_is_exclusive(hdspm))
3708 channel = ucontrol->id.index - 1;
3710 if (snd_BUG_ON(channel < 0 || channel >= HDSPM_MAX_CHANNELS))
3713 gain = ucontrol->value.integer.value[0]*UNITY_GAIN/64;
3715 spin_lock_irq(&hdspm->lock);
3717 gain != hdspm_read_pb_gain(hdspm, channel,
3720 hdspm_write_pb_gain(hdspm, channel, channel,
3722 spin_unlock_irq(&hdspm->lock);
3726 #define HDSPM_SYNC_CHECK(xname, xindex) \
3727 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3729 .private_value = xindex, \
3730 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3731 .info = snd_hdspm_info_sync_check, \
3732 .get = snd_hdspm_get_sync_check \
3735 #define HDSPM_TCO_LOCK_CHECK(xname, xindex) \
3736 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3738 .private_value = xindex, \
3739 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3740 .info = snd_hdspm_tco_info_lock_check, \
3741 .get = snd_hdspm_get_sync_check \
3746 static int snd_hdspm_info_sync_check(struct snd_kcontrol *kcontrol,
3747 struct snd_ctl_elem_info *uinfo)
3749 static char *texts[] = { "No Lock", "Lock", "Sync", "N/A" };
3750 ENUMERATED_CTL_INFO(uinfo, texts);
3754 static int snd_hdspm_tco_info_lock_check(struct snd_kcontrol *kcontrol,
3755 struct snd_ctl_elem_info *uinfo)
3757 static char *texts[] = { "No Lock", "Lock" };
3758 ENUMERATED_CTL_INFO(uinfo, texts);
3762 static int hdspm_wc_sync_check(struct hdspm *hdspm)
3764 int status, status2;
3766 switch (hdspm->io_type) {
3768 status = hdspm_read(hdspm, HDSPM_statusRegister);
3769 if (status & HDSPM_AES32_wcLock) {
3770 if (status & HDSPM_AES32_wcSync)
3779 status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
3780 if (status2 & HDSPM_wcLock) {
3781 if (status2 & HDSPM_wcSync)
3791 status = hdspm_read(hdspm, HDSPM_statusRegister);
3793 if (status & 0x2000000)
3795 else if (status & 0x1000000)
3810 static int hdspm_madi_sync_check(struct hdspm *hdspm)
3812 int status = hdspm_read(hdspm, HDSPM_statusRegister);
3813 if (status & HDSPM_madiLock) {
3814 if (status & HDSPM_madiSync)
3823 static int hdspm_s1_sync_check(struct hdspm *hdspm, int idx)
3825 int status, lock, sync;
3827 status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
3829 lock = (status & (0x1<<idx)) ? 1 : 0;
3830 sync = (status & (0x100<<idx)) ? 1 : 0;
3840 static int hdspm_sync_in_sync_check(struct hdspm *hdspm)
3842 int status, lock = 0, sync = 0;
3844 switch (hdspm->io_type) {
3847 status = hdspm_read(hdspm, HDSPM_RD_STATUS_3);
3848 lock = (status & 0x400) ? 1 : 0;
3849 sync = (status & 0x800) ? 1 : 0;
3853 status = hdspm_read(hdspm, HDSPM_statusRegister);
3854 lock = (status & HDSPM_syncInLock) ? 1 : 0;
3855 sync = (status & HDSPM_syncInSync) ? 1 : 0;
3859 status = hdspm_read(hdspm, HDSPM_statusRegister2);
3860 lock = (status & 0x100000) ? 1 : 0;
3861 sync = (status & 0x200000) ? 1 : 0;
3876 static int hdspm_aes_sync_check(struct hdspm *hdspm, int idx)
3878 int status2, lock, sync;
3879 status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
3881 lock = (status2 & (0x0080 >> idx)) ? 1 : 0;
3882 sync = (status2 & (0x8000 >> idx)) ? 1 : 0;
3891 static int hdspm_tco_input_check(struct hdspm *hdspm, u32 mask)
3894 status = hdspm_read(hdspm, HDSPM_RD_TCO + 4);
3896 return (status & mask) ? 1 : 0;
3900 static int hdspm_tco_sync_check(struct hdspm *hdspm)
3905 switch (hdspm->io_type) {
3907 status = hdspm_read(hdspm, HDSPM_statusRegister);
3908 if (status & HDSPM_tcoLockMadi) {
3909 if (status & HDSPM_tcoSync)
3917 status = hdspm_read(hdspm, HDSPM_statusRegister);
3918 if (status & HDSPM_tcoLockAes) {
3919 if (status & HDSPM_tcoSync)
3930 status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
3932 if (status & 0x8000000)
3933 return 2; /* Sync */
3934 if (status & 0x4000000)
3935 return 1; /* Lock */
3936 return 0; /* No signal */
3948 static int snd_hdspm_get_sync_check(struct snd_kcontrol *kcontrol,
3949 struct snd_ctl_elem_value *ucontrol)
3951 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3954 switch (hdspm->io_type) {
3956 switch (kcontrol->private_value) {
3958 val = hdspm_wc_sync_check(hdspm); break;
3960 val = hdspm_tco_sync_check(hdspm); break;
3961 case 8: /* SYNC IN */
3962 val = hdspm_sync_in_sync_check(hdspm); break;
3964 val = hdspm_s1_sync_check(hdspm,
3965 kcontrol->private_value-1);
3970 switch (kcontrol->private_value) {
3972 val = hdspm_wc_sync_check(hdspm); break;
3974 val = hdspm_tco_sync_check(hdspm); break;
3975 case 5: /* SYNC IN */
3976 val = hdspm_sync_in_sync_check(hdspm); break;
3978 val = hdspm_s1_sync_check(hdspm,
3979 kcontrol->private_value-1);
3984 switch (kcontrol->private_value) {
3986 val = hdspm_wc_sync_check(hdspm); break;
3988 val = hdspm_madi_sync_check(hdspm); break;
3990 val = hdspm_tco_sync_check(hdspm); break;
3991 case 3: /* SYNC_IN */
3992 val = hdspm_sync_in_sync_check(hdspm); break;
3997 val = hdspm_madi_sync_check(hdspm); /* MADI */
4001 switch (kcontrol->private_value) {
4003 val = hdspm_wc_sync_check(hdspm); break;
4005 val = hdspm_tco_sync_check(hdspm); break;
4006 case 10 /* SYNC IN */:
4007 val = hdspm_sync_in_sync_check(hdspm); break;
4008 default: /* AES1 to AES8 */
4009 val = hdspm_aes_sync_check(hdspm,
4010 kcontrol->private_value-1);
4017 switch (kcontrol->private_value) {
4019 /* Check TCO for lock state of its current input */
4020 val = hdspm_tco_input_check(hdspm, HDSPM_TCO1_TCO_lock);
4023 /* Check TCO for valid time code on LTC input. */
4024 val = hdspm_tco_input_check(hdspm,
4025 HDSPM_TCO1_LTC_Input_valid);
4035 ucontrol->value.enumerated.item[0] = val;
4044 static void hdspm_tco_write(struct hdspm *hdspm)
4046 unsigned int tc[4] = { 0, 0, 0, 0};
4048 switch (hdspm->tco->input) {
4050 tc[2] |= HDSPM_TCO2_set_input_MSB;
4053 tc[2] |= HDSPM_TCO2_set_input_LSB;
4059 switch (hdspm->tco->framerate) {
4061 tc[1] |= HDSPM_TCO1_LTC_Format_LSB;
4064 tc[1] |= HDSPM_TCO1_LTC_Format_MSB;
4067 tc[1] |= HDSPM_TCO1_LTC_Format_MSB +
4068 HDSPM_TCO1_set_drop_frame_flag;
4071 tc[1] |= HDSPM_TCO1_LTC_Format_LSB +
4072 HDSPM_TCO1_LTC_Format_MSB;
4075 tc[1] |= HDSPM_TCO1_LTC_Format_LSB +
4076 HDSPM_TCO1_LTC_Format_MSB +
4077 HDSPM_TCO1_set_drop_frame_flag;
4083 switch (hdspm->tco->wordclock) {
4085 tc[2] |= HDSPM_TCO2_WCK_IO_ratio_LSB;
4088 tc[2] |= HDSPM_TCO2_WCK_IO_ratio_MSB;
4094 switch (hdspm->tco->samplerate) {
4096 tc[2] |= HDSPM_TCO2_set_freq;
4099 tc[2] |= HDSPM_TCO2_set_freq_from_app;
4105 switch (hdspm->tco->pull) {
4107 tc[2] |= HDSPM_TCO2_set_pull_up;
4110 tc[2] |= HDSPM_TCO2_set_pull_down;
4113 tc[2] |= HDSPM_TCO2_set_pull_up + HDSPM_TCO2_set_01_4;
4116 tc[2] |= HDSPM_TCO2_set_pull_down + HDSPM_TCO2_set_01_4;
4122 if (1 == hdspm->tco->term) {
4123 tc[2] |= HDSPM_TCO2_set_term_75R;
4126 hdspm_write(hdspm, HDSPM_WR_TCO, tc[0]);
4127 hdspm_write(hdspm, HDSPM_WR_TCO+4, tc[1]);
4128 hdspm_write(hdspm, HDSPM_WR_TCO+8, tc[2]);
4129 hdspm_write(hdspm, HDSPM_WR_TCO+12, tc[3]);
4133 #define HDSPM_TCO_SAMPLE_RATE(xname, xindex) \
4134 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4137 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4138 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4139 .info = snd_hdspm_info_tco_sample_rate, \
4140 .get = snd_hdspm_get_tco_sample_rate, \
4141 .put = snd_hdspm_put_tco_sample_rate \
4144 static int snd_hdspm_info_tco_sample_rate(struct snd_kcontrol *kcontrol,
4145 struct snd_ctl_elem_info *uinfo)
4147 static char *texts[] = { "44.1 kHz", "48 kHz" };
4148 ENUMERATED_CTL_INFO(uinfo, texts);
4152 static int snd_hdspm_get_tco_sample_rate(struct snd_kcontrol *kcontrol,
4153 struct snd_ctl_elem_value *ucontrol)
4155 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4157 ucontrol->value.enumerated.item[0] = hdspm->tco->samplerate;
4162 static int snd_hdspm_put_tco_sample_rate(struct snd_kcontrol *kcontrol,
4163 struct snd_ctl_elem_value *ucontrol)
4165 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4167 if (hdspm->tco->samplerate != ucontrol->value.enumerated.item[0]) {
4168 hdspm->tco->samplerate = ucontrol->value.enumerated.item[0];
4170 hdspm_tco_write(hdspm);
4179 #define HDSPM_TCO_PULL(xname, xindex) \
4180 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4183 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4184 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4185 .info = snd_hdspm_info_tco_pull, \
4186 .get = snd_hdspm_get_tco_pull, \
4187 .put = snd_hdspm_put_tco_pull \
4190 static int snd_hdspm_info_tco_pull(struct snd_kcontrol *kcontrol,
4191 struct snd_ctl_elem_info *uinfo)
4193 static char *texts[] = { "0", "+ 0.1 %", "- 0.1 %", "+ 4 %", "- 4 %" };
4194 ENUMERATED_CTL_INFO(uinfo, texts);
4198 static int snd_hdspm_get_tco_pull(struct snd_kcontrol *kcontrol,
4199 struct snd_ctl_elem_value *ucontrol)
4201 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4203 ucontrol->value.enumerated.item[0] = hdspm->tco->pull;
4208 static int snd_hdspm_put_tco_pull(struct snd_kcontrol *kcontrol,
4209 struct snd_ctl_elem_value *ucontrol)
4211 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4213 if (hdspm->tco->pull != ucontrol->value.enumerated.item[0]) {
4214 hdspm->tco->pull = ucontrol->value.enumerated.item[0];
4216 hdspm_tco_write(hdspm);
4224 #define HDSPM_TCO_WCK_CONVERSION(xname, xindex) \
4225 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4228 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4229 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4230 .info = snd_hdspm_info_tco_wck_conversion, \
4231 .get = snd_hdspm_get_tco_wck_conversion, \
4232 .put = snd_hdspm_put_tco_wck_conversion \
4235 static int snd_hdspm_info_tco_wck_conversion(struct snd_kcontrol *kcontrol,
4236 struct snd_ctl_elem_info *uinfo)
4238 static char *texts[] = { "1:1", "44.1 -> 48", "48 -> 44.1" };
4239 ENUMERATED_CTL_INFO(uinfo, texts);
4243 static int snd_hdspm_get_tco_wck_conversion(struct snd_kcontrol *kcontrol,
4244 struct snd_ctl_elem_value *ucontrol)
4246 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4248 ucontrol->value.enumerated.item[0] = hdspm->tco->wordclock;
4253 static int snd_hdspm_put_tco_wck_conversion(struct snd_kcontrol *kcontrol,
4254 struct snd_ctl_elem_value *ucontrol)
4256 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4258 if (hdspm->tco->wordclock != ucontrol->value.enumerated.item[0]) {
4259 hdspm->tco->wordclock = ucontrol->value.enumerated.item[0];
4261 hdspm_tco_write(hdspm);
4270 #define HDSPM_TCO_FRAME_RATE(xname, xindex) \
4271 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4274 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4275 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4276 .info = snd_hdspm_info_tco_frame_rate, \
4277 .get = snd_hdspm_get_tco_frame_rate, \
4278 .put = snd_hdspm_put_tco_frame_rate \
4281 static int snd_hdspm_info_tco_frame_rate(struct snd_kcontrol *kcontrol,
4282 struct snd_ctl_elem_info *uinfo)
4284 static char *texts[] = { "24 fps", "25 fps", "29.97fps",
4285 "29.97 dfps", "30 fps", "30 dfps" };
4286 ENUMERATED_CTL_INFO(uinfo, texts);
4290 static int snd_hdspm_get_tco_frame_rate(struct snd_kcontrol *kcontrol,
4291 struct snd_ctl_elem_value *ucontrol)
4293 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4295 ucontrol->value.enumerated.item[0] = hdspm->tco->framerate;
4300 static int snd_hdspm_put_tco_frame_rate(struct snd_kcontrol *kcontrol,
4301 struct snd_ctl_elem_value *ucontrol)
4303 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4305 if (hdspm->tco->framerate != ucontrol->value.enumerated.item[0]) {
4306 hdspm->tco->framerate = ucontrol->value.enumerated.item[0];
4308 hdspm_tco_write(hdspm);
4317 #define HDSPM_TCO_SYNC_SOURCE(xname, xindex) \
4318 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4321 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4322 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4323 .info = snd_hdspm_info_tco_sync_source, \
4324 .get = snd_hdspm_get_tco_sync_source, \
4325 .put = snd_hdspm_put_tco_sync_source \
4328 static int snd_hdspm_info_tco_sync_source(struct snd_kcontrol *kcontrol,
4329 struct snd_ctl_elem_info *uinfo)
4331 static char *texts[] = { "LTC", "Video", "WCK" };
4332 ENUMERATED_CTL_INFO(uinfo, texts);
4336 static int snd_hdspm_get_tco_sync_source(struct snd_kcontrol *kcontrol,
4337 struct snd_ctl_elem_value *ucontrol)
4339 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4341 ucontrol->value.enumerated.item[0] = hdspm->tco->input;
4346 static int snd_hdspm_put_tco_sync_source(struct snd_kcontrol *kcontrol,
4347 struct snd_ctl_elem_value *ucontrol)
4349 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4351 if (hdspm->tco->input != ucontrol->value.enumerated.item[0]) {
4352 hdspm->tco->input = ucontrol->value.enumerated.item[0];
4354 hdspm_tco_write(hdspm);
4363 #define HDSPM_TCO_WORD_TERM(xname, xindex) \
4364 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4367 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4368 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4369 .info = snd_hdspm_info_tco_word_term, \
4370 .get = snd_hdspm_get_tco_word_term, \
4371 .put = snd_hdspm_put_tco_word_term \
4374 static int snd_hdspm_info_tco_word_term(struct snd_kcontrol *kcontrol,
4375 struct snd_ctl_elem_info *uinfo)
4377 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
4379 uinfo->value.integer.min = 0;
4380 uinfo->value.integer.max = 1;
4386 static int snd_hdspm_get_tco_word_term(struct snd_kcontrol *kcontrol,
4387 struct snd_ctl_elem_value *ucontrol)
4389 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4391 ucontrol->value.enumerated.item[0] = hdspm->tco->term;
4397 static int snd_hdspm_put_tco_word_term(struct snd_kcontrol *kcontrol,
4398 struct snd_ctl_elem_value *ucontrol)
4400 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4402 if (hdspm->tco->term != ucontrol->value.enumerated.item[0]) {
4403 hdspm->tco->term = ucontrol->value.enumerated.item[0];
4405 hdspm_tco_write(hdspm);
4416 static struct snd_kcontrol_new snd_hdspm_controls_madi[] = {
4417 HDSPM_MIXER("Mixer", 0),
4418 HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4419 HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4420 HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
4421 HDSPM_AUTOSYNC_REF("AutoSync Reference", 0),
4422 HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4423 HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
4424 HDSPM_SYNC_CHECK("WC SyncCheck", 0),
4425 HDSPM_SYNC_CHECK("MADI SyncCheck", 1),
4426 HDSPM_SYNC_CHECK("TCO SyncCheck", 2),
4427 HDSPM_SYNC_CHECK("SYNC IN SyncCheck", 3),
4428 HDSPM_TOGGLE_SETTING("Line Out", HDSPM_LineOut),
4429 HDSPM_TOGGLE_SETTING("TX 64 channels mode", HDSPM_TX_64ch),
4430 HDSPM_TOGGLE_SETTING("Disable 96K frames", HDSPM_SMUX),
4431 HDSPM_TOGGLE_SETTING("Clear Track Marker", HDSPM_clr_tms),
4432 HDSPM_TOGGLE_SETTING("Safe Mode", HDSPM_AutoInp),
4433 HDSPM_INPUT_SELECT("Input Select", 0),
4434 HDSPM_MADI_SPEEDMODE("MADI Speed Mode", 0)
4438 static struct snd_kcontrol_new snd_hdspm_controls_madiface[] = {
4439 HDSPM_MIXER("Mixer", 0),
4440 HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4441 HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4442 HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4443 HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
4444 HDSPM_SYNC_CHECK("MADI SyncCheck", 0),
4445 HDSPM_TOGGLE_SETTING("TX 64 channels mode", HDSPM_TX_64ch),
4446 HDSPM_TOGGLE_SETTING("Clear Track Marker", HDSPM_clr_tms),
4447 HDSPM_TOGGLE_SETTING("Safe Mode", HDSPM_AutoInp),
4448 HDSPM_MADI_SPEEDMODE("MADI Speed Mode", 0)
4451 static struct snd_kcontrol_new snd_hdspm_controls_aio[] = {
4452 HDSPM_MIXER("Mixer", 0),
4453 HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4454 HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4455 HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
4456 HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4457 HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
4458 HDSPM_SYNC_CHECK("WC SyncCheck", 0),
4459 HDSPM_SYNC_CHECK("AES SyncCheck", 1),
4460 HDSPM_SYNC_CHECK("SPDIF SyncCheck", 2),
4461 HDSPM_SYNC_CHECK("ADAT SyncCheck", 3),
4462 HDSPM_SYNC_CHECK("TCO SyncCheck", 4),
4463 HDSPM_SYNC_CHECK("SYNC IN SyncCheck", 5),
4464 HDSPM_AUTOSYNC_SAMPLE_RATE("WC Frequency", 0),
4465 HDSPM_AUTOSYNC_SAMPLE_RATE("AES Frequency", 1),
4466 HDSPM_AUTOSYNC_SAMPLE_RATE("SPDIF Frequency", 2),
4467 HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT Frequency", 3),
4468 HDSPM_AUTOSYNC_SAMPLE_RATE("TCO Frequency", 4),
4469 HDSPM_AUTOSYNC_SAMPLE_RATE("SYNC IN Frequency", 5),
4470 HDSPM_CONTROL_TRISTATE("S/PDIF Input", HDSPM_c0_Input0),
4471 HDSPM_TOGGLE_SETTING("S/PDIF Out Optical", HDSPM_c0_Spdif_Opt),
4472 HDSPM_TOGGLE_SETTING("S/PDIF Out Professional", HDSPM_c0_Pro),
4473 HDSPM_TOGGLE_SETTING("ADAT internal (AEB/TEB)", HDSPM_c0_AEB1),
4474 HDSPM_TOGGLE_SETTING("XLR Breakout Cable", HDSPM_c0_Sym6db),
4475 HDSPM_TOGGLE_SETTING("Single Speed WordClock Out", HDSPM_c0_Wck48),
4476 HDSPM_CONTROL_TRISTATE("Input Level", HDSPM_c0_AD_GAIN0),
4477 HDSPM_CONTROL_TRISTATE("Output Level", HDSPM_c0_DA_GAIN0),
4478 HDSPM_CONTROL_TRISTATE("Phones Level", HDSPM_c0_PH_GAIN0)
4481 HDSPM_INPUT_SELECT("Input Select", 0),
4482 HDSPM_SPDIF_OPTICAL("SPDIF Out Optical", 0),
4483 HDSPM_PROFESSIONAL("SPDIF Out Professional", 0);
4484 HDSPM_SPDIF_IN("SPDIF In", 0);
4485 HDSPM_BREAKOUT_CABLE("Breakout Cable", 0);
4486 HDSPM_INPUT_LEVEL("Input Level", 0);
4487 HDSPM_OUTPUT_LEVEL("Output Level", 0);
4488 HDSPM_PHONES("Phones", 0);
4492 static struct snd_kcontrol_new snd_hdspm_controls_raydat[] = {
4493 HDSPM_MIXER("Mixer", 0),
4494 HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4495 HDSPM_SYSTEM_CLOCK_MODE("Clock Mode", 0),
4496 HDSPM_PREF_SYNC_REF("Pref Sync Ref", 0),
4497 HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4498 HDSPM_SYNC_CHECK("WC SyncCheck", 0),
4499 HDSPM_SYNC_CHECK("AES SyncCheck", 1),
4500 HDSPM_SYNC_CHECK("SPDIF SyncCheck", 2),
4501 HDSPM_SYNC_CHECK("ADAT1 SyncCheck", 3),
4502 HDSPM_SYNC_CHECK("ADAT2 SyncCheck", 4),
4503 HDSPM_SYNC_CHECK("ADAT3 SyncCheck", 5),
4504 HDSPM_SYNC_CHECK("ADAT4 SyncCheck", 6),
4505 HDSPM_SYNC_CHECK("TCO SyncCheck", 7),
4506 HDSPM_SYNC_CHECK("SYNC IN SyncCheck", 8),
4507 HDSPM_AUTOSYNC_SAMPLE_RATE("WC Frequency", 0),
4508 HDSPM_AUTOSYNC_SAMPLE_RATE("AES Frequency", 1),
4509 HDSPM_AUTOSYNC_SAMPLE_RATE("SPDIF Frequency", 2),
4510 HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT1 Frequency", 3),
4511 HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT2 Frequency", 4),
4512 HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT3 Frequency", 5),
4513 HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT4 Frequency", 6),
4514 HDSPM_AUTOSYNC_SAMPLE_RATE("TCO Frequency", 7),
4515 HDSPM_AUTOSYNC_SAMPLE_RATE("SYNC IN Frequency", 8),
4516 HDSPM_TOGGLE_SETTING("S/PDIF Out Professional", HDSPM_c0_Pro),
4517 HDSPM_TOGGLE_SETTING("Single Speed WordClock Out", HDSPM_c0_Wck48)
4520 static struct snd_kcontrol_new snd_hdspm_controls_aes32[] = {
4521 HDSPM_MIXER("Mixer", 0),
4522 HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4523 HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4524 HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
4525 HDSPM_AUTOSYNC_REF("AutoSync Reference", 0),
4526 HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4527 HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
4528 HDSPM_SYNC_CHECK("WC Sync Check", 0),
4529 HDSPM_SYNC_CHECK("AES1 Sync Check", 1),
4530 HDSPM_SYNC_CHECK("AES2 Sync Check", 2),
4531 HDSPM_SYNC_CHECK("AES3 Sync Check", 3),
4532 HDSPM_SYNC_CHECK("AES4 Sync Check", 4),
4533 HDSPM_SYNC_CHECK("AES5 Sync Check", 5),
4534 HDSPM_SYNC_CHECK("AES6 Sync Check", 6),
4535 HDSPM_SYNC_CHECK("AES7 Sync Check", 7),
4536 HDSPM_SYNC_CHECK("AES8 Sync Check", 8),
4537 HDSPM_SYNC_CHECK("TCO Sync Check", 9),
4538 HDSPM_SYNC_CHECK("SYNC IN Sync Check", 10),
4539 HDSPM_AUTOSYNC_SAMPLE_RATE("WC Frequency", 0),
4540 HDSPM_AUTOSYNC_SAMPLE_RATE("AES1 Frequency", 1),
4541 HDSPM_AUTOSYNC_SAMPLE_RATE("AES2 Frequency", 2),
4542 HDSPM_AUTOSYNC_SAMPLE_RATE("AES3 Frequency", 3),
4543 HDSPM_AUTOSYNC_SAMPLE_RATE("AES4 Frequency", 4),
4544 HDSPM_AUTOSYNC_SAMPLE_RATE("AES5 Frequency", 5),
4545 HDSPM_AUTOSYNC_SAMPLE_RATE("AES6 Frequency", 6),
4546 HDSPM_AUTOSYNC_SAMPLE_RATE("AES7 Frequency", 7),
4547 HDSPM_AUTOSYNC_SAMPLE_RATE("AES8 Frequency", 8),
4548 HDSPM_AUTOSYNC_SAMPLE_RATE("TCO Frequency", 9),
4549 HDSPM_AUTOSYNC_SAMPLE_RATE("SYNC IN Frequency", 10),
4550 HDSPM_TOGGLE_SETTING("Line Out", HDSPM_LineOut),
4551 HDSPM_TOGGLE_SETTING("Emphasis", HDSPM_Emphasis),
4552 HDSPM_TOGGLE_SETTING("Non Audio", HDSPM_Dolby),
4553 HDSPM_TOGGLE_SETTING("Professional", HDSPM_Professional),
4554 HDSPM_TOGGLE_SETTING("Clear Track Marker", HDSPM_clr_tms),
4555 HDSPM_DS_WIRE("Double Speed Wire Mode", 0),
4556 HDSPM_QS_WIRE("Quad Speed Wire Mode", 0),
4561 /* Control elements for the optional TCO module */
4562 static struct snd_kcontrol_new snd_hdspm_controls_tco[] = {
4563 HDSPM_TCO_SAMPLE_RATE("TCO Sample Rate", 0),
4564 HDSPM_TCO_PULL("TCO Pull", 0),
4565 HDSPM_TCO_WCK_CONVERSION("TCO WCK Conversion", 0),
4566 HDSPM_TCO_FRAME_RATE("TCO Frame Rate", 0),
4567 HDSPM_TCO_SYNC_SOURCE("TCO Sync Source", 0),
4568 HDSPM_TCO_WORD_TERM("TCO Word Term", 0),
4569 HDSPM_TCO_LOCK_CHECK("TCO Input Check", 11),
4570 HDSPM_TCO_LOCK_CHECK("TCO LTC Valid", 12),
4571 HDSPM_TCO_LTC_FRAMES("TCO Detected Frame Rate", 0),
4572 HDSPM_TCO_VIDEO_INPUT_FORMAT("Video Input Format", 0)
4576 static struct snd_kcontrol_new snd_hdspm_playback_mixer = HDSPM_PLAYBACK_MIXER;
4579 static int hdspm_update_simple_mixer_controls(struct hdspm * hdspm)
4583 for (i = hdspm->ds_out_channels; i < hdspm->ss_out_channels; ++i) {
4584 if (hdspm->system_sample_rate > 48000) {
4585 hdspm->playback_mixer_ctls[i]->vd[0].access =
4586 SNDRV_CTL_ELEM_ACCESS_INACTIVE |
4587 SNDRV_CTL_ELEM_ACCESS_READ |
4588 SNDRV_CTL_ELEM_ACCESS_VOLATILE;
4590 hdspm->playback_mixer_ctls[i]->vd[0].access =
4591 SNDRV_CTL_ELEM_ACCESS_READWRITE |
4592 SNDRV_CTL_ELEM_ACCESS_VOLATILE;
4594 snd_ctl_notify(hdspm->card, SNDRV_CTL_EVENT_MASK_VALUE |
4595 SNDRV_CTL_EVENT_MASK_INFO,
4596 &hdspm->playback_mixer_ctls[i]->id);
4603 static int snd_hdspm_create_controls(struct snd_card *card,
4604 struct hdspm *hdspm)
4606 unsigned int idx, limit;
4608 struct snd_kcontrol *kctl;
4609 struct snd_kcontrol_new *list = NULL;
4611 switch (hdspm->io_type) {
4613 list = snd_hdspm_controls_madi;
4614 limit = ARRAY_SIZE(snd_hdspm_controls_madi);
4617 list = snd_hdspm_controls_madiface;
4618 limit = ARRAY_SIZE(snd_hdspm_controls_madiface);
4621 list = snd_hdspm_controls_aio;
4622 limit = ARRAY_SIZE(snd_hdspm_controls_aio);
4625 list = snd_hdspm_controls_raydat;
4626 limit = ARRAY_SIZE(snd_hdspm_controls_raydat);
4629 list = snd_hdspm_controls_aes32;
4630 limit = ARRAY_SIZE(snd_hdspm_controls_aes32);
4635 for (idx = 0; idx < limit; idx++) {
4636 err = snd_ctl_add(card,
4637 snd_ctl_new1(&list[idx], hdspm));
4644 /* create simple 1:1 playback mixer controls */
4645 snd_hdspm_playback_mixer.name = "Chn";
4646 if (hdspm->system_sample_rate >= 128000) {
4647 limit = hdspm->qs_out_channels;
4648 } else if (hdspm->system_sample_rate >= 64000) {
4649 limit = hdspm->ds_out_channels;
4651 limit = hdspm->ss_out_channels;
4653 for (idx = 0; idx < limit; ++idx) {
4654 snd_hdspm_playback_mixer.index = idx + 1;
4655 kctl = snd_ctl_new1(&snd_hdspm_playback_mixer, hdspm);
4656 err = snd_ctl_add(card, kctl);
4659 hdspm->playback_mixer_ctls[idx] = kctl;
4664 /* add tco control elements */
4665 list = snd_hdspm_controls_tco;
4666 limit = ARRAY_SIZE(snd_hdspm_controls_tco);
4667 for (idx = 0; idx < limit; idx++) {
4668 err = snd_ctl_add(card,
4669 snd_ctl_new1(&list[idx], hdspm));
4678 /*------------------------------------------------------------
4680 ------------------------------------------------------------*/
4683 snd_hdspm_proc_read_tco(struct snd_info_entry *entry,
4684 struct snd_info_buffer *buffer)
4686 struct hdspm *hdspm = entry->private_data;
4687 unsigned int status, control;
4688 int a, ltc, frames, seconds, minutes, hours;
4689 unsigned int period;
4693 snd_iprintf(buffer, "--- TCO ---\n");
4695 status = hdspm_read(hdspm, HDSPM_statusRegister);
4696 control = hdspm->control_register;
4699 if (status & HDSPM_tco_detect) {
4700 snd_iprintf(buffer, "TCO module detected.\n");
4701 a = hdspm_read(hdspm, HDSPM_RD_TCO+4);
4702 if (a & HDSPM_TCO1_LTC_Input_valid) {
4703 snd_iprintf(buffer, " LTC valid, ");
4704 switch (a & (HDSPM_TCO1_LTC_Format_LSB |
4705 HDSPM_TCO1_LTC_Format_MSB)) {
4707 snd_iprintf(buffer, "24 fps, ");
4709 case HDSPM_TCO1_LTC_Format_LSB:
4710 snd_iprintf(buffer, "25 fps, ");
4712 case HDSPM_TCO1_LTC_Format_MSB:
4713 snd_iprintf(buffer, "29.97 fps, ");
4716 snd_iprintf(buffer, "30 fps, ");
4719 if (a & HDSPM_TCO1_set_drop_frame_flag) {
4720 snd_iprintf(buffer, "drop frame\n");
4722 snd_iprintf(buffer, "full frame\n");
4725 snd_iprintf(buffer, " no LTC\n");
4727 if (a & HDSPM_TCO1_Video_Input_Format_NTSC) {
4728 snd_iprintf(buffer, " Video: NTSC\n");
4729 } else if (a & HDSPM_TCO1_Video_Input_Format_PAL) {
4730 snd_iprintf(buffer, " Video: PAL\n");
4732 snd_iprintf(buffer, " No video\n");
4734 if (a & HDSPM_TCO1_TCO_lock) {
4735 snd_iprintf(buffer, " Sync: lock\n");
4737 snd_iprintf(buffer, " Sync: no lock\n");
4740 switch (hdspm->io_type) {
4743 freq_const = 110069313433624ULL;
4747 freq_const = 104857600000000ULL;
4750 break; /* no TCO possible */
4753 period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ);
4754 snd_iprintf(buffer, " period: %u\n", period);
4757 /* rate = freq_const/period; */
4758 rate = div_u64(freq_const, period);
4760 if (control & HDSPM_QuadSpeed) {
4762 } else if (control & HDSPM_DoubleSpeed) {
4766 snd_iprintf(buffer, " Frequency: %u Hz\n",
4767 (unsigned int) rate);
4769 ltc = hdspm_read(hdspm, HDSPM_RD_TCO);
4772 frames += (ltc & 0x3) * 10;
4774 seconds = ltc & 0xF;
4776 seconds += (ltc & 0x7) * 10;
4778 minutes = ltc & 0xF;
4780 minutes += (ltc & 0x7) * 10;
4784 hours += (ltc & 0x3) * 10;
4786 " LTC In: %02d:%02d:%02d:%02d\n",
4787 hours, minutes, seconds, frames);
4790 snd_iprintf(buffer, "No TCO module detected.\n");
4795 snd_hdspm_proc_read_madi(struct snd_info_entry *entry,
4796 struct snd_info_buffer *buffer)
4798 struct hdspm *hdspm = entry->private_data;
4799 unsigned int status, status2, control, freq;
4801 char *pref_sync_ref;
4803 char *system_clock_mode;
4807 status = hdspm_read(hdspm, HDSPM_statusRegister);
4808 status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
4809 control = hdspm->control_register;
4810 freq = hdspm_read(hdspm, HDSPM_timecodeRegister);
4812 snd_iprintf(buffer, "%s (Card #%d) Rev.%x Status2first3bits: %x\n",
4813 hdspm->card_name, hdspm->card->number + 1,
4814 hdspm->firmware_rev,
4815 (status2 & HDSPM_version0) |
4816 (status2 & HDSPM_version1) | (status2 &
4819 snd_iprintf(buffer, "HW Serial: 0x%06x%06x\n",
4820 (hdspm_read(hdspm, HDSPM_midiStatusIn1)>>8) & 0xFFFFFF,
4823 snd_iprintf(buffer, "IRQ: %d Registers bus: 0x%lx VM: 0x%lx\n",
4824 hdspm->irq, hdspm->port, (unsigned long)hdspm->iobase);
4826 snd_iprintf(buffer, "--- System ---\n");
4829 "IRQ Pending: Audio=%d, MIDI0=%d, MIDI1=%d, IRQcount=%d\n",
4830 status & HDSPM_audioIRQPending,
4831 (status & HDSPM_midi0IRQPending) ? 1 : 0,
4832 (status & HDSPM_midi1IRQPending) ? 1 : 0,
4835 "HW pointer: id = %d, rawptr = %d (%d->%d) "
4836 "estimated= %ld (bytes)\n",
4837 ((status & HDSPM_BufferID) ? 1 : 0),
4838 (status & HDSPM_BufferPositionMask),
4839 (status & HDSPM_BufferPositionMask) %
4840 (2 * (int)hdspm->period_bytes),
4841 ((status & HDSPM_BufferPositionMask) - 64) %
4842 (2 * (int)hdspm->period_bytes),
4843 (long) hdspm_hw_pointer(hdspm) * 4);
4846 "MIDI FIFO: Out1=0x%x, Out2=0x%x, In1=0x%x, In2=0x%x \n",
4847 hdspm_read(hdspm, HDSPM_midiStatusOut0) & 0xFF,
4848 hdspm_read(hdspm, HDSPM_midiStatusOut1) & 0xFF,
4849 hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xFF,
4850 hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xFF);
4852 "MIDIoverMADI FIFO: In=0x%x, Out=0x%x \n",
4853 hdspm_read(hdspm, HDSPM_midiStatusIn2) & 0xFF,
4854 hdspm_read(hdspm, HDSPM_midiStatusOut2) & 0xFF);
4856 "Register: ctrl1=0x%x, ctrl2=0x%x, status1=0x%x, "
4858 hdspm->control_register, hdspm->control2_register,
4862 snd_iprintf(buffer, "--- Settings ---\n");
4864 x = hdspm_get_latency(hdspm);
4867 "Size (Latency): %d samples (2 periods of %lu bytes)\n",
4868 x, (unsigned long) hdspm->period_bytes);
4870 snd_iprintf(buffer, "Line out: %s\n",
4871 (hdspm->control_register & HDSPM_LineOut) ? "on " : "off");
4873 switch (hdspm->control_register & HDSPM_InputMask) {
4874 case HDSPM_InputOptical:
4877 case HDSPM_InputCoaxial:
4885 "ClearTrackMarker = %s, Transmit in %s Channel Mode, "
4887 (hdspm->control_register & HDSPM_clr_tms) ? "on" : "off",
4888 (hdspm->control_register & HDSPM_TX_64ch) ? "64" : "56",
4889 (hdspm->control_register & HDSPM_AutoInp) ? "on" : "off");
4892 if (!(hdspm->control_register & HDSPM_ClockModeMaster))
4893 system_clock_mode = "AutoSync";
4895 system_clock_mode = "Master";
4896 snd_iprintf(buffer, "AutoSync Reference: %s\n", system_clock_mode);
4898 switch (hdspm_pref_sync_ref(hdspm)) {
4899 case HDSPM_SYNC_FROM_WORD:
4900 pref_sync_ref = "Word Clock";
4902 case HDSPM_SYNC_FROM_MADI:
4903 pref_sync_ref = "MADI Sync";
4905 case HDSPM_SYNC_FROM_TCO:
4906 pref_sync_ref = "TCO";
4908 case HDSPM_SYNC_FROM_SYNC_IN:
4909 pref_sync_ref = "Sync In";
4912 pref_sync_ref = "XXXX Clock";
4915 snd_iprintf(buffer, "Preferred Sync Reference: %s\n",
4918 snd_iprintf(buffer, "System Clock Frequency: %d\n",
4919 hdspm->system_sample_rate);
4922 snd_iprintf(buffer, "--- Status:\n");
4924 x = status & HDSPM_madiSync;
4925 x2 = status2 & HDSPM_wcSync;
4927 snd_iprintf(buffer, "Inputs MADI=%s, WordClock=%s\n",
4928 (status & HDSPM_madiLock) ? (x ? "Sync" : "Lock") :
4930 (status2 & HDSPM_wcLock) ? (x2 ? "Sync" : "Lock") :
4933 switch (hdspm_autosync_ref(hdspm)) {
4934 case HDSPM_AUTOSYNC_FROM_SYNC_IN:
4935 autosync_ref = "Sync In";
4937 case HDSPM_AUTOSYNC_FROM_TCO:
4938 autosync_ref = "TCO";
4940 case HDSPM_AUTOSYNC_FROM_WORD:
4941 autosync_ref = "Word Clock";
4943 case HDSPM_AUTOSYNC_FROM_MADI:
4944 autosync_ref = "MADI Sync";
4946 case HDSPM_AUTOSYNC_FROM_NONE:
4947 autosync_ref = "Input not valid";
4950 autosync_ref = "---";
4954 "AutoSync: Reference= %s, Freq=%d (MADI = %d, Word = %d)\n",
4955 autosync_ref, hdspm_external_sample_rate(hdspm),
4956 (status & HDSPM_madiFreqMask) >> 22,
4957 (status2 & HDSPM_wcFreqMask) >> 5);
4959 snd_iprintf(buffer, "Input: %s, Mode=%s\n",
4960 (status & HDSPM_AB_int) ? "Coax" : "Optical",
4961 (status & HDSPM_RX_64ch) ? "64 channels" :
4964 /* call readout function for TCO specific status */
4965 snd_hdspm_proc_read_tco(entry, buffer);
4967 snd_iprintf(buffer, "\n");
4971 snd_hdspm_proc_read_aes32(struct snd_info_entry * entry,
4972 struct snd_info_buffer *buffer)
4974 struct hdspm *hdspm = entry->private_data;
4975 unsigned int status;
4976 unsigned int status2;
4977 unsigned int timecode;
4978 unsigned int wcLock, wcSync;
4983 status = hdspm_read(hdspm, HDSPM_statusRegister);
4984 status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
4985 timecode = hdspm_read(hdspm, HDSPM_timecodeRegister);
4987 snd_iprintf(buffer, "%s (Card #%d) Rev.%x\n",
4988 hdspm->card_name, hdspm->card->number + 1,
4989 hdspm->firmware_rev);
4991 snd_iprintf(buffer, "IRQ: %d Registers bus: 0x%lx VM: 0x%lx\n",
4992 hdspm->irq, hdspm->port, (unsigned long)hdspm->iobase);
4994 snd_iprintf(buffer, "--- System ---\n");
4997 "IRQ Pending: Audio=%d, MIDI0=%d, MIDI1=%d, IRQcount=%d\n",
4998 status & HDSPM_audioIRQPending,
4999 (status & HDSPM_midi0IRQPending) ? 1 : 0,
5000 (status & HDSPM_midi1IRQPending) ? 1 : 0,
5003 "HW pointer: id = %d, rawptr = %d (%d->%d) "
5004 "estimated= %ld (bytes)\n",
5005 ((status & HDSPM_BufferID) ? 1 : 0),
5006 (status & HDSPM_BufferPositionMask),
5007 (status & HDSPM_BufferPositionMask) %
5008 (2 * (int)hdspm->period_bytes),
5009 ((status & HDSPM_BufferPositionMask) - 64) %
5010 (2 * (int)hdspm->period_bytes),
5011 (long) hdspm_hw_pointer(hdspm) * 4);
5014 "MIDI FIFO: Out1=0x%x, Out2=0x%x, In1=0x%x, In2=0x%x \n",
5015 hdspm_read(hdspm, HDSPM_midiStatusOut0) & 0xFF,
5016 hdspm_read(hdspm, HDSPM_midiStatusOut1) & 0xFF,
5017 hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xFF,
5018 hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xFF);
5020 "MIDIoverMADI FIFO: In=0x%x, Out=0x%x \n",
5021 hdspm_read(hdspm, HDSPM_midiStatusIn2) & 0xFF,
5022 hdspm_read(hdspm, HDSPM_midiStatusOut2) & 0xFF);
5024 "Register: ctrl1=0x%x, ctrl2=0x%x, status1=0x%x, "
5026 hdspm->control_register, hdspm->control2_register,
5029 snd_iprintf(buffer, "--- Settings ---\n");
5031 x = hdspm_get_latency(hdspm);
5034 "Size (Latency): %d samples (2 periods of %lu bytes)\n",
5035 x, (unsigned long) hdspm->period_bytes);
5037 snd_iprintf(buffer, "Line out: %s\n",
5039 control_register & HDSPM_LineOut) ? "on " : "off");
5042 "ClearTrackMarker %s, Emphasis %s, Dolby %s\n",
5044 control_register & HDSPM_clr_tms) ? "on" : "off",
5046 control_register & HDSPM_Emphasis) ? "on" : "off",
5048 control_register & HDSPM_Dolby) ? "on" : "off");
5051 pref_syncref = hdspm_pref_sync_ref(hdspm);
5052 if (pref_syncref == 0)
5053 snd_iprintf(buffer, "Preferred Sync Reference: Word Clock\n");
5055 snd_iprintf(buffer, "Preferred Sync Reference: AES%d\n",
5058 snd_iprintf(buffer, "System Clock Frequency: %d\n",
5059 hdspm->system_sample_rate);
5061 snd_iprintf(buffer, "Double speed: %s\n",
5062 hdspm->control_register & HDSPM_DS_DoubleWire?
5063 "Double wire" : "Single wire");
5064 snd_iprintf(buffer, "Quad speed: %s\n",
5065 hdspm->control_register & HDSPM_QS_DoubleWire?
5067 hdspm->control_register & HDSPM_QS_QuadWire?
5068 "Quad wire" : "Single wire");
5070 snd_iprintf(buffer, "--- Status:\n");
5072 wcLock = status & HDSPM_AES32_wcLock;
5073 wcSync = wcLock && (status & HDSPM_AES32_wcSync);
5075 snd_iprintf(buffer, "Word: %s Frequency: %d\n",
5076 (wcLock) ? (wcSync ? "Sync " : "Lock ") : "No Lock",
5077 HDSPM_bit2freq((status >> HDSPM_AES32_wcFreq_bit) & 0xF));
5079 for (x = 0; x < 8; x++) {
5080 snd_iprintf(buffer, "AES%d: %s Frequency: %d\n",
5082 (status2 & (HDSPM_LockAES >> x)) ?
5083 "Sync " : "No Lock",
5084 HDSPM_bit2freq((timecode >> (4*x)) & 0xF));
5087 switch (hdspm_autosync_ref(hdspm)) {
5088 case HDSPM_AES32_AUTOSYNC_FROM_NONE:
5089 autosync_ref = "None"; break;
5090 case HDSPM_AES32_AUTOSYNC_FROM_WORD:
5091 autosync_ref = "Word Clock"; break;
5092 case HDSPM_AES32_AUTOSYNC_FROM_AES1:
5093 autosync_ref = "AES1"; break;
5094 case HDSPM_AES32_AUTOSYNC_FROM_AES2:
5095 autosync_ref = "AES2"; break;
5096 case HDSPM_AES32_AUTOSYNC_FROM_AES3:
5097 autosync_ref = "AES3"; break;
5098 case HDSPM_AES32_AUTOSYNC_FROM_AES4:
5099 autosync_ref = "AES4"; break;
5100 case HDSPM_AES32_AUTOSYNC_FROM_AES5:
5101 autosync_ref = "AES5"; break;
5102 case HDSPM_AES32_AUTOSYNC_FROM_AES6:
5103 autosync_ref = "AES6"; break;
5104 case HDSPM_AES32_AUTOSYNC_FROM_AES7:
5105 autosync_ref = "AES7"; break;
5106 case HDSPM_AES32_AUTOSYNC_FROM_AES8:
5107 autosync_ref = "AES8"; break;
5109 autosync_ref = "---"; break;
5111 snd_iprintf(buffer, "AutoSync ref = %s\n", autosync_ref);
5113 snd_iprintf(buffer, "\n");
5117 snd_hdspm_proc_read_raydat(struct snd_info_entry *entry,
5118 struct snd_info_buffer *buffer)
5120 struct hdspm *hdspm = entry->private_data;
5121 unsigned int status1, status2, status3, control, i;
5122 unsigned int lock, sync;
5124 status1 = hdspm_read(hdspm, HDSPM_RD_STATUS_1); /* s1 */
5125 status2 = hdspm_read(hdspm, HDSPM_RD_STATUS_2); /* freq */
5126 status3 = hdspm_read(hdspm, HDSPM_RD_STATUS_3); /* s2 */
5128 control = hdspm->control_register;
5130 snd_iprintf(buffer, "STATUS1: 0x%08x\n", status1);
5131 snd_iprintf(buffer, "STATUS2: 0x%08x\n", status2);
5132 snd_iprintf(buffer, "STATUS3: 0x%08x\n", status3);
5135 snd_iprintf(buffer, "\n*** CLOCK MODE\n\n");
5137 snd_iprintf(buffer, "Clock mode : %s\n",
5138 (hdspm_system_clock_mode(hdspm) == 0) ? "master" : "slave");
5139 snd_iprintf(buffer, "System frequency: %d Hz\n",
5140 hdspm_get_system_sample_rate(hdspm));
5142 snd_iprintf(buffer, "\n*** INPUT STATUS\n\n");
5147 for (i = 0; i < 8; i++) {
5148 snd_iprintf(buffer, "s1_input %d: Lock %d, Sync %d, Freq %s\n",
5150 (status1 & lock) ? 1 : 0,
5151 (status1 & sync) ? 1 : 0,
5152 texts_freq[(status2 >> (i * 4)) & 0xF]);
5158 snd_iprintf(buffer, "WC input: Lock %d, Sync %d, Freq %s\n",
5159 (status1 & 0x1000000) ? 1 : 0,
5160 (status1 & 0x2000000) ? 1 : 0,
5161 texts_freq[(status1 >> 16) & 0xF]);
5163 snd_iprintf(buffer, "TCO input: Lock %d, Sync %d, Freq %s\n",
5164 (status1 & 0x4000000) ? 1 : 0,
5165 (status1 & 0x8000000) ? 1 : 0,
5166 texts_freq[(status1 >> 20) & 0xF]);
5168 snd_iprintf(buffer, "SYNC IN: Lock %d, Sync %d, Freq %s\n",
5169 (status3 & 0x400) ? 1 : 0,
5170 (status3 & 0x800) ? 1 : 0,
5171 texts_freq[(status2 >> 12) & 0xF]);
5175 #ifdef CONFIG_SND_DEBUG
5177 snd_hdspm_proc_read_debug(struct snd_info_entry *entry,
5178 struct snd_info_buffer *buffer)
5180 struct hdspm *hdspm = entry->private_data;
5184 for (i = 0; i < 256 /* 1024*64 */; i += j) {
5185 snd_iprintf(buffer, "0x%08X: ", i);
5186 for (j = 0; j < 16; j += 4)
5187 snd_iprintf(buffer, "%08X ", hdspm_read(hdspm, i + j));
5188 snd_iprintf(buffer, "\n");
5194 static void snd_hdspm_proc_ports_in(struct snd_info_entry *entry,
5195 struct snd_info_buffer *buffer)
5197 struct hdspm *hdspm = entry->private_data;
5200 snd_iprintf(buffer, "# generated by hdspm\n");
5202 for (i = 0; i < hdspm->max_channels_in; i++) {
5203 snd_iprintf(buffer, "%d=%s\n", i+1, hdspm->port_names_in[i]);
5207 static void snd_hdspm_proc_ports_out(struct snd_info_entry *entry,
5208 struct snd_info_buffer *buffer)
5210 struct hdspm *hdspm = entry->private_data;
5213 snd_iprintf(buffer, "# generated by hdspm\n");
5215 for (i = 0; i < hdspm->max_channels_out; i++) {
5216 snd_iprintf(buffer, "%d=%s\n", i+1, hdspm->port_names_out[i]);
5221 static void snd_hdspm_proc_init(struct hdspm *hdspm)
5223 struct snd_info_entry *entry;
5225 if (!snd_card_proc_new(hdspm->card, "hdspm", &entry)) {
5226 switch (hdspm->io_type) {
5228 snd_info_set_text_ops(entry, hdspm,
5229 snd_hdspm_proc_read_aes32);
5232 snd_info_set_text_ops(entry, hdspm,
5233 snd_hdspm_proc_read_madi);
5236 /* snd_info_set_text_ops(entry, hdspm,
5237 snd_hdspm_proc_read_madiface); */
5240 snd_info_set_text_ops(entry, hdspm,
5241 snd_hdspm_proc_read_raydat);
5248 if (!snd_card_proc_new(hdspm->card, "ports.in", &entry)) {
5249 snd_info_set_text_ops(entry, hdspm, snd_hdspm_proc_ports_in);
5252 if (!snd_card_proc_new(hdspm->card, "ports.out", &entry)) {
5253 snd_info_set_text_ops(entry, hdspm, snd_hdspm_proc_ports_out);
5256 #ifdef CONFIG_SND_DEBUG
5257 /* debug file to read all hdspm registers */
5258 if (!snd_card_proc_new(hdspm->card, "debug", &entry))
5259 snd_info_set_text_ops(entry, hdspm,
5260 snd_hdspm_proc_read_debug);
5264 /*------------------------------------------------------------
5266 ------------------------------------------------------------*/
5268 static int snd_hdspm_set_defaults(struct hdspm * hdspm)
5270 /* ASSUMPTION: hdspm->lock is either held, or there is no need to
5271 hold it (e.g. during module initialization).
5276 hdspm->settings_register = 0;
5278 switch (hdspm->io_type) {
5281 hdspm->control_register =
5282 0x2 + 0x8 + 0x10 + 0x80 + 0x400 + 0x4000 + 0x1000000;
5287 hdspm->settings_register = 0x1 + 0x1000;
5288 /* Magic values are: LAT_0, LAT_2, Master, freq1, tx64ch, inp_0,
5290 hdspm->control_register =
5291 0x2 + 0x8 + 0x10 + 0x80 + 0x400 + 0x4000 + 0x1000000;
5295 hdspm->control_register =
5296 HDSPM_ClockModeMaster | /* Master Clock Mode on */
5297 hdspm_encode_latency(7) | /* latency max=8192samples */
5298 HDSPM_SyncRef0 | /* AES1 is syncclock */
5299 HDSPM_LineOut | /* Analog output in */
5300 HDSPM_Professional; /* Professional mode */
5304 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
5306 if (AES32 == hdspm->io_type) {
5307 /* No control2 register for AES32 */
5308 #ifdef SNDRV_BIG_ENDIAN
5309 hdspm->control2_register = HDSPM_BIGENDIAN_MODE;
5311 hdspm->control2_register = 0;
5314 hdspm_write(hdspm, HDSPM_control2Reg, hdspm->control2_register);
5316 hdspm_compute_period_size(hdspm);
5318 /* silence everything */
5320 all_in_all_mixer(hdspm, 0 * UNITY_GAIN);
5322 if (hdspm_is_raydat_or_aio(hdspm))
5323 hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register);
5325 /* set a default rate so that the channel map is set up. */
5326 hdspm_set_rate(hdspm, 48000, 1);
5332 /*------------------------------------------------------------
5334 ------------------------------------------------------------*/
5336 static irqreturn_t snd_hdspm_interrupt(int irq, void *dev_id)
5338 struct hdspm *hdspm = (struct hdspm *) dev_id;
5339 unsigned int status;
5340 int i, audio, midi, schedule = 0;
5343 status = hdspm_read(hdspm, HDSPM_statusRegister);
5345 audio = status & HDSPM_audioIRQPending;
5346 midi = status & (HDSPM_midi0IRQPending | HDSPM_midi1IRQPending |
5347 HDSPM_midi2IRQPending | HDSPM_midi3IRQPending);
5349 /* now = get_cycles(); */
5351 * LAT_2..LAT_0 period counter (win) counter (mac)
5352 * 6 4096 ~256053425 ~514672358
5353 * 5 2048 ~128024983 ~257373821
5354 * 4 1024 ~64023706 ~128718089
5355 * 3 512 ~32005945 ~64385999
5356 * 2 256 ~16003039 ~32260176
5357 * 1 128 ~7998738 ~16194507
5358 * 0 64 ~3998231 ~8191558
5361 snd_printk(KERN_INFO "snd_hdspm_interrupt %llu @ %llx\n",
5362 now-hdspm->last_interrupt, status & 0xFFC0);
5363 hdspm->last_interrupt = now;
5366 if (!audio && !midi)
5369 hdspm_write(hdspm, HDSPM_interruptConfirmation, 0);
5374 if (hdspm->capture_substream)
5375 snd_pcm_period_elapsed(hdspm->capture_substream);
5377 if (hdspm->playback_substream)
5378 snd_pcm_period_elapsed(hdspm->playback_substream);
5383 while (i < hdspm->midiPorts) {
5384 if ((hdspm_read(hdspm,
5385 hdspm->midi[i].statusIn) & 0xff) &&
5386 (status & hdspm->midi[i].irq)) {
5387 /* we disable interrupts for this input until
5388 * processing is done
5390 hdspm->control_register &= ~hdspm->midi[i].ie;
5391 hdspm_write(hdspm, HDSPM_controlRegister,
5392 hdspm->control_register);
5393 hdspm->midi[i].pending = 1;
5401 tasklet_hi_schedule(&hdspm->midi_tasklet);
5407 /*------------------------------------------------------------
5409 ------------------------------------------------------------*/
5412 static snd_pcm_uframes_t snd_hdspm_hw_pointer(struct snd_pcm_substream
5415 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5416 return hdspm_hw_pointer(hdspm);
5420 static int snd_hdspm_reset(struct snd_pcm_substream *substream)
5422 struct snd_pcm_runtime *runtime = substream->runtime;
5423 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5424 struct snd_pcm_substream *other;
5426 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
5427 other = hdspm->capture_substream;
5429 other = hdspm->playback_substream;
5432 runtime->status->hw_ptr = hdspm_hw_pointer(hdspm);
5434 runtime->status->hw_ptr = 0;
5436 struct snd_pcm_substream *s;
5437 struct snd_pcm_runtime *oruntime = other->runtime;
5438 snd_pcm_group_for_each_entry(s, substream) {
5440 oruntime->status->hw_ptr =
5441 runtime->status->hw_ptr;
5449 static int snd_hdspm_hw_params(struct snd_pcm_substream *substream,
5450 struct snd_pcm_hw_params *params)
5452 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5458 spin_lock_irq(&hdspm->lock);
5460 if (substream->pstr->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5461 this_pid = hdspm->playback_pid;
5462 other_pid = hdspm->capture_pid;
5464 this_pid = hdspm->capture_pid;
5465 other_pid = hdspm->playback_pid;
5468 if (other_pid > 0 && this_pid != other_pid) {
5470 /* The other stream is open, and not by the same
5471 task as this one. Make sure that the parameters
5472 that matter are the same.
5475 if (params_rate(params) != hdspm->system_sample_rate) {
5476 spin_unlock_irq(&hdspm->lock);
5477 _snd_pcm_hw_param_setempty(params,
5478 SNDRV_PCM_HW_PARAM_RATE);
5482 if (params_period_size(params) != hdspm->period_bytes / 4) {
5483 spin_unlock_irq(&hdspm->lock);
5484 _snd_pcm_hw_param_setempty(params,
5485 SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
5491 spin_unlock_irq(&hdspm->lock);
5493 /* how to make sure that the rate matches an externally-set one ? */
5495 spin_lock_irq(&hdspm->lock);
5496 err = hdspm_set_rate(hdspm, params_rate(params), 0);
5498 snd_printk(KERN_INFO "err on hdspm_set_rate: %d\n", err);
5499 spin_unlock_irq(&hdspm->lock);
5500 _snd_pcm_hw_param_setempty(params,
5501 SNDRV_PCM_HW_PARAM_RATE);
5504 spin_unlock_irq(&hdspm->lock);
5506 err = hdspm_set_interrupt_interval(hdspm,
5507 params_period_size(params));
5509 snd_printk(KERN_INFO "err on hdspm_set_interrupt_interval: %d\n", err);
5510 _snd_pcm_hw_param_setempty(params,
5511 SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
5515 /* Memory allocation, takashi's method, dont know if we should
5518 /* malloc all buffer even if not enabled to get sure */
5519 /* Update for MADI rev 204: we need to allocate for all channels,
5520 * otherwise it doesn't work at 96kHz */
5523 snd_pcm_lib_malloc_pages(substream, HDSPM_DMA_AREA_BYTES);
5525 snd_printk(KERN_INFO "err on snd_pcm_lib_malloc_pages: %d\n", err);
5529 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5531 hdspm_set_sgbuf(hdspm, substream, HDSPM_pageAddressBufferOut,
5532 params_channels(params));
5534 for (i = 0; i < params_channels(params); ++i)
5535 snd_hdspm_enable_out(hdspm, i, 1);
5537 hdspm->playback_buffer =
5538 (unsigned char *) substream->runtime->dma_area;
5539 snd_printdd("Allocated sample buffer for playback at %p\n",
5540 hdspm->playback_buffer);
5542 hdspm_set_sgbuf(hdspm, substream, HDSPM_pageAddressBufferIn,
5543 params_channels(params));
5545 for (i = 0; i < params_channels(params); ++i)
5546 snd_hdspm_enable_in(hdspm, i, 1);
5548 hdspm->capture_buffer =
5549 (unsigned char *) substream->runtime->dma_area;
5550 snd_printdd("Allocated sample buffer for capture at %p\n",
5551 hdspm->capture_buffer);
5555 snd_printdd("Allocated sample buffer for %s at 0x%08X\n",
5556 substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
5557 "playback" : "capture",
5558 snd_pcm_sgbuf_get_addr(substream, 0));
5561 snd_printdd("set_hwparams: %s %d Hz, %d channels, bs = %d\n",
5562 substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
5563 "playback" : "capture",
5564 params_rate(params), params_channels(params),
5565 params_buffer_size(params));
5569 /* For AES cards, the float format bit is the same as the
5570 * preferred sync reference. Since we don't want to break
5571 * sync settings, we have to skip the remaining part of this
5574 if (hdspm->io_type == AES32) {
5579 /* Switch to native float format if requested */
5580 if (SNDRV_PCM_FORMAT_FLOAT_LE == params_format(params)) {
5581 if (!(hdspm->control_register & HDSPe_FLOAT_FORMAT))
5582 snd_printk(KERN_INFO "hdspm: Switching to native 32bit LE float format.\n");
5584 hdspm->control_register |= HDSPe_FLOAT_FORMAT;
5585 } else if (SNDRV_PCM_FORMAT_S32_LE == params_format(params)) {
5586 if (hdspm->control_register & HDSPe_FLOAT_FORMAT)
5587 snd_printk(KERN_INFO "hdspm: Switching to native 32bit LE integer format.\n");
5589 hdspm->control_register &= ~HDSPe_FLOAT_FORMAT;
5591 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
5596 static int snd_hdspm_hw_free(struct snd_pcm_substream *substream)
5599 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5601 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5603 /* params_channels(params) should be enough,
5604 but to get sure in case of error */
5605 for (i = 0; i < hdspm->max_channels_out; ++i)
5606 snd_hdspm_enable_out(hdspm, i, 0);
5608 hdspm->playback_buffer = NULL;
5610 for (i = 0; i < hdspm->max_channels_in; ++i)
5611 snd_hdspm_enable_in(hdspm, i, 0);
5613 hdspm->capture_buffer = NULL;
5617 snd_pcm_lib_free_pages(substream);
5623 static int snd_hdspm_channel_info(struct snd_pcm_substream *substream,
5624 struct snd_pcm_channel_info *info)
5626 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5628 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5629 if (snd_BUG_ON(info->channel >= hdspm->max_channels_out)) {
5630 snd_printk(KERN_INFO "snd_hdspm_channel_info: output channel out of range (%d)\n", info->channel);
5634 if (hdspm->channel_map_out[info->channel] < 0) {
5635 snd_printk(KERN_INFO "snd_hdspm_channel_info: output channel %d mapped out\n", info->channel);
5639 info->offset = hdspm->channel_map_out[info->channel] *
5640 HDSPM_CHANNEL_BUFFER_BYTES;
5642 if (snd_BUG_ON(info->channel >= hdspm->max_channels_in)) {
5643 snd_printk(KERN_INFO "snd_hdspm_channel_info: input channel out of range (%d)\n", info->channel);
5647 if (hdspm->channel_map_in[info->channel] < 0) {
5648 snd_printk(KERN_INFO "snd_hdspm_channel_info: input channel %d mapped out\n", info->channel);
5652 info->offset = hdspm->channel_map_in[info->channel] *
5653 HDSPM_CHANNEL_BUFFER_BYTES;
5662 static int snd_hdspm_ioctl(struct snd_pcm_substream *substream,
5663 unsigned int cmd, void *arg)
5666 case SNDRV_PCM_IOCTL1_RESET:
5667 return snd_hdspm_reset(substream);
5669 case SNDRV_PCM_IOCTL1_CHANNEL_INFO:
5671 struct snd_pcm_channel_info *info = arg;
5672 return snd_hdspm_channel_info(substream, info);
5678 return snd_pcm_lib_ioctl(substream, cmd, arg);
5681 static int snd_hdspm_trigger(struct snd_pcm_substream *substream, int cmd)
5683 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5684 struct snd_pcm_substream *other;
5687 spin_lock(&hdspm->lock);
5688 running = hdspm->running;
5690 case SNDRV_PCM_TRIGGER_START:
5691 running |= 1 << substream->stream;
5693 case SNDRV_PCM_TRIGGER_STOP:
5694 running &= ~(1 << substream->stream);
5698 spin_unlock(&hdspm->lock);
5701 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
5702 other = hdspm->capture_substream;
5704 other = hdspm->playback_substream;
5707 struct snd_pcm_substream *s;
5708 snd_pcm_group_for_each_entry(s, substream) {
5710 snd_pcm_trigger_done(s, substream);
5711 if (cmd == SNDRV_PCM_TRIGGER_START)
5712 running |= 1 << s->stream;
5714 running &= ~(1 << s->stream);
5718 if (cmd == SNDRV_PCM_TRIGGER_START) {
5719 if (!(running & (1 << SNDRV_PCM_STREAM_PLAYBACK))
5720 && substream->stream ==
5721 SNDRV_PCM_STREAM_CAPTURE)
5722 hdspm_silence_playback(hdspm);
5725 substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
5726 hdspm_silence_playback(hdspm);
5729 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
5730 hdspm_silence_playback(hdspm);
5733 snd_pcm_trigger_done(substream, substream);
5734 if (!hdspm->running && running)
5735 hdspm_start_audio(hdspm);
5736 else if (hdspm->running && !running)
5737 hdspm_stop_audio(hdspm);
5738 hdspm->running = running;
5739 spin_unlock(&hdspm->lock);
5744 static int snd_hdspm_prepare(struct snd_pcm_substream *substream)
5749 static struct snd_pcm_hardware snd_hdspm_playback_subinfo = {
5750 .info = (SNDRV_PCM_INFO_MMAP |
5751 SNDRV_PCM_INFO_MMAP_VALID |
5752 SNDRV_PCM_INFO_NONINTERLEAVED |
5753 SNDRV_PCM_INFO_SYNC_START | SNDRV_PCM_INFO_DOUBLE),
5754 .formats = SNDRV_PCM_FMTBIT_S32_LE,
5755 .rates = (SNDRV_PCM_RATE_32000 |
5756 SNDRV_PCM_RATE_44100 |
5757 SNDRV_PCM_RATE_48000 |
5758 SNDRV_PCM_RATE_64000 |
5759 SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 |
5760 SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000 ),
5764 .channels_max = HDSPM_MAX_CHANNELS,
5766 HDSPM_CHANNEL_BUFFER_BYTES * HDSPM_MAX_CHANNELS,
5767 .period_bytes_min = (32 * 4),
5768 .period_bytes_max = (8192 * 4) * HDSPM_MAX_CHANNELS,
5774 static struct snd_pcm_hardware snd_hdspm_capture_subinfo = {
5775 .info = (SNDRV_PCM_INFO_MMAP |
5776 SNDRV_PCM_INFO_MMAP_VALID |
5777 SNDRV_PCM_INFO_NONINTERLEAVED |
5778 SNDRV_PCM_INFO_SYNC_START),
5779 .formats = SNDRV_PCM_FMTBIT_S32_LE,
5780 .rates = (SNDRV_PCM_RATE_32000 |
5781 SNDRV_PCM_RATE_44100 |
5782 SNDRV_PCM_RATE_48000 |
5783 SNDRV_PCM_RATE_64000 |
5784 SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 |
5785 SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000),
5789 .channels_max = HDSPM_MAX_CHANNELS,
5791 HDSPM_CHANNEL_BUFFER_BYTES * HDSPM_MAX_CHANNELS,
5792 .period_bytes_min = (32 * 4),
5793 .period_bytes_max = (8192 * 4) * HDSPM_MAX_CHANNELS,
5799 static int snd_hdspm_hw_rule_in_channels_rate(struct snd_pcm_hw_params *params,
5800 struct snd_pcm_hw_rule *rule)
5802 struct hdspm *hdspm = rule->private;
5803 struct snd_interval *c =
5804 hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5805 struct snd_interval *r =
5806 hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5808 if (r->min > 96000 && r->max <= 192000) {
5809 struct snd_interval t = {
5810 .min = hdspm->qs_in_channels,
5811 .max = hdspm->qs_in_channels,
5814 return snd_interval_refine(c, &t);
5815 } else if (r->min > 48000 && r->max <= 96000) {
5816 struct snd_interval t = {
5817 .min = hdspm->ds_in_channels,
5818 .max = hdspm->ds_in_channels,
5821 return snd_interval_refine(c, &t);
5822 } else if (r->max < 64000) {
5823 struct snd_interval t = {
5824 .min = hdspm->ss_in_channels,
5825 .max = hdspm->ss_in_channels,
5828 return snd_interval_refine(c, &t);
5834 static int snd_hdspm_hw_rule_out_channels_rate(struct snd_pcm_hw_params *params,
5835 struct snd_pcm_hw_rule * rule)
5837 struct hdspm *hdspm = rule->private;
5838 struct snd_interval *c =
5839 hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5840 struct snd_interval *r =
5841 hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5843 if (r->min > 96000 && r->max <= 192000) {
5844 struct snd_interval t = {
5845 .min = hdspm->qs_out_channels,
5846 .max = hdspm->qs_out_channels,
5849 return snd_interval_refine(c, &t);
5850 } else if (r->min > 48000 && r->max <= 96000) {
5851 struct snd_interval t = {
5852 .min = hdspm->ds_out_channels,
5853 .max = hdspm->ds_out_channels,
5856 return snd_interval_refine(c, &t);
5857 } else if (r->max < 64000) {
5858 struct snd_interval t = {
5859 .min = hdspm->ss_out_channels,
5860 .max = hdspm->ss_out_channels,
5863 return snd_interval_refine(c, &t);
5869 static int snd_hdspm_hw_rule_rate_in_channels(struct snd_pcm_hw_params *params,
5870 struct snd_pcm_hw_rule * rule)
5872 struct hdspm *hdspm = rule->private;
5873 struct snd_interval *c =
5874 hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5875 struct snd_interval *r =
5876 hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5878 if (c->min >= hdspm->ss_in_channels) {
5879 struct snd_interval t = {
5884 return snd_interval_refine(r, &t);
5885 } else if (c->max <= hdspm->qs_in_channels) {
5886 struct snd_interval t = {
5891 return snd_interval_refine(r, &t);
5892 } else if (c->max <= hdspm->ds_in_channels) {
5893 struct snd_interval t = {
5898 return snd_interval_refine(r, &t);
5903 static int snd_hdspm_hw_rule_rate_out_channels(struct snd_pcm_hw_params *params,
5904 struct snd_pcm_hw_rule *rule)
5906 struct hdspm *hdspm = rule->private;
5907 struct snd_interval *c =
5908 hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5909 struct snd_interval *r =
5910 hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5912 if (c->min >= hdspm->ss_out_channels) {
5913 struct snd_interval t = {
5918 return snd_interval_refine(r, &t);
5919 } else if (c->max <= hdspm->qs_out_channels) {
5920 struct snd_interval t = {
5925 return snd_interval_refine(r, &t);
5926 } else if (c->max <= hdspm->ds_out_channels) {
5927 struct snd_interval t = {
5932 return snd_interval_refine(r, &t);
5938 static int snd_hdspm_hw_rule_in_channels(struct snd_pcm_hw_params *params,
5939 struct snd_pcm_hw_rule *rule)
5941 unsigned int list[3];
5942 struct hdspm *hdspm = rule->private;
5943 struct snd_interval *c = hw_param_interval(params,
5944 SNDRV_PCM_HW_PARAM_CHANNELS);
5946 list[0] = hdspm->qs_in_channels;
5947 list[1] = hdspm->ds_in_channels;
5948 list[2] = hdspm->ss_in_channels;
5949 return snd_interval_list(c, 3, list, 0);
5952 static int snd_hdspm_hw_rule_out_channels(struct snd_pcm_hw_params *params,
5953 struct snd_pcm_hw_rule *rule)
5955 unsigned int list[3];
5956 struct hdspm *hdspm = rule->private;
5957 struct snd_interval *c = hw_param_interval(params,
5958 SNDRV_PCM_HW_PARAM_CHANNELS);
5960 list[0] = hdspm->qs_out_channels;
5961 list[1] = hdspm->ds_out_channels;
5962 list[2] = hdspm->ss_out_channels;
5963 return snd_interval_list(c, 3, list, 0);
5967 static unsigned int hdspm_aes32_sample_rates[] = {
5968 32000, 44100, 48000, 64000, 88200, 96000, 128000, 176400, 192000
5971 static struct snd_pcm_hw_constraint_list
5972 hdspm_hw_constraints_aes32_sample_rates = {
5973 .count = ARRAY_SIZE(hdspm_aes32_sample_rates),
5974 .list = hdspm_aes32_sample_rates,
5978 static int snd_hdspm_playback_open(struct snd_pcm_substream *substream)
5980 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5981 struct snd_pcm_runtime *runtime = substream->runtime;
5983 spin_lock_irq(&hdspm->lock);
5985 snd_pcm_set_sync(substream);
5988 runtime->hw = snd_hdspm_playback_subinfo;
5990 if (hdspm->capture_substream == NULL)
5991 hdspm_stop_audio(hdspm);
5993 hdspm->playback_pid = current->pid;
5994 hdspm->playback_substream = substream;
5996 spin_unlock_irq(&hdspm->lock);
5998 snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
5999 snd_pcm_hw_constraint_pow2(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
6001 switch (hdspm->io_type) {
6004 snd_pcm_hw_constraint_minmax(runtime,
6005 SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
6007 /* RayDAT & AIO have a fixed buffer of 16384 samples per channel */
6008 snd_pcm_hw_constraint_minmax(runtime,
6009 SNDRV_PCM_HW_PARAM_BUFFER_SIZE,
6014 snd_pcm_hw_constraint_minmax(runtime,
6015 SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
6020 if (AES32 == hdspm->io_type) {
6021 runtime->hw.rates |= SNDRV_PCM_RATE_KNOT;
6022 snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
6023 &hdspm_hw_constraints_aes32_sample_rates);
6025 snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
6026 snd_hdspm_hw_rule_rate_out_channels, hdspm,
6027 SNDRV_PCM_HW_PARAM_CHANNELS, -1);
6030 snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
6031 snd_hdspm_hw_rule_out_channels, hdspm,
6032 SNDRV_PCM_HW_PARAM_CHANNELS, -1);
6034 snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
6035 snd_hdspm_hw_rule_out_channels_rate, hdspm,
6036 SNDRV_PCM_HW_PARAM_RATE, -1);
6041 static int snd_hdspm_playback_release(struct snd_pcm_substream *substream)
6043 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
6045 spin_lock_irq(&hdspm->lock);
6047 hdspm->playback_pid = -1;
6048 hdspm->playback_substream = NULL;
6050 spin_unlock_irq(&hdspm->lock);
6056 static int snd_hdspm_capture_open(struct snd_pcm_substream *substream)
6058 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
6059 struct snd_pcm_runtime *runtime = substream->runtime;
6061 spin_lock_irq(&hdspm->lock);
6062 snd_pcm_set_sync(substream);
6063 runtime->hw = snd_hdspm_capture_subinfo;
6065 if (hdspm->playback_substream == NULL)
6066 hdspm_stop_audio(hdspm);
6068 hdspm->capture_pid = current->pid;
6069 hdspm->capture_substream = substream;
6071 spin_unlock_irq(&hdspm->lock);
6073 snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
6074 snd_pcm_hw_constraint_pow2(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
6076 switch (hdspm->io_type) {
6079 snd_pcm_hw_constraint_minmax(runtime,
6080 SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
6082 snd_pcm_hw_constraint_minmax(runtime,
6083 SNDRV_PCM_HW_PARAM_BUFFER_SIZE,
6088 snd_pcm_hw_constraint_minmax(runtime,
6089 SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
6094 if (AES32 == hdspm->io_type) {
6095 runtime->hw.rates |= SNDRV_PCM_RATE_KNOT;
6096 snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
6097 &hdspm_hw_constraints_aes32_sample_rates);
6099 snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
6100 snd_hdspm_hw_rule_rate_in_channels, hdspm,
6101 SNDRV_PCM_HW_PARAM_CHANNELS, -1);
6104 snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
6105 snd_hdspm_hw_rule_in_channels, hdspm,
6106 SNDRV_PCM_HW_PARAM_CHANNELS, -1);
6108 snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
6109 snd_hdspm_hw_rule_in_channels_rate, hdspm,
6110 SNDRV_PCM_HW_PARAM_RATE, -1);
6115 static int snd_hdspm_capture_release(struct snd_pcm_substream *substream)
6117 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
6119 spin_lock_irq(&hdspm->lock);
6121 hdspm->capture_pid = -1;
6122 hdspm->capture_substream = NULL;
6124 spin_unlock_irq(&hdspm->lock);
6128 static int snd_hdspm_hwdep_dummy_op(struct snd_hwdep *hw, struct file *file)
6130 /* we have nothing to initialize but the call is required */
6134 static inline int copy_u32_le(void __user *dest, void __iomem *src)
6136 u32 val = readl(src);
6137 return copy_to_user(dest, &val, 4);
6140 static int snd_hdspm_hwdep_ioctl(struct snd_hwdep *hw, struct file *file,
6141 unsigned int cmd, unsigned long arg)
6143 void __user *argp = (void __user *)arg;
6144 struct hdspm *hdspm = hw->private_data;
6145 struct hdspm_mixer_ioctl mixer;
6146 struct hdspm_config info;
6147 struct hdspm_status status;
6148 struct hdspm_version hdspm_version;
6149 struct hdspm_peak_rms *levels;
6150 struct hdspm_ltc ltc;
6151 unsigned int statusregister;
6152 long unsigned int s;
6157 case SNDRV_HDSPM_IOCTL_GET_PEAK_RMS:
6158 levels = &hdspm->peak_rms;
6159 for (i = 0; i < HDSPM_MAX_CHANNELS; i++) {
6160 levels->input_peaks[i] =
6161 readl(hdspm->iobase +
6162 HDSPM_MADI_INPUT_PEAK + i*4);
6163 levels->playback_peaks[i] =
6164 readl(hdspm->iobase +
6165 HDSPM_MADI_PLAYBACK_PEAK + i*4);
6166 levels->output_peaks[i] =
6167 readl(hdspm->iobase +
6168 HDSPM_MADI_OUTPUT_PEAK + i*4);
6170 levels->input_rms[i] =
6171 ((uint64_t) readl(hdspm->iobase +
6172 HDSPM_MADI_INPUT_RMS_H + i*4) << 32) |
6173 (uint64_t) readl(hdspm->iobase +
6174 HDSPM_MADI_INPUT_RMS_L + i*4);
6175 levels->playback_rms[i] =
6176 ((uint64_t)readl(hdspm->iobase +
6177 HDSPM_MADI_PLAYBACK_RMS_H+i*4) << 32) |
6178 (uint64_t)readl(hdspm->iobase +
6179 HDSPM_MADI_PLAYBACK_RMS_L + i*4);
6180 levels->output_rms[i] =
6181 ((uint64_t)readl(hdspm->iobase +
6182 HDSPM_MADI_OUTPUT_RMS_H + i*4) << 32) |
6183 (uint64_t)readl(hdspm->iobase +
6184 HDSPM_MADI_OUTPUT_RMS_L + i*4);
6187 if (hdspm->system_sample_rate > 96000) {
6189 } else if (hdspm->system_sample_rate > 48000) {
6194 levels->status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
6196 s = copy_to_user(argp, levels, sizeof(struct hdspm_peak_rms));
6198 /* snd_printk(KERN_ERR "copy_to_user(.., .., %lu): %lu
6199 [Levels]\n", sizeof(struct hdspm_peak_rms), s);
6205 case SNDRV_HDSPM_IOCTL_GET_LTC:
6206 ltc.ltc = hdspm_read(hdspm, HDSPM_RD_TCO);
6207 i = hdspm_read(hdspm, HDSPM_RD_TCO + 4);
6208 if (i & HDSPM_TCO1_LTC_Input_valid) {
6209 switch (i & (HDSPM_TCO1_LTC_Format_LSB |
6210 HDSPM_TCO1_LTC_Format_MSB)) {
6212 ltc.format = fps_24;
6214 case HDSPM_TCO1_LTC_Format_LSB:
6215 ltc.format = fps_25;
6217 case HDSPM_TCO1_LTC_Format_MSB:
6218 ltc.format = fps_2997;
6224 if (i & HDSPM_TCO1_set_drop_frame_flag) {
6225 ltc.frame = drop_frame;
6227 ltc.frame = full_frame;
6230 ltc.format = format_invalid;
6231 ltc.frame = frame_invalid;
6233 if (i & HDSPM_TCO1_Video_Input_Format_NTSC) {
6234 ltc.input_format = ntsc;
6235 } else if (i & HDSPM_TCO1_Video_Input_Format_PAL) {
6236 ltc.input_format = pal;
6238 ltc.input_format = no_video;
6241 s = copy_to_user(argp, <c, sizeof(struct hdspm_ltc));
6244 snd_printk(KERN_ERR "copy_to_user(.., .., %lu): %lu [LTC]\n", sizeof(struct hdspm_ltc), s); */
6250 case SNDRV_HDSPM_IOCTL_GET_CONFIG:
6252 memset(&info, 0, sizeof(info));
6253 spin_lock_irq(&hdspm->lock);
6254 info.pref_sync_ref = hdspm_pref_sync_ref(hdspm);
6255 info.wordclock_sync_check = hdspm_wc_sync_check(hdspm);
6257 info.system_sample_rate = hdspm->system_sample_rate;
6258 info.autosync_sample_rate =
6259 hdspm_external_sample_rate(hdspm);
6260 info.system_clock_mode = hdspm_system_clock_mode(hdspm);
6261 info.clock_source = hdspm_clock_source(hdspm);
6262 info.autosync_ref = hdspm_autosync_ref(hdspm);
6263 info.line_out = hdspm_toggle_setting(hdspm, HDSPM_LineOut);
6265 spin_unlock_irq(&hdspm->lock);
6266 if (copy_to_user(argp, &info, sizeof(info)))
6270 case SNDRV_HDSPM_IOCTL_GET_STATUS:
6271 memset(&status, 0, sizeof(status));
6273 status.card_type = hdspm->io_type;
6275 status.autosync_source = hdspm_autosync_ref(hdspm);
6277 status.card_clock = 110069313433624ULL;
6278 status.master_period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ);
6280 switch (hdspm->io_type) {
6283 status.card_specific.madi.sync_wc =
6284 hdspm_wc_sync_check(hdspm);
6285 status.card_specific.madi.sync_madi =
6286 hdspm_madi_sync_check(hdspm);
6287 status.card_specific.madi.sync_tco =
6288 hdspm_tco_sync_check(hdspm);
6289 status.card_specific.madi.sync_in =
6290 hdspm_sync_in_sync_check(hdspm);
6293 hdspm_read(hdspm, HDSPM_statusRegister);
6294 status.card_specific.madi.madi_input =
6295 (statusregister & HDSPM_AB_int) ? 1 : 0;
6296 status.card_specific.madi.channel_format =
6297 (statusregister & HDSPM_RX_64ch) ? 1 : 0;
6298 /* TODO: Mac driver sets it when f_s>48kHz */
6299 status.card_specific.madi.frame_format = 0;
6305 if (copy_to_user(argp, &status, sizeof(status)))
6311 case SNDRV_HDSPM_IOCTL_GET_VERSION:
6312 memset(&hdspm_version, 0, sizeof(hdspm_version));
6314 hdspm_version.card_type = hdspm->io_type;
6315 strncpy(hdspm_version.cardname, hdspm->card_name,
6316 sizeof(hdspm_version.cardname));
6317 hdspm_version.serial = hdspm->serial;
6318 hdspm_version.firmware_rev = hdspm->firmware_rev;
6319 hdspm_version.addons = 0;
6321 hdspm_version.addons |= HDSPM_ADDON_TCO;
6323 if (copy_to_user(argp, &hdspm_version,
6324 sizeof(hdspm_version)))
6328 case SNDRV_HDSPM_IOCTL_GET_MIXER:
6329 if (copy_from_user(&mixer, argp, sizeof(mixer)))
6331 if (copy_to_user((void __user *)mixer.mixer, hdspm->mixer,
6332 sizeof(struct hdspm_mixer)))
6342 static struct snd_pcm_ops snd_hdspm_playback_ops = {
6343 .open = snd_hdspm_playback_open,
6344 .close = snd_hdspm_playback_release,
6345 .ioctl = snd_hdspm_ioctl,
6346 .hw_params = snd_hdspm_hw_params,
6347 .hw_free = snd_hdspm_hw_free,
6348 .prepare = snd_hdspm_prepare,
6349 .trigger = snd_hdspm_trigger,
6350 .pointer = snd_hdspm_hw_pointer,
6351 .page = snd_pcm_sgbuf_ops_page,
6354 static struct snd_pcm_ops snd_hdspm_capture_ops = {
6355 .open = snd_hdspm_capture_open,
6356 .close = snd_hdspm_capture_release,
6357 .ioctl = snd_hdspm_ioctl,
6358 .hw_params = snd_hdspm_hw_params,
6359 .hw_free = snd_hdspm_hw_free,
6360 .prepare = snd_hdspm_prepare,
6361 .trigger = snd_hdspm_trigger,
6362 .pointer = snd_hdspm_hw_pointer,
6363 .page = snd_pcm_sgbuf_ops_page,
6366 static int snd_hdspm_create_hwdep(struct snd_card *card,
6367 struct hdspm *hdspm)
6369 struct snd_hwdep *hw;
6372 err = snd_hwdep_new(card, "HDSPM hwdep", 0, &hw);
6377 hw->private_data = hdspm;
6378 strcpy(hw->name, "HDSPM hwdep interface");
6380 hw->ops.open = snd_hdspm_hwdep_dummy_op;
6381 hw->ops.ioctl = snd_hdspm_hwdep_ioctl;
6382 hw->ops.ioctl_compat = snd_hdspm_hwdep_ioctl;
6383 hw->ops.release = snd_hdspm_hwdep_dummy_op;
6389 /*------------------------------------------------------------
6391 ------------------------------------------------------------*/
6392 static int snd_hdspm_preallocate_memory(struct hdspm *hdspm)
6395 struct snd_pcm *pcm;
6400 wanted = HDSPM_DMA_AREA_BYTES;
6403 snd_pcm_lib_preallocate_pages_for_all(pcm,
6404 SNDRV_DMA_TYPE_DEV_SG,
6405 snd_dma_pci_data(hdspm->pci),
6409 snd_printdd("Could not preallocate %zd Bytes\n", wanted);
6413 snd_printdd(" Preallocated %zd Bytes\n", wanted);
6419 static void hdspm_set_sgbuf(struct hdspm *hdspm,
6420 struct snd_pcm_substream *substream,
6421 unsigned int reg, int channels)
6425 /* continuous memory segment */
6426 for (i = 0; i < (channels * 16); i++)
6427 hdspm_write(hdspm, reg + 4 * i,
6428 snd_pcm_sgbuf_get_addr(substream, 4096 * i));
6432 /* ------------- ALSA Devices ---------------------------- */
6433 static int snd_hdspm_create_pcm(struct snd_card *card,
6434 struct hdspm *hdspm)
6436 struct snd_pcm *pcm;
6439 err = snd_pcm_new(card, hdspm->card_name, 0, 1, 1, &pcm);
6444 pcm->private_data = hdspm;
6445 strcpy(pcm->name, hdspm->card_name);
6447 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
6448 &snd_hdspm_playback_ops);
6449 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
6450 &snd_hdspm_capture_ops);
6452 pcm->info_flags = SNDRV_PCM_INFO_JOINT_DUPLEX;
6454 err = snd_hdspm_preallocate_memory(hdspm);
6461 static inline void snd_hdspm_initialize_midi_flush(struct hdspm * hdspm)
6465 for (i = 0; i < hdspm->midiPorts; i++)
6466 snd_hdspm_flush_midi_input(hdspm, i);
6469 static int snd_hdspm_create_alsa_devices(struct snd_card *card,
6470 struct hdspm *hdspm)
6474 snd_printdd("Create card...\n");
6475 err = snd_hdspm_create_pcm(card, hdspm);
6480 while (i < hdspm->midiPorts) {
6481 err = snd_hdspm_create_midi(card, hdspm, i);
6488 err = snd_hdspm_create_controls(card, hdspm);
6492 err = snd_hdspm_create_hwdep(card, hdspm);
6496 snd_printdd("proc init...\n");
6497 snd_hdspm_proc_init(hdspm);
6499 hdspm->system_sample_rate = -1;
6500 hdspm->last_external_sample_rate = -1;
6501 hdspm->last_internal_sample_rate = -1;
6502 hdspm->playback_pid = -1;
6503 hdspm->capture_pid = -1;
6504 hdspm->capture_substream = NULL;
6505 hdspm->playback_substream = NULL;
6507 snd_printdd("Set defaults...\n");
6508 err = snd_hdspm_set_defaults(hdspm);
6512 snd_printdd("Update mixer controls...\n");
6513 hdspm_update_simple_mixer_controls(hdspm);
6515 snd_printdd("Initializeing complete ???\n");
6517 err = snd_card_register(card);
6519 snd_printk(KERN_ERR "HDSPM: error registering card\n");
6523 snd_printdd("... yes now\n");
6528 static int snd_hdspm_create(struct snd_card *card,
6529 struct hdspm *hdspm)
6532 struct pci_dev *pci = hdspm->pci;
6534 unsigned long io_extent;
6539 spin_lock_init(&hdspm->lock);
6541 pci_read_config_word(hdspm->pci,
6542 PCI_CLASS_REVISION, &hdspm->firmware_rev);
6544 strcpy(card->mixername, "Xilinx FPGA");
6545 strcpy(card->driver, "HDSPM");
6547 switch (hdspm->firmware_rev) {
6548 case HDSPM_RAYDAT_REV:
6549 hdspm->io_type = RayDAT;
6550 hdspm->card_name = "RME RayDAT";
6551 hdspm->midiPorts = 2;
6554 hdspm->io_type = AIO;
6555 hdspm->card_name = "RME AIO";
6556 hdspm->midiPorts = 1;
6558 case HDSPM_MADIFACE_REV:
6559 hdspm->io_type = MADIface;
6560 hdspm->card_name = "RME MADIface";
6561 hdspm->midiPorts = 1;
6564 if ((hdspm->firmware_rev == 0xf0) ||
6565 ((hdspm->firmware_rev >= 0xe6) &&
6566 (hdspm->firmware_rev <= 0xea))) {
6567 hdspm->io_type = AES32;
6568 hdspm->card_name = "RME AES32";
6569 hdspm->midiPorts = 2;
6570 } else if ((hdspm->firmware_rev == 0xd2) ||
6571 ((hdspm->firmware_rev >= 0xc8) &&
6572 (hdspm->firmware_rev <= 0xcf))) {
6573 hdspm->io_type = MADI;
6574 hdspm->card_name = "RME MADI";
6575 hdspm->midiPorts = 3;
6578 "HDSPM: unknown firmware revision %x\n",
6579 hdspm->firmware_rev);
6584 err = pci_enable_device(pci);
6588 pci_set_master(hdspm->pci);
6590 err = pci_request_regions(pci, "hdspm");
6594 hdspm->port = pci_resource_start(pci, 0);
6595 io_extent = pci_resource_len(pci, 0);
6597 snd_printdd("grabbed memory region 0x%lx-0x%lx\n",
6598 hdspm->port, hdspm->port + io_extent - 1);
6600 hdspm->iobase = ioremap_nocache(hdspm->port, io_extent);
6601 if (!hdspm->iobase) {
6602 snd_printk(KERN_ERR "HDSPM: "
6603 "unable to remap region 0x%lx-0x%lx\n",
6604 hdspm->port, hdspm->port + io_extent - 1);
6607 snd_printdd("remapped region (0x%lx) 0x%lx-0x%lx\n",
6608 (unsigned long)hdspm->iobase, hdspm->port,
6609 hdspm->port + io_extent - 1);
6611 if (request_irq(pci->irq, snd_hdspm_interrupt,
6612 IRQF_SHARED, KBUILD_MODNAME, hdspm)) {
6613 snd_printk(KERN_ERR "HDSPM: unable to use IRQ %d\n", pci->irq);
6617 snd_printdd("use IRQ %d\n", pci->irq);
6619 hdspm->irq = pci->irq;
6621 snd_printdd("kmalloc Mixer memory of %zd Bytes\n",
6622 sizeof(struct hdspm_mixer));
6623 hdspm->mixer = kzalloc(sizeof(struct hdspm_mixer), GFP_KERNEL);
6624 if (!hdspm->mixer) {
6625 snd_printk(KERN_ERR "HDSPM: "
6626 "unable to kmalloc Mixer memory of %d Bytes\n",
6627 (int)sizeof(struct hdspm_mixer));
6631 hdspm->port_names_in = NULL;
6632 hdspm->port_names_out = NULL;
6634 switch (hdspm->io_type) {
6636 hdspm->ss_in_channels = hdspm->ss_out_channels = AES32_CHANNELS;
6637 hdspm->ds_in_channels = hdspm->ds_out_channels = AES32_CHANNELS;
6638 hdspm->qs_in_channels = hdspm->qs_out_channels = AES32_CHANNELS;
6640 hdspm->channel_map_in_ss = hdspm->channel_map_out_ss =
6642 hdspm->channel_map_in_ds = hdspm->channel_map_out_ds =
6644 hdspm->channel_map_in_qs = hdspm->channel_map_out_qs =
6646 hdspm->port_names_in_ss = hdspm->port_names_out_ss =
6648 hdspm->port_names_in_ds = hdspm->port_names_out_ds =
6650 hdspm->port_names_in_qs = hdspm->port_names_out_qs =
6653 hdspm->max_channels_out = hdspm->max_channels_in =
6655 hdspm->port_names_in = hdspm->port_names_out =
6657 hdspm->channel_map_in = hdspm->channel_map_out =
6664 hdspm->ss_in_channels = hdspm->ss_out_channels =
6666 hdspm->ds_in_channels = hdspm->ds_out_channels =
6668 hdspm->qs_in_channels = hdspm->qs_out_channels =
6671 hdspm->channel_map_in_ss = hdspm->channel_map_out_ss =
6672 channel_map_unity_ss;
6673 hdspm->channel_map_in_ds = hdspm->channel_map_out_ds =
6674 channel_map_unity_ss;
6675 hdspm->channel_map_in_qs = hdspm->channel_map_out_qs =
6676 channel_map_unity_ss;
6678 hdspm->port_names_in_ss = hdspm->port_names_out_ss =
6680 hdspm->port_names_in_ds = hdspm->port_names_out_ds =
6682 hdspm->port_names_in_qs = hdspm->port_names_out_qs =
6687 hdspm->ss_in_channels = AIO_IN_SS_CHANNELS;
6688 hdspm->ds_in_channels = AIO_IN_DS_CHANNELS;
6689 hdspm->qs_in_channels = AIO_IN_QS_CHANNELS;
6690 hdspm->ss_out_channels = AIO_OUT_SS_CHANNELS;
6691 hdspm->ds_out_channels = AIO_OUT_DS_CHANNELS;
6692 hdspm->qs_out_channels = AIO_OUT_QS_CHANNELS;
6694 if (0 == (hdspm_read(hdspm, HDSPM_statusRegister2) & HDSPM_s2_AEBI_D)) {
6695 snd_printk(KERN_INFO "HDSPM: AEB input board found\n");
6696 hdspm->ss_in_channels += 4;
6697 hdspm->ds_in_channels += 4;
6698 hdspm->qs_in_channels += 4;
6701 if (0 == (hdspm_read(hdspm, HDSPM_statusRegister2) & HDSPM_s2_AEBO_D)) {
6702 snd_printk(KERN_INFO "HDSPM: AEB output board found\n");
6703 hdspm->ss_out_channels += 4;
6704 hdspm->ds_out_channels += 4;
6705 hdspm->qs_out_channels += 4;
6708 hdspm->channel_map_out_ss = channel_map_aio_out_ss;
6709 hdspm->channel_map_out_ds = channel_map_aio_out_ds;
6710 hdspm->channel_map_out_qs = channel_map_aio_out_qs;
6712 hdspm->channel_map_in_ss = channel_map_aio_in_ss;
6713 hdspm->channel_map_in_ds = channel_map_aio_in_ds;
6714 hdspm->channel_map_in_qs = channel_map_aio_in_qs;
6716 hdspm->port_names_in_ss = texts_ports_aio_in_ss;
6717 hdspm->port_names_out_ss = texts_ports_aio_out_ss;
6718 hdspm->port_names_in_ds = texts_ports_aio_in_ds;
6719 hdspm->port_names_out_ds = texts_ports_aio_out_ds;
6720 hdspm->port_names_in_qs = texts_ports_aio_in_qs;
6721 hdspm->port_names_out_qs = texts_ports_aio_out_qs;
6726 hdspm->ss_in_channels = hdspm->ss_out_channels =
6728 hdspm->ds_in_channels = hdspm->ds_out_channels =
6730 hdspm->qs_in_channels = hdspm->qs_out_channels =
6733 hdspm->max_channels_in = RAYDAT_SS_CHANNELS;
6734 hdspm->max_channels_out = RAYDAT_SS_CHANNELS;
6736 hdspm->channel_map_in_ss = hdspm->channel_map_out_ss =
6737 channel_map_raydat_ss;
6738 hdspm->channel_map_in_ds = hdspm->channel_map_out_ds =
6739 channel_map_raydat_ds;
6740 hdspm->channel_map_in_qs = hdspm->channel_map_out_qs =
6741 channel_map_raydat_qs;
6742 hdspm->channel_map_in = hdspm->channel_map_out =
6743 channel_map_raydat_ss;
6745 hdspm->port_names_in_ss = hdspm->port_names_out_ss =
6746 texts_ports_raydat_ss;
6747 hdspm->port_names_in_ds = hdspm->port_names_out_ds =
6748 texts_ports_raydat_ds;
6749 hdspm->port_names_in_qs = hdspm->port_names_out_qs =
6750 texts_ports_raydat_qs;
6758 switch (hdspm->io_type) {
6761 if (hdspm_read(hdspm, HDSPM_statusRegister2) &
6762 HDSPM_s2_tco_detect) {
6764 hdspm->tco = kzalloc(sizeof(struct hdspm_tco),
6766 if (NULL != hdspm->tco) {
6767 hdspm_tco_write(hdspm);
6769 snd_printk(KERN_INFO "HDSPM: AIO/RayDAT TCO module found\n");
6776 if (hdspm_read(hdspm, HDSPM_statusRegister) & HDSPM_tco_detect) {
6778 hdspm->tco = kzalloc(sizeof(struct hdspm_tco),
6780 if (NULL != hdspm->tco) {
6781 hdspm_tco_write(hdspm);
6783 snd_printk(KERN_INFO "HDSPM: MADI/AES TCO module found\n");
6794 switch (hdspm->io_type) {
6797 hdspm->texts_autosync = texts_autosync_aes_tco;
6798 hdspm->texts_autosync_items =
6799 ARRAY_SIZE(texts_autosync_aes_tco);
6801 hdspm->texts_autosync = texts_autosync_aes;
6802 hdspm->texts_autosync_items =
6803 ARRAY_SIZE(texts_autosync_aes);
6809 hdspm->texts_autosync = texts_autosync_madi_tco;
6810 hdspm->texts_autosync_items = 4;
6812 hdspm->texts_autosync = texts_autosync_madi;
6813 hdspm->texts_autosync_items = 3;
6823 hdspm->texts_autosync = texts_autosync_raydat_tco;
6824 hdspm->texts_autosync_items = 9;
6826 hdspm->texts_autosync = texts_autosync_raydat;
6827 hdspm->texts_autosync_items = 8;
6833 hdspm->texts_autosync = texts_autosync_aio_tco;
6834 hdspm->texts_autosync_items = 6;
6836 hdspm->texts_autosync = texts_autosync_aio;
6837 hdspm->texts_autosync_items = 5;
6843 tasklet_init(&hdspm->midi_tasklet,
6844 hdspm_midi_tasklet, (unsigned long) hdspm);
6847 if (hdspm->io_type != MADIface) {
6848 hdspm->serial = (hdspm_read(hdspm,
6849 HDSPM_midiStatusIn0)>>8) & 0xFFFFFF;
6850 /* id contains either a user-provided value or the default
6851 * NULL. If it's the default, we're safe to
6852 * fill card->id with the serial number.
6854 * If the serial number is 0xFFFFFF, then we're dealing with
6855 * an old PCI revision that comes without a sane number. In
6856 * this case, we don't set card->id to avoid collisions
6857 * when running with multiple cards.
6859 if (NULL == id[hdspm->dev] && hdspm->serial != 0xFFFFFF) {
6860 sprintf(card->id, "HDSPMx%06x", hdspm->serial);
6861 snd_card_set_id(card, card->id);
6865 snd_printdd("create alsa devices.\n");
6866 err = snd_hdspm_create_alsa_devices(card, hdspm);
6870 snd_hdspm_initialize_midi_flush(hdspm);
6876 static int snd_hdspm_free(struct hdspm * hdspm)
6881 /* stop th audio, and cancel all interrupts */
6882 hdspm->control_register &=
6883 ~(HDSPM_Start | HDSPM_AudioInterruptEnable |
6884 HDSPM_Midi0InterruptEnable | HDSPM_Midi1InterruptEnable |
6885 HDSPM_Midi2InterruptEnable | HDSPM_Midi3InterruptEnable);
6886 hdspm_write(hdspm, HDSPM_controlRegister,
6887 hdspm->control_register);
6890 if (hdspm->irq >= 0)
6891 free_irq(hdspm->irq, (void *) hdspm);
6893 kfree(hdspm->mixer);
6896 iounmap(hdspm->iobase);
6899 pci_release_regions(hdspm->pci);
6901 pci_disable_device(hdspm->pci);
6906 static void snd_hdspm_card_free(struct snd_card *card)
6908 struct hdspm *hdspm = card->private_data;
6911 snd_hdspm_free(hdspm);
6915 static int snd_hdspm_probe(struct pci_dev *pci,
6916 const struct pci_device_id *pci_id)
6919 struct hdspm *hdspm;
6920 struct snd_card *card;
6923 if (dev >= SNDRV_CARDS)
6930 err = snd_card_create(index[dev], id[dev],
6931 THIS_MODULE, sizeof(struct hdspm), &card);
6935 hdspm = card->private_data;
6936 card->private_free = snd_hdspm_card_free;
6940 snd_card_set_dev(card, &pci->dev);
6942 err = snd_hdspm_create(card, hdspm);
6944 snd_card_free(card);
6948 if (hdspm->io_type != MADIface) {
6949 sprintf(card->shortname, "%s_%x",
6952 sprintf(card->longname, "%s S/N 0x%x at 0x%lx, irq %d",
6955 hdspm->port, hdspm->irq);
6957 sprintf(card->shortname, "%s", hdspm->card_name);
6958 sprintf(card->longname, "%s at 0x%lx, irq %d",
6959 hdspm->card_name, hdspm->port, hdspm->irq);
6962 err = snd_card_register(card);
6964 snd_card_free(card);
6968 pci_set_drvdata(pci, card);
6974 static void snd_hdspm_remove(struct pci_dev *pci)
6976 snd_card_free(pci_get_drvdata(pci));
6979 static struct pci_driver hdspm_driver = {
6980 .name = KBUILD_MODNAME,
6981 .id_table = snd_hdspm_ids,
6982 .probe = snd_hdspm_probe,
6983 .remove = snd_hdspm_remove,
6986 module_pci_driver(hdspm_driver);