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