static int load_asic(struct echoaudio *chip) { int box_type, err; if (chip->asic_loaded) return 0; /* Give the DSP a few milliseconds to settle down */ mdelay(2); err = load_asic_generic(chip, DSP_FNC_LOAD_3G_ASIC, &card_fw[FW_3G_ASIC]); if (err < 0) return err; chip->asic_code = &card_fw[FW_3G_ASIC]; /* Now give the new ASIC some time to set up */ msleep(1000); /* See if it worked */ box_type = check_asic_status(chip); /* Set up the control register if the load succeeded - * 48 kHz, internal clock, S/PDIF RCA mode */ if (box_type >= 0) { err = write_control_reg(chip, E3G_48KHZ, E3G_FREQ_REG_DEFAULT, TRUE); if (err < 0) return err; } return box_type; }
/* Set the S/PDIF output format */ static int set_professional_spdif(struct echoaudio *chip, char prof) { u32 control_reg; control_reg = le32_to_cpu(chip->comm_page->control_register); chip->professional_spdif = prof; control_reg = set_spdif_bits(chip, control_reg, chip->sample_rate); return write_control_reg(chip, control_reg, get_frq_reg(chip), 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: 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 unsigned mn103iop_io_write_buffer (struct hw *me, const void *source, int space, unsigned_word base, unsigned nr_bytes) { struct mn103iop *io_port = hw_data (me); enum io_port_register_types io_port_reg; HW_TRACE ((me, "write 0x%08lx %d", (long) base, (int) nr_bytes)); io_port_reg = decode_addr (me, io_port, base); switch (io_port_reg) { /* Port output registers */ case P0OUT: case P1OUT: case P2OUT: case P3OUT: write_output_reg(me, io_port, io_port_reg-P0OUT, source, nr_bytes); break; /* Port output mode registers */ case P0MD: case P1MD: case P2MD: case P3MD: write_output_mode_reg(me, io_port, io_port_reg-P0MD, source, nr_bytes); break; /* Port control registers */ case P0DIR: case P1DIR: case P2DIR: case P3DIR: write_control_reg(me, io_port, io_port_reg-P0DIR, source, nr_bytes); break; /* Port pin registers */ case P0IN: case P1IN: case P2IN: hw_abort(me, "Cannot write to pin register."); break; case P2SS: case P4SS: write_dedicated_control_reg(me, io_port, io_port_reg, source, nr_bytes); break; default: hw_abort(me, "invalid address"); } return nr_bytes; }
static int set_input_clock(struct echoaudio *chip, u16 clock) { u32 control_reg, clocks_from_dsp; DE_ACT(("set_input_clock:\n")); /* Mask off the clock select bits */ control_reg = le32_to_cpu(chip->comm_page->control_register) & GML_CLOCK_CLEAR_MASK; clocks_from_dsp = le32_to_cpu(chip->comm_page->status_clocks); switch (clock) { case ECHO_CLOCK_INTERNAL: DE_ACT(("Set Gina24 clock to INTERNAL\n")); chip->input_clock = ECHO_CLOCK_INTERNAL; return set_sample_rate(chip, chip->sample_rate); case ECHO_CLOCK_SPDIF: if (chip->digital_mode == DIGITAL_MODE_ADAT) return -EAGAIN; DE_ACT(("Set Gina24 clock to SPDIF\n")); control_reg |= GML_SPDIF_CLOCK; if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_SPDIF96) control_reg |= GML_DOUBLE_SPEED_MODE; else control_reg &= ~GML_DOUBLE_SPEED_MODE; break; case ECHO_CLOCK_ADAT: if (chip->digital_mode != DIGITAL_MODE_ADAT) return -EAGAIN; DE_ACT(("Set Gina24 clock to ADAT\n")); control_reg |= GML_ADAT_CLOCK; control_reg &= ~GML_DOUBLE_SPEED_MODE; break; case ECHO_CLOCK_ESYNC: DE_ACT(("Set Gina24 clock to ESYNC\n")); control_reg |= GML_ESYNC_CLOCK; control_reg &= ~GML_DOUBLE_SPEED_MODE; break; case ECHO_CLOCK_ESYNC96: DE_ACT(("Set Gina24 clock to ESYNC96\n")); control_reg |= GML_ESYNC_CLOCK | GML_DOUBLE_SPEED_MODE; break; default: DE_ACT(("Input clock 0x%x not supported for Gina24\n", clock)); return -EINVAL; } chip->input_clock = clock; return write_control_reg(chip, control_reg, TRUE); }
/* Set the S/PDIF output format */ static int set_professional_spdif(struct echoaudio *chip, char prof) { u32 control_reg; int err; /* Clear the current S/PDIF flags */ control_reg = le32_to_cpu(chip->comm_page->control_register); control_reg &= GML_SPDIF_FORMAT_CLEAR_MASK; /* Set the new S/PDIF flags depending on the mode */ control_reg |= GML_SPDIF_TWO_CHANNEL | GML_SPDIF_24_BIT | GML_SPDIF_COPY_PERMIT; if (prof) { /* Professional mode */ control_reg |= GML_SPDIF_PRO_MODE; switch (chip->sample_rate) { case 32000: control_reg |= GML_SPDIF_SAMPLE_RATE0 | GML_SPDIF_SAMPLE_RATE1; break; case 44100: control_reg |= GML_SPDIF_SAMPLE_RATE0; break; case 48000: control_reg |= GML_SPDIF_SAMPLE_RATE1; break; } } else { /* Consumer mode */ switch (chip->sample_rate) { case 32000: control_reg |= GML_SPDIF_SAMPLE_RATE0 | GML_SPDIF_SAMPLE_RATE1; break; case 48000: control_reg |= GML_SPDIF_SAMPLE_RATE1; break; } } if ((err = write_control_reg(chip, control_reg, FALSE))) return err; chip->professional_spdif = prof; DE_ACT(("set_professional_spdif to %s\n", prof ? "Professional" : "Consumer")); return 0; }
/* Mona has an ASIC on the PCI card and another ASIC in the external box; both need to be loaded. */ static int load_asic(struct echoaudio *chip) { u32 control_reg; int err; short asic; if (chip->asic_loaded) return 0; mdelay(10); if (chip->device_id == DEVICE_ID_56361) asic = FW_MONA_361_1_ASIC48; else asic = FW_MONA_301_1_ASIC48; err = load_asic_generic(chip, DSP_FNC_LOAD_MONA_PCI_CARD_ASIC, asic); if (err < 0) return err; chip->asic_code = asic; mdelay(10); /* Do the external one */ err = load_asic_generic(chip, DSP_FNC_LOAD_MONA_EXTERNAL_ASIC, FW_MONA_2_ASIC); if (err < 0) return err; mdelay(10); err = check_asic_status(chip); /* Set up the control register if the load succeeded - 48 kHz, internal clock, S/PDIF RCA mode */ if (!err) { control_reg = GML_CONVERTER_ENABLE | GML_48KHZ; err = write_control_reg(chip, control_reg, true); } return err; }
/* Gina24 has an ASIC on the PCI card which must be loaded for anything interesting to happen. */ static int load_asic(struct echoaudio *chip) { u32 control_reg; int err; short asic; if (chip->asic_loaded) return 1; /* Give the DSP a few milliseconds to settle down */ mdelay(10); /* Pick the correct ASIC for '301 or '361 Gina24 */ if (chip->device_id == DEVICE_ID_56361) asic = FW_GINA24_361_ASIC; else asic = FW_GINA24_301_ASIC; err = load_asic_generic(chip, DSP_FNC_LOAD_GINA24_ASIC, asic); if (err < 0) return err; chip->asic_code = asic; /* Now give the new ASIC a little time to set up */ mdelay(10); /* See if it worked */ err = check_asic_status(chip); /* Set up the control register if the load succeeded - 48 kHz, internal clock, S/PDIF RCA mode */ if (!err) { control_reg = GML_CONVERTER_ENABLE | GML_48KHZ; err = write_control_reg(chip, control_reg, TRUE); } DE_INIT(("load_asic() done\n")); return err; }
static int load_asic(struct echoaudio *chip) { u32 control_reg; int err; short asic; if (chip->asic_loaded) return 1; mdelay(10); if (chip->device_id == DEVICE_ID_56361) asic = FW_GINA24_361_ASIC; else asic = FW_GINA24_301_ASIC; err = load_asic_generic(chip, DSP_FNC_LOAD_GINA24_ASIC, asic); if (err < 0) return err; chip->asic_code = asic; mdelay(10); err = check_asic_status(chip); if (!err) { control_reg = GML_CONVERTER_ENABLE | GML_48KHZ; err = write_control_reg(chip, control_reg, TRUE); } DE_INIT(("load_asic() done\n")); return err; }
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; if (snd_BUG_ON(rate >= 50000 && chip->digital_mode == DIGITAL_MODE_ADAT)) return -EINVAL; /* 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; return 0; } clock = 0; control_reg = le32_to_cpu(chip->comm_page->control_register); control_reg &= GML_CLOCK_CLEAR_MASK & GML_SPDIF_RATE_CLEAR_MASK; switch (rate) { case 96000: clock = GML_96KHZ; break; case 88200: clock = GML_88KHZ; break; case 48000: clock = GML_48KHZ | GML_SPDIF_SAMPLE_RATE1; break; case 44100: clock = GML_44KHZ; /* Professional mode ? */ if (control_reg & GML_SPDIF_PRO_MODE) clock |= GML_SPDIF_SAMPLE_RATE0; break; case 32000: clock = GML_32KHZ | GML_SPDIF_SAMPLE_RATE0 | GML_SPDIF_SAMPLE_RATE1; break; case 22050: clock = GML_22KHZ; break; case 16000: clock = GML_16KHZ; break; case 11025: clock = GML_11KHZ; break; case 8000: clock = GML_8KHZ; break; default: DE_ACT(("set_sample_rate: %d invalid!\n", rate)); return -EINVAL; } control_reg |= clock; chip->comm_page->sample_rate = cpu_to_le32(rate); /* ignored by the DSP */ chip->sample_rate = rate; DE_ACT(("set_sample_rate: %d clock %d\n", rate, clock)); return write_control_reg(chip, control_reg, FALSE); }
static unsigned mn103ser_io_write_buffer (struct hw *me, const void *source, int space, unsigned_word base, unsigned nr_bytes) { struct mn103ser *serial = hw_data (me); enum serial_register_types serial_reg; HW_TRACE ((me, "write 0x%08lx %d", (long) base, (int) nr_bytes)); serial_reg = decode_addr (me, serial, base); switch (serial_reg) { /* control registers */ case SC0CTR: case SC1CTR: case SC2CTR: HW_TRACE ((me, "write - ctrl reg%d has 0x%x, nrbytes=%d.\n", serial_reg-SC0CTR, *(unsigned8 *)source, nr_bytes)); write_control_reg(me, serial, serial_reg-SC0CTR, source, nr_bytes); break; /* interrupt mode registers */ case SC0ICR: case SC1ICR: case SC2ICR: HW_TRACE ((me, "write - intmode reg%d has 0x%x, nrbytes=%d.\n", serial_reg-SC0ICR, *(unsigned8 *)source, nr_bytes)); write_intmode_reg(me, serial, serial_reg-SC0ICR, source, nr_bytes); break; /* transmission buffers */ case SC0TXB: case SC1TXB: case SC2TXB: HW_TRACE ((me, "write - txb%d has %c, nrbytes=%d.\n", serial_reg-SC0TXB, *(char *)source, nr_bytes)); write_txb(me, serial, serial_reg-SC0TXB, source, nr_bytes); break; /* reception buffers */ case SC0RXB: case SC1RXB: case SC2RXB: hw_abort(me, "Cannot write to reception buffer."); break; /* status registers */ case SC0STR: case SC1STR: case SC2STR: hw_abort(me, "Cannot write to status register."); break; case SC2TIM: HW_TRACE ((me, "read - serial2 timer reg %d (nrbytes=%d)\n", *(unsigned8 *)source, nr_bytes)); write_serial2_timer_reg(me, serial, source, nr_bytes); break; default: hw_abort(me, "invalid address"); } return nr_bytes; }
static int set_sample_rate(struct echoaudio *chip, u32 rate) { u32 control_reg, clock; short asic; char force_write; /* Only set the clock for internal mode. */ if (chip->input_clock != ECHO_CLOCK_INTERNAL) { dev_dbg(chip->card->dev, "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; return 0; } /* Now, check to see if the required ASIC is loaded */ if (rate >= 88200) { if (chip->digital_mode == DIGITAL_MODE_ADAT) return -EINVAL; if (chip->device_id == DEVICE_ID_56361) asic = FW_MONA_361_1_ASIC96; else asic = FW_MONA_301_1_ASIC96; } else { if (chip->device_id == DEVICE_ID_56361) asic = FW_MONA_361_1_ASIC48; else asic = FW_MONA_301_1_ASIC48; } force_write = 0; if (asic != chip->asic_code) { int err; /* Load the desired ASIC (load_asic_generic() can sleep) */ spin_unlock_irq(&chip->lock); err = load_asic_generic(chip, DSP_FNC_LOAD_MONA_PCI_CARD_ASIC, asic); spin_lock_irq(&chip->lock); if (err < 0) return err; chip->asic_code = asic; force_write = 1; } /* Compute the new control register value */ clock = 0; control_reg = le32_to_cpu(chip->comm_page->control_register); control_reg &= GML_CLOCK_CLEAR_MASK; control_reg &= GML_SPDIF_RATE_CLEAR_MASK; switch (rate) { case 96000: clock = GML_96KHZ; break; case 88200: clock = GML_88KHZ; break; case 48000: clock = GML_48KHZ | GML_SPDIF_SAMPLE_RATE1; break; case 44100: clock = GML_44KHZ; /* Professional mode */ if (control_reg & GML_SPDIF_PRO_MODE) clock |= GML_SPDIF_SAMPLE_RATE0; break; case 32000: clock = GML_32KHZ | GML_SPDIF_SAMPLE_RATE0 | GML_SPDIF_SAMPLE_RATE1; break; case 22050: clock = GML_22KHZ; break; case 16000: clock = GML_16KHZ; break; case 11025: clock = GML_11KHZ; break; case 8000: clock = GML_8KHZ; break; default: dev_err(chip->card->dev, "set_sample_rate: %d invalid!\n", rate); return -EINVAL; } control_reg |= clock; chip->comm_page->sample_rate = cpu_to_le32(rate); /* ignored by the DSP */ chip->sample_rate = rate; dev_dbg(chip->card->dev, "set_sample_rate: %d clock %d\n", rate, clock); return write_control_reg(chip, control_reg, force_write); }
static int set_input_clock(struct echoaudio *chip, u16 clock) { u32 control_reg, clocks_from_dsp; int err; /* Prevent two simultaneous calls to switch_asic() */ if (atomic_read(&chip->opencount)) return -EAGAIN; /* Mask off the clock select bits */ control_reg = le32_to_cpu(chip->comm_page->control_register) & GML_CLOCK_CLEAR_MASK; clocks_from_dsp = le32_to_cpu(chip->comm_page->status_clocks); switch (clock) { case ECHO_CLOCK_INTERNAL: chip->input_clock = ECHO_CLOCK_INTERNAL; return set_sample_rate(chip, chip->sample_rate); case ECHO_CLOCK_SPDIF: if (chip->digital_mode == DIGITAL_MODE_ADAT) return -EAGAIN; spin_unlock_irq(&chip->lock); err = switch_asic(chip, clocks_from_dsp & GML_CLOCK_DETECT_BIT_SPDIF96); spin_lock_irq(&chip->lock); if (err < 0) return err; control_reg |= GML_SPDIF_CLOCK; if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_SPDIF96) control_reg |= GML_DOUBLE_SPEED_MODE; else control_reg &= ~GML_DOUBLE_SPEED_MODE; break; case ECHO_CLOCK_WORD: spin_unlock_irq(&chip->lock); err = switch_asic(chip, clocks_from_dsp & GML_CLOCK_DETECT_BIT_WORD96); spin_lock_irq(&chip->lock); if (err < 0) return err; control_reg |= GML_WORD_CLOCK; if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_WORD96) control_reg |= GML_DOUBLE_SPEED_MODE; else control_reg &= ~GML_DOUBLE_SPEED_MODE; break; case ECHO_CLOCK_ADAT: dev_dbg(chip->card->dev, "Set Mona clock to ADAT\n"); if (chip->digital_mode != DIGITAL_MODE_ADAT) return -EAGAIN; control_reg |= GML_ADAT_CLOCK; control_reg &= ~GML_DOUBLE_SPEED_MODE; break; default: dev_err(chip->card->dev, "Input clock 0x%x not supported for Mona\n", clock); return -EINVAL; } chip->input_clock = clock; return write_control_reg(chip, control_reg, true); }
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 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; }