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