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