static int set_input_auto_mute(struct echoaudio *chip, int automute) { DE_ACT(("set_input_auto_mute %d\n", automute)); chip->digital_in_automute = automute; return set_input_clock(chip, chip->input_clock); }
static int dsp_set_digital_mode(struct echoaudio *chip, u8 mode) { u32 control_reg; int err, incompatible_clock; /* Set clock to "internal" if it's not compatible with the new mode */ incompatible_clock = FALSE; switch (mode) { case DIGITAL_MODE_SPDIF_OPTICAL: case DIGITAL_MODE_SPDIF_RCA: if (chip->input_clock == ECHO_CLOCK_ADAT) incompatible_clock = TRUE; break; case DIGITAL_MODE_ADAT: if (chip->input_clock == ECHO_CLOCK_SPDIF) incompatible_clock = TRUE; break; default: DE_ACT(("Digital mode not supported: %d\n", mode)); return -EINVAL; } spin_lock_irq(&chip->lock); if (incompatible_clock) { chip->sample_rate = 48000; set_input_clock(chip, ECHO_CLOCK_INTERNAL); } /* Clear the current digital mode */ control_reg = le32_to_cpu(chip->comm_page->control_register); control_reg &= E3G_DIGITAL_MODE_CLEAR_MASK; /* Tweak the control reg */ switch (mode) { case DIGITAL_MODE_SPDIF_OPTICAL: control_reg |= E3G_SPDIF_OPTICAL_MODE; break; case DIGITAL_MODE_SPDIF_RCA: /* E3G_SPDIF_OPTICAL_MODE bit cleared */ break; case DIGITAL_MODE_ADAT: control_reg |= E3G_ADAT_MODE; control_reg &= ~E3G_DOUBLE_SPEED_MODE; /* @@ useless */ break; } err = write_control_reg(chip, control_reg, get_frq_reg(chip), 1); spin_unlock_irq(&chip->lock); if (err < 0) return err; chip->digital_mode = mode; DE_ACT(("set_digital_mode(%d)\n", chip->digital_mode)); return incompatible_clock; }
static int set_input_auto_mute(struct echoaudio *chip, int automute) { DE_ACT(("set_input_auto_mute %d\n", automute)); chip->digital_in_automute = automute; /* Re-set the input clock to the current value - indirectly causes the auto-mute flag to be sent to the DSP */ return set_input_clock(chip, chip->input_clock); }
static int restore_dsp_rettings(struct echoaudio *chip) { int err; DE_INIT(("restore_dsp_settings\n")); if ((err = check_asic_status(chip)) < 0) return err; /* @ Gina20/Darla20 only. Should be harmless for other cards. */ chip->comm_page->gd_clock_state = GD_CLOCK_UNDEF; chip->comm_page->gd_spdif_status = GD_SPDIF_STATUS_UNDEF; chip->comm_page->handshake = 0xffffffff; if ((err = set_sample_rate(chip, chip->sample_rate)) < 0) return err; if (chip->meters_enabled) if (send_vector(chip, DSP_VC_METERS_ON) < 0) return -EIO; #ifdef ECHOCARD_HAS_EXTERNAL_CLOCK if (set_input_clock(chip, chip->input_clock) < 0) return -EIO; #endif #ifdef ECHOCARD_HAS_OUTPUT_CLOCK_SWITCH if (set_output_clock(chip, chip->output_clock) < 0) return -EIO; #endif if (update_output_line_level(chip) < 0) return -EIO; if (update_input_line_level(chip) < 0) return -EIO; #ifdef ECHOCARD_HAS_VMIXER if (update_vmixer_level(chip) < 0) return -EIO; #endif if (wait_handshake(chip) < 0) return -EIO; clear_handshake(chip); DE_INIT(("restore_dsp_rettings done\n")); return send_vector(chip, DSP_VC_UPDATE_FLAGS); }
static int dsp_set_digital_mode(struct echoaudio *chip, u8 mode) { u32 control_reg; int err, incompatible_clock; /* Set clock to "internal" if it's not compatible with the new mode */ incompatible_clock = FALSE; switch (mode) { case DIGITAL_MODE_SPDIF_OPTICAL: case DIGITAL_MODE_SPDIF_CDROM: case DIGITAL_MODE_SPDIF_RCA: if (chip->input_clock == ECHO_CLOCK_ADAT) incompatible_clock = TRUE; break; case DIGITAL_MODE_ADAT: if (chip->input_clock == ECHO_CLOCK_SPDIF) incompatible_clock = TRUE; break; default: DE_ACT(("Digital mode not supported: %d\n", mode)); return -EINVAL; } spin_lock_irq(&chip->lock); if (incompatible_clock) { /* Switch to 48KHz, internal */ chip->sample_rate = 48000; set_input_clock(chip, ECHO_CLOCK_INTERNAL); } /* Clear the current digital mode */ control_reg = le32_to_cpu(chip->comm_page->control_register); control_reg &= GML_DIGITAL_MODE_CLEAR_MASK; /* Tweak the control reg */ switch (mode) { case DIGITAL_MODE_SPDIF_OPTICAL: control_reg |= GML_SPDIF_OPTICAL_MODE; break; case DIGITAL_MODE_SPDIF_CDROM: /* '361 Gina24 cards do not have the S/PDIF CD-ROM mode */ if (chip->device_id == DEVICE_ID_56301) control_reg |= GML_SPDIF_CDROM_MODE; break; case DIGITAL_MODE_SPDIF_RCA: /* GML_SPDIF_OPTICAL_MODE bit cleared */ break; case DIGITAL_MODE_ADAT: control_reg |= GML_ADAT_MODE; control_reg &= ~GML_DOUBLE_SPEED_MODE; break; } err = write_control_reg(chip, control_reg, TRUE); spin_unlock_irq(&chip->lock); if (err < 0) return err; chip->digital_mode = mode; DE_ACT(("set_digital_mode to %d\n", chip->digital_mode)); return incompatible_clock; }
static int set_sample_rate(struct echoaudio *chip, u32 rate) { u32 control_reg, clock, base_rate, frq_reg; /* Only set the clock for internal mode. */ if (chip->input_clock != ECHO_CLOCK_INTERNAL) { DE_ACT(("set_sample_rate: Cannot set sample rate - " "clock not set to CLK_CLOCKININTERNAL\n")); /* Save the rate anyhow */ chip->comm_page->sample_rate = cpu_to_le32(rate); chip->sample_rate = rate; set_input_clock(chip, chip->input_clock); return 0; } if (snd_BUG_ON(rate >= 50000 && chip->digital_mode == DIGITAL_MODE_ADAT)) return -EINVAL; clock = 0; control_reg = le32_to_cpu(chip->comm_page->control_register); control_reg &= E3G_CLOCK_CLEAR_MASK; switch (rate) { case 96000: clock = E3G_96KHZ; break; case 88200: clock = E3G_88KHZ; break; case 48000: clock = E3G_48KHZ; break; case 44100: clock = E3G_44KHZ; break; case 32000: clock = E3G_32KHZ; break; default: clock = E3G_CONTINUOUS_CLOCK; if (rate > 50000) clock |= E3G_DOUBLE_SPEED_MODE; break; } control_reg |= clock; control_reg = set_spdif_bits(chip, control_reg, rate); base_rate = rate; if (base_rate > 50000) base_rate /= 2; if (base_rate < 32000) base_rate = 32000; frq_reg = E3G_MAGIC_NUMBER / base_rate - 2; if (frq_reg > E3G_FREQ_REG_MAX) frq_reg = E3G_FREQ_REG_MAX; chip->comm_page->sample_rate = cpu_to_le32(rate); /* ignored by the DSP */ chip->sample_rate = rate; DE_ACT(("SetSampleRate: %d clock %x\n", rate, control_reg)); /* Tell the DSP about it - DSP reads both control reg & freq reg */ return write_control_reg(chip, control_reg, frq_reg, 0); }
static int dsp_set_digital_mode(struct echoaudio *chip, u8 mode) { u32 control_reg; int err, incompatible_clock; /* Set clock to "internal" if it's not compatible with the new mode */ incompatible_clock = false; switch (mode) { case DIGITAL_MODE_SPDIF_OPTICAL: case DIGITAL_MODE_SPDIF_RCA: if (chip->input_clock == ECHO_CLOCK_ADAT) incompatible_clock = true; break; case DIGITAL_MODE_ADAT: if (chip->input_clock == ECHO_CLOCK_SPDIF) incompatible_clock = true; break; default: dev_err(chip->card->dev, "Digital mode not supported: %d\n", mode); return -EINVAL; } spin_lock_irq(&chip->lock); if (incompatible_clock) { /* Switch to 48KHz, internal */ chip->sample_rate = 48000; set_input_clock(chip, ECHO_CLOCK_INTERNAL); } /* Clear the current digital mode */ control_reg = le32_to_cpu(chip->comm_page->control_register); control_reg &= GML_DIGITAL_MODE_CLEAR_MASK; /* Tweak the control reg */ switch (mode) { case DIGITAL_MODE_SPDIF_OPTICAL: control_reg |= GML_SPDIF_OPTICAL_MODE; break; case DIGITAL_MODE_SPDIF_RCA: /* GML_SPDIF_OPTICAL_MODE bit cleared */ break; case DIGITAL_MODE_ADAT: /* If the current ASIC is the 96KHz ASIC, switch the ASIC and set to 48 KHz */ if (chip->asic_code == FW_MONA_361_1_ASIC96 || chip->asic_code == FW_MONA_301_1_ASIC96) { set_sample_rate(chip, 48000); } control_reg |= GML_ADAT_MODE; control_reg &= ~GML_DOUBLE_SPEED_MODE; break; } err = write_control_reg(chip, control_reg, false); spin_unlock_irq(&chip->lock); if (err < 0) return err; chip->digital_mode = mode; dev_dbg(chip->card->dev, "set_digital_mode to %d\n", mode); return incompatible_clock; }
static int restore_dsp_rettings(struct echoaudio *chip) { int i, o, err; DE_INIT(("restore_dsp_settings\n")); if ((err = check_asic_status(chip)) < 0) return err; /* */ chip->comm_page->gd_clock_state = GD_CLOCK_UNDEF; chip->comm_page->gd_spdif_status = GD_SPDIF_STATUS_UNDEF; chip->comm_page->handshake = 0xffffffff; /* */ for (i = 0; i < num_busses_out(chip); i++) { err = set_output_gain(chip, i, chip->output_gain[i]); if (err < 0) return err; } #ifdef ECHOCARD_HAS_VMIXER for (i = 0; i < num_pipes_out(chip); i++) for (o = 0; o < num_busses_out(chip); o++) { err = set_vmixer_gain(chip, o, i, chip->vmixer_gain[o][i]); if (err < 0) return err; } if (update_vmixer_level(chip) < 0) return -EIO; #endif /* */ #ifdef ECHOCARD_HAS_MONITOR for (o = 0; o < num_busses_out(chip); o++) for (i = 0; i < num_busses_in(chip); i++) { err = set_monitor_gain(chip, o, i, chip->monitor_gain[o][i]); if (err < 0) return err; } #endif /* */ #ifdef ECHOCARD_HAS_INPUT_GAIN for (i = 0; i < num_busses_in(chip); i++) { err = set_input_gain(chip, i, chip->input_gain[i]); if (err < 0) return err; } #endif /* */ err = update_output_line_level(chip); if (err < 0) return err; err = update_input_line_level(chip); if (err < 0) return err; err = set_sample_rate(chip, chip->sample_rate); if (err < 0) return err; if (chip->meters_enabled) { err = send_vector(chip, DSP_VC_METERS_ON); if (err < 0) return err; } #ifdef ECHOCARD_HAS_DIGITAL_MODE_SWITCH if (set_digital_mode(chip, chip->digital_mode) < 0) return -EIO; #endif #ifdef ECHOCARD_HAS_DIGITAL_IO if (set_professional_spdif(chip, chip->professional_spdif) < 0) return -EIO; #endif #ifdef ECHOCARD_HAS_PHANTOM_POWER if (set_phantom_power(chip, chip->phantom_power) < 0) return -EIO; #endif #ifdef ECHOCARD_HAS_EXTERNAL_CLOCK /* */ if (set_input_clock(chip, chip->input_clock) < 0) return -EIO; #endif #ifdef ECHOCARD_HAS_OUTPUT_CLOCK_SWITCH if (set_output_clock(chip, chip->output_clock) < 0) return -EIO; #endif if (wait_handshake(chip) < 0) return -EIO; clear_handshake(chip); if (send_vector(chip, DSP_VC_UPDATE_FLAGS) < 0) return -EIO; DE_INIT(("restore_dsp_rettings done\n")); return 0; }
static int dsp_set_digital_mode(struct echoaudio *chip, u8 mode) { u32 control_reg; int err, incompatible_clock; incompatible_clock = FALSE; switch (mode) { case DIGITAL_MODE_SPDIF_OPTICAL: case DIGITAL_MODE_SPDIF_CDROM: case DIGITAL_MODE_SPDIF_RCA: if (chip->input_clock == ECHO_CLOCK_ADAT) incompatible_clock = TRUE; break; case DIGITAL_MODE_ADAT: if (chip->input_clock == ECHO_CLOCK_SPDIF) incompatible_clock = TRUE; break; default: DE_ACT(("Digital mode not supported: %d\n", mode)); return -EINVAL; } spin_lock_irq(&chip->lock); if (incompatible_clock) { chip->sample_rate = 48000; set_input_clock(chip, ECHO_CLOCK_INTERNAL); } control_reg = le32_to_cpu(chip->comm_page->control_register); control_reg &= GML_DIGITAL_MODE_CLEAR_MASK; switch (mode) { case DIGITAL_MODE_SPDIF_OPTICAL: control_reg |= GML_SPDIF_OPTICAL_MODE; break; case DIGITAL_MODE_SPDIF_CDROM: if (chip->device_id == DEVICE_ID_56301) control_reg |= GML_SPDIF_CDROM_MODE; break; case DIGITAL_MODE_SPDIF_RCA: break; case DIGITAL_MODE_ADAT: control_reg |= GML_ADAT_MODE; control_reg &= ~GML_DOUBLE_SPEED_MODE; break; } err = write_control_reg(chip, control_reg, TRUE); spin_unlock_irq(&chip->lock); if (err < 0) return err; chip->digital_mode = mode; DE_ACT(("set_digital_mode to %d\n", chip->digital_mode)); return incompatible_clock; }