staging: brcm80211: decreased indentation level of brcms_c_wme_setparams function
[zen-stable.git] / sound / pci / rme9652 / hdspm.c
blob493e3946756f9e30cecbb700d96cc48bea3df94e
1 /*
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
6 * Marcus Andersson
7 * Thomas Charbonnel
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
12 * <faber@faberman.de>
14 * Modified 2009-04-14 for native float support by Florian Faber
15 * <faber@faberman.de>
17 * Modified 2009-04-26 fixed bug in rms metering by Florian Faber
18 * <faber@faberman.de>
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/moduleparam.h>
45 #include <linux/slab.h>
46 #include <linux/pci.h>
47 #include <linux/math64.h>
48 #include <asm/io.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 int 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.");
76 MODULE_AUTHOR
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
126 /* AIO, RayDAT */
127 #define HDSPM_RD_STATUS_0 0
128 #define HDSPM_RD_STATUS_1 64
129 #define HDSPM_RD_STATUS_2 128
130 #define HDSPM_RD_STATUS_3 192
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
233 * -- MADI ONLY
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 /* --- bit helper defines */
262 #define HDSPM_LatencyMask (HDSPM_Latency0|HDSPM_Latency1|HDSPM_Latency2)
263 #define HDSPM_FrequencyMask (HDSPM_Frequency0|HDSPM_Frequency1|\
264 HDSPM_DoubleSpeed|HDSPM_QuadSpeed)
265 #define HDSPM_InputMask (HDSPM_InputSelect0|HDSPM_InputSelect1)
266 #define HDSPM_InputOptical 0
267 #define HDSPM_InputCoaxial (HDSPM_InputSelect0)
268 #define HDSPM_SyncRefMask (HDSPM_SyncRef0|HDSPM_SyncRef1|\
269 HDSPM_SyncRef2|HDSPM_SyncRef3)
271 #define HDSPM_c0_SyncRef0 0x2
272 #define HDSPM_c0_SyncRef1 0x4
273 #define HDSPM_c0_SyncRef2 0x8
274 #define HDSPM_c0_SyncRef3 0x10
275 #define HDSPM_c0_SyncRefMask (HDSPM_c0_SyncRef0 | HDSPM_c0_SyncRef1 |\
276 HDSPM_c0_SyncRef2 | HDSPM_c0_SyncRef3)
278 #define HDSPM_SYNC_FROM_WORD 0 /* Preferred sync reference */
279 #define HDSPM_SYNC_FROM_MADI 1 /* choices - used by "pref_sync_ref" */
280 #define HDSPM_SYNC_FROM_TCO 2
281 #define HDSPM_SYNC_FROM_SYNC_IN 3
283 #define HDSPM_Frequency32KHz HDSPM_Frequency0
284 #define HDSPM_Frequency44_1KHz HDSPM_Frequency1
285 #define HDSPM_Frequency48KHz (HDSPM_Frequency1|HDSPM_Frequency0)
286 #define HDSPM_Frequency64KHz (HDSPM_DoubleSpeed|HDSPM_Frequency0)
287 #define HDSPM_Frequency88_2KHz (HDSPM_DoubleSpeed|HDSPM_Frequency1)
288 #define HDSPM_Frequency96KHz (HDSPM_DoubleSpeed|HDSPM_Frequency1|\
289 HDSPM_Frequency0)
290 #define HDSPM_Frequency128KHz (HDSPM_QuadSpeed|HDSPM_Frequency0)
291 #define HDSPM_Frequency176_4KHz (HDSPM_QuadSpeed|HDSPM_Frequency1)
292 #define HDSPM_Frequency192KHz (HDSPM_QuadSpeed|HDSPM_Frequency1|\
293 HDSPM_Frequency0)
296 /* Synccheck Status */
297 #define HDSPM_SYNC_CHECK_NO_LOCK 0
298 #define HDSPM_SYNC_CHECK_LOCK 1
299 #define HDSPM_SYNC_CHECK_SYNC 2
301 /* AutoSync References - used by "autosync_ref" control switch */
302 #define HDSPM_AUTOSYNC_FROM_WORD 0
303 #define HDSPM_AUTOSYNC_FROM_MADI 1
304 #define HDSPM_AUTOSYNC_FROM_TCO 2
305 #define HDSPM_AUTOSYNC_FROM_SYNC_IN 3
306 #define HDSPM_AUTOSYNC_FROM_NONE 4
308 /* Possible sources of MADI input */
309 #define HDSPM_OPTICAL 0 /* optical */
310 #define HDSPM_COAXIAL 1 /* BNC */
312 #define hdspm_encode_latency(x) (((x)<<1) & HDSPM_LatencyMask)
313 #define hdspm_decode_latency(x) ((((x) & HDSPM_LatencyMask)>>1))
315 #define hdspm_encode_in(x) (((x)&0x3)<<14)
316 #define hdspm_decode_in(x) (((x)>>14)&0x3)
318 /* --- control2 register bits --- */
319 #define HDSPM_TMS (1<<0)
320 #define HDSPM_TCK (1<<1)
321 #define HDSPM_TDI (1<<2)
322 #define HDSPM_JTAG (1<<3)
323 #define HDSPM_PWDN (1<<4)
324 #define HDSPM_PROGRAM (1<<5)
325 #define HDSPM_CONFIG_MODE_0 (1<<6)
326 #define HDSPM_CONFIG_MODE_1 (1<<7)
327 /*#define HDSPM_VERSION_BIT (1<<8) not defined any more*/
328 #define HDSPM_BIGENDIAN_MODE (1<<9)
329 #define HDSPM_RD_MULTIPLE (1<<10)
331 /* --- Status Register bits --- */ /* MADI ONLY */ /* Bits defined here and
332 that do not conflict with specific bits for AES32 seem to be valid also
333 for the AES32
335 #define HDSPM_audioIRQPending (1<<0) /* IRQ is high and pending */
336 #define HDSPM_RX_64ch (1<<1) /* Input 64chan. MODE=1, 56chn MODE=0 */
337 #define HDSPM_AB_int (1<<2) /* InputChannel Opt=0, Coax=1
338 * (like inp0)
341 #define HDSPM_madiLock (1<<3) /* MADI Locked =1, no=0 */
342 #define HDSPM_madiSync (1<<18) /* MADI is in sync */
344 #define HDSPM_tcoLock 0x00000020 /* Optional TCO locked status FOR HDSPe MADI! */
345 #define HDSPM_tcoSync 0x10000000 /* Optional TCO sync status */
347 #define HDSPM_syncInLock 0x00010000 /* Sync In lock status FOR HDSPe MADI! */
348 #define HDSPM_syncInSync 0x00020000 /* Sync In sync status FOR HDSPe MADI! */
350 #define HDSPM_BufferPositionMask 0x000FFC0 /* Bit 6..15 : h/w buffer pointer */
351 /* since 64byte accurate, last 6 bits are not used */
355 #define HDSPM_DoubleSpeedStatus (1<<19) /* (input) card in double speed */
357 #define HDSPM_madiFreq0 (1<<22) /* system freq 0=error */
358 #define HDSPM_madiFreq1 (1<<23) /* 1=32, 2=44.1 3=48 */
359 #define HDSPM_madiFreq2 (1<<24) /* 4=64, 5=88.2 6=96 */
360 #define HDSPM_madiFreq3 (1<<25) /* 7=128, 8=176.4 9=192 */
362 #define HDSPM_BufferID (1<<26) /* (Double)Buffer ID toggles with
363 * Interrupt
365 #define HDSPM_tco_detect 0x08000000
366 #define HDSPM_tco_lock 0x20000000
368 #define HDSPM_s2_tco_detect 0x00000040
369 #define HDSPM_s2_AEBO_D 0x00000080
370 #define HDSPM_s2_AEBI_D 0x00000100
373 #define HDSPM_midi0IRQPending 0x40000000
374 #define HDSPM_midi1IRQPending 0x80000000
375 #define HDSPM_midi2IRQPending 0x20000000
376 #define HDSPM_midi2IRQPendingAES 0x00000020
377 #define HDSPM_midi3IRQPending 0x00200000
379 /* --- status bit helpers */
380 #define HDSPM_madiFreqMask (HDSPM_madiFreq0|HDSPM_madiFreq1|\
381 HDSPM_madiFreq2|HDSPM_madiFreq3)
382 #define HDSPM_madiFreq32 (HDSPM_madiFreq0)
383 #define HDSPM_madiFreq44_1 (HDSPM_madiFreq1)
384 #define HDSPM_madiFreq48 (HDSPM_madiFreq0|HDSPM_madiFreq1)
385 #define HDSPM_madiFreq64 (HDSPM_madiFreq2)
386 #define HDSPM_madiFreq88_2 (HDSPM_madiFreq0|HDSPM_madiFreq2)
387 #define HDSPM_madiFreq96 (HDSPM_madiFreq1|HDSPM_madiFreq2)
388 #define HDSPM_madiFreq128 (HDSPM_madiFreq0|HDSPM_madiFreq1|HDSPM_madiFreq2)
389 #define HDSPM_madiFreq176_4 (HDSPM_madiFreq3)
390 #define HDSPM_madiFreq192 (HDSPM_madiFreq3|HDSPM_madiFreq0)
392 /* Status2 Register bits */ /* MADI ONLY */
394 #define HDSPM_version0 (1<<0) /* not really defined but I guess */
395 #define HDSPM_version1 (1<<1) /* in former cards it was ??? */
396 #define HDSPM_version2 (1<<2)
398 #define HDSPM_wcLock (1<<3) /* Wordclock is detected and locked */
399 #define HDSPM_wcSync (1<<4) /* Wordclock is in sync with systemclock */
401 #define HDSPM_wc_freq0 (1<<5) /* input freq detected via autosync */
402 #define HDSPM_wc_freq1 (1<<6) /* 001=32, 010==44.1, 011=48, */
403 #define HDSPM_wc_freq2 (1<<7) /* 100=64, 101=88.2, 110=96, */
404 /* missing Bit for 111=128, 1000=176.4, 1001=192 */
406 #define HDSPM_SyncRef0 0x10000 /* Sync Reference */
407 #define HDSPM_SyncRef1 0x20000
409 #define HDSPM_SelSyncRef0 (1<<8) /* AutoSync Source */
410 #define HDSPM_SelSyncRef1 (1<<9) /* 000=word, 001=MADI, */
411 #define HDSPM_SelSyncRef2 (1<<10) /* 111=no valid signal */
413 #define HDSPM_wc_valid (HDSPM_wcLock|HDSPM_wcSync)
415 #define HDSPM_wcFreqMask (HDSPM_wc_freq0|HDSPM_wc_freq1|HDSPM_wc_freq2)
416 #define HDSPM_wcFreq32 (HDSPM_wc_freq0)
417 #define HDSPM_wcFreq44_1 (HDSPM_wc_freq1)
418 #define HDSPM_wcFreq48 (HDSPM_wc_freq0|HDSPM_wc_freq1)
419 #define HDSPM_wcFreq64 (HDSPM_wc_freq2)
420 #define HDSPM_wcFreq88_2 (HDSPM_wc_freq0|HDSPM_wc_freq2)
421 #define HDSPM_wcFreq96 (HDSPM_wc_freq1|HDSPM_wc_freq2)
423 #define HDSPM_status1_F_0 0x0400000
424 #define HDSPM_status1_F_1 0x0800000
425 #define HDSPM_status1_F_2 0x1000000
426 #define HDSPM_status1_F_3 0x2000000
427 #define HDSPM_status1_freqMask (HDSPM_status1_F_0|HDSPM_status1_F_1|HDSPM_status1_F_2|HDSPM_status1_F_3)
430 #define HDSPM_SelSyncRefMask (HDSPM_SelSyncRef0|HDSPM_SelSyncRef1|\
431 HDSPM_SelSyncRef2)
432 #define HDSPM_SelSyncRef_WORD 0
433 #define HDSPM_SelSyncRef_MADI (HDSPM_SelSyncRef0)
434 #define HDSPM_SelSyncRef_TCO (HDSPM_SelSyncRef1)
435 #define HDSPM_SelSyncRef_SyncIn (HDSPM_SelSyncRef0|HDSPM_SelSyncRef1)
436 #define HDSPM_SelSyncRef_NVALID (HDSPM_SelSyncRef0|HDSPM_SelSyncRef1|\
437 HDSPM_SelSyncRef2)
440 For AES32, bits for status, status2 and timecode are different
442 /* status */
443 #define HDSPM_AES32_wcLock 0x0200000
444 #define HDSPM_AES32_wcFreq_bit 22
445 /* (status >> HDSPM_AES32_wcFreq_bit) & 0xF gives WC frequency (cf function
446 HDSPM_bit2freq */
447 #define HDSPM_AES32_syncref_bit 16
448 /* (status >> HDSPM_AES32_syncref_bit) & 0xF gives sync source */
450 #define HDSPM_AES32_AUTOSYNC_FROM_WORD 0
451 #define HDSPM_AES32_AUTOSYNC_FROM_AES1 1
452 #define HDSPM_AES32_AUTOSYNC_FROM_AES2 2
453 #define HDSPM_AES32_AUTOSYNC_FROM_AES3 3
454 #define HDSPM_AES32_AUTOSYNC_FROM_AES4 4
455 #define HDSPM_AES32_AUTOSYNC_FROM_AES5 5
456 #define HDSPM_AES32_AUTOSYNC_FROM_AES6 6
457 #define HDSPM_AES32_AUTOSYNC_FROM_AES7 7
458 #define HDSPM_AES32_AUTOSYNC_FROM_AES8 8
459 #define HDSPM_AES32_AUTOSYNC_FROM_NONE 9
461 /* status2 */
462 /* HDSPM_LockAES_bit is given by HDSPM_LockAES >> (AES# - 1) */
463 #define HDSPM_LockAES 0x80
464 #define HDSPM_LockAES1 0x80
465 #define HDSPM_LockAES2 0x40
466 #define HDSPM_LockAES3 0x20
467 #define HDSPM_LockAES4 0x10
468 #define HDSPM_LockAES5 0x8
469 #define HDSPM_LockAES6 0x4
470 #define HDSPM_LockAES7 0x2
471 #define HDSPM_LockAES8 0x1
473 Timecode
474 After windows driver sources, bits 4*i to 4*i+3 give the input frequency on
475 AES i+1
476 bits 3210
477 0001 32kHz
478 0010 44.1kHz
479 0011 48kHz
480 0100 64kHz
481 0101 88.2kHz
482 0110 96kHz
483 0111 128kHz
484 1000 176.4kHz
485 1001 192kHz
486 NB: Timecode register doesn't seem to work on AES32 card revision 230
489 /* Mixer Values */
490 #define UNITY_GAIN 32768 /* = 65536/2 */
491 #define MINUS_INFINITY_GAIN 0
493 /* Number of channels for different Speed Modes */
494 #define MADI_SS_CHANNELS 64
495 #define MADI_DS_CHANNELS 32
496 #define MADI_QS_CHANNELS 16
498 #define RAYDAT_SS_CHANNELS 36
499 #define RAYDAT_DS_CHANNELS 20
500 #define RAYDAT_QS_CHANNELS 12
502 #define AIO_IN_SS_CHANNELS 14
503 #define AIO_IN_DS_CHANNELS 10
504 #define AIO_IN_QS_CHANNELS 8
505 #define AIO_OUT_SS_CHANNELS 16
506 #define AIO_OUT_DS_CHANNELS 12
507 #define AIO_OUT_QS_CHANNELS 10
509 #define AES32_CHANNELS 16
511 /* the size of a substream (1 mono data stream) */
512 #define HDSPM_CHANNEL_BUFFER_SAMPLES (16*1024)
513 #define HDSPM_CHANNEL_BUFFER_BYTES (4*HDSPM_CHANNEL_BUFFER_SAMPLES)
515 /* the size of the area we need to allocate for DMA transfers. the
516 size is the same regardless of the number of channels, and
517 also the latency to use.
518 for one direction !!!
520 #define HDSPM_DMA_AREA_BYTES (HDSPM_MAX_CHANNELS * HDSPM_CHANNEL_BUFFER_BYTES)
521 #define HDSPM_DMA_AREA_KILOBYTES (HDSPM_DMA_AREA_BYTES/1024)
523 /* revisions >= 230 indicate AES32 card */
524 #define HDSPM_MADI_ANCIENT_REV 204
525 #define HDSPM_MADI_OLD_REV 207
526 #define HDSPM_MADI_REV 210
527 #define HDSPM_RAYDAT_REV 211
528 #define HDSPM_AIO_REV 212
529 #define HDSPM_MADIFACE_REV 213
530 #define HDSPM_AES_REV 240
531 #define HDSPM_AES32_REV 234
532 #define HDSPM_AES32_OLD_REV 233
534 /* speed factor modes */
535 #define HDSPM_SPEED_SINGLE 0
536 #define HDSPM_SPEED_DOUBLE 1
537 #define HDSPM_SPEED_QUAD 2
539 /* names for speed modes */
540 static char *hdspm_speed_names[] = { "single", "double", "quad" };
542 static char *texts_autosync_aes_tco[] = { "Word Clock",
543 "AES1", "AES2", "AES3", "AES4",
544 "AES5", "AES6", "AES7", "AES8",
545 "TCO" };
546 static char *texts_autosync_aes[] = { "Word Clock",
547 "AES1", "AES2", "AES3", "AES4",
548 "AES5", "AES6", "AES7", "AES8" };
549 static char *texts_autosync_madi_tco[] = { "Word Clock",
550 "MADI", "TCO", "Sync In" };
551 static char *texts_autosync_madi[] = { "Word Clock",
552 "MADI", "Sync In" };
554 static char *texts_autosync_raydat_tco[] = {
555 "Word Clock",
556 "ADAT 1", "ADAT 2", "ADAT 3", "ADAT 4",
557 "AES", "SPDIF", "TCO", "Sync In"
559 static char *texts_autosync_raydat[] = {
560 "Word Clock",
561 "ADAT 1", "ADAT 2", "ADAT 3", "ADAT 4",
562 "AES", "SPDIF", "Sync In"
564 static char *texts_autosync_aio_tco[] = {
565 "Word Clock",
566 "ADAT", "AES", "SPDIF", "TCO", "Sync In"
568 static char *texts_autosync_aio[] = { "Word Clock",
569 "ADAT", "AES", "SPDIF", "Sync In" };
571 static char *texts_freq[] = {
572 "No Lock",
573 "32 kHz",
574 "44.1 kHz",
575 "48 kHz",
576 "64 kHz",
577 "88.2 kHz",
578 "96 kHz",
579 "128 kHz",
580 "176.4 kHz",
581 "192 kHz"
584 static char *texts_ports_madi[] = {
585 "MADI.1", "MADI.2", "MADI.3", "MADI.4", "MADI.5", "MADI.6",
586 "MADI.7", "MADI.8", "MADI.9", "MADI.10", "MADI.11", "MADI.12",
587 "MADI.13", "MADI.14", "MADI.15", "MADI.16", "MADI.17", "MADI.18",
588 "MADI.19", "MADI.20", "MADI.21", "MADI.22", "MADI.23", "MADI.24",
589 "MADI.25", "MADI.26", "MADI.27", "MADI.28", "MADI.29", "MADI.30",
590 "MADI.31", "MADI.32", "MADI.33", "MADI.34", "MADI.35", "MADI.36",
591 "MADI.37", "MADI.38", "MADI.39", "MADI.40", "MADI.41", "MADI.42",
592 "MADI.43", "MADI.44", "MADI.45", "MADI.46", "MADI.47", "MADI.48",
593 "MADI.49", "MADI.50", "MADI.51", "MADI.52", "MADI.53", "MADI.54",
594 "MADI.55", "MADI.56", "MADI.57", "MADI.58", "MADI.59", "MADI.60",
595 "MADI.61", "MADI.62", "MADI.63", "MADI.64",
599 static char *texts_ports_raydat_ss[] = {
600 "ADAT1.1", "ADAT1.2", "ADAT1.3", "ADAT1.4", "ADAT1.5", "ADAT1.6",
601 "ADAT1.7", "ADAT1.8", "ADAT2.1", "ADAT2.2", "ADAT2.3", "ADAT2.4",
602 "ADAT2.5", "ADAT2.6", "ADAT2.7", "ADAT2.8", "ADAT3.1", "ADAT3.2",
603 "ADAT3.3", "ADAT3.4", "ADAT3.5", "ADAT3.6", "ADAT3.7", "ADAT3.8",
604 "ADAT4.1", "ADAT4.2", "ADAT4.3", "ADAT4.4", "ADAT4.5", "ADAT4.6",
605 "ADAT4.7", "ADAT4.8",
606 "AES.L", "AES.R",
607 "SPDIF.L", "SPDIF.R"
610 static char *texts_ports_raydat_ds[] = {
611 "ADAT1.1", "ADAT1.2", "ADAT1.3", "ADAT1.4",
612 "ADAT2.1", "ADAT2.2", "ADAT2.3", "ADAT2.4",
613 "ADAT3.1", "ADAT3.2", "ADAT3.3", "ADAT3.4",
614 "ADAT4.1", "ADAT4.2", "ADAT4.3", "ADAT4.4",
615 "AES.L", "AES.R",
616 "SPDIF.L", "SPDIF.R"
619 static char *texts_ports_raydat_qs[] = {
620 "ADAT1.1", "ADAT1.2",
621 "ADAT2.1", "ADAT2.2",
622 "ADAT3.1", "ADAT3.2",
623 "ADAT4.1", "ADAT4.2",
624 "AES.L", "AES.R",
625 "SPDIF.L", "SPDIF.R"
629 static char *texts_ports_aio_in_ss[] = {
630 "Analogue.L", "Analogue.R",
631 "AES.L", "AES.R",
632 "SPDIF.L", "SPDIF.R",
633 "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4", "ADAT.5", "ADAT.6",
634 "ADAT.7", "ADAT.8"
637 static char *texts_ports_aio_out_ss[] = {
638 "Analogue.L", "Analogue.R",
639 "AES.L", "AES.R",
640 "SPDIF.L", "SPDIF.R",
641 "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4", "ADAT.5", "ADAT.6",
642 "ADAT.7", "ADAT.8",
643 "Phone.L", "Phone.R"
646 static char *texts_ports_aio_in_ds[] = {
647 "Analogue.L", "Analogue.R",
648 "AES.L", "AES.R",
649 "SPDIF.L", "SPDIF.R",
650 "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4"
653 static char *texts_ports_aio_out_ds[] = {
654 "Analogue.L", "Analogue.R",
655 "AES.L", "AES.R",
656 "SPDIF.L", "SPDIF.R",
657 "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4",
658 "Phone.L", "Phone.R"
661 static char *texts_ports_aio_in_qs[] = {
662 "Analogue.L", "Analogue.R",
663 "AES.L", "AES.R",
664 "SPDIF.L", "SPDIF.R",
665 "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4"
668 static char *texts_ports_aio_out_qs[] = {
669 "Analogue.L", "Analogue.R",
670 "AES.L", "AES.R",
671 "SPDIF.L", "SPDIF.R",
672 "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4",
673 "Phone.L", "Phone.R"
676 static char *texts_ports_aes32[] = {
677 "AES.1", "AES.2", "AES.3", "AES.4", "AES.5", "AES.6", "AES.7",
678 "AES.8", "AES.9.", "AES.10", "AES.11", "AES.12", "AES.13", "AES.14",
679 "AES.15", "AES.16"
682 /* These tables map the ALSA channels 1..N to the channels that we
683 need to use in order to find the relevant channel buffer. RME
684 refers to this kind of mapping as between "the ADAT channel and
685 the DMA channel." We index it using the logical audio channel,
686 and the value is the DMA channel (i.e. channel buffer number)
687 where the data for that channel can be read/written from/to.
690 static char channel_map_unity_ss[HDSPM_MAX_CHANNELS] = {
691 0, 1, 2, 3, 4, 5, 6, 7,
692 8, 9, 10, 11, 12, 13, 14, 15,
693 16, 17, 18, 19, 20, 21, 22, 23,
694 24, 25, 26, 27, 28, 29, 30, 31,
695 32, 33, 34, 35, 36, 37, 38, 39,
696 40, 41, 42, 43, 44, 45, 46, 47,
697 48, 49, 50, 51, 52, 53, 54, 55,
698 56, 57, 58, 59, 60, 61, 62, 63
701 static char channel_map_raydat_ss[HDSPM_MAX_CHANNELS] = {
702 4, 5, 6, 7, 8, 9, 10, 11, /* ADAT 1 */
703 12, 13, 14, 15, 16, 17, 18, 19, /* ADAT 2 */
704 20, 21, 22, 23, 24, 25, 26, 27, /* ADAT 3 */
705 28, 29, 30, 31, 32, 33, 34, 35, /* ADAT 4 */
706 0, 1, /* AES */
707 2, 3, /* SPDIF */
708 -1, -1, -1, -1,
709 -1, -1, -1, -1, -1, -1, -1, -1,
710 -1, -1, -1, -1, -1, -1, -1, -1,
711 -1, -1, -1, -1, -1, -1, -1, -1,
714 static char channel_map_raydat_ds[HDSPM_MAX_CHANNELS] = {
715 4, 5, 6, 7, /* ADAT 1 */
716 8, 9, 10, 11, /* ADAT 2 */
717 12, 13, 14, 15, /* ADAT 3 */
718 16, 17, 18, 19, /* ADAT 4 */
719 0, 1, /* AES */
720 2, 3, /* SPDIF */
721 -1, -1, -1, -1,
722 -1, -1, -1, -1, -1, -1, -1, -1,
723 -1, -1, -1, -1, -1, -1, -1, -1,
724 -1, -1, -1, -1, -1, -1, -1, -1,
725 -1, -1, -1, -1, -1, -1, -1, -1,
726 -1, -1, -1, -1, -1, -1, -1, -1,
729 static char channel_map_raydat_qs[HDSPM_MAX_CHANNELS] = {
730 4, 5, /* ADAT 1 */
731 6, 7, /* ADAT 2 */
732 8, 9, /* ADAT 3 */
733 10, 11, /* ADAT 4 */
734 0, 1, /* AES */
735 2, 3, /* SPDIF */
736 -1, -1, -1, -1,
737 -1, -1, -1, -1, -1, -1, -1, -1,
738 -1, -1, -1, -1, -1, -1, -1, -1,
739 -1, -1, -1, -1, -1, -1, -1, -1,
740 -1, -1, -1, -1, -1, -1, -1, -1,
741 -1, -1, -1, -1, -1, -1, -1, -1,
742 -1, -1, -1, -1, -1, -1, -1, -1,
745 static char channel_map_aio_in_ss[HDSPM_MAX_CHANNELS] = {
746 0, 1, /* line in */
747 8, 9, /* aes in, */
748 10, 11, /* spdif in */
749 12, 13, 14, 15, 16, 17, 18, 19, /* ADAT in */
750 -1, -1,
751 -1, -1, -1, -1, -1, -1, -1, -1,
752 -1, -1, -1, -1, -1, -1, -1, -1,
753 -1, -1, -1, -1, -1, -1, -1, -1,
754 -1, -1, -1, -1, -1, -1, -1, -1,
755 -1, -1, -1, -1, -1, -1, -1, -1,
756 -1, -1, -1, -1, -1, -1, -1, -1,
759 static char channel_map_aio_out_ss[HDSPM_MAX_CHANNELS] = {
760 0, 1, /* line out */
761 8, 9, /* aes out */
762 10, 11, /* spdif out */
763 12, 13, 14, 15, 16, 17, 18, 19, /* ADAT out */
764 6, 7, /* phone out */
765 -1, -1, -1, -1, -1, -1, -1, -1,
766 -1, -1, -1, -1, -1, -1, -1, -1,
767 -1, -1, -1, -1, -1, -1, -1, -1,
768 -1, -1, -1, -1, -1, -1, -1, -1,
769 -1, -1, -1, -1, -1, -1, -1, -1,
770 -1, -1, -1, -1, -1, -1, -1, -1,
773 static char channel_map_aio_in_ds[HDSPM_MAX_CHANNELS] = {
774 0, 1, /* line in */
775 8, 9, /* aes in */
776 10, 11, /* spdif in */
777 12, 14, 16, 18, /* adat in */
778 -1, -1, -1, -1, -1, -1,
779 -1, -1, -1, -1, -1, -1, -1, -1,
780 -1, -1, -1, -1, -1, -1, -1, -1,
781 -1, -1, -1, -1, -1, -1, -1, -1,
782 -1, -1, -1, -1, -1, -1, -1, -1,
783 -1, -1, -1, -1, -1, -1, -1, -1,
784 -1, -1, -1, -1, -1, -1, -1, -1
787 static char channel_map_aio_out_ds[HDSPM_MAX_CHANNELS] = {
788 0, 1, /* line out */
789 8, 9, /* aes out */
790 10, 11, /* spdif out */
791 12, 14, 16, 18, /* adat out */
792 6, 7, /* phone out */
793 -1, -1, -1, -1,
794 -1, -1, -1, -1, -1, -1, -1, -1,
795 -1, -1, -1, -1, -1, -1, -1, -1,
796 -1, -1, -1, -1, -1, -1, -1, -1,
797 -1, -1, -1, -1, -1, -1, -1, -1,
798 -1, -1, -1, -1, -1, -1, -1, -1,
799 -1, -1, -1, -1, -1, -1, -1, -1
802 static char channel_map_aio_in_qs[HDSPM_MAX_CHANNELS] = {
803 0, 1, /* line in */
804 8, 9, /* aes in */
805 10, 11, /* spdif in */
806 12, 16, /* adat in */
807 -1, -1, -1, -1, -1, -1, -1, -1,
808 -1, -1, -1, -1, -1, -1, -1, -1,
809 -1, -1, -1, -1, -1, -1, -1, -1,
810 -1, -1, -1, -1, -1, -1, -1, -1,
811 -1, -1, -1, -1, -1, -1, -1, -1,
812 -1, -1, -1, -1, -1, -1, -1, -1,
813 -1, -1, -1, -1, -1, -1, -1, -1
816 static char channel_map_aio_out_qs[HDSPM_MAX_CHANNELS] = {
817 0, 1, /* line out */
818 8, 9, /* aes out */
819 10, 11, /* spdif out */
820 12, 16, /* adat out */
821 6, 7, /* phone out */
822 -1, -1, -1, -1, -1, -1,
823 -1, -1, -1, -1, -1, -1, -1, -1,
824 -1, -1, -1, -1, -1, -1, -1, -1,
825 -1, -1, -1, -1, -1, -1, -1, -1,
826 -1, -1, -1, -1, -1, -1, -1, -1,
827 -1, -1, -1, -1, -1, -1, -1, -1,
828 -1, -1, -1, -1, -1, -1, -1, -1
831 static char channel_map_aes32[HDSPM_MAX_CHANNELS] = {
832 0, 1, 2, 3, 4, 5, 6, 7,
833 8, 9, 10, 11, 12, 13, 14, 15,
834 -1, -1, -1, -1, -1, -1, -1, -1,
835 -1, -1, -1, -1, -1, -1, -1, -1,
836 -1, -1, -1, -1, -1, -1, -1, -1,
837 -1, -1, -1, -1, -1, -1, -1, -1,
838 -1, -1, -1, -1, -1, -1, -1, -1,
839 -1, -1, -1, -1, -1, -1, -1, -1
842 struct hdspm_midi {
843 struct hdspm *hdspm;
844 int id;
845 struct snd_rawmidi *rmidi;
846 struct snd_rawmidi_substream *input;
847 struct snd_rawmidi_substream *output;
848 char istimer; /* timer in use */
849 struct timer_list timer;
850 spinlock_t lock;
851 int pending;
852 int dataIn;
853 int statusIn;
854 int dataOut;
855 int statusOut;
856 int ie;
857 int irq;
860 struct hdspm_tco {
861 int input;
862 int framerate;
863 int wordclock;
864 int samplerate;
865 int pull;
866 int term; /* 0 = off, 1 = on */
869 struct hdspm {
870 spinlock_t lock;
871 /* only one playback and/or capture stream */
872 struct snd_pcm_substream *capture_substream;
873 struct snd_pcm_substream *playback_substream;
875 char *card_name; /* for procinfo */
876 unsigned short firmware_rev; /* dont know if relevant (yes if AES32)*/
878 uint8_t io_type;
880 int monitor_outs; /* set up monitoring outs init flag */
882 u32 control_register; /* cached value */
883 u32 control2_register; /* cached value */
884 u32 settings_register;
886 struct hdspm_midi midi[4];
887 struct tasklet_struct midi_tasklet;
889 size_t period_bytes;
890 unsigned char ss_in_channels;
891 unsigned char ds_in_channels;
892 unsigned char qs_in_channels;
893 unsigned char ss_out_channels;
894 unsigned char ds_out_channels;
895 unsigned char qs_out_channels;
897 unsigned char max_channels_in;
898 unsigned char max_channels_out;
900 signed char *channel_map_in;
901 signed char *channel_map_out;
903 signed char *channel_map_in_ss, *channel_map_in_ds, *channel_map_in_qs;
904 signed char *channel_map_out_ss, *channel_map_out_ds, *channel_map_out_qs;
906 char **port_names_in;
907 char **port_names_out;
909 char **port_names_in_ss, **port_names_in_ds, **port_names_in_qs;
910 char **port_names_out_ss, **port_names_out_ds, **port_names_out_qs;
912 unsigned char *playback_buffer; /* suitably aligned address */
913 unsigned char *capture_buffer; /* suitably aligned address */
915 pid_t capture_pid; /* process id which uses capture */
916 pid_t playback_pid; /* process id which uses capture */
917 int running; /* running status */
919 int last_external_sample_rate; /* samplerate mystic ... */
920 int last_internal_sample_rate;
921 int system_sample_rate;
923 int dev; /* Hardware vars... */
924 int irq;
925 unsigned long port;
926 void __iomem *iobase;
928 int irq_count; /* for debug */
929 int midiPorts;
931 struct snd_card *card; /* one card */
932 struct snd_pcm *pcm; /* has one pcm */
933 struct snd_hwdep *hwdep; /* and a hwdep for additional ioctl */
934 struct pci_dev *pci; /* and an pci info */
936 /* Mixer vars */
937 /* fast alsa mixer */
938 struct snd_kcontrol *playback_mixer_ctls[HDSPM_MAX_CHANNELS];
939 /* but input to much, so not used */
940 struct snd_kcontrol *input_mixer_ctls[HDSPM_MAX_CHANNELS];
941 /* full mixer accessible over mixer ioctl or hwdep-device */
942 struct hdspm_mixer *mixer;
944 struct hdspm_tco *tco; /* NULL if no TCO detected */
946 char **texts_autosync;
947 int texts_autosync_items;
949 cycles_t last_interrupt;
951 struct hdspm_peak_rms peak_rms;
955 static DEFINE_PCI_DEVICE_TABLE(snd_hdspm_ids) = {
957 .vendor = PCI_VENDOR_ID_XILINX,
958 .device = PCI_DEVICE_ID_XILINX_HAMMERFALL_DSP_MADI,
959 .subvendor = PCI_ANY_ID,
960 .subdevice = PCI_ANY_ID,
961 .class = 0,
962 .class_mask = 0,
963 .driver_data = 0},
964 {0,}
967 MODULE_DEVICE_TABLE(pci, snd_hdspm_ids);
969 /* prototypes */
970 static int __devinit snd_hdspm_create_alsa_devices(struct snd_card *card,
971 struct hdspm * hdspm);
972 static int __devinit snd_hdspm_create_pcm(struct snd_card *card,
973 struct hdspm * hdspm);
975 static inline void snd_hdspm_initialize_midi_flush(struct hdspm *hdspm);
976 static int hdspm_update_simple_mixer_controls(struct hdspm *hdspm);
977 static int hdspm_autosync_ref(struct hdspm *hdspm);
978 static int snd_hdspm_set_defaults(struct hdspm *hdspm);
979 static void hdspm_set_sgbuf(struct hdspm *hdspm,
980 struct snd_pcm_substream *substream,
981 unsigned int reg, int channels);
983 static inline int HDSPM_bit2freq(int n)
985 static const int bit2freq_tab[] = {
986 0, 32000, 44100, 48000, 64000, 88200,
987 96000, 128000, 176400, 192000 };
988 if (n < 1 || n > 9)
989 return 0;
990 return bit2freq_tab[n];
993 /* Write/read to/from HDSPM with Adresses in Bytes
994 not words but only 32Bit writes are allowed */
996 static inline void hdspm_write(struct hdspm * hdspm, unsigned int reg,
997 unsigned int val)
999 writel(val, hdspm->iobase + reg);
1002 static inline unsigned int hdspm_read(struct hdspm * hdspm, unsigned int reg)
1004 return readl(hdspm->iobase + reg);
1007 /* for each output channel (chan) I have an Input (in) and Playback (pb) Fader
1008 mixer is write only on hardware so we have to cache him for read
1009 each fader is a u32, but uses only the first 16 bit */
1011 static inline int hdspm_read_in_gain(struct hdspm * hdspm, unsigned int chan,
1012 unsigned int in)
1014 if (chan >= HDSPM_MIXER_CHANNELS || in >= HDSPM_MIXER_CHANNELS)
1015 return 0;
1017 return hdspm->mixer->ch[chan].in[in];
1020 static inline int hdspm_read_pb_gain(struct hdspm * hdspm, unsigned int chan,
1021 unsigned int pb)
1023 if (chan >= HDSPM_MIXER_CHANNELS || pb >= HDSPM_MIXER_CHANNELS)
1024 return 0;
1025 return hdspm->mixer->ch[chan].pb[pb];
1028 static int hdspm_write_in_gain(struct hdspm *hdspm, unsigned int chan,
1029 unsigned int in, unsigned short data)
1031 if (chan >= HDSPM_MIXER_CHANNELS || in >= HDSPM_MIXER_CHANNELS)
1032 return -1;
1034 hdspm_write(hdspm,
1035 HDSPM_MADI_mixerBase +
1036 ((in + 128 * chan) * sizeof(u32)),
1037 (hdspm->mixer->ch[chan].in[in] = data & 0xFFFF));
1038 return 0;
1041 static int hdspm_write_pb_gain(struct hdspm *hdspm, unsigned int chan,
1042 unsigned int pb, unsigned short data)
1044 if (chan >= HDSPM_MIXER_CHANNELS || pb >= HDSPM_MIXER_CHANNELS)
1045 return -1;
1047 hdspm_write(hdspm,
1048 HDSPM_MADI_mixerBase +
1049 ((64 + pb + 128 * chan) * sizeof(u32)),
1050 (hdspm->mixer->ch[chan].pb[pb] = data & 0xFFFF));
1051 return 0;
1055 /* enable DMA for specific channels, now available for DSP-MADI */
1056 static inline void snd_hdspm_enable_in(struct hdspm * hdspm, int i, int v)
1058 hdspm_write(hdspm, HDSPM_inputEnableBase + (4 * i), v);
1061 static inline void snd_hdspm_enable_out(struct hdspm * hdspm, int i, int v)
1063 hdspm_write(hdspm, HDSPM_outputEnableBase + (4 * i), v);
1066 /* check if same process is writing and reading */
1067 static int snd_hdspm_use_is_exclusive(struct hdspm *hdspm)
1069 unsigned long flags;
1070 int ret = 1;
1072 spin_lock_irqsave(&hdspm->lock, flags);
1073 if ((hdspm->playback_pid != hdspm->capture_pid) &&
1074 (hdspm->playback_pid >= 0) && (hdspm->capture_pid >= 0)) {
1075 ret = 0;
1077 spin_unlock_irqrestore(&hdspm->lock, flags);
1078 return ret;
1081 /* check for external sample rate */
1082 static int hdspm_external_sample_rate(struct hdspm *hdspm)
1084 unsigned int status, status2, timecode;
1085 int syncref, rate = 0, rate_bits;
1087 switch (hdspm->io_type) {
1088 case AES32:
1089 status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
1090 status = hdspm_read(hdspm, HDSPM_statusRegister);
1091 timecode = hdspm_read(hdspm, HDSPM_timecodeRegister);
1093 syncref = hdspm_autosync_ref(hdspm);
1095 if (syncref == HDSPM_AES32_AUTOSYNC_FROM_WORD &&
1096 status & HDSPM_AES32_wcLock)
1097 return HDSPM_bit2freq((status >> HDSPM_AES32_wcFreq_bit) & 0xF);
1099 if (syncref >= HDSPM_AES32_AUTOSYNC_FROM_AES1 &&
1100 syncref <= HDSPM_AES32_AUTOSYNC_FROM_AES8 &&
1101 status2 & (HDSPM_LockAES >>
1102 (syncref - HDSPM_AES32_AUTOSYNC_FROM_AES1)))
1103 return HDSPM_bit2freq((timecode >> (4*(syncref-HDSPM_AES32_AUTOSYNC_FROM_AES1))) & 0xF);
1104 return 0;
1105 break;
1107 case MADIface:
1108 status = hdspm_read(hdspm, HDSPM_statusRegister);
1110 if (!(status & HDSPM_madiLock)) {
1111 rate = 0; /* no lock */
1112 } else {
1113 switch (status & (HDSPM_status1_freqMask)) {
1114 case HDSPM_status1_F_0*1:
1115 rate = 32000; break;
1116 case HDSPM_status1_F_0*2:
1117 rate = 44100; break;
1118 case HDSPM_status1_F_0*3:
1119 rate = 48000; break;
1120 case HDSPM_status1_F_0*4:
1121 rate = 64000; break;
1122 case HDSPM_status1_F_0*5:
1123 rate = 88200; break;
1124 case HDSPM_status1_F_0*6:
1125 rate = 96000; break;
1126 case HDSPM_status1_F_0*7:
1127 rate = 128000; break;
1128 case HDSPM_status1_F_0*8:
1129 rate = 176400; break;
1130 case HDSPM_status1_F_0*9:
1131 rate = 192000; break;
1132 default:
1133 rate = 0; break;
1137 break;
1139 case MADI:
1140 case AIO:
1141 case RayDAT:
1142 status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
1143 status = hdspm_read(hdspm, HDSPM_statusRegister);
1144 rate = 0;
1146 /* if wordclock has synced freq and wordclock is valid */
1147 if ((status2 & HDSPM_wcLock) != 0 &&
1148 (status2 & HDSPM_SelSyncRef0) == 0) {
1150 rate_bits = status2 & HDSPM_wcFreqMask;
1153 switch (rate_bits) {
1154 case HDSPM_wcFreq32:
1155 rate = 32000;
1156 break;
1157 case HDSPM_wcFreq44_1:
1158 rate = 44100;
1159 break;
1160 case HDSPM_wcFreq48:
1161 rate = 48000;
1162 break;
1163 case HDSPM_wcFreq64:
1164 rate = 64000;
1165 break;
1166 case HDSPM_wcFreq88_2:
1167 rate = 88200;
1168 break;
1169 case HDSPM_wcFreq96:
1170 rate = 96000;
1171 break;
1172 default:
1173 rate = 0;
1174 break;
1178 /* if rate detected and Syncref is Word than have it,
1179 * word has priority to MADI
1181 if (rate != 0 &&
1182 (status2 & HDSPM_SelSyncRefMask) == HDSPM_SelSyncRef_WORD)
1183 return rate;
1185 /* maybe a madi input (which is taken if sel sync is madi) */
1186 if (status & HDSPM_madiLock) {
1187 rate_bits = status & HDSPM_madiFreqMask;
1189 switch (rate_bits) {
1190 case HDSPM_madiFreq32:
1191 rate = 32000;
1192 break;
1193 case HDSPM_madiFreq44_1:
1194 rate = 44100;
1195 break;
1196 case HDSPM_madiFreq48:
1197 rate = 48000;
1198 break;
1199 case HDSPM_madiFreq64:
1200 rate = 64000;
1201 break;
1202 case HDSPM_madiFreq88_2:
1203 rate = 88200;
1204 break;
1205 case HDSPM_madiFreq96:
1206 rate = 96000;
1207 break;
1208 case HDSPM_madiFreq128:
1209 rate = 128000;
1210 break;
1211 case HDSPM_madiFreq176_4:
1212 rate = 176400;
1213 break;
1214 case HDSPM_madiFreq192:
1215 rate = 192000;
1216 break;
1217 default:
1218 rate = 0;
1219 break;
1222 /* QS and DS rates normally can not be detected
1223 * automatically by the card. Only exception is MADI
1224 * in 96k frame mode.
1226 * So if we read SS values (32 .. 48k), check for
1227 * user-provided DS/QS bits in the control register
1228 * and multiply the base frequency accordingly.
1230 if (rate <= 48000) {
1231 if (hdspm->control_register & HDSPM_QuadSpeed)
1232 rate *= 4;
1233 else if (hdspm->control_register &
1234 HDSPM_DoubleSpeed)
1235 rate *= 2;
1238 break;
1241 return rate;
1244 /* Latency function */
1245 static inline void hdspm_compute_period_size(struct hdspm *hdspm)
1247 hdspm->period_bytes = 1 << ((hdspm_decode_latency(hdspm->control_register) + 8));
1251 static snd_pcm_uframes_t hdspm_hw_pointer(struct hdspm *hdspm)
1253 int position;
1255 position = hdspm_read(hdspm, HDSPM_statusRegister);
1257 switch (hdspm->io_type) {
1258 case RayDAT:
1259 case AIO:
1260 position &= HDSPM_BufferPositionMask;
1261 position /= 4; /* Bytes per sample */
1262 break;
1263 default:
1264 position = (position & HDSPM_BufferID) ?
1265 (hdspm->period_bytes / 4) : 0;
1268 return position;
1272 static inline void hdspm_start_audio(struct hdspm * s)
1274 s->control_register |= (HDSPM_AudioInterruptEnable | HDSPM_Start);
1275 hdspm_write(s, HDSPM_controlRegister, s->control_register);
1278 static inline void hdspm_stop_audio(struct hdspm * s)
1280 s->control_register &= ~(HDSPM_Start | HDSPM_AudioInterruptEnable);
1281 hdspm_write(s, HDSPM_controlRegister, s->control_register);
1284 /* should I silence all or only opened ones ? doit all for first even is 4MB*/
1285 static void hdspm_silence_playback(struct hdspm *hdspm)
1287 int i;
1288 int n = hdspm->period_bytes;
1289 void *buf = hdspm->playback_buffer;
1291 if (buf == NULL)
1292 return;
1294 for (i = 0; i < HDSPM_MAX_CHANNELS; i++) {
1295 memset(buf, 0, n);
1296 buf += HDSPM_CHANNEL_BUFFER_BYTES;
1300 static int hdspm_set_interrupt_interval(struct hdspm *s, unsigned int frames)
1302 int n;
1304 spin_lock_irq(&s->lock);
1306 frames >>= 7;
1307 n = 0;
1308 while (frames) {
1309 n++;
1310 frames >>= 1;
1312 s->control_register &= ~HDSPM_LatencyMask;
1313 s->control_register |= hdspm_encode_latency(n);
1315 hdspm_write(s, HDSPM_controlRegister, s->control_register);
1317 hdspm_compute_period_size(s);
1319 spin_unlock_irq(&s->lock);
1321 return 0;
1324 static u64 hdspm_calc_dds_value(struct hdspm *hdspm, u64 period)
1326 u64 freq_const;
1328 if (period == 0)
1329 return 0;
1331 switch (hdspm->io_type) {
1332 case MADI:
1333 case AES32:
1334 freq_const = 110069313433624ULL;
1335 break;
1336 case RayDAT:
1337 case AIO:
1338 freq_const = 104857600000000ULL;
1339 break;
1340 case MADIface:
1341 freq_const = 131072000000000ULL;
1342 break;
1343 default:
1344 snd_BUG();
1345 return 0;
1348 return div_u64(freq_const, period);
1352 static void hdspm_set_dds_value(struct hdspm *hdspm, int rate)
1354 u64 n;
1356 if (rate >= 112000)
1357 rate /= 4;
1358 else if (rate >= 56000)
1359 rate /= 2;
1361 switch (hdspm->io_type) {
1362 case MADIface:
1363 n = 131072000000000ULL; /* 125 MHz */
1364 break;
1365 case MADI:
1366 case AES32:
1367 n = 110069313433624ULL; /* 105 MHz */
1368 break;
1369 case RayDAT:
1370 case AIO:
1371 n = 104857600000000ULL; /* 100 MHz */
1372 break;
1373 default:
1374 snd_BUG();
1375 return;
1378 n = div_u64(n, rate);
1379 /* n should be less than 2^32 for being written to FREQ register */
1380 snd_BUG_ON(n >> 32);
1381 hdspm_write(hdspm, HDSPM_freqReg, (u32)n);
1384 /* dummy set rate lets see what happens */
1385 static int hdspm_set_rate(struct hdspm * hdspm, int rate, int called_internally)
1387 int current_rate;
1388 int rate_bits;
1389 int not_set = 0;
1390 int current_speed, target_speed;
1392 /* ASSUMPTION: hdspm->lock is either set, or there is no need for
1393 it (e.g. during module initialization).
1396 if (!(hdspm->control_register & HDSPM_ClockModeMaster)) {
1398 /* SLAVE --- */
1399 if (called_internally) {
1401 /* request from ctl or card initialization
1402 just make a warning an remember setting
1403 for future master mode switching */
1405 snd_printk(KERN_WARNING "HDSPM: "
1406 "Warning: device is not running "
1407 "as a clock master.\n");
1408 not_set = 1;
1409 } else {
1411 /* hw_param request while in AutoSync mode */
1412 int external_freq =
1413 hdspm_external_sample_rate(hdspm);
1415 if (hdspm_autosync_ref(hdspm) ==
1416 HDSPM_AUTOSYNC_FROM_NONE) {
1418 snd_printk(KERN_WARNING "HDSPM: "
1419 "Detected no Externel Sync \n");
1420 not_set = 1;
1422 } else if (rate != external_freq) {
1424 snd_printk(KERN_WARNING "HDSPM: "
1425 "Warning: No AutoSync source for "
1426 "requested rate\n");
1427 not_set = 1;
1432 current_rate = hdspm->system_sample_rate;
1434 /* Changing between Singe, Double and Quad speed is not
1435 allowed if any substreams are open. This is because such a change
1436 causes a shift in the location of the DMA buffers and a reduction
1437 in the number of available buffers.
1439 Note that a similar but essentially insoluble problem exists for
1440 externally-driven rate changes. All we can do is to flag rate
1441 changes in the read/write routines.
1444 if (current_rate <= 48000)
1445 current_speed = HDSPM_SPEED_SINGLE;
1446 else if (current_rate <= 96000)
1447 current_speed = HDSPM_SPEED_DOUBLE;
1448 else
1449 current_speed = HDSPM_SPEED_QUAD;
1451 if (rate <= 48000)
1452 target_speed = HDSPM_SPEED_SINGLE;
1453 else if (rate <= 96000)
1454 target_speed = HDSPM_SPEED_DOUBLE;
1455 else
1456 target_speed = HDSPM_SPEED_QUAD;
1458 switch (rate) {
1459 case 32000:
1460 rate_bits = HDSPM_Frequency32KHz;
1461 break;
1462 case 44100:
1463 rate_bits = HDSPM_Frequency44_1KHz;
1464 break;
1465 case 48000:
1466 rate_bits = HDSPM_Frequency48KHz;
1467 break;
1468 case 64000:
1469 rate_bits = HDSPM_Frequency64KHz;
1470 break;
1471 case 88200:
1472 rate_bits = HDSPM_Frequency88_2KHz;
1473 break;
1474 case 96000:
1475 rate_bits = HDSPM_Frequency96KHz;
1476 break;
1477 case 128000:
1478 rate_bits = HDSPM_Frequency128KHz;
1479 break;
1480 case 176400:
1481 rate_bits = HDSPM_Frequency176_4KHz;
1482 break;
1483 case 192000:
1484 rate_bits = HDSPM_Frequency192KHz;
1485 break;
1486 default:
1487 return -EINVAL;
1490 if (current_speed != target_speed
1491 && (hdspm->capture_pid >= 0 || hdspm->playback_pid >= 0)) {
1492 snd_printk
1493 (KERN_ERR "HDSPM: "
1494 "cannot change from %s speed to %s speed mode "
1495 "(capture PID = %d, playback PID = %d)\n",
1496 hdspm_speed_names[current_speed],
1497 hdspm_speed_names[target_speed],
1498 hdspm->capture_pid, hdspm->playback_pid);
1499 return -EBUSY;
1502 hdspm->control_register &= ~HDSPM_FrequencyMask;
1503 hdspm->control_register |= rate_bits;
1504 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
1506 /* For AES32, need to set DDS value in FREQ register
1507 For MADI, also apparently */
1508 hdspm_set_dds_value(hdspm, rate);
1510 if (AES32 == hdspm->io_type && rate != current_rate)
1511 hdspm_write(hdspm, HDSPM_eeprom_wr, 0);
1513 hdspm->system_sample_rate = rate;
1515 if (rate <= 48000) {
1516 hdspm->channel_map_in = hdspm->channel_map_in_ss;
1517 hdspm->channel_map_out = hdspm->channel_map_out_ss;
1518 hdspm->max_channels_in = hdspm->ss_in_channels;
1519 hdspm->max_channels_out = hdspm->ss_out_channels;
1520 hdspm->port_names_in = hdspm->port_names_in_ss;
1521 hdspm->port_names_out = hdspm->port_names_out_ss;
1522 } else if (rate <= 96000) {
1523 hdspm->channel_map_in = hdspm->channel_map_in_ds;
1524 hdspm->channel_map_out = hdspm->channel_map_out_ds;
1525 hdspm->max_channels_in = hdspm->ds_in_channels;
1526 hdspm->max_channels_out = hdspm->ds_out_channels;
1527 hdspm->port_names_in = hdspm->port_names_in_ds;
1528 hdspm->port_names_out = hdspm->port_names_out_ds;
1529 } else {
1530 hdspm->channel_map_in = hdspm->channel_map_in_qs;
1531 hdspm->channel_map_out = hdspm->channel_map_out_qs;
1532 hdspm->max_channels_in = hdspm->qs_in_channels;
1533 hdspm->max_channels_out = hdspm->qs_out_channels;
1534 hdspm->port_names_in = hdspm->port_names_in_qs;
1535 hdspm->port_names_out = hdspm->port_names_out_qs;
1538 if (not_set != 0)
1539 return -1;
1541 return 0;
1544 /* mainly for init to 0 on load */
1545 static void all_in_all_mixer(struct hdspm * hdspm, int sgain)
1547 int i, j;
1548 unsigned int gain;
1550 if (sgain > UNITY_GAIN)
1551 gain = UNITY_GAIN;
1552 else if (sgain < 0)
1553 gain = 0;
1554 else
1555 gain = sgain;
1557 for (i = 0; i < HDSPM_MIXER_CHANNELS; i++)
1558 for (j = 0; j < HDSPM_MIXER_CHANNELS; j++) {
1559 hdspm_write_in_gain(hdspm, i, j, gain);
1560 hdspm_write_pb_gain(hdspm, i, j, gain);
1564 /*----------------------------------------------------------------------------
1565 MIDI
1566 ----------------------------------------------------------------------------*/
1568 static inline unsigned char snd_hdspm_midi_read_byte (struct hdspm *hdspm,
1569 int id)
1571 /* the hardware already does the relevant bit-mask with 0xff */
1572 return hdspm_read(hdspm, hdspm->midi[id].dataIn);
1575 static inline void snd_hdspm_midi_write_byte (struct hdspm *hdspm, int id,
1576 int val)
1578 /* the hardware already does the relevant bit-mask with 0xff */
1579 return hdspm_write(hdspm, hdspm->midi[id].dataOut, val);
1582 static inline int snd_hdspm_midi_input_available (struct hdspm *hdspm, int id)
1584 return hdspm_read(hdspm, hdspm->midi[id].statusIn) & 0xFF;
1587 static inline int snd_hdspm_midi_output_possible (struct hdspm *hdspm, int id)
1589 int fifo_bytes_used;
1591 fifo_bytes_used = hdspm_read(hdspm, hdspm->midi[id].statusOut) & 0xFF;
1593 if (fifo_bytes_used < 128)
1594 return 128 - fifo_bytes_used;
1595 else
1596 return 0;
1599 static void snd_hdspm_flush_midi_input(struct hdspm *hdspm, int id)
1601 while (snd_hdspm_midi_input_available (hdspm, id))
1602 snd_hdspm_midi_read_byte (hdspm, id);
1605 static int snd_hdspm_midi_output_write (struct hdspm_midi *hmidi)
1607 unsigned long flags;
1608 int n_pending;
1609 int to_write;
1610 int i;
1611 unsigned char buf[128];
1613 /* Output is not interrupt driven */
1615 spin_lock_irqsave (&hmidi->lock, flags);
1616 if (hmidi->output &&
1617 !snd_rawmidi_transmit_empty (hmidi->output)) {
1618 n_pending = snd_hdspm_midi_output_possible (hmidi->hdspm,
1619 hmidi->id);
1620 if (n_pending > 0) {
1621 if (n_pending > (int)sizeof (buf))
1622 n_pending = sizeof (buf);
1624 to_write = snd_rawmidi_transmit (hmidi->output, buf,
1625 n_pending);
1626 if (to_write > 0) {
1627 for (i = 0; i < to_write; ++i)
1628 snd_hdspm_midi_write_byte (hmidi->hdspm,
1629 hmidi->id,
1630 buf[i]);
1634 spin_unlock_irqrestore (&hmidi->lock, flags);
1635 return 0;
1638 static int snd_hdspm_midi_input_read (struct hdspm_midi *hmidi)
1640 unsigned char buf[128]; /* this buffer is designed to match the MIDI
1641 * input FIFO size
1643 unsigned long flags;
1644 int n_pending;
1645 int i;
1647 spin_lock_irqsave (&hmidi->lock, flags);
1648 n_pending = snd_hdspm_midi_input_available (hmidi->hdspm, hmidi->id);
1649 if (n_pending > 0) {
1650 if (hmidi->input) {
1651 if (n_pending > (int)sizeof (buf))
1652 n_pending = sizeof (buf);
1653 for (i = 0; i < n_pending; ++i)
1654 buf[i] = snd_hdspm_midi_read_byte (hmidi->hdspm,
1655 hmidi->id);
1656 if (n_pending)
1657 snd_rawmidi_receive (hmidi->input, buf,
1658 n_pending);
1659 } else {
1660 /* flush the MIDI input FIFO */
1661 while (n_pending--)
1662 snd_hdspm_midi_read_byte (hmidi->hdspm,
1663 hmidi->id);
1666 hmidi->pending = 0;
1667 spin_unlock_irqrestore(&hmidi->lock, flags);
1669 spin_lock_irqsave(&hmidi->hdspm->lock, flags);
1670 hmidi->hdspm->control_register |= hmidi->ie;
1671 hdspm_write(hmidi->hdspm, HDSPM_controlRegister,
1672 hmidi->hdspm->control_register);
1673 spin_unlock_irqrestore(&hmidi->hdspm->lock, flags);
1675 return snd_hdspm_midi_output_write (hmidi);
1678 static void
1679 snd_hdspm_midi_input_trigger(struct snd_rawmidi_substream *substream, int up)
1681 struct hdspm *hdspm;
1682 struct hdspm_midi *hmidi;
1683 unsigned long flags;
1685 hmidi = substream->rmidi->private_data;
1686 hdspm = hmidi->hdspm;
1688 spin_lock_irqsave (&hdspm->lock, flags);
1689 if (up) {
1690 if (!(hdspm->control_register & hmidi->ie)) {
1691 snd_hdspm_flush_midi_input (hdspm, hmidi->id);
1692 hdspm->control_register |= hmidi->ie;
1694 } else {
1695 hdspm->control_register &= ~hmidi->ie;
1698 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
1699 spin_unlock_irqrestore (&hdspm->lock, flags);
1702 static void snd_hdspm_midi_output_timer(unsigned long data)
1704 struct hdspm_midi *hmidi = (struct hdspm_midi *) data;
1705 unsigned long flags;
1707 snd_hdspm_midi_output_write(hmidi);
1708 spin_lock_irqsave (&hmidi->lock, flags);
1710 /* this does not bump hmidi->istimer, because the
1711 kernel automatically removed the timer when it
1712 expired, and we are now adding it back, thus
1713 leaving istimer wherever it was set before.
1716 if (hmidi->istimer) {
1717 hmidi->timer.expires = 1 + jiffies;
1718 add_timer(&hmidi->timer);
1721 spin_unlock_irqrestore (&hmidi->lock, flags);
1724 static void
1725 snd_hdspm_midi_output_trigger(struct snd_rawmidi_substream *substream, int up)
1727 struct hdspm_midi *hmidi;
1728 unsigned long flags;
1730 hmidi = substream->rmidi->private_data;
1731 spin_lock_irqsave (&hmidi->lock, flags);
1732 if (up) {
1733 if (!hmidi->istimer) {
1734 init_timer(&hmidi->timer);
1735 hmidi->timer.function = snd_hdspm_midi_output_timer;
1736 hmidi->timer.data = (unsigned long) hmidi;
1737 hmidi->timer.expires = 1 + jiffies;
1738 add_timer(&hmidi->timer);
1739 hmidi->istimer++;
1741 } else {
1742 if (hmidi->istimer && --hmidi->istimer <= 0)
1743 del_timer (&hmidi->timer);
1745 spin_unlock_irqrestore (&hmidi->lock, flags);
1746 if (up)
1747 snd_hdspm_midi_output_write(hmidi);
1750 static int snd_hdspm_midi_input_open(struct snd_rawmidi_substream *substream)
1752 struct hdspm_midi *hmidi;
1754 hmidi = substream->rmidi->private_data;
1755 spin_lock_irq (&hmidi->lock);
1756 snd_hdspm_flush_midi_input (hmidi->hdspm, hmidi->id);
1757 hmidi->input = substream;
1758 spin_unlock_irq (&hmidi->lock);
1760 return 0;
1763 static int snd_hdspm_midi_output_open(struct snd_rawmidi_substream *substream)
1765 struct hdspm_midi *hmidi;
1767 hmidi = substream->rmidi->private_data;
1768 spin_lock_irq (&hmidi->lock);
1769 hmidi->output = substream;
1770 spin_unlock_irq (&hmidi->lock);
1772 return 0;
1775 static int snd_hdspm_midi_input_close(struct snd_rawmidi_substream *substream)
1777 struct hdspm_midi *hmidi;
1779 snd_hdspm_midi_input_trigger (substream, 0);
1781 hmidi = substream->rmidi->private_data;
1782 spin_lock_irq (&hmidi->lock);
1783 hmidi->input = NULL;
1784 spin_unlock_irq (&hmidi->lock);
1786 return 0;
1789 static int snd_hdspm_midi_output_close(struct snd_rawmidi_substream *substream)
1791 struct hdspm_midi *hmidi;
1793 snd_hdspm_midi_output_trigger (substream, 0);
1795 hmidi = substream->rmidi->private_data;
1796 spin_lock_irq (&hmidi->lock);
1797 hmidi->output = NULL;
1798 spin_unlock_irq (&hmidi->lock);
1800 return 0;
1803 static struct snd_rawmidi_ops snd_hdspm_midi_output =
1805 .open = snd_hdspm_midi_output_open,
1806 .close = snd_hdspm_midi_output_close,
1807 .trigger = snd_hdspm_midi_output_trigger,
1810 static struct snd_rawmidi_ops snd_hdspm_midi_input =
1812 .open = snd_hdspm_midi_input_open,
1813 .close = snd_hdspm_midi_input_close,
1814 .trigger = snd_hdspm_midi_input_trigger,
1817 static int __devinit snd_hdspm_create_midi (struct snd_card *card,
1818 struct hdspm *hdspm, int id)
1820 int err;
1821 char buf[32];
1823 hdspm->midi[id].id = id;
1824 hdspm->midi[id].hdspm = hdspm;
1825 spin_lock_init (&hdspm->midi[id].lock);
1827 if (0 == id) {
1828 if (MADIface == hdspm->io_type) {
1829 /* MIDI-over-MADI on HDSPe MADIface */
1830 hdspm->midi[0].dataIn = HDSPM_midiDataIn2;
1831 hdspm->midi[0].statusIn = HDSPM_midiStatusIn2;
1832 hdspm->midi[0].dataOut = HDSPM_midiDataOut2;
1833 hdspm->midi[0].statusOut = HDSPM_midiStatusOut2;
1834 hdspm->midi[0].ie = HDSPM_Midi2InterruptEnable;
1835 hdspm->midi[0].irq = HDSPM_midi2IRQPending;
1836 } else {
1837 hdspm->midi[0].dataIn = HDSPM_midiDataIn0;
1838 hdspm->midi[0].statusIn = HDSPM_midiStatusIn0;
1839 hdspm->midi[0].dataOut = HDSPM_midiDataOut0;
1840 hdspm->midi[0].statusOut = HDSPM_midiStatusOut0;
1841 hdspm->midi[0].ie = HDSPM_Midi0InterruptEnable;
1842 hdspm->midi[0].irq = HDSPM_midi0IRQPending;
1844 } else if (1 == id) {
1845 hdspm->midi[1].dataIn = HDSPM_midiDataIn1;
1846 hdspm->midi[1].statusIn = HDSPM_midiStatusIn1;
1847 hdspm->midi[1].dataOut = HDSPM_midiDataOut1;
1848 hdspm->midi[1].statusOut = HDSPM_midiStatusOut1;
1849 hdspm->midi[1].ie = HDSPM_Midi1InterruptEnable;
1850 hdspm->midi[1].irq = HDSPM_midi1IRQPending;
1851 } else if ((2 == id) && (MADI == hdspm->io_type)) {
1852 /* MIDI-over-MADI on HDSPe MADI */
1853 hdspm->midi[2].dataIn = HDSPM_midiDataIn2;
1854 hdspm->midi[2].statusIn = HDSPM_midiStatusIn2;
1855 hdspm->midi[2].dataOut = HDSPM_midiDataOut2;
1856 hdspm->midi[2].statusOut = HDSPM_midiStatusOut2;
1857 hdspm->midi[2].ie = HDSPM_Midi2InterruptEnable;
1858 hdspm->midi[2].irq = HDSPM_midi2IRQPending;
1859 } else if (2 == id) {
1860 /* TCO MTC, read only */
1861 hdspm->midi[2].dataIn = HDSPM_midiDataIn2;
1862 hdspm->midi[2].statusIn = HDSPM_midiStatusIn2;
1863 hdspm->midi[2].dataOut = -1;
1864 hdspm->midi[2].statusOut = -1;
1865 hdspm->midi[2].ie = HDSPM_Midi2InterruptEnable;
1866 hdspm->midi[2].irq = HDSPM_midi2IRQPendingAES;
1867 } else if (3 == id) {
1868 /* TCO MTC on HDSPe MADI */
1869 hdspm->midi[3].dataIn = HDSPM_midiDataIn3;
1870 hdspm->midi[3].statusIn = HDSPM_midiStatusIn3;
1871 hdspm->midi[3].dataOut = -1;
1872 hdspm->midi[3].statusOut = -1;
1873 hdspm->midi[3].ie = HDSPM_Midi3InterruptEnable;
1874 hdspm->midi[3].irq = HDSPM_midi3IRQPending;
1877 if ((id < 2) || ((2 == id) && ((MADI == hdspm->io_type) ||
1878 (MADIface == hdspm->io_type)))) {
1879 if ((id == 0) && (MADIface == hdspm->io_type)) {
1880 sprintf(buf, "%s MIDIoverMADI", card->shortname);
1881 } else if ((id == 2) && (MADI == hdspm->io_type)) {
1882 sprintf(buf, "%s MIDIoverMADI", card->shortname);
1883 } else {
1884 sprintf(buf, "%s MIDI %d", card->shortname, id+1);
1886 err = snd_rawmidi_new(card, buf, id, 1, 1,
1887 &hdspm->midi[id].rmidi);
1888 if (err < 0)
1889 return err;
1891 sprintf(hdspm->midi[id].rmidi->name, "%s MIDI %d",
1892 card->id, id+1);
1893 hdspm->midi[id].rmidi->private_data = &hdspm->midi[id];
1895 snd_rawmidi_set_ops(hdspm->midi[id].rmidi,
1896 SNDRV_RAWMIDI_STREAM_OUTPUT,
1897 &snd_hdspm_midi_output);
1898 snd_rawmidi_set_ops(hdspm->midi[id].rmidi,
1899 SNDRV_RAWMIDI_STREAM_INPUT,
1900 &snd_hdspm_midi_input);
1902 hdspm->midi[id].rmidi->info_flags |=
1903 SNDRV_RAWMIDI_INFO_OUTPUT |
1904 SNDRV_RAWMIDI_INFO_INPUT |
1905 SNDRV_RAWMIDI_INFO_DUPLEX;
1906 } else {
1907 /* TCO MTC, read only */
1908 sprintf(buf, "%s MTC %d", card->shortname, id+1);
1909 err = snd_rawmidi_new(card, buf, id, 1, 1,
1910 &hdspm->midi[id].rmidi);
1911 if (err < 0)
1912 return err;
1914 sprintf(hdspm->midi[id].rmidi->name,
1915 "%s MTC %d", card->id, id+1);
1916 hdspm->midi[id].rmidi->private_data = &hdspm->midi[id];
1918 snd_rawmidi_set_ops(hdspm->midi[id].rmidi,
1919 SNDRV_RAWMIDI_STREAM_INPUT,
1920 &snd_hdspm_midi_input);
1922 hdspm->midi[id].rmidi->info_flags |= SNDRV_RAWMIDI_INFO_INPUT;
1925 return 0;
1929 static void hdspm_midi_tasklet(unsigned long arg)
1931 struct hdspm *hdspm = (struct hdspm *)arg;
1932 int i = 0;
1934 while (i < hdspm->midiPorts) {
1935 if (hdspm->midi[i].pending)
1936 snd_hdspm_midi_input_read(&hdspm->midi[i]);
1938 i++;
1943 /*-----------------------------------------------------------------------------
1944 Status Interface
1945 ----------------------------------------------------------------------------*/
1947 /* get the system sample rate which is set */
1951 * Calculate the real sample rate from the
1952 * current DDS value.
1954 static int hdspm_get_system_sample_rate(struct hdspm *hdspm)
1956 unsigned int period, rate;
1958 period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ);
1959 rate = hdspm_calc_dds_value(hdspm, period);
1961 return rate;
1965 #define HDSPM_SYSTEM_SAMPLE_RATE(xname, xindex) \
1966 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1967 .name = xname, \
1968 .index = xindex, \
1969 .access = SNDRV_CTL_ELEM_ACCESS_READ, \
1970 .info = snd_hdspm_info_system_sample_rate, \
1971 .get = snd_hdspm_get_system_sample_rate \
1974 static int snd_hdspm_info_system_sample_rate(struct snd_kcontrol *kcontrol,
1975 struct snd_ctl_elem_info *uinfo)
1977 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1978 uinfo->count = 1;
1979 uinfo->value.integer.min = 27000;
1980 uinfo->value.integer.max = 207000;
1981 uinfo->value.integer.step = 1;
1982 return 0;
1986 static int snd_hdspm_get_system_sample_rate(struct snd_kcontrol *kcontrol,
1987 struct snd_ctl_elem_value *
1988 ucontrol)
1990 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
1992 ucontrol->value.integer.value[0] = hdspm_get_system_sample_rate(hdspm);
1993 return 0;
1998 * Returns the WordClock sample rate class for the given card.
2000 static int hdspm_get_wc_sample_rate(struct hdspm *hdspm)
2002 int status;
2004 switch (hdspm->io_type) {
2005 case RayDAT:
2006 case AIO:
2007 status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
2008 return (status >> 16) & 0xF;
2009 break;
2010 default:
2011 break;
2015 return 0;
2020 * Returns the TCO sample rate class for the given card.
2022 static int hdspm_get_tco_sample_rate(struct hdspm *hdspm)
2024 int status;
2026 if (hdspm->tco) {
2027 switch (hdspm->io_type) {
2028 case RayDAT:
2029 case AIO:
2030 status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
2031 return (status >> 20) & 0xF;
2032 break;
2033 default:
2034 break;
2038 return 0;
2043 * Returns the SYNC_IN sample rate class for the given card.
2045 static int hdspm_get_sync_in_sample_rate(struct hdspm *hdspm)
2047 int status;
2049 if (hdspm->tco) {
2050 switch (hdspm->io_type) {
2051 case RayDAT:
2052 case AIO:
2053 status = hdspm_read(hdspm, HDSPM_RD_STATUS_2);
2054 return (status >> 12) & 0xF;
2055 break;
2056 default:
2057 break;
2061 return 0;
2066 * Returns the sample rate class for input source <idx> for
2067 * 'new style' cards like the AIO and RayDAT.
2069 static int hdspm_get_s1_sample_rate(struct hdspm *hdspm, unsigned int idx)
2071 int status = hdspm_read(hdspm, HDSPM_RD_STATUS_2);
2073 return (status >> (idx*4)) & 0xF;
2078 #define HDSPM_AUTOSYNC_SAMPLE_RATE(xname, xindex) \
2079 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2080 .name = xname, \
2081 .private_value = xindex, \
2082 .access = SNDRV_CTL_ELEM_ACCESS_READ, \
2083 .info = snd_hdspm_info_autosync_sample_rate, \
2084 .get = snd_hdspm_get_autosync_sample_rate \
2088 static int snd_hdspm_info_autosync_sample_rate(struct snd_kcontrol *kcontrol,
2089 struct snd_ctl_elem_info *uinfo)
2091 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2092 uinfo->count = 1;
2093 uinfo->value.enumerated.items = 10;
2095 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2096 uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
2097 strcpy(uinfo->value.enumerated.name,
2098 texts_freq[uinfo->value.enumerated.item]);
2099 return 0;
2103 static int snd_hdspm_get_autosync_sample_rate(struct snd_kcontrol *kcontrol,
2104 struct snd_ctl_elem_value *
2105 ucontrol)
2107 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2109 switch (hdspm->io_type) {
2110 case RayDAT:
2111 switch (kcontrol->private_value) {
2112 case 0:
2113 ucontrol->value.enumerated.item[0] =
2114 hdspm_get_wc_sample_rate(hdspm);
2115 break;
2116 case 7:
2117 ucontrol->value.enumerated.item[0] =
2118 hdspm_get_tco_sample_rate(hdspm);
2119 break;
2120 case 8:
2121 ucontrol->value.enumerated.item[0] =
2122 hdspm_get_sync_in_sample_rate(hdspm);
2123 break;
2124 default:
2125 ucontrol->value.enumerated.item[0] =
2126 hdspm_get_s1_sample_rate(hdspm,
2127 kcontrol->private_value-1);
2130 case AIO:
2131 switch (kcontrol->private_value) {
2132 case 0: /* WC */
2133 ucontrol->value.enumerated.item[0] =
2134 hdspm_get_wc_sample_rate(hdspm);
2135 break;
2136 case 4: /* TCO */
2137 ucontrol->value.enumerated.item[0] =
2138 hdspm_get_tco_sample_rate(hdspm);
2139 break;
2140 case 5: /* SYNC_IN */
2141 ucontrol->value.enumerated.item[0] =
2142 hdspm_get_sync_in_sample_rate(hdspm);
2143 break;
2144 default:
2145 ucontrol->value.enumerated.item[0] =
2146 hdspm_get_s1_sample_rate(hdspm,
2147 ucontrol->id.index-1);
2150 case AES32:
2152 switch (kcontrol->private_value) {
2153 case 0: /* WC */
2154 ucontrol->value.enumerated.item[0] =
2155 hdspm_get_wc_sample_rate(hdspm);
2156 break;
2157 case 9: /* TCO */
2158 ucontrol->value.enumerated.item[0] =
2159 hdspm_get_tco_sample_rate(hdspm);
2160 break;
2161 case 10: /* SYNC_IN */
2162 ucontrol->value.enumerated.item[0] =
2163 hdspm_get_sync_in_sample_rate(hdspm);
2164 break;
2165 default: /* AES1 to AES8 */
2166 ucontrol->value.enumerated.item[0] =
2167 hdspm_get_s1_sample_rate(hdspm,
2168 kcontrol->private_value-1);
2169 break;
2172 default:
2173 break;
2176 return 0;
2180 #define HDSPM_SYSTEM_CLOCK_MODE(xname, xindex) \
2181 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2182 .name = xname, \
2183 .index = xindex, \
2184 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
2185 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2186 .info = snd_hdspm_info_system_clock_mode, \
2187 .get = snd_hdspm_get_system_clock_mode, \
2188 .put = snd_hdspm_put_system_clock_mode, \
2193 * Returns the system clock mode for the given card.
2194 * @returns 0 - master, 1 - slave
2196 static int hdspm_system_clock_mode(struct hdspm *hdspm)
2198 switch (hdspm->io_type) {
2199 case AIO:
2200 case RayDAT:
2201 if (hdspm->settings_register & HDSPM_c0Master)
2202 return 0;
2203 break;
2205 default:
2206 if (hdspm->control_register & HDSPM_ClockModeMaster)
2207 return 0;
2210 return 1;
2215 * Sets the system clock mode.
2216 * @param mode 0 - master, 1 - slave
2218 static void hdspm_set_system_clock_mode(struct hdspm *hdspm, int mode)
2220 switch (hdspm->io_type) {
2221 case AIO:
2222 case RayDAT:
2223 if (0 == mode)
2224 hdspm->settings_register |= HDSPM_c0Master;
2225 else
2226 hdspm->settings_register &= ~HDSPM_c0Master;
2228 hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register);
2229 break;
2231 default:
2232 if (0 == mode)
2233 hdspm->control_register |= HDSPM_ClockModeMaster;
2234 else
2235 hdspm->control_register &= ~HDSPM_ClockModeMaster;
2237 hdspm_write(hdspm, HDSPM_controlRegister,
2238 hdspm->control_register);
2243 static int snd_hdspm_info_system_clock_mode(struct snd_kcontrol *kcontrol,
2244 struct snd_ctl_elem_info *uinfo)
2246 static char *texts[] = { "Master", "AutoSync" };
2248 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2249 uinfo->count = 1;
2250 uinfo->value.enumerated.items = 2;
2251 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2252 uinfo->value.enumerated.item =
2253 uinfo->value.enumerated.items - 1;
2254 strcpy(uinfo->value.enumerated.name,
2255 texts[uinfo->value.enumerated.item]);
2256 return 0;
2259 static int snd_hdspm_get_system_clock_mode(struct snd_kcontrol *kcontrol,
2260 struct snd_ctl_elem_value *ucontrol)
2262 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2264 ucontrol->value.enumerated.item[0] = hdspm_system_clock_mode(hdspm);
2265 return 0;
2268 static int snd_hdspm_put_system_clock_mode(struct snd_kcontrol *kcontrol,
2269 struct snd_ctl_elem_value *ucontrol)
2271 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2272 int val;
2274 if (!snd_hdspm_use_is_exclusive(hdspm))
2275 return -EBUSY;
2277 val = ucontrol->value.enumerated.item[0];
2278 if (val < 0)
2279 val = 0;
2280 else if (val > 1)
2281 val = 1;
2283 hdspm_set_system_clock_mode(hdspm, val);
2285 return 0;
2289 #define HDSPM_INTERNAL_CLOCK(xname, xindex) \
2290 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2291 .name = xname, \
2292 .index = xindex, \
2293 .info = snd_hdspm_info_clock_source, \
2294 .get = snd_hdspm_get_clock_source, \
2295 .put = snd_hdspm_put_clock_source \
2299 static int hdspm_clock_source(struct hdspm * hdspm)
2301 switch (hdspm->system_sample_rate) {
2302 case 32000: return 0;
2303 case 44100: return 1;
2304 case 48000: return 2;
2305 case 64000: return 3;
2306 case 88200: return 4;
2307 case 96000: return 5;
2308 case 128000: return 6;
2309 case 176400: return 7;
2310 case 192000: return 8;
2313 return -1;
2316 static int hdspm_set_clock_source(struct hdspm * hdspm, int mode)
2318 int rate;
2319 switch (mode) {
2320 case 0:
2321 rate = 32000; break;
2322 case 1:
2323 rate = 44100; break;
2324 case 2:
2325 rate = 48000; break;
2326 case 3:
2327 rate = 64000; break;
2328 case 4:
2329 rate = 88200; break;
2330 case 5:
2331 rate = 96000; break;
2332 case 6:
2333 rate = 128000; break;
2334 case 7:
2335 rate = 176400; break;
2336 case 8:
2337 rate = 192000; break;
2338 default:
2339 rate = 48000;
2341 hdspm_set_rate(hdspm, rate, 1);
2342 return 0;
2345 static int snd_hdspm_info_clock_source(struct snd_kcontrol *kcontrol,
2346 struct snd_ctl_elem_info *uinfo)
2348 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2349 uinfo->count = 1;
2350 uinfo->value.enumerated.items = 9;
2352 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2353 uinfo->value.enumerated.item =
2354 uinfo->value.enumerated.items - 1;
2356 strcpy(uinfo->value.enumerated.name,
2357 texts_freq[uinfo->value.enumerated.item+1]);
2359 return 0;
2362 static int snd_hdspm_get_clock_source(struct snd_kcontrol *kcontrol,
2363 struct snd_ctl_elem_value *ucontrol)
2365 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2367 ucontrol->value.enumerated.item[0] = hdspm_clock_source(hdspm);
2368 return 0;
2371 static int snd_hdspm_put_clock_source(struct snd_kcontrol *kcontrol,
2372 struct snd_ctl_elem_value *ucontrol)
2374 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2375 int change;
2376 int val;
2378 if (!snd_hdspm_use_is_exclusive(hdspm))
2379 return -EBUSY;
2380 val = ucontrol->value.enumerated.item[0];
2381 if (val < 0)
2382 val = 0;
2383 if (val > 9)
2384 val = 9;
2385 spin_lock_irq(&hdspm->lock);
2386 if (val != hdspm_clock_source(hdspm))
2387 change = (hdspm_set_clock_source(hdspm, val) == 0) ? 1 : 0;
2388 else
2389 change = 0;
2390 spin_unlock_irq(&hdspm->lock);
2391 return change;
2395 #define HDSPM_PREF_SYNC_REF(xname, xindex) \
2396 {.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2397 .name = xname, \
2398 .index = xindex, \
2399 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
2400 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2401 .info = snd_hdspm_info_pref_sync_ref, \
2402 .get = snd_hdspm_get_pref_sync_ref, \
2403 .put = snd_hdspm_put_pref_sync_ref \
2408 * Returns the current preferred sync reference setting.
2409 * The semantics of the return value are depending on the
2410 * card, please see the comments for clarification.
2412 static int hdspm_pref_sync_ref(struct hdspm * hdspm)
2414 switch (hdspm->io_type) {
2415 case AES32:
2416 switch (hdspm->control_register & HDSPM_SyncRefMask) {
2417 case 0: return 0; /* WC */
2418 case HDSPM_SyncRef0: return 1; /* AES 1 */
2419 case HDSPM_SyncRef1: return 2; /* AES 2 */
2420 case HDSPM_SyncRef1+HDSPM_SyncRef0: return 3; /* AES 3 */
2421 case HDSPM_SyncRef2: return 4; /* AES 4 */
2422 case HDSPM_SyncRef2+HDSPM_SyncRef0: return 5; /* AES 5 */
2423 case HDSPM_SyncRef2+HDSPM_SyncRef1: return 6; /* AES 6 */
2424 case HDSPM_SyncRef2+HDSPM_SyncRef1+HDSPM_SyncRef0:
2425 return 7; /* AES 7 */
2426 case HDSPM_SyncRef3: return 8; /* AES 8 */
2427 case HDSPM_SyncRef3+HDSPM_SyncRef0: return 9; /* TCO */
2429 break;
2431 case MADI:
2432 case MADIface:
2433 if (hdspm->tco) {
2434 switch (hdspm->control_register & HDSPM_SyncRefMask) {
2435 case 0: return 0; /* WC */
2436 case HDSPM_SyncRef0: return 1; /* MADI */
2437 case HDSPM_SyncRef1: return 2; /* TCO */
2438 case HDSPM_SyncRef1+HDSPM_SyncRef0:
2439 return 3; /* SYNC_IN */
2441 } else {
2442 switch (hdspm->control_register & HDSPM_SyncRefMask) {
2443 case 0: return 0; /* WC */
2444 case HDSPM_SyncRef0: return 1; /* MADI */
2445 case HDSPM_SyncRef1+HDSPM_SyncRef0:
2446 return 2; /* SYNC_IN */
2449 break;
2451 case RayDAT:
2452 if (hdspm->tco) {
2453 switch ((hdspm->settings_register &
2454 HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2455 case 0: return 0; /* WC */
2456 case 3: return 1; /* ADAT 1 */
2457 case 4: return 2; /* ADAT 2 */
2458 case 5: return 3; /* ADAT 3 */
2459 case 6: return 4; /* ADAT 4 */
2460 case 1: return 5; /* AES */
2461 case 2: return 6; /* SPDIF */
2462 case 9: return 7; /* TCO */
2463 case 10: return 8; /* SYNC_IN */
2465 } else {
2466 switch ((hdspm->settings_register &
2467 HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2468 case 0: return 0; /* WC */
2469 case 3: return 1; /* ADAT 1 */
2470 case 4: return 2; /* ADAT 2 */
2471 case 5: return 3; /* ADAT 3 */
2472 case 6: return 4; /* ADAT 4 */
2473 case 1: return 5; /* AES */
2474 case 2: return 6; /* SPDIF */
2475 case 10: return 7; /* SYNC_IN */
2479 break;
2481 case AIO:
2482 if (hdspm->tco) {
2483 switch ((hdspm->settings_register &
2484 HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2485 case 0: return 0; /* WC */
2486 case 3: return 1; /* ADAT */
2487 case 1: return 2; /* AES */
2488 case 2: return 3; /* SPDIF */
2489 case 9: return 4; /* TCO */
2490 case 10: return 5; /* SYNC_IN */
2492 } else {
2493 switch ((hdspm->settings_register &
2494 HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2495 case 0: return 0; /* WC */
2496 case 3: return 1; /* ADAT */
2497 case 1: return 2; /* AES */
2498 case 2: return 3; /* SPDIF */
2499 case 10: return 4; /* SYNC_IN */
2503 break;
2506 return -1;
2511 * Set the preferred sync reference to <pref>. The semantics
2512 * of <pref> are depending on the card type, see the comments
2513 * for clarification.
2515 static int hdspm_set_pref_sync_ref(struct hdspm * hdspm, int pref)
2517 int p = 0;
2519 switch (hdspm->io_type) {
2520 case AES32:
2521 hdspm->control_register &= ~HDSPM_SyncRefMask;
2522 switch (pref) {
2523 case 0: /* WC */
2524 break;
2525 case 1: /* AES 1 */
2526 hdspm->control_register |= HDSPM_SyncRef0;
2527 break;
2528 case 2: /* AES 2 */
2529 hdspm->control_register |= HDSPM_SyncRef1;
2530 break;
2531 case 3: /* AES 3 */
2532 hdspm->control_register |=
2533 HDSPM_SyncRef1+HDSPM_SyncRef0;
2534 break;
2535 case 4: /* AES 4 */
2536 hdspm->control_register |= HDSPM_SyncRef2;
2537 break;
2538 case 5: /* AES 5 */
2539 hdspm->control_register |=
2540 HDSPM_SyncRef2+HDSPM_SyncRef0;
2541 break;
2542 case 6: /* AES 6 */
2543 hdspm->control_register |=
2544 HDSPM_SyncRef2+HDSPM_SyncRef1;
2545 break;
2546 case 7: /* AES 7 */
2547 hdspm->control_register |=
2548 HDSPM_SyncRef2+HDSPM_SyncRef1+HDSPM_SyncRef0;
2549 break;
2550 case 8: /* AES 8 */
2551 hdspm->control_register |= HDSPM_SyncRef3;
2552 break;
2553 case 9: /* TCO */
2554 hdspm->control_register |=
2555 HDSPM_SyncRef3+HDSPM_SyncRef0;
2556 break;
2557 default:
2558 return -1;
2561 break;
2563 case MADI:
2564 case MADIface:
2565 hdspm->control_register &= ~HDSPM_SyncRefMask;
2566 if (hdspm->tco) {
2567 switch (pref) {
2568 case 0: /* WC */
2569 break;
2570 case 1: /* MADI */
2571 hdspm->control_register |= HDSPM_SyncRef0;
2572 break;
2573 case 2: /* TCO */
2574 hdspm->control_register |= HDSPM_SyncRef1;
2575 break;
2576 case 3: /* SYNC_IN */
2577 hdspm->control_register |=
2578 HDSPM_SyncRef0+HDSPM_SyncRef1;
2579 break;
2580 default:
2581 return -1;
2583 } else {
2584 switch (pref) {
2585 case 0: /* WC */
2586 break;
2587 case 1: /* MADI */
2588 hdspm->control_register |= HDSPM_SyncRef0;
2589 break;
2590 case 2: /* SYNC_IN */
2591 hdspm->control_register |=
2592 HDSPM_SyncRef0+HDSPM_SyncRef1;
2593 break;
2594 default:
2595 return -1;
2599 break;
2601 case RayDAT:
2602 if (hdspm->tco) {
2603 switch (pref) {
2604 case 0: p = 0; break; /* WC */
2605 case 1: p = 3; break; /* ADAT 1 */
2606 case 2: p = 4; break; /* ADAT 2 */
2607 case 3: p = 5; break; /* ADAT 3 */
2608 case 4: p = 6; break; /* ADAT 4 */
2609 case 5: p = 1; break; /* AES */
2610 case 6: p = 2; break; /* SPDIF */
2611 case 7: p = 9; break; /* TCO */
2612 case 8: p = 10; break; /* SYNC_IN */
2613 default: return -1;
2615 } else {
2616 switch (pref) {
2617 case 0: p = 0; break; /* WC */
2618 case 1: p = 3; break; /* ADAT 1 */
2619 case 2: p = 4; break; /* ADAT 2 */
2620 case 3: p = 5; break; /* ADAT 3 */
2621 case 4: p = 6; break; /* ADAT 4 */
2622 case 5: p = 1; break; /* AES */
2623 case 6: p = 2; break; /* SPDIF */
2624 case 7: p = 10; break; /* SYNC_IN */
2625 default: return -1;
2628 break;
2630 case AIO:
2631 if (hdspm->tco) {
2632 switch (pref) {
2633 case 0: p = 0; break; /* WC */
2634 case 1: p = 3; break; /* ADAT */
2635 case 2: p = 1; break; /* AES */
2636 case 3: p = 2; break; /* SPDIF */
2637 case 4: p = 9; break; /* TCO */
2638 case 5: p = 10; break; /* SYNC_IN */
2639 default: return -1;
2641 } else {
2642 switch (pref) {
2643 case 0: p = 0; break; /* WC */
2644 case 1: p = 3; break; /* ADAT */
2645 case 2: p = 1; break; /* AES */
2646 case 3: p = 2; break; /* SPDIF */
2647 case 4: p = 10; break; /* SYNC_IN */
2648 default: return -1;
2651 break;
2654 switch (hdspm->io_type) {
2655 case RayDAT:
2656 case AIO:
2657 hdspm->settings_register &= ~HDSPM_c0_SyncRefMask;
2658 hdspm->settings_register |= HDSPM_c0_SyncRef0 * p;
2659 hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register);
2660 break;
2662 case MADI:
2663 case MADIface:
2664 case AES32:
2665 hdspm_write(hdspm, HDSPM_controlRegister,
2666 hdspm->control_register);
2669 return 0;
2673 static int snd_hdspm_info_pref_sync_ref(struct snd_kcontrol *kcontrol,
2674 struct snd_ctl_elem_info *uinfo)
2676 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2678 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2679 uinfo->count = 1;
2680 uinfo->value.enumerated.items = hdspm->texts_autosync_items;
2682 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2683 uinfo->value.enumerated.item =
2684 uinfo->value.enumerated.items - 1;
2686 strcpy(uinfo->value.enumerated.name,
2687 hdspm->texts_autosync[uinfo->value.enumerated.item]);
2689 return 0;
2692 static int snd_hdspm_get_pref_sync_ref(struct snd_kcontrol *kcontrol,
2693 struct snd_ctl_elem_value *ucontrol)
2695 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2696 int psf = hdspm_pref_sync_ref(hdspm);
2698 if (psf >= 0) {
2699 ucontrol->value.enumerated.item[0] = psf;
2700 return 0;
2703 return -1;
2706 static int snd_hdspm_put_pref_sync_ref(struct snd_kcontrol *kcontrol,
2707 struct snd_ctl_elem_value *ucontrol)
2709 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2710 int val, change = 0;
2712 if (!snd_hdspm_use_is_exclusive(hdspm))
2713 return -EBUSY;
2715 val = ucontrol->value.enumerated.item[0];
2717 if (val < 0)
2718 val = 0;
2719 else if (val >= hdspm->texts_autosync_items)
2720 val = hdspm->texts_autosync_items-1;
2722 spin_lock_irq(&hdspm->lock);
2723 if (val != hdspm_pref_sync_ref(hdspm))
2724 change = (0 == hdspm_set_pref_sync_ref(hdspm, val)) ? 1 : 0;
2726 spin_unlock_irq(&hdspm->lock);
2727 return change;
2731 #define HDSPM_AUTOSYNC_REF(xname, xindex) \
2732 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2733 .name = xname, \
2734 .index = xindex, \
2735 .access = SNDRV_CTL_ELEM_ACCESS_READ, \
2736 .info = snd_hdspm_info_autosync_ref, \
2737 .get = snd_hdspm_get_autosync_ref, \
2740 static int hdspm_autosync_ref(struct hdspm *hdspm)
2742 if (AES32 == hdspm->io_type) {
2743 unsigned int status = hdspm_read(hdspm, HDSPM_statusRegister);
2744 unsigned int syncref =
2745 (status >> HDSPM_AES32_syncref_bit) & 0xF;
2746 if (syncref == 0)
2747 return HDSPM_AES32_AUTOSYNC_FROM_WORD;
2748 if (syncref <= 8)
2749 return syncref;
2750 return HDSPM_AES32_AUTOSYNC_FROM_NONE;
2751 } else if (MADI == hdspm->io_type) {
2752 /* This looks at the autosync selected sync reference */
2753 unsigned int status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
2755 switch (status2 & HDSPM_SelSyncRefMask) {
2756 case HDSPM_SelSyncRef_WORD:
2757 return HDSPM_AUTOSYNC_FROM_WORD;
2758 case HDSPM_SelSyncRef_MADI:
2759 return HDSPM_AUTOSYNC_FROM_MADI;
2760 case HDSPM_SelSyncRef_TCO:
2761 return HDSPM_AUTOSYNC_FROM_TCO;
2762 case HDSPM_SelSyncRef_SyncIn:
2763 return HDSPM_AUTOSYNC_FROM_SYNC_IN;
2764 case HDSPM_SelSyncRef_NVALID:
2765 return HDSPM_AUTOSYNC_FROM_NONE;
2766 default:
2767 return 0;
2771 return 0;
2775 static int snd_hdspm_info_autosync_ref(struct snd_kcontrol *kcontrol,
2776 struct snd_ctl_elem_info *uinfo)
2778 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2780 if (AES32 == hdspm->io_type) {
2781 static char *texts[] = { "WordClock", "AES1", "AES2", "AES3",
2782 "AES4", "AES5", "AES6", "AES7", "AES8", "None"};
2784 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2785 uinfo->count = 1;
2786 uinfo->value.enumerated.items = 10;
2787 if (uinfo->value.enumerated.item >=
2788 uinfo->value.enumerated.items)
2789 uinfo->value.enumerated.item =
2790 uinfo->value.enumerated.items - 1;
2791 strcpy(uinfo->value.enumerated.name,
2792 texts[uinfo->value.enumerated.item]);
2793 } else if (MADI == hdspm->io_type) {
2794 static char *texts[] = {"Word Clock", "MADI", "TCO",
2795 "Sync In", "None" };
2797 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2798 uinfo->count = 1;
2799 uinfo->value.enumerated.items = 5;
2800 if (uinfo->value.enumerated.item >=
2801 uinfo->value.enumerated.items)
2802 uinfo->value.enumerated.item =
2803 uinfo->value.enumerated.items - 1;
2804 strcpy(uinfo->value.enumerated.name,
2805 texts[uinfo->value.enumerated.item]);
2807 return 0;
2810 static int snd_hdspm_get_autosync_ref(struct snd_kcontrol *kcontrol,
2811 struct snd_ctl_elem_value *ucontrol)
2813 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2815 ucontrol->value.enumerated.item[0] = hdspm_autosync_ref(hdspm);
2816 return 0;
2820 #define HDSPM_LINE_OUT(xname, xindex) \
2821 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2822 .name = xname, \
2823 .index = xindex, \
2824 .info = snd_hdspm_info_line_out, \
2825 .get = snd_hdspm_get_line_out, \
2826 .put = snd_hdspm_put_line_out \
2829 static int hdspm_line_out(struct hdspm * hdspm)
2831 return (hdspm->control_register & HDSPM_LineOut) ? 1 : 0;
2835 static int hdspm_set_line_output(struct hdspm * hdspm, int out)
2837 if (out)
2838 hdspm->control_register |= HDSPM_LineOut;
2839 else
2840 hdspm->control_register &= ~HDSPM_LineOut;
2841 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
2843 return 0;
2846 #define snd_hdspm_info_line_out snd_ctl_boolean_mono_info
2848 static int snd_hdspm_get_line_out(struct snd_kcontrol *kcontrol,
2849 struct snd_ctl_elem_value *ucontrol)
2851 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2853 spin_lock_irq(&hdspm->lock);
2854 ucontrol->value.integer.value[0] = hdspm_line_out(hdspm);
2855 spin_unlock_irq(&hdspm->lock);
2856 return 0;
2859 static int snd_hdspm_put_line_out(struct snd_kcontrol *kcontrol,
2860 struct snd_ctl_elem_value *ucontrol)
2862 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2863 int change;
2864 unsigned int val;
2866 if (!snd_hdspm_use_is_exclusive(hdspm))
2867 return -EBUSY;
2868 val = ucontrol->value.integer.value[0] & 1;
2869 spin_lock_irq(&hdspm->lock);
2870 change = (int) val != hdspm_line_out(hdspm);
2871 hdspm_set_line_output(hdspm, val);
2872 spin_unlock_irq(&hdspm->lock);
2873 return change;
2877 #define HDSPM_TX_64(xname, xindex) \
2878 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2879 .name = xname, \
2880 .index = xindex, \
2881 .info = snd_hdspm_info_tx_64, \
2882 .get = snd_hdspm_get_tx_64, \
2883 .put = snd_hdspm_put_tx_64 \
2886 static int hdspm_tx_64(struct hdspm * hdspm)
2888 return (hdspm->control_register & HDSPM_TX_64ch) ? 1 : 0;
2891 static int hdspm_set_tx_64(struct hdspm * hdspm, int out)
2893 if (out)
2894 hdspm->control_register |= HDSPM_TX_64ch;
2895 else
2896 hdspm->control_register &= ~HDSPM_TX_64ch;
2897 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
2899 return 0;
2902 #define snd_hdspm_info_tx_64 snd_ctl_boolean_mono_info
2904 static int snd_hdspm_get_tx_64(struct snd_kcontrol *kcontrol,
2905 struct snd_ctl_elem_value *ucontrol)
2907 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2909 spin_lock_irq(&hdspm->lock);
2910 ucontrol->value.integer.value[0] = hdspm_tx_64(hdspm);
2911 spin_unlock_irq(&hdspm->lock);
2912 return 0;
2915 static int snd_hdspm_put_tx_64(struct snd_kcontrol *kcontrol,
2916 struct snd_ctl_elem_value *ucontrol)
2918 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2919 int change;
2920 unsigned int val;
2922 if (!snd_hdspm_use_is_exclusive(hdspm))
2923 return -EBUSY;
2924 val = ucontrol->value.integer.value[0] & 1;
2925 spin_lock_irq(&hdspm->lock);
2926 change = (int) val != hdspm_tx_64(hdspm);
2927 hdspm_set_tx_64(hdspm, val);
2928 spin_unlock_irq(&hdspm->lock);
2929 return change;
2933 #define HDSPM_C_TMS(xname, xindex) \
2934 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2935 .name = xname, \
2936 .index = xindex, \
2937 .info = snd_hdspm_info_c_tms, \
2938 .get = snd_hdspm_get_c_tms, \
2939 .put = snd_hdspm_put_c_tms \
2942 static int hdspm_c_tms(struct hdspm * hdspm)
2944 return (hdspm->control_register & HDSPM_clr_tms) ? 1 : 0;
2947 static int hdspm_set_c_tms(struct hdspm * hdspm, int out)
2949 if (out)
2950 hdspm->control_register |= HDSPM_clr_tms;
2951 else
2952 hdspm->control_register &= ~HDSPM_clr_tms;
2953 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
2955 return 0;
2958 #define snd_hdspm_info_c_tms snd_ctl_boolean_mono_info
2960 static int snd_hdspm_get_c_tms(struct snd_kcontrol *kcontrol,
2961 struct snd_ctl_elem_value *ucontrol)
2963 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2965 spin_lock_irq(&hdspm->lock);
2966 ucontrol->value.integer.value[0] = hdspm_c_tms(hdspm);
2967 spin_unlock_irq(&hdspm->lock);
2968 return 0;
2971 static int snd_hdspm_put_c_tms(struct snd_kcontrol *kcontrol,
2972 struct snd_ctl_elem_value *ucontrol)
2974 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2975 int change;
2976 unsigned int val;
2978 if (!snd_hdspm_use_is_exclusive(hdspm))
2979 return -EBUSY;
2980 val = ucontrol->value.integer.value[0] & 1;
2981 spin_lock_irq(&hdspm->lock);
2982 change = (int) val != hdspm_c_tms(hdspm);
2983 hdspm_set_c_tms(hdspm, val);
2984 spin_unlock_irq(&hdspm->lock);
2985 return change;
2989 #define HDSPM_SAFE_MODE(xname, xindex) \
2990 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2991 .name = xname, \
2992 .index = xindex, \
2993 .info = snd_hdspm_info_safe_mode, \
2994 .get = snd_hdspm_get_safe_mode, \
2995 .put = snd_hdspm_put_safe_mode \
2998 static int hdspm_safe_mode(struct hdspm * hdspm)
3000 return (hdspm->control_register & HDSPM_AutoInp) ? 1 : 0;
3003 static int hdspm_set_safe_mode(struct hdspm * hdspm, int out)
3005 if (out)
3006 hdspm->control_register |= HDSPM_AutoInp;
3007 else
3008 hdspm->control_register &= ~HDSPM_AutoInp;
3009 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3011 return 0;
3014 #define snd_hdspm_info_safe_mode snd_ctl_boolean_mono_info
3016 static int snd_hdspm_get_safe_mode(struct snd_kcontrol *kcontrol,
3017 struct snd_ctl_elem_value *ucontrol)
3019 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3021 spin_lock_irq(&hdspm->lock);
3022 ucontrol->value.integer.value[0] = hdspm_safe_mode(hdspm);
3023 spin_unlock_irq(&hdspm->lock);
3024 return 0;
3027 static int snd_hdspm_put_safe_mode(struct snd_kcontrol *kcontrol,
3028 struct snd_ctl_elem_value *ucontrol)
3030 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3031 int change;
3032 unsigned int val;
3034 if (!snd_hdspm_use_is_exclusive(hdspm))
3035 return -EBUSY;
3036 val = ucontrol->value.integer.value[0] & 1;
3037 spin_lock_irq(&hdspm->lock);
3038 change = (int) val != hdspm_safe_mode(hdspm);
3039 hdspm_set_safe_mode(hdspm, val);
3040 spin_unlock_irq(&hdspm->lock);
3041 return change;
3045 #define HDSPM_EMPHASIS(xname, xindex) \
3046 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3047 .name = xname, \
3048 .index = xindex, \
3049 .info = snd_hdspm_info_emphasis, \
3050 .get = snd_hdspm_get_emphasis, \
3051 .put = snd_hdspm_put_emphasis \
3054 static int hdspm_emphasis(struct hdspm * hdspm)
3056 return (hdspm->control_register & HDSPM_Emphasis) ? 1 : 0;
3059 static int hdspm_set_emphasis(struct hdspm * hdspm, int emp)
3061 if (emp)
3062 hdspm->control_register |= HDSPM_Emphasis;
3063 else
3064 hdspm->control_register &= ~HDSPM_Emphasis;
3065 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3067 return 0;
3070 #define snd_hdspm_info_emphasis snd_ctl_boolean_mono_info
3072 static int snd_hdspm_get_emphasis(struct snd_kcontrol *kcontrol,
3073 struct snd_ctl_elem_value *ucontrol)
3075 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3077 spin_lock_irq(&hdspm->lock);
3078 ucontrol->value.enumerated.item[0] = hdspm_emphasis(hdspm);
3079 spin_unlock_irq(&hdspm->lock);
3080 return 0;
3083 static int snd_hdspm_put_emphasis(struct snd_kcontrol *kcontrol,
3084 struct snd_ctl_elem_value *ucontrol)
3086 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3087 int change;
3088 unsigned int val;
3090 if (!snd_hdspm_use_is_exclusive(hdspm))
3091 return -EBUSY;
3092 val = ucontrol->value.integer.value[0] & 1;
3093 spin_lock_irq(&hdspm->lock);
3094 change = (int) val != hdspm_emphasis(hdspm);
3095 hdspm_set_emphasis(hdspm, val);
3096 spin_unlock_irq(&hdspm->lock);
3097 return change;
3101 #define HDSPM_DOLBY(xname, xindex) \
3102 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3103 .name = xname, \
3104 .index = xindex, \
3105 .info = snd_hdspm_info_dolby, \
3106 .get = snd_hdspm_get_dolby, \
3107 .put = snd_hdspm_put_dolby \
3110 static int hdspm_dolby(struct hdspm * hdspm)
3112 return (hdspm->control_register & HDSPM_Dolby) ? 1 : 0;
3115 static int hdspm_set_dolby(struct hdspm * hdspm, int dol)
3117 if (dol)
3118 hdspm->control_register |= HDSPM_Dolby;
3119 else
3120 hdspm->control_register &= ~HDSPM_Dolby;
3121 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3123 return 0;
3126 #define snd_hdspm_info_dolby snd_ctl_boolean_mono_info
3128 static int snd_hdspm_get_dolby(struct snd_kcontrol *kcontrol,
3129 struct snd_ctl_elem_value *ucontrol)
3131 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3133 spin_lock_irq(&hdspm->lock);
3134 ucontrol->value.enumerated.item[0] = hdspm_dolby(hdspm);
3135 spin_unlock_irq(&hdspm->lock);
3136 return 0;
3139 static int snd_hdspm_put_dolby(struct snd_kcontrol *kcontrol,
3140 struct snd_ctl_elem_value *ucontrol)
3142 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3143 int change;
3144 unsigned int val;
3146 if (!snd_hdspm_use_is_exclusive(hdspm))
3147 return -EBUSY;
3148 val = ucontrol->value.integer.value[0] & 1;
3149 spin_lock_irq(&hdspm->lock);
3150 change = (int) val != hdspm_dolby(hdspm);
3151 hdspm_set_dolby(hdspm, val);
3152 spin_unlock_irq(&hdspm->lock);
3153 return change;
3157 #define HDSPM_PROFESSIONAL(xname, xindex) \
3158 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3159 .name = xname, \
3160 .index = xindex, \
3161 .info = snd_hdspm_info_professional, \
3162 .get = snd_hdspm_get_professional, \
3163 .put = snd_hdspm_put_professional \
3166 static int hdspm_professional(struct hdspm * hdspm)
3168 return (hdspm->control_register & HDSPM_Professional) ? 1 : 0;
3171 static int hdspm_set_professional(struct hdspm * hdspm, int dol)
3173 if (dol)
3174 hdspm->control_register |= HDSPM_Professional;
3175 else
3176 hdspm->control_register &= ~HDSPM_Professional;
3177 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3179 return 0;
3182 #define snd_hdspm_info_professional snd_ctl_boolean_mono_info
3184 static int snd_hdspm_get_professional(struct snd_kcontrol *kcontrol,
3185 struct snd_ctl_elem_value *ucontrol)
3187 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3189 spin_lock_irq(&hdspm->lock);
3190 ucontrol->value.enumerated.item[0] = hdspm_professional(hdspm);
3191 spin_unlock_irq(&hdspm->lock);
3192 return 0;
3195 static int snd_hdspm_put_professional(struct snd_kcontrol *kcontrol,
3196 struct snd_ctl_elem_value *ucontrol)
3198 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3199 int change;
3200 unsigned int val;
3202 if (!snd_hdspm_use_is_exclusive(hdspm))
3203 return -EBUSY;
3204 val = ucontrol->value.integer.value[0] & 1;
3205 spin_lock_irq(&hdspm->lock);
3206 change = (int) val != hdspm_professional(hdspm);
3207 hdspm_set_professional(hdspm, val);
3208 spin_unlock_irq(&hdspm->lock);
3209 return change;
3212 #define HDSPM_INPUT_SELECT(xname, xindex) \
3213 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3214 .name = xname, \
3215 .index = xindex, \
3216 .info = snd_hdspm_info_input_select, \
3217 .get = snd_hdspm_get_input_select, \
3218 .put = snd_hdspm_put_input_select \
3221 static int hdspm_input_select(struct hdspm * hdspm)
3223 return (hdspm->control_register & HDSPM_InputSelect0) ? 1 : 0;
3226 static int hdspm_set_input_select(struct hdspm * hdspm, int out)
3228 if (out)
3229 hdspm->control_register |= HDSPM_InputSelect0;
3230 else
3231 hdspm->control_register &= ~HDSPM_InputSelect0;
3232 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3234 return 0;
3237 static int snd_hdspm_info_input_select(struct snd_kcontrol *kcontrol,
3238 struct snd_ctl_elem_info *uinfo)
3240 static char *texts[] = { "optical", "coaxial" };
3242 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3243 uinfo->count = 1;
3244 uinfo->value.enumerated.items = 2;
3246 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
3247 uinfo->value.enumerated.item =
3248 uinfo->value.enumerated.items - 1;
3249 strcpy(uinfo->value.enumerated.name,
3250 texts[uinfo->value.enumerated.item]);
3252 return 0;
3255 static int snd_hdspm_get_input_select(struct snd_kcontrol *kcontrol,
3256 struct snd_ctl_elem_value *ucontrol)
3258 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3260 spin_lock_irq(&hdspm->lock);
3261 ucontrol->value.enumerated.item[0] = hdspm_input_select(hdspm);
3262 spin_unlock_irq(&hdspm->lock);
3263 return 0;
3266 static int snd_hdspm_put_input_select(struct snd_kcontrol *kcontrol,
3267 struct snd_ctl_elem_value *ucontrol)
3269 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3270 int change;
3271 unsigned int val;
3273 if (!snd_hdspm_use_is_exclusive(hdspm))
3274 return -EBUSY;
3275 val = ucontrol->value.integer.value[0] & 1;
3276 spin_lock_irq(&hdspm->lock);
3277 change = (int) val != hdspm_input_select(hdspm);
3278 hdspm_set_input_select(hdspm, val);
3279 spin_unlock_irq(&hdspm->lock);
3280 return change;
3284 #define HDSPM_DS_WIRE(xname, xindex) \
3285 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3286 .name = xname, \
3287 .index = xindex, \
3288 .info = snd_hdspm_info_ds_wire, \
3289 .get = snd_hdspm_get_ds_wire, \
3290 .put = snd_hdspm_put_ds_wire \
3293 static int hdspm_ds_wire(struct hdspm * hdspm)
3295 return (hdspm->control_register & HDSPM_DS_DoubleWire) ? 1 : 0;
3298 static int hdspm_set_ds_wire(struct hdspm * hdspm, int ds)
3300 if (ds)
3301 hdspm->control_register |= HDSPM_DS_DoubleWire;
3302 else
3303 hdspm->control_register &= ~HDSPM_DS_DoubleWire;
3304 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3306 return 0;
3309 static int snd_hdspm_info_ds_wire(struct snd_kcontrol *kcontrol,
3310 struct snd_ctl_elem_info *uinfo)
3312 static char *texts[] = { "Single", "Double" };
3314 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3315 uinfo->count = 1;
3316 uinfo->value.enumerated.items = 2;
3318 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
3319 uinfo->value.enumerated.item =
3320 uinfo->value.enumerated.items - 1;
3321 strcpy(uinfo->value.enumerated.name,
3322 texts[uinfo->value.enumerated.item]);
3324 return 0;
3327 static int snd_hdspm_get_ds_wire(struct snd_kcontrol *kcontrol,
3328 struct snd_ctl_elem_value *ucontrol)
3330 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3332 spin_lock_irq(&hdspm->lock);
3333 ucontrol->value.enumerated.item[0] = hdspm_ds_wire(hdspm);
3334 spin_unlock_irq(&hdspm->lock);
3335 return 0;
3338 static int snd_hdspm_put_ds_wire(struct snd_kcontrol *kcontrol,
3339 struct snd_ctl_elem_value *ucontrol)
3341 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3342 int change;
3343 unsigned int val;
3345 if (!snd_hdspm_use_is_exclusive(hdspm))
3346 return -EBUSY;
3347 val = ucontrol->value.integer.value[0] & 1;
3348 spin_lock_irq(&hdspm->lock);
3349 change = (int) val != hdspm_ds_wire(hdspm);
3350 hdspm_set_ds_wire(hdspm, val);
3351 spin_unlock_irq(&hdspm->lock);
3352 return change;
3356 #define HDSPM_QS_WIRE(xname, xindex) \
3357 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3358 .name = xname, \
3359 .index = xindex, \
3360 .info = snd_hdspm_info_qs_wire, \
3361 .get = snd_hdspm_get_qs_wire, \
3362 .put = snd_hdspm_put_qs_wire \
3365 static int hdspm_qs_wire(struct hdspm * hdspm)
3367 if (hdspm->control_register & HDSPM_QS_DoubleWire)
3368 return 1;
3369 if (hdspm->control_register & HDSPM_QS_QuadWire)
3370 return 2;
3371 return 0;
3374 static int hdspm_set_qs_wire(struct hdspm * hdspm, int mode)
3376 hdspm->control_register &= ~(HDSPM_QS_DoubleWire | HDSPM_QS_QuadWire);
3377 switch (mode) {
3378 case 0:
3379 break;
3380 case 1:
3381 hdspm->control_register |= HDSPM_QS_DoubleWire;
3382 break;
3383 case 2:
3384 hdspm->control_register |= HDSPM_QS_QuadWire;
3385 break;
3387 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3389 return 0;
3392 static int snd_hdspm_info_qs_wire(struct snd_kcontrol *kcontrol,
3393 struct snd_ctl_elem_info *uinfo)
3395 static char *texts[] = { "Single", "Double", "Quad" };
3397 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3398 uinfo->count = 1;
3399 uinfo->value.enumerated.items = 3;
3401 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
3402 uinfo->value.enumerated.item =
3403 uinfo->value.enumerated.items - 1;
3404 strcpy(uinfo->value.enumerated.name,
3405 texts[uinfo->value.enumerated.item]);
3407 return 0;
3410 static int snd_hdspm_get_qs_wire(struct snd_kcontrol *kcontrol,
3411 struct snd_ctl_elem_value *ucontrol)
3413 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3415 spin_lock_irq(&hdspm->lock);
3416 ucontrol->value.enumerated.item[0] = hdspm_qs_wire(hdspm);
3417 spin_unlock_irq(&hdspm->lock);
3418 return 0;
3421 static int snd_hdspm_put_qs_wire(struct snd_kcontrol *kcontrol,
3422 struct snd_ctl_elem_value *ucontrol)
3424 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3425 int change;
3426 int val;
3428 if (!snd_hdspm_use_is_exclusive(hdspm))
3429 return -EBUSY;
3430 val = ucontrol->value.integer.value[0];
3431 if (val < 0)
3432 val = 0;
3433 if (val > 2)
3434 val = 2;
3435 spin_lock_irq(&hdspm->lock);
3436 change = val != hdspm_qs_wire(hdspm);
3437 hdspm_set_qs_wire(hdspm, val);
3438 spin_unlock_irq(&hdspm->lock);
3439 return change;
3442 #define HDSPM_MADI_SPEEDMODE(xname, xindex) \
3443 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3444 .name = xname, \
3445 .index = xindex, \
3446 .info = snd_hdspm_info_madi_speedmode, \
3447 .get = snd_hdspm_get_madi_speedmode, \
3448 .put = snd_hdspm_put_madi_speedmode \
3451 static int hdspm_madi_speedmode(struct hdspm *hdspm)
3453 if (hdspm->control_register & HDSPM_QuadSpeed)
3454 return 2;
3455 if (hdspm->control_register & HDSPM_DoubleSpeed)
3456 return 1;
3457 return 0;
3460 static int hdspm_set_madi_speedmode(struct hdspm *hdspm, int mode)
3462 hdspm->control_register &= ~(HDSPM_DoubleSpeed | HDSPM_QuadSpeed);
3463 switch (mode) {
3464 case 0:
3465 break;
3466 case 1:
3467 hdspm->control_register |= HDSPM_DoubleSpeed;
3468 break;
3469 case 2:
3470 hdspm->control_register |= HDSPM_QuadSpeed;
3471 break;
3473 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3475 return 0;
3478 static int snd_hdspm_info_madi_speedmode(struct snd_kcontrol *kcontrol,
3479 struct snd_ctl_elem_info *uinfo)
3481 static char *texts[] = { "Single", "Double", "Quad" };
3483 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3484 uinfo->count = 1;
3485 uinfo->value.enumerated.items = 3;
3487 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
3488 uinfo->value.enumerated.item =
3489 uinfo->value.enumerated.items - 1;
3490 strcpy(uinfo->value.enumerated.name,
3491 texts[uinfo->value.enumerated.item]);
3493 return 0;
3496 static int snd_hdspm_get_madi_speedmode(struct snd_kcontrol *kcontrol,
3497 struct snd_ctl_elem_value *ucontrol)
3499 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3501 spin_lock_irq(&hdspm->lock);
3502 ucontrol->value.enumerated.item[0] = hdspm_madi_speedmode(hdspm);
3503 spin_unlock_irq(&hdspm->lock);
3504 return 0;
3507 static int snd_hdspm_put_madi_speedmode(struct snd_kcontrol *kcontrol,
3508 struct snd_ctl_elem_value *ucontrol)
3510 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3511 int change;
3512 int val;
3514 if (!snd_hdspm_use_is_exclusive(hdspm))
3515 return -EBUSY;
3516 val = ucontrol->value.integer.value[0];
3517 if (val < 0)
3518 val = 0;
3519 if (val > 2)
3520 val = 2;
3521 spin_lock_irq(&hdspm->lock);
3522 change = val != hdspm_madi_speedmode(hdspm);
3523 hdspm_set_madi_speedmode(hdspm, val);
3524 spin_unlock_irq(&hdspm->lock);
3525 return change;
3528 #define HDSPM_MIXER(xname, xindex) \
3529 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
3530 .name = xname, \
3531 .index = xindex, \
3532 .device = 0, \
3533 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
3534 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3535 .info = snd_hdspm_info_mixer, \
3536 .get = snd_hdspm_get_mixer, \
3537 .put = snd_hdspm_put_mixer \
3540 static int snd_hdspm_info_mixer(struct snd_kcontrol *kcontrol,
3541 struct snd_ctl_elem_info *uinfo)
3543 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3544 uinfo->count = 3;
3545 uinfo->value.integer.min = 0;
3546 uinfo->value.integer.max = 65535;
3547 uinfo->value.integer.step = 1;
3548 return 0;
3551 static int snd_hdspm_get_mixer(struct snd_kcontrol *kcontrol,
3552 struct snd_ctl_elem_value *ucontrol)
3554 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3555 int source;
3556 int destination;
3558 source = ucontrol->value.integer.value[0];
3559 if (source < 0)
3560 source = 0;
3561 else if (source >= 2 * HDSPM_MAX_CHANNELS)
3562 source = 2 * HDSPM_MAX_CHANNELS - 1;
3564 destination = ucontrol->value.integer.value[1];
3565 if (destination < 0)
3566 destination = 0;
3567 else if (destination >= HDSPM_MAX_CHANNELS)
3568 destination = HDSPM_MAX_CHANNELS - 1;
3570 spin_lock_irq(&hdspm->lock);
3571 if (source >= HDSPM_MAX_CHANNELS)
3572 ucontrol->value.integer.value[2] =
3573 hdspm_read_pb_gain(hdspm, destination,
3574 source - HDSPM_MAX_CHANNELS);
3575 else
3576 ucontrol->value.integer.value[2] =
3577 hdspm_read_in_gain(hdspm, destination, source);
3579 spin_unlock_irq(&hdspm->lock);
3581 return 0;
3584 static int snd_hdspm_put_mixer(struct snd_kcontrol *kcontrol,
3585 struct snd_ctl_elem_value *ucontrol)
3587 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3588 int change;
3589 int source;
3590 int destination;
3591 int gain;
3593 if (!snd_hdspm_use_is_exclusive(hdspm))
3594 return -EBUSY;
3596 source = ucontrol->value.integer.value[0];
3597 destination = ucontrol->value.integer.value[1];
3599 if (source < 0 || source >= 2 * HDSPM_MAX_CHANNELS)
3600 return -1;
3601 if (destination < 0 || destination >= HDSPM_MAX_CHANNELS)
3602 return -1;
3604 gain = ucontrol->value.integer.value[2];
3606 spin_lock_irq(&hdspm->lock);
3608 if (source >= HDSPM_MAX_CHANNELS)
3609 change = gain != hdspm_read_pb_gain(hdspm, destination,
3610 source -
3611 HDSPM_MAX_CHANNELS);
3612 else
3613 change = gain != hdspm_read_in_gain(hdspm, destination,
3614 source);
3616 if (change) {
3617 if (source >= HDSPM_MAX_CHANNELS)
3618 hdspm_write_pb_gain(hdspm, destination,
3619 source - HDSPM_MAX_CHANNELS,
3620 gain);
3621 else
3622 hdspm_write_in_gain(hdspm, destination, source,
3623 gain);
3625 spin_unlock_irq(&hdspm->lock);
3627 return change;
3630 /* The simple mixer control(s) provide gain control for the
3631 basic 1:1 mappings of playback streams to output
3632 streams.
3635 #define HDSPM_PLAYBACK_MIXER \
3636 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3637 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_WRITE | \
3638 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3639 .info = snd_hdspm_info_playback_mixer, \
3640 .get = snd_hdspm_get_playback_mixer, \
3641 .put = snd_hdspm_put_playback_mixer \
3644 static int snd_hdspm_info_playback_mixer(struct snd_kcontrol *kcontrol,
3645 struct snd_ctl_elem_info *uinfo)
3647 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3648 uinfo->count = 1;
3649 uinfo->value.integer.min = 0;
3650 uinfo->value.integer.max = 64;
3651 uinfo->value.integer.step = 1;
3652 return 0;
3655 static int snd_hdspm_get_playback_mixer(struct snd_kcontrol *kcontrol,
3656 struct snd_ctl_elem_value *ucontrol)
3658 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3659 int channel;
3661 channel = ucontrol->id.index - 1;
3663 if (snd_BUG_ON(channel < 0 || channel >= HDSPM_MAX_CHANNELS))
3664 return -EINVAL;
3666 spin_lock_irq(&hdspm->lock);
3667 ucontrol->value.integer.value[0] =
3668 (hdspm_read_pb_gain(hdspm, channel, channel)*64)/UNITY_GAIN;
3669 spin_unlock_irq(&hdspm->lock);
3671 return 0;
3674 static int snd_hdspm_put_playback_mixer(struct snd_kcontrol *kcontrol,
3675 struct snd_ctl_elem_value *ucontrol)
3677 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3678 int change;
3679 int channel;
3680 int gain;
3682 if (!snd_hdspm_use_is_exclusive(hdspm))
3683 return -EBUSY;
3685 channel = ucontrol->id.index - 1;
3687 if (snd_BUG_ON(channel < 0 || channel >= HDSPM_MAX_CHANNELS))
3688 return -EINVAL;
3690 gain = ucontrol->value.integer.value[0]*UNITY_GAIN/64;
3692 spin_lock_irq(&hdspm->lock);
3693 change =
3694 gain != hdspm_read_pb_gain(hdspm, channel,
3695 channel);
3696 if (change)
3697 hdspm_write_pb_gain(hdspm, channel, channel,
3698 gain);
3699 spin_unlock_irq(&hdspm->lock);
3700 return change;
3703 #define HDSPM_SYNC_CHECK(xname, xindex) \
3704 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3705 .name = xname, \
3706 .private_value = xindex, \
3707 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3708 .info = snd_hdspm_info_sync_check, \
3709 .get = snd_hdspm_get_sync_check \
3713 static int snd_hdspm_info_sync_check(struct snd_kcontrol *kcontrol,
3714 struct snd_ctl_elem_info *uinfo)
3716 static char *texts[] = { "No Lock", "Lock", "Sync", "N/A" };
3717 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3718 uinfo->count = 1;
3719 uinfo->value.enumerated.items = 4;
3720 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
3721 uinfo->value.enumerated.item =
3722 uinfo->value.enumerated.items - 1;
3723 strcpy(uinfo->value.enumerated.name,
3724 texts[uinfo->value.enumerated.item]);
3725 return 0;
3728 static int hdspm_wc_sync_check(struct hdspm *hdspm)
3730 int status, status2;
3732 switch (hdspm->io_type) {
3733 case AES32:
3734 status = hdspm_read(hdspm, HDSPM_statusRegister);
3735 if (status & HDSPM_wcSync)
3736 return 2;
3737 else if (status & HDSPM_wcLock)
3738 return 1;
3739 return 0;
3740 break;
3742 case MADI:
3743 status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
3744 if (status2 & HDSPM_wcLock) {
3745 if (status2 & HDSPM_wcSync)
3746 return 2;
3747 else
3748 return 1;
3750 return 0;
3751 break;
3753 case RayDAT:
3754 case AIO:
3755 status = hdspm_read(hdspm, HDSPM_statusRegister);
3757 if (status & 0x2000000)
3758 return 2;
3759 else if (status & 0x1000000)
3760 return 1;
3761 return 0;
3763 break;
3765 case MADIface:
3766 break;
3770 return 3;
3774 static int hdspm_madi_sync_check(struct hdspm *hdspm)
3776 int status = hdspm_read(hdspm, HDSPM_statusRegister);
3777 if (status & HDSPM_madiLock) {
3778 if (status & HDSPM_madiSync)
3779 return 2;
3780 else
3781 return 1;
3783 return 0;
3787 static int hdspm_s1_sync_check(struct hdspm *hdspm, int idx)
3789 int status, lock, sync;
3791 status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
3793 lock = (status & (0x1<<idx)) ? 1 : 0;
3794 sync = (status & (0x100<<idx)) ? 1 : 0;
3796 if (lock && sync)
3797 return 2;
3798 else if (lock)
3799 return 1;
3800 return 0;
3804 static int hdspm_sync_in_sync_check(struct hdspm *hdspm)
3806 int status, lock = 0, sync = 0;
3808 switch (hdspm->io_type) {
3809 case RayDAT:
3810 case AIO:
3811 status = hdspm_read(hdspm, HDSPM_RD_STATUS_3);
3812 lock = (status & 0x400) ? 1 : 0;
3813 sync = (status & 0x800) ? 1 : 0;
3814 break;
3816 case MADI:
3817 case AES32:
3818 status = hdspm_read(hdspm, HDSPM_statusRegister2);
3819 lock = (status & HDSPM_syncInLock) ? 1 : 0;
3820 sync = (status & HDSPM_syncInSync) ? 1 : 0;
3821 break;
3823 case MADIface:
3824 break;
3827 if (lock && sync)
3828 return 2;
3829 else if (lock)
3830 return 1;
3832 return 0;
3835 static int hdspm_aes_sync_check(struct hdspm *hdspm, int idx)
3837 int status2, lock, sync;
3838 status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
3840 lock = (status2 & (0x0080 >> idx)) ? 1 : 0;
3841 sync = (status2 & (0x8000 >> idx)) ? 1 : 0;
3843 if (sync)
3844 return 2;
3845 else if (lock)
3846 return 1;
3847 return 0;
3851 static int hdspm_tco_sync_check(struct hdspm *hdspm)
3853 int status;
3855 if (hdspm->tco) {
3856 switch (hdspm->io_type) {
3857 case MADI:
3858 case AES32:
3859 status = hdspm_read(hdspm, HDSPM_statusRegister);
3860 if (status & HDSPM_tcoLock) {
3861 if (status & HDSPM_tcoSync)
3862 return 2;
3863 else
3864 return 1;
3866 return 0;
3868 break;
3870 case RayDAT:
3871 case AIO:
3872 status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
3874 if (status & 0x8000000)
3875 return 2; /* Sync */
3876 if (status & 0x4000000)
3877 return 1; /* Lock */
3878 return 0; /* No signal */
3879 break;
3881 default:
3882 break;
3886 return 3; /* N/A */
3890 static int snd_hdspm_get_sync_check(struct snd_kcontrol *kcontrol,
3891 struct snd_ctl_elem_value *ucontrol)
3893 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3894 int val = -1;
3896 switch (hdspm->io_type) {
3897 case RayDAT:
3898 switch (kcontrol->private_value) {
3899 case 0: /* WC */
3900 val = hdspm_wc_sync_check(hdspm); break;
3901 case 7: /* TCO */
3902 val = hdspm_tco_sync_check(hdspm); break;
3903 case 8: /* SYNC IN */
3904 val = hdspm_sync_in_sync_check(hdspm); break;
3905 default:
3906 val = hdspm_s1_sync_check(hdspm, ucontrol->id.index-1);
3909 case AIO:
3910 switch (kcontrol->private_value) {
3911 case 0: /* WC */
3912 val = hdspm_wc_sync_check(hdspm); break;
3913 case 4: /* TCO */
3914 val = hdspm_tco_sync_check(hdspm); break;
3915 case 5: /* SYNC IN */
3916 val = hdspm_sync_in_sync_check(hdspm); break;
3917 default:
3918 val = hdspm_s1_sync_check(hdspm, ucontrol->id.index-1);
3921 case MADI:
3922 switch (kcontrol->private_value) {
3923 case 0: /* WC */
3924 val = hdspm_wc_sync_check(hdspm); break;
3925 case 1: /* MADI */
3926 val = hdspm_madi_sync_check(hdspm); break;
3927 case 2: /* TCO */
3928 val = hdspm_tco_sync_check(hdspm); break;
3929 case 3: /* SYNC_IN */
3930 val = hdspm_sync_in_sync_check(hdspm); break;
3933 case MADIface:
3934 val = hdspm_madi_sync_check(hdspm); /* MADI */
3935 break;
3937 case AES32:
3938 switch (kcontrol->private_value) {
3939 case 0: /* WC */
3940 val = hdspm_wc_sync_check(hdspm); break;
3941 case 9: /* TCO */
3942 val = hdspm_tco_sync_check(hdspm); break;
3943 case 10 /* SYNC IN */:
3944 val = hdspm_sync_in_sync_check(hdspm); break;
3945 default: /* AES1 to AES8 */
3946 val = hdspm_aes_sync_check(hdspm,
3947 kcontrol->private_value-1);
3952 if (-1 == val)
3953 val = 3;
3955 ucontrol->value.enumerated.item[0] = val;
3956 return 0;
3962 * TCO controls
3964 static void hdspm_tco_write(struct hdspm *hdspm)
3966 unsigned int tc[4] = { 0, 0, 0, 0};
3968 switch (hdspm->tco->input) {
3969 case 0:
3970 tc[2] |= HDSPM_TCO2_set_input_MSB;
3971 break;
3972 case 1:
3973 tc[2] |= HDSPM_TCO2_set_input_LSB;
3974 break;
3975 default:
3976 break;
3979 switch (hdspm->tco->framerate) {
3980 case 1:
3981 tc[1] |= HDSPM_TCO1_LTC_Format_LSB;
3982 break;
3983 case 2:
3984 tc[1] |= HDSPM_TCO1_LTC_Format_MSB;
3985 break;
3986 case 3:
3987 tc[1] |= HDSPM_TCO1_LTC_Format_MSB +
3988 HDSPM_TCO1_set_drop_frame_flag;
3989 break;
3990 case 4:
3991 tc[1] |= HDSPM_TCO1_LTC_Format_LSB +
3992 HDSPM_TCO1_LTC_Format_MSB;
3993 break;
3994 case 5:
3995 tc[1] |= HDSPM_TCO1_LTC_Format_LSB +
3996 HDSPM_TCO1_LTC_Format_MSB +
3997 HDSPM_TCO1_set_drop_frame_flag;
3998 break;
3999 default:
4000 break;
4003 switch (hdspm->tco->wordclock) {
4004 case 1:
4005 tc[2] |= HDSPM_TCO2_WCK_IO_ratio_LSB;
4006 break;
4007 case 2:
4008 tc[2] |= HDSPM_TCO2_WCK_IO_ratio_MSB;
4009 break;
4010 default:
4011 break;
4014 switch (hdspm->tco->samplerate) {
4015 case 1:
4016 tc[2] |= HDSPM_TCO2_set_freq;
4017 break;
4018 case 2:
4019 tc[2] |= HDSPM_TCO2_set_freq_from_app;
4020 break;
4021 default:
4022 break;
4025 switch (hdspm->tco->pull) {
4026 case 1:
4027 tc[2] |= HDSPM_TCO2_set_pull_up;
4028 break;
4029 case 2:
4030 tc[2] |= HDSPM_TCO2_set_pull_down;
4031 break;
4032 case 3:
4033 tc[2] |= HDSPM_TCO2_set_pull_up + HDSPM_TCO2_set_01_4;
4034 break;
4035 case 4:
4036 tc[2] |= HDSPM_TCO2_set_pull_down + HDSPM_TCO2_set_01_4;
4037 break;
4038 default:
4039 break;
4042 if (1 == hdspm->tco->term) {
4043 tc[2] |= HDSPM_TCO2_set_term_75R;
4046 hdspm_write(hdspm, HDSPM_WR_TCO, tc[0]);
4047 hdspm_write(hdspm, HDSPM_WR_TCO+4, tc[1]);
4048 hdspm_write(hdspm, HDSPM_WR_TCO+8, tc[2]);
4049 hdspm_write(hdspm, HDSPM_WR_TCO+12, tc[3]);
4053 #define HDSPM_TCO_SAMPLE_RATE(xname, xindex) \
4054 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4055 .name = xname, \
4056 .index = xindex, \
4057 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4058 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4059 .info = snd_hdspm_info_tco_sample_rate, \
4060 .get = snd_hdspm_get_tco_sample_rate, \
4061 .put = snd_hdspm_put_tco_sample_rate \
4064 static int snd_hdspm_info_tco_sample_rate(struct snd_kcontrol *kcontrol,
4065 struct snd_ctl_elem_info *uinfo)
4067 static char *texts[] = { "44.1 kHz", "48 kHz" };
4068 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4069 uinfo->count = 1;
4070 uinfo->value.enumerated.items = 2;
4072 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
4073 uinfo->value.enumerated.item =
4074 uinfo->value.enumerated.items - 1;
4076 strcpy(uinfo->value.enumerated.name,
4077 texts[uinfo->value.enumerated.item]);
4079 return 0;
4082 static int snd_hdspm_get_tco_sample_rate(struct snd_kcontrol *kcontrol,
4083 struct snd_ctl_elem_value *ucontrol)
4085 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4087 ucontrol->value.enumerated.item[0] = hdspm->tco->samplerate;
4089 return 0;
4092 static int snd_hdspm_put_tco_sample_rate(struct snd_kcontrol *kcontrol,
4093 struct snd_ctl_elem_value *ucontrol)
4095 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4097 if (hdspm->tco->samplerate != ucontrol->value.enumerated.item[0]) {
4098 hdspm->tco->samplerate = ucontrol->value.enumerated.item[0];
4100 hdspm_tco_write(hdspm);
4102 return 1;
4105 return 0;
4109 #define HDSPM_TCO_PULL(xname, xindex) \
4110 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4111 .name = xname, \
4112 .index = xindex, \
4113 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4114 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4115 .info = snd_hdspm_info_tco_pull, \
4116 .get = snd_hdspm_get_tco_pull, \
4117 .put = snd_hdspm_put_tco_pull \
4120 static int snd_hdspm_info_tco_pull(struct snd_kcontrol *kcontrol,
4121 struct snd_ctl_elem_info *uinfo)
4123 static char *texts[] = { "0", "+ 0.1 %", "- 0.1 %", "+ 4 %", "- 4 %" };
4124 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4125 uinfo->count = 1;
4126 uinfo->value.enumerated.items = 5;
4128 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
4129 uinfo->value.enumerated.item =
4130 uinfo->value.enumerated.items - 1;
4132 strcpy(uinfo->value.enumerated.name,
4133 texts[uinfo->value.enumerated.item]);
4135 return 0;
4138 static int snd_hdspm_get_tco_pull(struct snd_kcontrol *kcontrol,
4139 struct snd_ctl_elem_value *ucontrol)
4141 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4143 ucontrol->value.enumerated.item[0] = hdspm->tco->pull;
4145 return 0;
4148 static int snd_hdspm_put_tco_pull(struct snd_kcontrol *kcontrol,
4149 struct snd_ctl_elem_value *ucontrol)
4151 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4153 if (hdspm->tco->pull != ucontrol->value.enumerated.item[0]) {
4154 hdspm->tco->pull = ucontrol->value.enumerated.item[0];
4156 hdspm_tco_write(hdspm);
4158 return 1;
4161 return 0;
4164 #define HDSPM_TCO_WCK_CONVERSION(xname, xindex) \
4165 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4166 .name = xname, \
4167 .index = xindex, \
4168 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4169 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4170 .info = snd_hdspm_info_tco_wck_conversion, \
4171 .get = snd_hdspm_get_tco_wck_conversion, \
4172 .put = snd_hdspm_put_tco_wck_conversion \
4175 static int snd_hdspm_info_tco_wck_conversion(struct snd_kcontrol *kcontrol,
4176 struct snd_ctl_elem_info *uinfo)
4178 static char *texts[] = { "1:1", "44.1 -> 48", "48 -> 44.1" };
4179 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4180 uinfo->count = 1;
4181 uinfo->value.enumerated.items = 3;
4183 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
4184 uinfo->value.enumerated.item =
4185 uinfo->value.enumerated.items - 1;
4187 strcpy(uinfo->value.enumerated.name,
4188 texts[uinfo->value.enumerated.item]);
4190 return 0;
4193 static int snd_hdspm_get_tco_wck_conversion(struct snd_kcontrol *kcontrol,
4194 struct snd_ctl_elem_value *ucontrol)
4196 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4198 ucontrol->value.enumerated.item[0] = hdspm->tco->wordclock;
4200 return 0;
4203 static int snd_hdspm_put_tco_wck_conversion(struct snd_kcontrol *kcontrol,
4204 struct snd_ctl_elem_value *ucontrol)
4206 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4208 if (hdspm->tco->wordclock != ucontrol->value.enumerated.item[0]) {
4209 hdspm->tco->wordclock = ucontrol->value.enumerated.item[0];
4211 hdspm_tco_write(hdspm);
4213 return 1;
4216 return 0;
4220 #define HDSPM_TCO_FRAME_RATE(xname, xindex) \
4221 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4222 .name = xname, \
4223 .index = xindex, \
4224 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4225 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4226 .info = snd_hdspm_info_tco_frame_rate, \
4227 .get = snd_hdspm_get_tco_frame_rate, \
4228 .put = snd_hdspm_put_tco_frame_rate \
4231 static int snd_hdspm_info_tco_frame_rate(struct snd_kcontrol *kcontrol,
4232 struct snd_ctl_elem_info *uinfo)
4234 static char *texts[] = { "24 fps", "25 fps", "29.97fps",
4235 "29.97 dfps", "30 fps", "30 dfps" };
4236 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4237 uinfo->count = 1;
4238 uinfo->value.enumerated.items = 6;
4240 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
4241 uinfo->value.enumerated.item =
4242 uinfo->value.enumerated.items - 1;
4244 strcpy(uinfo->value.enumerated.name,
4245 texts[uinfo->value.enumerated.item]);
4247 return 0;
4250 static int snd_hdspm_get_tco_frame_rate(struct snd_kcontrol *kcontrol,
4251 struct snd_ctl_elem_value *ucontrol)
4253 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4255 ucontrol->value.enumerated.item[0] = hdspm->tco->framerate;
4257 return 0;
4260 static int snd_hdspm_put_tco_frame_rate(struct snd_kcontrol *kcontrol,
4261 struct snd_ctl_elem_value *ucontrol)
4263 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4265 if (hdspm->tco->framerate != ucontrol->value.enumerated.item[0]) {
4266 hdspm->tco->framerate = ucontrol->value.enumerated.item[0];
4268 hdspm_tco_write(hdspm);
4270 return 1;
4273 return 0;
4277 #define HDSPM_TCO_SYNC_SOURCE(xname, xindex) \
4278 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4279 .name = xname, \
4280 .index = xindex, \
4281 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4282 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4283 .info = snd_hdspm_info_tco_sync_source, \
4284 .get = snd_hdspm_get_tco_sync_source, \
4285 .put = snd_hdspm_put_tco_sync_source \
4288 static int snd_hdspm_info_tco_sync_source(struct snd_kcontrol *kcontrol,
4289 struct snd_ctl_elem_info *uinfo)
4291 static char *texts[] = { "LTC", "Video", "WCK" };
4292 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4293 uinfo->count = 1;
4294 uinfo->value.enumerated.items = 3;
4296 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
4297 uinfo->value.enumerated.item =
4298 uinfo->value.enumerated.items - 1;
4300 strcpy(uinfo->value.enumerated.name,
4301 texts[uinfo->value.enumerated.item]);
4303 return 0;
4306 static int snd_hdspm_get_tco_sync_source(struct snd_kcontrol *kcontrol,
4307 struct snd_ctl_elem_value *ucontrol)
4309 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4311 ucontrol->value.enumerated.item[0] = hdspm->tco->input;
4313 return 0;
4316 static int snd_hdspm_put_tco_sync_source(struct snd_kcontrol *kcontrol,
4317 struct snd_ctl_elem_value *ucontrol)
4319 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4321 if (hdspm->tco->input != ucontrol->value.enumerated.item[0]) {
4322 hdspm->tco->input = ucontrol->value.enumerated.item[0];
4324 hdspm_tco_write(hdspm);
4326 return 1;
4329 return 0;
4333 #define HDSPM_TCO_WORD_TERM(xname, xindex) \
4334 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4335 .name = xname, \
4336 .index = xindex, \
4337 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4338 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4339 .info = snd_hdspm_info_tco_word_term, \
4340 .get = snd_hdspm_get_tco_word_term, \
4341 .put = snd_hdspm_put_tco_word_term \
4344 static int snd_hdspm_info_tco_word_term(struct snd_kcontrol *kcontrol,
4345 struct snd_ctl_elem_info *uinfo)
4347 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
4348 uinfo->count = 1;
4349 uinfo->value.integer.min = 0;
4350 uinfo->value.integer.max = 1;
4352 return 0;
4356 static int snd_hdspm_get_tco_word_term(struct snd_kcontrol *kcontrol,
4357 struct snd_ctl_elem_value *ucontrol)
4359 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4361 ucontrol->value.enumerated.item[0] = hdspm->tco->term;
4363 return 0;
4367 static int snd_hdspm_put_tco_word_term(struct snd_kcontrol *kcontrol,
4368 struct snd_ctl_elem_value *ucontrol)
4370 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4372 if (hdspm->tco->term != ucontrol->value.enumerated.item[0]) {
4373 hdspm->tco->term = ucontrol->value.enumerated.item[0];
4375 hdspm_tco_write(hdspm);
4377 return 1;
4380 return 0;
4386 static struct snd_kcontrol_new snd_hdspm_controls_madi[] = {
4387 HDSPM_MIXER("Mixer", 0),
4388 HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4389 HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4390 HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
4391 HDSPM_AUTOSYNC_REF("AutoSync Reference", 0),
4392 HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4393 HDSPM_SYNC_CHECK("WC SyncCheck", 0),
4394 HDSPM_SYNC_CHECK("MADI SyncCheck", 1),
4395 HDSPM_SYNC_CHECK("TCO SyncCHeck", 2),
4396 HDSPM_SYNC_CHECK("SYNC IN SyncCheck", 3),
4397 HDSPM_LINE_OUT("Line Out", 0),
4398 HDSPM_TX_64("TX 64 channels mode", 0),
4399 HDSPM_C_TMS("Clear Track Marker", 0),
4400 HDSPM_SAFE_MODE("Safe Mode", 0),
4401 HDSPM_INPUT_SELECT("Input Select", 0),
4402 HDSPM_MADI_SPEEDMODE("MADI Speed Mode", 0)
4406 static struct snd_kcontrol_new snd_hdspm_controls_madiface[] = {
4407 HDSPM_MIXER("Mixer", 0),
4408 HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4409 HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4410 HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4411 HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
4412 HDSPM_SYNC_CHECK("MADI SyncCheck", 0),
4413 HDSPM_TX_64("TX 64 channels mode", 0),
4414 HDSPM_C_TMS("Clear Track Marker", 0),
4415 HDSPM_SAFE_MODE("Safe Mode", 0),
4416 HDSPM_MADI_SPEEDMODE("MADI Speed Mode", 0)
4419 static struct snd_kcontrol_new snd_hdspm_controls_aio[] = {
4420 HDSPM_MIXER("Mixer", 0),
4421 HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4422 HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4423 HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
4424 HDSPM_AUTOSYNC_REF("AutoSync Reference", 0),
4425 HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4426 HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
4427 HDSPM_SYNC_CHECK("WC SyncCheck", 0),
4428 HDSPM_SYNC_CHECK("AES SyncCheck", 1),
4429 HDSPM_SYNC_CHECK("SPDIF SyncCheck", 2),
4430 HDSPM_SYNC_CHECK("ADAT SyncCheck", 3),
4431 HDSPM_SYNC_CHECK("TCO SyncCheck", 4),
4432 HDSPM_SYNC_CHECK("SYNC IN SyncCheck", 5),
4433 HDSPM_AUTOSYNC_SAMPLE_RATE("WC Frequency", 0),
4434 HDSPM_AUTOSYNC_SAMPLE_RATE("AES Frequency", 1),
4435 HDSPM_AUTOSYNC_SAMPLE_RATE("SPDIF Frequency", 2),
4436 HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT Frequency", 3),
4437 HDSPM_AUTOSYNC_SAMPLE_RATE("TCO Frequency", 4),
4438 HDSPM_AUTOSYNC_SAMPLE_RATE("SYNC IN Frequency", 5)
4441 HDSPM_INPUT_SELECT("Input Select", 0),
4442 HDSPM_SPDIF_OPTICAL("SPDIF Out Optical", 0),
4443 HDSPM_PROFESSIONAL("SPDIF Out Professional", 0);
4444 HDSPM_SPDIF_IN("SPDIF In", 0);
4445 HDSPM_BREAKOUT_CABLE("Breakout Cable", 0);
4446 HDSPM_INPUT_LEVEL("Input Level", 0);
4447 HDSPM_OUTPUT_LEVEL("Output Level", 0);
4448 HDSPM_PHONES("Phones", 0);
4452 static struct snd_kcontrol_new snd_hdspm_controls_raydat[] = {
4453 HDSPM_MIXER("Mixer", 0),
4454 HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4455 HDSPM_SYSTEM_CLOCK_MODE("Clock Mode", 0),
4456 HDSPM_PREF_SYNC_REF("Pref Sync Ref", 0),
4457 HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4458 HDSPM_SYNC_CHECK("WC SyncCheck", 0),
4459 HDSPM_SYNC_CHECK("AES SyncCheck", 1),
4460 HDSPM_SYNC_CHECK("SPDIF SyncCheck", 2),
4461 HDSPM_SYNC_CHECK("ADAT1 SyncCheck", 3),
4462 HDSPM_SYNC_CHECK("ADAT2 SyncCheck", 4),
4463 HDSPM_SYNC_CHECK("ADAT3 SyncCheck", 5),
4464 HDSPM_SYNC_CHECK("ADAT4 SyncCheck", 6),
4465 HDSPM_SYNC_CHECK("TCO SyncCheck", 7),
4466 HDSPM_SYNC_CHECK("SYNC IN SyncCheck", 8),
4467 HDSPM_AUTOSYNC_SAMPLE_RATE("WC Frequency", 0),
4468 HDSPM_AUTOSYNC_SAMPLE_RATE("AES Frequency", 1),
4469 HDSPM_AUTOSYNC_SAMPLE_RATE("SPDIF Frequency", 2),
4470 HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT1 Frequency", 3),
4471 HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT2 Frequency", 4),
4472 HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT3 Frequency", 5),
4473 HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT4 Frequency", 6),
4474 HDSPM_AUTOSYNC_SAMPLE_RATE("TCO Frequency", 7),
4475 HDSPM_AUTOSYNC_SAMPLE_RATE("SYNC IN Frequency", 8)
4478 static struct snd_kcontrol_new snd_hdspm_controls_aes32[] = {
4479 HDSPM_MIXER("Mixer", 0),
4480 HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4481 HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4482 HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
4483 HDSPM_AUTOSYNC_REF("AutoSync Reference", 0),
4484 HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4485 HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
4486 HDSPM_SYNC_CHECK("WC Sync Check", 0),
4487 HDSPM_SYNC_CHECK("AES1 Sync Check", 1),
4488 HDSPM_SYNC_CHECK("AES2 Sync Check", 2),
4489 HDSPM_SYNC_CHECK("AES3 Sync Check", 3),
4490 HDSPM_SYNC_CHECK("AES4 Sync Check", 4),
4491 HDSPM_SYNC_CHECK("AES5 Sync Check", 5),
4492 HDSPM_SYNC_CHECK("AES6 Sync Check", 6),
4493 HDSPM_SYNC_CHECK("AES7 Sync Check", 7),
4494 HDSPM_SYNC_CHECK("AES8 Sync Check", 8),
4495 HDSPM_SYNC_CHECK("TCO Sync Check", 9),
4496 HDSPM_SYNC_CHECK("SYNC IN Sync Check", 10),
4497 HDSPM_AUTOSYNC_SAMPLE_RATE("WC Frequency", 0),
4498 HDSPM_AUTOSYNC_SAMPLE_RATE("AES1 Frequency", 1),
4499 HDSPM_AUTOSYNC_SAMPLE_RATE("AES2 Frequency", 2),
4500 HDSPM_AUTOSYNC_SAMPLE_RATE("AES3 Frequency", 3),
4501 HDSPM_AUTOSYNC_SAMPLE_RATE("AES4 Frequency", 4),
4502 HDSPM_AUTOSYNC_SAMPLE_RATE("AES5 Frequency", 5),
4503 HDSPM_AUTOSYNC_SAMPLE_RATE("AES6 Frequency", 6),
4504 HDSPM_AUTOSYNC_SAMPLE_RATE("AES7 Frequency", 7),
4505 HDSPM_AUTOSYNC_SAMPLE_RATE("AES8 Frequency", 8),
4506 HDSPM_AUTOSYNC_SAMPLE_RATE("TCO Frequency", 9),
4507 HDSPM_AUTOSYNC_SAMPLE_RATE("SYNC IN Frequency", 10),
4508 HDSPM_LINE_OUT("Line Out", 0),
4509 HDSPM_EMPHASIS("Emphasis", 0),
4510 HDSPM_DOLBY("Non Audio", 0),
4511 HDSPM_PROFESSIONAL("Professional", 0),
4512 HDSPM_C_TMS("Clear Track Marker", 0),
4513 HDSPM_DS_WIRE("Double Speed Wire Mode", 0),
4514 HDSPM_QS_WIRE("Quad Speed Wire Mode", 0),
4519 /* Control elements for the optional TCO module */
4520 static struct snd_kcontrol_new snd_hdspm_controls_tco[] = {
4521 HDSPM_TCO_SAMPLE_RATE("TCO Sample Rate", 0),
4522 HDSPM_TCO_PULL("TCO Pull", 0),
4523 HDSPM_TCO_WCK_CONVERSION("TCO WCK Conversion", 0),
4524 HDSPM_TCO_FRAME_RATE("TCO Frame Rate", 0),
4525 HDSPM_TCO_SYNC_SOURCE("TCO Sync Source", 0),
4526 HDSPM_TCO_WORD_TERM("TCO Word Term", 0)
4530 static struct snd_kcontrol_new snd_hdspm_playback_mixer = HDSPM_PLAYBACK_MIXER;
4533 static int hdspm_update_simple_mixer_controls(struct hdspm * hdspm)
4535 int i;
4537 for (i = hdspm->ds_out_channels; i < hdspm->ss_out_channels; ++i) {
4538 if (hdspm->system_sample_rate > 48000) {
4539 hdspm->playback_mixer_ctls[i]->vd[0].access =
4540 SNDRV_CTL_ELEM_ACCESS_INACTIVE |
4541 SNDRV_CTL_ELEM_ACCESS_READ |
4542 SNDRV_CTL_ELEM_ACCESS_VOLATILE;
4543 } else {
4544 hdspm->playback_mixer_ctls[i]->vd[0].access =
4545 SNDRV_CTL_ELEM_ACCESS_READWRITE |
4546 SNDRV_CTL_ELEM_ACCESS_VOLATILE;
4548 snd_ctl_notify(hdspm->card, SNDRV_CTL_EVENT_MASK_VALUE |
4549 SNDRV_CTL_EVENT_MASK_INFO,
4550 &hdspm->playback_mixer_ctls[i]->id);
4553 return 0;
4557 static int snd_hdspm_create_controls(struct snd_card *card,
4558 struct hdspm *hdspm)
4560 unsigned int idx, limit;
4561 int err;
4562 struct snd_kcontrol *kctl;
4563 struct snd_kcontrol_new *list = NULL;
4565 switch (hdspm->io_type) {
4566 case MADI:
4567 list = snd_hdspm_controls_madi;
4568 limit = ARRAY_SIZE(snd_hdspm_controls_madi);
4569 break;
4570 case MADIface:
4571 list = snd_hdspm_controls_madiface;
4572 limit = ARRAY_SIZE(snd_hdspm_controls_madiface);
4573 break;
4574 case AIO:
4575 list = snd_hdspm_controls_aio;
4576 limit = ARRAY_SIZE(snd_hdspm_controls_aio);
4577 break;
4578 case RayDAT:
4579 list = snd_hdspm_controls_raydat;
4580 limit = ARRAY_SIZE(snd_hdspm_controls_raydat);
4581 break;
4582 case AES32:
4583 list = snd_hdspm_controls_aes32;
4584 limit = ARRAY_SIZE(snd_hdspm_controls_aes32);
4585 break;
4588 if (NULL != list) {
4589 for (idx = 0; idx < limit; idx++) {
4590 err = snd_ctl_add(card,
4591 snd_ctl_new1(&list[idx], hdspm));
4592 if (err < 0)
4593 return err;
4598 /* create simple 1:1 playback mixer controls */
4599 snd_hdspm_playback_mixer.name = "Chn";
4600 if (hdspm->system_sample_rate >= 128000) {
4601 limit = hdspm->qs_out_channels;
4602 } else if (hdspm->system_sample_rate >= 64000) {
4603 limit = hdspm->ds_out_channels;
4604 } else {
4605 limit = hdspm->ss_out_channels;
4607 for (idx = 0; idx < limit; ++idx) {
4608 snd_hdspm_playback_mixer.index = idx + 1;
4609 kctl = snd_ctl_new1(&snd_hdspm_playback_mixer, hdspm);
4610 err = snd_ctl_add(card, kctl);
4611 if (err < 0)
4612 return err;
4613 hdspm->playback_mixer_ctls[idx] = kctl;
4617 if (hdspm->tco) {
4618 /* add tco control elements */
4619 list = snd_hdspm_controls_tco;
4620 limit = ARRAY_SIZE(snd_hdspm_controls_tco);
4621 for (idx = 0; idx < limit; idx++) {
4622 err = snd_ctl_add(card,
4623 snd_ctl_new1(&list[idx], hdspm));
4624 if (err < 0)
4625 return err;
4629 return 0;
4632 /*------------------------------------------------------------
4633 /proc interface
4634 ------------------------------------------------------------*/
4636 static void
4637 snd_hdspm_proc_read_madi(struct snd_info_entry * entry,
4638 struct snd_info_buffer *buffer)
4640 struct hdspm *hdspm = entry->private_data;
4641 unsigned int status, status2, control, freq;
4643 char *pref_sync_ref;
4644 char *autosync_ref;
4645 char *system_clock_mode;
4646 char *insel;
4647 int x, x2;
4649 /* TCO stuff */
4650 int a, ltc, frames, seconds, minutes, hours;
4651 unsigned int period;
4652 u64 freq_const = 0;
4653 u32 rate;
4655 status = hdspm_read(hdspm, HDSPM_statusRegister);
4656 status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
4657 control = hdspm->control_register;
4658 freq = hdspm_read(hdspm, HDSPM_timecodeRegister);
4660 snd_iprintf(buffer, "%s (Card #%d) Rev.%x Status2first3bits: %x\n",
4661 hdspm->card_name, hdspm->card->number + 1,
4662 hdspm->firmware_rev,
4663 (status2 & HDSPM_version0) |
4664 (status2 & HDSPM_version1) | (status2 &
4665 HDSPM_version2));
4667 snd_iprintf(buffer, "HW Serial: 0x%06x%06x\n",
4668 (hdspm_read(hdspm, HDSPM_midiStatusIn1)>>8) & 0xFFFFFF,
4669 (hdspm_read(hdspm, HDSPM_midiStatusIn0)>>8) & 0xFFFFFF);
4671 snd_iprintf(buffer, "IRQ: %d Registers bus: 0x%lx VM: 0x%lx\n",
4672 hdspm->irq, hdspm->port, (unsigned long)hdspm->iobase);
4674 snd_iprintf(buffer, "--- System ---\n");
4676 snd_iprintf(buffer,
4677 "IRQ Pending: Audio=%d, MIDI0=%d, MIDI1=%d, IRQcount=%d\n",
4678 status & HDSPM_audioIRQPending,
4679 (status & HDSPM_midi0IRQPending) ? 1 : 0,
4680 (status & HDSPM_midi1IRQPending) ? 1 : 0,
4681 hdspm->irq_count);
4682 snd_iprintf(buffer,
4683 "HW pointer: id = %d, rawptr = %d (%d->%d) "
4684 "estimated= %ld (bytes)\n",
4685 ((status & HDSPM_BufferID) ? 1 : 0),
4686 (status & HDSPM_BufferPositionMask),
4687 (status & HDSPM_BufferPositionMask) %
4688 (2 * (int)hdspm->period_bytes),
4689 ((status & HDSPM_BufferPositionMask) - 64) %
4690 (2 * (int)hdspm->period_bytes),
4691 (long) hdspm_hw_pointer(hdspm) * 4);
4693 snd_iprintf(buffer,
4694 "MIDI FIFO: Out1=0x%x, Out2=0x%x, In1=0x%x, In2=0x%x \n",
4695 hdspm_read(hdspm, HDSPM_midiStatusOut0) & 0xFF,
4696 hdspm_read(hdspm, HDSPM_midiStatusOut1) & 0xFF,
4697 hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xFF,
4698 hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xFF);
4699 snd_iprintf(buffer,
4700 "MIDIoverMADI FIFO: In=0x%x, Out=0x%x \n",
4701 hdspm_read(hdspm, HDSPM_midiStatusIn2) & 0xFF,
4702 hdspm_read(hdspm, HDSPM_midiStatusOut2) & 0xFF);
4703 snd_iprintf(buffer,
4704 "Register: ctrl1=0x%x, ctrl2=0x%x, status1=0x%x, "
4705 "status2=0x%x\n",
4706 hdspm->control_register, hdspm->control2_register,
4707 status, status2);
4708 if (status & HDSPM_tco_detect) {
4709 snd_iprintf(buffer, "TCO module detected.\n");
4710 a = hdspm_read(hdspm, HDSPM_RD_TCO+4);
4711 if (a & HDSPM_TCO1_LTC_Input_valid) {
4712 snd_iprintf(buffer, " LTC valid, ");
4713 switch (a & (HDSPM_TCO1_LTC_Format_LSB |
4714 HDSPM_TCO1_LTC_Format_MSB)) {
4715 case 0:
4716 snd_iprintf(buffer, "24 fps, ");
4717 break;
4718 case HDSPM_TCO1_LTC_Format_LSB:
4719 snd_iprintf(buffer, "25 fps, ");
4720 break;
4721 case HDSPM_TCO1_LTC_Format_MSB:
4722 snd_iprintf(buffer, "29.97 fps, ");
4723 break;
4724 default:
4725 snd_iprintf(buffer, "30 fps, ");
4726 break;
4728 if (a & HDSPM_TCO1_set_drop_frame_flag) {
4729 snd_iprintf(buffer, "drop frame\n");
4730 } else {
4731 snd_iprintf(buffer, "full frame\n");
4733 } else {
4734 snd_iprintf(buffer, " no LTC\n");
4736 if (a & HDSPM_TCO1_Video_Input_Format_NTSC) {
4737 snd_iprintf(buffer, " Video: NTSC\n");
4738 } else if (a & HDSPM_TCO1_Video_Input_Format_PAL) {
4739 snd_iprintf(buffer, " Video: PAL\n");
4740 } else {
4741 snd_iprintf(buffer, " No video\n");
4743 if (a & HDSPM_TCO1_TCO_lock) {
4744 snd_iprintf(buffer, " Sync: lock\n");
4745 } else {
4746 snd_iprintf(buffer, " Sync: no lock\n");
4749 switch (hdspm->io_type) {
4750 case MADI:
4751 case AES32:
4752 freq_const = 110069313433624ULL;
4753 break;
4754 case RayDAT:
4755 case AIO:
4756 freq_const = 104857600000000ULL;
4757 break;
4758 case MADIface:
4759 break; /* no TCO possible */
4762 period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ);
4763 snd_iprintf(buffer, " period: %u\n", period);
4766 /* rate = freq_const/period; */
4767 rate = div_u64(freq_const, period);
4769 if (control & HDSPM_QuadSpeed) {
4770 rate *= 4;
4771 } else if (control & HDSPM_DoubleSpeed) {
4772 rate *= 2;
4775 snd_iprintf(buffer, " Frequency: %u Hz\n",
4776 (unsigned int) rate);
4778 ltc = hdspm_read(hdspm, HDSPM_RD_TCO);
4779 frames = ltc & 0xF;
4780 ltc >>= 4;
4781 frames += (ltc & 0x3) * 10;
4782 ltc >>= 4;
4783 seconds = ltc & 0xF;
4784 ltc >>= 4;
4785 seconds += (ltc & 0x7) * 10;
4786 ltc >>= 4;
4787 minutes = ltc & 0xF;
4788 ltc >>= 4;
4789 minutes += (ltc & 0x7) * 10;
4790 ltc >>= 4;
4791 hours = ltc & 0xF;
4792 ltc >>= 4;
4793 hours += (ltc & 0x3) * 10;
4794 snd_iprintf(buffer,
4795 " LTC In: %02d:%02d:%02d:%02d\n",
4796 hours, minutes, seconds, frames);
4798 } else {
4799 snd_iprintf(buffer, "No TCO module detected.\n");
4802 snd_iprintf(buffer, "--- Settings ---\n");
4804 x = 1 << (6 + hdspm_decode_latency(hdspm->control_register &
4805 HDSPM_LatencyMask));
4807 snd_iprintf(buffer,
4808 "Size (Latency): %d samples (2 periods of %lu bytes)\n",
4809 x, (unsigned long) hdspm->period_bytes);
4811 snd_iprintf(buffer, "Line out: %s\n",
4812 (hdspm->control_register & HDSPM_LineOut) ? "on " : "off");
4814 switch (hdspm->control_register & HDSPM_InputMask) {
4815 case HDSPM_InputOptical:
4816 insel = "Optical";
4817 break;
4818 case HDSPM_InputCoaxial:
4819 insel = "Coaxial";
4820 break;
4821 default:
4822 insel = "Unkown";
4825 snd_iprintf(buffer,
4826 "ClearTrackMarker = %s, Transmit in %s Channel Mode, "
4827 "Auto Input %s\n",
4828 (hdspm->control_register & HDSPM_clr_tms) ? "on" : "off",
4829 (hdspm->control_register & HDSPM_TX_64ch) ? "64" : "56",
4830 (hdspm->control_register & HDSPM_AutoInp) ? "on" : "off");
4833 if (!(hdspm->control_register & HDSPM_ClockModeMaster))
4834 system_clock_mode = "AutoSync";
4835 else
4836 system_clock_mode = "Master";
4837 snd_iprintf(buffer, "AutoSync Reference: %s\n", system_clock_mode);
4839 switch (hdspm_pref_sync_ref(hdspm)) {
4840 case HDSPM_SYNC_FROM_WORD:
4841 pref_sync_ref = "Word Clock";
4842 break;
4843 case HDSPM_SYNC_FROM_MADI:
4844 pref_sync_ref = "MADI Sync";
4845 break;
4846 case HDSPM_SYNC_FROM_TCO:
4847 pref_sync_ref = "TCO";
4848 break;
4849 case HDSPM_SYNC_FROM_SYNC_IN:
4850 pref_sync_ref = "Sync In";
4851 break;
4852 default:
4853 pref_sync_ref = "XXXX Clock";
4854 break;
4856 snd_iprintf(buffer, "Preferred Sync Reference: %s\n",
4857 pref_sync_ref);
4859 snd_iprintf(buffer, "System Clock Frequency: %d\n",
4860 hdspm->system_sample_rate);
4863 snd_iprintf(buffer, "--- Status:\n");
4865 x = status & HDSPM_madiSync;
4866 x2 = status2 & HDSPM_wcSync;
4868 snd_iprintf(buffer, "Inputs MADI=%s, WordClock=%s\n",
4869 (status & HDSPM_madiLock) ? (x ? "Sync" : "Lock") :
4870 "NoLock",
4871 (status2 & HDSPM_wcLock) ? (x2 ? "Sync" : "Lock") :
4872 "NoLock");
4874 switch (hdspm_autosync_ref(hdspm)) {
4875 case HDSPM_AUTOSYNC_FROM_SYNC_IN:
4876 autosync_ref = "Sync In";
4877 break;
4878 case HDSPM_AUTOSYNC_FROM_TCO:
4879 autosync_ref = "TCO";
4880 break;
4881 case HDSPM_AUTOSYNC_FROM_WORD:
4882 autosync_ref = "Word Clock";
4883 break;
4884 case HDSPM_AUTOSYNC_FROM_MADI:
4885 autosync_ref = "MADI Sync";
4886 break;
4887 case HDSPM_AUTOSYNC_FROM_NONE:
4888 autosync_ref = "Input not valid";
4889 break;
4890 default:
4891 autosync_ref = "---";
4892 break;
4894 snd_iprintf(buffer,
4895 "AutoSync: Reference= %s, Freq=%d (MADI = %d, Word = %d)\n",
4896 autosync_ref, hdspm_external_sample_rate(hdspm),
4897 (status & HDSPM_madiFreqMask) >> 22,
4898 (status2 & HDSPM_wcFreqMask) >> 5);
4900 snd_iprintf(buffer, "Input: %s, Mode=%s\n",
4901 (status & HDSPM_AB_int) ? "Coax" : "Optical",
4902 (status & HDSPM_RX_64ch) ? "64 channels" :
4903 "56 channels");
4905 snd_iprintf(buffer, "\n");
4908 static void
4909 snd_hdspm_proc_read_aes32(struct snd_info_entry * entry,
4910 struct snd_info_buffer *buffer)
4912 struct hdspm *hdspm = entry->private_data;
4913 unsigned int status;
4914 unsigned int status2;
4915 unsigned int timecode;
4916 int pref_syncref;
4917 char *autosync_ref;
4918 int x;
4920 status = hdspm_read(hdspm, HDSPM_statusRegister);
4921 status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
4922 timecode = hdspm_read(hdspm, HDSPM_timecodeRegister);
4924 snd_iprintf(buffer, "%s (Card #%d) Rev.%x\n",
4925 hdspm->card_name, hdspm->card->number + 1,
4926 hdspm->firmware_rev);
4928 snd_iprintf(buffer, "IRQ: %d Registers bus: 0x%lx VM: 0x%lx\n",
4929 hdspm->irq, hdspm->port, (unsigned long)hdspm->iobase);
4931 snd_iprintf(buffer, "--- System ---\n");
4933 snd_iprintf(buffer,
4934 "IRQ Pending: Audio=%d, MIDI0=%d, MIDI1=%d, IRQcount=%d\n",
4935 status & HDSPM_audioIRQPending,
4936 (status & HDSPM_midi0IRQPending) ? 1 : 0,
4937 (status & HDSPM_midi1IRQPending) ? 1 : 0,
4938 hdspm->irq_count);
4939 snd_iprintf(buffer,
4940 "HW pointer: id = %d, rawptr = %d (%d->%d) "
4941 "estimated= %ld (bytes)\n",
4942 ((status & HDSPM_BufferID) ? 1 : 0),
4943 (status & HDSPM_BufferPositionMask),
4944 (status & HDSPM_BufferPositionMask) %
4945 (2 * (int)hdspm->period_bytes),
4946 ((status & HDSPM_BufferPositionMask) - 64) %
4947 (2 * (int)hdspm->period_bytes),
4948 (long) hdspm_hw_pointer(hdspm) * 4);
4950 snd_iprintf(buffer,
4951 "MIDI FIFO: Out1=0x%x, Out2=0x%x, In1=0x%x, In2=0x%x \n",
4952 hdspm_read(hdspm, HDSPM_midiStatusOut0) & 0xFF,
4953 hdspm_read(hdspm, HDSPM_midiStatusOut1) & 0xFF,
4954 hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xFF,
4955 hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xFF);
4956 snd_iprintf(buffer,
4957 "MIDIoverMADI FIFO: In=0x%x, Out=0x%x \n",
4958 hdspm_read(hdspm, HDSPM_midiStatusIn2) & 0xFF,
4959 hdspm_read(hdspm, HDSPM_midiStatusOut2) & 0xFF);
4960 snd_iprintf(buffer,
4961 "Register: ctrl1=0x%x, ctrl2=0x%x, status1=0x%x, "
4962 "status2=0x%x\n",
4963 hdspm->control_register, hdspm->control2_register,
4964 status, status2);
4966 snd_iprintf(buffer, "--- Settings ---\n");
4968 x = 1 << (6 + hdspm_decode_latency(hdspm->control_register &
4969 HDSPM_LatencyMask));
4971 snd_iprintf(buffer,
4972 "Size (Latency): %d samples (2 periods of %lu bytes)\n",
4973 x, (unsigned long) hdspm->period_bytes);
4975 snd_iprintf(buffer, "Line out: %s\n",
4976 (hdspm->
4977 control_register & HDSPM_LineOut) ? "on " : "off");
4979 snd_iprintf(buffer,
4980 "ClearTrackMarker %s, Emphasis %s, Dolby %s\n",
4981 (hdspm->
4982 control_register & HDSPM_clr_tms) ? "on" : "off",
4983 (hdspm->
4984 control_register & HDSPM_Emphasis) ? "on" : "off",
4985 (hdspm->
4986 control_register & HDSPM_Dolby) ? "on" : "off");
4989 pref_syncref = hdspm_pref_sync_ref(hdspm);
4990 if (pref_syncref == 0)
4991 snd_iprintf(buffer, "Preferred Sync Reference: Word Clock\n");
4992 else
4993 snd_iprintf(buffer, "Preferred Sync Reference: AES%d\n",
4994 pref_syncref);
4996 snd_iprintf(buffer, "System Clock Frequency: %d\n",
4997 hdspm->system_sample_rate);
4999 snd_iprintf(buffer, "Double speed: %s\n",
5000 hdspm->control_register & HDSPM_DS_DoubleWire?
5001 "Double wire" : "Single wire");
5002 snd_iprintf(buffer, "Quad speed: %s\n",
5003 hdspm->control_register & HDSPM_QS_DoubleWire?
5004 "Double wire" :
5005 hdspm->control_register & HDSPM_QS_QuadWire?
5006 "Quad wire" : "Single wire");
5008 snd_iprintf(buffer, "--- Status:\n");
5010 snd_iprintf(buffer, "Word: %s Frequency: %d\n",
5011 (status & HDSPM_AES32_wcLock) ? "Sync " : "No Lock",
5012 HDSPM_bit2freq((status >> HDSPM_AES32_wcFreq_bit) & 0xF));
5014 for (x = 0; x < 8; x++) {
5015 snd_iprintf(buffer, "AES%d: %s Frequency: %d\n",
5016 x+1,
5017 (status2 & (HDSPM_LockAES >> x)) ?
5018 "Sync " : "No Lock",
5019 HDSPM_bit2freq((timecode >> (4*x)) & 0xF));
5022 switch (hdspm_autosync_ref(hdspm)) {
5023 case HDSPM_AES32_AUTOSYNC_FROM_NONE:
5024 autosync_ref = "None"; break;
5025 case HDSPM_AES32_AUTOSYNC_FROM_WORD:
5026 autosync_ref = "Word Clock"; break;
5027 case HDSPM_AES32_AUTOSYNC_FROM_AES1:
5028 autosync_ref = "AES1"; break;
5029 case HDSPM_AES32_AUTOSYNC_FROM_AES2:
5030 autosync_ref = "AES2"; break;
5031 case HDSPM_AES32_AUTOSYNC_FROM_AES3:
5032 autosync_ref = "AES3"; break;
5033 case HDSPM_AES32_AUTOSYNC_FROM_AES4:
5034 autosync_ref = "AES4"; break;
5035 case HDSPM_AES32_AUTOSYNC_FROM_AES5:
5036 autosync_ref = "AES5"; break;
5037 case HDSPM_AES32_AUTOSYNC_FROM_AES6:
5038 autosync_ref = "AES6"; break;
5039 case HDSPM_AES32_AUTOSYNC_FROM_AES7:
5040 autosync_ref = "AES7"; break;
5041 case HDSPM_AES32_AUTOSYNC_FROM_AES8:
5042 autosync_ref = "AES8"; break;
5043 default:
5044 autosync_ref = "---"; break;
5046 snd_iprintf(buffer, "AutoSync ref = %s\n", autosync_ref);
5048 snd_iprintf(buffer, "\n");
5051 static void
5052 snd_hdspm_proc_read_raydat(struct snd_info_entry *entry,
5053 struct snd_info_buffer *buffer)
5055 struct hdspm *hdspm = entry->private_data;
5056 unsigned int status1, status2, status3, control, i;
5057 unsigned int lock, sync;
5059 status1 = hdspm_read(hdspm, HDSPM_RD_STATUS_1); /* s1 */
5060 status2 = hdspm_read(hdspm, HDSPM_RD_STATUS_2); /* freq */
5061 status3 = hdspm_read(hdspm, HDSPM_RD_STATUS_3); /* s2 */
5063 control = hdspm->control_register;
5065 snd_iprintf(buffer, "STATUS1: 0x%08x\n", status1);
5066 snd_iprintf(buffer, "STATUS2: 0x%08x\n", status2);
5067 snd_iprintf(buffer, "STATUS3: 0x%08x\n", status3);
5070 snd_iprintf(buffer, "\n*** CLOCK MODE\n\n");
5072 snd_iprintf(buffer, "Clock mode : %s\n",
5073 (hdspm_system_clock_mode(hdspm) == 0) ? "master" : "slave");
5074 snd_iprintf(buffer, "System frequency: %d Hz\n",
5075 hdspm_get_system_sample_rate(hdspm));
5077 snd_iprintf(buffer, "\n*** INPUT STATUS\n\n");
5079 lock = 0x1;
5080 sync = 0x100;
5082 for (i = 0; i < 8; i++) {
5083 snd_iprintf(buffer, "s1_input %d: Lock %d, Sync %d, Freq %s\n",
5085 (status1 & lock) ? 1 : 0,
5086 (status1 & sync) ? 1 : 0,
5087 texts_freq[(status2 >> (i * 4)) & 0xF]);
5089 lock = lock<<1;
5090 sync = sync<<1;
5093 snd_iprintf(buffer, "WC input: Lock %d, Sync %d, Freq %s\n",
5094 (status1 & 0x1000000) ? 1 : 0,
5095 (status1 & 0x2000000) ? 1 : 0,
5096 texts_freq[(status1 >> 16) & 0xF]);
5098 snd_iprintf(buffer, "TCO input: Lock %d, Sync %d, Freq %s\n",
5099 (status1 & 0x4000000) ? 1 : 0,
5100 (status1 & 0x8000000) ? 1 : 0,
5101 texts_freq[(status1 >> 20) & 0xF]);
5103 snd_iprintf(buffer, "SYNC IN: Lock %d, Sync %d, Freq %s\n",
5104 (status3 & 0x400) ? 1 : 0,
5105 (status3 & 0x800) ? 1 : 0,
5106 texts_freq[(status2 >> 12) & 0xF]);
5110 #ifdef CONFIG_SND_DEBUG
5111 static void
5112 snd_hdspm_proc_read_debug(struct snd_info_entry *entry,
5113 struct snd_info_buffer *buffer)
5115 struct hdspm *hdspm = entry->private_data;
5117 int j,i;
5119 for (i = 0; i < 256 /* 1024*64 */; i += j) {
5120 snd_iprintf(buffer, "0x%08X: ", i);
5121 for (j = 0; j < 16; j += 4)
5122 snd_iprintf(buffer, "%08X ", hdspm_read(hdspm, i + j));
5123 snd_iprintf(buffer, "\n");
5126 #endif
5129 static void snd_hdspm_proc_ports_in(struct snd_info_entry *entry,
5130 struct snd_info_buffer *buffer)
5132 struct hdspm *hdspm = entry->private_data;
5133 int i;
5135 snd_iprintf(buffer, "# generated by hdspm\n");
5137 for (i = 0; i < hdspm->max_channels_in; i++) {
5138 snd_iprintf(buffer, "%d=%s\n", i+1, hdspm->port_names_in[i]);
5142 static void snd_hdspm_proc_ports_out(struct snd_info_entry *entry,
5143 struct snd_info_buffer *buffer)
5145 struct hdspm *hdspm = entry->private_data;
5146 int i;
5148 snd_iprintf(buffer, "# generated by hdspm\n");
5150 for (i = 0; i < hdspm->max_channels_out; i++) {
5151 snd_iprintf(buffer, "%d=%s\n", i+1, hdspm->port_names_out[i]);
5156 static void __devinit snd_hdspm_proc_init(struct hdspm *hdspm)
5158 struct snd_info_entry *entry;
5160 if (!snd_card_proc_new(hdspm->card, "hdspm", &entry)) {
5161 switch (hdspm->io_type) {
5162 case AES32:
5163 snd_info_set_text_ops(entry, hdspm,
5164 snd_hdspm_proc_read_aes32);
5165 break;
5166 case MADI:
5167 snd_info_set_text_ops(entry, hdspm,
5168 snd_hdspm_proc_read_madi);
5169 break;
5170 case MADIface:
5171 /* snd_info_set_text_ops(entry, hdspm,
5172 snd_hdspm_proc_read_madiface); */
5173 break;
5174 case RayDAT:
5175 snd_info_set_text_ops(entry, hdspm,
5176 snd_hdspm_proc_read_raydat);
5177 break;
5178 case AIO:
5179 break;
5183 if (!snd_card_proc_new(hdspm->card, "ports.in", &entry)) {
5184 snd_info_set_text_ops(entry, hdspm, snd_hdspm_proc_ports_in);
5187 if (!snd_card_proc_new(hdspm->card, "ports.out", &entry)) {
5188 snd_info_set_text_ops(entry, hdspm, snd_hdspm_proc_ports_out);
5191 #ifdef CONFIG_SND_DEBUG
5192 /* debug file to read all hdspm registers */
5193 if (!snd_card_proc_new(hdspm->card, "debug", &entry))
5194 snd_info_set_text_ops(entry, hdspm,
5195 snd_hdspm_proc_read_debug);
5196 #endif
5199 /*------------------------------------------------------------
5200 hdspm intitialize
5201 ------------------------------------------------------------*/
5203 static int snd_hdspm_set_defaults(struct hdspm * hdspm)
5205 /* ASSUMPTION: hdspm->lock is either held, or there is no need to
5206 hold it (e.g. during module initialization).
5209 /* set defaults: */
5211 hdspm->settings_register = 0;
5213 switch (hdspm->io_type) {
5214 case MADI:
5215 case MADIface:
5216 hdspm->control_register =
5217 0x2 + 0x8 + 0x10 + 0x80 + 0x400 + 0x4000 + 0x1000000;
5218 break;
5220 case RayDAT:
5221 case AIO:
5222 hdspm->settings_register = 0x1 + 0x1000;
5223 /* Magic values are: LAT_0, LAT_2, Master, freq1, tx64ch, inp_0,
5224 * line_out */
5225 hdspm->control_register =
5226 0x2 + 0x8 + 0x10 + 0x80 + 0x400 + 0x4000 + 0x1000000;
5227 break;
5229 case AES32:
5230 hdspm->control_register =
5231 HDSPM_ClockModeMaster | /* Master Cloack Mode on */
5232 hdspm_encode_latency(7) | /* latency max=8192samples */
5233 HDSPM_SyncRef0 | /* AES1 is syncclock */
5234 HDSPM_LineOut | /* Analog output in */
5235 HDSPM_Professional; /* Professional mode */
5236 break;
5239 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
5241 if (AES32 == hdspm->io_type) {
5242 /* No control2 register for AES32 */
5243 #ifdef SNDRV_BIG_ENDIAN
5244 hdspm->control2_register = HDSPM_BIGENDIAN_MODE;
5245 #else
5246 hdspm->control2_register = 0;
5247 #endif
5249 hdspm_write(hdspm, HDSPM_control2Reg, hdspm->control2_register);
5251 hdspm_compute_period_size(hdspm);
5253 /* silence everything */
5255 all_in_all_mixer(hdspm, 0 * UNITY_GAIN);
5257 if (hdspm->io_type == AIO || hdspm->io_type == RayDAT) {
5258 hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register);
5261 /* set a default rate so that the channel map is set up. */
5262 hdspm_set_rate(hdspm, 48000, 1);
5264 return 0;
5268 /*------------------------------------------------------------
5269 interrupt
5270 ------------------------------------------------------------*/
5272 static irqreturn_t snd_hdspm_interrupt(int irq, void *dev_id)
5274 struct hdspm *hdspm = (struct hdspm *) dev_id;
5275 unsigned int status;
5276 int i, audio, midi, schedule = 0;
5277 /* cycles_t now; */
5279 status = hdspm_read(hdspm, HDSPM_statusRegister);
5281 audio = status & HDSPM_audioIRQPending;
5282 midi = status & (HDSPM_midi0IRQPending | HDSPM_midi1IRQPending |
5283 HDSPM_midi2IRQPending | HDSPM_midi3IRQPending);
5285 /* now = get_cycles(); */
5287 * LAT_2..LAT_0 period counter (win) counter (mac)
5288 * 6 4096 ~256053425 ~514672358
5289 * 5 2048 ~128024983 ~257373821
5290 * 4 1024 ~64023706 ~128718089
5291 * 3 512 ~32005945 ~64385999
5292 * 2 256 ~16003039 ~32260176
5293 * 1 128 ~7998738 ~16194507
5294 * 0 64 ~3998231 ~8191558
5297 snd_printk(KERN_INFO "snd_hdspm_interrupt %llu @ %llx\n",
5298 now-hdspm->last_interrupt, status & 0xFFC0);
5299 hdspm->last_interrupt = now;
5302 if (!audio && !midi)
5303 return IRQ_NONE;
5305 hdspm_write(hdspm, HDSPM_interruptConfirmation, 0);
5306 hdspm->irq_count++;
5309 if (audio) {
5310 if (hdspm->capture_substream)
5311 snd_pcm_period_elapsed(hdspm->capture_substream);
5313 if (hdspm->playback_substream)
5314 snd_pcm_period_elapsed(hdspm->playback_substream);
5317 if (midi) {
5318 i = 0;
5319 while (i < hdspm->midiPorts) {
5320 if ((hdspm_read(hdspm,
5321 hdspm->midi[i].statusIn) & 0xff) &&
5322 (status & hdspm->midi[i].irq)) {
5323 /* we disable interrupts for this input until
5324 * processing is done
5326 hdspm->control_register &= ~hdspm->midi[i].ie;
5327 hdspm_write(hdspm, HDSPM_controlRegister,
5328 hdspm->control_register);
5329 hdspm->midi[i].pending = 1;
5330 schedule = 1;
5333 i++;
5336 if (schedule)
5337 tasklet_hi_schedule(&hdspm->midi_tasklet);
5340 return IRQ_HANDLED;
5343 /*------------------------------------------------------------
5344 pcm interface
5345 ------------------------------------------------------------*/
5348 static snd_pcm_uframes_t snd_hdspm_hw_pointer(struct snd_pcm_substream
5349 *substream)
5351 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5352 return hdspm_hw_pointer(hdspm);
5356 static int snd_hdspm_reset(struct snd_pcm_substream *substream)
5358 struct snd_pcm_runtime *runtime = substream->runtime;
5359 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5360 struct snd_pcm_substream *other;
5362 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
5363 other = hdspm->capture_substream;
5364 else
5365 other = hdspm->playback_substream;
5367 if (hdspm->running)
5368 runtime->status->hw_ptr = hdspm_hw_pointer(hdspm);
5369 else
5370 runtime->status->hw_ptr = 0;
5371 if (other) {
5372 struct snd_pcm_substream *s;
5373 struct snd_pcm_runtime *oruntime = other->runtime;
5374 snd_pcm_group_for_each_entry(s, substream) {
5375 if (s == other) {
5376 oruntime->status->hw_ptr =
5377 runtime->status->hw_ptr;
5378 break;
5382 return 0;
5385 static int snd_hdspm_hw_params(struct snd_pcm_substream *substream,
5386 struct snd_pcm_hw_params *params)
5388 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5389 int err;
5390 int i;
5391 pid_t this_pid;
5392 pid_t other_pid;
5394 spin_lock_irq(&hdspm->lock);
5396 if (substream->pstr->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5397 this_pid = hdspm->playback_pid;
5398 other_pid = hdspm->capture_pid;
5399 } else {
5400 this_pid = hdspm->capture_pid;
5401 other_pid = hdspm->playback_pid;
5404 if (other_pid > 0 && this_pid != other_pid) {
5406 /* The other stream is open, and not by the same
5407 task as this one. Make sure that the parameters
5408 that matter are the same.
5411 if (params_rate(params) != hdspm->system_sample_rate) {
5412 spin_unlock_irq(&hdspm->lock);
5413 _snd_pcm_hw_param_setempty(params,
5414 SNDRV_PCM_HW_PARAM_RATE);
5415 return -EBUSY;
5418 if (params_period_size(params) != hdspm->period_bytes / 4) {
5419 spin_unlock_irq(&hdspm->lock);
5420 _snd_pcm_hw_param_setempty(params,
5421 SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
5422 return -EBUSY;
5426 /* We're fine. */
5427 spin_unlock_irq(&hdspm->lock);
5429 /* how to make sure that the rate matches an externally-set one ? */
5431 spin_lock_irq(&hdspm->lock);
5432 err = hdspm_set_rate(hdspm, params_rate(params), 0);
5433 if (err < 0) {
5434 snd_printk(KERN_INFO "err on hdspm_set_rate: %d\n", err);
5435 spin_unlock_irq(&hdspm->lock);
5436 _snd_pcm_hw_param_setempty(params,
5437 SNDRV_PCM_HW_PARAM_RATE);
5438 return err;
5440 spin_unlock_irq(&hdspm->lock);
5442 err = hdspm_set_interrupt_interval(hdspm,
5443 params_period_size(params));
5444 if (err < 0) {
5445 snd_printk(KERN_INFO "err on hdspm_set_interrupt_interval: %d\n", err);
5446 _snd_pcm_hw_param_setempty(params,
5447 SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
5448 return err;
5451 /* Memory allocation, takashi's method, dont know if we should
5452 * spinlock
5454 /* malloc all buffer even if not enabled to get sure */
5455 /* Update for MADI rev 204: we need to allocate for all channels,
5456 * otherwise it doesn't work at 96kHz */
5458 err =
5459 snd_pcm_lib_malloc_pages(substream, HDSPM_DMA_AREA_BYTES);
5460 if (err < 0) {
5461 snd_printk(KERN_INFO "err on snd_pcm_lib_malloc_pages: %d\n", err);
5462 return err;
5465 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5467 hdspm_set_sgbuf(hdspm, substream, HDSPM_pageAddressBufferOut,
5468 params_channels(params));
5470 for (i = 0; i < params_channels(params); ++i)
5471 snd_hdspm_enable_out(hdspm, i, 1);
5473 hdspm->playback_buffer =
5474 (unsigned char *) substream->runtime->dma_area;
5475 snd_printdd("Allocated sample buffer for playback at %p\n",
5476 hdspm->playback_buffer);
5477 } else {
5478 hdspm_set_sgbuf(hdspm, substream, HDSPM_pageAddressBufferIn,
5479 params_channels(params));
5481 for (i = 0; i < params_channels(params); ++i)
5482 snd_hdspm_enable_in(hdspm, i, 1);
5484 hdspm->capture_buffer =
5485 (unsigned char *) substream->runtime->dma_area;
5486 snd_printdd("Allocated sample buffer for capture at %p\n",
5487 hdspm->capture_buffer);
5491 snd_printdd("Allocated sample buffer for %s at 0x%08X\n",
5492 substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
5493 "playback" : "capture",
5494 snd_pcm_sgbuf_get_addr(substream, 0));
5497 snd_printdd("set_hwparams: %s %d Hz, %d channels, bs = %d\n",
5498 substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
5499 "playback" : "capture",
5500 params_rate(params), params_channels(params),
5501 params_buffer_size(params));
5505 /* Switch to native float format if requested */
5506 if (SNDRV_PCM_FORMAT_FLOAT_LE == params_format(params)) {
5507 if (!(hdspm->control_register & HDSPe_FLOAT_FORMAT))
5508 snd_printk(KERN_INFO "hdspm: Switching to native 32bit LE float format.\n");
5510 hdspm->control_register |= HDSPe_FLOAT_FORMAT;
5511 } else if (SNDRV_PCM_FORMAT_S32_LE == params_format(params)) {
5512 if (hdspm->control_register & HDSPe_FLOAT_FORMAT)
5513 snd_printk(KERN_INFO "hdspm: Switching to native 32bit LE integer format.\n");
5515 hdspm->control_register &= ~HDSPe_FLOAT_FORMAT;
5517 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
5519 return 0;
5522 static int snd_hdspm_hw_free(struct snd_pcm_substream *substream)
5524 int i;
5525 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5527 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5529 /* params_channels(params) should be enough,
5530 but to get sure in case of error */
5531 for (i = 0; i < hdspm->max_channels_out; ++i)
5532 snd_hdspm_enable_out(hdspm, i, 0);
5534 hdspm->playback_buffer = NULL;
5535 } else {
5536 for (i = 0; i < hdspm->max_channels_in; ++i)
5537 snd_hdspm_enable_in(hdspm, i, 0);
5539 hdspm->capture_buffer = NULL;
5543 snd_pcm_lib_free_pages(substream);
5545 return 0;
5549 static int snd_hdspm_channel_info(struct snd_pcm_substream *substream,
5550 struct snd_pcm_channel_info *info)
5552 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5554 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5555 if (snd_BUG_ON(info->channel >= hdspm->max_channels_out)) {
5556 snd_printk(KERN_INFO "snd_hdspm_channel_info: output channel out of range (%d)\n", info->channel);
5557 return -EINVAL;
5560 if (hdspm->channel_map_out[info->channel] < 0) {
5561 snd_printk(KERN_INFO "snd_hdspm_channel_info: output channel %d mapped out\n", info->channel);
5562 return -EINVAL;
5565 info->offset = hdspm->channel_map_out[info->channel] *
5566 HDSPM_CHANNEL_BUFFER_BYTES;
5567 } else {
5568 if (snd_BUG_ON(info->channel >= hdspm->max_channels_in)) {
5569 snd_printk(KERN_INFO "snd_hdspm_channel_info: input channel out of range (%d)\n", info->channel);
5570 return -EINVAL;
5573 if (hdspm->channel_map_in[info->channel] < 0) {
5574 snd_printk(KERN_INFO "snd_hdspm_channel_info: input channel %d mapped out\n", info->channel);
5575 return -EINVAL;
5578 info->offset = hdspm->channel_map_in[info->channel] *
5579 HDSPM_CHANNEL_BUFFER_BYTES;
5582 info->first = 0;
5583 info->step = 32;
5584 return 0;
5588 static int snd_hdspm_ioctl(struct snd_pcm_substream *substream,
5589 unsigned int cmd, void *arg)
5591 switch (cmd) {
5592 case SNDRV_PCM_IOCTL1_RESET:
5593 return snd_hdspm_reset(substream);
5595 case SNDRV_PCM_IOCTL1_CHANNEL_INFO:
5597 struct snd_pcm_channel_info *info = arg;
5598 return snd_hdspm_channel_info(substream, info);
5600 default:
5601 break;
5604 return snd_pcm_lib_ioctl(substream, cmd, arg);
5607 static int snd_hdspm_trigger(struct snd_pcm_substream *substream, int cmd)
5609 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5610 struct snd_pcm_substream *other;
5611 int running;
5613 spin_lock(&hdspm->lock);
5614 running = hdspm->running;
5615 switch (cmd) {
5616 case SNDRV_PCM_TRIGGER_START:
5617 running |= 1 << substream->stream;
5618 break;
5619 case SNDRV_PCM_TRIGGER_STOP:
5620 running &= ~(1 << substream->stream);
5621 break;
5622 default:
5623 snd_BUG();
5624 spin_unlock(&hdspm->lock);
5625 return -EINVAL;
5627 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
5628 other = hdspm->capture_substream;
5629 else
5630 other = hdspm->playback_substream;
5632 if (other) {
5633 struct snd_pcm_substream *s;
5634 snd_pcm_group_for_each_entry(s, substream) {
5635 if (s == other) {
5636 snd_pcm_trigger_done(s, substream);
5637 if (cmd == SNDRV_PCM_TRIGGER_START)
5638 running |= 1 << s->stream;
5639 else
5640 running &= ~(1 << s->stream);
5641 goto _ok;
5644 if (cmd == SNDRV_PCM_TRIGGER_START) {
5645 if (!(running & (1 << SNDRV_PCM_STREAM_PLAYBACK))
5646 && substream->stream ==
5647 SNDRV_PCM_STREAM_CAPTURE)
5648 hdspm_silence_playback(hdspm);
5649 } else {
5650 if (running &&
5651 substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
5652 hdspm_silence_playback(hdspm);
5654 } else {
5655 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
5656 hdspm_silence_playback(hdspm);
5658 _ok:
5659 snd_pcm_trigger_done(substream, substream);
5660 if (!hdspm->running && running)
5661 hdspm_start_audio(hdspm);
5662 else if (hdspm->running && !running)
5663 hdspm_stop_audio(hdspm);
5664 hdspm->running = running;
5665 spin_unlock(&hdspm->lock);
5667 return 0;
5670 static int snd_hdspm_prepare(struct snd_pcm_substream *substream)
5672 return 0;
5675 static unsigned int period_sizes_old[] = {
5676 64, 128, 256, 512, 1024, 2048, 4096
5679 static unsigned int period_sizes_new[] = {
5680 32, 64, 128, 256, 512, 1024, 2048, 4096
5683 /* RayDAT and AIO always have a buffer of 16384 samples per channel */
5684 static unsigned int raydat_aio_buffer_sizes[] = {
5685 16384
5688 static struct snd_pcm_hardware snd_hdspm_playback_subinfo = {
5689 .info = (SNDRV_PCM_INFO_MMAP |
5690 SNDRV_PCM_INFO_MMAP_VALID |
5691 SNDRV_PCM_INFO_NONINTERLEAVED |
5692 SNDRV_PCM_INFO_SYNC_START | SNDRV_PCM_INFO_DOUBLE),
5693 .formats = SNDRV_PCM_FMTBIT_S32_LE,
5694 .rates = (SNDRV_PCM_RATE_32000 |
5695 SNDRV_PCM_RATE_44100 |
5696 SNDRV_PCM_RATE_48000 |
5697 SNDRV_PCM_RATE_64000 |
5698 SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 |
5699 SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000 ),
5700 .rate_min = 32000,
5701 .rate_max = 192000,
5702 .channels_min = 1,
5703 .channels_max = HDSPM_MAX_CHANNELS,
5704 .buffer_bytes_max =
5705 HDSPM_CHANNEL_BUFFER_BYTES * HDSPM_MAX_CHANNELS,
5706 .period_bytes_min = (64 * 4),
5707 .period_bytes_max = (4096 * 4) * HDSPM_MAX_CHANNELS,
5708 .periods_min = 2,
5709 .periods_max = 512,
5710 .fifo_size = 0
5713 static struct snd_pcm_hardware snd_hdspm_capture_subinfo = {
5714 .info = (SNDRV_PCM_INFO_MMAP |
5715 SNDRV_PCM_INFO_MMAP_VALID |
5716 SNDRV_PCM_INFO_NONINTERLEAVED |
5717 SNDRV_PCM_INFO_SYNC_START),
5718 .formats = SNDRV_PCM_FMTBIT_S32_LE,
5719 .rates = (SNDRV_PCM_RATE_32000 |
5720 SNDRV_PCM_RATE_44100 |
5721 SNDRV_PCM_RATE_48000 |
5722 SNDRV_PCM_RATE_64000 |
5723 SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 |
5724 SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000),
5725 .rate_min = 32000,
5726 .rate_max = 192000,
5727 .channels_min = 1,
5728 .channels_max = HDSPM_MAX_CHANNELS,
5729 .buffer_bytes_max =
5730 HDSPM_CHANNEL_BUFFER_BYTES * HDSPM_MAX_CHANNELS,
5731 .period_bytes_min = (64 * 4),
5732 .period_bytes_max = (4096 * 4) * HDSPM_MAX_CHANNELS,
5733 .periods_min = 2,
5734 .periods_max = 512,
5735 .fifo_size = 0
5738 static struct snd_pcm_hw_constraint_list hw_constraints_period_sizes_old = {
5739 .count = ARRAY_SIZE(period_sizes_old),
5740 .list = period_sizes_old,
5741 .mask = 0
5744 static struct snd_pcm_hw_constraint_list hw_constraints_period_sizes_new = {
5745 .count = ARRAY_SIZE(period_sizes_new),
5746 .list = period_sizes_new,
5747 .mask = 0
5750 static struct snd_pcm_hw_constraint_list hw_constraints_raydat_io_buffer = {
5751 .count = ARRAY_SIZE(raydat_aio_buffer_sizes),
5752 .list = raydat_aio_buffer_sizes,
5753 .mask = 0
5756 static int snd_hdspm_hw_rule_in_channels_rate(struct snd_pcm_hw_params *params,
5757 struct snd_pcm_hw_rule *rule)
5759 struct hdspm *hdspm = rule->private;
5760 struct snd_interval *c =
5761 hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5762 struct snd_interval *r =
5763 hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5765 if (r->min > 96000 && r->max <= 192000) {
5766 struct snd_interval t = {
5767 .min = hdspm->qs_in_channels,
5768 .max = hdspm->qs_in_channels,
5769 .integer = 1,
5771 return snd_interval_refine(c, &t);
5772 } else if (r->min > 48000 && r->max <= 96000) {
5773 struct snd_interval t = {
5774 .min = hdspm->ds_in_channels,
5775 .max = hdspm->ds_in_channels,
5776 .integer = 1,
5778 return snd_interval_refine(c, &t);
5779 } else if (r->max < 64000) {
5780 struct snd_interval t = {
5781 .min = hdspm->ss_in_channels,
5782 .max = hdspm->ss_in_channels,
5783 .integer = 1,
5785 return snd_interval_refine(c, &t);
5788 return 0;
5791 static int snd_hdspm_hw_rule_out_channels_rate(struct snd_pcm_hw_params *params,
5792 struct snd_pcm_hw_rule * rule)
5794 struct hdspm *hdspm = rule->private;
5795 struct snd_interval *c =
5796 hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5797 struct snd_interval *r =
5798 hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5800 if (r->min > 96000 && r->max <= 192000) {
5801 struct snd_interval t = {
5802 .min = hdspm->qs_out_channels,
5803 .max = hdspm->qs_out_channels,
5804 .integer = 1,
5806 return snd_interval_refine(c, &t);
5807 } else if (r->min > 48000 && r->max <= 96000) {
5808 struct snd_interval t = {
5809 .min = hdspm->ds_out_channels,
5810 .max = hdspm->ds_out_channels,
5811 .integer = 1,
5813 return snd_interval_refine(c, &t);
5814 } else if (r->max < 64000) {
5815 struct snd_interval t = {
5816 .min = hdspm->ss_out_channels,
5817 .max = hdspm->ss_out_channels,
5818 .integer = 1,
5820 return snd_interval_refine(c, &t);
5821 } else {
5823 return 0;
5826 static int snd_hdspm_hw_rule_rate_in_channels(struct snd_pcm_hw_params *params,
5827 struct snd_pcm_hw_rule * rule)
5829 struct hdspm *hdspm = rule->private;
5830 struct snd_interval *c =
5831 hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5832 struct snd_interval *r =
5833 hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5835 if (c->min >= hdspm->ss_in_channels) {
5836 struct snd_interval t = {
5837 .min = 32000,
5838 .max = 48000,
5839 .integer = 1,
5841 return snd_interval_refine(r, &t);
5842 } else if (c->max <= hdspm->qs_in_channels) {
5843 struct snd_interval t = {
5844 .min = 128000,
5845 .max = 192000,
5846 .integer = 1,
5848 return snd_interval_refine(r, &t);
5849 } else if (c->max <= hdspm->ds_in_channels) {
5850 struct snd_interval t = {
5851 .min = 64000,
5852 .max = 96000,
5853 .integer = 1,
5855 return snd_interval_refine(r, &t);
5858 return 0;
5860 static int snd_hdspm_hw_rule_rate_out_channels(struct snd_pcm_hw_params *params,
5861 struct snd_pcm_hw_rule *rule)
5863 struct hdspm *hdspm = rule->private;
5864 struct snd_interval *c =
5865 hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5866 struct snd_interval *r =
5867 hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5869 if (c->min >= hdspm->ss_out_channels) {
5870 struct snd_interval t = {
5871 .min = 32000,
5872 .max = 48000,
5873 .integer = 1,
5875 return snd_interval_refine(r, &t);
5876 } else if (c->max <= hdspm->qs_out_channels) {
5877 struct snd_interval t = {
5878 .min = 128000,
5879 .max = 192000,
5880 .integer = 1,
5882 return snd_interval_refine(r, &t);
5883 } else if (c->max <= hdspm->ds_out_channels) {
5884 struct snd_interval t = {
5885 .min = 64000,
5886 .max = 96000,
5887 .integer = 1,
5889 return snd_interval_refine(r, &t);
5892 return 0;
5895 static int snd_hdspm_hw_rule_in_channels(struct snd_pcm_hw_params *params,
5896 struct snd_pcm_hw_rule *rule)
5898 unsigned int list[3];
5899 struct hdspm *hdspm = rule->private;
5900 struct snd_interval *c = hw_param_interval(params,
5901 SNDRV_PCM_HW_PARAM_CHANNELS);
5903 list[0] = hdspm->qs_in_channels;
5904 list[1] = hdspm->ds_in_channels;
5905 list[2] = hdspm->ss_in_channels;
5906 return snd_interval_list(c, 3, list, 0);
5909 static int snd_hdspm_hw_rule_out_channels(struct snd_pcm_hw_params *params,
5910 struct snd_pcm_hw_rule *rule)
5912 unsigned int list[3];
5913 struct hdspm *hdspm = rule->private;
5914 struct snd_interval *c = hw_param_interval(params,
5915 SNDRV_PCM_HW_PARAM_CHANNELS);
5917 list[0] = hdspm->qs_out_channels;
5918 list[1] = hdspm->ds_out_channels;
5919 list[2] = hdspm->ss_out_channels;
5920 return snd_interval_list(c, 3, list, 0);
5924 static unsigned int hdspm_aes32_sample_rates[] = {
5925 32000, 44100, 48000, 64000, 88200, 96000, 128000, 176400, 192000
5928 static struct snd_pcm_hw_constraint_list
5929 hdspm_hw_constraints_aes32_sample_rates = {
5930 .count = ARRAY_SIZE(hdspm_aes32_sample_rates),
5931 .list = hdspm_aes32_sample_rates,
5932 .mask = 0
5935 static int snd_hdspm_playback_open(struct snd_pcm_substream *substream)
5937 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5938 struct snd_pcm_runtime *runtime = substream->runtime;
5940 spin_lock_irq(&hdspm->lock);
5942 snd_pcm_set_sync(substream);
5945 runtime->hw = snd_hdspm_playback_subinfo;
5947 if (hdspm->capture_substream == NULL)
5948 hdspm_stop_audio(hdspm);
5950 hdspm->playback_pid = current->pid;
5951 hdspm->playback_substream = substream;
5953 spin_unlock_irq(&hdspm->lock);
5955 snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
5957 switch (hdspm->io_type) {
5958 case AIO:
5959 case RayDAT:
5960 snd_pcm_hw_constraint_list(runtime, 0,
5961 SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
5962 &hw_constraints_period_sizes_new);
5963 snd_pcm_hw_constraint_list(runtime, 0,
5964 SNDRV_PCM_HW_PARAM_BUFFER_SIZE,
5965 &hw_constraints_raydat_io_buffer);
5967 break;
5969 default:
5970 snd_pcm_hw_constraint_list(runtime, 0,
5971 SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
5972 &hw_constraints_period_sizes_old);
5975 if (AES32 == hdspm->io_type) {
5976 snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
5977 &hdspm_hw_constraints_aes32_sample_rates);
5978 } else {
5979 snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
5980 snd_hdspm_hw_rule_rate_out_channels, hdspm,
5981 SNDRV_PCM_HW_PARAM_CHANNELS, -1);
5984 snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
5985 snd_hdspm_hw_rule_out_channels, hdspm,
5986 SNDRV_PCM_HW_PARAM_CHANNELS, -1);
5988 snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
5989 snd_hdspm_hw_rule_out_channels_rate, hdspm,
5990 SNDRV_PCM_HW_PARAM_RATE, -1);
5992 return 0;
5995 static int snd_hdspm_playback_release(struct snd_pcm_substream *substream)
5997 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5999 spin_lock_irq(&hdspm->lock);
6001 hdspm->playback_pid = -1;
6002 hdspm->playback_substream = NULL;
6004 spin_unlock_irq(&hdspm->lock);
6006 return 0;
6010 static int snd_hdspm_capture_open(struct snd_pcm_substream *substream)
6012 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
6013 struct snd_pcm_runtime *runtime = substream->runtime;
6015 spin_lock_irq(&hdspm->lock);
6016 snd_pcm_set_sync(substream);
6017 runtime->hw = snd_hdspm_capture_subinfo;
6019 if (hdspm->playback_substream == NULL)
6020 hdspm_stop_audio(hdspm);
6022 hdspm->capture_pid = current->pid;
6023 hdspm->capture_substream = substream;
6025 spin_unlock_irq(&hdspm->lock);
6027 snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
6028 switch (hdspm->io_type) {
6029 case AIO:
6030 case RayDAT:
6031 snd_pcm_hw_constraint_list(runtime, 0,
6032 SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
6033 &hw_constraints_period_sizes_new);
6034 snd_pcm_hw_constraint_list(runtime, 0,
6035 SNDRV_PCM_HW_PARAM_BUFFER_SIZE,
6036 &hw_constraints_raydat_io_buffer);
6037 break;
6039 default:
6040 snd_pcm_hw_constraint_list(runtime, 0,
6041 SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
6042 &hw_constraints_period_sizes_old);
6045 if (AES32 == hdspm->io_type) {
6046 snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
6047 &hdspm_hw_constraints_aes32_sample_rates);
6048 } else {
6049 snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
6050 snd_hdspm_hw_rule_rate_in_channels, hdspm,
6051 SNDRV_PCM_HW_PARAM_CHANNELS, -1);
6054 snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
6055 snd_hdspm_hw_rule_in_channels, hdspm,
6056 SNDRV_PCM_HW_PARAM_CHANNELS, -1);
6058 snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
6059 snd_hdspm_hw_rule_in_channels_rate, hdspm,
6060 SNDRV_PCM_HW_PARAM_RATE, -1);
6062 return 0;
6065 static int snd_hdspm_capture_release(struct snd_pcm_substream *substream)
6067 struct hdspm *hdspm = snd_pcm_substream_chip(substream);
6069 spin_lock_irq(&hdspm->lock);
6071 hdspm->capture_pid = -1;
6072 hdspm->capture_substream = NULL;
6074 spin_unlock_irq(&hdspm->lock);
6075 return 0;
6078 static int snd_hdspm_hwdep_dummy_op(struct snd_hwdep *hw, struct file *file)
6080 /* we have nothing to initialize but the call is required */
6081 return 0;
6084 static inline int copy_u32_le(void __user *dest, void __iomem *src)
6086 u32 val = readl(src);
6087 return copy_to_user(dest, &val, 4);
6090 static int snd_hdspm_hwdep_ioctl(struct snd_hwdep *hw, struct file *file,
6091 unsigned int cmd, unsigned long __user arg)
6093 void __user *argp = (void __user *)arg;
6094 struct hdspm *hdspm = hw->private_data;
6095 struct hdspm_mixer_ioctl mixer;
6096 struct hdspm_config info;
6097 struct hdspm_status status;
6098 struct hdspm_version hdspm_version;
6099 struct hdspm_peak_rms *levels;
6100 struct hdspm_ltc ltc;
6101 unsigned int statusregister;
6102 long unsigned int s;
6103 int i = 0;
6105 switch (cmd) {
6107 case SNDRV_HDSPM_IOCTL_GET_PEAK_RMS:
6108 levels = &hdspm->peak_rms;
6109 for (i = 0; i < HDSPM_MAX_CHANNELS; i++) {
6110 levels->input_peaks[i] =
6111 readl(hdspm->iobase +
6112 HDSPM_MADI_INPUT_PEAK + i*4);
6113 levels->playback_peaks[i] =
6114 readl(hdspm->iobase +
6115 HDSPM_MADI_PLAYBACK_PEAK + i*4);
6116 levels->output_peaks[i] =
6117 readl(hdspm->iobase +
6118 HDSPM_MADI_OUTPUT_PEAK + i*4);
6120 levels->input_rms[i] =
6121 ((uint64_t) readl(hdspm->iobase +
6122 HDSPM_MADI_INPUT_RMS_H + i*4) << 32) |
6123 (uint64_t) readl(hdspm->iobase +
6124 HDSPM_MADI_INPUT_RMS_L + i*4);
6125 levels->playback_rms[i] =
6126 ((uint64_t)readl(hdspm->iobase +
6127 HDSPM_MADI_PLAYBACK_RMS_H+i*4) << 32) |
6128 (uint64_t)readl(hdspm->iobase +
6129 HDSPM_MADI_PLAYBACK_RMS_L + i*4);
6130 levels->output_rms[i] =
6131 ((uint64_t)readl(hdspm->iobase +
6132 HDSPM_MADI_OUTPUT_RMS_H + i*4) << 32) |
6133 (uint64_t)readl(hdspm->iobase +
6134 HDSPM_MADI_OUTPUT_RMS_L + i*4);
6137 if (hdspm->system_sample_rate > 96000) {
6138 levels->speed = qs;
6139 } else if (hdspm->system_sample_rate > 48000) {
6140 levels->speed = ds;
6141 } else {
6142 levels->speed = ss;
6144 levels->status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
6146 s = copy_to_user(argp, levels, sizeof(struct hdspm_peak_rms));
6147 if (0 != s) {
6148 /* snd_printk(KERN_ERR "copy_to_user(.., .., %lu): %lu
6149 [Levels]\n", sizeof(struct hdspm_peak_rms), s);
6151 return -EFAULT;
6153 break;
6155 case SNDRV_HDSPM_IOCTL_GET_LTC:
6156 ltc.ltc = hdspm_read(hdspm, HDSPM_RD_TCO);
6157 i = hdspm_read(hdspm, HDSPM_RD_TCO + 4);
6158 if (i & HDSPM_TCO1_LTC_Input_valid) {
6159 switch (i & (HDSPM_TCO1_LTC_Format_LSB |
6160 HDSPM_TCO1_LTC_Format_MSB)) {
6161 case 0:
6162 ltc.format = fps_24;
6163 break;
6164 case HDSPM_TCO1_LTC_Format_LSB:
6165 ltc.format = fps_25;
6166 break;
6167 case HDSPM_TCO1_LTC_Format_MSB:
6168 ltc.format = fps_2997;
6169 break;
6170 default:
6171 ltc.format = 30;
6172 break;
6174 if (i & HDSPM_TCO1_set_drop_frame_flag) {
6175 ltc.frame = drop_frame;
6176 } else {
6177 ltc.frame = full_frame;
6179 } else {
6180 ltc.format = format_invalid;
6181 ltc.frame = frame_invalid;
6183 if (i & HDSPM_TCO1_Video_Input_Format_NTSC) {
6184 ltc.input_format = ntsc;
6185 } else if (i & HDSPM_TCO1_Video_Input_Format_PAL) {
6186 ltc.input_format = pal;
6187 } else {
6188 ltc.input_format = no_video;
6191 s = copy_to_user(argp, &ltc, sizeof(struct hdspm_ltc));
6192 if (0 != s) {
6194 snd_printk(KERN_ERR "copy_to_user(.., .., %lu): %lu [LTC]\n", sizeof(struct hdspm_ltc), s); */
6195 return -EFAULT;
6198 break;
6200 case SNDRV_HDSPM_IOCTL_GET_CONFIG:
6202 memset(&info, 0, sizeof(info));
6203 spin_lock_irq(&hdspm->lock);
6204 info.pref_sync_ref = hdspm_pref_sync_ref(hdspm);
6205 info.wordclock_sync_check = hdspm_wc_sync_check(hdspm);
6207 info.system_sample_rate = hdspm->system_sample_rate;
6208 info.autosync_sample_rate =
6209 hdspm_external_sample_rate(hdspm);
6210 info.system_clock_mode = hdspm_system_clock_mode(hdspm);
6211 info.clock_source = hdspm_clock_source(hdspm);
6212 info.autosync_ref = hdspm_autosync_ref(hdspm);
6213 info.line_out = hdspm_line_out(hdspm);
6214 info.passthru = 0;
6215 spin_unlock_irq(&hdspm->lock);
6216 if (copy_to_user((void __user *) arg, &info, sizeof(info)))
6217 return -EFAULT;
6218 break;
6220 case SNDRV_HDSPM_IOCTL_GET_STATUS:
6221 status.card_type = hdspm->io_type;
6223 status.autosync_source = hdspm_autosync_ref(hdspm);
6225 status.card_clock = 110069313433624ULL;
6226 status.master_period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ);
6228 switch (hdspm->io_type) {
6229 case MADI:
6230 case MADIface:
6231 status.card_specific.madi.sync_wc =
6232 hdspm_wc_sync_check(hdspm);
6233 status.card_specific.madi.sync_madi =
6234 hdspm_madi_sync_check(hdspm);
6235 status.card_specific.madi.sync_tco =
6236 hdspm_tco_sync_check(hdspm);
6237 status.card_specific.madi.sync_in =
6238 hdspm_sync_in_sync_check(hdspm);
6240 statusregister =
6241 hdspm_read(hdspm, HDSPM_statusRegister);
6242 status.card_specific.madi.madi_input =
6243 (statusregister & HDSPM_AB_int) ? 1 : 0;
6244 status.card_specific.madi.channel_format =
6245 (statusregister & HDSPM_TX_64ch) ? 1 : 0;
6246 /* TODO: Mac driver sets it when f_s>48kHz */
6247 status.card_specific.madi.frame_format = 0;
6249 default:
6250 break;
6253 if (copy_to_user((void __user *) arg, &status, sizeof(status)))
6254 return -EFAULT;
6257 break;
6259 case SNDRV_HDSPM_IOCTL_GET_VERSION:
6260 hdspm_version.card_type = hdspm->io_type;
6261 strncpy(hdspm_version.cardname, hdspm->card_name,
6262 sizeof(hdspm_version.cardname));
6263 hdspm_version.serial = (hdspm_read(hdspm,
6264 HDSPM_midiStatusIn0)>>8) & 0xFFFFFF;
6265 hdspm_version.firmware_rev = hdspm->firmware_rev;
6266 hdspm_version.addons = 0;
6267 if (hdspm->tco)
6268 hdspm_version.addons |= HDSPM_ADDON_TCO;
6270 if (copy_to_user((void __user *) arg, &hdspm_version,
6271 sizeof(hdspm_version)))
6272 return -EFAULT;
6273 break;
6275 case SNDRV_HDSPM_IOCTL_GET_MIXER:
6276 if (copy_from_user(&mixer, (void __user *)arg, sizeof(mixer)))
6277 return -EFAULT;
6278 if (copy_to_user((void __user *)mixer.mixer, hdspm->mixer,
6279 sizeof(struct hdspm_mixer)))
6280 return -EFAULT;
6281 break;
6283 default:
6284 return -EINVAL;
6286 return 0;
6289 static struct snd_pcm_ops snd_hdspm_playback_ops = {
6290 .open = snd_hdspm_playback_open,
6291 .close = snd_hdspm_playback_release,
6292 .ioctl = snd_hdspm_ioctl,
6293 .hw_params = snd_hdspm_hw_params,
6294 .hw_free = snd_hdspm_hw_free,
6295 .prepare = snd_hdspm_prepare,
6296 .trigger = snd_hdspm_trigger,
6297 .pointer = snd_hdspm_hw_pointer,
6298 .page = snd_pcm_sgbuf_ops_page,
6301 static struct snd_pcm_ops snd_hdspm_capture_ops = {
6302 .open = snd_hdspm_capture_open,
6303 .close = snd_hdspm_capture_release,
6304 .ioctl = snd_hdspm_ioctl,
6305 .hw_params = snd_hdspm_hw_params,
6306 .hw_free = snd_hdspm_hw_free,
6307 .prepare = snd_hdspm_prepare,
6308 .trigger = snd_hdspm_trigger,
6309 .pointer = snd_hdspm_hw_pointer,
6310 .page = snd_pcm_sgbuf_ops_page,
6313 static int __devinit snd_hdspm_create_hwdep(struct snd_card *card,
6314 struct hdspm * hdspm)
6316 struct snd_hwdep *hw;
6317 int err;
6319 err = snd_hwdep_new(card, "HDSPM hwdep", 0, &hw);
6320 if (err < 0)
6321 return err;
6323 hdspm->hwdep = hw;
6324 hw->private_data = hdspm;
6325 strcpy(hw->name, "HDSPM hwdep interface");
6327 hw->ops.open = snd_hdspm_hwdep_dummy_op;
6328 hw->ops.ioctl = snd_hdspm_hwdep_ioctl;
6329 hw->ops.release = snd_hdspm_hwdep_dummy_op;
6331 return 0;
6335 /*------------------------------------------------------------
6336 memory interface
6337 ------------------------------------------------------------*/
6338 static int __devinit snd_hdspm_preallocate_memory(struct hdspm *hdspm)
6340 int err;
6341 struct snd_pcm *pcm;
6342 size_t wanted;
6344 pcm = hdspm->pcm;
6346 wanted = HDSPM_DMA_AREA_BYTES;
6348 err =
6349 snd_pcm_lib_preallocate_pages_for_all(pcm,
6350 SNDRV_DMA_TYPE_DEV_SG,
6351 snd_dma_pci_data(hdspm->pci),
6352 wanted,
6353 wanted);
6354 if (err < 0) {
6355 snd_printdd("Could not preallocate %zd Bytes\n", wanted);
6357 return err;
6358 } else
6359 snd_printdd(" Preallocated %zd Bytes\n", wanted);
6361 return 0;
6365 static void hdspm_set_sgbuf(struct hdspm *hdspm,
6366 struct snd_pcm_substream *substream,
6367 unsigned int reg, int channels)
6369 int i;
6371 /* continuous memory segment */
6372 for (i = 0; i < (channels * 16); i++)
6373 hdspm_write(hdspm, reg + 4 * i,
6374 snd_pcm_sgbuf_get_addr(substream, 4096 * i));
6378 /* ------------- ALSA Devices ---------------------------- */
6379 static int __devinit snd_hdspm_create_pcm(struct snd_card *card,
6380 struct hdspm *hdspm)
6382 struct snd_pcm *pcm;
6383 int err;
6385 err = snd_pcm_new(card, hdspm->card_name, 0, 1, 1, &pcm);
6386 if (err < 0)
6387 return err;
6389 hdspm->pcm = pcm;
6390 pcm->private_data = hdspm;
6391 strcpy(pcm->name, hdspm->card_name);
6393 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
6394 &snd_hdspm_playback_ops);
6395 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
6396 &snd_hdspm_capture_ops);
6398 pcm->info_flags = SNDRV_PCM_INFO_JOINT_DUPLEX;
6400 err = snd_hdspm_preallocate_memory(hdspm);
6401 if (err < 0)
6402 return err;
6404 return 0;
6407 static inline void snd_hdspm_initialize_midi_flush(struct hdspm * hdspm)
6409 int i;
6411 for (i = 0; i < hdspm->midiPorts; i++)
6412 snd_hdspm_flush_midi_input(hdspm, i);
6415 static int __devinit snd_hdspm_create_alsa_devices(struct snd_card *card,
6416 struct hdspm * hdspm)
6418 int err, i;
6420 snd_printdd("Create card...\n");
6421 err = snd_hdspm_create_pcm(card, hdspm);
6422 if (err < 0)
6423 return err;
6425 i = 0;
6426 while (i < hdspm->midiPorts) {
6427 err = snd_hdspm_create_midi(card, hdspm, i);
6428 if (err < 0) {
6429 return err;
6431 i++;
6434 err = snd_hdspm_create_controls(card, hdspm);
6435 if (err < 0)
6436 return err;
6438 err = snd_hdspm_create_hwdep(card, hdspm);
6439 if (err < 0)
6440 return err;
6442 snd_printdd("proc init...\n");
6443 snd_hdspm_proc_init(hdspm);
6445 hdspm->system_sample_rate = -1;
6446 hdspm->last_external_sample_rate = -1;
6447 hdspm->last_internal_sample_rate = -1;
6448 hdspm->playback_pid = -1;
6449 hdspm->capture_pid = -1;
6450 hdspm->capture_substream = NULL;
6451 hdspm->playback_substream = NULL;
6453 snd_printdd("Set defaults...\n");
6454 err = snd_hdspm_set_defaults(hdspm);
6455 if (err < 0)
6456 return err;
6458 snd_printdd("Update mixer controls...\n");
6459 hdspm_update_simple_mixer_controls(hdspm);
6461 snd_printdd("Initializeing complete ???\n");
6463 err = snd_card_register(card);
6464 if (err < 0) {
6465 snd_printk(KERN_ERR "HDSPM: error registering card\n");
6466 return err;
6469 snd_printdd("... yes now\n");
6471 return 0;
6474 static int __devinit snd_hdspm_create(struct snd_card *card,
6475 struct hdspm *hdspm) {
6477 struct pci_dev *pci = hdspm->pci;
6478 int err;
6479 unsigned long io_extent;
6481 hdspm->irq = -1;
6482 hdspm->card = card;
6484 spin_lock_init(&hdspm->lock);
6486 pci_read_config_word(hdspm->pci,
6487 PCI_CLASS_REVISION, &hdspm->firmware_rev);
6489 strcpy(card->mixername, "Xilinx FPGA");
6490 strcpy(card->driver, "HDSPM");
6492 switch (hdspm->firmware_rev) {
6493 case HDSPM_MADI_REV:
6494 case HDSPM_MADI_OLD_REV:
6495 case HDSPM_MADI_ANCIENT_REV:
6496 hdspm->io_type = MADI;
6497 hdspm->card_name = "RME MADI";
6498 hdspm->midiPorts = 3;
6499 break;
6500 case HDSPM_RAYDAT_REV:
6501 hdspm->io_type = RayDAT;
6502 hdspm->card_name = "RME RayDAT";
6503 hdspm->midiPorts = 2;
6504 break;
6505 case HDSPM_AIO_REV:
6506 hdspm->io_type = AIO;
6507 hdspm->card_name = "RME AIO";
6508 hdspm->midiPorts = 1;
6509 break;
6510 case HDSPM_MADIFACE_REV:
6511 hdspm->io_type = MADIface;
6512 hdspm->card_name = "RME MADIface";
6513 hdspm->midiPorts = 1;
6514 break;
6515 case HDSPM_AES_REV:
6516 case HDSPM_AES32_REV:
6517 case HDSPM_AES32_OLD_REV:
6518 hdspm->io_type = AES32;
6519 hdspm->card_name = "RME AES32";
6520 hdspm->midiPorts = 2;
6521 break;
6522 default:
6523 snd_printk(KERN_ERR "HDSPM: unknown firmware revision %x\n",
6524 hdspm->firmware_rev);
6525 return -ENODEV;
6528 err = pci_enable_device(pci);
6529 if (err < 0)
6530 return err;
6532 pci_set_master(hdspm->pci);
6534 err = pci_request_regions(pci, "hdspm");
6535 if (err < 0)
6536 return err;
6538 hdspm->port = pci_resource_start(pci, 0);
6539 io_extent = pci_resource_len(pci, 0);
6541 snd_printdd("grabbed memory region 0x%lx-0x%lx\n",
6542 hdspm->port, hdspm->port + io_extent - 1);
6544 hdspm->iobase = ioremap_nocache(hdspm->port, io_extent);
6545 if (!hdspm->iobase) {
6546 snd_printk(KERN_ERR "HDSPM: "
6547 "unable to remap region 0x%lx-0x%lx\n",
6548 hdspm->port, hdspm->port + io_extent - 1);
6549 return -EBUSY;
6551 snd_printdd("remapped region (0x%lx) 0x%lx-0x%lx\n",
6552 (unsigned long)hdspm->iobase, hdspm->port,
6553 hdspm->port + io_extent - 1);
6555 if (request_irq(pci->irq, snd_hdspm_interrupt,
6556 IRQF_SHARED, KBUILD_MODNAME, hdspm)) {
6557 snd_printk(KERN_ERR "HDSPM: unable to use IRQ %d\n", pci->irq);
6558 return -EBUSY;
6561 snd_printdd("use IRQ %d\n", pci->irq);
6563 hdspm->irq = pci->irq;
6565 snd_printdd("kmalloc Mixer memory of %zd Bytes\n",
6566 sizeof(struct hdspm_mixer));
6567 hdspm->mixer = kzalloc(sizeof(struct hdspm_mixer), GFP_KERNEL);
6568 if (!hdspm->mixer) {
6569 snd_printk(KERN_ERR "HDSPM: "
6570 "unable to kmalloc Mixer memory of %d Bytes\n",
6571 (int)sizeof(struct hdspm_mixer));
6572 return err;
6575 hdspm->port_names_in = NULL;
6576 hdspm->port_names_out = NULL;
6578 switch (hdspm->io_type) {
6579 case AES32:
6580 hdspm->ss_in_channels = hdspm->ss_out_channels = AES32_CHANNELS;
6581 hdspm->ds_in_channels = hdspm->ds_out_channels = AES32_CHANNELS;
6582 hdspm->qs_in_channels = hdspm->qs_out_channels = AES32_CHANNELS;
6584 hdspm->channel_map_in_ss = hdspm->channel_map_out_ss =
6585 channel_map_aes32;
6586 hdspm->channel_map_in_ds = hdspm->channel_map_out_ds =
6587 channel_map_aes32;
6588 hdspm->channel_map_in_qs = hdspm->channel_map_out_qs =
6589 channel_map_aes32;
6590 hdspm->port_names_in_ss = hdspm->port_names_out_ss =
6591 texts_ports_aes32;
6592 hdspm->port_names_in_ds = hdspm->port_names_out_ds =
6593 texts_ports_aes32;
6594 hdspm->port_names_in_qs = hdspm->port_names_out_qs =
6595 texts_ports_aes32;
6597 hdspm->max_channels_out = hdspm->max_channels_in =
6598 AES32_CHANNELS;
6599 hdspm->port_names_in = hdspm->port_names_out =
6600 texts_ports_aes32;
6601 hdspm->channel_map_in = hdspm->channel_map_out =
6602 channel_map_aes32;
6604 break;
6606 case MADI:
6607 case MADIface:
6608 hdspm->ss_in_channels = hdspm->ss_out_channels =
6609 MADI_SS_CHANNELS;
6610 hdspm->ds_in_channels = hdspm->ds_out_channels =
6611 MADI_DS_CHANNELS;
6612 hdspm->qs_in_channels = hdspm->qs_out_channels =
6613 MADI_QS_CHANNELS;
6615 hdspm->channel_map_in_ss = hdspm->channel_map_out_ss =
6616 channel_map_unity_ss;
6617 hdspm->channel_map_in_ds = hdspm->channel_map_out_ds =
6618 channel_map_unity_ss;
6619 hdspm->channel_map_in_qs = hdspm->channel_map_out_qs =
6620 channel_map_unity_ss;
6622 hdspm->port_names_in_ss = hdspm->port_names_out_ss =
6623 texts_ports_madi;
6624 hdspm->port_names_in_ds = hdspm->port_names_out_ds =
6625 texts_ports_madi;
6626 hdspm->port_names_in_qs = hdspm->port_names_out_qs =
6627 texts_ports_madi;
6628 break;
6630 case AIO:
6631 if (0 == (hdspm_read(hdspm, HDSPM_statusRegister2) & HDSPM_s2_AEBI_D)) {
6632 snd_printk(KERN_INFO "HDSPM: AEB input board found, but not supported\n");
6635 hdspm->ss_in_channels = AIO_IN_SS_CHANNELS;
6636 hdspm->ds_in_channels = AIO_IN_DS_CHANNELS;
6637 hdspm->qs_in_channels = AIO_IN_QS_CHANNELS;
6638 hdspm->ss_out_channels = AIO_OUT_SS_CHANNELS;
6639 hdspm->ds_out_channels = AIO_OUT_DS_CHANNELS;
6640 hdspm->qs_out_channels = AIO_OUT_QS_CHANNELS;
6642 hdspm->channel_map_out_ss = channel_map_aio_out_ss;
6643 hdspm->channel_map_out_ds = channel_map_aio_out_ds;
6644 hdspm->channel_map_out_qs = channel_map_aio_out_qs;
6646 hdspm->channel_map_in_ss = channel_map_aio_in_ss;
6647 hdspm->channel_map_in_ds = channel_map_aio_in_ds;
6648 hdspm->channel_map_in_qs = channel_map_aio_in_qs;
6650 hdspm->port_names_in_ss = texts_ports_aio_in_ss;
6651 hdspm->port_names_out_ss = texts_ports_aio_out_ss;
6652 hdspm->port_names_in_ds = texts_ports_aio_in_ds;
6653 hdspm->port_names_out_ds = texts_ports_aio_out_ds;
6654 hdspm->port_names_in_qs = texts_ports_aio_in_qs;
6655 hdspm->port_names_out_qs = texts_ports_aio_out_qs;
6657 break;
6659 case RayDAT:
6660 hdspm->ss_in_channels = hdspm->ss_out_channels =
6661 RAYDAT_SS_CHANNELS;
6662 hdspm->ds_in_channels = hdspm->ds_out_channels =
6663 RAYDAT_DS_CHANNELS;
6664 hdspm->qs_in_channels = hdspm->qs_out_channels =
6665 RAYDAT_QS_CHANNELS;
6667 hdspm->max_channels_in = RAYDAT_SS_CHANNELS;
6668 hdspm->max_channels_out = RAYDAT_SS_CHANNELS;
6670 hdspm->channel_map_in_ss = hdspm->channel_map_out_ss =
6671 channel_map_raydat_ss;
6672 hdspm->channel_map_in_ds = hdspm->channel_map_out_ds =
6673 channel_map_raydat_ds;
6674 hdspm->channel_map_in_qs = hdspm->channel_map_out_qs =
6675 channel_map_raydat_qs;
6676 hdspm->channel_map_in = hdspm->channel_map_out =
6677 channel_map_raydat_ss;
6679 hdspm->port_names_in_ss = hdspm->port_names_out_ss =
6680 texts_ports_raydat_ss;
6681 hdspm->port_names_in_ds = hdspm->port_names_out_ds =
6682 texts_ports_raydat_ds;
6683 hdspm->port_names_in_qs = hdspm->port_names_out_qs =
6684 texts_ports_raydat_qs;
6687 break;
6691 /* TCO detection */
6692 switch (hdspm->io_type) {
6693 case AIO:
6694 case RayDAT:
6695 if (hdspm_read(hdspm, HDSPM_statusRegister2) &
6696 HDSPM_s2_tco_detect) {
6697 hdspm->midiPorts++;
6698 hdspm->tco = kzalloc(sizeof(struct hdspm_tco),
6699 GFP_KERNEL);
6700 if (NULL != hdspm->tco) {
6701 hdspm_tco_write(hdspm);
6703 snd_printk(KERN_INFO "HDSPM: AIO/RayDAT TCO module found\n");
6704 } else {
6705 hdspm->tco = NULL;
6707 break;
6709 case MADI:
6710 if (hdspm_read(hdspm, HDSPM_statusRegister) & HDSPM_tco_detect) {
6711 hdspm->midiPorts++;
6712 hdspm->tco = kzalloc(sizeof(struct hdspm_tco),
6713 GFP_KERNEL);
6714 if (NULL != hdspm->tco) {
6715 hdspm_tco_write(hdspm);
6717 snd_printk(KERN_INFO "HDSPM: MADI TCO module found\n");
6718 } else {
6719 hdspm->tco = NULL;
6721 break;
6723 default:
6724 hdspm->tco = NULL;
6727 /* texts */
6728 switch (hdspm->io_type) {
6729 case AES32:
6730 if (hdspm->tco) {
6731 hdspm->texts_autosync = texts_autosync_aes_tco;
6732 hdspm->texts_autosync_items = 10;
6733 } else {
6734 hdspm->texts_autosync = texts_autosync_aes;
6735 hdspm->texts_autosync_items = 9;
6737 break;
6739 case MADI:
6740 if (hdspm->tco) {
6741 hdspm->texts_autosync = texts_autosync_madi_tco;
6742 hdspm->texts_autosync_items = 4;
6743 } else {
6744 hdspm->texts_autosync = texts_autosync_madi;
6745 hdspm->texts_autosync_items = 3;
6747 break;
6749 case MADIface:
6751 break;
6753 case RayDAT:
6754 if (hdspm->tco) {
6755 hdspm->texts_autosync = texts_autosync_raydat_tco;
6756 hdspm->texts_autosync_items = 9;
6757 } else {
6758 hdspm->texts_autosync = texts_autosync_raydat;
6759 hdspm->texts_autosync_items = 8;
6761 break;
6763 case AIO:
6764 if (hdspm->tco) {
6765 hdspm->texts_autosync = texts_autosync_aio_tco;
6766 hdspm->texts_autosync_items = 6;
6767 } else {
6768 hdspm->texts_autosync = texts_autosync_aio;
6769 hdspm->texts_autosync_items = 5;
6771 break;
6775 tasklet_init(&hdspm->midi_tasklet,
6776 hdspm_midi_tasklet, (unsigned long) hdspm);
6778 snd_printdd("create alsa devices.\n");
6779 err = snd_hdspm_create_alsa_devices(card, hdspm);
6780 if (err < 0)
6781 return err;
6783 snd_hdspm_initialize_midi_flush(hdspm);
6785 return 0;
6789 static int snd_hdspm_free(struct hdspm * hdspm)
6792 if (hdspm->port) {
6794 /* stop th audio, and cancel all interrupts */
6795 hdspm->control_register &=
6796 ~(HDSPM_Start | HDSPM_AudioInterruptEnable |
6797 HDSPM_Midi0InterruptEnable | HDSPM_Midi1InterruptEnable |
6798 HDSPM_Midi2InterruptEnable | HDSPM_Midi3InterruptEnable);
6799 hdspm_write(hdspm, HDSPM_controlRegister,
6800 hdspm->control_register);
6803 if (hdspm->irq >= 0)
6804 free_irq(hdspm->irq, (void *) hdspm);
6806 kfree(hdspm->mixer);
6808 if (hdspm->iobase)
6809 iounmap(hdspm->iobase);
6811 if (hdspm->port)
6812 pci_release_regions(hdspm->pci);
6814 pci_disable_device(hdspm->pci);
6815 return 0;
6819 static void snd_hdspm_card_free(struct snd_card *card)
6821 struct hdspm *hdspm = card->private_data;
6823 if (hdspm)
6824 snd_hdspm_free(hdspm);
6828 static int __devinit snd_hdspm_probe(struct pci_dev *pci,
6829 const struct pci_device_id *pci_id)
6831 static int dev;
6832 struct hdspm *hdspm;
6833 struct snd_card *card;
6834 int err;
6836 if (dev >= SNDRV_CARDS)
6837 return -ENODEV;
6838 if (!enable[dev]) {
6839 dev++;
6840 return -ENOENT;
6843 err = snd_card_create(index[dev], id[dev],
6844 THIS_MODULE, sizeof(struct hdspm), &card);
6845 if (err < 0)
6846 return err;
6848 hdspm = card->private_data;
6849 card->private_free = snd_hdspm_card_free;
6850 hdspm->dev = dev;
6851 hdspm->pci = pci;
6853 snd_card_set_dev(card, &pci->dev);
6855 err = snd_hdspm_create(card, hdspm);
6856 if (err < 0) {
6857 snd_card_free(card);
6858 return err;
6861 if (hdspm->io_type != MADIface) {
6862 sprintf(card->shortname, "%s_%x",
6863 hdspm->card_name,
6864 (hdspm_read(hdspm, HDSPM_midiStatusIn0)>>8) & 0xFFFFFF);
6865 sprintf(card->longname, "%s S/N 0x%x at 0x%lx, irq %d",
6866 hdspm->card_name,
6867 (hdspm_read(hdspm, HDSPM_midiStatusIn0)>>8) & 0xFFFFFF,
6868 hdspm->port, hdspm->irq);
6869 } else {
6870 sprintf(card->shortname, "%s", hdspm->card_name);
6871 sprintf(card->longname, "%s at 0x%lx, irq %d",
6872 hdspm->card_name, hdspm->port, hdspm->irq);
6875 err = snd_card_register(card);
6876 if (err < 0) {
6877 snd_card_free(card);
6878 return err;
6881 pci_set_drvdata(pci, card);
6883 dev++;
6884 return 0;
6887 static void __devexit snd_hdspm_remove(struct pci_dev *pci)
6889 snd_card_free(pci_get_drvdata(pci));
6890 pci_set_drvdata(pci, NULL);
6893 static struct pci_driver driver = {
6894 .name = KBUILD_MODNAME,
6895 .id_table = snd_hdspm_ids,
6896 .probe = snd_hdspm_probe,
6897 .remove = __devexit_p(snd_hdspm_remove),
6901 static int __init alsa_card_hdspm_init(void)
6903 return pci_register_driver(&driver);
6906 static void __exit alsa_card_hdspm_exit(void)
6908 pci_unregister_driver(&driver);
6911 module_init(alsa_card_hdspm_init)
6912 module_exit(alsa_card_hdspm_exit)