Lines Matching +full:mode +full:- +full:loader
3 Copyright Echo Digital Audio Corporation (c) 1998 - 2004
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
40 command and then write a non-zero value to the Handshake field in the
50 if (chip->comm_page->handshake) { in wait_handshake()
56 dev_err(chip->card->dev, "wait_handshake(): Timeout waiting for DSP\n"); in wait_handshake()
57 return -EBUSY; in wait_handshake()
83 dev_err(chip->card->dev, "timeout on send_vector\n"); in send_vector()
84 return -EBUSY; in send_vector()
89 /* write_dsp writes a 32-bit value to the DSP; this is used almost
106 chip->bad_board = true; /* Set true until DSP re-loaded */ in write_dsp()
107 dev_dbg(chip->card->dev, "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
129 chip->bad_board = true; /* Set true until DSP re-loaded */ in read_dsp()
130 dev_err(chip->card->dev, "read_dsp: Set bad_board to true\n"); in read_dsp()
131 return -EIO; in read_dsp()
152 dev_err(chip->card->dev, in read_sn()
154 return -EIO; in read_sn()
157 dev_dbg(chip->card->dev, in read_sn()
169 chip->asic_loaded = true; in check_asic_status()
179 /* Load ASIC code - done after the DSP is loaded */
189 dev_warn(chip->card->dev, "Firmware not found !\n"); in load_asic_generic()
193 code = (u8 *)fw->data; in load_asic_generic()
194 size = fw->size; in load_asic_generic()
213 dev_err(chip->card->dev, "failed on write_dsp\n"); in load_asic_generic()
215 return -EIO; in load_asic_generic()
224 /* Install the resident loader for 56361 DSPs; The resident loader is on
225 the EPROM on the board for 56301 DSP. The resident loader is a tiny little
235 /* 56361 cards only! This check is required by the old 56301-based in install_resident_loader()
237 if (chip->device_id != DEVICE_ID_56361) in install_resident_loader()
240 /* Look to see if the resident loader is present. If the resident in install_resident_loader()
241 loader is already installed, host flag 5 will be on. */ in install_resident_loader()
244 dev_dbg(chip->card->dev, in install_resident_loader()
245 "Resident loader already installed; status is 0x%x\n", in install_resident_loader()
252 dev_warn(chip->card->dev, "Firmware not found !\n"); in install_resident_loader()
261 This is a lot like the other loader loop, but it's not a loop, you in install_resident_loader()
264 /* Set DSP format bits for 24 bit mode */ in install_resident_loader()
268 code = (u16 *)fw->data; in install_resident_loader()
287 dev_err(chip->card->dev, in install_resident_loader()
293 dev_err(chip->card->dev, in install_resident_loader()
303 dev_err(chip->card->dev, in install_resident_loader()
319 dev_err(chip->card->dev, "Resident loader failed to set HF5\n"); in install_resident_loader()
323 dev_dbg(chip->card->dev, "Resident loader successfully installed\n"); in install_resident_loader()
329 return -EIO; in install_resident_loader()
340 if (chip->dsp_code == code) { in load_dsp()
341 dev_warn(chip->card->dev, "DSP is already loaded!\n"); in load_dsp()
344 chip->bad_board = true; /* Set true until DSP loaded */ in load_dsp()
345 chip->dsp_code = NULL; /* Current DSP code not loaded */ in load_dsp()
346 chip->asic_loaded = false; /* Loading the DSP code will reset the ASIC */ in load_dsp()
348 dev_dbg(chip->card->dev, "load_dsp: Set bad_board to true\n"); in load_dsp()
350 /* If this board requires a resident loader, install it. */ in load_dsp()
358 dev_err(chip->card->dev, in load_dsp()
360 return -EIO; in load_dsp()
374 dev_err(chip->card->dev, in load_dsp()
376 return -EIO; in load_dsp()
379 /* Set DSP format bits for 24 bit mode now that soft reset is done */ in load_dsp()
383 /* Main loader loop */ in load_dsp()
412 dev_err(chip->card->dev, in load_dsp()
414 return -EIO; in load_dsp()
417 dev_err(chip->card->dev, in load_dsp()
419 return -EIO; in load_dsp()
422 dev_err(chip->card->dev, in load_dsp()
424 return -EIO; in load_dsp()
430 dev_err(chip->card->dev, in load_dsp()
432 return -EIO; in load_dsp()
438 dev_err(chip->card->dev, in load_dsp()
440 return -EIO; in load_dsp()
445 /* Wait for flag 4 - indicates that the DSP loaded OK */ in load_dsp()
452 dev_err(chip->card->dev, in load_dsp()
454 return -EIO; in load_dsp()
457 if (write_dsp(chip, chip->comm_page_phys) < 0) { in load_dsp()
458 dev_err(chip->card->dev, in load_dsp()
460 return -EIO; in load_dsp()
463 /* Get the serial number via slave mode. in load_dsp()
468 dev_err(chip->card->dev, in load_dsp()
470 return -EIO; in load_dsp()
473 chip->dsp_code = code; /* Show which DSP code loaded */ in load_dsp()
474 chip->bad_board = false; /* DSP OK */ in load_dsp()
480 dev_err(chip->card->dev, in load_dsp()
482 return -EIO; in load_dsp()
493 if (snd_BUG_ON(!chip->comm_page)) in load_firmware()
494 return -EPERM; in load_firmware()
496 /* See if the ASIC is present and working - only if the DSP is already loaded */ in load_firmware()
497 if (chip->dsp_code) { in load_firmware()
501 chip->dsp_code = NULL; in load_firmware()
504 err = get_firmware(&fw, chip, chip->dsp_code_to_load); in load_firmware()
507 err = load_dsp(chip, (u16 *)fw->data); in load_firmware()
527 /* Set the nominal level for an input or output bus (true = -10dBV, false = +4dBu) */
531 return -EINVAL; in set_nominal_level()
535 return -EIO; in set_nominal_level()
537 chip->nominal_level[index] = consumer; in set_nominal_level()
540 chip->comm_page->nominal_level_mask |= cpu_to_le32(1 << index); in set_nominal_level()
542 chip->comm_page->nominal_level_mask &= ~cpu_to_le32(1 << index); in set_nominal_level()
555 return -EINVAL; in set_output_gain()
558 return -EIO; in set_output_gain()
561 chip->output_gain[channel] = gain; in set_output_gain()
562 chip->comm_page->line_out_level[channel] = gain; in set_output_gain()
575 return -EINVAL; in set_monitor_gain()
578 return -EIO; in set_monitor_gain()
580 chip->monitor_gain[output][input] = gain; in set_monitor_gain()
581 chip->comm_page->monitors[monitor_index(chip, output, input)] = gain; in set_monitor_gain()
591 return -EIO; in update_output_line_level()
602 return -EIO; in update_input_line_level()
613 if (on && !chip->meters_enabled) { in set_meters_on()
615 chip->meters_enabled = 1; in set_meters_on()
616 } else if (!on && chip->meters_enabled) { in set_meters_on()
618 chip->meters_enabled = 0; in set_meters_on()
619 memset((s8 *)chip->comm_page->vu_meter, ECHOGAIN_MUTED, in set_meters_on()
621 memset((s8 *)chip->comm_page->peak_meter, ECHOGAIN_MUTED, in set_meters_on()
644 meters[n++] = chip->comm_page->vu_meter[m]; in get_audio_meters()
645 meters[n++] = chip->comm_page->peak_meter[m]; in get_audio_meters()
653 meters[n++] = chip->comm_page->vu_meter[m]; in get_audio_meters()
654 meters[n++] = chip->comm_page->peak_meter[m]; in get_audio_meters()
658 meters[n++] = chip->comm_page->vu_meter[m]; in get_audio_meters()
659 meters[n++] = chip->comm_page->peak_meter[m]; in get_audio_meters()
674 chip->comm_page->gd_clock_state = GD_CLOCK_UNDEF; in restore_dsp_rettings()
675 chip->comm_page->gd_spdif_status = GD_SPDIF_STATUS_UNDEF; in restore_dsp_rettings()
676 chip->comm_page->handshake = cpu_to_le32(0xffffffff); in restore_dsp_rettings()
680 err = set_output_gain(chip, i, chip->output_gain[i]); in restore_dsp_rettings()
689 chip->vmixer_gain[o][i]); in restore_dsp_rettings()
694 return -EIO; in restore_dsp_rettings()
701 chip->monitor_gain[o][i]); in restore_dsp_rettings()
709 err = set_input_gain(chip, i, chip->input_gain[i]); in restore_dsp_rettings()
723 err = set_sample_rate(chip, chip->sample_rate); in restore_dsp_rettings()
727 if (chip->meters_enabled) { in restore_dsp_rettings()
734 if (set_digital_mode(chip, chip->digital_mode) < 0) in restore_dsp_rettings()
735 return -EIO; in restore_dsp_rettings()
739 if (set_professional_spdif(chip, chip->professional_spdif) < 0) in restore_dsp_rettings()
740 return -EIO; in restore_dsp_rettings()
744 if (set_phantom_power(chip, chip->phantom_power) < 0) in restore_dsp_rettings()
745 return -EIO; in restore_dsp_rettings()
750 if (set_input_clock(chip, chip->input_clock) < 0) in restore_dsp_rettings()
751 return -EIO; in restore_dsp_rettings()
755 if (set_output_clock(chip, chip->output_clock) < 0) in restore_dsp_rettings()
756 return -EIO; in restore_dsp_rettings()
760 return -EIO; in restore_dsp_rettings()
763 return -EIO; in restore_dsp_rettings()
775 this pipe. Note that _MS_ (mono-to-stereo) playback modes are not used by ALSA
784 /* Look for super-interleave (no big-endian and 8 bits) */ in set_audio_format()
785 if (format->interleave > 2) { in set_audio_format()
786 switch (format->bits_per_sample) { in set_audio_format()
797 dsp_format |= format->interleave; in set_audio_format()
798 } else if (format->data_are_bigendian) { in set_audio_format()
799 /* For big-endian data, only 32 bit samples are supported */ in set_audio_format()
800 switch (format->interleave) { in set_audio_format()
810 } else if (format->interleave == 1 && in set_audio_format()
811 format->bits_per_sample == 32 && !format->mono_to_stereo) { in set_audio_format()
812 /* 32 bit little-endian mono->mono case */ in set_audio_format()
815 /* Handle the other little-endian formats */ in set_audio_format()
816 switch (format->bits_per_sample) { in set_audio_format()
818 if (format->interleave == 2) in set_audio_format()
825 if (format->interleave == 2) in set_audio_format()
831 if (format->interleave == 2) in set_audio_format()
837 if (format->interleave == 2) in set_audio_format()
844 dev_dbg(chip->card->dev, in set_audio_format()
846 chip->comm_page->audio_format[pipe_index] = cpu_to_le16(dsp_format); in set_audio_format()
854 Same thing for pause_ and stop_ -trasport below. */
860 return -EIO; in start_transport()
862 chip->comm_page->cmd_start |= cpu_to_le32(channel_mask); in start_transport()
864 if (chip->comm_page->cmd_start) { in start_transport()
868 return -EIO; in start_transport()
870 chip->active_mask |= channel_mask; in start_transport()
871 chip->comm_page->cmd_start = 0; in start_transport()
875 dev_err(chip->card->dev, "start_transport: No pipes to start!\n"); in start_transport()
876 return -EINVAL; in start_transport()
885 return -EIO; in pause_transport()
887 chip->comm_page->cmd_stop |= cpu_to_le32(channel_mask); in pause_transport()
888 chip->comm_page->cmd_reset = 0; in pause_transport()
889 if (chip->comm_page->cmd_stop) { in pause_transport()
893 return -EIO; in pause_transport()
895 chip->active_mask &= ~channel_mask; in pause_transport()
896 chip->comm_page->cmd_stop = 0; in pause_transport()
897 chip->comm_page->cmd_reset = 0; in pause_transport()
901 dev_dbg(chip->card->dev, "pause_transport: No pipes to stop!\n"); in pause_transport()
911 return -EIO; in stop_transport()
913 chip->comm_page->cmd_stop |= cpu_to_le32(channel_mask); in stop_transport()
914 chip->comm_page->cmd_reset |= cpu_to_le32(channel_mask); in stop_transport()
915 if (chip->comm_page->cmd_reset) { in stop_transport()
919 return -EIO; in stop_transport()
921 chip->active_mask &= ~channel_mask; in stop_transport()
922 chip->comm_page->cmd_stop = 0; in stop_transport()
923 chip->comm_page->cmd_reset = 0; in stop_transport()
927 dev_dbg(chip->card->dev, "stop_transport: No pipes to stop!\n"); in stop_transport()
935 return (chip->pipe_alloc_mask & (1 << pipe_index)); in is_pipe_allocated()
946 stop_transport(chip, chip->active_mask); in rest_in_peace()
955 if (chip->dsp_code) { in rest_in_peace()
957 chip->dsp_code = NULL; in rest_in_peace()
971 dev_err(chip->card->dev, in init_dsp_comm_page()
972 "init_dsp_comm_page() - Invalid struct comm_page structure\n"); in init_dsp_comm_page()
973 return -EPERM; in init_dsp_comm_page()
977 chip->card_name = ECHOCARD_NAME; in init_dsp_comm_page()
978 chip->bad_board = true; /* Set true until DSP loaded */ in init_dsp_comm_page()
979 chip->dsp_code = NULL; /* Current DSP code not loaded */ in init_dsp_comm_page()
980 chip->asic_loaded = false; in init_dsp_comm_page()
981 memset(chip->comm_page, 0, sizeof(struct comm_page)); in init_dsp_comm_page()
984 chip->comm_page->comm_size = in init_dsp_comm_page()
986 chip->comm_page->handshake = cpu_to_le32(0xffffffff); in init_dsp_comm_page()
987 chip->comm_page->midi_out_free_count = in init_dsp_comm_page()
989 chip->comm_page->sample_rate = cpu_to_le32(44100); in init_dsp_comm_page()
992 memset(chip->comm_page->monitors, ECHOGAIN_MUTED, MONITOR_ARRAY_SIZE); in init_dsp_comm_page()
993 memset(chip->comm_page->vmixer, ECHOGAIN_MUTED, VMIXER_ARRAY_SIZE); in init_dsp_comm_page()
1006 memset(chip->output_gain, ECHOGAIN_MUTED, sizeof(chip->output_gain)); in init_line_levels()
1007 memset(chip->input_gain, ECHOGAIN_MUTED, sizeof(chip->input_gain)); in init_line_levels()
1008 memset(chip->monitor_gain, ECHOGAIN_MUTED, sizeof(chip->monitor_gain)); in init_line_levels()
1009 memset(chip->vmixer_gain, ECHOGAIN_MUTED, sizeof(chip->vmixer_gain)); in init_line_levels()
1010 chip->input_clock = ECHO_CLOCK_INTERNAL; in init_line_levels()
1011 chip->output_clock = ECHO_CLOCK_WORD; in init_line_levels()
1012 chip->sample_rate = 44100; in init_line_levels()
1019 It returns -1 if the IRQ is not ours, or N>=0 if it is, where N is the number
1030 if (chip->comm_page->midi_input[0]) /* The count is at index 0 */ in service_irq()
1034 chip->comm_page->midi_input[0] = 0; in service_irq()
1038 return -1; in service_irq()
1056 dev_dbg(chip->card->dev, in allocate_pipes()
1059 if (chip->bad_board) in allocate_pipes()
1060 return -EIO; in allocate_pipes()
1064 if (chip->pipe_alloc_mask & channel_mask) { in allocate_pipes()
1065 dev_err(chip->card->dev, in allocate_pipes()
1067 return -EAGAIN; in allocate_pipes()
1070 chip->comm_page->position[pipe_index] = 0; in allocate_pipes()
1071 chip->pipe_alloc_mask |= channel_mask; in allocate_pipes()
1073 chip->pipe_cyclic_mask |= channel_mask; in allocate_pipes()
1074 pipe->index = pipe_index; in allocate_pipes()
1075 pipe->interleave = interleave; in allocate_pipes()
1076 pipe->state = PIPE_STATE_STOPPED; in allocate_pipes()
1081 pipe->dma_counter = (__le32 *)&chip->comm_page->position[pipe_index]; in allocate_pipes()
1082 *pipe->dma_counter = 0; in allocate_pipes()
1093 if (snd_BUG_ON(!is_pipe_allocated(chip, pipe->index))) in free_pipes()
1094 return -EINVAL; in free_pipes()
1095 if (snd_BUG_ON(pipe->state != PIPE_STATE_STOPPED)) in free_pipes()
1096 return -EINVAL; in free_pipes()
1098 for (channel_mask = i = 0; i < pipe->interleave; i++) in free_pipes()
1099 channel_mask |= 1 << (pipe->index + i); in free_pipes()
1101 chip->pipe_alloc_mask &= ~channel_mask; in free_pipes()
1102 chip->pipe_cyclic_mask &= ~channel_mask; in free_pipes()
1109 Functions for managing the scatter-gather list
1114 pipe->sglist_head = 0; in sglist_init()
1115 memset(pipe->sgpage.area, 0, PAGE_SIZE); in sglist_init()
1116 chip->comm_page->sglist_addr[pipe->index].addr = in sglist_init()
1117 cpu_to_le32(pipe->sgpage.addr); in sglist_init()
1126 int head = pipe->sglist_head; in sglist_add_mapping()
1127 struct sg_entry *list = (struct sg_entry *)pipe->sgpage.area; in sglist_add_mapping()
1129 if (head < MAX_SGLIST_ENTRIES - 1) { in sglist_add_mapping()
1132 pipe->sglist_head++; in sglist_add_mapping()
1134 dev_err(chip->card->dev, "SGlist: too many fragments\n"); in sglist_add_mapping()
1135 return -ENOMEM; in sglist_add_mapping()
1151 return sglist_add_mapping(chip, pipe, pipe->sgpage.addr, 0); in sglist_wrap()