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