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