2 * ALSA driver for RME Hammerfall DSP audio interface(s)
4 * Copyright (c) 2002 Paul Davis
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 #include <sound/driver.h>
25 #include <linux/init.h>
26 #include <linux/delay.h>
27 #include <linux/interrupt.h>
28 #include <linux/slab.h>
29 #include <linux/pci.h>
30 #include <linux/firmware.h>
31 #include <linux/moduleparam.h>
33 #include <sound/core.h>
34 #include <sound/control.h>
35 #include <sound/pcm.h>
36 #include <sound/info.h>
37 #include <sound/asoundef.h>
38 #include <sound/rawmidi.h>
39 #include <sound/hwdep.h>
40 #include <sound/initval.h>
41 #include <sound/hdsp.h>
43 #include <asm/byteorder.h>
44 #include <asm/current.h>
47 static int index
[SNDRV_CARDS
] = SNDRV_DEFAULT_IDX
; /* Index 0-MAX */
48 static char *id
[SNDRV_CARDS
] = SNDRV_DEFAULT_STR
; /* ID for this card */
49 static int enable
[SNDRV_CARDS
] = SNDRV_DEFAULT_ENABLE_PNP
; /* Enable this card */
51 module_param_array(index
, int, NULL
, 0444);
52 MODULE_PARM_DESC(index
, "Index value for RME Hammerfall DSP interface.");
53 module_param_array(id
, charp
, NULL
, 0444);
54 MODULE_PARM_DESC(id
, "ID string for RME Hammerfall DSP interface.");
55 module_param_array(enable
, bool, NULL
, 0444);
56 MODULE_PARM_DESC(enable
, "Enable/disable specific Hammerfall DSP soundcards.");
57 MODULE_AUTHOR("Paul Davis <paul@linuxaudiosystems.com>, Marcus Andersson, Thomas Charbonnel <thomas@undata.org>");
58 MODULE_DESCRIPTION("RME Hammerfall DSP");
59 MODULE_LICENSE("GPL");
60 MODULE_SUPPORTED_DEVICE("{{RME Hammerfall-DSP},"
64 #define HDSP_MAX_CHANNELS 26
65 #define HDSP_MAX_DS_CHANNELS 14
66 #define HDSP_MAX_QS_CHANNELS 8
67 #define DIGIFACE_SS_CHANNELS 26
68 #define DIGIFACE_DS_CHANNELS 14
69 #define MULTIFACE_SS_CHANNELS 18
70 #define MULTIFACE_DS_CHANNELS 14
71 #define H9652_SS_CHANNELS 26
72 #define H9652_DS_CHANNELS 14
73 /* This does not include possible Analog Extension Boards
74 AEBs are detected at card initialization
76 #define H9632_SS_CHANNELS 12
77 #define H9632_DS_CHANNELS 8
78 #define H9632_QS_CHANNELS 4
80 /* Write registers. These are defined as byte-offsets from the iobase value.
82 #define HDSP_resetPointer 0
83 #define HDSP_outputBufferAddress 32
84 #define HDSP_inputBufferAddress 36
85 #define HDSP_controlRegister 64
86 #define HDSP_interruptConfirmation 96
87 #define HDSP_outputEnable 128
88 #define HDSP_control2Reg 256
89 #define HDSP_midiDataOut0 352
90 #define HDSP_midiDataOut1 356
91 #define HDSP_fifoData 368
92 #define HDSP_inputEnable 384
94 /* Read registers. These are defined as byte-offsets from the iobase value
97 #define HDSP_statusRegister 0
98 #define HDSP_timecode 128
99 #define HDSP_status2Register 192
100 #define HDSP_midiDataOut0 352
101 #define HDSP_midiDataOut1 356
102 #define HDSP_midiDataIn0 360
103 #define HDSP_midiDataIn1 364
104 #define HDSP_midiStatusOut0 384
105 #define HDSP_midiStatusOut1 388
106 #define HDSP_midiStatusIn0 392
107 #define HDSP_midiStatusIn1 396
108 #define HDSP_fifoStatus 400
110 /* the meters are regular i/o-mapped registers, but offset
111 considerably from the rest. the peak registers are reset
112 when read; the least-significant 4 bits are full-scale counters;
113 the actual peak value is in the most-significant 24 bits.
116 #define HDSP_playbackPeakLevel 4096 /* 26 * 32 bit values */
117 #define HDSP_inputPeakLevel 4224 /* 26 * 32 bit values */
118 #define HDSP_outputPeakLevel 4352 /* (26+2) * 32 bit values */
119 #define HDSP_playbackRmsLevel 4612 /* 26 * 64 bit values */
120 #define HDSP_inputRmsLevel 4868 /* 26 * 64 bit values */
123 /* This is for H9652 cards
124 Peak values are read downward from the base
125 Rms values are read upward
126 There are rms values for the outputs too
127 26*3 values are read in ss mode
128 14*3 in ds mode, with no gap between values
130 #define HDSP_9652_peakBase 7164
131 #define HDSP_9652_rmsBase 4096
133 /* c.f. the hdsp_9632_meters_t struct */
134 #define HDSP_9632_metersBase 4096
136 #define HDSP_IO_EXTENT 7168
138 /* control2 register bits */
140 #define HDSP_TMS 0x01
141 #define HDSP_TCK 0x02
142 #define HDSP_TDI 0x04
143 #define HDSP_JTAG 0x08
144 #define HDSP_PWDN 0x10
145 #define HDSP_PROGRAM 0x020
146 #define HDSP_CONFIG_MODE_0 0x040
147 #define HDSP_CONFIG_MODE_1 0x080
148 #define HDSP_VERSION_BIT 0x100
149 #define HDSP_BIGENDIAN_MODE 0x200
150 #define HDSP_RD_MULTIPLE 0x400
151 #define HDSP_9652_ENABLE_MIXER 0x800
152 #define HDSP_TDO 0x10000000
154 #define HDSP_S_PROGRAM (HDSP_PROGRAM|HDSP_CONFIG_MODE_0)
155 #define HDSP_S_LOAD (HDSP_PROGRAM|HDSP_CONFIG_MODE_1)
157 /* Control Register bits */
159 #define HDSP_Start (1<<0) /* start engine */
160 #define HDSP_Latency0 (1<<1) /* buffer size = 2^n where n is defined by Latency{2,1,0} */
161 #define HDSP_Latency1 (1<<2) /* [ see above ] */
162 #define HDSP_Latency2 (1<<3) /* [ see above ] */
163 #define HDSP_ClockModeMaster (1<<4) /* 1=Master, 0=Slave/Autosync */
164 #define HDSP_AudioInterruptEnable (1<<5) /* what do you think ? */
165 #define HDSP_Frequency0 (1<<6) /* 0=44.1kHz/88.2kHz/176.4kHz 1=48kHz/96kHz/192kHz */
166 #define HDSP_Frequency1 (1<<7) /* 0=32kHz/64kHz/128kHz */
167 #define HDSP_DoubleSpeed (1<<8) /* 0=normal speed, 1=double speed */
168 #define HDSP_SPDIFProfessional (1<<9) /* 0=consumer, 1=professional */
169 #define HDSP_SPDIFEmphasis (1<<10) /* 0=none, 1=on */
170 #define HDSP_SPDIFNonAudio (1<<11) /* 0=off, 1=on */
171 #define HDSP_SPDIFOpticalOut (1<<12) /* 1=use 1st ADAT connector for SPDIF, 0=do not */
172 #define HDSP_SyncRef2 (1<<13)
173 #define HDSP_SPDIFInputSelect0 (1<<14)
174 #define HDSP_SPDIFInputSelect1 (1<<15)
175 #define HDSP_SyncRef0 (1<<16)
176 #define HDSP_SyncRef1 (1<<17)
177 #define HDSP_AnalogExtensionBoard (1<<18) /* For H9632 cards */
178 #define HDSP_XLRBreakoutCable (1<<20) /* For H9632 cards */
179 #define HDSP_Midi0InterruptEnable (1<<22)
180 #define HDSP_Midi1InterruptEnable (1<<23)
181 #define HDSP_LineOut (1<<24)
182 #define HDSP_ADGain0 (1<<25) /* From here : H9632 specific */
183 #define HDSP_ADGain1 (1<<26)
184 #define HDSP_DAGain0 (1<<27)
185 #define HDSP_DAGain1 (1<<28)
186 #define HDSP_PhoneGain0 (1<<29)
187 #define HDSP_PhoneGain1 (1<<30)
188 #define HDSP_QuadSpeed (1<<31)
190 #define HDSP_ADGainMask (HDSP_ADGain0|HDSP_ADGain1)
191 #define HDSP_ADGainMinus10dBV HDSP_ADGainMask
192 #define HDSP_ADGainPlus4dBu (HDSP_ADGain0)
193 #define HDSP_ADGainLowGain 0
195 #define HDSP_DAGainMask (HDSP_DAGain0|HDSP_DAGain1)
196 #define HDSP_DAGainHighGain HDSP_DAGainMask
197 #define HDSP_DAGainPlus4dBu (HDSP_DAGain0)
198 #define HDSP_DAGainMinus10dBV 0
200 #define HDSP_PhoneGainMask (HDSP_PhoneGain0|HDSP_PhoneGain1)
201 #define HDSP_PhoneGain0dB HDSP_PhoneGainMask
202 #define HDSP_PhoneGainMinus6dB (HDSP_PhoneGain0)
203 #define HDSP_PhoneGainMinus12dB 0
205 #define HDSP_LatencyMask (HDSP_Latency0|HDSP_Latency1|HDSP_Latency2)
206 #define HDSP_FrequencyMask (HDSP_Frequency0|HDSP_Frequency1|HDSP_DoubleSpeed|HDSP_QuadSpeed)
208 #define HDSP_SPDIFInputMask (HDSP_SPDIFInputSelect0|HDSP_SPDIFInputSelect1)
209 #define HDSP_SPDIFInputADAT1 0
210 #define HDSP_SPDIFInputCoaxial (HDSP_SPDIFInputSelect0)
211 #define HDSP_SPDIFInputCdrom (HDSP_SPDIFInputSelect1)
212 #define HDSP_SPDIFInputAES (HDSP_SPDIFInputSelect0|HDSP_SPDIFInputSelect1)
214 #define HDSP_SyncRefMask (HDSP_SyncRef0|HDSP_SyncRef1|HDSP_SyncRef2)
215 #define HDSP_SyncRef_ADAT1 0
216 #define HDSP_SyncRef_ADAT2 (HDSP_SyncRef0)
217 #define HDSP_SyncRef_ADAT3 (HDSP_SyncRef1)
218 #define HDSP_SyncRef_SPDIF (HDSP_SyncRef0|HDSP_SyncRef1)
219 #define HDSP_SyncRef_WORD (HDSP_SyncRef2)
220 #define HDSP_SyncRef_ADAT_SYNC (HDSP_SyncRef0|HDSP_SyncRef2)
222 /* Sample Clock Sources */
224 #define HDSP_CLOCK_SOURCE_AUTOSYNC 0
225 #define HDSP_CLOCK_SOURCE_INTERNAL_32KHZ 1
226 #define HDSP_CLOCK_SOURCE_INTERNAL_44_1KHZ 2
227 #define HDSP_CLOCK_SOURCE_INTERNAL_48KHZ 3
228 #define HDSP_CLOCK_SOURCE_INTERNAL_64KHZ 4
229 #define HDSP_CLOCK_SOURCE_INTERNAL_88_2KHZ 5
230 #define HDSP_CLOCK_SOURCE_INTERNAL_96KHZ 6
231 #define HDSP_CLOCK_SOURCE_INTERNAL_128KHZ 7
232 #define HDSP_CLOCK_SOURCE_INTERNAL_176_4KHZ 8
233 #define HDSP_CLOCK_SOURCE_INTERNAL_192KHZ 9
235 /* Preferred sync reference choices - used by "pref_sync_ref" control switch */
237 #define HDSP_SYNC_FROM_WORD 0
238 #define HDSP_SYNC_FROM_SPDIF 1
239 #define HDSP_SYNC_FROM_ADAT1 2
240 #define HDSP_SYNC_FROM_ADAT_SYNC 3
241 #define HDSP_SYNC_FROM_ADAT2 4
242 #define HDSP_SYNC_FROM_ADAT3 5
244 /* SyncCheck status */
246 #define HDSP_SYNC_CHECK_NO_LOCK 0
247 #define HDSP_SYNC_CHECK_LOCK 1
248 #define HDSP_SYNC_CHECK_SYNC 2
250 /* AutoSync references - used by "autosync_ref" control switch */
252 #define HDSP_AUTOSYNC_FROM_WORD 0
253 #define HDSP_AUTOSYNC_FROM_ADAT_SYNC 1
254 #define HDSP_AUTOSYNC_FROM_SPDIF 2
255 #define HDSP_AUTOSYNC_FROM_NONE 3
256 #define HDSP_AUTOSYNC_FROM_ADAT1 4
257 #define HDSP_AUTOSYNC_FROM_ADAT2 5
258 #define HDSP_AUTOSYNC_FROM_ADAT3 6
260 /* Possible sources of S/PDIF input */
262 #define HDSP_SPDIFIN_OPTICAL 0 /* optical (ADAT1) */
263 #define HDSP_SPDIFIN_COAXIAL 1 /* coaxial (RCA) */
264 #define HDSP_SPDIFIN_INTERNAL 2 /* internal (CDROM) */
265 #define HDSP_SPDIFIN_AES 3 /* xlr for H9632 (AES)*/
267 #define HDSP_Frequency32KHz HDSP_Frequency0
268 #define HDSP_Frequency44_1KHz HDSP_Frequency1
269 #define HDSP_Frequency48KHz (HDSP_Frequency1|HDSP_Frequency0)
270 #define HDSP_Frequency64KHz (HDSP_DoubleSpeed|HDSP_Frequency0)
271 #define HDSP_Frequency88_2KHz (HDSP_DoubleSpeed|HDSP_Frequency1)
272 #define HDSP_Frequency96KHz (HDSP_DoubleSpeed|HDSP_Frequency1|HDSP_Frequency0)
273 /* For H9632 cards */
274 #define HDSP_Frequency128KHz (HDSP_QuadSpeed|HDSP_DoubleSpeed|HDSP_Frequency0)
275 #define HDSP_Frequency176_4KHz (HDSP_QuadSpeed|HDSP_DoubleSpeed|HDSP_Frequency1)
276 #define HDSP_Frequency192KHz (HDSP_QuadSpeed|HDSP_DoubleSpeed|HDSP_Frequency1|HDSP_Frequency0)
278 #define hdsp_encode_latency(x) (((x)<<1) & HDSP_LatencyMask)
279 #define hdsp_decode_latency(x) (((x) & HDSP_LatencyMask)>>1)
281 #define hdsp_encode_spdif_in(x) (((x)&0x3)<<14)
282 #define hdsp_decode_spdif_in(x) (((x)>>14)&0x3)
284 /* Status Register bits */
286 #define HDSP_audioIRQPending (1<<0)
287 #define HDSP_Lock2 (1<<1) /* this is for Digiface and H9652 */
288 #define HDSP_spdifFrequency3 HDSP_Lock2 /* this is for H9632 only */
289 #define HDSP_Lock1 (1<<2)
290 #define HDSP_Lock0 (1<<3)
291 #define HDSP_SPDIFSync (1<<4)
292 #define HDSP_TimecodeLock (1<<5)
293 #define HDSP_BufferPositionMask 0x000FFC0 /* Bit 6..15 : h/w buffer pointer */
294 #define HDSP_Sync2 (1<<16)
295 #define HDSP_Sync1 (1<<17)
296 #define HDSP_Sync0 (1<<18)
297 #define HDSP_DoubleSpeedStatus (1<<19)
298 #define HDSP_ConfigError (1<<20)
299 #define HDSP_DllError (1<<21)
300 #define HDSP_spdifFrequency0 (1<<22)
301 #define HDSP_spdifFrequency1 (1<<23)
302 #define HDSP_spdifFrequency2 (1<<24)
303 #define HDSP_SPDIFErrorFlag (1<<25)
304 #define HDSP_BufferID (1<<26)
305 #define HDSP_TimecodeSync (1<<27)
306 #define HDSP_AEBO (1<<28) /* H9632 specific Analog Extension Boards */
307 #define HDSP_AEBI (1<<29) /* 0 = present, 1 = absent */
308 #define HDSP_midi0IRQPending (1<<30)
309 #define HDSP_midi1IRQPending (1<<31)
311 #define HDSP_spdifFrequencyMask (HDSP_spdifFrequency0|HDSP_spdifFrequency1|HDSP_spdifFrequency2)
313 #define HDSP_spdifFrequency32KHz (HDSP_spdifFrequency0)
314 #define HDSP_spdifFrequency44_1KHz (HDSP_spdifFrequency1)
315 #define HDSP_spdifFrequency48KHz (HDSP_spdifFrequency0|HDSP_spdifFrequency1)
317 #define HDSP_spdifFrequency64KHz (HDSP_spdifFrequency2)
318 #define HDSP_spdifFrequency88_2KHz (HDSP_spdifFrequency0|HDSP_spdifFrequency2)
319 #define HDSP_spdifFrequency96KHz (HDSP_spdifFrequency2|HDSP_spdifFrequency1)
321 /* This is for H9632 cards */
322 #define HDSP_spdifFrequency128KHz HDSP_spdifFrequencyMask
323 #define HDSP_spdifFrequency176_4KHz HDSP_spdifFrequency3
324 #define HDSP_spdifFrequency192KHz (HDSP_spdifFrequency3|HDSP_spdifFrequency0)
326 /* Status2 Register bits */
328 #define HDSP_version0 (1<<0)
329 #define HDSP_version1 (1<<1)
330 #define HDSP_version2 (1<<2)
331 #define HDSP_wc_lock (1<<3)
332 #define HDSP_wc_sync (1<<4)
333 #define HDSP_inp_freq0 (1<<5)
334 #define HDSP_inp_freq1 (1<<6)
335 #define HDSP_inp_freq2 (1<<7)
336 #define HDSP_SelSyncRef0 (1<<8)
337 #define HDSP_SelSyncRef1 (1<<9)
338 #define HDSP_SelSyncRef2 (1<<10)
340 #define HDSP_wc_valid (HDSP_wc_lock|HDSP_wc_sync)
342 #define HDSP_systemFrequencyMask (HDSP_inp_freq0|HDSP_inp_freq1|HDSP_inp_freq2)
343 #define HDSP_systemFrequency32 (HDSP_inp_freq0)
344 #define HDSP_systemFrequency44_1 (HDSP_inp_freq1)
345 #define HDSP_systemFrequency48 (HDSP_inp_freq0|HDSP_inp_freq1)
346 #define HDSP_systemFrequency64 (HDSP_inp_freq2)
347 #define HDSP_systemFrequency88_2 (HDSP_inp_freq0|HDSP_inp_freq2)
348 #define HDSP_systemFrequency96 (HDSP_inp_freq1|HDSP_inp_freq2)
349 /* FIXME : more values for 9632 cards ? */
351 #define HDSP_SelSyncRefMask (HDSP_SelSyncRef0|HDSP_SelSyncRef1|HDSP_SelSyncRef2)
352 #define HDSP_SelSyncRef_ADAT1 0
353 #define HDSP_SelSyncRef_ADAT2 (HDSP_SelSyncRef0)
354 #define HDSP_SelSyncRef_ADAT3 (HDSP_SelSyncRef1)
355 #define HDSP_SelSyncRef_SPDIF (HDSP_SelSyncRef0|HDSP_SelSyncRef1)
356 #define HDSP_SelSyncRef_WORD (HDSP_SelSyncRef2)
357 #define HDSP_SelSyncRef_ADAT_SYNC (HDSP_SelSyncRef0|HDSP_SelSyncRef2)
359 /* Card state flags */
361 #define HDSP_InitializationComplete (1<<0)
362 #define HDSP_FirmwareLoaded (1<<1)
363 #define HDSP_FirmwareCached (1<<2)
365 /* FIFO wait times, defined in terms of 1/10ths of msecs */
367 #define HDSP_LONG_WAIT 5000
368 #define HDSP_SHORT_WAIT 30
370 #define UNITY_GAIN 32768
371 #define MINUS_INFINITY_GAIN 0
373 #ifndef PCI_VENDOR_ID_XILINX
374 #define PCI_VENDOR_ID_XILINX 0x10ee
376 #ifndef PCI_DEVICE_ID_XILINX_HAMMERFALL_DSP
377 #define PCI_DEVICE_ID_XILINX_HAMMERFALL_DSP 0x3fc5
380 /* the size of a substream (1 mono data stream) */
382 #define HDSP_CHANNEL_BUFFER_SAMPLES (16*1024)
383 #define HDSP_CHANNEL_BUFFER_BYTES (4*HDSP_CHANNEL_BUFFER_SAMPLES)
385 /* the size of the area we need to allocate for DMA transfers. the
386 size is the same regardless of the number of channels - the
387 Multiface still uses the same memory area.
389 Note that we allocate 1 more channel than is apparently needed
390 because the h/w seems to write 1 byte beyond the end of the last
394 #define HDSP_DMA_AREA_BYTES ((HDSP_MAX_CHANNELS+1) * HDSP_CHANNEL_BUFFER_BYTES)
395 #define HDSP_DMA_AREA_KILOBYTES (HDSP_DMA_AREA_BYTES/1024)
397 /* use hotplug firmeare loader? */
398 #if defined(CONFIG_FW_LOADER) || defined(CONFIG_FW_LOADER_MODULE)
399 #ifndef HDSP_USE_HWDEP_LOADER
400 #define HDSP_FW_LOADER
404 typedef struct _hdsp hdsp_t
;
405 typedef struct _hdsp_midi hdsp_midi_t
;
406 typedef struct _hdsp_9632_meters hdsp_9632_meters_t
;
408 struct _hdsp_9632_meters
{
410 u32 playback_peak
[16];
414 u32 input_rms_low
[16];
415 u32 playback_rms_low
[16];
416 u32 output_rms_low
[16];
418 u32 input_rms_high
[16];
419 u32 playback_rms_high
[16];
420 u32 output_rms_high
[16];
421 u32 xxx_rms_high
[16];
427 snd_rawmidi_t
*rmidi
;
428 snd_rawmidi_substream_t
*input
;
429 snd_rawmidi_substream_t
*output
;
430 char istimer
; /* timer in use */
431 struct timer_list timer
;
438 snd_pcm_substream_t
*capture_substream
;
439 snd_pcm_substream_t
*playback_substream
;
441 struct tasklet_struct midi_tasklet
;
442 int use_midi_tasklet
;
444 u32 control_register
; /* cached value */
445 u32 control2_register
; /* cached value */
447 u32 creg_spdif_stream
;
448 char *card_name
; /* digiface/multiface */
449 HDSP_IO_Type io_type
; /* ditto, but for code use */
450 unsigned short firmware_rev
;
451 unsigned short state
; /* stores state bits */
452 u32 firmware_cache
[24413]; /* this helps recover from accidental iobox power failure */
453 size_t period_bytes
; /* guess what this is */
454 unsigned char max_channels
;
455 unsigned char qs_in_channels
; /* quad speed mode for H9632 */
456 unsigned char ds_in_channels
;
457 unsigned char ss_in_channels
; /* different for multiface/digiface */
458 unsigned char qs_out_channels
;
459 unsigned char ds_out_channels
;
460 unsigned char ss_out_channels
;
462 struct snd_dma_buffer capture_dma_buf
;
463 struct snd_dma_buffer playback_dma_buf
;
464 unsigned char *capture_buffer
; /* suitably aligned address */
465 unsigned char *playback_buffer
; /* suitably aligned address */
470 int system_sample_rate
;
475 void __iomem
*iobase
;
480 snd_kcontrol_t
*spdif_ctl
;
481 unsigned short mixer_matrix
[HDSP_MATRIX_MIXER_SIZE
];
484 /* These tables map the ALSA channels 1..N to the channels that we
485 need to use in order to find the relevant channel buffer. RME
486 refer to this kind of mapping as between "the ADAT channel and
487 the DMA channel." We index it using the logical audio channel,
488 and the value is the DMA channel (i.e. channel buffer number)
489 where the data for that channel can be read/written from/to.
492 static char channel_map_df_ss
[HDSP_MAX_CHANNELS
] = {
493 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
494 18, 19, 20, 21, 22, 23, 24, 25
497 static char channel_map_mf_ss
[HDSP_MAX_CHANNELS
] = { /* Multiface */
499 0, 1, 2, 3, 4, 5, 6, 7,
501 16, 17, 18, 19, 20, 21, 22, 23,
504 -1, -1, -1, -1, -1, -1, -1, -1
507 static char channel_map_ds
[HDSP_MAX_CHANNELS
] = {
508 /* ADAT channels are remapped */
509 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23,
510 /* channels 12 and 13 are S/PDIF */
512 /* others don't exist */
513 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
516 static char channel_map_H9632_ss
[HDSP_MAX_CHANNELS
] = {
518 0, 1, 2, 3, 4, 5, 6, 7,
523 /* AO4S-192 and AI4S-192 extension boards */
525 /* others don't exist */
526 -1, -1, -1, -1, -1, -1, -1, -1,
530 static char channel_map_H9632_ds
[HDSP_MAX_CHANNELS
] = {
537 /* AO4S-192 and AI4S-192 extension boards */
539 /* others don't exist */
540 -1, -1, -1, -1, -1, -1, -1, -1,
541 -1, -1, -1, -1, -1, -1
544 static char channel_map_H9632_qs
[HDSP_MAX_CHANNELS
] = {
545 /* ADAT is disabled in this mode */
550 /* AO4S-192 and AI4S-192 extension boards */
552 /* others don't exist */
553 -1, -1, -1, -1, -1, -1, -1, -1,
554 -1, -1, -1, -1, -1, -1, -1, -1,
558 static int snd_hammerfall_get_buffer(struct pci_dev
*pci
, struct snd_dma_buffer
*dmab
, size_t size
)
560 dmab
->dev
.type
= SNDRV_DMA_TYPE_DEV
;
561 dmab
->dev
.dev
= snd_dma_pci_data(pci
);
562 if (! snd_dma_get_reserved_buf(dmab
, snd_dma_pci_buf_id(pci
))) {
563 if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV
, snd_dma_pci_data(pci
),
570 static void snd_hammerfall_free_buffer(struct snd_dma_buffer
*dmab
, struct pci_dev
*pci
)
573 snd_dma_reserve_buf(dmab
, snd_dma_pci_buf_id(pci
));
577 static struct pci_device_id snd_hdsp_ids
[] = {
579 .vendor
= PCI_VENDOR_ID_XILINX
,
580 .device
= PCI_DEVICE_ID_XILINX_HAMMERFALL_DSP
,
581 .subvendor
= PCI_ANY_ID
,
582 .subdevice
= PCI_ANY_ID
,
583 }, /* RME Hammerfall-DSP */
587 MODULE_DEVICE_TABLE(pci
, snd_hdsp_ids
);
590 static int snd_hdsp_create_alsa_devices(snd_card_t
*card
, hdsp_t
*hdsp
);
591 static int snd_hdsp_create_pcm(snd_card_t
*card
, hdsp_t
*hdsp
);
592 static int snd_hdsp_enable_io (hdsp_t
*hdsp
);
593 static void snd_hdsp_initialize_midi_flush (hdsp_t
*hdsp
);
594 static void snd_hdsp_initialize_channels (hdsp_t
*hdsp
);
595 static int hdsp_fifo_wait(hdsp_t
*hdsp
, int count
, int timeout
);
596 static int hdsp_autosync_ref(hdsp_t
*hdsp
);
597 static int snd_hdsp_set_defaults(hdsp_t
*hdsp
);
598 static void snd_hdsp_9652_enable_mixer (hdsp_t
*hdsp
);
600 static int hdsp_playback_to_output_key (hdsp_t
*hdsp
, int in
, int out
)
602 switch (hdsp
->firmware_rev
) {
604 return (64 * out
) + (32 + (in
));
607 return (32 * out
) + (16 + (in
));
609 return (52 * out
) + (26 + (in
));
613 static int hdsp_input_to_output_key (hdsp_t
*hdsp
, int in
, int out
)
615 switch (hdsp
->firmware_rev
) {
617 return (64 * out
) + in
;
620 return (32 * out
) + in
;
622 return (52 * out
) + in
;
626 static void hdsp_write(hdsp_t
*hdsp
, int reg
, int val
)
628 writel(val
, hdsp
->iobase
+ reg
);
631 static unsigned int hdsp_read(hdsp_t
*hdsp
, int reg
)
633 return readl (hdsp
->iobase
+ reg
);
636 static int hdsp_check_for_iobox (hdsp_t
*hdsp
)
639 if (hdsp
->io_type
== H9652
|| hdsp
->io_type
== H9632
) return 0;
640 if (hdsp_read (hdsp
, HDSP_statusRegister
) & HDSP_ConfigError
) {
641 snd_printk ("Hammerfall-DSP: no Digiface or Multiface connected!\n");
642 hdsp
->state
&= ~HDSP_FirmwareLoaded
;
649 static int snd_hdsp_load_firmware_from_cache(hdsp_t
*hdsp
) {
654 if ((hdsp_read (hdsp
, HDSP_statusRegister
) & HDSP_DllError
) != 0) {
656 snd_printk ("Hammerfall-DSP: loading firmware\n");
658 hdsp_write (hdsp
, HDSP_control2Reg
, HDSP_S_PROGRAM
);
659 hdsp_write (hdsp
, HDSP_fifoData
, 0);
661 if (hdsp_fifo_wait (hdsp
, 0, HDSP_LONG_WAIT
)) {
662 snd_printk ("Hammerfall-DSP: timeout waiting for download preparation\n");
666 hdsp_write (hdsp
, HDSP_control2Reg
, HDSP_S_LOAD
);
668 for (i
= 0; i
< 24413; ++i
) {
669 hdsp_write(hdsp
, HDSP_fifoData
, hdsp
->firmware_cache
[i
]);
670 if (hdsp_fifo_wait (hdsp
, 127, HDSP_LONG_WAIT
)) {
671 snd_printk ("Hammerfall-DSP: timeout during firmware loading\n");
676 if ((1000 / HZ
) < 3000) {
677 set_current_state(TASK_UNINTERRUPTIBLE
);
678 schedule_timeout((3000 * HZ
+ 999) / 1000);
683 if (hdsp_fifo_wait (hdsp
, 0, HDSP_LONG_WAIT
)) {
684 snd_printk ("Hammerfall-DSP: timeout at end of firmware loading\n");
688 #ifdef SNDRV_BIG_ENDIAN
689 hdsp
->control2_register
= HDSP_BIGENDIAN_MODE
;
691 hdsp
->control2_register
= 0;
693 hdsp_write (hdsp
, HDSP_control2Reg
, hdsp
->control2_register
);
694 snd_printk ("Hammerfall-DSP: finished firmware loading\n");
697 if (hdsp
->state
& HDSP_InitializationComplete
) {
698 snd_printk("Hammerfall-DSP: firmware loaded from cache, restoring defaults\n");
699 spin_lock_irqsave(&hdsp
->lock
, flags
);
700 snd_hdsp_set_defaults(hdsp
);
701 spin_unlock_irqrestore(&hdsp
->lock
, flags
);
704 hdsp
->state
|= HDSP_FirmwareLoaded
;
709 static int hdsp_get_iobox_version (hdsp_t
*hdsp
)
711 if ((hdsp_read (hdsp
, HDSP_statusRegister
) & HDSP_DllError
) != 0) {
713 hdsp_write (hdsp
, HDSP_control2Reg
, HDSP_PROGRAM
);
714 hdsp_write (hdsp
, HDSP_fifoData
, 0);
715 if (hdsp_fifo_wait (hdsp
, 0, HDSP_SHORT_WAIT
) < 0) {
719 hdsp_write (hdsp
, HDSP_control2Reg
, HDSP_S_LOAD
);
720 hdsp_write (hdsp
, HDSP_fifoData
, 0);
722 if (hdsp_fifo_wait (hdsp
, 0, HDSP_SHORT_WAIT
)) {
723 hdsp
->io_type
= Multiface
;
724 hdsp_write (hdsp
, HDSP_control2Reg
, HDSP_VERSION_BIT
);
725 hdsp_write (hdsp
, HDSP_control2Reg
, HDSP_S_LOAD
);
726 hdsp_fifo_wait (hdsp
, 0, HDSP_SHORT_WAIT
);
728 hdsp
->io_type
= Digiface
;
731 /* firmware was already loaded, get iobox type */
732 if (hdsp_read(hdsp
, HDSP_status2Register
) & HDSP_version1
) {
733 hdsp
->io_type
= Multiface
;
735 hdsp
->io_type
= Digiface
;
742 static int hdsp_check_for_firmware (hdsp_t
*hdsp
)
744 if (hdsp
->io_type
== H9652
|| hdsp
->io_type
== H9632
) return 0;
745 if ((hdsp_read (hdsp
, HDSP_statusRegister
) & HDSP_DllError
) != 0) {
746 snd_printk("Hammerfall-DSP: firmware not present.\n");
747 hdsp
->state
&= ~HDSP_FirmwareLoaded
;
754 static int hdsp_fifo_wait(hdsp_t
*hdsp
, int count
, int timeout
)
758 /* the fifoStatus registers reports on how many words
759 are available in the command FIFO.
762 for (i
= 0; i
< timeout
; i
++) {
764 if ((int)(hdsp_read (hdsp
, HDSP_fifoStatus
) & 0xff) <= count
)
767 /* not very friendly, but we only do this during a firmware
768 load and changing the mixer, so we just put up with it.
774 snd_printk ("Hammerfall-DSP: wait for FIFO status <= %d failed after %d iterations\n",
779 static int hdsp_read_gain (hdsp_t
*hdsp
, unsigned int addr
)
781 if (addr
>= HDSP_MATRIX_MIXER_SIZE
) {
784 return hdsp
->mixer_matrix
[addr
];
787 static int hdsp_write_gain(hdsp_t
*hdsp
, unsigned int addr
, unsigned short data
)
791 if (addr
>= HDSP_MATRIX_MIXER_SIZE
)
794 if (hdsp
->io_type
== H9652
|| hdsp
->io_type
== H9632
) {
796 /* from martin bjornsen:
798 "You can only write dwords to the
799 mixer memory which contain two
800 mixer values in the low and high
801 word. So if you want to change
802 value 0 you have to read value 1
803 from the cache and write both to
804 the first dword in the mixer
808 if (hdsp
->io_type
== H9632
&& addr
>= 512) {
812 if (hdsp
->io_type
== H9652
&& addr
>= 1352) {
816 hdsp
->mixer_matrix
[addr
] = data
;
819 /* `addr' addresses a 16-bit wide address, but
820 the address space accessed via hdsp_write
821 uses byte offsets. put another way, addr
822 varies from 0 to 1351, but to access the
823 corresponding memory location, we need
824 to access 0 to 2703 ...
828 hdsp_write (hdsp
, 4096 + (ad
*4),
829 (hdsp
->mixer_matrix
[(addr
&0x7fe)+1] << 16) +
830 hdsp
->mixer_matrix
[addr
&0x7fe]);
836 ad
= (addr
<< 16) + data
;
838 if (hdsp_fifo_wait(hdsp
, 127, HDSP_LONG_WAIT
)) {
842 hdsp_write (hdsp
, HDSP_fifoData
, ad
);
843 hdsp
->mixer_matrix
[addr
] = data
;
850 static int snd_hdsp_use_is_exclusive(hdsp_t
*hdsp
)
855 spin_lock_irqsave(&hdsp
->lock
, flags
);
856 if ((hdsp
->playback_pid
!= hdsp
->capture_pid
) &&
857 (hdsp
->playback_pid
>= 0) && (hdsp
->capture_pid
>= 0)) {
860 spin_unlock_irqrestore(&hdsp
->lock
, flags
);
864 static int hdsp_external_sample_rate (hdsp_t
*hdsp
)
866 unsigned int status2
= hdsp_read(hdsp
, HDSP_status2Register
);
867 unsigned int rate_bits
= status2
& HDSP_systemFrequencyMask
;
870 case HDSP_systemFrequency32
: return 32000;
871 case HDSP_systemFrequency44_1
: return 44100;
872 case HDSP_systemFrequency48
: return 48000;
873 case HDSP_systemFrequency64
: return 64000;
874 case HDSP_systemFrequency88_2
: return 88200;
875 case HDSP_systemFrequency96
: return 96000;
881 static int hdsp_spdif_sample_rate(hdsp_t
*hdsp
)
883 unsigned int status
= hdsp_read(hdsp
, HDSP_statusRegister
);
884 unsigned int rate_bits
= (status
& HDSP_spdifFrequencyMask
);
886 if (status
& HDSP_SPDIFErrorFlag
) {
891 case HDSP_spdifFrequency32KHz
: return 32000;
892 case HDSP_spdifFrequency44_1KHz
: return 44100;
893 case HDSP_spdifFrequency48KHz
: return 48000;
894 case HDSP_spdifFrequency64KHz
: return 64000;
895 case HDSP_spdifFrequency88_2KHz
: return 88200;
896 case HDSP_spdifFrequency96KHz
: return 96000;
897 case HDSP_spdifFrequency128KHz
:
898 if (hdsp
->io_type
== H9632
) return 128000;
900 case HDSP_spdifFrequency176_4KHz
:
901 if (hdsp
->io_type
== H9632
) return 176400;
903 case HDSP_spdifFrequency192KHz
:
904 if (hdsp
->io_type
== H9632
) return 192000;
909 snd_printk ("Hammerfall-DSP: unknown spdif frequency status; bits = 0x%x, status = 0x%x\n", rate_bits
, status
);
913 static void hdsp_compute_period_size(hdsp_t
*hdsp
)
915 hdsp
->period_bytes
= 1 << ((hdsp_decode_latency(hdsp
->control_register
) + 8));
918 static snd_pcm_uframes_t
hdsp_hw_pointer(hdsp_t
*hdsp
)
922 position
= hdsp_read(hdsp
, HDSP_statusRegister
);
924 if (!hdsp
->precise_ptr
) {
925 return (position
& HDSP_BufferID
) ? (hdsp
->period_bytes
/ 4) : 0;
928 position
&= HDSP_BufferPositionMask
;
930 position
&= (hdsp
->period_bytes
/2) - 1;
934 static void hdsp_reset_hw_pointer(hdsp_t
*hdsp
)
936 hdsp_write (hdsp
, HDSP_resetPointer
, 0);
939 static void hdsp_start_audio(hdsp_t
*s
)
941 s
->control_register
|= (HDSP_AudioInterruptEnable
| HDSP_Start
);
942 hdsp_write(s
, HDSP_controlRegister
, s
->control_register
);
945 static void hdsp_stop_audio(hdsp_t
*s
)
947 s
->control_register
&= ~(HDSP_Start
| HDSP_AudioInterruptEnable
);
948 hdsp_write(s
, HDSP_controlRegister
, s
->control_register
);
951 static void hdsp_silence_playback(hdsp_t
*hdsp
)
953 memset(hdsp
->playback_buffer
, 0, HDSP_DMA_AREA_BYTES
);
956 static int hdsp_set_interrupt_interval(hdsp_t
*s
, unsigned int frames
)
960 spin_lock_irq(&s
->lock
);
969 s
->control_register
&= ~HDSP_LatencyMask
;
970 s
->control_register
|= hdsp_encode_latency(n
);
972 hdsp_write(s
, HDSP_controlRegister
, s
->control_register
);
974 hdsp_compute_period_size(s
);
976 spin_unlock_irq(&s
->lock
);
981 static int hdsp_set_rate(hdsp_t
*hdsp
, int rate
, int called_internally
)
983 int reject_if_open
= 0;
987 /* ASSUMPTION: hdsp->lock is either held, or
988 there is no need for it (e.g. during module
992 if (!(hdsp
->control_register
& HDSP_ClockModeMaster
)) {
993 if (called_internally
) {
994 /* request from ctl or card initialization */
995 snd_printk("Hammerfall-DSP: device is not running as a clock master: cannot set sample rate.\n");
998 /* hw_param request while in AutoSync mode */
999 int external_freq
= hdsp_external_sample_rate(hdsp
);
1000 int spdif_freq
= hdsp_spdif_sample_rate(hdsp
);
1002 if ((spdif_freq
== external_freq
*2) && (hdsp_autosync_ref(hdsp
) >= HDSP_AUTOSYNC_FROM_ADAT1
)) {
1003 snd_printk("Hammerfall-DSP: Detected ADAT in double speed mode\n");
1004 } else if (hdsp
->io_type
== H9632
&& (spdif_freq
== external_freq
*4) && (hdsp_autosync_ref(hdsp
) >= HDSP_AUTOSYNC_FROM_ADAT1
)) {
1005 snd_printk("Hammerfall-DSP: Detected ADAT in quad speed mode\n");
1006 } else if (rate
!= external_freq
) {
1007 snd_printk("Hammerfall-DSP: No AutoSync source for requested rate\n");
1013 current_rate
= hdsp
->system_sample_rate
;
1015 /* Changing from a "single speed" to a "double speed" rate is
1016 not allowed if any substreams are open. This is because
1017 such a change causes a shift in the location of
1018 the DMA buffers and a reduction in the number of available
1021 Note that a similar but essentially insoluble problem
1022 exists for externally-driven rate changes. All we can do
1023 is to flag rate changes in the read/write routines. */
1025 if (rate
> 96000 && hdsp
->io_type
!= H9632
) {
1031 if (current_rate
> 48000) {
1034 rate_bits
= HDSP_Frequency32KHz
;
1037 if (current_rate
> 48000) {
1040 rate_bits
= HDSP_Frequency44_1KHz
;
1043 if (current_rate
> 48000) {
1046 rate_bits
= HDSP_Frequency48KHz
;
1049 if (current_rate
<= 48000 || current_rate
> 96000) {
1052 rate_bits
= HDSP_Frequency64KHz
;
1055 if (current_rate
<= 48000 || current_rate
> 96000) {
1058 rate_bits
= HDSP_Frequency88_2KHz
;
1061 if (current_rate
<= 48000 || current_rate
> 96000) {
1064 rate_bits
= HDSP_Frequency96KHz
;
1067 if (current_rate
< 128000) {
1070 rate_bits
= HDSP_Frequency128KHz
;
1073 if (current_rate
< 128000) {
1076 rate_bits
= HDSP_Frequency176_4KHz
;
1079 if (current_rate
< 128000) {
1082 rate_bits
= HDSP_Frequency192KHz
;
1088 if (reject_if_open
&& (hdsp
->capture_pid
>= 0 || hdsp
->playback_pid
>= 0)) {
1089 snd_printk ("Hammerfall-DSP: cannot change speed mode (capture PID = %d, playback PID = %d)\n",
1091 hdsp
->playback_pid
);
1095 hdsp
->control_register
&= ~HDSP_FrequencyMask
;
1096 hdsp
->control_register
|= rate_bits
;
1097 hdsp_write(hdsp
, HDSP_controlRegister
, hdsp
->control_register
);
1099 if (rate
>= 128000) {
1100 hdsp
->channel_map
= channel_map_H9632_qs
;
1101 } else if (rate
> 48000) {
1102 if (hdsp
->io_type
== H9632
) {
1103 hdsp
->channel_map
= channel_map_H9632_ds
;
1105 hdsp
->channel_map
= channel_map_ds
;
1108 switch (hdsp
->io_type
) {
1110 hdsp
->channel_map
= channel_map_mf_ss
;
1114 hdsp
->channel_map
= channel_map_df_ss
;
1117 hdsp
->channel_map
= channel_map_H9632_ss
;
1120 /* should never happen */
1125 hdsp
->system_sample_rate
= rate
;
1130 /*----------------------------------------------------------------------------
1132 ----------------------------------------------------------------------------*/
1134 static unsigned char snd_hdsp_midi_read_byte (hdsp_t
*hdsp
, int id
)
1136 /* the hardware already does the relevant bit-mask with 0xff */
1138 return hdsp_read(hdsp
, HDSP_midiDataIn1
);
1140 return hdsp_read(hdsp
, HDSP_midiDataIn0
);
1144 static void snd_hdsp_midi_write_byte (hdsp_t
*hdsp
, int id
, int val
)
1146 /* the hardware already does the relevant bit-mask with 0xff */
1148 hdsp_write(hdsp
, HDSP_midiDataOut1
, val
);
1150 hdsp_write(hdsp
, HDSP_midiDataOut0
, val
);
1154 static int snd_hdsp_midi_input_available (hdsp_t
*hdsp
, int id
)
1157 return (hdsp_read(hdsp
, HDSP_midiStatusIn1
) & 0xff);
1159 return (hdsp_read(hdsp
, HDSP_midiStatusIn0
) & 0xff);
1163 static int snd_hdsp_midi_output_possible (hdsp_t
*hdsp
, int id
)
1165 int fifo_bytes_used
;
1168 fifo_bytes_used
= hdsp_read(hdsp
, HDSP_midiStatusOut1
) & 0xff;
1170 fifo_bytes_used
= hdsp_read(hdsp
, HDSP_midiStatusOut0
) & 0xff;
1173 if (fifo_bytes_used
< 128) {
1174 return 128 - fifo_bytes_used
;
1180 static void snd_hdsp_flush_midi_input (hdsp_t
*hdsp
, int id
)
1182 while (snd_hdsp_midi_input_available (hdsp
, id
)) {
1183 snd_hdsp_midi_read_byte (hdsp
, id
);
1187 static int snd_hdsp_midi_output_write (hdsp_midi_t
*hmidi
)
1189 unsigned long flags
;
1193 unsigned char buf
[128];
1195 /* Output is not interrupt driven */
1197 spin_lock_irqsave (&hmidi
->lock
, flags
);
1198 if (hmidi
->output
) {
1199 if (!snd_rawmidi_transmit_empty (hmidi
->output
)) {
1200 if ((n_pending
= snd_hdsp_midi_output_possible (hmidi
->hdsp
, hmidi
->id
)) > 0) {
1201 if (n_pending
> (int)sizeof (buf
))
1202 n_pending
= sizeof (buf
);
1204 if ((to_write
= snd_rawmidi_transmit (hmidi
->output
, buf
, n_pending
)) > 0) {
1205 for (i
= 0; i
< to_write
; ++i
)
1206 snd_hdsp_midi_write_byte (hmidi
->hdsp
, hmidi
->id
, buf
[i
]);
1211 spin_unlock_irqrestore (&hmidi
->lock
, flags
);
1215 static int snd_hdsp_midi_input_read (hdsp_midi_t
*hmidi
)
1217 unsigned char buf
[128]; /* this buffer is designed to match the MIDI input FIFO size */
1218 unsigned long flags
;
1222 spin_lock_irqsave (&hmidi
->lock
, flags
);
1223 if ((n_pending
= snd_hdsp_midi_input_available (hmidi
->hdsp
, hmidi
->id
)) > 0) {
1225 if (n_pending
> (int)sizeof (buf
)) {
1226 n_pending
= sizeof (buf
);
1228 for (i
= 0; i
< n_pending
; ++i
) {
1229 buf
[i
] = snd_hdsp_midi_read_byte (hmidi
->hdsp
, hmidi
->id
);
1232 snd_rawmidi_receive (hmidi
->input
, buf
, n_pending
);
1235 /* flush the MIDI input FIFO */
1236 while (--n_pending
) {
1237 snd_hdsp_midi_read_byte (hmidi
->hdsp
, hmidi
->id
);
1243 hmidi
->hdsp
->control_register
|= HDSP_Midi1InterruptEnable
;
1245 hmidi
->hdsp
->control_register
|= HDSP_Midi0InterruptEnable
;
1247 hdsp_write(hmidi
->hdsp
, HDSP_controlRegister
, hmidi
->hdsp
->control_register
);
1248 spin_unlock_irqrestore (&hmidi
->lock
, flags
);
1249 return snd_hdsp_midi_output_write (hmidi
);
1252 static void snd_hdsp_midi_input_trigger(snd_rawmidi_substream_t
* substream
, int up
)
1256 unsigned long flags
;
1259 hmidi
= (hdsp_midi_t
*) substream
->rmidi
->private_data
;
1261 ie
= hmidi
->id
? HDSP_Midi1InterruptEnable
: HDSP_Midi0InterruptEnable
;
1262 spin_lock_irqsave (&hdsp
->lock
, flags
);
1264 if (!(hdsp
->control_register
& ie
)) {
1265 snd_hdsp_flush_midi_input (hdsp
, hmidi
->id
);
1266 hdsp
->control_register
|= ie
;
1269 hdsp
->control_register
&= ~ie
;
1270 tasklet_kill(&hdsp
->midi_tasklet
);
1273 hdsp_write(hdsp
, HDSP_controlRegister
, hdsp
->control_register
);
1274 spin_unlock_irqrestore (&hdsp
->lock
, flags
);
1277 static void snd_hdsp_midi_output_timer(unsigned long data
)
1279 hdsp_midi_t
*hmidi
= (hdsp_midi_t
*) data
;
1280 unsigned long flags
;
1282 snd_hdsp_midi_output_write(hmidi
);
1283 spin_lock_irqsave (&hmidi
->lock
, flags
);
1285 /* this does not bump hmidi->istimer, because the
1286 kernel automatically removed the timer when it
1287 expired, and we are now adding it back, thus
1288 leaving istimer wherever it was set before.
1291 if (hmidi
->istimer
) {
1292 hmidi
->timer
.expires
= 1 + jiffies
;
1293 add_timer(&hmidi
->timer
);
1296 spin_unlock_irqrestore (&hmidi
->lock
, flags
);
1299 static void snd_hdsp_midi_output_trigger(snd_rawmidi_substream_t
* substream
, int up
)
1302 unsigned long flags
;
1304 hmidi
= (hdsp_midi_t
*) substream
->rmidi
->private_data
;
1305 spin_lock_irqsave (&hmidi
->lock
, flags
);
1307 if (!hmidi
->istimer
) {
1308 init_timer(&hmidi
->timer
);
1309 hmidi
->timer
.function
= snd_hdsp_midi_output_timer
;
1310 hmidi
->timer
.data
= (unsigned long) hmidi
;
1311 hmidi
->timer
.expires
= 1 + jiffies
;
1312 add_timer(&hmidi
->timer
);
1316 if (hmidi
->istimer
&& --hmidi
->istimer
<= 0) {
1317 del_timer (&hmidi
->timer
);
1320 spin_unlock_irqrestore (&hmidi
->lock
, flags
);
1322 snd_hdsp_midi_output_write(hmidi
);
1325 static int snd_hdsp_midi_input_open(snd_rawmidi_substream_t
* substream
)
1329 hmidi
= (hdsp_midi_t
*) substream
->rmidi
->private_data
;
1330 spin_lock_irq (&hmidi
->lock
);
1331 snd_hdsp_flush_midi_input (hmidi
->hdsp
, hmidi
->id
);
1332 hmidi
->input
= substream
;
1333 spin_unlock_irq (&hmidi
->lock
);
1338 static int snd_hdsp_midi_output_open(snd_rawmidi_substream_t
* substream
)
1342 hmidi
= (hdsp_midi_t
*) substream
->rmidi
->private_data
;
1343 spin_lock_irq (&hmidi
->lock
);
1344 hmidi
->output
= substream
;
1345 spin_unlock_irq (&hmidi
->lock
);
1350 static int snd_hdsp_midi_input_close(snd_rawmidi_substream_t
* substream
)
1354 snd_hdsp_midi_input_trigger (substream
, 0);
1356 hmidi
= (hdsp_midi_t
*) substream
->rmidi
->private_data
;
1357 spin_lock_irq (&hmidi
->lock
);
1358 hmidi
->input
= NULL
;
1359 spin_unlock_irq (&hmidi
->lock
);
1364 static int snd_hdsp_midi_output_close(snd_rawmidi_substream_t
* substream
)
1368 snd_hdsp_midi_output_trigger (substream
, 0);
1370 hmidi
= (hdsp_midi_t
*) substream
->rmidi
->private_data
;
1371 spin_lock_irq (&hmidi
->lock
);
1372 hmidi
->output
= NULL
;
1373 spin_unlock_irq (&hmidi
->lock
);
1378 static snd_rawmidi_ops_t snd_hdsp_midi_output
=
1380 .open
= snd_hdsp_midi_output_open
,
1381 .close
= snd_hdsp_midi_output_close
,
1382 .trigger
= snd_hdsp_midi_output_trigger
,
1385 static snd_rawmidi_ops_t snd_hdsp_midi_input
=
1387 .open
= snd_hdsp_midi_input_open
,
1388 .close
= snd_hdsp_midi_input_close
,
1389 .trigger
= snd_hdsp_midi_input_trigger
,
1392 static int __devinit
snd_hdsp_create_midi (snd_card_t
*card
, hdsp_t
*hdsp
, int id
)
1396 hdsp
->midi
[id
].id
= id
;
1397 hdsp
->midi
[id
].rmidi
= NULL
;
1398 hdsp
->midi
[id
].input
= NULL
;
1399 hdsp
->midi
[id
].output
= NULL
;
1400 hdsp
->midi
[id
].hdsp
= hdsp
;
1401 hdsp
->midi
[id
].istimer
= 0;
1402 hdsp
->midi
[id
].pending
= 0;
1403 spin_lock_init (&hdsp
->midi
[id
].lock
);
1405 sprintf (buf
, "%s MIDI %d", card
->shortname
, id
+1);
1406 if (snd_rawmidi_new (card
, buf
, id
, 1, 1, &hdsp
->midi
[id
].rmidi
) < 0) {
1410 sprintf (hdsp
->midi
[id
].rmidi
->name
, "%s MIDI %d", card
->id
, id
+1);
1411 hdsp
->midi
[id
].rmidi
->private_data
= &hdsp
->midi
[id
];
1413 snd_rawmidi_set_ops (hdsp
->midi
[id
].rmidi
, SNDRV_RAWMIDI_STREAM_OUTPUT
, &snd_hdsp_midi_output
);
1414 snd_rawmidi_set_ops (hdsp
->midi
[id
].rmidi
, SNDRV_RAWMIDI_STREAM_INPUT
, &snd_hdsp_midi_input
);
1416 hdsp
->midi
[id
].rmidi
->info_flags
|= SNDRV_RAWMIDI_INFO_OUTPUT
|
1417 SNDRV_RAWMIDI_INFO_INPUT
|
1418 SNDRV_RAWMIDI_INFO_DUPLEX
;
1423 /*-----------------------------------------------------------------------------
1425 ----------------------------------------------------------------------------*/
1427 static u32
snd_hdsp_convert_from_aes(snd_aes_iec958_t
*aes
)
1430 val
|= (aes
->status
[0] & IEC958_AES0_PROFESSIONAL
) ? HDSP_SPDIFProfessional
: 0;
1431 val
|= (aes
->status
[0] & IEC958_AES0_NONAUDIO
) ? HDSP_SPDIFNonAudio
: 0;
1432 if (val
& HDSP_SPDIFProfessional
)
1433 val
|= (aes
->status
[0] & IEC958_AES0_PRO_EMPHASIS_5015
) ? HDSP_SPDIFEmphasis
: 0;
1435 val
|= (aes
->status
[0] & IEC958_AES0_CON_EMPHASIS_5015
) ? HDSP_SPDIFEmphasis
: 0;
1439 static void snd_hdsp_convert_to_aes(snd_aes_iec958_t
*aes
, u32 val
)
1441 aes
->status
[0] = ((val
& HDSP_SPDIFProfessional
) ? IEC958_AES0_PROFESSIONAL
: 0) |
1442 ((val
& HDSP_SPDIFNonAudio
) ? IEC958_AES0_NONAUDIO
: 0);
1443 if (val
& HDSP_SPDIFProfessional
)
1444 aes
->status
[0] |= (val
& HDSP_SPDIFEmphasis
) ? IEC958_AES0_PRO_EMPHASIS_5015
: 0;
1446 aes
->status
[0] |= (val
& HDSP_SPDIFEmphasis
) ? IEC958_AES0_CON_EMPHASIS_5015
: 0;
1449 static int snd_hdsp_control_spdif_info(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
* uinfo
)
1451 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_IEC958
;
1456 static int snd_hdsp_control_spdif_get(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
1458 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
1460 snd_hdsp_convert_to_aes(&ucontrol
->value
.iec958
, hdsp
->creg_spdif
);
1464 static int snd_hdsp_control_spdif_put(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
1466 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
1470 val
= snd_hdsp_convert_from_aes(&ucontrol
->value
.iec958
);
1471 spin_lock_irq(&hdsp
->lock
);
1472 change
= val
!= hdsp
->creg_spdif
;
1473 hdsp
->creg_spdif
= val
;
1474 spin_unlock_irq(&hdsp
->lock
);
1478 static int snd_hdsp_control_spdif_stream_info(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
* uinfo
)
1480 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_IEC958
;
1485 static int snd_hdsp_control_spdif_stream_get(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
1487 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
1489 snd_hdsp_convert_to_aes(&ucontrol
->value
.iec958
, hdsp
->creg_spdif_stream
);
1493 static int snd_hdsp_control_spdif_stream_put(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
1495 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
1499 val
= snd_hdsp_convert_from_aes(&ucontrol
->value
.iec958
);
1500 spin_lock_irq(&hdsp
->lock
);
1501 change
= val
!= hdsp
->creg_spdif_stream
;
1502 hdsp
->creg_spdif_stream
= val
;
1503 hdsp
->control_register
&= ~(HDSP_SPDIFProfessional
| HDSP_SPDIFNonAudio
| HDSP_SPDIFEmphasis
);
1504 hdsp_write(hdsp
, HDSP_controlRegister
, hdsp
->control_register
|= val
);
1505 spin_unlock_irq(&hdsp
->lock
);
1509 static int snd_hdsp_control_spdif_mask_info(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
* uinfo
)
1511 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_IEC958
;
1516 static int snd_hdsp_control_spdif_mask_get(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
1518 ucontrol
->value
.iec958
.status
[0] = kcontrol
->private_value
;
1522 #define HDSP_SPDIF_IN(xname, xindex) \
1523 { .iface = SNDRV_CTL_ELEM_IFACE_PCM, \
1526 .info = snd_hdsp_info_spdif_in, \
1527 .get = snd_hdsp_get_spdif_in, \
1528 .put = snd_hdsp_put_spdif_in }
1530 static unsigned int hdsp_spdif_in(hdsp_t
*hdsp
)
1532 return hdsp_decode_spdif_in(hdsp
->control_register
& HDSP_SPDIFInputMask
);
1535 static int hdsp_set_spdif_input(hdsp_t
*hdsp
, int in
)
1537 hdsp
->control_register
&= ~HDSP_SPDIFInputMask
;
1538 hdsp
->control_register
|= hdsp_encode_spdif_in(in
);
1539 hdsp_write(hdsp
, HDSP_controlRegister
, hdsp
->control_register
);
1543 static int snd_hdsp_info_spdif_in(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
* uinfo
)
1545 static char *texts
[4] = {"Optical", "Coaxial", "Internal", "AES"};
1546 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
1548 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_ENUMERATED
;
1550 uinfo
->value
.enumerated
.items
= ((hdsp
->io_type
== H9632
) ? 4 : 3);
1551 if (uinfo
->value
.enumerated
.item
> ((hdsp
->io_type
== H9632
) ? 3 : 2))
1552 uinfo
->value
.enumerated
.item
= ((hdsp
->io_type
== H9632
) ? 3 : 2);
1553 strcpy(uinfo
->value
.enumerated
.name
, texts
[uinfo
->value
.enumerated
.item
]);
1557 static int snd_hdsp_get_spdif_in(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
1559 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
1561 ucontrol
->value
.enumerated
.item
[0] = hdsp_spdif_in(hdsp
);
1565 static int snd_hdsp_put_spdif_in(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
1567 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
1571 if (!snd_hdsp_use_is_exclusive(hdsp
))
1573 val
= ucontrol
->value
.enumerated
.item
[0] % ((hdsp
->io_type
== H9632
) ? 4 : 3);
1574 spin_lock_irq(&hdsp
->lock
);
1575 change
= val
!= hdsp_spdif_in(hdsp
);
1577 hdsp_set_spdif_input(hdsp
, val
);
1578 spin_unlock_irq(&hdsp
->lock
);
1582 #define HDSP_SPDIF_OUT(xname, xindex) \
1583 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, .name = xname, .index = xindex, \
1584 .info = snd_hdsp_info_spdif_bits, \
1585 .get = snd_hdsp_get_spdif_out, .put = snd_hdsp_put_spdif_out }
1587 static int hdsp_spdif_out(hdsp_t
*hdsp
)
1589 return (hdsp
->control_register
& HDSP_SPDIFOpticalOut
) ? 1 : 0;
1592 static int hdsp_set_spdif_output(hdsp_t
*hdsp
, int out
)
1595 hdsp
->control_register
|= HDSP_SPDIFOpticalOut
;
1597 hdsp
->control_register
&= ~HDSP_SPDIFOpticalOut
;
1599 hdsp_write(hdsp
, HDSP_controlRegister
, hdsp
->control_register
);
1603 static int snd_hdsp_info_spdif_bits(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
* uinfo
)
1605 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_BOOLEAN
;
1607 uinfo
->value
.integer
.min
= 0;
1608 uinfo
->value
.integer
.max
= 1;
1612 static int snd_hdsp_get_spdif_out(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
1614 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
1616 ucontrol
->value
.integer
.value
[0] = hdsp_spdif_out(hdsp
);
1620 static int snd_hdsp_put_spdif_out(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
1622 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
1626 if (!snd_hdsp_use_is_exclusive(hdsp
))
1628 val
= ucontrol
->value
.integer
.value
[0] & 1;
1629 spin_lock_irq(&hdsp
->lock
);
1630 change
= (int)val
!= hdsp_spdif_out(hdsp
);
1631 hdsp_set_spdif_output(hdsp
, val
);
1632 spin_unlock_irq(&hdsp
->lock
);
1636 #define HDSP_SPDIF_PROFESSIONAL(xname, xindex) \
1637 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, .name = xname, .index = xindex, \
1638 .info = snd_hdsp_info_spdif_bits, \
1639 .get = snd_hdsp_get_spdif_professional, .put = snd_hdsp_put_spdif_professional }
1641 static int hdsp_spdif_professional(hdsp_t
*hdsp
)
1643 return (hdsp
->control_register
& HDSP_SPDIFProfessional
) ? 1 : 0;
1646 static int hdsp_set_spdif_professional(hdsp_t
*hdsp
, int val
)
1649 hdsp
->control_register
|= HDSP_SPDIFProfessional
;
1651 hdsp
->control_register
&= ~HDSP_SPDIFProfessional
;
1653 hdsp_write(hdsp
, HDSP_controlRegister
, hdsp
->control_register
);
1657 static int snd_hdsp_get_spdif_professional(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
1659 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
1661 ucontrol
->value
.integer
.value
[0] = hdsp_spdif_professional(hdsp
);
1665 static int snd_hdsp_put_spdif_professional(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
1667 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
1671 if (!snd_hdsp_use_is_exclusive(hdsp
))
1673 val
= ucontrol
->value
.integer
.value
[0] & 1;
1674 spin_lock_irq(&hdsp
->lock
);
1675 change
= (int)val
!= hdsp_spdif_professional(hdsp
);
1676 hdsp_set_spdif_professional(hdsp
, val
);
1677 spin_unlock_irq(&hdsp
->lock
);
1681 #define HDSP_SPDIF_EMPHASIS(xname, xindex) \
1682 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, .name = xname, .index = xindex, \
1683 .info = snd_hdsp_info_spdif_bits, \
1684 .get = snd_hdsp_get_spdif_emphasis, .put = snd_hdsp_put_spdif_emphasis }
1686 static int hdsp_spdif_emphasis(hdsp_t
*hdsp
)
1688 return (hdsp
->control_register
& HDSP_SPDIFEmphasis
) ? 1 : 0;
1691 static int hdsp_set_spdif_emphasis(hdsp_t
*hdsp
, int val
)
1694 hdsp
->control_register
|= HDSP_SPDIFEmphasis
;
1696 hdsp
->control_register
&= ~HDSP_SPDIFEmphasis
;
1698 hdsp_write(hdsp
, HDSP_controlRegister
, hdsp
->control_register
);
1702 static int snd_hdsp_get_spdif_emphasis(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
1704 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
1706 ucontrol
->value
.integer
.value
[0] = hdsp_spdif_emphasis(hdsp
);
1710 static int snd_hdsp_put_spdif_emphasis(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
1712 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
1716 if (!snd_hdsp_use_is_exclusive(hdsp
))
1718 val
= ucontrol
->value
.integer
.value
[0] & 1;
1719 spin_lock_irq(&hdsp
->lock
);
1720 change
= (int)val
!= hdsp_spdif_emphasis(hdsp
);
1721 hdsp_set_spdif_emphasis(hdsp
, val
);
1722 spin_unlock_irq(&hdsp
->lock
);
1726 #define HDSP_SPDIF_NON_AUDIO(xname, xindex) \
1727 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, .name = xname, .index = xindex, \
1728 .info = snd_hdsp_info_spdif_bits, \
1729 .get = snd_hdsp_get_spdif_nonaudio, .put = snd_hdsp_put_spdif_nonaudio }
1731 static int hdsp_spdif_nonaudio(hdsp_t
*hdsp
)
1733 return (hdsp
->control_register
& HDSP_SPDIFNonAudio
) ? 1 : 0;
1736 static int hdsp_set_spdif_nonaudio(hdsp_t
*hdsp
, int val
)
1739 hdsp
->control_register
|= HDSP_SPDIFNonAudio
;
1741 hdsp
->control_register
&= ~HDSP_SPDIFNonAudio
;
1743 hdsp_write(hdsp
, HDSP_controlRegister
, hdsp
->control_register
);
1747 static int snd_hdsp_get_spdif_nonaudio(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
1749 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
1751 ucontrol
->value
.integer
.value
[0] = hdsp_spdif_nonaudio(hdsp
);
1755 static int snd_hdsp_put_spdif_nonaudio(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
1757 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
1761 if (!snd_hdsp_use_is_exclusive(hdsp
))
1763 val
= ucontrol
->value
.integer
.value
[0] & 1;
1764 spin_lock_irq(&hdsp
->lock
);
1765 change
= (int)val
!= hdsp_spdif_nonaudio(hdsp
);
1766 hdsp_set_spdif_nonaudio(hdsp
, val
);
1767 spin_unlock_irq(&hdsp
->lock
);
1771 #define HDSP_SPDIF_SAMPLE_RATE(xname, xindex) \
1772 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
1775 .access = SNDRV_CTL_ELEM_ACCESS_READ, \
1776 .info = snd_hdsp_info_spdif_sample_rate, \
1777 .get = snd_hdsp_get_spdif_sample_rate \
1780 static int snd_hdsp_info_spdif_sample_rate(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
* uinfo
)
1782 static char *texts
[] = {"32000", "44100", "48000", "64000", "88200", "96000", "None", "128000", "176400", "192000"};
1783 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
1785 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_ENUMERATED
;
1787 uinfo
->value
.enumerated
.items
= (hdsp
->io_type
== H9632
) ? 10 : 7;
1788 if (uinfo
->value
.enumerated
.item
>= uinfo
->value
.enumerated
.items
)
1789 uinfo
->value
.enumerated
.item
= uinfo
->value
.enumerated
.items
- 1;
1790 strcpy(uinfo
->value
.enumerated
.name
, texts
[uinfo
->value
.enumerated
.item
]);
1794 static int snd_hdsp_get_spdif_sample_rate(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
1796 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
1798 switch (hdsp_spdif_sample_rate(hdsp
)) {
1800 ucontrol
->value
.enumerated
.item
[0] = 0;
1803 ucontrol
->value
.enumerated
.item
[0] = 1;
1806 ucontrol
->value
.enumerated
.item
[0] = 2;
1809 ucontrol
->value
.enumerated
.item
[0] = 3;
1812 ucontrol
->value
.enumerated
.item
[0] = 4;
1815 ucontrol
->value
.enumerated
.item
[0] = 5;
1818 ucontrol
->value
.enumerated
.item
[0] = 7;
1821 ucontrol
->value
.enumerated
.item
[0] = 8;
1824 ucontrol
->value
.enumerated
.item
[0] = 9;
1827 ucontrol
->value
.enumerated
.item
[0] = 6;
1832 #define HDSP_SYSTEM_SAMPLE_RATE(xname, xindex) \
1833 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
1836 .access = SNDRV_CTL_ELEM_ACCESS_READ, \
1837 .info = snd_hdsp_info_system_sample_rate, \
1838 .get = snd_hdsp_get_system_sample_rate \
1841 static int snd_hdsp_info_system_sample_rate(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
* uinfo
)
1843 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_INTEGER
;
1848 static int snd_hdsp_get_system_sample_rate(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
1850 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
1852 ucontrol
->value
.enumerated
.item
[0] = hdsp
->system_sample_rate
;
1856 #define HDSP_AUTOSYNC_SAMPLE_RATE(xname, xindex) \
1857 { .iface = SNDRV_CTL_ELEM_IFACE_PCM, \
1860 .access = SNDRV_CTL_ELEM_ACCESS_READ, \
1861 .info = snd_hdsp_info_autosync_sample_rate, \
1862 .get = snd_hdsp_get_autosync_sample_rate \
1865 static int snd_hdsp_info_autosync_sample_rate(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
* uinfo
)
1867 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
1868 static char *texts
[] = {"32000", "44100", "48000", "64000", "88200", "96000", "None", "128000", "176400", "192000"};
1869 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_ENUMERATED
;
1871 uinfo
->value
.enumerated
.items
= (hdsp
->io_type
== H9632
) ? 10 : 7 ;
1872 if (uinfo
->value
.enumerated
.item
>= uinfo
->value
.enumerated
.items
)
1873 uinfo
->value
.enumerated
.item
= uinfo
->value
.enumerated
.items
- 1;
1874 strcpy(uinfo
->value
.enumerated
.name
, texts
[uinfo
->value
.enumerated
.item
]);
1878 static int snd_hdsp_get_autosync_sample_rate(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
1880 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
1882 switch (hdsp_external_sample_rate(hdsp
)) {
1884 ucontrol
->value
.enumerated
.item
[0] = 0;
1887 ucontrol
->value
.enumerated
.item
[0] = 1;
1890 ucontrol
->value
.enumerated
.item
[0] = 2;
1893 ucontrol
->value
.enumerated
.item
[0] = 3;
1896 ucontrol
->value
.enumerated
.item
[0] = 4;
1899 ucontrol
->value
.enumerated
.item
[0] = 5;
1902 ucontrol
->value
.enumerated
.item
[0] = 7;
1905 ucontrol
->value
.enumerated
.item
[0] = 8;
1908 ucontrol
->value
.enumerated
.item
[0] = 9;
1911 ucontrol
->value
.enumerated
.item
[0] = 6;
1916 #define HDSP_SYSTEM_CLOCK_MODE(xname, xindex) \
1917 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
1920 .access = SNDRV_CTL_ELEM_ACCESS_READ, \
1921 .info = snd_hdsp_info_system_clock_mode, \
1922 .get = snd_hdsp_get_system_clock_mode \
1925 static int hdsp_system_clock_mode(hdsp_t
*hdsp
)
1927 if (hdsp
->control_register
& HDSP_ClockModeMaster
) {
1929 } else if (hdsp_external_sample_rate(hdsp
) != hdsp
->system_sample_rate
) {
1935 static int snd_hdsp_info_system_clock_mode(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
* uinfo
)
1937 static char *texts
[] = {"Master", "Slave" };
1939 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_ENUMERATED
;
1941 uinfo
->value
.enumerated
.items
= 2;
1942 if (uinfo
->value
.enumerated
.item
>= uinfo
->value
.enumerated
.items
)
1943 uinfo
->value
.enumerated
.item
= uinfo
->value
.enumerated
.items
- 1;
1944 strcpy(uinfo
->value
.enumerated
.name
, texts
[uinfo
->value
.enumerated
.item
]);
1948 static int snd_hdsp_get_system_clock_mode(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
1950 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
1952 ucontrol
->value
.enumerated
.item
[0] = hdsp_system_clock_mode(hdsp
);
1956 #define HDSP_CLOCK_SOURCE(xname, xindex) \
1957 { .iface = SNDRV_CTL_ELEM_IFACE_PCM, \
1960 .info = snd_hdsp_info_clock_source, \
1961 .get = snd_hdsp_get_clock_source, \
1962 .put = snd_hdsp_put_clock_source \
1965 static int hdsp_clock_source(hdsp_t
*hdsp
)
1967 if (hdsp
->control_register
& HDSP_ClockModeMaster
) {
1968 switch (hdsp
->system_sample_rate
) {
1995 static int hdsp_set_clock_source(hdsp_t
*hdsp
, int mode
)
1999 case HDSP_CLOCK_SOURCE_AUTOSYNC
:
2000 if (hdsp_external_sample_rate(hdsp
) != 0) {
2001 if (!hdsp_set_rate(hdsp
, hdsp_external_sample_rate(hdsp
), 1)) {
2002 hdsp
->control_register
&= ~HDSP_ClockModeMaster
;
2003 hdsp_write(hdsp
, HDSP_controlRegister
, hdsp
->control_register
);
2008 case HDSP_CLOCK_SOURCE_INTERNAL_32KHZ
:
2011 case HDSP_CLOCK_SOURCE_INTERNAL_44_1KHZ
:
2014 case HDSP_CLOCK_SOURCE_INTERNAL_48KHZ
:
2017 case HDSP_CLOCK_SOURCE_INTERNAL_64KHZ
:
2020 case HDSP_CLOCK_SOURCE_INTERNAL_88_2KHZ
:
2023 case HDSP_CLOCK_SOURCE_INTERNAL_96KHZ
:
2026 case HDSP_CLOCK_SOURCE_INTERNAL_128KHZ
:
2029 case HDSP_CLOCK_SOURCE_INTERNAL_176_4KHZ
:
2032 case HDSP_CLOCK_SOURCE_INTERNAL_192KHZ
:
2038 hdsp
->control_register
|= HDSP_ClockModeMaster
;
2039 hdsp_write(hdsp
, HDSP_controlRegister
, hdsp
->control_register
);
2040 hdsp_set_rate(hdsp
, rate
, 1);
2044 static int snd_hdsp_info_clock_source(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
* uinfo
)
2046 static char *texts
[] = {"AutoSync", "Internal 32.0 kHz", "Internal 44.1 kHz", "Internal 48.0 kHz", "Internal 64.0 kHz", "Internal 88.2 kHz", "Internal 96.0 kHz", "Internal 128 kHz", "Internal 176.4 kHz", "Internal 192.0 KHz" };
2047 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2049 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_ENUMERATED
;
2051 if (hdsp
->io_type
== H9632
)
2052 uinfo
->value
.enumerated
.items
= 10;
2054 uinfo
->value
.enumerated
.items
= 7;
2055 if (uinfo
->value
.enumerated
.item
>= uinfo
->value
.enumerated
.items
)
2056 uinfo
->value
.enumerated
.item
= uinfo
->value
.enumerated
.items
- 1;
2057 strcpy(uinfo
->value
.enumerated
.name
, texts
[uinfo
->value
.enumerated
.item
]);
2061 static int snd_hdsp_get_clock_source(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2063 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2065 ucontrol
->value
.enumerated
.item
[0] = hdsp_clock_source(hdsp
);
2069 static int snd_hdsp_put_clock_source(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2071 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2075 if (!snd_hdsp_use_is_exclusive(hdsp
))
2077 val
= ucontrol
->value
.enumerated
.item
[0];
2078 if (val
< 0) val
= 0;
2079 if (hdsp
->io_type
== H9632
) {
2080 if (val
> 9) val
= 9;
2082 if (val
> 6) val
= 6;
2084 spin_lock_irq(&hdsp
->lock
);
2085 if (val
!= hdsp_clock_source(hdsp
)) {
2086 change
= (hdsp_set_clock_source(hdsp
, val
) == 0) ? 1 : 0;
2090 spin_unlock_irq(&hdsp
->lock
);
2094 #define HDSP_DA_GAIN(xname, xindex) \
2095 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
2098 .info = snd_hdsp_info_da_gain, \
2099 .get = snd_hdsp_get_da_gain, \
2100 .put = snd_hdsp_put_da_gain \
2103 static int hdsp_da_gain(hdsp_t
*hdsp
)
2105 switch (hdsp
->control_register
& HDSP_DAGainMask
) {
2106 case HDSP_DAGainHighGain
:
2108 case HDSP_DAGainPlus4dBu
:
2110 case HDSP_DAGainMinus10dBV
:
2117 static int hdsp_set_da_gain(hdsp_t
*hdsp
, int mode
)
2119 hdsp
->control_register
&= ~HDSP_DAGainMask
;
2122 hdsp
->control_register
|= HDSP_DAGainHighGain
;
2125 hdsp
->control_register
|= HDSP_DAGainPlus4dBu
;
2128 hdsp
->control_register
|= HDSP_DAGainMinus10dBV
;
2134 hdsp_write(hdsp
, HDSP_controlRegister
, hdsp
->control_register
);
2138 static int snd_hdsp_info_da_gain(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
* uinfo
)
2140 static char *texts
[] = {"Hi Gain", "+4 dBu", "-10 dbV"};
2142 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_ENUMERATED
;
2144 uinfo
->value
.enumerated
.items
= 3;
2145 if (uinfo
->value
.enumerated
.item
>= uinfo
->value
.enumerated
.items
)
2146 uinfo
->value
.enumerated
.item
= uinfo
->value
.enumerated
.items
- 1;
2147 strcpy(uinfo
->value
.enumerated
.name
, texts
[uinfo
->value
.enumerated
.item
]);
2151 static int snd_hdsp_get_da_gain(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2153 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2155 ucontrol
->value
.enumerated
.item
[0] = hdsp_da_gain(hdsp
);
2159 static int snd_hdsp_put_da_gain(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2161 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2165 if (!snd_hdsp_use_is_exclusive(hdsp
))
2167 val
= ucontrol
->value
.enumerated
.item
[0];
2168 if (val
< 0) val
= 0;
2169 if (val
> 2) val
= 2;
2170 spin_lock_irq(&hdsp
->lock
);
2171 if (val
!= hdsp_da_gain(hdsp
)) {
2172 change
= (hdsp_set_da_gain(hdsp
, val
) == 0) ? 1 : 0;
2176 spin_unlock_irq(&hdsp
->lock
);
2180 #define HDSP_AD_GAIN(xname, xindex) \
2181 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
2184 .info = snd_hdsp_info_ad_gain, \
2185 .get = snd_hdsp_get_ad_gain, \
2186 .put = snd_hdsp_put_ad_gain \
2189 static int hdsp_ad_gain(hdsp_t
*hdsp
)
2191 switch (hdsp
->control_register
& HDSP_ADGainMask
) {
2192 case HDSP_ADGainMinus10dBV
:
2194 case HDSP_ADGainPlus4dBu
:
2196 case HDSP_ADGainLowGain
:
2203 static int hdsp_set_ad_gain(hdsp_t
*hdsp
, int mode
)
2205 hdsp
->control_register
&= ~HDSP_ADGainMask
;
2208 hdsp
->control_register
|= HDSP_ADGainMinus10dBV
;
2211 hdsp
->control_register
|= HDSP_ADGainPlus4dBu
;
2214 hdsp
->control_register
|= HDSP_ADGainLowGain
;
2220 hdsp_write(hdsp
, HDSP_controlRegister
, hdsp
->control_register
);
2224 static int snd_hdsp_info_ad_gain(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
* uinfo
)
2226 static char *texts
[] = {"-10 dBV", "+4 dBu", "Lo Gain"};
2228 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_ENUMERATED
;
2230 uinfo
->value
.enumerated
.items
= 3;
2231 if (uinfo
->value
.enumerated
.item
>= uinfo
->value
.enumerated
.items
)
2232 uinfo
->value
.enumerated
.item
= uinfo
->value
.enumerated
.items
- 1;
2233 strcpy(uinfo
->value
.enumerated
.name
, texts
[uinfo
->value
.enumerated
.item
]);
2237 static int snd_hdsp_get_ad_gain(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2239 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2241 ucontrol
->value
.enumerated
.item
[0] = hdsp_ad_gain(hdsp
);
2245 static int snd_hdsp_put_ad_gain(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2247 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2251 if (!snd_hdsp_use_is_exclusive(hdsp
))
2253 val
= ucontrol
->value
.enumerated
.item
[0];
2254 if (val
< 0) val
= 0;
2255 if (val
> 2) val
= 2;
2256 spin_lock_irq(&hdsp
->lock
);
2257 if (val
!= hdsp_ad_gain(hdsp
)) {
2258 change
= (hdsp_set_ad_gain(hdsp
, val
) == 0) ? 1 : 0;
2262 spin_unlock_irq(&hdsp
->lock
);
2266 #define HDSP_PHONE_GAIN(xname, xindex) \
2267 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
2270 .info = snd_hdsp_info_phone_gain, \
2271 .get = snd_hdsp_get_phone_gain, \
2272 .put = snd_hdsp_put_phone_gain \
2275 static int hdsp_phone_gain(hdsp_t
*hdsp
)
2277 switch (hdsp
->control_register
& HDSP_PhoneGainMask
) {
2278 case HDSP_PhoneGain0dB
:
2280 case HDSP_PhoneGainMinus6dB
:
2282 case HDSP_PhoneGainMinus12dB
:
2289 static int hdsp_set_phone_gain(hdsp_t
*hdsp
, int mode
)
2291 hdsp
->control_register
&= ~HDSP_PhoneGainMask
;
2294 hdsp
->control_register
|= HDSP_PhoneGain0dB
;
2297 hdsp
->control_register
|= HDSP_PhoneGainMinus6dB
;
2300 hdsp
->control_register
|= HDSP_PhoneGainMinus12dB
;
2306 hdsp_write(hdsp
, HDSP_controlRegister
, hdsp
->control_register
);
2310 static int snd_hdsp_info_phone_gain(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
* uinfo
)
2312 static char *texts
[] = {"0 dB", "-6 dB", "-12 dB"};
2314 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_ENUMERATED
;
2316 uinfo
->value
.enumerated
.items
= 3;
2317 if (uinfo
->value
.enumerated
.item
>= uinfo
->value
.enumerated
.items
)
2318 uinfo
->value
.enumerated
.item
= uinfo
->value
.enumerated
.items
- 1;
2319 strcpy(uinfo
->value
.enumerated
.name
, texts
[uinfo
->value
.enumerated
.item
]);
2323 static int snd_hdsp_get_phone_gain(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2325 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2327 ucontrol
->value
.enumerated
.item
[0] = hdsp_phone_gain(hdsp
);
2331 static int snd_hdsp_put_phone_gain(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2333 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2337 if (!snd_hdsp_use_is_exclusive(hdsp
))
2339 val
= ucontrol
->value
.enumerated
.item
[0];
2340 if (val
< 0) val
= 0;
2341 if (val
> 2) val
= 2;
2342 spin_lock_irq(&hdsp
->lock
);
2343 if (val
!= hdsp_phone_gain(hdsp
)) {
2344 change
= (hdsp_set_phone_gain(hdsp
, val
) == 0) ? 1 : 0;
2348 spin_unlock_irq(&hdsp
->lock
);
2352 #define HDSP_XLR_BREAKOUT_CABLE(xname, xindex) \
2353 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
2356 .info = snd_hdsp_info_xlr_breakout_cable, \
2357 .get = snd_hdsp_get_xlr_breakout_cable, \
2358 .put = snd_hdsp_put_xlr_breakout_cable \
2361 static int hdsp_xlr_breakout_cable(hdsp_t
*hdsp
)
2363 if (hdsp
->control_register
& HDSP_XLRBreakoutCable
) {
2369 static int hdsp_set_xlr_breakout_cable(hdsp_t
*hdsp
, int mode
)
2372 hdsp
->control_register
|= HDSP_XLRBreakoutCable
;
2374 hdsp
->control_register
&= ~HDSP_XLRBreakoutCable
;
2376 hdsp_write(hdsp
, HDSP_controlRegister
, hdsp
->control_register
);
2380 static int snd_hdsp_info_xlr_breakout_cable(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
* uinfo
)
2382 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_BOOLEAN
;
2384 uinfo
->value
.integer
.min
= 0;
2385 uinfo
->value
.integer
.max
= 1;
2389 static int snd_hdsp_get_xlr_breakout_cable(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2391 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2393 ucontrol
->value
.enumerated
.item
[0] = hdsp_xlr_breakout_cable(hdsp
);
2397 static int snd_hdsp_put_xlr_breakout_cable(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2399 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2403 if (!snd_hdsp_use_is_exclusive(hdsp
))
2405 val
= ucontrol
->value
.integer
.value
[0] & 1;
2406 spin_lock_irq(&hdsp
->lock
);
2407 change
= (int)val
!= hdsp_xlr_breakout_cable(hdsp
);
2408 hdsp_set_xlr_breakout_cable(hdsp
, val
);
2409 spin_unlock_irq(&hdsp
->lock
);
2413 /* (De)activates old RME Analog Extension Board
2414 These are connected to the internal ADAT connector
2415 Switching this on desactivates external ADAT
2417 #define HDSP_AEB(xname, xindex) \
2418 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
2421 .info = snd_hdsp_info_aeb, \
2422 .get = snd_hdsp_get_aeb, \
2423 .put = snd_hdsp_put_aeb \
2426 static int hdsp_aeb(hdsp_t
*hdsp
)
2428 if (hdsp
->control_register
& HDSP_AnalogExtensionBoard
) {
2434 static int hdsp_set_aeb(hdsp_t
*hdsp
, int mode
)
2437 hdsp
->control_register
|= HDSP_AnalogExtensionBoard
;
2439 hdsp
->control_register
&= ~HDSP_AnalogExtensionBoard
;
2441 hdsp_write(hdsp
, HDSP_controlRegister
, hdsp
->control_register
);
2445 static int snd_hdsp_info_aeb(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
* uinfo
)
2447 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_BOOLEAN
;
2449 uinfo
->value
.integer
.min
= 0;
2450 uinfo
->value
.integer
.max
= 1;
2454 static int snd_hdsp_get_aeb(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2456 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2458 ucontrol
->value
.enumerated
.item
[0] = hdsp_aeb(hdsp
);
2462 static int snd_hdsp_put_aeb(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2464 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2468 if (!snd_hdsp_use_is_exclusive(hdsp
))
2470 val
= ucontrol
->value
.integer
.value
[0] & 1;
2471 spin_lock_irq(&hdsp
->lock
);
2472 change
= (int)val
!= hdsp_aeb(hdsp
);
2473 hdsp_set_aeb(hdsp
, val
);
2474 spin_unlock_irq(&hdsp
->lock
);
2478 #define HDSP_PREF_SYNC_REF(xname, xindex) \
2479 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
2482 .info = snd_hdsp_info_pref_sync_ref, \
2483 .get = snd_hdsp_get_pref_sync_ref, \
2484 .put = snd_hdsp_put_pref_sync_ref \
2487 static int hdsp_pref_sync_ref(hdsp_t
*hdsp
)
2489 /* Notice that this looks at the requested sync source,
2490 not the one actually in use.
2493 switch (hdsp
->control_register
& HDSP_SyncRefMask
) {
2494 case HDSP_SyncRef_ADAT1
:
2495 return HDSP_SYNC_FROM_ADAT1
;
2496 case HDSP_SyncRef_ADAT2
:
2497 return HDSP_SYNC_FROM_ADAT2
;
2498 case HDSP_SyncRef_ADAT3
:
2499 return HDSP_SYNC_FROM_ADAT3
;
2500 case HDSP_SyncRef_SPDIF
:
2501 return HDSP_SYNC_FROM_SPDIF
;
2502 case HDSP_SyncRef_WORD
:
2503 return HDSP_SYNC_FROM_WORD
;
2504 case HDSP_SyncRef_ADAT_SYNC
:
2505 return HDSP_SYNC_FROM_ADAT_SYNC
;
2507 return HDSP_SYNC_FROM_WORD
;
2512 static int hdsp_set_pref_sync_ref(hdsp_t
*hdsp
, int pref
)
2514 hdsp
->control_register
&= ~HDSP_SyncRefMask
;
2516 case HDSP_SYNC_FROM_ADAT1
:
2517 hdsp
->control_register
&= ~HDSP_SyncRefMask
; /* clear SyncRef bits */
2519 case HDSP_SYNC_FROM_ADAT2
:
2520 hdsp
->control_register
|= HDSP_SyncRef_ADAT2
;
2522 case HDSP_SYNC_FROM_ADAT3
:
2523 hdsp
->control_register
|= HDSP_SyncRef_ADAT3
;
2525 case HDSP_SYNC_FROM_SPDIF
:
2526 hdsp
->control_register
|= HDSP_SyncRef_SPDIF
;
2528 case HDSP_SYNC_FROM_WORD
:
2529 hdsp
->control_register
|= HDSP_SyncRef_WORD
;
2531 case HDSP_SYNC_FROM_ADAT_SYNC
:
2532 hdsp
->control_register
|= HDSP_SyncRef_ADAT_SYNC
;
2537 hdsp_write(hdsp
, HDSP_controlRegister
, hdsp
->control_register
);
2541 static int snd_hdsp_info_pref_sync_ref(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
* uinfo
)
2543 static char *texts
[] = {"Word", "IEC958", "ADAT1", "ADAT Sync", "ADAT2", "ADAT3" };
2544 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2546 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_ENUMERATED
;
2549 switch (hdsp
->io_type
) {
2552 uinfo
->value
.enumerated
.items
= 6;
2555 uinfo
->value
.enumerated
.items
= 4;
2558 uinfo
->value
.enumerated
.items
= 3;
2561 uinfo
->value
.enumerated
.items
= 0;
2565 if (uinfo
->value
.enumerated
.item
>= uinfo
->value
.enumerated
.items
)
2566 uinfo
->value
.enumerated
.item
= uinfo
->value
.enumerated
.items
- 1;
2567 strcpy(uinfo
->value
.enumerated
.name
, texts
[uinfo
->value
.enumerated
.item
]);
2571 static int snd_hdsp_get_pref_sync_ref(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2573 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2575 ucontrol
->value
.enumerated
.item
[0] = hdsp_pref_sync_ref(hdsp
);
2579 static int snd_hdsp_put_pref_sync_ref(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2581 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2585 if (!snd_hdsp_use_is_exclusive(hdsp
))
2588 switch (hdsp
->io_type
) {
2603 val
= ucontrol
->value
.enumerated
.item
[0] % max
;
2604 spin_lock_irq(&hdsp
->lock
);
2605 change
= (int)val
!= hdsp_pref_sync_ref(hdsp
);
2606 hdsp_set_pref_sync_ref(hdsp
, val
);
2607 spin_unlock_irq(&hdsp
->lock
);
2611 #define HDSP_AUTOSYNC_REF(xname, xindex) \
2612 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
2615 .access = SNDRV_CTL_ELEM_ACCESS_READ, \
2616 .info = snd_hdsp_info_autosync_ref, \
2617 .get = snd_hdsp_get_autosync_ref, \
2620 static int hdsp_autosync_ref(hdsp_t
*hdsp
)
2622 /* This looks at the autosync selected sync reference */
2623 unsigned int status2
= hdsp_read(hdsp
, HDSP_status2Register
);
2625 switch (status2
& HDSP_SelSyncRefMask
) {
2626 case HDSP_SelSyncRef_WORD
:
2627 return HDSP_AUTOSYNC_FROM_WORD
;
2628 case HDSP_SelSyncRef_ADAT_SYNC
:
2629 return HDSP_AUTOSYNC_FROM_ADAT_SYNC
;
2630 case HDSP_SelSyncRef_SPDIF
:
2631 return HDSP_AUTOSYNC_FROM_SPDIF
;
2632 case HDSP_SelSyncRefMask
:
2633 return HDSP_AUTOSYNC_FROM_NONE
;
2634 case HDSP_SelSyncRef_ADAT1
:
2635 return HDSP_AUTOSYNC_FROM_ADAT1
;
2636 case HDSP_SelSyncRef_ADAT2
:
2637 return HDSP_AUTOSYNC_FROM_ADAT2
;
2638 case HDSP_SelSyncRef_ADAT3
:
2639 return HDSP_AUTOSYNC_FROM_ADAT3
;
2641 return HDSP_AUTOSYNC_FROM_WORD
;
2646 static int snd_hdsp_info_autosync_ref(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
* uinfo
)
2648 static char *texts
[] = {"Word", "ADAT Sync", "IEC958", "None", "ADAT1", "ADAT2", "ADAT3" };
2650 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_ENUMERATED
;
2652 uinfo
->value
.enumerated
.items
= 7;
2653 if (uinfo
->value
.enumerated
.item
>= uinfo
->value
.enumerated
.items
)
2654 uinfo
->value
.enumerated
.item
= uinfo
->value
.enumerated
.items
- 1;
2655 strcpy(uinfo
->value
.enumerated
.name
, texts
[uinfo
->value
.enumerated
.item
]);
2659 static int snd_hdsp_get_autosync_ref(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2661 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2663 ucontrol
->value
.enumerated
.item
[0] = hdsp_autosync_ref(hdsp
);
2667 #define HDSP_LINE_OUT(xname, xindex) \
2668 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
2671 .info = snd_hdsp_info_line_out, \
2672 .get = snd_hdsp_get_line_out, \
2673 .put = snd_hdsp_put_line_out \
2676 static int hdsp_line_out(hdsp_t
*hdsp
)
2678 return (hdsp
->control_register
& HDSP_LineOut
) ? 1 : 0;
2681 static int hdsp_set_line_output(hdsp_t
*hdsp
, int out
)
2684 hdsp
->control_register
|= HDSP_LineOut
;
2686 hdsp
->control_register
&= ~HDSP_LineOut
;
2688 hdsp_write(hdsp
, HDSP_controlRegister
, hdsp
->control_register
);
2692 static int snd_hdsp_info_line_out(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
* uinfo
)
2694 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_BOOLEAN
;
2696 uinfo
->value
.integer
.min
= 0;
2697 uinfo
->value
.integer
.max
= 1;
2701 static int snd_hdsp_get_line_out(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2703 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2705 spin_lock_irq(&hdsp
->lock
);
2706 ucontrol
->value
.integer
.value
[0] = hdsp_line_out(hdsp
);
2707 spin_unlock_irq(&hdsp
->lock
);
2711 static int snd_hdsp_put_line_out(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2713 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2717 if (!snd_hdsp_use_is_exclusive(hdsp
))
2719 val
= ucontrol
->value
.integer
.value
[0] & 1;
2720 spin_lock_irq(&hdsp
->lock
);
2721 change
= (int)val
!= hdsp_line_out(hdsp
);
2722 hdsp_set_line_output(hdsp
, val
);
2723 spin_unlock_irq(&hdsp
->lock
);
2727 #define HDSP_PRECISE_POINTER(xname, xindex) \
2728 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
2731 .info = snd_hdsp_info_precise_pointer, \
2732 .get = snd_hdsp_get_precise_pointer, \
2733 .put = snd_hdsp_put_precise_pointer \
2736 static int hdsp_set_precise_pointer(hdsp_t
*hdsp
, int precise
)
2739 hdsp
->precise_ptr
= 1;
2741 hdsp
->precise_ptr
= 0;
2746 static int snd_hdsp_info_precise_pointer(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
* uinfo
)
2748 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_BOOLEAN
;
2750 uinfo
->value
.integer
.min
= 0;
2751 uinfo
->value
.integer
.max
= 1;
2755 static int snd_hdsp_get_precise_pointer(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2757 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2759 spin_lock_irq(&hdsp
->lock
);
2760 ucontrol
->value
.integer
.value
[0] = hdsp
->precise_ptr
;
2761 spin_unlock_irq(&hdsp
->lock
);
2765 static int snd_hdsp_put_precise_pointer(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2767 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2771 if (!snd_hdsp_use_is_exclusive(hdsp
))
2773 val
= ucontrol
->value
.integer
.value
[0] & 1;
2774 spin_lock_irq(&hdsp
->lock
);
2775 change
= (int)val
!= hdsp
->precise_ptr
;
2776 hdsp_set_precise_pointer(hdsp
, val
);
2777 spin_unlock_irq(&hdsp
->lock
);
2781 #define HDSP_USE_MIDI_TASKLET(xname, xindex) \
2782 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
2785 .info = snd_hdsp_info_use_midi_tasklet, \
2786 .get = snd_hdsp_get_use_midi_tasklet, \
2787 .put = snd_hdsp_put_use_midi_tasklet \
2790 static int hdsp_set_use_midi_tasklet(hdsp_t
*hdsp
, int use_tasklet
)
2793 hdsp
->use_midi_tasklet
= 1;
2795 hdsp
->use_midi_tasklet
= 0;
2800 static int snd_hdsp_info_use_midi_tasklet(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
* uinfo
)
2802 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_BOOLEAN
;
2804 uinfo
->value
.integer
.min
= 0;
2805 uinfo
->value
.integer
.max
= 1;
2809 static int snd_hdsp_get_use_midi_tasklet(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2811 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2813 spin_lock_irq(&hdsp
->lock
);
2814 ucontrol
->value
.integer
.value
[0] = hdsp
->use_midi_tasklet
;
2815 spin_unlock_irq(&hdsp
->lock
);
2819 static int snd_hdsp_put_use_midi_tasklet(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2821 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2825 if (!snd_hdsp_use_is_exclusive(hdsp
))
2827 val
= ucontrol
->value
.integer
.value
[0] & 1;
2828 spin_lock_irq(&hdsp
->lock
);
2829 change
= (int)val
!= hdsp
->use_midi_tasklet
;
2830 hdsp_set_use_midi_tasklet(hdsp
, val
);
2831 spin_unlock_irq(&hdsp
->lock
);
2835 #define HDSP_MIXER(xname, xindex) \
2836 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
2839 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
2840 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2841 .info = snd_hdsp_info_mixer, \
2842 .get = snd_hdsp_get_mixer, \
2843 .put = snd_hdsp_put_mixer \
2846 static int snd_hdsp_info_mixer(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
* uinfo
)
2848 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_INTEGER
;
2850 uinfo
->value
.integer
.min
= 0;
2851 uinfo
->value
.integer
.max
= 65536;
2852 uinfo
->value
.integer
.step
= 1;
2856 static int snd_hdsp_get_mixer(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2858 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2863 source
= ucontrol
->value
.integer
.value
[0];
2864 destination
= ucontrol
->value
.integer
.value
[1];
2866 if (source
>= hdsp
->max_channels
) {
2867 addr
= hdsp_playback_to_output_key(hdsp
,source
-hdsp
->max_channels
,destination
);
2869 addr
= hdsp_input_to_output_key(hdsp
,source
, destination
);
2872 spin_lock_irq(&hdsp
->lock
);
2873 ucontrol
->value
.integer
.value
[2] = hdsp_read_gain (hdsp
, addr
);
2874 spin_unlock_irq(&hdsp
->lock
);
2878 static int snd_hdsp_put_mixer(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2880 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2887 if (!snd_hdsp_use_is_exclusive(hdsp
))
2890 source
= ucontrol
->value
.integer
.value
[0];
2891 destination
= ucontrol
->value
.integer
.value
[1];
2893 if (source
>= hdsp
->max_channels
) {
2894 addr
= hdsp_playback_to_output_key(hdsp
,source
-hdsp
->max_channels
, destination
);
2896 addr
= hdsp_input_to_output_key(hdsp
,source
, destination
);
2899 gain
= ucontrol
->value
.integer
.value
[2];
2901 spin_lock_irq(&hdsp
->lock
);
2902 change
= gain
!= hdsp_read_gain(hdsp
, addr
);
2904 hdsp_write_gain(hdsp
, addr
, gain
);
2905 spin_unlock_irq(&hdsp
->lock
);
2909 #define HDSP_WC_SYNC_CHECK(xname, xindex) \
2910 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
2913 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2914 .info = snd_hdsp_info_sync_check, \
2915 .get = snd_hdsp_get_wc_sync_check \
2918 static int snd_hdsp_info_sync_check(snd_kcontrol_t
*kcontrol
, snd_ctl_elem_info_t
* uinfo
)
2920 static char *texts
[] = {"No Lock", "Lock", "Sync" };
2921 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_ENUMERATED
;
2923 uinfo
->value
.enumerated
.items
= 3;
2924 if (uinfo
->value
.enumerated
.item
>= uinfo
->value
.enumerated
.items
)
2925 uinfo
->value
.enumerated
.item
= uinfo
->value
.enumerated
.items
- 1;
2926 strcpy(uinfo
->value
.enumerated
.name
, texts
[uinfo
->value
.enumerated
.item
]);
2930 static int hdsp_wc_sync_check(hdsp_t
*hdsp
)
2932 int status2
= hdsp_read(hdsp
, HDSP_status2Register
);
2933 if (status2
& HDSP_wc_lock
) {
2934 if (status2
& HDSP_wc_sync
) {
2945 static int snd_hdsp_get_wc_sync_check(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2947 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2949 ucontrol
->value
.enumerated
.item
[0] = hdsp_wc_sync_check(hdsp
);
2953 #define HDSP_SPDIF_SYNC_CHECK(xname, xindex) \
2954 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
2957 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2958 .info = snd_hdsp_info_sync_check, \
2959 .get = snd_hdsp_get_spdif_sync_check \
2962 static int hdsp_spdif_sync_check(hdsp_t
*hdsp
)
2964 int status
= hdsp_read(hdsp
, HDSP_statusRegister
);
2965 if (status
& HDSP_SPDIFErrorFlag
) {
2968 if (status
& HDSP_SPDIFSync
) {
2977 static int snd_hdsp_get_spdif_sync_check(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
2979 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
2981 ucontrol
->value
.enumerated
.item
[0] = hdsp_spdif_sync_check(hdsp
);
2985 #define HDSP_ADATSYNC_SYNC_CHECK(xname, xindex) \
2986 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
2989 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2990 .info = snd_hdsp_info_sync_check, \
2991 .get = snd_hdsp_get_adatsync_sync_check \
2994 static int hdsp_adatsync_sync_check(hdsp_t
*hdsp
)
2996 int status
= hdsp_read(hdsp
, HDSP_statusRegister
);
2997 if (status
& HDSP_TimecodeLock
) {
2998 if (status
& HDSP_TimecodeSync
) {
3008 static int snd_hdsp_get_adatsync_sync_check(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
3010 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
3012 ucontrol
->value
.enumerated
.item
[0] = hdsp_adatsync_sync_check(hdsp
);
3016 #define HDSP_ADAT_SYNC_CHECK \
3017 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
3018 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3019 .info = snd_hdsp_info_sync_check, \
3020 .get = snd_hdsp_get_adat_sync_check \
3023 static int hdsp_adat_sync_check(hdsp_t
*hdsp
, int idx
)
3025 int status
= hdsp_read(hdsp
, HDSP_statusRegister
);
3027 if (status
& (HDSP_Lock0
>>idx
)) {
3028 if (status
& (HDSP_Sync0
>>idx
)) {
3038 static int snd_hdsp_get_adat_sync_check(snd_kcontrol_t
* kcontrol
, snd_ctl_elem_value_t
* ucontrol
)
3041 hdsp_t
*hdsp
= snd_kcontrol_chip(kcontrol
);
3043 offset
= ucontrol
->id
.index
- 1;
3044 snd_assert(offset
>= 0);
3046 switch (hdsp
->io_type
) {
3061 ucontrol
->value
.enumerated
.item
[0] = hdsp_adat_sync_check(hdsp
, offset
);
3065 static snd_kcontrol_new_t snd_hdsp_9632_controls
[] = {
3066 HDSP_DA_GAIN("DA Gain", 0),
3067 HDSP_AD_GAIN("AD Gain", 0),
3068 HDSP_PHONE_GAIN("Phones Gain", 0),
3069 HDSP_XLR_BREAKOUT_CABLE("XLR Breakout Cable", 0)
3072 static snd_kcontrol_new_t snd_hdsp_controls
[] = {
3074 .iface
= SNDRV_CTL_ELEM_IFACE_PCM
,
3075 .name
= SNDRV_CTL_NAME_IEC958("",PLAYBACK
,DEFAULT
),
3076 .info
= snd_hdsp_control_spdif_info
,
3077 .get
= snd_hdsp_control_spdif_get
,
3078 .put
= snd_hdsp_control_spdif_put
,
3081 .access
= SNDRV_CTL_ELEM_ACCESS_READWRITE
| SNDRV_CTL_ELEM_ACCESS_INACTIVE
,
3082 .iface
= SNDRV_CTL_ELEM_IFACE_PCM
,
3083 .name
= SNDRV_CTL_NAME_IEC958("",PLAYBACK
,PCM_STREAM
),
3084 .info
= snd_hdsp_control_spdif_stream_info
,
3085 .get
= snd_hdsp_control_spdif_stream_get
,
3086 .put
= snd_hdsp_control_spdif_stream_put
,
3089 .access
= SNDRV_CTL_ELEM_ACCESS_READ
,
3090 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
3091 .name
= SNDRV_CTL_NAME_IEC958("",PLAYBACK
,CON_MASK
),
3092 .info
= snd_hdsp_control_spdif_mask_info
,
3093 .get
= snd_hdsp_control_spdif_mask_get
,
3094 .private_value
= IEC958_AES0_NONAUDIO
|
3095 IEC958_AES0_PROFESSIONAL
|
3096 IEC958_AES0_CON_EMPHASIS
,
3099 .access
= SNDRV_CTL_ELEM_ACCESS_READ
,
3100 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
3101 .name
= SNDRV_CTL_NAME_IEC958("",PLAYBACK
,PRO_MASK
),
3102 .info
= snd_hdsp_control_spdif_mask_info
,
3103 .get
= snd_hdsp_control_spdif_mask_get
,
3104 .private_value
= IEC958_AES0_NONAUDIO
|
3105 IEC958_AES0_PROFESSIONAL
|
3106 IEC958_AES0_PRO_EMPHASIS
,
3108 HDSP_MIXER("Mixer", 0),
3109 HDSP_SPDIF_IN("IEC958 Input Connector", 0),
3110 HDSP_SPDIF_OUT("IEC958 Output also on ADAT1", 0),
3111 HDSP_SPDIF_PROFESSIONAL("IEC958 Professional Bit", 0),
3112 HDSP_SPDIF_EMPHASIS("IEC958 Emphasis Bit", 0),
3113 HDSP_SPDIF_NON_AUDIO("IEC958 Non-audio Bit", 0),
3114 /* 'Sample Clock Source' complies with the alsa control naming scheme */
3115 HDSP_CLOCK_SOURCE("Sample Clock Source", 0),
3116 HDSP_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
3117 HDSP_PREF_SYNC_REF("Preferred Sync Reference", 0),
3118 HDSP_AUTOSYNC_REF("AutoSync Reference", 0),
3119 HDSP_SPDIF_SAMPLE_RATE("SPDIF Sample Rate", 0),
3120 HDSP_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
3121 /* 'External Rate' complies with the alsa control naming scheme */
3122 HDSP_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
3123 HDSP_WC_SYNC_CHECK("Word Clock Lock Status", 0),
3124 HDSP_SPDIF_SYNC_CHECK("SPDIF Lock Status", 0),
3125 HDSP_ADATSYNC_SYNC_CHECK("ADAT Sync Lock Status", 0),
3126 HDSP_LINE_OUT("Line Out", 0),
3127 HDSP_PRECISE_POINTER("Precise Pointer", 0),
3128 HDSP_USE_MIDI_TASKLET("Use Midi Tasklet", 0),
3131 static snd_kcontrol_new_t snd_hdsp_96xx_aeb
= HDSP_AEB("Analog Extension Board", 0);
3132 static snd_kcontrol_new_t snd_hdsp_adat_sync_check
= HDSP_ADAT_SYNC_CHECK
;
3134 static int snd_hdsp_create_controls(snd_card_t
*card
, hdsp_t
*hdsp
)
3138 snd_kcontrol_t
*kctl
;
3140 for (idx
= 0; idx
< ARRAY_SIZE(snd_hdsp_controls
); idx
++) {
3141 if ((err
= snd_ctl_add(card
, kctl
= snd_ctl_new1(&snd_hdsp_controls
[idx
], hdsp
))) < 0) {
3144 if (idx
== 1) /* IEC958 (S/PDIF) Stream */
3145 hdsp
->spdif_ctl
= kctl
;
3148 /* ADAT SyncCheck status */
3149 snd_hdsp_adat_sync_check
.name
= "ADAT Lock Status";
3150 snd_hdsp_adat_sync_check
.index
= 1;
3151 if ((err
= snd_ctl_add (card
, kctl
= snd_ctl_new1(&snd_hdsp_adat_sync_check
, hdsp
)))) {
3154 if (hdsp
->io_type
== Digiface
|| hdsp
->io_type
== H9652
) {
3155 for (idx
= 1; idx
< 3; ++idx
) {
3156 snd_hdsp_adat_sync_check
.index
= idx
+1;
3157 if ((err
= snd_ctl_add (card
, kctl
= snd_ctl_new1(&snd_hdsp_adat_sync_check
, hdsp
)))) {
3163 /* DA, AD and Phone gain and XLR breakout cable controls for H9632 cards */
3164 if (hdsp
->io_type
== H9632
) {
3165 for (idx
= 0; idx
< ARRAY_SIZE(snd_hdsp_9632_controls
); idx
++) {
3166 if ((err
= snd_ctl_add(card
, kctl
= snd_ctl_new1(&snd_hdsp_9632_controls
[idx
], hdsp
))) < 0) {
3172 /* AEB control for H96xx card */
3173 if (hdsp
->io_type
== H9632
|| hdsp
->io_type
== H9652
) {
3174 if ((err
= snd_ctl_add(card
, kctl
= snd_ctl_new1(&snd_hdsp_96xx_aeb
, hdsp
))) < 0) {
3182 /*------------------------------------------------------------
3184 ------------------------------------------------------------*/
3187 snd_hdsp_proc_read(snd_info_entry_t
*entry
, snd_info_buffer_t
*buffer
)
3189 hdsp_t
*hdsp
= (hdsp_t
*) entry
->private_data
;
3190 unsigned int status
;
3191 unsigned int status2
;
3192 char *pref_sync_ref
;
3194 char *system_clock_mode
;
3198 if (hdsp_check_for_iobox (hdsp
)) {
3199 snd_iprintf(buffer
, "No I/O box connected.\nPlease connect one and upload firmware.\n");
3203 if (hdsp_check_for_firmware(hdsp
)) {
3204 if (hdsp
->state
& HDSP_FirmwareCached
) {
3205 if (snd_hdsp_load_firmware_from_cache(hdsp
) != 0) {
3206 snd_iprintf(buffer
, "Firmware loading from cache failed, please upload manually.\n");
3210 snd_iprintf(buffer
, "No firmware loaded nor cached, please upload firmware.\n");
3215 status
= hdsp_read(hdsp
, HDSP_statusRegister
);
3216 status2
= hdsp_read(hdsp
, HDSP_status2Register
);
3218 snd_iprintf(buffer
, "%s (Card #%d)\n", hdsp
->card_name
, hdsp
->card
->number
+ 1);
3219 snd_iprintf(buffer
, "Buffers: capture %p playback %p\n",
3220 hdsp
->capture_buffer
, hdsp
->playback_buffer
);
3221 snd_iprintf(buffer
, "IRQ: %d Registers bus: 0x%lx VM: 0x%lx\n",
3222 hdsp
->irq
, hdsp
->port
, (unsigned long)hdsp
->iobase
);
3223 snd_iprintf(buffer
, "Control register: 0x%x\n", hdsp
->control_register
);
3224 snd_iprintf(buffer
, "Control2 register: 0x%x\n", hdsp
->control2_register
);
3225 snd_iprintf(buffer
, "Status register: 0x%x\n", status
);
3226 snd_iprintf(buffer
, "Status2 register: 0x%x\n", status2
);
3227 snd_iprintf(buffer
, "FIFO status: %d\n", hdsp_read(hdsp
, HDSP_fifoStatus
) & 0xff);
3228 snd_iprintf(buffer
, "MIDI1 Output status: 0x%x\n", hdsp_read(hdsp
, HDSP_midiStatusOut0
));
3229 snd_iprintf(buffer
, "MIDI1 Input status: 0x%x\n", hdsp_read(hdsp
, HDSP_midiStatusIn0
));
3230 snd_iprintf(buffer
, "MIDI2 Output status: 0x%x\n", hdsp_read(hdsp
, HDSP_midiStatusOut1
));
3231 snd_iprintf(buffer
, "MIDI2 Input status: 0x%x\n", hdsp_read(hdsp
, HDSP_midiStatusIn1
));
3232 snd_iprintf(buffer
, "Use Midi Tasklet: %s\n", hdsp
->use_midi_tasklet
? "on" : "off");
3234 snd_iprintf(buffer
, "\n");
3236 x
= 1 << (6 + hdsp_decode_latency(hdsp
->control_register
& HDSP_LatencyMask
));
3238 snd_iprintf(buffer
, "Buffer Size (Latency): %d samples (2 periods of %lu bytes)\n", x
, (unsigned long) hdsp
->period_bytes
);
3239 snd_iprintf(buffer
, "Hardware pointer (frames): %ld\n", hdsp_hw_pointer(hdsp
));
3240 snd_iprintf(buffer
, "Precise pointer: %s\n", hdsp
->precise_ptr
? "on" : "off");
3241 snd_iprintf(buffer
, "Line out: %s\n", (hdsp
->control_register
& HDSP_LineOut
) ? "on" : "off");
3243 snd_iprintf(buffer
, "Firmware version: %d\n", (status2
&HDSP_version0
)|(status2
&HDSP_version1
)<<1|(status2
&HDSP_version2
)<<2);
3245 snd_iprintf(buffer
, "\n");
3248 switch (hdsp_clock_source(hdsp
)) {
3249 case HDSP_CLOCK_SOURCE_AUTOSYNC
:
3250 clock_source
= "AutoSync";
3252 case HDSP_CLOCK_SOURCE_INTERNAL_32KHZ
:
3253 clock_source
= "Internal 32 kHz";
3255 case HDSP_CLOCK_SOURCE_INTERNAL_44_1KHZ
:
3256 clock_source
= "Internal 44.1 kHz";
3258 case HDSP_CLOCK_SOURCE_INTERNAL_48KHZ
:
3259 clock_source
= "Internal 48 kHz";
3261 case HDSP_CLOCK_SOURCE_INTERNAL_64KHZ
:
3262 clock_source
= "Internal 64 kHz";
3264 case HDSP_CLOCK_SOURCE_INTERNAL_88_2KHZ
:
3265 clock_source
= "Internal 88.2 kHz";
3267 case HDSP_CLOCK_SOURCE_INTERNAL_96KHZ
:
3268 clock_source
= "Internal 96 kHz";
3270 case HDSP_CLOCK_SOURCE_INTERNAL_128KHZ
:
3271 clock_source
= "Internal 128 kHz";
3273 case HDSP_CLOCK_SOURCE_INTERNAL_176_4KHZ
:
3274 clock_source
= "Internal 176.4 kHz";
3276 case HDSP_CLOCK_SOURCE_INTERNAL_192KHZ
:
3277 clock_source
= "Internal 192 kHz";
3280 clock_source
= "Error";
3282 snd_iprintf (buffer
, "Sample Clock Source: %s\n", clock_source
);
3284 if (hdsp_system_clock_mode(hdsp
)) {
3285 system_clock_mode
= "Slave";
3287 system_clock_mode
= "Master";
3290 switch (hdsp_pref_sync_ref (hdsp
)) {
3291 case HDSP_SYNC_FROM_WORD
:
3292 pref_sync_ref
= "Word Clock";
3294 case HDSP_SYNC_FROM_ADAT_SYNC
:
3295 pref_sync_ref
= "ADAT Sync";
3297 case HDSP_SYNC_FROM_SPDIF
:
3298 pref_sync_ref
= "SPDIF";
3300 case HDSP_SYNC_FROM_ADAT1
:
3301 pref_sync_ref
= "ADAT1";
3303 case HDSP_SYNC_FROM_ADAT2
:
3304 pref_sync_ref
= "ADAT2";
3306 case HDSP_SYNC_FROM_ADAT3
:
3307 pref_sync_ref
= "ADAT3";
3310 pref_sync_ref
= "Word Clock";
3313 snd_iprintf (buffer
, "Preferred Sync Reference: %s\n", pref_sync_ref
);
3315 switch (hdsp_autosync_ref (hdsp
)) {
3316 case HDSP_AUTOSYNC_FROM_WORD
:
3317 autosync_ref
= "Word Clock";
3319 case HDSP_AUTOSYNC_FROM_ADAT_SYNC
:
3320 autosync_ref
= "ADAT Sync";
3322 case HDSP_AUTOSYNC_FROM_SPDIF
:
3323 autosync_ref
= "SPDIF";
3325 case HDSP_AUTOSYNC_FROM_NONE
:
3326 autosync_ref
= "None";
3328 case HDSP_AUTOSYNC_FROM_ADAT1
:
3329 autosync_ref
= "ADAT1";
3331 case HDSP_AUTOSYNC_FROM_ADAT2
:
3332 autosync_ref
= "ADAT2";
3334 case HDSP_AUTOSYNC_FROM_ADAT3
:
3335 autosync_ref
= "ADAT3";
3338 autosync_ref
= "---";
3341 snd_iprintf (buffer
, "AutoSync Reference: %s\n", autosync_ref
);
3343 snd_iprintf (buffer
, "AutoSync Frequency: %d\n", hdsp_external_sample_rate(hdsp
));
3345 snd_iprintf (buffer
, "System Clock Mode: %s\n", system_clock_mode
);
3347 snd_iprintf (buffer
, "System Clock Frequency: %d\n", hdsp
->system_sample_rate
);
3349 snd_iprintf(buffer
, "\n");
3351 switch (hdsp_spdif_in(hdsp
)) {
3352 case HDSP_SPDIFIN_OPTICAL
:
3353 snd_iprintf(buffer
, "IEC958 input: Optical\n");
3355 case HDSP_SPDIFIN_COAXIAL
:
3356 snd_iprintf(buffer
, "IEC958 input: Coaxial\n");
3358 case HDSP_SPDIFIN_INTERNAL
:
3359 snd_iprintf(buffer
, "IEC958 input: Internal\n");
3361 case HDSP_SPDIFIN_AES
:
3362 snd_iprintf(buffer
, "IEC958 input: AES\n");
3365 snd_iprintf(buffer
, "IEC958 input: ???\n");
3369 if (hdsp
->control_register
& HDSP_SPDIFOpticalOut
) {
3370 snd_iprintf(buffer
, "IEC958 output: Coaxial & ADAT1\n");
3372 snd_iprintf(buffer
, "IEC958 output: Coaxial only\n");
3375 if (hdsp
->control_register
& HDSP_SPDIFProfessional
) {
3376 snd_iprintf(buffer
, "IEC958 quality: Professional\n");
3378 snd_iprintf(buffer
, "IEC958 quality: Consumer\n");
3381 if (hdsp
->control_register
& HDSP_SPDIFEmphasis
) {
3382 snd_iprintf(buffer
, "IEC958 emphasis: on\n");
3384 snd_iprintf(buffer
, "IEC958 emphasis: off\n");
3387 if (hdsp
->control_register
& HDSP_SPDIFNonAudio
) {
3388 snd_iprintf(buffer
, "IEC958 NonAudio: on\n");
3390 snd_iprintf(buffer
, "IEC958 NonAudio: off\n");
3392 if ((x
= hdsp_spdif_sample_rate (hdsp
)) != 0) {
3393 snd_iprintf (buffer
, "IEC958 sample rate: %d\n", x
);
3395 snd_iprintf (buffer
, "IEC958 sample rate: Error flag set\n");
3398 snd_iprintf(buffer
, "\n");
3401 x
= status
& HDSP_Sync0
;
3402 if (status
& HDSP_Lock0
) {
3403 snd_iprintf(buffer
, "ADAT1: %s\n", x
? "Sync" : "Lock");
3405 snd_iprintf(buffer
, "ADAT1: No Lock\n");
3408 switch (hdsp
->io_type
) {
3411 x
= status
& HDSP_Sync1
;
3412 if (status
& HDSP_Lock1
) {
3413 snd_iprintf(buffer
, "ADAT2: %s\n", x
? "Sync" : "Lock");
3415 snd_iprintf(buffer
, "ADAT2: No Lock\n");
3417 x
= status
& HDSP_Sync2
;
3418 if (status
& HDSP_Lock2
) {
3419 snd_iprintf(buffer
, "ADAT3: %s\n", x
? "Sync" : "Lock");
3421 snd_iprintf(buffer
, "ADAT3: No Lock\n");
3428 x
= status
& HDSP_SPDIFSync
;
3429 if (status
& HDSP_SPDIFErrorFlag
) {
3430 snd_iprintf (buffer
, "SPDIF: No Lock\n");
3432 snd_iprintf (buffer
, "SPDIF: %s\n", x
? "Sync" : "Lock");
3435 x
= status2
& HDSP_wc_sync
;
3436 if (status2
& HDSP_wc_lock
) {
3437 snd_iprintf (buffer
, "Word Clock: %s\n", x
? "Sync" : "Lock");
3439 snd_iprintf (buffer
, "Word Clock: No Lock\n");
3442 x
= status
& HDSP_TimecodeSync
;
3443 if (status
& HDSP_TimecodeLock
) {
3444 snd_iprintf(buffer
, "ADAT Sync: %s\n", x
? "Sync" : "Lock");
3446 snd_iprintf(buffer
, "ADAT Sync: No Lock\n");
3449 snd_iprintf(buffer
, "\n");
3451 /* Informations about H9632 specific controls */
3452 if (hdsp
->io_type
== H9632
) {
3455 switch (hdsp_ad_gain(hdsp
)) {
3466 snd_iprintf(buffer
, "AD Gain : %s\n", tmp
);
3468 switch (hdsp_da_gain(hdsp
)) {
3479 snd_iprintf(buffer
, "DA Gain : %s\n", tmp
);
3481 switch (hdsp_phone_gain(hdsp
)) {
3492 snd_iprintf(buffer
, "Phones Gain : %s\n", tmp
);
3494 snd_iprintf(buffer
, "XLR Breakout Cable : %s\n", hdsp_xlr_breakout_cable(hdsp
) ? "yes" : "no");
3496 if (hdsp
->control_register
& HDSP_AnalogExtensionBoard
) {
3497 snd_iprintf(buffer
, "AEB : on (ADAT1 internal)\n");
3499 snd_iprintf(buffer
, "AEB : off (ADAT1 external)\n");
3501 snd_iprintf(buffer
, "\n");
3506 static void __devinit
snd_hdsp_proc_init(hdsp_t
*hdsp
)
3508 snd_info_entry_t
*entry
;
3510 if (! snd_card_proc_new(hdsp
->card
, "hdsp", &entry
))
3511 snd_info_set_text_ops(entry
, hdsp
, 1024, snd_hdsp_proc_read
);
3514 static void snd_hdsp_free_buffers(hdsp_t
*hdsp
)
3516 snd_hammerfall_free_buffer(&hdsp
->capture_dma_buf
, hdsp
->pci
);
3517 snd_hammerfall_free_buffer(&hdsp
->playback_dma_buf
, hdsp
->pci
);
3520 static int __devinit
snd_hdsp_initialize_memory(hdsp_t
*hdsp
)
3522 unsigned long pb_bus
, cb_bus
;
3524 if (snd_hammerfall_get_buffer(hdsp
->pci
, &hdsp
->capture_dma_buf
, HDSP_DMA_AREA_BYTES
) < 0 ||
3525 snd_hammerfall_get_buffer(hdsp
->pci
, &hdsp
->playback_dma_buf
, HDSP_DMA_AREA_BYTES
) < 0) {
3526 if (hdsp
->capture_dma_buf
.area
)
3527 snd_dma_free_pages(&hdsp
->capture_dma_buf
);
3528 printk(KERN_ERR
"%s: no buffers available\n", hdsp
->card_name
);
3532 /* Align to bus-space 64K boundary */
3534 cb_bus
= (hdsp
->capture_dma_buf
.addr
+ 0xFFFF) & ~0xFFFFl
;
3535 pb_bus
= (hdsp
->playback_dma_buf
.addr
+ 0xFFFF) & ~0xFFFFl
;
3537 /* Tell the card where it is */
3539 hdsp_write(hdsp
, HDSP_inputBufferAddress
, cb_bus
);
3540 hdsp_write(hdsp
, HDSP_outputBufferAddress
, pb_bus
);
3542 hdsp
->capture_buffer
= hdsp
->capture_dma_buf
.area
+ (cb_bus
- hdsp
->capture_dma_buf
.addr
);
3543 hdsp
->playback_buffer
= hdsp
->playback_dma_buf
.area
+ (pb_bus
- hdsp
->playback_dma_buf
.addr
);
3548 static int snd_hdsp_set_defaults(hdsp_t
*hdsp
)
3552 /* ASSUMPTION: hdsp->lock is either held, or
3553 there is no need to hold it (e.g. during module
3559 SPDIF Input via Coax
3561 maximum latency (7 => 2^7 = 8192 samples, 64Kbyte buffer,
3562 which implies 2 4096 sample, 32Kbyte periods).
3566 hdsp
->control_register
= HDSP_ClockModeMaster
|
3567 HDSP_SPDIFInputCoaxial
|
3568 hdsp_encode_latency(7) |
3572 hdsp_write(hdsp
, HDSP_controlRegister
, hdsp
->control_register
);
3574 #ifdef SNDRV_BIG_ENDIAN
3575 hdsp
->control2_register
= HDSP_BIGENDIAN_MODE
;
3577 hdsp
->control2_register
= 0;
3579 if (hdsp
->io_type
== H9652
) {
3580 snd_hdsp_9652_enable_mixer (hdsp
);
3582 hdsp_write (hdsp
, HDSP_control2Reg
, hdsp
->control2_register
);
3585 hdsp_reset_hw_pointer(hdsp
);
3586 hdsp_compute_period_size(hdsp
);
3588 /* silence everything */
3590 for (i
= 0; i
< HDSP_MATRIX_MIXER_SIZE
; ++i
) {
3591 hdsp
->mixer_matrix
[i
] = MINUS_INFINITY_GAIN
;
3594 for (i
= 0; i
< ((hdsp
->io_type
== H9652
|| hdsp
->io_type
== H9632
) ? 1352 : HDSP_MATRIX_MIXER_SIZE
); ++i
) {
3595 if (hdsp_write_gain (hdsp
, i
, MINUS_INFINITY_GAIN
)) {
3600 /* H9632 specific defaults */
3601 if (hdsp
->io_type
== H9632
) {
3602 hdsp
->control_register
|= (HDSP_DAGainPlus4dBu
| HDSP_ADGainPlus4dBu
| HDSP_PhoneGain0dB
);
3603 hdsp_write(hdsp
, HDSP_controlRegister
, hdsp
->control_register
);
3606 /* set a default rate so that the channel map is set up.
3609 hdsp_set_rate(hdsp
, 48000, 1);
3614 static void hdsp_midi_tasklet(unsigned long arg
)
3616 hdsp_t
*hdsp
= (hdsp_t
*)arg
;
3618 if (hdsp
->midi
[0].pending
) {
3619 snd_hdsp_midi_input_read (&hdsp
->midi
[0]);
3621 if (hdsp
->midi
[1].pending
) {
3622 snd_hdsp_midi_input_read (&hdsp
->midi
[1]);
3626 static irqreturn_t
snd_hdsp_interrupt(int irq
, void *dev_id
, struct pt_regs
*regs
)
3628 hdsp_t
*hdsp
= (hdsp_t
*) dev_id
;
3629 unsigned int status
;
3633 unsigned int midi0status
;
3634 unsigned int midi1status
;
3637 status
= hdsp_read(hdsp
, HDSP_statusRegister
);
3639 audio
= status
& HDSP_audioIRQPending
;
3640 midi0
= status
& HDSP_midi0IRQPending
;
3641 midi1
= status
& HDSP_midi1IRQPending
;
3643 if (!audio
&& !midi0
&& !midi1
) {
3647 hdsp_write(hdsp
, HDSP_interruptConfirmation
, 0);
3649 midi0status
= hdsp_read (hdsp
, HDSP_midiStatusIn0
) & 0xff;
3650 midi1status
= hdsp_read (hdsp
, HDSP_midiStatusIn1
) & 0xff;
3653 if (hdsp
->capture_substream
) {
3654 snd_pcm_period_elapsed(hdsp
->pcm
->streams
[SNDRV_PCM_STREAM_CAPTURE
].substream
);
3657 if (hdsp
->playback_substream
) {
3658 snd_pcm_period_elapsed(hdsp
->pcm
->streams
[SNDRV_PCM_STREAM_PLAYBACK
].substream
);
3662 if (midi0
&& midi0status
) {
3663 if (hdsp
->use_midi_tasklet
) {
3664 /* we disable interrupts for this input until processing is done */
3665 hdsp
->control_register
&= ~HDSP_Midi0InterruptEnable
;
3666 hdsp_write(hdsp
, HDSP_controlRegister
, hdsp
->control_register
);
3667 hdsp
->midi
[0].pending
= 1;
3670 snd_hdsp_midi_input_read (&hdsp
->midi
[0]);
3673 if (hdsp
->io_type
!= Multiface
&& hdsp
->io_type
!= H9632
&& midi1
&& midi1status
) {
3674 if (hdsp
->use_midi_tasklet
) {
3675 /* we disable interrupts for this input until processing is done */
3676 hdsp
->control_register
&= ~HDSP_Midi1InterruptEnable
;
3677 hdsp_write(hdsp
, HDSP_controlRegister
, hdsp
->control_register
);
3678 hdsp
->midi
[1].pending
= 1;
3681 snd_hdsp_midi_input_read (&hdsp
->midi
[1]);
3684 if (hdsp
->use_midi_tasklet
&& schedule
)
3685 tasklet_hi_schedule(&hdsp
->midi_tasklet
);
3689 static snd_pcm_uframes_t
snd_hdsp_hw_pointer(snd_pcm_substream_t
*substream
)
3691 hdsp_t
*hdsp
= snd_pcm_substream_chip(substream
);
3692 return hdsp_hw_pointer(hdsp
);
3695 static char *hdsp_channel_buffer_location(hdsp_t
*hdsp
,
3702 snd_assert(channel
>= 0 && channel
< hdsp
->max_channels
, return NULL
);
3704 if ((mapped_channel
= hdsp
->channel_map
[channel
]) < 0) {
3708 if (stream
== SNDRV_PCM_STREAM_CAPTURE
) {
3709 return hdsp
->capture_buffer
+ (mapped_channel
* HDSP_CHANNEL_BUFFER_BYTES
);
3711 return hdsp
->playback_buffer
+ (mapped_channel
* HDSP_CHANNEL_BUFFER_BYTES
);
3715 static int snd_hdsp_playback_copy(snd_pcm_substream_t
*substream
, int channel
,
3716 snd_pcm_uframes_t pos
, void __user
*src
, snd_pcm_uframes_t count
)
3718 hdsp_t
*hdsp
= snd_pcm_substream_chip(substream
);
3721 snd_assert(pos
+ count
<= HDSP_CHANNEL_BUFFER_BYTES
/ 4, return -EINVAL
);
3723 channel_buf
= hdsp_channel_buffer_location (hdsp
, substream
->pstr
->stream
, channel
);
3724 snd_assert(channel_buf
!= NULL
, return -EIO
);
3725 if (copy_from_user(channel_buf
+ pos
* 4, src
, count
* 4))
3730 static int snd_hdsp_capture_copy(snd_pcm_substream_t
*substream
, int channel
,
3731 snd_pcm_uframes_t pos
, void __user
*dst
, snd_pcm_uframes_t count
)
3733 hdsp_t
*hdsp
= snd_pcm_substream_chip(substream
);
3736 snd_assert(pos
+ count
<= HDSP_CHANNEL_BUFFER_BYTES
/ 4, return -EINVAL
);
3738 channel_buf
= hdsp_channel_buffer_location (hdsp
, substream
->pstr
->stream
, channel
);
3739 snd_assert(channel_buf
!= NULL
, return -EIO
);
3740 if (copy_to_user(dst
, channel_buf
+ pos
* 4, count
* 4))
3745 static int snd_hdsp_hw_silence(snd_pcm_substream_t
*substream
, int channel
,
3746 snd_pcm_uframes_t pos
, snd_pcm_uframes_t count
)
3748 hdsp_t
*hdsp
= snd_pcm_substream_chip(substream
);
3751 channel_buf
= hdsp_channel_buffer_location (hdsp
, substream
->pstr
->stream
, channel
);
3752 snd_assert(channel_buf
!= NULL
, return -EIO
);
3753 memset(channel_buf
+ pos
* 4, 0, count
* 4);
3757 static int snd_hdsp_reset(snd_pcm_substream_t
*substream
)
3759 snd_pcm_runtime_t
*runtime
= substream
->runtime
;
3760 hdsp_t
*hdsp
= snd_pcm_substream_chip(substream
);
3761 snd_pcm_substream_t
*other
;
3762 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
)
3763 other
= hdsp
->capture_substream
;
3765 other
= hdsp
->playback_substream
;
3767 runtime
->status
->hw_ptr
= hdsp_hw_pointer(hdsp
);
3769 runtime
->status
->hw_ptr
= 0;
3771 struct list_head
*pos
;
3772 snd_pcm_substream_t
*s
;
3773 snd_pcm_runtime_t
*oruntime
= other
->runtime
;
3774 snd_pcm_group_for_each(pos
, substream
) {
3775 s
= snd_pcm_group_substream_entry(pos
);
3777 oruntime
->status
->hw_ptr
= runtime
->status
->hw_ptr
;
3785 static int snd_hdsp_hw_params(snd_pcm_substream_t
*substream
,
3786 snd_pcm_hw_params_t
*params
)
3788 hdsp_t
*hdsp
= snd_pcm_substream_chip(substream
);
3793 if (hdsp_check_for_iobox (hdsp
)) {
3797 if (hdsp_check_for_firmware(hdsp
)) {
3798 if (hdsp
->state
& HDSP_FirmwareCached
) {
3799 if (snd_hdsp_load_firmware_from_cache(hdsp
) != 0) {
3800 snd_printk("Hammerfall-DSP: Firmware loading from cache failed, please upload manually.\n");
3803 snd_printk("Hammerfall-DSP: No firmware loaded nor cached, please upload firmware.\n");
3808 spin_lock_irq(&hdsp
->lock
);
3810 if (substream
->pstr
->stream
== SNDRV_PCM_STREAM_PLAYBACK
) {
3811 hdsp
->control_register
&= ~(HDSP_SPDIFProfessional
| HDSP_SPDIFNonAudio
| HDSP_SPDIFEmphasis
);
3812 hdsp_write(hdsp
, HDSP_controlRegister
, hdsp
->control_register
|= hdsp
->creg_spdif_stream
);
3813 this_pid
= hdsp
->playback_pid
;
3814 other_pid
= hdsp
->capture_pid
;
3816 this_pid
= hdsp
->capture_pid
;
3817 other_pid
= hdsp
->playback_pid
;
3820 if ((other_pid
> 0) && (this_pid
!= other_pid
)) {
3822 /* The other stream is open, and not by the same
3823 task as this one. Make sure that the parameters
3824 that matter are the same.
3827 if (params_rate(params
) != hdsp
->system_sample_rate
) {
3828 spin_unlock_irq(&hdsp
->lock
);
3829 _snd_pcm_hw_param_setempty(params
, SNDRV_PCM_HW_PARAM_RATE
);
3833 if (params_period_size(params
) != hdsp
->period_bytes
/ 4) {
3834 spin_unlock_irq(&hdsp
->lock
);
3835 _snd_pcm_hw_param_setempty(params
, SNDRV_PCM_HW_PARAM_PERIOD_SIZE
);
3841 spin_unlock_irq(&hdsp
->lock
);
3845 spin_unlock_irq(&hdsp
->lock
);
3848 /* how to make sure that the rate matches an externally-set one ?
3851 spin_lock_irq(&hdsp
->lock
);
3852 if ((err
= hdsp_set_rate(hdsp
, params_rate(params
), 0)) < 0) {
3853 spin_unlock_irq(&hdsp
->lock
);
3854 _snd_pcm_hw_param_setempty(params
, SNDRV_PCM_HW_PARAM_RATE
);
3857 spin_unlock_irq(&hdsp
->lock
);
3860 if ((err
= hdsp_set_interrupt_interval(hdsp
, params_period_size(params
))) < 0) {
3861 _snd_pcm_hw_param_setempty(params
, SNDRV_PCM_HW_PARAM_PERIOD_SIZE
);
3868 static int snd_hdsp_channel_info(snd_pcm_substream_t
*substream
,
3869 snd_pcm_channel_info_t
*info
)
3871 hdsp_t
*hdsp
= snd_pcm_substream_chip(substream
);
3874 snd_assert(info
->channel
< hdsp
->max_channels
, return -EINVAL
);
3876 if ((mapped_channel
= hdsp
->channel_map
[info
->channel
]) < 0) {
3880 info
->offset
= mapped_channel
* HDSP_CHANNEL_BUFFER_BYTES
;
3886 static int snd_hdsp_ioctl(snd_pcm_substream_t
*substream
,
3887 unsigned int cmd
, void *arg
)
3890 case SNDRV_PCM_IOCTL1_RESET
:
3892 return snd_hdsp_reset(substream
);
3894 case SNDRV_PCM_IOCTL1_CHANNEL_INFO
:
3896 snd_pcm_channel_info_t
*info
= arg
;
3897 return snd_hdsp_channel_info(substream
, info
);
3903 return snd_pcm_lib_ioctl(substream
, cmd
, arg
);
3906 static int snd_hdsp_trigger(snd_pcm_substream_t
*substream
, int cmd
)
3908 hdsp_t
*hdsp
= snd_pcm_substream_chip(substream
);
3909 snd_pcm_substream_t
*other
;
3912 if (hdsp_check_for_iobox (hdsp
)) {
3916 if (hdsp_check_for_firmware(hdsp
)) {
3917 if (hdsp
->state
& HDSP_FirmwareCached
) {
3918 if (snd_hdsp_load_firmware_from_cache(hdsp
) != 0) {
3919 snd_printk("Hammerfall-DSP: Firmware loading from cache failed, please upload manually.\n");
3922 snd_printk("Hammerfall-DSP: No firmware loaded nor cached, please upload firmware.\n");
3927 spin_lock(&hdsp
->lock
);
3928 running
= hdsp
->running
;
3930 case SNDRV_PCM_TRIGGER_START
:
3931 running
|= 1 << substream
->stream
;
3933 case SNDRV_PCM_TRIGGER_STOP
:
3934 running
&= ~(1 << substream
->stream
);
3938 spin_unlock(&hdsp
->lock
);
3941 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
)
3942 other
= hdsp
->capture_substream
;
3944 other
= hdsp
->playback_substream
;
3947 struct list_head
*pos
;
3948 snd_pcm_substream_t
*s
;
3949 snd_pcm_group_for_each(pos
, substream
) {
3950 s
= snd_pcm_group_substream_entry(pos
);
3952 snd_pcm_trigger_done(s
, substream
);
3953 if (cmd
== SNDRV_PCM_TRIGGER_START
)
3954 running
|= 1 << s
->stream
;
3956 running
&= ~(1 << s
->stream
);
3960 if (cmd
== SNDRV_PCM_TRIGGER_START
) {
3961 if (!(running
& (1 << SNDRV_PCM_STREAM_PLAYBACK
)) &&
3962 substream
->stream
== SNDRV_PCM_STREAM_CAPTURE
)
3963 hdsp_silence_playback(hdsp
);
3966 substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
)
3967 hdsp_silence_playback(hdsp
);
3970 if (substream
->stream
== SNDRV_PCM_STREAM_CAPTURE
)
3971 hdsp_silence_playback(hdsp
);
3974 snd_pcm_trigger_done(substream
, substream
);
3975 if (!hdsp
->running
&& running
)
3976 hdsp_start_audio(hdsp
);
3977 else if (hdsp
->running
&& !running
)
3978 hdsp_stop_audio(hdsp
);
3979 hdsp
->running
= running
;
3980 spin_unlock(&hdsp
->lock
);
3985 static int snd_hdsp_prepare(snd_pcm_substream_t
*substream
)
3987 hdsp_t
*hdsp
= snd_pcm_substream_chip(substream
);
3990 if (hdsp_check_for_iobox (hdsp
)) {
3994 if (hdsp_check_for_firmware(hdsp
)) {
3995 if (hdsp
->state
& HDSP_FirmwareCached
) {
3996 if (snd_hdsp_load_firmware_from_cache(hdsp
) != 0) {
3997 snd_printk("Hammerfall-DSP: Firmware loading from cache failed, please upload manually.\n");
4000 snd_printk("Hammerfall-DSP: No firmware loaded nor cached, please upload firmware.\n");
4005 spin_lock_irq(&hdsp
->lock
);
4007 hdsp_reset_hw_pointer(hdsp
);
4008 spin_unlock_irq(&hdsp
->lock
);
4012 static snd_pcm_hardware_t snd_hdsp_playback_subinfo
=
4014 .info
= (SNDRV_PCM_INFO_MMAP
|
4015 SNDRV_PCM_INFO_MMAP_VALID
|
4016 SNDRV_PCM_INFO_NONINTERLEAVED
|
4017 SNDRV_PCM_INFO_SYNC_START
|
4018 SNDRV_PCM_INFO_DOUBLE
),
4019 #ifdef SNDRV_BIG_ENDIAN
4020 .formats
= SNDRV_PCM_FMTBIT_S32_BE
,
4022 .formats
= SNDRV_PCM_FMTBIT_S32_LE
,
4024 .rates
= (SNDRV_PCM_RATE_32000
|
4025 SNDRV_PCM_RATE_44100
|
4026 SNDRV_PCM_RATE_48000
|
4027 SNDRV_PCM_RATE_64000
|
4028 SNDRV_PCM_RATE_88200
|
4029 SNDRV_PCM_RATE_96000
),
4033 .channels_max
= HDSP_MAX_CHANNELS
,
4034 .buffer_bytes_max
= HDSP_CHANNEL_BUFFER_BYTES
* HDSP_MAX_CHANNELS
,
4035 .period_bytes_min
= (64 * 4) * 10,
4036 .period_bytes_max
= (8192 * 4) * HDSP_MAX_CHANNELS
,
4042 static snd_pcm_hardware_t snd_hdsp_capture_subinfo
=
4044 .info
= (SNDRV_PCM_INFO_MMAP
|
4045 SNDRV_PCM_INFO_MMAP_VALID
|
4046 SNDRV_PCM_INFO_NONINTERLEAVED
|
4047 SNDRV_PCM_INFO_SYNC_START
),
4048 #ifdef SNDRV_BIG_ENDIAN
4049 .formats
= SNDRV_PCM_FMTBIT_S32_BE
,
4051 .formats
= SNDRV_PCM_FMTBIT_S32_LE
,
4053 .rates
= (SNDRV_PCM_RATE_32000
|
4054 SNDRV_PCM_RATE_44100
|
4055 SNDRV_PCM_RATE_48000
|
4056 SNDRV_PCM_RATE_64000
|
4057 SNDRV_PCM_RATE_88200
|
4058 SNDRV_PCM_RATE_96000
),
4062 .channels_max
= HDSP_MAX_CHANNELS
,
4063 .buffer_bytes_max
= HDSP_CHANNEL_BUFFER_BYTES
* HDSP_MAX_CHANNELS
,
4064 .period_bytes_min
= (64 * 4) * 10,
4065 .period_bytes_max
= (8192 * 4) * HDSP_MAX_CHANNELS
,
4071 static unsigned int hdsp_period_sizes
[] = { 64, 128, 256, 512, 1024, 2048, 4096, 8192 };
4073 static snd_pcm_hw_constraint_list_t hdsp_hw_constraints_period_sizes
= {
4074 .count
= ARRAY_SIZE(hdsp_period_sizes
),
4075 .list
= hdsp_period_sizes
,
4079 static unsigned int hdsp_9632_sample_rates
[] = { 32000, 44100, 48000, 64000, 88200, 96000, 128000, 176400, 192000 };
4081 static snd_pcm_hw_constraint_list_t hdsp_hw_constraints_9632_sample_rates
= {
4082 .count
= ARRAY_SIZE(hdsp_9632_sample_rates
),
4083 .list
= hdsp_9632_sample_rates
,
4087 static int snd_hdsp_hw_rule_in_channels(snd_pcm_hw_params_t
*params
,
4088 snd_pcm_hw_rule_t
*rule
)
4090 hdsp_t
*hdsp
= rule
->private;
4091 snd_interval_t
*c
= hw_param_interval(params
, SNDRV_PCM_HW_PARAM_CHANNELS
);
4092 if (hdsp
->io_type
== H9632
) {
4093 unsigned int list
[3];
4094 list
[0] = hdsp
->qs_in_channels
;
4095 list
[1] = hdsp
->ds_in_channels
;
4096 list
[2] = hdsp
->ss_in_channels
;
4097 return snd_interval_list(c
, 3, list
, 0);
4099 unsigned int list
[2];
4100 list
[0] = hdsp
->ds_in_channels
;
4101 list
[1] = hdsp
->ss_in_channels
;
4102 return snd_interval_list(c
, 2, list
, 0);
4106 static int snd_hdsp_hw_rule_out_channels(snd_pcm_hw_params_t
*params
,
4107 snd_pcm_hw_rule_t
*rule
)
4109 unsigned int list
[3];
4110 hdsp_t
*hdsp
= rule
->private;
4111 snd_interval_t
*c
= hw_param_interval(params
, SNDRV_PCM_HW_PARAM_CHANNELS
);
4112 if (hdsp
->io_type
== H9632
) {
4113 list
[0] = hdsp
->qs_out_channels
;
4114 list
[1] = hdsp
->ds_out_channels
;
4115 list
[2] = hdsp
->ss_out_channels
;
4116 return snd_interval_list(c
, 3, list
, 0);
4118 list
[0] = hdsp
->ds_out_channels
;
4119 list
[1] = hdsp
->ss_out_channels
;
4121 return snd_interval_list(c
, 2, list
, 0);
4124 static int snd_hdsp_hw_rule_in_channels_rate(snd_pcm_hw_params_t
*params
,
4125 snd_pcm_hw_rule_t
*rule
)
4127 hdsp_t
*hdsp
= rule
->private;
4128 snd_interval_t
*c
= hw_param_interval(params
, SNDRV_PCM_HW_PARAM_CHANNELS
);
4129 snd_interval_t
*r
= hw_param_interval(params
, SNDRV_PCM_HW_PARAM_RATE
);
4130 if (r
->min
> 96000 && hdsp
->io_type
== H9632
) {
4131 snd_interval_t t
= {
4132 .min
= hdsp
->qs_in_channels
,
4133 .max
= hdsp
->qs_in_channels
,
4136 return snd_interval_refine(c
, &t
);
4137 } else if (r
->min
> 48000 && r
->max
<= 96000) {
4138 snd_interval_t t
= {
4139 .min
= hdsp
->ds_in_channels
,
4140 .max
= hdsp
->ds_in_channels
,
4143 return snd_interval_refine(c
, &t
);
4144 } else if (r
->max
< 64000) {
4145 snd_interval_t t
= {
4146 .min
= hdsp
->ss_in_channels
,
4147 .max
= hdsp
->ss_in_channels
,
4150 return snd_interval_refine(c
, &t
);
4155 static int snd_hdsp_hw_rule_out_channels_rate(snd_pcm_hw_params_t
*params
,
4156 snd_pcm_hw_rule_t
*rule
)
4158 hdsp_t
*hdsp
= rule
->private;
4159 snd_interval_t
*c
= hw_param_interval(params
, SNDRV_PCM_HW_PARAM_CHANNELS
);
4160 snd_interval_t
*r
= hw_param_interval(params
, SNDRV_PCM_HW_PARAM_RATE
);
4161 if (r
->min
> 96000 && hdsp
->io_type
== H9632
) {
4162 snd_interval_t t
= {
4163 .min
= hdsp
->qs_out_channels
,
4164 .max
= hdsp
->qs_out_channels
,
4167 return snd_interval_refine(c
, &t
);
4168 } else if (r
->min
> 48000 && r
->max
<= 96000) {
4169 snd_interval_t t
= {
4170 .min
= hdsp
->ds_out_channels
,
4171 .max
= hdsp
->ds_out_channels
,
4174 return snd_interval_refine(c
, &t
);
4175 } else if (r
->max
< 64000) {
4176 snd_interval_t t
= {
4177 .min
= hdsp
->ss_out_channels
,
4178 .max
= hdsp
->ss_out_channels
,
4181 return snd_interval_refine(c
, &t
);
4186 static int snd_hdsp_hw_rule_rate_out_channels(snd_pcm_hw_params_t
*params
,
4187 snd_pcm_hw_rule_t
*rule
)
4189 hdsp_t
*hdsp
= rule
->private;
4190 snd_interval_t
*c
= hw_param_interval(params
, SNDRV_PCM_HW_PARAM_CHANNELS
);
4191 snd_interval_t
*r
= hw_param_interval(params
, SNDRV_PCM_HW_PARAM_RATE
);
4192 if (c
->min
>= hdsp
->ss_out_channels
) {
4193 snd_interval_t t
= {
4198 return snd_interval_refine(r
, &t
);
4199 } else if (c
->max
<= hdsp
->qs_out_channels
&& hdsp
->io_type
== H9632
) {
4200 snd_interval_t t
= {
4205 return snd_interval_refine(r
, &t
);
4206 } else if (c
->max
<= hdsp
->ds_out_channels
) {
4207 snd_interval_t t
= {
4212 return snd_interval_refine(r
, &t
);
4217 static int snd_hdsp_hw_rule_rate_in_channels(snd_pcm_hw_params_t
*params
,
4218 snd_pcm_hw_rule_t
*rule
)
4220 hdsp_t
*hdsp
= rule
->private;
4221 snd_interval_t
*c
= hw_param_interval(params
, SNDRV_PCM_HW_PARAM_CHANNELS
);
4222 snd_interval_t
*r
= hw_param_interval(params
, SNDRV_PCM_HW_PARAM_RATE
);
4223 if (c
->min
>= hdsp
->ss_in_channels
) {
4224 snd_interval_t t
= {
4229 return snd_interval_refine(r
, &t
);
4230 } else if (c
->max
<= hdsp
->qs_in_channels
&& hdsp
->io_type
== H9632
) {
4231 snd_interval_t t
= {
4236 return snd_interval_refine(r
, &t
);
4237 } else if (c
->max
<= hdsp
->ds_in_channels
) {
4238 snd_interval_t t
= {
4243 return snd_interval_refine(r
, &t
);
4248 static int snd_hdsp_playback_open(snd_pcm_substream_t
*substream
)
4250 hdsp_t
*hdsp
= snd_pcm_substream_chip(substream
);
4251 snd_pcm_runtime_t
*runtime
= substream
->runtime
;
4253 if (hdsp_check_for_iobox (hdsp
)) {
4257 if (hdsp_check_for_firmware(hdsp
)) {
4258 if (hdsp
->state
& HDSP_FirmwareCached
) {
4259 if (snd_hdsp_load_firmware_from_cache(hdsp
) != 0) {
4260 snd_printk("Hammerfall-DSP: Firmware loading from cache failed, please upload manually.\n");
4263 snd_printk("Hammerfall-DSP: No firmware loaded nor cached, please upload firmware.\n");
4268 spin_lock_irq(&hdsp
->lock
);
4270 snd_pcm_set_sync(substream
);
4272 runtime
->hw
= snd_hdsp_playback_subinfo
;
4273 runtime
->dma_area
= hdsp
->playback_buffer
;
4274 runtime
->dma_bytes
= HDSP_DMA_AREA_BYTES
;
4276 hdsp
->playback_pid
= current
->pid
;
4277 hdsp
->playback_substream
= substream
;
4279 spin_unlock_irq(&hdsp
->lock
);
4281 snd_pcm_hw_constraint_msbits(runtime
, 0, 32, 24);
4282 snd_pcm_hw_constraint_list(runtime
, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE
, &hdsp_hw_constraints_period_sizes
);
4283 if (hdsp
->io_type
== H9632
) {
4284 runtime
->hw
.channels_min
= hdsp
->qs_out_channels
;
4285 runtime
->hw
.channels_max
= hdsp
->ss_out_channels
;
4286 runtime
->hw
.rate_max
= 192000;
4287 runtime
->hw
.rates
= SNDRV_PCM_RATE_KNOT
;
4288 snd_pcm_hw_constraint_list(runtime
, 0, SNDRV_PCM_HW_PARAM_RATE
, &hdsp_hw_constraints_9632_sample_rates
);
4291 snd_pcm_hw_rule_add(runtime
, 0, SNDRV_PCM_HW_PARAM_CHANNELS
,
4292 snd_hdsp_hw_rule_out_channels
, hdsp
,
4293 SNDRV_PCM_HW_PARAM_CHANNELS
, -1);
4294 snd_pcm_hw_rule_add(runtime
, 0, SNDRV_PCM_HW_PARAM_CHANNELS
,
4295 snd_hdsp_hw_rule_out_channels_rate
, hdsp
,
4296 SNDRV_PCM_HW_PARAM_RATE
, -1);
4297 snd_pcm_hw_rule_add(runtime
, 0, SNDRV_PCM_HW_PARAM_RATE
,
4298 snd_hdsp_hw_rule_rate_out_channels
, hdsp
,
4299 SNDRV_PCM_HW_PARAM_CHANNELS
, -1);
4301 hdsp
->creg_spdif_stream
= hdsp
->creg_spdif
;
4302 hdsp
->spdif_ctl
->vd
[0].access
&= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE
;
4303 snd_ctl_notify(hdsp
->card
, SNDRV_CTL_EVENT_MASK_VALUE
|
4304 SNDRV_CTL_EVENT_MASK_INFO
, &hdsp
->spdif_ctl
->id
);
4308 static int snd_hdsp_playback_release(snd_pcm_substream_t
*substream
)
4310 hdsp_t
*hdsp
= snd_pcm_substream_chip(substream
);
4312 spin_lock_irq(&hdsp
->lock
);
4314 hdsp
->playback_pid
= -1;
4315 hdsp
->playback_substream
= NULL
;
4317 spin_unlock_irq(&hdsp
->lock
);
4319 hdsp
->spdif_ctl
->vd
[0].access
|= SNDRV_CTL_ELEM_ACCESS_INACTIVE
;
4320 snd_ctl_notify(hdsp
->card
, SNDRV_CTL_EVENT_MASK_VALUE
|
4321 SNDRV_CTL_EVENT_MASK_INFO
, &hdsp
->spdif_ctl
->id
);
4326 static int snd_hdsp_capture_open(snd_pcm_substream_t
*substream
)
4328 hdsp_t
*hdsp
= snd_pcm_substream_chip(substream
);
4329 snd_pcm_runtime_t
*runtime
= substream
->runtime
;
4331 if (hdsp_check_for_iobox (hdsp
)) {
4335 if (hdsp_check_for_firmware(hdsp
)) {
4336 if (hdsp
->state
& HDSP_FirmwareCached
) {
4337 if (snd_hdsp_load_firmware_from_cache(hdsp
) != 0) {
4338 snd_printk("Hammerfall-DSP: Firmware loading from cache failed, please upload manually.\n");
4341 snd_printk("Hammerfall-DSP: No firmware loaded nor cached, please upload firmware.\n");
4346 spin_lock_irq(&hdsp
->lock
);
4348 snd_pcm_set_sync(substream
);
4350 runtime
->hw
= snd_hdsp_capture_subinfo
;
4351 runtime
->dma_area
= hdsp
->capture_buffer
;
4352 runtime
->dma_bytes
= HDSP_DMA_AREA_BYTES
;
4354 hdsp
->capture_pid
= current
->pid
;
4355 hdsp
->capture_substream
= substream
;
4357 spin_unlock_irq(&hdsp
->lock
);
4359 snd_pcm_hw_constraint_msbits(runtime
, 0, 32, 24);
4360 snd_pcm_hw_constraint_list(runtime
, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE
, &hdsp_hw_constraints_period_sizes
);
4361 if (hdsp
->io_type
== H9632
) {
4362 runtime
->hw
.channels_min
= hdsp
->qs_in_channels
;
4363 runtime
->hw
.channels_max
= hdsp
->ss_in_channels
;
4364 runtime
->hw
.rate_max
= 192000;
4365 runtime
->hw
.rates
= SNDRV_PCM_RATE_KNOT
;
4366 snd_pcm_hw_constraint_list(runtime
, 0, SNDRV_PCM_HW_PARAM_RATE
, &hdsp_hw_constraints_9632_sample_rates
);
4368 snd_pcm_hw_rule_add(runtime
, 0, SNDRV_PCM_HW_PARAM_CHANNELS
,
4369 snd_hdsp_hw_rule_in_channels
, hdsp
,
4370 SNDRV_PCM_HW_PARAM_CHANNELS
, -1);
4371 snd_pcm_hw_rule_add(runtime
, 0, SNDRV_PCM_HW_PARAM_CHANNELS
,
4372 snd_hdsp_hw_rule_in_channels_rate
, hdsp
,
4373 SNDRV_PCM_HW_PARAM_RATE
, -1);
4374 snd_pcm_hw_rule_add(runtime
, 0, SNDRV_PCM_HW_PARAM_RATE
,
4375 snd_hdsp_hw_rule_rate_in_channels
, hdsp
,
4376 SNDRV_PCM_HW_PARAM_CHANNELS
, -1);
4380 static int snd_hdsp_capture_release(snd_pcm_substream_t
*substream
)
4382 hdsp_t
*hdsp
= snd_pcm_substream_chip(substream
);
4384 spin_lock_irq(&hdsp
->lock
);
4386 hdsp
->capture_pid
= -1;
4387 hdsp
->capture_substream
= NULL
;
4389 spin_unlock_irq(&hdsp
->lock
);
4393 static int snd_hdsp_hwdep_dummy_op(snd_hwdep_t
*hw
, struct file
*file
)
4395 /* we have nothing to initialize but the call is required */
4400 /* helper functions for copying meter values */
4401 static inline int copy_u32_le(void __user
*dest
, void __iomem
*src
)
4403 u32 val
= readl(src
);
4404 return copy_to_user(dest
, &val
, 4);
4407 static inline int copy_u64_le(void __user
*dest
, void __iomem
*src_low
, void __iomem
*src_high
)
4409 u32 rms_low
, rms_high
;
4411 rms_low
= readl(src_low
);
4412 rms_high
= readl(src_high
);
4413 rms
= ((u64
)rms_high
<< 32) | rms_low
;
4414 return copy_to_user(dest
, &rms
, 8);
4417 static inline int copy_u48_le(void __user
*dest
, void __iomem
*src_low
, void __iomem
*src_high
)
4419 u32 rms_low
, rms_high
;
4421 rms_low
= readl(src_low
) & 0xffffff00;
4422 rms_high
= readl(src_high
) & 0xffffff00;
4423 rms
= ((u64
)rms_high
<< 32) | rms_low
;
4424 return copy_to_user(dest
, &rms
, 8);
4427 static int hdsp_9652_get_peak(hdsp_t
*hdsp
, hdsp_peak_rms_t __user
*peak_rms
)
4429 int doublespeed
= 0;
4430 int i
, j
, channels
, ofs
;
4432 if (hdsp_read (hdsp
, HDSP_statusRegister
) & HDSP_DoubleSpeedStatus
)
4434 channels
= doublespeed
? 14 : 26;
4435 for (i
= 0, j
= 0; i
< 26; ++i
) {
4436 if (doublespeed
&& (i
& 4))
4438 ofs
= HDSP_9652_peakBase
- j
* 4;
4439 if (copy_u32_le(&peak_rms
->input_peaks
[i
], hdsp
->iobase
+ ofs
))
4441 ofs
-= channels
* 4;
4442 if (copy_u32_le(&peak_rms
->playback_peaks
[i
], hdsp
->iobase
+ ofs
))
4444 ofs
-= channels
* 4;
4445 if (copy_u32_le(&peak_rms
->output_peaks
[i
], hdsp
->iobase
+ ofs
))
4447 ofs
= HDSP_9652_rmsBase
+ j
* 8;
4448 if (copy_u48_le(&peak_rms
->input_rms
[i
], hdsp
->iobase
+ ofs
,
4449 hdsp
->iobase
+ ofs
+ 4))
4451 ofs
+= channels
* 8;
4452 if (copy_u48_le(&peak_rms
->playback_rms
[i
], hdsp
->iobase
+ ofs
,
4453 hdsp
->iobase
+ ofs
+ 4))
4455 ofs
+= channels
* 8;
4456 if (copy_u48_le(&peak_rms
->output_rms
[i
], hdsp
->iobase
+ ofs
,
4457 hdsp
->iobase
+ ofs
+ 4))
4464 static int hdsp_9632_get_peak(hdsp_t
*hdsp
, hdsp_peak_rms_t __user
*peak_rms
)
4467 hdsp_9632_meters_t __iomem
*m
;
4468 int doublespeed
= 0;
4470 if (hdsp_read (hdsp
, HDSP_statusRegister
) & HDSP_DoubleSpeedStatus
)
4472 m
= (hdsp_9632_meters_t __iomem
*)(hdsp
->iobase
+HDSP_9632_metersBase
);
4473 for (i
= 0, j
= 0; i
< 16; ++i
, ++j
) {
4474 if (copy_u32_le(&peak_rms
->input_peaks
[i
], &m
->input_peak
[j
]))
4476 if (copy_u32_le(&peak_rms
->playback_peaks
[i
], &m
->playback_peak
[j
]))
4478 if (copy_u32_le(&peak_rms
->output_peaks
[i
], &m
->output_peak
[j
]))
4480 if (copy_u64_le(&peak_rms
->input_rms
[i
], &m
->input_rms_low
[j
],
4481 &m
->input_rms_high
[j
]))
4483 if (copy_u64_le(&peak_rms
->playback_rms
[i
], &m
->playback_rms_low
[j
],
4484 &m
->playback_rms_high
[j
]))
4486 if (copy_u64_le(&peak_rms
->output_rms
[i
], &m
->output_rms_low
[j
],
4487 &m
->output_rms_high
[j
]))
4489 if (doublespeed
&& i
== 3) i
+= 4;
4494 static int hdsp_get_peak(hdsp_t
*hdsp
, hdsp_peak_rms_t __user
*peak_rms
)
4498 for (i
= 0; i
< 26; i
++) {
4499 if (copy_u32_le(&peak_rms
->playback_peaks
[i
],
4500 hdsp
->iobase
+ HDSP_playbackPeakLevel
+ i
* 4))
4502 if (copy_u32_le(&peak_rms
->input_peaks
[i
],
4503 hdsp
->iobase
+ HDSP_inputPeakLevel
+ i
* 4))
4506 for (i
= 0; i
< 28; i
++) {
4507 if (copy_u32_le(&peak_rms
->output_peaks
[i
],
4508 hdsp
->iobase
+ HDSP_outputPeakLevel
+ i
* 4))
4511 for (i
= 0; i
< 26; ++i
) {
4512 if (copy_u64_le(&peak_rms
->playback_rms
[i
],
4513 hdsp
->iobase
+ HDSP_playbackRmsLevel
+ i
* 8 + 4,
4514 hdsp
->iobase
+ HDSP_playbackRmsLevel
+ i
* 8))
4516 if (copy_u64_le(&peak_rms
->input_rms
[i
],
4517 hdsp
->iobase
+ HDSP_inputRmsLevel
+ i
* 8 + 4,
4518 hdsp
->iobase
+ HDSP_inputRmsLevel
+ i
* 8))
4524 static int snd_hdsp_hwdep_ioctl(snd_hwdep_t
*hw
, struct file
*file
, unsigned int cmd
, unsigned long arg
)
4526 hdsp_t
*hdsp
= (hdsp_t
*)hw
->private_data
;
4527 void __user
*argp
= (void __user
*)arg
;
4530 case SNDRV_HDSP_IOCTL_GET_PEAK_RMS
: {
4531 hdsp_peak_rms_t __user
*peak_rms
= (hdsp_peak_rms_t __user
*)arg
;
4533 if (!(hdsp
->state
& HDSP_FirmwareLoaded
)) {
4534 snd_printk(KERN_ERR
"Hammerfall-DSP: firmware needs to be uploaded to the card.\n");
4538 switch (hdsp
->io_type
) {
4540 return hdsp_9652_get_peak(hdsp
, peak_rms
);
4542 return hdsp_9632_get_peak(hdsp
, peak_rms
);
4544 return hdsp_get_peak(hdsp
, peak_rms
);
4547 case SNDRV_HDSP_IOCTL_GET_CONFIG_INFO
: {
4548 hdsp_config_info_t info
;
4549 unsigned long flags
;
4552 if (!(hdsp
->state
& HDSP_FirmwareLoaded
)) {
4553 snd_printk("Hammerfall-DSP: Firmware needs to be uploaded to the card.\n");
4556 spin_lock_irqsave(&hdsp
->lock
, flags
);
4557 info
.pref_sync_ref
= (unsigned char)hdsp_pref_sync_ref(hdsp
);
4558 info
.wordclock_sync_check
= (unsigned char)hdsp_wc_sync_check(hdsp
);
4559 if (hdsp
->io_type
!= H9632
) {
4560 info
.adatsync_sync_check
= (unsigned char)hdsp_adatsync_sync_check(hdsp
);
4562 info
.spdif_sync_check
= (unsigned char)hdsp_spdif_sync_check(hdsp
);
4563 for (i
= 0; i
< ((hdsp
->io_type
!= Multiface
&& hdsp
->io_type
!= H9632
) ? 3 : 1); ++i
) {
4564 info
.adat_sync_check
[i
] = (unsigned char)hdsp_adat_sync_check(hdsp
, i
);
4566 info
.spdif_in
= (unsigned char)hdsp_spdif_in(hdsp
);
4567 info
.spdif_out
= (unsigned char)hdsp_spdif_out(hdsp
);
4568 info
.spdif_professional
= (unsigned char)hdsp_spdif_professional(hdsp
);
4569 info
.spdif_emphasis
= (unsigned char)hdsp_spdif_emphasis(hdsp
);
4570 info
.spdif_nonaudio
= (unsigned char)hdsp_spdif_nonaudio(hdsp
);
4571 info
.spdif_sample_rate
= hdsp_spdif_sample_rate(hdsp
);
4572 info
.system_sample_rate
= hdsp
->system_sample_rate
;
4573 info
.autosync_sample_rate
= hdsp_external_sample_rate(hdsp
);
4574 info
.system_clock_mode
= (unsigned char)hdsp_system_clock_mode(hdsp
);
4575 info
.clock_source
= (unsigned char)hdsp_clock_source(hdsp
);
4576 info
.autosync_ref
= (unsigned char)hdsp_autosync_ref(hdsp
);
4577 info
.line_out
= (unsigned char)hdsp_line_out(hdsp
);
4578 if (hdsp
->io_type
== H9632
) {
4579 info
.da_gain
= (unsigned char)hdsp_da_gain(hdsp
);
4580 info
.ad_gain
= (unsigned char)hdsp_ad_gain(hdsp
);
4581 info
.phone_gain
= (unsigned char)hdsp_phone_gain(hdsp
);
4582 info
.xlr_breakout_cable
= (unsigned char)hdsp_xlr_breakout_cable(hdsp
);
4585 if (hdsp
->io_type
== H9632
|| hdsp
->io_type
== H9652
) {
4586 info
.analog_extension_board
= (unsigned char)hdsp_aeb(hdsp
);
4588 spin_unlock_irqrestore(&hdsp
->lock
, flags
);
4589 if (copy_to_user(argp
, &info
, sizeof(info
)))
4593 case SNDRV_HDSP_IOCTL_GET_9632_AEB
: {
4594 hdsp_9632_aeb_t h9632_aeb
;
4596 if (hdsp
->io_type
!= H9632
) return -EINVAL
;
4597 h9632_aeb
.aebi
= hdsp
->ss_in_channels
- H9632_SS_CHANNELS
;
4598 h9632_aeb
.aebo
= hdsp
->ss_out_channels
- H9632_SS_CHANNELS
;
4599 if (copy_to_user(argp
, &h9632_aeb
, sizeof(h9632_aeb
)))
4603 case SNDRV_HDSP_IOCTL_GET_VERSION
: {
4604 hdsp_version_t hdsp_version
;
4607 if (hdsp
->io_type
== H9652
|| hdsp
->io_type
== H9632
) return -EINVAL
;
4608 if (hdsp
->io_type
== Undefined
) {
4609 if ((err
= hdsp_get_iobox_version(hdsp
)) < 0) {
4613 hdsp_version
.io_type
= hdsp
->io_type
;
4614 hdsp_version
.firmware_rev
= hdsp
->firmware_rev
;
4615 if ((err
= copy_to_user(argp
, &hdsp_version
, sizeof(hdsp_version
)))) {
4620 case SNDRV_HDSP_IOCTL_UPLOAD_FIRMWARE
: {
4621 hdsp_firmware_t __user
*firmware
;
4622 u32 __user
*firmware_data
;
4625 if (hdsp
->io_type
== H9652
|| hdsp
->io_type
== H9632
) return -EINVAL
;
4626 /* SNDRV_HDSP_IOCTL_GET_VERSION must have been called */
4627 if (hdsp
->io_type
== Undefined
) return -EINVAL
;
4629 if (hdsp
->state
& (HDSP_FirmwareCached
| HDSP_FirmwareLoaded
))
4632 snd_printk("Hammerfall-DSP: initializing firmware upload\n");
4633 firmware
= (hdsp_firmware_t __user
*)argp
;
4635 if (get_user(firmware_data
, &firmware
->firmware_data
)) {
4639 if (hdsp_check_for_iobox (hdsp
)) {
4643 if (copy_from_user(hdsp
->firmware_cache
, firmware_data
, sizeof(hdsp
->firmware_cache
)) != 0) {
4647 hdsp
->state
|= HDSP_FirmwareCached
;
4649 if ((err
= snd_hdsp_load_firmware_from_cache(hdsp
)) < 0) {
4653 if (!(hdsp
->state
& HDSP_InitializationComplete
)) {
4654 if ((err
= snd_hdsp_enable_io(hdsp
)) < 0) {
4658 snd_hdsp_initialize_channels(hdsp
);
4659 snd_hdsp_initialize_midi_flush(hdsp
);
4661 if ((err
= snd_hdsp_create_alsa_devices(hdsp
->card
, hdsp
)) < 0) {
4662 snd_printk("Hammerfall-DSP: error creating alsa devices\n");
4668 case SNDRV_HDSP_IOCTL_GET_MIXER
: {
4669 hdsp_mixer_t __user
*mixer
= (hdsp_mixer_t __user
*)argp
;
4670 if (copy_to_user(mixer
->matrix
, hdsp
->mixer_matrix
, sizeof(unsigned short)*HDSP_MATRIX_MIXER_SIZE
))
4680 static snd_pcm_ops_t snd_hdsp_playback_ops
= {
4681 .open
= snd_hdsp_playback_open
,
4682 .close
= snd_hdsp_playback_release
,
4683 .ioctl
= snd_hdsp_ioctl
,
4684 .hw_params
= snd_hdsp_hw_params
,
4685 .prepare
= snd_hdsp_prepare
,
4686 .trigger
= snd_hdsp_trigger
,
4687 .pointer
= snd_hdsp_hw_pointer
,
4688 .copy
= snd_hdsp_playback_copy
,
4689 .silence
= snd_hdsp_hw_silence
,
4692 static snd_pcm_ops_t snd_hdsp_capture_ops
= {
4693 .open
= snd_hdsp_capture_open
,
4694 .close
= snd_hdsp_capture_release
,
4695 .ioctl
= snd_hdsp_ioctl
,
4696 .hw_params
= snd_hdsp_hw_params
,
4697 .prepare
= snd_hdsp_prepare
,
4698 .trigger
= snd_hdsp_trigger
,
4699 .pointer
= snd_hdsp_hw_pointer
,
4700 .copy
= snd_hdsp_capture_copy
,
4703 static int __devinit
snd_hdsp_create_hwdep(snd_card_t
*card
,
4709 if ((err
= snd_hwdep_new(card
, "HDSP hwdep", 0, &hw
)) < 0)
4713 hw
->private_data
= hdsp
;
4714 strcpy(hw
->name
, "HDSP hwdep interface");
4716 hw
->ops
.open
= snd_hdsp_hwdep_dummy_op
;
4717 hw
->ops
.ioctl
= snd_hdsp_hwdep_ioctl
;
4718 hw
->ops
.release
= snd_hdsp_hwdep_dummy_op
;
4723 static int snd_hdsp_create_pcm(snd_card_t
*card
, hdsp_t
*hdsp
)
4728 if ((err
= snd_pcm_new(card
, hdsp
->card_name
, 0, 1, 1, &pcm
)) < 0)
4732 pcm
->private_data
= hdsp
;
4733 strcpy(pcm
->name
, hdsp
->card_name
);
4735 snd_pcm_set_ops(pcm
, SNDRV_PCM_STREAM_PLAYBACK
, &snd_hdsp_playback_ops
);
4736 snd_pcm_set_ops(pcm
, SNDRV_PCM_STREAM_CAPTURE
, &snd_hdsp_capture_ops
);
4738 pcm
->info_flags
= SNDRV_PCM_INFO_JOINT_DUPLEX
;
4743 static void snd_hdsp_9652_enable_mixer (hdsp_t
*hdsp
)
4745 hdsp
->control2_register
|= HDSP_9652_ENABLE_MIXER
;
4746 hdsp_write (hdsp
, HDSP_control2Reg
, hdsp
->control2_register
);
4749 static int snd_hdsp_enable_io (hdsp_t
*hdsp
)
4753 if (hdsp_fifo_wait (hdsp
, 0, 100)) {
4754 snd_printk("Hammerfall-DSP: enable_io fifo_wait failed\n");
4758 for (i
= 0; i
< hdsp
->max_channels
; ++i
) {
4759 hdsp_write (hdsp
, HDSP_inputEnable
+ (4 * i
), 1);
4760 hdsp_write (hdsp
, HDSP_outputEnable
+ (4 * i
), 1);
4766 static void snd_hdsp_initialize_channels(hdsp_t
*hdsp
)
4768 int status
, aebi_channels
, aebo_channels
;
4770 switch (hdsp
->io_type
) {
4772 hdsp
->card_name
= "RME Hammerfall DSP + Digiface";
4773 hdsp
->ss_in_channels
= hdsp
->ss_out_channels
= DIGIFACE_SS_CHANNELS
;
4774 hdsp
->ds_in_channels
= hdsp
->ds_out_channels
= DIGIFACE_DS_CHANNELS
;
4778 hdsp
->card_name
= "RME Hammerfall HDSP 9652";
4779 hdsp
->ss_in_channels
= hdsp
->ss_out_channels
= H9652_SS_CHANNELS
;
4780 hdsp
->ds_in_channels
= hdsp
->ds_out_channels
= H9652_DS_CHANNELS
;
4784 status
= hdsp_read(hdsp
, HDSP_statusRegister
);
4785 /* HDSP_AEBx bits are low when AEB are connected */
4786 aebi_channels
= (status
& HDSP_AEBI
) ? 0 : 4;
4787 aebo_channels
= (status
& HDSP_AEBO
) ? 0 : 4;
4788 hdsp
->card_name
= "RME Hammerfall HDSP 9632";
4789 hdsp
->ss_in_channels
= H9632_SS_CHANNELS
+aebi_channels
;
4790 hdsp
->ds_in_channels
= H9632_DS_CHANNELS
+aebi_channels
;
4791 hdsp
->qs_in_channels
= H9632_QS_CHANNELS
+aebi_channels
;
4792 hdsp
->ss_out_channels
= H9632_SS_CHANNELS
+aebo_channels
;
4793 hdsp
->ds_out_channels
= H9632_DS_CHANNELS
+aebo_channels
;
4794 hdsp
->qs_out_channels
= H9632_QS_CHANNELS
+aebo_channels
;
4798 hdsp
->card_name
= "RME Hammerfall DSP + Multiface";
4799 hdsp
->ss_in_channels
= hdsp
->ss_out_channels
= MULTIFACE_SS_CHANNELS
;
4800 hdsp
->ds_in_channels
= hdsp
->ds_out_channels
= MULTIFACE_DS_CHANNELS
;
4804 /* should never get here */
4809 static void snd_hdsp_initialize_midi_flush (hdsp_t
*hdsp
)
4811 snd_hdsp_flush_midi_input (hdsp
, 0);
4812 snd_hdsp_flush_midi_input (hdsp
, 1);
4815 static int snd_hdsp_create_alsa_devices(snd_card_t
*card
, hdsp_t
*hdsp
)
4819 if ((err
= snd_hdsp_create_pcm(card
, hdsp
)) < 0) {
4820 snd_printk("Hammerfall-DSP: Error creating pcm interface\n");
4825 if ((err
= snd_hdsp_create_midi(card
, hdsp
, 0)) < 0) {
4826 snd_printk("Hammerfall-DSP: Error creating first midi interface\n");
4830 if (hdsp
->io_type
== Digiface
|| hdsp
->io_type
== H9652
) {
4831 if ((err
= snd_hdsp_create_midi(card
, hdsp
, 1)) < 0) {
4832 snd_printk("Hammerfall-DSP: Error creating second midi interface\n");
4837 if ((err
= snd_hdsp_create_controls(card
, hdsp
)) < 0) {
4838 snd_printk("Hammerfall-DSP: Error creating ctl interface\n");
4842 snd_hdsp_proc_init(hdsp
);
4844 hdsp
->system_sample_rate
= -1;
4845 hdsp
->playback_pid
= -1;
4846 hdsp
->capture_pid
= -1;
4847 hdsp
->capture_substream
= NULL
;
4848 hdsp
->playback_substream
= NULL
;
4850 if ((err
= snd_hdsp_set_defaults(hdsp
)) < 0) {
4851 snd_printk("Hammerfall-DSP: Error setting default values\n");
4855 if (!(hdsp
->state
& HDSP_InitializationComplete
)) {
4856 sprintf(card
->longname
, "%s at 0x%lx, irq %d", hdsp
->card_name
,
4857 hdsp
->port
, hdsp
->irq
);
4859 if ((err
= snd_card_register(card
)) < 0) {
4860 snd_printk("Hammerfall-DSP: error registering card\n");
4863 hdsp
->state
|= HDSP_InitializationComplete
;
4869 #ifdef HDSP_FW_LOADER
4870 /* load firmware via hotplug fw loader */
4871 static int __devinit
hdsp_request_fw_loader(hdsp_t
*hdsp
)
4874 const struct firmware
*fw
;
4877 if (hdsp
->io_type
== H9652
|| hdsp
->io_type
== H9632
)
4879 if (hdsp
->io_type
== Undefined
) {
4880 if ((err
= hdsp_get_iobox_version(hdsp
)) < 0)
4882 if (hdsp
->io_type
== H9652
|| hdsp
->io_type
== H9632
)
4886 /* caution: max length of firmware filename is 30! */
4887 switch (hdsp
->io_type
) {
4889 if (hdsp
->firmware_rev
== 0xa)
4890 fwfile
= "multiface_firmware.bin";
4892 fwfile
= "multiface_firmware_rev11.bin";
4895 if (hdsp
->firmware_rev
== 0xa)
4896 fwfile
= "digiface_firmware.bin";
4898 fwfile
= "digiface_firmware_rev11.bin";
4901 snd_printk(KERN_ERR
"Hammerfall-DSP: invalid io_type %d\n", hdsp
->io_type
);
4905 if (request_firmware(&fw
, fwfile
, &hdsp
->pci
->dev
)) {
4906 snd_printk(KERN_ERR
"Hammerfall-DSP: cannot load firmware %s\n", fwfile
);
4909 if (fw
->size
< sizeof(hdsp
->firmware_cache
)) {
4910 snd_printk(KERN_ERR
"Hammerfall-DSP: too short firmware size %d (expected %d)\n",
4911 (int)fw
->size
, (int)sizeof(hdsp
->firmware_cache
));
4912 release_firmware(fw
);
4915 #ifdef SNDRV_BIG_ENDIAN
4918 u32
*src
= (u32
*)fw
->data
;
4919 for (i
= 0; i
< ARRAY_SIZE(hdsp
->firmware_cache
); i
++, src
++)
4920 hdsp
->firmware_cache
[i
] = ((*src
& 0x000000ff) << 16) |
4921 ((*src
& 0x0000ff00) << 8) |
4922 ((*src
& 0x00ff0000) >> 8) |
4923 ((*src
& 0xff000000) >> 16);
4926 memcpy(hdsp
->firmware_cache
, fw
->data
, sizeof(hdsp
->firmware_cache
));
4928 release_firmware(fw
);
4930 hdsp
->state
|= HDSP_FirmwareCached
;
4932 if ((err
= snd_hdsp_load_firmware_from_cache(hdsp
)) < 0)
4935 if (!(hdsp
->state
& HDSP_InitializationComplete
)) {
4936 if ((err
= snd_hdsp_enable_io(hdsp
)) < 0) {
4940 if ((err
= snd_hdsp_create_hwdep(hdsp
->card
, hdsp
)) < 0) {
4941 snd_printk("Hammerfall-DSP: error creating hwdep device\n");
4944 snd_hdsp_initialize_channels(hdsp
);
4945 snd_hdsp_initialize_midi_flush(hdsp
);
4946 if ((err
= snd_hdsp_create_alsa_devices(hdsp
->card
, hdsp
)) < 0) {
4947 snd_printk("Hammerfall-DSP: error creating alsa devices\n");
4955 static int __devinit
snd_hdsp_create(snd_card_t
*card
,
4958 struct pci_dev
*pci
= hdsp
->pci
;
4965 hdsp
->midi
[0].rmidi
= NULL
;
4966 hdsp
->midi
[1].rmidi
= NULL
;
4967 hdsp
->midi
[0].input
= NULL
;
4968 hdsp
->midi
[1].input
= NULL
;
4969 hdsp
->midi
[0].output
= NULL
;
4970 hdsp
->midi
[1].output
= NULL
;
4971 hdsp
->midi
[0].pending
= 0;
4972 hdsp
->midi
[1].pending
= 0;
4973 spin_lock_init(&hdsp
->midi
[0].lock
);
4974 spin_lock_init(&hdsp
->midi
[1].lock
);
4975 hdsp
->iobase
= NULL
;
4976 hdsp
->control_register
= 0;
4977 hdsp
->control2_register
= 0;
4978 hdsp
->io_type
= Undefined
;
4979 hdsp
->max_channels
= 26;
4983 spin_lock_init(&hdsp
->lock
);
4985 tasklet_init(&hdsp
->midi_tasklet
, hdsp_midi_tasklet
, (unsigned long)hdsp
);
4987 pci_read_config_word(hdsp
->pci
, PCI_CLASS_REVISION
, &hdsp
->firmware_rev
);
4988 hdsp
->firmware_rev
&= 0xff;
4990 /* From Martin Bjoernsen :
4991 "It is important that the card's latency timer register in
4992 the PCI configuration space is set to a value much larger
4993 than 0 by the computer's BIOS or the driver.
4994 The windows driver always sets this 8 bit register [...]
4995 to its maximum 255 to avoid problems with some computers."
4997 pci_write_config_byte(hdsp
->pci
, PCI_LATENCY_TIMER
, 0xFF);
4999 strcpy(card
->driver
, "H-DSP");
5000 strcpy(card
->mixername
, "Xilinx FPGA");
5002 if (hdsp
->firmware_rev
< 0xa) {
5004 } else if (hdsp
->firmware_rev
< 0x64) {
5005 hdsp
->card_name
= "RME Hammerfall DSP";
5006 } else if (hdsp
->firmware_rev
< 0x96) {
5007 hdsp
->card_name
= "RME HDSP 9652";
5010 hdsp
->card_name
= "RME HDSP 9632";
5011 hdsp
->max_channels
= 16;
5015 if ((err
= pci_enable_device(pci
)) < 0) {
5019 pci_set_master(hdsp
->pci
);
5021 if ((err
= pci_request_regions(pci
, "hdsp")) < 0)
5023 hdsp
->port
= pci_resource_start(pci
, 0);
5024 if ((hdsp
->iobase
= ioremap_nocache(hdsp
->port
, HDSP_IO_EXTENT
)) == NULL
) {
5025 snd_printk("Hammerfall-DSP: unable to remap region 0x%lx-0x%lx\n", hdsp
->port
, hdsp
->port
+ HDSP_IO_EXTENT
- 1);
5029 if (request_irq(pci
->irq
, snd_hdsp_interrupt
, SA_INTERRUPT
|SA_SHIRQ
, "hdsp", (void *)hdsp
)) {
5030 snd_printk("Hammerfall-DSP: unable to use IRQ %d\n", pci
->irq
);
5034 hdsp
->irq
= pci
->irq
;
5035 hdsp
->precise_ptr
= 1;
5036 hdsp
->use_midi_tasklet
= 1;
5038 if ((err
= snd_hdsp_initialize_memory(hdsp
)) < 0) {
5042 if (!is_9652
&& !is_9632
) {
5043 /* we wait 2 seconds to let freshly inserted cardbus cards do their hardware init */
5044 if ((1000 / HZ
) < 2000) {
5045 set_current_state(TASK_UNINTERRUPTIBLE
);
5046 schedule_timeout((2000 * HZ
+ 999) / 1000);
5051 if ((hdsp_read (hdsp
, HDSP_statusRegister
) & HDSP_DllError
) != 0) {
5052 #ifdef HDSP_FW_LOADER
5053 if ((err
= hdsp_request_fw_loader(hdsp
)) < 0) {
5054 /* we don't fail as this can happen
5055 if userspace is not ready for
5058 snd_printk("Hammerfall-DSP: couldn't get firmware from userspace. try using hdsploader\n");
5060 /* init is complete, we return */
5064 /* no iobox connected, we defer initialization */
5065 snd_printk("Hammerfall-DSP: card initialization pending : waiting for firmware\n");
5066 if ((err
= snd_hdsp_create_hwdep(card
, hdsp
)) < 0) {
5071 snd_printk("Hammerfall-DSP: Firmware already present, initializing card.\n");
5072 if (hdsp_read(hdsp
, HDSP_status2Register
) & HDSP_version1
) {
5073 hdsp
->io_type
= Multiface
;
5075 hdsp
->io_type
= Digiface
;
5080 if ((err
= snd_hdsp_enable_io(hdsp
)) != 0) {
5085 hdsp
->io_type
= H9652
;
5089 hdsp
->io_type
= H9632
;
5092 if ((err
= snd_hdsp_create_hwdep(card
, hdsp
)) < 0) {
5096 snd_hdsp_initialize_channels(hdsp
);
5097 snd_hdsp_initialize_midi_flush(hdsp
);
5099 hdsp
->state
|= HDSP_FirmwareLoaded
;
5101 if ((err
= snd_hdsp_create_alsa_devices(card
, hdsp
)) < 0) {
5108 static int snd_hdsp_free(hdsp_t
*hdsp
)
5111 /* stop the audio, and cancel all interrupts */
5112 tasklet_kill(&hdsp
->midi_tasklet
);
5113 hdsp
->control_register
&= ~(HDSP_Start
|HDSP_AudioInterruptEnable
|HDSP_Midi0InterruptEnable
|HDSP_Midi1InterruptEnable
);
5114 hdsp_write (hdsp
, HDSP_controlRegister
, hdsp
->control_register
);
5118 free_irq(hdsp
->irq
, (void *)hdsp
);
5120 snd_hdsp_free_buffers(hdsp
);
5123 iounmap(hdsp
->iobase
);
5126 pci_release_regions(hdsp
->pci
);
5128 pci_disable_device(hdsp
->pci
);
5132 static void snd_hdsp_card_free(snd_card_t
*card
)
5134 hdsp_t
*hdsp
= (hdsp_t
*) card
->private_data
;
5137 snd_hdsp_free(hdsp
);
5140 static int __devinit
snd_hdsp_probe(struct pci_dev
*pci
,
5141 const struct pci_device_id
*pci_id
)
5148 if (dev
>= SNDRV_CARDS
)
5155 if (!(card
= snd_card_new(index
[dev
], id
[dev
], THIS_MODULE
, sizeof(hdsp_t
))))
5158 hdsp
= (hdsp_t
*) card
->private_data
;
5159 card
->private_free
= snd_hdsp_card_free
;
5162 snd_card_set_dev(card
, &pci
->dev
);
5164 if ((err
= snd_hdsp_create(card
, hdsp
)) < 0) {
5165 snd_card_free(card
);
5169 strcpy(card
->shortname
, "Hammerfall DSP");
5170 sprintf(card
->longname
, "%s at 0x%lx, irq %d", hdsp
->card_name
,
5171 hdsp
->port
, hdsp
->irq
);
5173 if ((err
= snd_card_register(card
)) < 0) {
5174 snd_card_free(card
);
5177 pci_set_drvdata(pci
, card
);
5182 static void __devexit
snd_hdsp_remove(struct pci_dev
*pci
)
5184 snd_card_free(pci_get_drvdata(pci
));
5185 pci_set_drvdata(pci
, NULL
);
5188 static struct pci_driver driver
= {
5189 .name
= "RME Hammerfall DSP",
5190 .id_table
= snd_hdsp_ids
,
5191 .probe
= snd_hdsp_probe
,
5192 .remove
= __devexit_p(snd_hdsp_remove
),
5195 static int __init
alsa_card_hdsp_init(void)
5197 return pci_module_init(&driver
);
5200 static void __exit
alsa_card_hdsp_exit(void)
5202 pci_unregister_driver(&driver
);
5205 module_init(alsa_card_hdsp_init
)
5206 module_exit(alsa_card_hdsp_exit
)