Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/pci/rme9652/hdspm.c
29266 views
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
* <[email protected]>
11
*
12
* Modified 2009-04-13 for proper metering by Florian Faber
13
* <[email protected]>
14
*
15
* Modified 2009-04-14 for native float support by Florian Faber
16
* <[email protected]>
17
*
18
* Modified 2009-04-26 fixed bug in rms metering by Florian Faber
19
* <[email protected]>
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 [email protected]
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 <[email protected]>, "
161
"Marcus Andersson, Thomas Charbonnel <[email protected]>, "
162
"Remy Bruno <[email protected]>, "
163
"Florian Faber <[email protected]>, "
164
"Adrian Knoth <[email protected]>"
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
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
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
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
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
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
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
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
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 */
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
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 */
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 */
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
*/
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*/
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 */
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 */
1466
static inline void hdspm_compute_period_size(struct hdspm *hdspm)
1467
{
1468
hdspm->period_bytes = 4 * hdspm_get_latency(hdspm);
1469
}
1470
1471
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
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
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*/
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
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
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
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 */
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 */
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
*/
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
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
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
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
*/
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
*/
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
*/
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
*/
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
*/
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
*/
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
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
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
*/
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
*/
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
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
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
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
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
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
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
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
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
*/
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
*/
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
3251
static int hdspm_input_select(struct hdspm * hdspm)
3252
{
3253
return (hdspm->control_register & HDSPM_InputSelect0) ? 1 : 0;
3254
}
3255
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
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
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
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
3311
static int hdspm_ds_wire(struct hdspm * hdspm)
3312
{
3313
return (hdspm->control_register & HDSPM_DS_DoubleWire) ? 1 : 0;
3314
}
3315
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
*/
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
}
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
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
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
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
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
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
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, &ltc, 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
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
------------------------------------------------------------*/
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. */
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 ---------------------------- */
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
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
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
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(sizeof(*hdspm->tco), GFP_KERNEL);
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(sizeof(*hdspm->tco), GFP_KERNEL);
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
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
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
6866