Lines Matching +full:chip +full:- +full:to +full:- +full:chip
1 // SPDX-License-Identifier: GPL-2.0-or-later
7 * The original author of OSS nm256 driver wishes to remain anonymous,
8 * so I just put my acknoledgment to him/her here.
60 MODULE_PARM_DESC(force_ac97, "Force to use AC97 codec for " CARD_NAME " soundcard.");
104 #define NM_ACK_INT(chip, X) snd_nm256_writew(chip, NM_INT_REG, (X) << 1) argument
121 #define NM2_ACK_INT(chip, X) snd_nm256_writel(chip, NM_INT_REG, (X)) argument
173 struct nm256 *chip; member
178 u32 buf; /* offset from chip->buffer */
210 unsigned int reset_workaround: 1; /* Workaround for some laptops to avoid freeze */
211 …unsigned int reset_workaround_2: 1; /* Extended workaround for some other laptops to avoid freeze …
216 int mixer_status_mask; /* bit mask to test the mixer status */
221 int badintrcount; /* counter to check bogus interrupts */
262 snd_nm256_readb(struct nm256 *chip, int offset) in snd_nm256_readb() argument
264 return readb(chip->cport + offset); in snd_nm256_readb()
268 snd_nm256_readw(struct nm256 *chip, int offset) in snd_nm256_readw() argument
270 return readw(chip->cport + offset); in snd_nm256_readw()
274 snd_nm256_readl(struct nm256 *chip, int offset) in snd_nm256_readl() argument
276 return readl(chip->cport + offset); in snd_nm256_readl()
280 snd_nm256_writeb(struct nm256 *chip, int offset, u8 val) in snd_nm256_writeb() argument
282 writeb(val, chip->cport + offset); in snd_nm256_writeb()
286 snd_nm256_writew(struct nm256 *chip, int offset, u16 val) in snd_nm256_writew() argument
288 writew(val, chip->cport + offset); in snd_nm256_writew()
292 snd_nm256_writel(struct nm256 *chip, int offset, u32 val) in snd_nm256_writel() argument
294 writel(val, chip->cport + offset); in snd_nm256_writel()
298 snd_nm256_write_buffer(struct nm256 *chip, const void *src, int offset, int size) in snd_nm256_write_buffer() argument
300 offset -= chip->buffer_start; in snd_nm256_write_buffer()
302 if (offset < 0 || offset >= chip->buffer_size) { in snd_nm256_write_buffer()
303 dev_err(chip->card->dev, in snd_nm256_write_buffer()
309 memcpy_toio(chip->buffer + offset, src, size); in snd_nm256_write_buffer()
313 * coefficient handlers -- what a magic!
320 while (which-- > 0) in snd_nm256_get_start_offset()
326 snd_nm256_load_one_coefficient(struct nm256 *chip, int stream, u32 port, int which) in snd_nm256_load_one_coefficient() argument
328 u32 coeff_buf = chip->coeff_buf[stream]; in snd_nm256_load_one_coefficient()
332 snd_nm256_write_buffer(chip, coefficients + offset, coeff_buf, size); in snd_nm256_load_one_coefficient()
333 snd_nm256_writel(chip, port, coeff_buf); in snd_nm256_load_one_coefficient()
334 /* ??? Record seems to behave differently than playback. */ in snd_nm256_load_one_coefficient()
336 size--; in snd_nm256_load_one_coefficient()
337 snd_nm256_writel(chip, port + 4, coeff_buf + size); in snd_nm256_load_one_coefficient()
341 snd_nm256_load_coefficient(struct nm256 *chip, int stream, int number) in snd_nm256_load_coefficient() argument
351 if (snd_nm256_readb(chip, poffset) & 1) { in snd_nm256_load_coefficient()
352 dev_dbg(chip->card->dev, in snd_nm256_load_coefficient()
357 /* The recording engine uses coefficient values 8-15. */ in snd_nm256_load_coefficient()
362 if (! chip->use_cache) { in snd_nm256_load_coefficient()
363 snd_nm256_load_one_coefficient(chip, stream, addr, number); in snd_nm256_load_coefficient()
366 if (! chip->coeffs_current) { in snd_nm256_load_coefficient()
367 snd_nm256_write_buffer(chip, coefficients, chip->all_coeff_buf, in snd_nm256_load_coefficient()
369 chip->coeffs_current = 1; in snd_nm256_load_coefficient()
371 u32 base = chip->all_coeff_buf; in snd_nm256_load_coefficient()
374 snd_nm256_writel(chip, addr, base + offset); in snd_nm256_load_coefficient()
376 end_offset--; in snd_nm256_load_coefficient()
377 snd_nm256_writel(chip, addr + 4, base + end_offset); in snd_nm256_load_coefficient()
411 snd_nm256_set_format(struct nm256 *chip, struct nm256_stream *s, in snd_nm256_set_format() argument
414 struct snd_pcm_runtime *runtime = substream->runtime; in snd_nm256_set_format()
415 int rate_index = snd_nm256_fixed_rate(runtime->rate); in snd_nm256_set_format()
418 s->shift = 0; in snd_nm256_set_format()
419 if (snd_pcm_format_width(runtime->format) == 16) { in snd_nm256_set_format()
421 s->shift++; in snd_nm256_set_format()
423 if (runtime->channels > 1) { in snd_nm256_set_format()
425 s->shift++; in snd_nm256_set_format()
428 runtime->rate = samplerates[rate_index]; in snd_nm256_set_format()
430 switch (substream->stream) { in snd_nm256_set_format()
432 snd_nm256_load_coefficient(chip, 0, rate_index); /* 0 = playback */ in snd_nm256_set_format()
433 snd_nm256_writeb(chip, in snd_nm256_set_format()
438 snd_nm256_load_coefficient(chip, 1, rate_index); /* 1 = record */ in snd_nm256_set_format()
439 snd_nm256_writeb(chip, in snd_nm256_set_format()
447 static int snd_nm256_acquire_irq(struct nm256 *chip) in snd_nm256_acquire_irq() argument
449 mutex_lock(&chip->irq_mutex); in snd_nm256_acquire_irq()
450 if (chip->irq < 0) { in snd_nm256_acquire_irq()
451 if (request_irq(chip->pci->irq, chip->interrupt, IRQF_SHARED, in snd_nm256_acquire_irq()
452 KBUILD_MODNAME, chip)) { in snd_nm256_acquire_irq()
453 dev_err(chip->card->dev, in snd_nm256_acquire_irq()
454 "unable to grab IRQ %d\n", chip->pci->irq); in snd_nm256_acquire_irq()
455 mutex_unlock(&chip->irq_mutex); in snd_nm256_acquire_irq()
456 return -EBUSY; in snd_nm256_acquire_irq()
458 chip->irq = chip->pci->irq; in snd_nm256_acquire_irq()
459 chip->card->sync_irq = chip->irq; in snd_nm256_acquire_irq()
461 chip->irq_acks++; in snd_nm256_acquire_irq()
462 mutex_unlock(&chip->irq_mutex); in snd_nm256_acquire_irq()
467 static void snd_nm256_release_irq(struct nm256 *chip) in snd_nm256_release_irq() argument
469 mutex_lock(&chip->irq_mutex); in snd_nm256_release_irq()
470 if (chip->irq_acks > 0) in snd_nm256_release_irq()
471 chip->irq_acks--; in snd_nm256_release_irq()
472 if (chip->irq_acks == 0 && chip->irq >= 0) { in snd_nm256_release_irq()
473 free_irq(chip->irq, chip); in snd_nm256_release_irq()
474 chip->irq = -1; in snd_nm256_release_irq()
475 chip->card->sync_irq = -1; in snd_nm256_release_irq()
477 mutex_unlock(&chip->irq_mutex); in snd_nm256_release_irq()
485 static void snd_nm256_pcm_mark(struct nm256 *chip, struct nm256_stream *s, int reg) in snd_nm256_pcm_mark() argument
487 s->cur_period++; in snd_nm256_pcm_mark()
488 s->cur_period %= s->periods; in snd_nm256_pcm_mark()
489 snd_nm256_writel(chip, reg, s->buf + s->cur_period * s->period_size); in snd_nm256_pcm_mark()
492 #define snd_nm256_playback_mark(chip, s) snd_nm256_pcm_mark(chip, s, NM_PBUFFER_WMARK) argument
493 #define snd_nm256_capture_mark(chip, s) snd_nm256_pcm_mark(chip, s, NM_RBUFFER_WMARK) argument
496 snd_nm256_playback_start(struct nm256 *chip, struct nm256_stream *s, in snd_nm256_playback_start() argument
500 snd_nm256_writel(chip, NM_PBUFFER_START, s->buf); in snd_nm256_playback_start()
501 snd_nm256_writel(chip, NM_PBUFFER_END, s->buf + s->dma_size - (1 << s->shift)); in snd_nm256_playback_start()
502 snd_nm256_writel(chip, NM_PBUFFER_CURRP, s->buf); in snd_nm256_playback_start()
503 snd_nm256_playback_mark(chip, s); in snd_nm256_playback_start()
506 snd_nm256_writeb(chip, NM_PLAYBACK_ENABLE_REG, in snd_nm256_playback_start()
509 snd_nm256_writew(chip, NM_AUDIO_MUTE_REG, 0x0); in snd_nm256_playback_start()
513 snd_nm256_capture_start(struct nm256 *chip, struct nm256_stream *s, in snd_nm256_capture_start() argument
517 snd_nm256_writel(chip, NM_RBUFFER_START, s->buf); in snd_nm256_capture_start()
518 snd_nm256_writel(chip, NM_RBUFFER_END, s->buf + s->dma_size); in snd_nm256_capture_start()
519 snd_nm256_writel(chip, NM_RBUFFER_CURRP, s->buf); in snd_nm256_capture_start()
520 snd_nm256_capture_mark(chip, s); in snd_nm256_capture_start()
523 snd_nm256_writeb(chip, NM_RECORD_ENABLE_REG, in snd_nm256_capture_start()
529 snd_nm256_playback_stop(struct nm256 *chip) in snd_nm256_playback_stop() argument
532 snd_nm256_writew(chip, NM_AUDIO_MUTE_REG, in snd_nm256_playback_stop()
535 snd_nm256_writeb(chip, NM_PLAYBACK_ENABLE_REG, 0); in snd_nm256_playback_stop()
539 snd_nm256_capture_stop(struct nm256 *chip) in snd_nm256_capture_stop() argument
542 snd_nm256_writeb(chip, NM_RECORD_ENABLE_REG, 0); in snd_nm256_capture_stop()
548 struct nm256 *chip = snd_pcm_substream_chip(substream); in snd_nm256_playback_trigger() local
549 struct nm256_stream *s = substream->runtime->private_data; in snd_nm256_playback_trigger()
553 return -ENXIO; in snd_nm256_playback_trigger()
555 spin_lock(&chip->reg_lock); in snd_nm256_playback_trigger()
558 s->suspended = 0; in snd_nm256_playback_trigger()
561 if (! s->running) { in snd_nm256_playback_trigger()
562 snd_nm256_playback_start(chip, s, substream); in snd_nm256_playback_trigger()
563 s->running = 1; in snd_nm256_playback_trigger()
567 s->suspended = 1; in snd_nm256_playback_trigger()
570 if (s->running) { in snd_nm256_playback_trigger()
571 snd_nm256_playback_stop(chip); in snd_nm256_playback_trigger()
572 s->running = 0; in snd_nm256_playback_trigger()
576 err = -EINVAL; in snd_nm256_playback_trigger()
579 spin_unlock(&chip->reg_lock); in snd_nm256_playback_trigger()
586 struct nm256 *chip = snd_pcm_substream_chip(substream); in snd_nm256_capture_trigger() local
587 struct nm256_stream *s = substream->runtime->private_data; in snd_nm256_capture_trigger()
591 return -ENXIO; in snd_nm256_capture_trigger()
593 spin_lock(&chip->reg_lock); in snd_nm256_capture_trigger()
597 if (! s->running) { in snd_nm256_capture_trigger()
598 snd_nm256_capture_start(chip, s, substream); in snd_nm256_capture_trigger()
599 s->running = 1; in snd_nm256_capture_trigger()
604 if (s->running) { in snd_nm256_capture_trigger()
605 snd_nm256_capture_stop(chip); in snd_nm256_capture_trigger()
606 s->running = 0; in snd_nm256_capture_trigger()
610 err = -EINVAL; in snd_nm256_capture_trigger()
613 spin_unlock(&chip->reg_lock); in snd_nm256_capture_trigger()
623 struct nm256 *chip = snd_pcm_substream_chip(substream); in snd_nm256_pcm_prepare() local
624 struct snd_pcm_runtime *runtime = substream->runtime; in snd_nm256_pcm_prepare()
625 struct nm256_stream *s = runtime->private_data; in snd_nm256_pcm_prepare()
628 return -ENXIO; in snd_nm256_pcm_prepare()
629 s->dma_size = frames_to_bytes(runtime, substream->runtime->buffer_size); in snd_nm256_pcm_prepare()
630 s->period_size = frames_to_bytes(runtime, substream->runtime->period_size); in snd_nm256_pcm_prepare()
631 s->periods = substream->runtime->periods; in snd_nm256_pcm_prepare()
632 s->cur_period = 0; in snd_nm256_pcm_prepare()
634 spin_lock_irq(&chip->reg_lock); in snd_nm256_pcm_prepare()
635 s->running = 0; in snd_nm256_pcm_prepare()
636 snd_nm256_set_format(chip, s, substream); in snd_nm256_pcm_prepare()
637 spin_unlock_irq(&chip->reg_lock); in snd_nm256_pcm_prepare()
649 struct nm256 *chip = snd_pcm_substream_chip(substream); in snd_nm256_playback_pointer() local
650 struct nm256_stream *s = substream->runtime->private_data; in snd_nm256_playback_pointer()
655 curp = snd_nm256_readl(chip, NM_PBUFFER_CURRP) - (unsigned long)s->buf; in snd_nm256_playback_pointer()
656 curp %= s->dma_size; in snd_nm256_playback_pointer()
657 return bytes_to_frames(substream->runtime, curp); in snd_nm256_playback_pointer()
663 struct nm256 *chip = snd_pcm_substream_chip(substream); in snd_nm256_capture_pointer() local
664 struct nm256_stream *s = substream->runtime->private_data; in snd_nm256_capture_pointer()
669 curp = snd_nm256_readl(chip, NM_RBUFFER_CURRP) - (unsigned long)s->buf; in snd_nm256_capture_pointer()
670 curp %= s->dma_size; in snd_nm256_capture_pointer()
671 return bytes_to_frames(substream->runtime, curp); in snd_nm256_capture_pointer()
684 struct snd_pcm_runtime *runtime = substream->runtime; in snd_nm256_playback_silence()
685 struct nm256_stream *s = runtime->private_data; in snd_nm256_playback_silence()
687 memset_io(s->bufptr + pos, 0, count); in snd_nm256_playback_silence()
696 struct snd_pcm_runtime *runtime = substream->runtime; in snd_nm256_playback_copy()
697 struct nm256_stream *s = runtime->private_data; in snd_nm256_playback_copy()
699 if (copy_from_iter_toio(s->bufptr + pos, count, src) != count) in snd_nm256_playback_copy()
700 return -EFAULT; in snd_nm256_playback_copy()
705 * copy to user
712 struct snd_pcm_runtime *runtime = substream->runtime; in snd_nm256_capture_copy()
713 struct nm256_stream *s = runtime->private_data; in snd_nm256_capture_copy()
715 if (copy_to_iter_fromio(s->bufptr + pos, count, dst) != count) in snd_nm256_capture_copy()
716 return -EFAULT; in snd_nm256_capture_copy()
729 snd_nm256_playback_update(struct nm256 *chip) in snd_nm256_playback_update() argument
733 s = &chip->streams[SNDRV_PCM_STREAM_PLAYBACK]; in snd_nm256_playback_update()
734 if (s->running && s->substream) { in snd_nm256_playback_update()
735 spin_unlock(&chip->reg_lock); in snd_nm256_playback_update()
736 snd_pcm_period_elapsed(s->substream); in snd_nm256_playback_update()
737 spin_lock(&chip->reg_lock); in snd_nm256_playback_update()
738 snd_nm256_playback_mark(chip, s); in snd_nm256_playback_update()
744 snd_nm256_capture_update(struct nm256 *chip) in snd_nm256_capture_update() argument
748 s = &chip->streams[SNDRV_PCM_STREAM_CAPTURE]; in snd_nm256_capture_update()
749 if (s->running && s->substream) { in snd_nm256_capture_update()
750 spin_unlock(&chip->reg_lock); in snd_nm256_capture_update()
751 snd_pcm_period_elapsed(s->substream); in snd_nm256_capture_update()
752 spin_lock(&chip->reg_lock); in snd_nm256_capture_update()
753 snd_nm256_capture_mark(chip, s); in snd_nm256_capture_update()
804 substream->runtime->dma_bytes = params_buffer_bytes(hw_params); in snd_nm256_pcm_hw_params()
811 static void snd_nm256_setup_stream(struct nm256 *chip, struct nm256_stream *s, in snd_nm256_setup_stream() argument
815 struct snd_pcm_runtime *runtime = substream->runtime; in snd_nm256_setup_stream()
817 s->running = 0; in snd_nm256_setup_stream()
818 runtime->hw = *hw_ptr; in snd_nm256_setup_stream()
819 runtime->hw.buffer_bytes_max = s->bufsize; in snd_nm256_setup_stream()
820 runtime->hw.period_bytes_max = s->bufsize / 2; in snd_nm256_setup_stream()
821 runtime->dma_area = (void __force *) s->bufptr; in snd_nm256_setup_stream()
822 runtime->dma_addr = s->bufptr_addr; in snd_nm256_setup_stream()
823 runtime->dma_bytes = s->bufsize; in snd_nm256_setup_stream()
824 runtime->private_data = s; in snd_nm256_setup_stream()
825 s->substream = substream; in snd_nm256_setup_stream()
834 struct nm256 *chip = snd_pcm_substream_chip(substream); in snd_nm256_playback_open() local
836 if (snd_nm256_acquire_irq(chip) < 0) in snd_nm256_playback_open()
837 return -EBUSY; in snd_nm256_playback_open()
838 snd_nm256_setup_stream(chip, &chip->streams[SNDRV_PCM_STREAM_PLAYBACK], in snd_nm256_playback_open()
846 struct nm256 *chip = snd_pcm_substream_chip(substream); in snd_nm256_capture_open() local
848 if (snd_nm256_acquire_irq(chip) < 0) in snd_nm256_capture_open()
849 return -EBUSY; in snd_nm256_capture_open()
850 snd_nm256_setup_stream(chip, &chip->streams[SNDRV_PCM_STREAM_CAPTURE], in snd_nm256_capture_open()
856 * close - we don't have to do special..
861 struct nm256 *chip = snd_pcm_substream_chip(substream); in snd_nm256_playback_close() local
863 snd_nm256_release_irq(chip); in snd_nm256_playback_close()
871 struct nm256 *chip = snd_pcm_substream_chip(substream); in snd_nm256_capture_close() local
873 snd_nm256_release_irq(chip); in snd_nm256_capture_close()
908 snd_nm256_pcm(struct nm256 *chip, int device) in snd_nm256_pcm() argument
914 struct nm256_stream *s = &chip->streams[i]; in snd_nm256_pcm()
915 s->bufptr = chip->buffer + (s->buf - chip->buffer_start); in snd_nm256_pcm()
916 s->bufptr_addr = chip->buffer_addr + (s->buf - chip->buffer_start); in snd_nm256_pcm()
919 err = snd_pcm_new(chip->card, chip->card->driver, device, in snd_nm256_pcm()
927 pcm->private_data = chip; in snd_nm256_pcm()
928 pcm->info_flags = 0; in snd_nm256_pcm()
929 chip->pcm = pcm; in snd_nm256_pcm()
939 snd_nm256_init_chip(struct nm256 *chip) in snd_nm256_init_chip() argument
942 snd_nm256_writeb(chip, 0x0, 0x11); in snd_nm256_init_chip()
943 snd_nm256_writew(chip, 0x214, 0); in snd_nm256_init_chip()
945 //snd_nm256_playback_stop(chip); in snd_nm256_init_chip()
946 //snd_nm256_capture_stop(chip); in snd_nm256_init_chip()
951 snd_nm256_intr_check(struct nm256 *chip) in snd_nm256_intr_check() argument
953 if (chip->badintrcount++ > 1000) { in snd_nm256_intr_check()
955 * I'm not sure if the best thing is to stop the card from in snd_nm256_intr_check()
960 * I worry about the card engine continuing to play noise in snd_nm256_intr_check()
961 * over and over, however--that could become a very in snd_nm256_intr_check()
966 if (chip->streams[SNDRV_PCM_STREAM_PLAYBACK].running) in snd_nm256_intr_check()
967 snd_nm256_playback_stop(chip); in snd_nm256_intr_check()
968 if (chip->streams[SNDRV_PCM_STREAM_CAPTURE].running) in snd_nm256_intr_check()
969 snd_nm256_capture_stop(chip); in snd_nm256_intr_check()
970 chip->badintrcount = 0; in snd_nm256_intr_check()
977 * Handle a potential interrupt for the device referred to by DEV_ID.
979 * I don't like the cut-n-paste job here either between the two routines,
988 struct nm256 *chip = dev_id; in snd_nm256_interrupt() local
992 status = snd_nm256_readw(chip, NM_INT_REG); in snd_nm256_interrupt()
996 return snd_nm256_intr_check(chip); in snd_nm256_interrupt()
998 chip->badintrcount = 0; in snd_nm256_interrupt()
1002 spin_lock(&chip->reg_lock); in snd_nm256_interrupt()
1005 NM_ACK_INT(chip, NM_PLAYBACK_INT); in snd_nm256_interrupt()
1006 snd_nm256_playback_update(chip); in snd_nm256_interrupt()
1011 NM_ACK_INT(chip, NM_RECORD_INT); in snd_nm256_interrupt()
1012 snd_nm256_capture_update(chip); in snd_nm256_interrupt()
1017 NM_ACK_INT(chip, NM_MISC_INT_1); in snd_nm256_interrupt()
1018 dev_dbg(chip->card->dev, "NM256: Got misc interrupt #1\n"); in snd_nm256_interrupt()
1019 snd_nm256_writew(chip, NM_INT_REG, 0x8000); in snd_nm256_interrupt()
1020 cbyte = snd_nm256_readb(chip, 0x400); in snd_nm256_interrupt()
1021 snd_nm256_writeb(chip, 0x400, cbyte | 2); in snd_nm256_interrupt()
1026 NM_ACK_INT(chip, NM_MISC_INT_2); in snd_nm256_interrupt()
1027 dev_dbg(chip->card->dev, "NM256: Got misc interrupt #2\n"); in snd_nm256_interrupt()
1028 cbyte = snd_nm256_readb(chip, 0x400); in snd_nm256_interrupt()
1029 snd_nm256_writeb(chip, 0x400, cbyte & ~2); in snd_nm256_interrupt()
1034 dev_dbg(chip->card->dev, in snd_nm256_interrupt()
1038 NM_ACK_INT(chip, status); in snd_nm256_interrupt()
1041 spin_unlock(&chip->reg_lock); in snd_nm256_interrupt()
1046 * Handle a potential interrupt for the device referred to by DEV_ID.
1047 * This handler is for the 256ZX, and is very similar to the non-ZX
1054 struct nm256 *chip = dev_id; in snd_nm256_interrupt_zx() local
1058 status = snd_nm256_readl(chip, NM_INT_REG); in snd_nm256_interrupt_zx()
1062 return snd_nm256_intr_check(chip); in snd_nm256_interrupt_zx()
1064 chip->badintrcount = 0; in snd_nm256_interrupt_zx()
1068 spin_lock(&chip->reg_lock); in snd_nm256_interrupt_zx()
1071 NM2_ACK_INT(chip, NM2_PLAYBACK_INT); in snd_nm256_interrupt_zx()
1072 snd_nm256_playback_update(chip); in snd_nm256_interrupt_zx()
1077 NM2_ACK_INT(chip, NM2_RECORD_INT); in snd_nm256_interrupt_zx()
1078 snd_nm256_capture_update(chip); in snd_nm256_interrupt_zx()
1083 NM2_ACK_INT(chip, NM2_MISC_INT_1); in snd_nm256_interrupt_zx()
1084 dev_dbg(chip->card->dev, "NM256: Got misc interrupt #1\n"); in snd_nm256_interrupt_zx()
1085 cbyte = snd_nm256_readb(chip, 0x400); in snd_nm256_interrupt_zx()
1086 snd_nm256_writeb(chip, 0x400, cbyte | 2); in snd_nm256_interrupt_zx()
1091 NM2_ACK_INT(chip, NM2_MISC_INT_2); in snd_nm256_interrupt_zx()
1092 dev_dbg(chip->card->dev, "NM256: Got misc interrupt #2\n"); in snd_nm256_interrupt_zx()
1093 cbyte = snd_nm256_readb(chip, 0x400); in snd_nm256_interrupt_zx()
1094 snd_nm256_writeb(chip, 0x400, cbyte & ~2); in snd_nm256_interrupt_zx()
1099 dev_dbg(chip->card->dev, in snd_nm256_interrupt_zx()
1103 NM2_ACK_INT(chip, status); in snd_nm256_interrupt_zx()
1106 spin_unlock(&chip->reg_lock); in snd_nm256_interrupt_zx()
1115 * Waits for the mixer to become ready to be written; returns a zero value
1119 snd_nm256_ac97_ready(struct nm256 *chip) in snd_nm256_ac97_ready() argument
1125 testaddr = chip->mixer_status_offset; in snd_nm256_ac97_ready()
1126 testb = chip->mixer_status_mask; in snd_nm256_ac97_ready()
1129 * Loop around waiting for the mixer to become ready. in snd_nm256_ac97_ready()
1131 while (timeout-- > 0) { in snd_nm256_ac97_ready()
1132 if ((snd_nm256_readw(chip, testaddr) & testb) == 0) in snd_nm256_ac97_ready()
1140 * Initial register values to be written to the AC97 mixer.
1141 * While most of these are identical to the reset values, we do this
1142 * so that we have most of the register contents cached--this avoids
1143 * reading from the mixer directly (which seems to be problematic,
1144 * probably due to ignorance).
1179 return -1; in nm256_ac97_idx()
1184 * thus we're treating it as a write-only mixer and cache the
1190 struct nm256 *chip = ac97->private_data; in snd_nm256_ac97_read() local
1195 return chip->ac97_regs[idx]; in snd_nm256_ac97_read()
1204 struct nm256 *chip = ac97->private_data; in snd_nm256_ac97_write() local
1212 base = chip->mixer_base; in snd_nm256_ac97_write()
1214 snd_nm256_ac97_ready(chip); in snd_nm256_ac97_write()
1216 /* Wait for the write to take, too. */ in snd_nm256_ac97_write()
1217 while (tries-- > 0) { in snd_nm256_ac97_write()
1218 snd_nm256_writew(chip, base + reg, val); in snd_nm256_ac97_write()
1220 if (snd_nm256_ac97_ready(chip)) { in snd_nm256_ac97_write()
1222 chip->ac97_regs[idx] = val; in snd_nm256_ac97_write()
1226 dev_dbg(chip->card->dev, "nm256: ac97 codec not ready..\n"); in snd_nm256_ac97_write()
1250 struct nm256 *chip = ac97->private_data; in snd_nm256_ac97_reset() local
1253 snd_nm256_writeb(chip, 0x6c0, 1); in snd_nm256_ac97_reset()
1254 if (! chip->reset_workaround) { in snd_nm256_ac97_reset()
1256 snd_nm256_writeb(chip, 0x6cc, 0x87); in snd_nm256_ac97_reset()
1258 if (! chip->reset_workaround_2) { in snd_nm256_ac97_reset()
1260 snd_nm256_writeb(chip, 0x6cc, 0x80); in snd_nm256_ac97_reset()
1261 snd_nm256_writeb(chip, 0x6cc, 0x0); in snd_nm256_ac97_reset()
1263 if (! chip->in_resume) { in snd_nm256_ac97_reset()
1266 /* preload the cache, so as to avoid even a single in snd_nm256_ac97_reset()
1277 snd_nm256_mixer(struct nm256 *chip) in snd_nm256_mixer() argument
1288 chip->ac97_regs = devm_kcalloc(chip->card->dev, in snd_nm256_mixer()
1291 if (! chip->ac97_regs) in snd_nm256_mixer()
1292 return -ENOMEM; in snd_nm256_mixer()
1294 err = snd_ac97_bus(chip->card, 0, &ops, NULL, &pbus); in snd_nm256_mixer()
1300 ac97.private_data = chip; in snd_nm256_mixer()
1302 pbus->no_vra = 1; in snd_nm256_mixer()
1303 err = snd_ac97_mixer(pbus, &ac97, &chip->ac97); in snd_nm256_mixer()
1306 if (! (chip->ac97->id & (0xf0000000))) { in snd_nm256_mixer()
1308 sprintf(chip->card->mixername, "%s AC97", chip->card->driver); in snd_nm256_mixer()
1320 snd_nm256_peek_for_sig(struct nm256 *chip) in snd_nm256_peek_for_sig() argument
1325 unsigned long pointer_found = chip->buffer_end - 0x1400; in snd_nm256_peek_for_sig()
1328 temp = ioremap(chip->buffer_addr + chip->buffer_end - 0x400, 16); in snd_nm256_peek_for_sig()
1330 dev_err(chip->card->dev, in snd_nm256_peek_for_sig()
1331 "Unable to scan for card signature in video RAM\n"); in snd_nm256_peek_for_sig()
1332 return -EBUSY; in snd_nm256_peek_for_sig()
1343 pointer < chip->buffer_size || in snd_nm256_peek_for_sig()
1344 pointer > chip->buffer_end) { in snd_nm256_peek_for_sig()
1345 dev_err(chip->card->dev, in snd_nm256_peek_for_sig()
1348 return -ENODEV; in snd_nm256_peek_for_sig()
1351 dev_info(chip->card->dev, in snd_nm256_peek_for_sig()
1358 chip->buffer_end = pointer_found; in snd_nm256_peek_for_sig()
1370 struct nm256 *chip = card->private_data; in nm256_suspend() local
1373 snd_ac97_suspend(chip->ac97); in nm256_suspend()
1374 chip->coeffs_current = 0; in nm256_suspend()
1381 struct nm256 *chip = card->private_data; in nm256_resume() local
1385 chip->in_resume = 1; in nm256_resume()
1387 snd_nm256_init_chip(chip); in nm256_resume()
1390 snd_ac97_resume(chip->ac97); in nm256_resume()
1393 struct nm256_stream *s = &chip->streams[i]; in nm256_resume()
1394 if (s->substream && s->suspended) { in nm256_resume()
1395 spin_lock_irq(&chip->reg_lock); in nm256_resume()
1396 snd_nm256_set_format(chip, s, s->substream); in nm256_resume()
1397 spin_unlock_irq(&chip->reg_lock); in nm256_resume()
1402 chip->in_resume = 0; in nm256_resume()
1410 struct nm256 *chip = card->private_data; in snd_nm256_free() local
1412 if (chip->streams[SNDRV_PCM_STREAM_PLAYBACK].running) in snd_nm256_free()
1413 snd_nm256_playback_stop(chip); in snd_nm256_free()
1414 if (chip->streams[SNDRV_PCM_STREAM_CAPTURE].running) in snd_nm256_free()
1415 snd_nm256_capture_stop(chip); in snd_nm256_free()
1421 struct nm256 *chip = card->private_data; in snd_nm256_create() local
1429 chip->card = card; in snd_nm256_create()
1430 chip->pci = pci; in snd_nm256_create()
1431 chip->use_cache = use_cache; in snd_nm256_create()
1432 spin_lock_init(&chip->reg_lock); in snd_nm256_create()
1433 chip->irq = -1; in snd_nm256_create()
1434 mutex_init(&chip->irq_mutex); in snd_nm256_create()
1437 chip->streams[SNDRV_PCM_STREAM_PLAYBACK].bufsize = playback_bufsize * 1024; in snd_nm256_create()
1438 chip->streams[SNDRV_PCM_STREAM_CAPTURE].bufsize = capture_bufsize * 1024; in snd_nm256_create()
1447 chip->buffer_addr = pci_resource_start(pci, 0); in snd_nm256_create()
1448 chip->cport_addr = pci_resource_start(pci, 1); in snd_nm256_create()
1450 err = pci_request_regions(pci, card->driver); in snd_nm256_create()
1456 chip->cport = devm_ioremap(&pci->dev, chip->cport_addr, NM_PORT2_SIZE); in snd_nm256_create()
1457 if (!chip->cport) { in snd_nm256_create()
1458 dev_err(card->dev, "unable to map control port %lx\n", in snd_nm256_create()
1459 chip->cport_addr); in snd_nm256_create()
1460 return -ENOMEM; in snd_nm256_create()
1463 if (!strcmp(card->driver, "NM256AV")) { in snd_nm256_create()
1464 /* Ok, try to see if this is a non-AC97 version of the hardware. */ in snd_nm256_create()
1465 pval = snd_nm256_readw(chip, NM_MIXER_PRESENCE); in snd_nm256_create()
1468 dev_err(card->dev, in snd_nm256_create()
1470 dev_err(card->dev, in snd_nm256_create()
1471 "force the driver to load by passing in the module parameter\n"); in snd_nm256_create()
1472 dev_err(card->dev, in snd_nm256_create()
1474 dev_err(card->dev, in snd_nm256_create()
1476 return -ENXIO; in snd_nm256_create()
1479 chip->buffer_end = 2560 * 1024; in snd_nm256_create()
1480 chip->interrupt = snd_nm256_interrupt; in snd_nm256_create()
1481 chip->mixer_status_offset = NM_MIXER_STATUS_OFFSET; in snd_nm256_create()
1482 chip->mixer_status_mask = NM_MIXER_READY_MASK; in snd_nm256_create()
1485 if (snd_nm256_readb(chip, 0xa0b) != 0) in snd_nm256_create()
1486 chip->buffer_end = 6144 * 1024; in snd_nm256_create()
1488 chip->buffer_end = 4096 * 1024; in snd_nm256_create()
1490 chip->interrupt = snd_nm256_interrupt_zx; in snd_nm256_create()
1491 chip->mixer_status_offset = NM2_MIXER_STATUS_OFFSET; in snd_nm256_create()
1492 chip->mixer_status_mask = NM2_MIXER_READY_MASK; in snd_nm256_create()
1495 chip->buffer_size = chip->streams[SNDRV_PCM_STREAM_PLAYBACK].bufsize + in snd_nm256_create()
1496 chip->streams[SNDRV_PCM_STREAM_CAPTURE].bufsize; in snd_nm256_create()
1497 if (chip->use_cache) in snd_nm256_create()
1498 chip->buffer_size += NM_TOTAL_COEFF_COUNT * 4; in snd_nm256_create()
1500 chip->buffer_size += NM_MAX_PLAYBACK_COEF_SIZE + NM_MAX_RECORD_COEF_SIZE; in snd_nm256_create()
1502 if (buffer_top >= chip->buffer_size && buffer_top < chip->buffer_end) in snd_nm256_create()
1503 chip->buffer_end = buffer_top; in snd_nm256_create()
1506 err = snd_nm256_peek_for_sig(chip); in snd_nm256_create()
1511 chip->buffer_start = chip->buffer_end - chip->buffer_size; in snd_nm256_create()
1512 chip->buffer_addr += chip->buffer_start; in snd_nm256_create()
1514 dev_info(card->dev, "Mapping port 1 from 0x%x - 0x%x\n", in snd_nm256_create()
1515 chip->buffer_start, chip->buffer_end); in snd_nm256_create()
1517 chip->buffer = devm_ioremap(&pci->dev, chip->buffer_addr, in snd_nm256_create()
1518 chip->buffer_size); in snd_nm256_create()
1519 if (!chip->buffer) { in snd_nm256_create()
1520 dev_err(card->dev, "unable to map ring buffer at %lx\n", in snd_nm256_create()
1521 chip->buffer_addr); in snd_nm256_create()
1522 return -ENOMEM; in snd_nm256_create()
1526 addr = chip->buffer_start; in snd_nm256_create()
1527 chip->streams[SNDRV_PCM_STREAM_PLAYBACK].buf = addr; in snd_nm256_create()
1528 addr += chip->streams[SNDRV_PCM_STREAM_PLAYBACK].bufsize; in snd_nm256_create()
1529 chip->streams[SNDRV_PCM_STREAM_CAPTURE].buf = addr; in snd_nm256_create()
1530 addr += chip->streams[SNDRV_PCM_STREAM_CAPTURE].bufsize; in snd_nm256_create()
1531 if (chip->use_cache) { in snd_nm256_create()
1532 chip->all_coeff_buf = addr; in snd_nm256_create()
1534 chip->coeff_buf[SNDRV_PCM_STREAM_PLAYBACK] = addr; in snd_nm256_create()
1536 chip->coeff_buf[SNDRV_PCM_STREAM_CAPTURE] = addr; in snd_nm256_create()
1540 chip->mixer_base = NM_MIXER_OFFSET; in snd_nm256_create()
1542 chip->coeffs_current = 0; in snd_nm256_create()
1544 snd_nm256_init_chip(chip); in snd_nm256_create()
1556 /* Reset workarounds to avoid lock-ups */
1557 SND_PCI_QUIRK(0x104d, 0x8041, "Sony PCG-F305", NM_RESET_WORKAROUND),
1568 struct nm256 *chip; in snd_nm256_probe() local
1574 dev_dbg(&pci->dev, "Enabled quirk for %s.\n", in snd_nm256_probe()
1576 switch (q->value) { in snd_nm256_probe()
1578 dev_info(&pci->dev, in snd_nm256_probe()
1580 return -ENODEV; in snd_nm256_probe()
1590 err = snd_devm_card_new(&pci->dev, index, id, THIS_MODULE, in snd_nm256_probe()
1591 sizeof(*chip), &card); in snd_nm256_probe()
1594 chip = card->private_data; in snd_nm256_probe()
1596 switch (pci->device) { in snd_nm256_probe()
1598 strcpy(card->driver, "NM256AV"); in snd_nm256_probe()
1601 strcpy(card->driver, "NM256ZX"); in snd_nm256_probe()
1604 strcpy(card->driver, "NM256XL+"); in snd_nm256_probe()
1607 dev_err(&pci->dev, "invalid device id 0x%x\n", pci->device); in snd_nm256_probe()
1608 return -EINVAL; in snd_nm256_probe()
1627 dev_dbg(&pci->dev, "reset_workaround activated\n"); in snd_nm256_probe()
1628 chip->reset_workaround = 1; in snd_nm256_probe()
1632 dev_dbg(&pci->dev, "reset_workaround_2 activated\n"); in snd_nm256_probe()
1633 chip->reset_workaround_2 = 1; in snd_nm256_probe()
1636 err = snd_nm256_pcm(chip, 0); in snd_nm256_probe()
1639 err = snd_nm256_mixer(chip); in snd_nm256_probe()
1643 sprintf(card->shortname, "NeoMagic %s", card->driver); in snd_nm256_probe()
1644 sprintf(card->longname, "%s at 0x%lx & 0x%lx, irq %d", in snd_nm256_probe()
1645 card->shortname, in snd_nm256_probe()
1646 chip->buffer_addr, chip->cport_addr, chip->irq); in snd_nm256_probe()
1651 card->private_free = snd_nm256_free; in snd_nm256_probe()