Merge branch 'next' into for-linus
[linux-2.6-microblaze.git] / sound / pci / asihpi / asihpi.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  *  Asihpi soundcard
4  *  Copyright (c) by AudioScience Inc <support@audioscience.com>
5  *
6  *  The following is not a condition of use, merely a request:
7  *  If you modify this program, particularly if you fix errors, AudioScience Inc
8  *  would appreciate it if you grant us the right to use those modifications
9  *  for any purpose including commercial applications.
10  */
11
12 #include "hpi_internal.h"
13 #include "hpi_version.h"
14 #include "hpimsginit.h"
15 #include "hpioctl.h"
16 #include "hpicmn.h"
17
18 #include <linux/pci.h>
19 #include <linux/init.h>
20 #include <linux/jiffies.h>
21 #include <linux/slab.h>
22 #include <linux/time.h>
23 #include <linux/wait.h>
24 #include <linux/module.h>
25 #include <sound/core.h>
26 #include <sound/control.h>
27 #include <sound/pcm.h>
28 #include <sound/pcm_params.h>
29 #include <sound/info.h>
30 #include <sound/initval.h>
31 #include <sound/tlv.h>
32 #include <sound/hwdep.h>
33
34 MODULE_LICENSE("GPL");
35 MODULE_AUTHOR("AudioScience inc. <support@audioscience.com>");
36 MODULE_DESCRIPTION("AudioScience ALSA ASI5xxx ASI6xxx ASI87xx ASI89xx "
37                         HPI_VER_STRING);
38
39 #if defined CONFIG_SND_DEBUG_VERBOSE
40 /**
41  * snd_printddd - very verbose debug printk
42  * @format: format string
43  *
44  * Works like snd_printk() for debugging purposes.
45  * Ignored when CONFIG_SND_DEBUG_VERBOSE is not set.
46  * Must set snd module debug parameter to 3 to enable at runtime.
47  */
48 #define snd_printddd(format, args...) \
49         __snd_printk(3, __FILE__, __LINE__, format, ##args)
50 #else
51 #define snd_printddd(format, args...) do { } while (0)
52 #endif
53
54 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;      /* index 0-MAX */
55 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;       /* ID for this card */
56 static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
57 static bool enable_hpi_hwdep = 1;
58
59 module_param_array(index, int, NULL, 0444);
60 MODULE_PARM_DESC(index, "ALSA index value for AudioScience soundcard.");
61
62 module_param_array(id, charp, NULL, 0444);
63 MODULE_PARM_DESC(id, "ALSA ID string for AudioScience soundcard.");
64
65 module_param_array(enable, bool, NULL, 0444);
66 MODULE_PARM_DESC(enable, "ALSA enable AudioScience soundcard.");
67
68 module_param(enable_hpi_hwdep, bool, 0644);
69 MODULE_PARM_DESC(enable_hpi_hwdep,
70                 "ALSA enable HPI hwdep for AudioScience soundcard ");
71
72 /* identify driver */
73 #ifdef KERNEL_ALSA_BUILD
74 static char *build_info = "Built using headers from kernel source";
75 module_param(build_info, charp, 0444);
76 MODULE_PARM_DESC(build_info, "Built using headers from kernel source");
77 #else
78 static char *build_info = "Built within ALSA source";
79 module_param(build_info, charp, 0444);
80 MODULE_PARM_DESC(build_info, "Built within ALSA source");
81 #endif
82
83 /* set to 1 to dump every control from adapter to log */
84 static const int mixer_dump;
85
86 #define DEFAULT_SAMPLERATE 44100
87 static int adapter_fs = DEFAULT_SAMPLERATE;
88
89 /* defaults */
90 #define PERIODS_MIN 2
91 #define PERIOD_BYTES_MIN  2048
92 #define BUFFER_BYTES_MAX (512 * 1024)
93
94 #define MAX_CLOCKSOURCES (HPI_SAMPLECLOCK_SOURCE_LAST + 1 + 7)
95
96 struct clk_source {
97         int source;
98         int index;
99         const char *name;
100 };
101
102 struct clk_cache {
103         int count;
104         int has_local;
105         struct clk_source s[MAX_CLOCKSOURCES];
106 };
107
108 /* Per card data */
109 struct snd_card_asihpi {
110         struct snd_card *card;
111         struct pci_dev *pci;
112         struct hpi_adapter *hpi;
113
114         /* In low latency mode there is only one stream, a pointer to its
115          * private data is stored here on trigger and cleared on stop.
116          * The interrupt handler uses it as a parameter when calling
117          * snd_card_asihpi_timer_function().
118          */
119         struct snd_card_asihpi_pcm *llmode_streampriv;
120         struct tasklet_struct t;
121         void (*pcm_start)(struct snd_pcm_substream *substream);
122         void (*pcm_stop)(struct snd_pcm_substream *substream);
123
124         u32 h_mixer;
125         struct clk_cache cc;
126
127         u16 can_dma;
128         u16 support_grouping;
129         u16 support_mrx;
130         u16 update_interval_frames;
131         u16 in_max_chans;
132         u16 out_max_chans;
133         u16 in_min_chans;
134         u16 out_min_chans;
135 };
136
137 /* Per stream data */
138 struct snd_card_asihpi_pcm {
139         struct timer_list timer;
140         unsigned int respawn_timer;
141         unsigned int hpi_buffer_attached;
142         unsigned int buffer_bytes;
143         unsigned int period_bytes;
144         unsigned int bytes_per_sec;
145         unsigned int pcm_buf_host_rw_ofs; /* Host R/W pos */
146         unsigned int pcm_buf_dma_ofs;   /* DMA R/W offset in buffer */
147         unsigned int pcm_buf_elapsed_dma_ofs;   /* DMA R/W offset in buffer */
148         unsigned int drained_count;
149         struct snd_pcm_substream *substream;
150         u32 h_stream;
151         struct hpi_format format;
152 };
153
154 /* universal stream verbs work with out or in stream handles */
155
156 /* Functions to allow driver to give a buffer to HPI for busmastering */
157
158 static u16 hpi_stream_host_buffer_attach(
159         u32 h_stream,   /* handle to outstream. */
160         u32 size_in_bytes, /* size in bytes of bus mastering buffer */
161         u32 pci_address
162 )
163 {
164         struct hpi_message hm;
165         struct hpi_response hr;
166         unsigned int obj = hpi_handle_object(h_stream);
167
168         if (!h_stream)
169                 return HPI_ERROR_INVALID_OBJ;
170         hpi_init_message_response(&hm, &hr, obj,
171                         obj == HPI_OBJ_OSTREAM ?
172                                 HPI_OSTREAM_HOSTBUFFER_ALLOC :
173                                 HPI_ISTREAM_HOSTBUFFER_ALLOC);
174
175         hpi_handle_to_indexes(h_stream, &hm.adapter_index,
176                                 &hm.obj_index);
177
178         hm.u.d.u.buffer.buffer_size = size_in_bytes;
179         hm.u.d.u.buffer.pci_address = pci_address;
180         hm.u.d.u.buffer.command = HPI_BUFFER_CMD_INTERNAL_GRANTADAPTER;
181         hpi_send_recv(&hm, &hr);
182         return hr.error;
183 }
184
185 static u16 hpi_stream_host_buffer_detach(u32  h_stream)
186 {
187         struct hpi_message hm;
188         struct hpi_response hr;
189         unsigned int obj = hpi_handle_object(h_stream);
190
191         if (!h_stream)
192                 return HPI_ERROR_INVALID_OBJ;
193
194         hpi_init_message_response(&hm, &hr,  obj,
195                         obj == HPI_OBJ_OSTREAM ?
196                                 HPI_OSTREAM_HOSTBUFFER_FREE :
197                                 HPI_ISTREAM_HOSTBUFFER_FREE);
198
199         hpi_handle_to_indexes(h_stream, &hm.adapter_index,
200                                 &hm.obj_index);
201         hm.u.d.u.buffer.command = HPI_BUFFER_CMD_INTERNAL_REVOKEADAPTER;
202         hpi_send_recv(&hm, &hr);
203         return hr.error;
204 }
205
206 static inline u16 hpi_stream_start(u32 h_stream)
207 {
208         if (hpi_handle_object(h_stream) ==  HPI_OBJ_OSTREAM)
209                 return hpi_outstream_start(h_stream);
210         else
211                 return hpi_instream_start(h_stream);
212 }
213
214 static inline u16 hpi_stream_stop(u32 h_stream)
215 {
216         if (hpi_handle_object(h_stream) ==  HPI_OBJ_OSTREAM)
217                 return hpi_outstream_stop(h_stream);
218         else
219                 return hpi_instream_stop(h_stream);
220 }
221
222 static inline u16 hpi_stream_get_info_ex(
223     u32 h_stream,
224     u16        *pw_state,
225     u32        *pbuffer_size,
226     u32        *pdata_in_buffer,
227     u32        *psample_count,
228     u32        *pauxiliary_data
229 )
230 {
231         u16 e;
232         if (hpi_handle_object(h_stream)  ==  HPI_OBJ_OSTREAM)
233                 e = hpi_outstream_get_info_ex(h_stream, pw_state,
234                                         pbuffer_size, pdata_in_buffer,
235                                         psample_count, pauxiliary_data);
236         else
237                 e = hpi_instream_get_info_ex(h_stream, pw_state,
238                                         pbuffer_size, pdata_in_buffer,
239                                         psample_count, pauxiliary_data);
240         return e;
241 }
242
243 static inline u16 hpi_stream_group_add(
244                                         u32 h_master,
245                                         u32 h_stream)
246 {
247         if (hpi_handle_object(h_master) ==  HPI_OBJ_OSTREAM)
248                 return hpi_outstream_group_add(h_master, h_stream);
249         else
250                 return hpi_instream_group_add(h_master, h_stream);
251 }
252
253 static inline u16 hpi_stream_group_reset(u32 h_stream)
254 {
255         if (hpi_handle_object(h_stream) ==  HPI_OBJ_OSTREAM)
256                 return hpi_outstream_group_reset(h_stream);
257         else
258                 return hpi_instream_group_reset(h_stream);
259 }
260
261 static inline u16 hpi_stream_group_get_map(
262                                 u32 h_stream, u32 *mo, u32 *mi)
263 {
264         if (hpi_handle_object(h_stream) ==  HPI_OBJ_OSTREAM)
265                 return hpi_outstream_group_get_map(h_stream, mo, mi);
266         else
267                 return hpi_instream_group_get_map(h_stream, mo, mi);
268 }
269
270 static u16 handle_error(u16 err, int line, char *filename)
271 {
272         if (err)
273                 printk(KERN_WARNING
274                         "in file %s, line %d: HPI error %d\n",
275                         filename, line, err);
276         return err;
277 }
278
279 #define hpi_handle_error(x)  handle_error(x, __LINE__, __FILE__)
280
281 /***************************** GENERAL PCM ****************/
282
283 static void print_hwparams(struct snd_pcm_substream *substream,
284                                 struct snd_pcm_hw_params *p)
285 {
286         char name[16];
287         snd_pcm_debug_name(substream, name, sizeof(name));
288         snd_printdd("%s HWPARAMS\n", name);
289         snd_printdd(" samplerate=%dHz channels=%d format=%d subformat=%d\n",
290                 params_rate(p), params_channels(p),
291                 params_format(p), params_subformat(p));
292         snd_printdd(" buffer=%dB period=%dB period_size=%dB periods=%d\n",
293                 params_buffer_bytes(p), params_period_bytes(p),
294                 params_period_size(p), params_periods(p));
295         snd_printdd(" buffer_size=%d access=%d data_rate=%dB/s\n",
296                 params_buffer_size(p), params_access(p),
297                 params_rate(p) * params_channels(p) *
298                 snd_pcm_format_width(params_format(p)) / 8);
299 }
300
301 #define INVALID_FORMAT  (__force snd_pcm_format_t)(-1)
302
303 static const snd_pcm_format_t hpi_to_alsa_formats[] = {
304         INVALID_FORMAT,         /* INVALID */
305         SNDRV_PCM_FORMAT_U8,    /* HPI_FORMAT_PCM8_UNSIGNED        1 */
306         SNDRV_PCM_FORMAT_S16,   /* HPI_FORMAT_PCM16_SIGNED         2 */
307         INVALID_FORMAT,         /* HPI_FORMAT_MPEG_L1              3 */
308         SNDRV_PCM_FORMAT_MPEG,  /* HPI_FORMAT_MPEG_L2              4 */
309         SNDRV_PCM_FORMAT_MPEG,  /* HPI_FORMAT_MPEG_L3              5 */
310         INVALID_FORMAT,         /* HPI_FORMAT_DOLBY_AC2            6 */
311         INVALID_FORMAT,         /* HPI_FORMAT_DOLBY_AC3            7 */
312         SNDRV_PCM_FORMAT_S16_BE,/* HPI_FORMAT_PCM16_BIGENDIAN      8 */
313         INVALID_FORMAT,         /* HPI_FORMAT_AA_TAGIT1_HITS       9 */
314         INVALID_FORMAT,         /* HPI_FORMAT_AA_TAGIT1_INSERTS   10 */
315         SNDRV_PCM_FORMAT_S32,   /* HPI_FORMAT_PCM32_SIGNED        11 */
316         INVALID_FORMAT,         /* HPI_FORMAT_RAW_BITSTREAM       12 */
317         INVALID_FORMAT,         /* HPI_FORMAT_AA_TAGIT1_HITS_EX1  13 */
318         SNDRV_PCM_FORMAT_FLOAT, /* HPI_FORMAT_PCM32_FLOAT         14 */
319 #if 1
320         /* ALSA can't handle 3 byte sample size together with power-of-2
321          *  constraint on buffer_bytes, so disable this format
322          */
323         INVALID_FORMAT
324 #else
325         /* SNDRV_PCM_FORMAT_S24_3LE */ /* HPI_FORMAT_PCM24_SIGNED 15 */
326 #endif
327 };
328
329
330 static int snd_card_asihpi_format_alsa2hpi(snd_pcm_format_t alsa_format,
331                                            u16 *hpi_format)
332 {
333         u16 format;
334
335         for (format = HPI_FORMAT_PCM8_UNSIGNED;
336              format <= HPI_FORMAT_PCM24_SIGNED; format++) {
337                 if (hpi_to_alsa_formats[format] == alsa_format) {
338                         *hpi_format = format;
339                         return 0;
340                 }
341         }
342
343         snd_printd(KERN_WARNING "failed match for alsa format %d\n",
344                    alsa_format);
345         *hpi_format = 0;
346         return -EINVAL;
347 }
348
349 static void snd_card_asihpi_pcm_samplerates(struct snd_card_asihpi *asihpi,
350                                          struct snd_pcm_hardware *pcmhw)
351 {
352         u16 err;
353         u32 h_control;
354         u32 sample_rate;
355         int idx;
356         unsigned int rate_min = 200000;
357         unsigned int rate_max = 0;
358         unsigned int rates = 0;
359
360         if (asihpi->support_mrx) {
361                 rates |= SNDRV_PCM_RATE_CONTINUOUS;
362                 rates |= SNDRV_PCM_RATE_8000_96000;
363                 rate_min = 8000;
364                 rate_max = 100000;
365         } else {
366                 /* on cards without SRC,
367                    valid rates are determined by sampleclock */
368                 err = hpi_mixer_get_control(asihpi->h_mixer,
369                                           HPI_SOURCENODE_CLOCK_SOURCE, 0, 0, 0,
370                                           HPI_CONTROL_SAMPLECLOCK, &h_control);
371                 if (err) {
372                         dev_err(&asihpi->pci->dev,
373                                 "No local sampleclock, err %d\n", err);
374                 }
375
376                 for (idx = -1; idx < 100; idx++) {
377                         if (idx == -1) {
378                                 if (hpi_sample_clock_get_sample_rate(h_control,
379                                                                 &sample_rate))
380                                         continue;
381                         } else if (hpi_sample_clock_query_local_rate(h_control,
382                                                         idx, &sample_rate)) {
383                                 break;
384                         }
385
386                         rate_min = min(rate_min, sample_rate);
387                         rate_max = max(rate_max, sample_rate);
388
389                         switch (sample_rate) {
390                         case 5512:
391                                 rates |= SNDRV_PCM_RATE_5512;
392                                 break;
393                         case 8000:
394                                 rates |= SNDRV_PCM_RATE_8000;
395                                 break;
396                         case 11025:
397                                 rates |= SNDRV_PCM_RATE_11025;
398                                 break;
399                         case 16000:
400                                 rates |= SNDRV_PCM_RATE_16000;
401                                 break;
402                         case 22050:
403                                 rates |= SNDRV_PCM_RATE_22050;
404                                 break;
405                         case 32000:
406                                 rates |= SNDRV_PCM_RATE_32000;
407                                 break;
408                         case 44100:
409                                 rates |= SNDRV_PCM_RATE_44100;
410                                 break;
411                         case 48000:
412                                 rates |= SNDRV_PCM_RATE_48000;
413                                 break;
414                         case 64000:
415                                 rates |= SNDRV_PCM_RATE_64000;
416                                 break;
417                         case 88200:
418                                 rates |= SNDRV_PCM_RATE_88200;
419                                 break;
420                         case 96000:
421                                 rates |= SNDRV_PCM_RATE_96000;
422                                 break;
423                         case 176400:
424                                 rates |= SNDRV_PCM_RATE_176400;
425                                 break;
426                         case 192000:
427                                 rates |= SNDRV_PCM_RATE_192000;
428                                 break;
429                         default: /* some other rate */
430                                 rates |= SNDRV_PCM_RATE_KNOT;
431                         }
432                 }
433         }
434
435         pcmhw->rates = rates;
436         pcmhw->rate_min = rate_min;
437         pcmhw->rate_max = rate_max;
438 }
439
440 static int snd_card_asihpi_pcm_hw_params(struct snd_pcm_substream *substream,
441                                          struct snd_pcm_hw_params *params)
442 {
443         struct snd_pcm_runtime *runtime = substream->runtime;
444         struct snd_card_asihpi_pcm *dpcm = runtime->private_data;
445         struct snd_card_asihpi *card = snd_pcm_substream_chip(substream);
446         int err;
447         u16 format;
448         int width;
449         unsigned int bytes_per_sec;
450
451         print_hwparams(substream, params);
452         err = snd_card_asihpi_format_alsa2hpi(params_format(params), &format);
453         if (err)
454                 return err;
455
456         hpi_handle_error(hpi_format_create(&dpcm->format,
457                         params_channels(params),
458                         format, params_rate(params), 0, 0));
459
460         if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
461                 if (hpi_instream_reset(dpcm->h_stream) != 0)
462                         return -EINVAL;
463
464                 if (hpi_instream_set_format(
465                         dpcm->h_stream, &dpcm->format) != 0)
466                         return -EINVAL;
467         }
468
469         dpcm->hpi_buffer_attached = 0;
470         if (card->can_dma) {
471                 err = hpi_stream_host_buffer_attach(dpcm->h_stream,
472                         params_buffer_bytes(params),  runtime->dma_addr);
473                 if (err == 0) {
474                         snd_printdd(
475                                 "stream_host_buffer_attach success %u %lu\n",
476                                 params_buffer_bytes(params),
477                                 (unsigned long)runtime->dma_addr);
478                 } else {
479                         snd_printd("stream_host_buffer_attach error %d\n",
480                                         err);
481                         return -ENOMEM;
482                 }
483
484                 err = hpi_stream_get_info_ex(dpcm->h_stream, NULL,
485                                 &dpcm->hpi_buffer_attached, NULL, NULL, NULL);
486         }
487         bytes_per_sec = params_rate(params) * params_channels(params);
488         width = snd_pcm_format_width(params_format(params));
489         bytes_per_sec *= width;
490         bytes_per_sec /= 8;
491         if (width < 0 || bytes_per_sec == 0)
492                 return -EINVAL;
493
494         dpcm->bytes_per_sec = bytes_per_sec;
495         dpcm->buffer_bytes = params_buffer_bytes(params);
496         dpcm->period_bytes = params_period_bytes(params);
497
498         return 0;
499 }
500
501 static int
502 snd_card_asihpi_hw_free(struct snd_pcm_substream *substream)
503 {
504         struct snd_pcm_runtime *runtime = substream->runtime;
505         struct snd_card_asihpi_pcm *dpcm = runtime->private_data;
506         if (dpcm->hpi_buffer_attached)
507                 hpi_stream_host_buffer_detach(dpcm->h_stream);
508
509         return 0;
510 }
511
512 static void snd_card_asihpi_runtime_free(struct snd_pcm_runtime *runtime)
513 {
514         struct snd_card_asihpi_pcm *dpcm = runtime->private_data;
515         kfree(dpcm);
516 }
517
518 static void snd_card_asihpi_pcm_timer_start(struct snd_pcm_substream *
519                                             substream)
520 {
521         struct snd_pcm_runtime *runtime = substream->runtime;
522         struct snd_card_asihpi_pcm *dpcm = runtime->private_data;
523         int expiry;
524
525         expiry = HZ / 200;
526
527         expiry = max(expiry, 1); /* don't let it be zero! */
528         mod_timer(&dpcm->timer, jiffies + expiry);
529         dpcm->respawn_timer = 1;
530 }
531
532 static void snd_card_asihpi_pcm_timer_stop(struct snd_pcm_substream *substream)
533 {
534         struct snd_pcm_runtime *runtime = substream->runtime;
535         struct snd_card_asihpi_pcm *dpcm = runtime->private_data;
536
537         dpcm->respawn_timer = 0;
538         del_timer(&dpcm->timer);
539 }
540
541 static void snd_card_asihpi_pcm_int_start(struct snd_pcm_substream *substream)
542 {
543         struct snd_card_asihpi_pcm *dpcm;
544         struct snd_card_asihpi *card;
545
546         dpcm = (struct snd_card_asihpi_pcm *)substream->runtime->private_data;
547         card = snd_pcm_substream_chip(substream);
548
549         WARN_ON(in_interrupt());
550         tasklet_disable(&card->t);
551         card->llmode_streampriv = dpcm;
552         tasklet_enable(&card->t);
553
554         hpi_handle_error(hpi_adapter_set_property(card->hpi->adapter->index,
555                 HPI_ADAPTER_PROPERTY_IRQ_RATE,
556                 card->update_interval_frames, 0));
557 }
558
559 static void snd_card_asihpi_pcm_int_stop(struct snd_pcm_substream *substream)
560 {
561         struct snd_card_asihpi *card;
562
563         card = snd_pcm_substream_chip(substream);
564
565         hpi_handle_error(hpi_adapter_set_property(card->hpi->adapter->index,
566                 HPI_ADAPTER_PROPERTY_IRQ_RATE, 0, 0));
567
568         if (in_interrupt())
569                 card->llmode_streampriv = NULL;
570         else {
571                 tasklet_disable(&card->t);
572                 card->llmode_streampriv = NULL;
573                 tasklet_enable(&card->t);
574         }
575 }
576
577 static int snd_card_asihpi_trigger(struct snd_pcm_substream *substream,
578                                            int cmd)
579 {
580         struct snd_card_asihpi_pcm *dpcm = substream->runtime->private_data;
581         struct snd_card_asihpi *card = snd_pcm_substream_chip(substream);
582         struct snd_pcm_substream *s;
583         u16 e;
584         char name[16];
585
586         snd_pcm_debug_name(substream, name, sizeof(name));
587
588         switch (cmd) {
589         case SNDRV_PCM_TRIGGER_START:
590                 snd_printdd("%s trigger start\n", name);
591                 snd_pcm_group_for_each_entry(s, substream) {
592                         struct snd_pcm_runtime *runtime = s->runtime;
593                         struct snd_card_asihpi_pcm *ds = runtime->private_data;
594
595                         if (snd_pcm_substream_chip(s) != card)
596                                 continue;
597
598                         /* don't link Cap and Play */
599                         if (substream->stream != s->stream)
600                                 continue;
601
602                         ds->drained_count = 0;
603                         if (s->stream == SNDRV_PCM_STREAM_PLAYBACK) {
604                                 /* How do I know how much valid data is present
605                                 * in buffer? Must be at least one period!
606                                 * Guessing 2 periods, but if
607                                 * buffer is bigger it may contain even more
608                                 * data??
609                                 */
610                                 unsigned int preload = ds->period_bytes * 1;
611                                 snd_printddd("%d preload %d\n", s->number, preload);
612                                 hpi_handle_error(hpi_outstream_write_buf(
613                                                 ds->h_stream,
614                                                 &runtime->dma_area[0],
615                                                 preload,
616                                                 &ds->format));
617                                 ds->pcm_buf_host_rw_ofs = preload;
618                         }
619
620                         if (card->support_grouping) {
621                                 snd_printdd("%d group\n", s->number);
622                                 e = hpi_stream_group_add(
623                                         dpcm->h_stream,
624                                         ds->h_stream);
625                                 if (!e) {
626                                         snd_pcm_trigger_done(s, substream);
627                                 } else {
628                                         hpi_handle_error(e);
629                                         break;
630                                 }
631                         } else
632                                 break;
633                 }
634                 /* start the master stream */
635                 card->pcm_start(substream);
636                 if ((substream->stream == SNDRV_PCM_STREAM_CAPTURE) ||
637                         !card->can_dma)
638                         hpi_handle_error(hpi_stream_start(dpcm->h_stream));
639                 break;
640
641         case SNDRV_PCM_TRIGGER_STOP:
642                 snd_printdd("%s trigger stop\n", name);
643                 card->pcm_stop(substream);
644                 snd_pcm_group_for_each_entry(s, substream) {
645                         if (snd_pcm_substream_chip(s) != card)
646                                 continue;
647                         /* don't link Cap and Play */
648                         if (substream->stream != s->stream)
649                                 continue;
650
651                         /*? workaround linked streams don't
652                         transition to SETUP 20070706*/
653                         s->runtime->status->state = SNDRV_PCM_STATE_SETUP;
654
655                         if (card->support_grouping) {
656                                 snd_printdd("%d group\n", s->number);
657                                 snd_pcm_trigger_done(s, substream);
658                         } else
659                                 break;
660                 }
661
662                 /* _prepare and _hwparams reset the stream */
663                 hpi_handle_error(hpi_stream_stop(dpcm->h_stream));
664                 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
665                         hpi_handle_error(
666                                 hpi_outstream_reset(dpcm->h_stream));
667
668                 if (card->support_grouping)
669                         hpi_handle_error(hpi_stream_group_reset(dpcm->h_stream));
670                 break;
671
672         case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
673                 snd_printdd("%s trigger pause release\n", name);
674                 card->pcm_start(substream);
675                 hpi_handle_error(hpi_stream_start(dpcm->h_stream));
676                 break;
677         case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
678                 snd_printdd("%s trigger pause push\n", name);
679                 card->pcm_stop(substream);
680                 hpi_handle_error(hpi_stream_stop(dpcm->h_stream));
681                 break;
682         default:
683                 snd_printd(KERN_ERR "\tINVALID\n");
684                 return -EINVAL;
685         }
686
687         return 0;
688 }
689
690 /*algorithm outline
691  Without linking degenerates to getting single stream pos etc
692  Without mmap 2nd loop degenerates to snd_pcm_period_elapsed
693 */
694 /*
695 pcm_buf_dma_ofs=get_buf_pos(s);
696 for_each_linked_stream(s) {
697         pcm_buf_dma_ofs=get_buf_pos(s);
698         min_buf_pos = modulo_min(min_buf_pos, pcm_buf_dma_ofs, buffer_bytes)
699         new_data = min(new_data, calc_new_data(pcm_buf_dma_ofs,irq_pos)
700 }
701 timer.expires = jiffies + predict_next_period_ready(min_buf_pos);
702 for_each_linked_stream(s) {
703         s->pcm_buf_dma_ofs = min_buf_pos;
704         if (new_data > period_bytes) {
705                 if (mmap) {
706                         irq_pos = (irq_pos + period_bytes) % buffer_bytes;
707                         if (playback) {
708                                 write(period_bytes);
709                         } else {
710                                 read(period_bytes);
711                         }
712                 }
713                 snd_pcm_period_elapsed(s);
714         }
715 }
716 */
717
718 /** Minimum of 2 modulo values.  Works correctly when the difference between
719 * the values is less than half the modulus
720 */
721 static inline unsigned int modulo_min(unsigned int a, unsigned int b,
722                                         unsigned long int modulus)
723 {
724         unsigned int result;
725         if (((a-b) % modulus) < (modulus/2))
726                 result = b;
727         else
728                 result = a;
729
730         return result;
731 }
732
733 /** Timer function, equivalent to interrupt service routine for cards
734 */
735 static void snd_card_asihpi_timer_function(struct timer_list *t)
736 {
737         struct snd_card_asihpi_pcm *dpcm = from_timer(dpcm, t, timer);
738         struct snd_pcm_substream *substream = dpcm->substream;
739         struct snd_card_asihpi *card = snd_pcm_substream_chip(substream);
740         struct snd_pcm_runtime *runtime;
741         struct snd_pcm_substream *s;
742         unsigned int newdata = 0;
743         unsigned int pcm_buf_dma_ofs, min_buf_pos = 0;
744         unsigned int remdata, xfercount, next_jiffies;
745         int first = 1;
746         int loops = 0;
747         u16 state;
748         u32 buffer_size, bytes_avail, samples_played, on_card_bytes;
749         char name[16];
750
751
752         snd_pcm_debug_name(substream, name, sizeof(name));
753
754         /* find minimum newdata and buffer pos in group */
755         snd_pcm_group_for_each_entry(s, substream) {
756                 struct snd_card_asihpi_pcm *ds = s->runtime->private_data;
757                 runtime = s->runtime;
758
759                 if (snd_pcm_substream_chip(s) != card)
760                         continue;
761
762                 /* don't link Cap and Play */
763                 if (substream->stream != s->stream)
764                         continue;
765
766                 hpi_handle_error(hpi_stream_get_info_ex(
767                                         ds->h_stream, &state,
768                                         &buffer_size, &bytes_avail,
769                                         &samples_played, &on_card_bytes));
770
771                 /* number of bytes in on-card buffer */
772                 runtime->delay = on_card_bytes;
773
774                 if (!card->can_dma)
775                         on_card_bytes = bytes_avail;
776
777                 if (s->stream == SNDRV_PCM_STREAM_PLAYBACK) {
778                         pcm_buf_dma_ofs = ds->pcm_buf_host_rw_ofs - bytes_avail;
779                         if (state == HPI_STATE_STOPPED) {
780                                 if (bytes_avail == 0) {
781                                         hpi_handle_error(hpi_stream_start(ds->h_stream));
782                                         snd_printdd("P%d start\n", s->number);
783                                         ds->drained_count = 0;
784                                 }
785                         } else if (state == HPI_STATE_DRAINED) {
786                                 snd_printd(KERN_WARNING "P%d drained\n",
787                                                 s->number);
788                                 ds->drained_count++;
789                                 if (ds->drained_count > 20) {
790                                         snd_pcm_stop_xrun(s);
791                                         continue;
792                                 }
793                         } else {
794                                 ds->drained_count = 0;
795                         }
796                 } else
797                         pcm_buf_dma_ofs = bytes_avail + ds->pcm_buf_host_rw_ofs;
798
799                 if (first) {
800                         /* can't statically init min when wrap is involved */
801                         min_buf_pos = pcm_buf_dma_ofs;
802                         newdata = (pcm_buf_dma_ofs - ds->pcm_buf_elapsed_dma_ofs) % ds->buffer_bytes;
803                         first = 0;
804                 } else {
805                         min_buf_pos =
806                                 modulo_min(min_buf_pos, pcm_buf_dma_ofs, UINT_MAX+1L);
807                         newdata = min(
808                                 (pcm_buf_dma_ofs - ds->pcm_buf_elapsed_dma_ofs) % ds->buffer_bytes,
809                                 newdata);
810                 }
811
812                 snd_printddd(
813                         "timer1, %s, %d, S=%d, elap=%d, rw=%d, dsp=%d, left=%d, aux=%d, space=%d, hw_ptr=%ld, appl_ptr=%ld\n",
814                         name, s->number, state,
815                         ds->pcm_buf_elapsed_dma_ofs,
816                         ds->pcm_buf_host_rw_ofs,
817                         pcm_buf_dma_ofs,
818                         (int)bytes_avail,
819
820                         (int)on_card_bytes,
821                         buffer_size-bytes_avail,
822                         (unsigned long)frames_to_bytes(runtime,
823                                                 runtime->status->hw_ptr),
824                         (unsigned long)frames_to_bytes(runtime,
825                                                 runtime->control->appl_ptr)
826                 );
827                 loops++;
828         }
829         pcm_buf_dma_ofs = min_buf_pos;
830
831         remdata = newdata % dpcm->period_bytes;
832         xfercount = newdata - remdata; /* a multiple of period_bytes */
833         /* come back when on_card_bytes has decreased enough to allow
834            write to happen, or when data has been consumed to make another
835            period
836         */
837         if (xfercount && (on_card_bytes  > dpcm->period_bytes))
838                 next_jiffies = ((on_card_bytes - dpcm->period_bytes) * HZ / dpcm->bytes_per_sec);
839         else
840                 next_jiffies = ((dpcm->period_bytes - remdata) * HZ / dpcm->bytes_per_sec);
841
842         next_jiffies = max(next_jiffies, 1U);
843         dpcm->timer.expires = jiffies + next_jiffies;
844         snd_printddd("timer2, jif=%d, buf_pos=%d, newdata=%d, xfer=%d\n",
845                         next_jiffies, pcm_buf_dma_ofs, newdata, xfercount);
846
847         snd_pcm_group_for_each_entry(s, substream) {
848                 struct snd_card_asihpi_pcm *ds = s->runtime->private_data;
849
850                 /* don't link Cap and Play */
851                 if (substream->stream != s->stream)
852                         continue;
853
854                 /* Store dma offset for use by pointer callback */
855                 ds->pcm_buf_dma_ofs = pcm_buf_dma_ofs;
856
857                 if (xfercount &&
858                         /* Limit use of on card fifo for playback */
859                         ((on_card_bytes <= ds->period_bytes) ||
860                         (s->stream == SNDRV_PCM_STREAM_CAPTURE)))
861
862                 {
863
864                         unsigned int buf_ofs = ds->pcm_buf_host_rw_ofs % ds->buffer_bytes;
865                         unsigned int xfer1, xfer2;
866                         char *pd = &s->runtime->dma_area[buf_ofs];
867
868                         if (card->can_dma) { /* buffer wrap is handled at lower level */
869                                 xfer1 = xfercount;
870                                 xfer2 = 0;
871                         } else {
872                                 xfer1 = min(xfercount, ds->buffer_bytes - buf_ofs);
873                                 xfer2 = xfercount - xfer1;
874                         }
875
876                         if (s->stream == SNDRV_PCM_STREAM_PLAYBACK) {
877                                 snd_printddd("write1, P=%d, xfer=%d, buf_ofs=%d\n",
878                                         s->number, xfer1, buf_ofs);
879                                 hpi_handle_error(
880                                         hpi_outstream_write_buf(
881                                                 ds->h_stream, pd, xfer1,
882                                                 &ds->format));
883
884                                 if (xfer2) {
885                                         pd = s->runtime->dma_area;
886
887                                         snd_printddd("write2, P=%d, xfer=%d, buf_ofs=%d\n",
888                                                         s->number,
889                                                         xfercount - xfer1, buf_ofs);
890                                         hpi_handle_error(
891                                                 hpi_outstream_write_buf(
892                                                         ds->h_stream, pd,
893                                                         xfercount - xfer1,
894                                                         &ds->format));
895                                 }
896                         } else {
897                                 snd_printddd("read1, C=%d, xfer=%d\n",
898                                         s->number, xfer1);
899                                 hpi_handle_error(
900                                         hpi_instream_read_buf(
901                                                 ds->h_stream,
902                                                 pd, xfer1));
903                                 if (xfer2) {
904                                         pd = s->runtime->dma_area;
905                                         snd_printddd("read2, C=%d, xfer=%d\n",
906                                                 s->number, xfer2);
907                                         hpi_handle_error(
908                                                 hpi_instream_read_buf(
909                                                         ds->h_stream,
910                                                         pd, xfer2));
911                                 }
912                         }
913                         /* ? host_rw_ofs always ahead of elapsed_dma_ofs by preload size? */
914                         ds->pcm_buf_host_rw_ofs += xfercount;
915                         ds->pcm_buf_elapsed_dma_ofs += xfercount;
916                         snd_pcm_period_elapsed(s);
917                 }
918         }
919
920         if (!card->hpi->interrupt_mode && dpcm->respawn_timer)
921                 add_timer(&dpcm->timer);
922 }
923
924 static void snd_card_asihpi_int_task(struct tasklet_struct *t)
925 {
926         struct snd_card_asihpi *asihpi = from_tasklet(asihpi, t, t);
927         struct hpi_adapter *a = asihpi->hpi;
928
929         WARN_ON(!a || !a->snd_card || !a->snd_card->private_data);
930         asihpi = (struct snd_card_asihpi *)a->snd_card->private_data;
931         if (asihpi->llmode_streampriv)
932                 snd_card_asihpi_timer_function(
933                         &asihpi->llmode_streampriv->timer);
934 }
935
936 static void snd_card_asihpi_isr(struct hpi_adapter *a)
937 {
938         struct snd_card_asihpi *asihpi;
939
940         WARN_ON(!a || !a->snd_card || !a->snd_card->private_data);
941         asihpi = (struct snd_card_asihpi *)a->snd_card->private_data;
942         tasklet_schedule(&asihpi->t);
943 }
944
945 /***************************** PLAYBACK OPS ****************/
946 static int snd_card_asihpi_playback_prepare(struct snd_pcm_substream *
947                                             substream)
948 {
949         struct snd_pcm_runtime *runtime = substream->runtime;
950         struct snd_card_asihpi_pcm *dpcm = runtime->private_data;
951
952         snd_printdd("P%d prepare\n", substream->number);
953
954         hpi_handle_error(hpi_outstream_reset(dpcm->h_stream));
955         dpcm->pcm_buf_host_rw_ofs = 0;
956         dpcm->pcm_buf_dma_ofs = 0;
957         dpcm->pcm_buf_elapsed_dma_ofs = 0;
958         return 0;
959 }
960
961 static snd_pcm_uframes_t
962 snd_card_asihpi_playback_pointer(struct snd_pcm_substream *substream)
963 {
964         struct snd_pcm_runtime *runtime = substream->runtime;
965         struct snd_card_asihpi_pcm *dpcm = runtime->private_data;
966         snd_pcm_uframes_t ptr;
967         char name[16];
968         snd_pcm_debug_name(substream, name, sizeof(name));
969
970         ptr = bytes_to_frames(runtime, dpcm->pcm_buf_dma_ofs  % dpcm->buffer_bytes);
971         snd_printddd("%s, pointer=%ld\n", name, (unsigned long)ptr);
972         return ptr;
973 }
974
975 static u64 snd_card_asihpi_playback_formats(struct snd_card_asihpi *asihpi,
976                                                 u32 h_stream)
977 {
978         struct hpi_format hpi_format;
979         u16 format;
980         u16 err;
981         u32 h_control;
982         u32 sample_rate = 48000;
983         u64 formats = 0;
984
985         /* on cards without SRC, must query at valid rate,
986         * maybe set by external sync
987         */
988         err = hpi_mixer_get_control(asihpi->h_mixer,
989                                   HPI_SOURCENODE_CLOCK_SOURCE, 0, 0, 0,
990                                   HPI_CONTROL_SAMPLECLOCK, &h_control);
991
992         if (!err)
993                 err = hpi_sample_clock_get_sample_rate(h_control,
994                                 &sample_rate);
995
996         for (format = HPI_FORMAT_PCM8_UNSIGNED;
997              format <= HPI_FORMAT_PCM24_SIGNED; format++) {
998                 err = hpi_format_create(&hpi_format, asihpi->out_max_chans,
999                                         format, sample_rate, 128000, 0);
1000                 if (!err)
1001                         err = hpi_outstream_query_format(h_stream, &hpi_format);
1002                 if (!err && (hpi_to_alsa_formats[format] != INVALID_FORMAT))
1003                         formats |= pcm_format_to_bits(hpi_to_alsa_formats[format]);
1004         }
1005         return formats;
1006 }
1007
1008 static int snd_card_asihpi_playback_open(struct snd_pcm_substream *substream)
1009 {
1010         struct snd_pcm_runtime *runtime = substream->runtime;
1011         struct snd_card_asihpi_pcm *dpcm;
1012         struct snd_card_asihpi *card = snd_pcm_substream_chip(substream);
1013         struct snd_pcm_hardware snd_card_asihpi_playback;
1014         int err;
1015
1016         dpcm = kzalloc(sizeof(*dpcm), GFP_KERNEL);
1017         if (dpcm == NULL)
1018                 return -ENOMEM;
1019
1020         err = hpi_outstream_open(card->hpi->adapter->index,
1021                               substream->number, &dpcm->h_stream);
1022         hpi_handle_error(err);
1023         if (err)
1024                 kfree(dpcm);
1025         if (err == HPI_ERROR_OBJ_ALREADY_OPEN)
1026                 return -EBUSY;
1027         if (err)
1028                 return -EIO;
1029
1030         /*? also check ASI5000 samplerate source
1031             If external, only support external rate.
1032             If internal and other stream playing, can't switch
1033         */
1034
1035         timer_setup(&dpcm->timer, snd_card_asihpi_timer_function, 0);
1036         dpcm->substream = substream;
1037         runtime->private_data = dpcm;
1038         runtime->private_free = snd_card_asihpi_runtime_free;
1039
1040         memset(&snd_card_asihpi_playback, 0, sizeof(snd_card_asihpi_playback));
1041         if (!card->hpi->interrupt_mode) {
1042                 snd_card_asihpi_playback.buffer_bytes_max = BUFFER_BYTES_MAX;
1043                 snd_card_asihpi_playback.period_bytes_min = PERIOD_BYTES_MIN;
1044                 snd_card_asihpi_playback.period_bytes_max = BUFFER_BYTES_MAX / PERIODS_MIN;
1045                 snd_card_asihpi_playback.periods_min = PERIODS_MIN;
1046                 snd_card_asihpi_playback.periods_max = BUFFER_BYTES_MAX / PERIOD_BYTES_MIN;
1047         } else {
1048                 size_t pbmin = card->update_interval_frames *
1049                         card->out_max_chans;
1050                 snd_card_asihpi_playback.buffer_bytes_max = BUFFER_BYTES_MAX;
1051                 snd_card_asihpi_playback.period_bytes_min = pbmin;
1052                 snd_card_asihpi_playback.period_bytes_max = BUFFER_BYTES_MAX / PERIODS_MIN;
1053                 snd_card_asihpi_playback.periods_min = PERIODS_MIN;
1054                 snd_card_asihpi_playback.periods_max = BUFFER_BYTES_MAX / pbmin;
1055         }
1056
1057         /* snd_card_asihpi_playback.fifo_size = 0; */
1058         snd_card_asihpi_playback.channels_max = card->out_max_chans;
1059         snd_card_asihpi_playback.channels_min = card->out_min_chans;
1060         snd_card_asihpi_playback.formats =
1061                         snd_card_asihpi_playback_formats(card, dpcm->h_stream);
1062
1063         snd_card_asihpi_pcm_samplerates(card,  &snd_card_asihpi_playback);
1064
1065         snd_card_asihpi_playback.info = SNDRV_PCM_INFO_INTERLEAVED |
1066                                         SNDRV_PCM_INFO_DOUBLE |
1067                                         SNDRV_PCM_INFO_BATCH |
1068                                         SNDRV_PCM_INFO_BLOCK_TRANSFER |
1069                                         SNDRV_PCM_INFO_PAUSE |
1070                                         SNDRV_PCM_INFO_MMAP |
1071                                         SNDRV_PCM_INFO_MMAP_VALID;
1072
1073         if (card->support_grouping) {
1074                 snd_card_asihpi_playback.info |= SNDRV_PCM_INFO_SYNC_START;
1075                 snd_pcm_set_sync(substream);
1076         }
1077
1078         /* struct is copied, so can create initializer dynamically */
1079         runtime->hw = snd_card_asihpi_playback;
1080
1081         if (card->can_dma)
1082                 err = snd_pcm_hw_constraint_pow2(runtime, 0,
1083                                         SNDRV_PCM_HW_PARAM_BUFFER_BYTES);
1084         if (err < 0)
1085                 return err;
1086
1087         snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
1088                 card->update_interval_frames);
1089
1090         snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
1091                 card->update_interval_frames, UINT_MAX);
1092
1093         snd_printdd("playback open\n");
1094
1095         return 0;
1096 }
1097
1098 static int snd_card_asihpi_playback_close(struct snd_pcm_substream *substream)
1099 {
1100         struct snd_pcm_runtime *runtime = substream->runtime;
1101         struct snd_card_asihpi_pcm *dpcm = runtime->private_data;
1102
1103         hpi_handle_error(hpi_outstream_close(dpcm->h_stream));
1104         snd_printdd("playback close\n");
1105
1106         return 0;
1107 }
1108
1109 static const struct snd_pcm_ops snd_card_asihpi_playback_mmap_ops = {
1110         .open = snd_card_asihpi_playback_open,
1111         .close = snd_card_asihpi_playback_close,
1112         .hw_params = snd_card_asihpi_pcm_hw_params,
1113         .hw_free = snd_card_asihpi_hw_free,
1114         .prepare = snd_card_asihpi_playback_prepare,
1115         .trigger = snd_card_asihpi_trigger,
1116         .pointer = snd_card_asihpi_playback_pointer,
1117 };
1118
1119 /***************************** CAPTURE OPS ****************/
1120 static snd_pcm_uframes_t
1121 snd_card_asihpi_capture_pointer(struct snd_pcm_substream *substream)
1122 {
1123         struct snd_pcm_runtime *runtime = substream->runtime;
1124         struct snd_card_asihpi_pcm *dpcm = runtime->private_data;
1125         char name[16];
1126         snd_pcm_debug_name(substream, name, sizeof(name));
1127
1128         snd_printddd("%s, pointer=%d\n", name, dpcm->pcm_buf_dma_ofs);
1129         /* NOTE Unlike playback can't use actual samples_played
1130                 for the capture position, because those samples aren't yet in
1131                 the local buffer available for reading.
1132         */
1133         return bytes_to_frames(runtime, dpcm->pcm_buf_dma_ofs % dpcm->buffer_bytes);
1134 }
1135
1136 static int snd_card_asihpi_capture_prepare(struct snd_pcm_substream *substream)
1137 {
1138         struct snd_pcm_runtime *runtime = substream->runtime;
1139         struct snd_card_asihpi_pcm *dpcm = runtime->private_data;
1140
1141         hpi_handle_error(hpi_instream_reset(dpcm->h_stream));
1142         dpcm->pcm_buf_host_rw_ofs = 0;
1143         dpcm->pcm_buf_dma_ofs = 0;
1144         dpcm->pcm_buf_elapsed_dma_ofs = 0;
1145
1146         snd_printdd("Capture Prepare %d\n", substream->number);
1147         return 0;
1148 }
1149
1150 static u64 snd_card_asihpi_capture_formats(struct snd_card_asihpi *asihpi,
1151                                         u32 h_stream)
1152 {
1153         struct hpi_format hpi_format;
1154         u16 format;
1155         u16 err;
1156         u32 h_control;
1157         u32 sample_rate = 48000;
1158         u64 formats = 0;
1159
1160         /* on cards without SRC, must query at valid rate,
1161                 maybe set by external sync */
1162         err = hpi_mixer_get_control(asihpi->h_mixer,
1163                                   HPI_SOURCENODE_CLOCK_SOURCE, 0, 0, 0,
1164                                   HPI_CONTROL_SAMPLECLOCK, &h_control);
1165
1166         if (!err)
1167                 err = hpi_sample_clock_get_sample_rate(h_control,
1168                         &sample_rate);
1169
1170         for (format = HPI_FORMAT_PCM8_UNSIGNED;
1171                 format <= HPI_FORMAT_PCM24_SIGNED; format++) {
1172
1173                 err = hpi_format_create(&hpi_format, asihpi->in_max_chans,
1174                                         format, sample_rate, 128000, 0);
1175                 if (!err)
1176                         err = hpi_instream_query_format(h_stream, &hpi_format);
1177                 if (!err && (hpi_to_alsa_formats[format] != INVALID_FORMAT))
1178                         formats |= pcm_format_to_bits(hpi_to_alsa_formats[format]);
1179         }
1180         return formats;
1181 }
1182
1183 static int snd_card_asihpi_capture_open(struct snd_pcm_substream *substream)
1184 {
1185         struct snd_pcm_runtime *runtime = substream->runtime;
1186         struct snd_card_asihpi *card = snd_pcm_substream_chip(substream);
1187         struct snd_card_asihpi_pcm *dpcm;
1188         struct snd_pcm_hardware snd_card_asihpi_capture;
1189         int err;
1190
1191         dpcm = kzalloc(sizeof(*dpcm), GFP_KERNEL);
1192         if (dpcm == NULL)
1193                 return -ENOMEM;
1194
1195         snd_printdd("capture open adapter %d stream %d\n",
1196                         card->hpi->adapter->index, substream->number);
1197
1198         err = hpi_handle_error(
1199             hpi_instream_open(card->hpi->adapter->index,
1200                              substream->number, &dpcm->h_stream));
1201         if (err)
1202                 kfree(dpcm);
1203         if (err == HPI_ERROR_OBJ_ALREADY_OPEN)
1204                 return -EBUSY;
1205         if (err)
1206                 return -EIO;
1207
1208         timer_setup(&dpcm->timer, snd_card_asihpi_timer_function, 0);
1209         dpcm->substream = substream;
1210         runtime->private_data = dpcm;
1211         runtime->private_free = snd_card_asihpi_runtime_free;
1212
1213         memset(&snd_card_asihpi_capture, 0, sizeof(snd_card_asihpi_capture));
1214         if (!card->hpi->interrupt_mode) {
1215                 snd_card_asihpi_capture.buffer_bytes_max = BUFFER_BYTES_MAX;
1216                 snd_card_asihpi_capture.period_bytes_min = PERIOD_BYTES_MIN;
1217                 snd_card_asihpi_capture.period_bytes_max = BUFFER_BYTES_MAX / PERIODS_MIN;
1218                 snd_card_asihpi_capture.periods_min = PERIODS_MIN;
1219                 snd_card_asihpi_capture.periods_max = BUFFER_BYTES_MAX / PERIOD_BYTES_MIN;
1220         } else {
1221                 size_t pbmin = card->update_interval_frames *
1222                         card->out_max_chans;
1223                 snd_card_asihpi_capture.buffer_bytes_max = BUFFER_BYTES_MAX;
1224                 snd_card_asihpi_capture.period_bytes_min = pbmin;
1225                 snd_card_asihpi_capture.period_bytes_max = BUFFER_BYTES_MAX / PERIODS_MIN;
1226                 snd_card_asihpi_capture.periods_min = PERIODS_MIN;
1227                 snd_card_asihpi_capture.periods_max = BUFFER_BYTES_MAX / pbmin;
1228         }
1229         /* snd_card_asihpi_capture.fifo_size = 0; */
1230         snd_card_asihpi_capture.channels_max = card->in_max_chans;
1231         snd_card_asihpi_capture.channels_min = card->in_min_chans;
1232         snd_card_asihpi_capture.formats =
1233                 snd_card_asihpi_capture_formats(card, dpcm->h_stream);
1234         snd_card_asihpi_pcm_samplerates(card,  &snd_card_asihpi_capture);
1235         snd_card_asihpi_capture.info = SNDRV_PCM_INFO_INTERLEAVED |
1236                                         SNDRV_PCM_INFO_MMAP |
1237                                         SNDRV_PCM_INFO_MMAP_VALID;
1238
1239         if (card->support_grouping)
1240                 snd_card_asihpi_capture.info |= SNDRV_PCM_INFO_SYNC_START;
1241
1242         runtime->hw = snd_card_asihpi_capture;
1243
1244         if (card->can_dma)
1245                 err = snd_pcm_hw_constraint_pow2(runtime, 0,
1246                                         SNDRV_PCM_HW_PARAM_BUFFER_BYTES);
1247         if (err < 0)
1248                 return err;
1249
1250         snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
1251                 card->update_interval_frames);
1252         snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
1253                 card->update_interval_frames, UINT_MAX);
1254
1255         snd_pcm_set_sync(substream);
1256
1257         return 0;
1258 }
1259
1260 static int snd_card_asihpi_capture_close(struct snd_pcm_substream *substream)
1261 {
1262         struct snd_card_asihpi_pcm *dpcm = substream->runtime->private_data;
1263
1264         hpi_handle_error(hpi_instream_close(dpcm->h_stream));
1265         return 0;
1266 }
1267
1268 static const struct snd_pcm_ops snd_card_asihpi_capture_mmap_ops = {
1269         .open = snd_card_asihpi_capture_open,
1270         .close = snd_card_asihpi_capture_close,
1271         .hw_params = snd_card_asihpi_pcm_hw_params,
1272         .hw_free = snd_card_asihpi_hw_free,
1273         .prepare = snd_card_asihpi_capture_prepare,
1274         .trigger = snd_card_asihpi_trigger,
1275         .pointer = snd_card_asihpi_capture_pointer,
1276 };
1277
1278 static int snd_card_asihpi_pcm_new(struct snd_card_asihpi *asihpi, int device)
1279 {
1280         struct snd_pcm *pcm;
1281         int err;
1282         u16 num_instreams, num_outstreams, x16;
1283         u32 x32;
1284
1285         err = hpi_adapter_get_info(asihpi->hpi->adapter->index,
1286                         &num_outstreams, &num_instreams,
1287                         &x16, &x32, &x16);
1288
1289         err = snd_pcm_new(asihpi->card, "Asihpi PCM", device,
1290                         num_outstreams, num_instreams, &pcm);
1291         if (err < 0)
1292                 return err;
1293
1294         /* pointer to ops struct is stored, dont change ops afterwards! */
1295         snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
1296                         &snd_card_asihpi_playback_mmap_ops);
1297         snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
1298                         &snd_card_asihpi_capture_mmap_ops);
1299
1300         pcm->private_data = asihpi;
1301         pcm->info_flags = 0;
1302         strcpy(pcm->name, "Asihpi PCM");
1303
1304         /*? do we want to emulate MMAP for non-BBM cards?
1305         Jack doesn't work with ALSAs MMAP emulation - WHY NOT? */
1306         snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV,
1307                                        &asihpi->pci->dev,
1308                                        64*1024, BUFFER_BYTES_MAX);
1309
1310         return 0;
1311 }
1312
1313 /***************************** MIXER CONTROLS ****************/
1314 struct hpi_control {
1315         u32 h_control;
1316         u16 control_type;
1317         u16 src_node_type;
1318         u16 src_node_index;
1319         u16 dst_node_type;
1320         u16 dst_node_index;
1321         u16 band;
1322         char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* copied to snd_ctl_elem_id.name[44]; */
1323 };
1324
1325 static const char * const asihpi_tuner_band_names[] = {
1326         "invalid",
1327         "AM",
1328         "FM mono",
1329         "TV NTSC-M",
1330         "FM stereo",
1331         "AUX",
1332         "TV PAL BG",
1333         "TV PAL I",
1334         "TV PAL DK",
1335         "TV SECAM",
1336         "TV DAB",
1337 };
1338 /* Number of strings must match the enumerations for HPI_TUNER_BAND in hpi.h */
1339 compile_time_assert(
1340         (ARRAY_SIZE(asihpi_tuner_band_names) ==
1341                 (HPI_TUNER_BAND_LAST+1)),
1342         assert_tuner_band_names_size);
1343
1344 static const char * const asihpi_src_names[] = {
1345         "no source",
1346         "PCM",
1347         "Line",
1348         "Digital",
1349         "Tuner",
1350         "RF",
1351         "Clock",
1352         "Bitstream",
1353         "Mic",
1354         "Net",
1355         "Analog",
1356         "Adapter",
1357         "RTP",
1358         "Internal",
1359         "AVB",
1360         "BLU-Link"
1361 };
1362 /* Number of strings must match the enumerations for HPI_SOURCENODES in hpi.h */
1363 compile_time_assert(
1364         (ARRAY_SIZE(asihpi_src_names) ==
1365                 (HPI_SOURCENODE_LAST_INDEX-HPI_SOURCENODE_NONE+1)),
1366         assert_src_names_size);
1367
1368 static const char * const asihpi_dst_names[] = {
1369         "no destination",
1370         "PCM",
1371         "Line",
1372         "Digital",
1373         "RF",
1374         "Speaker",
1375         "Net",
1376         "Analog",
1377         "RTP",
1378         "AVB",
1379         "Internal",
1380         "BLU-Link"
1381 };
1382 /* Number of strings must match the enumerations for HPI_DESTNODES in hpi.h */
1383 compile_time_assert(
1384         (ARRAY_SIZE(asihpi_dst_names) ==
1385                 (HPI_DESTNODE_LAST_INDEX-HPI_DESTNODE_NONE+1)),
1386         assert_dst_names_size);
1387
1388 static inline int ctl_add(struct snd_card *card, struct snd_kcontrol_new *ctl,
1389                                 struct snd_card_asihpi *asihpi)
1390 {
1391         int err;
1392
1393         err = snd_ctl_add(card, snd_ctl_new1(ctl, asihpi));
1394         if (err < 0)
1395                 return err;
1396         else if (mixer_dump)
1397                 dev_info(&asihpi->pci->dev, "added %s(%d)\n", ctl->name, ctl->index);
1398
1399         return 0;
1400 }
1401
1402 /* Convert HPI control name and location into ALSA control name */
1403 static void asihpi_ctl_init(struct snd_kcontrol_new *snd_control,
1404                                 struct hpi_control *hpi_ctl,
1405                                 char *name)
1406 {
1407         char *dir;
1408         memset(snd_control, 0, sizeof(*snd_control));
1409         snd_control->name = hpi_ctl->name;
1410         snd_control->private_value = hpi_ctl->h_control;
1411         snd_control->iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1412         snd_control->index = 0;
1413
1414         if (hpi_ctl->src_node_type + HPI_SOURCENODE_NONE == HPI_SOURCENODE_CLOCK_SOURCE)
1415                 dir = ""; /* clock is neither capture nor playback */
1416         else if (hpi_ctl->dst_node_type + HPI_DESTNODE_NONE == HPI_DESTNODE_ISTREAM)
1417                 dir = "Capture ";  /* On or towards a PCM capture destination*/
1418         else if ((hpi_ctl->src_node_type + HPI_SOURCENODE_NONE != HPI_SOURCENODE_OSTREAM) &&
1419                 (!hpi_ctl->dst_node_type))
1420                 dir = "Capture "; /* On a source node that is not PCM playback */
1421         else if (hpi_ctl->src_node_type &&
1422                 (hpi_ctl->src_node_type + HPI_SOURCENODE_NONE != HPI_SOURCENODE_OSTREAM) &&
1423                 (hpi_ctl->dst_node_type))
1424                 dir = "Monitor Playback "; /* Between an input and an output */
1425         else
1426                 dir = "Playback "; /* PCM Playback source, or  output node */
1427
1428         if (hpi_ctl->src_node_type && hpi_ctl->dst_node_type)
1429                 sprintf(hpi_ctl->name, "%s %d %s %d %s%s",
1430                         asihpi_src_names[hpi_ctl->src_node_type],
1431                         hpi_ctl->src_node_index,
1432                         asihpi_dst_names[hpi_ctl->dst_node_type],
1433                         hpi_ctl->dst_node_index,
1434                         dir, name);
1435         else if (hpi_ctl->dst_node_type) {
1436                 sprintf(hpi_ctl->name, "%s %d %s%s",
1437                 asihpi_dst_names[hpi_ctl->dst_node_type],
1438                 hpi_ctl->dst_node_index,
1439                 dir, name);
1440         } else {
1441                 sprintf(hpi_ctl->name, "%s %d %s%s",
1442                 asihpi_src_names[hpi_ctl->src_node_type],
1443                 hpi_ctl->src_node_index,
1444                 dir, name);
1445         }
1446         /* printk(KERN_INFO "Adding %s %d to %d ",  hpi_ctl->name,
1447                 hpi_ctl->wSrcNodeType, hpi_ctl->wDstNodeType); */
1448 }
1449
1450 /*------------------------------------------------------------
1451    Volume controls
1452  ------------------------------------------------------------*/
1453 #define VOL_STEP_mB 1
1454 static int snd_asihpi_volume_info(struct snd_kcontrol *kcontrol,
1455                                   struct snd_ctl_elem_info *uinfo)
1456 {
1457         u32 h_control = kcontrol->private_value;
1458         u32 count;
1459         u16 err;
1460         /* native gains are in millibels */
1461         short min_gain_mB;
1462         short max_gain_mB;
1463         short step_gain_mB;
1464
1465         err = hpi_volume_query_range(h_control,
1466                         &min_gain_mB, &max_gain_mB, &step_gain_mB);
1467         if (err) {
1468                 max_gain_mB = 0;
1469                 min_gain_mB = -10000;
1470                 step_gain_mB = VOL_STEP_mB;
1471         }
1472
1473         err = hpi_meter_query_channels(h_control, &count);
1474         if (err)
1475                 count = HPI_MAX_CHANNELS;
1476
1477         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1478         uinfo->count = count;
1479         uinfo->value.integer.min = min_gain_mB / VOL_STEP_mB;
1480         uinfo->value.integer.max = max_gain_mB / VOL_STEP_mB;
1481         uinfo->value.integer.step = step_gain_mB / VOL_STEP_mB;
1482         return 0;
1483 }
1484
1485 static int snd_asihpi_volume_get(struct snd_kcontrol *kcontrol,
1486                                  struct snd_ctl_elem_value *ucontrol)
1487 {
1488         u32 h_control = kcontrol->private_value;
1489         short an_gain_mB[HPI_MAX_CHANNELS];
1490
1491         hpi_handle_error(hpi_volume_get_gain(h_control, an_gain_mB));
1492         ucontrol->value.integer.value[0] = an_gain_mB[0] / VOL_STEP_mB;
1493         ucontrol->value.integer.value[1] = an_gain_mB[1] / VOL_STEP_mB;
1494
1495         return 0;
1496 }
1497
1498 static int snd_asihpi_volume_put(struct snd_kcontrol *kcontrol,
1499                                  struct snd_ctl_elem_value *ucontrol)
1500 {
1501         u32 h_control = kcontrol->private_value;
1502         short an_gain_mB[HPI_MAX_CHANNELS];
1503
1504         an_gain_mB[0] =
1505             (ucontrol->value.integer.value[0]) * VOL_STEP_mB;
1506         an_gain_mB[1] =
1507             (ucontrol->value.integer.value[1]) * VOL_STEP_mB;
1508         /*  change = asihpi->mixer_volume[addr][0] != left ||
1509            asihpi->mixer_volume[addr][1] != right;
1510          */
1511         hpi_handle_error(hpi_volume_set_gain(h_control, an_gain_mB));
1512         return 1;
1513 }
1514
1515 static const DECLARE_TLV_DB_SCALE(db_scale_100, -10000, VOL_STEP_mB, 0);
1516
1517 #define snd_asihpi_volume_mute_info     snd_ctl_boolean_mono_info
1518
1519 static int snd_asihpi_volume_mute_get(struct snd_kcontrol *kcontrol,
1520                                  struct snd_ctl_elem_value *ucontrol)
1521 {
1522         u32 h_control = kcontrol->private_value;
1523         u32 mute;
1524
1525         hpi_handle_error(hpi_volume_get_mute(h_control, &mute));
1526         ucontrol->value.integer.value[0] = mute ? 0 : 1;
1527
1528         return 0;
1529 }
1530
1531 static int snd_asihpi_volume_mute_put(struct snd_kcontrol *kcontrol,
1532                                  struct snd_ctl_elem_value *ucontrol)
1533 {
1534         u32 h_control = kcontrol->private_value;
1535         /* HPI currently only supports all or none muting of multichannel volume
1536         ALSA Switch element has opposite sense to HPI mute: on==unmuted, off=muted
1537         */
1538         int mute =  ucontrol->value.integer.value[0] ? 0 : HPI_BITMASK_ALL_CHANNELS;
1539         hpi_handle_error(hpi_volume_set_mute(h_control, mute));
1540         return 1;
1541 }
1542
1543 static int snd_asihpi_volume_add(struct snd_card_asihpi *asihpi,
1544                                  struct hpi_control *hpi_ctl)
1545 {
1546         struct snd_card *card = asihpi->card;
1547         struct snd_kcontrol_new snd_control;
1548         int err;
1549         u32 mute;
1550
1551         asihpi_ctl_init(&snd_control, hpi_ctl, "Volume");
1552         snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
1553                                 SNDRV_CTL_ELEM_ACCESS_TLV_READ;
1554         snd_control.info = snd_asihpi_volume_info;
1555         snd_control.get = snd_asihpi_volume_get;
1556         snd_control.put = snd_asihpi_volume_put;
1557         snd_control.tlv.p = db_scale_100;
1558
1559         err = ctl_add(card, &snd_control, asihpi);
1560         if (err)
1561                 return err;
1562
1563         if (hpi_volume_get_mute(hpi_ctl->h_control, &mute) == 0) {
1564                 asihpi_ctl_init(&snd_control, hpi_ctl, "Switch");
1565                 snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
1566                 snd_control.info = snd_asihpi_volume_mute_info;
1567                 snd_control.get = snd_asihpi_volume_mute_get;
1568                 snd_control.put = snd_asihpi_volume_mute_put;
1569                 err = ctl_add(card, &snd_control, asihpi);
1570         }
1571         return err;
1572 }
1573
1574 /*------------------------------------------------------------
1575    Level controls
1576  ------------------------------------------------------------*/
1577 static int snd_asihpi_level_info(struct snd_kcontrol *kcontrol,
1578                                  struct snd_ctl_elem_info *uinfo)
1579 {
1580         u32 h_control = kcontrol->private_value;
1581         u16 err;
1582         short min_gain_mB;
1583         short max_gain_mB;
1584         short step_gain_mB;
1585
1586         err =
1587             hpi_level_query_range(h_control, &min_gain_mB,
1588                                &max_gain_mB, &step_gain_mB);
1589         if (err) {
1590                 max_gain_mB = 2400;
1591                 min_gain_mB = -1000;
1592                 step_gain_mB = 100;
1593         }
1594
1595         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1596         uinfo->count = 2;
1597         uinfo->value.integer.min = min_gain_mB / HPI_UNITS_PER_dB;
1598         uinfo->value.integer.max = max_gain_mB / HPI_UNITS_PER_dB;
1599         uinfo->value.integer.step = step_gain_mB / HPI_UNITS_PER_dB;
1600         return 0;
1601 }
1602
1603 static int snd_asihpi_level_get(struct snd_kcontrol *kcontrol,
1604                                 struct snd_ctl_elem_value *ucontrol)
1605 {
1606         u32 h_control = kcontrol->private_value;
1607         short an_gain_mB[HPI_MAX_CHANNELS];
1608
1609         hpi_handle_error(hpi_level_get_gain(h_control, an_gain_mB));
1610         ucontrol->value.integer.value[0] =
1611             an_gain_mB[0] / HPI_UNITS_PER_dB;
1612         ucontrol->value.integer.value[1] =
1613             an_gain_mB[1] / HPI_UNITS_PER_dB;
1614
1615         return 0;
1616 }
1617
1618 static int snd_asihpi_level_put(struct snd_kcontrol *kcontrol,
1619                                 struct snd_ctl_elem_value *ucontrol)
1620 {
1621         int change;
1622         u32 h_control = kcontrol->private_value;
1623         short an_gain_mB[HPI_MAX_CHANNELS];
1624
1625         an_gain_mB[0] =
1626             (ucontrol->value.integer.value[0]) * HPI_UNITS_PER_dB;
1627         an_gain_mB[1] =
1628             (ucontrol->value.integer.value[1]) * HPI_UNITS_PER_dB;
1629         /*  change = asihpi->mixer_level[addr][0] != left ||
1630            asihpi->mixer_level[addr][1] != right;
1631          */
1632         change = 1;
1633         hpi_handle_error(hpi_level_set_gain(h_control, an_gain_mB));
1634         return change;
1635 }
1636
1637 static const DECLARE_TLV_DB_SCALE(db_scale_level, -1000, 100, 0);
1638
1639 static int snd_asihpi_level_add(struct snd_card_asihpi *asihpi,
1640                                 struct hpi_control *hpi_ctl)
1641 {
1642         struct snd_card *card = asihpi->card;
1643         struct snd_kcontrol_new snd_control;
1644
1645         /* can't use 'volume' cos some nodes have volume as well */
1646         asihpi_ctl_init(&snd_control, hpi_ctl, "Level");
1647         snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
1648                                 SNDRV_CTL_ELEM_ACCESS_TLV_READ;
1649         snd_control.info = snd_asihpi_level_info;
1650         snd_control.get = snd_asihpi_level_get;
1651         snd_control.put = snd_asihpi_level_put;
1652         snd_control.tlv.p = db_scale_level;
1653
1654         return ctl_add(card, &snd_control, asihpi);
1655 }
1656
1657 /*------------------------------------------------------------
1658    AESEBU controls
1659  ------------------------------------------------------------*/
1660
1661 /* AESEBU format */
1662 static const char * const asihpi_aesebu_format_names[] = {
1663         "N/A", "S/PDIF", "AES/EBU" };
1664
1665 static int snd_asihpi_aesebu_format_info(struct snd_kcontrol *kcontrol,
1666                                   struct snd_ctl_elem_info *uinfo)
1667 {
1668         return snd_ctl_enum_info(uinfo, 1, 3, asihpi_aesebu_format_names);
1669 }
1670
1671 static int snd_asihpi_aesebu_format_get(struct snd_kcontrol *kcontrol,
1672                         struct snd_ctl_elem_value *ucontrol,
1673                         u16 (*func)(u32, u16 *))
1674 {
1675         u32 h_control = kcontrol->private_value;
1676         u16 source, err;
1677
1678         err = func(h_control, &source);
1679
1680         /* default to N/A */
1681         ucontrol->value.enumerated.item[0] = 0;
1682         /* return success but set the control to N/A */
1683         if (err)
1684                 return 0;
1685         if (source == HPI_AESEBU_FORMAT_SPDIF)
1686                 ucontrol->value.enumerated.item[0] = 1;
1687         if (source == HPI_AESEBU_FORMAT_AESEBU)
1688                 ucontrol->value.enumerated.item[0] = 2;
1689
1690         return 0;
1691 }
1692
1693 static int snd_asihpi_aesebu_format_put(struct snd_kcontrol *kcontrol,
1694                         struct snd_ctl_elem_value *ucontrol,
1695                          u16 (*func)(u32, u16))
1696 {
1697         u32 h_control = kcontrol->private_value;
1698
1699         /* default to S/PDIF */
1700         u16 source = HPI_AESEBU_FORMAT_SPDIF;
1701
1702         if (ucontrol->value.enumerated.item[0] == 1)
1703                 source = HPI_AESEBU_FORMAT_SPDIF;
1704         if (ucontrol->value.enumerated.item[0] == 2)
1705                 source = HPI_AESEBU_FORMAT_AESEBU;
1706
1707         if (func(h_control, source) != 0)
1708                 return -EINVAL;
1709
1710         return 1;
1711 }
1712
1713 static int snd_asihpi_aesebu_rx_format_get(struct snd_kcontrol *kcontrol,
1714                                  struct snd_ctl_elem_value *ucontrol) {
1715         return snd_asihpi_aesebu_format_get(kcontrol, ucontrol,
1716                                         hpi_aesebu_receiver_get_format);
1717 }
1718
1719 static int snd_asihpi_aesebu_rx_format_put(struct snd_kcontrol *kcontrol,
1720                                  struct snd_ctl_elem_value *ucontrol) {
1721         return snd_asihpi_aesebu_format_put(kcontrol, ucontrol,
1722                                         hpi_aesebu_receiver_set_format);
1723 }
1724
1725 static int snd_asihpi_aesebu_rxstatus_info(struct snd_kcontrol *kcontrol,
1726                                   struct snd_ctl_elem_info *uinfo)
1727 {
1728         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1729         uinfo->count = 1;
1730
1731         uinfo->value.integer.min = 0;
1732         uinfo->value.integer.max = 0X1F;
1733         uinfo->value.integer.step = 1;
1734
1735         return 0;
1736 }
1737
1738 static int snd_asihpi_aesebu_rxstatus_get(struct snd_kcontrol *kcontrol,
1739                                  struct snd_ctl_elem_value *ucontrol) {
1740
1741         u32 h_control = kcontrol->private_value;
1742         u16 status;
1743
1744         hpi_handle_error(hpi_aesebu_receiver_get_error_status(
1745                                          h_control, &status));
1746         ucontrol->value.integer.value[0] = status;
1747         return 0;
1748 }
1749
1750 static int snd_asihpi_aesebu_rx_add(struct snd_card_asihpi *asihpi,
1751                                     struct hpi_control *hpi_ctl)
1752 {
1753         struct snd_card *card = asihpi->card;
1754         struct snd_kcontrol_new snd_control;
1755
1756         asihpi_ctl_init(&snd_control, hpi_ctl, "Format");
1757         snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
1758         snd_control.info = snd_asihpi_aesebu_format_info;
1759         snd_control.get = snd_asihpi_aesebu_rx_format_get;
1760         snd_control.put = snd_asihpi_aesebu_rx_format_put;
1761
1762
1763         if (ctl_add(card, &snd_control, asihpi) < 0)
1764                 return -EINVAL;
1765
1766         asihpi_ctl_init(&snd_control, hpi_ctl, "Status");
1767         snd_control.access =
1768             SNDRV_CTL_ELEM_ACCESS_VOLATILE | SNDRV_CTL_ELEM_ACCESS_READ;
1769         snd_control.info = snd_asihpi_aesebu_rxstatus_info;
1770         snd_control.get = snd_asihpi_aesebu_rxstatus_get;
1771
1772         return ctl_add(card, &snd_control, asihpi);
1773 }
1774
1775 static int snd_asihpi_aesebu_tx_format_get(struct snd_kcontrol *kcontrol,
1776                                  struct snd_ctl_elem_value *ucontrol) {
1777         return snd_asihpi_aesebu_format_get(kcontrol, ucontrol,
1778                                         hpi_aesebu_transmitter_get_format);
1779 }
1780
1781 static int snd_asihpi_aesebu_tx_format_put(struct snd_kcontrol *kcontrol,
1782                                  struct snd_ctl_elem_value *ucontrol) {
1783         return snd_asihpi_aesebu_format_put(kcontrol, ucontrol,
1784                                         hpi_aesebu_transmitter_set_format);
1785 }
1786
1787
1788 static int snd_asihpi_aesebu_tx_add(struct snd_card_asihpi *asihpi,
1789                                     struct hpi_control *hpi_ctl)
1790 {
1791         struct snd_card *card = asihpi->card;
1792         struct snd_kcontrol_new snd_control;
1793
1794         asihpi_ctl_init(&snd_control, hpi_ctl, "Format");
1795         snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
1796         snd_control.info = snd_asihpi_aesebu_format_info;
1797         snd_control.get = snd_asihpi_aesebu_tx_format_get;
1798         snd_control.put = snd_asihpi_aesebu_tx_format_put;
1799
1800         return ctl_add(card, &snd_control, asihpi);
1801 }
1802
1803 /*------------------------------------------------------------
1804    Tuner controls
1805  ------------------------------------------------------------*/
1806
1807 /* Gain */
1808
1809 static int snd_asihpi_tuner_gain_info(struct snd_kcontrol *kcontrol,
1810                                   struct snd_ctl_elem_info *uinfo)
1811 {
1812         u32 h_control = kcontrol->private_value;
1813         u16 err;
1814         short idx;
1815         u16 gain_range[3];
1816
1817         for (idx = 0; idx < 3; idx++) {
1818                 err = hpi_tuner_query_gain(h_control,
1819                                           idx, &gain_range[idx]);
1820                 if (err != 0)
1821                         return err;
1822         }
1823
1824         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1825         uinfo->count = 1;
1826         uinfo->value.integer.min = ((int)gain_range[0]) / HPI_UNITS_PER_dB;
1827         uinfo->value.integer.max = ((int)gain_range[1]) / HPI_UNITS_PER_dB;
1828         uinfo->value.integer.step = ((int) gain_range[2]) / HPI_UNITS_PER_dB;
1829         return 0;
1830 }
1831
1832 static int snd_asihpi_tuner_gain_get(struct snd_kcontrol *kcontrol,
1833                                  struct snd_ctl_elem_value *ucontrol)
1834 {
1835         /*
1836         struct snd_card_asihpi *asihpi = snd_kcontrol_chip(kcontrol);
1837         */
1838         u32 h_control = kcontrol->private_value;
1839         short gain;
1840
1841         hpi_handle_error(hpi_tuner_get_gain(h_control, &gain));
1842         ucontrol->value.integer.value[0] = gain / HPI_UNITS_PER_dB;
1843
1844         return 0;
1845 }
1846
1847 static int snd_asihpi_tuner_gain_put(struct snd_kcontrol *kcontrol,
1848                                  struct snd_ctl_elem_value *ucontrol)
1849 {
1850         /*
1851         struct snd_card_asihpi *asihpi = snd_kcontrol_chip(kcontrol);
1852         */
1853         u32 h_control = kcontrol->private_value;
1854         short gain;
1855
1856         gain = (ucontrol->value.integer.value[0]) * HPI_UNITS_PER_dB;
1857         hpi_handle_error(hpi_tuner_set_gain(h_control, gain));
1858
1859         return 1;
1860 }
1861
1862 /* Band  */
1863
1864 static int asihpi_tuner_band_query(struct snd_kcontrol *kcontrol,
1865                                         u16 *band_list, u32 len) {
1866         u32 h_control = kcontrol->private_value;
1867         u16 err = 0;
1868         u32 i;
1869
1870         for (i = 0; i < len; i++) {
1871                 err = hpi_tuner_query_band(
1872                                 h_control, i, &band_list[i]);
1873                 if (err != 0)
1874                         break;
1875         }
1876
1877         if (err && (err != HPI_ERROR_INVALID_OBJ_INDEX))
1878                 return -EIO;
1879
1880         return i;
1881 }
1882
1883 static int snd_asihpi_tuner_band_info(struct snd_kcontrol *kcontrol,
1884                                   struct snd_ctl_elem_info *uinfo)
1885 {
1886         u16 tuner_bands[HPI_TUNER_BAND_LAST];
1887         int num_bands = 0;
1888
1889         num_bands = asihpi_tuner_band_query(kcontrol, tuner_bands,
1890                                 HPI_TUNER_BAND_LAST);
1891
1892         if (num_bands < 0)
1893                 return num_bands;
1894
1895         return snd_ctl_enum_info(uinfo, 1, num_bands, asihpi_tuner_band_names);
1896 }
1897
1898 static int snd_asihpi_tuner_band_get(struct snd_kcontrol *kcontrol,
1899                                  struct snd_ctl_elem_value *ucontrol)
1900 {
1901         u32 h_control = kcontrol->private_value;
1902         /*
1903         struct snd_card_asihpi *asihpi = snd_kcontrol_chip(kcontrol);
1904         */
1905         u16 band, idx;
1906         u16 tuner_bands[HPI_TUNER_BAND_LAST];
1907         __always_unused u32 num_bands;
1908
1909         num_bands = asihpi_tuner_band_query(kcontrol, tuner_bands,
1910                                 HPI_TUNER_BAND_LAST);
1911
1912         hpi_handle_error(hpi_tuner_get_band(h_control, &band));
1913
1914         ucontrol->value.enumerated.item[0] = -1;
1915         for (idx = 0; idx < HPI_TUNER_BAND_LAST; idx++)
1916                 if (tuner_bands[idx] == band) {
1917                         ucontrol->value.enumerated.item[0] = idx;
1918                         break;
1919                 }
1920
1921         return 0;
1922 }
1923
1924 static int snd_asihpi_tuner_band_put(struct snd_kcontrol *kcontrol,
1925                                  struct snd_ctl_elem_value *ucontrol)
1926 {
1927         /*
1928         struct snd_card_asihpi *asihpi = snd_kcontrol_chip(kcontrol);
1929         */
1930         u32 h_control = kcontrol->private_value;
1931         unsigned int idx;
1932         u16 band;
1933         u16 tuner_bands[HPI_TUNER_BAND_LAST];
1934         __always_unused u32 num_bands;
1935
1936         num_bands = asihpi_tuner_band_query(kcontrol, tuner_bands,
1937                         HPI_TUNER_BAND_LAST);
1938
1939         idx = ucontrol->value.enumerated.item[0];
1940         if (idx >= ARRAY_SIZE(tuner_bands))
1941                 idx = ARRAY_SIZE(tuner_bands) - 1;
1942         band = tuner_bands[idx];
1943         hpi_handle_error(hpi_tuner_set_band(h_control, band));
1944
1945         return 1;
1946 }
1947
1948 /* Freq */
1949
1950 static int snd_asihpi_tuner_freq_info(struct snd_kcontrol *kcontrol,
1951                                   struct snd_ctl_elem_info *uinfo)
1952 {
1953         u32 h_control = kcontrol->private_value;
1954         u16 err;
1955         u16 tuner_bands[HPI_TUNER_BAND_LAST];
1956         u16 num_bands = 0, band_iter, idx;
1957         u32 freq_range[3], temp_freq_range[3];
1958
1959         num_bands = asihpi_tuner_band_query(kcontrol, tuner_bands,
1960                         HPI_TUNER_BAND_LAST);
1961
1962         freq_range[0] = INT_MAX;
1963         freq_range[1] = 0;
1964         freq_range[2] = INT_MAX;
1965
1966         for (band_iter = 0; band_iter < num_bands; band_iter++) {
1967                 for (idx = 0; idx < 3; idx++) {
1968                         err = hpi_tuner_query_frequency(h_control,
1969                                 idx, tuner_bands[band_iter],
1970                                 &temp_freq_range[idx]);
1971                         if (err != 0)
1972                                 return err;
1973                 }
1974
1975                 /* skip band with bogus stepping */
1976                 if (temp_freq_range[2] <= 0)
1977                         continue;
1978
1979                 if (temp_freq_range[0] < freq_range[0])
1980                         freq_range[0] = temp_freq_range[0];
1981                 if (temp_freq_range[1] > freq_range[1])
1982                         freq_range[1] = temp_freq_range[1];
1983                 if (temp_freq_range[2] < freq_range[2])
1984                         freq_range[2] = temp_freq_range[2];
1985         }
1986
1987         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1988         uinfo->count = 1;
1989         uinfo->value.integer.min = ((int)freq_range[0]);
1990         uinfo->value.integer.max = ((int)freq_range[1]);
1991         uinfo->value.integer.step = ((int)freq_range[2]);
1992         return 0;
1993 }
1994
1995 static int snd_asihpi_tuner_freq_get(struct snd_kcontrol *kcontrol,
1996                                  struct snd_ctl_elem_value *ucontrol)
1997 {
1998         u32 h_control = kcontrol->private_value;
1999         u32 freq;
2000
2001         hpi_handle_error(hpi_tuner_get_frequency(h_control, &freq));
2002         ucontrol->value.integer.value[0] = freq;
2003
2004         return 0;
2005 }
2006
2007 static int snd_asihpi_tuner_freq_put(struct snd_kcontrol *kcontrol,
2008                                  struct snd_ctl_elem_value *ucontrol)
2009 {
2010         u32 h_control = kcontrol->private_value;
2011         u32 freq;
2012
2013         freq = ucontrol->value.integer.value[0];
2014         hpi_handle_error(hpi_tuner_set_frequency(h_control, freq));
2015
2016         return 1;
2017 }
2018
2019 /* Tuner control group initializer  */
2020 static int snd_asihpi_tuner_add(struct snd_card_asihpi *asihpi,
2021                                 struct hpi_control *hpi_ctl)
2022 {
2023         struct snd_card *card = asihpi->card;
2024         struct snd_kcontrol_new snd_control;
2025
2026         snd_control.private_value = hpi_ctl->h_control;
2027         snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
2028
2029         if (!hpi_tuner_get_gain(hpi_ctl->h_control, NULL)) {
2030                 asihpi_ctl_init(&snd_control, hpi_ctl, "Gain");
2031                 snd_control.info = snd_asihpi_tuner_gain_info;
2032                 snd_control.get = snd_asihpi_tuner_gain_get;
2033                 snd_control.put = snd_asihpi_tuner_gain_put;
2034
2035                 if (ctl_add(card, &snd_control, asihpi) < 0)
2036                         return -EINVAL;
2037         }
2038
2039         asihpi_ctl_init(&snd_control, hpi_ctl, "Band");
2040         snd_control.info = snd_asihpi_tuner_band_info;
2041         snd_control.get = snd_asihpi_tuner_band_get;
2042         snd_control.put = snd_asihpi_tuner_band_put;
2043
2044         if (ctl_add(card, &snd_control, asihpi) < 0)
2045                 return -EINVAL;
2046
2047         asihpi_ctl_init(&snd_control, hpi_ctl, "Freq");
2048         snd_control.info = snd_asihpi_tuner_freq_info;
2049         snd_control.get = snd_asihpi_tuner_freq_get;
2050         snd_control.put = snd_asihpi_tuner_freq_put;
2051
2052         return ctl_add(card, &snd_control, asihpi);
2053 }
2054
2055 /*------------------------------------------------------------
2056    Meter controls
2057  ------------------------------------------------------------*/
2058 static int snd_asihpi_meter_info(struct snd_kcontrol *kcontrol,
2059                                  struct snd_ctl_elem_info *uinfo)
2060 {
2061         u32 h_control = kcontrol->private_value;
2062         u32 count;
2063         u16 err;
2064         err = hpi_meter_query_channels(h_control, &count);
2065         if (err)
2066                 count = HPI_MAX_CHANNELS;
2067
2068         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2069         uinfo->count = count;
2070         uinfo->value.integer.min = 0;
2071         uinfo->value.integer.max = 0x7FFFFFFF;
2072         return 0;
2073 }
2074
2075 /* linear values for 10dB steps */
2076 static const int log2lin[] = {
2077         0x7FFFFFFF, /* 0dB */
2078         679093956,
2079         214748365,
2080          67909396,
2081          21474837,
2082           6790940,
2083           2147484, /* -60dB */
2084            679094,
2085            214748, /* -80 */
2086             67909,
2087             21475, /* -100 */
2088              6791,
2089              2147,
2090               679,
2091               214,
2092                68,
2093                21,
2094                 7,
2095                 2
2096 };
2097
2098 static int snd_asihpi_meter_get(struct snd_kcontrol *kcontrol,
2099                                 struct snd_ctl_elem_value *ucontrol)
2100 {
2101         u32 h_control = kcontrol->private_value;
2102         short an_gain_mB[HPI_MAX_CHANNELS], i;
2103         u16 err;
2104
2105         err = hpi_meter_get_peak(h_control, an_gain_mB);
2106
2107         for (i = 0; i < HPI_MAX_CHANNELS; i++) {
2108                 if (err) {
2109                         ucontrol->value.integer.value[i] = 0;
2110                 } else if (an_gain_mB[i] >= 0) {
2111                         ucontrol->value.integer.value[i] =
2112                                 an_gain_mB[i] << 16;
2113                 } else {
2114                         /* -ve is log value in millibels < -60dB,
2115                         * convert to (roughly!) linear,
2116                         */
2117                         ucontrol->value.integer.value[i] =
2118                                         log2lin[an_gain_mB[i] / -1000];
2119                 }
2120         }
2121         return 0;
2122 }
2123
2124 static int snd_asihpi_meter_add(struct snd_card_asihpi *asihpi,
2125                                 struct hpi_control *hpi_ctl, int subidx)
2126 {
2127         struct snd_card *card = asihpi->card;
2128         struct snd_kcontrol_new snd_control;
2129
2130         asihpi_ctl_init(&snd_control, hpi_ctl, "Meter");
2131         snd_control.access =
2132             SNDRV_CTL_ELEM_ACCESS_VOLATILE | SNDRV_CTL_ELEM_ACCESS_READ;
2133         snd_control.info = snd_asihpi_meter_info;
2134         snd_control.get = snd_asihpi_meter_get;
2135
2136         snd_control.index = subidx;
2137
2138         return ctl_add(card, &snd_control, asihpi);
2139 }
2140
2141 /*------------------------------------------------------------
2142    Multiplexer controls
2143  ------------------------------------------------------------*/
2144 static int snd_card_asihpi_mux_count_sources(struct snd_kcontrol *snd_control)
2145 {
2146         u32 h_control = snd_control->private_value;
2147         struct hpi_control hpi_ctl;
2148         int s, err;
2149         for (s = 0; s < 32; s++) {
2150                 err = hpi_multiplexer_query_source(h_control, s,
2151                                                   &hpi_ctl.
2152                                                   src_node_type,
2153                                                   &hpi_ctl.
2154                                                   src_node_index);
2155                 if (err)
2156                         break;
2157         }
2158         return s;
2159 }
2160
2161 static int snd_asihpi_mux_info(struct snd_kcontrol *kcontrol,
2162                                struct snd_ctl_elem_info *uinfo)
2163 {
2164         u16 src_node_type, src_node_index;
2165         u32 h_control = kcontrol->private_value;
2166
2167         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2168         uinfo->count = 1;
2169         uinfo->value.enumerated.items =
2170             snd_card_asihpi_mux_count_sources(kcontrol);
2171
2172         if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2173                 uinfo->value.enumerated.item =
2174                     uinfo->value.enumerated.items - 1;
2175
2176         hpi_multiplexer_query_source(h_control,
2177                                      uinfo->value.enumerated.item,
2178                                      &src_node_type, &src_node_index);
2179
2180         sprintf(uinfo->value.enumerated.name, "%s %d",
2181                 asihpi_src_names[src_node_type - HPI_SOURCENODE_NONE],
2182                 src_node_index);
2183         return 0;
2184 }
2185
2186 static int snd_asihpi_mux_get(struct snd_kcontrol *kcontrol,
2187                               struct snd_ctl_elem_value *ucontrol)
2188 {
2189         u32 h_control = kcontrol->private_value;
2190         u16 source_type, source_index;
2191         u16 src_node_type, src_node_index;
2192         int s;
2193
2194         hpi_handle_error(hpi_multiplexer_get_source(h_control,
2195                                 &source_type, &source_index));
2196         /* Should cache this search result! */
2197         for (s = 0; s < 256; s++) {
2198                 if (hpi_multiplexer_query_source(h_control, s,
2199                                             &src_node_type, &src_node_index))
2200                         break;
2201
2202                 if ((source_type == src_node_type)
2203                     && (source_index == src_node_index)) {
2204                         ucontrol->value.enumerated.item[0] = s;
2205                         return 0;
2206                 }
2207         }
2208         snd_printd(KERN_WARNING
2209                 "Control %x failed to match mux source %hu %hu\n",
2210                 h_control, source_type, source_index);
2211         ucontrol->value.enumerated.item[0] = 0;
2212         return 0;
2213 }
2214
2215 static int snd_asihpi_mux_put(struct snd_kcontrol *kcontrol,
2216                               struct snd_ctl_elem_value *ucontrol)
2217 {
2218         int change;
2219         u32 h_control = kcontrol->private_value;
2220         u16 source_type, source_index;
2221         u16 e;
2222
2223         change = 1;
2224
2225         e = hpi_multiplexer_query_source(h_control,
2226                                     ucontrol->value.enumerated.item[0],
2227                                     &source_type, &source_index);
2228         if (!e)
2229                 hpi_handle_error(
2230                         hpi_multiplexer_set_source(h_control,
2231                                                 source_type, source_index));
2232         return change;
2233 }
2234
2235
2236 static int  snd_asihpi_mux_add(struct snd_card_asihpi *asihpi,
2237                                struct hpi_control *hpi_ctl)
2238 {
2239         struct snd_card *card = asihpi->card;
2240         struct snd_kcontrol_new snd_control;
2241
2242         asihpi_ctl_init(&snd_control, hpi_ctl, "Route");
2243         snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
2244         snd_control.info = snd_asihpi_mux_info;
2245         snd_control.get = snd_asihpi_mux_get;
2246         snd_control.put = snd_asihpi_mux_put;
2247
2248         return ctl_add(card, &snd_control, asihpi);
2249
2250 }
2251
2252 /*------------------------------------------------------------
2253    Channel mode controls
2254  ------------------------------------------------------------*/
2255 static int snd_asihpi_cmode_info(struct snd_kcontrol *kcontrol,
2256                                  struct snd_ctl_elem_info *uinfo)
2257 {
2258         static const char * const mode_names[HPI_CHANNEL_MODE_LAST + 1] = {
2259                 "invalid",
2260                 "Normal", "Swap",
2261                 "From Left", "From Right",
2262                 "To Left", "To Right"
2263         };
2264
2265         u32 h_control = kcontrol->private_value;
2266         u16 mode;
2267         int i;
2268         const char *mapped_names[6];
2269         int valid_modes = 0;
2270
2271         /* HPI channel mode values can be from 1 to 6
2272         Some adapters only support a contiguous subset
2273         */
2274         for (i = 0; i < HPI_CHANNEL_MODE_LAST; i++)
2275                 if (!hpi_channel_mode_query_mode(
2276                         h_control, i, &mode)) {
2277                         mapped_names[valid_modes] = mode_names[mode];
2278                         valid_modes++;
2279                         }
2280
2281         if (!valid_modes)
2282                 return -EINVAL;
2283
2284         return snd_ctl_enum_info(uinfo, 1, valid_modes, mapped_names);
2285 }
2286
2287 static int snd_asihpi_cmode_get(struct snd_kcontrol *kcontrol,
2288                                 struct snd_ctl_elem_value *ucontrol)
2289 {
2290         u32 h_control = kcontrol->private_value;
2291         u16 mode;
2292
2293         if (hpi_channel_mode_get(h_control, &mode))
2294                 mode = 1;
2295
2296         ucontrol->value.enumerated.item[0] = mode - 1;
2297
2298         return 0;
2299 }
2300
2301 static int snd_asihpi_cmode_put(struct snd_kcontrol *kcontrol,
2302                                 struct snd_ctl_elem_value *ucontrol)
2303 {
2304         int change;
2305         u32 h_control = kcontrol->private_value;
2306
2307         change = 1;
2308
2309         hpi_handle_error(hpi_channel_mode_set(h_control,
2310                            ucontrol->value.enumerated.item[0] + 1));
2311         return change;
2312 }
2313
2314
2315 static int snd_asihpi_cmode_add(struct snd_card_asihpi *asihpi,
2316                                 struct hpi_control *hpi_ctl)
2317 {
2318         struct snd_card *card = asihpi->card;
2319         struct snd_kcontrol_new snd_control;
2320
2321         asihpi_ctl_init(&snd_control, hpi_ctl, "Mode");
2322         snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
2323         snd_control.info = snd_asihpi_cmode_info;
2324         snd_control.get = snd_asihpi_cmode_get;
2325         snd_control.put = snd_asihpi_cmode_put;
2326
2327         return ctl_add(card, &snd_control, asihpi);
2328 }
2329
2330 /*------------------------------------------------------------
2331    Sampleclock source  controls
2332  ------------------------------------------------------------*/
2333 static const char * const sampleclock_sources[] = {
2334         "N/A", "Local PLL", "Digital Sync", "Word External", "Word Header",
2335         "SMPTE", "Digital1", "Auto", "Network", "Invalid",
2336         "Prev Module", "BLU-Link",
2337         "Digital2", "Digital3", "Digital4", "Digital5",
2338         "Digital6", "Digital7", "Digital8"};
2339
2340         /* Number of strings must match expected enumerated values */
2341         compile_time_assert(
2342                 (ARRAY_SIZE(sampleclock_sources) == MAX_CLOCKSOURCES),
2343                 assert_sampleclock_sources_size);
2344
2345 static int snd_asihpi_clksrc_info(struct snd_kcontrol *kcontrol,
2346                                   struct snd_ctl_elem_info *uinfo)
2347 {
2348         struct snd_card_asihpi *asihpi =
2349                         (struct snd_card_asihpi *)(kcontrol->private_data);
2350         struct clk_cache *clkcache = &asihpi->cc;
2351         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2352         uinfo->count = 1;
2353         uinfo->value.enumerated.items = clkcache->count;
2354
2355         if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2356                 uinfo->value.enumerated.item =
2357                                 uinfo->value.enumerated.items - 1;
2358
2359         strcpy(uinfo->value.enumerated.name,
2360                clkcache->s[uinfo->value.enumerated.item].name);
2361         return 0;
2362 }
2363
2364 static int snd_asihpi_clksrc_get(struct snd_kcontrol *kcontrol,
2365                                  struct snd_ctl_elem_value *ucontrol)
2366 {
2367         struct snd_card_asihpi *asihpi =
2368                         (struct snd_card_asihpi *)(kcontrol->private_data);
2369         struct clk_cache *clkcache = &asihpi->cc;
2370         u32 h_control = kcontrol->private_value;
2371         u16 source, srcindex = 0;
2372         int i;
2373
2374         ucontrol->value.enumerated.item[0] = 0;
2375         if (hpi_sample_clock_get_source(h_control, &source))
2376                 source = 0;
2377
2378         if (source == HPI_SAMPLECLOCK_SOURCE_AESEBU_INPUT)
2379                 if (hpi_sample_clock_get_source_index(h_control, &srcindex))
2380                         srcindex = 0;
2381
2382         for (i = 0; i < clkcache->count; i++)
2383                 if ((clkcache->s[i].source == source) &&
2384                         (clkcache->s[i].index == srcindex))
2385                         break;
2386
2387         ucontrol->value.enumerated.item[0] = i;
2388
2389         return 0;
2390 }
2391
2392 static int snd_asihpi_clksrc_put(struct snd_kcontrol *kcontrol,
2393                                  struct snd_ctl_elem_value *ucontrol)
2394 {
2395         struct snd_card_asihpi *asihpi =
2396                         (struct snd_card_asihpi *)(kcontrol->private_data);
2397         struct clk_cache *clkcache = &asihpi->cc;
2398         unsigned int item;
2399         int change;
2400         u32 h_control = kcontrol->private_value;
2401
2402         change = 1;
2403         item = ucontrol->value.enumerated.item[0];
2404         if (item >= clkcache->count)
2405                 item = clkcache->count-1;
2406
2407         hpi_handle_error(hpi_sample_clock_set_source(
2408                                 h_control, clkcache->s[item].source));
2409
2410         if (clkcache->s[item].source == HPI_SAMPLECLOCK_SOURCE_AESEBU_INPUT)
2411                 hpi_handle_error(hpi_sample_clock_set_source_index(
2412                                 h_control, clkcache->s[item].index));
2413         return change;
2414 }
2415
2416 /*------------------------------------------------------------
2417    Clkrate controls
2418  ------------------------------------------------------------*/
2419 /* Need to change this to enumerated control with list of rates */
2420 static int snd_asihpi_clklocal_info(struct snd_kcontrol *kcontrol,
2421                                    struct snd_ctl_elem_info *uinfo)
2422 {
2423         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2424         uinfo->count = 1;
2425         uinfo->value.integer.min = 8000;
2426         uinfo->value.integer.max = 192000;
2427         uinfo->value.integer.step = 100;
2428
2429         return 0;
2430 }
2431
2432 static int snd_asihpi_clklocal_get(struct snd_kcontrol *kcontrol,
2433                                   struct snd_ctl_elem_value *ucontrol)
2434 {
2435         u32 h_control = kcontrol->private_value;
2436         u32 rate;
2437         u16 e;
2438
2439         e = hpi_sample_clock_get_local_rate(h_control, &rate);
2440         if (!e)
2441                 ucontrol->value.integer.value[0] = rate;
2442         else
2443                 ucontrol->value.integer.value[0] = 0;
2444         return 0;
2445 }
2446
2447 static int snd_asihpi_clklocal_put(struct snd_kcontrol *kcontrol,
2448                                   struct snd_ctl_elem_value *ucontrol)
2449 {
2450         int change;
2451         u32 h_control = kcontrol->private_value;
2452
2453         /*  change = asihpi->mixer_clkrate[addr][0] != left ||
2454            asihpi->mixer_clkrate[addr][1] != right;
2455          */
2456         change = 1;
2457         hpi_handle_error(hpi_sample_clock_set_local_rate(h_control,
2458                                       ucontrol->value.integer.value[0]));
2459         return change;
2460 }
2461
2462 static int snd_asihpi_clkrate_info(struct snd_kcontrol *kcontrol,
2463                                    struct snd_ctl_elem_info *uinfo)
2464 {
2465         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2466         uinfo->count = 1;
2467         uinfo->value.integer.min = 8000;
2468         uinfo->value.integer.max = 192000;
2469         uinfo->value.integer.step = 100;
2470
2471         return 0;
2472 }
2473
2474 static int snd_asihpi_clkrate_get(struct snd_kcontrol *kcontrol,
2475                                   struct snd_ctl_elem_value *ucontrol)
2476 {
2477         u32 h_control = kcontrol->private_value;
2478         u32 rate;
2479         u16 e;
2480
2481         e = hpi_sample_clock_get_sample_rate(h_control, &rate);
2482         if (!e)
2483                 ucontrol->value.integer.value[0] = rate;
2484         else
2485                 ucontrol->value.integer.value[0] = 0;
2486         return 0;
2487 }
2488
2489 static int snd_asihpi_sampleclock_add(struct snd_card_asihpi *asihpi,
2490                                       struct hpi_control *hpi_ctl)
2491 {
2492         struct snd_card *card;
2493         struct snd_kcontrol_new snd_control;
2494
2495         struct clk_cache *clkcache;
2496         u32 hSC =  hpi_ctl->h_control;
2497         int has_aes_in = 0;
2498         int i, j;
2499         u16 source;
2500
2501         if (snd_BUG_ON(!asihpi))
2502                 return -EINVAL;
2503         card = asihpi->card;
2504         clkcache = &asihpi->cc;
2505         snd_control.private_value = hpi_ctl->h_control;
2506
2507         clkcache->has_local = 0;
2508
2509         for (i = 0; i <= HPI_SAMPLECLOCK_SOURCE_LAST; i++) {
2510                 if  (hpi_sample_clock_query_source(hSC,
2511                                 i, &source))
2512                         break;
2513                 clkcache->s[i].source = source;
2514                 clkcache->s[i].index = 0;
2515                 clkcache->s[i].name = sampleclock_sources[source];
2516                 if (source == HPI_SAMPLECLOCK_SOURCE_AESEBU_INPUT)
2517                         has_aes_in = 1;
2518                 if (source == HPI_SAMPLECLOCK_SOURCE_LOCAL)
2519                         clkcache->has_local = 1;
2520         }
2521         if (has_aes_in)
2522                 /* already will have picked up index 0 above */
2523                 for (j = 1; j < 8; j++) {
2524                         if (hpi_sample_clock_query_source_index(hSC,
2525                                 j, HPI_SAMPLECLOCK_SOURCE_AESEBU_INPUT,
2526                                 &source))
2527                                 break;
2528                         clkcache->s[i].source =
2529                                 HPI_SAMPLECLOCK_SOURCE_AESEBU_INPUT;
2530                         clkcache->s[i].index = j;
2531                         clkcache->s[i].name = sampleclock_sources[
2532                                         j+HPI_SAMPLECLOCK_SOURCE_LAST];
2533                         i++;
2534                 }
2535         clkcache->count = i;
2536
2537         asihpi_ctl_init(&snd_control, hpi_ctl, "Source");
2538         snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE ;
2539         snd_control.info = snd_asihpi_clksrc_info;
2540         snd_control.get = snd_asihpi_clksrc_get;
2541         snd_control.put = snd_asihpi_clksrc_put;
2542         if (ctl_add(card, &snd_control, asihpi) < 0)
2543                 return -EINVAL;
2544
2545
2546         if (clkcache->has_local) {
2547                 asihpi_ctl_init(&snd_control, hpi_ctl, "Localrate");
2548                 snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE ;
2549                 snd_control.info = snd_asihpi_clklocal_info;
2550                 snd_control.get = snd_asihpi_clklocal_get;
2551                 snd_control.put = snd_asihpi_clklocal_put;
2552
2553
2554                 if (ctl_add(card, &snd_control, asihpi) < 0)
2555                         return -EINVAL;
2556         }
2557
2558         asihpi_ctl_init(&snd_control, hpi_ctl, "Rate");
2559         snd_control.access =
2560             SNDRV_CTL_ELEM_ACCESS_VOLATILE | SNDRV_CTL_ELEM_ACCESS_READ;
2561         snd_control.info = snd_asihpi_clkrate_info;
2562         snd_control.get = snd_asihpi_clkrate_get;
2563
2564         return ctl_add(card, &snd_control, asihpi);
2565 }
2566 /*------------------------------------------------------------
2567    Mixer
2568  ------------------------------------------------------------*/
2569
2570 static int snd_card_asihpi_mixer_new(struct snd_card_asihpi *asihpi)
2571 {
2572         struct snd_card *card;
2573         unsigned int idx = 0;
2574         unsigned int subindex = 0;
2575         int err;
2576         struct hpi_control hpi_ctl, prev_ctl;
2577
2578         if (snd_BUG_ON(!asihpi))
2579                 return -EINVAL;
2580         card = asihpi->card;
2581         strcpy(card->mixername, "Asihpi Mixer");
2582
2583         err =
2584             hpi_mixer_open(asihpi->hpi->adapter->index,
2585                           &asihpi->h_mixer);
2586         hpi_handle_error(err);
2587         if (err)
2588                 return -err;
2589
2590         memset(&prev_ctl, 0, sizeof(prev_ctl));
2591         prev_ctl.control_type = -1;
2592
2593         for (idx = 0; idx < 2000; idx++) {
2594                 err = hpi_mixer_get_control_by_index(
2595                                 asihpi->h_mixer,
2596                                 idx,
2597                                 &hpi_ctl.src_node_type,
2598                                 &hpi_ctl.src_node_index,
2599                                 &hpi_ctl.dst_node_type,
2600                                 &hpi_ctl.dst_node_index,
2601                                 &hpi_ctl.control_type,
2602                                 &hpi_ctl.h_control);
2603                 if (err) {
2604                         if (err == HPI_ERROR_CONTROL_DISABLED) {
2605                                 if (mixer_dump)
2606                                         dev_info(&asihpi->pci->dev,
2607                                                    "Disabled HPI Control(%d)\n",
2608                                                    idx);
2609                                 continue;
2610                         } else
2611                                 break;
2612
2613                 }
2614
2615                 hpi_ctl.src_node_type -= HPI_SOURCENODE_NONE;
2616                 hpi_ctl.dst_node_type -= HPI_DESTNODE_NONE;
2617
2618                 /* ASI50xx in SSX mode has multiple meters on the same node.
2619                    Use subindex to create distinct ALSA controls
2620                    for any duplicated controls.
2621                 */
2622                 if ((hpi_ctl.control_type == prev_ctl.control_type) &&
2623                     (hpi_ctl.src_node_type == prev_ctl.src_node_type) &&
2624                     (hpi_ctl.src_node_index == prev_ctl.src_node_index) &&
2625                     (hpi_ctl.dst_node_type == prev_ctl.dst_node_type) &&
2626                     (hpi_ctl.dst_node_index == prev_ctl.dst_node_index))
2627                         subindex++;
2628                 else
2629                         subindex = 0;
2630
2631                 prev_ctl = hpi_ctl;
2632
2633                 switch (hpi_ctl.control_type) {
2634                 case HPI_CONTROL_VOLUME:
2635                         err = snd_asihpi_volume_add(asihpi, &hpi_ctl);
2636                         break;
2637                 case HPI_CONTROL_LEVEL:
2638                         err = snd_asihpi_level_add(asihpi, &hpi_ctl);
2639                         break;
2640                 case HPI_CONTROL_MULTIPLEXER:
2641                         err = snd_asihpi_mux_add(asihpi, &hpi_ctl);
2642                         break;
2643                 case HPI_CONTROL_CHANNEL_MODE:
2644                         err = snd_asihpi_cmode_add(asihpi, &hpi_ctl);
2645                         break;
2646                 case HPI_CONTROL_METER:
2647                         err = snd_asihpi_meter_add(asihpi, &hpi_ctl, subindex);
2648                         break;
2649                 case HPI_CONTROL_SAMPLECLOCK:
2650                         err = snd_asihpi_sampleclock_add(
2651                                                 asihpi, &hpi_ctl);
2652                         break;
2653                 case HPI_CONTROL_CONNECTION:    /* ignore these */
2654                         continue;
2655                 case HPI_CONTROL_TUNER:
2656                         err = snd_asihpi_tuner_add(asihpi, &hpi_ctl);
2657                         break;
2658                 case HPI_CONTROL_AESEBU_TRANSMITTER:
2659                         err = snd_asihpi_aesebu_tx_add(asihpi, &hpi_ctl);
2660                         break;
2661                 case HPI_CONTROL_AESEBU_RECEIVER:
2662                         err = snd_asihpi_aesebu_rx_add(asihpi, &hpi_ctl);
2663                         break;
2664                 case HPI_CONTROL_VOX:
2665                 case HPI_CONTROL_BITSTREAM:
2666                 case HPI_CONTROL_MICROPHONE:
2667                 case HPI_CONTROL_PARAMETRIC_EQ:
2668                 case HPI_CONTROL_COMPANDER:
2669                 default:
2670                         if (mixer_dump)
2671                                 dev_info(&asihpi->pci->dev,
2672                                         "Untranslated HPI Control (%d) %d %d %d %d %d\n",
2673                                         idx,
2674                                         hpi_ctl.control_type,
2675                                         hpi_ctl.src_node_type,
2676                                         hpi_ctl.src_node_index,
2677                                         hpi_ctl.dst_node_type,
2678                                         hpi_ctl.dst_node_index);
2679                         continue;
2680                 }
2681                 if (err < 0)
2682                         return err;
2683         }
2684         if (HPI_ERROR_INVALID_OBJ_INDEX != err)
2685                 hpi_handle_error(err);
2686
2687         dev_info(&asihpi->pci->dev, "%d mixer controls found\n", idx);
2688
2689         return 0;
2690 }
2691
2692 /*------------------------------------------------------------
2693    /proc interface
2694  ------------------------------------------------------------*/
2695
2696 static void
2697 snd_asihpi_proc_read(struct snd_info_entry *entry,
2698                         struct snd_info_buffer *buffer)
2699 {
2700         struct snd_card_asihpi *asihpi = entry->private_data;
2701         u32 h_control;
2702         u32 rate = 0;
2703         u16 source = 0;
2704
2705         u16 num_outstreams;
2706         u16 num_instreams;
2707         u16 version;
2708         u32 serial_number;
2709         u16 type;
2710
2711         int err;
2712
2713         snd_iprintf(buffer, "ASIHPI driver proc file\n");
2714
2715         hpi_handle_error(hpi_adapter_get_info(asihpi->hpi->adapter->index,
2716                         &num_outstreams, &num_instreams,
2717                         &version, &serial_number, &type));
2718
2719         snd_iprintf(buffer,
2720                         "Adapter type ASI%4X\nHardware Index %d\n"
2721                         "%d outstreams\n%d instreams\n",
2722                         type, asihpi->hpi->adapter->index,
2723                         num_outstreams, num_instreams);
2724
2725         snd_iprintf(buffer,
2726                 "Serial#%d\nHardware version %c%d\nDSP code version %03d\n",
2727                 serial_number, ((version >> 3) & 0xf) + 'A', version & 0x7,
2728                 ((version >> 13) * 100) + ((version >> 7) & 0x3f));
2729
2730         err = hpi_mixer_get_control(asihpi->h_mixer,
2731                                   HPI_SOURCENODE_CLOCK_SOURCE, 0, 0, 0,
2732                                   HPI_CONTROL_SAMPLECLOCK, &h_control);
2733
2734         if (!err) {
2735                 err = hpi_sample_clock_get_sample_rate(h_control, &rate);
2736                 err += hpi_sample_clock_get_source(h_control, &source);
2737
2738                 if (!err)
2739                         snd_iprintf(buffer, "Sample Clock %dHz, source %s\n",
2740                         rate, sampleclock_sources[source]);
2741         }
2742 }
2743
2744 static void snd_asihpi_proc_init(struct snd_card_asihpi *asihpi)
2745 {
2746         snd_card_ro_proc_new(asihpi->card, "info", asihpi,
2747                              snd_asihpi_proc_read);
2748 }
2749
2750 /*------------------------------------------------------------
2751    HWDEP
2752  ------------------------------------------------------------*/
2753
2754 static int snd_asihpi_hpi_open(struct snd_hwdep *hw, struct file *file)
2755 {
2756         if (enable_hpi_hwdep)
2757                 return 0;
2758         else
2759                 return -ENODEV;
2760
2761 }
2762
2763 static int snd_asihpi_hpi_release(struct snd_hwdep *hw, struct file *file)
2764 {
2765         if (enable_hpi_hwdep)
2766                 return asihpi_hpi_release(file);
2767         else
2768                 return -ENODEV;
2769 }
2770
2771 static int snd_asihpi_hpi_ioctl(struct snd_hwdep *hw, struct file *file,
2772                                 unsigned int cmd, unsigned long arg)
2773 {
2774         if (enable_hpi_hwdep)
2775                 return asihpi_hpi_ioctl(file, cmd, arg);
2776         else
2777                 return -ENODEV;
2778 }
2779
2780
2781 /* results in /dev/snd/hwC#D0 file for each card with index #
2782    also /proc/asound/hwdep will contain '#-00: asihpi (HPI) for each card'
2783 */
2784 static int snd_asihpi_hpi_new(struct snd_card_asihpi *asihpi, int device)
2785 {
2786         struct snd_hwdep *hw;
2787         int err;
2788
2789         err = snd_hwdep_new(asihpi->card, "HPI", device, &hw);
2790         if (err < 0)
2791                 return err;
2792         strcpy(hw->name, "asihpi (HPI)");
2793         hw->iface = SNDRV_HWDEP_IFACE_LAST;
2794         hw->ops.open = snd_asihpi_hpi_open;
2795         hw->ops.ioctl = snd_asihpi_hpi_ioctl;
2796         hw->ops.release = snd_asihpi_hpi_release;
2797         hw->private_data = asihpi;
2798         return 0;
2799 }
2800
2801 /*------------------------------------------------------------
2802    CARD
2803  ------------------------------------------------------------*/
2804 static int snd_asihpi_probe(struct pci_dev *pci_dev,
2805                             const struct pci_device_id *pci_id)
2806 {
2807         int err;
2808         struct hpi_adapter *hpi;
2809         struct snd_card *card;
2810         struct snd_card_asihpi *asihpi;
2811
2812         u32 h_control;
2813         u32 h_stream;
2814         u32 adapter_index;
2815
2816         static int dev;
2817         if (dev >= SNDRV_CARDS)
2818                 return -ENODEV;
2819
2820         /* Should this be enable[hpi->index] ? */
2821         if (!enable[dev]) {
2822                 dev++;
2823                 return -ENOENT;
2824         }
2825
2826         /* Initialise low-level HPI driver */
2827         err = asihpi_adapter_probe(pci_dev, pci_id);
2828         if (err < 0)
2829                 return err;
2830
2831         hpi = pci_get_drvdata(pci_dev);
2832         adapter_index = hpi->adapter->index;
2833         /* first try to give the card the same index as its hardware index */
2834         err = snd_card_new(&pci_dev->dev, adapter_index, id[adapter_index],
2835                            THIS_MODULE, sizeof(struct snd_card_asihpi), &card);
2836         if (err < 0) {
2837                 /* if that fails, try the default index==next available */
2838                 err = snd_card_new(&pci_dev->dev, index[dev], id[dev],
2839                                    THIS_MODULE, sizeof(struct snd_card_asihpi),
2840                                    &card);
2841                 if (err < 0)
2842                         return err;
2843                 dev_warn(&pci_dev->dev, "Adapter index %d->ALSA index %d\n",
2844                         adapter_index, card->number);
2845         }
2846
2847         asihpi = card->private_data;
2848         asihpi->card = card;
2849         asihpi->pci = pci_dev;
2850         asihpi->hpi = hpi;
2851         hpi->snd_card = card;
2852
2853         err = hpi_adapter_get_property(adapter_index,
2854                 HPI_ADAPTER_PROPERTY_CAPS1,
2855                 NULL, &asihpi->support_grouping);
2856         if (err)
2857                 asihpi->support_grouping = 0;
2858
2859         err = hpi_adapter_get_property(adapter_index,
2860                 HPI_ADAPTER_PROPERTY_CAPS2,
2861                 &asihpi->support_mrx, NULL);
2862         if (err)
2863                 asihpi->support_mrx = 0;
2864
2865         err = hpi_adapter_get_property(adapter_index,
2866                 HPI_ADAPTER_PROPERTY_INTERVAL,
2867                 NULL, &asihpi->update_interval_frames);
2868         if (err)
2869                 asihpi->update_interval_frames = 512;
2870
2871         if (hpi->interrupt_mode) {
2872                 asihpi->pcm_start = snd_card_asihpi_pcm_int_start;
2873                 asihpi->pcm_stop = snd_card_asihpi_pcm_int_stop;
2874                 tasklet_setup(&asihpi->t, snd_card_asihpi_int_task);
2875                 hpi->interrupt_callback = snd_card_asihpi_isr;
2876         } else {
2877                 asihpi->pcm_start = snd_card_asihpi_pcm_timer_start;
2878                 asihpi->pcm_stop = snd_card_asihpi_pcm_timer_stop;
2879         }
2880
2881         hpi_handle_error(hpi_instream_open(adapter_index,
2882                              0, &h_stream));
2883
2884         err = hpi_instream_host_buffer_free(h_stream);
2885         asihpi->can_dma = (!err);
2886
2887         hpi_handle_error(hpi_instream_close(h_stream));
2888
2889         if (!asihpi->can_dma)
2890                 asihpi->update_interval_frames *= 2;
2891
2892         err = hpi_adapter_get_property(adapter_index,
2893                 HPI_ADAPTER_PROPERTY_CURCHANNELS,
2894                 &asihpi->in_max_chans, &asihpi->out_max_chans);
2895         if (err) {
2896                 asihpi->in_max_chans = 2;
2897                 asihpi->out_max_chans = 2;
2898         }
2899
2900         if (asihpi->out_max_chans > 2) { /* assume LL mode */
2901                 asihpi->out_min_chans = asihpi->out_max_chans;
2902                 asihpi->in_min_chans = asihpi->in_max_chans;
2903                 asihpi->support_grouping = 0;
2904         } else {
2905                 asihpi->out_min_chans = 1;
2906                 asihpi->in_min_chans = 1;
2907         }
2908
2909         dev_info(&pci_dev->dev, "Has dma:%d, grouping:%d, mrx:%d, uif:%d\n",
2910                         asihpi->can_dma,
2911                         asihpi->support_grouping,
2912                         asihpi->support_mrx,
2913                         asihpi->update_interval_frames
2914               );
2915
2916         err = snd_card_asihpi_pcm_new(asihpi, 0);
2917         if (err < 0) {
2918                 dev_err(&pci_dev->dev, "pcm_new failed\n");
2919                 goto __nodev;
2920         }
2921         err = snd_card_asihpi_mixer_new(asihpi);
2922         if (err < 0) {
2923                 dev_err(&pci_dev->dev, "mixer_new failed\n");
2924                 goto __nodev;
2925         }
2926
2927         err = hpi_mixer_get_control(asihpi->h_mixer,
2928                                   HPI_SOURCENODE_CLOCK_SOURCE, 0, 0, 0,
2929                                   HPI_CONTROL_SAMPLECLOCK, &h_control);
2930
2931         if (!err)
2932                 err = hpi_sample_clock_set_local_rate(
2933                         h_control, adapter_fs);
2934
2935         snd_asihpi_proc_init(asihpi);
2936
2937         /* always create, can be enabled or disabled dynamically
2938             by enable_hwdep  module param*/
2939         snd_asihpi_hpi_new(asihpi, 0);
2940
2941         strcpy(card->driver, "ASIHPI");
2942
2943         sprintf(card->shortname, "AudioScience ASI%4X",
2944                         asihpi->hpi->adapter->type);
2945         sprintf(card->longname, "%s %i",
2946                         card->shortname, adapter_index);
2947         err = snd_card_register(card);
2948
2949         if (!err) {
2950                 dev++;
2951                 return 0;
2952         }
2953 __nodev:
2954         snd_card_free(card);
2955         dev_err(&pci_dev->dev, "snd_asihpi_probe error %d\n", err);
2956         return err;
2957
2958 }
2959
2960 static void snd_asihpi_remove(struct pci_dev *pci_dev)
2961 {
2962         struct hpi_adapter *hpi = pci_get_drvdata(pci_dev);
2963         struct snd_card_asihpi *asihpi = hpi->snd_card->private_data;
2964
2965         /* Stop interrupts */
2966         if (hpi->interrupt_mode) {
2967                 hpi->interrupt_callback = NULL;
2968                 hpi_handle_error(hpi_adapter_set_property(hpi->adapter->index,
2969                         HPI_ADAPTER_PROPERTY_IRQ_RATE, 0, 0));
2970                 tasklet_kill(&asihpi->t);
2971         }
2972
2973         snd_card_free(hpi->snd_card);
2974         hpi->snd_card = NULL;
2975         asihpi_adapter_remove(pci_dev);
2976 }
2977
2978 static const struct pci_device_id asihpi_pci_tbl[] = {
2979         {HPI_PCI_VENDOR_ID_TI, HPI_PCI_DEV_ID_DSP6205,
2980                 HPI_PCI_VENDOR_ID_AUDIOSCIENCE, PCI_ANY_ID, 0, 0,
2981                 (kernel_ulong_t)HPI_6205},
2982         {HPI_PCI_VENDOR_ID_TI, HPI_PCI_DEV_ID_PCI2040,
2983                 HPI_PCI_VENDOR_ID_AUDIOSCIENCE, PCI_ANY_ID, 0, 0,
2984                 (kernel_ulong_t)HPI_6000},
2985         {0,}
2986 };
2987 MODULE_DEVICE_TABLE(pci, asihpi_pci_tbl);
2988
2989 static struct pci_driver driver = {
2990         .name = KBUILD_MODNAME,
2991         .id_table = asihpi_pci_tbl,
2992         .probe = snd_asihpi_probe,
2993         .remove = snd_asihpi_remove,
2994 };
2995
2996 static int __init snd_asihpi_init(void)
2997 {
2998         asihpi_init();
2999         return pci_register_driver(&driver);
3000 }
3001
3002 static void __exit snd_asihpi_exit(void)
3003 {
3004
3005         pci_unregister_driver(&driver);
3006         asihpi_exit();
3007 }
3008
3009 module_init(snd_asihpi_init)
3010 module_exit(snd_asihpi_exit)
3011