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