Lines Matching refs:chip
177 static int snd_es18xx_dsp_command(struct snd_es18xx *chip, unsigned char val) in snd_es18xx_dsp_command() argument
182 if ((inb(chip->port + 0x0C) & 0x80) == 0) { in snd_es18xx_dsp_command()
183 outb(val, chip->port + 0x0C); in snd_es18xx_dsp_command()
190 static int snd_es18xx_dsp_get_byte(struct snd_es18xx *chip) in snd_es18xx_dsp_get_byte() argument
195 if (inb(chip->port + 0x0C) & 0x40) in snd_es18xx_dsp_get_byte()
196 return inb(chip->port + 0x0A); in snd_es18xx_dsp_get_byte()
198 chip->port + 0x0A, inb(chip->port + 0x0A)); in snd_es18xx_dsp_get_byte()
204 static int snd_es18xx_write(struct snd_es18xx *chip, in snd_es18xx_write() argument
210 spin_lock_irqsave(&chip->reg_lock, flags); in snd_es18xx_write()
211 ret = snd_es18xx_dsp_command(chip, reg); in snd_es18xx_write()
214 ret = snd_es18xx_dsp_command(chip, data); in snd_es18xx_write()
216 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_es18xx_write()
223 static int snd_es18xx_read(struct snd_es18xx *chip, unsigned char reg) in snd_es18xx_read() argument
227 spin_lock_irqsave(&chip->reg_lock, flags); in snd_es18xx_read()
228 ret = snd_es18xx_dsp_command(chip, 0xC0); in snd_es18xx_read()
231 ret = snd_es18xx_dsp_command(chip, reg); in snd_es18xx_read()
234 data = snd_es18xx_dsp_get_byte(chip); in snd_es18xx_read()
240 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_es18xx_read()
245 static int snd_es18xx_bits(struct snd_es18xx *chip, unsigned char reg, in snd_es18xx_bits() argument
251 spin_lock_irqsave(&chip->reg_lock, flags); in snd_es18xx_bits()
252 ret = snd_es18xx_dsp_command(chip, 0xC0); in snd_es18xx_bits()
255 ret = snd_es18xx_dsp_command(chip, reg); in snd_es18xx_bits()
258 ret = snd_es18xx_dsp_get_byte(chip); in snd_es18xx_bits()
265 ret = snd_es18xx_dsp_command(chip, reg); in snd_es18xx_bits()
269 ret = snd_es18xx_dsp_command(chip, new); in snd_es18xx_bits()
279 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_es18xx_bits()
283 static inline void snd_es18xx_mixer_write(struct snd_es18xx *chip, in snd_es18xx_mixer_write() argument
287 spin_lock_irqsave(&chip->mixer_lock, flags); in snd_es18xx_mixer_write()
288 outb(reg, chip->port + 0x04); in snd_es18xx_mixer_write()
289 outb(data, chip->port + 0x05); in snd_es18xx_mixer_write()
290 spin_unlock_irqrestore(&chip->mixer_lock, flags); in snd_es18xx_mixer_write()
296 static inline int snd_es18xx_mixer_read(struct snd_es18xx *chip, unsigned char reg) in snd_es18xx_mixer_read() argument
300 spin_lock_irqsave(&chip->mixer_lock, flags); in snd_es18xx_mixer_read()
301 outb(reg, chip->port + 0x04); in snd_es18xx_mixer_read()
302 data = inb(chip->port + 0x05); in snd_es18xx_mixer_read()
303 spin_unlock_irqrestore(&chip->mixer_lock, flags); in snd_es18xx_mixer_read()
311 static inline int snd_es18xx_mixer_bits(struct snd_es18xx *chip, unsigned char reg, in snd_es18xx_mixer_bits() argument
316 spin_lock_irqsave(&chip->mixer_lock, flags); in snd_es18xx_mixer_bits()
317 outb(reg, chip->port + 0x04); in snd_es18xx_mixer_bits()
318 old = inb(chip->port + 0x05); in snd_es18xx_mixer_bits()
322 outb(new, chip->port + 0x05); in snd_es18xx_mixer_bits()
328 spin_unlock_irqrestore(&chip->mixer_lock, flags); in snd_es18xx_mixer_bits()
332 static inline int snd_es18xx_mixer_writable(struct snd_es18xx *chip, unsigned char reg, in snd_es18xx_mixer_writable() argument
337 spin_lock_irqsave(&chip->mixer_lock, flags); in snd_es18xx_mixer_writable()
338 outb(reg, chip->port + 0x04); in snd_es18xx_mixer_writable()
339 old = inb(chip->port + 0x05); in snd_es18xx_mixer_writable()
341 outb(expected, chip->port + 0x05); in snd_es18xx_mixer_writable()
342 new = inb(chip->port + 0x05); in snd_es18xx_mixer_writable()
343 spin_unlock_irqrestore(&chip->mixer_lock, flags); in snd_es18xx_mixer_writable()
352 static int snd_es18xx_reset(struct snd_es18xx *chip) in snd_es18xx_reset() argument
355 outb(0x03, chip->port + 0x06); in snd_es18xx_reset()
356 inb(chip->port + 0x06); in snd_es18xx_reset()
357 outb(0x00, chip->port + 0x06); in snd_es18xx_reset()
358 for(i = 0; i < MILLISECOND && !(inb(chip->port + 0x0E) & 0x80); i++); in snd_es18xx_reset()
359 if (inb(chip->port + 0x0A) != 0xAA) in snd_es18xx_reset()
364 static int snd_es18xx_reset_fifo(struct snd_es18xx *chip) in snd_es18xx_reset_fifo() argument
366 outb(0x02, chip->port + 0x06); in snd_es18xx_reset_fifo()
367 inb(chip->port + 0x06); in snd_es18xx_reset_fifo()
368 outb(0x00, chip->port + 0x06); in snd_es18xx_reset_fifo()
413 static void snd_es18xx_rate_set(struct snd_es18xx *chip, in snd_es18xx_rate_set() argument
419 if (chip->caps & ES18XX_NEW_RATE) { in snd_es18xx_rate_set()
434 if ((chip->caps & ES18XX_PCM2) && mode == DAC2) { in snd_es18xx_rate_set()
435 snd_es18xx_mixer_write(chip, 0x70, bits); in snd_es18xx_rate_set()
440 snd_es18xx_write(chip, 0xA2, div0); in snd_es18xx_rate_set()
441 snd_es18xx_mixer_write(chip, 0x72, div0); in snd_es18xx_rate_set()
443 snd_es18xx_write(chip, 0xA1, bits); in snd_es18xx_rate_set()
444 snd_es18xx_write(chip, 0xA2, div0); in snd_es18xx_rate_set()
451 struct snd_es18xx *chip = snd_pcm_substream_chip(substream); in snd_es18xx_playback_hw_params() local
460 if (substream->number == 0 && (chip->caps & ES18XX_PCM2)) { in snd_es18xx_playback_hw_params()
461 if ((chip->caps & ES18XX_DUPLEX_MONO) && in snd_es18xx_playback_hw_params()
462 (chip->capture_a_substream) && in snd_es18xx_playback_hw_params()
467 chip->dma2_shift = shift; in snd_es18xx_playback_hw_params()
469 chip->dma1_shift = shift; in snd_es18xx_playback_hw_params()
481 static int snd_es18xx_playback1_prepare(struct snd_es18xx *chip, in snd_es18xx_playback1_prepare() argument
488 snd_es18xx_rate_set(chip, substream, DAC2); in snd_es18xx_playback1_prepare()
492 snd_es18xx_mixer_write(chip, 0x74, count & 0xff); in snd_es18xx_playback1_prepare()
493 snd_es18xx_mixer_write(chip, 0x76, count >> 8); in snd_es18xx_playback1_prepare()
496 snd_es18xx_mixer_bits(chip, 0x7A, 0x07, in snd_es18xx_playback1_prepare()
502 snd_dma_program(chip->dma2, runtime->dma_addr, size, DMA_MODE_WRITE | DMA_AUTOINIT); in snd_es18xx_playback1_prepare()
507 static int snd_es18xx_playback1_trigger(struct snd_es18xx *chip, in snd_es18xx_playback1_trigger() argument
514 if (chip->active & DAC2) in snd_es18xx_playback1_trigger()
516 chip->active |= DAC2; in snd_es18xx_playback1_trigger()
518 if (chip->dma2 >= 4) in snd_es18xx_playback1_trigger()
519 snd_es18xx_mixer_write(chip, 0x78, 0xb3); in snd_es18xx_playback1_trigger()
521 snd_es18xx_mixer_write(chip, 0x78, 0x93); in snd_es18xx_playback1_trigger()
525 if (chip->caps & ES18XX_PCM2) in snd_es18xx_playback1_trigger()
527 snd_es18xx_mixer_write(chip, 0x7C, chip->audio2_vol); in snd_es18xx_playback1_trigger()
530 snd_es18xx_dsp_command(chip, 0xD1); in snd_es18xx_playback1_trigger()
535 if (!(chip->active & DAC2)) in snd_es18xx_playback1_trigger()
537 chip->active &= ~DAC2; in snd_es18xx_playback1_trigger()
539 snd_es18xx_mixer_write(chip, 0x78, 0x00); in snd_es18xx_playback1_trigger()
542 if (chip->caps & ES18XX_PCM2) in snd_es18xx_playback1_trigger()
544 snd_es18xx_mixer_write(chip, 0x7C, 0); in snd_es18xx_playback1_trigger()
547 snd_es18xx_dsp_command(chip, 0xD3); in snd_es18xx_playback1_trigger()
560 struct snd_es18xx *chip = snd_pcm_substream_chip(substream); in snd_es18xx_capture_hw_params() local
564 if ((chip->caps & ES18XX_DUPLEX_MONO) && in snd_es18xx_capture_hw_params()
565 chip->playback_a_substream && in snd_es18xx_capture_hw_params()
574 chip->dma1_shift = shift; in snd_es18xx_capture_hw_params()
582 struct snd_es18xx *chip = snd_pcm_substream_chip(substream); in snd_es18xx_capture_prepare() local
587 snd_es18xx_reset_fifo(chip); in snd_es18xx_capture_prepare()
590 snd_es18xx_bits(chip, 0xA8, 0x03, runtime->channels == 1 ? 0x02 : 0x01); in snd_es18xx_capture_prepare()
592 snd_es18xx_rate_set(chip, substream, ADC1); in snd_es18xx_capture_prepare()
596 snd_es18xx_write(chip, 0xA4, count & 0xff); in snd_es18xx_capture_prepare()
597 snd_es18xx_write(chip, 0xA5, count >> 8); in snd_es18xx_capture_prepare()
604 snd_es18xx_write(chip, 0xB7, in snd_es18xx_capture_prepare()
606 snd_es18xx_write(chip, 0xB7, 0x90 | in snd_es18xx_capture_prepare()
612 snd_dma_program(chip->dma1, runtime->dma_addr, size, DMA_MODE_READ | DMA_AUTOINIT); in snd_es18xx_capture_prepare()
620 struct snd_es18xx *chip = snd_pcm_substream_chip(substream); in snd_es18xx_capture_trigger() local
625 if (chip->active & ADC1) in snd_es18xx_capture_trigger()
627 chip->active |= ADC1; in snd_es18xx_capture_trigger()
629 snd_es18xx_write(chip, 0xB8, 0x0f); in snd_es18xx_capture_trigger()
633 if (!(chip->active & ADC1)) in snd_es18xx_capture_trigger()
635 chip->active &= ~ADC1; in snd_es18xx_capture_trigger()
637 snd_es18xx_write(chip, 0xB8, 0x00); in snd_es18xx_capture_trigger()
646 static int snd_es18xx_playback2_prepare(struct snd_es18xx *chip, in snd_es18xx_playback2_prepare() argument
653 snd_es18xx_reset_fifo(chip); in snd_es18xx_playback2_prepare()
656 snd_es18xx_bits(chip, 0xA8, 0x03, runtime->channels == 1 ? 0x02 : 0x01); in snd_es18xx_playback2_prepare()
658 snd_es18xx_rate_set(chip, substream, DAC1); in snd_es18xx_playback2_prepare()
662 snd_es18xx_write(chip, 0xA4, count & 0xff); in snd_es18xx_playback2_prepare()
663 snd_es18xx_write(chip, 0xA5, count >> 8); in snd_es18xx_playback2_prepare()
666 snd_es18xx_write(chip, 0xB6, in snd_es18xx_playback2_prepare()
668 snd_es18xx_write(chip, 0xB7, in snd_es18xx_playback2_prepare()
670 snd_es18xx_write(chip, 0xB7, 0x90 | in snd_es18xx_playback2_prepare()
676 snd_dma_program(chip->dma1, runtime->dma_addr, size, DMA_MODE_WRITE | DMA_AUTOINIT); in snd_es18xx_playback2_prepare()
681 static int snd_es18xx_playback2_trigger(struct snd_es18xx *chip, in snd_es18xx_playback2_trigger() argument
688 if (chip->active & DAC1) in snd_es18xx_playback2_trigger()
690 chip->active |= DAC1; in snd_es18xx_playback2_trigger()
692 snd_es18xx_write(chip, 0xB8, 0x05); in snd_es18xx_playback2_trigger()
697 snd_es18xx_dsp_command(chip, 0xD1); in snd_es18xx_playback2_trigger()
702 if (!(chip->active & DAC1)) in snd_es18xx_playback2_trigger()
704 chip->active &= ~DAC1; in snd_es18xx_playback2_trigger()
706 snd_es18xx_write(chip, 0xB8, 0x00); in snd_es18xx_playback2_trigger()
711 snd_es18xx_dsp_command(chip, 0xD3); in snd_es18xx_playback2_trigger()
723 struct snd_es18xx *chip = snd_pcm_substream_chip(substream); in snd_es18xx_playback_prepare() local
724 if (substream->number == 0 && (chip->caps & ES18XX_PCM2)) in snd_es18xx_playback_prepare()
725 return snd_es18xx_playback1_prepare(chip, substream); in snd_es18xx_playback_prepare()
727 return snd_es18xx_playback2_prepare(chip, substream); in snd_es18xx_playback_prepare()
733 struct snd_es18xx *chip = snd_pcm_substream_chip(substream); in snd_es18xx_playback_trigger() local
734 if (substream->number == 0 && (chip->caps & ES18XX_PCM2)) in snd_es18xx_playback_trigger()
735 return snd_es18xx_playback1_trigger(chip, substream, cmd); in snd_es18xx_playback_trigger()
737 return snd_es18xx_playback2_trigger(chip, substream, cmd); in snd_es18xx_playback_trigger()
743 struct snd_es18xx *chip = card->private_data; in snd_es18xx_interrupt() local
746 if (chip->caps & ES18XX_CONTROL) { in snd_es18xx_interrupt()
748 status = inb(chip->ctrl_port + 6); in snd_es18xx_interrupt()
751 status = snd_es18xx_mixer_read(chip, 0x7f) >> 4; in snd_es18xx_interrupt()
756 if (inb(chip->port + 0x0C) & 0x01) in snd_es18xx_interrupt()
758 if (snd_es18xx_mixer_read(chip, 0x7A) & 0x80) in snd_es18xx_interrupt()
760 if ((chip->caps & ES18XX_HWV) && in snd_es18xx_interrupt()
761 snd_es18xx_mixer_read(chip, 0x64) & 0x10) in snd_es18xx_interrupt()
768 if (chip->active & DAC2) in snd_es18xx_interrupt()
769 snd_pcm_period_elapsed(chip->playback_a_substream); in snd_es18xx_interrupt()
771 snd_es18xx_mixer_bits(chip, 0x7A, 0x80, 0x00); in snd_es18xx_interrupt()
775 if (chip->active & ADC1) in snd_es18xx_interrupt()
776 snd_pcm_period_elapsed(chip->capture_a_substream); in snd_es18xx_interrupt()
778 else if (chip->active & DAC1) in snd_es18xx_interrupt()
779 snd_pcm_period_elapsed(chip->playback_b_substream); in snd_es18xx_interrupt()
781 inb(chip->port + 0x0E); in snd_es18xx_interrupt()
785 if ((status & MPU_IRQ) && chip->rmidi) in snd_es18xx_interrupt()
786 snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data); in snd_es18xx_interrupt()
791 if (chip->caps & ES18XX_HWV) { in snd_es18xx_interrupt()
792 split = snd_es18xx_mixer_read(chip, 0x64) & 0x80; in snd_es18xx_interrupt()
794 &chip->hw_switch->id); in snd_es18xx_interrupt()
796 &chip->hw_volume->id); in snd_es18xx_interrupt()
800 &chip->master_switch->id); in snd_es18xx_interrupt()
802 &chip->master_volume->id); in snd_es18xx_interrupt()
805 snd_es18xx_mixer_write(chip, 0x66, 0x00); in snd_es18xx_interrupt()
812 struct snd_es18xx *chip = snd_pcm_substream_chip(substream); in snd_es18xx_playback_pointer() local
816 if (substream->number == 0 && (chip->caps & ES18XX_PCM2)) { in snd_es18xx_playback_pointer()
817 if (!(chip->active & DAC2)) in snd_es18xx_playback_pointer()
819 pos = snd_dma_pointer(chip->dma2, size); in snd_es18xx_playback_pointer()
820 return pos >> chip->dma2_shift; in snd_es18xx_playback_pointer()
822 if (!(chip->active & DAC1)) in snd_es18xx_playback_pointer()
824 pos = snd_dma_pointer(chip->dma1, size); in snd_es18xx_playback_pointer()
825 return pos >> chip->dma1_shift; in snd_es18xx_playback_pointer()
831 struct snd_es18xx *chip = snd_pcm_substream_chip(substream); in snd_es18xx_capture_pointer() local
835 if (!(chip->active & ADC1)) in snd_es18xx_capture_pointer()
837 pos = snd_dma_pointer(chip->dma1, size); in snd_es18xx_capture_pointer()
838 return pos >> chip->dma1_shift; in snd_es18xx_capture_pointer()
884 struct snd_es18xx *chip = snd_pcm_substream_chip(substream); in snd_es18xx_playback_open() local
886 if (substream->number == 0 && (chip->caps & ES18XX_PCM2)) { in snd_es18xx_playback_open()
887 if ((chip->caps & ES18XX_DUPLEX_MONO) && in snd_es18xx_playback_open()
888 chip->capture_a_substream && in snd_es18xx_playback_open()
889 chip->capture_a_substream->runtime->channels != 1) in snd_es18xx_playback_open()
891 chip->playback_a_substream = substream; in snd_es18xx_playback_open()
893 if (chip->capture_a_substream) in snd_es18xx_playback_open()
895 chip->playback_b_substream = substream; in snd_es18xx_playback_open()
902 (chip->caps & ES18XX_NEW_RATE) ? &new_hw_constraints_clocks : &old_hw_constraints_clocks); in snd_es18xx_playback_open()
909 struct snd_es18xx *chip = snd_pcm_substream_chip(substream); in snd_es18xx_capture_open() local
911 if (chip->playback_b_substream) in snd_es18xx_capture_open()
913 if ((chip->caps & ES18XX_DUPLEX_MONO) && in snd_es18xx_capture_open()
914 chip->playback_a_substream && in snd_es18xx_capture_open()
915 chip->playback_a_substream->runtime->channels != 1) in snd_es18xx_capture_open()
917 chip->capture_a_substream = substream; in snd_es18xx_capture_open()
920 (chip->caps & ES18XX_NEW_RATE) ? &new_hw_constraints_clocks : &old_hw_constraints_clocks); in snd_es18xx_capture_open()
926 struct snd_es18xx *chip = snd_pcm_substream_chip(substream); in snd_es18xx_playback_close() local
928 if (substream->number == 0 && (chip->caps & ES18XX_PCM2)) in snd_es18xx_playback_close()
929 chip->playback_a_substream = NULL; in snd_es18xx_playback_close()
931 chip->playback_b_substream = NULL; in snd_es18xx_playback_close()
939 struct snd_es18xx *chip = snd_pcm_substream_chip(substream); in snd_es18xx_capture_close() local
941 chip->capture_a_substream = NULL; in snd_es18xx_capture_close()
975 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol); in snd_es18xx_info_mux() local
977 switch (chip->version) { in snd_es18xx_info_mux()
995 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol); in snd_es18xx_get_mux() local
996 int muxSource = snd_es18xx_mixer_read(chip, 0x1c) & 0x07; in snd_es18xx_get_mux()
997 if (!(chip->version == 0x1869 || chip->version == 0x1879)) { in snd_es18xx_get_mux()
1000 (chip->version == 0x1887 || chip->version == 0x1888) && in snd_es18xx_get_mux()
1001 (snd_es18xx_mixer_read(chip, 0x7a) & 0x08) in snd_es18xx_get_mux()
1012 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol); in snd_es18xx_put_mux() local
1016 switch (chip->version) { in snd_es18xx_put_mux()
1023 retVal = snd_es18xx_mixer_bits(chip, 0x7a, 0x08, 0x08) != 0x08; in snd_es18xx_put_mux()
1026 retVal = snd_es18xx_mixer_bits(chip, 0x7a, 0x08, 0x00) != 0x00; in snd_es18xx_put_mux()
1043 return (snd_es18xx_mixer_bits(chip, 0x1c, 0x07, val) != val) || retVal; in snd_es18xx_put_mux()
1050 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol); in snd_es18xx_get_spatializer_enable() local
1051 unsigned char val = snd_es18xx_mixer_read(chip, 0x50); in snd_es18xx_get_spatializer_enable()
1058 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol); in snd_es18xx_put_spatializer_enable() local
1062 oval = snd_es18xx_mixer_read(chip, 0x50) & 0x0c; in snd_es18xx_put_spatializer_enable()
1065 snd_es18xx_mixer_write(chip, 0x50, nval & ~0x04); in snd_es18xx_put_spatializer_enable()
1066 snd_es18xx_mixer_write(chip, 0x50, nval); in snd_es18xx_put_spatializer_enable()
1082 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol); in snd_es18xx_get_hw_volume() local
1083 ucontrol->value.integer.value[0] = snd_es18xx_mixer_read(chip, 0x61) & 0x3f; in snd_es18xx_get_hw_volume()
1084 ucontrol->value.integer.value[1] = snd_es18xx_mixer_read(chip, 0x63) & 0x3f; in snd_es18xx_get_hw_volume()
1092 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol); in snd_es18xx_get_hw_switch() local
1093 ucontrol->value.integer.value[0] = !(snd_es18xx_mixer_read(chip, 0x61) & 0x40); in snd_es18xx_get_hw_switch()
1094 ucontrol->value.integer.value[1] = !(snd_es18xx_mixer_read(chip, 0x63) & 0x40); in snd_es18xx_get_hw_switch()
1100 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol); in snd_es18xx_hwv_free() local
1101 chip->master_volume = NULL; in snd_es18xx_hwv_free()
1102 chip->master_switch = NULL; in snd_es18xx_hwv_free()
1103 chip->hw_volume = NULL; in snd_es18xx_hwv_free()
1104 chip->hw_switch = NULL; in snd_es18xx_hwv_free()
1107 static int snd_es18xx_reg_bits(struct snd_es18xx *chip, unsigned char reg, in snd_es18xx_reg_bits() argument
1111 return snd_es18xx_mixer_bits(chip, reg, mask, val); in snd_es18xx_reg_bits()
1113 return snd_es18xx_bits(chip, reg, mask, val); in snd_es18xx_reg_bits()
1116 static int snd_es18xx_reg_read(struct snd_es18xx *chip, unsigned char reg) in snd_es18xx_reg_read() argument
1119 return snd_es18xx_mixer_read(chip, reg); in snd_es18xx_reg_read()
1121 return snd_es18xx_read(chip, reg); in snd_es18xx_reg_read()
1146 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol); in snd_es18xx_get_single() local
1155 val = inb(chip->port + ES18XX_PM); in snd_es18xx_get_single()
1157 val = snd_es18xx_reg_read(chip, reg); in snd_es18xx_get_single()
1166 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol); in snd_es18xx_put_single() local
1180 unsigned char cur = inb(chip->port + ES18XX_PM); in snd_es18xx_put_single()
1184 outb((cur & ~mask) | val, chip->port + ES18XX_PM); in snd_es18xx_put_single()
1188 return snd_es18xx_reg_bits(chip, reg, mask, val) != val; in snd_es18xx_put_single()
1210 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol); in snd_es18xx_get_double() local
1219 left = snd_es18xx_reg_read(chip, left_reg); in snd_es18xx_get_double()
1221 right = snd_es18xx_reg_read(chip, right_reg); in snd_es18xx_get_double()
1235 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol); in snd_es18xx_put_double() local
1257 if (snd_es18xx_reg_bits(chip, left_reg, mask1, val1) != val1) in snd_es18xx_put_double()
1259 if (snd_es18xx_reg_bits(chip, right_reg, mask2, val2) != val2) in snd_es18xx_put_double()
1262 change = (snd_es18xx_reg_bits(chip, left_reg, mask1 | mask2, in snd_es18xx_put_double()
1373 static int snd_es18xx_config_read(struct snd_es18xx *chip, unsigned char reg) in snd_es18xx_config_read() argument
1377 outb(reg, chip->ctrl_port); in snd_es18xx_config_read()
1378 data = inb(chip->ctrl_port + 1); in snd_es18xx_config_read()
1382 static void snd_es18xx_config_write(struct snd_es18xx *chip, in snd_es18xx_config_write() argument
1387 outb(reg, chip->ctrl_port); in snd_es18xx_config_write()
1388 outb(data, chip->ctrl_port + 1); in snd_es18xx_config_write()
1394 static int snd_es18xx_initialize(struct snd_es18xx *chip, in snd_es18xx_initialize() argument
1401 snd_es18xx_dsp_command(chip, 0xC6); in snd_es18xx_initialize()
1403 snd_es18xx_mixer_write(chip, 0x00, 0x00); in snd_es18xx_initialize()
1406 snd_es18xx_write(chip, 0xB9, 2); in snd_es18xx_initialize()
1407 if (chip->caps & ES18XX_CONTROL) { in snd_es18xx_initialize()
1409 snd_es18xx_config_write(chip, 0x27, chip->irq); in snd_es18xx_initialize()
1412 snd_es18xx_config_write(chip, 0x62, fm_port >> 8); in snd_es18xx_initialize()
1413 snd_es18xx_config_write(chip, 0x63, fm_port & 0xff); in snd_es18xx_initialize()
1417 snd_es18xx_config_write(chip, 0x64, mpu_port >> 8); in snd_es18xx_initialize()
1418 snd_es18xx_config_write(chip, 0x65, mpu_port & 0xff); in snd_es18xx_initialize()
1420 snd_es18xx_config_write(chip, 0x28, chip->irq); in snd_es18xx_initialize()
1423 snd_es18xx_config_write(chip, 0x70, chip->irq); in snd_es18xx_initialize()
1425 snd_es18xx_config_write(chip, 0x72, chip->irq); in snd_es18xx_initialize()
1427 snd_es18xx_config_write(chip, 0x74, chip->dma1); in snd_es18xx_initialize()
1429 snd_es18xx_config_write(chip, 0x75, chip->dma2); in snd_es18xx_initialize()
1432 snd_es18xx_write(chip, 0xB1, 0x50); in snd_es18xx_initialize()
1434 snd_es18xx_mixer_write(chip, 0x7A, 0x40); in snd_es18xx_initialize()
1436 snd_es18xx_write(chip, 0xB2, 0x50); in snd_es18xx_initialize()
1438 snd_es18xx_mixer_write(chip, 0x64, 0x42); in snd_es18xx_initialize()
1440 snd_es18xx_mixer_bits(chip, 0x48, 0x10, 0x10); in snd_es18xx_initialize()
1444 switch (chip->irq) { in snd_es18xx_initialize()
1459 snd_printk(KERN_ERR "invalid irq %d\n", chip->irq); in snd_es18xx_initialize()
1462 switch (chip->dma1) { in snd_es18xx_initialize()
1473 snd_printk(KERN_ERR "invalid dma1 %d\n", chip->dma1); in snd_es18xx_initialize()
1476 switch (chip->dma2) { in snd_es18xx_initialize()
1490 snd_printk(KERN_ERR "invalid dma2 %d\n", chip->dma2); in snd_es18xx_initialize()
1495 snd_es18xx_write(chip, 0xB1, 0x50 | (irqmask << 2)); in snd_es18xx_initialize()
1497 snd_es18xx_write(chip, 0xB2, 0x50 | (dma1mask << 2)); in snd_es18xx_initialize()
1499 snd_es18xx_mixer_bits(chip, 0x7d, 0x07, 0x04 | dma2mask); in snd_es18xx_initialize()
1502 snd_es18xx_mixer_write(chip, 0x7A, 0x68); in snd_es18xx_initialize()
1504 snd_es18xx_mixer_write(chip, 0x64, 0x06); in snd_es18xx_initialize()
1509 snd_es18xx_mixer_write(chip, 0x40, in snd_es18xx_initialize()
1512 snd_es18xx_mixer_write(chip, 0x7f, ((irqmask + 1) << 1) | 0x01); in snd_es18xx_initialize()
1514 if (chip->caps & ES18XX_NEW_RATE) { in snd_es18xx_initialize()
1518 snd_es18xx_mixer_write(chip, 0x71, 0x32); in snd_es18xx_initialize()
1520 if (!(chip->caps & ES18XX_PCM2)) { in snd_es18xx_initialize()
1522 snd_es18xx_write(chip, 0xB7, 0x80); in snd_es18xx_initialize()
1524 if (chip->caps & ES18XX_SPATIALIZER) { in snd_es18xx_initialize()
1526 snd_es18xx_mixer_write(chip, 0x54, 0x8f); in snd_es18xx_initialize()
1527 snd_es18xx_mixer_write(chip, 0x56, 0x95); in snd_es18xx_initialize()
1528 snd_es18xx_mixer_write(chip, 0x58, 0x94); in snd_es18xx_initialize()
1529 snd_es18xx_mixer_write(chip, 0x5a, 0x80); in snd_es18xx_initialize()
1532 switch (chip->version) { in snd_es18xx_initialize()
1539 snd_es18xx_config_write(chip, 0x29, snd_es18xx_config_read(chip, 0x29) | 0x40); in snd_es18xx_initialize()
1543 if (chip->caps & ES18XX_MUTEREC) in snd_es18xx_initialize()
1545 if (chip->caps & ES18XX_RECMIX) in snd_es18xx_initialize()
1546 snd_es18xx_mixer_write(chip, 0x1c, 0x05 | mask); in snd_es18xx_initialize()
1548 snd_es18xx_mixer_write(chip, 0x1c, 0x00 | mask); in snd_es18xx_initialize()
1549 snd_es18xx_write(chip, 0xb4, 0x00); in snd_es18xx_initialize()
1553 snd_es18xx_dsp_command(chip, 0xD1); in snd_es18xx_initialize()
1559 static int snd_es18xx_identify(struct snd_es18xx *chip) in snd_es18xx_identify() argument
1564 if (snd_es18xx_reset(chip) < 0) { in snd_es18xx_identify()
1565 snd_printk(KERN_ERR "reset at 0x%lx failed!!!\n", chip->port); in snd_es18xx_identify()
1569 snd_es18xx_dsp_command(chip, 0xe7); in snd_es18xx_identify()
1570 hi = snd_es18xx_dsp_get_byte(chip); in snd_es18xx_identify()
1574 lo = snd_es18xx_dsp_get_byte(chip); in snd_es18xx_identify()
1579 chip->version = 0x488; in snd_es18xx_identify()
1586 chip->version = 0x688; in snd_es18xx_identify()
1590 outb(0x40, chip->port + 0x04); in snd_es18xx_identify()
1592 hi = inb(chip->port + 0x05); in snd_es18xx_identify()
1594 lo = inb(chip->port + 0x05); in snd_es18xx_identify()
1596 chip->version = hi << 8 | lo; in snd_es18xx_identify()
1597 chip->ctrl_port = inb(chip->port + 0x05) << 8; in snd_es18xx_identify()
1599 chip->ctrl_port += inb(chip->port + 0x05); in snd_es18xx_identify()
1601 if ((chip->res_ctrl_port = request_region(chip->ctrl_port, 8, "ES18xx - CTRL")) == NULL) { in snd_es18xx_identify()
1602 snd_printk(KERN_ERR PFX "unable go grab port 0x%lx\n", chip->ctrl_port); in snd_es18xx_identify()
1610 if (snd_es18xx_mixer_writable(chip, 0x64, 0x04)) { in snd_es18xx_identify()
1612 if (snd_es18xx_mixer_writable(chip, 0x70, 0x7f)) { in snd_es18xx_identify()
1614 if (snd_es18xx_mixer_writable(chip, 0x64, 0x20)) { in snd_es18xx_identify()
1615 chip->version = 0x1887; in snd_es18xx_identify()
1617 chip->version = 0x1888; in snd_es18xx_identify()
1620 chip->version = 0x1788; in snd_es18xx_identify()
1624 chip->version = 0x1688; in snd_es18xx_identify()
1628 static int snd_es18xx_probe(struct snd_es18xx *chip, in snd_es18xx_probe() argument
1632 if (snd_es18xx_identify(chip) < 0) { in snd_es18xx_probe()
1633 snd_printk(KERN_ERR PFX "[0x%lx] ESS chip not found\n", chip->port); in snd_es18xx_probe()
1637 switch (chip->version) { in snd_es18xx_probe()
1639 chip->caps = ES18XX_DUPLEX_MONO | ES18XX_DUPLEX_SAME | ES18XX_CONTROL | ES18XX_GPO_2BIT; in snd_es18xx_probe()
1642 …chip->caps = ES18XX_PCM2 | ES18XX_SPATIALIZER | ES18XX_RECMIX | ES18XX_NEW_RATE | ES18XX_AUXB | ES… in snd_es18xx_probe()
1645 chip->caps = ES18XX_DUPLEX_MONO | ES18XX_DUPLEX_SAME | ES18XX_I2S | ES18XX_CONTROL; in snd_es18xx_probe()
1648 …chip->caps = ES18XX_PCM2 | ES18XX_SPATIALIZER | ES18XX_RECMIX | ES18XX_NEW_RATE | ES18XX_AUXB | ES… in snd_es18xx_probe()
1652 chip->caps = ES18XX_PCM2 | ES18XX_RECMIX | ES18XX_AUXB | ES18XX_DUPLEX_SAME | ES18XX_GPO_2BIT; in snd_es18xx_probe()
1656 chip->port, chip->version); in snd_es18xx_probe()
1660 snd_printd("[0x%lx] ESS%x chip found\n", chip->port, chip->version); in snd_es18xx_probe()
1662 if (chip->dma1 == chip->dma2) in snd_es18xx_probe()
1663 chip->caps &= ~(ES18XX_PCM2 | ES18XX_DUPLEX_SAME); in snd_es18xx_probe()
1665 return snd_es18xx_initialize(chip, mpu_port, fm_port); in snd_es18xx_probe()
1692 struct snd_es18xx *chip = card->private_data; in snd_es18xx_pcm() local
1697 sprintf(str, "ES%x", chip->version); in snd_es18xx_pcm()
1698 if (chip->caps & ES18XX_PCM2) in snd_es18xx_pcm()
1709 pcm->private_data = chip; in snd_es18xx_pcm()
1711 if (chip->caps & ES18XX_DUPLEX_SAME) in snd_es18xx_pcm()
1713 if (! (chip->caps & ES18XX_PCM2)) in snd_es18xx_pcm()
1715 sprintf(pcm->name, "ESS AudioDrive ES%x", chip->version); in snd_es18xx_pcm()
1716 chip->pcm = pcm; in snd_es18xx_pcm()
1721 chip->dma1 > 3 || chip->dma2 > 3 ? 128*1024 : 64*1024); in snd_es18xx_pcm()
1729 struct snd_es18xx *chip = card->private_data; in snd_es18xx_suspend() local
1733 snd_pcm_suspend_all(chip->pcm); in snd_es18xx_suspend()
1736 chip->pm_reg = (unsigned char)snd_es18xx_read(chip, ES18XX_PM); in snd_es18xx_suspend()
1737 chip->pm_reg |= (ES18XX_PM_FM | ES18XX_PM_SUS); in snd_es18xx_suspend()
1738 snd_es18xx_write(chip, ES18XX_PM, chip->pm_reg); in snd_es18xx_suspend()
1739 snd_es18xx_write(chip, ES18XX_PM, chip->pm_reg ^= ES18XX_PM_SUS); in snd_es18xx_suspend()
1746 struct snd_es18xx *chip = card->private_data; in snd_es18xx_resume() local
1749 snd_es18xx_write(chip, ES18XX_PM, chip->pm_reg ^= ES18XX_PM_FM); in snd_es18xx_resume()
1758 struct snd_es18xx *chip = card->private_data; in snd_es18xx_free() local
1760 release_and_free_resource(chip->res_port); in snd_es18xx_free()
1761 release_and_free_resource(chip->res_ctrl_port); in snd_es18xx_free()
1762 release_and_free_resource(chip->res_mpu_port); in snd_es18xx_free()
1763 if (chip->irq >= 0) in snd_es18xx_free()
1764 free_irq(chip->irq, (void *) card); in snd_es18xx_free()
1765 if (chip->dma1 >= 0) { in snd_es18xx_free()
1766 disable_dma(chip->dma1); in snd_es18xx_free()
1767 free_dma(chip->dma1); in snd_es18xx_free()
1769 if (chip->dma2 >= 0 && chip->dma1 != chip->dma2) { in snd_es18xx_free()
1770 disable_dma(chip->dma2); in snd_es18xx_free()
1771 free_dma(chip->dma2); in snd_es18xx_free()
1787 struct snd_es18xx *chip = card->private_data; in snd_es18xx_new_device() local
1793 spin_lock_init(&chip->reg_lock); in snd_es18xx_new_device()
1794 spin_lock_init(&chip->mixer_lock); in snd_es18xx_new_device()
1795 chip->port = port; in snd_es18xx_new_device()
1796 chip->irq = -1; in snd_es18xx_new_device()
1797 chip->dma1 = -1; in snd_es18xx_new_device()
1798 chip->dma2 = -1; in snd_es18xx_new_device()
1799 chip->audio2_vol = 0x00; in snd_es18xx_new_device()
1800 chip->active = 0; in snd_es18xx_new_device()
1802 chip->res_port = request_region(port, 16, "ES18xx"); in snd_es18xx_new_device()
1803 if (chip->res_port == NULL) { in snd_es18xx_new_device()
1815 chip->irq = irq; in snd_es18xx_new_device()
1822 chip->dma1 = dma1; in snd_es18xx_new_device()
1829 chip->dma2 = dma2; in snd_es18xx_new_device()
1831 if (snd_es18xx_probe(chip, mpu_port, fm_port) < 0) { in snd_es18xx_new_device()
1835 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); in snd_es18xx_new_device()
1845 struct snd_es18xx *chip = card->private_data; in snd_es18xx_mixer() local
1849 strcpy(card->mixername, chip->pcm->name); in snd_es18xx_mixer()
1853 kctl = snd_ctl_new1(&snd_es18xx_base_controls[idx], chip); in snd_es18xx_mixer()
1854 if (chip->caps & ES18XX_HWV) { in snd_es18xx_mixer()
1857 chip->master_volume = kctl; in snd_es18xx_mixer()
1861 chip->master_switch = kctl; in snd_es18xx_mixer()
1869 if (chip->caps & ES18XX_PCM2) { in snd_es18xx_mixer()
1871 if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_es18xx_pcm2_controls[idx], chip))) < 0) in snd_es18xx_mixer()
1876 if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_es18xx_pcm1_controls[idx], chip))) < 0) in snd_es18xx_mixer()
1881 if (chip->caps & ES18XX_RECMIX) { in snd_es18xx_mixer()
1883 if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_es18xx_recmix_controls[idx], chip))) < 0) in snd_es18xx_mixer()
1887 switch (chip->version) { in snd_es18xx_mixer()
1889 if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_es18xx_micpre1_control, chip))) < 0) in snd_es18xx_mixer()
1894 if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_es18xx_micpre2_control, chip))) < 0) in snd_es18xx_mixer()
1898 if (chip->caps & ES18XX_SPATIALIZER) { in snd_es18xx_mixer()
1900 if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_es18xx_spatializer_controls[idx], chip))) < 0) in snd_es18xx_mixer()
1904 if (chip->caps & ES18XX_HWV) { in snd_es18xx_mixer()
1907 kctl = snd_ctl_new1(&snd_es18xx_hw_volume_controls[idx], chip); in snd_es18xx_mixer()
1909 chip->hw_volume = kctl; in snd_es18xx_mixer()
1911 chip->hw_switch = kctl; in snd_es18xx_mixer()
1920 if (chip->version != 0x1868) { in snd_es18xx_mixer()
1922 chip)); in snd_es18xx_mixer()
1926 if (chip->version == 0x1869) { in snd_es18xx_mixer()
1930 chip)); in snd_es18xx_mixer()
1934 } else if (chip->version == 0x1878) { in snd_es18xx_mixer()
1936 chip)); in snd_es18xx_mixer()
1939 } else if (chip->version == 0x1879) { in snd_es18xx_mixer()
1943 chip)); in snd_es18xx_mixer()
1948 if (chip->caps & ES18XX_GPO_2BIT) { in snd_es18xx_mixer()
1952 chip)); in snd_es18xx_mixer()
2056 static int snd_audiodrive_pnp(int dev, struct snd_es18xx *chip, in snd_audiodrive_pnp() argument
2059 chip->dev = pdev; in snd_audiodrive_pnp()
2060 if (snd_audiodrive_pnp_init_main(dev, chip->dev) < 0) in snd_audiodrive_pnp()
2086 static int snd_audiodrive_pnpc(int dev, struct snd_es18xx *chip, in snd_audiodrive_pnpc() argument
2090 chip->dev = pnp_request_card_device(card, id->devs[0].id, NULL); in snd_audiodrive_pnpc()
2091 if (chip->dev == NULL) in snd_audiodrive_pnpc()
2094 chip->devc = pnp_request_card_device(card, id->devs[1].id, NULL); in snd_audiodrive_pnpc()
2095 if (chip->devc == NULL) in snd_audiodrive_pnpc()
2099 if (pnp_activate_dev(chip->devc) < 0) { in snd_audiodrive_pnpc()
2104 (unsigned long long)pnp_port_start(chip->devc, 0)); in snd_audiodrive_pnpc()
2105 if (snd_audiodrive_pnp_init_main(dev, chip->dev) < 0) in snd_audiodrive_pnpc()
2127 struct snd_es18xx *chip = card->private_data; in snd_audiodrive_probe() local
2137 sprintf(card->driver, "ES%x", chip->version); in snd_audiodrive_probe()
2139 sprintf(card->shortname, "ESS AudioDrive ES%x", chip->version); in snd_audiodrive_probe()
2143 chip->port, in snd_audiodrive_probe()
2148 chip->port, in snd_audiodrive_probe()
2175 -1, &chip->rmidi); in snd_audiodrive_probe()