aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/pci/echoaudio/echoaudio.c153
-rw-r--r--sound/pci/echoaudio/echoaudio.h2
-rw-r--r--sound/pci/echoaudio/echoaudio_dsp.c145
3 files changed, 222 insertions, 78 deletions
diff --git a/sound/pci/echoaudio/echoaudio.c b/sound/pci/echoaudio/echoaudio.c
index 79dde9592847..2783ce6c236e 100644
--- a/sound/pci/echoaudio/echoaudio.c
+++ b/sound/pci/echoaudio/echoaudio.c
@@ -753,6 +753,8 @@ static int pcm_trigger(struct snd_pcm_substream *substream, int cmd)
753 753
754 spin_lock(&chip->lock); 754 spin_lock(&chip->lock);
755 switch (cmd) { 755 switch (cmd) {
756 case SNDRV_PCM_TRIGGER_RESUME:
757 DE_ACT(("pcm_trigger resume\n"));
756 case SNDRV_PCM_TRIGGER_START: 758 case SNDRV_PCM_TRIGGER_START:
757 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: 759 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
758 DE_ACT(("pcm_trigger start\n")); 760 DE_ACT(("pcm_trigger start\n"));
@@ -776,6 +778,8 @@ static int pcm_trigger(struct snd_pcm_substream *substream, int cmd)
776 err = start_transport(chip, channelmask, 778 err = start_transport(chip, channelmask,
777 chip->pipe_cyclic_mask); 779 chip->pipe_cyclic_mask);
778 break; 780 break;
781 case SNDRV_PCM_TRIGGER_SUSPEND:
782 DE_ACT(("pcm_trigger suspend\n"));
779 case SNDRV_PCM_TRIGGER_STOP: 783 case SNDRV_PCM_TRIGGER_STOP:
780 DE_ACT(("pcm_trigger stop\n")); 784 DE_ACT(("pcm_trigger stop\n"));
781 for (i = 0; i < DSP_MAXPIPES; i++) { 785 for (i = 0; i < DSP_MAXPIPES; i++) {
@@ -1951,18 +1955,27 @@ static __devinit int snd_echo_create(struct snd_card *card,
1951 return err; 1955 return err;
1952 pci_set_master(pci); 1956 pci_set_master(pci);
1953 1957
1954 /* allocate a chip-specific data */ 1958 /* Allocate chip if needed */
1955 chip = kzalloc(sizeof(*chip), GFP_KERNEL); 1959 if (!*rchip) {
1956 if (!chip) { 1960 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
1957 pci_disable_device(pci); 1961 if (!chip) {
1958 return -ENOMEM; 1962 pci_disable_device(pci);
1963 return -ENOMEM;
1964 }
1965 DE_INIT(("chip=%p\n", chip));
1966 spin_lock_init(&chip->lock);
1967 chip->card = card;
1968 chip->pci = pci;
1969 chip->irq = -1;
1970 atomic_set(&chip->opencount, 0);
1971 mutex_init(&chip->mode_mutex);
1972 chip->can_set_rate = 1;
1973 } else {
1974 /* If this was called from the resume function, chip is
1975 * already allocated and it contains current card settings.
1976 */
1977 chip = *rchip;
1959 } 1978 }
1960 DE_INIT(("chip=%p\n", chip));
1961
1962 spin_lock_init(&chip->lock);
1963 chip->card = card;
1964 chip->pci = pci;
1965 chip->irq = -1;
1966 1979
1967 /* PCI resource allocation */ 1980 /* PCI resource allocation */
1968 chip->dsp_registers_phys = pci_resource_start(pci, 0); 1981 chip->dsp_registers_phys = pci_resource_start(pci, 0);
@@ -2002,7 +2015,9 @@ static __devinit int snd_echo_create(struct snd_card *card,
2002 chip->comm_page = (struct comm_page *)chip->commpage_dma_buf.area; 2015 chip->comm_page = (struct comm_page *)chip->commpage_dma_buf.area;
2003 2016
2004 err = init_hw(chip, chip->pci->device, chip->pci->subsystem_device); 2017 err = init_hw(chip, chip->pci->device, chip->pci->subsystem_device);
2005 if (err) { 2018 if (err >= 0)
2019 err = set_mixer_defaults(chip);
2020 if (err < 0) {
2006 DE_INIT(("init_hw err=%d\n", err)); 2021 DE_INIT(("init_hw err=%d\n", err));
2007 snd_echo_free(chip); 2022 snd_echo_free(chip);
2008 return err; 2023 return err;
@@ -2013,9 +2028,6 @@ static __devinit int snd_echo_create(struct snd_card *card,
2013 snd_echo_free(chip); 2028 snd_echo_free(chip);
2014 return err; 2029 return err;
2015 } 2030 }
2016 atomic_set(&chip->opencount, 0);
2017 mutex_init(&chip->mode_mutex);
2018 chip->can_set_rate = 1;
2019 *rchip = chip; 2031 *rchip = chip;
2020 /* Init done ! */ 2032 /* Init done ! */
2021 return 0; 2033 return 0;
@@ -2048,6 +2060,7 @@ static int __devinit snd_echo_probe(struct pci_dev *pci,
2048 2060
2049 snd_card_set_dev(card, &pci->dev); 2061 snd_card_set_dev(card, &pci->dev);
2050 2062
2063 chip = NULL; /* Tells snd_echo_create to allocate chip */
2051 if ((err = snd_echo_create(card, pci, &chip)) < 0) { 2064 if ((err = snd_echo_create(card, pci, &chip)) < 0) {
2052 snd_card_free(card); 2065 snd_card_free(card);
2053 return err; 2066 return err;
@@ -2187,6 +2200,112 @@ ctl_error:
2187 2200
2188 2201
2189 2202
2203#if defined(CONFIG_PM)
2204
2205static int snd_echo_suspend(struct pci_dev *pci, pm_message_t state)
2206{
2207 struct echoaudio *chip = pci_get_drvdata(pci);
2208
2209 DE_INIT(("suspend start\n"));
2210 snd_pcm_suspend_all(chip->analog_pcm);
2211 snd_pcm_suspend_all(chip->digital_pcm);
2212
2213#ifdef ECHOCARD_HAS_MIDI
2214 /* This call can sleep */
2215 if (chip->midi_out)
2216 snd_echo_midi_output_trigger(chip->midi_out, 0);
2217#endif
2218 spin_lock_irq(&chip->lock);
2219 if (wait_handshake(chip)) {
2220 spin_unlock_irq(&chip->lock);
2221 return -EIO;
2222 }
2223 clear_handshake(chip);
2224 if (send_vector(chip, DSP_VC_GO_COMATOSE) < 0) {
2225 spin_unlock_irq(&chip->lock);
2226 return -EIO;
2227 }
2228 spin_unlock_irq(&chip->lock);
2229
2230 chip->dsp_code = NULL;
2231 free_irq(chip->irq, chip);
2232 chip->irq = -1;
2233 pci_save_state(pci);
2234 pci_disable_device(pci);
2235
2236 DE_INIT(("suspend done\n"));
2237 return 0;
2238}
2239
2240
2241
2242static int snd_echo_resume(struct pci_dev *pci)
2243{
2244 struct echoaudio *chip = pci_get_drvdata(pci);
2245 struct comm_page *commpage, *commpage_bak;
2246 u32 pipe_alloc_mask;
2247 int err;
2248
2249 DE_INIT(("resume start\n"));
2250 pci_restore_state(pci);
2251 commpage_bak = kmalloc(sizeof(struct echoaudio), GFP_KERNEL);
2252 commpage = chip->comm_page;
2253 memcpy(commpage_bak, commpage, sizeof(struct comm_page));
2254
2255 err = init_hw(chip, chip->pci->device, chip->pci->subsystem_device);
2256 if (err < 0) {
2257 kfree(commpage_bak);
2258 DE_INIT(("resume init_hw err=%d\n", err));
2259 snd_echo_free(chip);
2260 return err;
2261 }
2262 DE_INIT(("resume init OK\n"));
2263
2264 /* Temporarily set chip->pipe_alloc_mask=0 otherwise
2265 * restore_dsp_settings() fails.
2266 */
2267 pipe_alloc_mask = chip->pipe_alloc_mask;
2268 chip->pipe_alloc_mask = 0;
2269 err = restore_dsp_rettings(chip);
2270 chip->pipe_alloc_mask = pipe_alloc_mask;
2271 if (err < 0) {
2272 kfree(commpage_bak);
2273 return err;
2274 }
2275 DE_INIT(("resume restore OK\n"));
2276
2277 memcpy(&commpage->audio_format, &commpage_bak->audio_format,
2278 sizeof(commpage->audio_format));
2279 memcpy(&commpage->sglist_addr, &commpage_bak->sglist_addr,
2280 sizeof(commpage->sglist_addr));
2281 memcpy(&commpage->midi_output, &commpage_bak->midi_output,
2282 sizeof(commpage->midi_output));
2283 kfree(commpage_bak);
2284
2285 if (request_irq(pci->irq, snd_echo_interrupt, IRQF_SHARED,
2286 ECHOCARD_NAME, chip)) {
2287 snd_echo_free(chip);
2288 snd_printk(KERN_ERR "cannot grab irq\n");
2289 return -EBUSY;
2290 }
2291 chip->irq = pci->irq;
2292 DE_INIT(("resume irq=%d\n", chip->irq));
2293
2294#ifdef ECHOCARD_HAS_MIDI
2295 if (chip->midi_input_enabled)
2296 enable_midi_input(chip, TRUE);
2297 if (chip->midi_out)
2298 snd_echo_midi_output_trigger(chip->midi_out, 1);
2299#endif
2300
2301 DE_INIT(("resume done\n"));
2302 return 0;
2303}
2304
2305#endif /* CONFIG_PM */
2306
2307
2308
2190static void __devexit snd_echo_remove(struct pci_dev *pci) 2309static void __devexit snd_echo_remove(struct pci_dev *pci)
2191{ 2310{
2192 struct echoaudio *chip; 2311 struct echoaudio *chip;
@@ -2209,6 +2328,10 @@ static struct pci_driver driver = {
2209 .id_table = snd_echo_ids, 2328 .id_table = snd_echo_ids,
2210 .probe = snd_echo_probe, 2329 .probe = snd_echo_probe,
2211 .remove = __devexit_p(snd_echo_remove), 2330 .remove = __devexit_p(snd_echo_remove),
2331#ifdef CONFIG_PM
2332 .suspend = snd_echo_suspend,
2333 .resume = snd_echo_resume,
2334#endif /* CONFIG_PM */
2212}; 2335};
2213 2336
2214 2337
diff --git a/sound/pci/echoaudio/echoaudio.h b/sound/pci/echoaudio/echoaudio.h
index a84c0d15cc50..1df974dcb5f4 100644
--- a/sound/pci/echoaudio/echoaudio.h
+++ b/sound/pci/echoaudio/echoaudio.h
@@ -472,6 +472,8 @@ static void free_firmware(const struct firmware *fw_entry);
472 472
473#ifdef ECHOCARD_HAS_MIDI 473#ifdef ECHOCARD_HAS_MIDI
474static int enable_midi_input(struct echoaudio *chip, char enable); 474static int enable_midi_input(struct echoaudio *chip, char enable);
475static void snd_echo_midi_output_trigger(
476 struct snd_rawmidi_substream *substream, int up);
475static int midi_service_irq(struct echoaudio *chip); 477static int midi_service_irq(struct echoaudio *chip);
476static int __devinit snd_echo_midi_create(struct snd_card *card, 478static int __devinit snd_echo_midi_create(struct snd_card *card,
477 struct echoaudio *chip); 479 struct echoaudio *chip);
diff --git a/sound/pci/echoaudio/echoaudio_dsp.c b/sound/pci/echoaudio/echoaudio_dsp.c
index 031ef7e9da91..64417a733220 100644
--- a/sound/pci/echoaudio/echoaudio_dsp.c
+++ b/sound/pci/echoaudio/echoaudio_dsp.c
@@ -497,9 +497,6 @@ static int load_firmware(struct echoaudio *chip)
497 if ((box_type = load_asic(chip)) < 0) 497 if ((box_type = load_asic(chip)) < 0)
498 return box_type; /* error */ 498 return box_type; /* error */
499 499
500 if ((err = restore_dsp_rettings(chip)) < 0)
501 return err;
502
503 return box_type; 500 return box_type;
504} 501}
505 502
@@ -659,51 +656,106 @@ static void get_audio_meters(struct echoaudio *chip, long *meters)
659 656
660static int restore_dsp_rettings(struct echoaudio *chip) 657static int restore_dsp_rettings(struct echoaudio *chip)
661{ 658{
662 int err; 659 int i, o, err;
663 DE_INIT(("restore_dsp_settings\n")); 660 DE_INIT(("restore_dsp_settings\n"));
664 661
665 if ((err = check_asic_status(chip)) < 0) 662 if ((err = check_asic_status(chip)) < 0)
666 return err; 663 return err;
667 664
668 /* @ Gina20/Darla20 only. Should be harmless for other cards. */ 665 /* Gina20/Darla20 only. Should be harmless for other cards. */
669 chip->comm_page->gd_clock_state = GD_CLOCK_UNDEF; 666 chip->comm_page->gd_clock_state = GD_CLOCK_UNDEF;
670 chip->comm_page->gd_spdif_status = GD_SPDIF_STATUS_UNDEF; 667 chip->comm_page->gd_spdif_status = GD_SPDIF_STATUS_UNDEF;
671 chip->comm_page->handshake = 0xffffffff; 668 chip->comm_page->handshake = 0xffffffff;
672 669
673 if ((err = set_sample_rate(chip, chip->sample_rate)) < 0) 670 /* Restore output busses */
671 for (i = 0; i < num_busses_out(chip); i++) {
672 err = set_output_gain(chip, i, chip->output_gain[i]);
673 if (err < 0)
674 return err;
675 }
676
677#ifdef ECHOCARD_HAS_VMIXER
678 for (i = 0; i < num_pipes_out(chip); i++)
679 for (o = 0; o < num_busses_out(chip); o++) {
680 err = set_vmixer_gain(chip, o, i,
681 chip->vmixer_gain[o][i]);
682 if (err < 0)
683 return err;
684 }
685 if (update_vmixer_level(chip) < 0)
686 return -EIO;
687#endif /* ECHOCARD_HAS_VMIXER */
688
689#ifdef ECHOCARD_HAS_MONITOR
690 for (o = 0; o < num_busses_out(chip); o++)
691 for (i = 0; i < num_busses_in(chip); i++) {
692 err = set_monitor_gain(chip, o, i,
693 chip->monitor_gain[o][i]);
694 if (err < 0)
695 return err;
696 }
697#endif /* ECHOCARD_HAS_MONITOR */
698
699#ifdef ECHOCARD_HAS_INPUT_GAIN
700 for (i = 0; i < num_busses_in(chip); i++) {
701 err = set_input_gain(chip, i, chip->input_gain[i]);
702 if (err < 0)
703 return err;
704 }
705#endif /* ECHOCARD_HAS_INPUT_GAIN */
706
707 err = update_output_line_level(chip);
708 if (err < 0)
674 return err; 709 return err;
675 710
676 if (chip->meters_enabled) 711 err = update_input_line_level(chip);
677 if (send_vector(chip, DSP_VC_METERS_ON) < 0) 712 if (err < 0)
678 return -EIO; 713 return err;
679 714
680#ifdef ECHOCARD_HAS_EXTERNAL_CLOCK 715 err = set_sample_rate(chip, chip->sample_rate);
681 if (set_input_clock(chip, chip->input_clock) < 0) 716 if (err < 0)
717 return err;
718
719 if (chip->meters_enabled) {
720 err = send_vector(chip, DSP_VC_METERS_ON);
721 if (err < 0)
722 return err;
723 }
724
725#ifdef ECHOCARD_HAS_DIGITAL_MODE_SWITCH
726 if (set_digital_mode(chip, chip->digital_mode) < 0)
682 return -EIO; 727 return -EIO;
683#endif 728#endif
684 729
685#ifdef ECHOCARD_HAS_OUTPUT_CLOCK_SWITCH 730#ifdef ECHOCARD_HAS_DIGITAL_IO
686 if (set_output_clock(chip, chip->output_clock) < 0) 731 if (set_professional_spdif(chip, chip->professional_spdif) < 0)
687 return -EIO; 732 return -EIO;
688#endif 733#endif
689 734
690 if (update_output_line_level(chip) < 0) 735#ifdef ECHOCARD_HAS_PHANTOM_POWER
736 if (set_phantom_power(chip, chip->phantom_power) < 0)
691 return -EIO; 737 return -EIO;
738#endif
692 739
693 if (update_input_line_level(chip) < 0) 740#ifdef ECHOCARD_HAS_EXTERNAL_CLOCK
741 /* set_input_clock() also restores automute setting */
742 if (set_input_clock(chip, chip->input_clock) < 0)
694 return -EIO; 743 return -EIO;
744#endif
695 745
696#ifdef ECHOCARD_HAS_VMIXER 746#ifdef ECHOCARD_HAS_OUTPUT_CLOCK_SWITCH
697 if (update_vmixer_level(chip) < 0) 747 if (set_output_clock(chip, chip->output_clock) < 0)
698 return -EIO; 748 return -EIO;
699#endif 749#endif
700 750
701 if (wait_handshake(chip) < 0) 751 if (wait_handshake(chip) < 0)
702 return -EIO; 752 return -EIO;
703 clear_handshake(chip); 753 clear_handshake(chip);
754 if (send_vector(chip, DSP_VC_UPDATE_FLAGS) < 0)
755 return -EIO;
704 756
705 DE_INIT(("restore_dsp_rettings done\n")); 757 DE_INIT(("restore_dsp_rettings done\n"));
706 return send_vector(chip, DSP_VC_UPDATE_FLAGS); 758 return 0;
707} 759}
708 760
709 761
@@ -920,9 +972,6 @@ static int init_dsp_comm_page(struct echoaudio *chip)
920 chip->card_name = ECHOCARD_NAME; 972 chip->card_name = ECHOCARD_NAME;
921 chip->bad_board = TRUE; /* Set TRUE until DSP loaded */ 973 chip->bad_board = TRUE; /* Set TRUE until DSP loaded */
922 chip->dsp_code = NULL; /* Current DSP code not loaded */ 974 chip->dsp_code = NULL; /* Current DSP code not loaded */
923 chip->digital_mode = DIGITAL_MODE_NONE;
924 chip->input_clock = ECHO_CLOCK_INTERNAL;
925 chip->output_clock = ECHO_CLOCK_WORD;
926 chip->asic_loaded = FALSE; 975 chip->asic_loaded = FALSE;
927 memset(chip->comm_page, 0, sizeof(struct comm_page)); 976 memset(chip->comm_page, 0, sizeof(struct comm_page));
928 977
@@ -933,7 +982,6 @@ static int init_dsp_comm_page(struct echoaudio *chip)
933 chip->comm_page->midi_out_free_count = 982 chip->comm_page->midi_out_free_count =
934 cpu_to_le32(DSP_MIDI_OUT_FIFO_SIZE); 983 cpu_to_le32(DSP_MIDI_OUT_FIFO_SIZE);
935 chip->comm_page->sample_rate = cpu_to_le32(44100); 984 chip->comm_page->sample_rate = cpu_to_le32(44100);
936 chip->sample_rate = 44100;
937 985
938 /* Set line levels so we don't blast any inputs on startup */ 986 /* Set line levels so we don't blast any inputs on startup */
939 memset(chip->comm_page->monitors, ECHOGAIN_MUTED, MONITOR_ARRAY_SIZE); 987 memset(chip->comm_page->monitors, ECHOGAIN_MUTED, MONITOR_ARRAY_SIZE);
@@ -944,50 +992,21 @@ static int init_dsp_comm_page(struct echoaudio *chip)
944 992
945 993
946 994
947/* This function initializes the several volume controls for busses and pipes. 995/* This function initializes the chip structure with default values, ie. all
948This MUST be called after the DSP is up and running ! */ 996 * muted and internal clock source. Then it copies the settings to the DSP.
997 * This MUST be called after the DSP is up and running !
998 */
949static int init_line_levels(struct echoaudio *chip) 999static int init_line_levels(struct echoaudio *chip)
950{ 1000{
951 int st, i, o;
952
953 DE_INIT(("init_line_levels\n")); 1001 DE_INIT(("init_line_levels\n"));
954 1002 memset(chip->output_gain, ECHOGAIN_MUTED, sizeof(chip->output_gain));
955 /* Mute output busses */ 1003 memset(chip->input_gain, ECHOGAIN_MUTED, sizeof(chip->input_gain));
956 for (i = 0; i < num_busses_out(chip); i++) 1004 memset(chip->monitor_gain, ECHOGAIN_MUTED, sizeof(chip->monitor_gain));
957 if ((st = set_output_gain(chip, i, ECHOGAIN_MUTED))) 1005 memset(chip->vmixer_gain, ECHOGAIN_MUTED, sizeof(chip->vmixer_gain));
958 return st; 1006 chip->input_clock = ECHO_CLOCK_INTERNAL;
959 if ((st = update_output_line_level(chip))) 1007 chip->output_clock = ECHO_CLOCK_WORD;
960 return st; 1008 chip->sample_rate = 44100;
961 1009 return restore_dsp_rettings(chip);
962#ifdef ECHOCARD_HAS_VMIXER
963 /* Mute the Vmixer */
964 for (i = 0; i < num_pipes_out(chip); i++)
965 for (o = 0; o < num_busses_out(chip); o++)
966 if ((st = set_vmixer_gain(chip, o, i, ECHOGAIN_MUTED)))
967 return st;
968 if ((st = update_vmixer_level(chip)))
969 return st;
970#endif /* ECHOCARD_HAS_VMIXER */
971
972#ifdef ECHOCARD_HAS_MONITOR
973 /* Mute the monitor mixer */
974 for (o = 0; o < num_busses_out(chip); o++)
975 for (i = 0; i < num_busses_in(chip); i++)
976 if ((st = set_monitor_gain(chip, o, i, ECHOGAIN_MUTED)))
977 return st;
978 if ((st = update_output_line_level(chip)))
979 return st;
980#endif /* ECHOCARD_HAS_MONITOR */
981
982#ifdef ECHOCARD_HAS_INPUT_GAIN
983 for (i = 0; i < num_busses_in(chip); i++)
984 if ((st = set_input_gain(chip, i, ECHOGAIN_MUTED)))
985 return st;
986 if ((st = update_input_line_level(chip)))
987 return st;
988#endif /* ECHOCARD_HAS_INPUT_GAIN */
989
990 return 0;
991} 1010}
992 1011
993 1012