Lines Matching refs:chip
90 #define SLIO_REG(chip, x) ((chip)->io_port + ESSIO_REG_##x) argument
92 #define SLDM_REG(chip, x) ((chip)->ddma_port + ESSDM_REG_##x) argument
94 #define SLSB_REG(chip, x) ((chip)->sb_port + ESSSB_REG_##x) argument
259 static void snd_es1938_mixer_write(struct es1938 *chip, unsigned char reg, unsigned char val) in snd_es1938_mixer_write() argument
262 spin_lock_irqsave(&chip->mixer_lock, flags); in snd_es1938_mixer_write()
263 outb(reg, SLSB_REG(chip, MIXERADDR)); in snd_es1938_mixer_write()
264 outb(val, SLSB_REG(chip, MIXERDATA)); in snd_es1938_mixer_write()
265 spin_unlock_irqrestore(&chip->mixer_lock, flags); in snd_es1938_mixer_write()
266 dev_dbg(chip->card->dev, "Mixer reg %02x set to %02x\n", reg, val); in snd_es1938_mixer_write()
272 static int snd_es1938_mixer_read(struct es1938 *chip, unsigned char reg) in snd_es1938_mixer_read() argument
276 spin_lock_irqsave(&chip->mixer_lock, flags); in snd_es1938_mixer_read()
277 outb(reg, SLSB_REG(chip, MIXERADDR)); in snd_es1938_mixer_read()
278 data = inb(SLSB_REG(chip, MIXERDATA)); in snd_es1938_mixer_read()
279 spin_unlock_irqrestore(&chip->mixer_lock, flags); in snd_es1938_mixer_read()
280 dev_dbg(chip->card->dev, "Mixer reg %02x now is %02x\n", reg, data); in snd_es1938_mixer_read()
287 static int snd_es1938_mixer_bits(struct es1938 *chip, unsigned char reg, in snd_es1938_mixer_bits() argument
292 spin_lock_irqsave(&chip->mixer_lock, flags); in snd_es1938_mixer_bits()
293 outb(reg, SLSB_REG(chip, MIXERADDR)); in snd_es1938_mixer_bits()
294 old = inb(SLSB_REG(chip, MIXERDATA)); in snd_es1938_mixer_bits()
298 outb(new, SLSB_REG(chip, MIXERDATA)); in snd_es1938_mixer_bits()
299 dev_dbg(chip->card->dev, in snd_es1938_mixer_bits()
303 spin_unlock_irqrestore(&chip->mixer_lock, flags); in snd_es1938_mixer_bits()
310 static void snd_es1938_write_cmd(struct es1938 *chip, unsigned char cmd) in snd_es1938_write_cmd() argument
315 if (!(v = inb(SLSB_REG(chip, READSTATUS)) & 0x80)) { in snd_es1938_write_cmd()
316 outb(cmd, SLSB_REG(chip, WRITEDATA)); in snd_es1938_write_cmd()
320 dev_err(chip->card->dev, in snd_es1938_write_cmd()
327 static int snd_es1938_get_byte(struct es1938 *chip) in snd_es1938_get_byte() argument
332 if ((v = inb(SLSB_REG(chip, STATUS))) & 0x80) in snd_es1938_get_byte()
333 return inb(SLSB_REG(chip, READDATA)); in snd_es1938_get_byte()
334 dev_err(chip->card->dev, "get_byte timeout: status 0x02%x\n", v); in snd_es1938_get_byte()
341 static void snd_es1938_write(struct es1938 *chip, unsigned char reg, unsigned char val) in snd_es1938_write() argument
344 spin_lock_irqsave(&chip->reg_lock, flags); in snd_es1938_write()
345 snd_es1938_write_cmd(chip, reg); in snd_es1938_write()
346 snd_es1938_write_cmd(chip, val); in snd_es1938_write()
347 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_es1938_write()
348 dev_dbg(chip->card->dev, "Reg %02x set to %02x\n", reg, val); in snd_es1938_write()
354 static unsigned char snd_es1938_read(struct es1938 *chip, unsigned char reg) in snd_es1938_read() argument
358 spin_lock_irqsave(&chip->reg_lock, flags); in snd_es1938_read()
359 snd_es1938_write_cmd(chip, ESS_CMD_READREG); in snd_es1938_read()
360 snd_es1938_write_cmd(chip, reg); in snd_es1938_read()
361 val = snd_es1938_get_byte(chip); in snd_es1938_read()
362 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_es1938_read()
363 dev_dbg(chip->card->dev, "Reg %02x now is %02x\n", reg, val); in snd_es1938_read()
370 static int snd_es1938_bits(struct es1938 *chip, unsigned char reg, unsigned char mask, in snd_es1938_bits() argument
375 spin_lock_irqsave(&chip->reg_lock, flags); in snd_es1938_bits()
376 snd_es1938_write_cmd(chip, ESS_CMD_READREG); in snd_es1938_bits()
377 snd_es1938_write_cmd(chip, reg); in snd_es1938_bits()
378 old = snd_es1938_get_byte(chip); in snd_es1938_bits()
381 snd_es1938_write_cmd(chip, reg); in snd_es1938_bits()
383 snd_es1938_write_cmd(chip, new); in snd_es1938_bits()
384 dev_dbg(chip->card->dev, "Reg %02x was %02x, set to %02x\n", in snd_es1938_bits()
387 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_es1938_bits()
394 static void snd_es1938_reset(struct es1938 *chip) in snd_es1938_reset() argument
398 outb(3, SLSB_REG(chip, RESET)); in snd_es1938_reset()
399 inb(SLSB_REG(chip, RESET)); in snd_es1938_reset()
400 outb(0, SLSB_REG(chip, RESET)); in snd_es1938_reset()
402 if (inb(SLSB_REG(chip, STATUS)) & 0x80) { in snd_es1938_reset()
403 if (inb(SLSB_REG(chip, READDATA)) == 0xaa) in snd_es1938_reset()
407 dev_err(chip->card->dev, "ESS Solo-1 reset failed\n"); in snd_es1938_reset()
410 snd_es1938_write_cmd(chip, ESS_CMD_ENABLEEXT); in snd_es1938_reset()
413 snd_es1938_write(chip, ESS_CMD_DMATYPE, 2); in snd_es1938_reset()
418 snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2MODE, 0x32); in snd_es1938_reset()
420 snd_es1938_bits(chip, ESS_CMD_IRQCONTROL, 0xf0, 0x50); in snd_es1938_reset()
421 snd_es1938_bits(chip, ESS_CMD_DRQCONTROL, 0xf0, 0x50); in snd_es1938_reset()
422 snd_es1938_write_cmd(chip, ESS_CMD_ENABLEAUDIO1); in snd_es1938_reset()
424 snd_es1938_mixer_write(chip, 0x54, 0x8f); in snd_es1938_reset()
425 snd_es1938_mixer_write(chip, 0x56, 0x95); in snd_es1938_reset()
426 snd_es1938_mixer_write(chip, 0x58, 0x94); in snd_es1938_reset()
427 snd_es1938_mixer_write(chip, 0x5a, 0x80); in snd_es1938_reset()
433 static void snd_es1938_reset_fifo(struct es1938 *chip) in snd_es1938_reset_fifo() argument
435 outb(2, SLSB_REG(chip, RESET)); in snd_es1938_reset_fifo()
436 outb(0, SLSB_REG(chip, RESET)); in snd_es1938_reset_fifo()
460 static void snd_es1938_rate_set(struct es1938 *chip, in snd_es1938_rate_set() argument
475 snd_es1938_mixer_write(chip, 0x70, bits); in snd_es1938_rate_set()
476 snd_es1938_mixer_write(chip, 0x72, div0); in snd_es1938_rate_set()
478 snd_es1938_write(chip, 0xA1, bits); in snd_es1938_rate_set()
479 snd_es1938_write(chip, 0xA2, div0); in snd_es1938_rate_set()
487 static void snd_es1938_playback1_setdma(struct es1938 *chip) in snd_es1938_playback1_setdma() argument
489 outb(0x00, SLIO_REG(chip, AUDIO2MODE)); in snd_es1938_playback1_setdma()
490 outl(chip->dma2_start, SLIO_REG(chip, AUDIO2DMAADDR)); in snd_es1938_playback1_setdma()
491 outw(0, SLIO_REG(chip, AUDIO2DMACOUNT)); in snd_es1938_playback1_setdma()
492 outw(chip->dma2_size, SLIO_REG(chip, AUDIO2DMACOUNT)); in snd_es1938_playback1_setdma()
495 static void snd_es1938_playback2_setdma(struct es1938 *chip) in snd_es1938_playback2_setdma() argument
498 outb(0xc4, SLDM_REG(chip, DMACOMMAND)); in snd_es1938_playback2_setdma()
500 outb(0, SLDM_REG(chip, DMACLEAR)); in snd_es1938_playback2_setdma()
502 outb(1, SLDM_REG(chip, DMAMASK)); in snd_es1938_playback2_setdma()
503 outb(0x18, SLDM_REG(chip, DMAMODE)); in snd_es1938_playback2_setdma()
504 outl(chip->dma1_start, SLDM_REG(chip, DMAADDR)); in snd_es1938_playback2_setdma()
505 outw(chip->dma1_size - 1, SLDM_REG(chip, DMACOUNT)); in snd_es1938_playback2_setdma()
507 outb(0, SLDM_REG(chip, DMAMASK)); in snd_es1938_playback2_setdma()
510 static void snd_es1938_capture_setdma(struct es1938 *chip) in snd_es1938_capture_setdma() argument
513 outb(0xc4, SLDM_REG(chip, DMACOMMAND)); in snd_es1938_capture_setdma()
515 outb(0, SLDM_REG(chip, DMACLEAR)); in snd_es1938_capture_setdma()
517 outb(1, SLDM_REG(chip, DMAMASK)); in snd_es1938_capture_setdma()
518 outb(0x14, SLDM_REG(chip, DMAMODE)); in snd_es1938_capture_setdma()
519 outl(chip->dma1_start, SLDM_REG(chip, DMAADDR)); in snd_es1938_capture_setdma()
520 chip->last_capture_dmaaddr = chip->dma1_start; in snd_es1938_capture_setdma()
521 outw(chip->dma1_size - 1, SLDM_REG(chip, DMACOUNT)); in snd_es1938_capture_setdma()
523 outb(0, SLDM_REG(chip, DMAMASK)); in snd_es1938_capture_setdma()
534 struct es1938 *chip = snd_pcm_substream_chip(substream); in snd_es1938_capture_trigger() local
540 chip->active |= ADC1; in snd_es1938_capture_trigger()
545 chip->active &= ~ADC1; in snd_es1938_capture_trigger()
550 snd_es1938_write(chip, ESS_CMD_DMACONTROL, val); in snd_es1938_capture_trigger()
557 struct es1938 *chip = snd_pcm_substream_chip(substream); in snd_es1938_playback1_trigger() local
563 snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL1, 0x92); in snd_es1938_playback1_trigger()
565 snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL1, 0x93); in snd_es1938_playback1_trigger()
569 outb(0x0a, SLIO_REG(chip, AUDIO2MODE)); in snd_es1938_playback1_trigger()
570 chip->active |= DAC2; in snd_es1938_playback1_trigger()
574 outb(0, SLIO_REG(chip, AUDIO2MODE)); in snd_es1938_playback1_trigger()
575 snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL1, 0); in snd_es1938_playback1_trigger()
576 chip->active &= ~DAC2; in snd_es1938_playback1_trigger()
587 struct es1938 *chip = snd_pcm_substream_chip(substream); in snd_es1938_playback2_trigger() local
593 chip->active |= DAC1; in snd_es1938_playback2_trigger()
598 chip->active &= ~DAC1; in snd_es1938_playback2_trigger()
603 snd_es1938_write(chip, ESS_CMD_DMACONTROL, val); in snd_es1938_playback2_trigger()
625 struct es1938 *chip = snd_pcm_substream_chip(substream); in snd_es1938_capture_prepare() local
631 chip->dma1_size = size; in snd_es1938_capture_prepare()
632 chip->dma1_start = runtime->dma_addr; in snd_es1938_capture_prepare()
638 chip->dma1_shift = 2 - mono - is8; in snd_es1938_capture_prepare()
640 snd_es1938_reset_fifo(chip); in snd_es1938_capture_prepare()
643 snd_es1938_bits(chip, ESS_CMD_ANALOGCONTROL, 0x03, (mono ? 2 : 1)); in snd_es1938_capture_prepare()
646 snd_es1938_rate_set(chip, substream, ADC1); in snd_es1938_capture_prepare()
649 snd_es1938_write(chip, ESS_CMD_DMACNTRELOADL, count & 0xff); in snd_es1938_capture_prepare()
650 snd_es1938_write(chip, ESS_CMD_DMACNTRELOADH, count >> 8); in snd_es1938_capture_prepare()
653 snd_es1938_write(chip, ESS_CMD_SETFORMAT2, u ? 0x51 : 0x71); in snd_es1938_capture_prepare()
654 snd_es1938_write(chip, ESS_CMD_SETFORMAT2, 0x90 | in snd_es1938_capture_prepare()
662 snd_es1938_capture_setdma(chip); in snd_es1938_capture_prepare()
673 struct es1938 *chip = snd_pcm_substream_chip(substream); in snd_es1938_playback1_prepare() local
679 chip->dma2_size = size; in snd_es1938_playback1_prepare()
680 chip->dma2_start = runtime->dma_addr; in snd_es1938_playback1_prepare()
686 chip->dma2_shift = 2 - mono - is8; in snd_es1938_playback1_prepare()
688 snd_es1938_reset_fifo(chip); in snd_es1938_playback1_prepare()
691 snd_es1938_rate_set(chip, substream, DAC2); in snd_es1938_playback1_prepare()
695 snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2TCOUNTL, count & 0xff); in snd_es1938_playback1_prepare()
696 snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2TCOUNTH, count >> 8); in snd_es1938_playback1_prepare()
699 snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL2, 0x40 | (u ? 0 : 4) | in snd_es1938_playback1_prepare()
703 snd_es1938_playback1_setdma(chip); in snd_es1938_playback1_prepare()
710 struct es1938 *chip = snd_pcm_substream_chip(substream); in snd_es1938_playback2_prepare() local
716 chip->dma1_size = size; in snd_es1938_playback2_prepare()
717 chip->dma1_start = runtime->dma_addr; in snd_es1938_playback2_prepare()
723 chip->dma1_shift = 2 - mono - is8; in snd_es1938_playback2_prepare()
728 snd_es1938_reset_fifo(chip); in snd_es1938_playback2_prepare()
730 snd_es1938_bits(chip, ESS_CMD_ANALOGCONTROL, 0x03, (mono ? 2 : 1)); in snd_es1938_playback2_prepare()
733 snd_es1938_rate_set(chip, substream, DAC1); in snd_es1938_playback2_prepare()
734 snd_es1938_write(chip, ESS_CMD_DMACNTRELOADL, count & 0xff); in snd_es1938_playback2_prepare()
735 snd_es1938_write(chip, ESS_CMD_DMACNTRELOADH, count >> 8); in snd_es1938_playback2_prepare()
738 snd_es1938_write(chip, ESS_CMD_SETFORMAT, u ? 0x80 : 0x00); in snd_es1938_playback2_prepare()
739 snd_es1938_write(chip, ESS_CMD_SETFORMAT, u ? 0x51 : 0x71); in snd_es1938_playback2_prepare()
740 snd_es1938_write(chip, ESS_CMD_SETFORMAT2, in snd_es1938_playback2_prepare()
745 snd_es1938_playback2_setdma(chip); in snd_es1938_playback2_prepare()
772 struct es1938 *chip = snd_pcm_substream_chip(substream); in snd_es1938_capture_pointer() local
777 old = inw(SLDM_REG(chip, DMACOUNT)); in snd_es1938_capture_pointer()
778 while ((new = inw(SLDM_REG(chip, DMACOUNT))) != old) in snd_es1938_capture_pointer()
780 ptr = chip->dma1_size - 1 - new; in snd_es1938_capture_pointer()
785 ptr = inl(SLDM_REG(chip, DMAADDR)); in snd_es1938_capture_pointer()
786 count = inw(SLDM_REG(chip, DMACOUNT)); in snd_es1938_capture_pointer()
787 diff = chip->dma1_start + chip->dma1_size - ptr - count; in snd_es1938_capture_pointer()
789 if (diff > 3 || ptr < chip->dma1_start in snd_es1938_capture_pointer()
790 || ptr >= chip->dma1_start+chip->dma1_size) in snd_es1938_capture_pointer()
791 ptr = chip->last_capture_dmaaddr; /* bad, use last saved */ in snd_es1938_capture_pointer()
793 chip->last_capture_dmaaddr = ptr; /* good, remember it */ in snd_es1938_capture_pointer()
795 ptr -= chip->dma1_start; in snd_es1938_capture_pointer()
797 return ptr >> chip->dma1_shift; in snd_es1938_capture_pointer()
802 struct es1938 *chip = snd_pcm_substream_chip(substream); in snd_es1938_playback1_pointer() local
805 ptr = chip->dma2_size - inw(SLIO_REG(chip, AUDIO2DMACOUNT)); in snd_es1938_playback1_pointer()
807 ptr = inl(SLIO_REG(chip, AUDIO2DMAADDR)) - chip->dma2_start; in snd_es1938_playback1_pointer()
809 return ptr >> chip->dma2_shift; in snd_es1938_playback1_pointer()
814 struct es1938 *chip = snd_pcm_substream_chip(substream); in snd_es1938_playback2_pointer() local
819 old = inw(SLDM_REG(chip, DMACOUNT)); in snd_es1938_playback2_pointer()
820 while ((new = inw(SLDM_REG(chip, DMACOUNT))) != old) in snd_es1938_playback2_pointer()
822 ptr = chip->dma1_size - 1 - new; in snd_es1938_playback2_pointer()
824 ptr = inl(SLDM_REG(chip, DMAADDR)) - chip->dma1_start; in snd_es1938_playback2_pointer()
826 return ptr >> chip->dma1_shift; in snd_es1938_playback2_pointer()
848 struct es1938 *chip = snd_pcm_substream_chip(substream); in snd_es1938_capture_copy() local
849 pos <<= chip->dma1_shift; in snd_es1938_capture_copy()
850 count <<= chip->dma1_shift; in snd_es1938_capture_copy()
851 if (snd_BUG_ON(pos + count > chip->dma1_size)) in snd_es1938_capture_copy()
853 if (pos + count < chip->dma1_size) { in snd_es1938_capture_copy()
931 struct es1938 *chip = snd_pcm_substream_chip(substream); in snd_es1938_capture_open() local
934 if (chip->playback2_substream) in snd_es1938_capture_open()
936 chip->capture_substream = substream; in snd_es1938_capture_open()
946 struct es1938 *chip = snd_pcm_substream_chip(substream); in snd_es1938_playback_open() local
951 chip->playback1_substream = substream; in snd_es1938_playback_open()
954 if (chip->capture_substream) in snd_es1938_playback_open()
956 chip->playback2_substream = substream; in snd_es1938_playback_open()
971 struct es1938 *chip = snd_pcm_substream_chip(substream); in snd_es1938_capture_close() local
973 chip->capture_substream = NULL; in snd_es1938_capture_close()
979 struct es1938 *chip = snd_pcm_substream_chip(substream); in snd_es1938_playback_close() local
983 chip->playback1_substream = NULL; in snd_es1938_playback_close()
986 chip->playback2_substream = NULL; in snd_es1938_playback_close()
1018 static int snd_es1938_new_pcm(struct es1938 *chip, int device) in snd_es1938_new_pcm() argument
1023 if ((err = snd_pcm_new(chip->card, "es-1938-1946", device, 2, 1, &pcm)) < 0) in snd_es1938_new_pcm()
1028 pcm->private_data = chip; in snd_es1938_new_pcm()
1033 snd_dma_pci_data(chip->pci), 64*1024, 64*1024); in snd_es1938_new_pcm()
1035 chip->pcm = pcm; in snd_es1938_new_pcm()
1058 struct es1938 *chip = snd_kcontrol_chip(kcontrol); in snd_es1938_get_mux() local
1059 ucontrol->value.enumerated.item[0] = snd_es1938_mixer_read(chip, 0x1c) & 0x07; in snd_es1938_get_mux()
1066 struct es1938 *chip = snd_kcontrol_chip(kcontrol); in snd_es1938_put_mux() local
1071 return snd_es1938_mixer_bits(chip, 0x1c, 0x07, val) != val; in snd_es1938_put_mux()
1079 struct es1938 *chip = snd_kcontrol_chip(kcontrol); in snd_es1938_get_spatializer_enable() local
1080 unsigned char val = snd_es1938_mixer_read(chip, 0x50); in snd_es1938_get_spatializer_enable()
1088 struct es1938 *chip = snd_kcontrol_chip(kcontrol); in snd_es1938_put_spatializer_enable() local
1092 oval = snd_es1938_mixer_read(chip, 0x50) & 0x0c; in snd_es1938_put_spatializer_enable()
1095 snd_es1938_mixer_write(chip, 0x50, nval & ~0x04); in snd_es1938_put_spatializer_enable()
1096 snd_es1938_mixer_write(chip, 0x50, nval); in snd_es1938_put_spatializer_enable()
1114 struct es1938 *chip = snd_kcontrol_chip(kcontrol); in snd_es1938_get_hw_volume() local
1115 ucontrol->value.integer.value[0] = snd_es1938_mixer_read(chip, 0x61) & 0x3f; in snd_es1938_get_hw_volume()
1116 ucontrol->value.integer.value[1] = snd_es1938_mixer_read(chip, 0x63) & 0x3f; in snd_es1938_get_hw_volume()
1125 struct es1938 *chip = snd_kcontrol_chip(kcontrol); in snd_es1938_get_hw_switch() local
1126 ucontrol->value.integer.value[0] = !(snd_es1938_mixer_read(chip, 0x61) & 0x40); in snd_es1938_get_hw_switch()
1127 ucontrol->value.integer.value[1] = !(snd_es1938_mixer_read(chip, 0x63) & 0x40); in snd_es1938_get_hw_switch()
1133 struct es1938 *chip = snd_kcontrol_chip(kcontrol); in snd_es1938_hwv_free() local
1134 chip->master_volume = NULL; in snd_es1938_hwv_free()
1135 chip->master_switch = NULL; in snd_es1938_hwv_free()
1136 chip->hw_volume = NULL; in snd_es1938_hwv_free()
1137 chip->hw_switch = NULL; in snd_es1938_hwv_free()
1140 static int snd_es1938_reg_bits(struct es1938 *chip, unsigned char reg, in snd_es1938_reg_bits() argument
1144 return snd_es1938_mixer_bits(chip, reg, mask, val); in snd_es1938_reg_bits()
1146 return snd_es1938_bits(chip, reg, mask, val); in snd_es1938_reg_bits()
1149 static int snd_es1938_reg_read(struct es1938 *chip, unsigned char reg) in snd_es1938_reg_read() argument
1152 return snd_es1938_mixer_read(chip, reg); in snd_es1938_reg_read()
1154 return snd_es1938_read(chip, reg); in snd_es1938_reg_read()
1186 struct es1938 *chip = snd_kcontrol_chip(kcontrol); in snd_es1938_get_single() local
1193 val = snd_es1938_reg_read(chip, reg); in snd_es1938_get_single()
1203 struct es1938 *chip = snd_kcontrol_chip(kcontrol); in snd_es1938_put_single() local
1215 return snd_es1938_reg_bits(chip, reg, mask, val) != val; in snd_es1938_put_single()
1247 struct es1938 *chip = snd_kcontrol_chip(kcontrol); in snd_es1938_get_double() local
1256 left = snd_es1938_reg_read(chip, left_reg); in snd_es1938_get_double()
1258 right = snd_es1938_reg_read(chip, right_reg); in snd_es1938_get_double()
1273 struct es1938 *chip = snd_kcontrol_chip(kcontrol); in snd_es1938_put_double() local
1295 if (snd_es1938_reg_bits(chip, left_reg, mask1, val1) != val1) in snd_es1938_put_double()
1297 if (snd_es1938_reg_bits(chip, right_reg, mask2, val2) != val2) in snd_es1938_put_double()
1300 change = (snd_es1938_reg_bits(chip, left_reg, mask1 | mask2, in snd_es1938_put_double()
1415 static void snd_es1938_chip_init(struct es1938 *chip) in snd_es1938_chip_init() argument
1418 snd_es1938_reset(chip); in snd_es1938_chip_init()
1423 pci_set_master(chip->pci); in snd_es1938_chip_init()
1426 pci_write_config_word(chip->pci, SL_PCI_LEGACYCONTROL, 0x805f); in snd_es1938_chip_init()
1429 pci_write_config_word(chip->pci, SL_PCI_DDMACONTROL, chip->ddma_port | 1); in snd_es1938_chip_init()
1432 pci_write_config_dword(chip->pci, SL_PCI_CONFIG, 0); in snd_es1938_chip_init()
1435 outb(0xf0, SLIO_REG(chip, IRQCONTROL)); in snd_es1938_chip_init()
1438 outb(0, SLDM_REG(chip, DMACLEAR)); in snd_es1938_chip_init()
1457 struct es1938 *chip = card->private_data; in es1938_suspend() local
1461 snd_pcm_suspend_all(chip->pcm); in es1938_suspend()
1464 for (s = saved_regs, d = chip->saved_regs; *s; s++, d++) in es1938_suspend()
1465 *d = snd_es1938_reg_read(chip, *s); in es1938_suspend()
1467 outb(0x00, SLIO_REG(chip, IRQCONTROL)); /* disable irqs */ in es1938_suspend()
1468 if (chip->irq >= 0) { in es1938_suspend()
1469 free_irq(chip->irq, chip); in es1938_suspend()
1470 chip->irq = -1; in es1938_suspend()
1479 struct es1938 *chip = card->private_data; in es1938_resume() local
1483 IRQF_SHARED, KBUILD_MODNAME, chip)) { in es1938_resume()
1489 chip->irq = pci->irq; in es1938_resume()
1490 snd_es1938_chip_init(chip); in es1938_resume()
1493 for (s = saved_regs, d = chip->saved_regs; *s; s++, d++) { in es1938_resume()
1495 snd_es1938_mixer_write(chip, *s, *d); in es1938_resume()
1497 snd_es1938_write(chip, *s, *d); in es1938_resume()
1511 static int snd_es1938_create_gameport(struct es1938 *chip) in snd_es1938_create_gameport() argument
1515 chip->gameport = gp = gameport_allocate_port(); in snd_es1938_create_gameport()
1517 dev_err(chip->card->dev, in snd_es1938_create_gameport()
1523 gameport_set_phys(gp, "pci%s/gameport0", pci_name(chip->pci)); in snd_es1938_create_gameport()
1524 gameport_set_dev_parent(gp, &chip->pci->dev); in snd_es1938_create_gameport()
1525 gp->io = chip->game_port; in snd_es1938_create_gameport()
1532 static void snd_es1938_free_gameport(struct es1938 *chip) in snd_es1938_free_gameport() argument
1534 if (chip->gameport) { in snd_es1938_free_gameport()
1535 gameport_unregister_port(chip->gameport); in snd_es1938_free_gameport()
1536 chip->gameport = NULL; in snd_es1938_free_gameport()
1540 static inline int snd_es1938_create_gameport(struct es1938 *chip) { return -ENOSYS; } in snd_es1938_create_gameport() argument
1541 static inline void snd_es1938_free_gameport(struct es1938 *chip) { } in snd_es1938_free_gameport() argument
1544 static int snd_es1938_free(struct es1938 *chip) in snd_es1938_free() argument
1547 outb(0x00, SLIO_REG(chip, IRQCONTROL)); in snd_es1938_free()
1548 if (chip->rmidi) in snd_es1938_free()
1549 snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0); in snd_es1938_free()
1551 snd_es1938_free_gameport(chip); in snd_es1938_free()
1553 if (chip->irq >= 0) in snd_es1938_free()
1554 free_irq(chip->irq, chip); in snd_es1938_free()
1555 pci_release_regions(chip->pci); in snd_es1938_free()
1556 pci_disable_device(chip->pci); in snd_es1938_free()
1557 kfree(chip); in snd_es1938_free()
1563 struct es1938 *chip = device->device_data; in snd_es1938_dev_free() local
1564 return snd_es1938_free(chip); in snd_es1938_dev_free()
1571 struct es1938 *chip; in snd_es1938_create() local
1591 chip = kzalloc(sizeof(*chip), GFP_KERNEL); in snd_es1938_create()
1592 if (chip == NULL) { in snd_es1938_create()
1596 spin_lock_init(&chip->reg_lock); in snd_es1938_create()
1597 spin_lock_init(&chip->mixer_lock); in snd_es1938_create()
1598 chip->card = card; in snd_es1938_create()
1599 chip->pci = pci; in snd_es1938_create()
1600 chip->irq = -1; in snd_es1938_create()
1602 kfree(chip); in snd_es1938_create()
1606 chip->io_port = pci_resource_start(pci, 0); in snd_es1938_create()
1607 chip->sb_port = pci_resource_start(pci, 1); in snd_es1938_create()
1608 chip->vc_port = pci_resource_start(pci, 2); in snd_es1938_create()
1609 chip->mpu_port = pci_resource_start(pci, 3); in snd_es1938_create()
1610 chip->game_port = pci_resource_start(pci, 4); in snd_es1938_create()
1612 KBUILD_MODNAME, chip)) { in snd_es1938_create()
1614 snd_es1938_free(chip); in snd_es1938_create()
1617 chip->irq = pci->irq; in snd_es1938_create()
1620 chip->io_port, chip->sb_port, chip->vc_port, chip->mpu_port, chip->game_port); in snd_es1938_create()
1622 chip->ddma_port = chip->vc_port + 0x00; /* fix from Thomas Sailer */ in snd_es1938_create()
1624 snd_es1938_chip_init(chip); in snd_es1938_create()
1626 if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) { in snd_es1938_create()
1627 snd_es1938_free(chip); in snd_es1938_create()
1631 *rchip = chip; in snd_es1938_create()
1640 struct es1938 *chip = dev_id; in snd_es1938_interrupt() local
1644 status = inb(SLIO_REG(chip, IRQCONTROL)); in snd_es1938_interrupt()
1646 dev_dbg(chip->card->dev, in snd_es1938_interrupt()
1653 dev_dbg(chip->card->dev, in snd_es1938_interrupt()
1655 dev_dbg(chip->card->dev, in snd_es1938_interrupt()
1657 inw(SLDM_REG(chip, DMACOUNT))); in snd_es1938_interrupt()
1658 dev_dbg(chip->card->dev, in snd_es1938_interrupt()
1660 inl(SLDM_REG(chip, DMAADDR))); in snd_es1938_interrupt()
1661 dev_dbg(chip->card->dev, in snd_es1938_interrupt()
1663 inl(SLDM_REG(chip, DMASTATUS))); in snd_es1938_interrupt()
1667 audiostatus = inb(SLSB_REG(chip, STATUS)); in snd_es1938_interrupt()
1668 if (chip->active & ADC1) in snd_es1938_interrupt()
1669 snd_pcm_period_elapsed(chip->capture_substream); in snd_es1938_interrupt()
1670 else if (chip->active & DAC1) in snd_es1938_interrupt()
1671 snd_pcm_period_elapsed(chip->playback2_substream); in snd_es1938_interrupt()
1677 dev_dbg(chip->card->dev, in snd_es1938_interrupt()
1679 dev_dbg(chip->card->dev, in snd_es1938_interrupt()
1681 inw(SLIO_REG(chip, AUDIO2DMACOUNT))); in snd_es1938_interrupt()
1682 dev_dbg(chip->card->dev, in snd_es1938_interrupt()
1684 inl(SLIO_REG(chip, AUDIO2DMAADDR))); in snd_es1938_interrupt()
1689 snd_es1938_mixer_bits(chip, ESSSB_IREG_AUDIO2CONTROL2, 0x80, 0); in snd_es1938_interrupt()
1690 if (chip->active & DAC2) in snd_es1938_interrupt()
1691 snd_pcm_period_elapsed(chip->playback1_substream); in snd_es1938_interrupt()
1696 int split = snd_es1938_mixer_read(chip, 0x64) & 0x80; in snd_es1938_interrupt()
1698 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_switch->id); in snd_es1938_interrupt()
1699 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_volume->id); in snd_es1938_interrupt()
1701 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, in snd_es1938_interrupt()
1702 &chip->master_switch->id); in snd_es1938_interrupt()
1703 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, in snd_es1938_interrupt()
1704 &chip->master_volume->id); in snd_es1938_interrupt()
1707 snd_es1938_mixer_write(chip, 0x66, 0x00); in snd_es1938_interrupt()
1716 if (chip->rmidi) { in snd_es1938_interrupt()
1718 snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data); in snd_es1938_interrupt()
1726 static int snd_es1938_mixer(struct es1938 *chip) in snd_es1938_mixer() argument
1732 card = chip->card; in snd_es1938_mixer()
1738 kctl = snd_ctl_new1(&snd_es1938_controls[idx], chip); in snd_es1938_mixer()
1741 chip->master_volume = kctl; in snd_es1938_mixer()
1745 chip->master_switch = kctl; in snd_es1938_mixer()
1749 chip->hw_volume = kctl; in snd_es1938_mixer()
1753 chip->hw_switch = kctl; in snd_es1938_mixer()
1769 struct es1938 *chip; in snd_es1938_probe() local
1791 if ((err = snd_es1938_create(card, pci, &chip)) < 0) { in snd_es1938_probe()
1795 card->private_data = chip; in snd_es1938_probe()
1801 chip->revision, in snd_es1938_probe()
1802 chip->irq); in snd_es1938_probe()
1804 if ((err = snd_es1938_new_pcm(chip, 0)) < 0) { in snd_es1938_probe()
1808 if ((err = snd_es1938_mixer(chip)) < 0) { in snd_es1938_probe()
1813 SLSB_REG(chip, FMLOWADDR), in snd_es1938_probe()
1814 SLSB_REG(chip, FMHIGHADDR), in snd_es1938_probe()
1817 SLSB_REG(chip, FMLOWADDR)); in snd_es1938_probe()
1829 chip->mpu_port, in snd_es1938_probe()
1831 -1, &chip->rmidi) < 0) { in snd_es1938_probe()
1836 snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0x40); in snd_es1938_probe()
1839 snd_es1938_create_gameport(chip); in snd_es1938_probe()