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