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