Lines Matching +full:adc +full:- +full:diff +full:- +full:channels
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Driver for ESS Solo-1 (ES1938, ES1946, ES1969) soundcard
7 * Abramo Bagnara <abramo@alsa-project.org>,
18 - Capture data is written unaligned starting from dma_base + 1 so I need to
20 - After several cycle of the following:
21 while : ; do arecord -d1 -f cd -t raw | aplay -f cd ; done
25 - Sometimes the interrupt handler is invoked wrongly during playback.
31 hdparm -t -T /dev/hda
42 #include <linux/dma-mapping.h>
53 MODULE_DESCRIPTION("ESS Solo-1");
64 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
69 MODULE_PARM_DESC(index, "Index value for ESS Solo-1 soundcard.");
71 MODULE_PARM_DESC(id, "ID string for ESS Solo-1 soundcard.");
73 MODULE_PARM_DESC(enable, "Enable ESS Solo-1 soundcard.");
75 #define SLIO_REG(chip, x) ((chip)->io_port + ESSIO_REG_##x)
77 #define SLDM_REG(chip, x) ((chip)->ddma_port + ESSDM_REG_##x)
79 #define SLSB_REG(chip, x) ((chip)->sb_port + ESSSB_REG_##x)
231 { PCI_VDEVICE(ESS, 0x1969), 0, }, /* Solo-1 */
241 /* -----------------------------------------------------------------
243 * -----------------------------------------------------------------*/
247 spin_lock_irqsave(&chip->mixer_lock, flags); in snd_es1938_mixer_write()
250 spin_unlock_irqrestore(&chip->mixer_lock, flags); in snd_es1938_mixer_write()
251 dev_dbg(chip->card->dev, "Mixer reg %02x set to %02x\n", reg, val); in snd_es1938_mixer_write()
254 /* -----------------------------------------------------------------
256 * -----------------------------------------------------------------*/
261 spin_lock_irqsave(&chip->mixer_lock, flags); in snd_es1938_mixer_read()
264 spin_unlock_irqrestore(&chip->mixer_lock, flags); in snd_es1938_mixer_read()
265 dev_dbg(chip->card->dev, "Mixer reg %02x now is %02x\n", reg, data); in snd_es1938_mixer_read()
269 /* -----------------------------------------------------------------
271 * -----------------------------------------------------------------*/
277 spin_lock_irqsave(&chip->mixer_lock, flags); in snd_es1938_mixer_bits()
284 dev_dbg(chip->card->dev, in snd_es1938_mixer_bits()
288 spin_unlock_irqrestore(&chip->mixer_lock, flags); in snd_es1938_mixer_bits()
292 /* -----------------------------------------------------------------
294 * -----------------------------------------------------------------*/
305 dev_err(chip->card->dev, in snd_es1938_write_cmd()
309 /* -----------------------------------------------------------------
311 * -----------------------------------------------------------------*/
316 for (i = GET_LOOP_TIMEOUT; i; i--) in snd_es1938_get_byte()
319 dev_err(chip->card->dev, "get_byte timeout: status 0x02%x\n", v); in snd_es1938_get_byte()
320 return -ENODEV; in snd_es1938_get_byte()
323 /* -----------------------------------------------------------------
325 * -----------------------------------------------------------------*/
329 spin_lock_irqsave(&chip->reg_lock, flags); in snd_es1938_write()
332 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_es1938_write()
333 dev_dbg(chip->card->dev, "Reg %02x set to %02x\n", reg, val); in snd_es1938_write()
336 /* -----------------------------------------------------------------
338 * -----------------------------------------------------------------*/
343 spin_lock_irqsave(&chip->reg_lock, flags); in snd_es1938_read()
347 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_es1938_read()
348 dev_dbg(chip->card->dev, "Reg %02x now is %02x\n", reg, val); in snd_es1938_read()
352 /* -----------------------------------------------------------------
354 * -----------------------------------------------------------------*/
360 spin_lock_irqsave(&chip->reg_lock, flags); in snd_es1938_bits()
369 dev_dbg(chip->card->dev, "Reg %02x was %02x, set to %02x\n", in snd_es1938_bits()
372 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_es1938_bits()
376 /* --------------------------------------------------------------------
378 * --------------------------------------------------------------------*/
392 dev_err(chip->card->dev, "ESS Solo-1 reset failed\n"); in snd_es1938_reset()
415 /* --------------------------------------------------------------------
417 * --------------------------------------------------------------------*/
450 struct snd_pcm_runtime *runtime = substream->runtime; in snd_es1938_rate_set()
451 if (runtime->rate_num == clocks[0].num) in snd_es1938_rate_set()
452 bits = 128 - runtime->rate_den; in snd_es1938_rate_set()
454 bits = 256 - runtime->rate_den; in snd_es1938_rate_set()
457 div0 = 256 - 7160000*20/(8*82*runtime->rate); in snd_es1938_rate_set()
468 /* --------------------------------------------------------------------
470 * --------------------------------------------------------------------*/
475 outl(chip->dma2_start, SLIO_REG(chip, AUDIO2DMAADDR)); in snd_es1938_playback1_setdma()
477 outw(chip->dma2_size, SLIO_REG(chip, AUDIO2DMACOUNT)); in snd_es1938_playback1_setdma()
489 outl(chip->dma1_start, SLDM_REG(chip, DMAADDR)); in snd_es1938_playback2_setdma()
490 outw(chip->dma1_size - 1, SLDM_REG(chip, DMACOUNT)); in snd_es1938_playback2_setdma()
504 outl(chip->dma1_start, SLDM_REG(chip, DMAADDR)); in snd_es1938_capture_setdma()
505 chip->last_capture_dmaaddr = chip->dma1_start; in snd_es1938_capture_setdma()
506 outw(chip->dma1_size - 1, SLDM_REG(chip, DMACOUNT)); in snd_es1938_capture_setdma()
511 /* ----------------------------------------------------------------------
525 chip->active |= ADC1; in snd_es1938_capture_trigger()
530 chip->active &= ~ADC1; in snd_es1938_capture_trigger()
533 return -EINVAL; in snd_es1938_capture_trigger()
547 0x13 but that value may randomly swap stereo channels */ in snd_es1938_playback1_trigger()
551 /* This two stage init gives the FIFO -> DAC connection time to in snd_es1938_playback1_trigger()
553 * no swapping of stereo channels. Report a bug if otherwise :-) */ in snd_es1938_playback1_trigger()
555 chip->active |= DAC2; in snd_es1938_playback1_trigger()
561 chip->active &= ~DAC2; in snd_es1938_playback1_trigger()
564 return -EINVAL; in snd_es1938_playback1_trigger()
578 chip->active |= DAC1; in snd_es1938_playback2_trigger()
583 chip->active &= ~DAC1; in snd_es1938_playback2_trigger()
586 return -EINVAL; in snd_es1938_playback2_trigger()
595 switch (substream->number) { in snd_es1938_playback_trigger()
602 return -EINVAL; in snd_es1938_playback_trigger()
605 /* --------------------------------------------------------------------
606 * First channel for Extended Mode Audio 1 ADC Operation
607 * --------------------------------------------------------------------*/
611 struct snd_pcm_runtime *runtime = substream->runtime; in snd_es1938_capture_prepare()
616 chip->dma1_size = size; in snd_es1938_capture_prepare()
617 chip->dma1_start = runtime->dma_addr; in snd_es1938_capture_prepare()
619 mono = (runtime->channels > 1) ? 0 : 1; in snd_es1938_capture_prepare()
620 is8 = snd_pcm_format_width(runtime->format) == 16 ? 0 : 1; in snd_es1938_capture_prepare()
621 u = snd_pcm_format_unsigned(runtime->format); in snd_es1938_capture_prepare()
623 chip->dma1_shift = 2 - mono - is8; in snd_es1938_capture_prepare()
633 count = 0x10000 - count; in snd_es1938_capture_prepare()
637 /* initialize and configure ADC */ in snd_es1938_capture_prepare()
653 /* ------------------------------------------------------------------------------
655 * ------------------------------------------------------------------------------*/
659 struct snd_pcm_runtime *runtime = substream->runtime; in snd_es1938_playback1_prepare()
664 chip->dma2_size = size; in snd_es1938_playback1_prepare()
665 chip->dma2_start = runtime->dma_addr; in snd_es1938_playback1_prepare()
667 mono = (runtime->channels > 1) ? 0 : 1; in snd_es1938_playback1_prepare()
668 is8 = snd_pcm_format_width(runtime->format) == 16 ? 0 : 1; in snd_es1938_playback1_prepare()
669 u = snd_pcm_format_unsigned(runtime->format); in snd_es1938_playback1_prepare()
671 chip->dma2_shift = 2 - mono - is8; in snd_es1938_playback1_prepare()
679 count = 0x10000 - count; in snd_es1938_playback1_prepare()
696 struct snd_pcm_runtime *runtime = substream->runtime; in snd_es1938_playback2_prepare()
701 chip->dma1_size = size; in snd_es1938_playback2_prepare()
702 chip->dma1_start = runtime->dma_addr; in snd_es1938_playback2_prepare()
704 mono = (runtime->channels > 1) ? 0 : 1; in snd_es1938_playback2_prepare()
705 is8 = snd_pcm_format_width(runtime->format) == 16 ? 0 : 1; in snd_es1938_playback2_prepare()
706 u = snd_pcm_format_unsigned(runtime->format); in snd_es1938_playback2_prepare()
708 chip->dma1_shift = 2 - mono - is8; in snd_es1938_playback2_prepare()
710 count = 0x10000 - count; in snd_es1938_playback2_prepare()
737 switch (substream->number) { in snd_es1938_playback_prepare()
744 return -EINVAL; in snd_es1938_playback_prepare()
750 - is the current DMA address in the valid DMA range ?
751 - is the sum of DMA address and DMA counter pointing to the last DMA byte ?
761 /* This stuff is *needed*, don't ask why - AB */ in snd_es1938_capture_pointer()
765 ptr = chip->dma1_size - 1 - new; in snd_es1938_capture_pointer()
768 unsigned int diff; in snd_es1938_capture_pointer() local
772 diff = chip->dma1_start + chip->dma1_size - ptr - count; in snd_es1938_capture_pointer()
774 if (diff > 3 || ptr < chip->dma1_start in snd_es1938_capture_pointer()
775 || ptr >= chip->dma1_start+chip->dma1_size) in snd_es1938_capture_pointer()
776 ptr = chip->last_capture_dmaaddr; /* bad, use last saved */ in snd_es1938_capture_pointer()
778 chip->last_capture_dmaaddr = ptr; /* good, remember it */ in snd_es1938_capture_pointer()
780 ptr -= chip->dma1_start; in snd_es1938_capture_pointer()
782 return ptr >> chip->dma1_shift; in snd_es1938_capture_pointer()
790 ptr = chip->dma2_size - inw(SLIO_REG(chip, AUDIO2DMACOUNT)); in snd_es1938_playback1_pointer()
792 ptr = inl(SLIO_REG(chip, AUDIO2DMAADDR)) - chip->dma2_start; in snd_es1938_playback1_pointer()
794 return ptr >> chip->dma2_shift; in snd_es1938_playback1_pointer()
803 /* This stuff is *needed*, don't ask why - AB */ in snd_es1938_playback2_pointer()
807 ptr = chip->dma1_size - 1 - new; in snd_es1938_playback2_pointer()
809 ptr = inl(SLDM_REG(chip, DMAADDR)) - chip->dma1_start; in snd_es1938_playback2_pointer()
811 return ptr >> chip->dma1_shift; in snd_es1938_playback2_pointer()
816 switch (substream->number) { in snd_es1938_playback_pointer()
823 return -EINVAL; in snd_es1938_playback_pointer()
830 struct snd_pcm_runtime *runtime = substream->runtime; in snd_es1938_capture_copy()
833 if (snd_BUG_ON(pos + count > chip->dma1_size)) in snd_es1938_capture_copy()
834 return -EINVAL; in snd_es1938_capture_copy()
835 if (pos + count < chip->dma1_size) { in snd_es1938_capture_copy()
836 if (copy_to_user(dst, runtime->dma_area + pos + 1, count)) in snd_es1938_capture_copy()
837 return -EFAULT; in snd_es1938_capture_copy()
839 if (copy_to_user(dst, runtime->dma_area + pos + 1, count - 1)) in snd_es1938_capture_copy()
840 return -EFAULT; in snd_es1938_capture_copy()
841 if (put_user(runtime->dma_area[0], in snd_es1938_capture_copy()
842 ((unsigned char __user *)dst) + count - 1)) in snd_es1938_capture_copy()
843 return -EFAULT; in snd_es1938_capture_copy()
852 struct snd_pcm_runtime *runtime = substream->runtime; in snd_es1938_capture_copy_kernel()
855 if (snd_BUG_ON(pos + count > chip->dma1_size)) in snd_es1938_capture_copy_kernel()
856 return -EINVAL; in snd_es1938_capture_copy_kernel()
857 if (pos + count < chip->dma1_size) { in snd_es1938_capture_copy_kernel()
858 memcpy(dst, runtime->dma_area + pos + 1, count); in snd_es1938_capture_copy_kernel()
860 memcpy(dst, runtime->dma_area + pos + 1, count - 1); in snd_es1938_capture_copy_kernel()
861 runtime->dma_area[0] = *((unsigned char *)dst + count - 1); in snd_es1938_capture_copy_kernel()
866 /* ----------------------------------------------------------------------
867 * Audio1 Capture (ADC)
868 * ----------------------------------------------------------------------*/
888 /* -----------------------------------------------------------------------
890 * -----------------------------------------------------------------------*/
914 struct snd_pcm_runtime *runtime = substream->runtime; in snd_es1938_capture_open()
916 if (chip->playback2_substream) in snd_es1938_capture_open()
917 return -EAGAIN; in snd_es1938_capture_open()
918 chip->capture_substream = substream; in snd_es1938_capture_open()
919 runtime->hw = snd_es1938_capture; in snd_es1938_capture_open()
929 struct snd_pcm_runtime *runtime = substream->runtime; in snd_es1938_playback_open()
931 switch (substream->number) { in snd_es1938_playback_open()
933 chip->playback1_substream = substream; in snd_es1938_playback_open()
936 if (chip->capture_substream) in snd_es1938_playback_open()
937 return -EAGAIN; in snd_es1938_playback_open()
938 chip->playback2_substream = substream; in snd_es1938_playback_open()
942 return -EINVAL; in snd_es1938_playback_open()
944 runtime->hw = snd_es1938_playback; in snd_es1938_playback_open()
955 chip->capture_substream = NULL; in snd_es1938_capture_close()
963 switch (substream->number) { in snd_es1938_playback_close()
965 chip->playback1_substream = NULL; in snd_es1938_playback_close()
968 chip->playback2_substream = NULL; in snd_es1938_playback_close()
972 return -EINVAL; in snd_es1938_playback_close()
1000 if ((err = snd_pcm_new(chip->card, "es-1938-1946", device, 2, 1, &pcm)) < 0) in snd_es1938_new_pcm()
1005 pcm->private_data = chip; in snd_es1938_new_pcm()
1006 pcm->info_flags = 0; in snd_es1938_new_pcm()
1007 strcpy(pcm->name, "ESS Solo-1"); in snd_es1938_new_pcm()
1010 &chip->pci->dev, 64*1024, 64*1024); in snd_es1938_new_pcm()
1012 chip->pcm = pcm; in snd_es1938_new_pcm()
1016 /* -------------------------------------------------------------------
1036 ucontrol->value.enumerated.item[0] = snd_es1938_mixer_read(chip, 0x1c) & 0x07; in snd_es1938_get_mux()
1044 unsigned char val = ucontrol->value.enumerated.item[0]; in snd_es1938_put_mux()
1047 return -EINVAL; in snd_es1938_put_mux()
1058 ucontrol->value.integer.value[0] = !!(val & 8); in snd_es1938_get_spatializer_enable()
1068 nval = ucontrol->value.integer.value[0] ? 0x0c : 0x04; in snd_es1938_put_spatializer_enable()
1081 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_es1938_info_hw_volume()
1082 uinfo->count = 2; in snd_es1938_info_hw_volume()
1083 uinfo->value.integer.min = 0; in snd_es1938_info_hw_volume()
1084 uinfo->value.integer.max = 63; in snd_es1938_info_hw_volume()
1092 ucontrol->value.integer.value[0] = snd_es1938_mixer_read(chip, 0x61) & 0x3f; in snd_es1938_get_hw_volume()
1093 ucontrol->value.integer.value[1] = snd_es1938_mixer_read(chip, 0x63) & 0x3f; in snd_es1938_get_hw_volume()
1103 ucontrol->value.integer.value[0] = !(snd_es1938_mixer_read(chip, 0x61) & 0x40); in snd_es1938_get_hw_switch()
1104 ucontrol->value.integer.value[1] = !(snd_es1938_mixer_read(chip, 0x63) & 0x40); in snd_es1938_get_hw_switch()
1111 chip->master_volume = NULL; in snd_es1938_hwv_free()
1112 chip->master_switch = NULL; in snd_es1938_hwv_free()
1113 chip->hw_volume = NULL; in snd_es1938_hwv_free()
1114 chip->hw_switch = NULL; in snd_es1938_hwv_free()
1151 int mask = (kcontrol->private_value >> 16) & 0xff; in snd_es1938_info_single()
1153 uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_es1938_info_single()
1154 uinfo->count = 1; in snd_es1938_info_single()
1155 uinfo->value.integer.min = 0; in snd_es1938_info_single()
1156 uinfo->value.integer.max = mask; in snd_es1938_info_single()
1164 int reg = kcontrol->private_value & 0xff; in snd_es1938_get_single()
1165 int shift = (kcontrol->private_value >> 8) & 0xff; in snd_es1938_get_single()
1166 int mask = (kcontrol->private_value >> 16) & 0xff; in snd_es1938_get_single()
1167 int invert = (kcontrol->private_value >> 24) & 0xff; in snd_es1938_get_single()
1171 ucontrol->value.integer.value[0] = (val >> shift) & mask; in snd_es1938_get_single()
1173 ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0]; in snd_es1938_get_single()
1181 int reg = kcontrol->private_value & 0xff; in snd_es1938_put_single()
1182 int shift = (kcontrol->private_value >> 8) & 0xff; in snd_es1938_put_single()
1183 int mask = (kcontrol->private_value >> 16) & 0xff; in snd_es1938_put_single()
1184 int invert = (kcontrol->private_value >> 24) & 0xff; in snd_es1938_put_single()
1187 val = (ucontrol->value.integer.value[0] & mask); in snd_es1938_put_single()
1189 val = mask - val; in snd_es1938_put_single()
1212 int mask = (kcontrol->private_value >> 24) & 0xff; in snd_es1938_info_double()
1214 uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_es1938_info_double()
1215 uinfo->count = 2; in snd_es1938_info_double()
1216 uinfo->value.integer.min = 0; in snd_es1938_info_double()
1217 uinfo->value.integer.max = mask; in snd_es1938_info_double()
1225 int left_reg = kcontrol->private_value & 0xff; in snd_es1938_get_double()
1226 int right_reg = (kcontrol->private_value >> 8) & 0xff; in snd_es1938_get_double()
1227 int shift_left = (kcontrol->private_value >> 16) & 0x07; in snd_es1938_get_double()
1228 int shift_right = (kcontrol->private_value >> 19) & 0x07; in snd_es1938_get_double()
1229 int mask = (kcontrol->private_value >> 24) & 0xff; in snd_es1938_get_double()
1230 int invert = (kcontrol->private_value >> 22) & 1; in snd_es1938_get_double()
1238 ucontrol->value.integer.value[0] = (left >> shift_left) & mask; in snd_es1938_get_double()
1239 ucontrol->value.integer.value[1] = (right >> shift_right) & mask; in snd_es1938_get_double()
1241 ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0]; in snd_es1938_get_double()
1242 ucontrol->value.integer.value[1] = mask - ucontrol->value.integer.value[1]; in snd_es1938_get_double()
1251 int left_reg = kcontrol->private_value & 0xff; in snd_es1938_put_double()
1252 int right_reg = (kcontrol->private_value >> 8) & 0xff; in snd_es1938_put_double()
1253 int shift_left = (kcontrol->private_value >> 16) & 0x07; in snd_es1938_put_double()
1254 int shift_right = (kcontrol->private_value >> 19) & 0x07; in snd_es1938_put_double()
1255 int mask = (kcontrol->private_value >> 24) & 0xff; in snd_es1938_put_double()
1256 int invert = (kcontrol->private_value >> 22) & 1; in snd_es1938_put_double()
1260 val1 = ucontrol->value.integer.value[0] & mask; in snd_es1938_put_double()
1261 val2 = ucontrol->value.integer.value[1] & mask; in snd_es1938_put_double()
1263 val1 = mask - val1; in snd_es1938_put_double()
1264 val2 = mask - val2; in snd_es1938_put_double()
1284 0, 54, TLV_DB_SCALE_ITEM(-3600, 50, 1),
1285 54, 63, TLV_DB_SCALE_ITEM(-900, 100, 0),
1289 0, 8, TLV_DB_SCALE_ITEM(-3300, 300, 1),
1290 8, 15, TLV_DB_SCALE_ITEM(-900, 150, 0),
1294 0, 8, TLV_DB_SCALE_ITEM(-3450, 300, 1),
1295 8, 15, TLV_DB_SCALE_ITEM(-1050, 150, 0),
1299 0, 8, TLV_DB_SCALE_ITEM(-2400, 300, 1),
1304 0, 8, TLV_DB_SCALE_ITEM(-3150, 300, 1),
1305 8, 15, TLV_DB_SCALE_ITEM(-750, 150, 0),
1374 ES1938_SINGLE("3D Control - Level", 0, 0x52, 0, 63, 0),
1377 .name = "3D Control - Switch",
1386 /* ---------------------------------------------------------------------------- */
1387 /* ---------------------------------------------------------------------------- */
1390 * initialize the chip - used by resume callback, too
1400 pci_set_master(chip->pci); in snd_es1938_chip_init()
1403 pci_write_config_word(chip->pci, SL_PCI_LEGACYCONTROL, 0x805f); in snd_es1938_chip_init()
1406 pci_write_config_word(chip->pci, SL_PCI_DDMACONTROL, chip->ddma_port | 1); in snd_es1938_chip_init()
1409 pci_write_config_dword(chip->pci, SL_PCI_CONFIG, 0); in snd_es1938_chip_init()
1434 struct es1938 *chip = card->private_data; in es1938_suspend()
1440 /* save mixer-related registers */ in es1938_suspend()
1441 for (s = saved_regs, d = chip->saved_regs; *s; s++, d++) in es1938_suspend()
1445 if (chip->irq >= 0) { in es1938_suspend()
1446 free_irq(chip->irq, chip); in es1938_suspend()
1447 chip->irq = -1; in es1938_suspend()
1448 card->sync_irq = -1; in es1938_suspend()
1457 struct es1938 *chip = card->private_data; in es1938_resume()
1461 if (request_irq(pci->irq, snd_es1938_interrupt, in es1938_resume()
1464 pci->irq); in es1938_resume()
1466 return -EIO; in es1938_resume()
1468 chip->irq = pci->irq; in es1938_resume()
1469 card->sync_irq = chip->irq; in es1938_resume()
1472 /* restore mixer-related registers */ in es1938_resume()
1473 for (s = saved_regs, d = chip->saved_regs; *s; s++, d++) { in es1938_resume()
1495 chip->gameport = gp = gameport_allocate_port(); in snd_es1938_create_gameport()
1497 dev_err(chip->card->dev, in snd_es1938_create_gameport()
1499 return -ENOMEM; in snd_es1938_create_gameport()
1503 gameport_set_phys(gp, "pci%s/gameport0", pci_name(chip->pci)); in snd_es1938_create_gameport()
1504 gameport_set_dev_parent(gp, &chip->pci->dev); in snd_es1938_create_gameport()
1505 gp->io = chip->game_port; in snd_es1938_create_gameport()
1514 if (chip->gameport) { in snd_es1938_free_gameport()
1515 gameport_unregister_port(chip->gameport); in snd_es1938_free_gameport()
1516 chip->gameport = NULL; in snd_es1938_free_gameport()
1520 static inline int snd_es1938_create_gameport(struct es1938 *chip) { return -ENOSYS; } in snd_es1938_create_gameport()
1528 if (chip->rmidi) in snd_es1938_free()
1533 if (chip->irq >= 0) in snd_es1938_free()
1534 free_irq(chip->irq, chip); in snd_es1938_free()
1535 pci_release_regions(chip->pci); in snd_es1938_free()
1536 pci_disable_device(chip->pci); in snd_es1938_free()
1543 struct es1938 *chip = device->device_data; in snd_es1938_dev_free()
1563 if (dma_set_mask(&pci->dev, DMA_BIT_MASK(24)) < 0 || in snd_es1938_create()
1564 dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(24)) < 0) { in snd_es1938_create()
1565 dev_err(card->dev, in snd_es1938_create()
1568 return -ENXIO; in snd_es1938_create()
1574 return -ENOMEM; in snd_es1938_create()
1576 spin_lock_init(&chip->reg_lock); in snd_es1938_create()
1577 spin_lock_init(&chip->mixer_lock); in snd_es1938_create()
1578 chip->card = card; in snd_es1938_create()
1579 chip->pci = pci; in snd_es1938_create()
1580 chip->irq = -1; in snd_es1938_create()
1581 if ((err = pci_request_regions(pci, "ESS Solo-1")) < 0) { in snd_es1938_create()
1586 chip->io_port = pci_resource_start(pci, 0); in snd_es1938_create()
1587 chip->sb_port = pci_resource_start(pci, 1); in snd_es1938_create()
1588 chip->vc_port = pci_resource_start(pci, 2); in snd_es1938_create()
1589 chip->mpu_port = pci_resource_start(pci, 3); in snd_es1938_create()
1590 chip->game_port = pci_resource_start(pci, 4); in snd_es1938_create()
1591 if (request_irq(pci->irq, snd_es1938_interrupt, IRQF_SHARED, in snd_es1938_create()
1593 dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); in snd_es1938_create()
1595 return -EBUSY; in snd_es1938_create()
1597 chip->irq = pci->irq; in snd_es1938_create()
1598 card->sync_irq = chip->irq; in snd_es1938_create()
1599 dev_dbg(card->dev, in snd_es1938_create()
1601 chip->io_port, chip->sb_port, chip->vc_port, chip->mpu_port, chip->game_port); in snd_es1938_create()
1603 chip->ddma_port = chip->vc_port + 0x00; /* fix from Thomas Sailer */ in snd_es1938_create()
1616 /* --------------------------------------------------------------------
1618 * -------------------------------------------------------------------- */
1628 dev_dbg(chip->card->dev, in snd_es1938_interrupt()
1629 "Es1938debug - interrupt status: =0x%x\n", status); in snd_es1938_interrupt()
1635 dev_dbg(chip->card->dev, in snd_es1938_interrupt()
1636 "Es1938debug - AUDIO channel 1 interrupt\n"); in snd_es1938_interrupt()
1637 dev_dbg(chip->card->dev, in snd_es1938_interrupt()
1638 "Es1938debug - AUDIO channel 1 DMAC DMA count: %u\n", in snd_es1938_interrupt()
1640 dev_dbg(chip->card->dev, in snd_es1938_interrupt()
1641 "Es1938debug - AUDIO channel 1 DMAC DMA base: %u\n", in snd_es1938_interrupt()
1643 dev_dbg(chip->card->dev, in snd_es1938_interrupt()
1644 "Es1938debug - AUDIO channel 1 DMAC DMA status: 0x%x\n", in snd_es1938_interrupt()
1650 if (chip->active & ADC1) in snd_es1938_interrupt()
1651 snd_pcm_period_elapsed(chip->capture_substream); in snd_es1938_interrupt()
1652 else if (chip->active & DAC1) in snd_es1938_interrupt()
1653 snd_pcm_period_elapsed(chip->playback2_substream); in snd_es1938_interrupt()
1659 dev_dbg(chip->card->dev, in snd_es1938_interrupt()
1660 "Es1938debug - AUDIO channel 2 interrupt\n"); in snd_es1938_interrupt()
1661 dev_dbg(chip->card->dev, in snd_es1938_interrupt()
1662 "Es1938debug - AUDIO channel 2 DMAC DMA count: %u\n", in snd_es1938_interrupt()
1664 dev_dbg(chip->card->dev, in snd_es1938_interrupt()
1665 "Es1938debug - AUDIO channel 2 DMAC DMA base: %u\n", in snd_es1938_interrupt()
1672 if (chip->active & DAC2) in snd_es1938_interrupt()
1673 snd_pcm_period_elapsed(chip->playback1_substream); in snd_es1938_interrupt()
1680 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_switch->id); in snd_es1938_interrupt()
1681 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_volume->id); in snd_es1938_interrupt()
1683 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, in snd_es1938_interrupt()
1684 &chip->master_switch->id); in snd_es1938_interrupt()
1685 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, in snd_es1938_interrupt()
1686 &chip->master_volume->id); in snd_es1938_interrupt()
1695 // replacing the last 0 by 0x40 works for ESS-Solo1, but just doing nothing works as well! in snd_es1938_interrupt()
1696 // andreas@flying-snail.de in snd_es1938_interrupt()
1698 if (chip->rmidi) { in snd_es1938_interrupt()
1700 snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data); in snd_es1938_interrupt()
1714 card = chip->card; in snd_es1938_mixer()
1716 strcpy(card->mixername, "ESS Solo-1"); in snd_es1938_mixer()
1723 chip->master_volume = kctl; in snd_es1938_mixer()
1724 kctl->private_free = snd_es1938_hwv_free; in snd_es1938_mixer()
1727 chip->master_switch = kctl; in snd_es1938_mixer()
1728 kctl->private_free = snd_es1938_hwv_free; in snd_es1938_mixer()
1731 chip->hw_volume = kctl; in snd_es1938_mixer()
1732 kctl->private_free = snd_es1938_hwv_free; in snd_es1938_mixer()
1735 chip->hw_switch = kctl; in snd_es1938_mixer()
1736 kctl->private_free = snd_es1938_hwv_free; in snd_es1938_mixer()
1756 return -ENODEV; in snd_es1938_probe()
1759 return -ENOENT; in snd_es1938_probe()
1762 err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, in snd_es1938_probe()
1770 return -ENODEV; in snd_es1938_probe()
1777 card->private_data = chip; in snd_es1938_probe()
1779 strcpy(card->driver, "ES1938"); in snd_es1938_probe()
1780 strcpy(card->shortname, "ESS ES1938 (Solo-1)"); in snd_es1938_probe()
1781 sprintf(card->longname, "%s rev %i, irq %i", in snd_es1938_probe()
1782 card->shortname, in snd_es1938_probe()
1783 chip->revision, in snd_es1938_probe()
1784 chip->irq); in snd_es1938_probe()
1798 dev_err(card->dev, "OPL3 not detected at 0x%lx\n", in snd_es1938_probe()
1811 chip->mpu_port, in snd_es1938_probe()
1813 -1, &chip->rmidi) < 0) { in snd_es1938_probe()
1814 dev_err(card->dev, "unable to initialize MPU-401\n"); in snd_es1938_probe()
1816 // this line is vital for MIDI interrupt handling on ess-solo1 in snd_es1938_probe()
1817 // andreas@flying-snail.de in snd_es1938_probe()