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