Lines Matching refs:rme32

193 struct rme32 {  struct
237 #define RME32_ISWORKING(rme32) ((rme32)->wcreg & RME32_WCR_START) argument
238 #define RME32_PRO_WITH_8414(rme32) ((rme32)->pci->device == PCI_DEVICE_ID_RME_DIGI32_PRO && (rme32)… argument
246 static void snd_rme32_proc_init(struct rme32 * rme32);
248 static int snd_rme32_create_switches(struct snd_card *card, struct rme32 * rme32);
250 static inline unsigned int snd_rme32_pcm_byteptr(struct rme32 * rme32) in snd_rme32_pcm_byteptr() argument
252 return (readl(rme32->iobase + RME32_IO_GET_POS) in snd_rme32_pcm_byteptr()
261 struct rme32 *rme32 = snd_pcm_substream_chip(substream); in snd_rme32_playback_silence() local
262 count <<= rme32->playback_frlog; in snd_rme32_playback_silence()
263 pos <<= rme32->playback_frlog; in snd_rme32_playback_silence()
264 memset_io(rme32->iobase + RME32_IO_DATA_BUFFER + pos, 0, count); in snd_rme32_playback_silence()
273 struct rme32 *rme32 = snd_pcm_substream_chip(substream); in snd_rme32_playback_copy() local
274 count <<= rme32->playback_frlog; in snd_rme32_playback_copy()
275 pos <<= rme32->playback_frlog; in snd_rme32_playback_copy()
276 if (copy_from_user_toio(rme32->iobase + RME32_IO_DATA_BUFFER + pos, in snd_rme32_playback_copy()
287 struct rme32 *rme32 = snd_pcm_substream_chip(substream); in snd_rme32_capture_copy() local
288 count <<= rme32->capture_frlog; in snd_rme32_capture_copy()
289 pos <<= rme32->capture_frlog; in snd_rme32_capture_copy()
291 rme32->iobase + RME32_IO_DATA_BUFFER + pos, in snd_rme32_capture_copy()
399 static void snd_rme32_reset_dac(struct rme32 *rme32) in snd_rme32_reset_dac() argument
401 writel(rme32->wcreg | RME32_WCR_PD, in snd_rme32_reset_dac()
402 rme32->iobase + RME32_IO_CONTROL_REGISTER); in snd_rme32_reset_dac()
403 writel(rme32->wcreg, rme32->iobase + RME32_IO_CONTROL_REGISTER); in snd_rme32_reset_dac()
406 static int snd_rme32_playback_getrate(struct rme32 * rme32) in snd_rme32_playback_getrate() argument
410 rate = ((rme32->wcreg >> RME32_WCR_BITPOS_FREQ_0) & 1) + in snd_rme32_playback_getrate()
411 (((rme32->wcreg >> RME32_WCR_BITPOS_FREQ_1) & 1) << 1); in snd_rme32_playback_getrate()
425 return (rme32->wcreg & RME32_WCR_DS_BM) ? rate << 1 : rate; in snd_rme32_playback_getrate()
428 static int snd_rme32_capture_getrate(struct rme32 * rme32, int *is_adat) in snd_rme32_capture_getrate() argument
433 if (rme32->rcreg & RME32_RCR_LOCK) { in snd_rme32_capture_getrate()
437 if (rme32->rcreg & RME32_RCR_ERF) { in snd_rme32_capture_getrate()
442 n = ((rme32->rcreg >> RME32_RCR_BITPOS_F0) & 1) + in snd_rme32_capture_getrate()
443 (((rme32->rcreg >> RME32_RCR_BITPOS_F1) & 1) << 1) + in snd_rme32_capture_getrate()
444 (((rme32->rcreg >> RME32_RCR_BITPOS_F2) & 1) << 2); in snd_rme32_capture_getrate()
446 if (RME32_PRO_WITH_8414(rme32)) in snd_rme32_capture_getrate()
490 static int snd_rme32_playback_setrate(struct rme32 * rme32, int rate) in snd_rme32_playback_setrate() argument
494 ds = rme32->wcreg & RME32_WCR_DS_BM; in snd_rme32_playback_setrate()
497 rme32->wcreg &= ~RME32_WCR_DS_BM; in snd_rme32_playback_setrate()
498 rme32->wcreg = (rme32->wcreg | RME32_WCR_FREQ_0) & in snd_rme32_playback_setrate()
502 rme32->wcreg &= ~RME32_WCR_DS_BM; in snd_rme32_playback_setrate()
503 rme32->wcreg = (rme32->wcreg | RME32_WCR_FREQ_1) & in snd_rme32_playback_setrate()
507 rme32->wcreg &= ~RME32_WCR_DS_BM; in snd_rme32_playback_setrate()
508 rme32->wcreg = (rme32->wcreg | RME32_WCR_FREQ_0) | in snd_rme32_playback_setrate()
512 if (rme32->pci->device != PCI_DEVICE_ID_RME_DIGI32_PRO) in snd_rme32_playback_setrate()
514 rme32->wcreg |= RME32_WCR_DS_BM; in snd_rme32_playback_setrate()
515 rme32->wcreg = (rme32->wcreg | RME32_WCR_FREQ_0) & in snd_rme32_playback_setrate()
519 if (rme32->pci->device != PCI_DEVICE_ID_RME_DIGI32_PRO) in snd_rme32_playback_setrate()
521 rme32->wcreg |= RME32_WCR_DS_BM; in snd_rme32_playback_setrate()
522 rme32->wcreg = (rme32->wcreg | RME32_WCR_FREQ_1) & in snd_rme32_playback_setrate()
526 if (rme32->pci->device != PCI_DEVICE_ID_RME_DIGI32_PRO) in snd_rme32_playback_setrate()
528 rme32->wcreg |= RME32_WCR_DS_BM; in snd_rme32_playback_setrate()
529 rme32->wcreg = (rme32->wcreg | RME32_WCR_FREQ_0) | in snd_rme32_playback_setrate()
535 if ((!ds && rme32->wcreg & RME32_WCR_DS_BM) || in snd_rme32_playback_setrate()
536 (ds && !(rme32->wcreg & RME32_WCR_DS_BM))) in snd_rme32_playback_setrate()
539 snd_rme32_reset_dac(rme32); in snd_rme32_playback_setrate()
541 writel(rme32->wcreg, rme32->iobase + RME32_IO_CONTROL_REGISTER); in snd_rme32_playback_setrate()
546 static int snd_rme32_setclockmode(struct rme32 * rme32, int mode) in snd_rme32_setclockmode() argument
551 rme32->wcreg = (rme32->wcreg & ~RME32_WCR_FREQ_0) & in snd_rme32_setclockmode()
556 rme32->wcreg = (rme32->wcreg | RME32_WCR_FREQ_0) & in snd_rme32_setclockmode()
561 rme32->wcreg = (rme32->wcreg & ~RME32_WCR_FREQ_0) | in snd_rme32_setclockmode()
566 rme32->wcreg = (rme32->wcreg | RME32_WCR_FREQ_0) | in snd_rme32_setclockmode()
572 writel(rme32->wcreg, rme32->iobase + RME32_IO_CONTROL_REGISTER); in snd_rme32_setclockmode()
576 static int snd_rme32_getclockmode(struct rme32 * rme32) in snd_rme32_getclockmode() argument
578 return ((rme32->wcreg >> RME32_WCR_BITPOS_FREQ_0) & 1) + in snd_rme32_getclockmode()
579 (((rme32->wcreg >> RME32_WCR_BITPOS_FREQ_1) & 1) << 1); in snd_rme32_getclockmode()
582 static int snd_rme32_setinputtype(struct rme32 * rme32, int type) in snd_rme32_setinputtype() argument
586 rme32->wcreg = (rme32->wcreg & ~RME32_WCR_INP_0) & in snd_rme32_setinputtype()
590 rme32->wcreg = (rme32->wcreg | RME32_WCR_INP_0) & in snd_rme32_setinputtype()
594 rme32->wcreg = (rme32->wcreg & ~RME32_WCR_INP_0) | in snd_rme32_setinputtype()
598 rme32->wcreg = (rme32->wcreg | RME32_WCR_INP_0) | in snd_rme32_setinputtype()
604 writel(rme32->wcreg, rme32->iobase + RME32_IO_CONTROL_REGISTER); in snd_rme32_setinputtype()
608 static int snd_rme32_getinputtype(struct rme32 * rme32) in snd_rme32_getinputtype() argument
610 return ((rme32->wcreg >> RME32_WCR_BITPOS_INP_0) & 1) + in snd_rme32_getinputtype()
611 (((rme32->wcreg >> RME32_WCR_BITPOS_INP_1) & 1) << 1); in snd_rme32_getinputtype()
615 snd_rme32_setframelog(struct rme32 * rme32, int n_channels, int is_playback) in snd_rme32_setframelog() argument
626 frlog += (rme32->wcreg & RME32_WCR_MODE24) ? 2 : 1; in snd_rme32_setframelog()
627 rme32->playback_frlog = frlog; in snd_rme32_setframelog()
629 frlog += (rme32->wcreg & RME32_WCR_MODE24) ? 2 : 1; in snd_rme32_setframelog()
630 rme32->capture_frlog = frlog; in snd_rme32_setframelog()
634 static int snd_rme32_setformat(struct rme32 *rme32, snd_pcm_format_t format) in snd_rme32_setformat() argument
638 rme32->wcreg &= ~RME32_WCR_MODE24; in snd_rme32_setformat()
641 rme32->wcreg |= RME32_WCR_MODE24; in snd_rme32_setformat()
646 writel(rme32->wcreg, rme32->iobase + RME32_IO_CONTROL_REGISTER); in snd_rme32_setformat()
655 struct rme32 *rme32 = snd_pcm_substream_chip(substream); in snd_rme32_playback_hw_params() local
658 if (rme32->fullduplex_mode) { in snd_rme32_playback_hw_params()
663 runtime->dma_area = (void __force *)(rme32->iobase + in snd_rme32_playback_hw_params()
665 runtime->dma_addr = rme32->port + RME32_IO_DATA_BUFFER; in snd_rme32_playback_hw_params()
669 spin_lock_irq(&rme32->lock); in snd_rme32_playback_hw_params()
670 if ((rme32->rcreg & RME32_RCR_KMODE) && in snd_rme32_playback_hw_params()
671 (rate = snd_rme32_capture_getrate(rme32, &dummy)) > 0) { in snd_rme32_playback_hw_params()
674 spin_unlock_irq(&rme32->lock); in snd_rme32_playback_hw_params()
677 } else if ((err = snd_rme32_playback_setrate(rme32, params_rate(params))) < 0) { in snd_rme32_playback_hw_params()
678 spin_unlock_irq(&rme32->lock); in snd_rme32_playback_hw_params()
681 if ((err = snd_rme32_setformat(rme32, params_format(params))) < 0) { in snd_rme32_playback_hw_params()
682 spin_unlock_irq(&rme32->lock); in snd_rme32_playback_hw_params()
686 snd_rme32_setframelog(rme32, params_channels(params), 1); in snd_rme32_playback_hw_params()
687 if (rme32->capture_periodsize != 0) { in snd_rme32_playback_hw_params()
688 if (params_period_size(params) << rme32->playback_frlog != rme32->capture_periodsize) { in snd_rme32_playback_hw_params()
689 spin_unlock_irq(&rme32->lock); in snd_rme32_playback_hw_params()
693 rme32->playback_periodsize = params_period_size(params) << rme32->playback_frlog; in snd_rme32_playback_hw_params()
695 if ((rme32->wcreg & RME32_WCR_ADAT) == 0) { in snd_rme32_playback_hw_params()
696 rme32->wcreg &= ~(RME32_WCR_PRO | RME32_WCR_EMP); in snd_rme32_playback_hw_params()
697 rme32->wcreg |= rme32->wcreg_spdif_stream; in snd_rme32_playback_hw_params()
698 writel(rme32->wcreg, rme32->iobase + RME32_IO_CONTROL_REGISTER); in snd_rme32_playback_hw_params()
700 spin_unlock_irq(&rme32->lock); in snd_rme32_playback_hw_params()
710 struct rme32 *rme32 = snd_pcm_substream_chip(substream); in snd_rme32_capture_hw_params() local
713 if (rme32->fullduplex_mode) { in snd_rme32_capture_hw_params()
718 runtime->dma_area = (void __force *)rme32->iobase + in snd_rme32_capture_hw_params()
720 runtime->dma_addr = rme32->port + RME32_IO_DATA_BUFFER; in snd_rme32_capture_hw_params()
724 spin_lock_irq(&rme32->lock); in snd_rme32_capture_hw_params()
726 rme32->wcreg |= RME32_WCR_AUTOSYNC; in snd_rme32_capture_hw_params()
727 writel(rme32->wcreg, rme32->iobase + RME32_IO_CONTROL_REGISTER); in snd_rme32_capture_hw_params()
729 if ((err = snd_rme32_setformat(rme32, params_format(params))) < 0) { in snd_rme32_capture_hw_params()
730 spin_unlock_irq(&rme32->lock); in snd_rme32_capture_hw_params()
733 if ((err = snd_rme32_playback_setrate(rme32, params_rate(params))) < 0) { in snd_rme32_capture_hw_params()
734 spin_unlock_irq(&rme32->lock); in snd_rme32_capture_hw_params()
737 if ((rate = snd_rme32_capture_getrate(rme32, &isadat)) > 0) { in snd_rme32_capture_hw_params()
739 spin_unlock_irq(&rme32->lock); in snd_rme32_capture_hw_params()
744 spin_unlock_irq(&rme32->lock); in snd_rme32_capture_hw_params()
749 rme32->wcreg &= ~RME32_WCR_AUTOSYNC; in snd_rme32_capture_hw_params()
750 writel(rme32->wcreg, rme32->iobase + RME32_IO_CONTROL_REGISTER); in snd_rme32_capture_hw_params()
752 snd_rme32_setframelog(rme32, params_channels(params), 0); in snd_rme32_capture_hw_params()
753 if (rme32->playback_periodsize != 0) { in snd_rme32_capture_hw_params()
754 if (params_period_size(params) << rme32->capture_frlog != in snd_rme32_capture_hw_params()
755 rme32->playback_periodsize) { in snd_rme32_capture_hw_params()
756 spin_unlock_irq(&rme32->lock); in snd_rme32_capture_hw_params()
760 rme32->capture_periodsize = in snd_rme32_capture_hw_params()
761 params_period_size(params) << rme32->capture_frlog; in snd_rme32_capture_hw_params()
762 spin_unlock_irq(&rme32->lock); in snd_rme32_capture_hw_params()
769 struct rme32 *rme32 = snd_pcm_substream_chip(substream); in snd_rme32_pcm_hw_free() local
770 if (! rme32->fullduplex_mode) in snd_rme32_pcm_hw_free()
775 static void snd_rme32_pcm_start(struct rme32 * rme32, int from_pause) in snd_rme32_pcm_start() argument
778 writel(0, rme32->iobase + RME32_IO_RESET_POS); in snd_rme32_pcm_start()
781 rme32->wcreg |= RME32_WCR_START; in snd_rme32_pcm_start()
782 writel(rme32->wcreg, rme32->iobase + RME32_IO_CONTROL_REGISTER); in snd_rme32_pcm_start()
785 static void snd_rme32_pcm_stop(struct rme32 * rme32, int to_pause) in snd_rme32_pcm_stop() argument
791 rme32->rcreg = readl(rme32->iobase + RME32_IO_CONTROL_REGISTER); in snd_rme32_pcm_stop()
792 if (rme32->rcreg & RME32_RCR_IRQ) { in snd_rme32_pcm_stop()
793 writel(0, rme32->iobase + RME32_IO_CONFIRM_ACTION_IRQ); in snd_rme32_pcm_stop()
795 rme32->wcreg &= ~RME32_WCR_START; in snd_rme32_pcm_stop()
796 if (rme32->wcreg & RME32_WCR_SEL) in snd_rme32_pcm_stop()
797 rme32->wcreg |= RME32_WCR_MUTE; in snd_rme32_pcm_stop()
798 writel(rme32->wcreg, rme32->iobase + RME32_IO_CONTROL_REGISTER); in snd_rme32_pcm_stop()
800 writel(0, rme32->iobase + RME32_IO_RESET_POS); in snd_rme32_pcm_stop()
805 struct rme32 *rme32 = (struct rme32 *) dev_id; in snd_rme32_interrupt() local
807 rme32->rcreg = readl(rme32->iobase + RME32_IO_CONTROL_REGISTER); in snd_rme32_interrupt()
808 if (!(rme32->rcreg & RME32_RCR_IRQ)) { in snd_rme32_interrupt()
811 if (rme32->capture_substream) { in snd_rme32_interrupt()
812 snd_pcm_period_elapsed(rme32->capture_substream); in snd_rme32_interrupt()
814 if (rme32->playback_substream) { in snd_rme32_interrupt()
815 snd_pcm_period_elapsed(rme32->playback_substream); in snd_rme32_interrupt()
817 writel(0, rme32->iobase + RME32_IO_CONFIRM_ACTION_IRQ); in snd_rme32_interrupt()
831 static void snd_rme32_set_buffer_constraint(struct rme32 *rme32, struct snd_pcm_runtime *runtime) in snd_rme32_set_buffer_constraint() argument
833 if (! rme32->fullduplex_mode) { in snd_rme32_set_buffer_constraint()
846 struct rme32 *rme32 = snd_pcm_substream_chip(substream); in snd_rme32_playback_spdif_open() local
851 spin_lock_irq(&rme32->lock); in snd_rme32_playback_spdif_open()
852 if (rme32->playback_substream != NULL) { in snd_rme32_playback_spdif_open()
853 spin_unlock_irq(&rme32->lock); in snd_rme32_playback_spdif_open()
856 rme32->wcreg &= ~RME32_WCR_ADAT; in snd_rme32_playback_spdif_open()
857 writel(rme32->wcreg, rme32->iobase + RME32_IO_CONTROL_REGISTER); in snd_rme32_playback_spdif_open()
858 rme32->playback_substream = substream; in snd_rme32_playback_spdif_open()
859 spin_unlock_irq(&rme32->lock); in snd_rme32_playback_spdif_open()
861 if (rme32->fullduplex_mode) in snd_rme32_playback_spdif_open()
865 if (rme32->pci->device == PCI_DEVICE_ID_RME_DIGI32_PRO) { in snd_rme32_playback_spdif_open()
869 if ((rme32->rcreg & RME32_RCR_KMODE) && in snd_rme32_playback_spdif_open()
870 (rate = snd_rme32_capture_getrate(rme32, &dummy)) > 0) { in snd_rme32_playback_spdif_open()
877 snd_rme32_set_buffer_constraint(rme32, runtime); in snd_rme32_playback_spdif_open()
879 rme32->wcreg_spdif_stream = rme32->wcreg_spdif; in snd_rme32_playback_spdif_open()
880 rme32->spdif_ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE; in snd_rme32_playback_spdif_open()
881 snd_ctl_notify(rme32->card, SNDRV_CTL_EVENT_MASK_VALUE | in snd_rme32_playback_spdif_open()
882 SNDRV_CTL_EVENT_MASK_INFO, &rme32->spdif_ctl->id); in snd_rme32_playback_spdif_open()
889 struct rme32 *rme32 = snd_pcm_substream_chip(substream); in snd_rme32_capture_spdif_open() local
894 spin_lock_irq(&rme32->lock); in snd_rme32_capture_spdif_open()
895 if (rme32->capture_substream != NULL) { in snd_rme32_capture_spdif_open()
896 spin_unlock_irq(&rme32->lock); in snd_rme32_capture_spdif_open()
899 rme32->capture_substream = substream; in snd_rme32_capture_spdif_open()
900 spin_unlock_irq(&rme32->lock); in snd_rme32_capture_spdif_open()
902 if (rme32->fullduplex_mode) in snd_rme32_capture_spdif_open()
906 if (RME32_PRO_WITH_8414(rme32)) { in snd_rme32_capture_spdif_open()
910 if ((rate = snd_rme32_capture_getrate(rme32, &isadat)) > 0) { in snd_rme32_capture_spdif_open()
919 snd_rme32_set_buffer_constraint(rme32, runtime); in snd_rme32_capture_spdif_open()
928 struct rme32 *rme32 = snd_pcm_substream_chip(substream); in snd_rme32_playback_adat_open() local
933 spin_lock_irq(&rme32->lock); in snd_rme32_playback_adat_open()
934 if (rme32->playback_substream != NULL) { in snd_rme32_playback_adat_open()
935 spin_unlock_irq(&rme32->lock); in snd_rme32_playback_adat_open()
938 rme32->wcreg |= RME32_WCR_ADAT; in snd_rme32_playback_adat_open()
939 writel(rme32->wcreg, rme32->iobase + RME32_IO_CONTROL_REGISTER); in snd_rme32_playback_adat_open()
940 rme32->playback_substream = substream; in snd_rme32_playback_adat_open()
941 spin_unlock_irq(&rme32->lock); in snd_rme32_playback_adat_open()
943 if (rme32->fullduplex_mode) in snd_rme32_playback_adat_open()
947 if ((rme32->rcreg & RME32_RCR_KMODE) && in snd_rme32_playback_adat_open()
948 (rate = snd_rme32_capture_getrate(rme32, &dummy)) > 0) { in snd_rme32_playback_adat_open()
955 snd_rme32_set_buffer_constraint(rme32, runtime); in snd_rme32_playback_adat_open()
963 struct rme32 *rme32 = snd_pcm_substream_chip(substream); in snd_rme32_capture_adat_open() local
966 if (rme32->fullduplex_mode) in snd_rme32_capture_adat_open()
970 if ((rate = snd_rme32_capture_getrate(rme32, &isadat)) > 0) { in snd_rme32_capture_adat_open()
981 spin_lock_irq(&rme32->lock); in snd_rme32_capture_adat_open()
982 if (rme32->capture_substream != NULL) { in snd_rme32_capture_adat_open()
983 spin_unlock_irq(&rme32->lock); in snd_rme32_capture_adat_open()
986 rme32->capture_substream = substream; in snd_rme32_capture_adat_open()
987 spin_unlock_irq(&rme32->lock); in snd_rme32_capture_adat_open()
989 snd_rme32_set_buffer_constraint(rme32, runtime); in snd_rme32_capture_adat_open()
995 struct rme32 *rme32 = snd_pcm_substream_chip(substream); in snd_rme32_playback_close() local
998 spin_lock_irq(&rme32->lock); in snd_rme32_playback_close()
999 rme32->playback_substream = NULL; in snd_rme32_playback_close()
1000 rme32->playback_periodsize = 0; in snd_rme32_playback_close()
1001 spdif = (rme32->wcreg & RME32_WCR_ADAT) == 0; in snd_rme32_playback_close()
1002 spin_unlock_irq(&rme32->lock); in snd_rme32_playback_close()
1004 rme32->spdif_ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE; in snd_rme32_playback_close()
1005 snd_ctl_notify(rme32->card, SNDRV_CTL_EVENT_MASK_VALUE | in snd_rme32_playback_close()
1007 &rme32->spdif_ctl->id); in snd_rme32_playback_close()
1014 struct rme32 *rme32 = snd_pcm_substream_chip(substream); in snd_rme32_capture_close() local
1016 spin_lock_irq(&rme32->lock); in snd_rme32_capture_close()
1017 rme32->capture_substream = NULL; in snd_rme32_capture_close()
1018 rme32->capture_periodsize = 0; in snd_rme32_capture_close()
1019 spin_unlock_irq(&rme32->lock); in snd_rme32_capture_close()
1025 struct rme32 *rme32 = snd_pcm_substream_chip(substream); in snd_rme32_playback_prepare() local
1027 spin_lock_irq(&rme32->lock); in snd_rme32_playback_prepare()
1028 if (rme32->fullduplex_mode) { in snd_rme32_playback_prepare()
1029 memset(&rme32->playback_pcm, 0, sizeof(rme32->playback_pcm)); in snd_rme32_playback_prepare()
1030 rme32->playback_pcm.hw_buffer_size = RME32_BUFFER_SIZE; in snd_rme32_playback_prepare()
1031 rme32->playback_pcm.sw_buffer_size = snd_pcm_lib_buffer_bytes(substream); in snd_rme32_playback_prepare()
1033 writel(0, rme32->iobase + RME32_IO_RESET_POS); in snd_rme32_playback_prepare()
1035 if (rme32->wcreg & RME32_WCR_SEL) in snd_rme32_playback_prepare()
1036 rme32->wcreg &= ~RME32_WCR_MUTE; in snd_rme32_playback_prepare()
1037 writel(rme32->wcreg, rme32->iobase + RME32_IO_CONTROL_REGISTER); in snd_rme32_playback_prepare()
1038 spin_unlock_irq(&rme32->lock); in snd_rme32_playback_prepare()
1044 struct rme32 *rme32 = snd_pcm_substream_chip(substream); in snd_rme32_capture_prepare() local
1046 spin_lock_irq(&rme32->lock); in snd_rme32_capture_prepare()
1047 if (rme32->fullduplex_mode) { in snd_rme32_capture_prepare()
1048 memset(&rme32->capture_pcm, 0, sizeof(rme32->capture_pcm)); in snd_rme32_capture_prepare()
1049 rme32->capture_pcm.hw_buffer_size = RME32_BUFFER_SIZE; in snd_rme32_capture_prepare()
1050 rme32->capture_pcm.hw_queue_size = RME32_BUFFER_SIZE / 2; in snd_rme32_capture_prepare()
1051 rme32->capture_pcm.sw_buffer_size = snd_pcm_lib_buffer_bytes(substream); in snd_rme32_capture_prepare()
1053 writel(0, rme32->iobase + RME32_IO_RESET_POS); in snd_rme32_capture_prepare()
1055 spin_unlock_irq(&rme32->lock); in snd_rme32_capture_prepare()
1062 struct rme32 *rme32 = snd_pcm_substream_chip(substream); in snd_rme32_pcm_trigger() local
1065 spin_lock(&rme32->lock); in snd_rme32_pcm_trigger()
1067 if (s != rme32->playback_substream && in snd_rme32_pcm_trigger()
1068 s != rme32->capture_substream) in snd_rme32_pcm_trigger()
1072 rme32->running |= (1 << s->stream); in snd_rme32_pcm_trigger()
1073 if (rme32->fullduplex_mode) { in snd_rme32_pcm_trigger()
1075 if (s == rme32->playback_substream) { in snd_rme32_pcm_trigger()
1076 rme32->playback_pcm.hw_io = in snd_rme32_pcm_trigger()
1077 rme32->playback_pcm.hw_data = snd_rme32_pcm_byteptr(rme32); in snd_rme32_pcm_trigger()
1079 rme32->capture_pcm.hw_io = in snd_rme32_pcm_trigger()
1080 rme32->capture_pcm.hw_data = snd_rme32_pcm_byteptr(rme32); in snd_rme32_pcm_trigger()
1085 rme32->running &= ~(1 << s->stream); in snd_rme32_pcm_trigger()
1092 if (cmd == SNDRV_PCM_TRIGGER_START && rme32->fullduplex_mode) { in snd_rme32_pcm_trigger()
1094 if (s == rme32->playback_substream) { in snd_rme32_pcm_trigger()
1103 if (rme32->running && ! RME32_ISWORKING(rme32)) in snd_rme32_pcm_trigger()
1104 snd_rme32_pcm_start(rme32, 0); in snd_rme32_pcm_trigger()
1107 if (! rme32->running && RME32_ISWORKING(rme32)) in snd_rme32_pcm_trigger()
1108 snd_rme32_pcm_stop(rme32, 0); in snd_rme32_pcm_trigger()
1111 if (rme32->running && RME32_ISWORKING(rme32)) in snd_rme32_pcm_trigger()
1112 snd_rme32_pcm_stop(rme32, 1); in snd_rme32_pcm_trigger()
1115 if (rme32->running && ! RME32_ISWORKING(rme32)) in snd_rme32_pcm_trigger()
1116 snd_rme32_pcm_start(rme32, 1); in snd_rme32_pcm_trigger()
1119 spin_unlock(&rme32->lock); in snd_rme32_pcm_trigger()
1127 struct rme32 *rme32 = snd_pcm_substream_chip(substream); in snd_rme32_playback_pointer() local
1128 return snd_rme32_pcm_byteptr(rme32) >> rme32->playback_frlog; in snd_rme32_playback_pointer()
1134 struct rme32 *rme32 = snd_pcm_substream_chip(substream); in snd_rme32_capture_pointer() local
1135 return snd_rme32_pcm_byteptr(rme32) >> rme32->capture_frlog; in snd_rme32_capture_pointer()
1143 struct rme32 *rme32 = snd_pcm_substream_chip(substream); in snd_rme32_pb_trans_copy() local
1144 memcpy_toio(rme32->iobase + RME32_IO_DATA_BUFFER + rec->hw_data, in snd_rme32_pb_trans_copy()
1150 struct rme32 *rme32 = snd_pcm_substream_chip(substream); in snd_rme32_playback_fd_ack() local
1153 rec = &rme32->playback_pcm; in snd_rme32_playback_fd_ack()
1154 cprec = &rme32->capture_pcm; in snd_rme32_playback_fd_ack()
1155 spin_lock(&rme32->lock); in snd_rme32_playback_fd_ack()
1157 if (rme32->running & (1 << SNDRV_PCM_STREAM_CAPTURE)) in snd_rme32_playback_fd_ack()
1159 spin_unlock(&rme32->lock); in snd_rme32_playback_fd_ack()
1168 struct rme32 *rme32 = snd_pcm_substream_chip(substream); in snd_rme32_cp_trans_copy() local
1170 rme32->iobase + RME32_IO_DATA_BUFFER + rec->hw_data, in snd_rme32_cp_trans_copy()
1176 struct rme32 *rme32 = snd_pcm_substream_chip(substream); in snd_rme32_capture_fd_ack() local
1177 snd_pcm_indirect_capture_transfer(substream, &rme32->capture_pcm, in snd_rme32_capture_fd_ack()
1185 struct rme32 *rme32 = snd_pcm_substream_chip(substream); in snd_rme32_playback_fd_pointer() local
1186 return snd_pcm_indirect_playback_pointer(substream, &rme32->playback_pcm, in snd_rme32_playback_fd_pointer()
1187 snd_rme32_pcm_byteptr(rme32)); in snd_rme32_playback_fd_pointer()
1193 struct rme32 *rme32 = snd_pcm_substream_chip(substream); in snd_rme32_capture_fd_pointer() local
1194 return snd_pcm_indirect_capture_pointer(substream, &rme32->capture_pcm, in snd_rme32_capture_fd_pointer()
1195 snd_rme32_pcm_byteptr(rme32)); in snd_rme32_capture_fd_pointer()
1300 struct rme32 *rme32 = (struct rme32 *) private_data; in snd_rme32_free() local
1302 if (rme32 == NULL) { in snd_rme32_free()
1305 if (rme32->irq >= 0) { in snd_rme32_free()
1306 snd_rme32_pcm_stop(rme32, 0); in snd_rme32_free()
1307 free_irq(rme32->irq, (void *) rme32); in snd_rme32_free()
1308 rme32->irq = -1; in snd_rme32_free()
1310 if (rme32->iobase) { in snd_rme32_free()
1311 iounmap(rme32->iobase); in snd_rme32_free()
1312 rme32->iobase = NULL; in snd_rme32_free()
1314 if (rme32->port) { in snd_rme32_free()
1315 pci_release_regions(rme32->pci); in snd_rme32_free()
1316 rme32->port = 0; in snd_rme32_free()
1318 pci_disable_device(rme32->pci); in snd_rme32_free()
1323 struct rme32 *rme32 = (struct rme32 *) pcm->private_data; in snd_rme32_free_spdif_pcm() local
1324 rme32->spdif_pcm = NULL; in snd_rme32_free_spdif_pcm()
1330 struct rme32 *rme32 = (struct rme32 *) pcm->private_data; in snd_rme32_free_adat_pcm() local
1331 rme32->adat_pcm = NULL; in snd_rme32_free_adat_pcm()
1334 static int snd_rme32_create(struct rme32 *rme32) in snd_rme32_create() argument
1336 struct pci_dev *pci = rme32->pci; in snd_rme32_create()
1339 rme32->irq = -1; in snd_rme32_create()
1340 spin_lock_init(&rme32->lock); in snd_rme32_create()
1347 rme32->port = pci_resource_start(rme32->pci, 0); in snd_rme32_create()
1349 rme32->iobase = ioremap_nocache(rme32->port, RME32_IO_SIZE); in snd_rme32_create()
1350 if (!rme32->iobase) { in snd_rme32_create()
1351 dev_err(rme32->card->dev, in snd_rme32_create()
1353 rme32->port, rme32->port + RME32_IO_SIZE - 1); in snd_rme32_create()
1358 KBUILD_MODNAME, rme32)) { in snd_rme32_create()
1359 dev_err(rme32->card->dev, "unable to grab IRQ %d\n", pci->irq); in snd_rme32_create()
1362 rme32->irq = pci->irq; in snd_rme32_create()
1365 pci_read_config_byte(pci, 8, &rme32->rev); in snd_rme32_create()
1368 if ((err = snd_pcm_new(rme32->card, "Digi32 IEC958", 0, 1, 1, &rme32->spdif_pcm)) < 0) { in snd_rme32_create()
1371 rme32->spdif_pcm->private_data = rme32; in snd_rme32_create()
1372 rme32->spdif_pcm->private_free = snd_rme32_free_spdif_pcm; in snd_rme32_create()
1373 strcpy(rme32->spdif_pcm->name, "Digi32 IEC958"); in snd_rme32_create()
1374 if (rme32->fullduplex_mode) { in snd_rme32_create()
1375 snd_pcm_set_ops(rme32->spdif_pcm, SNDRV_PCM_STREAM_PLAYBACK, in snd_rme32_create()
1377 snd_pcm_set_ops(rme32->spdif_pcm, SNDRV_PCM_STREAM_CAPTURE, in snd_rme32_create()
1379 snd_pcm_lib_preallocate_pages_for_all(rme32->spdif_pcm, SNDRV_DMA_TYPE_CONTINUOUS, in snd_rme32_create()
1382 rme32->spdif_pcm->info_flags = SNDRV_PCM_INFO_JOINT_DUPLEX; in snd_rme32_create()
1384 snd_pcm_set_ops(rme32->spdif_pcm, SNDRV_PCM_STREAM_PLAYBACK, in snd_rme32_create()
1386 snd_pcm_set_ops(rme32->spdif_pcm, SNDRV_PCM_STREAM_CAPTURE, in snd_rme32_create()
1388 rme32->spdif_pcm->info_flags = SNDRV_PCM_INFO_HALF_DUPLEX; in snd_rme32_create()
1395 rme32->adat_pcm = NULL; in snd_rme32_create()
1398 if ((err = snd_pcm_new(rme32->card, "Digi32 ADAT", 1, in snd_rme32_create()
1399 1, 1, &rme32->adat_pcm)) < 0) in snd_rme32_create()
1403 rme32->adat_pcm->private_data = rme32; in snd_rme32_create()
1404 rme32->adat_pcm->private_free = snd_rme32_free_adat_pcm; in snd_rme32_create()
1405 strcpy(rme32->adat_pcm->name, "Digi32 ADAT"); in snd_rme32_create()
1406 if (rme32->fullduplex_mode) { in snd_rme32_create()
1407 snd_pcm_set_ops(rme32->adat_pcm, SNDRV_PCM_STREAM_PLAYBACK, in snd_rme32_create()
1409 snd_pcm_set_ops(rme32->adat_pcm, SNDRV_PCM_STREAM_CAPTURE, in snd_rme32_create()
1411 snd_pcm_lib_preallocate_pages_for_all(rme32->adat_pcm, SNDRV_DMA_TYPE_CONTINUOUS, in snd_rme32_create()
1414 rme32->adat_pcm->info_flags = SNDRV_PCM_INFO_JOINT_DUPLEX; in snd_rme32_create()
1416 snd_pcm_set_ops(rme32->adat_pcm, SNDRV_PCM_STREAM_PLAYBACK, in snd_rme32_create()
1418 snd_pcm_set_ops(rme32->adat_pcm, SNDRV_PCM_STREAM_CAPTURE, in snd_rme32_create()
1420 rme32->adat_pcm->info_flags = SNDRV_PCM_INFO_HALF_DUPLEX; in snd_rme32_create()
1425 rme32->playback_periodsize = 0; in snd_rme32_create()
1426 rme32->capture_periodsize = 0; in snd_rme32_create()
1429 snd_rme32_pcm_stop(rme32, 0); in snd_rme32_create()
1432 snd_rme32_reset_dac(rme32); in snd_rme32_create()
1435 writel(0, rme32->iobase + RME32_IO_RESET_POS); in snd_rme32_create()
1438 rme32->wcreg = RME32_WCR_SEL | /* normal playback */ in snd_rme32_create()
1441 writel(rme32->wcreg, rme32->iobase + RME32_IO_CONTROL_REGISTER); in snd_rme32_create()
1445 if ((err = snd_rme32_create_switches(rme32->card, rme32)) < 0) { in snd_rme32_create()
1450 snd_rme32_proc_init(rme32); in snd_rme32_create()
1452 rme32->capture_substream = NULL; in snd_rme32_create()
1453 rme32->playback_substream = NULL; in snd_rme32_create()
1466 struct rme32 *rme32 = (struct rme32 *) entry->private_data; in snd_rme32_proc_read() local
1468 rme32->rcreg = readl(rme32->iobase + RME32_IO_CONTROL_REGISTER); in snd_rme32_proc_read()
1470 snd_iprintf(buffer, rme32->card->longname); in snd_rme32_proc_read()
1471 snd_iprintf(buffer, " (index #%d)\n", rme32->card->number + 1); in snd_rme32_proc_read()
1474 if (rme32->fullduplex_mode) in snd_rme32_proc_read()
1478 if (RME32_PRO_WITH_8414(rme32)) { in snd_rme32_proc_read()
1483 if (rme32->wcreg & RME32_WCR_MODE24) { in snd_rme32_proc_read()
1488 if (rme32->wcreg & RME32_WCR_MONO) { in snd_rme32_proc_read()
1495 switch (snd_rme32_getinputtype(rme32)) { in snd_rme32_proc_read()
1509 if (snd_rme32_capture_getrate(rme32, &n) < 0) { in snd_rme32_proc_read()
1518 snd_rme32_capture_getrate(rme32, &n)); in snd_rme32_proc_read()
1522 if (rme32->wcreg & RME32_WCR_SEL) { in snd_rme32_proc_read()
1527 if (rme32->wcreg & RME32_WCR_MUTE) { in snd_rme32_proc_read()
1535 ((!(rme32->wcreg & RME32_WCR_FREQ_0)) in snd_rme32_proc_read()
1536 && (!(rme32->wcreg & RME32_WCR_FREQ_1)))) { in snd_rme32_proc_read()
1538 snd_rme32_playback_getrate(rme32)); in snd_rme32_proc_read()
1540 if (rme32->rcreg & RME32_RCR_KMODE) { in snd_rme32_proc_read()
1545 if (rme32->wcreg & RME32_WCR_PRO) { in snd_rme32_proc_read()
1550 if (rme32->wcreg & RME32_WCR_EMP) { in snd_rme32_proc_read()
1557 static void snd_rme32_proc_init(struct rme32 *rme32) in snd_rme32_proc_init() argument
1561 if (! snd_card_proc_new(rme32->card, "rme32", &entry)) in snd_rme32_proc_init()
1562 snd_info_set_text_ops(entry, rme32, snd_rme32_proc_read); in snd_rme32_proc_init()
1575 struct rme32 *rme32 = snd_kcontrol_chip(kcontrol); in snd_rme32_get_loopback_control() local
1577 spin_lock_irq(&rme32->lock); in snd_rme32_get_loopback_control()
1579 rme32->wcreg & RME32_WCR_SEL ? 0 : 1; in snd_rme32_get_loopback_control()
1580 spin_unlock_irq(&rme32->lock); in snd_rme32_get_loopback_control()
1587 struct rme32 *rme32 = snd_kcontrol_chip(kcontrol); in snd_rme32_put_loopback_control() local
1592 spin_lock_irq(&rme32->lock); in snd_rme32_put_loopback_control()
1593 val = (rme32->wcreg & ~RME32_WCR_SEL) | val; in snd_rme32_put_loopback_control()
1594 change = val != rme32->wcreg; in snd_rme32_put_loopback_control()
1599 rme32->wcreg = val; in snd_rme32_put_loopback_control()
1600 writel(val, rme32->iobase + RME32_IO_CONTROL_REGISTER); in snd_rme32_put_loopback_control()
1601 spin_unlock_irq(&rme32->lock); in snd_rme32_put_loopback_control()
1609 struct rme32 *rme32 = snd_kcontrol_chip(kcontrol); in snd_rme32_info_inputtype_control() local
1615 switch (rme32->pci->device) { in snd_rme32_info_inputtype_control()
1633 struct rme32 *rme32 = snd_kcontrol_chip(kcontrol); in snd_rme32_get_inputtype_control() local
1636 spin_lock_irq(&rme32->lock); in snd_rme32_get_inputtype_control()
1637 ucontrol->value.enumerated.item[0] = snd_rme32_getinputtype(rme32); in snd_rme32_get_inputtype_control()
1639 switch (rme32->pci->device) { in snd_rme32_get_inputtype_control()
1655 spin_unlock_irq(&rme32->lock); in snd_rme32_get_inputtype_control()
1662 struct rme32 *rme32 = snd_kcontrol_chip(kcontrol); in snd_rme32_put_inputtype_control() local
1666 switch (rme32->pci->device) { in snd_rme32_put_inputtype_control()
1680 spin_lock_irq(&rme32->lock); in snd_rme32_put_inputtype_control()
1681 change = val != (unsigned int)snd_rme32_getinputtype(rme32); in snd_rme32_put_inputtype_control()
1682 snd_rme32_setinputtype(rme32, val); in snd_rme32_put_inputtype_control()
1683 spin_unlock_irq(&rme32->lock); in snd_rme32_put_inputtype_control()
1702 struct rme32 *rme32 = snd_kcontrol_chip(kcontrol); in snd_rme32_get_clockmode_control() local
1704 spin_lock_irq(&rme32->lock); in snd_rme32_get_clockmode_control()
1705 ucontrol->value.enumerated.item[0] = snd_rme32_getclockmode(rme32); in snd_rme32_get_clockmode_control()
1706 spin_unlock_irq(&rme32->lock); in snd_rme32_get_clockmode_control()
1713 struct rme32 *rme32 = snd_kcontrol_chip(kcontrol); in snd_rme32_put_clockmode_control() local
1718 spin_lock_irq(&rme32->lock); in snd_rme32_put_clockmode_control()
1719 change = val != (unsigned int)snd_rme32_getclockmode(rme32); in snd_rme32_put_clockmode_control()
1720 snd_rme32_setclockmode(rme32, val); in snd_rme32_put_clockmode_control()
1721 spin_unlock_irq(&rme32->lock); in snd_rme32_put_clockmode_control()
1756 struct rme32 *rme32 = snd_kcontrol_chip(kcontrol); in snd_rme32_control_spdif_get() local
1759 rme32->wcreg_spdif); in snd_rme32_control_spdif_get()
1766 struct rme32 *rme32 = snd_kcontrol_chip(kcontrol); in snd_rme32_control_spdif_put() local
1771 spin_lock_irq(&rme32->lock); in snd_rme32_control_spdif_put()
1772 change = val != rme32->wcreg_spdif; in snd_rme32_control_spdif_put()
1773 rme32->wcreg_spdif = val; in snd_rme32_control_spdif_put()
1774 spin_unlock_irq(&rme32->lock); in snd_rme32_control_spdif_put()
1790 struct rme32 *rme32 = snd_kcontrol_chip(kcontrol); in snd_rme32_control_spdif_stream_get() local
1793 rme32->wcreg_spdif_stream); in snd_rme32_control_spdif_stream_get()
1801 struct rme32 *rme32 = snd_kcontrol_chip(kcontrol); in snd_rme32_control_spdif_stream_put() local
1806 spin_lock_irq(&rme32->lock); in snd_rme32_control_spdif_stream_put()
1807 change = val != rme32->wcreg_spdif_stream; in snd_rme32_control_spdif_stream_put()
1808 rme32->wcreg_spdif_stream = val; in snd_rme32_control_spdif_stream_put()
1809 rme32->wcreg &= ~(RME32_WCR_PRO | RME32_WCR_EMP); in snd_rme32_control_spdif_stream_put()
1810 rme32->wcreg |= val; in snd_rme32_control_spdif_stream_put()
1811 writel(rme32->wcreg, rme32->iobase + RME32_IO_CONTROL_REGISTER); in snd_rme32_control_spdif_stream_put()
1812 spin_unlock_irq(&rme32->lock); in snd_rme32_control_spdif_stream_put()
1887 static int snd_rme32_create_switches(struct snd_card *card, struct rme32 * rme32) in snd_rme32_create_switches() argument
1893 if ((err = snd_ctl_add(card, kctl = snd_ctl_new1(&snd_rme32_controls[idx], rme32))) < 0) in snd_rme32_create_switches()
1896 rme32->spdif_ctl = kctl; in snd_rme32_create_switches()
1915 struct rme32 *rme32; in snd_rme32_probe() local
1928 sizeof(struct rme32), &card); in snd_rme32_probe()
1932 rme32 = (struct rme32 *) card->private_data; in snd_rme32_probe()
1933 rme32->card = card; in snd_rme32_probe()
1934 rme32->pci = pci; in snd_rme32_probe()
1936 rme32->fullduplex_mode = 1; in snd_rme32_probe()
1937 if ((err = snd_rme32_create(rme32)) < 0) { in snd_rme32_probe()
1943 switch (rme32->pci->device) { in snd_rme32_probe()
1955 card->shortname, rme32->rev, rme32->port, rme32->irq); in snd_rme32_probe()