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