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