Lines Matching +full:chip +full:- +full:to +full:- +full:chip
3 Copyright Echo Digital Audio Corporation (c) 1998 - 2004
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston,
22 MA 02111-1307, USA.
26 Translation from C++ and adaptation for use in ALSA-Driver
35 static int restore_dsp_rettings(struct echoaudio *chip);
38 /* Some vector commands involve the DSP reading or writing data to and from the
39 comm page; if you send one of these commands to the DSP, it will complete the
40 command and then write a non-zero value to the Handshake field in the
41 comm page. This function waits for the handshake to show up. */
42 static int wait_handshake(struct echoaudio *chip) in wait_handshake() argument
46 /* Wait up to 20ms for the handshake from the DSP */ in wait_handshake()
50 if (chip->comm_page->handshake) { in wait_handshake()
57 return -EBUSY; in wait_handshake()
63 commands; send_vector writes a vector command to the DSP. Typically, this
64 causes the DSP to read or write fields in the comm page.
65 PCI posting is not required thanks to the handshake logic. */
66 static int send_vector(struct echoaudio *chip, u32 command) in send_vector() argument
72 /* Wait up to 100ms for the "vector busy" bit to be off */ in send_vector()
74 if (!(get_dsp_register(chip, CHI32_VECTOR_REG) & in send_vector()
76 set_dsp_register(chip, CHI32_VECTOR_REG, command); in send_vector()
84 return -EBUSY; in send_vector()
89 /* write_dsp writes a 32-bit value to the DSP; this is used almost
91 static int write_dsp(struct echoaudio *chip, u32 data) in write_dsp() argument
96 status = get_dsp_register(chip, CHI32_STATUS_REG); in write_dsp()
98 set_dsp_register(chip, CHI32_DATA_REG, data); in write_dsp()
106 chip->bad_board = TRUE; /* Set TRUE until DSP re-loaded */ in write_dsp()
107 DE_ACT((KERN_ERR "write_dsp: Set bad_board to TRUE\n")); in write_dsp()
108 return -EIO; in write_dsp()
113 /* read_dsp reads a 32-bit value from the DSP; this is used almost
115 static int read_dsp(struct echoaudio *chip, u32 *data) in read_dsp() argument
120 status = get_dsp_register(chip, CHI32_STATUS_REG); in read_dsp()
122 *data = get_dsp_register(chip, CHI32_DATA_REG); in read_dsp()
129 chip->bad_board = TRUE; /* Set TRUE until DSP re-loaded */ in read_dsp()
130 DE_INIT((KERN_ERR "read_dsp: Set bad_board to TRUE\n")); in read_dsp()
131 return -EIO; in read_dsp()
140 /* This function is used to read back the serial number from the DSP;
143 the serial number is not used, but you still need to do this as
145 static int read_sn(struct echoaudio *chip) in read_sn() argument
151 if (read_dsp(chip, &sn[i])) { in read_sn()
152 snd_printk(KERN_ERR "Failed to read serial number\n"); in read_sn()
153 return -EIO; in read_sn()
165 static inline int check_asic_status(struct echoaudio *chip) in check_asic_status() argument
167 chip->asic_loaded = TRUE; in check_asic_status()
177 /* Load ASIC code - done after the DSP is loaded */
178 static int load_asic_generic(struct echoaudio *chip, u32 cmd, short asic) in load_asic_generic() argument
185 err = get_firmware(&fw, chip, asic); in load_asic_generic()
191 code = (u8 *)fw->data; in load_asic_generic()
192 size = fw->size; in load_asic_generic()
195 if (write_dsp(chip, cmd) < 0) in load_asic_generic()
199 if (write_dsp(chip, size) < 0) in load_asic_generic()
203 if (write_dsp(chip, code[i]) < 0) in load_asic_generic()
214 return -EIO; in load_asic_generic()
225 program that is used to load the real DSP code. */
226 static int install_resident_loader(struct echoaudio *chip) in install_resident_loader() argument
234 /* 56361 cards only! This check is required by the old 56301-based in install_resident_loader()
236 if (chip->device_id != DEVICE_ID_56361) in install_resident_loader()
239 /* Look to see if the resident loader is present. If the resident in install_resident_loader()
241 status = get_dsp_register(chip, CHI32_STATUS_REG); in install_resident_loader()
248 i = get_firmware(&fw, chip, FW_361_LOADER); in install_resident_loader()
263 set_dsp_register(chip, CHI32_CONTROL_REG, in install_resident_loader()
264 get_dsp_register(chip, CHI32_CONTROL_REG) | 0x900); in install_resident_loader()
266 code = (u16 *)fw->data; in install_resident_loader()
270 to by Code[0]. */ in install_resident_loader()
276 /* Get the number of DSP words to write */ in install_resident_loader()
283 /* Write the count to the DSP */ in install_resident_loader()
284 if (write_dsp(chip, words)) { in install_resident_loader()
285 DE_INIT(("install_resident_loader: Failed to write word count!\n")); in install_resident_loader()
289 if (write_dsp(chip, address)) { in install_resident_loader()
290 DE_INIT(("install_resident_loader: Failed to write DSP address!\n")); in install_resident_loader()
293 /* Write out this block of code to the DSP */ in install_resident_loader()
298 if (write_dsp(chip, data)) { in install_resident_loader()
299 DE_INIT(("install_resident_loader: Failed to write DSP code\n")); in install_resident_loader()
305 /* Wait for flag 5 to come up */ in install_resident_loader()
308 status = get_dsp_register(chip, CHI32_STATUS_REG); in install_resident_loader()
314 DE_INIT(("Resident loader failed to set HF5\n")); in install_resident_loader()
324 return -EIO; in install_resident_loader()
330 static int load_dsp(struct echoaudio *chip, u16 *code) in load_dsp() argument
335 if (chip->dsp_code == code) { in load_dsp()
339 chip->bad_board = TRUE; /* Set TRUE until DSP loaded */ in load_dsp()
340 chip->dsp_code = NULL; /* Current DSP code not loaded */ in load_dsp()
341 chip->asic_loaded = FALSE; /* Loading the DSP code will reset the ASIC */ in load_dsp()
343 DE_INIT(("load_dsp: Set bad_board to TRUE\n")); in load_dsp()
347 if ((i = install_resident_loader(chip)) < 0) in load_dsp()
352 if (send_vector(chip, DSP_VC_RESET) < 0) { in load_dsp()
354 return -EIO; in load_dsp()
359 /* Wait 10ms for HF3 to indicate that software reset is complete */ in load_dsp()
361 if (get_dsp_register(chip, CHI32_STATUS_REG) & in load_dsp()
369 return -EIO; in load_dsp()
373 set_dsp_register(chip, CHI32_CONTROL_REG, in load_dsp()
374 get_dsp_register(chip, CHI32_CONTROL_REG) | 0x900); in load_dsp()
404 if (write_dsp(chip, words) < 0) { in load_dsp()
405 DE_INIT(("load_dsp: failed to write number of DSP words\n")); in load_dsp()
406 return -EIO; in load_dsp()
408 if (write_dsp(chip, address) < 0) { in load_dsp()
409 DE_INIT(("load_dsp: failed to write DSP address\n")); in load_dsp()
410 return -EIO; in load_dsp()
412 if (write_dsp(chip, mem_type) < 0) { in load_dsp()
413 DE_INIT(("load_dsp: failed to write DSP memory type\n")); in load_dsp()
414 return -EIO; in load_dsp()
419 if (write_dsp(chip, data) < 0) { in load_dsp()
420 DE_INIT(("load_dsp: failed to write DSP data\n")); in load_dsp()
421 return -EIO; in load_dsp()
426 if (write_dsp(chip, 0) < 0) { /* We're done!!! */ in load_dsp()
427 DE_INIT(("load_dsp: Failed to write final zero\n")); in load_dsp()
428 return -EIO; in load_dsp()
433 /* Wait for flag 4 - indicates that the DSP loaded OK */ in load_dsp()
434 if (get_dsp_register(chip, CHI32_STATUS_REG) & in load_dsp()
436 set_dsp_register(chip, CHI32_CONTROL_REG, in load_dsp()
437 get_dsp_register(chip, CHI32_CONTROL_REG) & ~0x1b00); in load_dsp()
439 if (write_dsp(chip, DSP_FNC_SET_COMMPAGE_ADDR) < 0) { in load_dsp()
440 DE_INIT(("load_dsp: Failed to write DSP_FNC_SET_COMMPAGE_ADDR\n")); in load_dsp()
441 return -EIO; in load_dsp()
444 if (write_dsp(chip, chip->comm_page_phys) < 0) { in load_dsp()
445 DE_INIT(("load_dsp: Failed to write comm page address\n")); in load_dsp()
446 return -EIO; in load_dsp()
451 We don't actually use the serial number but we have to in load_dsp()
453 if (read_sn(chip) < 0) { in load_dsp()
454 DE_INIT(("load_dsp: Failed to read serial number\n")); in load_dsp()
455 return -EIO; in load_dsp()
458 chip->dsp_code = code; /* Show which DSP code loaded */ in load_dsp()
459 chip->bad_board = FALSE; /* DSP OK */ in load_dsp()
467 return -EIO; in load_dsp()
473 static int load_firmware(struct echoaudio *chip) in load_firmware() argument
478 if (snd_BUG_ON(!chip->dsp_code_to_load || !chip->comm_page)) in load_firmware()
479 return -EPERM; in load_firmware()
481 /* See if the ASIC is present and working - only if the DSP is already loaded */ in load_firmware()
482 if (chip->dsp_code) { in load_firmware()
483 if ((box_type = check_asic_status(chip)) >= 0) in load_firmware()
485 /* ASIC check failed; force the DSP to reload */ in load_firmware()
486 chip->dsp_code = NULL; in load_firmware()
489 err = get_firmware(&fw, chip, chip->dsp_code_to_load); in load_firmware()
492 err = load_dsp(chip, (u16 *)fw->data); in load_firmware()
497 if ((box_type = load_asic(chip)) < 0) in load_firmware()
512 /* Set the nominal level for an input or output bus (true = -10dBV, false = +4dBu) */
513 static int set_nominal_level(struct echoaudio *chip, u16 index, char consumer) in set_nominal_level() argument
515 if (snd_BUG_ON(index >= num_busses_out(chip) + num_busses_in(chip))) in set_nominal_level()
516 return -EINVAL; in set_nominal_level()
519 if (wait_handshake(chip)) in set_nominal_level()
520 return -EIO; in set_nominal_level()
522 chip->nominal_level[index] = consumer; in set_nominal_level()
525 chip->comm_page->nominal_level_mask |= cpu_to_le32(1 << index); in set_nominal_level()
527 chip->comm_page->nominal_level_mask &= ~cpu_to_le32(1 << index); in set_nominal_level()
537 static int set_output_gain(struct echoaudio *chip, u16 channel, s8 gain) in set_output_gain() argument
539 if (snd_BUG_ON(channel >= num_busses_out(chip))) in set_output_gain()
540 return -EINVAL; in set_output_gain()
542 if (wait_handshake(chip)) in set_output_gain()
543 return -EIO; in set_output_gain()
546 chip->output_gain[channel] = gain; in set_output_gain()
547 chip->comm_page->line_out_level[channel] = gain; in set_output_gain()
554 /* Set the monitor level from an input bus to an output bus. */
555 static int set_monitor_gain(struct echoaudio *chip, u16 output, u16 input, in set_monitor_gain() argument
558 if (snd_BUG_ON(output >= num_busses_out(chip) || in set_monitor_gain()
559 input >= num_busses_in(chip))) in set_monitor_gain()
560 return -EINVAL; in set_monitor_gain()
562 if (wait_handshake(chip)) in set_monitor_gain()
563 return -EIO; in set_monitor_gain()
565 chip->monitor_gain[output][input] = gain; in set_monitor_gain()
566 chip->comm_page->monitors[monitor_index(chip, output, input)] = gain; in set_monitor_gain()
572 /* Tell the DSP to read and update output, nominal & monitor levels in comm page. */
573 static int update_output_line_level(struct echoaudio *chip) in update_output_line_level() argument
575 if (wait_handshake(chip)) in update_output_line_level()
576 return -EIO; in update_output_line_level()
577 clear_handshake(chip); in update_output_line_level()
578 return send_vector(chip, DSP_VC_UPDATE_OUTVOL); in update_output_line_level()
583 /* Tell the DSP to read and update input levels in comm page */
584 static int update_input_line_level(struct echoaudio *chip) in update_input_line_level() argument
586 if (wait_handshake(chip)) in update_input_line_level()
587 return -EIO; in update_input_line_level()
588 clear_handshake(chip); in update_input_line_level()
589 return send_vector(chip, DSP_VC_UPDATE_INGAIN); in update_input_line_level()
595 will write the meter and clock detect values to the comm page at about 30Hz */
596 static void set_meters_on(struct echoaudio *chip, char on) in set_meters_on() argument
598 if (on && !chip->meters_enabled) { in set_meters_on()
599 send_vector(chip, DSP_VC_METERS_ON); in set_meters_on()
600 chip->meters_enabled = 1; in set_meters_on()
601 } else if (!on && chip->meters_enabled) { in set_meters_on()
602 send_vector(chip, DSP_VC_METERS_OFF); in set_meters_on()
603 chip->meters_enabled = 0; in set_meters_on()
604 memset((s8 *)chip->comm_page->vu_meter, ECHOGAIN_MUTED, in set_meters_on()
606 memset((s8 *)chip->comm_page->peak_meter, ECHOGAIN_MUTED, in set_meters_on()
621 static void get_audio_meters(struct echoaudio *chip, long *meters) in get_audio_meters() argument
627 for (i = 0; i < num_busses_out(chip); i++, m++) { in get_audio_meters()
628 meters[n++] = chip->comm_page->vu_meter[m]; in get_audio_meters()
629 meters[n++] = chip->comm_page->peak_meter[m]; in get_audio_meters()
638 for (i = 0; i < num_busses_in(chip); i++, m++) { in get_audio_meters()
639 meters[n++] = chip->comm_page->vu_meter[m]; in get_audio_meters()
640 meters[n++] = chip->comm_page->peak_meter[m]; in get_audio_meters()
646 for (i = 0; i < num_pipes_out(chip); i++, m++) { in get_audio_meters()
647 meters[n++] = chip->comm_page->vu_meter[m]; in get_audio_meters()
648 meters[n++] = chip->comm_page->peak_meter[m]; in get_audio_meters()
657 static int restore_dsp_rettings(struct echoaudio *chip) in restore_dsp_rettings() argument
662 if ((err = check_asic_status(chip)) < 0) in restore_dsp_rettings()
666 chip->comm_page->gd_clock_state = GD_CLOCK_UNDEF; in restore_dsp_rettings()
667 chip->comm_page->gd_spdif_status = GD_SPDIF_STATUS_UNDEF; in restore_dsp_rettings()
668 chip->comm_page->handshake = 0xffffffff; in restore_dsp_rettings()
671 for (i = 0; i < num_busses_out(chip); i++) { in restore_dsp_rettings()
672 err = set_output_gain(chip, i, chip->output_gain[i]); in restore_dsp_rettings()
678 for (i = 0; i < num_pipes_out(chip); i++) in restore_dsp_rettings()
679 for (o = 0; o < num_busses_out(chip); o++) { in restore_dsp_rettings()
680 err = set_vmixer_gain(chip, o, i, in restore_dsp_rettings()
681 chip->vmixer_gain[o][i]); in restore_dsp_rettings()
685 if (update_vmixer_level(chip) < 0) in restore_dsp_rettings()
686 return -EIO; in restore_dsp_rettings()
690 for (o = 0; o < num_busses_out(chip); o++) in restore_dsp_rettings()
691 for (i = 0; i < num_busses_in(chip); i++) { in restore_dsp_rettings()
692 err = set_monitor_gain(chip, o, i, in restore_dsp_rettings()
693 chip->monitor_gain[o][i]); in restore_dsp_rettings()
700 for (i = 0; i < num_busses_in(chip); i++) { in restore_dsp_rettings()
701 err = set_input_gain(chip, i, chip->input_gain[i]); in restore_dsp_rettings()
707 err = update_output_line_level(chip); in restore_dsp_rettings()
711 err = update_input_line_level(chip); in restore_dsp_rettings()
715 err = set_sample_rate(chip, chip->sample_rate); in restore_dsp_rettings()
719 if (chip->meters_enabled) { in restore_dsp_rettings()
720 err = send_vector(chip, DSP_VC_METERS_ON); in restore_dsp_rettings()
726 if (set_digital_mode(chip, chip->digital_mode) < 0) in restore_dsp_rettings()
727 return -EIO; in restore_dsp_rettings()
731 if (set_professional_spdif(chip, chip->professional_spdif) < 0) in restore_dsp_rettings()
732 return -EIO; in restore_dsp_rettings()
736 if (set_phantom_power(chip, chip->phantom_power) < 0) in restore_dsp_rettings()
737 return -EIO; in restore_dsp_rettings()
742 if (set_input_clock(chip, chip->input_clock) < 0) in restore_dsp_rettings()
743 return -EIO; in restore_dsp_rettings()
747 if (set_output_clock(chip, chip->output_clock) < 0) in restore_dsp_rettings()
748 return -EIO; in restore_dsp_rettings()
751 if (wait_handshake(chip) < 0) in restore_dsp_rettings()
752 return -EIO; in restore_dsp_rettings()
753 clear_handshake(chip); in restore_dsp_rettings()
754 if (send_vector(chip, DSP_VC_UPDATE_FLAGS) < 0) in restore_dsp_rettings()
755 return -EIO; in restore_dsp_rettings()
768 this pipe. Note that _MS_ (mono-to-stereo) playback modes are not used by ALSA
770 static void set_audio_format(struct echoaudio *chip, u16 pipe_index, in set_audio_format() argument
777 /* Look for super-interleave (no big-endian and 8 bits) */ in set_audio_format()
778 if (format->interleave > 2) { in set_audio_format()
779 switch (format->bits_per_sample) { in set_audio_format()
790 dsp_format |= format->interleave; in set_audio_format()
791 } else if (format->data_are_bigendian) { in set_audio_format()
792 /* For big-endian data, only 32 bit samples are supported */ in set_audio_format()
793 switch (format->interleave) { in set_audio_format()
803 } else if (format->interleave == 1 && in set_audio_format()
804 format->bits_per_sample == 32 && !format->mono_to_stereo) { in set_audio_format()
805 /* 32 bit little-endian mono->mono case */ in set_audio_format()
808 /* Handle the other little-endian formats */ in set_audio_format()
809 switch (format->bits_per_sample) { in set_audio_format()
811 if (format->interleave == 2) in set_audio_format()
818 if (format->interleave == 2) in set_audio_format()
824 if (format->interleave == 2) in set_audio_format()
830 if (format->interleave == 2) in set_audio_format()
838 chip->comm_page->audio_format[pipe_index] = cpu_to_le16(dsp_format); in set_audio_format()
844 The bits 1 in channel_mask specify what pipes to start. Only the bit of the
846 Same thing for pause_ and stop_ -trasport below. */
847 static int start_transport(struct echoaudio *chip, u32 channel_mask, in start_transport() argument
852 if (wait_handshake(chip)) in start_transport()
853 return -EIO; in start_transport()
855 chip->comm_page->cmd_start |= cpu_to_le32(channel_mask); in start_transport()
857 if (chip->comm_page->cmd_start) { in start_transport()
858 clear_handshake(chip); in start_transport()
859 send_vector(chip, DSP_VC_START_TRANSFER); in start_transport()
860 if (wait_handshake(chip)) in start_transport()
861 return -EIO; in start_transport()
863 chip->active_mask |= channel_mask; in start_transport()
864 chip->comm_page->cmd_start = 0; in start_transport()
868 DE_ACT(("start_transport: No pipes to start!\n")); in start_transport()
869 return -EINVAL; in start_transport()
874 static int pause_transport(struct echoaudio *chip, u32 channel_mask) in pause_transport() argument
878 if (wait_handshake(chip)) in pause_transport()
879 return -EIO; in pause_transport()
881 chip->comm_page->cmd_stop |= cpu_to_le32(channel_mask); in pause_transport()
882 chip->comm_page->cmd_reset = 0; in pause_transport()
883 if (chip->comm_page->cmd_stop) { in pause_transport()
884 clear_handshake(chip); in pause_transport()
885 send_vector(chip, DSP_VC_STOP_TRANSFER); in pause_transport()
886 if (wait_handshake(chip)) in pause_transport()
887 return -EIO; in pause_transport()
889 chip->active_mask &= ~channel_mask; in pause_transport()
890 chip->comm_page->cmd_stop = 0; in pause_transport()
891 chip->comm_page->cmd_reset = 0; in pause_transport()
895 DE_ACT(("pause_transport: No pipes to stop!\n")); in pause_transport()
901 static int stop_transport(struct echoaudio *chip, u32 channel_mask) in stop_transport() argument
905 if (wait_handshake(chip)) in stop_transport()
906 return -EIO; in stop_transport()
908 chip->comm_page->cmd_stop |= cpu_to_le32(channel_mask); in stop_transport()
909 chip->comm_page->cmd_reset |= cpu_to_le32(channel_mask); in stop_transport()
910 if (chip->comm_page->cmd_reset) { in stop_transport()
911 clear_handshake(chip); in stop_transport()
912 send_vector(chip, DSP_VC_STOP_TRANSFER); in stop_transport()
913 if (wait_handshake(chip)) in stop_transport()
914 return -EIO; in stop_transport()
916 chip->active_mask &= ~channel_mask; in stop_transport()
917 chip->comm_page->cmd_stop = 0; in stop_transport()
918 chip->comm_page->cmd_reset = 0; in stop_transport()
922 DE_ACT(("stop_transport: No pipes to stop!\n")); in stop_transport()
928 static inline int is_pipe_allocated(struct echoaudio *chip, u16 pipe_index) in is_pipe_allocated() argument
930 return (chip->pipe_alloc_mask & (1 << pipe_index)); in is_pipe_allocated()
937 static int rest_in_peace(struct echoaudio *chip) in rest_in_peace() argument
939 DE_ACT(("rest_in_peace() open=%x\n", chip->pipe_alloc_mask)); in rest_in_peace()
941 /* Stops all active pipes (just to be sure) */ in rest_in_peace()
942 stop_transport(chip, chip->active_mask); in rest_in_peace()
944 set_meters_on(chip, FALSE); in rest_in_peace()
947 enable_midi_input(chip, FALSE); in rest_in_peace()
950 /* Go to sleep */ in rest_in_peace()
951 if (chip->dsp_code) { in rest_in_peace()
953 chip->dsp_code = NULL; in rest_in_peace()
954 /* Put the DSP to sleep */ in rest_in_peace()
955 return send_vector(chip, DSP_VC_GO_COMATOSE); in rest_in_peace()
963 static int init_dsp_comm_page(struct echoaudio *chip) in init_dsp_comm_page() argument
967 DE_INIT(("init_dsp_comm_page() - Invalid struct comm_page structure\n")); in init_dsp_comm_page()
968 return -EPERM; in init_dsp_comm_page()
972 chip->card_name = ECHOCARD_NAME; in init_dsp_comm_page()
973 chip->bad_board = TRUE; /* Set TRUE until DSP loaded */ in init_dsp_comm_page()
974 chip->dsp_code = NULL; /* Current DSP code not loaded */ in init_dsp_comm_page()
975 chip->asic_loaded = FALSE; in init_dsp_comm_page()
976 memset(chip->comm_page, 0, sizeof(struct comm_page)); in init_dsp_comm_page()
979 chip->comm_page->comm_size = in init_dsp_comm_page()
981 chip->comm_page->handshake = 0xffffffff; in init_dsp_comm_page()
982 chip->comm_page->midi_out_free_count = in init_dsp_comm_page()
984 chip->comm_page->sample_rate = cpu_to_le32(44100); in init_dsp_comm_page()
987 memset(chip->comm_page->monitors, ECHOGAIN_MUTED, MONITOR_ARRAY_SIZE); in init_dsp_comm_page()
988 memset(chip->comm_page->vmixer, ECHOGAIN_MUTED, VMIXER_ARRAY_SIZE); in init_dsp_comm_page()
995 /* This function initializes the chip structure with default values, ie. all
996 * muted and internal clock source. Then it copies the settings to the DSP.
999 static int init_line_levels(struct echoaudio *chip) in init_line_levels() argument
1002 memset(chip->output_gain, ECHOGAIN_MUTED, sizeof(chip->output_gain)); in init_line_levels()
1003 memset(chip->input_gain, ECHOGAIN_MUTED, sizeof(chip->input_gain)); in init_line_levels()
1004 memset(chip->monitor_gain, ECHOGAIN_MUTED, sizeof(chip->monitor_gain)); in init_line_levels()
1005 memset(chip->vmixer_gain, ECHOGAIN_MUTED, sizeof(chip->vmixer_gain)); in init_line_levels()
1006 chip->input_clock = ECHO_CLOCK_INTERNAL; in init_line_levels()
1007 chip->output_clock = ECHO_CLOCK_WORD; in init_line_levels()
1008 chip->sample_rate = 44100; in init_line_levels()
1009 return restore_dsp_rettings(chip); in init_line_levels()
1015 It returns -1 if the IRQ is not ours, or N>=0 if it is, where N is the number
1017 static int service_irq(struct echoaudio *chip) in service_irq() argument
1022 if (get_dsp_register(chip, CHI32_STATUS_REG) & CHI32_STATUS_IRQ) { in service_irq()
1026 if (chip->comm_page->midi_input[0]) /* The count is at index 0 */ in service_irq()
1027 st = midi_service_irq(chip); /* Returns how many midi bytes we received */ in service_irq()
1030 chip->comm_page->midi_input[0] = 0; in service_irq()
1031 send_vector(chip, DSP_VC_ACK_INT); in service_irq()
1034 return -1; in service_irq()
1044 /* allocate_pipes is used to reserve audio pipes for your exclusive use.
1046 static int allocate_pipes(struct echoaudio *chip, struct audiopipe *pipe, in allocate_pipes() argument
1055 if (chip->bad_board) in allocate_pipes()
1056 return -EIO; in allocate_pipes()
1062 if (chip->pipe_alloc_mask & channel_mask) { in allocate_pipes()
1064 return -EAGAIN; in allocate_pipes()
1067 chip->comm_page->position[pipe_index] = 0; in allocate_pipes()
1068 chip->pipe_alloc_mask |= channel_mask; in allocate_pipes()
1070 chip->pipe_cyclic_mask |= channel_mask; in allocate_pipes()
1071 pipe->index = pipe_index; in allocate_pipes()
1072 pipe->interleave = interleave; in allocate_pipes()
1073 pipe->state = PIPE_STATE_STOPPED; in allocate_pipes()
1078 pipe->dma_counter = &chip->comm_page->position[pipe_index]; in allocate_pipes()
1079 *pipe->dma_counter = 0; in allocate_pipes()
1086 static int free_pipes(struct echoaudio *chip, struct audiopipe *pipe) in free_pipes() argument
1091 DE_ACT(("free_pipes: Pipe %d\n", pipe->index)); in free_pipes()
1092 if (snd_BUG_ON(!is_pipe_allocated(chip, pipe->index))) in free_pipes()
1093 return -EINVAL; in free_pipes()
1094 if (snd_BUG_ON(pipe->state != PIPE_STATE_STOPPED)) in free_pipes()
1095 return -EINVAL; in free_pipes()
1097 for (channel_mask = i = 0; i < pipe->interleave; i++) in free_pipes()
1098 channel_mask |= 1 << (pipe->index + i); in free_pipes()
1100 chip->pipe_alloc_mask &= ~channel_mask; in free_pipes()
1101 chip->pipe_cyclic_mask &= ~channel_mask; in free_pipes()
1108 Functions for managing the scatter-gather list
1111 static int sglist_init(struct echoaudio *chip, struct audiopipe *pipe) in sglist_init() argument
1113 pipe->sglist_head = 0; in sglist_init()
1114 memset(pipe->sgpage.area, 0, PAGE_SIZE); in sglist_init()
1115 chip->comm_page->sglist_addr[pipe->index].addr = in sglist_init()
1116 cpu_to_le32(pipe->sgpage.addr); in sglist_init()
1122 static int sglist_add_mapping(struct echoaudio *chip, struct audiopipe *pipe, in sglist_add_mapping() argument
1125 int head = pipe->sglist_head; in sglist_add_mapping()
1126 struct sg_entry *list = (struct sg_entry *)pipe->sgpage.area; in sglist_add_mapping()
1128 if (head < MAX_SGLIST_ENTRIES - 1) { in sglist_add_mapping()
1131 pipe->sglist_head++; in sglist_add_mapping()
1134 return -ENOMEM; in sglist_add_mapping()
1141 static inline int sglist_add_irq(struct echoaudio *chip, struct audiopipe *pipe) in sglist_add_irq() argument
1143 return sglist_add_mapping(chip, pipe, 0, 0); in sglist_add_irq()
1148 static inline int sglist_wrap(struct echoaudio *chip, struct audiopipe *pipe) in sglist_wrap() argument
1150 return sglist_add_mapping(chip, pipe, pipe->sgpage.addr, 0); in sglist_wrap()