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 const char *const texts_autosync_aes_tco[] = { "Word Clock",
562 "AES1", "AES2", "AES3", "AES4",
563 "AES5", "AES6", "AES7", "AES8",
566 static const char *const texts_autosync_aes[] = { "Word Clock",
567 "AES1", "AES2", "AES3", "AES4",
568 "AES5", "AES6", "AES7", "AES8",
571 static const char *const texts_autosync_madi_tco[] = { "Word Clock",
572 "MADI", "TCO", "Sync In" };
573 static const char *const texts_autosync_madi[] = { "Word Clock",
576 static const char *const texts_autosync_raydat_tco[] = {
578 "ADAT 1", "ADAT 2", "ADAT 3", "ADAT 4",
579 "AES", "SPDIF", "TCO", "Sync In"
581 static const char *const texts_autosync_raydat[] = {
583 "ADAT 1", "ADAT 2", "ADAT 3", "ADAT 4",
584 "AES", "SPDIF", "Sync In"
586 static const char *const texts_autosync_aio_tco[] = {
588 "ADAT", "AES", "SPDIF", "TCO", "Sync In"
590 static const char *const texts_autosync_aio[] = { "Word Clock",
591 "ADAT", "AES", "SPDIF", "Sync In" };
593 static const char *const 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 const char *const *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 case HDSPM_AES32_AUTOSYNC_FROM_WORD:
1181 /* Check WC sync and get sample rate */
1182 if (hdspm_wc_sync_check(hdspm))
1183 return HDSPM_bit2freq(hdspm_get_wc_sample_rate(hdspm));
1186 case HDSPM_AES32_AUTOSYNC_FROM_AES1:
1187 case HDSPM_AES32_AUTOSYNC_FROM_AES2:
1188 case HDSPM_AES32_AUTOSYNC_FROM_AES3:
1189 case HDSPM_AES32_AUTOSYNC_FROM_AES4:
1190 case HDSPM_AES32_AUTOSYNC_FROM_AES5:
1191 case HDSPM_AES32_AUTOSYNC_FROM_AES6:
1192 case HDSPM_AES32_AUTOSYNC_FROM_AES7:
1193 case HDSPM_AES32_AUTOSYNC_FROM_AES8:
1194 /* Check AES sync and get sample rate */
1195 if (hdspm_aes_sync_check(hdspm, syncref - HDSPM_AES32_AUTOSYNC_FROM_AES1))
1196 return HDSPM_bit2freq(hdspm_get_aes_sample_rate(hdspm,
1197 syncref - HDSPM_AES32_AUTOSYNC_FROM_AES1));
1201 case HDSPM_AES32_AUTOSYNC_FROM_TCO:
1202 /* Check TCO sync and get sample rate */
1203 if (hdspm_tco_sync_check(hdspm))
1204 return HDSPM_bit2freq(hdspm_get_tco_sample_rate(hdspm));
1208 } /* end switch(syncref) */
1212 status = hdspm_read(hdspm, HDSPM_statusRegister);
1214 if (!(status & HDSPM_madiLock)) {
1215 rate = 0; /* no lock */
1217 switch (status & (HDSPM_status1_freqMask)) {
1218 case HDSPM_status1_F_0*1:
1219 rate = 32000; break;
1220 case HDSPM_status1_F_0*2:
1221 rate = 44100; break;
1222 case HDSPM_status1_F_0*3:
1223 rate = 48000; break;
1224 case HDSPM_status1_F_0*4:
1225 rate = 64000; break;
1226 case HDSPM_status1_F_0*5:
1227 rate = 88200; break;
1228 case HDSPM_status1_F_0*6:
1229 rate = 96000; break;
1230 case HDSPM_status1_F_0*7:
1231 rate = 128000; break;
1232 case HDSPM_status1_F_0*8:
1233 rate = 176400; break;
1234 case HDSPM_status1_F_0*9:
1235 rate = 192000; break;
1246 status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
1247 status = hdspm_read(hdspm, HDSPM_statusRegister);
1250 /* if wordclock has synced freq and wordclock is valid */
1251 if ((status2 & HDSPM_wcLock) != 0 &&
1252 (status2 & HDSPM_SelSyncRef0) == 0) {
1254 rate_bits = status2 & HDSPM_wcFreqMask;
1257 switch (rate_bits) {
1258 case HDSPM_wcFreq32:
1261 case HDSPM_wcFreq44_1:
1264 case HDSPM_wcFreq48:
1267 case HDSPM_wcFreq64:
1270 case HDSPM_wcFreq88_2:
1273 case HDSPM_wcFreq96:
1276 case HDSPM_wcFreq128:
1279 case HDSPM_wcFreq176_4:
1282 case HDSPM_wcFreq192:
1291 /* if rate detected and Syncref is Word than have it,
1292 * word has priority to MADI
1295 (status2 & HDSPM_SelSyncRefMask) == HDSPM_SelSyncRef_WORD)
1296 return hdspm_rate_multiplier(hdspm, rate);
1298 /* maybe a madi input (which is taken if sel sync is madi) */
1299 if (status & HDSPM_madiLock) {
1300 rate_bits = status & HDSPM_madiFreqMask;
1302 switch (rate_bits) {
1303 case HDSPM_madiFreq32:
1306 case HDSPM_madiFreq44_1:
1309 case HDSPM_madiFreq48:
1312 case HDSPM_madiFreq64:
1315 case HDSPM_madiFreq88_2:
1318 case HDSPM_madiFreq96:
1321 case HDSPM_madiFreq128:
1324 case HDSPM_madiFreq176_4:
1327 case HDSPM_madiFreq192:
1335 } /* endif HDSPM_madiLock */
1337 /* check sample rate from TCO or SYNC_IN */
1339 bool is_valid_input = 0;
1342 syncref = hdspm_autosync_ref(hdspm);
1343 if (HDSPM_AUTOSYNC_FROM_TCO == syncref) {
1345 has_sync = (HDSPM_SYNC_CHECK_SYNC ==
1346 hdspm_tco_sync_check(hdspm));
1347 } else if (HDSPM_AUTOSYNC_FROM_SYNC_IN == syncref) {
1349 has_sync = (HDSPM_SYNC_CHECK_SYNC ==
1350 hdspm_sync_in_sync_check(hdspm));
1353 if (is_valid_input && has_sync) {
1354 rate = hdspm_round_frequency(
1355 hdspm_get_pll_freq(hdspm));
1359 rate = hdspm_rate_multiplier(hdspm, rate);
1367 /* return latency in samples per period */
1368 static int hdspm_get_latency(struct hdspm *hdspm)
1372 n = hdspm_decode_latency(hdspm->control_register);
1374 /* Special case for new RME cards with 32 samples period size.
1375 * The three latency bits in the control register
1376 * (HDSP_LatencyMask) encode latency values of 64 samples as
1377 * 0, 128 samples as 1 ... 4096 samples as 6. For old cards, 7
1378 * denotes 8192 samples, but on new cards like RayDAT or AIO,
1379 * it corresponds to 32 samples.
1381 if ((7 == n) && (RayDAT == hdspm->io_type || AIO == hdspm->io_type))
1384 return 1 << (n + 6);
1387 /* Latency function */
1388 static inline void hdspm_compute_period_size(struct hdspm *hdspm)
1390 hdspm->period_bytes = 4 * hdspm_get_latency(hdspm);
1394 static snd_pcm_uframes_t hdspm_hw_pointer(struct hdspm *hdspm)
1398 position = hdspm_read(hdspm, HDSPM_statusRegister);
1400 switch (hdspm->io_type) {
1403 position &= HDSPM_BufferPositionMask;
1404 position /= 4; /* Bytes per sample */
1407 position = (position & HDSPM_BufferID) ?
1408 (hdspm->period_bytes / 4) : 0;
1415 static inline void hdspm_start_audio(struct hdspm * s)
1417 s->control_register |= (HDSPM_AudioInterruptEnable | HDSPM_Start);
1418 hdspm_write(s, HDSPM_controlRegister, s->control_register);
1421 static inline void hdspm_stop_audio(struct hdspm * s)
1423 s->control_register &= ~(HDSPM_Start | HDSPM_AudioInterruptEnable);
1424 hdspm_write(s, HDSPM_controlRegister, s->control_register);
1427 /* should I silence all or only opened ones ? doit all for first even is 4MB*/
1428 static void hdspm_silence_playback(struct hdspm *hdspm)
1431 int n = hdspm->period_bytes;
1432 void *buf = hdspm->playback_buffer;
1437 for (i = 0; i < HDSPM_MAX_CHANNELS; i++) {
1439 buf += HDSPM_CHANNEL_BUFFER_BYTES;
1443 static int hdspm_set_interrupt_interval(struct hdspm *s, unsigned int frames)
1447 spin_lock_irq(&s->lock);
1450 /* Special case for new RME cards like RayDAT/AIO which
1451 * support period sizes of 32 samples. Since latency is
1452 * encoded in the three bits of HDSP_LatencyMask, we can only
1453 * have values from 0 .. 7. While 0 still means 64 samples and
1454 * 6 represents 4096 samples on all cards, 7 represents 8192
1455 * on older cards and 32 samples on new cards.
1457 * In other words, period size in samples is calculated by
1458 * 2^(n+6) with n ranging from 0 .. 7.
1470 s->control_register &= ~HDSPM_LatencyMask;
1471 s->control_register |= hdspm_encode_latency(n);
1473 hdspm_write(s, HDSPM_controlRegister, s->control_register);
1475 hdspm_compute_period_size(s);
1477 spin_unlock_irq(&s->lock);
1482 static u64 hdspm_calc_dds_value(struct hdspm *hdspm, u64 period)
1489 switch (hdspm->io_type) {
1492 freq_const = 110069313433624ULL;
1496 freq_const = 104857600000000ULL;
1499 freq_const = 131072000000000ULL;
1506 return div_u64(freq_const, period);
1510 static void hdspm_set_dds_value(struct hdspm *hdspm, int rate)
1516 else if (rate >= 56000)
1519 switch (hdspm->io_type) {
1521 n = 131072000000000ULL; /* 125 MHz */
1525 n = 110069313433624ULL; /* 105 MHz */
1529 n = 104857600000000ULL; /* 100 MHz */
1536 n = div_u64(n, rate);
1537 /* n should be less than 2^32 for being written to FREQ register */
1538 snd_BUG_ON(n >> 32);
1539 hdspm_write(hdspm, HDSPM_freqReg, (u32)n);
1542 /* dummy set rate lets see what happens */
1543 static int hdspm_set_rate(struct hdspm * hdspm, int rate, int called_internally)
1548 int current_speed, target_speed;
1550 /* ASSUMPTION: hdspm->lock is either set, or there is no need for
1551 it (e.g. during module initialization).
1554 if (!(hdspm->control_register & HDSPM_ClockModeMaster)) {
1557 if (called_internally) {
1559 /* request from ctl or card initialization
1560 just make a warning an remember setting
1561 for future master mode switching */
1563 snd_printk(KERN_WARNING "HDSPM: "
1564 "Warning: device is not running "
1565 "as a clock master.\n");
1569 /* hw_param request while in AutoSync mode */
1571 hdspm_external_sample_rate(hdspm);
1573 if (hdspm_autosync_ref(hdspm) ==
1574 HDSPM_AUTOSYNC_FROM_NONE) {
1576 snd_printk(KERN_WARNING "HDSPM: "
1577 "Detected no Externel Sync \n");
1580 } else if (rate != external_freq) {
1582 snd_printk(KERN_WARNING "HDSPM: "
1583 "Warning: No AutoSync source for "
1584 "requested rate\n");
1590 current_rate = hdspm->system_sample_rate;
1592 /* Changing between Singe, Double and Quad speed is not
1593 allowed if any substreams are open. This is because such a change
1594 causes a shift in the location of the DMA buffers and a reduction
1595 in the number of available buffers.
1597 Note that a similar but essentially insoluble problem exists for
1598 externally-driven rate changes. All we can do is to flag rate
1599 changes in the read/write routines.
1602 if (current_rate <= 48000)
1603 current_speed = HDSPM_SPEED_SINGLE;
1604 else if (current_rate <= 96000)
1605 current_speed = HDSPM_SPEED_DOUBLE;
1607 current_speed = HDSPM_SPEED_QUAD;
1610 target_speed = HDSPM_SPEED_SINGLE;
1611 else if (rate <= 96000)
1612 target_speed = HDSPM_SPEED_DOUBLE;
1614 target_speed = HDSPM_SPEED_QUAD;
1618 rate_bits = HDSPM_Frequency32KHz;
1621 rate_bits = HDSPM_Frequency44_1KHz;
1624 rate_bits = HDSPM_Frequency48KHz;
1627 rate_bits = HDSPM_Frequency64KHz;
1630 rate_bits = HDSPM_Frequency88_2KHz;
1633 rate_bits = HDSPM_Frequency96KHz;
1636 rate_bits = HDSPM_Frequency128KHz;
1639 rate_bits = HDSPM_Frequency176_4KHz;
1642 rate_bits = HDSPM_Frequency192KHz;
1648 if (current_speed != target_speed
1649 && (hdspm->capture_pid >= 0 || hdspm->playback_pid >= 0)) {
1652 "cannot change from %s speed to %s speed mode "
1653 "(capture PID = %d, playback PID = %d)\n",
1654 hdspm_speed_names[current_speed],
1655 hdspm_speed_names[target_speed],
1656 hdspm->capture_pid, hdspm->playback_pid);
1660 hdspm->control_register &= ~HDSPM_FrequencyMask;
1661 hdspm->control_register |= rate_bits;
1662 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
1664 /* For AES32, need to set DDS value in FREQ register
1665 For MADI, also apparently */
1666 hdspm_set_dds_value(hdspm, rate);
1668 if (AES32 == hdspm->io_type && rate != current_rate)
1669 hdspm_write(hdspm, HDSPM_eeprom_wr, 0);
1671 hdspm->system_sample_rate = rate;
1673 if (rate <= 48000) {
1674 hdspm->channel_map_in = hdspm->channel_map_in_ss;
1675 hdspm->channel_map_out = hdspm->channel_map_out_ss;
1676 hdspm->max_channels_in = hdspm->ss_in_channels;
1677 hdspm->max_channels_out = hdspm->ss_out_channels;
1678 hdspm->port_names_in = hdspm->port_names_in_ss;
1679 hdspm->port_names_out = hdspm->port_names_out_ss;
1680 } else if (rate <= 96000) {
1681 hdspm->channel_map_in = hdspm->channel_map_in_ds;
1682 hdspm->channel_map_out = hdspm->channel_map_out_ds;
1683 hdspm->max_channels_in = hdspm->ds_in_channels;
1684 hdspm->max_channels_out = hdspm->ds_out_channels;
1685 hdspm->port_names_in = hdspm->port_names_in_ds;
1686 hdspm->port_names_out = hdspm->port_names_out_ds;
1688 hdspm->channel_map_in = hdspm->channel_map_in_qs;
1689 hdspm->channel_map_out = hdspm->channel_map_out_qs;
1690 hdspm->max_channels_in = hdspm->qs_in_channels;
1691 hdspm->max_channels_out = hdspm->qs_out_channels;
1692 hdspm->port_names_in = hdspm->port_names_in_qs;
1693 hdspm->port_names_out = hdspm->port_names_out_qs;
1702 /* mainly for init to 0 on load */
1703 static void all_in_all_mixer(struct hdspm * hdspm, int sgain)
1708 if (sgain > UNITY_GAIN)
1715 for (i = 0; i < HDSPM_MIXER_CHANNELS; i++)
1716 for (j = 0; j < HDSPM_MIXER_CHANNELS; j++) {
1717 hdspm_write_in_gain(hdspm, i, j, gain);
1718 hdspm_write_pb_gain(hdspm, i, j, gain);
1722 /*----------------------------------------------------------------------------
1724 ----------------------------------------------------------------------------*/
1726 static inline unsigned char snd_hdspm_midi_read_byte (struct hdspm *hdspm,
1729 /* the hardware already does the relevant bit-mask with 0xff */
1730 return hdspm_read(hdspm, hdspm->midi[id].dataIn);
1733 static inline void snd_hdspm_midi_write_byte (struct hdspm *hdspm, int id,
1736 /* the hardware already does the relevant bit-mask with 0xff */
1737 return hdspm_write(hdspm, hdspm->midi[id].dataOut, val);
1740 static inline int snd_hdspm_midi_input_available (struct hdspm *hdspm, int id)
1742 return hdspm_read(hdspm, hdspm->midi[id].statusIn) & 0xFF;
1745 static inline int snd_hdspm_midi_output_possible (struct hdspm *hdspm, int id)
1747 int fifo_bytes_used;
1749 fifo_bytes_used = hdspm_read(hdspm, hdspm->midi[id].statusOut) & 0xFF;
1751 if (fifo_bytes_used < 128)
1752 return 128 - fifo_bytes_used;
1757 static void snd_hdspm_flush_midi_input(struct hdspm *hdspm, int id)
1759 while (snd_hdspm_midi_input_available (hdspm, id))
1760 snd_hdspm_midi_read_byte (hdspm, id);
1763 static int snd_hdspm_midi_output_write (struct hdspm_midi *hmidi)
1765 unsigned long flags;
1769 unsigned char buf[128];
1771 /* Output is not interrupt driven */
1773 spin_lock_irqsave (&hmidi->lock, flags);
1774 if (hmidi->output &&
1775 !snd_rawmidi_transmit_empty (hmidi->output)) {
1776 n_pending = snd_hdspm_midi_output_possible (hmidi->hdspm,
1778 if (n_pending > 0) {
1779 if (n_pending > (int)sizeof (buf))
1780 n_pending = sizeof (buf);
1782 to_write = snd_rawmidi_transmit (hmidi->output, buf,
1785 for (i = 0; i < to_write; ++i)
1786 snd_hdspm_midi_write_byte (hmidi->hdspm,
1792 spin_unlock_irqrestore (&hmidi->lock, flags);
1796 static int snd_hdspm_midi_input_read (struct hdspm_midi *hmidi)
1798 unsigned char buf[128]; /* this buffer is designed to match the MIDI
1801 unsigned long flags;
1805 spin_lock_irqsave (&hmidi->lock, flags);
1806 n_pending = snd_hdspm_midi_input_available (hmidi->hdspm, hmidi->id);
1807 if (n_pending > 0) {
1809 if (n_pending > (int)sizeof (buf))
1810 n_pending = sizeof (buf);
1811 for (i = 0; i < n_pending; ++i)
1812 buf[i] = snd_hdspm_midi_read_byte (hmidi->hdspm,
1815 snd_rawmidi_receive (hmidi->input, buf,
1818 /* flush the MIDI input FIFO */
1820 snd_hdspm_midi_read_byte (hmidi->hdspm,
1825 spin_unlock_irqrestore(&hmidi->lock, flags);
1827 spin_lock_irqsave(&hmidi->hdspm->lock, flags);
1828 hmidi->hdspm->control_register |= hmidi->ie;
1829 hdspm_write(hmidi->hdspm, HDSPM_controlRegister,
1830 hmidi->hdspm->control_register);
1831 spin_unlock_irqrestore(&hmidi->hdspm->lock, flags);
1833 return snd_hdspm_midi_output_write (hmidi);
1837 snd_hdspm_midi_input_trigger(struct snd_rawmidi_substream *substream, int up)
1839 struct hdspm *hdspm;
1840 struct hdspm_midi *hmidi;
1841 unsigned long flags;
1843 hmidi = substream->rmidi->private_data;
1844 hdspm = hmidi->hdspm;
1846 spin_lock_irqsave (&hdspm->lock, flags);
1848 if (!(hdspm->control_register & hmidi->ie)) {
1849 snd_hdspm_flush_midi_input (hdspm, hmidi->id);
1850 hdspm->control_register |= hmidi->ie;
1853 hdspm->control_register &= ~hmidi->ie;
1856 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
1857 spin_unlock_irqrestore (&hdspm->lock, flags);
1860 static void snd_hdspm_midi_output_timer(unsigned long data)
1862 struct hdspm_midi *hmidi = (struct hdspm_midi *) data;
1863 unsigned long flags;
1865 snd_hdspm_midi_output_write(hmidi);
1866 spin_lock_irqsave (&hmidi->lock, flags);
1868 /* this does not bump hmidi->istimer, because the
1869 kernel automatically removed the timer when it
1870 expired, and we are now adding it back, thus
1871 leaving istimer wherever it was set before.
1874 if (hmidi->istimer) {
1875 hmidi->timer.expires = 1 + jiffies;
1876 add_timer(&hmidi->timer);
1879 spin_unlock_irqrestore (&hmidi->lock, flags);
1883 snd_hdspm_midi_output_trigger(struct snd_rawmidi_substream *substream, int up)
1885 struct hdspm_midi *hmidi;
1886 unsigned long flags;
1888 hmidi = substream->rmidi->private_data;
1889 spin_lock_irqsave (&hmidi->lock, flags);
1891 if (!hmidi->istimer) {
1892 init_timer(&hmidi->timer);
1893 hmidi->timer.function = snd_hdspm_midi_output_timer;
1894 hmidi->timer.data = (unsigned long) hmidi;
1895 hmidi->timer.expires = 1 + jiffies;
1896 add_timer(&hmidi->timer);
1900 if (hmidi->istimer && --hmidi->istimer <= 0)
1901 del_timer (&hmidi->timer);
1903 spin_unlock_irqrestore (&hmidi->lock, flags);
1905 snd_hdspm_midi_output_write(hmidi);
1908 static int snd_hdspm_midi_input_open(struct snd_rawmidi_substream *substream)
1910 struct hdspm_midi *hmidi;
1912 hmidi = substream->rmidi->private_data;
1913 spin_lock_irq (&hmidi->lock);
1914 snd_hdspm_flush_midi_input (hmidi->hdspm, hmidi->id);
1915 hmidi->input = substream;
1916 spin_unlock_irq (&hmidi->lock);
1921 static int snd_hdspm_midi_output_open(struct snd_rawmidi_substream *substream)
1923 struct hdspm_midi *hmidi;
1925 hmidi = substream->rmidi->private_data;
1926 spin_lock_irq (&hmidi->lock);
1927 hmidi->output = substream;
1928 spin_unlock_irq (&hmidi->lock);
1933 static int snd_hdspm_midi_input_close(struct snd_rawmidi_substream *substream)
1935 struct hdspm_midi *hmidi;
1937 snd_hdspm_midi_input_trigger (substream, 0);
1939 hmidi = substream->rmidi->private_data;
1940 spin_lock_irq (&hmidi->lock);
1941 hmidi->input = NULL;
1942 spin_unlock_irq (&hmidi->lock);
1947 static int snd_hdspm_midi_output_close(struct snd_rawmidi_substream *substream)
1949 struct hdspm_midi *hmidi;
1951 snd_hdspm_midi_output_trigger (substream, 0);
1953 hmidi = substream->rmidi->private_data;
1954 spin_lock_irq (&hmidi->lock);
1955 hmidi->output = NULL;
1956 spin_unlock_irq (&hmidi->lock);
1961 static struct snd_rawmidi_ops snd_hdspm_midi_output =
1963 .open = snd_hdspm_midi_output_open,
1964 .close = snd_hdspm_midi_output_close,
1965 .trigger = snd_hdspm_midi_output_trigger,
1968 static struct snd_rawmidi_ops snd_hdspm_midi_input =
1970 .open = snd_hdspm_midi_input_open,
1971 .close = snd_hdspm_midi_input_close,
1972 .trigger = snd_hdspm_midi_input_trigger,
1975 static int snd_hdspm_create_midi(struct snd_card *card,
1976 struct hdspm *hdspm, int id)
1981 hdspm->midi[id].id = id;
1982 hdspm->midi[id].hdspm = hdspm;
1983 spin_lock_init (&hdspm->midi[id].lock);
1986 if (MADIface == hdspm->io_type) {
1987 /* MIDI-over-MADI on HDSPe MADIface */
1988 hdspm->midi[0].dataIn = HDSPM_midiDataIn2;
1989 hdspm->midi[0].statusIn = HDSPM_midiStatusIn2;
1990 hdspm->midi[0].dataOut = HDSPM_midiDataOut2;
1991 hdspm->midi[0].statusOut = HDSPM_midiStatusOut2;
1992 hdspm->midi[0].ie = HDSPM_Midi2InterruptEnable;
1993 hdspm->midi[0].irq = HDSPM_midi2IRQPending;
1995 hdspm->midi[0].dataIn = HDSPM_midiDataIn0;
1996 hdspm->midi[0].statusIn = HDSPM_midiStatusIn0;
1997 hdspm->midi[0].dataOut = HDSPM_midiDataOut0;
1998 hdspm->midi[0].statusOut = HDSPM_midiStatusOut0;
1999 hdspm->midi[0].ie = HDSPM_Midi0InterruptEnable;
2000 hdspm->midi[0].irq = HDSPM_midi0IRQPending;
2002 } else if (1 == id) {
2003 hdspm->midi[1].dataIn = HDSPM_midiDataIn1;
2004 hdspm->midi[1].statusIn = HDSPM_midiStatusIn1;
2005 hdspm->midi[1].dataOut = HDSPM_midiDataOut1;
2006 hdspm->midi[1].statusOut = HDSPM_midiStatusOut1;
2007 hdspm->midi[1].ie = HDSPM_Midi1InterruptEnable;
2008 hdspm->midi[1].irq = HDSPM_midi1IRQPending;
2009 } else if ((2 == id) && (MADI == hdspm->io_type)) {
2010 /* MIDI-over-MADI on HDSPe MADI */
2011 hdspm->midi[2].dataIn = HDSPM_midiDataIn2;
2012 hdspm->midi[2].statusIn = HDSPM_midiStatusIn2;
2013 hdspm->midi[2].dataOut = HDSPM_midiDataOut2;
2014 hdspm->midi[2].statusOut = HDSPM_midiStatusOut2;
2015 hdspm->midi[2].ie = HDSPM_Midi2InterruptEnable;
2016 hdspm->midi[2].irq = HDSPM_midi2IRQPending;
2017 } else if (2 == id) {
2018 /* TCO MTC, read only */
2019 hdspm->midi[2].dataIn = HDSPM_midiDataIn2;
2020 hdspm->midi[2].statusIn = HDSPM_midiStatusIn2;
2021 hdspm->midi[2].dataOut = -1;
2022 hdspm->midi[2].statusOut = -1;
2023 hdspm->midi[2].ie = HDSPM_Midi2InterruptEnable;
2024 hdspm->midi[2].irq = HDSPM_midi2IRQPendingAES;
2025 } else if (3 == id) {
2026 /* TCO MTC on HDSPe MADI */
2027 hdspm->midi[3].dataIn = HDSPM_midiDataIn3;
2028 hdspm->midi[3].statusIn = HDSPM_midiStatusIn3;
2029 hdspm->midi[3].dataOut = -1;
2030 hdspm->midi[3].statusOut = -1;
2031 hdspm->midi[3].ie = HDSPM_Midi3InterruptEnable;
2032 hdspm->midi[3].irq = HDSPM_midi3IRQPending;
2035 if ((id < 2) || ((2 == id) && ((MADI == hdspm->io_type) ||
2036 (MADIface == hdspm->io_type)))) {
2037 if ((id == 0) && (MADIface == hdspm->io_type)) {
2038 sprintf(buf, "%s MIDIoverMADI", card->shortname);
2039 } else if ((id == 2) && (MADI == hdspm->io_type)) {
2040 sprintf(buf, "%s MIDIoverMADI", card->shortname);
2042 sprintf(buf, "%s MIDI %d", card->shortname, id+1);
2044 err = snd_rawmidi_new(card, buf, id, 1, 1,
2045 &hdspm->midi[id].rmidi);
2049 sprintf(hdspm->midi[id].rmidi->name, "%s MIDI %d",
2051 hdspm->midi[id].rmidi->private_data = &hdspm->midi[id];
2053 snd_rawmidi_set_ops(hdspm->midi[id].rmidi,
2054 SNDRV_RAWMIDI_STREAM_OUTPUT,
2055 &snd_hdspm_midi_output);
2056 snd_rawmidi_set_ops(hdspm->midi[id].rmidi,
2057 SNDRV_RAWMIDI_STREAM_INPUT,
2058 &snd_hdspm_midi_input);
2060 hdspm->midi[id].rmidi->info_flags |=
2061 SNDRV_RAWMIDI_INFO_OUTPUT |
2062 SNDRV_RAWMIDI_INFO_INPUT |
2063 SNDRV_RAWMIDI_INFO_DUPLEX;
2065 /* TCO MTC, read only */
2066 sprintf(buf, "%s MTC %d", card->shortname, id+1);
2067 err = snd_rawmidi_new(card, buf, id, 1, 1,
2068 &hdspm->midi[id].rmidi);
2072 sprintf(hdspm->midi[id].rmidi->name,
2073 "%s MTC %d", card->id, id+1);
2074 hdspm->midi[id].rmidi->private_data = &hdspm->midi[id];
2076 snd_rawmidi_set_ops(hdspm->midi[id].rmidi,
2077 SNDRV_RAWMIDI_STREAM_INPUT,
2078 &snd_hdspm_midi_input);
2080 hdspm->midi[id].rmidi->info_flags |= SNDRV_RAWMIDI_INFO_INPUT;
2087 static void hdspm_midi_tasklet(unsigned long arg)
2089 struct hdspm *hdspm = (struct hdspm *)arg;
2092 while (i < hdspm->midiPorts) {
2093 if (hdspm->midi[i].pending)
2094 snd_hdspm_midi_input_read(&hdspm->midi[i]);
2101 /*-----------------------------------------------------------------------------
2103 ----------------------------------------------------------------------------*/
2105 /* get the system sample rate which is set */
2108 static inline int hdspm_get_pll_freq(struct hdspm *hdspm)
2110 unsigned int period, rate;
2112 period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ);
2113 rate = hdspm_calc_dds_value(hdspm, period);
2119 * Calculate the real sample rate from the
2120 * current DDS value.
2122 static int hdspm_get_system_sample_rate(struct hdspm *hdspm)
2126 rate = hdspm_get_pll_freq(hdspm);
2128 if (rate > 207000) {
2129 /* Unreasonable high sample rate as seen on PCI MADI cards. */
2130 if (0 == hdspm_system_clock_mode(hdspm)) {
2131 /* master mode, return internal sample rate */
2132 rate = hdspm->system_sample_rate;
2134 /* slave mode, return external sample rate */
2135 rate = hdspm_external_sample_rate(hdspm);
2143 #define HDSPM_SYSTEM_SAMPLE_RATE(xname, xindex) \
2144 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2147 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
2148 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2149 .info = snd_hdspm_info_system_sample_rate, \
2150 .put = snd_hdspm_put_system_sample_rate, \
2151 .get = snd_hdspm_get_system_sample_rate \
2154 static int snd_hdspm_info_system_sample_rate(struct snd_kcontrol *kcontrol,
2155 struct snd_ctl_elem_info *uinfo)
2157 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2159 uinfo->value.integer.min = 27000;
2160 uinfo->value.integer.max = 207000;
2161 uinfo->value.integer.step = 1;
2166 static int snd_hdspm_get_system_sample_rate(struct snd_kcontrol *kcontrol,
2167 struct snd_ctl_elem_value *
2170 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2172 ucontrol->value.integer.value[0] = hdspm_get_system_sample_rate(hdspm);
2176 static int snd_hdspm_put_system_sample_rate(struct snd_kcontrol *kcontrol,
2177 struct snd_ctl_elem_value *
2180 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2182 hdspm_set_dds_value(hdspm, ucontrol->value.enumerated.item[0]);
2188 * Returns the WordClock sample rate class for the given card.
2190 static int hdspm_get_wc_sample_rate(struct hdspm *hdspm)
2194 switch (hdspm->io_type) {
2197 status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
2198 return (status >> 16) & 0xF;
2201 status = hdspm_read(hdspm, HDSPM_statusRegister);
2202 return (status >> HDSPM_AES32_wcFreq_bit) & 0xF;
2213 * Returns the TCO sample rate class for the given card.
2215 static int hdspm_get_tco_sample_rate(struct hdspm *hdspm)
2220 switch (hdspm->io_type) {
2223 status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
2224 return (status >> 20) & 0xF;
2227 status = hdspm_read(hdspm, HDSPM_statusRegister);
2228 return (status >> 1) & 0xF;
2239 * Returns the SYNC_IN sample rate class for the given card.
2241 static int hdspm_get_sync_in_sample_rate(struct hdspm *hdspm)
2246 switch (hdspm->io_type) {
2249 status = hdspm_read(hdspm, HDSPM_RD_STATUS_2);
2250 return (status >> 12) & 0xF;
2261 * Returns the AES sample rate class for the given card.
2263 static int hdspm_get_aes_sample_rate(struct hdspm *hdspm, int index)
2267 switch (hdspm->io_type) {
2269 timecode = hdspm_read(hdspm, HDSPM_timecodeRegister);
2270 return (timecode >> (4*index)) & 0xF;
2279 * Returns the sample rate class for input source <idx> for
2280 * 'new style' cards like the AIO and RayDAT.
2282 static int hdspm_get_s1_sample_rate(struct hdspm *hdspm, unsigned int idx)
2284 int status = hdspm_read(hdspm, HDSPM_RD_STATUS_2);
2286 return (status >> (idx*4)) & 0xF;
2289 #define ENUMERATED_CTL_INFO(info, texts) \
2290 snd_ctl_enum_info(info, 1, ARRAY_SIZE(texts), texts)
2293 /* Helper function to query the external sample rate and return the
2294 * corresponding enum to be returned to userspace.
2296 static int hdspm_external_rate_to_enum(struct hdspm *hdspm)
2298 int rate = hdspm_external_sample_rate(hdspm);
2299 int i, selected_rate = 0;
2300 for (i = 1; i < 10; i++)
2301 if (HDSPM_bit2freq(i) == rate) {
2305 return selected_rate;
2309 #define HDSPM_AUTOSYNC_SAMPLE_RATE(xname, xindex) \
2310 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2312 .private_value = xindex, \
2313 .access = SNDRV_CTL_ELEM_ACCESS_READ, \
2314 .info = snd_hdspm_info_autosync_sample_rate, \
2315 .get = snd_hdspm_get_autosync_sample_rate \
2319 static int snd_hdspm_info_autosync_sample_rate(struct snd_kcontrol *kcontrol,
2320 struct snd_ctl_elem_info *uinfo)
2322 ENUMERATED_CTL_INFO(uinfo, texts_freq);
2327 static int snd_hdspm_get_autosync_sample_rate(struct snd_kcontrol *kcontrol,
2328 struct snd_ctl_elem_value *
2331 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2333 switch (hdspm->io_type) {
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);
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);
2356 switch (kcontrol->private_value) {
2358 ucontrol->value.enumerated.item[0] =
2359 hdspm_get_wc_sample_rate(hdspm);
2362 ucontrol->value.enumerated.item[0] =
2363 hdspm_get_tco_sample_rate(hdspm);
2365 case 5: /* SYNC_IN */
2366 ucontrol->value.enumerated.item[0] =
2367 hdspm_get_sync_in_sample_rate(hdspm);
2370 ucontrol->value.enumerated.item[0] =
2371 hdspm_get_s1_sample_rate(hdspm,
2372 kcontrol->private_value-1);
2378 switch (kcontrol->private_value) {
2380 ucontrol->value.enumerated.item[0] =
2381 hdspm_get_wc_sample_rate(hdspm);
2384 ucontrol->value.enumerated.item[0] =
2385 hdspm_get_tco_sample_rate(hdspm);
2387 case 10: /* SYNC_IN */
2388 ucontrol->value.enumerated.item[0] =
2389 hdspm_get_sync_in_sample_rate(hdspm);
2391 case 11: /* External Rate */
2392 ucontrol->value.enumerated.item[0] =
2393 hdspm_external_rate_to_enum(hdspm);
2395 default: /* AES1 to AES8 */
2396 ucontrol->value.enumerated.item[0] =
2397 hdspm_get_aes_sample_rate(hdspm,
2398 kcontrol->private_value -
2399 HDSPM_AES32_AUTOSYNC_FROM_AES1);
2406 ucontrol->value.enumerated.item[0] =
2407 hdspm_external_rate_to_enum(hdspm);
2417 #define HDSPM_SYSTEM_CLOCK_MODE(xname, xindex) \
2418 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2421 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
2422 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2423 .info = snd_hdspm_info_system_clock_mode, \
2424 .get = snd_hdspm_get_system_clock_mode, \
2425 .put = snd_hdspm_put_system_clock_mode, \
2430 * Returns the system clock mode for the given card.
2431 * @returns 0 - master, 1 - slave
2433 static int hdspm_system_clock_mode(struct hdspm *hdspm)
2435 switch (hdspm->io_type) {
2438 if (hdspm->settings_register & HDSPM_c0Master)
2443 if (hdspm->control_register & HDSPM_ClockModeMaster)
2452 * Sets the system clock mode.
2453 * @param mode 0 - master, 1 - slave
2455 static void hdspm_set_system_clock_mode(struct hdspm *hdspm, int mode)
2457 hdspm_set_toggle_setting(hdspm,
2458 (hdspm_is_raydat_or_aio(hdspm)) ?
2459 HDSPM_c0Master : HDSPM_ClockModeMaster,
2464 static int snd_hdspm_info_system_clock_mode(struct snd_kcontrol *kcontrol,
2465 struct snd_ctl_elem_info *uinfo)
2467 static const char *const texts[] = { "Master", "AutoSync" };
2468 ENUMERATED_CTL_INFO(uinfo, texts);
2472 static int snd_hdspm_get_system_clock_mode(struct snd_kcontrol *kcontrol,
2473 struct snd_ctl_elem_value *ucontrol)
2475 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2477 ucontrol->value.enumerated.item[0] = hdspm_system_clock_mode(hdspm);
2481 static int snd_hdspm_put_system_clock_mode(struct snd_kcontrol *kcontrol,
2482 struct snd_ctl_elem_value *ucontrol)
2484 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2487 if (!snd_hdspm_use_is_exclusive(hdspm))
2490 val = ucontrol->value.enumerated.item[0];
2496 hdspm_set_system_clock_mode(hdspm, val);
2502 #define HDSPM_INTERNAL_CLOCK(xname, xindex) \
2503 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2506 .info = snd_hdspm_info_clock_source, \
2507 .get = snd_hdspm_get_clock_source, \
2508 .put = snd_hdspm_put_clock_source \
2512 static int hdspm_clock_source(struct hdspm * hdspm)
2514 switch (hdspm->system_sample_rate) {
2515 case 32000: return 0;
2516 case 44100: return 1;
2517 case 48000: return 2;
2518 case 64000: return 3;
2519 case 88200: return 4;
2520 case 96000: return 5;
2521 case 128000: return 6;
2522 case 176400: return 7;
2523 case 192000: return 8;
2529 static int hdspm_set_clock_source(struct hdspm * hdspm, int mode)
2534 rate = 32000; break;
2536 rate = 44100; break;
2538 rate = 48000; break;
2540 rate = 64000; break;
2542 rate = 88200; break;
2544 rate = 96000; break;
2546 rate = 128000; break;
2548 rate = 176400; break;
2550 rate = 192000; break;
2554 hdspm_set_rate(hdspm, rate, 1);
2558 static int snd_hdspm_info_clock_source(struct snd_kcontrol *kcontrol,
2559 struct snd_ctl_elem_info *uinfo)
2561 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2563 uinfo->value.enumerated.items = 9;
2565 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2566 uinfo->value.enumerated.item =
2567 uinfo->value.enumerated.items - 1;
2569 strcpy(uinfo->value.enumerated.name,
2570 texts_freq[uinfo->value.enumerated.item+1]);
2575 static int snd_hdspm_get_clock_source(struct snd_kcontrol *kcontrol,
2576 struct snd_ctl_elem_value *ucontrol)
2578 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2580 ucontrol->value.enumerated.item[0] = hdspm_clock_source(hdspm);
2584 static int snd_hdspm_put_clock_source(struct snd_kcontrol *kcontrol,
2585 struct snd_ctl_elem_value *ucontrol)
2587 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2591 if (!snd_hdspm_use_is_exclusive(hdspm))
2593 val = ucontrol->value.enumerated.item[0];
2598 spin_lock_irq(&hdspm->lock);
2599 if (val != hdspm_clock_source(hdspm))
2600 change = (hdspm_set_clock_source(hdspm, val) == 0) ? 1 : 0;
2603 spin_unlock_irq(&hdspm->lock);
2608 #define HDSPM_PREF_SYNC_REF(xname, xindex) \
2609 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2612 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
2613 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2614 .info = snd_hdspm_info_pref_sync_ref, \
2615 .get = snd_hdspm_get_pref_sync_ref, \
2616 .put = snd_hdspm_put_pref_sync_ref \
2621 * Returns the current preferred sync reference setting.
2622 * The semantics of the return value are depending on the
2623 * card, please see the comments for clarification.
2625 static int hdspm_pref_sync_ref(struct hdspm * hdspm)
2627 switch (hdspm->io_type) {
2629 switch (hdspm->control_register & HDSPM_SyncRefMask) {
2630 case 0: return 0; /* WC */
2631 case HDSPM_SyncRef0: return 1; /* AES 1 */
2632 case HDSPM_SyncRef1: return 2; /* AES 2 */
2633 case HDSPM_SyncRef1+HDSPM_SyncRef0: return 3; /* AES 3 */
2634 case HDSPM_SyncRef2: return 4; /* AES 4 */
2635 case HDSPM_SyncRef2+HDSPM_SyncRef0: return 5; /* AES 5 */
2636 case HDSPM_SyncRef2+HDSPM_SyncRef1: return 6; /* AES 6 */
2637 case HDSPM_SyncRef2+HDSPM_SyncRef1+HDSPM_SyncRef0:
2638 return 7; /* AES 7 */
2639 case HDSPM_SyncRef3: return 8; /* AES 8 */
2640 case HDSPM_SyncRef3+HDSPM_SyncRef0: return 9; /* TCO */
2647 switch (hdspm->control_register & HDSPM_SyncRefMask) {
2648 case 0: return 0; /* WC */
2649 case HDSPM_SyncRef0: return 1; /* MADI */
2650 case HDSPM_SyncRef1: return 2; /* TCO */
2651 case HDSPM_SyncRef1+HDSPM_SyncRef0:
2652 return 3; /* SYNC_IN */
2655 switch (hdspm->control_register & HDSPM_SyncRefMask) {
2656 case 0: return 0; /* WC */
2657 case HDSPM_SyncRef0: return 1; /* MADI */
2658 case HDSPM_SyncRef1+HDSPM_SyncRef0:
2659 return 2; /* SYNC_IN */
2666 switch ((hdspm->settings_register &
2667 HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2668 case 0: return 0; /* WC */
2669 case 3: return 1; /* ADAT 1 */
2670 case 4: return 2; /* ADAT 2 */
2671 case 5: return 3; /* ADAT 3 */
2672 case 6: return 4; /* ADAT 4 */
2673 case 1: return 5; /* AES */
2674 case 2: return 6; /* SPDIF */
2675 case 9: return 7; /* TCO */
2676 case 10: return 8; /* 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 1 */
2683 case 4: return 2; /* ADAT 2 */
2684 case 5: return 3; /* ADAT 3 */
2685 case 6: return 4; /* ADAT 4 */
2686 case 1: return 5; /* AES */
2687 case 2: return 6; /* SPDIF */
2688 case 10: return 7; /* SYNC_IN */
2696 switch ((hdspm->settings_register &
2697 HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2698 case 0: return 0; /* WC */
2699 case 3: return 1; /* ADAT */
2700 case 1: return 2; /* AES */
2701 case 2: return 3; /* SPDIF */
2702 case 9: return 4; /* TCO */
2703 case 10: return 5; /* SYNC_IN */
2706 switch ((hdspm->settings_register &
2707 HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2708 case 0: return 0; /* WC */
2709 case 3: return 1; /* ADAT */
2710 case 1: return 2; /* AES */
2711 case 2: return 3; /* SPDIF */
2712 case 10: return 4; /* SYNC_IN */
2724 * Set the preferred sync reference to <pref>. The semantics
2725 * of <pref> are depending on the card type, see the comments
2726 * for clarification.
2728 static int hdspm_set_pref_sync_ref(struct hdspm * hdspm, int pref)
2732 switch (hdspm->io_type) {
2734 hdspm->control_register &= ~HDSPM_SyncRefMask;
2739 hdspm->control_register |= HDSPM_SyncRef0;
2742 hdspm->control_register |= HDSPM_SyncRef1;
2745 hdspm->control_register |=
2746 HDSPM_SyncRef1+HDSPM_SyncRef0;
2749 hdspm->control_register |= HDSPM_SyncRef2;
2752 hdspm->control_register |=
2753 HDSPM_SyncRef2+HDSPM_SyncRef0;
2756 hdspm->control_register |=
2757 HDSPM_SyncRef2+HDSPM_SyncRef1;
2760 hdspm->control_register |=
2761 HDSPM_SyncRef2+HDSPM_SyncRef1+HDSPM_SyncRef0;
2764 hdspm->control_register |= HDSPM_SyncRef3;
2767 hdspm->control_register |=
2768 HDSPM_SyncRef3+HDSPM_SyncRef0;
2778 hdspm->control_register &= ~HDSPM_SyncRefMask;
2784 hdspm->control_register |= HDSPM_SyncRef0;
2787 hdspm->control_register |= HDSPM_SyncRef1;
2789 case 3: /* SYNC_IN */
2790 hdspm->control_register |=
2791 HDSPM_SyncRef0+HDSPM_SyncRef1;
2801 hdspm->control_register |= HDSPM_SyncRef0;
2803 case 2: /* SYNC_IN */
2804 hdspm->control_register |=
2805 HDSPM_SyncRef0+HDSPM_SyncRef1;
2817 case 0: p = 0; break; /* WC */
2818 case 1: p = 3; break; /* ADAT 1 */
2819 case 2: p = 4; break; /* ADAT 2 */
2820 case 3: p = 5; break; /* ADAT 3 */
2821 case 4: p = 6; break; /* ADAT 4 */
2822 case 5: p = 1; break; /* AES */
2823 case 6: p = 2; break; /* SPDIF */
2824 case 7: p = 9; break; /* TCO */
2825 case 8: p = 10; break; /* SYNC_IN */
2830 case 0: p = 0; break; /* WC */
2831 case 1: p = 3; break; /* ADAT 1 */
2832 case 2: p = 4; break; /* ADAT 2 */
2833 case 3: p = 5; break; /* ADAT 3 */
2834 case 4: p = 6; break; /* ADAT 4 */
2835 case 5: p = 1; break; /* AES */
2836 case 6: p = 2; break; /* SPDIF */
2837 case 7: p = 10; break; /* SYNC_IN */
2846 case 0: p = 0; break; /* WC */
2847 case 1: p = 3; break; /* ADAT */
2848 case 2: p = 1; break; /* AES */
2849 case 3: p = 2; break; /* SPDIF */
2850 case 4: p = 9; break; /* TCO */
2851 case 5: p = 10; break; /* SYNC_IN */
2856 case 0: p = 0; break; /* WC */
2857 case 1: p = 3; break; /* ADAT */
2858 case 2: p = 1; break; /* AES */
2859 case 3: p = 2; break; /* SPDIF */
2860 case 4: p = 10; break; /* SYNC_IN */
2867 switch (hdspm->io_type) {
2870 hdspm->settings_register &= ~HDSPM_c0_SyncRefMask;
2871 hdspm->settings_register |= HDSPM_c0_SyncRef0 * p;
2872 hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register);
2878 hdspm_write(hdspm, HDSPM_controlRegister,
2879 hdspm->control_register);
2886 static int snd_hdspm_info_pref_sync_ref(struct snd_kcontrol *kcontrol,
2887 struct snd_ctl_elem_info *uinfo)
2889 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2891 snd_ctl_enum_info(uinfo, 1, hdspm->texts_autosync_items, hdspm->texts_autosync);
2896 static int snd_hdspm_get_pref_sync_ref(struct snd_kcontrol *kcontrol,
2897 struct snd_ctl_elem_value *ucontrol)
2899 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2900 int psf = hdspm_pref_sync_ref(hdspm);
2903 ucontrol->value.enumerated.item[0] = psf;
2910 static int snd_hdspm_put_pref_sync_ref(struct snd_kcontrol *kcontrol,
2911 struct snd_ctl_elem_value *ucontrol)
2913 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2914 int val, change = 0;
2916 if (!snd_hdspm_use_is_exclusive(hdspm))
2919 val = ucontrol->value.enumerated.item[0];
2923 else if (val >= hdspm->texts_autosync_items)
2924 val = hdspm->texts_autosync_items-1;
2926 spin_lock_irq(&hdspm->lock);
2927 if (val != hdspm_pref_sync_ref(hdspm))
2928 change = (0 == hdspm_set_pref_sync_ref(hdspm, val)) ? 1 : 0;
2930 spin_unlock_irq(&hdspm->lock);
2935 #define HDSPM_AUTOSYNC_REF(xname, xindex) \
2936 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2939 .access = SNDRV_CTL_ELEM_ACCESS_READ, \
2940 .info = snd_hdspm_info_autosync_ref, \
2941 .get = snd_hdspm_get_autosync_ref, \
2944 static int hdspm_autosync_ref(struct hdspm *hdspm)
2946 /* This looks at the autosync selected sync reference */
2947 if (AES32 == hdspm->io_type) {
2949 unsigned int status = hdspm_read(hdspm, HDSPM_statusRegister);
2950 unsigned int syncref = (status >> HDSPM_AES32_syncref_bit) & 0xF;
2951 if ((syncref >= HDSPM_AES32_AUTOSYNC_FROM_WORD) &&
2952 (syncref <= HDSPM_AES32_AUTOSYNC_FROM_SYNC_IN)) {
2955 return HDSPM_AES32_AUTOSYNC_FROM_NONE;
2957 } else if (MADI == hdspm->io_type) {
2959 unsigned int status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
2960 switch (status2 & HDSPM_SelSyncRefMask) {
2961 case HDSPM_SelSyncRef_WORD:
2962 return HDSPM_AUTOSYNC_FROM_WORD;
2963 case HDSPM_SelSyncRef_MADI:
2964 return HDSPM_AUTOSYNC_FROM_MADI;
2965 case HDSPM_SelSyncRef_TCO:
2966 return HDSPM_AUTOSYNC_FROM_TCO;
2967 case HDSPM_SelSyncRef_SyncIn:
2968 return HDSPM_AUTOSYNC_FROM_SYNC_IN;
2969 case HDSPM_SelSyncRef_NVALID:
2970 return HDSPM_AUTOSYNC_FROM_NONE;
2972 return HDSPM_AUTOSYNC_FROM_NONE;
2980 static int snd_hdspm_info_autosync_ref(struct snd_kcontrol *kcontrol,
2981 struct snd_ctl_elem_info *uinfo)
2983 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2985 if (AES32 == hdspm->io_type) {
2986 static const char *const texts[] = { "WordClock", "AES1", "AES2", "AES3",
2987 "AES4", "AES5", "AES6", "AES7", "AES8", "TCO", "Sync In", "None"};
2989 ENUMERATED_CTL_INFO(uinfo, texts);
2990 } else if (MADI == hdspm->io_type) {
2991 static const char *const texts[] = {"Word Clock", "MADI", "TCO",
2992 "Sync In", "None" };
2994 ENUMERATED_CTL_INFO(uinfo, texts);
2999 static int snd_hdspm_get_autosync_ref(struct snd_kcontrol *kcontrol,
3000 struct snd_ctl_elem_value *ucontrol)
3002 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3004 ucontrol->value.enumerated.item[0] = hdspm_autosync_ref(hdspm);
3010 #define HDSPM_TCO_VIDEO_INPUT_FORMAT(xname, xindex) \
3011 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3013 .access = SNDRV_CTL_ELEM_ACCESS_READ |\
3014 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3015 .info = snd_hdspm_info_tco_video_input_format, \
3016 .get = snd_hdspm_get_tco_video_input_format, \
3019 static int snd_hdspm_info_tco_video_input_format(struct snd_kcontrol *kcontrol,
3020 struct snd_ctl_elem_info *uinfo)
3022 static const char *const texts[] = {"No video", "NTSC", "PAL"};
3023 ENUMERATED_CTL_INFO(uinfo, texts);
3027 static int snd_hdspm_get_tco_video_input_format(struct snd_kcontrol *kcontrol,
3028 struct snd_ctl_elem_value *ucontrol)
3033 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3034 status = hdspm_read(hdspm, HDSPM_RD_TCO + 4);
3035 switch (status & (HDSPM_TCO1_Video_Input_Format_NTSC |
3036 HDSPM_TCO1_Video_Input_Format_PAL)) {
3037 case HDSPM_TCO1_Video_Input_Format_NTSC:
3041 case HDSPM_TCO1_Video_Input_Format_PAL:
3050 ucontrol->value.enumerated.item[0] = ret;
3056 #define HDSPM_TCO_LTC_FRAMES(xname, xindex) \
3057 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3059 .access = SNDRV_CTL_ELEM_ACCESS_READ |\
3060 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3061 .info = snd_hdspm_info_tco_ltc_frames, \
3062 .get = snd_hdspm_get_tco_ltc_frames, \
3065 static int snd_hdspm_info_tco_ltc_frames(struct snd_kcontrol *kcontrol,
3066 struct snd_ctl_elem_info *uinfo)
3068 static const char *const texts[] = {"No lock", "24 fps", "25 fps", "29.97 fps",
3070 ENUMERATED_CTL_INFO(uinfo, texts);
3074 static int hdspm_tco_ltc_frames(struct hdspm *hdspm)
3079 status = hdspm_read(hdspm, HDSPM_RD_TCO + 4);
3080 if (status & HDSPM_TCO1_LTC_Input_valid) {
3081 switch (status & (HDSPM_TCO1_LTC_Format_LSB |
3082 HDSPM_TCO1_LTC_Format_MSB)) {
3087 case HDSPM_TCO1_LTC_Format_LSB:
3091 case HDSPM_TCO1_LTC_Format_MSB:
3105 static int snd_hdspm_get_tco_ltc_frames(struct snd_kcontrol *kcontrol,
3106 struct snd_ctl_elem_value *ucontrol)
3108 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3110 ucontrol->value.enumerated.item[0] = hdspm_tco_ltc_frames(hdspm);
3114 #define HDSPM_TOGGLE_SETTING(xname, xindex) \
3115 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3117 .private_value = xindex, \
3118 .info = snd_hdspm_info_toggle_setting, \
3119 .get = snd_hdspm_get_toggle_setting, \
3120 .put = snd_hdspm_put_toggle_setting \
3123 static int hdspm_toggle_setting(struct hdspm *hdspm, u32 regmask)
3127 if (hdspm_is_raydat_or_aio(hdspm))
3128 reg = hdspm->settings_register;
3130 reg = hdspm->control_register;
3132 return (reg & regmask) ? 1 : 0;
3135 static int hdspm_set_toggle_setting(struct hdspm *hdspm, u32 regmask, int out)
3140 if (hdspm_is_raydat_or_aio(hdspm)) {
3141 reg = &(hdspm->settings_register);
3142 target_reg = HDSPM_WR_SETTINGS;
3144 reg = &(hdspm->control_register);
3145 target_reg = HDSPM_controlRegister;
3153 hdspm_write(hdspm, target_reg, *reg);
3158 #define snd_hdspm_info_toggle_setting snd_ctl_boolean_mono_info
3160 static int snd_hdspm_get_toggle_setting(struct snd_kcontrol *kcontrol,
3161 struct snd_ctl_elem_value *ucontrol)
3163 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3164 u32 regmask = kcontrol->private_value;
3166 spin_lock_irq(&hdspm->lock);
3167 ucontrol->value.integer.value[0] = hdspm_toggle_setting(hdspm, regmask);
3168 spin_unlock_irq(&hdspm->lock);
3172 static int snd_hdspm_put_toggle_setting(struct snd_kcontrol *kcontrol,
3173 struct snd_ctl_elem_value *ucontrol)
3175 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3176 u32 regmask = kcontrol->private_value;
3180 if (!snd_hdspm_use_is_exclusive(hdspm))
3182 val = ucontrol->value.integer.value[0] & 1;
3183 spin_lock_irq(&hdspm->lock);
3184 change = (int) val != hdspm_toggle_setting(hdspm, regmask);
3185 hdspm_set_toggle_setting(hdspm, regmask, val);
3186 spin_unlock_irq(&hdspm->lock);
3190 #define HDSPM_INPUT_SELECT(xname, xindex) \
3191 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3194 .info = snd_hdspm_info_input_select, \
3195 .get = snd_hdspm_get_input_select, \
3196 .put = snd_hdspm_put_input_select \
3199 static int hdspm_input_select(struct hdspm * hdspm)
3201 return (hdspm->control_register & HDSPM_InputSelect0) ? 1 : 0;
3204 static int hdspm_set_input_select(struct hdspm * hdspm, int out)
3207 hdspm->control_register |= HDSPM_InputSelect0;
3209 hdspm->control_register &= ~HDSPM_InputSelect0;
3210 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3215 static int snd_hdspm_info_input_select(struct snd_kcontrol *kcontrol,
3216 struct snd_ctl_elem_info *uinfo)
3218 static const char *const texts[] = { "optical", "coaxial" };
3219 ENUMERATED_CTL_INFO(uinfo, texts);
3223 static int snd_hdspm_get_input_select(struct snd_kcontrol *kcontrol,
3224 struct snd_ctl_elem_value *ucontrol)
3226 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3228 spin_lock_irq(&hdspm->lock);
3229 ucontrol->value.enumerated.item[0] = hdspm_input_select(hdspm);
3230 spin_unlock_irq(&hdspm->lock);
3234 static int snd_hdspm_put_input_select(struct snd_kcontrol *kcontrol,
3235 struct snd_ctl_elem_value *ucontrol)
3237 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3241 if (!snd_hdspm_use_is_exclusive(hdspm))
3243 val = ucontrol->value.integer.value[0] & 1;
3244 spin_lock_irq(&hdspm->lock);
3245 change = (int) val != hdspm_input_select(hdspm);
3246 hdspm_set_input_select(hdspm, val);
3247 spin_unlock_irq(&hdspm->lock);
3252 #define HDSPM_DS_WIRE(xname, xindex) \
3253 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3256 .info = snd_hdspm_info_ds_wire, \
3257 .get = snd_hdspm_get_ds_wire, \
3258 .put = snd_hdspm_put_ds_wire \
3261 static int hdspm_ds_wire(struct hdspm * hdspm)
3263 return (hdspm->control_register & HDSPM_DS_DoubleWire) ? 1 : 0;
3266 static int hdspm_set_ds_wire(struct hdspm * hdspm, int ds)
3269 hdspm->control_register |= HDSPM_DS_DoubleWire;
3271 hdspm->control_register &= ~HDSPM_DS_DoubleWire;
3272 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3277 static int snd_hdspm_info_ds_wire(struct snd_kcontrol *kcontrol,
3278 struct snd_ctl_elem_info *uinfo)
3280 static const char *const texts[] = { "Single", "Double" };
3281 ENUMERATED_CTL_INFO(uinfo, texts);
3285 static int snd_hdspm_get_ds_wire(struct snd_kcontrol *kcontrol,
3286 struct snd_ctl_elem_value *ucontrol)
3288 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3290 spin_lock_irq(&hdspm->lock);
3291 ucontrol->value.enumerated.item[0] = hdspm_ds_wire(hdspm);
3292 spin_unlock_irq(&hdspm->lock);
3296 static int snd_hdspm_put_ds_wire(struct snd_kcontrol *kcontrol,
3297 struct snd_ctl_elem_value *ucontrol)
3299 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3303 if (!snd_hdspm_use_is_exclusive(hdspm))
3305 val = ucontrol->value.integer.value[0] & 1;
3306 spin_lock_irq(&hdspm->lock);
3307 change = (int) val != hdspm_ds_wire(hdspm);
3308 hdspm_set_ds_wire(hdspm, val);
3309 spin_unlock_irq(&hdspm->lock);
3314 #define HDSPM_QS_WIRE(xname, xindex) \
3315 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3318 .info = snd_hdspm_info_qs_wire, \
3319 .get = snd_hdspm_get_qs_wire, \
3320 .put = snd_hdspm_put_qs_wire \
3323 static int hdspm_qs_wire(struct hdspm * hdspm)
3325 if (hdspm->control_register & HDSPM_QS_DoubleWire)
3327 if (hdspm->control_register & HDSPM_QS_QuadWire)
3332 static int hdspm_set_qs_wire(struct hdspm * hdspm, int mode)
3334 hdspm->control_register &= ~(HDSPM_QS_DoubleWire | HDSPM_QS_QuadWire);
3339 hdspm->control_register |= HDSPM_QS_DoubleWire;
3342 hdspm->control_register |= HDSPM_QS_QuadWire;
3345 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3350 static int snd_hdspm_info_qs_wire(struct snd_kcontrol *kcontrol,
3351 struct snd_ctl_elem_info *uinfo)
3353 static const char *const texts[] = { "Single", "Double", "Quad" };
3354 ENUMERATED_CTL_INFO(uinfo, texts);
3358 static int snd_hdspm_get_qs_wire(struct snd_kcontrol *kcontrol,
3359 struct snd_ctl_elem_value *ucontrol)
3361 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3363 spin_lock_irq(&hdspm->lock);
3364 ucontrol->value.enumerated.item[0] = hdspm_qs_wire(hdspm);
3365 spin_unlock_irq(&hdspm->lock);
3369 static int snd_hdspm_put_qs_wire(struct snd_kcontrol *kcontrol,
3370 struct snd_ctl_elem_value *ucontrol)
3372 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3376 if (!snd_hdspm_use_is_exclusive(hdspm))
3378 val = ucontrol->value.integer.value[0];
3383 spin_lock_irq(&hdspm->lock);
3384 change = val != hdspm_qs_wire(hdspm);
3385 hdspm_set_qs_wire(hdspm, val);
3386 spin_unlock_irq(&hdspm->lock);
3390 #define HDSPM_CONTROL_TRISTATE(xname, xindex) \
3391 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3393 .private_value = xindex, \
3394 .info = snd_hdspm_info_tristate, \
3395 .get = snd_hdspm_get_tristate, \
3396 .put = snd_hdspm_put_tristate \
3399 static int hdspm_tristate(struct hdspm *hdspm, u32 regmask)
3401 u32 reg = hdspm->settings_register & (regmask * 3);
3402 return reg / regmask;
3405 static int hdspm_set_tristate(struct hdspm *hdspm, int mode, u32 regmask)
3407 hdspm->settings_register &= ~(regmask * 3);
3408 hdspm->settings_register |= (regmask * mode);
3409 hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register);
3414 static int snd_hdspm_info_tristate(struct snd_kcontrol *kcontrol,
3415 struct snd_ctl_elem_info *uinfo)
3417 u32 regmask = kcontrol->private_value;
3419 static const char *const texts_spdif[] = { "Optical", "Coaxial", "Internal" };
3420 static const char *const texts_levels[] = { "Hi Gain", "+4 dBu", "-10 dBV" };
3423 case HDSPM_c0_Input0:
3424 ENUMERATED_CTL_INFO(uinfo, texts_spdif);
3427 ENUMERATED_CTL_INFO(uinfo, texts_levels);
3433 static int snd_hdspm_get_tristate(struct snd_kcontrol *kcontrol,
3434 struct snd_ctl_elem_value *ucontrol)
3436 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3437 u32 regmask = kcontrol->private_value;
3439 spin_lock_irq(&hdspm->lock);
3440 ucontrol->value.enumerated.item[0] = hdspm_tristate(hdspm, regmask);
3441 spin_unlock_irq(&hdspm->lock);
3445 static int snd_hdspm_put_tristate(struct snd_kcontrol *kcontrol,
3446 struct snd_ctl_elem_value *ucontrol)
3448 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3449 u32 regmask = kcontrol->private_value;
3453 if (!snd_hdspm_use_is_exclusive(hdspm))
3455 val = ucontrol->value.integer.value[0];
3461 spin_lock_irq(&hdspm->lock);
3462 change = val != hdspm_tristate(hdspm, regmask);
3463 hdspm_set_tristate(hdspm, val, regmask);
3464 spin_unlock_irq(&hdspm->lock);
3468 #define HDSPM_MADI_SPEEDMODE(xname, xindex) \
3469 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3472 .info = snd_hdspm_info_madi_speedmode, \
3473 .get = snd_hdspm_get_madi_speedmode, \
3474 .put = snd_hdspm_put_madi_speedmode \
3477 static int hdspm_madi_speedmode(struct hdspm *hdspm)
3479 if (hdspm->control_register & HDSPM_QuadSpeed)
3481 if (hdspm->control_register & HDSPM_DoubleSpeed)
3486 static int hdspm_set_madi_speedmode(struct hdspm *hdspm, int mode)
3488 hdspm->control_register &= ~(HDSPM_DoubleSpeed | HDSPM_QuadSpeed);
3493 hdspm->control_register |= HDSPM_DoubleSpeed;
3496 hdspm->control_register |= HDSPM_QuadSpeed;
3499 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3504 static int snd_hdspm_info_madi_speedmode(struct snd_kcontrol *kcontrol,
3505 struct snd_ctl_elem_info *uinfo)
3507 static const char *const texts[] = { "Single", "Double", "Quad" };
3508 ENUMERATED_CTL_INFO(uinfo, texts);
3512 static int snd_hdspm_get_madi_speedmode(struct snd_kcontrol *kcontrol,
3513 struct snd_ctl_elem_value *ucontrol)
3515 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3517 spin_lock_irq(&hdspm->lock);
3518 ucontrol->value.enumerated.item[0] = hdspm_madi_speedmode(hdspm);
3519 spin_unlock_irq(&hdspm->lock);
3523 static int snd_hdspm_put_madi_speedmode(struct snd_kcontrol *kcontrol,
3524 struct snd_ctl_elem_value *ucontrol)
3526 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3530 if (!snd_hdspm_use_is_exclusive(hdspm))
3532 val = ucontrol->value.integer.value[0];
3537 spin_lock_irq(&hdspm->lock);
3538 change = val != hdspm_madi_speedmode(hdspm);
3539 hdspm_set_madi_speedmode(hdspm, val);
3540 spin_unlock_irq(&hdspm->lock);
3544 #define HDSPM_MIXER(xname, xindex) \
3545 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
3549 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
3550 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3551 .info = snd_hdspm_info_mixer, \
3552 .get = snd_hdspm_get_mixer, \
3553 .put = snd_hdspm_put_mixer \
3556 static int snd_hdspm_info_mixer(struct snd_kcontrol *kcontrol,
3557 struct snd_ctl_elem_info *uinfo)
3559 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3561 uinfo->value.integer.min = 0;
3562 uinfo->value.integer.max = 65535;
3563 uinfo->value.integer.step = 1;
3567 static int snd_hdspm_get_mixer(struct snd_kcontrol *kcontrol,
3568 struct snd_ctl_elem_value *ucontrol)
3570 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3574 source = ucontrol->value.integer.value[0];
3577 else if (source >= 2 * HDSPM_MAX_CHANNELS)
3578 source = 2 * HDSPM_MAX_CHANNELS - 1;
3580 destination = ucontrol->value.integer.value[1];
3581 if (destination < 0)
3583 else if (destination >= HDSPM_MAX_CHANNELS)
3584 destination = HDSPM_MAX_CHANNELS - 1;
3586 spin_lock_irq(&hdspm->lock);
3587 if (source >= HDSPM_MAX_CHANNELS)
3588 ucontrol->value.integer.value[2] =
3589 hdspm_read_pb_gain(hdspm, destination,
3590 source - HDSPM_MAX_CHANNELS);
3592 ucontrol->value.integer.value[2] =
3593 hdspm_read_in_gain(hdspm, destination, source);
3595 spin_unlock_irq(&hdspm->lock);
3600 static int snd_hdspm_put_mixer(struct snd_kcontrol *kcontrol,
3601 struct snd_ctl_elem_value *ucontrol)
3603 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3609 if (!snd_hdspm_use_is_exclusive(hdspm))
3612 source = ucontrol->value.integer.value[0];
3613 destination = ucontrol->value.integer.value[1];
3615 if (source < 0 || source >= 2 * HDSPM_MAX_CHANNELS)
3617 if (destination < 0 || destination >= HDSPM_MAX_CHANNELS)
3620 gain = ucontrol->value.integer.value[2];
3622 spin_lock_irq(&hdspm->lock);
3624 if (source >= HDSPM_MAX_CHANNELS)
3625 change = gain != hdspm_read_pb_gain(hdspm, destination,
3627 HDSPM_MAX_CHANNELS);
3629 change = gain != hdspm_read_in_gain(hdspm, destination,
3633 if (source >= HDSPM_MAX_CHANNELS)
3634 hdspm_write_pb_gain(hdspm, destination,
3635 source - HDSPM_MAX_CHANNELS,
3638 hdspm_write_in_gain(hdspm, destination, source,
3641 spin_unlock_irq(&hdspm->lock);
3646 /* The simple mixer control(s) provide gain control for the
3647 basic 1:1 mappings of playback streams to output
3651 #define HDSPM_PLAYBACK_MIXER \
3652 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3653 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_WRITE | \
3654 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3655 .info = snd_hdspm_info_playback_mixer, \
3656 .get = snd_hdspm_get_playback_mixer, \
3657 .put = snd_hdspm_put_playback_mixer \
3660 static int snd_hdspm_info_playback_mixer(struct snd_kcontrol *kcontrol,
3661 struct snd_ctl_elem_info *uinfo)
3663 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3665 uinfo->value.integer.min = 0;
3666 uinfo->value.integer.max = 64;
3667 uinfo->value.integer.step = 1;
3671 static int snd_hdspm_get_playback_mixer(struct snd_kcontrol *kcontrol,
3672 struct snd_ctl_elem_value *ucontrol)
3674 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3677 channel = ucontrol->id.index - 1;
3679 if (snd_BUG_ON(channel < 0 || channel >= HDSPM_MAX_CHANNELS))
3682 spin_lock_irq(&hdspm->lock);
3683 ucontrol->value.integer.value[0] =
3684 (hdspm_read_pb_gain(hdspm, channel, channel)*64)/UNITY_GAIN;
3685 spin_unlock_irq(&hdspm->lock);
3690 static int snd_hdspm_put_playback_mixer(struct snd_kcontrol *kcontrol,
3691 struct snd_ctl_elem_value *ucontrol)
3693 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3698 if (!snd_hdspm_use_is_exclusive(hdspm))
3701 channel = ucontrol->id.index - 1;
3703 if (snd_BUG_ON(channel < 0 || channel >= HDSPM_MAX_CHANNELS))
3706 gain = ucontrol->value.integer.value[0]*UNITY_GAIN/64;
3708 spin_lock_irq(&hdspm->lock);
3710 gain != hdspm_read_pb_gain(hdspm, channel,
3713 hdspm_write_pb_gain(hdspm, channel, channel,
3715 spin_unlock_irq(&hdspm->lock);
3719 #define HDSPM_SYNC_CHECK(xname, xindex) \
3720 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3722 .private_value = xindex, \
3723 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3724 .info = snd_hdspm_info_sync_check, \
3725 .get = snd_hdspm_get_sync_check \
3728 #define HDSPM_TCO_LOCK_CHECK(xname, xindex) \
3729 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3731 .private_value = xindex, \
3732 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3733 .info = snd_hdspm_tco_info_lock_check, \
3734 .get = snd_hdspm_get_sync_check \
3739 static int snd_hdspm_info_sync_check(struct snd_kcontrol *kcontrol,
3740 struct snd_ctl_elem_info *uinfo)
3742 static const char *const texts[] = { "No Lock", "Lock", "Sync", "N/A" };
3743 ENUMERATED_CTL_INFO(uinfo, texts);
3747 static int snd_hdspm_tco_info_lock_check(struct snd_kcontrol *kcontrol,
3748 struct snd_ctl_elem_info *uinfo)
3750 static const char *const texts[] = { "No Lock", "Lock" };
3751 ENUMERATED_CTL_INFO(uinfo, texts);
3755 static int hdspm_wc_sync_check(struct hdspm *hdspm)
3757 int status, status2;
3759 switch (hdspm->io_type) {
3761 status = hdspm_read(hdspm, HDSPM_statusRegister);
3762 if (status & HDSPM_AES32_wcLock) {
3763 if (status & HDSPM_AES32_wcSync)
3772 status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
3773 if (status2 & HDSPM_wcLock) {
3774 if (status2 & HDSPM_wcSync)
3784 status = hdspm_read(hdspm, HDSPM_statusRegister);
3786 if (status & 0x2000000)
3788 else if (status & 0x1000000)
3803 static int hdspm_madi_sync_check(struct hdspm *hdspm)
3805 int status = hdspm_read(hdspm, HDSPM_statusRegister);
3806 if (status & HDSPM_madiLock) {
3807 if (status & HDSPM_madiSync)
3816 static int hdspm_s1_sync_check(struct hdspm *hdspm, int idx)
3818 int status, lock, sync;
3820 status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
3822 lock = (status & (0x1<<idx)) ? 1 : 0;
3823 sync = (status & (0x100<<idx)) ? 1 : 0;
3833 static int hdspm_sync_in_sync_check(struct hdspm *hdspm)
3835 int status, lock = 0, sync = 0;
3837 switch (hdspm->io_type) {
3840 status = hdspm_read(hdspm, HDSPM_RD_STATUS_3);
3841 lock = (status & 0x400) ? 1 : 0;
3842 sync = (status & 0x800) ? 1 : 0;
3846 status = hdspm_read(hdspm, HDSPM_statusRegister);
3847 lock = (status & HDSPM_syncInLock) ? 1 : 0;
3848 sync = (status & HDSPM_syncInSync) ? 1 : 0;
3852 status = hdspm_read(hdspm, HDSPM_statusRegister2);
3853 lock = (status & 0x100000) ? 1 : 0;
3854 sync = (status & 0x200000) ? 1 : 0;
3869 static int hdspm_aes_sync_check(struct hdspm *hdspm, int idx)
3871 int status2, lock, sync;
3872 status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
3874 lock = (status2 & (0x0080 >> idx)) ? 1 : 0;
3875 sync = (status2 & (0x8000 >> idx)) ? 1 : 0;
3884 static int hdspm_tco_input_check(struct hdspm *hdspm, u32 mask)
3887 status = hdspm_read(hdspm, HDSPM_RD_TCO + 4);
3889 return (status & mask) ? 1 : 0;
3893 static int hdspm_tco_sync_check(struct hdspm *hdspm)
3898 switch (hdspm->io_type) {
3900 status = hdspm_read(hdspm, HDSPM_statusRegister);
3901 if (status & HDSPM_tcoLockMadi) {
3902 if (status & HDSPM_tcoSync)
3910 status = hdspm_read(hdspm, HDSPM_statusRegister);
3911 if (status & HDSPM_tcoLockAes) {
3912 if (status & HDSPM_tcoSync)
3923 status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
3925 if (status & 0x8000000)
3926 return 2; /* Sync */
3927 if (status & 0x4000000)
3928 return 1; /* Lock */
3929 return 0; /* No signal */
3941 static int snd_hdspm_get_sync_check(struct snd_kcontrol *kcontrol,
3942 struct snd_ctl_elem_value *ucontrol)
3944 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3947 switch (hdspm->io_type) {
3949 switch (kcontrol->private_value) {
3951 val = hdspm_wc_sync_check(hdspm); break;
3953 val = hdspm_tco_sync_check(hdspm); break;
3954 case 8: /* SYNC IN */
3955 val = hdspm_sync_in_sync_check(hdspm); break;
3957 val = hdspm_s1_sync_check(hdspm,
3958 kcontrol->private_value-1);
3963 switch (kcontrol->private_value) {
3965 val = hdspm_wc_sync_check(hdspm); break;
3967 val = hdspm_tco_sync_check(hdspm); break;
3968 case 5: /* SYNC IN */
3969 val = hdspm_sync_in_sync_check(hdspm); break;
3971 val = hdspm_s1_sync_check(hdspm,
3972 kcontrol->private_value-1);
3977 switch (kcontrol->private_value) {
3979 val = hdspm_wc_sync_check(hdspm); break;
3981 val = hdspm_madi_sync_check(hdspm); break;
3983 val = hdspm_tco_sync_check(hdspm); break;
3984 case 3: /* SYNC_IN */
3985 val = hdspm_sync_in_sync_check(hdspm); break;
3990 val = hdspm_madi_sync_check(hdspm); /* MADI */
3994 switch (kcontrol->private_value) {
3996 val = hdspm_wc_sync_check(hdspm); break;
3998 val = hdspm_tco_sync_check(hdspm); break;
3999 case 10 /* SYNC IN */:
4000 val = hdspm_sync_in_sync_check(hdspm); break;
4001 default: /* AES1 to AES8 */
4002 val = hdspm_aes_sync_check(hdspm,
4003 kcontrol->private_value-1);
4010 switch (kcontrol->private_value) {
4012 /* Check TCO for lock state of its current input */
4013 val = hdspm_tco_input_check(hdspm, HDSPM_TCO1_TCO_lock);
4016 /* Check TCO for valid time code on LTC input. */
4017 val = hdspm_tco_input_check(hdspm,
4018 HDSPM_TCO1_LTC_Input_valid);
4028 ucontrol->value.enumerated.item[0] = val;
4037 static void hdspm_tco_write(struct hdspm *hdspm)
4039 unsigned int tc[4] = { 0, 0, 0, 0};
4041 switch (hdspm->tco->input) {
4043 tc[2] |= HDSPM_TCO2_set_input_MSB;
4046 tc[2] |= HDSPM_TCO2_set_input_LSB;
4052 switch (hdspm->tco->framerate) {
4054 tc[1] |= HDSPM_TCO1_LTC_Format_LSB;
4057 tc[1] |= HDSPM_TCO1_LTC_Format_MSB;
4060 tc[1] |= HDSPM_TCO1_LTC_Format_MSB +
4061 HDSPM_TCO1_set_drop_frame_flag;
4064 tc[1] |= HDSPM_TCO1_LTC_Format_LSB +
4065 HDSPM_TCO1_LTC_Format_MSB;
4068 tc[1] |= HDSPM_TCO1_LTC_Format_LSB +
4069 HDSPM_TCO1_LTC_Format_MSB +
4070 HDSPM_TCO1_set_drop_frame_flag;
4076 switch (hdspm->tco->wordclock) {
4078 tc[2] |= HDSPM_TCO2_WCK_IO_ratio_LSB;
4081 tc[2] |= HDSPM_TCO2_WCK_IO_ratio_MSB;
4087 switch (hdspm->tco->samplerate) {
4089 tc[2] |= HDSPM_TCO2_set_freq;
4092 tc[2] |= HDSPM_TCO2_set_freq_from_app;
4098 switch (hdspm->tco->pull) {
4100 tc[2] |= HDSPM_TCO2_set_pull_up;
4103 tc[2] |= HDSPM_TCO2_set_pull_down;
4106 tc[2] |= HDSPM_TCO2_set_pull_up + HDSPM_TCO2_set_01_4;
4109 tc[2] |= HDSPM_TCO2_set_pull_down + HDSPM_TCO2_set_01_4;
4115 if (1 == hdspm->tco->term) {
4116 tc[2] |= HDSPM_TCO2_set_term_75R;
4119 hdspm_write(hdspm, HDSPM_WR_TCO, tc[0]);
4120 hdspm_write(hdspm, HDSPM_WR_TCO+4, tc[1]);
4121 hdspm_write(hdspm, HDSPM_WR_TCO+8, tc[2]);
4122 hdspm_write(hdspm, HDSPM_WR_TCO+12, tc[3]);
4126 #define HDSPM_TCO_SAMPLE_RATE(xname, xindex) \
4127 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4130 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4131 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4132 .info = snd_hdspm_info_tco_sample_rate, \
4133 .get = snd_hdspm_get_tco_sample_rate, \
4134 .put = snd_hdspm_put_tco_sample_rate \
4137 static int snd_hdspm_info_tco_sample_rate(struct snd_kcontrol *kcontrol,
4138 struct snd_ctl_elem_info *uinfo)
4140 static const char *const texts[] = { "44.1 kHz", "48 kHz" };
4141 ENUMERATED_CTL_INFO(uinfo, texts);
4145 static int snd_hdspm_get_tco_sample_rate(struct snd_kcontrol *kcontrol,
4146 struct snd_ctl_elem_value *ucontrol)
4148 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4150 ucontrol->value.enumerated.item[0] = hdspm->tco->samplerate;
4155 static int snd_hdspm_put_tco_sample_rate(struct snd_kcontrol *kcontrol,
4156 struct snd_ctl_elem_value *ucontrol)
4158 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4160 if (hdspm->tco->samplerate != ucontrol->value.enumerated.item[0]) {
4161 hdspm->tco->samplerate = ucontrol->value.enumerated.item[0];
4163 hdspm_tco_write(hdspm);
4172 #define HDSPM_TCO_PULL(xname, xindex) \
4173 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4176 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4177 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4178 .info = snd_hdspm_info_tco_pull, \
4179 .get = snd_hdspm_get_tco_pull, \
4180 .put = snd_hdspm_put_tco_pull \
4183 static int snd_hdspm_info_tco_pull(struct snd_kcontrol *kcontrol,
4184 struct snd_ctl_elem_info *uinfo)
4186 static const char *const texts[] = { "0", "+ 0.1 %", "- 0.1 %",
4188 ENUMERATED_CTL_INFO(uinfo, texts);
4192 static int snd_hdspm_get_tco_pull(struct snd_kcontrol *kcontrol,
4193 struct snd_ctl_elem_value *ucontrol)
4195 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4197 ucontrol->value.enumerated.item[0] = hdspm->tco->pull;
4202 static int snd_hdspm_put_tco_pull(struct snd_kcontrol *kcontrol,
4203 struct snd_ctl_elem_value *ucontrol)
4205 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4207 if (hdspm->tco->pull != ucontrol->value.enumerated.item[0]) {
4208 hdspm->tco->pull = ucontrol->value.enumerated.item[0];
4210 hdspm_tco_write(hdspm);
4218 #define HDSPM_TCO_WCK_CONVERSION(xname, xindex) \
4219 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4222 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4223 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4224 .info = snd_hdspm_info_tco_wck_conversion, \
4225 .get = snd_hdspm_get_tco_wck_conversion, \
4226 .put = snd_hdspm_put_tco_wck_conversion \
4229 static int snd_hdspm_info_tco_wck_conversion(struct snd_kcontrol *kcontrol,
4230 struct snd_ctl_elem_info *uinfo)
4232 static const char *const texts[] = { "1:1", "44.1 -> 48", "48 -> 44.1" };
4233 ENUMERATED_CTL_INFO(uinfo, texts);
4237 static int snd_hdspm_get_tco_wck_conversion(struct snd_kcontrol *kcontrol,
4238 struct snd_ctl_elem_value *ucontrol)
4240 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4242 ucontrol->value.enumerated.item[0] = hdspm->tco->wordclock;
4247 static int snd_hdspm_put_tco_wck_conversion(struct snd_kcontrol *kcontrol,
4248 struct snd_ctl_elem_value *ucontrol)
4250 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4252 if (hdspm->tco->wordclock != ucontrol->value.enumerated.item[0]) {
4253 hdspm->tco->wordclock = ucontrol->value.enumerated.item[0];
4255 hdspm_tco_write(hdspm);
4264 #define HDSPM_TCO_FRAME_RATE(xname, xindex) \
4265 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4268 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4269 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4270 .info = snd_hdspm_info_tco_frame_rate, \
4271 .get = snd_hdspm_get_tco_frame_rate, \
4272 .put = snd_hdspm_put_tco_frame_rate \
4275 static int snd_hdspm_info_tco_frame_rate(struct snd_kcontrol *kcontrol,
4276 struct snd_ctl_elem_info *uinfo)
4278 static const char *const texts[] = { "24 fps", "25 fps", "29.97fps",
4279 "29.97 dfps", "30 fps", "30 dfps" };
4280 ENUMERATED_CTL_INFO(uinfo, texts);
4284 static int snd_hdspm_get_tco_frame_rate(struct snd_kcontrol *kcontrol,
4285 struct snd_ctl_elem_value *ucontrol)
4287 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4289 ucontrol->value.enumerated.item[0] = hdspm->tco->framerate;
4294 static int snd_hdspm_put_tco_frame_rate(struct snd_kcontrol *kcontrol,
4295 struct snd_ctl_elem_value *ucontrol)
4297 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4299 if (hdspm->tco->framerate != ucontrol->value.enumerated.item[0]) {
4300 hdspm->tco->framerate = ucontrol->value.enumerated.item[0];
4302 hdspm_tco_write(hdspm);
4311 #define HDSPM_TCO_SYNC_SOURCE(xname, xindex) \
4312 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4315 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4316 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4317 .info = snd_hdspm_info_tco_sync_source, \
4318 .get = snd_hdspm_get_tco_sync_source, \
4319 .put = snd_hdspm_put_tco_sync_source \
4322 static int snd_hdspm_info_tco_sync_source(struct snd_kcontrol *kcontrol,
4323 struct snd_ctl_elem_info *uinfo)
4325 static const char *const texts[] = { "LTC", "Video", "WCK" };
4326 ENUMERATED_CTL_INFO(uinfo, texts);
4330 static int snd_hdspm_get_tco_sync_source(struct snd_kcontrol *kcontrol,
4331 struct snd_ctl_elem_value *ucontrol)
4333 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4335 ucontrol->value.enumerated.item[0] = hdspm->tco->input;
4340 static int snd_hdspm_put_tco_sync_source(struct snd_kcontrol *kcontrol,
4341 struct snd_ctl_elem_value *ucontrol)
4343 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4345 if (hdspm->tco->input != ucontrol->value.enumerated.item[0]) {
4346 hdspm->tco->input = ucontrol->value.enumerated.item[0];
4348 hdspm_tco_write(hdspm);
4357 #define HDSPM_TCO_WORD_TERM(xname, xindex) \
4358 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4361 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4362 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4363 .info = snd_hdspm_info_tco_word_term, \
4364 .get = snd_hdspm_get_tco_word_term, \
4365 .put = snd_hdspm_put_tco_word_term \
4368 static int snd_hdspm_info_tco_word_term(struct snd_kcontrol *kcontrol,
4369 struct snd_ctl_elem_info *uinfo)
4371 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
4373 uinfo->value.integer.min = 0;
4374 uinfo->value.integer.max = 1;
4380 static int snd_hdspm_get_tco_word_term(struct snd_kcontrol *kcontrol,
4381 struct snd_ctl_elem_value *ucontrol)
4383 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4385 ucontrol->value.enumerated.item[0] = hdspm->tco->term;
4391 static int snd_hdspm_put_tco_word_term(struct snd_kcontrol *kcontrol,
4392 struct snd_ctl_elem_value *ucontrol)
4394 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4396 if (hdspm->tco->term != ucontrol->value.enumerated.item[0]) {
4397 hdspm->tco->term = ucontrol->value.enumerated.item[0];
4399 hdspm_tco_write(hdspm);
4410 static struct snd_kcontrol_new snd_hdspm_controls_madi[] = {
4411 HDSPM_MIXER("Mixer", 0),
4412 HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4413 HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4414 HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
4415 HDSPM_AUTOSYNC_REF("AutoSync Reference", 0),
4416 HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4417 HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
4418 HDSPM_SYNC_CHECK("WC SyncCheck", 0),
4419 HDSPM_SYNC_CHECK("MADI SyncCheck", 1),
4420 HDSPM_SYNC_CHECK("TCO SyncCheck", 2),
4421 HDSPM_SYNC_CHECK("SYNC IN SyncCheck", 3),
4422 HDSPM_TOGGLE_SETTING("Line Out", HDSPM_LineOut),
4423 HDSPM_TOGGLE_SETTING("TX 64 channels mode", HDSPM_TX_64ch),
4424 HDSPM_TOGGLE_SETTING("Disable 96K frames", HDSPM_SMUX),
4425 HDSPM_TOGGLE_SETTING("Clear Track Marker", HDSPM_clr_tms),
4426 HDSPM_TOGGLE_SETTING("Safe Mode", HDSPM_AutoInp),
4427 HDSPM_INPUT_SELECT("Input Select", 0),
4428 HDSPM_MADI_SPEEDMODE("MADI Speed Mode", 0)
4432 static struct snd_kcontrol_new snd_hdspm_controls_madiface[] = {
4433 HDSPM_MIXER("Mixer", 0),
4434 HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4435 HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4436 HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4437 HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
4438 HDSPM_SYNC_CHECK("MADI SyncCheck", 0),
4439 HDSPM_TOGGLE_SETTING("TX 64 channels mode", HDSPM_TX_64ch),
4440 HDSPM_TOGGLE_SETTING("Clear Track Marker", HDSPM_clr_tms),
4441 HDSPM_TOGGLE_SETTING("Safe Mode", HDSPM_AutoInp),
4442 HDSPM_MADI_SPEEDMODE("MADI Speed Mode", 0)
4445 static struct snd_kcontrol_new snd_hdspm_controls_aio[] = {
4446 HDSPM_MIXER("Mixer", 0),
4447 HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4448 HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4449 HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
4450 HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4451 HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
4452 HDSPM_SYNC_CHECK("WC SyncCheck", 0),
4453 HDSPM_SYNC_CHECK("AES SyncCheck", 1),
4454 HDSPM_SYNC_CHECK("SPDIF SyncCheck", 2),
4455 HDSPM_SYNC_CHECK("ADAT SyncCheck", 3),
4456 HDSPM_SYNC_CHECK("TCO SyncCheck", 4),
4457 HDSPM_SYNC_CHECK("SYNC IN SyncCheck", 5),
4458 HDSPM_AUTOSYNC_SAMPLE_RATE("WC Frequency", 0),
4459 HDSPM_AUTOSYNC_SAMPLE_RATE("AES Frequency", 1),
4460 HDSPM_AUTOSYNC_SAMPLE_RATE("SPDIF Frequency", 2),
4461 HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT Frequency", 3),
4462 HDSPM_AUTOSYNC_SAMPLE_RATE("TCO Frequency", 4),
4463 HDSPM_AUTOSYNC_SAMPLE_RATE("SYNC IN Frequency", 5),
4464 HDSPM_CONTROL_TRISTATE("S/PDIF Input", HDSPM_c0_Input0),
4465 HDSPM_TOGGLE_SETTING("S/PDIF Out Optical", HDSPM_c0_Spdif_Opt),
4466 HDSPM_TOGGLE_SETTING("S/PDIF Out Professional", HDSPM_c0_Pro),
4467 HDSPM_TOGGLE_SETTING("ADAT internal (AEB/TEB)", HDSPM_c0_AEB1),
4468 HDSPM_TOGGLE_SETTING("XLR Breakout Cable", HDSPM_c0_Sym6db),
4469 HDSPM_TOGGLE_SETTING("Single Speed WordClock Out", HDSPM_c0_Wck48),
4470 HDSPM_CONTROL_TRISTATE("Input Level", HDSPM_c0_AD_GAIN0),
4471 HDSPM_CONTROL_TRISTATE("Output Level", HDSPM_c0_DA_GAIN0),
4472 HDSPM_CONTROL_TRISTATE("Phones Level", HDSPM_c0_PH_GAIN0)
4475 HDSPM_INPUT_SELECT("Input Select", 0),
4476 HDSPM_SPDIF_OPTICAL("SPDIF Out Optical", 0),
4477 HDSPM_PROFESSIONAL("SPDIF Out Professional", 0);
4478 HDSPM_SPDIF_IN("SPDIF In", 0);
4479 HDSPM_BREAKOUT_CABLE("Breakout Cable", 0);
4480 HDSPM_INPUT_LEVEL("Input Level", 0);
4481 HDSPM_OUTPUT_LEVEL("Output Level", 0);
4482 HDSPM_PHONES("Phones", 0);
4486 static struct snd_kcontrol_new snd_hdspm_controls_raydat[] = {
4487 HDSPM_MIXER("Mixer", 0),
4488 HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4489 HDSPM_SYSTEM_CLOCK_MODE("Clock Mode", 0),
4490 HDSPM_PREF_SYNC_REF("Pref Sync Ref", 0),
4491 HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4492 HDSPM_SYNC_CHECK("WC SyncCheck", 0),
4493 HDSPM_SYNC_CHECK("AES SyncCheck", 1),
4494 HDSPM_SYNC_CHECK("SPDIF SyncCheck", 2),
4495 HDSPM_SYNC_CHECK("ADAT1 SyncCheck", 3),
4496 HDSPM_SYNC_CHECK("ADAT2 SyncCheck", 4),
4497 HDSPM_SYNC_CHECK("ADAT3 SyncCheck", 5),
4498 HDSPM_SYNC_CHECK("ADAT4 SyncCheck", 6),
4499 HDSPM_SYNC_CHECK("TCO SyncCheck", 7),
4500 HDSPM_SYNC_CHECK("SYNC IN SyncCheck", 8),
4501 HDSPM_AUTOSYNC_SAMPLE_RATE("WC Frequency", 0),
4502 HDSPM_AUTOSYNC_SAMPLE_RATE("AES Frequency", 1),
4503 HDSPM_AUTOSYNC_SAMPLE_RATE("SPDIF Frequency", 2),
4504 HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT1 Frequency", 3),
4505 HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT2 Frequency", 4),
4506 HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT3 Frequency", 5),
4507 HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT4 Frequency", 6),
4508 HDSPM_AUTOSYNC_SAMPLE_RATE("TCO Frequency", 7),
4509 HDSPM_AUTOSYNC_SAMPLE_RATE("SYNC IN Frequency", 8),
4510 HDSPM_TOGGLE_SETTING("S/PDIF Out Professional", HDSPM_c0_Pro),
4511 HDSPM_TOGGLE_SETTING("Single Speed WordClock Out", HDSPM_c0_Wck48)
4514 static struct snd_kcontrol_new snd_hdspm_controls_aes32[] = {
4515 HDSPM_MIXER("Mixer", 0),
4516 HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4517 HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4518 HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
4519 HDSPM_AUTOSYNC_REF("AutoSync Reference", 0),
4520 HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4521 HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 11),
4522 HDSPM_SYNC_CHECK("WC Sync Check", 0),
4523 HDSPM_SYNC_CHECK("AES1 Sync Check", 1),
4524 HDSPM_SYNC_CHECK("AES2 Sync Check", 2),
4525 HDSPM_SYNC_CHECK("AES3 Sync Check", 3),
4526 HDSPM_SYNC_CHECK("AES4 Sync Check", 4),
4527 HDSPM_SYNC_CHECK("AES5 Sync Check", 5),
4528 HDSPM_SYNC_CHECK("AES6 Sync Check", 6),
4529 HDSPM_SYNC_CHECK("AES7 Sync Check", 7),
4530 HDSPM_SYNC_CHECK("AES8 Sync Check", 8),
4531 HDSPM_SYNC_CHECK("TCO Sync Check", 9),
4532 HDSPM_SYNC_CHECK("SYNC IN Sync Check", 10),
4533 HDSPM_AUTOSYNC_SAMPLE_RATE("WC Frequency", 0),
4534 HDSPM_AUTOSYNC_SAMPLE_RATE("AES1 Frequency", 1),
4535 HDSPM_AUTOSYNC_SAMPLE_RATE("AES2 Frequency", 2),
4536 HDSPM_AUTOSYNC_SAMPLE_RATE("AES3 Frequency", 3),
4537 HDSPM_AUTOSYNC_SAMPLE_RATE("AES4 Frequency", 4),
4538 HDSPM_AUTOSYNC_SAMPLE_RATE("AES5 Frequency", 5),
4539 HDSPM_AUTOSYNC_SAMPLE_RATE("AES6 Frequency", 6),
4540 HDSPM_AUTOSYNC_SAMPLE_RATE("AES7 Frequency", 7),
4541 HDSPM_AUTOSYNC_SAMPLE_RATE("AES8 Frequency", 8),
4542 HDSPM_AUTOSYNC_SAMPLE_RATE("TCO Frequency", 9),
4543 HDSPM_AUTOSYNC_SAMPLE_RATE("SYNC IN Frequency", 10),
4544 HDSPM_TOGGLE_SETTING("Line Out", HDSPM_LineOut),
4545 HDSPM_TOGGLE_SETTING("Emphasis", HDSPM_Emphasis),
4546 HDSPM_TOGGLE_SETTING("Non Audio", HDSPM_Dolby),
4547 HDSPM_TOGGLE_SETTING("Professional", HDSPM_Professional),
4548 HDSPM_TOGGLE_SETTING("Clear Track Marker", HDSPM_clr_tms),
4549 HDSPM_DS_WIRE("Double Speed Wire Mode", 0),
4550 HDSPM_QS_WIRE("Quad Speed Wire Mode", 0),
4555 /* Control elements for the optional TCO module */
4556 static struct snd_kcontrol_new snd_hdspm_controls_tco[] = {
4557 HDSPM_TCO_SAMPLE_RATE("TCO Sample Rate", 0),
4558 HDSPM_TCO_PULL("TCO Pull", 0),
4559 HDSPM_TCO_WCK_CONVERSION("TCO WCK Conversion", 0),
4560 HDSPM_TCO_FRAME_RATE("TCO Frame Rate", 0),
4561 HDSPM_TCO_SYNC_SOURCE("TCO Sync Source", 0),
4562 HDSPM_TCO_WORD_TERM("TCO Word Term", 0),
4563 HDSPM_TCO_LOCK_CHECK("TCO Input Check", 11),
4564 HDSPM_TCO_LOCK_CHECK("TCO LTC Valid", 12),
4565 HDSPM_TCO_LTC_FRAMES("TCO Detected Frame Rate", 0),
4566 HDSPM_TCO_VIDEO_INPUT_FORMAT("Video Input Format", 0)
4570 static struct snd_kcontrol_new snd_hdspm_playback_mixer = HDSPM_PLAYBACK_MIXER;
4573 static int hdspm_update_simple_mixer_controls(struct hdspm * hdspm)
4577 for (i = hdspm->ds_out_channels; i < hdspm->ss_out_channels; ++i) {
4578 if (hdspm->system_sample_rate > 48000) {
4579 hdspm->playback_mixer_ctls[i]->vd[0].access =
4580 SNDRV_CTL_ELEM_ACCESS_INACTIVE |
4581 SNDRV_CTL_ELEM_ACCESS_READ |
4582 SNDRV_CTL_ELEM_ACCESS_VOLATILE;
4584 hdspm->playback_mixer_ctls[i]->vd[0].access =
4585 SNDRV_CTL_ELEM_ACCESS_READWRITE |
4586 SNDRV_CTL_ELEM_ACCESS_VOLATILE;
4588 snd_ctl_notify(hdspm->card, SNDRV_CTL_EVENT_MASK_VALUE |
4589 SNDRV_CTL_EVENT_MASK_INFO,
4590 &hdspm->playback_mixer_ctls[i]->id);
4597 static int snd_hdspm_create_controls(struct snd_card *card,
4598 struct hdspm *hdspm)
4600 unsigned int idx, limit;
4602 struct snd_kcontrol *kctl;
4603 struct snd_kcontrol_new *list = NULL;
4605 switch (hdspm->io_type) {
4607 list = snd_hdspm_controls_madi;
4608 limit = ARRAY_SIZE(snd_hdspm_controls_madi);
4611 list = snd_hdspm_controls_madiface;
4612 limit = ARRAY_SIZE(snd_hdspm_controls_madiface);
4615 list = snd_hdspm_controls_aio;
4616 limit = ARRAY_SIZE(snd_hdspm_controls_aio);
4619 list = snd_hdspm_controls_raydat;
4620 limit = ARRAY_SIZE(snd_hdspm_controls_raydat);
4623 list = snd_hdspm_controls_aes32;
4624 limit = ARRAY_SIZE(snd_hdspm_controls_aes32);
4629 for (idx = 0; idx < limit; idx++) {
4630 err = snd_ctl_add(card,
4631 snd_ctl_new1(&list[idx], hdspm));
4638 /* create simple 1:1 playback mixer controls */
4639 snd_hdspm_playback_mixer.name = "Chn";
4640 if (hdspm->system_sample_rate >= 128000) {
4641 limit = hdspm->qs_out_channels;
4642 } else if (hdspm->system_sample_rate >= 64000) {
4643 limit = hdspm->ds_out_channels;
4645 limit = hdspm->ss_out_channels;
4647 for (idx = 0; idx < limit; ++idx) {
4648 snd_hdspm_playback_mixer.index = idx + 1;
4649 kctl = snd_ctl_new1(&snd_hdspm_playback_mixer, hdspm);
4650 err = snd_ctl_add(card, kctl);
4653 hdspm->playback_mixer_ctls[idx] = kctl;
4658 /* add tco control elements */
4659 list = snd_hdspm_controls_tco;
4660 limit = ARRAY_SIZE(snd_hdspm_controls_tco);
4661 for (idx = 0; idx < limit; idx++) {
4662 err = snd_ctl_add(card,
4663 snd_ctl_new1(&list[idx], hdspm));
4672 /*------------------------------------------------------------
4674 ------------------------------------------------------------*/
4677 snd_hdspm_proc_read_tco(struct snd_info_entry *entry,
4678 struct snd_info_buffer *buffer)
4680 struct hdspm *hdspm = entry->private_data;
4681 unsigned int status, control;
4682 int a, ltc, frames, seconds, minutes, hours;
4683 unsigned int period;
4687 snd_iprintf(buffer, "--- TCO ---\n");
4689 status = hdspm_read(hdspm, HDSPM_statusRegister);
4690 control = hdspm->control_register;
4693 if (status & HDSPM_tco_detect) {
4694 snd_iprintf(buffer, "TCO module detected.\n");
4695 a = hdspm_read(hdspm, HDSPM_RD_TCO+4);
4696 if (a & HDSPM_TCO1_LTC_Input_valid) {
4697 snd_iprintf(buffer, " LTC valid, ");
4698 switch (a & (HDSPM_TCO1_LTC_Format_LSB |
4699 HDSPM_TCO1_LTC_Format_MSB)) {
4701 snd_iprintf(buffer, "24 fps, ");
4703 case HDSPM_TCO1_LTC_Format_LSB:
4704 snd_iprintf(buffer, "25 fps, ");
4706 case HDSPM_TCO1_LTC_Format_MSB:
4707 snd_iprintf(buffer, "29.97 fps, ");
4710 snd_iprintf(buffer, "30 fps, ");
4713 if (a & HDSPM_TCO1_set_drop_frame_flag) {
4714 snd_iprintf(buffer, "drop frame\n");
4716 snd_iprintf(buffer, "full frame\n");
4719 snd_iprintf(buffer, " no LTC\n");
4721 if (a & HDSPM_TCO1_Video_Input_Format_NTSC) {
4722 snd_iprintf(buffer, " Video: NTSC\n");
4723 } else if (a & HDSPM_TCO1_Video_Input_Format_PAL) {
4724 snd_iprintf(buffer, " Video: PAL\n");
4726 snd_iprintf(buffer, " No video\n");
4728 if (a & HDSPM_TCO1_TCO_lock) {
4729 snd_iprintf(buffer, " Sync: lock\n");
4731 snd_iprintf(buffer, " Sync: no lock\n");
4734 switch (hdspm->io_type) {
4737 freq_const = 110069313433624ULL;
4741 freq_const = 104857600000000ULL;
4744 break; /* no TCO possible */
4747 period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ);
4748 snd_iprintf(buffer, " period: %u\n", period);
4751 /* rate = freq_const/period; */
4752 rate = div_u64(freq_const, period);
4754 if (control & HDSPM_QuadSpeed) {
4756 } else if (control & HDSPM_DoubleSpeed) {
4760 snd_iprintf(buffer, " Frequency: %u Hz\n",
4761 (unsigned int) rate);
4763 ltc = hdspm_read(hdspm, HDSPM_RD_TCO);
4766 frames += (ltc & 0x3) * 10;
4768 seconds = ltc & 0xF;
4770 seconds += (ltc & 0x7) * 10;
4772 minutes = ltc & 0xF;
4774 minutes += (ltc & 0x7) * 10;
4778 hours += (ltc & 0x3) * 10;
4780 " LTC In: %02d:%02d:%02d:%02d\n",
4781 hours, minutes, seconds, frames);
4784 snd_iprintf(buffer, "No TCO module detected.\n");
4789 snd_hdspm_proc_read_madi(struct snd_info_entry *entry,
4790 struct snd_info_buffer *buffer)
4792 struct hdspm *hdspm = entry->private_data;
4793 unsigned int status, status2, control, freq;
4795 char *pref_sync_ref;
4797 char *system_clock_mode;
4801 status = hdspm_read(hdspm, HDSPM_statusRegister);
4802 status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
4803 control = hdspm->control_register;
4804 freq = hdspm_read(hdspm, HDSPM_timecodeRegister);
4806 snd_iprintf(buffer, "%s (Card #%d) Rev.%x Status2first3bits: %x\n",
4807 hdspm->card_name, hdspm->card->number + 1,
4808 hdspm->firmware_rev,
4809 (status2 & HDSPM_version0) |
4810 (status2 & HDSPM_version1) | (status2 &
4813 snd_iprintf(buffer, "HW Serial: 0x%06x%06x\n",
4814 (hdspm_read(hdspm, HDSPM_midiStatusIn1)>>8) & 0xFFFFFF,
4817 snd_iprintf(buffer, "IRQ: %d Registers bus: 0x%lx VM: 0x%lx\n",
4818 hdspm->irq, hdspm->port, (unsigned long)hdspm->iobase);
4820 snd_iprintf(buffer, "--- System ---\n");
4823 "IRQ Pending: Audio=%d, MIDI0=%d, MIDI1=%d, IRQcount=%d\n",
4824 status & HDSPM_audioIRQPending,
4825 (status & HDSPM_midi0IRQPending) ? 1 : 0,
4826 (status & HDSPM_midi1IRQPending) ? 1 : 0,
4829 "HW pointer: id = %d, rawptr = %d (%d->%d) "
4830 "estimated= %ld (bytes)\n",
4831 ((status & HDSPM_BufferID) ? 1 : 0),
4832 (status & HDSPM_BufferPositionMask),
4833 (status & HDSPM_BufferPositionMask) %
4834 (2 * (int)hdspm->period_bytes),
4835 ((status & HDSPM_BufferPositionMask) - 64) %
4836 (2 * (int)hdspm->period_bytes),
4837 (long) hdspm_hw_pointer(hdspm) * 4);
4840 "MIDI FIFO: Out1=0x%x, Out2=0x%x, In1=0x%x, In2=0x%x \n",
4841 hdspm_read(hdspm, HDSPM_midiStatusOut0) & 0xFF,
4842 hdspm_read(hdspm, HDSPM_midiStatusOut1) & 0xFF,
4843 hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xFF,
4844 hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xFF);
4846 "MIDIoverMADI FIFO: In=0x%x, Out=0x%x \n",
4847 hdspm_read(hdspm, HDSPM_midiStatusIn2) & 0xFF,
4848 hdspm_read(hdspm, HDSPM_midiStatusOut2) & 0xFF);
4850 "Register: ctrl1=0x%x, ctrl2=0x%x, status1=0x%x, "
4852 hdspm->control_register, hdspm->control2_register,
4856 snd_iprintf(buffer, "--- Settings ---\n");
4858 x = hdspm_get_latency(hdspm);
4861 "Size (Latency): %d samples (2 periods of %lu bytes)\n",
4862 x, (unsigned long) hdspm->period_bytes);
4864 snd_iprintf(buffer, "Line out: %s\n",
4865 (hdspm->control_register & HDSPM_LineOut) ? "on " : "off");
4867 switch (hdspm->control_register & HDSPM_InputMask) {
4868 case HDSPM_InputOptical:
4871 case HDSPM_InputCoaxial:
4879 "ClearTrackMarker = %s, Transmit in %s Channel Mode, "
4881 (hdspm->control_register & HDSPM_clr_tms) ? "on" : "off",
4882 (hdspm->control_register & HDSPM_TX_64ch) ? "64" : "56",
4883 (hdspm->control_register & HDSPM_AutoInp) ? "on" : "off");
4886 if (!(hdspm->control_register & HDSPM_ClockModeMaster))
4887 system_clock_mode = "AutoSync";
4889 system_clock_mode = "Master";
4890 snd_iprintf(buffer, "AutoSync Reference: %s\n", system_clock_mode);
4892 switch (hdspm_pref_sync_ref(hdspm)) {
4893 case HDSPM_SYNC_FROM_WORD:
4894 pref_sync_ref = "Word Clock";
4896 case HDSPM_SYNC_FROM_MADI:
4897 pref_sync_ref = "MADI Sync";
4899 case HDSPM_SYNC_FROM_TCO:
4900 pref_sync_ref = "TCO";
4902 case HDSPM_SYNC_FROM_SYNC_IN:
4903 pref_sync_ref = "Sync In";
4906 pref_sync_ref = "XXXX Clock";
4909 snd_iprintf(buffer, "Preferred Sync Reference: %s\n",
4912 snd_iprintf(buffer, "System Clock Frequency: %d\n",
4913 hdspm->system_sample_rate);
4916 snd_iprintf(buffer, "--- Status:\n");
4918 x = status & HDSPM_madiSync;
4919 x2 = status2 & HDSPM_wcSync;
4921 snd_iprintf(buffer, "Inputs MADI=%s, WordClock=%s\n",
4922 (status & HDSPM_madiLock) ? (x ? "Sync" : "Lock") :
4924 (status2 & HDSPM_wcLock) ? (x2 ? "Sync" : "Lock") :
4927 switch (hdspm_autosync_ref(hdspm)) {
4928 case HDSPM_AUTOSYNC_FROM_SYNC_IN:
4929 autosync_ref = "Sync In";
4931 case HDSPM_AUTOSYNC_FROM_TCO:
4932 autosync_ref = "TCO";
4934 case HDSPM_AUTOSYNC_FROM_WORD:
4935 autosync_ref = "Word Clock";
4937 case HDSPM_AUTOSYNC_FROM_MADI:
4938 autosync_ref = "MADI Sync";
4940 case HDSPM_AUTOSYNC_FROM_NONE:
4941 autosync_ref = "Input not valid";
4944 autosync_ref = "---";
4948 "AutoSync: Reference= %s, Freq=%d (MADI = %d, Word = %d)\n",
4949 autosync_ref, hdspm_external_sample_rate(hdspm),
4950 (status & HDSPM_madiFreqMask) >> 22,
4951 (status2 & HDSPM_wcFreqMask) >> 5);
4953 snd_iprintf(buffer, "Input: %s, Mode=%s\n",
4954 (status & HDSPM_AB_int) ? "Coax" : "Optical",
4955 (status & HDSPM_RX_64ch) ? "64 channels" :
4958 /* call readout function for TCO specific status */
4959 snd_hdspm_proc_read_tco(entry, buffer);
4961 snd_iprintf(buffer, "\n");
4965 snd_hdspm_proc_read_aes32(struct snd_info_entry * entry,
4966 struct snd_info_buffer *buffer)
4968 struct hdspm *hdspm = entry->private_data;
4969 unsigned int status;
4970 unsigned int status2;
4971 unsigned int timecode;
4972 unsigned int wcLock, wcSync;
4977 status = hdspm_read(hdspm, HDSPM_statusRegister);
4978 status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
4979 timecode = hdspm_read(hdspm, HDSPM_timecodeRegister);
4981 snd_iprintf(buffer, "%s (Card #%d) Rev.%x\n",
4982 hdspm->card_name, hdspm->card->number + 1,
4983 hdspm->firmware_rev);
4985 snd_iprintf(buffer, "IRQ: %d Registers bus: 0x%lx VM: 0x%lx\n",
4986 hdspm->irq, hdspm->port, (unsigned long)hdspm->iobase);
4988 snd_iprintf(buffer, "--- System ---\n");
4991 "IRQ Pending: Audio=%d, MIDI0=%d, MIDI1=%d, IRQcount=%d\n",
4992 status & HDSPM_audioIRQPending,
4993 (status & HDSPM_midi0IRQPending) ? 1 : 0,
4994 (status & HDSPM_midi1IRQPending) ? 1 : 0,
4997 "HW pointer: id = %d, rawptr = %d (%d->%d) "
4998 "estimated= %ld (bytes)\n",
4999 ((status & HDSPM_BufferID) ? 1 : 0),
5000 (status & HDSPM_BufferPositionMask),
5001 (status & HDSPM_BufferPositionMask) %
5002 (2 * (int)hdspm->period_bytes),
5003 ((status & HDSPM_BufferPositionMask) - 64) %
5004 (2 * (int)hdspm->period_bytes),
5005 (long) hdspm_hw_pointer(hdspm) * 4);
5008 "MIDI FIFO: Out1=0x%x, Out2=0x%x, In1=0x%x, In2=0x%x \n",
5009 hdspm_read(hdspm, HDSPM_midiStatusOut0) & 0xFF,
5010 hdspm_read(hdspm, HDSPM_midiStatusOut1) & 0xFF,
5011 hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xFF,
5012 hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xFF);
5014 "MIDIoverMADI FIFO: In=0x%x, Out=0x%x \n",
5015 hdspm_read(hdspm, HDSPM_midiStatusIn2) & 0xFF,
5016 hdspm_read(hdspm, HDSPM_midiStatusOut2) & 0xFF);
5018 "Register: ctrl1=0x%x, ctrl2=0x%x, status1=0x%x, "
5020 hdspm->control_register, hdspm->control2_register,
5023 snd_iprintf(buffer, "--- Settings ---\n");
5025 x = hdspm_get_latency(hdspm);
5028 "Size (Latency): %d samples (2 periods of %lu bytes)\n",
5029 x, (unsigned long) hdspm->period_bytes);
5031 snd_iprintf(buffer, "Line out: %s\n",
5033 control_register & HDSPM_LineOut) ? "on " : "off");
5036 "ClearTrackMarker %s, Emphasis %s, Dolby %s\n",
5038 control_register & HDSPM_clr_tms) ? "on" : "off",
5040 control_register & HDSPM_Emphasis) ? "on" : "off",
5042 control_register & HDSPM_Dolby) ? "on" : "off");
5045 pref_syncref = hdspm_pref_sync_ref(hdspm);
5046 if (pref_syncref == 0)
5047 snd_iprintf(buffer, "Preferred Sync Reference: Word Clock\n");
5049 snd_iprintf(buffer, "Preferred Sync Reference: AES%d\n",
5052 snd_iprintf(buffer, "System Clock Frequency: %d\n",
5053 hdspm->system_sample_rate);
5055 snd_iprintf(buffer, "Double speed: %s\n",
5056 hdspm->control_register & HDSPM_DS_DoubleWire?
5057 "Double wire" : "Single wire");
5058 snd_iprintf(buffer, "Quad speed: %s\n",
5059 hdspm->control_register & HDSPM_QS_DoubleWire?
5061 hdspm->control_register & HDSPM_QS_QuadWire?
5062 "Quad wire" : "Single wire");
5064 snd_iprintf(buffer, "--- Status:\n");
5066 wcLock = status & HDSPM_AES32_wcLock;
5067 wcSync = wcLock && (status & HDSPM_AES32_wcSync);
5069 snd_iprintf(buffer, "Word: %s Frequency: %d\n",
5070 (wcLock) ? (wcSync ? "Sync " : "Lock ") : "No Lock",
5071 HDSPM_bit2freq((status >> HDSPM_AES32_wcFreq_bit) & 0xF));
5073 for (x = 0; x < 8; x++) {
5074 snd_iprintf(buffer, "AES%d: %s Frequency: %d\n",
5076 (status2 & (HDSPM_LockAES >> x)) ?
5077 "Sync " : "No Lock",
5078 HDSPM_bit2freq((timecode >> (4*x)) & 0xF));
5081 switch (hdspm_autosync_ref(hdspm)) {
5082 case HDSPM_AES32_AUTOSYNC_FROM_NONE:
5083 autosync_ref = "None"; break;
5084 case HDSPM_AES32_AUTOSYNC_FROM_WORD:
5085 autosync_ref = "Word Clock"; break;
5086 case HDSPM_AES32_AUTOSYNC_FROM_AES1:
5087 autosync_ref = "AES1"; break;
5088 case HDSPM_AES32_AUTOSYNC_FROM_AES2:
5089 autosync_ref = "AES2"; break;
5090 case HDSPM_AES32_AUTOSYNC_FROM_AES3:
5091 autosync_ref = "AES3"; break;
5092 case HDSPM_AES32_AUTOSYNC_FROM_AES4:
5093 autosync_ref = "AES4"; break;
5094 case HDSPM_AES32_AUTOSYNC_FROM_AES5:
5095 autosync_ref = "AES5"; break;
5096 case HDSPM_AES32_AUTOSYNC_FROM_AES6:
5097 autosync_ref = "AES6"; break;
5098 case HDSPM_AES32_AUTOSYNC_FROM_AES7:
5099 autosync_ref = "AES7"; break;
5100 case HDSPM_AES32_AUTOSYNC_FROM_AES8:
5101 autosync_ref = "AES8"; break;
5102 case HDSPM_AES32_AUTOSYNC_FROM_TCO:
5103 autosync_ref = "TCO"; break;
5104 case HDSPM_AES32_AUTOSYNC_FROM_SYNC_IN:
5105 autosync_ref = "Sync In"; break;
5107 autosync_ref = "---"; break;
5109 snd_iprintf(buffer, "AutoSync ref = %s\n", autosync_ref);
5111 /* call readout function for TCO specific status */
5112 snd_hdspm_proc_read_tco(entry, buffer);
5114 snd_iprintf(buffer, "\n");
5118 snd_hdspm_proc_read_raydat(struct snd_info_entry *entry,
5119 struct snd_info_buffer *buffer)
5121 struct hdspm *hdspm = entry->private_data;
5122 unsigned int status1, status2, status3, control, i;
5123 unsigned int lock, sync;
5125 status1 = hdspm_read(hdspm, HDSPM_RD_STATUS_1); /* s1 */
5126 status2 = hdspm_read(hdspm, HDSPM_RD_STATUS_2); /* freq */
5127 status3 = hdspm_read(hdspm, HDSPM_RD_STATUS_3); /* s2 */
5129 control = hdspm->control_register;
5131 snd_iprintf(buffer, "STATUS1: 0x%08x\n", status1);
5132 snd_iprintf(buffer, "STATUS2: 0x%08x\n", status2);
5133 snd_iprintf(buffer, "STATUS3: 0x%08x\n", status3);
5136 snd_iprintf(buffer, "\n*** CLOCK MODE\n\n");
5138 snd_iprintf(buffer, "Clock mode : %s\n",
5139 (hdspm_system_clock_mode(hdspm) == 0) ? "master" : "slave");
5140 snd_iprintf(buffer, "System frequency: %d Hz\n",
5141 hdspm_get_system_sample_rate(hdspm));
5143 snd_iprintf(buffer, "\n*** INPUT STATUS\n\n");
5148 for (i = 0; i < 8; i++) {
5149 snd_iprintf(buffer, "s1_input %d: Lock %d, Sync %d, Freq %s\n",
5151 (status1 & lock) ? 1 : 0,
5152 (status1 & sync) ? 1 : 0,
5153 texts_freq[(status2 >> (i * 4)) & 0xF]);
5159 snd_iprintf(buffer, "WC input: Lock %d, Sync %d, Freq %s\n",
5160 (status1 & 0x1000000) ? 1 : 0,
5161 (status1 & 0x2000000) ? 1 : 0,
5162 texts_freq[(status1 >> 16) & 0xF]);
5164 snd_iprintf(buffer, "TCO input: Lock %d, Sync %d, Freq %s\n",
5165 (status1 & 0x4000000) ? 1 : 0,
5166 (status1 & 0x8000000) ? 1 : 0,
5167 texts_freq[(status1 >> 20) & 0xF]);
5169 snd_iprintf(buffer, "SYNC IN: Lock %d, Sync %d, Freq %s\n",
5170 (status3 & 0x400) ? 1 : 0,
5171 (status3 & 0x800) ? 1 : 0,
5172 texts_freq[(status2 >> 12) & 0xF]);
5176 #ifdef CONFIG_SND_DEBUG
5178 snd_hdspm_proc_read_debug(struct snd_info_entry *entry,
5179 struct snd_info_buffer *buffer)
5181 struct hdspm *hdspm = entry->private_data;
5185 for (i = 0; i < 256 /* 1024*64 */; i += j) {
5186 snd_iprintf(buffer, "0x%08X: ", i);
5187 for (j = 0; j < 16; j += 4)
5188 snd_iprintf(buffer, "%08X ", hdspm_read(hdspm, i + j));
5189 snd_iprintf(buffer, "\n");
5195 static void snd_hdspm_proc_ports_in(struct snd_info_entry *entry,
5196 struct snd_info_buffer *buffer)
5198 struct hdspm *hdspm = entry->private_data;
5201 snd_iprintf(buffer, "# generated by hdspm\n");
5203 for (i = 0; i < hdspm->max_channels_in; i++) {
5204 snd_iprintf(buffer, "%d=%s\n", i+1, hdspm->port_names_in[i]);
5208 static void snd_hdspm_proc_ports_out(struct snd_info_entry *entry,
5209 struct snd_info_buffer *buffer)
5211 struct hdspm *hdspm = entry->private_data;
5214 snd_iprintf(buffer, "# generated by hdspm\n");
5216 for (i = 0; i < hdspm->max_channels_out; i++) {
5217 snd_iprintf(buffer, "%d=%s\n", i+1, hdspm->port_names_out[i]);
5222 static void snd_hdspm_proc_init(struct hdspm *hdspm)
5224 struct snd_info_entry *entry;
5226 if (!snd_card_proc_new(hdspm->card, "hdspm", &entry)) {
5227 switch (hdspm->io_type) {
5229 snd_info_set_text_ops(entry, hdspm,
5230 snd_hdspm_proc_read_aes32);
5233 snd_info_set_text_ops(entry, hdspm,
5234 snd_hdspm_proc_read_madi);
5237 /* snd_info_set_text_ops(entry, hdspm,
5238 snd_hdspm_proc_read_madiface); */
5241 snd_info_set_text_ops(entry, hdspm,
5242 snd_hdspm_proc_read_raydat);
5249 if (!snd_card_proc_new(hdspm->card, "ports.in", &entry)) {
5250 snd_info_set_text_ops(entry, hdspm, snd_hdspm_proc_ports_in);
5253 if (!snd_card_proc_new(hdspm->card, "ports.out", &entry)) {
5254 snd_info_set_text_ops(entry, hdspm, snd_hdspm_proc_ports_out);
5257 #ifdef CONFIG_SND_DEBUG
5258 /* debug file to read all hdspm registers */
5259 if (!snd_card_proc_new(hdspm->card, "debug", &entry))
5260 snd_info_set_text_ops(entry, hdspm,
5261 snd_hdspm_proc_read_debug);
5265 /*------------------------------------------------------------
5267 ------------------------------------------------------------*/
5269 static int snd_hdspm_set_defaults(struct hdspm * hdspm)
5271 /* ASSUMPTION: hdspm->lock is either held, or there is no need to
5272 hold it (e.g. during module initialization).
5277 hdspm->settings_register = 0;
5279 switch (hdspm->io_type) {
5282 hdspm->control_register =
5283 0x2 + 0x8 + 0x10 + 0x80 + 0x400 + 0x4000 + 0x1000000;
5288 hdspm->settings_register = 0x1 + 0x1000;
5289 /* Magic values are: LAT_0, LAT_2, Master, freq1, tx64ch, inp_0,
5291 hdspm->control_register =
5292 0x2 + 0x8 + 0x10 + 0x80 + 0x400 + 0x4000 + 0x1000000;
5296 hdspm->control_register =
5297 HDSPM_ClockModeMaster | /* Master Clock Mode on */
5298 hdspm_encode_latency(7) | /* latency max=8192samples */
5299 HDSPM_SyncRef0 | /* AES1 is syncclock */
5300 HDSPM_LineOut | /* Analog output in */
5301 HDSPM_Professional; /* Professional mode */
5305 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
5307 if (AES32 == hdspm->io_type) {
5308 /* No control2 register for AES32 */
5309 #ifdef SNDRV_BIG_ENDIAN
5310 hdspm->control2_register = HDSPM_BIGENDIAN_MODE;
5312 hdspm->control2_register = 0;
5315 hdspm_write(hdspm, HDSPM_control2Reg, hdspm->control2_register);
5317 hdspm_compute_period_size(hdspm);
5319 /* silence everything */
5321 all_in_all_mixer(hdspm, 0 * UNITY_GAIN);
5323 if (hdspm_is_raydat_or_aio(hdspm))
5324 hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register);
5326 /* set a default rate so that the channel map is set up. */
5327 hdspm_set_rate(hdspm, 48000, 1);
5333 /*------------------------------------------------------------
5335 ------------------------------------------------------------*/
5337 static irqreturn_t snd_hdspm_interrupt(int irq, void *dev_id)
5339 struct hdspm *hdspm = (struct hdspm *) dev_id;
5340 unsigned int status;
5341 int i, audio, midi, schedule = 0;
5344 status = hdspm_read(hdspm, HDSPM_statusRegister);
5346 audio = status & HDSPM_audioIRQPending;
5347 midi = status & (HDSPM_midi0IRQPending | HDSPM_midi1IRQPending |
5348 HDSPM_midi2IRQPending | HDSPM_midi3IRQPending);
5350 /* now = get_cycles(); */
5352 * LAT_2..LAT_0 period counter (win) counter (mac)
5353 * 6 4096 ~256053425 ~514672358
5354 * 5 2048 ~128024983 ~257373821
5355 * 4 1024 ~64023706 ~128718089
5356 * 3 512 ~32005945 ~64385999
5357 * 2 256 ~16003039 ~32260176
5358 * 1 128 ~7998738 ~16194507
5359 * 0 64 ~3998231 ~8191558
5362 snd_printk(KERN_INFO "snd_hdspm_interrupt %llu @ %llx\n",
5363 now-hdspm->last_interrupt, status & 0xFFC0);
5364 hdspm->last_interrupt = now;
5367 if (!audio && !midi)
5370 hdspm_write(hdspm, HDSPM_interruptConfirmation, 0);
5375 if (hdspm->capture_substream)
5376 snd_pcm_period_elapsed(hdspm->capture_substream);
5378 if (hdspm->playback_substream)
5379 snd_pcm_period_elapsed(hdspm->playback_substream);
5384 while (i < hdspm->midiPorts) {
5385 if ((hdspm_read(hdspm,
5386 hdspm->midi[i].statusIn) & 0xff) &&
5387 (status & hdspm->midi[i].irq)) {
5388 /* we disable interrupts for this input until
5389 * processing is done
5391 hdspm->control_register &= ~hdspm->midi[i].ie;
5392 hdspm_write(hdspm, HDSPM_controlRegister,
5393 hdspm->control_register);
5394 hdspm->midi[i].pending = 1;
5402 tasklet_hi_schedule(&hdspm->midi_tasklet);
5408 /*------------------------------------------------------------
5410 ------------------------------------------------------------*/
5413 static snd_pcm_uframes_t snd_hdspm_hw_pointer(struct snd_pcm_substream
5416 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5417 return hdspm_hw_pointer(hdspm);
5421 static int snd_hdspm_reset(struct snd_pcm_substream *substream)
5423 struct snd_pcm_runtime *runtime = substream->runtime;
5424 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5425 struct snd_pcm_substream *other;
5427 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
5428 other = hdspm->capture_substream;
5430 other = hdspm->playback_substream;
5433 runtime->status->hw_ptr = hdspm_hw_pointer(hdspm);
5435 runtime->status->hw_ptr = 0;
5437 struct snd_pcm_substream *s;
5438 struct snd_pcm_runtime *oruntime = other->runtime;
5439 snd_pcm_group_for_each_entry(s, substream) {
5441 oruntime->status->hw_ptr =
5442 runtime->status->hw_ptr;
5450 static int snd_hdspm_hw_params(struct snd_pcm_substream *substream,
5451 struct snd_pcm_hw_params *params)
5453 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5459 spin_lock_irq(&hdspm->lock);
5461 if (substream->pstr->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5462 this_pid = hdspm->playback_pid;
5463 other_pid = hdspm->capture_pid;
5465 this_pid = hdspm->capture_pid;
5466 other_pid = hdspm->playback_pid;
5469 if (other_pid > 0 && this_pid != other_pid) {
5471 /* The other stream is open, and not by the same
5472 task as this one. Make sure that the parameters
5473 that matter are the same.
5476 if (params_rate(params) != hdspm->system_sample_rate) {
5477 spin_unlock_irq(&hdspm->lock);
5478 _snd_pcm_hw_param_setempty(params,
5479 SNDRV_PCM_HW_PARAM_RATE);
5483 if (params_period_size(params) != hdspm->period_bytes / 4) {
5484 spin_unlock_irq(&hdspm->lock);
5485 _snd_pcm_hw_param_setempty(params,
5486 SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
5492 spin_unlock_irq(&hdspm->lock);
5494 /* how to make sure that the rate matches an externally-set one ? */
5496 spin_lock_irq(&hdspm->lock);
5497 err = hdspm_set_rate(hdspm, params_rate(params), 0);
5499 snd_printk(KERN_INFO "err on hdspm_set_rate: %d\n", err);
5500 spin_unlock_irq(&hdspm->lock);
5501 _snd_pcm_hw_param_setempty(params,
5502 SNDRV_PCM_HW_PARAM_RATE);
5505 spin_unlock_irq(&hdspm->lock);
5507 err = hdspm_set_interrupt_interval(hdspm,
5508 params_period_size(params));
5510 snd_printk(KERN_INFO "err on hdspm_set_interrupt_interval: %d\n", err);
5511 _snd_pcm_hw_param_setempty(params,
5512 SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
5516 /* Memory allocation, takashi's method, dont know if we should
5519 /* malloc all buffer even if not enabled to get sure */
5520 /* Update for MADI rev 204: we need to allocate for all channels,
5521 * otherwise it doesn't work at 96kHz */
5524 snd_pcm_lib_malloc_pages(substream, HDSPM_DMA_AREA_BYTES);
5526 snd_printk(KERN_INFO "err on snd_pcm_lib_malloc_pages: %d\n", err);
5530 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5532 hdspm_set_sgbuf(hdspm, substream, HDSPM_pageAddressBufferOut,
5533 params_channels(params));
5535 for (i = 0; i < params_channels(params); ++i)
5536 snd_hdspm_enable_out(hdspm, i, 1);
5538 hdspm->playback_buffer =
5539 (unsigned char *) substream->runtime->dma_area;
5540 snd_printdd("Allocated sample buffer for playback at %p\n",
5541 hdspm->playback_buffer);
5543 hdspm_set_sgbuf(hdspm, substream, HDSPM_pageAddressBufferIn,
5544 params_channels(params));
5546 for (i = 0; i < params_channels(params); ++i)
5547 snd_hdspm_enable_in(hdspm, i, 1);
5549 hdspm->capture_buffer =
5550 (unsigned char *) substream->runtime->dma_area;
5551 snd_printdd("Allocated sample buffer for capture at %p\n",
5552 hdspm->capture_buffer);
5556 snd_printdd("Allocated sample buffer for %s at 0x%08X\n",
5557 substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
5558 "playback" : "capture",
5559 snd_pcm_sgbuf_get_addr(substream, 0));
5562 snd_printdd("set_hwparams: %s %d Hz, %d channels, bs = %d\n",
5563 substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
5564 "playback" : "capture",
5565 params_rate(params), params_channels(params),
5566 params_buffer_size(params));
5570 /* For AES cards, the float format bit is the same as the
5571 * preferred sync reference. Since we don't want to break
5572 * sync settings, we have to skip the remaining part of this
5575 if (hdspm->io_type == AES32) {
5580 /* Switch to native float format if requested */
5581 if (SNDRV_PCM_FORMAT_FLOAT_LE == params_format(params)) {
5582 if (!(hdspm->control_register & HDSPe_FLOAT_FORMAT))
5583 snd_printk(KERN_INFO "hdspm: Switching to native 32bit LE float format.\n");
5585 hdspm->control_register |= HDSPe_FLOAT_FORMAT;
5586 } else if (SNDRV_PCM_FORMAT_S32_LE == params_format(params)) {
5587 if (hdspm->control_register & HDSPe_FLOAT_FORMAT)
5588 snd_printk(KERN_INFO "hdspm: Switching to native 32bit LE integer format.\n");
5590 hdspm->control_register &= ~HDSPe_FLOAT_FORMAT;
5592 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
5597 static int snd_hdspm_hw_free(struct snd_pcm_substream *substream)
5600 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5602 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5604 /* params_channels(params) should be enough,
5605 but to get sure in case of error */
5606 for (i = 0; i < hdspm->max_channels_out; ++i)
5607 snd_hdspm_enable_out(hdspm, i, 0);
5609 hdspm->playback_buffer = NULL;
5611 for (i = 0; i < hdspm->max_channels_in; ++i)
5612 snd_hdspm_enable_in(hdspm, i, 0);
5614 hdspm->capture_buffer = NULL;
5618 snd_pcm_lib_free_pages(substream);
5624 static int snd_hdspm_channel_info(struct snd_pcm_substream *substream,
5625 struct snd_pcm_channel_info *info)
5627 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5629 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5630 if (snd_BUG_ON(info->channel >= hdspm->max_channels_out)) {
5631 snd_printk(KERN_INFO "snd_hdspm_channel_info: output channel out of range (%d)\n", info->channel);
5635 if (hdspm->channel_map_out[info->channel] < 0) {
5636 snd_printk(KERN_INFO "snd_hdspm_channel_info: output channel %d mapped out\n", info->channel);
5640 info->offset = hdspm->channel_map_out[info->channel] *
5641 HDSPM_CHANNEL_BUFFER_BYTES;
5643 if (snd_BUG_ON(info->channel >= hdspm->max_channels_in)) {
5644 snd_printk(KERN_INFO "snd_hdspm_channel_info: input channel out of range (%d)\n", info->channel);
5648 if (hdspm->channel_map_in[info->channel] < 0) {
5649 snd_printk(KERN_INFO "snd_hdspm_channel_info: input channel %d mapped out\n", info->channel);
5653 info->offset = hdspm->channel_map_in[info->channel] *
5654 HDSPM_CHANNEL_BUFFER_BYTES;
5663 static int snd_hdspm_ioctl(struct snd_pcm_substream *substream,
5664 unsigned int cmd, void *arg)
5667 case SNDRV_PCM_IOCTL1_RESET:
5668 return snd_hdspm_reset(substream);
5670 case SNDRV_PCM_IOCTL1_CHANNEL_INFO:
5672 struct snd_pcm_channel_info *info = arg;
5673 return snd_hdspm_channel_info(substream, info);
5679 return snd_pcm_lib_ioctl(substream, cmd, arg);
5682 static int snd_hdspm_trigger(struct snd_pcm_substream *substream, int cmd)
5684 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5685 struct snd_pcm_substream *other;
5688 spin_lock(&hdspm->lock);
5689 running = hdspm->running;
5691 case SNDRV_PCM_TRIGGER_START:
5692 running |= 1 << substream->stream;
5694 case SNDRV_PCM_TRIGGER_STOP:
5695 running &= ~(1 << substream->stream);
5699 spin_unlock(&hdspm->lock);
5702 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
5703 other = hdspm->capture_substream;
5705 other = hdspm->playback_substream;
5708 struct snd_pcm_substream *s;
5709 snd_pcm_group_for_each_entry(s, substream) {
5711 snd_pcm_trigger_done(s, substream);
5712 if (cmd == SNDRV_PCM_TRIGGER_START)
5713 running |= 1 << s->stream;
5715 running &= ~(1 << s->stream);
5719 if (cmd == SNDRV_PCM_TRIGGER_START) {
5720 if (!(running & (1 << SNDRV_PCM_STREAM_PLAYBACK))
5721 && substream->stream ==
5722 SNDRV_PCM_STREAM_CAPTURE)
5723 hdspm_silence_playback(hdspm);
5726 substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
5727 hdspm_silence_playback(hdspm);
5730 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
5731 hdspm_silence_playback(hdspm);
5734 snd_pcm_trigger_done(substream, substream);
5735 if (!hdspm->running && running)
5736 hdspm_start_audio(hdspm);
5737 else if (hdspm->running && !running)
5738 hdspm_stop_audio(hdspm);
5739 hdspm->running = running;
5740 spin_unlock(&hdspm->lock);
5745 static int snd_hdspm_prepare(struct snd_pcm_substream *substream)
5750 static struct snd_pcm_hardware snd_hdspm_playback_subinfo = {
5751 .info = (SNDRV_PCM_INFO_MMAP |
5752 SNDRV_PCM_INFO_MMAP_VALID |
5753 SNDRV_PCM_INFO_NONINTERLEAVED |
5754 SNDRV_PCM_INFO_SYNC_START | SNDRV_PCM_INFO_DOUBLE),
5755 .formats = SNDRV_PCM_FMTBIT_S32_LE,
5756 .rates = (SNDRV_PCM_RATE_32000 |
5757 SNDRV_PCM_RATE_44100 |
5758 SNDRV_PCM_RATE_48000 |
5759 SNDRV_PCM_RATE_64000 |
5760 SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 |
5761 SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000 ),
5765 .channels_max = HDSPM_MAX_CHANNELS,
5767 HDSPM_CHANNEL_BUFFER_BYTES * HDSPM_MAX_CHANNELS,
5768 .period_bytes_min = (32 * 4),
5769 .period_bytes_max = (8192 * 4) * HDSPM_MAX_CHANNELS,
5775 static struct snd_pcm_hardware snd_hdspm_capture_subinfo = {
5776 .info = (SNDRV_PCM_INFO_MMAP |
5777 SNDRV_PCM_INFO_MMAP_VALID |
5778 SNDRV_PCM_INFO_NONINTERLEAVED |
5779 SNDRV_PCM_INFO_SYNC_START),
5780 .formats = SNDRV_PCM_FMTBIT_S32_LE,
5781 .rates = (SNDRV_PCM_RATE_32000 |
5782 SNDRV_PCM_RATE_44100 |
5783 SNDRV_PCM_RATE_48000 |
5784 SNDRV_PCM_RATE_64000 |
5785 SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 |
5786 SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000),
5790 .channels_max = HDSPM_MAX_CHANNELS,
5792 HDSPM_CHANNEL_BUFFER_BYTES * HDSPM_MAX_CHANNELS,
5793 .period_bytes_min = (32 * 4),
5794 .period_bytes_max = (8192 * 4) * HDSPM_MAX_CHANNELS,
5800 static int snd_hdspm_hw_rule_in_channels_rate(struct snd_pcm_hw_params *params,
5801 struct snd_pcm_hw_rule *rule)
5803 struct hdspm *hdspm = rule->private;
5804 struct snd_interval *c =
5805 hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5806 struct snd_interval *r =
5807 hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5809 if (r->min > 96000 && r->max <= 192000) {
5810 struct snd_interval t = {
5811 .min = hdspm->qs_in_channels,
5812 .max = hdspm->qs_in_channels,
5815 return snd_interval_refine(c, &t);
5816 } else if (r->min > 48000 && r->max <= 96000) {
5817 struct snd_interval t = {
5818 .min = hdspm->ds_in_channels,
5819 .max = hdspm->ds_in_channels,
5822 return snd_interval_refine(c, &t);
5823 } else if (r->max < 64000) {
5824 struct snd_interval t = {
5825 .min = hdspm->ss_in_channels,
5826 .max = hdspm->ss_in_channels,
5829 return snd_interval_refine(c, &t);
5835 static int snd_hdspm_hw_rule_out_channels_rate(struct snd_pcm_hw_params *params,
5836 struct snd_pcm_hw_rule * rule)
5838 struct hdspm *hdspm = rule->private;
5839 struct snd_interval *c =
5840 hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5841 struct snd_interval *r =
5842 hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5844 if (r->min > 96000 && r->max <= 192000) {
5845 struct snd_interval t = {
5846 .min = hdspm->qs_out_channels,
5847 .max = hdspm->qs_out_channels,
5850 return snd_interval_refine(c, &t);
5851 } else if (r->min > 48000 && r->max <= 96000) {
5852 struct snd_interval t = {
5853 .min = hdspm->ds_out_channels,
5854 .max = hdspm->ds_out_channels,
5857 return snd_interval_refine(c, &t);
5858 } else if (r->max < 64000) {
5859 struct snd_interval t = {
5860 .min = hdspm->ss_out_channels,
5861 .max = hdspm->ss_out_channels,
5864 return snd_interval_refine(c, &t);
5870 static int snd_hdspm_hw_rule_rate_in_channels(struct snd_pcm_hw_params *params,
5871 struct snd_pcm_hw_rule * rule)
5873 struct hdspm *hdspm = rule->private;
5874 struct snd_interval *c =
5875 hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5876 struct snd_interval *r =
5877 hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5879 if (c->min >= hdspm->ss_in_channels) {
5880 struct snd_interval t = {
5885 return snd_interval_refine(r, &t);
5886 } else if (c->max <= hdspm->qs_in_channels) {
5887 struct snd_interval t = {
5892 return snd_interval_refine(r, &t);
5893 } else if (c->max <= hdspm->ds_in_channels) {
5894 struct snd_interval t = {
5899 return snd_interval_refine(r, &t);
5904 static int snd_hdspm_hw_rule_rate_out_channels(struct snd_pcm_hw_params *params,
5905 struct snd_pcm_hw_rule *rule)
5907 struct hdspm *hdspm = rule->private;
5908 struct snd_interval *c =
5909 hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5910 struct snd_interval *r =
5911 hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5913 if (c->min >= hdspm->ss_out_channels) {
5914 struct snd_interval t = {
5919 return snd_interval_refine(r, &t);
5920 } else if (c->max <= hdspm->qs_out_channels) {
5921 struct snd_interval t = {
5926 return snd_interval_refine(r, &t);
5927 } else if (c->max <= hdspm->ds_out_channels) {
5928 struct snd_interval t = {
5933 return snd_interval_refine(r, &t);
5939 static int snd_hdspm_hw_rule_in_channels(struct snd_pcm_hw_params *params,
5940 struct snd_pcm_hw_rule *rule)
5942 unsigned int list[3];
5943 struct hdspm *hdspm = rule->private;
5944 struct snd_interval *c = hw_param_interval(params,
5945 SNDRV_PCM_HW_PARAM_CHANNELS);
5947 list[0] = hdspm->qs_in_channels;
5948 list[1] = hdspm->ds_in_channels;
5949 list[2] = hdspm->ss_in_channels;
5950 return snd_interval_list(c, 3, list, 0);
5953 static int snd_hdspm_hw_rule_out_channels(struct snd_pcm_hw_params *params,
5954 struct snd_pcm_hw_rule *rule)
5956 unsigned int list[3];
5957 struct hdspm *hdspm = rule->private;
5958 struct snd_interval *c = hw_param_interval(params,
5959 SNDRV_PCM_HW_PARAM_CHANNELS);
5961 list[0] = hdspm->qs_out_channels;
5962 list[1] = hdspm->ds_out_channels;
5963 list[2] = hdspm->ss_out_channels;
5964 return snd_interval_list(c, 3, list, 0);
5968 static unsigned int hdspm_aes32_sample_rates[] = {
5969 32000, 44100, 48000, 64000, 88200, 96000, 128000, 176400, 192000
5972 static struct snd_pcm_hw_constraint_list
5973 hdspm_hw_constraints_aes32_sample_rates = {
5974 .count = ARRAY_SIZE(hdspm_aes32_sample_rates),
5975 .list = hdspm_aes32_sample_rates,
5979 static int snd_hdspm_playback_open(struct snd_pcm_substream *substream)
5981 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5982 struct snd_pcm_runtime *runtime = substream->runtime;
5984 spin_lock_irq(&hdspm->lock);
5986 snd_pcm_set_sync(substream);
5989 runtime->hw = snd_hdspm_playback_subinfo;
5991 if (hdspm->capture_substream == NULL)
5992 hdspm_stop_audio(hdspm);
5994 hdspm->playback_pid = current->pid;
5995 hdspm->playback_substream = substream;
5997 spin_unlock_irq(&hdspm->lock);
5999 snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
6000 snd_pcm_hw_constraint_pow2(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
6002 switch (hdspm->io_type) {
6005 snd_pcm_hw_constraint_minmax(runtime,
6006 SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
6008 /* RayDAT & AIO have a fixed buffer of 16384 samples per channel */
6009 snd_pcm_hw_constraint_minmax(runtime,
6010 SNDRV_PCM_HW_PARAM_BUFFER_SIZE,
6015 snd_pcm_hw_constraint_minmax(runtime,
6016 SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
6021 if (AES32 == hdspm->io_type) {
6022 runtime->hw.rates |= SNDRV_PCM_RATE_KNOT;
6023 snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
6024 &hdspm_hw_constraints_aes32_sample_rates);
6026 snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
6027 snd_hdspm_hw_rule_rate_out_channels, hdspm,
6028 SNDRV_PCM_HW_PARAM_CHANNELS, -1);
6031 snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
6032 snd_hdspm_hw_rule_out_channels, hdspm,
6033 SNDRV_PCM_HW_PARAM_CHANNELS, -1);
6035 snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
6036 snd_hdspm_hw_rule_out_channels_rate, hdspm,
6037 SNDRV_PCM_HW_PARAM_RATE, -1);
6042 static int snd_hdspm_playback_release(struct snd_pcm_substream *substream)
6044 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
6046 spin_lock_irq(&hdspm->lock);
6048 hdspm->playback_pid = -1;
6049 hdspm->playback_substream = NULL;
6051 spin_unlock_irq(&hdspm->lock);
6057 static int snd_hdspm_capture_open(struct snd_pcm_substream *substream)
6059 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
6060 struct snd_pcm_runtime *runtime = substream->runtime;
6062 spin_lock_irq(&hdspm->lock);
6063 snd_pcm_set_sync(substream);
6064 runtime->hw = snd_hdspm_capture_subinfo;
6066 if (hdspm->playback_substream == NULL)
6067 hdspm_stop_audio(hdspm);
6069 hdspm->capture_pid = current->pid;
6070 hdspm->capture_substream = substream;
6072 spin_unlock_irq(&hdspm->lock);
6074 snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
6075 snd_pcm_hw_constraint_pow2(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
6077 switch (hdspm->io_type) {
6080 snd_pcm_hw_constraint_minmax(runtime,
6081 SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
6083 snd_pcm_hw_constraint_minmax(runtime,
6084 SNDRV_PCM_HW_PARAM_BUFFER_SIZE,
6089 snd_pcm_hw_constraint_minmax(runtime,
6090 SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
6095 if (AES32 == hdspm->io_type) {
6096 runtime->hw.rates |= SNDRV_PCM_RATE_KNOT;
6097 snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
6098 &hdspm_hw_constraints_aes32_sample_rates);
6100 snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
6101 snd_hdspm_hw_rule_rate_in_channels, hdspm,
6102 SNDRV_PCM_HW_PARAM_CHANNELS, -1);
6105 snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
6106 snd_hdspm_hw_rule_in_channels, hdspm,
6107 SNDRV_PCM_HW_PARAM_CHANNELS, -1);
6109 snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
6110 snd_hdspm_hw_rule_in_channels_rate, hdspm,
6111 SNDRV_PCM_HW_PARAM_RATE, -1);
6116 static int snd_hdspm_capture_release(struct snd_pcm_substream *substream)
6118 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
6120 spin_lock_irq(&hdspm->lock);
6122 hdspm->capture_pid = -1;
6123 hdspm->capture_substream = NULL;
6125 spin_unlock_irq(&hdspm->lock);
6129 static int snd_hdspm_hwdep_dummy_op(struct snd_hwdep *hw, struct file *file)
6131 /* we have nothing to initialize but the call is required */
6135 static inline int copy_u32_le(void __user *dest, void __iomem *src)
6137 u32 val = readl(src);
6138 return copy_to_user(dest, &val, 4);
6141 static int snd_hdspm_hwdep_ioctl(struct snd_hwdep *hw, struct file *file,
6142 unsigned int cmd, unsigned long arg)
6144 void __user *argp = (void __user *)arg;
6145 struct hdspm *hdspm = hw->private_data;
6146 struct hdspm_mixer_ioctl mixer;
6147 struct hdspm_config info;
6148 struct hdspm_status status;
6149 struct hdspm_version hdspm_version;
6150 struct hdspm_peak_rms *levels;
6151 struct hdspm_ltc ltc;
6152 unsigned int statusregister;
6153 long unsigned int s;
6158 case SNDRV_HDSPM_IOCTL_GET_PEAK_RMS:
6159 levels = &hdspm->peak_rms;
6160 for (i = 0; i < HDSPM_MAX_CHANNELS; i++) {
6161 levels->input_peaks[i] =
6162 readl(hdspm->iobase +
6163 HDSPM_MADI_INPUT_PEAK + i*4);
6164 levels->playback_peaks[i] =
6165 readl(hdspm->iobase +
6166 HDSPM_MADI_PLAYBACK_PEAK + i*4);
6167 levels->output_peaks[i] =
6168 readl(hdspm->iobase +
6169 HDSPM_MADI_OUTPUT_PEAK + i*4);
6171 levels->input_rms[i] =
6172 ((uint64_t) readl(hdspm->iobase +
6173 HDSPM_MADI_INPUT_RMS_H + i*4) << 32) |
6174 (uint64_t) readl(hdspm->iobase +
6175 HDSPM_MADI_INPUT_RMS_L + i*4);
6176 levels->playback_rms[i] =
6177 ((uint64_t)readl(hdspm->iobase +
6178 HDSPM_MADI_PLAYBACK_RMS_H+i*4) << 32) |
6179 (uint64_t)readl(hdspm->iobase +
6180 HDSPM_MADI_PLAYBACK_RMS_L + i*4);
6181 levels->output_rms[i] =
6182 ((uint64_t)readl(hdspm->iobase +
6183 HDSPM_MADI_OUTPUT_RMS_H + i*4) << 32) |
6184 (uint64_t)readl(hdspm->iobase +
6185 HDSPM_MADI_OUTPUT_RMS_L + i*4);
6188 if (hdspm->system_sample_rate > 96000) {
6190 } else if (hdspm->system_sample_rate > 48000) {
6195 levels->status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
6197 s = copy_to_user(argp, levels, sizeof(struct hdspm_peak_rms));
6199 /* snd_printk(KERN_ERR "copy_to_user(.., .., %lu): %lu
6200 [Levels]\n", sizeof(struct hdspm_peak_rms), s);
6206 case SNDRV_HDSPM_IOCTL_GET_LTC:
6207 ltc.ltc = hdspm_read(hdspm, HDSPM_RD_TCO);
6208 i = hdspm_read(hdspm, HDSPM_RD_TCO + 4);
6209 if (i & HDSPM_TCO1_LTC_Input_valid) {
6210 switch (i & (HDSPM_TCO1_LTC_Format_LSB |
6211 HDSPM_TCO1_LTC_Format_MSB)) {
6213 ltc.format = fps_24;
6215 case HDSPM_TCO1_LTC_Format_LSB:
6216 ltc.format = fps_25;
6218 case HDSPM_TCO1_LTC_Format_MSB:
6219 ltc.format = fps_2997;
6225 if (i & HDSPM_TCO1_set_drop_frame_flag) {
6226 ltc.frame = drop_frame;
6228 ltc.frame = full_frame;
6231 ltc.format = format_invalid;
6232 ltc.frame = frame_invalid;
6234 if (i & HDSPM_TCO1_Video_Input_Format_NTSC) {
6235 ltc.input_format = ntsc;
6236 } else if (i & HDSPM_TCO1_Video_Input_Format_PAL) {
6237 ltc.input_format = pal;
6239 ltc.input_format = no_video;
6242 s = copy_to_user(argp, <c, sizeof(struct hdspm_ltc));
6245 snd_printk(KERN_ERR "copy_to_user(.., .., %lu): %lu [LTC]\n", sizeof(struct hdspm_ltc), s); */
6251 case SNDRV_HDSPM_IOCTL_GET_CONFIG:
6253 memset(&info, 0, sizeof(info));
6254 spin_lock_irq(&hdspm->lock);
6255 info.pref_sync_ref = hdspm_pref_sync_ref(hdspm);
6256 info.wordclock_sync_check = hdspm_wc_sync_check(hdspm);
6258 info.system_sample_rate = hdspm->system_sample_rate;
6259 info.autosync_sample_rate =
6260 hdspm_external_sample_rate(hdspm);
6261 info.system_clock_mode = hdspm_system_clock_mode(hdspm);
6262 info.clock_source = hdspm_clock_source(hdspm);
6263 info.autosync_ref = hdspm_autosync_ref(hdspm);
6264 info.line_out = hdspm_toggle_setting(hdspm, HDSPM_LineOut);
6266 spin_unlock_irq(&hdspm->lock);
6267 if (copy_to_user(argp, &info, sizeof(info)))
6271 case SNDRV_HDSPM_IOCTL_GET_STATUS:
6272 memset(&status, 0, sizeof(status));
6274 status.card_type = hdspm->io_type;
6276 status.autosync_source = hdspm_autosync_ref(hdspm);
6278 status.card_clock = 110069313433624ULL;
6279 status.master_period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ);
6281 switch (hdspm->io_type) {
6284 status.card_specific.madi.sync_wc =
6285 hdspm_wc_sync_check(hdspm);
6286 status.card_specific.madi.sync_madi =
6287 hdspm_madi_sync_check(hdspm);
6288 status.card_specific.madi.sync_tco =
6289 hdspm_tco_sync_check(hdspm);
6290 status.card_specific.madi.sync_in =
6291 hdspm_sync_in_sync_check(hdspm);
6294 hdspm_read(hdspm, HDSPM_statusRegister);
6295 status.card_specific.madi.madi_input =
6296 (statusregister & HDSPM_AB_int) ? 1 : 0;
6297 status.card_specific.madi.channel_format =
6298 (statusregister & HDSPM_RX_64ch) ? 1 : 0;
6299 /* TODO: Mac driver sets it when f_s>48kHz */
6300 status.card_specific.madi.frame_format = 0;
6306 if (copy_to_user(argp, &status, sizeof(status)))
6312 case SNDRV_HDSPM_IOCTL_GET_VERSION:
6313 memset(&hdspm_version, 0, sizeof(hdspm_version));
6315 hdspm_version.card_type = hdspm->io_type;
6316 strncpy(hdspm_version.cardname, hdspm->card_name,
6317 sizeof(hdspm_version.cardname));
6318 hdspm_version.serial = hdspm->serial;
6319 hdspm_version.firmware_rev = hdspm->firmware_rev;
6320 hdspm_version.addons = 0;
6322 hdspm_version.addons |= HDSPM_ADDON_TCO;
6324 if (copy_to_user(argp, &hdspm_version,
6325 sizeof(hdspm_version)))
6329 case SNDRV_HDSPM_IOCTL_GET_MIXER:
6330 if (copy_from_user(&mixer, argp, sizeof(mixer)))
6332 if (copy_to_user((void __user *)mixer.mixer, hdspm->mixer,
6333 sizeof(struct hdspm_mixer)))
6343 static struct snd_pcm_ops snd_hdspm_playback_ops = {
6344 .open = snd_hdspm_playback_open,
6345 .close = snd_hdspm_playback_release,
6346 .ioctl = snd_hdspm_ioctl,
6347 .hw_params = snd_hdspm_hw_params,
6348 .hw_free = snd_hdspm_hw_free,
6349 .prepare = snd_hdspm_prepare,
6350 .trigger = snd_hdspm_trigger,
6351 .pointer = snd_hdspm_hw_pointer,
6352 .page = snd_pcm_sgbuf_ops_page,
6355 static struct snd_pcm_ops snd_hdspm_capture_ops = {
6356 .open = snd_hdspm_capture_open,
6357 .close = snd_hdspm_capture_release,
6358 .ioctl = snd_hdspm_ioctl,
6359 .hw_params = snd_hdspm_hw_params,
6360 .hw_free = snd_hdspm_hw_free,
6361 .prepare = snd_hdspm_prepare,
6362 .trigger = snd_hdspm_trigger,
6363 .pointer = snd_hdspm_hw_pointer,
6364 .page = snd_pcm_sgbuf_ops_page,
6367 static int snd_hdspm_create_hwdep(struct snd_card *card,
6368 struct hdspm *hdspm)
6370 struct snd_hwdep *hw;
6373 err = snd_hwdep_new(card, "HDSPM hwdep", 0, &hw);
6378 hw->private_data = hdspm;
6379 strcpy(hw->name, "HDSPM hwdep interface");
6381 hw->ops.open = snd_hdspm_hwdep_dummy_op;
6382 hw->ops.ioctl = snd_hdspm_hwdep_ioctl;
6383 hw->ops.ioctl_compat = snd_hdspm_hwdep_ioctl;
6384 hw->ops.release = snd_hdspm_hwdep_dummy_op;
6390 /*------------------------------------------------------------
6392 ------------------------------------------------------------*/
6393 static int snd_hdspm_preallocate_memory(struct hdspm *hdspm)
6396 struct snd_pcm *pcm;
6401 wanted = HDSPM_DMA_AREA_BYTES;
6404 snd_pcm_lib_preallocate_pages_for_all(pcm,
6405 SNDRV_DMA_TYPE_DEV_SG,
6406 snd_dma_pci_data(hdspm->pci),
6410 snd_printdd("Could not preallocate %zd Bytes\n", wanted);
6414 snd_printdd(" Preallocated %zd Bytes\n", wanted);
6420 static void hdspm_set_sgbuf(struct hdspm *hdspm,
6421 struct snd_pcm_substream *substream,
6422 unsigned int reg, int channels)
6426 /* continuous memory segment */
6427 for (i = 0; i < (channels * 16); i++)
6428 hdspm_write(hdspm, reg + 4 * i,
6429 snd_pcm_sgbuf_get_addr(substream, 4096 * i));
6433 /* ------------- ALSA Devices ---------------------------- */
6434 static int snd_hdspm_create_pcm(struct snd_card *card,
6435 struct hdspm *hdspm)
6437 struct snd_pcm *pcm;
6440 err = snd_pcm_new(card, hdspm->card_name, 0, 1, 1, &pcm);
6445 pcm->private_data = hdspm;
6446 strcpy(pcm->name, hdspm->card_name);
6448 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
6449 &snd_hdspm_playback_ops);
6450 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
6451 &snd_hdspm_capture_ops);
6453 pcm->info_flags = SNDRV_PCM_INFO_JOINT_DUPLEX;
6455 err = snd_hdspm_preallocate_memory(hdspm);
6462 static inline void snd_hdspm_initialize_midi_flush(struct hdspm * hdspm)
6466 for (i = 0; i < hdspm->midiPorts; i++)
6467 snd_hdspm_flush_midi_input(hdspm, i);
6470 static int snd_hdspm_create_alsa_devices(struct snd_card *card,
6471 struct hdspm *hdspm)
6475 snd_printdd("Create card...\n");
6476 err = snd_hdspm_create_pcm(card, hdspm);
6481 while (i < hdspm->midiPorts) {
6482 err = snd_hdspm_create_midi(card, hdspm, i);
6489 err = snd_hdspm_create_controls(card, hdspm);
6493 err = snd_hdspm_create_hwdep(card, hdspm);
6497 snd_printdd("proc init...\n");
6498 snd_hdspm_proc_init(hdspm);
6500 hdspm->system_sample_rate = -1;
6501 hdspm->last_external_sample_rate = -1;
6502 hdspm->last_internal_sample_rate = -1;
6503 hdspm->playback_pid = -1;
6504 hdspm->capture_pid = -1;
6505 hdspm->capture_substream = NULL;
6506 hdspm->playback_substream = NULL;
6508 snd_printdd("Set defaults...\n");
6509 err = snd_hdspm_set_defaults(hdspm);
6513 snd_printdd("Update mixer controls...\n");
6514 hdspm_update_simple_mixer_controls(hdspm);
6516 snd_printdd("Initializeing complete ???\n");
6518 err = snd_card_register(card);
6520 snd_printk(KERN_ERR "HDSPM: error registering card\n");
6524 snd_printdd("... yes now\n");
6529 static int snd_hdspm_create(struct snd_card *card,
6530 struct hdspm *hdspm)
6533 struct pci_dev *pci = hdspm->pci;
6535 unsigned long io_extent;
6540 spin_lock_init(&hdspm->lock);
6542 pci_read_config_word(hdspm->pci,
6543 PCI_CLASS_REVISION, &hdspm->firmware_rev);
6545 strcpy(card->mixername, "Xilinx FPGA");
6546 strcpy(card->driver, "HDSPM");
6548 switch (hdspm->firmware_rev) {
6549 case HDSPM_RAYDAT_REV:
6550 hdspm->io_type = RayDAT;
6551 hdspm->card_name = "RME RayDAT";
6552 hdspm->midiPorts = 2;
6555 hdspm->io_type = AIO;
6556 hdspm->card_name = "RME AIO";
6557 hdspm->midiPorts = 1;
6559 case HDSPM_MADIFACE_REV:
6560 hdspm->io_type = MADIface;
6561 hdspm->card_name = "RME MADIface";
6562 hdspm->midiPorts = 1;
6565 if ((hdspm->firmware_rev == 0xf0) ||
6566 ((hdspm->firmware_rev >= 0xe6) &&
6567 (hdspm->firmware_rev <= 0xea))) {
6568 hdspm->io_type = AES32;
6569 hdspm->card_name = "RME AES32";
6570 hdspm->midiPorts = 2;
6571 } else if ((hdspm->firmware_rev == 0xd2) ||
6572 ((hdspm->firmware_rev >= 0xc8) &&
6573 (hdspm->firmware_rev <= 0xcf))) {
6574 hdspm->io_type = MADI;
6575 hdspm->card_name = "RME MADI";
6576 hdspm->midiPorts = 3;
6579 "HDSPM: unknown firmware revision %x\n",
6580 hdspm->firmware_rev);
6585 err = pci_enable_device(pci);
6589 pci_set_master(hdspm->pci);
6591 err = pci_request_regions(pci, "hdspm");
6595 hdspm->port = pci_resource_start(pci, 0);
6596 io_extent = pci_resource_len(pci, 0);
6598 snd_printdd("grabbed memory region 0x%lx-0x%lx\n",
6599 hdspm->port, hdspm->port + io_extent - 1);
6601 hdspm->iobase = ioremap_nocache(hdspm->port, io_extent);
6602 if (!hdspm->iobase) {
6603 snd_printk(KERN_ERR "HDSPM: "
6604 "unable to remap region 0x%lx-0x%lx\n",
6605 hdspm->port, hdspm->port + io_extent - 1);
6608 snd_printdd("remapped region (0x%lx) 0x%lx-0x%lx\n",
6609 (unsigned long)hdspm->iobase, hdspm->port,
6610 hdspm->port + io_extent - 1);
6612 if (request_irq(pci->irq, snd_hdspm_interrupt,
6613 IRQF_SHARED, KBUILD_MODNAME, hdspm)) {
6614 snd_printk(KERN_ERR "HDSPM: unable to use IRQ %d\n", pci->irq);
6618 snd_printdd("use IRQ %d\n", pci->irq);
6620 hdspm->irq = pci->irq;
6622 snd_printdd("kmalloc Mixer memory of %zd Bytes\n",
6623 sizeof(struct hdspm_mixer));
6624 hdspm->mixer = kzalloc(sizeof(struct hdspm_mixer), GFP_KERNEL);
6625 if (!hdspm->mixer) {
6626 snd_printk(KERN_ERR "HDSPM: "
6627 "unable to kmalloc Mixer memory of %d Bytes\n",
6628 (int)sizeof(struct hdspm_mixer));
6632 hdspm->port_names_in = NULL;
6633 hdspm->port_names_out = NULL;
6635 switch (hdspm->io_type) {
6637 hdspm->ss_in_channels = hdspm->ss_out_channels = AES32_CHANNELS;
6638 hdspm->ds_in_channels = hdspm->ds_out_channels = AES32_CHANNELS;
6639 hdspm->qs_in_channels = hdspm->qs_out_channels = AES32_CHANNELS;
6641 hdspm->channel_map_in_ss = hdspm->channel_map_out_ss =
6643 hdspm->channel_map_in_ds = hdspm->channel_map_out_ds =
6645 hdspm->channel_map_in_qs = hdspm->channel_map_out_qs =
6647 hdspm->port_names_in_ss = hdspm->port_names_out_ss =
6649 hdspm->port_names_in_ds = hdspm->port_names_out_ds =
6651 hdspm->port_names_in_qs = hdspm->port_names_out_qs =
6654 hdspm->max_channels_out = hdspm->max_channels_in =
6656 hdspm->port_names_in = hdspm->port_names_out =
6658 hdspm->channel_map_in = hdspm->channel_map_out =
6665 hdspm->ss_in_channels = hdspm->ss_out_channels =
6667 hdspm->ds_in_channels = hdspm->ds_out_channels =
6669 hdspm->qs_in_channels = hdspm->qs_out_channels =
6672 hdspm->channel_map_in_ss = hdspm->channel_map_out_ss =
6673 channel_map_unity_ss;
6674 hdspm->channel_map_in_ds = hdspm->channel_map_out_ds =
6675 channel_map_unity_ss;
6676 hdspm->channel_map_in_qs = hdspm->channel_map_out_qs =
6677 channel_map_unity_ss;
6679 hdspm->port_names_in_ss = hdspm->port_names_out_ss =
6681 hdspm->port_names_in_ds = hdspm->port_names_out_ds =
6683 hdspm->port_names_in_qs = hdspm->port_names_out_qs =
6688 hdspm->ss_in_channels = AIO_IN_SS_CHANNELS;
6689 hdspm->ds_in_channels = AIO_IN_DS_CHANNELS;
6690 hdspm->qs_in_channels = AIO_IN_QS_CHANNELS;
6691 hdspm->ss_out_channels = AIO_OUT_SS_CHANNELS;
6692 hdspm->ds_out_channels = AIO_OUT_DS_CHANNELS;
6693 hdspm->qs_out_channels = AIO_OUT_QS_CHANNELS;
6695 if (0 == (hdspm_read(hdspm, HDSPM_statusRegister2) & HDSPM_s2_AEBI_D)) {
6696 snd_printk(KERN_INFO "HDSPM: AEB input board found\n");
6697 hdspm->ss_in_channels += 4;
6698 hdspm->ds_in_channels += 4;
6699 hdspm->qs_in_channels += 4;
6702 if (0 == (hdspm_read(hdspm, HDSPM_statusRegister2) & HDSPM_s2_AEBO_D)) {
6703 snd_printk(KERN_INFO "HDSPM: AEB output board found\n");
6704 hdspm->ss_out_channels += 4;
6705 hdspm->ds_out_channels += 4;
6706 hdspm->qs_out_channels += 4;
6709 hdspm->channel_map_out_ss = channel_map_aio_out_ss;
6710 hdspm->channel_map_out_ds = channel_map_aio_out_ds;
6711 hdspm->channel_map_out_qs = channel_map_aio_out_qs;
6713 hdspm->channel_map_in_ss = channel_map_aio_in_ss;
6714 hdspm->channel_map_in_ds = channel_map_aio_in_ds;
6715 hdspm->channel_map_in_qs = channel_map_aio_in_qs;
6717 hdspm->port_names_in_ss = texts_ports_aio_in_ss;
6718 hdspm->port_names_out_ss = texts_ports_aio_out_ss;
6719 hdspm->port_names_in_ds = texts_ports_aio_in_ds;
6720 hdspm->port_names_out_ds = texts_ports_aio_out_ds;
6721 hdspm->port_names_in_qs = texts_ports_aio_in_qs;
6722 hdspm->port_names_out_qs = texts_ports_aio_out_qs;
6727 hdspm->ss_in_channels = hdspm->ss_out_channels =
6729 hdspm->ds_in_channels = hdspm->ds_out_channels =
6731 hdspm->qs_in_channels = hdspm->qs_out_channels =
6734 hdspm->max_channels_in = RAYDAT_SS_CHANNELS;
6735 hdspm->max_channels_out = RAYDAT_SS_CHANNELS;
6737 hdspm->channel_map_in_ss = hdspm->channel_map_out_ss =
6738 channel_map_raydat_ss;
6739 hdspm->channel_map_in_ds = hdspm->channel_map_out_ds =
6740 channel_map_raydat_ds;
6741 hdspm->channel_map_in_qs = hdspm->channel_map_out_qs =
6742 channel_map_raydat_qs;
6743 hdspm->channel_map_in = hdspm->channel_map_out =
6744 channel_map_raydat_ss;
6746 hdspm->port_names_in_ss = hdspm->port_names_out_ss =
6747 texts_ports_raydat_ss;
6748 hdspm->port_names_in_ds = hdspm->port_names_out_ds =
6749 texts_ports_raydat_ds;
6750 hdspm->port_names_in_qs = hdspm->port_names_out_qs =
6751 texts_ports_raydat_qs;
6759 switch (hdspm->io_type) {
6762 if (hdspm_read(hdspm, HDSPM_statusRegister2) &
6763 HDSPM_s2_tco_detect) {
6765 hdspm->tco = kzalloc(sizeof(struct hdspm_tco),
6767 if (NULL != hdspm->tco) {
6768 hdspm_tco_write(hdspm);
6770 snd_printk(KERN_INFO "HDSPM: AIO/RayDAT TCO module found\n");
6778 if (hdspm_read(hdspm, HDSPM_statusRegister) & HDSPM_tco_detect) {
6780 hdspm->tco = kzalloc(sizeof(struct hdspm_tco),
6782 if (NULL != hdspm->tco) {
6783 hdspm_tco_write(hdspm);
6785 snd_printk(KERN_INFO "HDSPM: MADI/AES TCO module found\n");
6796 switch (hdspm->io_type) {
6799 hdspm->texts_autosync = texts_autosync_aes_tco;
6800 hdspm->texts_autosync_items =
6801 ARRAY_SIZE(texts_autosync_aes_tco);
6803 hdspm->texts_autosync = texts_autosync_aes;
6804 hdspm->texts_autosync_items =
6805 ARRAY_SIZE(texts_autosync_aes);
6811 hdspm->texts_autosync = texts_autosync_madi_tco;
6812 hdspm->texts_autosync_items = 4;
6814 hdspm->texts_autosync = texts_autosync_madi;
6815 hdspm->texts_autosync_items = 3;
6825 hdspm->texts_autosync = texts_autosync_raydat_tco;
6826 hdspm->texts_autosync_items = 9;
6828 hdspm->texts_autosync = texts_autosync_raydat;
6829 hdspm->texts_autosync_items = 8;
6835 hdspm->texts_autosync = texts_autosync_aio_tco;
6836 hdspm->texts_autosync_items = 6;
6838 hdspm->texts_autosync = texts_autosync_aio;
6839 hdspm->texts_autosync_items = 5;
6845 tasklet_init(&hdspm->midi_tasklet,
6846 hdspm_midi_tasklet, (unsigned long) hdspm);
6849 if (hdspm->io_type != MADIface) {
6850 hdspm->serial = (hdspm_read(hdspm,
6851 HDSPM_midiStatusIn0)>>8) & 0xFFFFFF;
6852 /* id contains either a user-provided value or the default
6853 * NULL. If it's the default, we're safe to
6854 * fill card->id with the serial number.
6856 * If the serial number is 0xFFFFFF, then we're dealing with
6857 * an old PCI revision that comes without a sane number. In
6858 * this case, we don't set card->id to avoid collisions
6859 * when running with multiple cards.
6861 if (NULL == id[hdspm->dev] && hdspm->serial != 0xFFFFFF) {
6862 sprintf(card->id, "HDSPMx%06x", hdspm->serial);
6863 snd_card_set_id(card, card->id);
6867 snd_printdd("create alsa devices.\n");
6868 err = snd_hdspm_create_alsa_devices(card, hdspm);
6872 snd_hdspm_initialize_midi_flush(hdspm);
6878 static int snd_hdspm_free(struct hdspm * hdspm)
6883 /* stop th audio, and cancel all interrupts */
6884 hdspm->control_register &=
6885 ~(HDSPM_Start | HDSPM_AudioInterruptEnable |
6886 HDSPM_Midi0InterruptEnable | HDSPM_Midi1InterruptEnable |
6887 HDSPM_Midi2InterruptEnable | HDSPM_Midi3InterruptEnable);
6888 hdspm_write(hdspm, HDSPM_controlRegister,
6889 hdspm->control_register);
6892 if (hdspm->irq >= 0)
6893 free_irq(hdspm->irq, (void *) hdspm);
6895 kfree(hdspm->mixer);
6898 iounmap(hdspm->iobase);
6901 pci_release_regions(hdspm->pci);
6903 pci_disable_device(hdspm->pci);
6908 static void snd_hdspm_card_free(struct snd_card *card)
6910 struct hdspm *hdspm = card->private_data;
6913 snd_hdspm_free(hdspm);
6917 static int snd_hdspm_probe(struct pci_dev *pci,
6918 const struct pci_device_id *pci_id)
6921 struct hdspm *hdspm;
6922 struct snd_card *card;
6925 if (dev >= SNDRV_CARDS)
6932 err = snd_card_create(index[dev], id[dev],
6933 THIS_MODULE, sizeof(struct hdspm), &card);
6937 hdspm = card->private_data;
6938 card->private_free = snd_hdspm_card_free;
6942 snd_card_set_dev(card, &pci->dev);
6944 err = snd_hdspm_create(card, hdspm);
6946 snd_card_free(card);
6950 if (hdspm->io_type != MADIface) {
6951 sprintf(card->shortname, "%s_%x",
6954 sprintf(card->longname, "%s S/N 0x%x at 0x%lx, irq %d",
6957 hdspm->port, hdspm->irq);
6959 sprintf(card->shortname, "%s", hdspm->card_name);
6960 sprintf(card->longname, "%s at 0x%lx, irq %d",
6961 hdspm->card_name, hdspm->port, hdspm->irq);
6964 err = snd_card_register(card);
6966 snd_card_free(card);
6970 pci_set_drvdata(pci, card);
6976 static void snd_hdspm_remove(struct pci_dev *pci)
6978 snd_card_free(pci_get_drvdata(pci));
6981 static struct pci_driver hdspm_driver = {
6982 .name = KBUILD_MODNAME,
6983 .id_table = snd_hdspm_ids,
6984 .probe = snd_hdspm_probe,
6985 .remove = snd_hdspm_remove,
6988 module_pci_driver(hdspm_driver);