Lines Matching +full:adc +full:- +full:diff +full:- +full:channels
1 // SPDX-License-Identifier: GPL-2.0-or-later
12 * - Fixed deadlock on capture
13 * - Added Canyon3D-2 support by Rob Riggs <rob@pangalactic.org>
16 #define CARD_NAME "ESS Maestro3/Allegro/Canyon3D-2"
24 #include <linux/dma-mapping.h>
45 "{ESS,Allegro-1 PCI},"
46 "{ESS,Canyon3D-2/LE PCI}}");
50 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
53 static bool external_amp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
54 static int amp_gpio[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = -1};
65 MODULE_PARM_DESC(amp_gpio, "GPIO pin number for external amp. (default = -1)");
370 #define REV_A_CODE_MEMORY_LENGTH (REV_A_CODE_MEMORY_END - REV_A_CODE_MEMORY_BEGIN + 1)
375 #define REV_B_CODE_MEMORY_LENGTH (REV_B_CODE_MEMORY_END - REV_B_CODE_MEMORY_BEGIN + 1)
380 #define REV_A_DATA_MEMORY_LENGTH (REV_A_DATA_MEMORY_END - REV_A_DATA_MEMORY_BEGIN + 1)
385 #define REV_B_DATA_MEMORY_LENGTH (REV_B_DATA_MEMORY_END - REV_B_DATA_MEMORY_BEGIN + 1)
599 #define MAX_INSTANCE_MINISRC (KDATA_INSTANCE_MINISRC_ENDMARK - KDATA_INSTANCE0_MINISRC)
600 #define MAX_VIRTUAL_DMA_CHANNELS (KDATA_DMA_XFER_ENDMARK - KDATA_DMA_XFER0)
601 #define MAX_VIRTUAL_MIXER_CHANNELS (KDATA_MIXER_XFER_ENDMARK - KDATA_MIXER_XFER0)
602 #define MAX_VIRTUAL_ADC1_CHANNELS (KDATA_ADC1_XFER_ENDMARK - KDATA_ADC1_XFER0)
751 int amp_gpio; /* gpio pin # for external amp, -1 = default */
752 unsigned int hv_config; /* hardware-volume config bits */
812 SND_PCI_QUIRK(0x10f7, 0x833e, "Panasonic CF-28", 0x0d),
813 SND_PCI_QUIRK(0x10f7, 0x833d, "Panasonic CF-72", 0x0d),
917 outw(value, chip->iobase + reg); in snd_m3_outw()
922 return inw(chip->iobase + reg); in snd_m3_inw()
927 outb(value, chip->iobase + reg); in snd_m3_outb()
932 return inb(chip->iobase + reg); in snd_m3_inb()
955 chip->reset_state = snd_m3_inb(chip, DSP_PORT_CONTROL_REG_B) & ~REGB_STOP_CLOCK; in snd_m3_assp_halt()
957 snd_m3_outb(chip, chip->reset_state & ~REGB_ENABLE_RESET, DSP_PORT_CONTROL_REG_B); in snd_m3_assp_halt()
962 snd_m3_outb(chip, chip->reset_state | REGB_ENABLE_RESET, DSP_PORT_CONTROL_REG_B); in snd_m3_assp_continue()
977 list->mem_addr + list->curlen, in snd_m3_add_list()
979 return list->curlen++; in snd_m3_add_list()
985 int lastindex = list->curlen - 1; in snd_m3_remove_list()
989 list->mem_addr + lastindex); in snd_m3_remove_list()
991 list->mem_addr + index, in snd_m3_remove_list()
996 list->mem_addr + lastindex, in snd_m3_remove_list()
999 list->curlen--; in snd_m3_remove_list()
1004 chip->timer_users++; in snd_m3_inc_timer_users()
1005 if (chip->timer_users != 1) in snd_m3_inc_timer_users()
1023 chip->timer_users--; in snd_m3_dec_timer_users()
1024 if (chip->timer_users > 0) in snd_m3_dec_timer_users()
1049 return -EINVAL; in snd_m3_pcm_start()
1052 switch (subs->stream) { in snd_m3_pcm_start()
1054 chip->dacs_active++; in snd_m3_pcm_start()
1056 s->inst.data + CDATA_INSTANCE_READY, 1); in snd_m3_pcm_start()
1059 chip->dacs_active); in snd_m3_pcm_start()
1065 s->inst.data + CDATA_INSTANCE_READY, 1); in snd_m3_pcm_start()
1076 return -EINVAL; in snd_m3_pcm_stop()
1079 s->inst.data + CDATA_INSTANCE_READY, 0); in snd_m3_pcm_stop()
1081 switch (subs->stream) { in snd_m3_pcm_stop()
1083 chip->dacs_active--; in snd_m3_pcm_stop()
1086 chip->dacs_active); in snd_m3_pcm_stop()
1100 struct m3_dma *s = subs->runtime->private_data; in snd_m3_pcm_trigger()
1101 int err = -EINVAL; in snd_m3_pcm_trigger()
1104 return -ENXIO; in snd_m3_pcm_trigger()
1106 spin_lock(&chip->reg_lock); in snd_m3_pcm_trigger()
1110 if (s->running) in snd_m3_pcm_trigger()
1111 err = -EBUSY; in snd_m3_pcm_trigger()
1113 s->running = 1; in snd_m3_pcm_trigger()
1119 if (! s->running) in snd_m3_pcm_trigger()
1122 s->running = 0; in snd_m3_pcm_trigger()
1127 spin_unlock(&chip->reg_lock); in snd_m3_pcm_trigger()
1138 struct snd_pcm_runtime *runtime = subs->runtime; in snd_m3_pcm_setup1()
1140 if (subs->stream == SNDRV_PCM_STREAM_PLAYBACK) { in snd_m3_pcm_setup1()
1141 dsp_in_size = MINISRC_IN_BUFFER_SIZE - (0x20 * 2); in snd_m3_pcm_setup1()
1142 dsp_out_size = MINISRC_OUT_BUFFER_SIZE - (0x20 * 2); in snd_m3_pcm_setup1()
1144 dsp_in_size = MINISRC_IN_BUFFER_SIZE - (0x10 * 2); in snd_m3_pcm_setup1()
1145 dsp_out_size = MINISRC_OUT_BUFFER_SIZE - (0x10 * 2); in snd_m3_pcm_setup1()
1147 dsp_in_buffer = s->inst.data + (MINISRC_TMP_BUFFER_SIZE / 2); in snd_m3_pcm_setup1()
1150 s->dma_size = frames_to_bytes(runtime, runtime->buffer_size); in snd_m3_pcm_setup1()
1151 s->period_size = frames_to_bytes(runtime, runtime->period_size); in snd_m3_pcm_setup1()
1152 s->hwptr = 0; in snd_m3_pcm_setup1()
1153 s->count = 0; in snd_m3_pcm_setup1()
1160 s->inst.data + CDATA_HOST_SRC_ADDRL, in snd_m3_pcm_setup1()
1161 LO(s->buffer_addr)); in snd_m3_pcm_setup1()
1164 s->inst.data + CDATA_HOST_SRC_ADDRH, in snd_m3_pcm_setup1()
1165 HI(s->buffer_addr)); in snd_m3_pcm_setup1()
1168 s->inst.data + CDATA_HOST_SRC_END_PLUS_1L, in snd_m3_pcm_setup1()
1169 LO(s->buffer_addr + s->dma_size)); in snd_m3_pcm_setup1()
1172 s->inst.data + CDATA_HOST_SRC_END_PLUS_1H, in snd_m3_pcm_setup1()
1173 HI(s->buffer_addr + s->dma_size)); in snd_m3_pcm_setup1()
1176 s->inst.data + CDATA_HOST_SRC_CURRENTL, in snd_m3_pcm_setup1()
1177 LO(s->buffer_addr)); in snd_m3_pcm_setup1()
1180 s->inst.data + CDATA_HOST_SRC_CURRENTH, in snd_m3_pcm_setup1()
1181 HI(s->buffer_addr)); in snd_m3_pcm_setup1()
1188 s->inst.data + CDATA_IN_BUF_BEGIN, in snd_m3_pcm_setup1()
1192 s->inst.data + CDATA_IN_BUF_END_PLUS_1, in snd_m3_pcm_setup1()
1196 s->inst.data + CDATA_IN_BUF_HEAD, in snd_m3_pcm_setup1()
1200 s->inst.data + CDATA_IN_BUF_TAIL, in snd_m3_pcm_setup1()
1204 s->inst.data + CDATA_OUT_BUF_BEGIN, in snd_m3_pcm_setup1()
1208 s->inst.data + CDATA_OUT_BUF_END_PLUS_1, in snd_m3_pcm_setup1()
1212 s->inst.data + CDATA_OUT_BUF_HEAD, in snd_m3_pcm_setup1()
1216 s->inst.data + CDATA_OUT_BUF_TAIL, in snd_m3_pcm_setup1()
1228 if (! s->in_lists) { in snd_m3_pcm_setup2()
1229 s->index[0] = snd_m3_add_list(chip, s->index_list[0], in snd_m3_pcm_setup2()
1230 s->inst.data >> DP_SHIFT_COUNT); in snd_m3_pcm_setup2()
1231 s->index[1] = snd_m3_add_list(chip, s->index_list[1], in snd_m3_pcm_setup2()
1232 s->inst.data >> DP_SHIFT_COUNT); in snd_m3_pcm_setup2()
1233 s->index[2] = snd_m3_add_list(chip, s->index_list[2], in snd_m3_pcm_setup2()
1234 s->inst.data >> DP_SHIFT_COUNT); in snd_m3_pcm_setup2()
1235 s->in_lists = 1; in snd_m3_pcm_setup2()
1240 s->inst.data + SRC3_DIRECTION_OFFSET + 1, in snd_m3_pcm_setup2()
1241 runtime->channels == 2 ? 0 : 1); in snd_m3_pcm_setup2()
1244 s->inst.data + SRC3_DIRECTION_OFFSET + 2, in snd_m3_pcm_setup2()
1245 snd_pcm_format_width(runtime->format) == 16 ? 0 : 1); in snd_m3_pcm_setup2()
1247 /* set up dac/adc rate */ in snd_m3_pcm_setup2()
1248 freq = ((runtime->rate << 15) + 24000 ) / 48000; in snd_m3_pcm_setup2()
1250 freq--; in snd_m3_pcm_setup2()
1253 s->inst.data + CDATA_FREQUENCY, in snd_m3_pcm_setup2()
1279 {SRC3_DIRECTION_OFFSET + 18, MINISRC_BIQUAD_STAGE - 1}, /* numstage */
1297 s->inst.data + SRC3_DIRECTION_OFFSET + 12, in snd_m3_playback_setup()
1298 s->inst.data + 40 + 8); in snd_m3_playback_setup()
1301 s->inst.data + SRC3_DIRECTION_OFFSET + 19, in snd_m3_playback_setup()
1302 s->inst.code + MINISRC_COEF_LOC); in snd_m3_playback_setup()
1306 s->inst.data + SRC3_DIRECTION_OFFSET + 22, in snd_m3_playback_setup()
1307 subs->runtime->rate > 45000 ? 0xff : 0); in snd_m3_playback_setup()
1311 s->inst.data + CDATA_DMA_CONTROL, in snd_m3_playback_setup()
1319 s->inst.data + pv[i].addr, pv[i].val); in snd_m3_playback_setup()
1363 s->inst.data + SRC3_DIRECTION_OFFSET + 12, in snd_m3_capture_setup()
1364 s->inst.data + 40 + 8); in snd_m3_capture_setup()
1368 s->inst.data + CDATA_DMA_CONTROL, in snd_m3_capture_setup()
1377 s->inst.data + rv[i].addr, rv[i].val); in snd_m3_capture_setup()
1383 struct m3_dma *s = substream->runtime->private_data; in snd_m3_pcm_hw_params()
1386 s->buffer_addr = substream->runtime->dma_addr; in snd_m3_pcm_hw_params()
1387 if (s->buffer_addr & 0x3) { in snd_m3_pcm_hw_params()
1388 dev_err(substream->pcm->card->dev, "oh my, not aligned\n"); in snd_m3_pcm_hw_params()
1389 s->buffer_addr = s->buffer_addr & ~0x3; in snd_m3_pcm_hw_params()
1398 if (substream->runtime->private_data == NULL) in snd_m3_pcm_hw_free()
1400 s = substream->runtime->private_data; in snd_m3_pcm_hw_free()
1401 s->buffer_addr = 0; in snd_m3_pcm_hw_free()
1409 struct snd_pcm_runtime *runtime = subs->runtime; in snd_m3_pcm_prepare()
1410 struct m3_dma *s = runtime->private_data; in snd_m3_pcm_prepare()
1413 return -ENXIO; in snd_m3_pcm_prepare()
1415 if (runtime->format != SNDRV_PCM_FORMAT_U8 && in snd_m3_pcm_prepare()
1416 runtime->format != SNDRV_PCM_FORMAT_S16_LE) in snd_m3_pcm_prepare()
1417 return -EINVAL; in snd_m3_pcm_prepare()
1418 if (runtime->rate > 48000 || in snd_m3_pcm_prepare()
1419 runtime->rate < 8000) in snd_m3_pcm_prepare()
1420 return -EINVAL; in snd_m3_pcm_prepare()
1422 spin_lock_irq(&chip->reg_lock); in snd_m3_pcm_prepare()
1426 if (subs->stream == SNDRV_PCM_STREAM_PLAYBACK) in snd_m3_pcm_prepare()
1433 spin_unlock_irq(&chip->reg_lock); in snd_m3_pcm_prepare()
1451 while (retry--) { in snd_m3_get_pointer()
1453 s->inst.data + CDATA_HOST_SRC_CURRENTH); in snd_m3_get_pointer()
1456 s->inst.data + CDATA_HOST_SRC_CURRENTL); in snd_m3_get_pointer()
1459 s->inst.data + CDATA_HOST_SRC_CURRENTH)) in snd_m3_get_pointer()
1463 return (unsigned int)(addr - s->buffer_addr); in snd_m3_get_pointer()
1471 struct m3_dma *s = subs->runtime->private_data; in snd_m3_pcm_pointer()
1476 spin_lock(&chip->reg_lock); in snd_m3_pcm_pointer()
1478 spin_unlock(&chip->reg_lock); in snd_m3_pcm_pointer()
1479 return bytes_to_frames(subs->runtime, ptr); in snd_m3_pcm_pointer()
1487 struct snd_pcm_substream *subs = s->substream; in snd_m3_update_ptr()
1489 int diff; in snd_m3_update_ptr() local
1491 if (! s->running) in snd_m3_update_ptr()
1497 if (hwptr >= s->dma_size) in snd_m3_update_ptr()
1498 hwptr %= s->dma_size; in snd_m3_update_ptr()
1500 diff = s->dma_size + hwptr - s->hwptr; in snd_m3_update_ptr()
1501 if (diff >= s->dma_size) in snd_m3_update_ptr()
1502 diff %= s->dma_size; in snd_m3_update_ptr()
1504 s->hwptr = hwptr; in snd_m3_update_ptr()
1505 s->count += diff; in snd_m3_update_ptr()
1507 if (s->count >= (signed)s->period_size) { in snd_m3_update_ptr()
1509 if (s->count < 2 * (signed)s->period_size) in snd_m3_update_ptr()
1510 s->count -= (signed)s->period_size; in snd_m3_update_ptr()
1512 s->count %= s->period_size; in snd_m3_update_ptr()
1514 spin_unlock(&chip->reg_lock); in snd_m3_update_ptr()
1516 spin_lock(&chip->reg_lock); in snd_m3_update_ptr()
1522 generating an interrupt. The pair of counters is stored in bits 1-3 and 5-7
1532 x = inb(chip->iobase + SHADOW_MIX_REG_VOICE) & 0xee; in snd_m3_update_hw_volume()
1543 outb(0x88, chip->iobase + SHADOW_MIX_REG_VOICE); in snd_m3_update_hw_volume()
1544 outb(0x88, chip->iobase + HW_VOL_COUNTER_VOICE); in snd_m3_update_hw_volume()
1545 outb(0x88, chip->iobase + SHADOW_MIX_REG_MASTER); in snd_m3_update_hw_volume()
1546 outb(0x88, chip->iobase + HW_VOL_COUNTER_MASTER); in snd_m3_update_hw_volume()
1550 if (chip->in_suspend) in snd_m3_update_hw_volume()
1554 if (!chip->master_switch || !chip->master_volume) in snd_m3_update_hw_volume()
1557 val = snd_ac97_read(chip->ac97, AC97_MASTER); in snd_m3_update_hw_volume()
1566 /* counters increased by 1 -> volume up */ in snd_m3_update_hw_volume()
1568 val--; in snd_m3_update_hw_volume()
1570 val -= 0x0100; in snd_m3_update_hw_volume()
1573 /* counters decreased by 1 -> volume down */ in snd_m3_update_hw_volume()
1580 if (snd_ac97_update(chip->ac97, AC97_MASTER, val)) in snd_m3_update_hw_volume()
1581 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, in snd_m3_update_hw_volume()
1582 &chip->master_switch->id); in snd_m3_update_hw_volume()
1584 if (!chip->input_dev) in snd_m3_update_hw_volume()
1596 /* counters increased by 1 -> volume up */ in snd_m3_update_hw_volume()
1600 /* counters decreased by 1 -> volume down */ in snd_m3_update_hw_volume()
1606 input_report_key(chip->input_dev, val, 1); in snd_m3_update_hw_volume()
1607 input_sync(chip->input_dev); in snd_m3_update_hw_volume()
1608 input_report_key(chip->input_dev, val, 0); in snd_m3_update_hw_volume()
1609 input_sync(chip->input_dev); in snd_m3_update_hw_volume()
1620 status = inb(chip->iobase + HOST_INT_STATUS); in snd_m3_interrupt()
1626 schedule_work(&chip->hwvol_work); in snd_m3_interrupt()
1633 u8 ctl = inb(chip->iobase + ASSP_CONTROL_B); in snd_m3_interrupt()
1635 ctl = inb(chip->iobase + ASSP_HOST_INT_STATUS); in snd_m3_interrupt()
1637 outb(DSP2HOST_REQ_TIMER, chip->iobase + ASSP_HOST_INT_STATUS); in snd_m3_interrupt()
1638 /* update adc/dac info if it was a timer int */ in snd_m3_interrupt()
1639 spin_lock(&chip->reg_lock); in snd_m3_interrupt()
1640 for (i = 0; i < chip->num_substreams; i++) { in snd_m3_interrupt()
1641 struct m3_dma *s = &chip->substreams[i]; in snd_m3_interrupt()
1642 if (s->running) in snd_m3_interrupt()
1645 spin_unlock(&chip->reg_lock); in snd_m3_interrupt()
1651 if ((status & MPU401_INT_PENDING) && chip->rmidi) in snd_m3_interrupt()
1652 snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data, regs); in snd_m3_interrupt()
1656 outb(status, chip->iobase + HOST_INT_STATUS); in snd_m3_interrupt()
1717 spin_lock_irq(&chip->reg_lock); in snd_m3_substream_open()
1718 for (i = 0; i < chip->num_substreams; i++) { in snd_m3_substream_open()
1719 s = &chip->substreams[i]; in snd_m3_substream_open()
1720 if (! s->opened) in snd_m3_substream_open()
1723 spin_unlock_irq(&chip->reg_lock); in snd_m3_substream_open()
1724 return -ENOMEM; in snd_m3_substream_open()
1726 s->opened = 1; in snd_m3_substream_open()
1727 s->running = 0; in snd_m3_substream_open()
1728 spin_unlock_irq(&chip->reg_lock); in snd_m3_substream_open()
1730 subs->runtime->private_data = s; in snd_m3_substream_open()
1731 s->substream = subs; in snd_m3_substream_open()
1734 if (subs->stream == SNDRV_PCM_STREAM_PLAYBACK) { in snd_m3_substream_open()
1735 s->index_list[0] = &chip->mixer_list; in snd_m3_substream_open()
1737 s->index_list[0] = &chip->adc1_list; in snd_m3_substream_open()
1738 s->index_list[1] = &chip->msrc_list; in snd_m3_substream_open()
1739 s->index_list[2] = &chip->dma_list; in snd_m3_substream_open()
1747 struct m3_dma *s = subs->runtime->private_data; in snd_m3_substream_close()
1752 spin_lock_irq(&chip->reg_lock); in snd_m3_substream_close()
1753 if (s->substream && s->running) in snd_m3_substream_close()
1754 snd_m3_pcm_stop(chip, s, s->substream); /* does this happen? */ in snd_m3_substream_close()
1755 if (s->in_lists) { in snd_m3_substream_close()
1756 snd_m3_remove_list(chip, s->index_list[0], s->index[0]); in snd_m3_substream_close()
1757 snd_m3_remove_list(chip, s->index_list[1], s->index[1]); in snd_m3_substream_close()
1758 snd_m3_remove_list(chip, s->index_list[2], s->index[2]); in snd_m3_substream_close()
1759 s->in_lists = 0; in snd_m3_substream_close()
1761 s->running = 0; in snd_m3_substream_close()
1762 s->opened = 0; in snd_m3_substream_close()
1763 spin_unlock_irq(&chip->reg_lock); in snd_m3_substream_close()
1770 struct snd_pcm_runtime *runtime = subs->runtime; in snd_m3_playback_open()
1776 runtime->hw = snd_m3_playback; in snd_m3_playback_open()
1794 struct snd_pcm_runtime *runtime = subs->runtime; in snd_m3_capture_open()
1800 runtime->hw = snd_m3_capture; in snd_m3_capture_open()
1844 err = snd_pcm_new(chip->card, chip->card->driver, device, in snd_m3_pcm()
1852 pcm->private_data = chip; in snd_m3_pcm()
1853 pcm->info_flags = 0; in snd_m3_pcm()
1854 strcpy(pcm->name, chip->card->driver); in snd_m3_pcm()
1855 chip->pcm = pcm; in snd_m3_pcm()
1858 &chip->pci->dev, 64*1024, 64*1024); in snd_m3_pcm()
1880 } while (i-- > 0); in snd_m3_ac97_wait()
1882 dev_err(chip->card->dev, "ac97 serial bus busy\n"); in snd_m3_ac97_wait()
1889 struct snd_m3 *chip = ac97->private_data; in snd_m3_ac97_read()
1905 struct snd_m3 *chip = ac97->private_data; in snd_m3_ac97_write()
1916 if (ac97->id == 0x45838308 && reg == AC97_MASTER) { in snd_m3_ac97_write()
1926 int io = chip->iobase; in snd_m3_remote_codec_config()
1933 if (chip->pci->subsystem_vendor == 0x1028 && in snd_m3_remote_codec_config()
1934 chip->pci->subsystem_device == 0x00e5) in snd_m3_remote_codec_config()
1967 int io = chip->iobase; in snd_m3_ac97_reset()
1969 if (chip->allegro_flag) { in snd_m3_ac97_reset()
1985 if (!chip->irda_workaround) in snd_m3_ac97_reset()
2002 /* ok, bring back the ac-link */ in snd_m3_ac97_reset()
2014 dev_dbg(chip->card->dev, in snd_m3_ac97_reset()
2020 /* more gung-ho reset that doesn't in snd_m3_ac97_reset()
2044 if ((err = snd_ac97_bus(chip->card, 0, &ops, NULL, &pbus)) < 0) in snd_m3_mixer()
2049 if ((err = snd_ac97_mixer(pbus, &ac97, &chip->ac97)) < 0) in snd_m3_mixer()
2053 snd_ac97_write(chip->ac97, AC97_PCM, 0x8000 | (15 << 8) | 15); in snd_m3_mixer()
2055 snd_ac97_write(chip->ac97, AC97_PCM, 0); in snd_m3_mixer()
2061 chip->master_switch = snd_ctl_find_id(chip->card, &elem_id); in snd_m3_mixer()
2065 chip->master_volume = snd_ctl_find_id(chip->card, &elem_id); in snd_m3_mixer()
2103 data = (const __le16 *)chip->assp_kernel_image->data; in snd_m3_assp_init()
2104 for (i = 0 ; i * 2 < chip->assp_kernel_image->size; i++) { in snd_m3_assp_init()
2116 data = (const __le16 *)chip->assp_minisrc_image->data; in snd_m3_assp_init()
2117 for (i = 0; i * 2 < chip->assp_minisrc_image->size; i++) { in snd_m3_assp_init()
2158 chip->mixer_list.curlen = 0; in snd_m3_assp_init()
2159 chip->mixer_list.mem_addr = KDATA_MIXER_XFER0; in snd_m3_assp_init()
2160 chip->mixer_list.max = MAX_VIRTUAL_MIXER_CHANNELS; in snd_m3_assp_init()
2161 chip->adc1_list.curlen = 0; in snd_m3_assp_init()
2162 chip->adc1_list.mem_addr = KDATA_ADC1_XFER0; in snd_m3_assp_init()
2163 chip->adc1_list.max = MAX_VIRTUAL_ADC1_CHANNELS; in snd_m3_assp_init()
2164 chip->dma_list.curlen = 0; in snd_m3_assp_init()
2165 chip->dma_list.mem_addr = KDATA_DMA_XFER0; in snd_m3_assp_init()
2166 chip->dma_list.max = MAX_VIRTUAL_DMA_CHANNELS; in snd_m3_assp_init()
2167 chip->msrc_list.curlen = 0; in snd_m3_assp_init()
2168 chip->msrc_list.mem_addr = KDATA_INSTANCE0_MINISRC; in snd_m3_assp_init()
2169 chip->msrc_list.max = MAX_INSTANCE_MINISRC; in snd_m3_assp_init()
2194 dev_err(chip->card->dev, in snd_m3_assp_client_init()
2197 return -ENOMEM; in snd_m3_assp_client_init()
2200 s->number = index; in snd_m3_assp_client_init()
2201 s->inst.code = 0x400; in snd_m3_assp_client_init()
2202 s->inst.data = address; in snd_m3_assp_client_init()
2204 for (i = data_bytes / 2; i > 0; address++, i--) { in snd_m3_assp_client_init()
2222 int io = chip->iobase; in snd_m3_amp_enable()
2225 if (! chip->external_amp) in snd_m3_amp_enable()
2229 polarity = polarity << chip->amp_gpio; in snd_m3_amp_enable()
2230 gpo = 1 << chip->amp_gpio; in snd_m3_amp_enable()
2246 unsigned long io = chip->iobase; in snd_m3_hv_init()
2249 if (!chip->is_omnibook) in snd_m3_hv_init()
2269 struct pci_dev *pcidev = chip->pci; in snd_m3_chip_init()
2270 unsigned long io = chip->iobase; in snd_m3_chip_init()
2283 n |= chip->hv_config; in snd_m3_chip_init()
2289 outb(RESET_ASSP, chip->iobase + ASSP_CONTROL_B); in snd_m3_chip_init()
2292 if (!chip->allegro_flag) { in snd_m3_chip_init()
2299 if (chip->allegro_flag) { in snd_m3_chip_init()
2305 t = inb(chip->iobase + ASSP_CONTROL_A); in snd_m3_chip_init()
2309 outb(t, chip->iobase + ASSP_CONTROL_A); in snd_m3_chip_init()
2312 outb(RUN_ASSP, chip->iobase + ASSP_CONTROL_B); in snd_m3_chip_init()
2326 unsigned long io = chip->iobase; in snd_m3_enable_ints()
2331 if (chip->hv_config & HV_CTRL_ENABLE) in snd_m3_enable_ints()
2333 outb(val, chip->iobase + HOST_INT_STATUS); in snd_m3_enable_ints()
2348 cancel_work_sync(&chip->hwvol_work); in snd_m3_free()
2350 if (chip->input_dev) in snd_m3_free()
2351 input_unregister_device(chip->input_dev); in snd_m3_free()
2354 if (chip->substreams) { in snd_m3_free()
2355 spin_lock_irq(&chip->reg_lock); in snd_m3_free()
2356 for (i = 0; i < chip->num_substreams; i++) { in snd_m3_free()
2357 s = &chip->substreams[i]; in snd_m3_free()
2359 if (s->substream && s->running) in snd_m3_free()
2360 snd_m3_pcm_stop(chip, s, s->substream); in snd_m3_free()
2362 spin_unlock_irq(&chip->reg_lock); in snd_m3_free()
2363 kfree(chip->substreams); in snd_m3_free()
2365 if (chip->iobase) { in snd_m3_free()
2366 outw(0, chip->iobase + HOST_INT_CTRL); /* disable ints */ in snd_m3_free()
2370 vfree(chip->suspend_mem); in snd_m3_free()
2373 if (chip->irq >= 0) in snd_m3_free()
2374 free_irq(chip->irq, chip); in snd_m3_free()
2376 if (chip->iobase) in snd_m3_free()
2377 pci_release_regions(chip->pci); in snd_m3_free()
2379 release_firmware(chip->assp_kernel_image); in snd_m3_free()
2380 release_firmware(chip->assp_minisrc_image); in snd_m3_free()
2382 pci_disable_device(chip->pci); in snd_m3_free()
2395 struct snd_m3 *chip = card->private_data; in m3_suspend()
2398 if (chip->suspend_mem == NULL) in m3_suspend()
2401 chip->in_suspend = 1; in m3_suspend()
2402 cancel_work_sync(&chip->hwvol_work); in m3_suspend()
2404 snd_ac97_suspend(chip->ac97); in m3_suspend()
2413 chip->suspend_mem[dsp_index++] = in m3_suspend()
2416 chip->suspend_mem[dsp_index++] = in m3_suspend()
2424 struct snd_m3 *chip = card->private_data; in m3_resume()
2427 if (chip->suspend_mem == NULL) in m3_resume()
2442 chip->suspend_mem[dsp_index++]); in m3_resume()
2445 chip->suspend_mem[dsp_index++]); in m3_resume()
2452 snd_ac97_resume(chip->ac97); in m3_resume()
2461 chip->in_suspend = 0; in m3_resume()
2479 return -ENOMEM; in snd_m3_input_register()
2481 snprintf(chip->phys, sizeof(chip->phys), "pci-%s/input0", in snd_m3_input_register()
2482 pci_name(chip->pci)); in snd_m3_input_register()
2484 input_dev->name = chip->card->driver; in snd_m3_input_register()
2485 input_dev->phys = chip->phys; in snd_m3_input_register()
2486 input_dev->id.bustype = BUS_PCI; in snd_m3_input_register()
2487 input_dev->id.vendor = chip->pci->vendor; in snd_m3_input_register()
2488 input_dev->id.product = chip->pci->device; in snd_m3_input_register()
2489 input_dev->dev.parent = &chip->pci->dev; in snd_m3_input_register()
2491 __set_bit(EV_KEY, input_dev->evbit); in snd_m3_input_register()
2492 __set_bit(KEY_MUTE, input_dev->keybit); in snd_m3_input_register()
2493 __set_bit(KEY_VOLUMEDOWN, input_dev->keybit); in snd_m3_input_register()
2494 __set_bit(KEY_VOLUMEUP, input_dev->keybit); in snd_m3_input_register()
2502 chip->input_dev = input_dev; in snd_m3_input_register()
2512 struct snd_m3 *chip = device->device_data; in snd_m3_dev_free()
2532 return -EIO; in snd_m3_create()
2535 if (dma_set_mask(&pci->dev, DMA_BIT_MASK(28)) < 0 || in snd_m3_create()
2536 dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(28)) < 0) { in snd_m3_create()
2537 dev_err(card->dev, in snd_m3_create()
2540 return -ENXIO; in snd_m3_create()
2546 return -ENOMEM; in snd_m3_create()
2549 spin_lock_init(&chip->reg_lock); in snd_m3_create()
2551 switch (pci->device) { in snd_m3_create()
2556 chip->allegro_flag = 1; in snd_m3_create()
2560 chip->card = card; in snd_m3_create()
2561 chip->pci = pci; in snd_m3_create()
2562 chip->irq = -1; in snd_m3_create()
2563 INIT_WORK(&chip->hwvol_work, snd_m3_update_hw_volume); in snd_m3_create()
2565 chip->external_amp = enable_amp; in snd_m3_create()
2567 chip->amp_gpio = amp_gpio; in snd_m3_create()
2571 dev_info(card->dev, "set amp-gpio for '%s'\n", in snd_m3_create()
2573 chip->amp_gpio = quirk->value; in snd_m3_create()
2574 } else if (chip->allegro_flag) in snd_m3_create()
2575 chip->amp_gpio = GPO_EXT_AMP_ALLEGRO; in snd_m3_create()
2577 chip->amp_gpio = GPO_EXT_AMP_M3; in snd_m3_create()
2582 dev_info(card->dev, "enabled irda workaround for '%s'\n", in snd_m3_create()
2584 chip->irda_workaround = 1; in snd_m3_create()
2588 chip->hv_config = quirk->value; in snd_m3_create()
2590 chip->is_omnibook = 1; in snd_m3_create()
2592 chip->num_substreams = NR_DSPS; in snd_m3_create()
2593 chip->substreams = kcalloc(chip->num_substreams, sizeof(struct m3_dma), in snd_m3_create()
2595 if (chip->substreams == NULL) { in snd_m3_create()
2598 return -ENOMEM; in snd_m3_create()
2601 err = request_firmware(&chip->assp_kernel_image, in snd_m3_create()
2602 "ess/maestro3_assp_kernel.fw", &pci->dev); in snd_m3_create()
2606 err = request_firmware(&chip->assp_minisrc_image, in snd_m3_create()
2607 "ess/maestro3_assp_minisrc.fw", &pci->dev); in snd_m3_create()
2611 err = pci_request_regions(pci, card->driver); in snd_m3_create()
2615 chip->iobase = pci_resource_start(pci, 0); in snd_m3_create()
2629 if (request_irq(pci->irq, snd_m3_interrupt, IRQF_SHARED, in snd_m3_create()
2631 dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); in snd_m3_create()
2632 err = -ENOMEM; in snd_m3_create()
2635 chip->irq = pci->irq; in snd_m3_create()
2636 card->sync_irq = chip->irq; in snd_m3_create()
2639 chip->suspend_mem = in snd_m3_create()
2643 if (chip->suspend_mem == NULL) in snd_m3_create()
2644 dev_warn(card->dev, "can't allocate apm buffer\n"); in snd_m3_create()
2654 for (i = 0; i < chip->num_substreams; i++) { in snd_m3_create()
2655 struct m3_dma *s = &chip->substreams[i]; in snd_m3_create()
2664 if (chip->hv_config & HV_CTRL_ENABLE) { in snd_m3_create()
2667 dev_warn(card->dev, in snd_m3_create()
2696 if (((pci->class >> 8) & 0xffff) != PCI_CLASS_MULTIMEDIA_AUDIO) in snd_m3_probe()
2697 return -ENODEV; in snd_m3_probe()
2700 return -ENODEV; in snd_m3_probe()
2703 return -ENOENT; in snd_m3_probe()
2706 err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, in snd_m3_probe()
2711 switch (pci->device) { in snd_m3_probe()
2714 strcpy(card->driver, "Allegro"); in snd_m3_probe()
2718 strcpy(card->driver, "Canyon3D-2"); in snd_m3_probe()
2721 strcpy(card->driver, "Maestro3"); in snd_m3_probe()
2729 card->private_data = chip; in snd_m3_probe()
2731 sprintf(card->shortname, "ESS %s PCI", card->driver); in snd_m3_probe()
2732 sprintf(card->longname, "%s at 0x%lx, irq %d", in snd_m3_probe()
2733 card->shortname, chip->iobase, chip->irq); in snd_m3_probe()
2741 err = snd_mpu401_uart_new(chip->card, 0, MPU401_HW_MPU401, in snd_m3_probe()
2742 chip->iobase + MPU401_DATA_PORT, in snd_m3_probe()
2744 -1, &chip->rmidi); in snd_m3_probe()
2746 dev_warn(card->dev, "no MIDI support.\n"); in snd_m3_probe()