1
2
3
4
5
6
7
8
9
10#include <linux/init.h>
11#include <linux/delay.h>
12#include <linux/interrupt.h>
13#include <linux/pci.h>
14#include <linux/firmware.h>
15#include <linux/module.h>
16#include <linux/math64.h>
17#include <linux/vmalloc.h>
18#include <linux/io.h>
19#include <linux/nospec.h>
20
21#include <sound/core.h>
22#include <sound/control.h>
23#include <sound/pcm.h>
24#include <sound/info.h>
25#include <sound/asoundef.h>
26#include <sound/rawmidi.h>
27#include <sound/hwdep.h>
28#include <sound/initval.h>
29#include <sound/hdsp.h>
30
31#include <asm/byteorder.h>
32#include <asm/current.h>
33
34static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
35static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
36static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
37
38module_param_array(index, int, NULL, 0444);
39MODULE_PARM_DESC(index, "Index value for RME Hammerfall DSP interface.");
40module_param_array(id, charp, NULL, 0444);
41MODULE_PARM_DESC(id, "ID string for RME Hammerfall DSP interface.");
42module_param_array(enable, bool, NULL, 0444);
43MODULE_PARM_DESC(enable, "Enable/disable specific Hammerfall DSP soundcards.");
44MODULE_AUTHOR("Paul Davis <paul@linuxaudiosystems.com>, Marcus Andersson, Thomas Charbonnel <thomas@undata.org>");
45MODULE_DESCRIPTION("RME Hammerfall DSP");
46MODULE_LICENSE("GPL");
47MODULE_FIRMWARE("rpm_firmware.bin");
48MODULE_FIRMWARE("multiface_firmware.bin");
49MODULE_FIRMWARE("multiface_firmware_rev11.bin");
50MODULE_FIRMWARE("digiface_firmware.bin");
51MODULE_FIRMWARE("digiface_firmware_rev11.bin");
52
53#define HDSP_MAX_CHANNELS 26
54#define HDSP_MAX_DS_CHANNELS 14
55#define HDSP_MAX_QS_CHANNELS 8
56#define DIGIFACE_SS_CHANNELS 26
57#define DIGIFACE_DS_CHANNELS 14
58#define MULTIFACE_SS_CHANNELS 18
59#define MULTIFACE_DS_CHANNELS 14
60#define H9652_SS_CHANNELS 26
61#define H9652_DS_CHANNELS 14
62
63
64
65#define H9632_SS_CHANNELS 12
66#define H9632_DS_CHANNELS 8
67#define H9632_QS_CHANNELS 4
68#define RPM_CHANNELS 6
69
70
71
72#define HDSP_resetPointer 0
73#define HDSP_freqReg 0
74#define HDSP_outputBufferAddress 32
75#define HDSP_inputBufferAddress 36
76#define HDSP_controlRegister 64
77#define HDSP_interruptConfirmation 96
78#define HDSP_outputEnable 128
79#define HDSP_control2Reg 256
80#define HDSP_midiDataOut0 352
81#define HDSP_midiDataOut1 356
82#define HDSP_fifoData 368
83#define HDSP_inputEnable 384
84
85
86
87
88#define HDSP_statusRegister 0
89#define HDSP_timecode 128
90#define HDSP_status2Register 192
91#define HDSP_midiDataIn0 360
92#define HDSP_midiDataIn1 364
93#define HDSP_midiStatusOut0 384
94#define HDSP_midiStatusOut1 388
95#define HDSP_midiStatusIn0 392
96#define HDSP_midiStatusIn1 396
97#define HDSP_fifoStatus 400
98
99
100
101
102
103
104
105#define HDSP_playbackPeakLevel 4096
106#define HDSP_inputPeakLevel 4224
107#define HDSP_outputPeakLevel 4352
108#define HDSP_playbackRmsLevel 4612
109#define HDSP_inputRmsLevel 4868
110
111
112
113
114
115
116
117
118
119#define HDSP_9652_peakBase 7164
120#define HDSP_9652_rmsBase 4096
121
122
123#define HDSP_9632_metersBase 4096
124
125#define HDSP_IO_EXTENT 7168
126
127
128
129#define HDSP_TMS 0x01
130#define HDSP_TCK 0x02
131#define HDSP_TDI 0x04
132#define HDSP_JTAG 0x08
133#define HDSP_PWDN 0x10
134#define HDSP_PROGRAM 0x020
135#define HDSP_CONFIG_MODE_0 0x040
136#define HDSP_CONFIG_MODE_1 0x080
137#define HDSP_VERSION_BIT (0x100 | HDSP_S_LOAD)
138#define HDSP_BIGENDIAN_MODE 0x200
139#define HDSP_RD_MULTIPLE 0x400
140#define HDSP_9652_ENABLE_MIXER 0x800
141#define HDSP_S200 0x800
142#define HDSP_S300 (0x100 | HDSP_S200)
143#define HDSP_CYCLIC_MODE 0x1000
144#define HDSP_TDO 0x10000000
145
146#define HDSP_S_PROGRAM (HDSP_CYCLIC_MODE|HDSP_PROGRAM|HDSP_CONFIG_MODE_0)
147#define HDSP_S_LOAD (HDSP_CYCLIC_MODE|HDSP_PROGRAM|HDSP_CONFIG_MODE_1)
148
149
150
151#define HDSP_Start (1<<0)
152#define HDSP_Latency0 (1<<1)
153#define HDSP_Latency1 (1<<2)
154#define HDSP_Latency2 (1<<3)
155#define HDSP_ClockModeMaster (1<<4)
156#define HDSP_AudioInterruptEnable (1<<5)
157#define HDSP_Frequency0 (1<<6)
158#define HDSP_Frequency1 (1<<7)
159#define HDSP_DoubleSpeed (1<<8)
160#define HDSP_SPDIFProfessional (1<<9)
161#define HDSP_SPDIFEmphasis (1<<10)
162#define HDSP_SPDIFNonAudio (1<<11)
163#define HDSP_SPDIFOpticalOut (1<<12)
164#define HDSP_SyncRef2 (1<<13)
165#define HDSP_SPDIFInputSelect0 (1<<14)
166#define HDSP_SPDIFInputSelect1 (1<<15)
167#define HDSP_SyncRef0 (1<<16)
168#define HDSP_SyncRef1 (1<<17)
169#define HDSP_AnalogExtensionBoard (1<<18)
170#define HDSP_XLRBreakoutCable (1<<20)
171#define HDSP_Midi0InterruptEnable (1<<22)
172#define HDSP_Midi1InterruptEnable (1<<23)
173#define HDSP_LineOut (1<<24)
174#define HDSP_ADGain0 (1<<25)
175#define HDSP_ADGain1 (1<<26)
176#define HDSP_DAGain0 (1<<27)
177#define HDSP_DAGain1 (1<<28)
178#define HDSP_PhoneGain0 (1<<29)
179#define HDSP_PhoneGain1 (1<<30)
180#define HDSP_QuadSpeed (1<<31)
181
182
183#define HDSP_RPM_Inp12 0x04A00
184#define HDSP_RPM_Inp12_Phon_6dB 0x00800
185#define HDSP_RPM_Inp12_Phon_0dB 0x00000
186#define HDSP_RPM_Inp12_Phon_n6dB 0x04000
187#define HDSP_RPM_Inp12_Line_0dB 0x04200
188#define HDSP_RPM_Inp12_Line_n6dB 0x00200
189
190#define HDSP_RPM_Inp34 0x32000
191#define HDSP_RPM_Inp34_Phon_6dB 0x20000
192#define HDSP_RPM_Inp34_Phon_0dB 0x00000
193#define HDSP_RPM_Inp34_Phon_n6dB 0x02000
194#define HDSP_RPM_Inp34_Line_0dB 0x30000
195#define HDSP_RPM_Inp34_Line_n6dB 0x10000
196
197#define HDSP_RPM_Bypass 0x01000
198
199#define HDSP_RPM_Disconnect 0x00001
200
201#define HDSP_ADGainMask (HDSP_ADGain0|HDSP_ADGain1)
202#define HDSP_ADGainMinus10dBV HDSP_ADGainMask
203#define HDSP_ADGainPlus4dBu (HDSP_ADGain0)
204#define HDSP_ADGainLowGain 0
205
206#define HDSP_DAGainMask (HDSP_DAGain0|HDSP_DAGain1)
207#define HDSP_DAGainHighGain HDSP_DAGainMask
208#define HDSP_DAGainPlus4dBu (HDSP_DAGain0)
209#define HDSP_DAGainMinus10dBV 0
210
211#define HDSP_PhoneGainMask (HDSP_PhoneGain0|HDSP_PhoneGain1)
212#define HDSP_PhoneGain0dB HDSP_PhoneGainMask
213#define HDSP_PhoneGainMinus6dB (HDSP_PhoneGain0)
214#define HDSP_PhoneGainMinus12dB 0
215
216#define HDSP_LatencyMask (HDSP_Latency0|HDSP_Latency1|HDSP_Latency2)
217#define HDSP_FrequencyMask (HDSP_Frequency0|HDSP_Frequency1|HDSP_DoubleSpeed|HDSP_QuadSpeed)
218
219#define HDSP_SPDIFInputMask (HDSP_SPDIFInputSelect0|HDSP_SPDIFInputSelect1)
220#define HDSP_SPDIFInputADAT1 0
221#define HDSP_SPDIFInputCoaxial (HDSP_SPDIFInputSelect0)
222#define HDSP_SPDIFInputCdrom (HDSP_SPDIFInputSelect1)
223#define HDSP_SPDIFInputAES (HDSP_SPDIFInputSelect0|HDSP_SPDIFInputSelect1)
224
225#define HDSP_SyncRefMask (HDSP_SyncRef0|HDSP_SyncRef1|HDSP_SyncRef2)
226#define HDSP_SyncRef_ADAT1 0
227#define HDSP_SyncRef_ADAT2 (HDSP_SyncRef0)
228#define HDSP_SyncRef_ADAT3 (HDSP_SyncRef1)
229#define HDSP_SyncRef_SPDIF (HDSP_SyncRef0|HDSP_SyncRef1)
230#define HDSP_SyncRef_WORD (HDSP_SyncRef2)
231#define HDSP_SyncRef_ADAT_SYNC (HDSP_SyncRef0|HDSP_SyncRef2)
232
233
234
235#define HDSP_CLOCK_SOURCE_AUTOSYNC 0
236#define HDSP_CLOCK_SOURCE_INTERNAL_32KHZ 1
237#define HDSP_CLOCK_SOURCE_INTERNAL_44_1KHZ 2
238#define HDSP_CLOCK_SOURCE_INTERNAL_48KHZ 3
239#define HDSP_CLOCK_SOURCE_INTERNAL_64KHZ 4
240#define HDSP_CLOCK_SOURCE_INTERNAL_88_2KHZ 5
241#define HDSP_CLOCK_SOURCE_INTERNAL_96KHZ 6
242#define HDSP_CLOCK_SOURCE_INTERNAL_128KHZ 7
243#define HDSP_CLOCK_SOURCE_INTERNAL_176_4KHZ 8
244#define HDSP_CLOCK_SOURCE_INTERNAL_192KHZ 9
245
246
247
248#define HDSP_SYNC_FROM_WORD 0
249#define HDSP_SYNC_FROM_SPDIF 1
250#define HDSP_SYNC_FROM_ADAT1 2
251#define HDSP_SYNC_FROM_ADAT_SYNC 3
252#define HDSP_SYNC_FROM_ADAT2 4
253#define HDSP_SYNC_FROM_ADAT3 5
254
255
256
257#define HDSP_SYNC_CHECK_NO_LOCK 0
258#define HDSP_SYNC_CHECK_LOCK 1
259#define HDSP_SYNC_CHECK_SYNC 2
260
261
262
263#define HDSP_AUTOSYNC_FROM_WORD 0
264#define HDSP_AUTOSYNC_FROM_ADAT_SYNC 1
265#define HDSP_AUTOSYNC_FROM_SPDIF 2
266#define HDSP_AUTOSYNC_FROM_NONE 3
267#define HDSP_AUTOSYNC_FROM_ADAT1 4
268#define HDSP_AUTOSYNC_FROM_ADAT2 5
269#define HDSP_AUTOSYNC_FROM_ADAT3 6
270
271
272
273#define HDSP_SPDIFIN_OPTICAL 0
274#define HDSP_SPDIFIN_COAXIAL 1
275#define HDSP_SPDIFIN_INTERNAL 2
276#define HDSP_SPDIFIN_AES 3
277
278#define HDSP_Frequency32KHz HDSP_Frequency0
279#define HDSP_Frequency44_1KHz HDSP_Frequency1
280#define HDSP_Frequency48KHz (HDSP_Frequency1|HDSP_Frequency0)
281#define HDSP_Frequency64KHz (HDSP_DoubleSpeed|HDSP_Frequency0)
282#define HDSP_Frequency88_2KHz (HDSP_DoubleSpeed|HDSP_Frequency1)
283#define HDSP_Frequency96KHz (HDSP_DoubleSpeed|HDSP_Frequency1|HDSP_Frequency0)
284
285#define HDSP_Frequency128KHz (HDSP_QuadSpeed|HDSP_DoubleSpeed|HDSP_Frequency0)
286#define HDSP_Frequency176_4KHz (HDSP_QuadSpeed|HDSP_DoubleSpeed|HDSP_Frequency1)
287#define HDSP_Frequency192KHz (HDSP_QuadSpeed|HDSP_DoubleSpeed|HDSP_Frequency1|HDSP_Frequency0)
288
289
290
291
292#define DDS_NUMERATOR 104857600000000ULL
293
294#define hdsp_encode_latency(x) (((x)<<1) & HDSP_LatencyMask)
295#define hdsp_decode_latency(x) (((x) & HDSP_LatencyMask)>>1)
296
297#define hdsp_encode_spdif_in(x) (((x)&0x3)<<14)
298#define hdsp_decode_spdif_in(x) (((x)>>14)&0x3)
299
300
301
302#define HDSP_audioIRQPending (1<<0)
303#define HDSP_Lock2 (1<<1)
304#define HDSP_spdifFrequency3 HDSP_Lock2
305#define HDSP_Lock1 (1<<2)
306#define HDSP_Lock0 (1<<3)
307#define HDSP_SPDIFSync (1<<4)
308#define HDSP_TimecodeLock (1<<5)
309#define HDSP_BufferPositionMask 0x000FFC0
310#define HDSP_Sync2 (1<<16)
311#define HDSP_Sync1 (1<<17)
312#define HDSP_Sync0 (1<<18)
313#define HDSP_DoubleSpeedStatus (1<<19)
314#define HDSP_ConfigError (1<<20)
315#define HDSP_DllError (1<<21)
316#define HDSP_spdifFrequency0 (1<<22)
317#define HDSP_spdifFrequency1 (1<<23)
318#define HDSP_spdifFrequency2 (1<<24)
319#define HDSP_SPDIFErrorFlag (1<<25)
320#define HDSP_BufferID (1<<26)
321#define HDSP_TimecodeSync (1<<27)
322#define HDSP_AEBO (1<<28)
323#define HDSP_AEBI (1<<29)
324#define HDSP_midi0IRQPending (1<<30)
325#define HDSP_midi1IRQPending (1<<31)
326
327#define HDSP_spdifFrequencyMask (HDSP_spdifFrequency0|HDSP_spdifFrequency1|HDSP_spdifFrequency2)
328#define HDSP_spdifFrequencyMask_9632 (HDSP_spdifFrequency0|\
329 HDSP_spdifFrequency1|\
330 HDSP_spdifFrequency2|\
331 HDSP_spdifFrequency3)
332
333#define HDSP_spdifFrequency32KHz (HDSP_spdifFrequency0)
334#define HDSP_spdifFrequency44_1KHz (HDSP_spdifFrequency1)
335#define HDSP_spdifFrequency48KHz (HDSP_spdifFrequency0|HDSP_spdifFrequency1)
336
337#define HDSP_spdifFrequency64KHz (HDSP_spdifFrequency2)
338#define HDSP_spdifFrequency88_2KHz (HDSP_spdifFrequency0|HDSP_spdifFrequency2)
339#define HDSP_spdifFrequency96KHz (HDSP_spdifFrequency2|HDSP_spdifFrequency1)
340
341
342#define HDSP_spdifFrequency128KHz (HDSP_spdifFrequency0|\
343 HDSP_spdifFrequency1|\
344 HDSP_spdifFrequency2)
345#define HDSP_spdifFrequency176_4KHz HDSP_spdifFrequency3
346#define HDSP_spdifFrequency192KHz (HDSP_spdifFrequency3|HDSP_spdifFrequency0)
347
348
349
350#define HDSP_version0 (1<<0)
351#define HDSP_version1 (1<<1)
352#define HDSP_version2 (1<<2)
353#define HDSP_wc_lock (1<<3)
354#define HDSP_wc_sync (1<<4)
355#define HDSP_inp_freq0 (1<<5)
356#define HDSP_inp_freq1 (1<<6)
357#define HDSP_inp_freq2 (1<<7)
358#define HDSP_SelSyncRef0 (1<<8)
359#define HDSP_SelSyncRef1 (1<<9)
360#define HDSP_SelSyncRef2 (1<<10)
361
362#define HDSP_wc_valid (HDSP_wc_lock|HDSP_wc_sync)
363
364#define HDSP_systemFrequencyMask (HDSP_inp_freq0|HDSP_inp_freq1|HDSP_inp_freq2)
365#define HDSP_systemFrequency32 (HDSP_inp_freq0)
366#define HDSP_systemFrequency44_1 (HDSP_inp_freq1)
367#define HDSP_systemFrequency48 (HDSP_inp_freq0|HDSP_inp_freq1)
368#define HDSP_systemFrequency64 (HDSP_inp_freq2)
369#define HDSP_systemFrequency88_2 (HDSP_inp_freq0|HDSP_inp_freq2)
370#define HDSP_systemFrequency96 (HDSP_inp_freq1|HDSP_inp_freq2)
371
372
373#define HDSP_SelSyncRefMask (HDSP_SelSyncRef0|HDSP_SelSyncRef1|HDSP_SelSyncRef2)
374#define HDSP_SelSyncRef_ADAT1 0
375#define HDSP_SelSyncRef_ADAT2 (HDSP_SelSyncRef0)
376#define HDSP_SelSyncRef_ADAT3 (HDSP_SelSyncRef1)
377#define HDSP_SelSyncRef_SPDIF (HDSP_SelSyncRef0|HDSP_SelSyncRef1)
378#define HDSP_SelSyncRef_WORD (HDSP_SelSyncRef2)
379#define HDSP_SelSyncRef_ADAT_SYNC (HDSP_SelSyncRef0|HDSP_SelSyncRef2)
380
381
382
383#define HDSP_InitializationComplete (1<<0)
384#define HDSP_FirmwareLoaded (1<<1)
385#define HDSP_FirmwareCached (1<<2)
386
387
388
389#define HDSP_LONG_WAIT 5000
390#define HDSP_SHORT_WAIT 30
391
392#define UNITY_GAIN 32768
393#define MINUS_INFINITY_GAIN 0
394
395
396
397#define HDSP_CHANNEL_BUFFER_SAMPLES (16*1024)
398#define HDSP_CHANNEL_BUFFER_BYTES (4*HDSP_CHANNEL_BUFFER_SAMPLES)
399
400
401
402
403
404
405
406
407
408
409#define HDSP_DMA_AREA_BYTES ((HDSP_MAX_CHANNELS+1) * HDSP_CHANNEL_BUFFER_BYTES)
410#define HDSP_DMA_AREA_KILOBYTES (HDSP_DMA_AREA_BYTES/1024)
411
412#define HDSP_FIRMWARE_SIZE (24413 * 4)
413
414struct hdsp_9632_meters {
415 u32 input_peak[16];
416 u32 playback_peak[16];
417 u32 output_peak[16];
418 u32 xxx_peak[16];
419 u32 padding[64];
420 u32 input_rms_low[16];
421 u32 playback_rms_low[16];
422 u32 output_rms_low[16];
423 u32 xxx_rms_low[16];
424 u32 input_rms_high[16];
425 u32 playback_rms_high[16];
426 u32 output_rms_high[16];
427 u32 xxx_rms_high[16];
428};
429
430struct hdsp_midi {
431 struct hdsp *hdsp;
432 int id;
433 struct snd_rawmidi *rmidi;
434 struct snd_rawmidi_substream *input;
435 struct snd_rawmidi_substream *output;
436 char istimer;
437 struct timer_list timer;
438 spinlock_t lock;
439 int pending;
440};
441
442struct hdsp {
443 spinlock_t lock;
444 struct snd_pcm_substream *capture_substream;
445 struct snd_pcm_substream *playback_substream;
446 struct hdsp_midi midi[2];
447 struct work_struct midi_work;
448 int use_midi_work;
449 int precise_ptr;
450 u32 control_register;
451 u32 control2_register;
452 u32 creg_spdif;
453 u32 creg_spdif_stream;
454 int clock_source_locked;
455 char *card_name;
456 enum HDSP_IO_Type io_type;
457 unsigned short firmware_rev;
458 unsigned short state;
459 const struct firmware *firmware;
460 u32 *fw_uploaded;
461 size_t period_bytes;
462 unsigned char max_channels;
463 unsigned char qs_in_channels;
464 unsigned char ds_in_channels;
465 unsigned char ss_in_channels;
466 unsigned char qs_out_channels;
467 unsigned char ds_out_channels;
468 unsigned char ss_out_channels;
469 u32 io_loopback;
470
471 struct snd_dma_buffer capture_dma_buf;
472 struct snd_dma_buffer playback_dma_buf;
473 unsigned char *capture_buffer;
474 unsigned char *playback_buffer;
475
476 pid_t capture_pid;
477 pid_t playback_pid;
478 int running;
479 int system_sample_rate;
480 const char *channel_map;
481 int dev;
482 int irq;
483 unsigned long port;
484 void __iomem *iobase;
485 struct snd_card *card;
486 struct snd_pcm *pcm;
487 struct snd_hwdep *hwdep;
488 struct pci_dev *pci;
489 struct snd_kcontrol *spdif_ctl;
490 unsigned short mixer_matrix[HDSP_MATRIX_MIXER_SIZE];
491 unsigned int dds_value;
492};
493
494
495
496
497
498
499
500
501
502static const char channel_map_df_ss[HDSP_MAX_CHANNELS] = {
503 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
504 18, 19, 20, 21, 22, 23, 24, 25
505};
506
507static const char channel_map_mf_ss[HDSP_MAX_CHANNELS] = {
508
509 0, 1, 2, 3, 4, 5, 6, 7,
510
511 16, 17, 18, 19, 20, 21, 22, 23,
512
513 24, 25,
514 -1, -1, -1, -1, -1, -1, -1, -1
515};
516
517static const char channel_map_ds[HDSP_MAX_CHANNELS] = {
518
519 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23,
520
521 24, 25,
522
523 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
524};
525
526static const char channel_map_H9632_ss[HDSP_MAX_CHANNELS] = {
527
528 0, 1, 2, 3, 4, 5, 6, 7,
529
530 8, 9,
531
532 10, 11,
533
534 12, 13, 14, 15,
535
536 -1, -1, -1, -1, -1, -1, -1, -1,
537 -1, -1
538};
539
540static const char channel_map_H9632_ds[HDSP_MAX_CHANNELS] = {
541
542 1, 3, 5, 7,
543
544 8, 9,
545
546 10, 11,
547
548 12, 13, 14, 15,
549
550 -1, -1, -1, -1, -1, -1, -1, -1,
551 -1, -1, -1, -1, -1, -1
552};
553
554static const char channel_map_H9632_qs[HDSP_MAX_CHANNELS] = {
555
556
557 8, 9,
558
559 10, 11,
560
561 12, 13, 14, 15,
562
563 -1, -1, -1, -1, -1, -1, -1, -1,
564 -1, -1, -1, -1, -1, -1, -1, -1,
565 -1, -1
566};
567
568static int snd_hammerfall_get_buffer(struct pci_dev *pci, struct snd_dma_buffer *dmab, size_t size)
569{
570 return snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev, size, dmab);
571}
572
573static void snd_hammerfall_free_buffer(struct snd_dma_buffer *dmab, struct pci_dev *pci)
574{
575 if (dmab->area)
576 snd_dma_free_pages(dmab);
577}
578
579
580static const struct pci_device_id snd_hdsp_ids[] = {
581 {
582 .vendor = PCI_VENDOR_ID_XILINX,
583 .device = PCI_DEVICE_ID_XILINX_HAMMERFALL_DSP,
584 .subvendor = PCI_ANY_ID,
585 .subdevice = PCI_ANY_ID,
586 },
587 { 0, },
588};
589
590MODULE_DEVICE_TABLE(pci, snd_hdsp_ids);
591
592
593static int snd_hdsp_create_alsa_devices(struct snd_card *card, struct hdsp *hdsp);
594static int snd_hdsp_create_pcm(struct snd_card *card, struct hdsp *hdsp);
595static int snd_hdsp_enable_io (struct hdsp *hdsp);
596static void snd_hdsp_initialize_midi_flush (struct hdsp *hdsp);
597static void snd_hdsp_initialize_channels (struct hdsp *hdsp);
598static int hdsp_fifo_wait(struct hdsp *hdsp, int count, int timeout);
599static int hdsp_autosync_ref(struct hdsp *hdsp);
600static int snd_hdsp_set_defaults(struct hdsp *hdsp);
601static void snd_hdsp_9652_enable_mixer (struct hdsp *hdsp);
602
603static int hdsp_playback_to_output_key (struct hdsp *hdsp, int in, int out)
604{
605 switch (hdsp->io_type) {
606 case Multiface:
607 case Digiface:
608 case RPM:
609 default:
610 if (hdsp->firmware_rev == 0xa)
611 return (64 * out) + (32 + (in));
612 else
613 return (52 * out) + (26 + (in));
614 case H9632:
615 return (32 * out) + (16 + (in));
616 case H9652:
617 return (52 * out) + (26 + (in));
618 }
619}
620
621static int hdsp_input_to_output_key (struct hdsp *hdsp, int in, int out)
622{
623 switch (hdsp->io_type) {
624 case Multiface:
625 case Digiface:
626 case RPM:
627 default:
628 if (hdsp->firmware_rev == 0xa)
629 return (64 * out) + in;
630 else
631 return (52 * out) + in;
632 case H9632:
633 return (32 * out) + in;
634 case H9652:
635 return (52 * out) + in;
636 }
637}
638
639static void hdsp_write(struct hdsp *hdsp, int reg, int val)
640{
641 writel(val, hdsp->iobase + reg);
642}
643
644static unsigned int hdsp_read(struct hdsp *hdsp, int reg)
645{
646 return readl (hdsp->iobase + reg);
647}
648
649static int hdsp_check_for_iobox (struct hdsp *hdsp)
650{
651 int i;
652
653 if (hdsp->io_type == H9652 || hdsp->io_type == H9632) return 0;
654 for (i = 0; i < 500; i++) {
655 if (0 == (hdsp_read(hdsp, HDSP_statusRegister) &
656 HDSP_ConfigError)) {
657 if (i) {
658 dev_dbg(hdsp->card->dev,
659 "IO box found after %d ms\n",
660 (20 * i));
661 }
662 return 0;
663 }
664 msleep(20);
665 }
666 dev_err(hdsp->card->dev, "no IO box connected!\n");
667 hdsp->state &= ~HDSP_FirmwareLoaded;
668 return -EIO;
669}
670
671static int hdsp_wait_for_iobox(struct hdsp *hdsp, unsigned int loops,
672 unsigned int delay)
673{
674 unsigned int i;
675
676 if (hdsp->io_type == H9652 || hdsp->io_type == H9632)
677 return 0;
678
679 for (i = 0; i != loops; ++i) {
680 if (hdsp_read(hdsp, HDSP_statusRegister) & HDSP_ConfigError)
681 msleep(delay);
682 else {
683 dev_dbg(hdsp->card->dev, "iobox found after %ums!\n",
684 i * delay);
685 return 0;
686 }
687 }
688
689 dev_info(hdsp->card->dev, "no IO box connected!\n");
690 hdsp->state &= ~HDSP_FirmwareLoaded;
691 return -EIO;
692}
693
694static int snd_hdsp_load_firmware_from_cache(struct hdsp *hdsp) {
695
696 int i;
697 unsigned long flags;
698 const u32 *cache;
699
700 if (hdsp->fw_uploaded)
701 cache = hdsp->fw_uploaded;
702 else {
703 if (!hdsp->firmware)
704 return -ENODEV;
705 cache = (u32 *)hdsp->firmware->data;
706 if (!cache)
707 return -ENODEV;
708 }
709
710 if ((hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DllError) != 0) {
711
712 dev_info(hdsp->card->dev, "loading firmware\n");
713
714 hdsp_write (hdsp, HDSP_control2Reg, HDSP_S_PROGRAM);
715 hdsp_write (hdsp, HDSP_fifoData, 0);
716
717 if (hdsp_fifo_wait (hdsp, 0, HDSP_LONG_WAIT)) {
718 dev_info(hdsp->card->dev,
719 "timeout waiting for download preparation\n");
720 hdsp_write(hdsp, HDSP_control2Reg, HDSP_S200);
721 return -EIO;
722 }
723
724 hdsp_write (hdsp, HDSP_control2Reg, HDSP_S_LOAD);
725
726 for (i = 0; i < HDSP_FIRMWARE_SIZE / 4; ++i) {
727 hdsp_write(hdsp, HDSP_fifoData, cache[i]);
728 if (hdsp_fifo_wait (hdsp, 127, HDSP_LONG_WAIT)) {
729 dev_info(hdsp->card->dev,
730 "timeout during firmware loading\n");
731 hdsp_write(hdsp, HDSP_control2Reg, HDSP_S200);
732 return -EIO;
733 }
734 }
735
736 hdsp_fifo_wait(hdsp, 3, HDSP_LONG_WAIT);
737 hdsp_write(hdsp, HDSP_control2Reg, HDSP_S200);
738
739 ssleep(3);
740#ifdef SNDRV_BIG_ENDIAN
741 hdsp->control2_register = HDSP_BIGENDIAN_MODE;
742#else
743 hdsp->control2_register = 0;
744#endif
745 hdsp_write (hdsp, HDSP_control2Reg, hdsp->control2_register);
746 dev_info(hdsp->card->dev, "finished firmware loading\n");
747
748 }
749 if (hdsp->state & HDSP_InitializationComplete) {
750 dev_info(hdsp->card->dev,
751 "firmware loaded from cache, restoring defaults\n");
752 spin_lock_irqsave(&hdsp->lock, flags);
753 snd_hdsp_set_defaults(hdsp);
754 spin_unlock_irqrestore(&hdsp->lock, flags);
755 }
756
757 hdsp->state |= HDSP_FirmwareLoaded;
758
759 return 0;
760}
761
762static int hdsp_get_iobox_version (struct hdsp *hdsp)
763{
764 if ((hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DllError) != 0) {
765
766 hdsp_write(hdsp, HDSP_control2Reg, HDSP_S_LOAD);
767 hdsp_write(hdsp, HDSP_fifoData, 0);
768
769 if (hdsp_fifo_wait(hdsp, 0, HDSP_SHORT_WAIT) < 0) {
770 hdsp_write(hdsp, HDSP_control2Reg, HDSP_S300);
771 hdsp_write(hdsp, HDSP_control2Reg, HDSP_S_LOAD);
772 }
773
774 hdsp_write(hdsp, HDSP_control2Reg, HDSP_S200 | HDSP_PROGRAM);
775 hdsp_write (hdsp, HDSP_fifoData, 0);
776 if (hdsp_fifo_wait(hdsp, 0, HDSP_SHORT_WAIT) < 0)
777 goto set_multi;
778
779 hdsp_write(hdsp, HDSP_control2Reg, HDSP_S_LOAD);
780 hdsp_write(hdsp, HDSP_fifoData, 0);
781 if (hdsp_fifo_wait(hdsp, 0, HDSP_SHORT_WAIT) == 0) {
782 hdsp->io_type = Digiface;
783 dev_info(hdsp->card->dev, "Digiface found\n");
784 return 0;
785 }
786
787 hdsp_write(hdsp, HDSP_control2Reg, HDSP_S300);
788 hdsp_write(hdsp, HDSP_control2Reg, HDSP_S_LOAD);
789 hdsp_write(hdsp, HDSP_fifoData, 0);
790 if (hdsp_fifo_wait(hdsp, 0, HDSP_SHORT_WAIT) == 0)
791 goto set_multi;
792
793 hdsp_write(hdsp, HDSP_control2Reg, HDSP_S300);
794 hdsp_write(hdsp, HDSP_control2Reg, HDSP_S_LOAD);
795 hdsp_write(hdsp, HDSP_fifoData, 0);
796 if (hdsp_fifo_wait(hdsp, 0, HDSP_SHORT_WAIT) < 0)
797 goto set_multi;
798
799 hdsp->io_type = RPM;
800 dev_info(hdsp->card->dev, "RPM found\n");
801 return 0;
802 } else {
803
804 if (hdsp_read(hdsp, HDSP_status2Register) & HDSP_version2)
805 hdsp->io_type = RPM;
806 else if (hdsp_read(hdsp, HDSP_status2Register) & HDSP_version1)
807 hdsp->io_type = Multiface;
808 else
809 hdsp->io_type = Digiface;
810 }
811 return 0;
812
813set_multi:
814 hdsp->io_type = Multiface;
815 dev_info(hdsp->card->dev, "Multiface found\n");
816 return 0;
817}
818
819
820static int hdsp_request_fw_loader(struct hdsp *hdsp);
821
822static int hdsp_check_for_firmware (struct hdsp *hdsp, int load_on_demand)
823{
824 if (hdsp->io_type == H9652 || hdsp->io_type == H9632)
825 return 0;
826 if ((hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DllError) != 0) {
827 hdsp->state &= ~HDSP_FirmwareLoaded;
828 if (! load_on_demand)
829 return -EIO;
830 dev_err(hdsp->card->dev, "firmware not present.\n");
831
832 if (! (hdsp->state & HDSP_FirmwareCached)) {
833 if (! hdsp_request_fw_loader(hdsp))
834 return 0;
835 dev_err(hdsp->card->dev,
836 "No firmware loaded nor cached, please upload firmware.\n");
837 return -EIO;
838 }
839 if (snd_hdsp_load_firmware_from_cache(hdsp) != 0) {
840 dev_err(hdsp->card->dev,
841 "Firmware loading from cache failed, please upload manually.\n");
842 return -EIO;
843 }
844 }
845 return 0;
846}
847
848
849static int hdsp_fifo_wait(struct hdsp *hdsp, int count, int timeout)
850{
851 int i;
852
853
854
855
856
857 for (i = 0; i < timeout; i++) {
858
859 if ((int)(hdsp_read (hdsp, HDSP_fifoStatus) & 0xff) <= count)
860 return 0;
861
862
863
864
865
866 udelay (100);
867 }
868
869 dev_warn(hdsp->card->dev,
870 "wait for FIFO status <= %d failed after %d iterations\n",
871 count, timeout);
872 return -1;
873}
874
875static int hdsp_read_gain (struct hdsp *hdsp, unsigned int addr)
876{
877 if (addr >= HDSP_MATRIX_MIXER_SIZE)
878 return 0;
879
880 return hdsp->mixer_matrix[addr];
881}
882
883static int hdsp_write_gain(struct hdsp *hdsp, unsigned int addr, unsigned short data)
884{
885 unsigned int ad;
886
887 if (addr >= HDSP_MATRIX_MIXER_SIZE)
888 return -1;
889
890 if (hdsp->io_type == H9652 || hdsp->io_type == H9632) {
891
892
893
894
895
896
897
898
899
900
901
902
903
904 if (hdsp->io_type == H9632 && addr >= 512)
905 return 0;
906
907 if (hdsp->io_type == H9652 && addr >= 1352)
908 return 0;
909
910 hdsp->mixer_matrix[addr] = data;
911
912
913
914
915
916
917
918
919
920 ad = addr/2;
921
922 hdsp_write (hdsp, 4096 + (ad*4),
923 (hdsp->mixer_matrix[(addr&0x7fe)+1] << 16) +
924 hdsp->mixer_matrix[addr&0x7fe]);
925
926 return 0;
927
928 } else {
929
930 ad = (addr << 16) + data;
931
932 if (hdsp_fifo_wait(hdsp, 127, HDSP_LONG_WAIT))
933 return -1;
934
935 hdsp_write (hdsp, HDSP_fifoData, ad);
936 hdsp->mixer_matrix[addr] = data;
937
938 }
939
940 return 0;
941}
942
943static int snd_hdsp_use_is_exclusive(struct hdsp *hdsp)
944{
945 unsigned long flags;
946 int ret = 1;
947
948 spin_lock_irqsave(&hdsp->lock, flags);
949 if ((hdsp->playback_pid != hdsp->capture_pid) &&
950 (hdsp->playback_pid >= 0) && (hdsp->capture_pid >= 0))
951 ret = 0;
952 spin_unlock_irqrestore(&hdsp->lock, flags);
953 return ret;
954}
955
956static int hdsp_spdif_sample_rate(struct hdsp *hdsp)
957{
958 unsigned int status = hdsp_read(hdsp, HDSP_statusRegister);
959 unsigned int rate_bits = (status & HDSP_spdifFrequencyMask);
960
961
962 if (hdsp->io_type == H9632)
963 rate_bits = (status & HDSP_spdifFrequencyMask_9632);
964
965 if (status & HDSP_SPDIFErrorFlag)
966 return 0;
967
968 switch (rate_bits) {
969 case HDSP_spdifFrequency32KHz: return 32000;
970 case HDSP_spdifFrequency44_1KHz: return 44100;
971 case HDSP_spdifFrequency48KHz: return 48000;
972 case HDSP_spdifFrequency64KHz: return 64000;
973 case HDSP_spdifFrequency88_2KHz: return 88200;
974 case HDSP_spdifFrequency96KHz: return 96000;
975 case HDSP_spdifFrequency128KHz:
976 if (hdsp->io_type == H9632) return 128000;
977 break;
978 case HDSP_spdifFrequency176_4KHz:
979 if (hdsp->io_type == H9632) return 176400;
980 break;
981 case HDSP_spdifFrequency192KHz:
982 if (hdsp->io_type == H9632) return 192000;
983 break;
984 default:
985 break;
986 }
987 dev_warn(hdsp->card->dev,
988 "unknown spdif frequency status; bits = 0x%x, status = 0x%x\n",
989 rate_bits, status);
990 return 0;
991}
992
993static int hdsp_external_sample_rate(struct hdsp *hdsp)
994{
995 unsigned int status2 = hdsp_read(hdsp, HDSP_status2Register);
996 unsigned int rate_bits = status2 & HDSP_systemFrequencyMask;
997
998
999
1000
1001
1002 if (hdsp->io_type == H9632 &&
1003 hdsp_autosync_ref(hdsp) == HDSP_AUTOSYNC_FROM_SPDIF)
1004 return hdsp_spdif_sample_rate(hdsp);
1005
1006 switch (rate_bits) {
1007 case HDSP_systemFrequency32: return 32000;
1008 case HDSP_systemFrequency44_1: return 44100;
1009 case HDSP_systemFrequency48: return 48000;
1010 case HDSP_systemFrequency64: return 64000;
1011 case HDSP_systemFrequency88_2: return 88200;
1012 case HDSP_systemFrequency96: return 96000;
1013 default:
1014 return 0;
1015 }
1016}
1017
1018static void hdsp_compute_period_size(struct hdsp *hdsp)
1019{
1020 hdsp->period_bytes = 1 << ((hdsp_decode_latency(hdsp->control_register) + 8));
1021}
1022
1023static snd_pcm_uframes_t hdsp_hw_pointer(struct hdsp *hdsp)
1024{
1025 int position;
1026
1027 position = hdsp_read(hdsp, HDSP_statusRegister);
1028
1029 if (!hdsp->precise_ptr)
1030 return (position & HDSP_BufferID) ? (hdsp->period_bytes / 4) : 0;
1031
1032 position &= HDSP_BufferPositionMask;
1033 position /= 4;
1034 position &= (hdsp->period_bytes/2) - 1;
1035 return position;
1036}
1037
1038static void hdsp_reset_hw_pointer(struct hdsp *hdsp)
1039{
1040 hdsp_write (hdsp, HDSP_resetPointer, 0);
1041 if (hdsp->io_type == H9632 && hdsp->firmware_rev >= 152)
1042
1043
1044
1045 hdsp_write (hdsp, HDSP_freqReg, hdsp->dds_value);
1046}
1047
1048static void hdsp_start_audio(struct hdsp *s)
1049{
1050 s->control_register |= (HDSP_AudioInterruptEnable | HDSP_Start);
1051 hdsp_write(s, HDSP_controlRegister, s->control_register);
1052}
1053
1054static void hdsp_stop_audio(struct hdsp *s)
1055{
1056 s->control_register &= ~(HDSP_Start | HDSP_AudioInterruptEnable);
1057 hdsp_write(s, HDSP_controlRegister, s->control_register);
1058}
1059
1060static void hdsp_silence_playback(struct hdsp *hdsp)
1061{
1062 memset(hdsp->playback_buffer, 0, HDSP_DMA_AREA_BYTES);
1063}
1064
1065static int hdsp_set_interrupt_interval(struct hdsp *s, unsigned int frames)
1066{
1067 int n;
1068
1069 spin_lock_irq(&s->lock);
1070
1071 frames >>= 7;
1072 n = 0;
1073 while (frames) {
1074 n++;
1075 frames >>= 1;
1076 }
1077
1078 s->control_register &= ~HDSP_LatencyMask;
1079 s->control_register |= hdsp_encode_latency(n);
1080
1081 hdsp_write(s, HDSP_controlRegister, s->control_register);
1082
1083 hdsp_compute_period_size(s);
1084
1085 spin_unlock_irq(&s->lock);
1086
1087 return 0;
1088}
1089
1090static void hdsp_set_dds_value(struct hdsp *hdsp, int rate)
1091{
1092 u64 n;
1093
1094 if (rate >= 112000)
1095 rate /= 4;
1096 else if (rate >= 56000)
1097 rate /= 2;
1098
1099 n = DDS_NUMERATOR;
1100 n = div_u64(n, rate);
1101
1102 snd_BUG_ON(n >> 32);
1103
1104
1105 hdsp->dds_value = n;
1106 hdsp_write(hdsp, HDSP_freqReg, hdsp->dds_value);
1107}
1108
1109static int hdsp_set_rate(struct hdsp *hdsp, int rate, int called_internally)
1110{
1111 int reject_if_open = 0;
1112 int current_rate;
1113 int rate_bits;
1114
1115
1116
1117
1118
1119
1120 if (!(hdsp->control_register & HDSP_ClockModeMaster)) {
1121 if (called_internally) {
1122
1123 dev_err(hdsp->card->dev,
1124 "device is not running as a clock master: cannot set sample rate.\n");
1125 return -1;
1126 } else {
1127
1128 int external_freq = hdsp_external_sample_rate(hdsp);
1129 int spdif_freq = hdsp_spdif_sample_rate(hdsp);
1130
1131 if ((spdif_freq == external_freq*2) && (hdsp_autosync_ref(hdsp) >= HDSP_AUTOSYNC_FROM_ADAT1))
1132 dev_info(hdsp->card->dev,
1133 "Detected ADAT in double speed mode\n");
1134 else if (hdsp->io_type == H9632 && (spdif_freq == external_freq*4) && (hdsp_autosync_ref(hdsp) >= HDSP_AUTOSYNC_FROM_ADAT1))
1135 dev_info(hdsp->card->dev,
1136 "Detected ADAT in quad speed mode\n");
1137 else if (rate != external_freq) {
1138 dev_info(hdsp->card->dev,
1139 "No AutoSync source for requested rate\n");
1140 return -1;
1141 }
1142 }
1143 }
1144
1145 current_rate = hdsp->system_sample_rate;
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157 if (rate > 96000 && hdsp->io_type != H9632)
1158 return -EINVAL;
1159
1160 switch (rate) {
1161 case 32000:
1162 if (current_rate > 48000)
1163 reject_if_open = 1;
1164 rate_bits = HDSP_Frequency32KHz;
1165 break;
1166 case 44100:
1167 if (current_rate > 48000)
1168 reject_if_open = 1;
1169 rate_bits = HDSP_Frequency44_1KHz;
1170 break;
1171 case 48000:
1172 if (current_rate > 48000)
1173 reject_if_open = 1;
1174 rate_bits = HDSP_Frequency48KHz;
1175 break;
1176 case 64000:
1177 if (current_rate <= 48000 || current_rate > 96000)
1178 reject_if_open = 1;
1179 rate_bits = HDSP_Frequency64KHz;
1180 break;
1181 case 88200:
1182 if (current_rate <= 48000 || current_rate > 96000)
1183 reject_if_open = 1;
1184 rate_bits = HDSP_Frequency88_2KHz;
1185 break;
1186 case 96000:
1187 if (current_rate <= 48000 || current_rate > 96000)
1188 reject_if_open = 1;
1189 rate_bits = HDSP_Frequency96KHz;
1190 break;
1191 case 128000:
1192 if (current_rate < 128000)
1193 reject_if_open = 1;
1194 rate_bits = HDSP_Frequency128KHz;
1195 break;
1196 case 176400:
1197 if (current_rate < 128000)
1198 reject_if_open = 1;
1199 rate_bits = HDSP_Frequency176_4KHz;
1200 break;
1201 case 192000:
1202 if (current_rate < 128000)
1203 reject_if_open = 1;
1204 rate_bits = HDSP_Frequency192KHz;
1205 break;
1206 default:
1207 return -EINVAL;
1208 }
1209
1210 if (reject_if_open && (hdsp->capture_pid >= 0 || hdsp->playback_pid >= 0)) {
1211 dev_warn(hdsp->card->dev,
1212 "cannot change speed mode (capture PID = %d, playback PID = %d)\n",
1213 hdsp->capture_pid,
1214 hdsp->playback_pid);
1215 return -EBUSY;
1216 }
1217
1218 hdsp->control_register &= ~HDSP_FrequencyMask;
1219 hdsp->control_register |= rate_bits;
1220 hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
1221
1222
1223 if (hdsp->io_type == H9632 && hdsp->firmware_rev >= 152)
1224 hdsp_set_dds_value(hdsp, rate);
1225
1226 if (rate >= 128000) {
1227 hdsp->channel_map = channel_map_H9632_qs;
1228 } else if (rate > 48000) {
1229 if (hdsp->io_type == H9632)
1230 hdsp->channel_map = channel_map_H9632_ds;
1231 else
1232 hdsp->channel_map = channel_map_ds;
1233 } else {
1234 switch (hdsp->io_type) {
1235 case RPM:
1236 case Multiface:
1237 hdsp->channel_map = channel_map_mf_ss;
1238 break;
1239 case Digiface:
1240 case H9652:
1241 hdsp->channel_map = channel_map_df_ss;
1242 break;
1243 case H9632:
1244 hdsp->channel_map = channel_map_H9632_ss;
1245 break;
1246 default:
1247
1248 break;
1249 }
1250 }
1251
1252 hdsp->system_sample_rate = rate;
1253
1254 return 0;
1255}
1256
1257
1258
1259
1260
1261static unsigned char snd_hdsp_midi_read_byte (struct hdsp *hdsp, int id)
1262{
1263
1264 if (id)
1265 return hdsp_read(hdsp, HDSP_midiDataIn1);
1266 else
1267 return hdsp_read(hdsp, HDSP_midiDataIn0);
1268}
1269
1270static void snd_hdsp_midi_write_byte (struct hdsp *hdsp, int id, int val)
1271{
1272
1273 if (id)
1274 hdsp_write(hdsp, HDSP_midiDataOut1, val);
1275 else
1276 hdsp_write(hdsp, HDSP_midiDataOut0, val);
1277}
1278
1279static int snd_hdsp_midi_input_available (struct hdsp *hdsp, int id)
1280{
1281 if (id)
1282 return (hdsp_read(hdsp, HDSP_midiStatusIn1) & 0xff);
1283 else
1284 return (hdsp_read(hdsp, HDSP_midiStatusIn0) & 0xff);
1285}
1286
1287static int snd_hdsp_midi_output_possible (struct hdsp *hdsp, int id)
1288{
1289 int fifo_bytes_used;
1290
1291 if (id)
1292 fifo_bytes_used = hdsp_read(hdsp, HDSP_midiStatusOut1) & 0xff;
1293 else
1294 fifo_bytes_used = hdsp_read(hdsp, HDSP_midiStatusOut0) & 0xff;
1295
1296 if (fifo_bytes_used < 128)
1297 return 128 - fifo_bytes_used;
1298 else
1299 return 0;
1300}
1301
1302static void snd_hdsp_flush_midi_input (struct hdsp *hdsp, int id)
1303{
1304 while (snd_hdsp_midi_input_available (hdsp, id))
1305 snd_hdsp_midi_read_byte (hdsp, id);
1306}
1307
1308static int snd_hdsp_midi_output_write (struct hdsp_midi *hmidi)
1309{
1310 unsigned long flags;
1311 int n_pending;
1312 int to_write;
1313 int i;
1314 unsigned char buf[128];
1315
1316
1317
1318 spin_lock_irqsave (&hmidi->lock, flags);
1319 if (hmidi->output) {
1320 if (!snd_rawmidi_transmit_empty (hmidi->output)) {
1321 n_pending = snd_hdsp_midi_output_possible(hmidi->hdsp, hmidi->id);
1322 if (n_pending > 0) {
1323 if (n_pending > (int)sizeof (buf))
1324 n_pending = sizeof (buf);
1325
1326 to_write = snd_rawmidi_transmit(hmidi->output, buf, n_pending);
1327 if (to_write > 0) {
1328 for (i = 0; i < to_write; ++i)
1329 snd_hdsp_midi_write_byte (hmidi->hdsp, hmidi->id, buf[i]);
1330 }
1331 }
1332 }
1333 }
1334 spin_unlock_irqrestore (&hmidi->lock, flags);
1335 return 0;
1336}
1337
1338static int snd_hdsp_midi_input_read (struct hdsp_midi *hmidi)
1339{
1340 unsigned char buf[128];
1341 unsigned long flags;
1342 int n_pending;
1343 int i;
1344
1345 spin_lock_irqsave (&hmidi->lock, flags);
1346 n_pending = snd_hdsp_midi_input_available(hmidi->hdsp, hmidi->id);
1347 if (n_pending > 0) {
1348 if (hmidi->input) {
1349 if (n_pending > (int)sizeof (buf))
1350 n_pending = sizeof (buf);
1351 for (i = 0; i < n_pending; ++i)
1352 buf[i] = snd_hdsp_midi_read_byte (hmidi->hdsp, hmidi->id);
1353 if (n_pending)
1354 snd_rawmidi_receive (hmidi->input, buf, n_pending);
1355 } else {
1356
1357 while (--n_pending)
1358 snd_hdsp_midi_read_byte (hmidi->hdsp, hmidi->id);
1359 }
1360 }
1361 hmidi->pending = 0;
1362 if (hmidi->id)
1363 hmidi->hdsp->control_register |= HDSP_Midi1InterruptEnable;
1364 else
1365 hmidi->hdsp->control_register |= HDSP_Midi0InterruptEnable;
1366 hdsp_write(hmidi->hdsp, HDSP_controlRegister, hmidi->hdsp->control_register);
1367 spin_unlock_irqrestore (&hmidi->lock, flags);
1368 return snd_hdsp_midi_output_write (hmidi);
1369}
1370
1371static void snd_hdsp_midi_input_trigger(struct snd_rawmidi_substream *substream, int up)
1372{
1373 struct hdsp *hdsp;
1374 struct hdsp_midi *hmidi;
1375 unsigned long flags;
1376 u32 ie;
1377
1378 hmidi = (struct hdsp_midi *) substream->rmidi->private_data;
1379 hdsp = hmidi->hdsp;
1380 ie = hmidi->id ? HDSP_Midi1InterruptEnable : HDSP_Midi0InterruptEnable;
1381 spin_lock_irqsave (&hdsp->lock, flags);
1382 if (up) {
1383 if (!(hdsp->control_register & ie)) {
1384 snd_hdsp_flush_midi_input (hdsp, hmidi->id);
1385 hdsp->control_register |= ie;
1386 }
1387 } else {
1388 hdsp->control_register &= ~ie;
1389 }
1390
1391 hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
1392 spin_unlock_irqrestore (&hdsp->lock, flags);
1393}
1394
1395static void snd_hdsp_midi_output_timer(struct timer_list *t)
1396{
1397 struct hdsp_midi *hmidi = from_timer(hmidi, t, timer);
1398 unsigned long flags;
1399
1400 snd_hdsp_midi_output_write(hmidi);
1401 spin_lock_irqsave (&hmidi->lock, flags);
1402
1403
1404
1405
1406
1407
1408
1409 if (hmidi->istimer)
1410 mod_timer(&hmidi->timer, 1 + jiffies);
1411
1412 spin_unlock_irqrestore (&hmidi->lock, flags);
1413}
1414
1415static void snd_hdsp_midi_output_trigger(struct snd_rawmidi_substream *substream, int up)
1416{
1417 struct hdsp_midi *hmidi;
1418 unsigned long flags;
1419
1420 hmidi = (struct hdsp_midi *) substream->rmidi->private_data;
1421 spin_lock_irqsave (&hmidi->lock, flags);
1422 if (up) {
1423 if (!hmidi->istimer) {
1424 timer_setup(&hmidi->timer, snd_hdsp_midi_output_timer,
1425 0);
1426 mod_timer(&hmidi->timer, 1 + jiffies);
1427 hmidi->istimer++;
1428 }
1429 } else {
1430 if (hmidi->istimer && --hmidi->istimer <= 0)
1431 del_timer (&hmidi->timer);
1432 }
1433 spin_unlock_irqrestore (&hmidi->lock, flags);
1434 if (up)
1435 snd_hdsp_midi_output_write(hmidi);
1436}
1437
1438static int snd_hdsp_midi_input_open(struct snd_rawmidi_substream *substream)
1439{
1440 struct hdsp_midi *hmidi;
1441
1442 hmidi = (struct hdsp_midi *) substream->rmidi->private_data;
1443 spin_lock_irq (&hmidi->lock);
1444 snd_hdsp_flush_midi_input (hmidi->hdsp, hmidi->id);
1445 hmidi->input = substream;
1446 spin_unlock_irq (&hmidi->lock);
1447
1448 return 0;
1449}
1450
1451static int snd_hdsp_midi_output_open(struct snd_rawmidi_substream *substream)
1452{
1453 struct hdsp_midi *hmidi;
1454
1455 hmidi = (struct hdsp_midi *) substream->rmidi->private_data;
1456 spin_lock_irq (&hmidi->lock);
1457 hmidi->output = substream;
1458 spin_unlock_irq (&hmidi->lock);
1459
1460 return 0;
1461}
1462
1463static int snd_hdsp_midi_input_close(struct snd_rawmidi_substream *substream)
1464{
1465 struct hdsp_midi *hmidi;
1466
1467 snd_hdsp_midi_input_trigger (substream, 0);
1468
1469 hmidi = (struct hdsp_midi *) substream->rmidi->private_data;
1470 spin_lock_irq (&hmidi->lock);
1471 hmidi->input = NULL;
1472 spin_unlock_irq (&hmidi->lock);
1473
1474 return 0;
1475}
1476
1477static int snd_hdsp_midi_output_close(struct snd_rawmidi_substream *substream)
1478{
1479 struct hdsp_midi *hmidi;
1480
1481 snd_hdsp_midi_output_trigger (substream, 0);
1482
1483 hmidi = (struct hdsp_midi *) substream->rmidi->private_data;
1484 spin_lock_irq (&hmidi->lock);
1485 hmidi->output = NULL;
1486 spin_unlock_irq (&hmidi->lock);
1487
1488 return 0;
1489}
1490
1491static const struct snd_rawmidi_ops snd_hdsp_midi_output =
1492{
1493 .open = snd_hdsp_midi_output_open,
1494 .close = snd_hdsp_midi_output_close,
1495 .trigger = snd_hdsp_midi_output_trigger,
1496};
1497
1498static const struct snd_rawmidi_ops snd_hdsp_midi_input =
1499{
1500 .open = snd_hdsp_midi_input_open,
1501 .close = snd_hdsp_midi_input_close,
1502 .trigger = snd_hdsp_midi_input_trigger,
1503};
1504
1505static int snd_hdsp_create_midi (struct snd_card *card, struct hdsp *hdsp, int id)
1506{
1507 char buf[40];
1508
1509 hdsp->midi[id].id = id;
1510 hdsp->midi[id].rmidi = NULL;
1511 hdsp->midi[id].input = NULL;
1512 hdsp->midi[id].output = NULL;
1513 hdsp->midi[id].hdsp = hdsp;
1514 hdsp->midi[id].istimer = 0;
1515 hdsp->midi[id].pending = 0;
1516 spin_lock_init (&hdsp->midi[id].lock);
1517
1518 snprintf(buf, sizeof(buf), "%s MIDI %d", card->shortname, id + 1);
1519 if (snd_rawmidi_new (card, buf, id, 1, 1, &hdsp->midi[id].rmidi) < 0)
1520 return -1;
1521
1522 sprintf(hdsp->midi[id].rmidi->name, "HDSP MIDI %d", id+1);
1523 hdsp->midi[id].rmidi->private_data = &hdsp->midi[id];
1524
1525 snd_rawmidi_set_ops (hdsp->midi[id].rmidi, SNDRV_RAWMIDI_STREAM_OUTPUT, &snd_hdsp_midi_output);
1526 snd_rawmidi_set_ops (hdsp->midi[id].rmidi, SNDRV_RAWMIDI_STREAM_INPUT, &snd_hdsp_midi_input);
1527
1528 hdsp->midi[id].rmidi->info_flags |= SNDRV_RAWMIDI_INFO_OUTPUT |
1529 SNDRV_RAWMIDI_INFO_INPUT |
1530 SNDRV_RAWMIDI_INFO_DUPLEX;
1531
1532 return 0;
1533}
1534
1535
1536
1537
1538
1539static u32 snd_hdsp_convert_from_aes(struct snd_aes_iec958 *aes)
1540{
1541 u32 val = 0;
1542 val |= (aes->status[0] & IEC958_AES0_PROFESSIONAL) ? HDSP_SPDIFProfessional : 0;
1543 val |= (aes->status[0] & IEC958_AES0_NONAUDIO) ? HDSP_SPDIFNonAudio : 0;
1544 if (val & HDSP_SPDIFProfessional)
1545 val |= (aes->status[0] & IEC958_AES0_PRO_EMPHASIS_5015) ? HDSP_SPDIFEmphasis : 0;
1546 else
1547 val |= (aes->status[0] & IEC958_AES0_CON_EMPHASIS_5015) ? HDSP_SPDIFEmphasis : 0;
1548 return val;
1549}
1550
1551static void snd_hdsp_convert_to_aes(struct snd_aes_iec958 *aes, u32 val)
1552{
1553 aes->status[0] = ((val & HDSP_SPDIFProfessional) ? IEC958_AES0_PROFESSIONAL : 0) |
1554 ((val & HDSP_SPDIFNonAudio) ? IEC958_AES0_NONAUDIO : 0);
1555 if (val & HDSP_SPDIFProfessional)
1556 aes->status[0] |= (val & HDSP_SPDIFEmphasis) ? IEC958_AES0_PRO_EMPHASIS_5015 : 0;
1557 else
1558 aes->status[0] |= (val & HDSP_SPDIFEmphasis) ? IEC958_AES0_CON_EMPHASIS_5015 : 0;
1559}
1560
1561static int snd_hdsp_control_spdif_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1562{
1563 uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
1564 uinfo->count = 1;
1565 return 0;
1566}
1567
1568static int snd_hdsp_control_spdif_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1569{
1570 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
1571
1572 snd_hdsp_convert_to_aes(&ucontrol->value.iec958, hdsp->creg_spdif);
1573 return 0;
1574}
1575
1576static int snd_hdsp_control_spdif_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1577{
1578 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
1579 int change;
1580 u32 val;
1581
1582 val = snd_hdsp_convert_from_aes(&ucontrol->value.iec958);
1583 spin_lock_irq(&hdsp->lock);
1584 change = val != hdsp->creg_spdif;
1585 hdsp->creg_spdif = val;
1586 spin_unlock_irq(&hdsp->lock);
1587 return change;
1588}
1589
1590static int snd_hdsp_control_spdif_stream_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1591{
1592 uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
1593 uinfo->count = 1;
1594 return 0;
1595}
1596
1597static int snd_hdsp_control_spdif_stream_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1598{
1599 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
1600
1601 snd_hdsp_convert_to_aes(&ucontrol->value.iec958, hdsp->creg_spdif_stream);
1602 return 0;
1603}
1604
1605static int snd_hdsp_control_spdif_stream_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1606{
1607 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
1608 int change;
1609 u32 val;
1610
1611 val = snd_hdsp_convert_from_aes(&ucontrol->value.iec958);
1612 spin_lock_irq(&hdsp->lock);
1613 change = val != hdsp->creg_spdif_stream;
1614 hdsp->creg_spdif_stream = val;
1615 hdsp->control_register &= ~(HDSP_SPDIFProfessional | HDSP_SPDIFNonAudio | HDSP_SPDIFEmphasis);
1616 hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register |= val);
1617 spin_unlock_irq(&hdsp->lock);
1618 return change;
1619}
1620
1621static int snd_hdsp_control_spdif_mask_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1622{
1623 uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
1624 uinfo->count = 1;
1625 return 0;
1626}
1627
1628static int snd_hdsp_control_spdif_mask_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1629{
1630 ucontrol->value.iec958.status[0] = kcontrol->private_value;
1631 return 0;
1632}
1633
1634#define HDSP_SPDIF_IN(xname, xindex) \
1635{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1636 .name = xname, \
1637 .index = xindex, \
1638 .info = snd_hdsp_info_spdif_in, \
1639 .get = snd_hdsp_get_spdif_in, \
1640 .put = snd_hdsp_put_spdif_in }
1641
1642static unsigned int hdsp_spdif_in(struct hdsp *hdsp)
1643{
1644 return hdsp_decode_spdif_in(hdsp->control_register & HDSP_SPDIFInputMask);
1645}
1646
1647static int hdsp_set_spdif_input(struct hdsp *hdsp, int in)
1648{
1649 hdsp->control_register &= ~HDSP_SPDIFInputMask;
1650 hdsp->control_register |= hdsp_encode_spdif_in(in);
1651 hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
1652 return 0;
1653}
1654
1655static int snd_hdsp_info_spdif_in(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1656{
1657 static const char * const texts[4] = {
1658 "Optical", "Coaxial", "Internal", "AES"
1659 };
1660 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
1661
1662 return snd_ctl_enum_info(uinfo, 1, (hdsp->io_type == H9632) ? 4 : 3,
1663 texts);
1664}
1665
1666static int snd_hdsp_get_spdif_in(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1667{
1668 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
1669
1670 ucontrol->value.enumerated.item[0] = hdsp_spdif_in(hdsp);
1671 return 0;
1672}
1673
1674static int snd_hdsp_put_spdif_in(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1675{
1676 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
1677 int change;
1678 unsigned int val;
1679
1680 if (!snd_hdsp_use_is_exclusive(hdsp))
1681 return -EBUSY;
1682 val = ucontrol->value.enumerated.item[0] % ((hdsp->io_type == H9632) ? 4 : 3);
1683 spin_lock_irq(&hdsp->lock);
1684 change = val != hdsp_spdif_in(hdsp);
1685 if (change)
1686 hdsp_set_spdif_input(hdsp, val);
1687 spin_unlock_irq(&hdsp->lock);
1688 return change;
1689}
1690
1691#define HDSP_TOGGLE_SETTING(xname, xindex) \
1692{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1693 .name = xname, \
1694 .private_value = xindex, \
1695 .info = snd_hdsp_info_toggle_setting, \
1696 .get = snd_hdsp_get_toggle_setting, \
1697 .put = snd_hdsp_put_toggle_setting \
1698}
1699
1700static int hdsp_toggle_setting(struct hdsp *hdsp, u32 regmask)
1701{
1702 return (hdsp->control_register & regmask) ? 1 : 0;
1703}
1704
1705static int hdsp_set_toggle_setting(struct hdsp *hdsp, u32 regmask, int out)
1706{
1707 if (out)
1708 hdsp->control_register |= regmask;
1709 else
1710 hdsp->control_register &= ~regmask;
1711 hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
1712
1713 return 0;
1714}
1715
1716#define snd_hdsp_info_toggle_setting snd_ctl_boolean_mono_info
1717
1718static int snd_hdsp_get_toggle_setting(struct snd_kcontrol *kcontrol,
1719 struct snd_ctl_elem_value *ucontrol)
1720{
1721 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
1722 u32 regmask = kcontrol->private_value;
1723
1724 spin_lock_irq(&hdsp->lock);
1725 ucontrol->value.integer.value[0] = hdsp_toggle_setting(hdsp, regmask);
1726 spin_unlock_irq(&hdsp->lock);
1727 return 0;
1728}
1729
1730static int snd_hdsp_put_toggle_setting(struct snd_kcontrol *kcontrol,
1731 struct snd_ctl_elem_value *ucontrol)
1732{
1733 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
1734 u32 regmask = kcontrol->private_value;
1735 int change;
1736 unsigned int val;
1737
1738 if (!snd_hdsp_use_is_exclusive(hdsp))
1739 return -EBUSY;
1740 val = ucontrol->value.integer.value[0] & 1;
1741 spin_lock_irq(&hdsp->lock);
1742 change = (int) val != hdsp_toggle_setting(hdsp, regmask);
1743 if (change)
1744 hdsp_set_toggle_setting(hdsp, regmask, val);
1745 spin_unlock_irq(&hdsp->lock);
1746 return change;
1747}
1748
1749#define HDSP_SPDIF_SAMPLE_RATE(xname, xindex) \
1750{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1751 .name = xname, \
1752 .index = xindex, \
1753 .access = SNDRV_CTL_ELEM_ACCESS_READ, \
1754 .info = snd_hdsp_info_spdif_sample_rate, \
1755 .get = snd_hdsp_get_spdif_sample_rate \
1756}
1757
1758static int snd_hdsp_info_spdif_sample_rate(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1759{
1760 static const char * const texts[] = {
1761 "32000", "44100", "48000", "64000", "88200", "96000",
1762 "None", "128000", "176400", "192000"
1763 };
1764 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
1765
1766 return snd_ctl_enum_info(uinfo, 1, (hdsp->io_type == H9632) ? 10 : 7,
1767 texts);
1768}
1769
1770static int snd_hdsp_get_spdif_sample_rate(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1771{
1772 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
1773
1774 switch (hdsp_spdif_sample_rate(hdsp)) {
1775 case 32000:
1776 ucontrol->value.enumerated.item[0] = 0;
1777 break;
1778 case 44100:
1779 ucontrol->value.enumerated.item[0] = 1;
1780 break;
1781 case 48000:
1782 ucontrol->value.enumerated.item[0] = 2;
1783 break;
1784 case 64000:
1785 ucontrol->value.enumerated.item[0] = 3;
1786 break;
1787 case 88200:
1788 ucontrol->value.enumerated.item[0] = 4;
1789 break;
1790 case 96000:
1791 ucontrol->value.enumerated.item[0] = 5;
1792 break;
1793 case 128000:
1794 ucontrol->value.enumerated.item[0] = 7;
1795 break;
1796 case 176400:
1797 ucontrol->value.enumerated.item[0] = 8;
1798 break;
1799 case 192000:
1800 ucontrol->value.enumerated.item[0] = 9;
1801 break;
1802 default:
1803 ucontrol->value.enumerated.item[0] = 6;
1804 }
1805 return 0;
1806}
1807
1808#define HDSP_SYSTEM_SAMPLE_RATE(xname, xindex) \
1809{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1810 .name = xname, \
1811 .index = xindex, \
1812 .access = SNDRV_CTL_ELEM_ACCESS_READ, \
1813 .info = snd_hdsp_info_system_sample_rate, \
1814 .get = snd_hdsp_get_system_sample_rate \
1815}
1816
1817static int snd_hdsp_info_system_sample_rate(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1818{
1819 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1820 uinfo->count = 1;
1821 return 0;
1822}
1823
1824static int snd_hdsp_get_system_sample_rate(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1825{
1826 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
1827
1828 ucontrol->value.enumerated.item[0] = hdsp->system_sample_rate;
1829 return 0;
1830}
1831
1832#define HDSP_AUTOSYNC_SAMPLE_RATE(xname, xindex) \
1833{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1834 .name = xname, \
1835 .index = xindex, \
1836 .access = SNDRV_CTL_ELEM_ACCESS_READ, \
1837 .info = snd_hdsp_info_autosync_sample_rate, \
1838 .get = snd_hdsp_get_autosync_sample_rate \
1839}
1840
1841static int snd_hdsp_info_autosync_sample_rate(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1842{
1843 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
1844 static const char * const texts[] = {
1845 "32000", "44100", "48000", "64000", "88200", "96000",
1846 "None", "128000", "176400", "192000"
1847 };
1848
1849 return snd_ctl_enum_info(uinfo, 1, (hdsp->io_type == H9632) ? 10 : 7,
1850 texts);
1851}
1852
1853static int snd_hdsp_get_autosync_sample_rate(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1854{
1855 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
1856
1857 switch (hdsp_external_sample_rate(hdsp)) {
1858 case 32000:
1859 ucontrol->value.enumerated.item[0] = 0;
1860 break;
1861 case 44100:
1862 ucontrol->value.enumerated.item[0] = 1;
1863 break;
1864 case 48000:
1865 ucontrol->value.enumerated.item[0] = 2;
1866 break;
1867 case 64000:
1868 ucontrol->value.enumerated.item[0] = 3;
1869 break;
1870 case 88200:
1871 ucontrol->value.enumerated.item[0] = 4;
1872 break;
1873 case 96000:
1874 ucontrol->value.enumerated.item[0] = 5;
1875 break;
1876 case 128000:
1877 ucontrol->value.enumerated.item[0] = 7;
1878 break;
1879 case 176400:
1880 ucontrol->value.enumerated.item[0] = 8;
1881 break;
1882 case 192000:
1883 ucontrol->value.enumerated.item[0] = 9;
1884 break;
1885 default:
1886 ucontrol->value.enumerated.item[0] = 6;
1887 }
1888 return 0;
1889}
1890
1891#define HDSP_SYSTEM_CLOCK_MODE(xname, xindex) \
1892{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1893 .name = xname, \
1894 .index = xindex, \
1895 .access = SNDRV_CTL_ELEM_ACCESS_READ, \
1896 .info = snd_hdsp_info_system_clock_mode, \
1897 .get = snd_hdsp_get_system_clock_mode \
1898}
1899
1900static int hdsp_system_clock_mode(struct hdsp *hdsp)
1901{
1902 if (hdsp->control_register & HDSP_ClockModeMaster)
1903 return 0;
1904 else if (hdsp_external_sample_rate(hdsp) != hdsp->system_sample_rate)
1905 return 0;
1906 return 1;
1907}
1908
1909static int snd_hdsp_info_system_clock_mode(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1910{
1911 static const char * const texts[] = {"Master", "Slave" };
1912
1913 return snd_ctl_enum_info(uinfo, 1, 2, texts);
1914}
1915
1916static int snd_hdsp_get_system_clock_mode(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1917{
1918 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
1919
1920 ucontrol->value.enumerated.item[0] = hdsp_system_clock_mode(hdsp);
1921 return 0;
1922}
1923
1924#define HDSP_CLOCK_SOURCE(xname, xindex) \
1925{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1926 .name = xname, \
1927 .index = xindex, \
1928 .info = snd_hdsp_info_clock_source, \
1929 .get = snd_hdsp_get_clock_source, \
1930 .put = snd_hdsp_put_clock_source \
1931}
1932
1933static int hdsp_clock_source(struct hdsp *hdsp)
1934{
1935 if (hdsp->control_register & HDSP_ClockModeMaster) {
1936 switch (hdsp->system_sample_rate) {
1937 case 32000:
1938 return 1;
1939 case 44100:
1940 return 2;
1941 case 48000:
1942 return 3;
1943 case 64000:
1944 return 4;
1945 case 88200:
1946 return 5;
1947 case 96000:
1948 return 6;
1949 case 128000:
1950 return 7;
1951 case 176400:
1952 return 8;
1953 case 192000:
1954 return 9;
1955 default:
1956 return 3;
1957 }
1958 } else {
1959 return 0;
1960 }
1961}
1962
1963static int hdsp_set_clock_source(struct hdsp *hdsp, int mode)
1964{
1965 int rate;
1966 switch (mode) {
1967 case HDSP_CLOCK_SOURCE_AUTOSYNC:
1968 if (hdsp_external_sample_rate(hdsp) != 0) {
1969 if (!hdsp_set_rate(hdsp, hdsp_external_sample_rate(hdsp), 1)) {
1970 hdsp->control_register &= ~HDSP_ClockModeMaster;
1971 hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
1972 return 0;
1973 }
1974 }
1975 return -1;
1976 case HDSP_CLOCK_SOURCE_INTERNAL_32KHZ:
1977 rate = 32000;
1978 break;
1979 case HDSP_CLOCK_SOURCE_INTERNAL_44_1KHZ:
1980 rate = 44100;
1981 break;
1982 case HDSP_CLOCK_SOURCE_INTERNAL_48KHZ:
1983 rate = 48000;
1984 break;
1985 case HDSP_CLOCK_SOURCE_INTERNAL_64KHZ:
1986 rate = 64000;
1987 break;
1988 case HDSP_CLOCK_SOURCE_INTERNAL_88_2KHZ:
1989 rate = 88200;
1990 break;
1991 case HDSP_CLOCK_SOURCE_INTERNAL_96KHZ:
1992 rate = 96000;
1993 break;
1994 case HDSP_CLOCK_SOURCE_INTERNAL_128KHZ:
1995 rate = 128000;
1996 break;
1997 case HDSP_CLOCK_SOURCE_INTERNAL_176_4KHZ:
1998 rate = 176400;
1999 break;
2000 case HDSP_CLOCK_SOURCE_INTERNAL_192KHZ:
2001 rate = 192000;
2002 break;
2003 default:
2004 rate = 48000;
2005 }
2006 hdsp->control_register |= HDSP_ClockModeMaster;
2007 hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
2008 hdsp_set_rate(hdsp, rate, 1);
2009 return 0;
2010}
2011
2012static int snd_hdsp_info_clock_source(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
2013{
2014 static const char * const texts[] = {
2015 "AutoSync", "Internal 32.0 kHz", "Internal 44.1 kHz",
2016 "Internal 48.0 kHz", "Internal 64.0 kHz", "Internal 88.2 kHz",
2017 "Internal 96.0 kHz", "Internal 128 kHz", "Internal 176.4 kHz",
2018 "Internal 192.0 KHz"
2019 };
2020 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2021
2022 return snd_ctl_enum_info(uinfo, 1, (hdsp->io_type == H9632) ? 10 : 7,
2023 texts);
2024}
2025
2026static int snd_hdsp_get_clock_source(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2027{
2028 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2029
2030 ucontrol->value.enumerated.item[0] = hdsp_clock_source(hdsp);
2031 return 0;
2032}
2033
2034static int snd_hdsp_put_clock_source(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2035{
2036 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2037 int change;
2038 int val;
2039
2040 if (!snd_hdsp_use_is_exclusive(hdsp))
2041 return -EBUSY;
2042 val = ucontrol->value.enumerated.item[0];
2043 if (val < 0) val = 0;
2044 if (hdsp->io_type == H9632) {
2045 if (val > 9)
2046 val = 9;
2047 } else {
2048 if (val > 6)
2049 val = 6;
2050 }
2051 spin_lock_irq(&hdsp->lock);
2052 if (val != hdsp_clock_source(hdsp))
2053 change = (hdsp_set_clock_source(hdsp, val) == 0) ? 1 : 0;
2054 else
2055 change = 0;
2056 spin_unlock_irq(&hdsp->lock);
2057 return change;
2058}
2059
2060#define snd_hdsp_info_clock_source_lock snd_ctl_boolean_mono_info
2061
2062static int snd_hdsp_get_clock_source_lock(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2063{
2064 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2065
2066 ucontrol->value.integer.value[0] = hdsp->clock_source_locked;
2067 return 0;
2068}
2069
2070static int snd_hdsp_put_clock_source_lock(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2071{
2072 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2073 int change;
2074
2075 change = (int)ucontrol->value.integer.value[0] != hdsp->clock_source_locked;
2076 if (change)
2077 hdsp->clock_source_locked = !!ucontrol->value.integer.value[0];
2078 return change;
2079}
2080
2081#define HDSP_DA_GAIN(xname, xindex) \
2082{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2083 .name = xname, \
2084 .index = xindex, \
2085 .info = snd_hdsp_info_da_gain, \
2086 .get = snd_hdsp_get_da_gain, \
2087 .put = snd_hdsp_put_da_gain \
2088}
2089
2090static int hdsp_da_gain(struct hdsp *hdsp)
2091{
2092 switch (hdsp->control_register & HDSP_DAGainMask) {
2093 case HDSP_DAGainHighGain:
2094 return 0;
2095 case HDSP_DAGainPlus4dBu:
2096 return 1;
2097 case HDSP_DAGainMinus10dBV:
2098 return 2;
2099 default:
2100 return 1;
2101 }
2102}
2103
2104static int hdsp_set_da_gain(struct hdsp *hdsp, int mode)
2105{
2106 hdsp->control_register &= ~HDSP_DAGainMask;
2107 switch (mode) {
2108 case 0:
2109 hdsp->control_register |= HDSP_DAGainHighGain;
2110 break;
2111 case 1:
2112 hdsp->control_register |= HDSP_DAGainPlus4dBu;
2113 break;
2114 case 2:
2115 hdsp->control_register |= HDSP_DAGainMinus10dBV;
2116 break;
2117 default:
2118 return -1;
2119
2120 }
2121 hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
2122 return 0;
2123}
2124
2125static int snd_hdsp_info_da_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
2126{
2127 static const char * const texts[] = {"Hi Gain", "+4 dBu", "-10 dbV"};
2128
2129 return snd_ctl_enum_info(uinfo, 1, 3, texts);
2130}
2131
2132static int snd_hdsp_get_da_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2133{
2134 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2135
2136 ucontrol->value.enumerated.item[0] = hdsp_da_gain(hdsp);
2137 return 0;
2138}
2139
2140static int snd_hdsp_put_da_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2141{
2142 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2143 int change;
2144 int val;
2145
2146 if (!snd_hdsp_use_is_exclusive(hdsp))
2147 return -EBUSY;
2148 val = ucontrol->value.enumerated.item[0];
2149 if (val < 0) val = 0;
2150 if (val > 2) val = 2;
2151 spin_lock_irq(&hdsp->lock);
2152 if (val != hdsp_da_gain(hdsp))
2153 change = (hdsp_set_da_gain(hdsp, val) == 0) ? 1 : 0;
2154 else
2155 change = 0;
2156 spin_unlock_irq(&hdsp->lock);
2157 return change;
2158}
2159
2160#define HDSP_AD_GAIN(xname, xindex) \
2161{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2162 .name = xname, \
2163 .index = xindex, \
2164 .info = snd_hdsp_info_ad_gain, \
2165 .get = snd_hdsp_get_ad_gain, \
2166 .put = snd_hdsp_put_ad_gain \
2167}
2168
2169static int hdsp_ad_gain(struct hdsp *hdsp)
2170{
2171 switch (hdsp->control_register & HDSP_ADGainMask) {
2172 case HDSP_ADGainMinus10dBV:
2173 return 0;
2174 case HDSP_ADGainPlus4dBu:
2175 return 1;
2176 case HDSP_ADGainLowGain:
2177 return 2;
2178 default:
2179 return 1;
2180 }
2181}
2182
2183static int hdsp_set_ad_gain(struct hdsp *hdsp, int mode)
2184{
2185 hdsp->control_register &= ~HDSP_ADGainMask;
2186 switch (mode) {
2187 case 0:
2188 hdsp->control_register |= HDSP_ADGainMinus10dBV;
2189 break;
2190 case 1:
2191 hdsp->control_register |= HDSP_ADGainPlus4dBu;
2192 break;
2193 case 2:
2194 hdsp->control_register |= HDSP_ADGainLowGain;
2195 break;
2196 default:
2197 return -1;
2198
2199 }
2200 hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
2201 return 0;
2202}
2203
2204static int snd_hdsp_info_ad_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
2205{
2206 static const char * const texts[] = {"-10 dBV", "+4 dBu", "Lo Gain"};
2207
2208 return snd_ctl_enum_info(uinfo, 1, 3, texts);
2209}
2210
2211static int snd_hdsp_get_ad_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2212{
2213 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2214
2215 ucontrol->value.enumerated.item[0] = hdsp_ad_gain(hdsp);
2216 return 0;
2217}
2218
2219static int snd_hdsp_put_ad_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2220{
2221 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2222 int change;
2223 int val;
2224
2225 if (!snd_hdsp_use_is_exclusive(hdsp))
2226 return -EBUSY;
2227 val = ucontrol->value.enumerated.item[0];
2228 if (val < 0) val = 0;
2229 if (val > 2) val = 2;
2230 spin_lock_irq(&hdsp->lock);
2231 if (val != hdsp_ad_gain(hdsp))
2232 change = (hdsp_set_ad_gain(hdsp, val) == 0) ? 1 : 0;
2233 else
2234 change = 0;
2235 spin_unlock_irq(&hdsp->lock);
2236 return change;
2237}
2238
2239#define HDSP_PHONE_GAIN(xname, xindex) \
2240{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2241 .name = xname, \
2242 .index = xindex, \
2243 .info = snd_hdsp_info_phone_gain, \
2244 .get = snd_hdsp_get_phone_gain, \
2245 .put = snd_hdsp_put_phone_gain \
2246}
2247
2248static int hdsp_phone_gain(struct hdsp *hdsp)
2249{
2250 switch (hdsp->control_register & HDSP_PhoneGainMask) {
2251 case HDSP_PhoneGain0dB:
2252 return 0;
2253 case HDSP_PhoneGainMinus6dB:
2254 return 1;
2255 case HDSP_PhoneGainMinus12dB:
2256 return 2;
2257 default:
2258 return 0;
2259 }
2260}
2261
2262static int hdsp_set_phone_gain(struct hdsp *hdsp, int mode)
2263{
2264 hdsp->control_register &= ~HDSP_PhoneGainMask;
2265 switch (mode) {
2266 case 0:
2267 hdsp->control_register |= HDSP_PhoneGain0dB;
2268 break;
2269 case 1:
2270 hdsp->control_register |= HDSP_PhoneGainMinus6dB;
2271 break;
2272 case 2:
2273 hdsp->control_register |= HDSP_PhoneGainMinus12dB;
2274 break;
2275 default:
2276 return -1;
2277
2278 }
2279 hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
2280 return 0;
2281}
2282
2283static int snd_hdsp_info_phone_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
2284{
2285 static const char * const texts[] = {"0 dB", "-6 dB", "-12 dB"};
2286
2287 return snd_ctl_enum_info(uinfo, 1, 3, texts);
2288}
2289
2290static int snd_hdsp_get_phone_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2291{
2292 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2293
2294 ucontrol->value.enumerated.item[0] = hdsp_phone_gain(hdsp);
2295 return 0;
2296}
2297
2298static int snd_hdsp_put_phone_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2299{
2300 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2301 int change;
2302 int val;
2303
2304 if (!snd_hdsp_use_is_exclusive(hdsp))
2305 return -EBUSY;
2306 val = ucontrol->value.enumerated.item[0];
2307 if (val < 0) val = 0;
2308 if (val > 2) val = 2;
2309 spin_lock_irq(&hdsp->lock);
2310 if (val != hdsp_phone_gain(hdsp))
2311 change = (hdsp_set_phone_gain(hdsp, val) == 0) ? 1 : 0;
2312 else
2313 change = 0;
2314 spin_unlock_irq(&hdsp->lock);
2315 return change;
2316}
2317
2318#define HDSP_PREF_SYNC_REF(xname, xindex) \
2319{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2320 .name = xname, \
2321 .index = xindex, \
2322 .info = snd_hdsp_info_pref_sync_ref, \
2323 .get = snd_hdsp_get_pref_sync_ref, \
2324 .put = snd_hdsp_put_pref_sync_ref \
2325}
2326
2327static int hdsp_pref_sync_ref(struct hdsp *hdsp)
2328{
2329
2330
2331
2332
2333 switch (hdsp->control_register & HDSP_SyncRefMask) {
2334 case HDSP_SyncRef_ADAT1:
2335 return HDSP_SYNC_FROM_ADAT1;
2336 case HDSP_SyncRef_ADAT2:
2337 return HDSP_SYNC_FROM_ADAT2;
2338 case HDSP_SyncRef_ADAT3:
2339 return HDSP_SYNC_FROM_ADAT3;
2340 case HDSP_SyncRef_SPDIF:
2341 return HDSP_SYNC_FROM_SPDIF;
2342 case HDSP_SyncRef_WORD:
2343 return HDSP_SYNC_FROM_WORD;
2344 case HDSP_SyncRef_ADAT_SYNC:
2345 return HDSP_SYNC_FROM_ADAT_SYNC;
2346 default:
2347 return HDSP_SYNC_FROM_WORD;
2348 }
2349 return 0;
2350}
2351
2352static int hdsp_set_pref_sync_ref(struct hdsp *hdsp, int pref)
2353{
2354 hdsp->control_register &= ~HDSP_SyncRefMask;
2355 switch (pref) {
2356 case HDSP_SYNC_FROM_ADAT1:
2357 hdsp->control_register &= ~HDSP_SyncRefMask;
2358 break;
2359 case HDSP_SYNC_FROM_ADAT2:
2360 hdsp->control_register |= HDSP_SyncRef_ADAT2;
2361 break;
2362 case HDSP_SYNC_FROM_ADAT3:
2363 hdsp->control_register |= HDSP_SyncRef_ADAT3;
2364 break;
2365 case HDSP_SYNC_FROM_SPDIF:
2366 hdsp->control_register |= HDSP_SyncRef_SPDIF;
2367 break;
2368 case HDSP_SYNC_FROM_WORD:
2369 hdsp->control_register |= HDSP_SyncRef_WORD;
2370 break;
2371 case HDSP_SYNC_FROM_ADAT_SYNC:
2372 hdsp->control_register |= HDSP_SyncRef_ADAT_SYNC;
2373 break;
2374 default:
2375 return -1;
2376 }
2377 hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
2378 return 0;
2379}
2380
2381static int snd_hdsp_info_pref_sync_ref(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
2382{
2383 static const char * const texts[] = {
2384 "Word", "IEC958", "ADAT1", "ADAT Sync", "ADAT2", "ADAT3"
2385 };
2386 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2387 int num_items;
2388
2389 switch (hdsp->io_type) {
2390 case Digiface:
2391 case H9652:
2392 num_items = 6;
2393 break;
2394 case Multiface:
2395 num_items = 4;
2396 break;
2397 case H9632:
2398 num_items = 3;
2399 break;
2400 default:
2401 return -EINVAL;
2402 }
2403
2404 return snd_ctl_enum_info(uinfo, 1, num_items, texts);
2405}
2406
2407static int snd_hdsp_get_pref_sync_ref(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2408{
2409 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2410
2411 ucontrol->value.enumerated.item[0] = hdsp_pref_sync_ref(hdsp);
2412 return 0;
2413}
2414
2415static int snd_hdsp_put_pref_sync_ref(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2416{
2417 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2418 int change, max;
2419 unsigned int val;
2420
2421 if (!snd_hdsp_use_is_exclusive(hdsp))
2422 return -EBUSY;
2423
2424 switch (hdsp->io_type) {
2425 case Digiface:
2426 case H9652:
2427 max = 6;
2428 break;
2429 case Multiface:
2430 max = 4;
2431 break;
2432 case H9632:
2433 max = 3;
2434 break;
2435 default:
2436 return -EIO;
2437 }
2438
2439 val = ucontrol->value.enumerated.item[0] % max;
2440 spin_lock_irq(&hdsp->lock);
2441 change = (int)val != hdsp_pref_sync_ref(hdsp);
2442 hdsp_set_pref_sync_ref(hdsp, val);
2443 spin_unlock_irq(&hdsp->lock);
2444 return change;
2445}
2446
2447#define HDSP_AUTOSYNC_REF(xname, xindex) \
2448{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2449 .name = xname, \
2450 .index = xindex, \
2451 .access = SNDRV_CTL_ELEM_ACCESS_READ, \
2452 .info = snd_hdsp_info_autosync_ref, \
2453 .get = snd_hdsp_get_autosync_ref, \
2454}
2455
2456static int hdsp_autosync_ref(struct hdsp *hdsp)
2457{
2458
2459 unsigned int status2 = hdsp_read(hdsp, HDSP_status2Register);
2460
2461 switch (status2 & HDSP_SelSyncRefMask) {
2462 case HDSP_SelSyncRef_WORD:
2463 return HDSP_AUTOSYNC_FROM_WORD;
2464 case HDSP_SelSyncRef_ADAT_SYNC:
2465 return HDSP_AUTOSYNC_FROM_ADAT_SYNC;
2466 case HDSP_SelSyncRef_SPDIF:
2467 return HDSP_AUTOSYNC_FROM_SPDIF;
2468 case HDSP_SelSyncRefMask:
2469 return HDSP_AUTOSYNC_FROM_NONE;
2470 case HDSP_SelSyncRef_ADAT1:
2471 return HDSP_AUTOSYNC_FROM_ADAT1;
2472 case HDSP_SelSyncRef_ADAT2:
2473 return HDSP_AUTOSYNC_FROM_ADAT2;
2474 case HDSP_SelSyncRef_ADAT3:
2475 return HDSP_AUTOSYNC_FROM_ADAT3;
2476 default:
2477 return HDSP_AUTOSYNC_FROM_WORD;
2478 }
2479 return 0;
2480}
2481
2482static int snd_hdsp_info_autosync_ref(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
2483{
2484 static const char * const texts[] = {
2485 "Word", "ADAT Sync", "IEC958", "None", "ADAT1", "ADAT2", "ADAT3"
2486 };
2487
2488 return snd_ctl_enum_info(uinfo, 1, 7, texts);
2489}
2490
2491static int snd_hdsp_get_autosync_ref(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2492{
2493 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2494
2495 ucontrol->value.enumerated.item[0] = hdsp_autosync_ref(hdsp);
2496 return 0;
2497}
2498
2499#define HDSP_PRECISE_POINTER(xname, xindex) \
2500{ .iface = SNDRV_CTL_ELEM_IFACE_CARD, \
2501 .name = xname, \
2502 .index = xindex, \
2503 .info = snd_hdsp_info_precise_pointer, \
2504 .get = snd_hdsp_get_precise_pointer, \
2505 .put = snd_hdsp_put_precise_pointer \
2506}
2507
2508static int hdsp_set_precise_pointer(struct hdsp *hdsp, int precise)
2509{
2510 if (precise)
2511 hdsp->precise_ptr = 1;
2512 else
2513 hdsp->precise_ptr = 0;
2514 return 0;
2515}
2516
2517#define snd_hdsp_info_precise_pointer snd_ctl_boolean_mono_info
2518
2519static int snd_hdsp_get_precise_pointer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2520{
2521 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2522
2523 spin_lock_irq(&hdsp->lock);
2524 ucontrol->value.integer.value[0] = hdsp->precise_ptr;
2525 spin_unlock_irq(&hdsp->lock);
2526 return 0;
2527}
2528
2529static int snd_hdsp_put_precise_pointer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2530{
2531 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2532 int change;
2533 unsigned int val;
2534
2535 if (!snd_hdsp_use_is_exclusive(hdsp))
2536 return -EBUSY;
2537 val = ucontrol->value.integer.value[0] & 1;
2538 spin_lock_irq(&hdsp->lock);
2539 change = (int)val != hdsp->precise_ptr;
2540 hdsp_set_precise_pointer(hdsp, val);
2541 spin_unlock_irq(&hdsp->lock);
2542 return change;
2543}
2544
2545#define HDSP_USE_MIDI_WORK(xname, xindex) \
2546{ .iface = SNDRV_CTL_ELEM_IFACE_CARD, \
2547 .name = xname, \
2548 .index = xindex, \
2549 .info = snd_hdsp_info_use_midi_work, \
2550 .get = snd_hdsp_get_use_midi_work, \
2551 .put = snd_hdsp_put_use_midi_work \
2552}
2553
2554static int hdsp_set_use_midi_work(struct hdsp *hdsp, int use_work)
2555{
2556 if (use_work)
2557 hdsp->use_midi_work = 1;
2558 else
2559 hdsp->use_midi_work = 0;
2560 return 0;
2561}
2562
2563#define snd_hdsp_info_use_midi_work snd_ctl_boolean_mono_info
2564
2565static int snd_hdsp_get_use_midi_work(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2566{
2567 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2568
2569 spin_lock_irq(&hdsp->lock);
2570 ucontrol->value.integer.value[0] = hdsp->use_midi_work;
2571 spin_unlock_irq(&hdsp->lock);
2572 return 0;
2573}
2574
2575static int snd_hdsp_put_use_midi_work(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2576{
2577 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2578 int change;
2579 unsigned int val;
2580
2581 if (!snd_hdsp_use_is_exclusive(hdsp))
2582 return -EBUSY;
2583 val = ucontrol->value.integer.value[0] & 1;
2584 spin_lock_irq(&hdsp->lock);
2585 change = (int)val != hdsp->use_midi_work;
2586 hdsp_set_use_midi_work(hdsp, val);
2587 spin_unlock_irq(&hdsp->lock);
2588 return change;
2589}
2590
2591#define HDSP_MIXER(xname, xindex) \
2592{ .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
2593 .name = xname, \
2594 .index = xindex, \
2595 .device = 0, \
2596 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
2597 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2598 .info = snd_hdsp_info_mixer, \
2599 .get = snd_hdsp_get_mixer, \
2600 .put = snd_hdsp_put_mixer \
2601}
2602
2603static int snd_hdsp_info_mixer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
2604{
2605 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2606 uinfo->count = 3;
2607 uinfo->value.integer.min = 0;
2608 uinfo->value.integer.max = 65536;
2609 uinfo->value.integer.step = 1;
2610 return 0;
2611}
2612
2613static int snd_hdsp_get_mixer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2614{
2615 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2616 int source;
2617 int destination;
2618 int addr;
2619
2620 source = ucontrol->value.integer.value[0];
2621 destination = ucontrol->value.integer.value[1];
2622
2623 if (source >= hdsp->max_channels)
2624 addr = hdsp_playback_to_output_key(hdsp,source-hdsp->max_channels,destination);
2625 else
2626 addr = hdsp_input_to_output_key(hdsp,source, destination);
2627
2628 spin_lock_irq(&hdsp->lock);
2629 ucontrol->value.integer.value[2] = hdsp_read_gain (hdsp, addr);
2630 spin_unlock_irq(&hdsp->lock);
2631 return 0;
2632}
2633
2634static int snd_hdsp_put_mixer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2635{
2636 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2637 int change;
2638 int source;
2639 int destination;
2640 int gain;
2641 int addr;
2642
2643 if (!snd_hdsp_use_is_exclusive(hdsp))
2644 return -EBUSY;
2645
2646 source = ucontrol->value.integer.value[0];
2647 destination = ucontrol->value.integer.value[1];
2648
2649 if (source >= hdsp->max_channels)
2650 addr = hdsp_playback_to_output_key(hdsp,source-hdsp->max_channels, destination);
2651 else
2652 addr = hdsp_input_to_output_key(hdsp,source, destination);
2653
2654 gain = ucontrol->value.integer.value[2];
2655
2656 spin_lock_irq(&hdsp->lock);
2657 change = gain != hdsp_read_gain(hdsp, addr);
2658 if (change)
2659 hdsp_write_gain(hdsp, addr, gain);
2660 spin_unlock_irq(&hdsp->lock);
2661 return change;
2662}
2663
2664#define HDSP_WC_SYNC_CHECK(xname, xindex) \
2665{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2666 .name = xname, \
2667 .index = xindex, \
2668 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2669 .info = snd_hdsp_info_sync_check, \
2670 .get = snd_hdsp_get_wc_sync_check \
2671}
2672
2673static int snd_hdsp_info_sync_check(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
2674{
2675 static const char * const texts[] = {"No Lock", "Lock", "Sync" };
2676
2677 return snd_ctl_enum_info(uinfo, 1, 3, texts);
2678}
2679
2680static int hdsp_wc_sync_check(struct hdsp *hdsp)
2681{
2682 int status2 = hdsp_read(hdsp, HDSP_status2Register);
2683 if (status2 & HDSP_wc_lock) {
2684 if (status2 & HDSP_wc_sync)
2685 return 2;
2686 else
2687 return 1;
2688 } else
2689 return 0;
2690 return 0;
2691}
2692
2693static int snd_hdsp_get_wc_sync_check(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2694{
2695 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2696
2697 ucontrol->value.enumerated.item[0] = hdsp_wc_sync_check(hdsp);
2698 return 0;
2699}
2700
2701#define HDSP_SPDIF_SYNC_CHECK(xname, xindex) \
2702{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2703 .name = xname, \
2704 .index = xindex, \
2705 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2706 .info = snd_hdsp_info_sync_check, \
2707 .get = snd_hdsp_get_spdif_sync_check \
2708}
2709
2710static int hdsp_spdif_sync_check(struct hdsp *hdsp)
2711{
2712 int status = hdsp_read(hdsp, HDSP_statusRegister);
2713 if (status & HDSP_SPDIFErrorFlag)
2714 return 0;
2715 else {
2716 if (status & HDSP_SPDIFSync)
2717 return 2;
2718 else
2719 return 1;
2720 }
2721 return 0;
2722}
2723
2724static int snd_hdsp_get_spdif_sync_check(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2725{
2726 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2727
2728 ucontrol->value.enumerated.item[0] = hdsp_spdif_sync_check(hdsp);
2729 return 0;
2730}
2731
2732#define HDSP_ADATSYNC_SYNC_CHECK(xname, xindex) \
2733{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2734 .name = xname, \
2735 .index = xindex, \
2736 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2737 .info = snd_hdsp_info_sync_check, \
2738 .get = snd_hdsp_get_adatsync_sync_check \
2739}
2740
2741static int hdsp_adatsync_sync_check(struct hdsp *hdsp)
2742{
2743 int status = hdsp_read(hdsp, HDSP_statusRegister);
2744 if (status & HDSP_TimecodeLock) {
2745 if (status & HDSP_TimecodeSync)
2746 return 2;
2747 else
2748 return 1;
2749 } else
2750 return 0;
2751}
2752
2753static int snd_hdsp_get_adatsync_sync_check(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2754{
2755 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2756
2757 ucontrol->value.enumerated.item[0] = hdsp_adatsync_sync_check(hdsp);
2758 return 0;
2759}
2760
2761#define HDSP_ADAT_SYNC_CHECK \
2762{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2763 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2764 .info = snd_hdsp_info_sync_check, \
2765 .get = snd_hdsp_get_adat_sync_check \
2766}
2767
2768static int hdsp_adat_sync_check(struct hdsp *hdsp, int idx)
2769{
2770 int status = hdsp_read(hdsp, HDSP_statusRegister);
2771
2772 if (status & (HDSP_Lock0>>idx)) {
2773 if (status & (HDSP_Sync0>>idx))
2774 return 2;
2775 else
2776 return 1;
2777 } else
2778 return 0;
2779}
2780
2781static int snd_hdsp_get_adat_sync_check(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2782{
2783 int offset;
2784 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2785
2786 offset = ucontrol->id.index - 1;
2787 if (snd_BUG_ON(offset < 0))
2788 return -EINVAL;
2789
2790 switch (hdsp->io_type) {
2791 case Digiface:
2792 case H9652:
2793 if (offset >= 3)
2794 return -EINVAL;
2795 break;
2796 case Multiface:
2797 case H9632:
2798 if (offset >= 1)
2799 return -EINVAL;
2800 break;
2801 default:
2802 return -EIO;
2803 }
2804
2805 ucontrol->value.enumerated.item[0] = hdsp_adat_sync_check(hdsp, offset);
2806 return 0;
2807}
2808
2809#define HDSP_DDS_OFFSET(xname, xindex) \
2810{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2811 .name = xname, \
2812 .index = xindex, \
2813 .info = snd_hdsp_info_dds_offset, \
2814 .get = snd_hdsp_get_dds_offset, \
2815 .put = snd_hdsp_put_dds_offset \
2816}
2817
2818static int hdsp_dds_offset(struct hdsp *hdsp)
2819{
2820 u64 n;
2821 unsigned int dds_value = hdsp->dds_value;
2822 int system_sample_rate = hdsp->system_sample_rate;
2823
2824 if (!dds_value)
2825 return 0;
2826
2827 n = DDS_NUMERATOR;
2828
2829
2830
2831
2832 n = div_u64(n, dds_value);
2833 if (system_sample_rate >= 112000)
2834 n *= 4;
2835 else if (system_sample_rate >= 56000)
2836 n *= 2;
2837 return ((int)n) - system_sample_rate;
2838}
2839
2840static int hdsp_set_dds_offset(struct hdsp *hdsp, int offset_hz)
2841{
2842 int rate = hdsp->system_sample_rate + offset_hz;
2843 hdsp_set_dds_value(hdsp, rate);
2844 return 0;
2845}
2846
2847static int snd_hdsp_info_dds_offset(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
2848{
2849 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2850 uinfo->count = 1;
2851 uinfo->value.integer.min = -5000;
2852 uinfo->value.integer.max = 5000;
2853 return 0;
2854}
2855
2856static int snd_hdsp_get_dds_offset(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2857{
2858 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2859
2860 ucontrol->value.integer.value[0] = hdsp_dds_offset(hdsp);
2861 return 0;
2862}
2863
2864static int snd_hdsp_put_dds_offset(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2865{
2866 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2867 int change;
2868 int val;
2869
2870 if (!snd_hdsp_use_is_exclusive(hdsp))
2871 return -EBUSY;
2872 val = ucontrol->value.integer.value[0];
2873 spin_lock_irq(&hdsp->lock);
2874 if (val != hdsp_dds_offset(hdsp))
2875 change = (hdsp_set_dds_offset(hdsp, val) == 0) ? 1 : 0;
2876 else
2877 change = 0;
2878 spin_unlock_irq(&hdsp->lock);
2879 return change;
2880}
2881
2882static const struct snd_kcontrol_new snd_hdsp_9632_controls[] = {
2883HDSP_DA_GAIN("DA Gain", 0),
2884HDSP_AD_GAIN("AD Gain", 0),
2885HDSP_PHONE_GAIN("Phones Gain", 0),
2886HDSP_TOGGLE_SETTING("XLR Breakout Cable", HDSP_XLRBreakoutCable),
2887HDSP_DDS_OFFSET("DDS Sample Rate Offset", 0)
2888};
2889
2890static const struct snd_kcontrol_new snd_hdsp_controls[] = {
2891{
2892 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
2893 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT),
2894 .info = snd_hdsp_control_spdif_info,
2895 .get = snd_hdsp_control_spdif_get,
2896 .put = snd_hdsp_control_spdif_put,
2897},
2898{
2899 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
2900 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
2901 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,PCM_STREAM),
2902 .info = snd_hdsp_control_spdif_stream_info,
2903 .get = snd_hdsp_control_spdif_stream_get,
2904 .put = snd_hdsp_control_spdif_stream_put,
2905},
2906{
2907 .access = SNDRV_CTL_ELEM_ACCESS_READ,
2908 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
2909 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,CON_MASK),
2910 .info = snd_hdsp_control_spdif_mask_info,
2911 .get = snd_hdsp_control_spdif_mask_get,
2912 .private_value = IEC958_AES0_NONAUDIO |
2913 IEC958_AES0_PROFESSIONAL |
2914 IEC958_AES0_CON_EMPHASIS,
2915},
2916{
2917 .access = SNDRV_CTL_ELEM_ACCESS_READ,
2918 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
2919 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,PRO_MASK),
2920 .info = snd_hdsp_control_spdif_mask_info,
2921 .get = snd_hdsp_control_spdif_mask_get,
2922 .private_value = IEC958_AES0_NONAUDIO |
2923 IEC958_AES0_PROFESSIONAL |
2924 IEC958_AES0_PRO_EMPHASIS,
2925},
2926HDSP_MIXER("Mixer", 0),
2927HDSP_SPDIF_IN("IEC958 Input Connector", 0),
2928HDSP_TOGGLE_SETTING("IEC958 Output also on ADAT1", HDSP_SPDIFOpticalOut),
2929HDSP_TOGGLE_SETTING("IEC958 Professional Bit", HDSP_SPDIFProfessional),
2930HDSP_TOGGLE_SETTING("IEC958 Emphasis Bit", HDSP_SPDIFEmphasis),
2931HDSP_TOGGLE_SETTING("IEC958 Non-audio Bit", HDSP_SPDIFNonAudio),
2932
2933HDSP_CLOCK_SOURCE("Sample Clock Source", 0),
2934{
2935 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2936 .name = "Sample Clock Source Locking",
2937 .info = snd_hdsp_info_clock_source_lock,
2938 .get = snd_hdsp_get_clock_source_lock,
2939 .put = snd_hdsp_put_clock_source_lock,
2940},
2941HDSP_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
2942HDSP_PREF_SYNC_REF("Preferred Sync Reference", 0),
2943HDSP_AUTOSYNC_REF("AutoSync Reference", 0),
2944HDSP_SPDIF_SAMPLE_RATE("SPDIF Sample Rate", 0),
2945HDSP_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
2946
2947HDSP_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
2948HDSP_WC_SYNC_CHECK("Word Clock Lock Status", 0),
2949HDSP_SPDIF_SYNC_CHECK("SPDIF Lock Status", 0),
2950HDSP_ADATSYNC_SYNC_CHECK("ADAT Sync Lock Status", 0),
2951HDSP_TOGGLE_SETTING("Line Out", HDSP_LineOut),
2952HDSP_PRECISE_POINTER("Precise Pointer", 0),
2953HDSP_USE_MIDI_WORK("Use Midi Tasklet", 0),
2954};
2955
2956
2957static int hdsp_rpm_input12(struct hdsp *hdsp)
2958{
2959 switch (hdsp->control_register & HDSP_RPM_Inp12) {
2960 case HDSP_RPM_Inp12_Phon_6dB:
2961 return 0;
2962 case HDSP_RPM_Inp12_Phon_n6dB:
2963 return 2;
2964 case HDSP_RPM_Inp12_Line_0dB:
2965 return 3;
2966 case HDSP_RPM_Inp12_Line_n6dB:
2967 return 4;
2968 }
2969 return 1;
2970}
2971
2972
2973static int snd_hdsp_get_rpm_input12(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2974{
2975 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
2976
2977 ucontrol->value.enumerated.item[0] = hdsp_rpm_input12(hdsp);
2978 return 0;
2979}
2980
2981
2982static int hdsp_set_rpm_input12(struct hdsp *hdsp, int mode)
2983{
2984 hdsp->control_register &= ~HDSP_RPM_Inp12;
2985 switch (mode) {
2986 case 0:
2987 hdsp->control_register |= HDSP_RPM_Inp12_Phon_6dB;
2988 break;
2989 case 1:
2990 break;
2991 case 2:
2992 hdsp->control_register |= HDSP_RPM_Inp12_Phon_n6dB;
2993 break;
2994 case 3:
2995 hdsp->control_register |= HDSP_RPM_Inp12_Line_0dB;
2996 break;
2997 case 4:
2998 hdsp->control_register |= HDSP_RPM_Inp12_Line_n6dB;
2999 break;
3000 default:
3001 return -1;
3002 }
3003
3004 hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
3005 return 0;
3006}
3007
3008
3009static int snd_hdsp_put_rpm_input12(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
3010{
3011 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
3012 int change;
3013 int val;
3014
3015 if (!snd_hdsp_use_is_exclusive(hdsp))
3016 return -EBUSY;
3017 val = ucontrol->value.enumerated.item[0];
3018 if (val < 0)
3019 val = 0;
3020 if (val > 4)
3021 val = 4;
3022 spin_lock_irq(&hdsp->lock);
3023 if (val != hdsp_rpm_input12(hdsp))
3024 change = (hdsp_set_rpm_input12(hdsp, val) == 0) ? 1 : 0;
3025 else
3026 change = 0;
3027 spin_unlock_irq(&hdsp->lock);
3028 return change;
3029}
3030
3031
3032static int snd_hdsp_info_rpm_input(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
3033{
3034 static const char * const texts[] = {
3035 "Phono +6dB", "Phono 0dB", "Phono -6dB", "Line 0dB", "Line -6dB"
3036 };
3037
3038 return snd_ctl_enum_info(uinfo, 1, 5, texts);
3039}
3040
3041
3042static int hdsp_rpm_input34(struct hdsp *hdsp)
3043{
3044 switch (hdsp->control_register & HDSP_RPM_Inp34) {
3045 case HDSP_RPM_Inp34_Phon_6dB:
3046 return 0;
3047 case HDSP_RPM_Inp34_Phon_n6dB:
3048 return 2;
3049 case HDSP_RPM_Inp34_Line_0dB:
3050 return 3;
3051 case HDSP_RPM_Inp34_Line_n6dB:
3052 return 4;
3053 }
3054 return 1;
3055}
3056
3057
3058static int snd_hdsp_get_rpm_input34(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
3059{
3060 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
3061
3062 ucontrol->value.enumerated.item[0] = hdsp_rpm_input34(hdsp);
3063 return 0;
3064}
3065
3066
3067static int hdsp_set_rpm_input34(struct hdsp *hdsp, int mode)
3068{
3069 hdsp->control_register &= ~HDSP_RPM_Inp34;
3070 switch (mode) {
3071 case 0:
3072 hdsp->control_register |= HDSP_RPM_Inp34_Phon_6dB;
3073 break;
3074 case 1:
3075 break;
3076 case 2:
3077 hdsp->control_register |= HDSP_RPM_Inp34_Phon_n6dB;
3078 break;
3079 case 3:
3080 hdsp->control_register |= HDSP_RPM_Inp34_Line_0dB;
3081 break;
3082 case 4:
3083 hdsp->control_register |= HDSP_RPM_Inp34_Line_n6dB;
3084 break;
3085 default:
3086 return -1;
3087 }
3088
3089 hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
3090 return 0;
3091}
3092
3093
3094static int snd_hdsp_put_rpm_input34(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
3095{
3096 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
3097 int change;
3098 int val;
3099
3100 if (!snd_hdsp_use_is_exclusive(hdsp))
3101 return -EBUSY;
3102 val = ucontrol->value.enumerated.item[0];
3103 if (val < 0)
3104 val = 0;
3105 if (val > 4)
3106 val = 4;
3107 spin_lock_irq(&hdsp->lock);
3108 if (val != hdsp_rpm_input34(hdsp))
3109 change = (hdsp_set_rpm_input34(hdsp, val) == 0) ? 1 : 0;
3110 else
3111 change = 0;
3112 spin_unlock_irq(&hdsp->lock);
3113 return change;
3114}
3115
3116
3117
3118static int hdsp_rpm_bypass(struct hdsp *hdsp)
3119{
3120 return (hdsp->control_register & HDSP_RPM_Bypass) ? 1 : 0;
3121}
3122
3123
3124static int snd_hdsp_get_rpm_bypass(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
3125{
3126 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
3127
3128 ucontrol->value.integer.value[0] = hdsp_rpm_bypass(hdsp);
3129 return 0;
3130}
3131
3132
3133static int hdsp_set_rpm_bypass(struct hdsp *hdsp, int on)
3134{
3135 if (on)
3136 hdsp->control_register |= HDSP_RPM_Bypass;
3137 else
3138 hdsp->control_register &= ~HDSP_RPM_Bypass;
3139 hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
3140 return 0;
3141}
3142
3143
3144static int snd_hdsp_put_rpm_bypass(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
3145{
3146 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
3147 int change;
3148 unsigned int val;
3149
3150 if (!snd_hdsp_use_is_exclusive(hdsp))
3151 return -EBUSY;
3152 val = ucontrol->value.integer.value[0] & 1;
3153 spin_lock_irq(&hdsp->lock);
3154 change = (int)val != hdsp_rpm_bypass(hdsp);
3155 hdsp_set_rpm_bypass(hdsp, val);
3156 spin_unlock_irq(&hdsp->lock);
3157 return change;
3158}
3159
3160
3161static int snd_hdsp_info_rpm_bypass(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
3162{
3163 static const char * const texts[] = {"On", "Off"};
3164
3165 return snd_ctl_enum_info(uinfo, 1, 2, texts);
3166}
3167
3168
3169
3170static int hdsp_rpm_disconnect(struct hdsp *hdsp)
3171{
3172 return (hdsp->control_register & HDSP_RPM_Disconnect) ? 1 : 0;
3173}
3174
3175
3176static int snd_hdsp_get_rpm_disconnect(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
3177{
3178 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
3179
3180 ucontrol->value.integer.value[0] = hdsp_rpm_disconnect(hdsp);
3181 return 0;
3182}
3183
3184
3185static int hdsp_set_rpm_disconnect(struct hdsp *hdsp, int on)
3186{
3187 if (on)
3188 hdsp->control_register |= HDSP_RPM_Disconnect;
3189 else
3190 hdsp->control_register &= ~HDSP_RPM_Disconnect;
3191 hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
3192 return 0;
3193}
3194
3195
3196static int snd_hdsp_put_rpm_disconnect(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
3197{
3198 struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
3199 int change;
3200 unsigned int val;
3201
3202 if (!snd_hdsp_use_is_exclusive(hdsp))
3203 return -EBUSY;
3204 val = ucontrol->value.integer.value[0] & 1;
3205 spin_lock_irq(&hdsp->lock);
3206 change = (int)val != hdsp_rpm_disconnect(hdsp);
3207 hdsp_set_rpm_disconnect(hdsp, val);
3208 spin_unlock_irq(&hdsp->lock);
3209 return change;
3210}
3211
3212static int snd_hdsp_info_rpm_disconnect(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
3213{
3214 static const char * const texts[] = {"On", "Off"};
3215
3216 return snd_ctl_enum_info(uinfo, 1, 2, texts);
3217}
3218
3219static const struct snd_kcontrol_new snd_hdsp_rpm_controls[] = {
3220 {
3221 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3222 .name = "RPM Bypass",
3223 .get = snd_hdsp_get_rpm_bypass,
3224 .put = snd_hdsp_put_rpm_bypass,
3225 .info = snd_hdsp_info_rpm_bypass
3226 },
3227 {
3228 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3229 .name = "RPM Disconnect",
3230 .get = snd_hdsp_get_rpm_disconnect,
3231 .put = snd_hdsp_put_rpm_disconnect,
3232 .info = snd_hdsp_info_rpm_disconnect
3233 },
3234 {
3235 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3236 .name = "Input 1/2",
3237 .get = snd_hdsp_get_rpm_input12,
3238 .put = snd_hdsp_put_rpm_input12,
3239 .info = snd_hdsp_info_rpm_input
3240 },
3241 {
3242 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3243 .name = "Input 3/4",
3244 .get = snd_hdsp_get_rpm_input34,
3245 .put = snd_hdsp_put_rpm_input34,
3246 .info = snd_hdsp_info_rpm_input
3247 },
3248 HDSP_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
3249 HDSP_MIXER("Mixer", 0)
3250};
3251
3252static const struct snd_kcontrol_new snd_hdsp_96xx_aeb =
3253 HDSP_TOGGLE_SETTING("Analog Extension Board",
3254 HDSP_AnalogExtensionBoard);
3255static struct snd_kcontrol_new snd_hdsp_adat_sync_check = HDSP_ADAT_SYNC_CHECK;
3256
3257
3258static bool hdsp_loopback_get(struct hdsp *const hdsp, const u8 channel)
3259{
3260 return hdsp->io_loopback & (1 << channel);
3261}
3262
3263static int hdsp_loopback_set(struct hdsp *const hdsp, const u8 channel, const bool enable)
3264{
3265 if (hdsp_loopback_get(hdsp, channel) == enable)
3266 return 0;
3267
3268 hdsp->io_loopback ^= (1 << channel);
3269
3270 hdsp_write(hdsp, HDSP_inputEnable + (4 * (hdsp->max_channels + channel)), enable);
3271
3272 return 1;
3273}
3274
3275static int snd_hdsp_loopback_get(struct snd_kcontrol *const kcontrol,
3276 struct snd_ctl_elem_value *const ucontrol)
3277{
3278 struct hdsp *const hdsp = snd_kcontrol_chip(kcontrol);
3279 const u8 channel = snd_ctl_get_ioff(kcontrol, &ucontrol->id);
3280
3281 if (channel >= hdsp->max_channels)
3282 return -ENOENT;
3283
3284 ucontrol->value.integer.value[0] = hdsp_loopback_get(hdsp, channel);
3285
3286 return 0;
3287}
3288
3289static int snd_hdsp_loopback_put(struct snd_kcontrol *const kcontrol,
3290 struct snd_ctl_elem_value *const ucontrol)
3291{
3292 struct hdsp *const hdsp = snd_kcontrol_chip(kcontrol);
3293 const u8 channel = snd_ctl_get_ioff(kcontrol, &ucontrol->id);
3294 const bool enable = ucontrol->value.integer.value[0] & 1;
3295
3296 if (channel >= hdsp->max_channels)
3297 return -ENOENT;
3298
3299 return hdsp_loopback_set(hdsp, channel, enable);
3300}
3301
3302static struct snd_kcontrol_new snd_hdsp_loopback_control = {
3303 .iface = SNDRV_CTL_ELEM_IFACE_HWDEP,
3304 .name = "Output Loopback",
3305 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
3306 .info = snd_ctl_boolean_mono_info,
3307 .get = snd_hdsp_loopback_get,
3308 .put = snd_hdsp_loopback_put
3309};
3310
3311static int snd_hdsp_create_controls(struct snd_card *card, struct hdsp *hdsp)
3312{
3313 unsigned int idx;
3314 int err;
3315 struct snd_kcontrol *kctl;
3316
3317 if (hdsp->io_type == RPM) {
3318
3319 for (idx = 0; idx < ARRAY_SIZE(snd_hdsp_rpm_controls); idx++) {
3320 err = snd_ctl_add(card, kctl = snd_ctl_new1(&snd_hdsp_rpm_controls[idx], hdsp));
3321 if (err < 0)
3322 return err;
3323 }
3324 return 0;
3325 }
3326
3327 for (idx = 0; idx < ARRAY_SIZE(snd_hdsp_controls); idx++) {
3328 kctl = snd_ctl_new1(&snd_hdsp_controls[idx], hdsp);
3329 err = snd_ctl_add(card, kctl);
3330 if (err < 0)
3331 return err;
3332 if (idx == 1)
3333 hdsp->spdif_ctl = kctl;
3334 }
3335
3336
3337 snd_hdsp_adat_sync_check.name = "ADAT Lock Status";
3338 snd_hdsp_adat_sync_check.index = 1;
3339 kctl = snd_ctl_new1(&snd_hdsp_adat_sync_check, hdsp);
3340 err = snd_ctl_add(card, kctl);
3341 if (err < 0)
3342 return err;
3343 if (hdsp->io_type == Digiface || hdsp->io_type == H9652) {
3344 for (idx = 1; idx < 3; ++idx) {
3345 snd_hdsp_adat_sync_check.index = idx+1;
3346 kctl = snd_ctl_new1(&snd_hdsp_adat_sync_check, hdsp);
3347 err = snd_ctl_add(card, kctl);
3348 if (err < 0)
3349 return err;
3350 }
3351 }
3352
3353
3354 if (hdsp->io_type == H9632) {
3355 for (idx = 0; idx < ARRAY_SIZE(snd_hdsp_9632_controls); idx++) {
3356 kctl = snd_ctl_new1(&snd_hdsp_9632_controls[idx], hdsp);
3357 err = snd_ctl_add(card, kctl);
3358 if (err < 0)
3359 return err;
3360 }
3361 }
3362
3363
3364 if (hdsp->io_type == H9632) {
3365 snd_hdsp_loopback_control.count = hdsp->max_channels;
3366 kctl = snd_ctl_new1(&snd_hdsp_loopback_control, hdsp);
3367 if (kctl == NULL)
3368 return -ENOMEM;
3369 err = snd_ctl_add(card, kctl);
3370 if (err < 0)
3371 return err;
3372 }
3373
3374
3375 if (hdsp->io_type == H9632 || hdsp->io_type == H9652) {
3376 kctl = snd_ctl_new1(&snd_hdsp_96xx_aeb, hdsp);
3377 err = snd_ctl_add(card, kctl);
3378 if (err < 0)
3379 return err;
3380 }
3381
3382 return 0;
3383}
3384
3385
3386
3387
3388
3389static void
3390snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer)
3391{
3392 struct hdsp *hdsp = entry->private_data;
3393 unsigned int status;
3394 unsigned int status2;
3395 char *pref_sync_ref;
3396 char *autosync_ref;
3397 char *system_clock_mode;
3398 char *clock_source;
3399 int x;
3400
3401 status = hdsp_read(hdsp, HDSP_statusRegister);
3402 status2 = hdsp_read(hdsp, HDSP_status2Register);
3403
3404 snd_iprintf(buffer, "%s (Card #%d)\n", hdsp->card_name,
3405 hdsp->card->number + 1);
3406 snd_iprintf(buffer, "Buffers: capture %p playback %p\n",
3407 hdsp->capture_buffer, hdsp->playback_buffer);
3408 snd_iprintf(buffer, "IRQ: %d Registers bus: 0x%lx VM: 0x%lx\n",
3409 hdsp->irq, hdsp->port, (unsigned long)hdsp->iobase);
3410 snd_iprintf(buffer, "Control register: 0x%x\n", hdsp->control_register);
3411 snd_iprintf(buffer, "Control2 register: 0x%x\n",
3412 hdsp->control2_register);
3413 snd_iprintf(buffer, "Status register: 0x%x\n", status);
3414 snd_iprintf(buffer, "Status2 register: 0x%x\n", status2);
3415
3416 if (hdsp_check_for_iobox(hdsp)) {
3417 snd_iprintf(buffer, "No I/O box connected.\n"
3418 "Please connect one and upload firmware.\n");
3419 return;
3420 }
3421
3422 if (hdsp_check_for_firmware(hdsp, 0)) {
3423 if (hdsp->state & HDSP_FirmwareCached) {
3424 if (snd_hdsp_load_firmware_from_cache(hdsp) != 0) {
3425 snd_iprintf(buffer, "Firmware loading from "
3426 "cache failed, "
3427 "please upload manually.\n");
3428 return;
3429 }
3430 } else {
3431 int err;
3432
3433 err = hdsp_request_fw_loader(hdsp);
3434 if (err < 0) {
3435 snd_iprintf(buffer,
3436 "No firmware loaded nor cached, "
3437 "please upload firmware.\n");
3438 return;
3439 }
3440 }
3441 }
3442
3443 snd_iprintf(buffer, "FIFO status: %d\n", hdsp_read(hdsp, HDSP_fifoStatus) & 0xff);
3444 snd_iprintf(buffer, "MIDI1 Output status: 0x%x\n", hdsp_read(hdsp, HDSP_midiStatusOut0));
3445 snd_iprintf(buffer, "MIDI1 Input status: 0x%x\n", hdsp_read(hdsp, HDSP_midiStatusIn0));
3446 snd_iprintf(buffer, "MIDI2 Output status: 0x%x\n", hdsp_read(hdsp, HDSP_midiStatusOut1));
3447 snd_iprintf(buffer, "MIDI2 Input status: 0x%x\n", hdsp_read(hdsp, HDSP_midiStatusIn1));
3448 snd_iprintf(buffer, "Use Midi Tasklet: %s\n", hdsp->use_midi_work ? "on" : "off");
3449
3450 snd_iprintf(buffer, "\n");
3451
3452 x = 1 << (6 + hdsp_decode_latency(hdsp->control_register & HDSP_LatencyMask));
3453
3454 snd_iprintf(buffer, "Buffer Size (Latency): %d samples (2 periods of %lu bytes)\n", x, (unsigned long) hdsp->period_bytes);
3455 snd_iprintf(buffer, "Hardware pointer (frames): %ld\n", hdsp_hw_pointer(hdsp));
3456 snd_iprintf(buffer, "Precise pointer: %s\n", hdsp->precise_ptr ? "on" : "off");
3457 snd_iprintf(buffer, "Line out: %s\n", (hdsp->control_register & HDSP_LineOut) ? "on" : "off");
3458
3459 snd_iprintf(buffer, "Firmware version: %d\n", (status2&HDSP_version0)|(status2&HDSP_version1)<<1|(status2&HDSP_version2)<<2);
3460
3461 snd_iprintf(buffer, "\n");
3462
3463 switch (hdsp_clock_source(hdsp)) {
3464 case HDSP_CLOCK_SOURCE_AUTOSYNC:
3465 clock_source = "AutoSync";
3466 break;
3467 case HDSP_CLOCK_SOURCE_INTERNAL_32KHZ:
3468 clock_source = "Internal 32 kHz";
3469 break;
3470 case HDSP_CLOCK_SOURCE_INTERNAL_44_1KHZ:
3471 clock_source = "Internal 44.1 kHz";
3472 break;
3473 case HDSP_CLOCK_SOURCE_INTERNAL_48KHZ:
3474 clock_source = "Internal 48 kHz";
3475 break;
3476 case HDSP_CLOCK_SOURCE_INTERNAL_64KHZ:
3477 clock_source = "Internal 64 kHz";
3478 break;
3479 case HDSP_CLOCK_SOURCE_INTERNAL_88_2KHZ:
3480 clock_source = "Internal 88.2 kHz";
3481 break;
3482 case HDSP_CLOCK_SOURCE_INTERNAL_96KHZ:
3483 clock_source = "Internal 96 kHz";
3484 break;
3485 case HDSP_CLOCK_SOURCE_INTERNAL_128KHZ:
3486 clock_source = "Internal 128 kHz";
3487 break;
3488 case HDSP_CLOCK_SOURCE_INTERNAL_176_4KHZ:
3489 clock_source = "Internal 176.4 kHz";
3490 break;
3491 case HDSP_CLOCK_SOURCE_INTERNAL_192KHZ:
3492 clock_source = "Internal 192 kHz";
3493 break;
3494 default:
3495 clock_source = "Error";
3496 }
3497 snd_iprintf (buffer, "Sample Clock Source: %s\n", clock_source);
3498
3499 if (hdsp_system_clock_mode(hdsp))
3500 system_clock_mode = "Slave";
3501 else
3502 system_clock_mode = "Master";
3503
3504 switch (hdsp_pref_sync_ref (hdsp)) {
3505 case HDSP_SYNC_FROM_WORD:
3506 pref_sync_ref = "Word Clock";
3507 break;
3508 case HDSP_SYNC_FROM_ADAT_SYNC:
3509 pref_sync_ref = "ADAT Sync";
3510 break;
3511 case HDSP_SYNC_FROM_SPDIF:
3512 pref_sync_ref = "SPDIF";
3513 break;
3514 case HDSP_SYNC_FROM_ADAT1:
3515 pref_sync_ref = "ADAT1";
3516 break;
3517 case HDSP_SYNC_FROM_ADAT2:
3518 pref_sync_ref = "ADAT2";
3519 break;
3520 case HDSP_SYNC_FROM_ADAT3:
3521 pref_sync_ref = "ADAT3";
3522 break;
3523 default:
3524 pref_sync_ref = "Word Clock";
3525 break;
3526 }
3527 snd_iprintf (buffer, "Preferred Sync Reference: %s\n", pref_sync_ref);
3528
3529 switch (hdsp_autosync_ref (hdsp)) {
3530 case HDSP_AUTOSYNC_FROM_WORD:
3531 autosync_ref = "Word Clock";
3532 break;
3533 case HDSP_AUTOSYNC_FROM_ADAT_SYNC:
3534 autosync_ref = "ADAT Sync";
3535 break;
3536 case HDSP_AUTOSYNC_FROM_SPDIF:
3537 autosync_ref = "SPDIF";
3538 break;
3539 case HDSP_AUTOSYNC_FROM_NONE:
3540 autosync_ref = "None";
3541 break;
3542 case HDSP_AUTOSYNC_FROM_ADAT1:
3543 autosync_ref = "ADAT1";
3544 break;
3545 case HDSP_AUTOSYNC_FROM_ADAT2:
3546 autosync_ref = "ADAT2";
3547 break;
3548 case HDSP_AUTOSYNC_FROM_ADAT3:
3549 autosync_ref = "ADAT3";
3550 break;
3551 default:
3552 autosync_ref = "---";
3553 break;
3554 }
3555 snd_iprintf (buffer, "AutoSync Reference: %s\n", autosync_ref);
3556
3557 snd_iprintf (buffer, "AutoSync Frequency: %d\n", hdsp_external_sample_rate(hdsp));
3558
3559 snd_iprintf (buffer, "System Clock Mode: %s\n", system_clock_mode);
3560
3561 snd_iprintf (buffer, "System Clock Frequency: %d\n", hdsp->system_sample_rate);
3562 snd_iprintf (buffer, "System Clock Locked: %s\n", hdsp->clock_source_locked ? "Yes" : "No");
3563
3564 snd_iprintf(buffer, "\n");
3565
3566 if (hdsp->io_type != RPM) {
3567 switch (hdsp_spdif_in(hdsp)) {
3568 case HDSP_SPDIFIN_OPTICAL:
3569 snd_iprintf(buffer, "IEC958 input: Optical\n");
3570 break;
3571 case HDSP_SPDIFIN_COAXIAL:
3572 snd_iprintf(buffer, "IEC958 input: Coaxial\n");
3573 break;
3574 case HDSP_SPDIFIN_INTERNAL:
3575 snd_iprintf(buffer, "IEC958 input: Internal\n");
3576 break;
3577 case HDSP_SPDIFIN_AES:
3578 snd_iprintf(buffer, "IEC958 input: AES\n");
3579 break;
3580 default:
3581 snd_iprintf(buffer, "IEC958 input: ???\n");
3582 break;
3583 }
3584 }
3585
3586 if (RPM == hdsp->io_type) {
3587 if (hdsp->control_register & HDSP_RPM_Bypass)
3588 snd_iprintf(buffer, "RPM Bypass: disabled\n");
3589 else
3590 snd_iprintf(buffer, "RPM Bypass: enabled\n");
3591 if (hdsp->control_register & HDSP_RPM_Disconnect)
3592 snd_iprintf(buffer, "RPM disconnected\n");
3593 else
3594 snd_iprintf(buffer, "RPM connected\n");
3595
3596 switch (hdsp->control_register & HDSP_RPM_Inp12) {
3597 case HDSP_RPM_Inp12_Phon_6dB:
3598 snd_iprintf(buffer, "Input 1/2: Phono, 6dB\n");
3599 break;
3600 case HDSP_RPM_Inp12_Phon_0dB:
3601 snd_iprintf(buffer, "Input 1/2: Phono, 0dB\n");
3602 break;
3603 case HDSP_RPM_Inp12_Phon_n6dB:
3604 snd_iprintf(buffer, "Input 1/2: Phono, -6dB\n");
3605 break;
3606 case HDSP_RPM_Inp12_Line_0dB:
3607 snd_iprintf(buffer, "Input 1/2: Line, 0dB\n");
3608 break;
3609 case HDSP_RPM_Inp12_Line_n6dB:
3610 snd_iprintf(buffer, "Input 1/2: Line, -6dB\n");
3611 break;
3612 default:
3613 snd_iprintf(buffer, "Input 1/2: ???\n");
3614 }
3615
3616 switch (hdsp->control_register & HDSP_RPM_Inp34) {
3617 case HDSP_RPM_Inp34_Phon_6dB:
3618 snd_iprintf(buffer, "Input 3/4: Phono, 6dB\n");
3619 break;
3620 case HDSP_RPM_Inp34_Phon_0dB:
3621 snd_iprintf(buffer, "Input 3/4: Phono, 0dB\n");
3622 break;
3623 case HDSP_RPM_Inp34_Phon_n6dB:
3624 snd_iprintf(buffer, "Input 3/4: Phono, -6dB\n");
3625 break;
3626 case HDSP_RPM_Inp34_Line_0dB:
3627 snd_iprintf(buffer, "Input 3/4: Line, 0dB\n");
3628 break;
3629 case HDSP_RPM_Inp34_Line_n6dB:
3630 snd_iprintf(buffer, "Input 3/4: Line, -6dB\n");
3631 break;
3632 default:
3633 snd_iprintf(buffer, "Input 3/4: ???\n");
3634 }
3635
3636 } else {
3637 if (hdsp->control_register & HDSP_SPDIFOpticalOut)
3638 snd_iprintf(buffer, "IEC958 output: Coaxial & ADAT1\n");
3639 else
3640 snd_iprintf(buffer, "IEC958 output: Coaxial only\n");
3641
3642 if (hdsp->control_register & HDSP_SPDIFProfessional)
3643 snd_iprintf(buffer, "IEC958 quality: Professional\n");
3644 else
3645 snd_iprintf(buffer, "IEC958 quality: Consumer\n");
3646
3647 if (hdsp->control_register & HDSP_SPDIFEmphasis)
3648 snd_iprintf(buffer, "IEC958 emphasis: on\n");
3649 else
3650 snd_iprintf(buffer, "IEC958 emphasis: off\n");
3651
3652 if (hdsp->control_register & HDSP_SPDIFNonAudio)
3653 snd_iprintf(buffer, "IEC958 NonAudio: on\n");
3654 else
3655 snd_iprintf(buffer, "IEC958 NonAudio: off\n");
3656 x = hdsp_spdif_sample_rate(hdsp);
3657 if (x != 0)
3658 snd_iprintf(buffer, "IEC958 sample rate: %d\n", x);
3659 else
3660 snd_iprintf(buffer, "IEC958 sample rate: Error flag set\n");
3661 }
3662 snd_iprintf(buffer, "\n");
3663
3664
3665 x = status & HDSP_Sync0;
3666 if (status & HDSP_Lock0)
3667 snd_iprintf(buffer, "ADAT1: %s\n", x ? "Sync" : "Lock");
3668 else
3669 snd_iprintf(buffer, "ADAT1: No Lock\n");
3670
3671 switch (hdsp->io_type) {
3672 case Digiface:
3673 case H9652:
3674 x = status & HDSP_Sync1;
3675 if (status & HDSP_Lock1)
3676 snd_iprintf(buffer, "ADAT2: %s\n", x ? "Sync" : "Lock");
3677 else
3678 snd_iprintf(buffer, "ADAT2: No Lock\n");
3679 x = status & HDSP_Sync2;
3680 if (status & HDSP_Lock2)
3681 snd_iprintf(buffer, "ADAT3: %s\n", x ? "Sync" : "Lock");
3682 else
3683 snd_iprintf(buffer, "ADAT3: No Lock\n");
3684 break;
3685 default:
3686
3687 break;
3688 }
3689
3690 x = status & HDSP_SPDIFSync;
3691 if (status & HDSP_SPDIFErrorFlag)
3692 snd_iprintf (buffer, "SPDIF: No Lock\n");
3693 else
3694 snd_iprintf (buffer, "SPDIF: %s\n", x ? "Sync" : "Lock");
3695
3696 x = status2 & HDSP_wc_sync;
3697 if (status2 & HDSP_wc_lock)
3698 snd_iprintf (buffer, "Word Clock: %s\n", x ? "Sync" : "Lock");
3699 else
3700 snd_iprintf (buffer, "Word Clock: No Lock\n");
3701
3702 x = status & HDSP_TimecodeSync;
3703 if (status & HDSP_TimecodeLock)
3704 snd_iprintf(buffer, "ADAT Sync: %s\n", x ? "Sync" : "Lock");
3705 else
3706 snd_iprintf(buffer, "ADAT Sync: No Lock\n");
3707
3708 snd_iprintf(buffer, "\n");
3709
3710
3711 if (hdsp->io_type == H9632) {
3712 char *tmp;
3713
3714 switch (hdsp_ad_gain(hdsp)) {
3715 case 0:
3716 tmp = "-10 dBV";
3717 break;
3718 case 1:
3719 tmp = "+4 dBu";
3720 break;
3721 default:
3722 tmp = "Lo Gain";
3723 break;
3724 }
3725 snd_iprintf(buffer, "AD Gain : %s\n", tmp);
3726
3727 switch (hdsp_da_gain(hdsp)) {
3728 case 0:
3729 tmp = "Hi Gain";
3730 break;
3731 case 1:
3732 tmp = "+4 dBu";
3733 break;
3734 default:
3735 tmp = "-10 dBV";
3736 break;
3737 }
3738 snd_iprintf(buffer, "DA Gain : %s\n", tmp);
3739
3740 switch (hdsp_phone_gain(hdsp)) {
3741 case 0:
3742 tmp = "0 dB";
3743 break;
3744 case 1:
3745 tmp = "-6 dB";
3746 break;
3747 default:
3748 tmp = "-12 dB";
3749 break;
3750 }
3751 snd_iprintf(buffer, "Phones Gain : %s\n", tmp);
3752
3753 snd_iprintf(buffer, "XLR Breakout Cable : %s\n",
3754 hdsp_toggle_setting(hdsp, HDSP_XLRBreakoutCable) ?
3755 "yes" : "no");
3756
3757 if (hdsp->control_register & HDSP_AnalogExtensionBoard)
3758 snd_iprintf(buffer, "AEB : on (ADAT1 internal)\n");
3759 else
3760 snd_iprintf(buffer, "AEB : off (ADAT1 external)\n");
3761 snd_iprintf(buffer, "\n");
3762 }
3763
3764}
3765
3766static void snd_hdsp_proc_init(struct hdsp *hdsp)
3767{
3768 snd_card_ro_proc_new(hdsp->card, "hdsp", hdsp, snd_hdsp_proc_read);
3769}
3770
3771static void snd_hdsp_free_buffers(struct hdsp *hdsp)
3772{
3773 snd_hammerfall_free_buffer(&hdsp->capture_dma_buf, hdsp->pci);
3774 snd_hammerfall_free_buffer(&hdsp->playback_dma_buf, hdsp->pci);
3775}
3776
3777static int snd_hdsp_initialize_memory(struct hdsp *hdsp)
3778{
3779 unsigned long pb_bus, cb_bus;
3780
3781 if (snd_hammerfall_get_buffer(hdsp->pci, &hdsp->capture_dma_buf, HDSP_DMA_AREA_BYTES) < 0 ||
3782 snd_hammerfall_get_buffer(hdsp->pci, &hdsp->playback_dma_buf, HDSP_DMA_AREA_BYTES) < 0) {
3783 if (hdsp->capture_dma_buf.area)
3784 snd_dma_free_pages(&hdsp->capture_dma_buf);
3785 dev_err(hdsp->card->dev,
3786 "%s: no buffers available\n", hdsp->card_name);
3787 return -ENOMEM;
3788 }
3789
3790
3791
3792 cb_bus = ALIGN(hdsp->capture_dma_buf.addr, 0x10000ul);
3793 pb_bus = ALIGN(hdsp->playback_dma_buf.addr, 0x10000ul);
3794
3795
3796
3797 hdsp_write(hdsp, HDSP_inputBufferAddress, cb_bus);
3798 hdsp_write(hdsp, HDSP_outputBufferAddress, pb_bus);
3799
3800 hdsp->capture_buffer = hdsp->capture_dma_buf.area + (cb_bus - hdsp->capture_dma_buf.addr);
3801 hdsp->playback_buffer = hdsp->playback_dma_buf.area + (pb_bus - hdsp->playback_dma_buf.addr);
3802
3803 return 0;
3804}
3805
3806static int snd_hdsp_set_defaults(struct hdsp *hdsp)
3807{
3808 unsigned int i;
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824 hdsp->control_register = HDSP_ClockModeMaster |
3825 HDSP_SPDIFInputCoaxial |
3826 hdsp_encode_latency(7) |
3827 HDSP_LineOut;
3828
3829
3830 hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
3831
3832#ifdef SNDRV_BIG_ENDIAN
3833 hdsp->control2_register = HDSP_BIGENDIAN_MODE;
3834#else
3835 hdsp->control2_register = 0;
3836#endif
3837 if (hdsp->io_type == H9652)
3838 snd_hdsp_9652_enable_mixer (hdsp);
3839 else
3840 hdsp_write (hdsp, HDSP_control2Reg, hdsp->control2_register);
3841
3842 hdsp_reset_hw_pointer(hdsp);
3843 hdsp_compute_period_size(hdsp);
3844
3845
3846
3847 for (i = 0; i < HDSP_MATRIX_MIXER_SIZE; ++i)
3848 hdsp->mixer_matrix[i] = MINUS_INFINITY_GAIN;
3849
3850 for (i = 0; i < ((hdsp->io_type == H9652 || hdsp->io_type == H9632) ? 1352 : HDSP_MATRIX_MIXER_SIZE); ++i) {
3851 if (hdsp_write_gain (hdsp, i, MINUS_INFINITY_GAIN))
3852 return -EIO;
3853 }
3854
3855
3856 if (hdsp->io_type == H9632) {
3857 hdsp->control_register |= (HDSP_DAGainPlus4dBu | HDSP_ADGainPlus4dBu | HDSP_PhoneGain0dB);
3858 hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
3859 }
3860
3861
3862
3863
3864 hdsp_set_rate(hdsp, 48000, 1);
3865
3866 return 0;
3867}
3868
3869static void hdsp_midi_work(struct work_struct *work)
3870{
3871 struct hdsp *hdsp = container_of(work, struct hdsp, midi_work);
3872
3873 if (hdsp->midi[0].pending)
3874 snd_hdsp_midi_input_read (&hdsp->midi[0]);
3875 if (hdsp->midi[1].pending)
3876 snd_hdsp_midi_input_read (&hdsp->midi[1]);
3877}
3878
3879static irqreturn_t snd_hdsp_interrupt(int irq, void *dev_id)
3880{
3881 struct hdsp *hdsp = (struct hdsp *) dev_id;
3882 unsigned int status;
3883 int audio;
3884 int midi0;
3885 int midi1;
3886 unsigned int midi0status;
3887 unsigned int midi1status;
3888 int schedule = 0;
3889
3890 status = hdsp_read(hdsp, HDSP_statusRegister);
3891
3892 audio = status & HDSP_audioIRQPending;
3893 midi0 = status & HDSP_midi0IRQPending;
3894 midi1 = status & HDSP_midi1IRQPending;
3895
3896 if (!audio && !midi0 && !midi1)
3897 return IRQ_NONE;
3898
3899 hdsp_write(hdsp, HDSP_interruptConfirmation, 0);
3900
3901 midi0status = hdsp_read (hdsp, HDSP_midiStatusIn0) & 0xff;
3902 midi1status = hdsp_read (hdsp, HDSP_midiStatusIn1) & 0xff;
3903
3904 if (!(hdsp->state & HDSP_InitializationComplete))
3905 return IRQ_HANDLED;
3906
3907 if (audio) {
3908 if (hdsp->capture_substream)
3909 snd_pcm_period_elapsed(hdsp->pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream);
3910
3911 if (hdsp->playback_substream)
3912 snd_pcm_period_elapsed(hdsp->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream);
3913 }
3914
3915 if (midi0 && midi0status) {
3916 if (hdsp->use_midi_work) {
3917
3918 hdsp->control_register &= ~HDSP_Midi0InterruptEnable;
3919 hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
3920 hdsp->midi[0].pending = 1;
3921 schedule = 1;
3922 } else {
3923 snd_hdsp_midi_input_read (&hdsp->midi[0]);
3924 }
3925 }
3926 if (hdsp->io_type != Multiface && hdsp->io_type != RPM && hdsp->io_type != H9632 && midi1 && midi1status) {
3927 if (hdsp->use_midi_work) {
3928
3929 hdsp->control_register &= ~HDSP_Midi1InterruptEnable;
3930 hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
3931 hdsp->midi[1].pending = 1;
3932 schedule = 1;
3933 } else {
3934 snd_hdsp_midi_input_read (&hdsp->midi[1]);
3935 }
3936 }
3937 if (hdsp->use_midi_work && schedule)
3938 queue_work(system_highpri_wq, &hdsp->midi_work);
3939 return IRQ_HANDLED;
3940}
3941
3942static snd_pcm_uframes_t snd_hdsp_hw_pointer(struct snd_pcm_substream *substream)
3943{
3944 struct hdsp *hdsp = snd_pcm_substream_chip(substream);
3945 return hdsp_hw_pointer(hdsp);
3946}
3947
3948static char *hdsp_channel_buffer_location(struct hdsp *hdsp,
3949 int stream,
3950 int channel)
3951
3952{
3953 int mapped_channel;
3954
3955 if (snd_BUG_ON(channel < 0 || channel >= hdsp->max_channels))
3956 return NULL;
3957
3958 mapped_channel = hdsp->channel_map[channel];
3959 if (mapped_channel < 0)
3960 return NULL;
3961
3962 if (stream == SNDRV_PCM_STREAM_CAPTURE)
3963 return hdsp->capture_buffer + (mapped_channel * HDSP_CHANNEL_BUFFER_BYTES);
3964 else
3965 return hdsp->playback_buffer + (mapped_channel * HDSP_CHANNEL_BUFFER_BYTES);
3966}
3967
3968static int snd_hdsp_playback_copy(struct snd_pcm_substream *substream,
3969 int channel, unsigned long pos,
3970 void __user *src, unsigned long count)
3971{
3972 struct hdsp *hdsp = snd_pcm_substream_chip(substream);
3973 char *channel_buf;
3974
3975 if (snd_BUG_ON(pos + count > HDSP_CHANNEL_BUFFER_BYTES))
3976 return -EINVAL;
3977
3978 channel_buf = hdsp_channel_buffer_location (hdsp, substream->pstr->stream, channel);
3979 if (snd_BUG_ON(!channel_buf))
3980 return -EIO;
3981 if (copy_from_user(channel_buf + pos, src, count))
3982 return -EFAULT;
3983 return 0;
3984}
3985
3986static int snd_hdsp_playback_copy_kernel(struct snd_pcm_substream *substream,
3987 int channel, unsigned long pos,
3988 void *src, unsigned long count)
3989{
3990 struct hdsp *hdsp = snd_pcm_substream_chip(substream);
3991 char *channel_buf;
3992
3993 channel_buf = hdsp_channel_buffer_location(hdsp, substream->pstr->stream, channel);
3994 if (snd_BUG_ON(!channel_buf))
3995 return -EIO;
3996 memcpy(channel_buf + pos, src, count);
3997 return 0;
3998}
3999
4000static int snd_hdsp_capture_copy(struct snd_pcm_substream *substream,
4001 int channel, unsigned long pos,
4002 void __user *dst, unsigned long count)
4003{
4004 struct hdsp *hdsp = snd_pcm_substream_chip(substream);
4005 char *channel_buf;
4006
4007 if (snd_BUG_ON(pos + count > HDSP_CHANNEL_BUFFER_BYTES))
4008 return -EINVAL;
4009
4010 channel_buf = hdsp_channel_buffer_location (hdsp, substream->pstr->stream, channel);
4011 if (snd_BUG_ON(!channel_buf))
4012 return -EIO;
4013 if (copy_to_user(dst, channel_buf + pos, count))
4014 return -EFAULT;
4015 return 0;
4016}
4017
4018static int snd_hdsp_capture_copy_kernel(struct snd_pcm_substream *substream,
4019 int channel, unsigned long pos,
4020 void *dst, unsigned long count)
4021{
4022 struct hdsp *hdsp = snd_pcm_substream_chip(substream);
4023 char *channel_buf;
4024
4025 channel_buf = hdsp_channel_buffer_location(hdsp, substream->pstr->stream, channel);
4026 if (snd_BUG_ON(!channel_buf))
4027 return -EIO;
4028 memcpy(dst, channel_buf + pos, count);
4029 return 0;
4030}
4031
4032static int snd_hdsp_hw_silence(struct snd_pcm_substream *substream,
4033 int channel, unsigned long pos,
4034 unsigned long count)
4035{
4036 struct hdsp *hdsp = snd_pcm_substream_chip(substream);
4037 char *channel_buf;
4038
4039 channel_buf = hdsp_channel_buffer_location (hdsp, substream->pstr->stream, channel);
4040 if (snd_BUG_ON(!channel_buf))
4041 return -EIO;
4042 memset(channel_buf + pos, 0, count);
4043 return 0;
4044}
4045
4046static int snd_hdsp_reset(struct snd_pcm_substream *substream)
4047{
4048 struct snd_pcm_runtime *runtime = substream->runtime;
4049 struct hdsp *hdsp = snd_pcm_substream_chip(substream);
4050 struct snd_pcm_substream *other;
4051 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
4052 other = hdsp->capture_substream;
4053 else
4054 other = hdsp->playback_substream;
4055 if (hdsp->running)
4056 runtime->status->hw_ptr = hdsp_hw_pointer(hdsp);
4057 else
4058 runtime->status->hw_ptr = 0;
4059 if (other) {
4060 struct snd_pcm_substream *s;
4061 struct snd_pcm_runtime *oruntime = other->runtime;
4062 snd_pcm_group_for_each_entry(s, substream) {
4063 if (s == other) {
4064 oruntime->status->hw_ptr = runtime->status->hw_ptr;
4065 break;
4066 }
4067 }
4068 }
4069 return 0;
4070}
4071
4072static int snd_hdsp_hw_params(struct snd_pcm_substream *substream,
4073 struct snd_pcm_hw_params *params)
4074{
4075 struct hdsp *hdsp = snd_pcm_substream_chip(substream);
4076 int err;
4077 pid_t this_pid;
4078 pid_t other_pid;
4079
4080 if (hdsp_check_for_iobox (hdsp))
4081 return -EIO;
4082
4083 if (hdsp_check_for_firmware(hdsp, 1))
4084 return -EIO;
4085
4086 spin_lock_irq(&hdsp->lock);
4087
4088 if (substream->pstr->stream == SNDRV_PCM_STREAM_PLAYBACK) {
4089 hdsp->control_register &= ~(HDSP_SPDIFProfessional | HDSP_SPDIFNonAudio | HDSP_SPDIFEmphasis);
4090 hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register |= hdsp->creg_spdif_stream);
4091 this_pid = hdsp->playback_pid;
4092 other_pid = hdsp->capture_pid;
4093 } else {
4094 this_pid = hdsp->capture_pid;
4095 other_pid = hdsp->playback_pid;
4096 }
4097
4098 if ((other_pid > 0) && (this_pid != other_pid)) {
4099
4100
4101
4102
4103
4104
4105 if (params_rate(params) != hdsp->system_sample_rate) {
4106 spin_unlock_irq(&hdsp->lock);
4107 _snd_pcm_hw_param_setempty(params, SNDRV_PCM_HW_PARAM_RATE);
4108 return -EBUSY;
4109 }
4110
4111 if (params_period_size(params) != hdsp->period_bytes / 4) {
4112 spin_unlock_irq(&hdsp->lock);
4113 _snd_pcm_hw_param_setempty(params, SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
4114 return -EBUSY;
4115 }
4116
4117
4118
4119 spin_unlock_irq(&hdsp->lock);
4120 return 0;
4121
4122 } else {
4123 spin_unlock_irq(&hdsp->lock);
4124 }
4125
4126
4127
4128
4129 spin_lock_irq(&hdsp->lock);
4130 if (! hdsp->clock_source_locked) {
4131 err = hdsp_set_rate(hdsp, params_rate(params), 0);
4132 if (err < 0) {
4133 spin_unlock_irq(&hdsp->lock);
4134 _snd_pcm_hw_param_setempty(params, SNDRV_PCM_HW_PARAM_RATE);
4135 return err;
4136 }
4137 }
4138 spin_unlock_irq(&hdsp->lock);
4139
4140 err = hdsp_set_interrupt_interval(hdsp, params_period_size(params));
4141 if (err < 0) {
4142 _snd_pcm_hw_param_setempty(params, SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
4143 return err;
4144 }
4145
4146 return 0;
4147}
4148
4149static int snd_hdsp_channel_info(struct snd_pcm_substream *substream,
4150 struct snd_pcm_channel_info *info)
4151{
4152 struct hdsp *hdsp = snd_pcm_substream_chip(substream);
4153 unsigned int channel = info->channel;
4154
4155 if (snd_BUG_ON(channel >= hdsp->max_channels))
4156 return -EINVAL;
4157 channel = array_index_nospec(channel, hdsp->max_channels);
4158
4159 if (hdsp->channel_map[channel] < 0)
4160 return -EINVAL;
4161
4162 info->offset = hdsp->channel_map[channel] * HDSP_CHANNEL_BUFFER_BYTES;
4163 info->first = 0;
4164 info->step = 32;
4165 return 0;
4166}
4167
4168static int snd_hdsp_ioctl(struct snd_pcm_substream *substream,
4169 unsigned int cmd, void *arg)
4170{
4171 switch (cmd) {
4172 case SNDRV_PCM_IOCTL1_RESET:
4173 return snd_hdsp_reset(substream);
4174 case SNDRV_PCM_IOCTL1_CHANNEL_INFO:
4175 return snd_hdsp_channel_info(substream, arg);
4176 default:
4177 break;
4178 }
4179
4180 return snd_pcm_lib_ioctl(substream, cmd, arg);
4181}
4182
4183static int snd_hdsp_trigger(struct snd_pcm_substream *substream, int cmd)
4184{
4185 struct hdsp *hdsp = snd_pcm_substream_chip(substream);
4186 struct snd_pcm_substream *other;
4187 int running;
4188
4189 if (hdsp_check_for_iobox (hdsp))
4190 return -EIO;
4191
4192 if (hdsp_check_for_firmware(hdsp, 0))
4193 return -EIO;
4194
4195 spin_lock(&hdsp->lock);
4196 running = hdsp->running;
4197 switch (cmd) {
4198 case SNDRV_PCM_TRIGGER_START:
4199 running |= 1 << substream->stream;
4200 break;
4201 case SNDRV_PCM_TRIGGER_STOP:
4202 running &= ~(1 << substream->stream);
4203 break;
4204 default:
4205 snd_BUG();
4206 spin_unlock(&hdsp->lock);
4207 return -EINVAL;
4208 }
4209 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
4210 other = hdsp->capture_substream;
4211 else
4212 other = hdsp->playback_substream;
4213
4214 if (other) {
4215 struct snd_pcm_substream *s;
4216 snd_pcm_group_for_each_entry(s, substream) {
4217 if (s == other) {
4218 snd_pcm_trigger_done(s, substream);
4219 if (cmd == SNDRV_PCM_TRIGGER_START)
4220 running |= 1 << s->stream;
4221 else
4222 running &= ~(1 << s->stream);
4223 goto _ok;
4224 }
4225 }
4226 if (cmd == SNDRV_PCM_TRIGGER_START) {
4227 if (!(running & (1 << SNDRV_PCM_STREAM_PLAYBACK)) &&
4228 substream->stream == SNDRV_PCM_STREAM_CAPTURE)
4229 hdsp_silence_playback(hdsp);
4230 } else {
4231 if (running &&
4232 substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
4233 hdsp_silence_playback(hdsp);
4234 }
4235 } else {
4236 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
4237 hdsp_silence_playback(hdsp);
4238 }
4239 _ok:
4240 snd_pcm_trigger_done(substream, substream);
4241 if (!hdsp->running && running)
4242 hdsp_start_audio(hdsp);
4243 else if (hdsp->running && !running)
4244 hdsp_stop_audio(hdsp);
4245 hdsp->running = running;
4246 spin_unlock(&hdsp->lock);
4247
4248 return 0;
4249}
4250
4251static int snd_hdsp_prepare(struct snd_pcm_substream *substream)
4252{
4253 struct hdsp *hdsp = snd_pcm_substream_chip(substream);
4254 int result = 0;
4255
4256 if (hdsp_check_for_iobox (hdsp))
4257 return -EIO;
4258
4259 if (hdsp_check_for_firmware(hdsp, 1))
4260 return -EIO;
4261
4262 spin_lock_irq(&hdsp->lock);
4263 if (!hdsp->running)
4264 hdsp_reset_hw_pointer(hdsp);
4265 spin_unlock_irq(&hdsp->lock);
4266 return result;
4267}
4268
4269static const struct snd_pcm_hardware snd_hdsp_playback_subinfo =
4270{
4271 .info = (SNDRV_PCM_INFO_MMAP |
4272 SNDRV_PCM_INFO_MMAP_VALID |
4273 SNDRV_PCM_INFO_NONINTERLEAVED |
4274 SNDRV_PCM_INFO_SYNC_START |
4275 SNDRV_PCM_INFO_DOUBLE),
4276#ifdef SNDRV_BIG_ENDIAN
4277 .formats = SNDRV_PCM_FMTBIT_S32_BE,
4278#else
4279 .formats = SNDRV_PCM_FMTBIT_S32_LE,
4280#endif
4281 .rates = (SNDRV_PCM_RATE_32000 |
4282 SNDRV_PCM_RATE_44100 |
4283 SNDRV_PCM_RATE_48000 |
4284 SNDRV_PCM_RATE_64000 |
4285 SNDRV_PCM_RATE_88200 |
4286 SNDRV_PCM_RATE_96000),
4287 .rate_min = 32000,
4288 .rate_max = 96000,
4289 .channels_min = 6,
4290 .channels_max = HDSP_MAX_CHANNELS,
4291 .buffer_bytes_max = HDSP_CHANNEL_BUFFER_BYTES * HDSP_MAX_CHANNELS,
4292 .period_bytes_min = (64 * 4) * 10,
4293 .period_bytes_max = (8192 * 4) * HDSP_MAX_CHANNELS,
4294 .periods_min = 2,
4295 .periods_max = 2,
4296 .fifo_size = 0
4297};
4298
4299static const struct snd_pcm_hardware snd_hdsp_capture_subinfo =
4300{
4301 .info = (SNDRV_PCM_INFO_MMAP |
4302 SNDRV_PCM_INFO_MMAP_VALID |
4303 SNDRV_PCM_INFO_NONINTERLEAVED |
4304 SNDRV_PCM_INFO_SYNC_START),
4305#ifdef SNDRV_BIG_ENDIAN
4306 .formats = SNDRV_PCM_FMTBIT_S32_BE,
4307#else
4308 .formats = SNDRV_PCM_FMTBIT_S32_LE,
4309#endif
4310 .rates = (SNDRV_PCM_RATE_32000 |
4311 SNDRV_PCM_RATE_44100 |
4312 SNDRV_PCM_RATE_48000 |
4313 SNDRV_PCM_RATE_64000 |
4314 SNDRV_PCM_RATE_88200 |
4315 SNDRV_PCM_RATE_96000),
4316 .rate_min = 32000,
4317 .rate_max = 96000,
4318 .channels_min = 5,
4319 .channels_max = HDSP_MAX_CHANNELS,
4320 .buffer_bytes_max = HDSP_CHANNEL_BUFFER_BYTES * HDSP_MAX_CHANNELS,
4321 .period_bytes_min = (64 * 4) * 10,
4322 .period_bytes_max = (8192 * 4) * HDSP_MAX_CHANNELS,
4323 .periods_min = 2,
4324 .periods_max = 2,
4325 .fifo_size = 0
4326};
4327
4328static const unsigned int hdsp_period_sizes[] = { 64, 128, 256, 512, 1024, 2048, 4096, 8192 };
4329
4330static const struct snd_pcm_hw_constraint_list hdsp_hw_constraints_period_sizes = {
4331 .count = ARRAY_SIZE(hdsp_period_sizes),