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