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