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