diff options
| author | Eliot Blennerhassett <eblennerhassett@audioscience.com> | 2011-02-09 23:25:59 -0500 |
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2011-02-10 12:48:51 -0500 |
| commit | e64b1a28c532009edd6a8a7b906c280fc2a4b90a (patch) | |
| tree | 4f1d11ca403c7f7cc6345a0e869881d6a122099c /sound/pci/asihpi/asihpi.c | |
| parent | 3285ea10e9b09d68da18d2f805980246ec53523a (diff) | |
ALSA: asihpi - Rewrite PCM timer function. Update control names.
Reported samples_played from card may be inaccurate, so don't use it.
Update control names to be closer to alsa standard practice.
Also fixed some accidentally lowercased strings.
[Removed adriver.h inclusion for external module builds by tiwai]
Signed-off-by: Eliot Blennerhassett <eblennerhassett@audioscience.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/asihpi/asihpi.c')
| -rw-r--r-- | sound/pci/asihpi/asihpi.c | 430 |
1 files changed, 203 insertions, 227 deletions
diff --git a/sound/pci/asihpi/asihpi.c b/sound/pci/asihpi/asihpi.c index c80b0b863c54..31d7295f5c71 100644 --- a/sound/pci/asihpi/asihpi.c +++ b/sound/pci/asihpi/asihpi.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | * would appreciate it if you grant us the right to use those modifications | 21 | * would appreciate it if you grant us the right to use those modifications |
| 22 | * for any purpose including commercial applications. | 22 | * for any purpose including commercial applications. |
| 23 | */ | 23 | */ |
| 24 | |||
| 24 | /* >0: print Hw params, timer vars. >1: print stream write/copy sizes */ | 25 | /* >0: print Hw params, timer vars. >1: print stream write/copy sizes */ |
| 25 | #define REALLY_VERBOSE_LOGGING 0 | 26 | #define REALLY_VERBOSE_LOGGING 0 |
| 26 | 27 | ||
| @@ -36,16 +37,12 @@ | |||
| 36 | #define VPRINTK2(...) | 37 | #define VPRINTK2(...) |
| 37 | #endif | 38 | #endif |
| 38 | 39 | ||
| 39 | #ifndef ASI_STYLE_NAMES | ||
| 40 | /* not sure how ALSA style name should look */ | ||
| 41 | #define ASI_STYLE_NAMES 1 | ||
| 42 | #endif | ||
| 43 | |||
| 44 | #include "hpi_internal.h" | 40 | #include "hpi_internal.h" |
| 45 | #include "hpimsginit.h" | 41 | #include "hpimsginit.h" |
| 46 | #include "hpioctl.h" | 42 | #include "hpioctl.h" |
| 47 | 43 | ||
| 48 | #include <linux/pci.h> | 44 | #include <linux/pci.h> |
| 45 | #include <linux/version.h> | ||
| 49 | #include <linux/init.h> | 46 | #include <linux/init.h> |
| 50 | #include <linux/jiffies.h> | 47 | #include <linux/jiffies.h> |
| 51 | #include <linux/slab.h> | 48 | #include <linux/slab.h> |
| @@ -85,11 +82,11 @@ MODULE_PARM_DESC(enable_hpi_hwdep, | |||
| 85 | 82 | ||
| 86 | /* identify driver */ | 83 | /* identify driver */ |
| 87 | #ifdef KERNEL_ALSA_BUILD | 84 | #ifdef KERNEL_ALSA_BUILD |
| 88 | static char *build_info = "built using headers from kernel source"; | 85 | static char *build_info = "Built using headers from kernel source"; |
| 89 | module_param(build_info, charp, S_IRUGO); | 86 | module_param(build_info, charp, S_IRUGO); |
| 90 | MODULE_PARM_DESC(build_info, "built using headers from kernel source"); | 87 | MODULE_PARM_DESC(build_info, "built using headers from kernel source"); |
| 91 | #else | 88 | #else |
| 92 | static char *build_info = "built within ALSA source"; | 89 | static char *build_info = "Built within ALSA source"; |
| 93 | module_param(build_info, charp, S_IRUGO); | 90 | module_param(build_info, charp, S_IRUGO); |
| 94 | MODULE_PARM_DESC(build_info, "built within ALSA source"); | 91 | MODULE_PARM_DESC(build_info, "built within ALSA source"); |
| 95 | #endif | 92 | #endif |
| @@ -104,7 +101,7 @@ static struct hpi_hsubsys *ss; /* handle to HPI audio subsystem */ | |||
| 104 | 101 | ||
| 105 | /* defaults */ | 102 | /* defaults */ |
| 106 | #define PERIODS_MIN 2 | 103 | #define PERIODS_MIN 2 |
| 107 | #define PERIOD_BYTES_MIN 2304 | 104 | #define PERIOD_BYTES_MIN 2048 |
| 108 | #define BUFFER_BYTES_MAX (512 * 1024) | 105 | #define BUFFER_BYTES_MAX (512 * 1024) |
| 109 | 106 | ||
| 110 | /*#define TIMER_MILLISECONDS 20 | 107 | /*#define TIMER_MILLISECONDS 20 |
| @@ -155,8 +152,9 @@ struct snd_card_asihpi_pcm { | |||
| 155 | unsigned int pcm_size; | 152 | unsigned int pcm_size; |
| 156 | unsigned int pcm_count; | 153 | unsigned int pcm_count; |
| 157 | unsigned int bytes_per_sec; | 154 | unsigned int bytes_per_sec; |
| 158 | unsigned int pcm_irq_pos; /* IRQ position */ | 155 | unsigned int pcm_buf_host_rw_ofs; /* Host R/W pos */ |
| 159 | unsigned int pcm_buf_pos; /* position in buffer */ | 156 | unsigned int pcm_buf_dma_ofs; /* DMA R/W offset in buffer */ |
| 157 | unsigned int pcm_buf_elapsed_dma_ofs; /* DMA R/W offset in buffer */ | ||
| 160 | struct snd_pcm_substream *substream; | 158 | struct snd_pcm_substream *substream; |
| 161 | u32 h_stream; | 159 | u32 h_stream; |
| 162 | struct hpi_format format; | 160 | struct hpi_format format; |
| @@ -244,14 +242,16 @@ static inline u16 hpi_stream_get_info_ex( | |||
| 244 | u32 *pauxiliary_data | 242 | u32 *pauxiliary_data |
| 245 | ) | 243 | ) |
| 246 | { | 244 | { |
| 245 | u16 e; | ||
| 247 | if (hpi_handle_object(h_stream) == HPI_OBJ_OSTREAM) | 246 | if (hpi_handle_object(h_stream) == HPI_OBJ_OSTREAM) |
| 248 | return hpi_outstream_get_info_ex(hS, h_stream, pw_state, | 247 | e = hpi_outstream_get_info_ex(hS, h_stream, pw_state, |
| 249 | pbuffer_size, pdata_in_buffer, | 248 | pbuffer_size, pdata_in_buffer, |
| 250 | psample_count, pauxiliary_data); | 249 | psample_count, pauxiliary_data); |
| 251 | else | 250 | else |
| 252 | return hpi_instream_get_info_ex(hS, h_stream, pw_state, | 251 | e = hpi_instream_get_info_ex(hS, h_stream, pw_state, |
| 253 | pbuffer_size, pdata_in_buffer, | 252 | pbuffer_size, pdata_in_buffer, |
| 254 | psample_count, pauxiliary_data); | 253 | psample_count, pauxiliary_data); |
| 254 | return e; | ||
| 255 | } | 255 | } |
| 256 | 256 | ||
| 257 | static inline u16 hpi_stream_group_add(struct hpi_hsubsys *hS, | 257 | static inline u16 hpi_stream_group_add(struct hpi_hsubsys *hS, |
| @@ -299,11 +299,11 @@ static void print_hwparams(struct snd_pcm_hw_params *p) | |||
| 299 | { | 299 | { |
| 300 | snd_printd("HWPARAMS \n"); | 300 | snd_printd("HWPARAMS \n"); |
| 301 | snd_printd("samplerate %d \n", params_rate(p)); | 301 | snd_printd("samplerate %d \n", params_rate(p)); |
| 302 | snd_printd("channels %d \n", params_channels(p)); | 302 | snd_printd("Channels %d \n", params_channels(p)); |
| 303 | snd_printd("format %d \n", params_format(p)); | 303 | snd_printd("Format %d \n", params_format(p)); |
| 304 | snd_printd("subformat %d \n", params_subformat(p)); | 304 | snd_printd("subformat %d \n", params_subformat(p)); |
| 305 | snd_printd("buffer bytes %d \n", params_buffer_bytes(p)); | 305 | snd_printd("Buffer bytes %d \n", params_buffer_bytes(p)); |
| 306 | snd_printd("period bytes %d \n", params_period_bytes(p)); | 306 | snd_printd("Period bytes %d \n", params_period_bytes(p)); |
| 307 | snd_printd("access %d \n", params_access(p)); | 307 | snd_printd("access %d \n", params_access(p)); |
| 308 | snd_printd("period_size %d \n", params_period_size(p)); | 308 | snd_printd("period_size %d \n", params_period_size(p)); |
| 309 | snd_printd("periods %d \n", params_periods(p)); | 309 | snd_printd("periods %d \n", params_periods(p)); |
| @@ -383,7 +383,7 @@ static void snd_card_asihpi_pcm_samplerates(struct snd_card_asihpi *asihpi, | |||
| 383 | HPI_CONTROL_SAMPLECLOCK, &h_control); | 383 | HPI_CONTROL_SAMPLECLOCK, &h_control); |
| 384 | if (err) { | 384 | if (err) { |
| 385 | snd_printk(KERN_ERR | 385 | snd_printk(KERN_ERR |
| 386 | "no local sampleclock, err %d\n", err); | 386 | "No local sampleclock, err %d\n", err); |
| 387 | } | 387 | } |
| 388 | 388 | ||
| 389 | for (idx = 0; idx < 100; idx++) { | 389 | for (idx = 0; idx < 100; idx++) { |
| @@ -391,7 +391,7 @@ static void snd_card_asihpi_pcm_samplerates(struct snd_card_asihpi *asihpi, | |||
| 391 | h_control, idx, &sample_rate)) { | 391 | h_control, idx, &sample_rate)) { |
| 392 | if (!idx) | 392 | if (!idx) |
| 393 | snd_printk(KERN_ERR | 393 | snd_printk(KERN_ERR |
| 394 | "local rate query failed\n"); | 394 | "Local rate query failed\n"); |
| 395 | 395 | ||
| 396 | break; | 396 | break; |
| 397 | } | 397 | } |
| @@ -525,11 +525,27 @@ static int snd_card_asihpi_pcm_hw_params(struct snd_pcm_substream *substream, | |||
| 525 | snd_printd(KERN_INFO "pcm_size=%d, pcm_count=%d, bps=%d\n", | 525 | snd_printd(KERN_INFO "pcm_size=%d, pcm_count=%d, bps=%d\n", |
| 526 | dpcm->pcm_size, dpcm->pcm_count, bytes_per_sec); | 526 | dpcm->pcm_size, dpcm->pcm_count, bytes_per_sec); |
| 527 | 527 | ||
| 528 | dpcm->pcm_irq_pos = 0; | ||
| 529 | dpcm->pcm_buf_pos = 0; | ||
| 530 | return 0; | 528 | return 0; |
| 531 | } | 529 | } |
| 532 | 530 | ||
| 531 | static int | ||
| 532 | snd_card_asihpi_hw_free(struct snd_pcm_substream *substream) | ||
| 533 | { | ||
| 534 | struct snd_pcm_runtime *runtime = substream->runtime; | ||
| 535 | struct snd_card_asihpi_pcm *dpcm = runtime->private_data; | ||
| 536 | if (dpcm->hpi_buffer_attached) | ||
| 537 | hpi_stream_host_buffer_detach(ss, dpcm->h_stream); | ||
| 538 | |||
| 539 | snd_pcm_lib_free_pages(substream); | ||
| 540 | return 0; | ||
| 541 | } | ||
| 542 | |||
| 543 | static void snd_card_asihpi_runtime_free(struct snd_pcm_runtime *runtime) | ||
| 544 | { | ||
| 545 | struct snd_card_asihpi_pcm *dpcm = runtime->private_data; | ||
| 546 | kfree(dpcm); | ||
| 547 | } | ||
| 548 | |||
| 533 | static void snd_card_asihpi_pcm_timer_start(struct snd_pcm_substream * | 549 | static void snd_card_asihpi_pcm_timer_start(struct snd_pcm_substream * |
| 534 | substream) | 550 | substream) |
| 535 | { | 551 | { |
| @@ -537,9 +553,8 @@ static void snd_card_asihpi_pcm_timer_start(struct snd_pcm_substream * | |||
| 537 | struct snd_card_asihpi_pcm *dpcm = runtime->private_data; | 553 | struct snd_card_asihpi_pcm *dpcm = runtime->private_data; |
| 538 | int expiry; | 554 | int expiry; |
| 539 | 555 | ||
| 540 | expiry = (dpcm->pcm_count * HZ / dpcm->bytes_per_sec); | 556 | expiry = HZ / 100;; //? (dpcm->pcm_count * HZ / dpcm->bytes_per_sec); |
| 541 | /* wait longer the first time, for samples to propagate */ | 557 | expiry = max(expiry, 1); /* don't let it be zero! */ |
| 542 | expiry = max(expiry, 20); | ||
| 543 | dpcm->timer.expires = jiffies + expiry; | 558 | dpcm->timer.expires = jiffies + expiry; |
| 544 | dpcm->respawn_timer = 1; | 559 | dpcm->respawn_timer = 1; |
| 545 | add_timer(&dpcm->timer); | 560 | add_timer(&dpcm->timer); |
| @@ -562,13 +577,13 @@ static int snd_card_asihpi_trigger(struct snd_pcm_substream *substream, | |||
| 562 | struct snd_pcm_substream *s; | 577 | struct snd_pcm_substream *s; |
| 563 | u16 e; | 578 | u16 e; |
| 564 | 579 | ||
| 565 | snd_printd("trigger %dstream %d\n", | 580 | snd_printd("Trigger %dstream %d\n", |
| 566 | substream->stream, substream->number); | 581 | substream->stream, substream->number); |
| 567 | switch (cmd) { | 582 | switch (cmd) { |
| 568 | case SNDRV_PCM_TRIGGER_START: | 583 | case SNDRV_PCM_TRIGGER_START: |
| 569 | snd_pcm_group_for_each_entry(s, substream) { | 584 | snd_pcm_group_for_each_entry(s, substream) { |
| 570 | struct snd_card_asihpi_pcm *ds; | 585 | struct snd_pcm_runtime *runtime = s->runtime; |
| 571 | ds = s->runtime->private_data; | 586 | struct snd_card_asihpi_pcm *ds = runtime->private_data; |
| 572 | 587 | ||
| 573 | if (snd_pcm_substream_chip(s) != card) | 588 | if (snd_pcm_substream_chip(s) != card) |
| 574 | continue; | 589 | continue; |
| @@ -576,17 +591,19 @@ static int snd_card_asihpi_trigger(struct snd_pcm_substream *substream, | |||
| 576 | if ((s->stream == SNDRV_PCM_STREAM_PLAYBACK) && | 591 | if ((s->stream == SNDRV_PCM_STREAM_PLAYBACK) && |
| 577 | (card->support_mmap)) { | 592 | (card->support_mmap)) { |
| 578 | /* How do I know how much valid data is present | 593 | /* How do I know how much valid data is present |
| 579 | * in buffer? Just guessing 2 periods, but if | 594 | * in buffer? Must be at least one period! |
| 595 | * Guessing 2 periods, but if | ||
| 580 | * buffer is bigger it may contain even more | 596 | * buffer is bigger it may contain even more |
| 581 | * data?? | 597 | * data?? |
| 582 | */ | 598 | */ |
| 583 | unsigned int preload = ds->pcm_count * 2; | 599 | unsigned int preload = ds->pcm_count * 1; |
| 584 | VPRINTK2("preload %d\n", preload); | 600 | VPRINTK2("Preload x%x\n", preload); |
| 585 | hpi_handle_error(hpi_outstream_write_buf( | 601 | hpi_handle_error(hpi_outstream_write_buf( |
| 586 | ss, ds->h_stream, | 602 | ss, ds->h_stream, |
| 587 | &s->runtime->dma_area[0], | 603 | &runtime->dma_area[0], |
| 588 | preload, | 604 | preload, |
| 589 | &ds->format)); | 605 | &ds->format)); |
| 606 | ds->pcm_buf_host_rw_ofs = preload; | ||
| 590 | } | 607 | } |
| 591 | 608 | ||
| 592 | if (card->support_grouping) { | 609 | if (card->support_grouping) { |
| @@ -604,7 +621,7 @@ static int snd_card_asihpi_trigger(struct snd_pcm_substream *substream, | |||
| 604 | } else | 621 | } else |
| 605 | break; | 622 | break; |
| 606 | } | 623 | } |
| 607 | snd_printd("start\n"); | 624 | snd_printd("Start\n"); |
| 608 | /* start the master stream */ | 625 | /* start the master stream */ |
| 609 | snd_card_asihpi_pcm_timer_start(substream); | 626 | snd_card_asihpi_pcm_timer_start(substream); |
| 610 | hpi_handle_error(hpi_stream_start(ss, dpcm->h_stream)); | 627 | hpi_handle_error(hpi_stream_start(ss, dpcm->h_stream)); |
| @@ -627,7 +644,7 @@ static int snd_card_asihpi_trigger(struct snd_pcm_substream *substream, | |||
| 627 | } else | 644 | } else |
| 628 | break; | 645 | break; |
| 629 | } | 646 | } |
| 630 | snd_printd("stop\n"); | 647 | snd_printd("Stop\n"); |
| 631 | 648 | ||
| 632 | /* _prepare and _hwparams reset the stream */ | 649 | /* _prepare and _hwparams reset the stream */ |
| 633 | hpi_handle_error(hpi_stream_stop(ss, dpcm->h_stream)); | 650 | hpi_handle_error(hpi_stream_stop(ss, dpcm->h_stream)); |
| @@ -641,12 +658,12 @@ static int snd_card_asihpi_trigger(struct snd_pcm_substream *substream, | |||
| 641 | break; | 658 | break; |
| 642 | 659 | ||
| 643 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: | 660 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: |
| 644 | snd_printd("pause release\n"); | 661 | snd_printd("Pause release\n"); |
| 645 | hpi_handle_error(hpi_stream_start(ss, dpcm->h_stream)); | 662 | hpi_handle_error(hpi_stream_start(ss, dpcm->h_stream)); |
| 646 | snd_card_asihpi_pcm_timer_start(substream); | 663 | snd_card_asihpi_pcm_timer_start(substream); |
| 647 | break; | 664 | break; |
| 648 | case SNDRV_PCM_TRIGGER_PAUSE_PUSH: | 665 | case SNDRV_PCM_TRIGGER_PAUSE_PUSH: |
| 649 | snd_printd("pause\n"); | 666 | snd_printd("Pause\n"); |
| 650 | snd_card_asihpi_pcm_timer_stop(substream); | 667 | snd_card_asihpi_pcm_timer_stop(substream); |
| 651 | hpi_handle_error(hpi_stream_stop(ss, dpcm->h_stream)); | 668 | hpi_handle_error(hpi_stream_stop(ss, dpcm->h_stream)); |
| 652 | break; | 669 | break; |
| @@ -658,38 +675,20 @@ static int snd_card_asihpi_trigger(struct snd_pcm_substream *substream, | |||
| 658 | return 0; | 675 | return 0; |
| 659 | } | 676 | } |
| 660 | 677 | ||
| 661 | static int | ||
| 662 | snd_card_asihpi_hw_free(struct snd_pcm_substream *substream) | ||
| 663 | { | ||
| 664 | struct snd_pcm_runtime *runtime = substream->runtime; | ||
| 665 | struct snd_card_asihpi_pcm *dpcm = runtime->private_data; | ||
| 666 | if (dpcm->hpi_buffer_attached) | ||
| 667 | hpi_stream_host_buffer_detach(ss, dpcm->h_stream); | ||
| 668 | |||
| 669 | snd_pcm_lib_free_pages(substream); | ||
| 670 | return 0; | ||
| 671 | } | ||
| 672 | |||
| 673 | static void snd_card_asihpi_runtime_free(struct snd_pcm_runtime *runtime) | ||
| 674 | { | ||
| 675 | struct snd_card_asihpi_pcm *dpcm = runtime->private_data; | ||
| 676 | kfree(dpcm); | ||
| 677 | } | ||
| 678 | |||
| 679 | /*algorithm outline | 678 | /*algorithm outline |
| 680 | Without linking degenerates to getting single stream pos etc | 679 | Without linking degenerates to getting single stream pos etc |
| 681 | Without mmap 2nd loop degenerates to snd_pcm_period_elapsed | 680 | Without mmap 2nd loop degenerates to snd_pcm_period_elapsed |
| 682 | */ | 681 | */ |
| 683 | /* | 682 | /* |
| 684 | buf_pos=get_buf_pos(s); | 683 | pcm_buf_dma_ofs=get_buf_pos(s); |
| 685 | for_each_linked_stream(s) { | 684 | for_each_linked_stream(s) { |
| 686 | buf_pos=get_buf_pos(s); | 685 | pcm_buf_dma_ofs=get_buf_pos(s); |
| 687 | min_buf_pos = modulo_min(min_buf_pos, buf_pos, pcm_size) | 686 | min_buf_pos = modulo_min(min_buf_pos, pcm_buf_dma_ofs, pcm_size) |
| 688 | new_data = min(new_data, calc_new_data(buf_pos,irq_pos) | 687 | new_data = min(new_data, calc_new_data(pcm_buf_dma_ofs,irq_pos) |
| 689 | } | 688 | } |
| 690 | timer.expires = jiffies + predict_next_period_ready(min_buf_pos); | 689 | timer.expires = jiffies + predict_next_period_ready(min_buf_pos); |
| 691 | for_each_linked_stream(s) { | 690 | for_each_linked_stream(s) { |
| 692 | s->buf_pos = min_buf_pos; | 691 | s->pcm_buf_dma_ofs = min_buf_pos; |
| 693 | if (new_data > pcm_count) { | 692 | if (new_data > pcm_count) { |
| 694 | if (mmap) { | 693 | if (mmap) { |
| 695 | irq_pos = (irq_pos + pcm_count) % pcm_size; | 694 | irq_pos = (irq_pos + pcm_count) % pcm_size; |
| @@ -728,11 +727,11 @@ static void snd_card_asihpi_timer_function(unsigned long data) | |||
| 728 | struct snd_pcm_runtime *runtime; | 727 | struct snd_pcm_runtime *runtime; |
| 729 | struct snd_pcm_substream *s; | 728 | struct snd_pcm_substream *s; |
| 730 | unsigned int newdata = 0; | 729 | unsigned int newdata = 0; |
| 731 | unsigned int buf_pos, min_buf_pos = 0; | 730 | unsigned int pcm_buf_dma_ofs, min_buf_pos = 0; |
| 732 | unsigned int remdata, xfercount, next_jiffies; | 731 | unsigned int remdata, xfercount, next_jiffies; |
| 733 | int first = 1; | 732 | int first = 1; |
| 734 | u16 state; | 733 | u16 state; |
| 735 | u32 buffer_size, data_avail, samples_played, aux; | 734 | u32 buffer_size, bytes_avail, samples_played, on_card_bytes; |
| 736 | 735 | ||
| 737 | /* find minimum newdata and buffer pos in group */ | 736 | /* find minimum newdata and buffer pos in group */ |
| 738 | snd_pcm_group_for_each_entry(s, dpcm->substream) { | 737 | snd_pcm_group_for_each_entry(s, dpcm->substream) { |
| @@ -744,35 +743,34 @@ static void snd_card_asihpi_timer_function(unsigned long data) | |||
| 744 | 743 | ||
| 745 | hpi_handle_error(hpi_stream_get_info_ex(ss, | 744 | hpi_handle_error(hpi_stream_get_info_ex(ss, |
| 746 | ds->h_stream, &state, | 745 | ds->h_stream, &state, |
| 747 | &buffer_size, &data_avail, | 746 | &buffer_size, &bytes_avail, |
| 748 | &samples_played, &aux)); | 747 | &samples_played, &on_card_bytes)); |
| 749 | 748 | ||
| 750 | /* number of bytes in on-card buffer */ | 749 | /* number of bytes in on-card buffer */ |
| 751 | runtime->delay = aux; | 750 | runtime->delay = on_card_bytes; |
| 752 | 751 | ||
| 753 | if (state == HPI_STATE_DRAINED) { | 752 | if (state == HPI_STATE_DRAINED) { |
| 754 | snd_printd(KERN_WARNING "outstream %d drained\n", | 753 | snd_printd(KERN_WARNING "outstream %d drained\n", |
| 755 | s->number); | 754 | s->number); |
| 756 | snd_pcm_stop(s, SNDRV_PCM_STATE_XRUN); | 755 | //snd_pcm_stop(s, SNDRV_PCM_STATE_XRUN); |
| 757 | return; | 756 | //return; |
| 758 | } | 757 | } |
| 759 | 758 | ||
| 760 | if (s->stream == SNDRV_PCM_STREAM_PLAYBACK) { | 759 | if (s->stream == SNDRV_PCM_STREAM_PLAYBACK) |
| 761 | buf_pos = frames_to_bytes(runtime, samples_played); | 760 | pcm_buf_dma_ofs = ds->pcm_buf_host_rw_ofs - bytes_avail; |
| 762 | } else { | 761 | else |
| 763 | buf_pos = data_avail + ds->pcm_irq_pos; | 762 | pcm_buf_dma_ofs = bytes_avail + ds->pcm_buf_host_rw_ofs; |
| 764 | } | ||
| 765 | 763 | ||
| 766 | if (first) { | 764 | if (first) { |
| 767 | /* can't statically init min when wrap is involved */ | 765 | /* can't statically init min when wrap is involved */ |
| 768 | min_buf_pos = buf_pos; | 766 | min_buf_pos = pcm_buf_dma_ofs; |
| 769 | newdata = (buf_pos - ds->pcm_irq_pos) % ds->pcm_size; | 767 | newdata = (pcm_buf_dma_ofs - ds->pcm_buf_elapsed_dma_ofs) % ds->pcm_size; |
| 770 | first = 0; | 768 | first = 0; |
| 771 | } else { | 769 | } else { |
| 772 | min_buf_pos = | 770 | min_buf_pos = |
| 773 | modulo_min(min_buf_pos, buf_pos, UINT_MAX+1L); | 771 | modulo_min(min_buf_pos, pcm_buf_dma_ofs, UINT_MAX+1L); |
| 774 | newdata = min( | 772 | newdata = min( |
| 775 | (buf_pos - ds->pcm_irq_pos) % ds->pcm_size, | 773 | (pcm_buf_dma_ofs - ds->pcm_buf_elapsed_dma_ofs) % ds->pcm_size, |
| 776 | newdata); | 774 | newdata); |
| 777 | } | 775 | } |
| 778 | 776 | ||
| @@ -781,29 +779,40 @@ static void snd_card_asihpi_timer_function(unsigned long data) | |||
| 781 | runtime->status->hw_ptr), | 779 | runtime->status->hw_ptr), |
| 782 | (unsigned long)frames_to_bytes(runtime, | 780 | (unsigned long)frames_to_bytes(runtime, |
| 783 | runtime->control->appl_ptr)); | 781 | runtime->control->appl_ptr)); |
| 782 | |||
| 784 | VPRINTK1("%d S=%d, irq=%04X, pos=x%04X, left=x%04X," | 783 | VPRINTK1("%d S=%d, irq=%04X, pos=x%04X, left=x%04X," |
| 785 | " aux=x%04X space=x%04X\n", s->number, | 784 | " aux=x%04X space=x%04X\n", s->number, |
| 786 | state, ds->pcm_irq_pos, buf_pos, (int)data_avail, | 785 | state, ds->pcm_buf_host_rw_ofs, pcm_buf_dma_ofs, (int)bytes_avail, |
| 787 | (int)aux, buffer_size-data_avail); | 786 | (int)on_card_bytes, buffer_size-bytes_avail); |
| 788 | } | 787 | } |
| 788 | pcm_buf_dma_ofs = min_buf_pos; | ||
| 789 | 789 | ||
| 790 | remdata = newdata % dpcm->pcm_count; | 790 | remdata = newdata % dpcm->pcm_count; |
| 791 | xfercount = newdata - remdata; /* a multiple of pcm_count */ | 791 | xfercount = newdata - remdata; /* a multiple of pcm_count */ |
| 792 | next_jiffies = ((dpcm->pcm_count-remdata) * HZ / dpcm->bytes_per_sec)+1; | 792 | /* come back when on_card_bytes has decreased enough to allow |
| 793 | next_jiffies = max(next_jiffies, 2U * HZ / 1000U); | 793 | write to happen, or when data has been consumed to make another |
| 794 | period | ||
| 795 | */ | ||
| 796 | if (xfercount && (on_card_bytes > dpcm->pcm_count)) | ||
| 797 | next_jiffies = ((on_card_bytes - dpcm->pcm_count) * HZ / dpcm->bytes_per_sec); | ||
| 798 | else | ||
| 799 | next_jiffies = ((dpcm->pcm_count - remdata) * HZ / dpcm->bytes_per_sec); | ||
| 800 | |||
| 801 | next_jiffies = max(next_jiffies, 1U); | ||
| 794 | dpcm->timer.expires = jiffies + next_jiffies; | 802 | dpcm->timer.expires = jiffies + next_jiffies; |
| 795 | VPRINTK1("jif %d buf pos x%04X newdata x%04X xc x%04X\n", | 803 | VPRINTK1("jif %d buf pos x%04X newdata x%04X xfer x%04X\n", |
| 796 | next_jiffies, min_buf_pos, newdata, xfercount); | 804 | next_jiffies, pcm_buf_dma_ofs, newdata, xfercount); |
| 805 | |||
| 797 | 806 | ||
| 798 | snd_pcm_group_for_each_entry(s, dpcm->substream) { | 807 | snd_pcm_group_for_each_entry(s, dpcm->substream) { |
| 799 | struct snd_card_asihpi_pcm *ds = s->runtime->private_data; | 808 | struct snd_card_asihpi_pcm *ds = s->runtime->private_data; |
| 800 | ds->pcm_buf_pos = min_buf_pos; | ||
| 801 | 809 | ||
| 802 | if (xfercount) { | 810 | ds->pcm_buf_dma_ofs = pcm_buf_dma_ofs; |
| 811 | |||
| 812 | if (xfercount && (on_card_bytes <= ds->pcm_count)) { | ||
| 803 | if (card->support_mmap) { | 813 | if (card->support_mmap) { |
| 804 | ds->pcm_irq_pos = ds->pcm_irq_pos + xfercount; | ||
| 805 | if (s->stream == SNDRV_PCM_STREAM_PLAYBACK) { | 814 | if (s->stream == SNDRV_PCM_STREAM_PLAYBACK) { |
| 806 | VPRINTK2("write OS%d x%04x\n", | 815 | VPRINTK2("Write OS%d x%04x\n", |
| 807 | s->number, | 816 | s->number, |
| 808 | ds->pcm_count); | 817 | ds->pcm_count); |
| 809 | hpi_handle_error( | 818 | hpi_handle_error( |
| @@ -814,15 +823,17 @@ static void snd_card_asihpi_timer_function(unsigned long data) | |||
| 814 | xfercount, | 823 | xfercount, |
| 815 | &ds->format)); | 824 | &ds->format)); |
| 816 | } else { | 825 | } else { |
| 817 | VPRINTK2("read IS%d x%04x\n", | 826 | VPRINTK2("Read IS%d x%04x\n", |
| 818 | s->number, | 827 | s->number, |
| 819 | dpcm->pcm_count); | 828 | xfercount); |
| 820 | hpi_handle_error( | 829 | hpi_handle_error( |
| 821 | hpi_instream_read_buf( | 830 | hpi_instream_read_buf( |
| 822 | ss, ds->h_stream, | 831 | ss, ds->h_stream, |
| 823 | NULL, xfercount)); | 832 | NULL, xfercount)); |
| 824 | } | 833 | } |
| 834 | ds->pcm_buf_host_rw_ofs = ds->pcm_buf_host_rw_ofs + xfercount; | ||
| 825 | } /* else R/W will be handled by read/write callbacks */ | 835 | } /* else R/W will be handled by read/write callbacks */ |
| 836 | ds->pcm_buf_elapsed_dma_ofs = pcm_buf_dma_ofs; | ||
| 826 | snd_pcm_period_elapsed(s); | 837 | snd_pcm_period_elapsed(s); |
| 827 | } | 838 | } |
| 828 | } | 839 | } |
| @@ -848,9 +859,9 @@ static int snd_card_asihpi_playback_prepare(struct snd_pcm_substream * | |||
| 848 | snd_printd(KERN_INFO "playback prepare %d\n", substream->number); | 859 | snd_printd(KERN_INFO "playback prepare %d\n", substream->number); |
| 849 | 860 | ||
| 850 | hpi_handle_error(hpi_outstream_reset(ss, dpcm->h_stream)); | 861 | hpi_handle_error(hpi_outstream_reset(ss, dpcm->h_stream)); |
| 851 | dpcm->pcm_irq_pos = 0; | 862 | dpcm->pcm_buf_host_rw_ofs = 0; |
| 852 | dpcm->pcm_buf_pos = 0; | 863 | dpcm->pcm_buf_dma_ofs = 0; |
| 853 | 864 | dpcm->pcm_buf_elapsed_dma_ofs = 0; | |
| 854 | return 0; | 865 | return 0; |
| 855 | } | 866 | } |
| 856 | 867 | ||
| @@ -861,27 +872,8 @@ snd_card_asihpi_playback_pointer(struct snd_pcm_substream *substream) | |||
| 861 | struct snd_card_asihpi_pcm *dpcm = runtime->private_data; | 872 | struct snd_card_asihpi_pcm *dpcm = runtime->private_data; |
| 862 | snd_pcm_uframes_t ptr; | 873 | snd_pcm_uframes_t ptr; |
| 863 | 874 | ||
| 864 | u32 samples_played; | 875 | ptr = bytes_to_frames(runtime, dpcm->pcm_buf_dma_ofs % dpcm->pcm_size); |
| 865 | u16 err; | 876 | //VPRINTK2("playback_pointer=x%04lx\n", (unsigned long)ptr); |
| 866 | |||
| 867 | if (!snd_pcm_stream_linked(substream)) { | ||
| 868 | /* NOTE, can use samples played for playback position here and | ||
| 869 | * in timer fn because it LAGS the actual read pointer, and is a | ||
| 870 | * better representation of actual playout position | ||
| 871 | */ | ||
| 872 | err = hpi_outstream_get_info_ex(ss, dpcm->h_stream, NULL, | ||
| 873 | NULL, NULL, | ||
| 874 | &samples_played, NULL); | ||
| 875 | hpi_handle_error(err); | ||
| 876 | |||
| 877 | dpcm->pcm_buf_pos = frames_to_bytes(runtime, samples_played); | ||
| 878 | } | ||
| 879 | /* else must return most conservative value found in timer func | ||
| 880 | * by looping over all streams | ||
| 881 | */ | ||
| 882 | |||
| 883 | ptr = bytes_to_frames(runtime, dpcm->pcm_buf_pos % dpcm->pcm_size); | ||
| 884 | VPRINTK2("playback_pointer=%04ld\n", (unsigned long)ptr); | ||
| 885 | return ptr; | 877 | return ptr; |
| 886 | } | 878 | } |
| 887 | 879 | ||
| @@ -998,7 +990,7 @@ static int snd_card_asihpi_playback_open(struct snd_pcm_substream *substream) | |||
| 998 | snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, | 990 | snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, |
| 999 | card->update_interval_frames); | 991 | card->update_interval_frames); |
| 1000 | snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, | 992 | snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, |
| 1001 | card->update_interval_frames * 4, UINT_MAX); | 993 | card->update_interval_frames * 2, UINT_MAX); |
| 1002 | 994 | ||
| 1003 | snd_pcm_set_sync(substream); | 995 | snd_pcm_set_sync(substream); |
| 1004 | 996 | ||
| @@ -1039,6 +1031,8 @@ static int snd_card_asihpi_playback_copy(struct snd_pcm_substream *substream, | |||
| 1039 | hpi_handle_error(hpi_outstream_write_buf(ss, dpcm->h_stream, | 1031 | hpi_handle_error(hpi_outstream_write_buf(ss, dpcm->h_stream, |
| 1040 | runtime->dma_area, len, &dpcm->format)); | 1032 | runtime->dma_area, len, &dpcm->format)); |
| 1041 | 1033 | ||
| 1034 | dpcm->pcm_buf_host_rw_ofs = dpcm->pcm_buf_host_rw_ofs + len; | ||
| 1035 | |||
| 1042 | return 0; | 1036 | return 0; |
| 1043 | } | 1037 | } |
| 1044 | 1038 | ||
| @@ -1091,13 +1085,13 @@ snd_card_asihpi_capture_pointer(struct snd_pcm_substream *substream) | |||
| 1091 | struct snd_pcm_runtime *runtime = substream->runtime; | 1085 | struct snd_pcm_runtime *runtime = substream->runtime; |
| 1092 | struct snd_card_asihpi_pcm *dpcm = runtime->private_data; | 1086 | struct snd_card_asihpi_pcm *dpcm = runtime->private_data; |
| 1093 | 1087 | ||
| 1094 | VPRINTK2("capture pointer %d=%d\n", | 1088 | VPRINTK2("Capture pointer %d=%d\n", |
| 1095 | substream->number, dpcm->pcm_buf_pos); | 1089 | substream->number, dpcm->pcm_buf_dma_ofs); |
| 1096 | /* NOTE Unlike playback can't use actual dwSamplesPlayed | 1090 | /* NOTE Unlike playback can't use actual samples_played |
| 1097 | for the capture position, because those samples aren't yet in | 1091 | for the capture position, because those samples aren't yet in |
| 1098 | the local buffer available for reading. | 1092 | the local buffer available for reading. |
| 1099 | */ | 1093 | */ |
| 1100 | return bytes_to_frames(runtime, dpcm->pcm_buf_pos % dpcm->pcm_size); | 1094 | return bytes_to_frames(runtime, dpcm->pcm_buf_dma_ofs % dpcm->pcm_size); |
| 1101 | } | 1095 | } |
| 1102 | 1096 | ||
| 1103 | static int snd_card_asihpi_capture_ioctl(struct snd_pcm_substream *substream, | 1097 | static int snd_card_asihpi_capture_ioctl(struct snd_pcm_substream *substream, |
| @@ -1112,10 +1106,11 @@ static int snd_card_asihpi_capture_prepare(struct snd_pcm_substream *substream) | |||
| 1112 | struct snd_card_asihpi_pcm *dpcm = runtime->private_data; | 1106 | struct snd_card_asihpi_pcm *dpcm = runtime->private_data; |
| 1113 | 1107 | ||
| 1114 | hpi_handle_error(hpi_instream_reset(ss, dpcm->h_stream)); | 1108 | hpi_handle_error(hpi_instream_reset(ss, dpcm->h_stream)); |
| 1115 | dpcm->pcm_irq_pos = 0; | 1109 | dpcm->pcm_buf_host_rw_ofs = 0; |
| 1116 | dpcm->pcm_buf_pos = 0; | 1110 | dpcm->pcm_buf_dma_ofs = 0; |
| 1111 | dpcm->pcm_buf_elapsed_dma_ofs = 0; | ||
| 1117 | 1112 | ||
| 1118 | snd_printd("capture prepare %d\n", substream->number); | 1113 | snd_printd("Capture Prepare %d\n", substream->number); |
| 1119 | return 0; | 1114 | return 0; |
| 1120 | } | 1115 | } |
| 1121 | 1116 | ||
| @@ -1209,6 +1204,9 @@ static int snd_card_asihpi_capture_open(struct snd_pcm_substream *substream) | |||
| 1209 | snd_card_asihpi_capture.info |= SNDRV_PCM_INFO_MMAP | | 1204 | snd_card_asihpi_capture.info |= SNDRV_PCM_INFO_MMAP | |
| 1210 | SNDRV_PCM_INFO_MMAP_VALID; | 1205 | SNDRV_PCM_INFO_MMAP_VALID; |
| 1211 | 1206 | ||
| 1207 | if (card->support_grouping) | ||
| 1208 | snd_card_asihpi_capture.info |= SNDRV_PCM_INFO_SYNC_START; | ||
| 1209 | |||
| 1212 | runtime->hw = snd_card_asihpi_capture; | 1210 | runtime->hw = snd_card_asihpi_capture; |
| 1213 | 1211 | ||
| 1214 | if (card->support_mmap) | 1212 | if (card->support_mmap) |
| @@ -1241,18 +1239,17 @@ static int snd_card_asihpi_capture_copy(struct snd_pcm_substream *substream, | |||
| 1241 | { | 1239 | { |
| 1242 | struct snd_pcm_runtime *runtime = substream->runtime; | 1240 | struct snd_pcm_runtime *runtime = substream->runtime; |
| 1243 | struct snd_card_asihpi_pcm *dpcm = runtime->private_data; | 1241 | struct snd_card_asihpi_pcm *dpcm = runtime->private_data; |
| 1244 | u32 data_size; | 1242 | u32 len; |
| 1245 | 1243 | ||
| 1246 | data_size = frames_to_bytes(runtime, count); | 1244 | len = frames_to_bytes(runtime, count); |
| 1247 | 1245 | ||
| 1248 | VPRINTK2("capture copy%d %d bytes\n", substream->number, data_size); | 1246 | VPRINTK2("Capture copy%d %d bytes\n", substream->number, len); |
| 1249 | hpi_handle_error(hpi_instream_read_buf(ss, dpcm->h_stream, | 1247 | hpi_handle_error(hpi_instream_read_buf(ss, dpcm->h_stream, |
| 1250 | runtime->dma_area, data_size)); | 1248 | runtime->dma_area, len)); |
| 1251 | 1249 | ||
| 1252 | /* Used by capture_pointer */ | 1250 | dpcm->pcm_buf_host_rw_ofs = dpcm->pcm_buf_host_rw_ofs + len; |
| 1253 | dpcm->pcm_irq_pos = dpcm->pcm_irq_pos + data_size; | ||
| 1254 | 1251 | ||
| 1255 | if (copy_to_user(dst, runtime->dma_area, data_size)) | 1252 | if (copy_to_user(dst, runtime->dma_area, len)) |
| 1256 | return -EFAULT; | 1253 | return -EFAULT; |
| 1257 | 1254 | ||
| 1258 | return 0; | 1255 | return 0; |
| @@ -1287,7 +1284,7 @@ static int __devinit snd_card_asihpi_pcm_new(struct snd_card_asihpi *asihpi, | |||
| 1287 | struct snd_pcm *pcm; | 1284 | struct snd_pcm *pcm; |
| 1288 | int err; | 1285 | int err; |
| 1289 | 1286 | ||
| 1290 | err = snd_pcm_new(asihpi->card, "asihpi PCM", device, | 1287 | err = snd_pcm_new(asihpi->card, "Asihpi PCM", device, |
| 1291 | asihpi->num_outstreams, asihpi->num_instreams, | 1288 | asihpi->num_outstreams, asihpi->num_instreams, |
| 1292 | &pcm); | 1289 | &pcm); |
| 1293 | if (err < 0) | 1290 | if (err < 0) |
| @@ -1307,7 +1304,7 @@ static int __devinit snd_card_asihpi_pcm_new(struct snd_card_asihpi *asihpi, | |||
| 1307 | 1304 | ||
| 1308 | pcm->private_data = asihpi; | 1305 | pcm->private_data = asihpi; |
| 1309 | pcm->info_flags = 0; | 1306 | pcm->info_flags = 0; |
| 1310 | strcpy(pcm->name, "asihpi PCM"); | 1307 | strcpy(pcm->name, "Asihpi PCM"); |
| 1311 | 1308 | ||
| 1312 | /*? do we want to emulate MMAP for non-BBM cards? | 1309 | /*? do we want to emulate MMAP for non-BBM cards? |
| 1313 | Jack doesn't work with ALSAs MMAP emulation - WHY NOT? */ | 1310 | Jack doesn't work with ALSAs MMAP emulation - WHY NOT? */ |
| @@ -1330,7 +1327,7 @@ struct hpi_control { | |||
| 1330 | char name[44]; /* copied to snd_ctl_elem_id.name[44]; */ | 1327 | char name[44]; /* copied to snd_ctl_elem_id.name[44]; */ |
| 1331 | }; | 1328 | }; |
| 1332 | 1329 | ||
| 1333 | static char *asihpi_tuner_band_names[] = | 1330 | static const char * const asihpi_tuner_band_names[] = |
| 1334 | { | 1331 | { |
| 1335 | "invalid", | 1332 | "invalid", |
| 1336 | "AM", | 1333 | "AM", |
| @@ -1349,70 +1346,38 @@ compile_time_assert( | |||
| 1349 | (HPI_TUNER_BAND_LAST+1)), | 1346 | (HPI_TUNER_BAND_LAST+1)), |
| 1350 | assert_tuner_band_names_size); | 1347 | assert_tuner_band_names_size); |
| 1351 | 1348 | ||
| 1352 | #if ASI_STYLE_NAMES | 1349 | static const char * const asihpi_src_names[] = |
| 1353 | static char *asihpi_src_names[] = | ||
| 1354 | { | 1350 | { |
| 1355 | "no source", | 1351 | "no source", |
| 1356 | "outstream", | 1352 | "PCM", |
| 1357 | "line_in", | 1353 | "Line", |
| 1358 | "aes_in", | 1354 | "Digital", |
| 1359 | "tuner", | 1355 | "Tuner", |
| 1360 | "RF", | 1356 | "RF", |
| 1361 | "clock", | 1357 | "Clock", |
| 1362 | "bitstr", | 1358 | "Bitstream", |
| 1363 | "mic", | 1359 | "Microphone", |
| 1364 | "cobranet", | 1360 | "Cobranet", |
| 1365 | "analog_in", | 1361 | "Analog", |
| 1366 | "adapter", | 1362 | "Adapter", |
| 1367 | }; | 1363 | }; |
| 1368 | #else | ||
| 1369 | static char *asihpi_src_names[] = | ||
| 1370 | { | ||
| 1371 | "no source", | ||
| 1372 | "PCM playback", | ||
| 1373 | "line in", | ||
| 1374 | "digital in", | ||
| 1375 | "tuner", | ||
| 1376 | "RF", | ||
| 1377 | "clock", | ||
| 1378 | "bitstream", | ||
| 1379 | "mic", | ||
| 1380 | "cobranet in", | ||
| 1381 | "analog in", | ||
| 1382 | "adapter", | ||
| 1383 | }; | ||
| 1384 | #endif | ||
| 1385 | 1364 | ||
| 1386 | compile_time_assert( | 1365 | compile_time_assert( |
| 1387 | (ARRAY_SIZE(asihpi_src_names) == | 1366 | (ARRAY_SIZE(asihpi_src_names) == |
| 1388 | (HPI_SOURCENODE_LAST_INDEX-HPI_SOURCENODE_NONE+1)), | 1367 | (HPI_SOURCENODE_LAST_INDEX-HPI_SOURCENODE_NONE+1)), |
| 1389 | assert_src_names_size); | 1368 | assert_src_names_size); |
| 1390 | 1369 | ||
| 1391 | #if ASI_STYLE_NAMES | 1370 | static const char * const asihpi_dst_names[] = |
| 1392 | static char *asihpi_dst_names[] = | ||
| 1393 | { | ||
| 1394 | "no destination", | ||
| 1395 | "instream", | ||
| 1396 | "line_out", | ||
| 1397 | "aes_out", | ||
| 1398 | "RF", | ||
| 1399 | "speaker" , | ||
| 1400 | "cobranet", | ||
| 1401 | "analog_out", | ||
| 1402 | }; | ||
| 1403 | #else | ||
| 1404 | static char *asihpi_dst_names[] = | ||
| 1405 | { | 1371 | { |
| 1406 | "no destination", | 1372 | "no destination", |
| 1407 | "PCM capture", | 1373 | "PCM", |
| 1408 | "line out", | 1374 | "Line", |
| 1409 | "digital out", | 1375 | "Digital", |
| 1410 | "RF", | 1376 | "RF", |
| 1411 | "speaker", | 1377 | "Speaker", |
| 1412 | "cobranet out", | 1378 | "Cobranet Out", |
| 1413 | "analog out" | 1379 | "Analog" |
| 1414 | }; | 1380 | }; |
| 1415 | #endif | ||
| 1416 | 1381 | ||
| 1417 | compile_time_assert( | 1382 | compile_time_assert( |
| 1418 | (ARRAY_SIZE(asihpi_dst_names) == | 1383 | (ARRAY_SIZE(asihpi_dst_names) == |
| @@ -1438,30 +1403,43 @@ static void asihpi_ctl_init(struct snd_kcontrol_new *snd_control, | |||
| 1438 | struct hpi_control *hpi_ctl, | 1403 | struct hpi_control *hpi_ctl, |
| 1439 | char *name) | 1404 | char *name) |
| 1440 | { | 1405 | { |
| 1406 | char *dir = ""; | ||
| 1441 | memset(snd_control, 0, sizeof(*snd_control)); | 1407 | memset(snd_control, 0, sizeof(*snd_control)); |
| 1442 | snd_control->name = hpi_ctl->name; | 1408 | snd_control->name = hpi_ctl->name; |
| 1443 | snd_control->private_value = hpi_ctl->h_control; | 1409 | snd_control->private_value = hpi_ctl->h_control; |
| 1444 | snd_control->iface = SNDRV_CTL_ELEM_IFACE_MIXER; | 1410 | snd_control->iface = SNDRV_CTL_ELEM_IFACE_MIXER; |
| 1445 | snd_control->index = 0; | 1411 | snd_control->index = 0; |
| 1446 | 1412 | ||
| 1413 | if (hpi_ctl->dst_node_type + HPI_DESTNODE_NONE == HPI_DESTNODE_ISTREAM) | ||
| 1414 | dir = "Capture "; /* On or towards a PCM capture destination*/ | ||
| 1415 | else if ((hpi_ctl->src_node_type + HPI_SOURCENODE_NONE != HPI_SOURCENODE_OSTREAM) && | ||
| 1416 | (!hpi_ctl->dst_node_type)) | ||
| 1417 | dir = "Capture "; /* On a source node that is not PCM playback */ | ||
| 1418 | else if ((hpi_ctl->src_node_type + HPI_SOURCENODE_NONE != HPI_SOURCENODE_OSTREAM) && | ||
| 1419 | (hpi_ctl->dst_node_type)) | ||
| 1420 | dir = "Monitor Playback "; /* Between an input and an output */ | ||
| 1421 | else | ||
| 1422 | dir = "Playback "; /* PCM Playback source, or output node */ | ||
| 1423 | |||
| 1447 | if (hpi_ctl->src_node_type && hpi_ctl->dst_node_type) | 1424 | if (hpi_ctl->src_node_type && hpi_ctl->dst_node_type) |
| 1448 | sprintf(hpi_ctl->name, "%s%d to %s%d %s", | 1425 | sprintf(hpi_ctl->name, "%s%d %s%d %s%s", |
| 1449 | asihpi_src_names[hpi_ctl->src_node_type], | 1426 | asihpi_src_names[hpi_ctl->src_node_type], |
| 1450 | hpi_ctl->src_node_index, | 1427 | hpi_ctl->src_node_index, |
| 1451 | asihpi_dst_names[hpi_ctl->dst_node_type], | 1428 | asihpi_dst_names[hpi_ctl->dst_node_type], |
| 1452 | hpi_ctl->dst_node_index, | 1429 | hpi_ctl->dst_node_index, |
| 1453 | name); | 1430 | dir, name); |
| 1454 | else if (hpi_ctl->dst_node_type) { | 1431 | else if (hpi_ctl->dst_node_type) { |
| 1455 | sprintf(hpi_ctl->name, "%s%d %s", | 1432 | sprintf(hpi_ctl->name, "%s %d %s%s", |
| 1456 | asihpi_dst_names[hpi_ctl->dst_node_type], | 1433 | asihpi_dst_names[hpi_ctl->dst_node_type], |
| 1457 | hpi_ctl->dst_node_index, | 1434 | hpi_ctl->dst_node_index, |
| 1458 | name); | 1435 | dir, name); |
| 1459 | } else { | 1436 | } else { |
| 1460 | sprintf(hpi_ctl->name, "%s%d %s", | 1437 | sprintf(hpi_ctl->name, "%s %d %s%s", |
| 1461 | asihpi_src_names[hpi_ctl->src_node_type], | 1438 | asihpi_src_names[hpi_ctl->src_node_type], |
| 1462 | hpi_ctl->src_node_index, | 1439 | hpi_ctl->src_node_index, |
| 1463 | name); | 1440 | dir, name); |
| 1464 | } | 1441 | } |
| 1442 | // printk(KERN_INFO "adding %s %d to %d ", hpi_ctl->name, hpi_ctl->src_node_type, hpi_ctl->dst_node_type); | ||
| 1465 | } | 1443 | } |
| 1466 | 1444 | ||
| 1467 | /*------------------------------------------------------------ | 1445 | /*------------------------------------------------------------ |
| @@ -1534,7 +1512,7 @@ static int __devinit snd_asihpi_volume_add(struct snd_card_asihpi *asihpi, | |||
| 1534 | struct snd_card *card = asihpi->card; | 1512 | struct snd_card *card = asihpi->card; |
| 1535 | struct snd_kcontrol_new snd_control; | 1513 | struct snd_kcontrol_new snd_control; |
| 1536 | 1514 | ||
| 1537 | asihpi_ctl_init(&snd_control, hpi_ctl, "volume"); | 1515 | asihpi_ctl_init(&snd_control, hpi_ctl, "Volume"); |
| 1538 | snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE | | 1516 | snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE | |
| 1539 | SNDRV_CTL_ELEM_ACCESS_TLV_READ; | 1517 | SNDRV_CTL_ELEM_ACCESS_TLV_READ; |
| 1540 | snd_control.info = snd_asihpi_volume_info; | 1518 | snd_control.info = snd_asihpi_volume_info; |
| @@ -1617,7 +1595,7 @@ static int __devinit snd_asihpi_level_add(struct snd_card_asihpi *asihpi, | |||
| 1617 | struct snd_kcontrol_new snd_control; | 1595 | struct snd_kcontrol_new snd_control; |
| 1618 | 1596 | ||
| 1619 | /* can't use 'volume' cos some nodes have volume as well */ | 1597 | /* can't use 'volume' cos some nodes have volume as well */ |
| 1620 | asihpi_ctl_init(&snd_control, hpi_ctl, "level"); | 1598 | asihpi_ctl_init(&snd_control, hpi_ctl, "Level"); |
| 1621 | snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE | | 1599 | snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE | |
| 1622 | SNDRV_CTL_ELEM_ACCESS_TLV_READ; | 1600 | SNDRV_CTL_ELEM_ACCESS_TLV_READ; |
| 1623 | snd_control.info = snd_asihpi_level_info; | 1601 | snd_control.info = snd_asihpi_level_info; |
| @@ -1633,7 +1611,7 @@ static int __devinit snd_asihpi_level_add(struct snd_card_asihpi *asihpi, | |||
| 1633 | ------------------------------------------------------------*/ | 1611 | ------------------------------------------------------------*/ |
| 1634 | 1612 | ||
| 1635 | /* AESEBU format */ | 1613 | /* AESEBU format */ |
| 1636 | static char *asihpi_aesebu_format_names[] = | 1614 | static const char * const asihpi_aesebu_format_names[] = |
| 1637 | { | 1615 | { |
| 1638 | "N/A", | 1616 | "N/A", |
| 1639 | "S/PDIF", | 1617 | "S/PDIF", |
| @@ -1742,7 +1720,7 @@ static int __devinit snd_asihpi_aesebu_rx_add(struct snd_card_asihpi *asihpi, | |||
| 1742 | struct snd_card *card = asihpi->card; | 1720 | struct snd_card *card = asihpi->card; |
| 1743 | struct snd_kcontrol_new snd_control; | 1721 | struct snd_kcontrol_new snd_control; |
| 1744 | 1722 | ||
| 1745 | asihpi_ctl_init(&snd_control, hpi_ctl, "format"); | 1723 | asihpi_ctl_init(&snd_control, hpi_ctl, "Format"); |
| 1746 | snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE; | 1724 | snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE; |
| 1747 | snd_control.info = snd_asihpi_aesebu_format_info; | 1725 | snd_control.info = snd_asihpi_aesebu_format_info; |
| 1748 | snd_control.get = snd_asihpi_aesebu_rx_format_get; | 1726 | snd_control.get = snd_asihpi_aesebu_rx_format_get; |
| @@ -1752,7 +1730,7 @@ static int __devinit snd_asihpi_aesebu_rx_add(struct snd_card_asihpi *asihpi, | |||
| 1752 | if (ctl_add(card, &snd_control, asihpi) < 0) | 1730 | if (ctl_add(card, &snd_control, asihpi) < 0) |
| 1753 | return -EINVAL; | 1731 | return -EINVAL; |
| 1754 | 1732 | ||
| 1755 | asihpi_ctl_init(&snd_control, hpi_ctl, "status"); | 1733 | asihpi_ctl_init(&snd_control, hpi_ctl, "Status"); |
| 1756 | snd_control.access = | 1734 | snd_control.access = |
| 1757 | SNDRV_CTL_ELEM_ACCESS_VOLATILE | SNDRV_CTL_ELEM_ACCESS_READ; | 1735 | SNDRV_CTL_ELEM_ACCESS_VOLATILE | SNDRV_CTL_ELEM_ACCESS_READ; |
| 1758 | snd_control.info = snd_asihpi_aesebu_rxstatus_info; | 1736 | snd_control.info = snd_asihpi_aesebu_rxstatus_info; |
| @@ -1780,7 +1758,7 @@ static int __devinit snd_asihpi_aesebu_tx_add(struct snd_card_asihpi *asihpi, | |||
| 1780 | struct snd_card *card = asihpi->card; | 1758 | struct snd_card *card = asihpi->card; |
| 1781 | struct snd_kcontrol_new snd_control; | 1759 | struct snd_kcontrol_new snd_control; |
| 1782 | 1760 | ||
| 1783 | asihpi_ctl_init(&snd_control, hpi_ctl, "format"); | 1761 | asihpi_ctl_init(&snd_control, hpi_ctl, "Format"); |
| 1784 | snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE; | 1762 | snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE; |
| 1785 | snd_control.info = snd_asihpi_aesebu_format_info; | 1763 | snd_control.info = snd_asihpi_aesebu_format_info; |
| 1786 | snd_control.get = snd_asihpi_aesebu_tx_format_get; | 1764 | snd_control.get = snd_asihpi_aesebu_tx_format_get; |
| @@ -2027,7 +2005,7 @@ static int __devinit snd_asihpi_tuner_add(struct snd_card_asihpi *asihpi, | |||
| 2027 | snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE; | 2005 | snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE; |
| 2028 | 2006 | ||
| 2029 | if (!hpi_tuner_get_gain(ss, hpi_ctl->h_control, NULL)) { | 2007 | if (!hpi_tuner_get_gain(ss, hpi_ctl->h_control, NULL)) { |
| 2030 | asihpi_ctl_init(&snd_control, hpi_ctl, "gain"); | 2008 | asihpi_ctl_init(&snd_control, hpi_ctl, "Gain"); |
| 2031 | snd_control.info = snd_asihpi_tuner_gain_info; | 2009 | snd_control.info = snd_asihpi_tuner_gain_info; |
| 2032 | snd_control.get = snd_asihpi_tuner_gain_get; | 2010 | snd_control.get = snd_asihpi_tuner_gain_get; |
| 2033 | snd_control.put = snd_asihpi_tuner_gain_put; | 2011 | snd_control.put = snd_asihpi_tuner_gain_put; |
| @@ -2036,7 +2014,7 @@ static int __devinit snd_asihpi_tuner_add(struct snd_card_asihpi *asihpi, | |||
| 2036 | return -EINVAL; | 2014 | return -EINVAL; |
| 2037 | } | 2015 | } |
| 2038 | 2016 | ||
| 2039 | asihpi_ctl_init(&snd_control, hpi_ctl, "band"); | 2017 | asihpi_ctl_init(&snd_control, hpi_ctl, "Band"); |
| 2040 | snd_control.info = snd_asihpi_tuner_band_info; | 2018 | snd_control.info = snd_asihpi_tuner_band_info; |
| 2041 | snd_control.get = snd_asihpi_tuner_band_get; | 2019 | snd_control.get = snd_asihpi_tuner_band_get; |
| 2042 | snd_control.put = snd_asihpi_tuner_band_put; | 2020 | snd_control.put = snd_asihpi_tuner_band_put; |
| @@ -2044,7 +2022,7 @@ static int __devinit snd_asihpi_tuner_add(struct snd_card_asihpi *asihpi, | |||
| 2044 | if (ctl_add(card, &snd_control, asihpi) < 0) | 2022 | if (ctl_add(card, &snd_control, asihpi) < 0) |
| 2045 | return -EINVAL; | 2023 | return -EINVAL; |
| 2046 | 2024 | ||
| 2047 | asihpi_ctl_init(&snd_control, hpi_ctl, "freq"); | 2025 | asihpi_ctl_init(&snd_control, hpi_ctl, "Freq"); |
| 2048 | snd_control.info = snd_asihpi_tuner_freq_info; | 2026 | snd_control.info = snd_asihpi_tuner_freq_info; |
| 2049 | snd_control.get = snd_asihpi_tuner_freq_get; | 2027 | snd_control.get = snd_asihpi_tuner_freq_get; |
| 2050 | snd_control.put = snd_asihpi_tuner_freq_put; | 2028 | snd_control.put = snd_asihpi_tuner_freq_put; |
| @@ -2120,7 +2098,7 @@ static int __devinit snd_asihpi_meter_add(struct snd_card_asihpi *asihpi, | |||
| 2120 | struct snd_card *card = asihpi->card; | 2098 | struct snd_card *card = asihpi->card; |
| 2121 | struct snd_kcontrol_new snd_control; | 2099 | struct snd_kcontrol_new snd_control; |
| 2122 | 2100 | ||
| 2123 | asihpi_ctl_init(&snd_control, hpi_ctl, "meter"); | 2101 | asihpi_ctl_init(&snd_control, hpi_ctl, "Meter"); |
| 2124 | snd_control.access = | 2102 | snd_control.access = |
| 2125 | SNDRV_CTL_ELEM_ACCESS_VOLATILE | SNDRV_CTL_ELEM_ACCESS_READ; | 2103 | SNDRV_CTL_ELEM_ACCESS_VOLATILE | SNDRV_CTL_ELEM_ACCESS_READ; |
| 2126 | snd_control.info = snd_asihpi_meter_info; | 2104 | snd_control.info = snd_asihpi_meter_info; |
| @@ -2201,7 +2179,7 @@ static int snd_asihpi_mux_get(struct snd_kcontrol *kcontrol, | |||
| 2201 | } | 2179 | } |
| 2202 | } | 2180 | } |
| 2203 | snd_printd(KERN_WARNING | 2181 | snd_printd(KERN_WARNING |
| 2204 | "control %x failed to match mux source %hu %hu\n", | 2182 | "Control %x failed to match mux source %hu %hu\n", |
| 2205 | h_control, source_type, source_index); | 2183 | h_control, source_type, source_index); |
| 2206 | ucontrol->value.enumerated.item[0] = 0; | 2184 | ucontrol->value.enumerated.item[0] = 0; |
| 2207 | return 0; | 2185 | return 0; |
| @@ -2234,11 +2212,7 @@ static int __devinit snd_asihpi_mux_add(struct snd_card_asihpi *asihpi, | |||
| 2234 | struct snd_card *card = asihpi->card; | 2212 | struct snd_card *card = asihpi->card; |
| 2235 | struct snd_kcontrol_new snd_control; | 2213 | struct snd_kcontrol_new snd_control; |
| 2236 | 2214 | ||
| 2237 | #if ASI_STYLE_NAMES | 2215 | asihpi_ctl_init(&snd_control, hpi_ctl, "Route"); |
| 2238 | asihpi_ctl_init(&snd_control, hpi_ctl, "multiplexer"); | ||
| 2239 | #else | ||
| 2240 | asihpi_ctl_init(&snd_control, hpi_ctl, "route"); | ||
| 2241 | #endif | ||
| 2242 | snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE; | 2216 | snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE; |
| 2243 | snd_control.info = snd_asihpi_mux_info; | 2217 | snd_control.info = snd_asihpi_mux_info; |
| 2244 | snd_control.get = snd_asihpi_mux_get; | 2218 | snd_control.get = snd_asihpi_mux_get; |
| @@ -2254,33 +2228,38 @@ static int __devinit snd_asihpi_mux_add(struct snd_card_asihpi *asihpi, | |||
| 2254 | static int snd_asihpi_cmode_info(struct snd_kcontrol *kcontrol, | 2228 | static int snd_asihpi_cmode_info(struct snd_kcontrol *kcontrol, |
| 2255 | struct snd_ctl_elem_info *uinfo) | 2229 | struct snd_ctl_elem_info *uinfo) |
| 2256 | { | 2230 | { |
| 2257 | static char *mode_names[HPI_CHANNEL_MODE_LAST] = { | 2231 | static const char * const mode_names[HPI_CHANNEL_MODE_LAST + 1] = { |
| 2258 | "normal", "swap", | 2232 | "invalid", |
| 2259 | "from_left", "from_right", | 2233 | "Normal", "Swap", |
| 2260 | "to_left", "to_right" | 2234 | "From Left", "From Right", |
| 2235 | "To Left", "To Right" | ||
| 2261 | }; | 2236 | }; |
| 2262 | 2237 | ||
| 2263 | u32 h_control = kcontrol->private_value; | 2238 | u32 h_control = kcontrol->private_value; |
| 2264 | u16 mode; | 2239 | u16 mode; |
| 2265 | int i; | 2240 | int i; |
| 2241 | u16 mode_map[6]; | ||
| 2242 | int valid_modes = 0; | ||
| 2266 | 2243 | ||
| 2267 | /* HPI channel mode values can be from 1 to 6 | 2244 | /* HPI channel mode values can be from 1 to 6 |
| 2268 | Some adapters only support a contiguous subset | 2245 | Some adapters only support a contiguous subset |
| 2269 | */ | 2246 | */ |
| 2270 | for (i = 0; i < HPI_CHANNEL_MODE_LAST; i++) | 2247 | for (i = 0; i < HPI_CHANNEL_MODE_LAST; i++) |
| 2271 | if (hpi_channel_mode_query_mode( | 2248 | if (!hpi_channel_mode_query_mode( |
| 2272 | ss, h_control, i, &mode)) | 2249 | ss, h_control, i, &mode)) { |
| 2273 | break; | 2250 | mode_map[valid_modes] = mode; |
| 2251 | valid_modes++; | ||
| 2252 | } | ||
| 2274 | 2253 | ||
| 2275 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; | 2254 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; |
| 2276 | uinfo->count = 1; | 2255 | uinfo->count = 1; |
| 2277 | uinfo->value.enumerated.items = i; | 2256 | uinfo->value.enumerated.items = valid_modes; |
| 2278 | 2257 | ||
| 2279 | if (uinfo->value.enumerated.item >= i) | 2258 | if (uinfo->value.enumerated.item >= valid_modes) |
| 2280 | uinfo->value.enumerated.item = i - 1; | 2259 | uinfo->value.enumerated.item = valid_modes - 1; |
| 2281 | 2260 | ||
| 2282 | strcpy(uinfo->value.enumerated.name, | 2261 | strcpy(uinfo->value.enumerated.name, |
| 2283 | mode_names[uinfo->value.enumerated.item]); | 2262 | mode_names[mode_map[uinfo->value.enumerated.item]]); |
| 2284 | 2263 | ||
| 2285 | return 0; | 2264 | return 0; |
| 2286 | } | 2265 | } |
| @@ -2319,7 +2298,7 @@ static int __devinit snd_asihpi_cmode_add(struct snd_card_asihpi *asihpi, | |||
| 2319 | struct snd_card *card = asihpi->card; | 2298 | struct snd_card *card = asihpi->card; |
| 2320 | struct snd_kcontrol_new snd_control; | 2299 | struct snd_kcontrol_new snd_control; |
| 2321 | 2300 | ||
| 2322 | asihpi_ctl_init(&snd_control, hpi_ctl, "channel mode"); | 2301 | asihpi_ctl_init(&snd_control, hpi_ctl, "Mode"); |
| 2323 | snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE; | 2302 | snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE; |
| 2324 | snd_control.info = snd_asihpi_cmode_info; | 2303 | snd_control.info = snd_asihpi_cmode_info; |
| 2325 | snd_control.get = snd_asihpi_cmode_get; | 2304 | snd_control.get = snd_asihpi_cmode_get; |
| @@ -2331,15 +2310,12 @@ static int __devinit snd_asihpi_cmode_add(struct snd_card_asihpi *asihpi, | |||
| 2331 | /*------------------------------------------------------------ | 2310 | /*------------------------------------------------------------ |
| 2332 | Sampleclock source controls | 2311 | Sampleclock source controls |
| 2333 | ------------------------------------------------------------*/ | 2312 | ------------------------------------------------------------*/ |
| 2334 | |||
| 2335 | static char *sampleclock_sources[MAX_CLOCKSOURCES] = | 2313 | static char *sampleclock_sources[MAX_CLOCKSOURCES] = |
| 2336 | { "N/A", "local PLL", "AES/EBU sync", "word external", "word header", | 2314 | { "N/A", "Local PLL", "Digital Sync", "Word External", "Word Header", |
| 2337 | "SMPTE", "AES/EBU in1", "auto", "network", "invalid", | 2315 | "SMPTE", "Digital1", "Auto", "Network", "Invalid", |
| 2338 | "prev module", | 2316 | "Prev Module", |
| 2339 | "AES/EBU in2", "AES/EBU in3", "AES/EBU in4", "AES/EBU in5", | 2317 | "Digital2", "Digital3", "Digital4", "Digital5", |
| 2340 | "AES/EBU in6", "AES/EBU in7", "AES/EBU in8"}; | 2318 | "Digital6", "Digital7", "Digital8"}; |
| 2341 | |||
| 2342 | |||
| 2343 | 2319 | ||
| 2344 | static int snd_asihpi_clksrc_info(struct snd_kcontrol *kcontrol, | 2320 | static int snd_asihpi_clksrc_info(struct snd_kcontrol *kcontrol, |
| 2345 | struct snd_ctl_elem_info *uinfo) | 2321 | struct snd_ctl_elem_info *uinfo) |
| @@ -2528,7 +2504,7 @@ static int __devinit snd_asihpi_sampleclock_add(struct snd_card_asihpi *asihpi, | |||
| 2528 | } | 2504 | } |
| 2529 | clkcache->count = i; | 2505 | clkcache->count = i; |
| 2530 | 2506 | ||
| 2531 | asihpi_ctl_init(&snd_control, hpi_ctl, "source"); | 2507 | asihpi_ctl_init(&snd_control, hpi_ctl, "Source"); |
| 2532 | snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE ; | 2508 | snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE ; |
| 2533 | snd_control.info = snd_asihpi_clksrc_info; | 2509 | snd_control.info = snd_asihpi_clksrc_info; |
| 2534 | snd_control.get = snd_asihpi_clksrc_get; | 2510 | snd_control.get = snd_asihpi_clksrc_get; |
| @@ -2538,7 +2514,7 @@ static int __devinit snd_asihpi_sampleclock_add(struct snd_card_asihpi *asihpi, | |||
| 2538 | 2514 | ||
| 2539 | 2515 | ||
| 2540 | if (clkcache->has_local) { | 2516 | if (clkcache->has_local) { |
| 2541 | asihpi_ctl_init(&snd_control, hpi_ctl, "local_rate"); | 2517 | asihpi_ctl_init(&snd_control, hpi_ctl, "Localrate"); |
| 2542 | snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE ; | 2518 | snd_control.access = SNDRV_CTL_ELEM_ACCESS_READWRITE ; |
| 2543 | snd_control.info = snd_asihpi_clklocal_info; | 2519 | snd_control.info = snd_asihpi_clklocal_info; |
| 2544 | snd_control.get = snd_asihpi_clklocal_get; | 2520 | snd_control.get = snd_asihpi_clklocal_get; |
| @@ -2549,7 +2525,7 @@ static int __devinit snd_asihpi_sampleclock_add(struct snd_card_asihpi *asihpi, | |||
| 2549 | return -EINVAL; | 2525 | return -EINVAL; |
| 2550 | } | 2526 | } |
| 2551 | 2527 | ||
| 2552 | asihpi_ctl_init(&snd_control, hpi_ctl, "rate"); | 2528 | asihpi_ctl_init(&snd_control, hpi_ctl, "Rate"); |
| 2553 | snd_control.access = | 2529 | snd_control.access = |
| 2554 | SNDRV_CTL_ELEM_ACCESS_VOLATILE | SNDRV_CTL_ELEM_ACCESS_READ; | 2530 | SNDRV_CTL_ELEM_ACCESS_VOLATILE | SNDRV_CTL_ELEM_ACCESS_READ; |
| 2555 | snd_control.info = snd_asihpi_clkrate_info; | 2531 | snd_control.info = snd_asihpi_clkrate_info; |
| @@ -2571,7 +2547,7 @@ static int __devinit snd_card_asihpi_mixer_new(struct snd_card_asihpi *asihpi) | |||
| 2571 | 2547 | ||
| 2572 | if (snd_BUG_ON(!asihpi)) | 2548 | if (snd_BUG_ON(!asihpi)) |
| 2573 | return -EINVAL; | 2549 | return -EINVAL; |
| 2574 | strcpy(card->mixername, "asihpi mixer"); | 2550 | strcpy(card->mixername, "Asihpi Mixer"); |
| 2575 | 2551 | ||
| 2576 | err = | 2552 | err = |
| 2577 | hpi_mixer_open(ss, asihpi->adapter_index, | 2553 | hpi_mixer_open(ss, asihpi->adapter_index, |
| @@ -2597,7 +2573,7 @@ static int __devinit snd_card_asihpi_mixer_new(struct snd_card_asihpi *asihpi) | |||
| 2597 | if (err == HPI_ERROR_CONTROL_DISABLED) { | 2573 | if (err == HPI_ERROR_CONTROL_DISABLED) { |
| 2598 | if (mixer_dump) | 2574 | if (mixer_dump) |
| 2599 | snd_printk(KERN_INFO | 2575 | snd_printk(KERN_INFO |
| 2600 | "disabled HPI control(%d)\n", | 2576 | "Disabled HPI Control(%d)\n", |
| 2601 | idx); | 2577 | idx); |
| 2602 | continue; | 2578 | continue; |
| 2603 | } else | 2579 | } else |
| @@ -2662,7 +2638,7 @@ static int __devinit snd_card_asihpi_mixer_new(struct snd_card_asihpi *asihpi) | |||
| 2662 | default: | 2638 | default: |
| 2663 | if (mixer_dump) | 2639 | if (mixer_dump) |
| 2664 | snd_printk(KERN_INFO | 2640 | snd_printk(KERN_INFO |
| 2665 | "untranslated HPI control" | 2641 | "Untranslated HPI Control" |
| 2666 | "(%d) %d %d %d %d %d\n", | 2642 | "(%d) %d %d %d %d %d\n", |
| 2667 | idx, | 2643 | idx, |
| 2668 | hpi_ctl.control_type, | 2644 | hpi_ctl.control_type, |
| @@ -2841,7 +2817,7 @@ static int __devinit snd_asihpi_probe(struct pci_dev *pci_dev, | |||
| 2841 | if (err < 0) | 2817 | if (err < 0) |
| 2842 | return err; | 2818 | return err; |
| 2843 | snd_printk(KERN_WARNING | 2819 | snd_printk(KERN_WARNING |
| 2844 | "**** WARNING **** adapter index %d->ALSA index %d\n", | 2820 | "**** WARNING **** Adapter index %d->ALSA index %d\n", |
| 2845 | hpi_card->index, card->number); | 2821 | hpi_card->index, card->number); |
| 2846 | } | 2822 | } |
| 2847 | 2823 | ||
| @@ -2859,7 +2835,7 @@ static int __devinit snd_asihpi_probe(struct pci_dev *pci_dev, | |||
| 2859 | version = asihpi->version; | 2835 | version = asihpi->version; |
| 2860 | snd_printk(KERN_INFO "adapter ID=%4X index=%d num_outstreams=%d " | 2836 | snd_printk(KERN_INFO "adapter ID=%4X index=%d num_outstreams=%d " |
| 2861 | "num_instreams=%d S/N=%d\n" | 2837 | "num_instreams=%d S/N=%d\n" |
| 2862 | "hw version %c%d DSP code version %03d\n", | 2838 | "Hw Version %c%d DSP code version %03d\n", |
| 2863 | asihpi->type, asihpi->adapter_index, | 2839 | asihpi->type, asihpi->adapter_index, |
| 2864 | asihpi->num_outstreams, | 2840 | asihpi->num_outstreams, |
| 2865 | asihpi->num_instreams, asihpi->serial_number, | 2841 | asihpi->num_instreams, asihpi->serial_number, |
