Lines Matching +full:chip +full:- +full:to +full:- +full:chip

6  * The original author of OSS nm256 driver wishes to remain anonymous,
7 * so I just put my acknoledgment to him/her here.
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
76 MODULE_PARM_DESC(force_ac97, "Force to use AC97 codec for " CARD_NAME " soundcard.");
120 #define NM_ACK_INT(chip, X) snd_nm256_writew(chip, NM_INT_REG, (X) << 1) argument
137 #define NM2_ACK_INT(chip, X) snd_nm256_writel(chip, NM_INT_REG, (X)) argument
189 struct nm256 *chip; member
194 u32 buf; /* offset from chip->buffer */
228 unsigned int reset_workaround: 1; /* Workaround for some laptops to avoid freeze */
229 …unsigned int reset_workaround_2: 1; /* Extended workaround for some other laptops to avoid freeze …
234 int mixer_status_mask; /* bit mask to test the mixer status */
239 int badintrcount; /* counter to check bogus interrupts */
280 snd_nm256_readb(struct nm256 *chip, int offset) in snd_nm256_readb() argument
282 return readb(chip->cport + offset); in snd_nm256_readb()
286 snd_nm256_readw(struct nm256 *chip, int offset) in snd_nm256_readw() argument
288 return readw(chip->cport + offset); in snd_nm256_readw()
292 snd_nm256_readl(struct nm256 *chip, int offset) in snd_nm256_readl() argument
294 return readl(chip->cport + offset); in snd_nm256_readl()
298 snd_nm256_writeb(struct nm256 *chip, int offset, u8 val) in snd_nm256_writeb() argument
300 writeb(val, chip->cport + offset); in snd_nm256_writeb()
304 snd_nm256_writew(struct nm256 *chip, int offset, u16 val) in snd_nm256_writew() argument
306 writew(val, chip->cport + offset); in snd_nm256_writew()
310 snd_nm256_writel(struct nm256 *chip, int offset, u32 val) in snd_nm256_writel() argument
312 writel(val, chip->cport + offset); in snd_nm256_writel()
316 snd_nm256_write_buffer(struct nm256 *chip, void *src, int offset, int size) in snd_nm256_write_buffer() argument
318 offset -= chip->buffer_start; in snd_nm256_write_buffer()
320 if (offset < 0 || offset >= chip->buffer_size) { in snd_nm256_write_buffer()
326 memcpy_toio(chip->buffer + offset, src, size); in snd_nm256_write_buffer()
330 * coefficient handlers -- what a magic!
337 while (which-- > 0) in snd_nm256_get_start_offset()
343 snd_nm256_load_one_coefficient(struct nm256 *chip, int stream, u32 port, int which) in snd_nm256_load_one_coefficient() argument
345 u32 coeff_buf = chip->coeff_buf[stream]; in snd_nm256_load_one_coefficient()
349 snd_nm256_write_buffer(chip, coefficients + offset, coeff_buf, size); in snd_nm256_load_one_coefficient()
350 snd_nm256_writel(chip, port, coeff_buf); in snd_nm256_load_one_coefficient()
351 /* ??? Record seems to behave differently than playback. */ in snd_nm256_load_one_coefficient()
353 size--; in snd_nm256_load_one_coefficient()
354 snd_nm256_writel(chip, port + 4, coeff_buf + size); in snd_nm256_load_one_coefficient()
358 snd_nm256_load_coefficient(struct nm256 *chip, int stream, int number) in snd_nm256_load_coefficient() argument
368 if (snd_nm256_readb(chip, poffset) & 1) { in snd_nm256_load_coefficient()
373 /* The recording engine uses coefficient values 8-15. */ in snd_nm256_load_coefficient()
378 if (! chip->use_cache) { in snd_nm256_load_coefficient()
379 snd_nm256_load_one_coefficient(chip, stream, addr, number); in snd_nm256_load_coefficient()
382 if (! chip->coeffs_current) { in snd_nm256_load_coefficient()
383 snd_nm256_write_buffer(chip, coefficients, chip->all_coeff_buf, in snd_nm256_load_coefficient()
385 chip->coeffs_current = 1; in snd_nm256_load_coefficient()
387 u32 base = chip->all_coeff_buf; in snd_nm256_load_coefficient()
390 snd_nm256_writel(chip, addr, base + offset); in snd_nm256_load_coefficient()
392 end_offset--; in snd_nm256_load_coefficient()
393 snd_nm256_writel(chip, addr + 4, base + end_offset); in snd_nm256_load_coefficient()
427 snd_nm256_set_format(struct nm256 *chip, struct nm256_stream *s, in snd_nm256_set_format() argument
430 struct snd_pcm_runtime *runtime = substream->runtime; in snd_nm256_set_format()
431 int rate_index = snd_nm256_fixed_rate(runtime->rate); in snd_nm256_set_format()
434 s->shift = 0; in snd_nm256_set_format()
435 if (snd_pcm_format_width(runtime->format) == 16) { in snd_nm256_set_format()
437 s->shift++; in snd_nm256_set_format()
439 if (runtime->channels > 1) { in snd_nm256_set_format()
441 s->shift++; in snd_nm256_set_format()
444 runtime->rate = samplerates[rate_index]; in snd_nm256_set_format()
446 switch (substream->stream) { in snd_nm256_set_format()
448 snd_nm256_load_coefficient(chip, 0, rate_index); /* 0 = playback */ in snd_nm256_set_format()
449 snd_nm256_writeb(chip, in snd_nm256_set_format()
454 snd_nm256_load_coefficient(chip, 1, rate_index); /* 1 = record */ in snd_nm256_set_format()
455 snd_nm256_writeb(chip, in snd_nm256_set_format()
463 static int snd_nm256_acquire_irq(struct nm256 *chip) in snd_nm256_acquire_irq() argument
465 mutex_lock(&chip->irq_mutex); in snd_nm256_acquire_irq()
466 if (chip->irq < 0) { in snd_nm256_acquire_irq()
467 if (request_irq(chip->pci->irq, chip->interrupt, IRQF_SHARED, in snd_nm256_acquire_irq()
468 KBUILD_MODNAME, chip)) { in snd_nm256_acquire_irq()
469 snd_printk(KERN_ERR "unable to grab IRQ %d\n", chip->pci->irq); in snd_nm256_acquire_irq()
470 mutex_unlock(&chip->irq_mutex); in snd_nm256_acquire_irq()
471 return -EBUSY; in snd_nm256_acquire_irq()
473 chip->irq = chip->pci->irq; in snd_nm256_acquire_irq()
475 chip->irq_acks++; in snd_nm256_acquire_irq()
476 mutex_unlock(&chip->irq_mutex); in snd_nm256_acquire_irq()
481 static void snd_nm256_release_irq(struct nm256 *chip) in snd_nm256_release_irq() argument
483 mutex_lock(&chip->irq_mutex); in snd_nm256_release_irq()
484 if (chip->irq_acks > 0) in snd_nm256_release_irq()
485 chip->irq_acks--; in snd_nm256_release_irq()
486 if (chip->irq_acks == 0 && chip->irq >= 0) { in snd_nm256_release_irq()
487 free_irq(chip->irq, chip); in snd_nm256_release_irq()
488 chip->irq = -1; in snd_nm256_release_irq()
490 mutex_unlock(&chip->irq_mutex); in snd_nm256_release_irq()
498 static void snd_nm256_pcm_mark(struct nm256 *chip, struct nm256_stream *s, int reg) in snd_nm256_pcm_mark() argument
500 s->cur_period++; in snd_nm256_pcm_mark()
501 s->cur_period %= s->periods; in snd_nm256_pcm_mark()
502 snd_nm256_writel(chip, reg, s->buf + s->cur_period * s->period_size); in snd_nm256_pcm_mark()
505 #define snd_nm256_playback_mark(chip, s) snd_nm256_pcm_mark(chip, s, NM_PBUFFER_WMARK) argument
506 #define snd_nm256_capture_mark(chip, s) snd_nm256_pcm_mark(chip, s, NM_RBUFFER_WMARK) argument
509 snd_nm256_playback_start(struct nm256 *chip, struct nm256_stream *s, in snd_nm256_playback_start() argument
513 snd_nm256_writel(chip, NM_PBUFFER_START, s->buf); in snd_nm256_playback_start()
514 snd_nm256_writel(chip, NM_PBUFFER_END, s->buf + s->dma_size - (1 << s->shift)); in snd_nm256_playback_start()
515 snd_nm256_writel(chip, NM_PBUFFER_CURRP, s->buf); in snd_nm256_playback_start()
516 snd_nm256_playback_mark(chip, s); in snd_nm256_playback_start()
519 snd_nm256_writeb(chip, NM_PLAYBACK_ENABLE_REG, in snd_nm256_playback_start()
522 snd_nm256_writew(chip, NM_AUDIO_MUTE_REG, 0x0); in snd_nm256_playback_start()
526 snd_nm256_capture_start(struct nm256 *chip, struct nm256_stream *s, in snd_nm256_capture_start() argument
530 snd_nm256_writel(chip, NM_RBUFFER_START, s->buf); in snd_nm256_capture_start()
531 snd_nm256_writel(chip, NM_RBUFFER_END, s->buf + s->dma_size); in snd_nm256_capture_start()
532 snd_nm256_writel(chip, NM_RBUFFER_CURRP, s->buf); in snd_nm256_capture_start()
533 snd_nm256_capture_mark(chip, s); in snd_nm256_capture_start()
536 snd_nm256_writeb(chip, NM_RECORD_ENABLE_REG, in snd_nm256_capture_start()
542 snd_nm256_playback_stop(struct nm256 *chip) in snd_nm256_playback_stop() argument
545 snd_nm256_writew(chip, NM_AUDIO_MUTE_REG, in snd_nm256_playback_stop()
548 snd_nm256_writeb(chip, NM_PLAYBACK_ENABLE_REG, 0); in snd_nm256_playback_stop()
552 snd_nm256_capture_stop(struct nm256 *chip) in snd_nm256_capture_stop() argument
555 snd_nm256_writeb(chip, NM_RECORD_ENABLE_REG, 0); in snd_nm256_capture_stop()
561 struct nm256 *chip = snd_pcm_substream_chip(substream); in snd_nm256_playback_trigger() local
562 struct nm256_stream *s = substream->runtime->private_data; in snd_nm256_playback_trigger()
566 return -ENXIO; in snd_nm256_playback_trigger()
568 spin_lock(&chip->reg_lock); in snd_nm256_playback_trigger()
571 s->suspended = 0; in snd_nm256_playback_trigger()
574 if (! s->running) { in snd_nm256_playback_trigger()
575 snd_nm256_playback_start(chip, s, substream); in snd_nm256_playback_trigger()
576 s->running = 1; in snd_nm256_playback_trigger()
580 s->suspended = 1; in snd_nm256_playback_trigger()
583 if (s->running) { in snd_nm256_playback_trigger()
584 snd_nm256_playback_stop(chip); in snd_nm256_playback_trigger()
585 s->running = 0; in snd_nm256_playback_trigger()
589 err = -EINVAL; in snd_nm256_playback_trigger()
592 spin_unlock(&chip->reg_lock); in snd_nm256_playback_trigger()
599 struct nm256 *chip = snd_pcm_substream_chip(substream); in snd_nm256_capture_trigger() local
600 struct nm256_stream *s = substream->runtime->private_data; in snd_nm256_capture_trigger()
604 return -ENXIO; in snd_nm256_capture_trigger()
606 spin_lock(&chip->reg_lock); in snd_nm256_capture_trigger()
610 if (! s->running) { in snd_nm256_capture_trigger()
611 snd_nm256_capture_start(chip, s, substream); in snd_nm256_capture_trigger()
612 s->running = 1; in snd_nm256_capture_trigger()
617 if (s->running) { in snd_nm256_capture_trigger()
618 snd_nm256_capture_stop(chip); in snd_nm256_capture_trigger()
619 s->running = 0; in snd_nm256_capture_trigger()
623 err = -EINVAL; in snd_nm256_capture_trigger()
626 spin_unlock(&chip->reg_lock); in snd_nm256_capture_trigger()
636 struct nm256 *chip = snd_pcm_substream_chip(substream); in snd_nm256_pcm_prepare() local
637 struct snd_pcm_runtime *runtime = substream->runtime; in snd_nm256_pcm_prepare()
638 struct nm256_stream *s = runtime->private_data; in snd_nm256_pcm_prepare()
641 return -ENXIO; in snd_nm256_pcm_prepare()
642 s->dma_size = frames_to_bytes(runtime, substream->runtime->buffer_size); in snd_nm256_pcm_prepare()
643 s->period_size = frames_to_bytes(runtime, substream->runtime->period_size); in snd_nm256_pcm_prepare()
644 s->periods = substream->runtime->periods; in snd_nm256_pcm_prepare()
645 s->cur_period = 0; in snd_nm256_pcm_prepare()
647 spin_lock_irq(&chip->reg_lock); in snd_nm256_pcm_prepare()
648 s->running = 0; in snd_nm256_pcm_prepare()
649 snd_nm256_set_format(chip, s, substream); in snd_nm256_pcm_prepare()
650 spin_unlock_irq(&chip->reg_lock); in snd_nm256_pcm_prepare()
662 struct nm256 *chip = snd_pcm_substream_chip(substream); in snd_nm256_playback_pointer() local
663 struct nm256_stream *s = substream->runtime->private_data; in snd_nm256_playback_pointer()
668 curp = snd_nm256_readl(chip, NM_PBUFFER_CURRP) - (unsigned long)s->buf; in snd_nm256_playback_pointer()
669 curp %= s->dma_size; in snd_nm256_playback_pointer()
670 return bytes_to_frames(substream->runtime, curp); in snd_nm256_playback_pointer()
676 struct nm256 *chip = snd_pcm_substream_chip(substream); in snd_nm256_capture_pointer() local
677 struct nm256_stream *s = substream->runtime->private_data; in snd_nm256_capture_pointer()
682 curp = snd_nm256_readl(chip, NM_RBUFFER_CURRP) - (unsigned long)s->buf; in snd_nm256_capture_pointer()
683 curp %= s->dma_size; in snd_nm256_capture_pointer()
684 return bytes_to_frames(substream->runtime, curp); in snd_nm256_capture_pointer()
699 struct snd_pcm_runtime *runtime = substream->runtime; in snd_nm256_playback_silence()
700 struct nm256_stream *s = runtime->private_data; in snd_nm256_playback_silence()
703 memset_io(s->bufptr + pos, 0, count); in snd_nm256_playback_silence()
714 struct snd_pcm_runtime *runtime = substream->runtime; in snd_nm256_playback_copy()
715 struct nm256_stream *s = runtime->private_data; in snd_nm256_playback_copy()
718 if (copy_from_user_toio(s->bufptr + pos, src, count)) in snd_nm256_playback_copy()
719 return -EFAULT; in snd_nm256_playback_copy()
724 * copy to user
733 struct snd_pcm_runtime *runtime = substream->runtime; in snd_nm256_capture_copy()
734 struct nm256_stream *s = runtime->private_data; in snd_nm256_capture_copy()
737 if (copy_to_user_fromio(dst, s->bufptr + pos, count)) in snd_nm256_capture_copy()
738 return -EFAULT; in snd_nm256_capture_copy()
751 snd_nm256_playback_update(struct nm256 *chip) in snd_nm256_playback_update() argument
755 s = &chip->streams[SNDRV_PCM_STREAM_PLAYBACK]; in snd_nm256_playback_update()
756 if (s->running && s->substream) { in snd_nm256_playback_update()
757 spin_unlock(&chip->reg_lock); in snd_nm256_playback_update()
758 snd_pcm_period_elapsed(s->substream); in snd_nm256_playback_update()
759 spin_lock(&chip->reg_lock); in snd_nm256_playback_update()
760 snd_nm256_playback_mark(chip, s); in snd_nm256_playback_update()
766 snd_nm256_capture_update(struct nm256 *chip) in snd_nm256_capture_update() argument
770 s = &chip->streams[SNDRV_PCM_STREAM_CAPTURE]; in snd_nm256_capture_update()
771 if (s->running && s->substream) { in snd_nm256_capture_update()
772 spin_unlock(&chip->reg_lock); in snd_nm256_capture_update()
773 snd_pcm_period_elapsed(s->substream); in snd_nm256_capture_update()
774 spin_lock(&chip->reg_lock); in snd_nm256_capture_update()
775 snd_nm256_capture_mark(chip, s); in snd_nm256_capture_update()
826 substream->runtime->dma_bytes = params_buffer_bytes(hw_params); in snd_nm256_pcm_hw_params()
833 static void snd_nm256_setup_stream(struct nm256 *chip, struct nm256_stream *s, in snd_nm256_setup_stream() argument
837 struct snd_pcm_runtime *runtime = substream->runtime; in snd_nm256_setup_stream()
839 s->running = 0; in snd_nm256_setup_stream()
840 runtime->hw = *hw_ptr; in snd_nm256_setup_stream()
841 runtime->hw.buffer_bytes_max = s->bufsize; in snd_nm256_setup_stream()
842 runtime->hw.period_bytes_max = s->bufsize / 2; in snd_nm256_setup_stream()
843 runtime->dma_area = (void __force *) s->bufptr; in snd_nm256_setup_stream()
844 runtime->dma_addr = s->bufptr_addr; in snd_nm256_setup_stream()
845 runtime->dma_bytes = s->bufsize; in snd_nm256_setup_stream()
846 runtime->private_data = s; in snd_nm256_setup_stream()
847 s->substream = substream; in snd_nm256_setup_stream()
856 struct nm256 *chip = snd_pcm_substream_chip(substream); in snd_nm256_playback_open() local
858 if (snd_nm256_acquire_irq(chip) < 0) in snd_nm256_playback_open()
859 return -EBUSY; in snd_nm256_playback_open()
860 snd_nm256_setup_stream(chip, &chip->streams[SNDRV_PCM_STREAM_PLAYBACK], in snd_nm256_playback_open()
868 struct nm256 *chip = snd_pcm_substream_chip(substream); in snd_nm256_capture_open() local
870 if (snd_nm256_acquire_irq(chip) < 0) in snd_nm256_capture_open()
871 return -EBUSY; in snd_nm256_capture_open()
872 snd_nm256_setup_stream(chip, &chip->streams[SNDRV_PCM_STREAM_CAPTURE], in snd_nm256_capture_open()
878 * close - we don't have to do special..
883 struct nm256 *chip = snd_pcm_substream_chip(substream); in snd_nm256_playback_close() local
885 snd_nm256_release_irq(chip); in snd_nm256_playback_close()
893 struct nm256 *chip = snd_pcm_substream_chip(substream); in snd_nm256_capture_close() local
895 snd_nm256_release_irq(chip); in snd_nm256_capture_close()
932 snd_nm256_pcm(struct nm256 *chip, int device) in snd_nm256_pcm() argument
938 struct nm256_stream *s = &chip->streams[i]; in snd_nm256_pcm()
939 s->bufptr = chip->buffer + (s->buf - chip->buffer_start); in snd_nm256_pcm()
940 s->bufptr_addr = chip->buffer_addr + (s->buf - chip->buffer_start); in snd_nm256_pcm()
943 err = snd_pcm_new(chip->card, chip->card->driver, device, in snd_nm256_pcm()
951 pcm->private_data = chip; in snd_nm256_pcm()
952 pcm->info_flags = 0; in snd_nm256_pcm()
953 chip->pcm = pcm; in snd_nm256_pcm()
963 snd_nm256_init_chip(struct nm256 *chip) in snd_nm256_init_chip() argument
966 snd_nm256_writeb(chip, 0x0, 0x11); in snd_nm256_init_chip()
967 snd_nm256_writew(chip, 0x214, 0); in snd_nm256_init_chip()
969 //snd_nm256_playback_stop(chip); in snd_nm256_init_chip()
970 //snd_nm256_capture_stop(chip); in snd_nm256_init_chip()
975 snd_nm256_intr_check(struct nm256 *chip) in snd_nm256_intr_check() argument
977 if (chip->badintrcount++ > 1000) { in snd_nm256_intr_check()
979 * I'm not sure if the best thing is to stop the card from in snd_nm256_intr_check()
984 * I worry about the card engine continuing to play noise in snd_nm256_intr_check()
985 * over and over, however--that could become a very in snd_nm256_intr_check()
990 if (chip->streams[SNDRV_PCM_STREAM_PLAYBACK].running) in snd_nm256_intr_check()
991 snd_nm256_playback_stop(chip); in snd_nm256_intr_check()
992 if (chip->streams[SNDRV_PCM_STREAM_CAPTURE].running) in snd_nm256_intr_check()
993 snd_nm256_capture_stop(chip); in snd_nm256_intr_check()
994 chip->badintrcount = 0; in snd_nm256_intr_check()
1001 * Handle a potential interrupt for the device referred to by DEV_ID.
1003 * I don't like the cut-n-paste job here either between the two routines,
1012 struct nm256 *chip = dev_id; in snd_nm256_interrupt() local
1016 status = snd_nm256_readw(chip, NM_INT_REG); in snd_nm256_interrupt()
1020 return snd_nm256_intr_check(chip); in snd_nm256_interrupt()
1022 chip->badintrcount = 0; in snd_nm256_interrupt()
1026 spin_lock(&chip->reg_lock); in snd_nm256_interrupt()
1029 NM_ACK_INT(chip, NM_PLAYBACK_INT); in snd_nm256_interrupt()
1030 snd_nm256_playback_update(chip); in snd_nm256_interrupt()
1035 NM_ACK_INT(chip, NM_RECORD_INT); in snd_nm256_interrupt()
1036 snd_nm256_capture_update(chip); in snd_nm256_interrupt()
1041 NM_ACK_INT(chip, NM_MISC_INT_1); in snd_nm256_interrupt()
1043 snd_nm256_writew(chip, NM_INT_REG, 0x8000); in snd_nm256_interrupt()
1044 cbyte = snd_nm256_readb(chip, 0x400); in snd_nm256_interrupt()
1045 snd_nm256_writeb(chip, 0x400, cbyte | 2); in snd_nm256_interrupt()
1050 NM_ACK_INT(chip, NM_MISC_INT_2); in snd_nm256_interrupt()
1052 cbyte = snd_nm256_readb(chip, 0x400); in snd_nm256_interrupt()
1053 snd_nm256_writeb(chip, 0x400, cbyte & ~2); in snd_nm256_interrupt()
1061 NM_ACK_INT(chip, status); in snd_nm256_interrupt()
1064 spin_unlock(&chip->reg_lock); in snd_nm256_interrupt()
1069 * Handle a potential interrupt for the device referred to by DEV_ID.
1070 * This handler is for the 256ZX, and is very similar to the non-ZX
1077 struct nm256 *chip = dev_id; in snd_nm256_interrupt_zx() local
1081 status = snd_nm256_readl(chip, NM_INT_REG); in snd_nm256_interrupt_zx()
1085 return snd_nm256_intr_check(chip); in snd_nm256_interrupt_zx()
1087 chip->badintrcount = 0; in snd_nm256_interrupt_zx()
1091 spin_lock(&chip->reg_lock); in snd_nm256_interrupt_zx()
1094 NM2_ACK_INT(chip, NM2_PLAYBACK_INT); in snd_nm256_interrupt_zx()
1095 snd_nm256_playback_update(chip); in snd_nm256_interrupt_zx()
1100 NM2_ACK_INT(chip, NM2_RECORD_INT); in snd_nm256_interrupt_zx()
1101 snd_nm256_capture_update(chip); in snd_nm256_interrupt_zx()
1106 NM2_ACK_INT(chip, NM2_MISC_INT_1); in snd_nm256_interrupt_zx()
1108 cbyte = snd_nm256_readb(chip, 0x400); in snd_nm256_interrupt_zx()
1109 snd_nm256_writeb(chip, 0x400, cbyte | 2); in snd_nm256_interrupt_zx()
1114 NM2_ACK_INT(chip, NM2_MISC_INT_2); in snd_nm256_interrupt_zx()
1116 cbyte = snd_nm256_readb(chip, 0x400); in snd_nm256_interrupt_zx()
1117 snd_nm256_writeb(chip, 0x400, cbyte & ~2); in snd_nm256_interrupt_zx()
1125 NM2_ACK_INT(chip, status); in snd_nm256_interrupt_zx()
1128 spin_unlock(&chip->reg_lock); in snd_nm256_interrupt_zx()
1137 * Waits for the mixer to become ready to be written; returns a zero value
1141 snd_nm256_ac97_ready(struct nm256 *chip) in snd_nm256_ac97_ready() argument
1147 testaddr = chip->mixer_status_offset; in snd_nm256_ac97_ready()
1148 testb = chip->mixer_status_mask; in snd_nm256_ac97_ready()
1151 * Loop around waiting for the mixer to become ready. in snd_nm256_ac97_ready()
1153 while (timeout-- > 0) { in snd_nm256_ac97_ready()
1154 if ((snd_nm256_readw(chip, testaddr) & testb) == 0) in snd_nm256_ac97_ready()
1162 * Initial register values to be written to the AC97 mixer.
1163 * While most of these are identical to the reset values, we do this
1164 * so that we have most of the register contents cached--this avoids
1165 * reading from the mixer directly (which seems to be problematic,
1166 * probably due to ignorance).
1201 return -1; in nm256_ac97_idx()
1206 * thus we're treating it as a write-only mixer and cache the
1212 struct nm256 *chip = ac97->private_data; in snd_nm256_ac97_read() local
1217 return chip->ac97_regs[idx]; in snd_nm256_ac97_read()
1226 struct nm256 *chip = ac97->private_data; in snd_nm256_ac97_write() local
1234 base = chip->mixer_base; in snd_nm256_ac97_write()
1236 snd_nm256_ac97_ready(chip); in snd_nm256_ac97_write()
1238 /* Wait for the write to take, too. */ in snd_nm256_ac97_write()
1239 while (tries-- > 0) { in snd_nm256_ac97_write()
1240 snd_nm256_writew(chip, base + reg, val); in snd_nm256_ac97_write()
1242 if (snd_nm256_ac97_ready(chip)) { in snd_nm256_ac97_write()
1244 chip->ac97_regs[idx] = val; in snd_nm256_ac97_write()
1272 struct nm256 *chip = ac97->private_data; in snd_nm256_ac97_reset() local
1275 snd_nm256_writeb(chip, 0x6c0, 1); in snd_nm256_ac97_reset()
1276 if (! chip->reset_workaround) { in snd_nm256_ac97_reset()
1278 snd_nm256_writeb(chip, 0x6cc, 0x87); in snd_nm256_ac97_reset()
1280 if (! chip->reset_workaround_2) { in snd_nm256_ac97_reset()
1282 snd_nm256_writeb(chip, 0x6cc, 0x80); in snd_nm256_ac97_reset()
1283 snd_nm256_writeb(chip, 0x6cc, 0x0); in snd_nm256_ac97_reset()
1285 if (! chip->in_resume) { in snd_nm256_ac97_reset()
1288 /* preload the cache, so as to avoid even a single in snd_nm256_ac97_reset()
1299 snd_nm256_mixer(struct nm256 *chip) in snd_nm256_mixer() argument
1310 chip->ac97_regs = kcalloc(ARRAY_SIZE(nm256_ac97_init_val), in snd_nm256_mixer()
1312 if (! chip->ac97_regs) in snd_nm256_mixer()
1313 return -ENOMEM; in snd_nm256_mixer()
1315 if ((err = snd_ac97_bus(chip->card, 0, &ops, NULL, &pbus)) < 0) in snd_nm256_mixer()
1320 ac97.private_data = chip; in snd_nm256_mixer()
1322 pbus->no_vra = 1; in snd_nm256_mixer()
1323 err = snd_ac97_mixer(pbus, &ac97, &chip->ac97); in snd_nm256_mixer()
1326 if (! (chip->ac97->id & (0xf0000000))) { in snd_nm256_mixer()
1328 sprintf(chip->card->mixername, "%s AC97", chip->card->driver); in snd_nm256_mixer()
1340 snd_nm256_peek_for_sig(struct nm256 *chip) in snd_nm256_peek_for_sig() argument
1345 unsigned long pointer_found = chip->buffer_end - 0x1400; in snd_nm256_peek_for_sig()
1348 temp = ioremap_nocache(chip->buffer_addr + chip->buffer_end - 0x400, 16); in snd_nm256_peek_for_sig()
1350 snd_printk(KERN_ERR "Unable to scan for card signature in video RAM\n"); in snd_nm256_peek_for_sig()
1351 return -EBUSY; in snd_nm256_peek_for_sig()
1362 pointer < chip->buffer_size || in snd_nm256_peek_for_sig()
1363 pointer > chip->buffer_end) { in snd_nm256_peek_for_sig()
1366 return -ENODEV; in snd_nm256_peek_for_sig()
1375 chip->buffer_end = pointer_found; in snd_nm256_peek_for_sig()
1388 struct nm256 *chip = card->private_data; in nm256_suspend() local
1391 snd_pcm_suspend_all(chip->pcm); in nm256_suspend()
1392 snd_ac97_suspend(chip->ac97); in nm256_suspend()
1393 chip->coeffs_current = 0; in nm256_suspend()
1403 struct nm256 *chip = card->private_data; in nm256_resume() local
1407 chip->in_resume = 1; in nm256_resume()
1415 return -EIO; in nm256_resume()
1419 snd_nm256_init_chip(chip); in nm256_resume()
1422 snd_ac97_resume(chip->ac97); in nm256_resume()
1425 struct nm256_stream *s = &chip->streams[i]; in nm256_resume()
1426 if (s->substream && s->suspended) { in nm256_resume()
1427 spin_lock_irq(&chip->reg_lock); in nm256_resume()
1428 snd_nm256_set_format(chip, s, s->substream); in nm256_resume()
1429 spin_unlock_irq(&chip->reg_lock); in nm256_resume()
1434 chip->in_resume = 0; in nm256_resume()
1439 static int snd_nm256_free(struct nm256 *chip) in snd_nm256_free() argument
1441 if (chip->streams[SNDRV_PCM_STREAM_PLAYBACK].running) in snd_nm256_free()
1442 snd_nm256_playback_stop(chip); in snd_nm256_free()
1443 if (chip->streams[SNDRV_PCM_STREAM_CAPTURE].running) in snd_nm256_free()
1444 snd_nm256_capture_stop(chip); in snd_nm256_free()
1446 if (chip->irq >= 0) in snd_nm256_free()
1447 free_irq(chip->irq, chip); in snd_nm256_free()
1449 if (chip->cport) in snd_nm256_free()
1450 iounmap(chip->cport); in snd_nm256_free()
1451 if (chip->buffer) in snd_nm256_free()
1452 iounmap(chip->buffer); in snd_nm256_free()
1453 release_and_free_resource(chip->res_cport); in snd_nm256_free()
1454 release_and_free_resource(chip->res_buffer); in snd_nm256_free()
1456 pci_disable_device(chip->pci); in snd_nm256_free()
1457 kfree(chip->ac97_regs); in snd_nm256_free()
1458 kfree(chip); in snd_nm256_free()
1464 struct nm256 *chip = device->device_data; in snd_nm256_dev_free() local
1465 return snd_nm256_free(chip); in snd_nm256_dev_free()
1472 struct nm256 *chip; in snd_nm256_create() local
1484 chip = kzalloc(sizeof(*chip), GFP_KERNEL); in snd_nm256_create()
1485 if (chip == NULL) { in snd_nm256_create()
1487 return -ENOMEM; in snd_nm256_create()
1490 chip->card = card; in snd_nm256_create()
1491 chip->pci = pci; in snd_nm256_create()
1492 chip->use_cache = use_cache; in snd_nm256_create()
1493 spin_lock_init(&chip->reg_lock); in snd_nm256_create()
1494 chip->irq = -1; in snd_nm256_create()
1495 mutex_init(&chip->irq_mutex); in snd_nm256_create()
1498 chip->streams[SNDRV_PCM_STREAM_PLAYBACK].bufsize = playback_bufsize * 1024; in snd_nm256_create()
1499 chip->streams[SNDRV_PCM_STREAM_CAPTURE].bufsize = capture_bufsize * 1024; in snd_nm256_create()
1508 chip->buffer_addr = pci_resource_start(pci, 0); in snd_nm256_create()
1509 chip->cport_addr = pci_resource_start(pci, 1); in snd_nm256_create()
1513 chip->res_cport = request_mem_region(chip->cport_addr, NM_PORT2_SIZE, in snd_nm256_create()
1514 card->driver); in snd_nm256_create()
1515 if (chip->res_cport == NULL) { in snd_nm256_create()
1517 chip->cport_addr, NM_PORT2_SIZE); in snd_nm256_create()
1518 err = -EBUSY; in snd_nm256_create()
1521 chip->cport = ioremap_nocache(chip->cport_addr, NM_PORT2_SIZE); in snd_nm256_create()
1522 if (chip->cport == NULL) { in snd_nm256_create()
1523 snd_printk(KERN_ERR "unable to map control port %lx\n", chip->cport_addr); in snd_nm256_create()
1524 err = -ENOMEM; in snd_nm256_create()
1528 if (!strcmp(card->driver, "NM256AV")) { in snd_nm256_create()
1529 /* Ok, try to see if this is a non-AC97 version of the hardware. */ in snd_nm256_create()
1530 pval = snd_nm256_readw(chip, NM_MIXER_PRESENCE); in snd_nm256_create()
1534 printk(KERN_ERR " force the driver to load by " in snd_nm256_create()
1539 err = -ENXIO; in snd_nm256_create()
1543 chip->buffer_end = 2560 * 1024; in snd_nm256_create()
1544 chip->interrupt = snd_nm256_interrupt; in snd_nm256_create()
1545 chip->mixer_status_offset = NM_MIXER_STATUS_OFFSET; in snd_nm256_create()
1546 chip->mixer_status_mask = NM_MIXER_READY_MASK; in snd_nm256_create()
1549 if (snd_nm256_readb(chip, 0xa0b) != 0) in snd_nm256_create()
1550 chip->buffer_end = 6144 * 1024; in snd_nm256_create()
1552 chip->buffer_end = 4096 * 1024; in snd_nm256_create()
1554 chip->interrupt = snd_nm256_interrupt_zx; in snd_nm256_create()
1555 chip->mixer_status_offset = NM2_MIXER_STATUS_OFFSET; in snd_nm256_create()
1556 chip->mixer_status_mask = NM2_MIXER_READY_MASK; in snd_nm256_create()
1559 chip->buffer_size = chip->streams[SNDRV_PCM_STREAM_PLAYBACK].bufsize + in snd_nm256_create()
1560 chip->streams[SNDRV_PCM_STREAM_CAPTURE].bufsize; in snd_nm256_create()
1561 if (chip->use_cache) in snd_nm256_create()
1562 chip->buffer_size += NM_TOTAL_COEFF_COUNT * 4; in snd_nm256_create()
1564 chip->buffer_size += NM_MAX_PLAYBACK_COEF_SIZE + NM_MAX_RECORD_COEF_SIZE; in snd_nm256_create()
1566 if (buffer_top >= chip->buffer_size && buffer_top < chip->buffer_end) in snd_nm256_create()
1567 chip->buffer_end = buffer_top; in snd_nm256_create()
1570 if ((err = snd_nm256_peek_for_sig(chip)) < 0) in snd_nm256_create()
1574 chip->buffer_start = chip->buffer_end - chip->buffer_size; in snd_nm256_create()
1575 chip->buffer_addr += chip->buffer_start; in snd_nm256_create()
1577 printk(KERN_INFO "nm256: Mapping port 1 from 0x%x - 0x%x\n", in snd_nm256_create()
1578 chip->buffer_start, chip->buffer_end); in snd_nm256_create()
1580 chip->res_buffer = request_mem_region(chip->buffer_addr, in snd_nm256_create()
1581 chip->buffer_size, in snd_nm256_create()
1582 card->driver); in snd_nm256_create()
1583 if (chip->res_buffer == NULL) { in snd_nm256_create()
1585 chip->buffer_addr, chip->buffer_size); in snd_nm256_create()
1586 err = -EBUSY; in snd_nm256_create()
1589 chip->buffer = ioremap_nocache(chip->buffer_addr, chip->buffer_size); in snd_nm256_create()
1590 if (chip->buffer == NULL) { in snd_nm256_create()
1591 err = -ENOMEM; in snd_nm256_create()
1592 snd_printk(KERN_ERR "unable to map ring buffer at %lx\n", chip->buffer_addr); in snd_nm256_create()
1597 addr = chip->buffer_start; in snd_nm256_create()
1598 chip->streams[SNDRV_PCM_STREAM_PLAYBACK].buf = addr; in snd_nm256_create()
1599 addr += chip->streams[SNDRV_PCM_STREAM_PLAYBACK].bufsize; in snd_nm256_create()
1600 chip->streams[SNDRV_PCM_STREAM_CAPTURE].buf = addr; in snd_nm256_create()
1601 addr += chip->streams[SNDRV_PCM_STREAM_CAPTURE].bufsize; in snd_nm256_create()
1602 if (chip->use_cache) { in snd_nm256_create()
1603 chip->all_coeff_buf = addr; in snd_nm256_create()
1605 chip->coeff_buf[SNDRV_PCM_STREAM_PLAYBACK] = addr; in snd_nm256_create()
1607 chip->coeff_buf[SNDRV_PCM_STREAM_CAPTURE] = addr; in snd_nm256_create()
1611 chip->mixer_base = NM_MIXER_OFFSET; in snd_nm256_create()
1613 chip->coeffs_current = 0; in snd_nm256_create()
1615 snd_nm256_init_chip(chip); in snd_nm256_create()
1619 if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) in snd_nm256_create()
1622 snd_card_set_dev(card, &pci->dev); in snd_nm256_create()
1624 *chip_ret = chip; in snd_nm256_create()
1628 snd_nm256_free(chip); in snd_nm256_create()
1638 /* Reset workarounds to avoid lock-ups */
1639 SND_PCI_QUIRK(0x104d, 0x8041, "Sony PCG-F305", NM_RESET_WORKAROUND),
1650 struct nm256 *chip; in snd_nm256_probe() local
1656 snd_printdd(KERN_INFO "nm256: Enabled quirk for %s.\n", q->name); in snd_nm256_probe()
1657 switch (q->value) { in snd_nm256_probe()
1661 return -ENODEV; in snd_nm256_probe()
1664 /* Fall-through */ in snd_nm256_probe()
1675 switch (pci->device) { in snd_nm256_probe()
1677 strcpy(card->driver, "NM256AV"); in snd_nm256_probe()
1680 strcpy(card->driver, "NM256ZX"); in snd_nm256_probe()
1683 strcpy(card->driver, "NM256XL+"); in snd_nm256_probe()
1686 snd_printk(KERN_ERR "invalid device id 0x%x\n", pci->device); in snd_nm256_probe()
1688 return -EINVAL; in snd_nm256_probe()
1702 if ((err = snd_nm256_create(card, pci, &chip)) < 0) { in snd_nm256_probe()
1706 card->private_data = chip; in snd_nm256_probe()
1710 chip->reset_workaround = 1; in snd_nm256_probe()
1715 chip->reset_workaround_2 = 1; in snd_nm256_probe()
1718 if ((err = snd_nm256_pcm(chip, 0)) < 0 || in snd_nm256_probe()
1719 (err = snd_nm256_mixer(chip)) < 0) { in snd_nm256_probe()
1724 sprintf(card->shortname, "NeoMagic %s", card->driver); in snd_nm256_probe()
1725 sprintf(card->longname, "%s at 0x%lx & 0x%lx, irq %d", in snd_nm256_probe()
1726 card->shortname, in snd_nm256_probe()
1727 chip->buffer_addr, chip->cport_addr, chip->irq); in snd_nm256_probe()