xref: /openbmc/linux/sound/pci/rme9652/hdspm.c (revision a1e58bbd)
1 /*
2  *   ALSA driver for RME Hammerfall DSP MADI audio interface(s)
3  *
4  *      Copyright (c) 2003 Winfried Ritsch (IEM)
5  *      code based on hdsp.c   Paul Davis
6  *                             Marcus Andersson
7  *                             Thomas Charbonnel
8  *      Modified 2006-06-01 for AES32 support by Remy Bruno
9  *                                               <remy.bruno@trinnov.com>
10  *
11  *   This program is free software; you can redistribute it and/or modify
12  *   it under the terms of the GNU General Public License as published by
13  *   the Free Software Foundation; either version 2 of the License, or
14  *   (at your option) any later version.
15  *
16  *   This program is distributed in the hope that it will be useful,
17  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
18  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  *   GNU General Public License for more details.
20  *
21  *   You should have received a copy of the GNU General Public License
22  *   along with this program; if not, write to the Free Software
23  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
24  *
25  */
26 #include <linux/init.h>
27 #include <linux/delay.h>
28 #include <linux/interrupt.h>
29 #include <linux/moduleparam.h>
30 #include <linux/slab.h>
31 #include <linux/pci.h>
32 #include <asm/io.h>
33 
34 #include <sound/core.h>
35 #include <sound/control.h>
36 #include <sound/pcm.h>
37 #include <sound/info.h>
38 #include <sound/asoundef.h>
39 #include <sound/rawmidi.h>
40 #include <sound/hwdep.h>
41 #include <sound/initval.h>
42 
43 #include <sound/hdspm.h>
44 
45 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	  /* Index 0-MAX */
46 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	  /* ID for this card */
47 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;/* Enable this card */
48 
49 /* Disable precise pointer at start */
50 static int precise_ptr[SNDRV_CARDS];
51 
52 /* Send all playback to line outs */
53 static int line_outs_monitor[SNDRV_CARDS];
54 
55 /* Enable Analog Outs on Channel 63/64 by default */
56 static int enable_monitor[SNDRV_CARDS];
57 
58 module_param_array(index, int, NULL, 0444);
59 MODULE_PARM_DESC(index, "Index value for RME HDSPM interface.");
60 
61 module_param_array(id, charp, NULL, 0444);
62 MODULE_PARM_DESC(id, "ID string for RME HDSPM interface.");
63 
64 module_param_array(enable, bool, NULL, 0444);
65 MODULE_PARM_DESC(enable, "Enable/disable specific HDSPM soundcards.");
66 
67 module_param_array(precise_ptr, bool, NULL, 0444);
68 MODULE_PARM_DESC(precise_ptr, "Enable or disable precise pointer.");
69 
70 module_param_array(line_outs_monitor, bool, NULL, 0444);
71 MODULE_PARM_DESC(line_outs_monitor,
72 		 "Send playback streams to analog outs by default.");
73 
74 module_param_array(enable_monitor, bool, NULL, 0444);
75 MODULE_PARM_DESC(enable_monitor,
76 		 "Enable Analog Out on Channel 63/64 by default.");
77 
78 MODULE_AUTHOR
79       ("Winfried Ritsch <ritsch_AT_iem.at>, "
80        "Paul Davis <paul@linuxaudiosystems.com>, "
81        "Marcus Andersson, Thomas Charbonnel <thomas@undata.org>, "
82        "Remy Bruno <remy.bruno@trinnov.com>");
83 MODULE_DESCRIPTION("RME HDSPM");
84 MODULE_LICENSE("GPL");
85 MODULE_SUPPORTED_DEVICE("{{RME HDSPM-MADI}}");
86 
87 /* --- Write registers. ---
88   These are defined as byte-offsets from the iobase value.  */
89 
90 #define HDSPM_controlRegister	     64
91 #define HDSPM_interruptConfirmation  96
92 #define HDSPM_control2Reg	     256  /* not in specs ???????? */
93 #define HDSPM_freqReg                256  /* for AES32 */
94 #define HDSPM_midiDataOut0  	     352  /* just believe in old code */
95 #define HDSPM_midiDataOut1  	     356
96 #define HDSPM_eeprom_wr		     384  /* for AES32 */
97 
98 /* DMA enable for 64 channels, only Bit 0 is relevant */
99 #define HDSPM_outputEnableBase       512  /* 512-767  input  DMA */
100 #define HDSPM_inputEnableBase        768  /* 768-1023 output DMA */
101 
102 /* 16 page addresses for each of the 64 channels DMA buffer in and out
103    (each 64k=16*4k) Buffer must be 4k aligned (which is default i386 ????) */
104 #define HDSPM_pageAddressBufferOut       8192
105 #define HDSPM_pageAddressBufferIn        (HDSPM_pageAddressBufferOut+64*16*4)
106 
107 #define HDSPM_MADI_mixerBase    32768	/* 32768-65535 for 2x64x64 Fader */
108 
109 #define HDSPM_MATRIX_MIXER_SIZE  8192	/* = 2*64*64 * 4 Byte => 32kB */
110 
111 /* --- Read registers. ---
112    These are defined as byte-offsets from the iobase value */
113 #define HDSPM_statusRegister    0
114 /*#define HDSPM_statusRegister2  96 */
115 /* after RME Windows driver sources, status2 is 4-byte word # 48 = word at
116  * offset 192, for AES32 *and* MADI
117  * => need to check that offset 192 is working on MADI */
118 #define HDSPM_statusRegister2  192
119 #define HDSPM_timecodeRegister 128
120 
121 #define HDSPM_midiDataIn0     360
122 #define HDSPM_midiDataIn1     364
123 
124 /* status is data bytes in MIDI-FIFO (0-128) */
125 #define HDSPM_midiStatusOut0  384
126 #define HDSPM_midiStatusOut1  388
127 #define HDSPM_midiStatusIn0   392
128 #define HDSPM_midiStatusIn1   396
129 
130 
131 /* the meters are regular i/o-mapped registers, but offset
132    considerably from the rest. the peak registers are reset
133    when read; the least-significant 4 bits are full-scale counters;
134    the actual peak value is in the most-significant 24 bits.
135 */
136 #define HDSPM_MADI_peakrmsbase 	4096	/* 4096-8191 2x64x32Bit Meters */
137 
138 /* --- Control Register bits --------- */
139 #define HDSPM_Start                (1<<0) /* start engine */
140 
141 #define HDSPM_Latency0             (1<<1) /* buffer size = 2^n */
142 #define HDSPM_Latency1             (1<<2) /* where n is defined */
143 #define HDSPM_Latency2             (1<<3) /* by Latency{2,1,0} */
144 
145 #define HDSPM_ClockModeMaster      (1<<4) /* 1=Master, 0=Slave/Autosync */
146 
147 #define HDSPM_AudioInterruptEnable (1<<5) /* what do you think ? */
148 
149 #define HDSPM_Frequency0  (1<<6)  /* 0=44.1kHz/88.2kHz 1=48kHz/96kHz */
150 #define HDSPM_Frequency1  (1<<7)  /* 0=32kHz/64kHz */
151 #define HDSPM_DoubleSpeed (1<<8)  /* 0=normal speed, 1=double speed */
152 #define HDSPM_QuadSpeed   (1<<31) /* quad speed bit */
153 
154 #define HDSPM_Professional (1<<9) /* Professional */ /* AES32 ONLY */
155 #define HDSPM_TX_64ch     (1<<10) /* Output 64channel MODE=1,
156 				     56channelMODE=0 */ /* MADI ONLY*/
157 #define HDSPM_Emphasis    (1<<10) /* Emphasis */ /* AES32 ONLY */
158 
159 #define HDSPM_AutoInp     (1<<11) /* Auto Input (takeover) == Safe Mode,
160                                      0=off, 1=on  */ /* MADI ONLY */
161 #define HDSPM_Dolby       (1<<11) /* Dolby = "NonAudio" ?? */ /* AES32 ONLY */
162 
163 #define HDSPM_InputSelect0 (1<<14) /* Input select 0= optical, 1=coax
164 				    * -- MADI ONLY
165 				    */
166 #define HDSPM_InputSelect1 (1<<15) /* should be 0 */
167 
168 #define HDSPM_SyncRef0     (1<<16) /* 0=WOrd, 1=MADI */
169 #define HDSPM_SyncRef1     (1<<17) /* for AES32: SyncRefN codes the AES # */
170 #define HDSPM_SyncRef2     (1<<13)
171 #define HDSPM_SyncRef3     (1<<25)
172 
173 #define HDSPM_SMUX         (1<<18) /* Frame ??? */ /* MADI ONY */
174 #define HDSPM_clr_tms      (1<<19) /* clear track marker, do not use
175                                       AES additional bits in
176 				      lower 5 Audiodatabits ??? */
177 #define HDSPM_taxi_reset   (1<<20) /* ??? */ /* MADI ONLY ? */
178 #define HDSPM_WCK48        (1<<20) /* Frame ??? = HDSPM_SMUX */ /* AES32 ONLY */
179 
180 #define HDSPM_Midi0InterruptEnable (1<<22)
181 #define HDSPM_Midi1InterruptEnable (1<<23)
182 
183 #define HDSPM_LineOut (1<<24) /* Analog Out on channel 63/64 on=1, mute=0 */
184 
185 #define HDSPM_DS_DoubleWire (1<<26) /* AES32 ONLY */
186 #define HDSPM_QS_DoubleWire (1<<27) /* AES32 ONLY */
187 #define HDSPM_QS_QuadWire   (1<<28) /* AES32 ONLY */
188 
189 #define HDSPM_wclk_sel (1<<30)
190 
191 /* --- bit helper defines */
192 #define HDSPM_LatencyMask    (HDSPM_Latency0|HDSPM_Latency1|HDSPM_Latency2)
193 #define HDSPM_FrequencyMask  (HDSPM_Frequency0|HDSPM_Frequency1|\
194 			      HDSPM_DoubleSpeed|HDSPM_QuadSpeed)
195 #define HDSPM_InputMask      (HDSPM_InputSelect0|HDSPM_InputSelect1)
196 #define HDSPM_InputOptical   0
197 #define HDSPM_InputCoaxial   (HDSPM_InputSelect0)
198 #define HDSPM_SyncRefMask    (HDSPM_SyncRef0|HDSPM_SyncRef1|\
199 			      HDSPM_SyncRef2|HDSPM_SyncRef3)
200 #define HDSPM_SyncRef_Word   0
201 #define HDSPM_SyncRef_MADI   (HDSPM_SyncRef0)
202 
203 #define HDSPM_SYNC_FROM_WORD 0	/* Preferred sync reference */
204 #define HDSPM_SYNC_FROM_MADI 1	/* choices - used by "pref_sync_ref" */
205 
206 #define HDSPM_Frequency32KHz    HDSPM_Frequency0
207 #define HDSPM_Frequency44_1KHz  HDSPM_Frequency1
208 #define HDSPM_Frequency48KHz   (HDSPM_Frequency1|HDSPM_Frequency0)
209 #define HDSPM_Frequency64KHz   (HDSPM_DoubleSpeed|HDSPM_Frequency0)
210 #define HDSPM_Frequency88_2KHz (HDSPM_DoubleSpeed|HDSPM_Frequency1)
211 #define HDSPM_Frequency96KHz   (HDSPM_DoubleSpeed|HDSPM_Frequency1|\
212 				HDSPM_Frequency0)
213 #define HDSPM_Frequency128KHz   (HDSPM_QuadSpeed|HDSPM_Frequency0)
214 #define HDSPM_Frequency176_4KHz   (HDSPM_QuadSpeed|HDSPM_Frequency1)
215 #define HDSPM_Frequency192KHz   (HDSPM_QuadSpeed|HDSPM_Frequency1|\
216 				 HDSPM_Frequency0)
217 
218 /* --- for internal discrimination */
219 #define HDSPM_CLOCK_SOURCE_AUTOSYNC          0	/* Sample Clock Sources */
220 #define HDSPM_CLOCK_SOURCE_INTERNAL_32KHZ    1
221 #define HDSPM_CLOCK_SOURCE_INTERNAL_44_1KHZ  2
222 #define HDSPM_CLOCK_SOURCE_INTERNAL_48KHZ    3
223 #define HDSPM_CLOCK_SOURCE_INTERNAL_64KHZ    4
224 #define HDSPM_CLOCK_SOURCE_INTERNAL_88_2KHZ  5
225 #define HDSPM_CLOCK_SOURCE_INTERNAL_96KHZ    6
226 #define HDSPM_CLOCK_SOURCE_INTERNAL_128KHZ   7
227 #define HDSPM_CLOCK_SOURCE_INTERNAL_176_4KHZ 8
228 #define HDSPM_CLOCK_SOURCE_INTERNAL_192KHZ   9
229 
230 /* Synccheck Status */
231 #define HDSPM_SYNC_CHECK_NO_LOCK 0
232 #define HDSPM_SYNC_CHECK_LOCK    1
233 #define HDSPM_SYNC_CHECK_SYNC	 2
234 
235 /* AutoSync References - used by "autosync_ref" control switch */
236 #define HDSPM_AUTOSYNC_FROM_WORD      0
237 #define HDSPM_AUTOSYNC_FROM_MADI      1
238 #define HDSPM_AUTOSYNC_FROM_NONE      2
239 
240 /* Possible sources of MADI input */
241 #define HDSPM_OPTICAL 0		/* optical   */
242 #define HDSPM_COAXIAL 1		/* BNC */
243 
244 #define hdspm_encode_latency(x)       (((x)<<1) & HDSPM_LatencyMask)
245 #define hdspm_decode_latency(x)       (((x) & HDSPM_LatencyMask)>>1)
246 
247 #define hdspm_encode_in(x) (((x)&0x3)<<14)
248 #define hdspm_decode_in(x) (((x)>>14)&0x3)
249 
250 /* --- control2 register bits --- */
251 #define HDSPM_TMS             (1<<0)
252 #define HDSPM_TCK             (1<<1)
253 #define HDSPM_TDI             (1<<2)
254 #define HDSPM_JTAG            (1<<3)
255 #define HDSPM_PWDN            (1<<4)
256 #define HDSPM_PROGRAM	      (1<<5)
257 #define HDSPM_CONFIG_MODE_0   (1<<6)
258 #define HDSPM_CONFIG_MODE_1   (1<<7)
259 /*#define HDSPM_VERSION_BIT     (1<<8) not defined any more*/
260 #define HDSPM_BIGENDIAN_MODE  (1<<9)
261 #define HDSPM_RD_MULTIPLE     (1<<10)
262 
263 /* --- Status Register bits --- */ /* MADI ONLY */ /* Bits defined here and
264      that do not conflict with specific bits for AES32 seem to be valid also
265      for the AES32
266  */
267 #define HDSPM_audioIRQPending    (1<<0)	/* IRQ is high and pending */
268 #define HDSPM_RX_64ch            (1<<1)	/* Input 64chan. MODE=1, 56chn MODE=0 */
269 #define HDSPM_AB_int             (1<<2)	/* InputChannel Opt=0, Coax=1
270 					 * (like inp0)
271 					 */
272 #define HDSPM_madiLock           (1<<3)	/* MADI Locked =1, no=0 */
273 
274 #define HDSPM_BufferPositionMask 0x000FFC0 /* Bit 6..15 : h/w buffer pointer */
275                                            /* since 64byte accurate last 6 bits
276                                               are not used */
277 
278 #define HDSPM_madiSync          (1<<18) /* MADI is in sync */
279 #define HDSPM_DoubleSpeedStatus (1<<19) /* (input) card in double speed */
280 
281 #define HDSPM_madiFreq0         (1<<22)	/* system freq 0=error */
282 #define HDSPM_madiFreq1         (1<<23)	/* 1=32, 2=44.1 3=48 */
283 #define HDSPM_madiFreq2         (1<<24)	/* 4=64, 5=88.2 6=96 */
284 #define HDSPM_madiFreq3         (1<<25)	/* 7=128, 8=176.4 9=192 */
285 
286 #define HDSPM_BufferID          (1<<26)	/* (Double)Buffer ID toggles with
287 					 * Interrupt
288 					 */
289 #define HDSPM_midi0IRQPending   (1<<30)	/* MIDI IRQ is pending  */
290 #define HDSPM_midi1IRQPending   (1<<31)	/* and aktiv */
291 
292 /* --- status bit helpers */
293 #define HDSPM_madiFreqMask  (HDSPM_madiFreq0|HDSPM_madiFreq1|\
294 			     HDSPM_madiFreq2|HDSPM_madiFreq3)
295 #define HDSPM_madiFreq32    (HDSPM_madiFreq0)
296 #define HDSPM_madiFreq44_1  (HDSPM_madiFreq1)
297 #define HDSPM_madiFreq48    (HDSPM_madiFreq0|HDSPM_madiFreq1)
298 #define HDSPM_madiFreq64    (HDSPM_madiFreq2)
299 #define HDSPM_madiFreq88_2  (HDSPM_madiFreq0|HDSPM_madiFreq2)
300 #define HDSPM_madiFreq96    (HDSPM_madiFreq1|HDSPM_madiFreq2)
301 #define HDSPM_madiFreq128   (HDSPM_madiFreq0|HDSPM_madiFreq1|HDSPM_madiFreq2)
302 #define HDSPM_madiFreq176_4 (HDSPM_madiFreq3)
303 #define HDSPM_madiFreq192   (HDSPM_madiFreq3|HDSPM_madiFreq0)
304 
305 /* Status2 Register bits */ /* MADI ONLY */
306 
307 #define HDSPM_version0 (1<<0)	/* not realy defined but I guess */
308 #define HDSPM_version1 (1<<1)	/* in former cards it was ??? */
309 #define HDSPM_version2 (1<<2)
310 
311 #define HDSPM_wcLock (1<<3)	/* Wordclock is detected and locked */
312 #define HDSPM_wcSync (1<<4)	/* Wordclock is in sync with systemclock */
313 
314 #define HDSPM_wc_freq0 (1<<5)	/* input freq detected via autosync  */
315 #define HDSPM_wc_freq1 (1<<6)	/* 001=32, 010==44.1, 011=48, */
316 #define HDSPM_wc_freq2 (1<<7)	/* 100=64, 101=88.2, 110=96, */
317 /* missing Bit   for               111=128, 1000=176.4, 1001=192 */
318 
319 #define HDSPM_SelSyncRef0 (1<<8)	/* Sync Source in slave mode */
320 #define HDSPM_SelSyncRef1 (1<<9)	/* 000=word, 001=MADI, */
321 #define HDSPM_SelSyncRef2 (1<<10)	/* 111=no valid signal */
322 
323 #define HDSPM_wc_valid (HDSPM_wcLock|HDSPM_wcSync)
324 
325 #define HDSPM_wcFreqMask  (HDSPM_wc_freq0|HDSPM_wc_freq1|HDSPM_wc_freq2)
326 #define HDSPM_wcFreq32    (HDSPM_wc_freq0)
327 #define HDSPM_wcFreq44_1  (HDSPM_wc_freq1)
328 #define HDSPM_wcFreq48    (HDSPM_wc_freq0|HDSPM_wc_freq1)
329 #define HDSPM_wcFreq64    (HDSPM_wc_freq2)
330 #define HDSPM_wcFreq88_2  (HDSPM_wc_freq0|HDSPM_wc_freq2)
331 #define HDSPM_wcFreq96    (HDSPM_wc_freq1|HDSPM_wc_freq2)
332 
333 
334 #define HDSPM_SelSyncRefMask       (HDSPM_SelSyncRef0|HDSPM_SelSyncRef1|\
335 				    HDSPM_SelSyncRef2)
336 #define HDSPM_SelSyncRef_WORD      0
337 #define HDSPM_SelSyncRef_MADI      (HDSPM_SelSyncRef0)
338 #define HDSPM_SelSyncRef_NVALID    (HDSPM_SelSyncRef0|HDSPM_SelSyncRef1|\
339 				    HDSPM_SelSyncRef2)
340 
341 /*
342    For AES32, bits for status, status2 and timecode are different
343 */
344 /* status */
345 #define HDSPM_AES32_wcLock	0x0200000
346 #define HDSPM_AES32_wcFreq_bit  22
347 /* (status >> HDSPM_AES32_wcFreq_bit) & 0xF gives WC frequency (cf function
348   HDSPM_bit2freq */
349 #define HDSPM_AES32_syncref_bit  16
350 /* (status >> HDSPM_AES32_syncref_bit) & 0xF gives sync source */
351 
352 #define HDSPM_AES32_AUTOSYNC_FROM_WORD 0
353 #define HDSPM_AES32_AUTOSYNC_FROM_AES1 1
354 #define HDSPM_AES32_AUTOSYNC_FROM_AES2 2
355 #define HDSPM_AES32_AUTOSYNC_FROM_AES3 3
356 #define HDSPM_AES32_AUTOSYNC_FROM_AES4 4
357 #define HDSPM_AES32_AUTOSYNC_FROM_AES5 5
358 #define HDSPM_AES32_AUTOSYNC_FROM_AES6 6
359 #define HDSPM_AES32_AUTOSYNC_FROM_AES7 7
360 #define HDSPM_AES32_AUTOSYNC_FROM_AES8 8
361 #define HDSPM_AES32_AUTOSYNC_FROM_NONE 9
362 
363 /*  status2 */
364 /* HDSPM_LockAES_bit is given by HDSPM_LockAES >> (AES# - 1) */
365 #define HDSPM_LockAES   0x80
366 #define HDSPM_LockAES1  0x80
367 #define HDSPM_LockAES2  0x40
368 #define HDSPM_LockAES3  0x20
369 #define HDSPM_LockAES4  0x10
370 #define HDSPM_LockAES5  0x8
371 #define HDSPM_LockAES6  0x4
372 #define HDSPM_LockAES7  0x2
373 #define HDSPM_LockAES8  0x1
374 /*
375    Timecode
376    After windows driver sources, bits 4*i to 4*i+3 give the input frequency on
377    AES i+1
378  bits 3210
379       0001  32kHz
380       0010  44.1kHz
381       0011  48kHz
382       0100  64kHz
383       0101  88.2kHz
384       0110  96kHz
385       0111  128kHz
386       1000  176.4kHz
387       1001  192kHz
388   NB: Timecode register doesn't seem to work on AES32 card revision 230
389 */
390 
391 /* Mixer Values */
392 #define UNITY_GAIN          32768	/* = 65536/2 */
393 #define MINUS_INFINITY_GAIN 0
394 
395 /* Number of channels for different Speed Modes */
396 #define MADI_SS_CHANNELS       64
397 #define MADI_DS_CHANNELS       32
398 #define MADI_QS_CHANNELS       16
399 
400 /* the size of a substream (1 mono data stream) */
401 #define HDSPM_CHANNEL_BUFFER_SAMPLES  (16*1024)
402 #define HDSPM_CHANNEL_BUFFER_BYTES    (4*HDSPM_CHANNEL_BUFFER_SAMPLES)
403 
404 /* the size of the area we need to allocate for DMA transfers. the
405    size is the same regardless of the number of channels, and
406    also the latency to use.
407    for one direction !!!
408 */
409 #define HDSPM_DMA_AREA_BYTES (HDSPM_MAX_CHANNELS * HDSPM_CHANNEL_BUFFER_BYTES)
410 #define HDSPM_DMA_AREA_KILOBYTES (HDSPM_DMA_AREA_BYTES/1024)
411 
412 /* revisions >= 230 indicate AES32 card */
413 #define HDSPM_AESREVISION 230
414 
415 /* speed factor modes */
416 #define HDSPM_SPEED_SINGLE 0
417 #define HDSPM_SPEED_DOUBLE 1
418 #define HDSPM_SPEED_QUAD   2
419 /* names for speed modes */
420 static char *hdspm_speed_names[] = { "single", "double", "quad" };
421 
422 struct hdspm_midi {
423 	struct hdspm *hdspm;
424 	int id;
425 	struct snd_rawmidi *rmidi;
426 	struct snd_rawmidi_substream *input;
427 	struct snd_rawmidi_substream *output;
428 	char istimer;		/* timer in use */
429 	struct timer_list timer;
430 	spinlock_t lock;
431 	int pending;
432 };
433 
434 struct hdspm {
435         spinlock_t lock;
436 	/* only one playback and/or capture stream */
437         struct snd_pcm_substream *capture_substream;
438         struct snd_pcm_substream *playback_substream;
439 
440 	char *card_name;	     /* for procinfo */
441 	unsigned short firmware_rev; /* dont know if relevant (yes if AES32)*/
442 
443 	unsigned char is_aes32;    /* indicates if card is AES32 */
444 
445 	int precise_ptr;	/* use precise pointers, to be tested */
446 	int monitor_outs;	/* set up monitoring outs init flag */
447 
448 	u32 control_register;	/* cached value */
449 	u32 control2_register;	/* cached value */
450 
451 	struct hdspm_midi midi[2];
452 	struct tasklet_struct midi_tasklet;
453 
454 	size_t period_bytes;
455 	unsigned char ss_channels;	/* channels of card in single speed */
456 	unsigned char ds_channels;	/* Double Speed */
457 	unsigned char qs_channels;	/* Quad Speed */
458 
459 	unsigned char *playback_buffer;	/* suitably aligned address */
460 	unsigned char *capture_buffer;	/* suitably aligned address */
461 
462 	pid_t capture_pid;	/* process id which uses capture */
463 	pid_t playback_pid;	/* process id which uses capture */
464 	int running;		/* running status */
465 
466 	int last_external_sample_rate;	/* samplerate mystic ... */
467 	int last_internal_sample_rate;
468 	int system_sample_rate;
469 
470 	char *channel_map;	/* channel map for DS and Quadspeed */
471 
472 	int dev;		/* Hardware vars... */
473 	int irq;
474 	unsigned long port;
475 	void __iomem *iobase;
476 
477 	int irq_count;		/* for debug */
478 
479 	struct snd_card *card;	/* one card */
480 	struct snd_pcm *pcm;		/* has one pcm */
481 	struct snd_hwdep *hwdep;	/* and a hwdep for additional ioctl */
482 	struct pci_dev *pci;	/* and an pci info */
483 
484 	/* Mixer vars */
485 	/* fast alsa mixer */
486 	struct snd_kcontrol *playback_mixer_ctls[HDSPM_MAX_CHANNELS];
487 	/* but input to much, so not used */
488 	struct snd_kcontrol *input_mixer_ctls[HDSPM_MAX_CHANNELS];
489 	/* full mixer accessable over mixer ioctl or hwdep-device */
490 	struct hdspm_mixer *mixer;
491 
492 };
493 
494 /* These tables map the ALSA channels 1..N to the channels that we
495    need to use in order to find the relevant channel buffer. RME
496    refer to this kind of mapping as between "the ADAT channel and
497    the DMA channel." We index it using the logical audio channel,
498    and the value is the DMA channel (i.e. channel buffer number)
499    where the data for that channel can be read/written from/to.
500 */
501 
502 static char channel_map_madi_ss[HDSPM_MAX_CHANNELS] = {
503    0, 1, 2, 3, 4, 5, 6, 7,
504    8, 9, 10, 11, 12, 13, 14, 15,
505    16, 17, 18, 19, 20, 21, 22, 23,
506    24, 25, 26, 27, 28, 29, 30, 31,
507    32, 33, 34, 35, 36, 37, 38, 39,
508    40, 41, 42, 43, 44, 45, 46, 47,
509    48, 49, 50, 51, 52, 53, 54, 55,
510    56, 57, 58, 59, 60, 61, 62, 63
511 };
512 
513 
514 static struct pci_device_id snd_hdspm_ids[] __devinitdata = {
515 	{
516 	 .vendor = PCI_VENDOR_ID_XILINX,
517 	 .device = PCI_DEVICE_ID_XILINX_HAMMERFALL_DSP_MADI,
518 	 .subvendor = PCI_ANY_ID,
519 	 .subdevice = PCI_ANY_ID,
520 	 .class = 0,
521 	 .class_mask = 0,
522 	 .driver_data = 0},
523 	{0,}
524 };
525 
526 MODULE_DEVICE_TABLE(pci, snd_hdspm_ids);
527 
528 /* prototypes */
529 static int __devinit snd_hdspm_create_alsa_devices(struct snd_card *card,
530 						   struct hdspm * hdspm);
531 static int __devinit snd_hdspm_create_pcm(struct snd_card *card,
532 					  struct hdspm * hdspm);
533 
534 static inline void snd_hdspm_initialize_midi_flush(struct hdspm * hdspm);
535 static int hdspm_update_simple_mixer_controls(struct hdspm * hdspm);
536 static int hdspm_autosync_ref(struct hdspm * hdspm);
537 static int snd_hdspm_set_defaults(struct hdspm * hdspm);
538 static void hdspm_set_sgbuf(struct hdspm * hdspm, struct snd_sg_buf *sgbuf,
539 			     unsigned int reg, int channels);
540 
541 static inline int HDSPM_bit2freq(int n)
542 {
543 	static int bit2freq_tab[] = { 0, 32000, 44100, 48000, 64000, 88200,
544 		96000, 128000, 176400, 192000 };
545 	if (n < 1 || n > 9)
546 		return 0;
547 	return bit2freq_tab[n];
548 }
549 
550 /* Write/read to/from HDSPM with Adresses in Bytes
551    not words but only 32Bit writes are allowed */
552 
553 static inline void hdspm_write(struct hdspm * hdspm, unsigned int reg,
554 			       unsigned int val)
555 {
556 	writel(val, hdspm->iobase + reg);
557 }
558 
559 static inline unsigned int hdspm_read(struct hdspm * hdspm, unsigned int reg)
560 {
561 	return readl(hdspm->iobase + reg);
562 }
563 
564 /* for each output channel (chan) I have an Input (in) and Playback (pb) Fader
565    mixer is write only on hardware so we have to cache him for read
566    each fader is a u32, but uses only the first 16 bit */
567 
568 static inline int hdspm_read_in_gain(struct hdspm * hdspm, unsigned int chan,
569 				     unsigned int in)
570 {
571 	if (chan >= HDSPM_MIXER_CHANNELS || in >= HDSPM_MIXER_CHANNELS)
572 		return 0;
573 
574 	return hdspm->mixer->ch[chan].in[in];
575 }
576 
577 static inline int hdspm_read_pb_gain(struct hdspm * hdspm, unsigned int chan,
578 				     unsigned int pb)
579 {
580 	if (chan >= HDSPM_MIXER_CHANNELS || pb >= HDSPM_MIXER_CHANNELS)
581 		return 0;
582 	return hdspm->mixer->ch[chan].pb[pb];
583 }
584 
585 static inline int hdspm_write_in_gain(struct hdspm * hdspm, unsigned int chan,
586 				      unsigned int in, unsigned short data)
587 {
588 	if (chan >= HDSPM_MIXER_CHANNELS || in >= HDSPM_MIXER_CHANNELS)
589 		return -1;
590 
591 	hdspm_write(hdspm,
592 		    HDSPM_MADI_mixerBase +
593 		    ((in + 128 * chan) * sizeof(u32)),
594 		    (hdspm->mixer->ch[chan].in[in] = data & 0xFFFF));
595 	return 0;
596 }
597 
598 static inline int hdspm_write_pb_gain(struct hdspm * hdspm, unsigned int chan,
599 				      unsigned int pb, unsigned short data)
600 {
601 	if (chan >= HDSPM_MIXER_CHANNELS || pb >= HDSPM_MIXER_CHANNELS)
602 		return -1;
603 
604 	hdspm_write(hdspm,
605 		    HDSPM_MADI_mixerBase +
606 		    ((64 + pb + 128 * chan) * sizeof(u32)),
607 		    (hdspm->mixer->ch[chan].pb[pb] = data & 0xFFFF));
608 	return 0;
609 }
610 
611 
612 /* enable DMA for specific channels, now available for DSP-MADI */
613 static inline void snd_hdspm_enable_in(struct hdspm * hdspm, int i, int v)
614 {
615 	hdspm_write(hdspm, HDSPM_inputEnableBase + (4 * i), v);
616 }
617 
618 static inline void snd_hdspm_enable_out(struct hdspm * hdspm, int i, int v)
619 {
620 	hdspm_write(hdspm, HDSPM_outputEnableBase + (4 * i), v);
621 }
622 
623 /* check if same process is writing and reading */
624 static inline int snd_hdspm_use_is_exclusive(struct hdspm * hdspm)
625 {
626 	unsigned long flags;
627 	int ret = 1;
628 
629 	spin_lock_irqsave(&hdspm->lock, flags);
630 	if ((hdspm->playback_pid != hdspm->capture_pid) &&
631 	    (hdspm->playback_pid >= 0) && (hdspm->capture_pid >= 0)) {
632 		ret = 0;
633 	}
634 	spin_unlock_irqrestore(&hdspm->lock, flags);
635 	return ret;
636 }
637 
638 /* check for external sample rate */
639 static inline int hdspm_external_sample_rate(struct hdspm * hdspm)
640 {
641 	if (hdspm->is_aes32) {
642 		unsigned int status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
643 		unsigned int status = hdspm_read(hdspm, HDSPM_statusRegister);
644 		unsigned int timecode =
645 			hdspm_read(hdspm, HDSPM_timecodeRegister);
646 
647 		int syncref = hdspm_autosync_ref(hdspm);
648 
649 		if (syncref == HDSPM_AES32_AUTOSYNC_FROM_WORD &&
650 				status & HDSPM_AES32_wcLock)
651 			return HDSPM_bit2freq((status >> HDSPM_AES32_wcFreq_bit)
652 					      & 0xF);
653 		if (syncref >= HDSPM_AES32_AUTOSYNC_FROM_AES1 &&
654 			syncref <= HDSPM_AES32_AUTOSYNC_FROM_AES8 &&
655 			status2 & (HDSPM_LockAES >>
656 			          (syncref - HDSPM_AES32_AUTOSYNC_FROM_AES1)))
657 			return HDSPM_bit2freq((timecode >>
658 			  (4*(syncref-HDSPM_AES32_AUTOSYNC_FROM_AES1))) & 0xF);
659 		return 0;
660 	} else {
661 		unsigned int status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
662 		unsigned int status = hdspm_read(hdspm, HDSPM_statusRegister);
663 		unsigned int rate_bits;
664 		int rate = 0;
665 
666 		/* if wordclock has synced freq and wordclock is valid */
667 		if ((status2 & HDSPM_wcLock) != 0 &&
668 				(status & HDSPM_SelSyncRef0) == 0) {
669 
670 			rate_bits = status2 & HDSPM_wcFreqMask;
671 
672 			switch (rate_bits) {
673 			case HDSPM_wcFreq32:
674 				rate = 32000;
675 				break;
676 			case HDSPM_wcFreq44_1:
677 				rate = 44100;
678 				break;
679 			case HDSPM_wcFreq48:
680 				rate = 48000;
681 				break;
682 			case HDSPM_wcFreq64:
683 				rate = 64000;
684 				break;
685 			case HDSPM_wcFreq88_2:
686 				rate = 88200;
687 				break;
688 			case HDSPM_wcFreq96:
689 				rate = 96000;
690 				break;
691 				/* Quadspeed Bit missing ???? */
692 			default:
693 				rate = 0;
694 				break;
695 			}
696 		}
697 
698 		/* if rate detected and Syncref is Word than have it,
699 		 * word has priority to MADI
700 		 */
701 		if (rate != 0 &&
702 	            (status2 & HDSPM_SelSyncRefMask) == HDSPM_SelSyncRef_WORD)
703 			return rate;
704 
705 		/* maby a madi input (which is taken if sel sync is madi) */
706 		if (status & HDSPM_madiLock) {
707 			rate_bits = status & HDSPM_madiFreqMask;
708 
709 			switch (rate_bits) {
710 			case HDSPM_madiFreq32:
711 				rate = 32000;
712 				break;
713 			case HDSPM_madiFreq44_1:
714 				rate = 44100;
715 				break;
716 			case HDSPM_madiFreq48:
717 				rate = 48000;
718 				break;
719 			case HDSPM_madiFreq64:
720 				rate = 64000;
721 				break;
722 			case HDSPM_madiFreq88_2:
723 				rate = 88200;
724 				break;
725 			case HDSPM_madiFreq96:
726 				rate = 96000;
727 				break;
728 			case HDSPM_madiFreq128:
729 				rate = 128000;
730 				break;
731 			case HDSPM_madiFreq176_4:
732 				rate = 176400;
733 				break;
734 			case HDSPM_madiFreq192:
735 				rate = 192000;
736 				break;
737 			default:
738 				rate = 0;
739 				break;
740 			}
741 		}
742 		return rate;
743 	}
744 }
745 
746 /* Latency function */
747 static inline void hdspm_compute_period_size(struct hdspm * hdspm)
748 {
749 	hdspm->period_bytes =
750 	    1 << ((hdspm_decode_latency(hdspm->control_register) + 8));
751 }
752 
753 static snd_pcm_uframes_t hdspm_hw_pointer(struct hdspm * hdspm)
754 {
755 	int position;
756 
757 	position = hdspm_read(hdspm, HDSPM_statusRegister);
758 
759 	if (!hdspm->precise_ptr)
760 		return (position & HDSPM_BufferID) ?
761 			(hdspm->period_bytes / 4) : 0;
762 
763 	/* hwpointer comes in bytes and is 64Bytes accurate (by docu since
764 	   PCI Burst)
765 	   i have experimented that it is at most 64 Byte to much for playing
766 	   so substraction of 64 byte should be ok for ALSA, but use it only
767 	   for application where you know what you do since if you come to
768 	   near with record pointer it can be a disaster */
769 
770 	position &= HDSPM_BufferPositionMask;
771 	position = ((position - 64) % (2 * hdspm->period_bytes)) / 4;
772 
773 	return position;
774 }
775 
776 
777 static inline void hdspm_start_audio(struct hdspm * s)
778 {
779 	s->control_register |= (HDSPM_AudioInterruptEnable | HDSPM_Start);
780 	hdspm_write(s, HDSPM_controlRegister, s->control_register);
781 }
782 
783 static inline void hdspm_stop_audio(struct hdspm * s)
784 {
785 	s->control_register &= ~(HDSPM_Start | HDSPM_AudioInterruptEnable);
786 	hdspm_write(s, HDSPM_controlRegister, s->control_register);
787 }
788 
789 /* should I silence all or only opened ones ? doit all for first even is 4MB*/
790 static inline void hdspm_silence_playback(struct hdspm * hdspm)
791 {
792 	int i;
793 	int n = hdspm->period_bytes;
794 	void *buf = hdspm->playback_buffer;
795 
796 	if (buf == NULL)
797 		return;
798 
799 	for (i = 0; i < HDSPM_MAX_CHANNELS; i++) {
800 		memset(buf, 0, n);
801 		buf += HDSPM_CHANNEL_BUFFER_BYTES;
802 	}
803 }
804 
805 static int hdspm_set_interrupt_interval(struct hdspm * s, unsigned int frames)
806 {
807 	int n;
808 
809 	spin_lock_irq(&s->lock);
810 
811 	frames >>= 7;
812 	n = 0;
813 	while (frames) {
814 		n++;
815 		frames >>= 1;
816 	}
817 	s->control_register &= ~HDSPM_LatencyMask;
818 	s->control_register |= hdspm_encode_latency(n);
819 
820 	hdspm_write(s, HDSPM_controlRegister, s->control_register);
821 
822 	hdspm_compute_period_size(s);
823 
824 	spin_unlock_irq(&s->lock);
825 
826 	return 0;
827 }
828 
829 static void hdspm_set_dds_value(struct hdspm *hdspm, int rate)
830 {
831 	u64 n;
832 	u32 r;
833 
834 	if (rate >= 112000)
835 		rate /= 4;
836 	else if (rate >= 56000)
837 		rate /= 2;
838 
839 	/* RME says n = 104857600000000, but in the windows MADI driver, I see:
840 //	return 104857600000000 / rate; // 100 MHz
841 	return 110100480000000 / rate; // 105 MHz
842         */
843 	/* n = 104857600000000ULL; */ /*  =  2^20 * 10^8 */
844 	n = 110100480000000ULL;    /* Value checked for AES32 and MADI */
845 	div64_32(&n, rate, &r);
846 	/* n should be less than 2^32 for being written to FREQ register */
847 	snd_assert((n >> 32) == 0);
848 	hdspm_write(hdspm, HDSPM_freqReg, (u32)n);
849 }
850 
851 /* dummy set rate lets see what happens */
852 static int hdspm_set_rate(struct hdspm * hdspm, int rate, int called_internally)
853 {
854 	int current_rate;
855 	int rate_bits;
856 	int not_set = 0;
857 	int current_speed, target_speed;
858 
859 	/* ASSUMPTION: hdspm->lock is either set, or there is no need for
860 	   it (e.g. during module initialization).
861 	 */
862 
863 	if (!(hdspm->control_register & HDSPM_ClockModeMaster)) {
864 
865 	        /* SLAVE --- */
866 		if (called_internally) {
867 
868         	  /* request from ctl or card initialization
869 	             just make a warning an remember setting
870 		     for future master mode switching */
871 
872 			snd_printk(KERN_WARNING "HDSPM: "
873 				   "Warning: device is not running "
874 				   "as a clock master.\n");
875 			not_set = 1;
876 		} else {
877 
878 			/* hw_param request while in AutoSync mode */
879 			int external_freq =
880 			    hdspm_external_sample_rate(hdspm);
881 
882 			if (hdspm_autosync_ref(hdspm) ==
883 			    HDSPM_AUTOSYNC_FROM_NONE) {
884 
885 				snd_printk(KERN_WARNING "HDSPM: "
886 					   "Detected no Externel Sync \n");
887 				not_set = 1;
888 
889 			} else if (rate != external_freq) {
890 
891 				snd_printk(KERN_WARNING "HDSPM: "
892 					   "Warning: No AutoSync source for "
893 					   "requested rate\n");
894 				not_set = 1;
895 			}
896 		}
897 	}
898 
899 	current_rate = hdspm->system_sample_rate;
900 
901 	/* Changing between Singe, Double and Quad speed is not
902 	   allowed if any substreams are open. This is because such a change
903 	   causes a shift in the location of the DMA buffers and a reduction
904 	   in the number of available buffers.
905 
906 	   Note that a similar but essentially insoluble problem exists for
907 	   externally-driven rate changes. All we can do is to flag rate
908 	   changes in the read/write routines.
909 	 */
910 
911 	if (current_rate <= 48000)
912 		current_speed = HDSPM_SPEED_SINGLE;
913 	else if (current_rate <= 96000)
914 		current_speed = HDSPM_SPEED_DOUBLE;
915 	else
916 		current_speed = HDSPM_SPEED_QUAD;
917 
918 	if (rate <= 48000)
919 		target_speed = HDSPM_SPEED_SINGLE;
920 	else if (rate <= 96000)
921 		target_speed = HDSPM_SPEED_DOUBLE;
922 	else
923 		target_speed = HDSPM_SPEED_QUAD;
924 
925 	switch (rate) {
926 	case 32000:
927 		rate_bits = HDSPM_Frequency32KHz;
928 		break;
929 	case 44100:
930 		rate_bits = HDSPM_Frequency44_1KHz;
931 		break;
932 	case 48000:
933 		rate_bits = HDSPM_Frequency48KHz;
934 		break;
935 	case 64000:
936 		rate_bits = HDSPM_Frequency64KHz;
937 		break;
938 	case 88200:
939 		rate_bits = HDSPM_Frequency88_2KHz;
940 		break;
941 	case 96000:
942 		rate_bits = HDSPM_Frequency96KHz;
943 		break;
944 	case 128000:
945 		rate_bits = HDSPM_Frequency128KHz;
946 		break;
947 	case 176400:
948 		rate_bits = HDSPM_Frequency176_4KHz;
949 		break;
950 	case 192000:
951 		rate_bits = HDSPM_Frequency192KHz;
952 		break;
953 	default:
954 		return -EINVAL;
955 	}
956 
957 	if (current_speed != target_speed
958 	    && (hdspm->capture_pid >= 0 || hdspm->playback_pid >= 0)) {
959 		snd_printk
960 		    (KERN_ERR "HDSPM: "
961 		     "cannot change from %s speed to %s speed mode "
962 		     "(capture PID = %d, playback PID = %d)\n",
963 		     hdspm_speed_names[current_speed],
964 		     hdspm_speed_names[target_speed],
965 		     hdspm->capture_pid, hdspm->playback_pid);
966 		return -EBUSY;
967 	}
968 
969 	hdspm->control_register &= ~HDSPM_FrequencyMask;
970 	hdspm->control_register |= rate_bits;
971 	hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
972 
973 	/* For AES32, need to set DDS value in FREQ register
974 	   For MADI, also apparently */
975 	hdspm_set_dds_value(hdspm, rate);
976 
977 	if (hdspm->is_aes32 && rate != current_rate)
978 		hdspm_write(hdspm, HDSPM_eeprom_wr, 0);
979 
980 	/* For AES32 and for MADI (at least rev 204), channel_map needs to
981 	 * always be channel_map_madi_ss, whatever the sample rate */
982 	hdspm->channel_map = channel_map_madi_ss;
983 
984 	hdspm->system_sample_rate = rate;
985 
986 	if (not_set != 0)
987 		return -1;
988 
989 	return 0;
990 }
991 
992 /* mainly for init to 0 on load */
993 static void all_in_all_mixer(struct hdspm * hdspm, int sgain)
994 {
995 	int i, j;
996 	unsigned int gain;
997 
998 	if (sgain > UNITY_GAIN)
999 		gain = UNITY_GAIN;
1000 	else if (sgain < 0)
1001 		gain = 0;
1002 	else
1003 		gain = sgain;
1004 
1005 	for (i = 0; i < HDSPM_MIXER_CHANNELS; i++)
1006 		for (j = 0; j < HDSPM_MIXER_CHANNELS; j++) {
1007 			hdspm_write_in_gain(hdspm, i, j, gain);
1008 			hdspm_write_pb_gain(hdspm, i, j, gain);
1009 		}
1010 }
1011 
1012 /*----------------------------------------------------------------------------
1013    MIDI
1014   ----------------------------------------------------------------------------*/
1015 
1016 static inline unsigned char snd_hdspm_midi_read_byte (struct hdspm *hdspm,
1017 						      int id)
1018 {
1019 	/* the hardware already does the relevant bit-mask with 0xff */
1020 	if (id)
1021 		return hdspm_read(hdspm, HDSPM_midiDataIn1);
1022 	else
1023 		return hdspm_read(hdspm, HDSPM_midiDataIn0);
1024 }
1025 
1026 static inline void snd_hdspm_midi_write_byte (struct hdspm *hdspm, int id,
1027 					      int val)
1028 {
1029 	/* the hardware already does the relevant bit-mask with 0xff */
1030 	if (id)
1031 		return hdspm_write(hdspm, HDSPM_midiDataOut1, val);
1032 	else
1033 		return hdspm_write(hdspm, HDSPM_midiDataOut0, val);
1034 }
1035 
1036 static inline int snd_hdspm_midi_input_available (struct hdspm *hdspm, int id)
1037 {
1038 	if (id)
1039 		return (hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xff);
1040 	else
1041 		return (hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xff);
1042 }
1043 
1044 static inline int snd_hdspm_midi_output_possible (struct hdspm *hdspm, int id)
1045 {
1046 	int fifo_bytes_used;
1047 
1048 	if (id)
1049 		fifo_bytes_used = hdspm_read(hdspm, HDSPM_midiStatusOut1);
1050 	else
1051 		fifo_bytes_used = hdspm_read(hdspm, HDSPM_midiStatusOut0);
1052 	fifo_bytes_used &= 0xff;
1053 
1054 	if (fifo_bytes_used < 128)
1055 		return  128 - fifo_bytes_used;
1056 	else
1057 		return 0;
1058 }
1059 
1060 static inline void snd_hdspm_flush_midi_input (struct hdspm *hdspm, int id)
1061 {
1062 	while (snd_hdspm_midi_input_available (hdspm, id))
1063 		snd_hdspm_midi_read_byte (hdspm, id);
1064 }
1065 
1066 static int snd_hdspm_midi_output_write (struct hdspm_midi *hmidi)
1067 {
1068 	unsigned long flags;
1069 	int n_pending;
1070 	int to_write;
1071 	int i;
1072 	unsigned char buf[128];
1073 
1074 	/* Output is not interrupt driven */
1075 
1076 	spin_lock_irqsave (&hmidi->lock, flags);
1077 	if (hmidi->output &&
1078 	    !snd_rawmidi_transmit_empty (hmidi->output)) {
1079 		n_pending = snd_hdspm_midi_output_possible (hmidi->hdspm,
1080 							    hmidi->id);
1081 		if (n_pending > 0) {
1082 			if (n_pending > (int)sizeof (buf))
1083 				n_pending = sizeof (buf);
1084 
1085 			to_write = snd_rawmidi_transmit (hmidi->output, buf,
1086 							 n_pending);
1087 			if (to_write > 0) {
1088 				for (i = 0; i < to_write; ++i)
1089 					snd_hdspm_midi_write_byte (hmidi->hdspm,
1090 								   hmidi->id,
1091 								   buf[i]);
1092 			}
1093 		}
1094 	}
1095 	spin_unlock_irqrestore (&hmidi->lock, flags);
1096 	return 0;
1097 }
1098 
1099 static int snd_hdspm_midi_input_read (struct hdspm_midi *hmidi)
1100 {
1101 	unsigned char buf[128]; /* this buffer is designed to match the MIDI
1102 				 * input FIFO size
1103 				 */
1104 	unsigned long flags;
1105 	int n_pending;
1106 	int i;
1107 
1108 	spin_lock_irqsave (&hmidi->lock, flags);
1109 	n_pending = snd_hdspm_midi_input_available (hmidi->hdspm, hmidi->id);
1110 	if (n_pending > 0) {
1111 		if (hmidi->input) {
1112 			if (n_pending > (int)sizeof (buf))
1113 				n_pending = sizeof (buf);
1114 			for (i = 0; i < n_pending; ++i)
1115 				buf[i] = snd_hdspm_midi_read_byte (hmidi->hdspm,
1116 								   hmidi->id);
1117 			if (n_pending)
1118 				snd_rawmidi_receive (hmidi->input, buf,
1119 						     n_pending);
1120 		} else {
1121 			/* flush the MIDI input FIFO */
1122 			while (n_pending--)
1123 				snd_hdspm_midi_read_byte (hmidi->hdspm,
1124 							  hmidi->id);
1125 		}
1126 	}
1127 	hmidi->pending = 0;
1128 	if (hmidi->id)
1129 		hmidi->hdspm->control_register |= HDSPM_Midi1InterruptEnable;
1130 	else
1131 		hmidi->hdspm->control_register |= HDSPM_Midi0InterruptEnable;
1132 	hdspm_write(hmidi->hdspm, HDSPM_controlRegister,
1133 		    hmidi->hdspm->control_register);
1134 	spin_unlock_irqrestore (&hmidi->lock, flags);
1135 	return snd_hdspm_midi_output_write (hmidi);
1136 }
1137 
1138 static void
1139 snd_hdspm_midi_input_trigger(struct snd_rawmidi_substream *substream, int up)
1140 {
1141 	struct hdspm *hdspm;
1142 	struct hdspm_midi *hmidi;
1143 	unsigned long flags;
1144 	u32 ie;
1145 
1146 	hmidi = substream->rmidi->private_data;
1147 	hdspm = hmidi->hdspm;
1148 	ie = hmidi->id ?
1149 		HDSPM_Midi1InterruptEnable : HDSPM_Midi0InterruptEnable;
1150 	spin_lock_irqsave (&hdspm->lock, flags);
1151 	if (up) {
1152 		if (!(hdspm->control_register & ie)) {
1153 			snd_hdspm_flush_midi_input (hdspm, hmidi->id);
1154 			hdspm->control_register |= ie;
1155 		}
1156 	} else {
1157 		hdspm->control_register &= ~ie;
1158 	}
1159 
1160 	hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
1161 	spin_unlock_irqrestore (&hdspm->lock, flags);
1162 }
1163 
1164 static void snd_hdspm_midi_output_timer(unsigned long data)
1165 {
1166 	struct hdspm_midi *hmidi = (struct hdspm_midi *) data;
1167 	unsigned long flags;
1168 
1169 	snd_hdspm_midi_output_write(hmidi);
1170 	spin_lock_irqsave (&hmidi->lock, flags);
1171 
1172 	/* this does not bump hmidi->istimer, because the
1173 	   kernel automatically removed the timer when it
1174 	   expired, and we are now adding it back, thus
1175 	   leaving istimer wherever it was set before.
1176 	*/
1177 
1178 	if (hmidi->istimer) {
1179 		hmidi->timer.expires = 1 + jiffies;
1180 		add_timer(&hmidi->timer);
1181 	}
1182 
1183 	spin_unlock_irqrestore (&hmidi->lock, flags);
1184 }
1185 
1186 static void
1187 snd_hdspm_midi_output_trigger(struct snd_rawmidi_substream *substream, int up)
1188 {
1189 	struct hdspm_midi *hmidi;
1190 	unsigned long flags;
1191 
1192 	hmidi = substream->rmidi->private_data;
1193 	spin_lock_irqsave (&hmidi->lock, flags);
1194 	if (up) {
1195 		if (!hmidi->istimer) {
1196 			init_timer(&hmidi->timer);
1197 			hmidi->timer.function = snd_hdspm_midi_output_timer;
1198 			hmidi->timer.data = (unsigned long) hmidi;
1199 			hmidi->timer.expires = 1 + jiffies;
1200 			add_timer(&hmidi->timer);
1201 			hmidi->istimer++;
1202 		}
1203 	} else {
1204 		if (hmidi->istimer && --hmidi->istimer <= 0)
1205 			del_timer (&hmidi->timer);
1206 	}
1207 	spin_unlock_irqrestore (&hmidi->lock, flags);
1208 	if (up)
1209 		snd_hdspm_midi_output_write(hmidi);
1210 }
1211 
1212 static int snd_hdspm_midi_input_open(struct snd_rawmidi_substream *substream)
1213 {
1214 	struct hdspm_midi *hmidi;
1215 
1216 	hmidi = substream->rmidi->private_data;
1217 	spin_lock_irq (&hmidi->lock);
1218 	snd_hdspm_flush_midi_input (hmidi->hdspm, hmidi->id);
1219 	hmidi->input = substream;
1220 	spin_unlock_irq (&hmidi->lock);
1221 
1222 	return 0;
1223 }
1224 
1225 static int snd_hdspm_midi_output_open(struct snd_rawmidi_substream *substream)
1226 {
1227 	struct hdspm_midi *hmidi;
1228 
1229 	hmidi = substream->rmidi->private_data;
1230 	spin_lock_irq (&hmidi->lock);
1231 	hmidi->output = substream;
1232 	spin_unlock_irq (&hmidi->lock);
1233 
1234 	return 0;
1235 }
1236 
1237 static int snd_hdspm_midi_input_close(struct snd_rawmidi_substream *substream)
1238 {
1239 	struct hdspm_midi *hmidi;
1240 
1241 	snd_hdspm_midi_input_trigger (substream, 0);
1242 
1243 	hmidi = substream->rmidi->private_data;
1244 	spin_lock_irq (&hmidi->lock);
1245 	hmidi->input = NULL;
1246 	spin_unlock_irq (&hmidi->lock);
1247 
1248 	return 0;
1249 }
1250 
1251 static int snd_hdspm_midi_output_close(struct snd_rawmidi_substream *substream)
1252 {
1253 	struct hdspm_midi *hmidi;
1254 
1255 	snd_hdspm_midi_output_trigger (substream, 0);
1256 
1257 	hmidi = substream->rmidi->private_data;
1258 	spin_lock_irq (&hmidi->lock);
1259 	hmidi->output = NULL;
1260 	spin_unlock_irq (&hmidi->lock);
1261 
1262 	return 0;
1263 }
1264 
1265 static struct snd_rawmidi_ops snd_hdspm_midi_output =
1266 {
1267 	.open =		snd_hdspm_midi_output_open,
1268 	.close =	snd_hdspm_midi_output_close,
1269 	.trigger =	snd_hdspm_midi_output_trigger,
1270 };
1271 
1272 static struct snd_rawmidi_ops snd_hdspm_midi_input =
1273 {
1274 	.open =		snd_hdspm_midi_input_open,
1275 	.close =	snd_hdspm_midi_input_close,
1276 	.trigger =	snd_hdspm_midi_input_trigger,
1277 };
1278 
1279 static int __devinit snd_hdspm_create_midi (struct snd_card *card,
1280 					    struct hdspm *hdspm, int id)
1281 {
1282 	int err;
1283 	char buf[32];
1284 
1285 	hdspm->midi[id].id = id;
1286 	hdspm->midi[id].hdspm = hdspm;
1287 	spin_lock_init (&hdspm->midi[id].lock);
1288 
1289 	sprintf (buf, "%s MIDI %d", card->shortname, id+1);
1290 	err = snd_rawmidi_new (card, buf, id, 1, 1, &hdspm->midi[id].rmidi);
1291 	if (err < 0)
1292 		return err;
1293 
1294 	sprintf (hdspm->midi[id].rmidi->name, "%s MIDI %d", card->id, id+1);
1295 	hdspm->midi[id].rmidi->private_data = &hdspm->midi[id];
1296 
1297 	snd_rawmidi_set_ops(hdspm->midi[id].rmidi, SNDRV_RAWMIDI_STREAM_OUTPUT,
1298 			    &snd_hdspm_midi_output);
1299 	snd_rawmidi_set_ops(hdspm->midi[id].rmidi, SNDRV_RAWMIDI_STREAM_INPUT,
1300 			    &snd_hdspm_midi_input);
1301 
1302 	hdspm->midi[id].rmidi->info_flags |= SNDRV_RAWMIDI_INFO_OUTPUT |
1303 		SNDRV_RAWMIDI_INFO_INPUT |
1304 		SNDRV_RAWMIDI_INFO_DUPLEX;
1305 
1306 	return 0;
1307 }
1308 
1309 
1310 static void hdspm_midi_tasklet(unsigned long arg)
1311 {
1312 	struct hdspm *hdspm = (struct hdspm *)arg;
1313 
1314 	if (hdspm->midi[0].pending)
1315 		snd_hdspm_midi_input_read (&hdspm->midi[0]);
1316 	if (hdspm->midi[1].pending)
1317 		snd_hdspm_midi_input_read (&hdspm->midi[1]);
1318 }
1319 
1320 
1321 /*-----------------------------------------------------------------------------
1322   Status Interface
1323   ----------------------------------------------------------------------------*/
1324 
1325 /* get the system sample rate which is set */
1326 
1327 #define HDSPM_SYSTEM_SAMPLE_RATE(xname, xindex) \
1328 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1329   .name = xname, \
1330   .index = xindex, \
1331   .access = SNDRV_CTL_ELEM_ACCESS_READ, \
1332   .info = snd_hdspm_info_system_sample_rate, \
1333   .get = snd_hdspm_get_system_sample_rate \
1334 }
1335 
1336 static int snd_hdspm_info_system_sample_rate(struct snd_kcontrol *kcontrol,
1337 					     struct snd_ctl_elem_info *uinfo)
1338 {
1339 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1340 	uinfo->count = 1;
1341 	return 0;
1342 }
1343 
1344 static int snd_hdspm_get_system_sample_rate(struct snd_kcontrol *kcontrol,
1345 					    struct snd_ctl_elem_value *
1346 					    ucontrol)
1347 {
1348 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
1349 
1350 	ucontrol->value.enumerated.item[0] = hdspm->system_sample_rate;
1351 	return 0;
1352 }
1353 
1354 #define HDSPM_AUTOSYNC_SAMPLE_RATE(xname, xindex) \
1355 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1356   .name = xname, \
1357   .index = xindex, \
1358   .access = SNDRV_CTL_ELEM_ACCESS_READ, \
1359   .info = snd_hdspm_info_autosync_sample_rate, \
1360   .get = snd_hdspm_get_autosync_sample_rate \
1361 }
1362 
1363 static int snd_hdspm_info_autosync_sample_rate(struct snd_kcontrol *kcontrol,
1364 					       struct snd_ctl_elem_info *uinfo)
1365 {
1366 	static char *texts[] = { "32000", "44100", "48000",
1367 		"64000", "88200", "96000",
1368 		"128000", "176400", "192000",
1369 		"None"
1370 	};
1371 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1372 	uinfo->count = 1;
1373 	uinfo->value.enumerated.items = 10;
1374 	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
1375 		uinfo->value.enumerated.item =
1376 		    uinfo->value.enumerated.items - 1;
1377 	strcpy(uinfo->value.enumerated.name,
1378 	       texts[uinfo->value.enumerated.item]);
1379 	return 0;
1380 }
1381 
1382 static int snd_hdspm_get_autosync_sample_rate(struct snd_kcontrol *kcontrol,
1383 					      struct snd_ctl_elem_value *
1384 					      ucontrol)
1385 {
1386 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
1387 
1388 	switch (hdspm_external_sample_rate(hdspm)) {
1389 	case 32000:
1390 		ucontrol->value.enumerated.item[0] = 0;
1391 		break;
1392 	case 44100:
1393 		ucontrol->value.enumerated.item[0] = 1;
1394 		break;
1395 	case 48000:
1396 		ucontrol->value.enumerated.item[0] = 2;
1397 		break;
1398 	case 64000:
1399 		ucontrol->value.enumerated.item[0] = 3;
1400 		break;
1401 	case 88200:
1402 		ucontrol->value.enumerated.item[0] = 4;
1403 		break;
1404 	case 96000:
1405 		ucontrol->value.enumerated.item[0] = 5;
1406 		break;
1407 	case 128000:
1408 		ucontrol->value.enumerated.item[0] = 6;
1409 		break;
1410 	case 176400:
1411 		ucontrol->value.enumerated.item[0] = 7;
1412 		break;
1413 	case 192000:
1414 		ucontrol->value.enumerated.item[0] = 8;
1415 		break;
1416 
1417 	default:
1418 		ucontrol->value.enumerated.item[0] = 9;
1419 	}
1420 	return 0;
1421 }
1422 
1423 #define HDSPM_SYSTEM_CLOCK_MODE(xname, xindex) \
1424 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1425   .name = xname, \
1426   .index = xindex, \
1427   .access = SNDRV_CTL_ELEM_ACCESS_READ, \
1428   .info = snd_hdspm_info_system_clock_mode, \
1429   .get = snd_hdspm_get_system_clock_mode, \
1430 }
1431 
1432 
1433 
1434 static int hdspm_system_clock_mode(struct hdspm * hdspm)
1435 {
1436         /* Always reflect the hardware info, rme is never wrong !!!! */
1437 
1438 	if (hdspm->control_register & HDSPM_ClockModeMaster)
1439 		return 0;
1440 	return 1;
1441 }
1442 
1443 static int snd_hdspm_info_system_clock_mode(struct snd_kcontrol *kcontrol,
1444 					    struct snd_ctl_elem_info *uinfo)
1445 {
1446 	static char *texts[] = { "Master", "Slave" };
1447 
1448 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1449 	uinfo->count = 1;
1450 	uinfo->value.enumerated.items = 2;
1451 	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
1452 		uinfo->value.enumerated.item =
1453 		    uinfo->value.enumerated.items - 1;
1454 	strcpy(uinfo->value.enumerated.name,
1455 	       texts[uinfo->value.enumerated.item]);
1456 	return 0;
1457 }
1458 
1459 static int snd_hdspm_get_system_clock_mode(struct snd_kcontrol *kcontrol,
1460 					   struct snd_ctl_elem_value *ucontrol)
1461 {
1462 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
1463 
1464 	ucontrol->value.enumerated.item[0] =
1465 	    hdspm_system_clock_mode(hdspm);
1466 	return 0;
1467 }
1468 
1469 #define HDSPM_CLOCK_SOURCE(xname, xindex) \
1470 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1471   .name = xname, \
1472   .index = xindex, \
1473   .info = snd_hdspm_info_clock_source, \
1474   .get = snd_hdspm_get_clock_source, \
1475   .put = snd_hdspm_put_clock_source \
1476 }
1477 
1478 static int hdspm_clock_source(struct hdspm * hdspm)
1479 {
1480 	if (hdspm->control_register & HDSPM_ClockModeMaster) {
1481 		switch (hdspm->system_sample_rate) {
1482 		case 32000:
1483 			return 1;
1484 		case 44100:
1485 			return 2;
1486 		case 48000:
1487 			return 3;
1488 		case 64000:
1489 			return 4;
1490 		case 88200:
1491 			return 5;
1492 		case 96000:
1493 			return 6;
1494 		case 128000:
1495 			return 7;
1496 		case 176400:
1497 			return 8;
1498 		case 192000:
1499 			return 9;
1500 		default:
1501 			return 3;
1502 		}
1503 	} else {
1504 		return 0;
1505 	}
1506 }
1507 
1508 static int hdspm_set_clock_source(struct hdspm * hdspm, int mode)
1509 {
1510 	int rate;
1511 	switch (mode) {
1512 
1513 	case HDSPM_CLOCK_SOURCE_AUTOSYNC:
1514 		if (hdspm_external_sample_rate(hdspm) != 0) {
1515 			hdspm->control_register &= ~HDSPM_ClockModeMaster;
1516 			hdspm_write(hdspm, HDSPM_controlRegister,
1517 				    hdspm->control_register);
1518 			return 0;
1519 		}
1520 		return -1;
1521 	case HDSPM_CLOCK_SOURCE_INTERNAL_32KHZ:
1522 		rate = 32000;
1523 		break;
1524 	case HDSPM_CLOCK_SOURCE_INTERNAL_44_1KHZ:
1525 		rate = 44100;
1526 		break;
1527 	case HDSPM_CLOCK_SOURCE_INTERNAL_48KHZ:
1528 		rate = 48000;
1529 		break;
1530 	case HDSPM_CLOCK_SOURCE_INTERNAL_64KHZ:
1531 		rate = 64000;
1532 		break;
1533 	case HDSPM_CLOCK_SOURCE_INTERNAL_88_2KHZ:
1534 		rate = 88200;
1535 		break;
1536 	case HDSPM_CLOCK_SOURCE_INTERNAL_96KHZ:
1537 		rate = 96000;
1538 		break;
1539 	case HDSPM_CLOCK_SOURCE_INTERNAL_128KHZ:
1540 		rate = 128000;
1541 		break;
1542 	case HDSPM_CLOCK_SOURCE_INTERNAL_176_4KHZ:
1543 		rate = 176400;
1544 		break;
1545 	case HDSPM_CLOCK_SOURCE_INTERNAL_192KHZ:
1546 		rate = 192000;
1547 		break;
1548 
1549 	default:
1550 		rate = 44100;
1551 	}
1552 	hdspm->control_register |= HDSPM_ClockModeMaster;
1553 	hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
1554 	hdspm_set_rate(hdspm, rate, 1);
1555 	return 0;
1556 }
1557 
1558 static int snd_hdspm_info_clock_source(struct snd_kcontrol *kcontrol,
1559 				       struct snd_ctl_elem_info *uinfo)
1560 {
1561 	static char *texts[] = { "AutoSync",
1562 		"Internal 32.0 kHz", "Internal 44.1 kHz",
1563 		    "Internal 48.0 kHz",
1564 		"Internal 64.0 kHz", "Internal 88.2 kHz",
1565 		    "Internal 96.0 kHz",
1566 		"Internal 128.0 kHz", "Internal 176.4 kHz",
1567 		    "Internal 192.0 kHz"
1568 	};
1569 
1570 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1571 	uinfo->count = 1;
1572 	uinfo->value.enumerated.items = 10;
1573 
1574 	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
1575 		uinfo->value.enumerated.item =
1576 		    uinfo->value.enumerated.items - 1;
1577 
1578 	strcpy(uinfo->value.enumerated.name,
1579 	       texts[uinfo->value.enumerated.item]);
1580 
1581 	return 0;
1582 }
1583 
1584 static int snd_hdspm_get_clock_source(struct snd_kcontrol *kcontrol,
1585 				      struct snd_ctl_elem_value *ucontrol)
1586 {
1587 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
1588 
1589 	ucontrol->value.enumerated.item[0] = hdspm_clock_source(hdspm);
1590 	return 0;
1591 }
1592 
1593 static int snd_hdspm_put_clock_source(struct snd_kcontrol *kcontrol,
1594 				      struct snd_ctl_elem_value *ucontrol)
1595 {
1596 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
1597 	int change;
1598 	int val;
1599 
1600 	if (!snd_hdspm_use_is_exclusive(hdspm))
1601 		return -EBUSY;
1602 	val = ucontrol->value.enumerated.item[0];
1603 	if (val < 0)
1604 		val = 0;
1605 	if (val > 9)
1606 		val = 9;
1607 	spin_lock_irq(&hdspm->lock);
1608 	if (val != hdspm_clock_source(hdspm))
1609 		change = (hdspm_set_clock_source(hdspm, val) == 0) ? 1 : 0;
1610 	else
1611 		change = 0;
1612 	spin_unlock_irq(&hdspm->lock);
1613 	return change;
1614 }
1615 
1616 #define HDSPM_PREF_SYNC_REF(xname, xindex) \
1617 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1618   .name = xname, \
1619   .index = xindex, \
1620   .info = snd_hdspm_info_pref_sync_ref, \
1621   .get = snd_hdspm_get_pref_sync_ref, \
1622   .put = snd_hdspm_put_pref_sync_ref \
1623 }
1624 
1625 static int hdspm_pref_sync_ref(struct hdspm * hdspm)
1626 {
1627 	/* Notice that this looks at the requested sync source,
1628 	   not the one actually in use.
1629 	 */
1630 	if (hdspm->is_aes32) {
1631 		switch (hdspm->control_register & HDSPM_SyncRefMask) {
1632 		/* number gives AES index, except for 0 which
1633 		   corresponds to WordClock */
1634 		case 0: return 0;
1635 		case HDSPM_SyncRef0: return 1;
1636 		case HDSPM_SyncRef1: return 2;
1637 		case HDSPM_SyncRef1+HDSPM_SyncRef0: return 3;
1638 		case HDSPM_SyncRef2: return 4;
1639 		case HDSPM_SyncRef2+HDSPM_SyncRef0: return 5;
1640 		case HDSPM_SyncRef2+HDSPM_SyncRef1: return 6;
1641 		case HDSPM_SyncRef2+HDSPM_SyncRef1+HDSPM_SyncRef0: return 7;
1642 		case HDSPM_SyncRef3: return 8;
1643 		}
1644 	} else {
1645 		switch (hdspm->control_register & HDSPM_SyncRefMask) {
1646 		case HDSPM_SyncRef_Word:
1647 			return HDSPM_SYNC_FROM_WORD;
1648 		case HDSPM_SyncRef_MADI:
1649 			return HDSPM_SYNC_FROM_MADI;
1650 		}
1651 	}
1652 
1653 	return HDSPM_SYNC_FROM_WORD;
1654 }
1655 
1656 static int hdspm_set_pref_sync_ref(struct hdspm * hdspm, int pref)
1657 {
1658 	hdspm->control_register &= ~HDSPM_SyncRefMask;
1659 
1660 	if (hdspm->is_aes32) {
1661 		switch (pref) {
1662 		case 0:
1663 		       hdspm->control_register |= 0;
1664 		       break;
1665 		case 1:
1666 		       hdspm->control_register |= HDSPM_SyncRef0;
1667 		       break;
1668 		case 2:
1669 		       hdspm->control_register |= HDSPM_SyncRef1;
1670 		       break;
1671 		case 3:
1672 		       hdspm->control_register |= HDSPM_SyncRef1+HDSPM_SyncRef0;
1673 		       break;
1674 		case 4:
1675 		       hdspm->control_register |= HDSPM_SyncRef2;
1676 		       break;
1677 		case 5:
1678 		       hdspm->control_register |= HDSPM_SyncRef2+HDSPM_SyncRef0;
1679 		       break;
1680 		case 6:
1681 		       hdspm->control_register |= HDSPM_SyncRef2+HDSPM_SyncRef1;
1682 		       break;
1683 		case 7:
1684 		       hdspm->control_register |=
1685 			       HDSPM_SyncRef2+HDSPM_SyncRef1+HDSPM_SyncRef0;
1686 		       break;
1687 		case 8:
1688 		       hdspm->control_register |= HDSPM_SyncRef3;
1689 		       break;
1690 		default:
1691 		       return -1;
1692 		}
1693 	} else {
1694 		switch (pref) {
1695 		case HDSPM_SYNC_FROM_MADI:
1696 			hdspm->control_register |= HDSPM_SyncRef_MADI;
1697 			break;
1698 		case HDSPM_SYNC_FROM_WORD:
1699 			hdspm->control_register |= HDSPM_SyncRef_Word;
1700 			break;
1701 		default:
1702 			return -1;
1703 		}
1704 	}
1705 	hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
1706 	return 0;
1707 }
1708 
1709 static int snd_hdspm_info_pref_sync_ref(struct snd_kcontrol *kcontrol,
1710 					struct snd_ctl_elem_info *uinfo)
1711 {
1712 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
1713 
1714 	if (hdspm->is_aes32) {
1715 		static char *texts[] = { "Word", "AES1", "AES2", "AES3",
1716 			"AES4", "AES5",	"AES6", "AES7", "AES8" };
1717 
1718 		uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1719 		uinfo->count = 1;
1720 
1721 		uinfo->value.enumerated.items = 9;
1722 
1723 		if (uinfo->value.enumerated.item >=
1724 		    uinfo->value.enumerated.items)
1725 			uinfo->value.enumerated.item =
1726 				uinfo->value.enumerated.items - 1;
1727 		strcpy(uinfo->value.enumerated.name,
1728 				texts[uinfo->value.enumerated.item]);
1729 	} else {
1730 		static char *texts[] = { "Word", "MADI" };
1731 
1732 		uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1733 		uinfo->count = 1;
1734 
1735 		uinfo->value.enumerated.items = 2;
1736 
1737 		if (uinfo->value.enumerated.item >=
1738 		    uinfo->value.enumerated.items)
1739 			uinfo->value.enumerated.item =
1740 				uinfo->value.enumerated.items - 1;
1741 		strcpy(uinfo->value.enumerated.name,
1742 				texts[uinfo->value.enumerated.item]);
1743 	}
1744 	return 0;
1745 }
1746 
1747 static int snd_hdspm_get_pref_sync_ref(struct snd_kcontrol *kcontrol,
1748 				       struct snd_ctl_elem_value *ucontrol)
1749 {
1750 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
1751 
1752 	ucontrol->value.enumerated.item[0] = hdspm_pref_sync_ref(hdspm);
1753 	return 0;
1754 }
1755 
1756 static int snd_hdspm_put_pref_sync_ref(struct snd_kcontrol *kcontrol,
1757 				       struct snd_ctl_elem_value *ucontrol)
1758 {
1759 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
1760 	int change, max;
1761 	unsigned int val;
1762 
1763 	max = hdspm->is_aes32 ? 9 : 2;
1764 
1765 	if (!snd_hdspm_use_is_exclusive(hdspm))
1766 		return -EBUSY;
1767 
1768 	val = ucontrol->value.enumerated.item[0] % max;
1769 
1770 	spin_lock_irq(&hdspm->lock);
1771 	change = (int) val != hdspm_pref_sync_ref(hdspm);
1772 	hdspm_set_pref_sync_ref(hdspm, val);
1773 	spin_unlock_irq(&hdspm->lock);
1774 	return change;
1775 }
1776 
1777 #define HDSPM_AUTOSYNC_REF(xname, xindex) \
1778 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1779   .name = xname, \
1780   .index = xindex, \
1781   .access = SNDRV_CTL_ELEM_ACCESS_READ, \
1782   .info = snd_hdspm_info_autosync_ref, \
1783   .get = snd_hdspm_get_autosync_ref, \
1784 }
1785 
1786 static int hdspm_autosync_ref(struct hdspm * hdspm)
1787 {
1788 	if (hdspm->is_aes32) {
1789 		unsigned int status = hdspm_read(hdspm, HDSPM_statusRegister);
1790 		unsigned int syncref = (status >> HDSPM_AES32_syncref_bit) &
1791 			0xF;
1792 		if (syncref == 0)
1793 			return HDSPM_AES32_AUTOSYNC_FROM_WORD;
1794 		if (syncref <= 8)
1795 			return syncref;
1796 		return HDSPM_AES32_AUTOSYNC_FROM_NONE;
1797 	} else {
1798 		/* This looks at the autosync selected sync reference */
1799 		unsigned int status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
1800 
1801 		switch (status2 & HDSPM_SelSyncRefMask) {
1802 		case HDSPM_SelSyncRef_WORD:
1803 			return HDSPM_AUTOSYNC_FROM_WORD;
1804 		case HDSPM_SelSyncRef_MADI:
1805 			return HDSPM_AUTOSYNC_FROM_MADI;
1806 		case HDSPM_SelSyncRef_NVALID:
1807 			return HDSPM_AUTOSYNC_FROM_NONE;
1808 		default:
1809 			return 0;
1810 		}
1811 
1812 		return 0;
1813 	}
1814 }
1815 
1816 static int snd_hdspm_info_autosync_ref(struct snd_kcontrol *kcontrol,
1817 				       struct snd_ctl_elem_info *uinfo)
1818 {
1819 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
1820 
1821 	if (hdspm->is_aes32) {
1822 		static char *texts[] = { "WordClock", "AES1", "AES2", "AES3",
1823 			"AES4",	"AES5", "AES6", "AES7", "AES8", "None"};
1824 
1825 		uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1826 		uinfo->count = 1;
1827 		uinfo->value.enumerated.items = 10;
1828 		if (uinfo->value.enumerated.item >=
1829 		    uinfo->value.enumerated.items)
1830 			uinfo->value.enumerated.item =
1831 				uinfo->value.enumerated.items - 1;
1832 		strcpy(uinfo->value.enumerated.name,
1833 				texts[uinfo->value.enumerated.item]);
1834 	} else {
1835 		static char *texts[] = { "WordClock", "MADI", "None" };
1836 
1837 		uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1838 		uinfo->count = 1;
1839 		uinfo->value.enumerated.items = 3;
1840 		if (uinfo->value.enumerated.item >=
1841 		    uinfo->value.enumerated.items)
1842 			uinfo->value.enumerated.item =
1843 				uinfo->value.enumerated.items - 1;
1844 		strcpy(uinfo->value.enumerated.name,
1845 				texts[uinfo->value.enumerated.item]);
1846 	}
1847 	return 0;
1848 }
1849 
1850 static int snd_hdspm_get_autosync_ref(struct snd_kcontrol *kcontrol,
1851 				      struct snd_ctl_elem_value *ucontrol)
1852 {
1853 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
1854 
1855 	ucontrol->value.enumerated.item[0] = hdspm_autosync_ref(hdspm);
1856 	return 0;
1857 }
1858 
1859 #define HDSPM_LINE_OUT(xname, xindex) \
1860 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1861   .name = xname, \
1862   .index = xindex, \
1863   .info = snd_hdspm_info_line_out, \
1864   .get = snd_hdspm_get_line_out, \
1865   .put = snd_hdspm_put_line_out \
1866 }
1867 
1868 static int hdspm_line_out(struct hdspm * hdspm)
1869 {
1870 	return (hdspm->control_register & HDSPM_LineOut) ? 1 : 0;
1871 }
1872 
1873 
1874 static int hdspm_set_line_output(struct hdspm * hdspm, int out)
1875 {
1876 	if (out)
1877 		hdspm->control_register |= HDSPM_LineOut;
1878 	else
1879 		hdspm->control_register &= ~HDSPM_LineOut;
1880 	hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
1881 
1882 	return 0;
1883 }
1884 
1885 #define snd_hdspm_info_line_out		snd_ctl_boolean_mono_info
1886 
1887 static int snd_hdspm_get_line_out(struct snd_kcontrol *kcontrol,
1888 				  struct snd_ctl_elem_value *ucontrol)
1889 {
1890 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
1891 
1892 	spin_lock_irq(&hdspm->lock);
1893 	ucontrol->value.integer.value[0] = hdspm_line_out(hdspm);
1894 	spin_unlock_irq(&hdspm->lock);
1895 	return 0;
1896 }
1897 
1898 static int snd_hdspm_put_line_out(struct snd_kcontrol *kcontrol,
1899 				  struct snd_ctl_elem_value *ucontrol)
1900 {
1901 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
1902 	int change;
1903 	unsigned int val;
1904 
1905 	if (!snd_hdspm_use_is_exclusive(hdspm))
1906 		return -EBUSY;
1907 	val = ucontrol->value.integer.value[0] & 1;
1908 	spin_lock_irq(&hdspm->lock);
1909 	change = (int) val != hdspm_line_out(hdspm);
1910 	hdspm_set_line_output(hdspm, val);
1911 	spin_unlock_irq(&hdspm->lock);
1912 	return change;
1913 }
1914 
1915 #define HDSPM_TX_64(xname, xindex) \
1916 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1917   .name = xname, \
1918   .index = xindex, \
1919   .info = snd_hdspm_info_tx_64, \
1920   .get = snd_hdspm_get_tx_64, \
1921   .put = snd_hdspm_put_tx_64 \
1922 }
1923 
1924 static int hdspm_tx_64(struct hdspm * hdspm)
1925 {
1926 	return (hdspm->control_register & HDSPM_TX_64ch) ? 1 : 0;
1927 }
1928 
1929 static int hdspm_set_tx_64(struct hdspm * hdspm, int out)
1930 {
1931 	if (out)
1932 		hdspm->control_register |= HDSPM_TX_64ch;
1933 	else
1934 		hdspm->control_register &= ~HDSPM_TX_64ch;
1935 	hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
1936 
1937 	return 0;
1938 }
1939 
1940 #define snd_hdspm_info_tx_64		snd_ctl_boolean_mono_info
1941 
1942 static int snd_hdspm_get_tx_64(struct snd_kcontrol *kcontrol,
1943 			       struct snd_ctl_elem_value *ucontrol)
1944 {
1945 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
1946 
1947 	spin_lock_irq(&hdspm->lock);
1948 	ucontrol->value.integer.value[0] = hdspm_tx_64(hdspm);
1949 	spin_unlock_irq(&hdspm->lock);
1950 	return 0;
1951 }
1952 
1953 static int snd_hdspm_put_tx_64(struct snd_kcontrol *kcontrol,
1954 			       struct snd_ctl_elem_value *ucontrol)
1955 {
1956 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
1957 	int change;
1958 	unsigned int val;
1959 
1960 	if (!snd_hdspm_use_is_exclusive(hdspm))
1961 		return -EBUSY;
1962 	val = ucontrol->value.integer.value[0] & 1;
1963 	spin_lock_irq(&hdspm->lock);
1964 	change = (int) val != hdspm_tx_64(hdspm);
1965 	hdspm_set_tx_64(hdspm, val);
1966 	spin_unlock_irq(&hdspm->lock);
1967 	return change;
1968 }
1969 
1970 #define HDSPM_C_TMS(xname, xindex) \
1971 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1972   .name = xname, \
1973   .index = xindex, \
1974   .info = snd_hdspm_info_c_tms, \
1975   .get = snd_hdspm_get_c_tms, \
1976   .put = snd_hdspm_put_c_tms \
1977 }
1978 
1979 static int hdspm_c_tms(struct hdspm * hdspm)
1980 {
1981 	return (hdspm->control_register & HDSPM_clr_tms) ? 1 : 0;
1982 }
1983 
1984 static int hdspm_set_c_tms(struct hdspm * hdspm, int out)
1985 {
1986 	if (out)
1987 		hdspm->control_register |= HDSPM_clr_tms;
1988 	else
1989 		hdspm->control_register &= ~HDSPM_clr_tms;
1990 	hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
1991 
1992 	return 0;
1993 }
1994 
1995 #define snd_hdspm_info_c_tms		snd_ctl_boolean_mono_info
1996 
1997 static int snd_hdspm_get_c_tms(struct snd_kcontrol *kcontrol,
1998 			       struct snd_ctl_elem_value *ucontrol)
1999 {
2000 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2001 
2002 	spin_lock_irq(&hdspm->lock);
2003 	ucontrol->value.integer.value[0] = hdspm_c_tms(hdspm);
2004 	spin_unlock_irq(&hdspm->lock);
2005 	return 0;
2006 }
2007 
2008 static int snd_hdspm_put_c_tms(struct snd_kcontrol *kcontrol,
2009 			       struct snd_ctl_elem_value *ucontrol)
2010 {
2011 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2012 	int change;
2013 	unsigned int val;
2014 
2015 	if (!snd_hdspm_use_is_exclusive(hdspm))
2016 		return -EBUSY;
2017 	val = ucontrol->value.integer.value[0] & 1;
2018 	spin_lock_irq(&hdspm->lock);
2019 	change = (int) val != hdspm_c_tms(hdspm);
2020 	hdspm_set_c_tms(hdspm, val);
2021 	spin_unlock_irq(&hdspm->lock);
2022 	return change;
2023 }
2024 
2025 #define HDSPM_SAFE_MODE(xname, xindex) \
2026 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2027   .name = xname, \
2028   .index = xindex, \
2029   .info = snd_hdspm_info_safe_mode, \
2030   .get = snd_hdspm_get_safe_mode, \
2031   .put = snd_hdspm_put_safe_mode \
2032 }
2033 
2034 static int hdspm_safe_mode(struct hdspm * hdspm)
2035 {
2036 	return (hdspm->control_register & HDSPM_AutoInp) ? 1 : 0;
2037 }
2038 
2039 static int hdspm_set_safe_mode(struct hdspm * hdspm, int out)
2040 {
2041 	if (out)
2042 		hdspm->control_register |= HDSPM_AutoInp;
2043 	else
2044 		hdspm->control_register &= ~HDSPM_AutoInp;
2045 	hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
2046 
2047 	return 0;
2048 }
2049 
2050 #define snd_hdspm_info_safe_mode	snd_ctl_boolean_mono_info
2051 
2052 static int snd_hdspm_get_safe_mode(struct snd_kcontrol *kcontrol,
2053 				   struct snd_ctl_elem_value *ucontrol)
2054 {
2055 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2056 
2057 	spin_lock_irq(&hdspm->lock);
2058 	ucontrol->value.integer.value[0] = hdspm_safe_mode(hdspm);
2059 	spin_unlock_irq(&hdspm->lock);
2060 	return 0;
2061 }
2062 
2063 static int snd_hdspm_put_safe_mode(struct snd_kcontrol *kcontrol,
2064 				   struct snd_ctl_elem_value *ucontrol)
2065 {
2066 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2067 	int change;
2068 	unsigned int val;
2069 
2070 	if (!snd_hdspm_use_is_exclusive(hdspm))
2071 		return -EBUSY;
2072 	val = ucontrol->value.integer.value[0] & 1;
2073 	spin_lock_irq(&hdspm->lock);
2074 	change = (int) val != hdspm_safe_mode(hdspm);
2075 	hdspm_set_safe_mode(hdspm, val);
2076 	spin_unlock_irq(&hdspm->lock);
2077 	return change;
2078 }
2079 
2080 #define HDSPM_EMPHASIS(xname, xindex) \
2081 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2082   .name = xname, \
2083   .index = xindex, \
2084   .info = snd_hdspm_info_emphasis, \
2085   .get = snd_hdspm_get_emphasis, \
2086   .put = snd_hdspm_put_emphasis \
2087 }
2088 
2089 static int hdspm_emphasis(struct hdspm * hdspm)
2090 {
2091 	return (hdspm->control_register & HDSPM_Emphasis) ? 1 : 0;
2092 }
2093 
2094 static int hdspm_set_emphasis(struct hdspm * hdspm, int emp)
2095 {
2096 	if (emp)
2097 		hdspm->control_register |= HDSPM_Emphasis;
2098 	else
2099 		hdspm->control_register &= ~HDSPM_Emphasis;
2100 	hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
2101 
2102 	return 0;
2103 }
2104 
2105 #define snd_hdspm_info_emphasis		snd_ctl_boolean_mono_info
2106 
2107 static int snd_hdspm_get_emphasis(struct snd_kcontrol *kcontrol,
2108 				  struct snd_ctl_elem_value *ucontrol)
2109 {
2110 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2111 
2112 	spin_lock_irq(&hdspm->lock);
2113 	ucontrol->value.enumerated.item[0] = hdspm_emphasis(hdspm);
2114 	spin_unlock_irq(&hdspm->lock);
2115 	return 0;
2116 }
2117 
2118 static int snd_hdspm_put_emphasis(struct snd_kcontrol *kcontrol,
2119 				  struct snd_ctl_elem_value *ucontrol)
2120 {
2121 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2122 	int change;
2123 	unsigned int val;
2124 
2125 	if (!snd_hdspm_use_is_exclusive(hdspm))
2126 		return -EBUSY;
2127 	val = ucontrol->value.integer.value[0] & 1;
2128 	spin_lock_irq(&hdspm->lock);
2129 	change = (int) val != hdspm_emphasis(hdspm);
2130 	hdspm_set_emphasis(hdspm, val);
2131 	spin_unlock_irq(&hdspm->lock);
2132 	return change;
2133 }
2134 
2135 #define HDSPM_DOLBY(xname, xindex) \
2136 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2137   .name = xname, \
2138   .index = xindex, \
2139   .info = snd_hdspm_info_dolby, \
2140   .get = snd_hdspm_get_dolby, \
2141   .put = snd_hdspm_put_dolby \
2142 }
2143 
2144 static int hdspm_dolby(struct hdspm * hdspm)
2145 {
2146 	return (hdspm->control_register & HDSPM_Dolby) ? 1 : 0;
2147 }
2148 
2149 static int hdspm_set_dolby(struct hdspm * hdspm, int dol)
2150 {
2151 	if (dol)
2152 		hdspm->control_register |= HDSPM_Dolby;
2153 	else
2154 		hdspm->control_register &= ~HDSPM_Dolby;
2155 	hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
2156 
2157 	return 0;
2158 }
2159 
2160 #define snd_hdspm_info_dolby		snd_ctl_boolean_mono_info
2161 
2162 static int snd_hdspm_get_dolby(struct snd_kcontrol *kcontrol,
2163 			       struct snd_ctl_elem_value *ucontrol)
2164 {
2165 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2166 
2167 	spin_lock_irq(&hdspm->lock);
2168 	ucontrol->value.enumerated.item[0] = hdspm_dolby(hdspm);
2169 	spin_unlock_irq(&hdspm->lock);
2170 	return 0;
2171 }
2172 
2173 static int snd_hdspm_put_dolby(struct snd_kcontrol *kcontrol,
2174 			       struct snd_ctl_elem_value *ucontrol)
2175 {
2176 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2177 	int change;
2178 	unsigned int val;
2179 
2180 	if (!snd_hdspm_use_is_exclusive(hdspm))
2181 		return -EBUSY;
2182 	val = ucontrol->value.integer.value[0] & 1;
2183 	spin_lock_irq(&hdspm->lock);
2184 	change = (int) val != hdspm_dolby(hdspm);
2185 	hdspm_set_dolby(hdspm, val);
2186 	spin_unlock_irq(&hdspm->lock);
2187 	return change;
2188 }
2189 
2190 #define HDSPM_PROFESSIONAL(xname, xindex) \
2191 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2192   .name = xname, \
2193   .index = xindex, \
2194   .info = snd_hdspm_info_professional, \
2195   .get = snd_hdspm_get_professional, \
2196   .put = snd_hdspm_put_professional \
2197 }
2198 
2199 static int hdspm_professional(struct hdspm * hdspm)
2200 {
2201 	return (hdspm->control_register & HDSPM_Professional) ? 1 : 0;
2202 }
2203 
2204 static int hdspm_set_professional(struct hdspm * hdspm, int dol)
2205 {
2206 	if (dol)
2207 		hdspm->control_register |= HDSPM_Professional;
2208 	else
2209 		hdspm->control_register &= ~HDSPM_Professional;
2210 	hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
2211 
2212 	return 0;
2213 }
2214 
2215 #define snd_hdspm_info_professional	snd_ctl_boolean_mono_info
2216 
2217 static int snd_hdspm_get_professional(struct snd_kcontrol *kcontrol,
2218 				      struct snd_ctl_elem_value *ucontrol)
2219 {
2220 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2221 
2222 	spin_lock_irq(&hdspm->lock);
2223 	ucontrol->value.enumerated.item[0] = hdspm_professional(hdspm);
2224 	spin_unlock_irq(&hdspm->lock);
2225 	return 0;
2226 }
2227 
2228 static int snd_hdspm_put_professional(struct snd_kcontrol *kcontrol,
2229 				      struct snd_ctl_elem_value *ucontrol)
2230 {
2231 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2232 	int change;
2233 	unsigned int val;
2234 
2235 	if (!snd_hdspm_use_is_exclusive(hdspm))
2236 		return -EBUSY;
2237 	val = ucontrol->value.integer.value[0] & 1;
2238 	spin_lock_irq(&hdspm->lock);
2239 	change = (int) val != hdspm_professional(hdspm);
2240 	hdspm_set_professional(hdspm, val);
2241 	spin_unlock_irq(&hdspm->lock);
2242 	return change;
2243 }
2244 
2245 #define HDSPM_INPUT_SELECT(xname, xindex) \
2246 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2247   .name = xname, \
2248   .index = xindex, \
2249   .info = snd_hdspm_info_input_select, \
2250   .get = snd_hdspm_get_input_select, \
2251   .put = snd_hdspm_put_input_select \
2252 }
2253 
2254 static int hdspm_input_select(struct hdspm * hdspm)
2255 {
2256 	return (hdspm->control_register & HDSPM_InputSelect0) ? 1 : 0;
2257 }
2258 
2259 static int hdspm_set_input_select(struct hdspm * hdspm, int out)
2260 {
2261 	if (out)
2262 		hdspm->control_register |= HDSPM_InputSelect0;
2263 	else
2264 		hdspm->control_register &= ~HDSPM_InputSelect0;
2265 	hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
2266 
2267 	return 0;
2268 }
2269 
2270 static int snd_hdspm_info_input_select(struct snd_kcontrol *kcontrol,
2271 				       struct snd_ctl_elem_info *uinfo)
2272 {
2273 	static char *texts[] = { "optical", "coaxial" };
2274 
2275 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2276 	uinfo->count = 1;
2277 	uinfo->value.enumerated.items = 2;
2278 
2279 	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2280 		uinfo->value.enumerated.item =
2281 		    uinfo->value.enumerated.items - 1;
2282 	strcpy(uinfo->value.enumerated.name,
2283 	       texts[uinfo->value.enumerated.item]);
2284 
2285 	return 0;
2286 }
2287 
2288 static int snd_hdspm_get_input_select(struct snd_kcontrol *kcontrol,
2289 				      struct snd_ctl_elem_value *ucontrol)
2290 {
2291 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2292 
2293 	spin_lock_irq(&hdspm->lock);
2294 	ucontrol->value.enumerated.item[0] = hdspm_input_select(hdspm);
2295 	spin_unlock_irq(&hdspm->lock);
2296 	return 0;
2297 }
2298 
2299 static int snd_hdspm_put_input_select(struct snd_kcontrol *kcontrol,
2300 				      struct snd_ctl_elem_value *ucontrol)
2301 {
2302 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2303 	int change;
2304 	unsigned int val;
2305 
2306 	if (!snd_hdspm_use_is_exclusive(hdspm))
2307 		return -EBUSY;
2308 	val = ucontrol->value.integer.value[0] & 1;
2309 	spin_lock_irq(&hdspm->lock);
2310 	change = (int) val != hdspm_input_select(hdspm);
2311 	hdspm_set_input_select(hdspm, val);
2312 	spin_unlock_irq(&hdspm->lock);
2313 	return change;
2314 }
2315 
2316 #define HDSPM_DS_WIRE(xname, xindex) \
2317 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2318   .name = xname, \
2319   .index = xindex, \
2320   .info = snd_hdspm_info_ds_wire, \
2321   .get = snd_hdspm_get_ds_wire, \
2322   .put = snd_hdspm_put_ds_wire \
2323 }
2324 
2325 static int hdspm_ds_wire(struct hdspm * hdspm)
2326 {
2327 	return (hdspm->control_register & HDSPM_DS_DoubleWire) ? 1 : 0;
2328 }
2329 
2330 static int hdspm_set_ds_wire(struct hdspm * hdspm, int ds)
2331 {
2332 	if (ds)
2333 		hdspm->control_register |= HDSPM_DS_DoubleWire;
2334 	else
2335 		hdspm->control_register &= ~HDSPM_DS_DoubleWire;
2336 	hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
2337 
2338 	return 0;
2339 }
2340 
2341 static int snd_hdspm_info_ds_wire(struct snd_kcontrol *kcontrol,
2342 				  struct snd_ctl_elem_info *uinfo)
2343 {
2344 	static char *texts[] = { "Single", "Double" };
2345 
2346 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2347 	uinfo->count = 1;
2348 	uinfo->value.enumerated.items = 2;
2349 
2350 	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2351 		uinfo->value.enumerated.item =
2352 		    uinfo->value.enumerated.items - 1;
2353 	strcpy(uinfo->value.enumerated.name,
2354 	       texts[uinfo->value.enumerated.item]);
2355 
2356 	return 0;
2357 }
2358 
2359 static int snd_hdspm_get_ds_wire(struct snd_kcontrol *kcontrol,
2360 				 struct snd_ctl_elem_value *ucontrol)
2361 {
2362 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2363 
2364 	spin_lock_irq(&hdspm->lock);
2365 	ucontrol->value.enumerated.item[0] = hdspm_ds_wire(hdspm);
2366 	spin_unlock_irq(&hdspm->lock);
2367 	return 0;
2368 }
2369 
2370 static int snd_hdspm_put_ds_wire(struct snd_kcontrol *kcontrol,
2371 				 struct snd_ctl_elem_value *ucontrol)
2372 {
2373 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2374 	int change;
2375 	unsigned int val;
2376 
2377 	if (!snd_hdspm_use_is_exclusive(hdspm))
2378 		return -EBUSY;
2379 	val = ucontrol->value.integer.value[0] & 1;
2380 	spin_lock_irq(&hdspm->lock);
2381 	change = (int) val != hdspm_ds_wire(hdspm);
2382 	hdspm_set_ds_wire(hdspm, val);
2383 	spin_unlock_irq(&hdspm->lock);
2384 	return change;
2385 }
2386 
2387 #define HDSPM_QS_WIRE(xname, xindex) \
2388 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2389   .name = xname, \
2390   .index = xindex, \
2391   .info = snd_hdspm_info_qs_wire, \
2392   .get = snd_hdspm_get_qs_wire, \
2393   .put = snd_hdspm_put_qs_wire \
2394 }
2395 
2396 static int hdspm_qs_wire(struct hdspm * hdspm)
2397 {
2398 	if (hdspm->control_register & HDSPM_QS_DoubleWire)
2399 		return 1;
2400 	if (hdspm->control_register & HDSPM_QS_QuadWire)
2401 		return 2;
2402 	return 0;
2403 }
2404 
2405 static int hdspm_set_qs_wire(struct hdspm * hdspm, int mode)
2406 {
2407 	hdspm->control_register &= ~(HDSPM_QS_DoubleWire | HDSPM_QS_QuadWire);
2408 	switch (mode) {
2409 	case 0:
2410 		break;
2411 	case 1:
2412 		hdspm->control_register |= HDSPM_QS_DoubleWire;
2413 		break;
2414 	case 2:
2415 		hdspm->control_register |= HDSPM_QS_QuadWire;
2416 		break;
2417 	}
2418 	hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
2419 
2420 	return 0;
2421 }
2422 
2423 static int snd_hdspm_info_qs_wire(struct snd_kcontrol *kcontrol,
2424 				       struct snd_ctl_elem_info *uinfo)
2425 {
2426 	static char *texts[] = { "Single", "Double", "Quad" };
2427 
2428 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2429 	uinfo->count = 1;
2430 	uinfo->value.enumerated.items = 3;
2431 
2432 	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2433 		uinfo->value.enumerated.item =
2434 		    uinfo->value.enumerated.items - 1;
2435 	strcpy(uinfo->value.enumerated.name,
2436 	       texts[uinfo->value.enumerated.item]);
2437 
2438 	return 0;
2439 }
2440 
2441 static int snd_hdspm_get_qs_wire(struct snd_kcontrol *kcontrol,
2442 				      struct snd_ctl_elem_value *ucontrol)
2443 {
2444 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2445 
2446 	spin_lock_irq(&hdspm->lock);
2447 	ucontrol->value.enumerated.item[0] = hdspm_qs_wire(hdspm);
2448 	spin_unlock_irq(&hdspm->lock);
2449 	return 0;
2450 }
2451 
2452 static int snd_hdspm_put_qs_wire(struct snd_kcontrol *kcontrol,
2453 				      struct snd_ctl_elem_value *ucontrol)
2454 {
2455 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2456 	int change;
2457 	int val;
2458 
2459 	if (!snd_hdspm_use_is_exclusive(hdspm))
2460 		return -EBUSY;
2461 	val = ucontrol->value.integer.value[0];
2462 	if (val < 0)
2463 		val = 0;
2464 	if (val > 2)
2465 		val = 2;
2466 	spin_lock_irq(&hdspm->lock);
2467 	change = val != hdspm_qs_wire(hdspm);
2468 	hdspm_set_qs_wire(hdspm, val);
2469 	spin_unlock_irq(&hdspm->lock);
2470 	return change;
2471 }
2472 
2473 /*           Simple Mixer
2474   deprecated since to much faders ???
2475   MIXER interface says output (source, destination, value)
2476    where source > MAX_channels are playback channels
2477    on MADICARD
2478   - playback mixer matrix: [channelout+64] [output] [value]
2479   - input(thru) mixer matrix: [channelin] [output] [value]
2480   (better do 2 kontrols for seperation ?)
2481 */
2482 
2483 #define HDSPM_MIXER(xname, xindex) \
2484 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
2485   .name = xname, \
2486   .index = xindex, \
2487   .device = 0, \
2488   .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
2489 		 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2490   .info = snd_hdspm_info_mixer, \
2491   .get = snd_hdspm_get_mixer, \
2492   .put = snd_hdspm_put_mixer \
2493 }
2494 
2495 static int snd_hdspm_info_mixer(struct snd_kcontrol *kcontrol,
2496 				struct snd_ctl_elem_info *uinfo)
2497 {
2498 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2499 	uinfo->count = 3;
2500 	uinfo->value.integer.min = 0;
2501 	uinfo->value.integer.max = 65535;
2502 	uinfo->value.integer.step = 1;
2503 	return 0;
2504 }
2505 
2506 static int snd_hdspm_get_mixer(struct snd_kcontrol *kcontrol,
2507 			       struct snd_ctl_elem_value *ucontrol)
2508 {
2509 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2510 	int source;
2511 	int destination;
2512 
2513 	source = ucontrol->value.integer.value[0];
2514 	if (source < 0)
2515 		source = 0;
2516 	else if (source >= 2 * HDSPM_MAX_CHANNELS)
2517 		source = 2 * HDSPM_MAX_CHANNELS - 1;
2518 
2519 	destination = ucontrol->value.integer.value[1];
2520 	if (destination < 0)
2521 		destination = 0;
2522 	else if (destination >= HDSPM_MAX_CHANNELS)
2523 		destination = HDSPM_MAX_CHANNELS - 1;
2524 
2525 	spin_lock_irq(&hdspm->lock);
2526 	if (source >= HDSPM_MAX_CHANNELS)
2527 		ucontrol->value.integer.value[2] =
2528 		    hdspm_read_pb_gain(hdspm, destination,
2529 				       source - HDSPM_MAX_CHANNELS);
2530 	else
2531 		ucontrol->value.integer.value[2] =
2532 		    hdspm_read_in_gain(hdspm, destination, source);
2533 
2534 	spin_unlock_irq(&hdspm->lock);
2535 
2536 	return 0;
2537 }
2538 
2539 static int snd_hdspm_put_mixer(struct snd_kcontrol *kcontrol,
2540 			       struct snd_ctl_elem_value *ucontrol)
2541 {
2542 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2543 	int change;
2544 	int source;
2545 	int destination;
2546 	int gain;
2547 
2548 	if (!snd_hdspm_use_is_exclusive(hdspm))
2549 		return -EBUSY;
2550 
2551 	source = ucontrol->value.integer.value[0];
2552 	destination = ucontrol->value.integer.value[1];
2553 
2554 	if (source < 0 || source >= 2 * HDSPM_MAX_CHANNELS)
2555 		return -1;
2556 	if (destination < 0 || destination >= HDSPM_MAX_CHANNELS)
2557 		return -1;
2558 
2559 	gain = ucontrol->value.integer.value[2];
2560 
2561 	spin_lock_irq(&hdspm->lock);
2562 
2563 	if (source >= HDSPM_MAX_CHANNELS)
2564 		change = gain != hdspm_read_pb_gain(hdspm, destination,
2565 						    source -
2566 						    HDSPM_MAX_CHANNELS);
2567 	else
2568 		change = gain != hdspm_read_in_gain(hdspm, destination,
2569 						    source);
2570 
2571 	if (change) {
2572 		if (source >= HDSPM_MAX_CHANNELS)
2573 			hdspm_write_pb_gain(hdspm, destination,
2574 					    source - HDSPM_MAX_CHANNELS,
2575 					    gain);
2576 		else
2577 			hdspm_write_in_gain(hdspm, destination, source,
2578 					    gain);
2579 	}
2580 	spin_unlock_irq(&hdspm->lock);
2581 
2582 	return change;
2583 }
2584 
2585 /* The simple mixer control(s) provide gain control for the
2586    basic 1:1 mappings of playback streams to output
2587    streams.
2588 */
2589 
2590 #define HDSPM_PLAYBACK_MIXER \
2591 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2592   .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_WRITE | \
2593 		 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2594   .info = snd_hdspm_info_playback_mixer, \
2595   .get = snd_hdspm_get_playback_mixer, \
2596   .put = snd_hdspm_put_playback_mixer \
2597 }
2598 
2599 static int snd_hdspm_info_playback_mixer(struct snd_kcontrol *kcontrol,
2600 					 struct snd_ctl_elem_info *uinfo)
2601 {
2602 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2603 	uinfo->count = 1;
2604 	uinfo->value.integer.min = 0;
2605 	uinfo->value.integer.max = 65536;
2606 	uinfo->value.integer.step = 1;
2607 	return 0;
2608 }
2609 
2610 static int snd_hdspm_get_playback_mixer(struct snd_kcontrol *kcontrol,
2611 					struct snd_ctl_elem_value *ucontrol)
2612 {
2613 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2614 	int channel;
2615 	int mapped_channel;
2616 
2617 	channel = ucontrol->id.index - 1;
2618 
2619 	snd_assert(channel >= 0
2620 		   || channel < HDSPM_MAX_CHANNELS, return -EINVAL);
2621 
2622 	mapped_channel = hdspm->channel_map[channel];
2623 	if (mapped_channel < 0)
2624 		return -EINVAL;
2625 
2626 	spin_lock_irq(&hdspm->lock);
2627 	ucontrol->value.integer.value[0] =
2628 	    hdspm_read_pb_gain(hdspm, mapped_channel, mapped_channel);
2629 	spin_unlock_irq(&hdspm->lock);
2630 
2631 	/*
2632 	snd_printdd("get pb mixer index %d, channel %d, mapped_channel %d, "
2633 		    "value %d\n",
2634 		    ucontrol->id.index, channel, mapped_channel,
2635 		    ucontrol->value.integer.value[0]);
2636 	*/
2637 	return 0;
2638 }
2639 
2640 static int snd_hdspm_put_playback_mixer(struct snd_kcontrol *kcontrol,
2641 					struct snd_ctl_elem_value *ucontrol)
2642 {
2643 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2644 	int change;
2645 	int channel;
2646 	int mapped_channel;
2647 	int gain;
2648 
2649 	if (!snd_hdspm_use_is_exclusive(hdspm))
2650 		return -EBUSY;
2651 
2652 	channel = ucontrol->id.index - 1;
2653 
2654 	snd_assert(channel >= 0
2655 		   || channel < HDSPM_MAX_CHANNELS, return -EINVAL);
2656 
2657 	mapped_channel = hdspm->channel_map[channel];
2658 	if (mapped_channel < 0)
2659 		return -EINVAL;
2660 
2661 	gain = ucontrol->value.integer.value[0];
2662 
2663 	spin_lock_irq(&hdspm->lock);
2664 	change =
2665 	    gain != hdspm_read_pb_gain(hdspm, mapped_channel,
2666 				       mapped_channel);
2667 	if (change)
2668 		hdspm_write_pb_gain(hdspm, mapped_channel, mapped_channel,
2669 				    gain);
2670 	spin_unlock_irq(&hdspm->lock);
2671 	return change;
2672 }
2673 
2674 #define HDSPM_WC_SYNC_CHECK(xname, xindex) \
2675 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2676   .name = xname, \
2677   .index = xindex, \
2678   .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2679   .info = snd_hdspm_info_sync_check, \
2680   .get = snd_hdspm_get_wc_sync_check \
2681 }
2682 
2683 static int snd_hdspm_info_sync_check(struct snd_kcontrol *kcontrol,
2684 				     struct snd_ctl_elem_info *uinfo)
2685 {
2686 	static char *texts[] = { "No Lock", "Lock", "Sync" };
2687 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2688 	uinfo->count = 1;
2689 	uinfo->value.enumerated.items = 3;
2690 	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2691 		uinfo->value.enumerated.item =
2692 		    uinfo->value.enumerated.items - 1;
2693 	strcpy(uinfo->value.enumerated.name,
2694 	       texts[uinfo->value.enumerated.item]);
2695 	return 0;
2696 }
2697 
2698 static int hdspm_wc_sync_check(struct hdspm * hdspm)
2699 {
2700 	if (hdspm->is_aes32) {
2701 		int status = hdspm_read(hdspm, HDSPM_statusRegister);
2702 		if (status & HDSPM_AES32_wcLock) {
2703 			/* I don't know how to differenciate sync from lock.
2704 			   Doing as if sync for now */
2705 			return 2;
2706 		}
2707 		return 0;
2708 	} else {
2709 		int status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
2710 		if (status2 & HDSPM_wcLock) {
2711 			if (status2 & HDSPM_wcSync)
2712 				return 2;
2713 			else
2714 				return 1;
2715 		}
2716 		return 0;
2717 	}
2718 }
2719 
2720 static int snd_hdspm_get_wc_sync_check(struct snd_kcontrol *kcontrol,
2721 				       struct snd_ctl_elem_value *ucontrol)
2722 {
2723 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2724 
2725 	ucontrol->value.enumerated.item[0] = hdspm_wc_sync_check(hdspm);
2726 	return 0;
2727 }
2728 
2729 
2730 #define HDSPM_MADI_SYNC_CHECK(xname, xindex) \
2731 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2732   .name = xname, \
2733   .index = xindex, \
2734   .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2735   .info = snd_hdspm_info_sync_check, \
2736   .get = snd_hdspm_get_madisync_sync_check \
2737 }
2738 
2739 static int hdspm_madisync_sync_check(struct hdspm * hdspm)
2740 {
2741 	int status = hdspm_read(hdspm, HDSPM_statusRegister);
2742 	if (status & HDSPM_madiLock) {
2743 		if (status & HDSPM_madiSync)
2744 			return 2;
2745 		else
2746 			return 1;
2747 	}
2748 	return 0;
2749 }
2750 
2751 static int snd_hdspm_get_madisync_sync_check(struct snd_kcontrol *kcontrol,
2752 					     struct snd_ctl_elem_value *
2753 					     ucontrol)
2754 {
2755 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2756 
2757 	ucontrol->value.enumerated.item[0] =
2758 	    hdspm_madisync_sync_check(hdspm);
2759 	return 0;
2760 }
2761 
2762 
2763 #define HDSPM_AES_SYNC_CHECK(xname, xindex) \
2764 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2765   .name = xname, \
2766   .index = xindex, \
2767   .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2768   .info = snd_hdspm_info_sync_check, \
2769   .get = snd_hdspm_get_aes_sync_check \
2770 }
2771 
2772 static int hdspm_aes_sync_check(struct hdspm * hdspm, int idx)
2773 {
2774 	int status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
2775 	if (status2 & (HDSPM_LockAES >> idx)) {
2776 		/* I don't know how to differenciate sync from lock.
2777 		   Doing as if sync for now */
2778 		return 2;
2779 	}
2780 	return 0;
2781 }
2782 
2783 static int snd_hdspm_get_aes_sync_check(struct snd_kcontrol *kcontrol,
2784 					struct snd_ctl_elem_value *ucontrol)
2785 {
2786 	int offset;
2787 	struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2788 
2789 	offset = ucontrol->id.index - 1;
2790 	if (offset < 0 || offset >= 8)
2791 		return -EINVAL;
2792 
2793 	ucontrol->value.enumerated.item[0] =
2794 		hdspm_aes_sync_check(hdspm, offset);
2795 	return 0;
2796 }
2797 
2798 
2799 static struct snd_kcontrol_new snd_hdspm_controls_madi[] = {
2800 
2801 	HDSPM_MIXER("Mixer", 0),
2802 /* 'Sample Clock Source' complies with the alsa control naming scheme */
2803 	HDSPM_CLOCK_SOURCE("Sample Clock Source", 0),
2804 
2805 	HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
2806 	HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
2807 	HDSPM_AUTOSYNC_REF("AutoSync Reference", 0),
2808 	HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
2809 /* 'External Rate' complies with the alsa control naming scheme */
2810 	HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
2811 	HDSPM_WC_SYNC_CHECK("Word Clock Lock Status", 0),
2812 	HDSPM_MADI_SYNC_CHECK("MADI Sync Lock Status", 0),
2813 	HDSPM_LINE_OUT("Line Out", 0),
2814 	HDSPM_TX_64("TX 64 channels mode", 0),
2815 	HDSPM_C_TMS("Clear Track Marker", 0),
2816 	HDSPM_SAFE_MODE("Safe Mode", 0),
2817 	HDSPM_INPUT_SELECT("Input Select", 0),
2818 };
2819 
2820 static struct snd_kcontrol_new snd_hdspm_controls_aes32[] = {
2821 
2822 	HDSPM_MIXER("Mixer", 0),
2823 /* 'Sample Clock Source' complies with the alsa control naming scheme */
2824 	HDSPM_CLOCK_SOURCE("Sample Clock Source", 0),
2825 
2826 	HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
2827 	HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
2828 	HDSPM_AUTOSYNC_REF("AutoSync Reference", 0),
2829 	HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
2830 /* 'External Rate' complies with the alsa control naming scheme */
2831 	HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
2832 	HDSPM_WC_SYNC_CHECK("Word Clock Lock Status", 0),
2833 /*	HDSPM_AES_SYNC_CHECK("AES Lock Status", 0),*/ /* created in snd_hdspm_create_controls() */
2834 	HDSPM_LINE_OUT("Line Out", 0),
2835 	HDSPM_EMPHASIS("Emphasis", 0),
2836 	HDSPM_DOLBY("Non Audio", 0),
2837 	HDSPM_PROFESSIONAL("Professional", 0),
2838 	HDSPM_C_TMS("Clear Track Marker", 0),
2839 	HDSPM_DS_WIRE("Double Speed Wire Mode", 0),
2840 	HDSPM_QS_WIRE("Quad Speed Wire Mode", 0),
2841 };
2842 
2843 static struct snd_kcontrol_new snd_hdspm_playback_mixer = HDSPM_PLAYBACK_MIXER;
2844 
2845 
2846 static int hdspm_update_simple_mixer_controls(struct hdspm * hdspm)
2847 {
2848 	int i;
2849 
2850 	for (i = hdspm->ds_channels; i < hdspm->ss_channels; ++i) {
2851 		if (hdspm->system_sample_rate > 48000) {
2852 			hdspm->playback_mixer_ctls[i]->vd[0].access =
2853 			    SNDRV_CTL_ELEM_ACCESS_INACTIVE |
2854 			    SNDRV_CTL_ELEM_ACCESS_READ |
2855 			    SNDRV_CTL_ELEM_ACCESS_VOLATILE;
2856 		} else {
2857 			hdspm->playback_mixer_ctls[i]->vd[0].access =
2858 			    SNDRV_CTL_ELEM_ACCESS_READWRITE |
2859 			    SNDRV_CTL_ELEM_ACCESS_VOLATILE;
2860 		}
2861 		snd_ctl_notify(hdspm->card, SNDRV_CTL_EVENT_MASK_VALUE |
2862 			       SNDRV_CTL_EVENT_MASK_INFO,
2863 			       &hdspm->playback_mixer_ctls[i]->id);
2864 	}
2865 
2866 	return 0;
2867 }
2868 
2869 
2870 static int snd_hdspm_create_controls(struct snd_card *card, struct hdspm * hdspm)
2871 {
2872 	unsigned int idx, limit;
2873 	int err;
2874 	struct snd_kcontrol *kctl;
2875 
2876 	/* add control list first */
2877 	if (hdspm->is_aes32) {
2878 		struct snd_kcontrol_new aes_sync_ctl =
2879 			HDSPM_AES_SYNC_CHECK("AES Lock Status", 0);
2880 
2881 		for (idx = 0; idx < ARRAY_SIZE(snd_hdspm_controls_aes32);
2882 		     idx++) {
2883 			err = snd_ctl_add(card,
2884 					  snd_ctl_new1(&snd_hdspm_controls_aes32[idx],
2885 						       hdspm));
2886 			if (err < 0)
2887 				return err;
2888 		}
2889 		for (idx = 1; idx <= 8; idx++) {
2890 			aes_sync_ctl.index = idx;
2891 			err = snd_ctl_add(card,
2892 					  snd_ctl_new1(&aes_sync_ctl, hdspm));
2893 			if (err < 0)
2894 				return err;
2895 		}
2896 	} else {
2897 		for (idx = 0; idx < ARRAY_SIZE(snd_hdspm_controls_madi);
2898 		     idx++) {
2899 			err = snd_ctl_add(card,
2900 					  snd_ctl_new1(&snd_hdspm_controls_madi[idx],
2901 						       hdspm));
2902 			if (err < 0)
2903 				return err;
2904 		}
2905 	}
2906 
2907 	/* Channel playback mixer as default control
2908 	   Note: the whole matrix would be 128*HDSPM_MIXER_CHANNELS Faders,
2909 	   thats too * big for any alsamixer they are accesible via special
2910 	   IOCTL on hwdep and the mixer 2dimensional mixer control
2911 	*/
2912 
2913 	snd_hdspm_playback_mixer.name = "Chn";
2914 	limit = HDSPM_MAX_CHANNELS;
2915 
2916 	/* The index values are one greater than the channel ID so that
2917 	 * alsamixer will display them correctly. We want to use the index
2918 	 * for fast lookup of the relevant channel, but if we use it at all,
2919 	 * most ALSA software does the wrong thing with it ...
2920 	 */
2921 
2922 	for (idx = 0; idx < limit; ++idx) {
2923 		snd_hdspm_playback_mixer.index = idx + 1;
2924 		kctl = snd_ctl_new1(&snd_hdspm_playback_mixer, hdspm);
2925 		err = snd_ctl_add(card, kctl);
2926 		if (err < 0)
2927 			return err;
2928 		hdspm->playback_mixer_ctls[idx] = kctl;
2929 	}
2930 
2931 	return 0;
2932 }
2933 
2934 /*------------------------------------------------------------
2935    /proc interface
2936  ------------------------------------------------------------*/
2937 
2938 static void
2939 snd_hdspm_proc_read_madi(struct snd_info_entry * entry,
2940 			 struct snd_info_buffer *buffer)
2941 {
2942 	struct hdspm *hdspm = entry->private_data;
2943 	unsigned int status;
2944 	unsigned int status2;
2945 	char *pref_sync_ref;
2946 	char *autosync_ref;
2947 	char *system_clock_mode;
2948 	char *clock_source;
2949 	char *insel;
2950 	char *syncref;
2951 	int x, x2;
2952 
2953 	status = hdspm_read(hdspm, HDSPM_statusRegister);
2954 	status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
2955 
2956 	snd_iprintf(buffer, "%s (Card #%d) Rev.%x Status2first3bits: %x\n",
2957 		    hdspm->card_name, hdspm->card->number + 1,
2958 		    hdspm->firmware_rev,
2959 		    (status2 & HDSPM_version0) |
2960 		    (status2 & HDSPM_version1) | (status2 &
2961 						  HDSPM_version2));
2962 
2963 	snd_iprintf(buffer, "IRQ: %d Registers bus: 0x%lx VM: 0x%lx\n",
2964 		    hdspm->irq, hdspm->port, (unsigned long)hdspm->iobase);
2965 
2966 	snd_iprintf(buffer, "--- System ---\n");
2967 
2968 	snd_iprintf(buffer,
2969 		    "IRQ Pending: Audio=%d, MIDI0=%d, MIDI1=%d, IRQcount=%d\n",
2970 		    status & HDSPM_audioIRQPending,
2971 		    (status & HDSPM_midi0IRQPending) ? 1 : 0,
2972 		    (status & HDSPM_midi1IRQPending) ? 1 : 0,
2973 		    hdspm->irq_count);
2974 	snd_iprintf(buffer,
2975 		    "HW pointer: id = %d, rawptr = %d (%d->%d) "
2976 		    "estimated= %ld (bytes)\n",
2977 		    ((status & HDSPM_BufferID) ? 1 : 0),
2978 		    (status & HDSPM_BufferPositionMask),
2979 		    (status & HDSPM_BufferPositionMask) %
2980 		    (2 * (int)hdspm->period_bytes),
2981 		    ((status & HDSPM_BufferPositionMask) - 64) %
2982 		    (2 * (int)hdspm->period_bytes),
2983 		    (long) hdspm_hw_pointer(hdspm) * 4);
2984 
2985 	snd_iprintf(buffer,
2986 		    "MIDI FIFO: Out1=0x%x, Out2=0x%x, In1=0x%x, In2=0x%x \n",
2987 		    hdspm_read(hdspm, HDSPM_midiStatusOut0) & 0xFF,
2988 		    hdspm_read(hdspm, HDSPM_midiStatusOut1) & 0xFF,
2989 		    hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xFF,
2990 		    hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xFF);
2991 	snd_iprintf(buffer,
2992 		    "Register: ctrl1=0x%x, ctrl2=0x%x, status1=0x%x, "
2993 		    "status2=0x%x\n",
2994 		    hdspm->control_register, hdspm->control2_register,
2995 		    status, status2);
2996 
2997 	snd_iprintf(buffer, "--- Settings ---\n");
2998 
2999 	x = 1 << (6 + hdspm_decode_latency(hdspm->control_register &
3000 					   HDSPM_LatencyMask));
3001 
3002 	snd_iprintf(buffer,
3003 		    "Size (Latency): %d samples (2 periods of %lu bytes)\n",
3004 		    x, (unsigned long) hdspm->period_bytes);
3005 
3006 	snd_iprintf(buffer, "Line out: %s,   Precise Pointer: %s\n",
3007 		    (hdspm->control_register & HDSPM_LineOut) ? "on " : "off",
3008 		    (hdspm->precise_ptr) ? "on" : "off");
3009 
3010 	switch (hdspm->control_register & HDSPM_InputMask) {
3011 	case HDSPM_InputOptical:
3012 		insel = "Optical";
3013 		break;
3014 	case HDSPM_InputCoaxial:
3015 		insel = "Coaxial";
3016 		break;
3017 	default:
3018 		insel = "Unkown";
3019 	}
3020 
3021 	switch (hdspm->control_register & HDSPM_SyncRefMask) {
3022 	case HDSPM_SyncRef_Word:
3023 		syncref = "WordClock";
3024 		break;
3025 	case HDSPM_SyncRef_MADI:
3026 		syncref = "MADI";
3027 		break;
3028 	default:
3029 		syncref = "Unkown";
3030 	}
3031 	snd_iprintf(buffer, "Inputsel = %s, SyncRef = %s\n", insel,
3032 		    syncref);
3033 
3034 	snd_iprintf(buffer,
3035 		    "ClearTrackMarker = %s, Transmit in %s Channel Mode, "
3036 		    "Auto Input %s\n",
3037 		    (hdspm->
3038 		     control_register & HDSPM_clr_tms) ? "on" : "off",
3039 		    (hdspm->
3040 		     control_register & HDSPM_TX_64ch) ? "64" : "56",
3041 		    (hdspm->
3042 		     control_register & HDSPM_AutoInp) ? "on" : "off");
3043 
3044 	switch (hdspm_clock_source(hdspm)) {
3045 	case HDSPM_CLOCK_SOURCE_AUTOSYNC:
3046 		clock_source = "AutoSync";
3047 		break;
3048 	case HDSPM_CLOCK_SOURCE_INTERNAL_32KHZ:
3049 		clock_source = "Internal 32 kHz";
3050 		break;
3051 	case HDSPM_CLOCK_SOURCE_INTERNAL_44_1KHZ:
3052 		clock_source = "Internal 44.1 kHz";
3053 		break;
3054 	case HDSPM_CLOCK_SOURCE_INTERNAL_48KHZ:
3055 		clock_source = "Internal 48 kHz";
3056 		break;
3057 	case HDSPM_CLOCK_SOURCE_INTERNAL_64KHZ:
3058 		clock_source = "Internal 64 kHz";
3059 		break;
3060 	case HDSPM_CLOCK_SOURCE_INTERNAL_88_2KHZ:
3061 		clock_source = "Internal 88.2 kHz";
3062 		break;
3063 	case HDSPM_CLOCK_SOURCE_INTERNAL_96KHZ:
3064 		clock_source = "Internal 96 kHz";
3065 		break;
3066 	default:
3067 		clock_source = "Error";
3068 	}
3069 	snd_iprintf(buffer, "Sample Clock Source: %s\n", clock_source);
3070 	if (!(hdspm->control_register & HDSPM_ClockModeMaster))
3071 		system_clock_mode = "Slave";
3072 	else
3073 		system_clock_mode = "Master";
3074 	snd_iprintf(buffer, "System Clock Mode: %s\n", system_clock_mode);
3075 
3076 	switch (hdspm_pref_sync_ref(hdspm)) {
3077 	case HDSPM_SYNC_FROM_WORD:
3078 		pref_sync_ref = "Word Clock";
3079 		break;
3080 	case HDSPM_SYNC_FROM_MADI:
3081 		pref_sync_ref = "MADI Sync";
3082 		break;
3083 	default:
3084 		pref_sync_ref = "XXXX Clock";
3085 		break;
3086 	}
3087 	snd_iprintf(buffer, "Preferred Sync Reference: %s\n",
3088 		    pref_sync_ref);
3089 
3090 	snd_iprintf(buffer, "System Clock Frequency: %d\n",
3091 		    hdspm->system_sample_rate);
3092 
3093 
3094 	snd_iprintf(buffer, "--- Status:\n");
3095 
3096 	x = status & HDSPM_madiSync;
3097 	x2 = status2 & HDSPM_wcSync;
3098 
3099 	snd_iprintf(buffer, "Inputs MADI=%s, WordClock=%s\n",
3100 		    (status & HDSPM_madiLock) ? (x ? "Sync" : "Lock") :
3101 		    "NoLock",
3102 		    (status2 & HDSPM_wcLock) ? (x2 ? "Sync" : "Lock") :
3103 		    "NoLock");
3104 
3105 	switch (hdspm_autosync_ref(hdspm)) {
3106 	case HDSPM_AUTOSYNC_FROM_WORD:
3107 		autosync_ref = "Word Clock";
3108 		break;
3109 	case HDSPM_AUTOSYNC_FROM_MADI:
3110 		autosync_ref = "MADI Sync";
3111 		break;
3112 	case HDSPM_AUTOSYNC_FROM_NONE:
3113 		autosync_ref = "Input not valid";
3114 		break;
3115 	default:
3116 		autosync_ref = "---";
3117 		break;
3118 	}
3119 	snd_iprintf(buffer,
3120 		    "AutoSync: Reference= %s, Freq=%d (MADI = %d, Word = %d)\n",
3121 		    autosync_ref, hdspm_external_sample_rate(hdspm),
3122 		    (status & HDSPM_madiFreqMask) >> 22,
3123 		    (status2 & HDSPM_wcFreqMask) >> 5);
3124 
3125 	snd_iprintf(buffer, "Input: %s, Mode=%s\n",
3126 		    (status & HDSPM_AB_int) ? "Coax" : "Optical",
3127 		    (status & HDSPM_RX_64ch) ? "64 channels" :
3128 		    "56 channels");
3129 
3130 	snd_iprintf(buffer, "\n");
3131 }
3132 
3133 static void
3134 snd_hdspm_proc_read_aes32(struct snd_info_entry * entry,
3135 			  struct snd_info_buffer *buffer)
3136 {
3137 	struct hdspm *hdspm = entry->private_data;
3138 	unsigned int status;
3139 	unsigned int status2;
3140 	unsigned int timecode;
3141 	int pref_syncref;
3142 	char *autosync_ref;
3143 	char *system_clock_mode;
3144 	char *clock_source;
3145 	int x;
3146 
3147 	status = hdspm_read(hdspm, HDSPM_statusRegister);
3148 	status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
3149 	timecode = hdspm_read(hdspm, HDSPM_timecodeRegister);
3150 
3151 	snd_iprintf(buffer, "%s (Card #%d) Rev.%x\n",
3152 		    hdspm->card_name, hdspm->card->number + 1,
3153 		    hdspm->firmware_rev);
3154 
3155 	snd_iprintf(buffer, "IRQ: %d Registers bus: 0x%lx VM: 0x%lx\n",
3156 		    hdspm->irq, hdspm->port, (unsigned long)hdspm->iobase);
3157 
3158 	snd_iprintf(buffer, "--- System ---\n");
3159 
3160 	snd_iprintf(buffer,
3161 		    "IRQ Pending: Audio=%d, MIDI0=%d, MIDI1=%d, IRQcount=%d\n",
3162 		    status & HDSPM_audioIRQPending,
3163 		    (status & HDSPM_midi0IRQPending) ? 1 : 0,
3164 		    (status & HDSPM_midi1IRQPending) ? 1 : 0,
3165 		    hdspm->irq_count);
3166 	snd_iprintf(buffer,
3167 		    "HW pointer: id = %d, rawptr = %d (%d->%d) "
3168 		    "estimated= %ld (bytes)\n",
3169 		    ((status & HDSPM_BufferID) ? 1 : 0),
3170 		    (status & HDSPM_BufferPositionMask),
3171 		    (status & HDSPM_BufferPositionMask) %
3172 		    (2 * (int)hdspm->period_bytes),
3173 		    ((status & HDSPM_BufferPositionMask) - 64) %
3174 		    (2 * (int)hdspm->period_bytes),
3175 		    (long) hdspm_hw_pointer(hdspm) * 4);
3176 
3177 	snd_iprintf(buffer,
3178 		    "MIDI FIFO: Out1=0x%x, Out2=0x%x, In1=0x%x, In2=0x%x \n",
3179 		    hdspm_read(hdspm, HDSPM_midiStatusOut0) & 0xFF,
3180 		    hdspm_read(hdspm, HDSPM_midiStatusOut1) & 0xFF,
3181 		    hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xFF,
3182 		    hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xFF);
3183 	snd_iprintf(buffer,
3184 		    "Register: ctrl1=0x%x, status1=0x%x, status2=0x%x, "
3185 		    "timecode=0x%x\n",
3186 		    hdspm->control_register,
3187 		    status, status2, timecode);
3188 
3189 	snd_iprintf(buffer, "--- Settings ---\n");
3190 
3191 	x = 1 << (6 + hdspm_decode_latency(hdspm->control_register &
3192 					   HDSPM_LatencyMask));
3193 
3194 	snd_iprintf(buffer,
3195 		    "Size (Latency): %d samples (2 periods of %lu bytes)\n",
3196 		    x, (unsigned long) hdspm->period_bytes);
3197 
3198 	snd_iprintf(buffer, "Line out: %s,   Precise Pointer: %s\n",
3199 		    (hdspm->
3200 		     control_register & HDSPM_LineOut) ? "on " : "off",
3201 		    (hdspm->precise_ptr) ? "on" : "off");
3202 
3203 	snd_iprintf(buffer,
3204 		    "ClearTrackMarker %s, Emphasis %s, Dolby %s\n",
3205 		    (hdspm->
3206 		     control_register & HDSPM_clr_tms) ? "on" : "off",
3207 		    (hdspm->
3208 		     control_register & HDSPM_Emphasis) ? "on" : "off",
3209 		    (hdspm->
3210 		     control_register & HDSPM_Dolby) ? "on" : "off");
3211 
3212 	switch (hdspm_clock_source(hdspm)) {
3213 	case HDSPM_CLOCK_SOURCE_AUTOSYNC:
3214 		clock_source = "AutoSync";
3215 		break;
3216 	case HDSPM_CLOCK_SOURCE_INTERNAL_32KHZ:
3217 		clock_source = "Internal 32 kHz";
3218 		break;
3219 	case HDSPM_CLOCK_SOURCE_INTERNAL_44_1KHZ:
3220 		clock_source = "Internal 44.1 kHz";
3221 		break;
3222 	case HDSPM_CLOCK_SOURCE_INTERNAL_48KHZ:
3223 		clock_source = "Internal 48 kHz";
3224 		break;
3225 	case HDSPM_CLOCK_SOURCE_INTERNAL_64KHZ:
3226 		clock_source = "Internal 64 kHz";
3227 		break;
3228 	case HDSPM_CLOCK_SOURCE_INTERNAL_88_2KHZ:
3229 		clock_source = "Internal 88.2 kHz";
3230 		break;
3231 	case HDSPM_CLOCK_SOURCE_INTERNAL_96KHZ:
3232 		clock_source = "Internal 96 kHz";
3233 		break;
3234 	case HDSPM_CLOCK_SOURCE_INTERNAL_128KHZ:
3235 		clock_source = "Internal 128 kHz";
3236 		break;
3237 	case HDSPM_CLOCK_SOURCE_INTERNAL_176_4KHZ:
3238 		clock_source = "Internal 176.4 kHz";
3239 		break;
3240 	case HDSPM_CLOCK_SOURCE_INTERNAL_192KHZ:
3241 		clock_source = "Internal 192 kHz";
3242 		break;
3243 	default:
3244 		clock_source = "Error";
3245 	}
3246 	snd_iprintf(buffer, "Sample Clock Source: %s\n", clock_source);
3247 	if (!(hdspm->control_register & HDSPM_ClockModeMaster))
3248 		system_clock_mode = "Slave";
3249 	else
3250 		system_clock_mode = "Master";
3251 	snd_iprintf(buffer, "System Clock Mode: %s\n", system_clock_mode);
3252 
3253 	pref_syncref = hdspm_pref_sync_ref(hdspm);
3254 	if (pref_syncref == 0)
3255 		snd_iprintf(buffer, "Preferred Sync Reference: Word Clock\n");
3256 	else
3257 		snd_iprintf(buffer, "Preferred Sync Reference: AES%d\n",
3258 				pref_syncref);
3259 
3260 	snd_iprintf(buffer, "System Clock Frequency: %d\n",
3261 		    hdspm->system_sample_rate);
3262 
3263 	snd_iprintf(buffer, "Double speed: %s\n",
3264 			hdspm->control_register & HDSPM_DS_DoubleWire?
3265 			"Double wire" : "Single wire");
3266 	snd_iprintf(buffer, "Quad speed: %s\n",
3267 			hdspm->control_register & HDSPM_QS_DoubleWire?
3268 			"Double wire" :
3269 			hdspm->control_register & HDSPM_QS_QuadWire?
3270 			"Quad wire" : "Single wire");
3271 
3272 	snd_iprintf(buffer, "--- Status:\n");
3273 
3274 	snd_iprintf(buffer, "Word: %s  Frequency: %d\n",
3275 		    (status & HDSPM_AES32_wcLock)? "Sync   " : "No Lock",
3276 		    HDSPM_bit2freq((status >> HDSPM_AES32_wcFreq_bit) & 0xF));
3277 
3278 	for (x = 0; x < 8; x++) {
3279 		snd_iprintf(buffer, "AES%d: %s  Frequency: %d\n",
3280 			    x+1,
3281 			    (status2 & (HDSPM_LockAES >> x)) ?
3282 			    "Sync   ": "No Lock",
3283 			    HDSPM_bit2freq((timecode >> (4*x)) & 0xF));
3284 	}
3285 
3286 	switch (hdspm_autosync_ref(hdspm)) {
3287 	case HDSPM_AES32_AUTOSYNC_FROM_NONE: autosync_ref="None"; break;
3288 	case HDSPM_AES32_AUTOSYNC_FROM_WORD: autosync_ref="Word Clock"; break;
3289 	case HDSPM_AES32_AUTOSYNC_FROM_AES1: autosync_ref="AES1"; break;
3290 	case HDSPM_AES32_AUTOSYNC_FROM_AES2: autosync_ref="AES2"; break;
3291 	case HDSPM_AES32_AUTOSYNC_FROM_AES3: autosync_ref="AES3"; break;
3292 	case HDSPM_AES32_AUTOSYNC_FROM_AES4: autosync_ref="AES4"; break;
3293 	case HDSPM_AES32_AUTOSYNC_FROM_AES5: autosync_ref="AES5"; break;
3294 	case HDSPM_AES32_AUTOSYNC_FROM_AES6: autosync_ref="AES6"; break;
3295 	case HDSPM_AES32_AUTOSYNC_FROM_AES7: autosync_ref="AES7"; break;
3296 	case HDSPM_AES32_AUTOSYNC_FROM_AES8: autosync_ref="AES8"; break;
3297 	default: autosync_ref = "---"; break;
3298 	}
3299 	snd_iprintf(buffer, "AutoSync ref = %s\n", autosync_ref);
3300 
3301 	snd_iprintf(buffer, "\n");
3302 }
3303 
3304 #ifdef CONFIG_SND_DEBUG
3305 static void
3306 snd_hdspm_proc_read_debug(struct snd_info_entry * entry,
3307 			  struct snd_info_buffer *buffer)
3308 {
3309 	struct hdspm *hdspm = entry->private_data;
3310 
3311 	int j,i;
3312 
3313 	for (i = 0; i < 256 /* 1024*64 */; i += j) {
3314 		snd_iprintf(buffer, "0x%08X: ", i);
3315 		for (j = 0; j < 16; j += 4)
3316 			snd_iprintf(buffer, "%08X ", hdspm_read(hdspm, i + j));
3317 		snd_iprintf(buffer, "\n");
3318 	}
3319 }
3320 #endif
3321 
3322 
3323 
3324 static void __devinit snd_hdspm_proc_init(struct hdspm * hdspm)
3325 {
3326 	struct snd_info_entry *entry;
3327 
3328 	if (!snd_card_proc_new(hdspm->card, "hdspm", &entry))
3329 		snd_info_set_text_ops(entry, hdspm,
3330 				      hdspm->is_aes32 ?
3331 				      snd_hdspm_proc_read_aes32 :
3332 				      snd_hdspm_proc_read_madi);
3333 #ifdef CONFIG_SND_DEBUG
3334 	/* debug file to read all hdspm registers */
3335 	if (!snd_card_proc_new(hdspm->card, "debug", &entry))
3336 		snd_info_set_text_ops(entry, hdspm,
3337 				snd_hdspm_proc_read_debug);
3338 #endif
3339 }
3340 
3341 /*------------------------------------------------------------
3342    hdspm intitialize
3343  ------------------------------------------------------------*/
3344 
3345 static int snd_hdspm_set_defaults(struct hdspm * hdspm)
3346 {
3347 	unsigned int i;
3348 
3349 	/* ASSUMPTION: hdspm->lock is either held, or there is no need to
3350 	   hold it (e.g. during module initialization).
3351 	 */
3352 
3353 	/* set defaults:       */
3354 
3355 	if (hdspm->is_aes32)
3356 		hdspm->control_register =
3357 			HDSPM_ClockModeMaster |	/* Master Cloack Mode on */
3358 			hdspm_encode_latency(7) | /* latency maximum =
3359 						   * 8192 samples
3360 						   */
3361 			HDSPM_SyncRef0 |	/* AES1 is syncclock */
3362 			HDSPM_LineOut |	/* Analog output in */
3363 			HDSPM_Professional;  /* Professional mode */
3364 	else
3365 		hdspm->control_register =
3366 			HDSPM_ClockModeMaster |	/* Master Cloack Mode on */
3367 			hdspm_encode_latency(7) | /* latency maximum =
3368 						   * 8192 samples
3369 						   */
3370 			HDSPM_InputCoaxial |	/* Input Coax not Optical */
3371 			HDSPM_SyncRef_MADI |	/* Madi is syncclock */
3372 			HDSPM_LineOut |	/* Analog output in */
3373 			HDSPM_TX_64ch |	/* transmit in 64ch mode */
3374 			HDSPM_AutoInp;	/* AutoInput chossing (takeover) */
3375 
3376 	/* ! HDSPM_Frequency0|HDSPM_Frequency1 = 44.1khz */
3377 	/* !  HDSPM_DoubleSpeed HDSPM_QuadSpeed = normal speed */
3378 	/* ! HDSPM_clr_tms = do not clear bits in track marks */
3379 
3380 	hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3381 
3382         if (!hdspm->is_aes32) {
3383 		/* No control2 register for AES32 */
3384 #ifdef SNDRV_BIG_ENDIAN
3385 		hdspm->control2_register = HDSPM_BIGENDIAN_MODE;
3386 #else
3387 		hdspm->control2_register = 0;
3388 #endif
3389 
3390 		hdspm_write(hdspm, HDSPM_control2Reg, hdspm->control2_register);
3391 	}
3392 	hdspm_compute_period_size(hdspm);
3393 
3394 	/* silence everything */
3395 
3396 	all_in_all_mixer(hdspm, 0 * UNITY_GAIN);
3397 
3398 	if (line_outs_monitor[hdspm->dev]) {
3399 
3400 		snd_printk(KERN_INFO "HDSPM: "
3401 			   "sending all playback streams to line outs.\n");
3402 
3403 		for (i = 0; i < HDSPM_MIXER_CHANNELS; i++) {
3404 			if (hdspm_write_pb_gain(hdspm, i, i, UNITY_GAIN))
3405 				return -EIO;
3406 		}
3407 	}
3408 
3409 	/* set a default rate so that the channel map is set up. */
3410 	hdspm->channel_map = channel_map_madi_ss;
3411 	hdspm_set_rate(hdspm, 44100, 1);
3412 
3413 	return 0;
3414 }
3415 
3416 
3417 /*------------------------------------------------------------
3418    interrupt
3419  ------------------------------------------------------------*/
3420 
3421 static irqreturn_t snd_hdspm_interrupt(int irq, void *dev_id)
3422 {
3423 	struct hdspm *hdspm = (struct hdspm *) dev_id;
3424 	unsigned int status;
3425 	int audio;
3426 	int midi0;
3427 	int midi1;
3428 	unsigned int midi0status;
3429 	unsigned int midi1status;
3430 	int schedule = 0;
3431 
3432 	status = hdspm_read(hdspm, HDSPM_statusRegister);
3433 
3434 	audio = status & HDSPM_audioIRQPending;
3435 	midi0 = status & HDSPM_midi0IRQPending;
3436 	midi1 = status & HDSPM_midi1IRQPending;
3437 
3438 	if (!audio && !midi0 && !midi1)
3439 		return IRQ_NONE;
3440 
3441 	hdspm_write(hdspm, HDSPM_interruptConfirmation, 0);
3442 	hdspm->irq_count++;
3443 
3444 	midi0status = hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xff;
3445 	midi1status = hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xff;
3446 
3447 	if (audio) {
3448 
3449 		if (hdspm->capture_substream)
3450 			snd_pcm_period_elapsed(hdspm->capture_substream);
3451 
3452 		if (hdspm->playback_substream)
3453 			snd_pcm_period_elapsed(hdspm->playback_substream);
3454 	}
3455 
3456 	if (midi0 && midi0status) {
3457 		/* we disable interrupts for this input until processing
3458 		 * is done
3459 		 */
3460 		hdspm->control_register &= ~HDSPM_Midi0InterruptEnable;
3461 		hdspm_write(hdspm, HDSPM_controlRegister,
3462 			    hdspm->control_register);
3463 		hdspm->midi[0].pending = 1;
3464 		schedule = 1;
3465 	}
3466 	if (midi1 && midi1status) {
3467 		/* we disable interrupts for this input until processing
3468 		 * is done
3469 		 */
3470 		hdspm->control_register &= ~HDSPM_Midi1InterruptEnable;
3471 		hdspm_write(hdspm, HDSPM_controlRegister,
3472 			    hdspm->control_register);
3473 		hdspm->midi[1].pending = 1;
3474 		schedule = 1;
3475 	}
3476 	if (schedule)
3477 		tasklet_hi_schedule(&hdspm->midi_tasklet);
3478 	return IRQ_HANDLED;
3479 }
3480 
3481 /*------------------------------------------------------------
3482    pcm interface
3483   ------------------------------------------------------------*/
3484 
3485 
3486 static snd_pcm_uframes_t snd_hdspm_hw_pointer(struct snd_pcm_substream *
3487 					      substream)
3488 {
3489 	struct hdspm *hdspm = snd_pcm_substream_chip(substream);
3490 	return hdspm_hw_pointer(hdspm);
3491 }
3492 
3493 static char *hdspm_channel_buffer_location(struct hdspm * hdspm,
3494 					   int stream, int channel)
3495 {
3496 	int mapped_channel;
3497 
3498 	snd_assert(channel >= 0
3499 		   || channel < HDSPM_MAX_CHANNELS, return NULL);
3500 
3501 	mapped_channel = hdspm->channel_map[channel];
3502 	if (mapped_channel < 0)
3503 		return NULL;
3504 
3505 	if (stream == SNDRV_PCM_STREAM_CAPTURE)
3506 		return hdspm->capture_buffer +
3507 		    mapped_channel * HDSPM_CHANNEL_BUFFER_BYTES;
3508 	else
3509 		return hdspm->playback_buffer +
3510 		    mapped_channel * HDSPM_CHANNEL_BUFFER_BYTES;
3511 }
3512 
3513 
3514 /* dont know why need it ??? */
3515 static int snd_hdspm_playback_copy(struct snd_pcm_substream *substream,
3516 				   int channel, snd_pcm_uframes_t pos,
3517 				   void __user *src, snd_pcm_uframes_t count)
3518 {
3519 	struct hdspm *hdspm = snd_pcm_substream_chip(substream);
3520 	char *channel_buf;
3521 
3522 	snd_assert(pos + count <= HDSPM_CHANNEL_BUFFER_BYTES / 4,
3523 		   return -EINVAL);
3524 
3525 	channel_buf =
3526 		hdspm_channel_buffer_location(hdspm, substream->pstr->stream,
3527 					      channel);
3528 
3529 	snd_assert(channel_buf != NULL, return -EIO);
3530 
3531 	return copy_from_user(channel_buf + pos * 4, src, count * 4);
3532 }
3533 
3534 static int snd_hdspm_capture_copy(struct snd_pcm_substream *substream,
3535 				  int channel, snd_pcm_uframes_t pos,
3536 				  void __user *dst, snd_pcm_uframes_t count)
3537 {
3538 	struct hdspm *hdspm = snd_pcm_substream_chip(substream);
3539 	char *channel_buf;
3540 
3541 	snd_assert(pos + count <= HDSPM_CHANNEL_BUFFER_BYTES / 4,
3542 		   return -EINVAL);
3543 
3544 	channel_buf =
3545 		hdspm_channel_buffer_location(hdspm, substream->pstr->stream,
3546 					      channel);
3547 	snd_assert(channel_buf != NULL, return -EIO);
3548 	return copy_to_user(dst, channel_buf + pos * 4, count * 4);
3549 }
3550 
3551 static int snd_hdspm_hw_silence(struct snd_pcm_substream *substream,
3552 				int channel, snd_pcm_uframes_t pos,
3553 				snd_pcm_uframes_t count)
3554 {
3555 	struct hdspm *hdspm = snd_pcm_substream_chip(substream);
3556 	char *channel_buf;
3557 
3558 	channel_buf =
3559 		hdspm_channel_buffer_location(hdspm, substream->pstr->stream,
3560 					      channel);
3561 	snd_assert(channel_buf != NULL, return -EIO);
3562 	memset(channel_buf + pos * 4, 0, count * 4);
3563 	return 0;
3564 }
3565 
3566 static int snd_hdspm_reset(struct snd_pcm_substream *substream)
3567 {
3568 	struct snd_pcm_runtime *runtime = substream->runtime;
3569 	struct hdspm *hdspm = snd_pcm_substream_chip(substream);
3570 	struct snd_pcm_substream *other;
3571 
3572 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
3573 		other = hdspm->capture_substream;
3574 	else
3575 		other = hdspm->playback_substream;
3576 
3577 	if (hdspm->running)
3578 		runtime->status->hw_ptr = hdspm_hw_pointer(hdspm);
3579 	else
3580 		runtime->status->hw_ptr = 0;
3581 	if (other) {
3582 		struct snd_pcm_substream *s;
3583 		struct snd_pcm_runtime *oruntime = other->runtime;
3584 		snd_pcm_group_for_each_entry(s, substream) {
3585 			if (s == other) {
3586 				oruntime->status->hw_ptr =
3587 				    runtime->status->hw_ptr;
3588 				break;
3589 			}
3590 		}
3591 	}
3592 	return 0;
3593 }
3594 
3595 static int snd_hdspm_hw_params(struct snd_pcm_substream *substream,
3596 			       struct snd_pcm_hw_params *params)
3597 {
3598 	struct hdspm *hdspm = snd_pcm_substream_chip(substream);
3599 	int err;
3600 	int i;
3601 	pid_t this_pid;
3602 	pid_t other_pid;
3603 	struct snd_sg_buf *sgbuf;
3604 
3605 
3606 	spin_lock_irq(&hdspm->lock);
3607 
3608 	if (substream->pstr->stream == SNDRV_PCM_STREAM_PLAYBACK) {
3609 		this_pid = hdspm->playback_pid;
3610 		other_pid = hdspm->capture_pid;
3611 	} else {
3612 		this_pid = hdspm->capture_pid;
3613 		other_pid = hdspm->playback_pid;
3614 	}
3615 
3616 	if (other_pid > 0 && this_pid != other_pid) {
3617 
3618 		/* The other stream is open, and not by the same
3619 		   task as this one. Make sure that the parameters
3620 		   that matter are the same.
3621 		 */
3622 
3623 		if (params_rate(params) != hdspm->system_sample_rate) {
3624 			spin_unlock_irq(&hdspm->lock);
3625 			_snd_pcm_hw_param_setempty(params,
3626 						   SNDRV_PCM_HW_PARAM_RATE);
3627 			return -EBUSY;
3628 		}
3629 
3630 		if (params_period_size(params) != hdspm->period_bytes / 4) {
3631 			spin_unlock_irq(&hdspm->lock);
3632 			_snd_pcm_hw_param_setempty(params,
3633 					   SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
3634 			return -EBUSY;
3635 		}
3636 
3637 	}
3638 	/* We're fine. */
3639 	spin_unlock_irq(&hdspm->lock);
3640 
3641 	/* how to make sure that the rate matches an externally-set one ?   */
3642 
3643 	spin_lock_irq(&hdspm->lock);
3644 	err = hdspm_set_rate(hdspm, params_rate(params), 0);
3645 	if (err < 0) {
3646 		spin_unlock_irq(&hdspm->lock);
3647 		_snd_pcm_hw_param_setempty(params,
3648 					   SNDRV_PCM_HW_PARAM_RATE);
3649 		return err;
3650 	}
3651 	spin_unlock_irq(&hdspm->lock);
3652 
3653 	err = hdspm_set_interrupt_interval(hdspm,
3654 					   params_period_size(params));
3655 	if (err < 0) {
3656 		_snd_pcm_hw_param_setempty(params,
3657 					   SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
3658 		return err;
3659 	}
3660 
3661 	/* Memory allocation, takashi's method, dont know if we should
3662 	 * spinlock
3663 	 */
3664 	/* malloc all buffer even if not enabled to get sure */
3665 	/* Update for MADI rev 204: we need to allocate for all channels,
3666 	 * otherwise it doesn't work at 96kHz */
3667 	err =
3668 	    snd_pcm_lib_malloc_pages(substream, HDSPM_DMA_AREA_BYTES);
3669 	if (err < 0)
3670 		return err;
3671 
3672 	sgbuf = snd_pcm_substream_sgbuf(substream);
3673 
3674 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
3675 
3676 		hdspm_set_sgbuf(hdspm, sgbuf, HDSPM_pageAddressBufferOut,
3677 				params_channels(params));
3678 
3679 		for (i = 0; i < params_channels(params); ++i)
3680 			snd_hdspm_enable_out(hdspm, i, 1);
3681 
3682 		hdspm->playback_buffer =
3683 		    (unsigned char *) substream->runtime->dma_area;
3684 		snd_printdd("Allocated sample buffer for playback at %p\n",
3685 				hdspm->playback_buffer);
3686 	} else {
3687 		hdspm_set_sgbuf(hdspm, sgbuf, HDSPM_pageAddressBufferIn,
3688 				params_channels(params));
3689 
3690 		for (i = 0; i < params_channels(params); ++i)
3691 			snd_hdspm_enable_in(hdspm, i, 1);
3692 
3693 		hdspm->capture_buffer =
3694 		    (unsigned char *) substream->runtime->dma_area;
3695 		snd_printdd("Allocated sample buffer for capture at %p\n",
3696 				hdspm->capture_buffer);
3697 	}
3698 	/*
3699 	   snd_printdd("Allocated sample buffer for %s at 0x%08X\n",
3700 	   substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
3701 	   "playback" : "capture",
3702 	   snd_pcm_sgbuf_get_addr(sgbuf, 0));
3703 	 */
3704 	/*
3705 	snd_printdd("set_hwparams: %s %d Hz, %d channels, bs = %d\n",
3706 			substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
3707 			  "playback" : "capture",
3708 			params_rate(params), params_channels(params),
3709 			params_buffer_size(params));
3710 	*/
3711 	return 0;
3712 }
3713 
3714 static int snd_hdspm_hw_free(struct snd_pcm_substream *substream)
3715 {
3716 	int i;
3717 	struct hdspm *hdspm = snd_pcm_substream_chip(substream);
3718 
3719 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
3720 
3721 		/* params_channels(params) should be enough,
3722 		   but to get sure in case of error */
3723 		for (i = 0; i < HDSPM_MAX_CHANNELS; ++i)
3724 			snd_hdspm_enable_out(hdspm, i, 0);
3725 
3726 		hdspm->playback_buffer = NULL;
3727 	} else {
3728 		for (i = 0; i < HDSPM_MAX_CHANNELS; ++i)
3729 			snd_hdspm_enable_in(hdspm, i, 0);
3730 
3731 		hdspm->capture_buffer = NULL;
3732 
3733 	}
3734 
3735 	snd_pcm_lib_free_pages(substream);
3736 
3737 	return 0;
3738 }
3739 
3740 static int snd_hdspm_channel_info(struct snd_pcm_substream *substream,
3741 				  struct snd_pcm_channel_info * info)
3742 {
3743 	struct hdspm *hdspm = snd_pcm_substream_chip(substream);
3744 	int mapped_channel;
3745 
3746 	snd_assert(info->channel < HDSPM_MAX_CHANNELS, return -EINVAL);
3747 
3748 	mapped_channel = hdspm->channel_map[info->channel];
3749 	if (mapped_channel < 0)
3750 		return -EINVAL;
3751 
3752 	info->offset = mapped_channel * HDSPM_CHANNEL_BUFFER_BYTES;
3753 	info->first = 0;
3754 	info->step = 32;
3755 	return 0;
3756 }
3757 
3758 static int snd_hdspm_ioctl(struct snd_pcm_substream *substream,
3759 			   unsigned int cmd, void *arg)
3760 {
3761 	switch (cmd) {
3762 	case SNDRV_PCM_IOCTL1_RESET:
3763 		return snd_hdspm_reset(substream);
3764 
3765 	case SNDRV_PCM_IOCTL1_CHANNEL_INFO:
3766 	{
3767 		struct snd_pcm_channel_info *info = arg;
3768 		return snd_hdspm_channel_info(substream, info);
3769 	}
3770 	default:
3771 		break;
3772 	}
3773 
3774 	return snd_pcm_lib_ioctl(substream, cmd, arg);
3775 }
3776 
3777 static int snd_hdspm_trigger(struct snd_pcm_substream *substream, int cmd)
3778 {
3779 	struct hdspm *hdspm = snd_pcm_substream_chip(substream);
3780 	struct snd_pcm_substream *other;
3781 	int running;
3782 
3783 	spin_lock(&hdspm->lock);
3784 	running = hdspm->running;
3785 	switch (cmd) {
3786 	case SNDRV_PCM_TRIGGER_START:
3787 		running |= 1 << substream->stream;
3788 		break;
3789 	case SNDRV_PCM_TRIGGER_STOP:
3790 		running &= ~(1 << substream->stream);
3791 		break;
3792 	default:
3793 		snd_BUG();
3794 		spin_unlock(&hdspm->lock);
3795 		return -EINVAL;
3796 	}
3797 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
3798 		other = hdspm->capture_substream;
3799 	else
3800 		other = hdspm->playback_substream;
3801 
3802 	if (other) {
3803 		struct snd_pcm_substream *s;
3804 		snd_pcm_group_for_each_entry(s, substream) {
3805 			if (s == other) {
3806 				snd_pcm_trigger_done(s, substream);
3807 				if (cmd == SNDRV_PCM_TRIGGER_START)
3808 					running |= 1 << s->stream;
3809 				else
3810 					running &= ~(1 << s->stream);
3811 				goto _ok;
3812 			}
3813 		}
3814 		if (cmd == SNDRV_PCM_TRIGGER_START) {
3815 			if (!(running & (1 << SNDRV_PCM_STREAM_PLAYBACK))
3816 			    && substream->stream ==
3817 			    SNDRV_PCM_STREAM_CAPTURE)
3818 				hdspm_silence_playback(hdspm);
3819 		} else {
3820 			if (running &&
3821 			    substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
3822 				hdspm_silence_playback(hdspm);
3823 		}
3824 	} else {
3825 		if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
3826 			hdspm_silence_playback(hdspm);
3827 	}
3828       _ok:
3829 	snd_pcm_trigger_done(substream, substream);
3830 	if (!hdspm->running && running)
3831 		hdspm_start_audio(hdspm);
3832 	else if (hdspm->running && !running)
3833 		hdspm_stop_audio(hdspm);
3834 	hdspm->running = running;
3835 	spin_unlock(&hdspm->lock);
3836 
3837 	return 0;
3838 }
3839 
3840 static int snd_hdspm_prepare(struct snd_pcm_substream *substream)
3841 {
3842 	return 0;
3843 }
3844 
3845 static unsigned int period_sizes[] =
3846     { 64, 128, 256, 512, 1024, 2048, 4096, 8192 };
3847 
3848 static struct snd_pcm_hardware snd_hdspm_playback_subinfo = {
3849 	.info = (SNDRV_PCM_INFO_MMAP |
3850 		 SNDRV_PCM_INFO_MMAP_VALID |
3851 		 SNDRV_PCM_INFO_NONINTERLEAVED |
3852 		 SNDRV_PCM_INFO_SYNC_START | SNDRV_PCM_INFO_DOUBLE),
3853 	.formats = SNDRV_PCM_FMTBIT_S32_LE,
3854 	.rates = (SNDRV_PCM_RATE_32000 |
3855 		  SNDRV_PCM_RATE_44100 |
3856 		  SNDRV_PCM_RATE_48000 |
3857 		  SNDRV_PCM_RATE_64000 |
3858 		  SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 |
3859 		  SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000 ),
3860 	.rate_min = 32000,
3861 	.rate_max = 192000,
3862 	.channels_min = 1,
3863 	.channels_max = HDSPM_MAX_CHANNELS,
3864 	.buffer_bytes_max =
3865 	    HDSPM_CHANNEL_BUFFER_BYTES * HDSPM_MAX_CHANNELS,
3866 	.period_bytes_min = (64 * 4),
3867 	.period_bytes_max = (8192 * 4) * HDSPM_MAX_CHANNELS,
3868 	.periods_min = 2,
3869 	.periods_max = 2,
3870 	.fifo_size = 0
3871 };
3872 
3873 static struct snd_pcm_hardware snd_hdspm_capture_subinfo = {
3874 	.info = (SNDRV_PCM_INFO_MMAP |
3875 		 SNDRV_PCM_INFO_MMAP_VALID |
3876 		 SNDRV_PCM_INFO_NONINTERLEAVED |
3877 		 SNDRV_PCM_INFO_SYNC_START),
3878 	.formats = SNDRV_PCM_FMTBIT_S32_LE,
3879 	.rates = (SNDRV_PCM_RATE_32000 |
3880 		  SNDRV_PCM_RATE_44100 |
3881 		  SNDRV_PCM_RATE_48000 |
3882 		  SNDRV_PCM_RATE_64000 |
3883 		  SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 |
3884 		  SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000),
3885 	.rate_min = 32000,
3886 	.rate_max = 192000,
3887 	.channels_min = 1,
3888 	.channels_max = HDSPM_MAX_CHANNELS,
3889 	.buffer_bytes_max =
3890 	    HDSPM_CHANNEL_BUFFER_BYTES * HDSPM_MAX_CHANNELS,
3891 	.period_bytes_min = (64 * 4),
3892 	.period_bytes_max = (8192 * 4) * HDSPM_MAX_CHANNELS,
3893 	.periods_min = 2,
3894 	.periods_max = 2,
3895 	.fifo_size = 0
3896 };
3897 
3898 static struct snd_pcm_hw_constraint_list hw_constraints_period_sizes = {
3899 	.count = ARRAY_SIZE(period_sizes),
3900 	.list = period_sizes,
3901 	.mask = 0
3902 };
3903 
3904 
3905 static int snd_hdspm_hw_rule_channels_rate(struct snd_pcm_hw_params *params,
3906 					   struct snd_pcm_hw_rule * rule)
3907 {
3908 	struct hdspm *hdspm = rule->private;
3909 	struct snd_interval *c =
3910 	    hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
3911 	struct snd_interval *r =
3912 	    hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
3913 
3914 	if (r->min > 48000 && r->max <= 96000) {
3915 		struct snd_interval t = {
3916 			.min = hdspm->ds_channels,
3917 			.max = hdspm->ds_channels,
3918 			.integer = 1,
3919 		};
3920 		return snd_interval_refine(c, &t);
3921 	} else if (r->max < 64000) {
3922 		struct snd_interval t = {
3923 			.min = hdspm->ss_channels,
3924 			.max = hdspm->ss_channels,
3925 			.integer = 1,
3926 		};
3927 		return snd_interval_refine(c, &t);
3928 	}
3929 	return 0;
3930 }
3931 
3932 static int snd_hdspm_hw_rule_rate_channels(struct snd_pcm_hw_params *params,
3933 					   struct snd_pcm_hw_rule * rule)
3934 {
3935 	struct hdspm *hdspm = rule->private;
3936 	struct snd_interval *c =
3937 	    hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
3938 	struct snd_interval *r =
3939 	    hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
3940 
3941 	if (c->min >= hdspm->ss_channels) {
3942 		struct snd_interval t = {
3943 			.min = 32000,
3944 			.max = 48000,
3945 			.integer = 1,
3946 		};
3947 		return snd_interval_refine(r, &t);
3948 	} else if (c->max <= hdspm->ds_channels) {
3949 		struct snd_interval t = {
3950 			.min = 64000,
3951 			.max = 96000,
3952 			.integer = 1,
3953 		};
3954 
3955 		return snd_interval_refine(r, &t);
3956 	}
3957 	return 0;
3958 }
3959 
3960 static int snd_hdspm_hw_rule_channels(struct snd_pcm_hw_params *params,
3961 				      struct snd_pcm_hw_rule *rule)
3962 {
3963 	unsigned int list[3];
3964 	struct hdspm *hdspm = rule->private;
3965 	struct snd_interval *c = hw_param_interval(params,
3966 			SNDRV_PCM_HW_PARAM_CHANNELS);
3967 	if (hdspm->is_aes32) {
3968 		list[0] = hdspm->qs_channels;
3969 		list[1] = hdspm->ds_channels;
3970 		list[2] = hdspm->ss_channels;
3971 		return snd_interval_list(c, 3, list, 0);
3972 	} else {
3973 		list[0] = hdspm->ds_channels;
3974 		list[1] = hdspm->ss_channels;
3975 		return snd_interval_list(c, 2, list, 0);
3976 	}
3977 }
3978 
3979 
3980 static unsigned int hdspm_aes32_sample_rates[] = {
3981 	32000, 44100, 48000, 64000, 88200, 96000, 128000, 176400, 192000
3982 };
3983 
3984 static struct snd_pcm_hw_constraint_list
3985 hdspm_hw_constraints_aes32_sample_rates = {
3986 	.count = ARRAY_SIZE(hdspm_aes32_sample_rates),
3987 	.list = hdspm_aes32_sample_rates,
3988 	.mask = 0
3989 };
3990 
3991 static int snd_hdspm_playback_open(struct snd_pcm_substream *substream)
3992 {
3993 	struct hdspm *hdspm = snd_pcm_substream_chip(substream);
3994 	struct snd_pcm_runtime *runtime = substream->runtime;
3995 
3996 	spin_lock_irq(&hdspm->lock);
3997 
3998 	snd_pcm_set_sync(substream);
3999 
4000 	runtime->hw = snd_hdspm_playback_subinfo;
4001 
4002 	if (hdspm->capture_substream == NULL)
4003 		hdspm_stop_audio(hdspm);
4004 
4005 	hdspm->playback_pid = current->pid;
4006 	hdspm->playback_substream = substream;
4007 
4008 	spin_unlock_irq(&hdspm->lock);
4009 
4010 	snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
4011 
4012 	snd_pcm_hw_constraint_list(runtime, 0,
4013 				   SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
4014 				   &hw_constraints_period_sizes);
4015 
4016 	if (hdspm->is_aes32) {
4017 		snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
4018 				&hdspm_hw_constraints_aes32_sample_rates);
4019 	} else {
4020 		snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
4021 				     snd_hdspm_hw_rule_channels, hdspm,
4022 				     SNDRV_PCM_HW_PARAM_CHANNELS, -1);
4023 		snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
4024 				    snd_hdspm_hw_rule_channels_rate, hdspm,
4025 				    SNDRV_PCM_HW_PARAM_RATE, -1);
4026 
4027 		snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
4028 				    snd_hdspm_hw_rule_rate_channels, hdspm,
4029 				    SNDRV_PCM_HW_PARAM_CHANNELS, -1);
4030 	}
4031 	return 0;
4032 }
4033 
4034 static int snd_hdspm_playback_release(struct snd_pcm_substream *substream)
4035 {
4036 	struct hdspm *hdspm = snd_pcm_substream_chip(substream);
4037 
4038 	spin_lock_irq(&hdspm->lock);
4039 
4040 	hdspm->playback_pid = -1;
4041 	hdspm->playback_substream = NULL;
4042 
4043 	spin_unlock_irq(&hdspm->lock);
4044 
4045 	return 0;
4046 }
4047 
4048 
4049 static int snd_hdspm_capture_open(struct snd_pcm_substream *substream)
4050 {
4051 	struct hdspm *hdspm = snd_pcm_substream_chip(substream);
4052 	struct snd_pcm_runtime *runtime = substream->runtime;
4053 
4054 	spin_lock_irq(&hdspm->lock);
4055 	snd_pcm_set_sync(substream);
4056 	runtime->hw = snd_hdspm_capture_subinfo;
4057 
4058 	if (hdspm->playback_substream == NULL)
4059 		hdspm_stop_audio(hdspm);
4060 
4061 	hdspm->capture_pid = current->pid;
4062 	hdspm->capture_substream = substream;
4063 
4064 	spin_unlock_irq(&hdspm->lock);
4065 
4066 	snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
4067 	snd_pcm_hw_constraint_list(runtime, 0,
4068 				   SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
4069 				   &hw_constraints_period_sizes);
4070 	if (hdspm->is_aes32) {
4071 		snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
4072 				&hdspm_hw_constraints_aes32_sample_rates);
4073 	} else {
4074 		snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
4075 				     snd_hdspm_hw_rule_channels, hdspm,
4076 				     SNDRV_PCM_HW_PARAM_CHANNELS, -1);
4077 		snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
4078 				    snd_hdspm_hw_rule_channels_rate, hdspm,
4079 				    SNDRV_PCM_HW_PARAM_RATE, -1);
4080 
4081 		snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
4082 				    snd_hdspm_hw_rule_rate_channels, hdspm,
4083 				    SNDRV_PCM_HW_PARAM_CHANNELS, -1);
4084 	}
4085 	return 0;
4086 }
4087 
4088 static int snd_hdspm_capture_release(struct snd_pcm_substream *substream)
4089 {
4090 	struct hdspm *hdspm = snd_pcm_substream_chip(substream);
4091 
4092 	spin_lock_irq(&hdspm->lock);
4093 
4094 	hdspm->capture_pid = -1;
4095 	hdspm->capture_substream = NULL;
4096 
4097 	spin_unlock_irq(&hdspm->lock);
4098 	return 0;
4099 }
4100 
4101 static int snd_hdspm_hwdep_dummy_op(struct snd_hwdep * hw, struct file *file)
4102 {
4103 	/* we have nothing to initialize but the call is required */
4104 	return 0;
4105 }
4106 
4107 
4108 static int snd_hdspm_hwdep_ioctl(struct snd_hwdep * hw, struct file *file,
4109 				 unsigned int cmd, unsigned long arg)
4110 {
4111 	struct hdspm *hdspm = hw->private_data;
4112 	struct hdspm_mixer_ioctl mixer;
4113 	struct hdspm_config_info info;
4114 	struct hdspm_version hdspm_version;
4115 	struct hdspm_peak_rms_ioctl rms;
4116 
4117 	switch (cmd) {
4118 
4119 	case SNDRV_HDSPM_IOCTL_GET_PEAK_RMS:
4120 		if (copy_from_user(&rms, (void __user *)arg, sizeof(rms)))
4121 			return -EFAULT;
4122 		/* maybe there is a chance to memorymap in future
4123 		 * so dont touch just copy
4124 		 */
4125 		if(copy_to_user_fromio((void __user *)rms.peak,
4126 				       hdspm->iobase+HDSPM_MADI_peakrmsbase,
4127 				       sizeof(struct hdspm_peak_rms)) != 0 )
4128 			return -EFAULT;
4129 
4130 		break;
4131 
4132 
4133 	case SNDRV_HDSPM_IOCTL_GET_CONFIG_INFO:
4134 
4135 		spin_lock_irq(&hdspm->lock);
4136 		info.pref_sync_ref = hdspm_pref_sync_ref(hdspm);
4137 		info.wordclock_sync_check = hdspm_wc_sync_check(hdspm);
4138 
4139 		info.system_sample_rate = hdspm->system_sample_rate;
4140 		info.autosync_sample_rate =
4141 		    hdspm_external_sample_rate(hdspm);
4142 		info.system_clock_mode = hdspm_system_clock_mode(hdspm);
4143 		info.clock_source = hdspm_clock_source(hdspm);
4144 		info.autosync_ref = hdspm_autosync_ref(hdspm);
4145 		info.line_out = hdspm_line_out(hdspm);
4146 		info.passthru = 0;
4147 		spin_unlock_irq(&hdspm->lock);
4148 		if (copy_to_user((void __user *) arg, &info, sizeof(info)))
4149 			return -EFAULT;
4150 		break;
4151 
4152 	case SNDRV_HDSPM_IOCTL_GET_VERSION:
4153 		hdspm_version.firmware_rev = hdspm->firmware_rev;
4154 		if (copy_to_user((void __user *) arg, &hdspm_version,
4155 				 sizeof(hdspm_version)))
4156 			return -EFAULT;
4157 		break;
4158 
4159 	case SNDRV_HDSPM_IOCTL_GET_MIXER:
4160 		if (copy_from_user(&mixer, (void __user *)arg, sizeof(mixer)))
4161 			return -EFAULT;
4162 		if (copy_to_user((void __user *)mixer.mixer, hdspm->mixer,
4163 				 sizeof(struct hdspm_mixer)))
4164 			return -EFAULT;
4165 		break;
4166 
4167 	default:
4168 		return -EINVAL;
4169 	}
4170 	return 0;
4171 }
4172 
4173 static struct snd_pcm_ops snd_hdspm_playback_ops = {
4174 	.open = snd_hdspm_playback_open,
4175 	.close = snd_hdspm_playback_release,
4176 	.ioctl = snd_hdspm_ioctl,
4177 	.hw_params = snd_hdspm_hw_params,
4178 	.hw_free = snd_hdspm_hw_free,
4179 	.prepare = snd_hdspm_prepare,
4180 	.trigger = snd_hdspm_trigger,
4181 	.pointer = snd_hdspm_hw_pointer,
4182 	.copy = snd_hdspm_playback_copy,
4183 	.silence = snd_hdspm_hw_silence,
4184 	.page = snd_pcm_sgbuf_ops_page,
4185 };
4186 
4187 static struct snd_pcm_ops snd_hdspm_capture_ops = {
4188 	.open = snd_hdspm_capture_open,
4189 	.close = snd_hdspm_capture_release,
4190 	.ioctl = snd_hdspm_ioctl,
4191 	.hw_params = snd_hdspm_hw_params,
4192 	.hw_free = snd_hdspm_hw_free,
4193 	.prepare = snd_hdspm_prepare,
4194 	.trigger = snd_hdspm_trigger,
4195 	.pointer = snd_hdspm_hw_pointer,
4196 	.copy = snd_hdspm_capture_copy,
4197 	.page = snd_pcm_sgbuf_ops_page,
4198 };
4199 
4200 static int __devinit snd_hdspm_create_hwdep(struct snd_card *card,
4201 					    struct hdspm * hdspm)
4202 {
4203 	struct snd_hwdep *hw;
4204 	int err;
4205 
4206 	err = snd_hwdep_new(card, "HDSPM hwdep", 0, &hw);
4207 	if (err < 0)
4208 		return err;
4209 
4210 	hdspm->hwdep = hw;
4211 	hw->private_data = hdspm;
4212 	strcpy(hw->name, "HDSPM hwdep interface");
4213 
4214 	hw->ops.open = snd_hdspm_hwdep_dummy_op;
4215 	hw->ops.ioctl = snd_hdspm_hwdep_ioctl;
4216 	hw->ops.release = snd_hdspm_hwdep_dummy_op;
4217 
4218 	return 0;
4219 }
4220 
4221 
4222 /*------------------------------------------------------------
4223    memory interface
4224  ------------------------------------------------------------*/
4225 static int __devinit snd_hdspm_preallocate_memory(struct hdspm * hdspm)
4226 {
4227 	int err;
4228 	struct snd_pcm *pcm;
4229 	size_t wanted;
4230 
4231 	pcm = hdspm->pcm;
4232 
4233 	wanted = HDSPM_DMA_AREA_BYTES;
4234 
4235 	err =
4236 	     snd_pcm_lib_preallocate_pages_for_all(pcm,
4237 	     					   SNDRV_DMA_TYPE_DEV_SG,
4238 						   snd_dma_pci_data(hdspm->pci),
4239 						   wanted,
4240 						   wanted);
4241 	if (err < 0) {
4242 		snd_printdd("Could not preallocate %zd Bytes\n", wanted);
4243 
4244 		return err;
4245 	} else
4246 		snd_printdd(" Preallocated %zd Bytes\n", wanted);
4247 
4248 	return 0;
4249 }
4250 
4251 static void hdspm_set_sgbuf(struct hdspm * hdspm, struct snd_sg_buf *sgbuf,
4252 			     unsigned int reg, int channels)
4253 {
4254 	int i;
4255 	for (i = 0; i < (channels * 16); i++)
4256 		hdspm_write(hdspm, reg + 4 * i,
4257 			    snd_pcm_sgbuf_get_addr(sgbuf, (size_t) 4096 * i));
4258 }
4259 
4260 /* ------------- ALSA Devices ---------------------------- */
4261 static int __devinit snd_hdspm_create_pcm(struct snd_card *card,
4262 					  struct hdspm * hdspm)
4263 {
4264 	struct snd_pcm *pcm;
4265 	int err;
4266 
4267 	err = snd_pcm_new(card, hdspm->card_name, 0, 1, 1, &pcm);
4268 	if (err < 0)
4269 		return err;
4270 
4271 	hdspm->pcm = pcm;
4272 	pcm->private_data = hdspm;
4273 	strcpy(pcm->name, hdspm->card_name);
4274 
4275 	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
4276 			&snd_hdspm_playback_ops);
4277 	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
4278 			&snd_hdspm_capture_ops);
4279 
4280 	pcm->info_flags = SNDRV_PCM_INFO_JOINT_DUPLEX;
4281 
4282 	err = snd_hdspm_preallocate_memory(hdspm);
4283 	if (err < 0)
4284 		return err;
4285 
4286 	return 0;
4287 }
4288 
4289 static inline void snd_hdspm_initialize_midi_flush(struct hdspm * hdspm)
4290 {
4291 	snd_hdspm_flush_midi_input(hdspm, 0);
4292 	snd_hdspm_flush_midi_input(hdspm, 1);
4293 }
4294 
4295 static int __devinit snd_hdspm_create_alsa_devices(struct snd_card *card,
4296 						   struct hdspm * hdspm)
4297 {
4298 	int err;
4299 
4300 	snd_printdd("Create card...\n");
4301 	err = snd_hdspm_create_pcm(card, hdspm);
4302 	if (err < 0)
4303 		return err;
4304 
4305 	err = snd_hdspm_create_midi(card, hdspm, 0);
4306 	if (err < 0)
4307 		return err;
4308 
4309 	err = snd_hdspm_create_midi(card, hdspm, 1);
4310 	if (err < 0)
4311 		return err;
4312 
4313 	err = snd_hdspm_create_controls(card, hdspm);
4314 	if (err < 0)
4315 		return err;
4316 
4317 	err = snd_hdspm_create_hwdep(card, hdspm);
4318 	if (err < 0)
4319 		return err;
4320 
4321 	snd_printdd("proc init...\n");
4322 	snd_hdspm_proc_init(hdspm);
4323 
4324 	hdspm->system_sample_rate = -1;
4325 	hdspm->last_external_sample_rate = -1;
4326 	hdspm->last_internal_sample_rate = -1;
4327 	hdspm->playback_pid = -1;
4328 	hdspm->capture_pid = -1;
4329 	hdspm->capture_substream = NULL;
4330 	hdspm->playback_substream = NULL;
4331 
4332 	snd_printdd("Set defaults...\n");
4333 	err = snd_hdspm_set_defaults(hdspm);
4334 	if (err < 0)
4335 		return err;
4336 
4337 	snd_printdd("Update mixer controls...\n");
4338 	hdspm_update_simple_mixer_controls(hdspm);
4339 
4340 	snd_printdd("Initializeing complete ???\n");
4341 
4342 	err = snd_card_register(card);
4343 	if (err < 0) {
4344 		snd_printk(KERN_ERR "HDSPM: error registering card\n");
4345 		return err;
4346 	}
4347 
4348 	snd_printdd("... yes now\n");
4349 
4350 	return 0;
4351 }
4352 
4353 static int __devinit snd_hdspm_create(struct snd_card *card,
4354 				      struct hdspm *hdspm,
4355 				      int precise_ptr, int enable_monitor)
4356 {
4357 	struct pci_dev *pci = hdspm->pci;
4358 	int err;
4359 	unsigned long io_extent;
4360 
4361 	hdspm->irq = -1;
4362 
4363 	spin_lock_init(&hdspm->midi[0].lock);
4364 	spin_lock_init(&hdspm->midi[1].lock);
4365 
4366 	hdspm->card = card;
4367 
4368 	spin_lock_init(&hdspm->lock);
4369 
4370 	tasklet_init(&hdspm->midi_tasklet,
4371 		     hdspm_midi_tasklet, (unsigned long) hdspm);
4372 
4373 	pci_read_config_word(hdspm->pci,
4374 			     PCI_CLASS_REVISION, &hdspm->firmware_rev);
4375 
4376 	hdspm->is_aes32 = (hdspm->firmware_rev >= HDSPM_AESREVISION);
4377 
4378 	strcpy(card->mixername, "Xilinx FPGA");
4379 	if (hdspm->is_aes32) {
4380 		strcpy(card->driver, "HDSPAES32");
4381 		hdspm->card_name = "RME HDSPM AES32";
4382 	} else {
4383 		strcpy(card->driver, "HDSPM");
4384 		hdspm->card_name = "RME HDSPM MADI";
4385 	}
4386 
4387 	err = pci_enable_device(pci);
4388 	if (err < 0)
4389 		return err;
4390 
4391 	pci_set_master(hdspm->pci);
4392 
4393 	err = pci_request_regions(pci, "hdspm");
4394 	if (err < 0)
4395 		return err;
4396 
4397 	hdspm->port = pci_resource_start(pci, 0);
4398 	io_extent = pci_resource_len(pci, 0);
4399 
4400 	snd_printdd("grabbed memory region 0x%lx-0x%lx\n",
4401 		   hdspm->port, hdspm->port + io_extent - 1);
4402 
4403 
4404 	hdspm->iobase = ioremap_nocache(hdspm->port, io_extent);
4405 	if (!hdspm->iobase) {
4406 		snd_printk(KERN_ERR "HDSPM: "
4407 			   "unable to remap region 0x%lx-0x%lx\n",
4408 			   hdspm->port, hdspm->port + io_extent - 1);
4409 		return -EBUSY;
4410 	}
4411 	snd_printdd("remapped region (0x%lx) 0x%lx-0x%lx\n",
4412 		   (unsigned long)hdspm->iobase, hdspm->port,
4413 		   hdspm->port + io_extent - 1);
4414 
4415 	if (request_irq(pci->irq, snd_hdspm_interrupt,
4416 			IRQF_SHARED, "hdspm", hdspm)) {
4417 		snd_printk(KERN_ERR "HDSPM: unable to use IRQ %d\n", pci->irq);
4418 		return -EBUSY;
4419 	}
4420 
4421 	snd_printdd("use IRQ %d\n", pci->irq);
4422 
4423 	hdspm->irq = pci->irq;
4424 	hdspm->precise_ptr = precise_ptr;
4425 
4426 	hdspm->monitor_outs = enable_monitor;
4427 
4428 	snd_printdd("kmalloc Mixer memory of %zd Bytes\n",
4429 		   sizeof(struct hdspm_mixer));
4430 	hdspm->mixer = kzalloc(sizeof(struct hdspm_mixer), GFP_KERNEL);
4431 	if (!hdspm->mixer) {
4432 		snd_printk(KERN_ERR "HDSPM: "
4433 			   "unable to kmalloc Mixer memory of %d Bytes\n",
4434 			   (int)sizeof(struct hdspm_mixer));
4435 		return err;
4436 	}
4437 
4438 	hdspm->ss_channels = MADI_SS_CHANNELS;
4439 	hdspm->ds_channels = MADI_DS_CHANNELS;
4440 	hdspm->qs_channels = MADI_QS_CHANNELS;
4441 
4442 	snd_printdd("create alsa devices.\n");
4443 	err = snd_hdspm_create_alsa_devices(card, hdspm);
4444 	if (err < 0)
4445 		return err;
4446 
4447 	snd_hdspm_initialize_midi_flush(hdspm);
4448 
4449 	return 0;
4450 }
4451 
4452 static int snd_hdspm_free(struct hdspm * hdspm)
4453 {
4454 
4455 	if (hdspm->port) {
4456 
4457 		/* stop th audio, and cancel all interrupts */
4458 		hdspm->control_register &=
4459 		    ~(HDSPM_Start | HDSPM_AudioInterruptEnable |
4460 		      HDSPM_Midi0InterruptEnable | HDSPM_Midi1InterruptEnable);
4461 		hdspm_write(hdspm, HDSPM_controlRegister,
4462 			    hdspm->control_register);
4463 	}
4464 
4465 	if (hdspm->irq >= 0)
4466 		free_irq(hdspm->irq, (void *) hdspm);
4467 
4468 	kfree(hdspm->mixer);
4469 
4470 	if (hdspm->iobase)
4471 		iounmap(hdspm->iobase);
4472 
4473 	if (hdspm->port)
4474 		pci_release_regions(hdspm->pci);
4475 
4476 	pci_disable_device(hdspm->pci);
4477 	return 0;
4478 }
4479 
4480 static void snd_hdspm_card_free(struct snd_card *card)
4481 {
4482 	struct hdspm *hdspm = card->private_data;
4483 
4484 	if (hdspm)
4485 		snd_hdspm_free(hdspm);
4486 }
4487 
4488 static int __devinit snd_hdspm_probe(struct pci_dev *pci,
4489 				     const struct pci_device_id *pci_id)
4490 {
4491 	static int dev;
4492 	struct hdspm *hdspm;
4493 	struct snd_card *card;
4494 	int err;
4495 
4496 	if (dev >= SNDRV_CARDS)
4497 		return -ENODEV;
4498 	if (!enable[dev]) {
4499 		dev++;
4500 		return -ENOENT;
4501 	}
4502 
4503 	card = snd_card_new(index[dev], id[dev],
4504 			    THIS_MODULE, sizeof(struct hdspm));
4505 	if (!card)
4506 		return -ENOMEM;
4507 
4508 	hdspm = card->private_data;
4509 	card->private_free = snd_hdspm_card_free;
4510 	hdspm->dev = dev;
4511 	hdspm->pci = pci;
4512 
4513 	snd_card_set_dev(card, &pci->dev);
4514 
4515 	err = snd_hdspm_create(card, hdspm, precise_ptr[dev],
4516 			       enable_monitor[dev]);
4517 	if (err < 0) {
4518 		snd_card_free(card);
4519 		return err;
4520 	}
4521 
4522 	strcpy(card->shortname, "HDSPM MADI");
4523 	sprintf(card->longname, "%s at 0x%lx, irq %d", hdspm->card_name,
4524 		hdspm->port, hdspm->irq);
4525 
4526 	err = snd_card_register(card);
4527 	if (err < 0) {
4528 		snd_card_free(card);
4529 		return err;
4530 	}
4531 
4532 	pci_set_drvdata(pci, card);
4533 
4534 	dev++;
4535 	return 0;
4536 }
4537 
4538 static void __devexit snd_hdspm_remove(struct pci_dev *pci)
4539 {
4540 	snd_card_free(pci_get_drvdata(pci));
4541 	pci_set_drvdata(pci, NULL);
4542 }
4543 
4544 static struct pci_driver driver = {
4545 	.name = "RME Hammerfall DSP MADI",
4546 	.id_table = snd_hdspm_ids,
4547 	.probe = snd_hdspm_probe,
4548 	.remove = __devexit_p(snd_hdspm_remove),
4549 };
4550 
4551 
4552 static int __init alsa_card_hdspm_init(void)
4553 {
4554 	return pci_register_driver(&driver);
4555 }
4556 
4557 static void __exit alsa_card_hdspm_exit(void)
4558 {
4559 	pci_unregister_driver(&driver);
4560 }
4561 
4562 module_init(alsa_card_hdspm_init)
4563 module_exit(alsa_card_hdspm_exit)
4564