Lines Matching +full:min +full:- +full:sample +full:- +full:rate +full:- +full:hz
1 // SPDX-License-Identifier: GPL-2.0-or-later
35 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
256 #define RME96_ISPLAYING(rme96) ((rme96)->wcreg & RME96_WCR_START)
257 #define RME96_ISRECORDING(rme96) ((rme96)->wcreg & RME96_WCR_START_2)
258 #define RME96_HAS_ANALOG_IN(rme96) ((rme96)->pci->device == PCI_DEVICE_ID_RME_DIGI96_8_PAD_OR_PST)
259 #define RME96_HAS_ANALOG_OUT(rme96) ((rme96)->pci->device == PCI_DEVICE_ID_RME_DIGI96_8_PRO || \
260 (rme96)->pci->device == PCI_DEVICE_ID_RME_DIGI96_8_PAD_OR_PST)
261 #define RME96_DAC_IS_1852(rme96) (RME96_HAS_ANALOG_OUT(rme96) && (rme96)->rev >= 4)
262 #define RME96_DAC_IS_1855(rme96) (((rme96)->pci->device == PCI_DEVICE_ID_RME_DIGI96_8_PAD_OR_PST &&…
263 ((rme96)->pci->device == PCI_DEVICE_ID_RME_DIGI96_8_PRO && (rme96)->rev == 2))
264 …_OUT(rme96) ((1 << (RME96_DAC_IS_1852(rme96) ? RME96_AD1852_VOL_BITS : RME96_AD1855_VOL_BITS)) - 1)
298 return (readl(rme96->iobase + RME96_IO_GET_PLAY_POS) in snd_rme96_playback_ptr()
299 & RME96_RCR_AUDIO_ADDR_MASK) >> rme96->playback_frlog; in snd_rme96_playback_ptr()
305 return (readl(rme96->iobase + RME96_IO_GET_REC_POS) in snd_rme96_capture_ptr()
306 & RME96_RCR_AUDIO_ADDR_MASK) >> rme96->capture_frlog; in snd_rme96_capture_ptr()
315 memset_io(rme96->iobase + RME96_IO_PLAY_BUFFER + pos, in snd_rme96_playback_silence()
327 return copy_from_user_toio(rme96->iobase + RME96_IO_PLAY_BUFFER + pos, in snd_rme96_playback_copy()
338 memcpy_toio(rme96->iobase + RME96_IO_PLAY_BUFFER + pos, src, count); in snd_rme96_playback_copy_kernel()
350 rme96->iobase + RME96_IO_REC_BUFFER + pos, in snd_rme96_capture_copy()
361 memcpy_fromio(dst, rme96->iobase + RME96_IO_REC_BUFFER + pos, count); in snd_rme96_capture_copy_kernel()
488 * limits the data rate to 500KHz and only causes a delay of 33 microsecs.
500 rme96->areg |= RME96_AR_CDATA; in snd_rme96_write_SPI()
502 rme96->areg &= ~RME96_AR_CDATA; in snd_rme96_write_SPI()
504 rme96->areg &= ~(RME96_AR_CCLK | RME96_AR_CLATCH); in snd_rme96_write_SPI()
505 writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG); in snd_rme96_write_SPI()
507 rme96->areg |= RME96_AR_CCLK; in snd_rme96_write_SPI()
508 writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG); in snd_rme96_write_SPI()
512 rme96->areg &= ~(RME96_AR_CCLK | RME96_AR_CDATA); in snd_rme96_write_SPI()
513 rme96->areg |= RME96_AR_CLATCH; in snd_rme96_write_SPI()
514 writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG); in snd_rme96_write_SPI()
516 rme96->areg &= ~RME96_AR_CLATCH; in snd_rme96_write_SPI()
517 writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG); in snd_rme96_write_SPI()
524 snd_rme96_write_SPI(rme96, (rme96->vol[0] << 2) | 0x0); in snd_rme96_apply_dac_volume()
525 snd_rme96_write_SPI(rme96, (rme96->vol[1] << 2) | 0x2); in snd_rme96_apply_dac_volume()
527 snd_rme96_write_SPI(rme96, (rme96->vol[0] & 0x3FF) | 0x000); in snd_rme96_apply_dac_volume()
528 snd_rme96_write_SPI(rme96, (rme96->vol[1] & 0x3FF) | 0x400); in snd_rme96_apply_dac_volume()
535 writel(rme96->wcreg | RME96_WCR_PD, in snd_rme96_reset_dac()
536 rme96->iobase + RME96_IO_CONTROL_REGISTER); in snd_rme96_reset_dac()
537 writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER); in snd_rme96_reset_dac()
543 return ((rme96->wcreg >> RME96_WCR_BITPOS_MONITOR_0) & 1) + in snd_rme96_getmontracks()
544 (((rme96->wcreg >> RME96_WCR_BITPOS_MONITOR_1) & 1) << 1); in snd_rme96_getmontracks()
552 rme96->wcreg |= RME96_WCR_MONITOR_0; in snd_rme96_setmontracks()
554 rme96->wcreg &= ~RME96_WCR_MONITOR_0; in snd_rme96_setmontracks()
557 rme96->wcreg |= RME96_WCR_MONITOR_1; in snd_rme96_setmontracks()
559 rme96->wcreg &= ~RME96_WCR_MONITOR_1; in snd_rme96_setmontracks()
561 writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER); in snd_rme96_setmontracks()
568 return ((rme96->wcreg >> RME96_WCR_BITPOS_GAIN_0) & 1) + in snd_rme96_getattenuation()
569 (((rme96->wcreg >> RME96_WCR_BITPOS_GAIN_1) & 1) << 1); in snd_rme96_getattenuation()
578 rme96->wcreg = (rme96->wcreg & ~RME96_WCR_GAIN_0) & in snd_rme96_setattenuation()
582 rme96->wcreg = (rme96->wcreg | RME96_WCR_GAIN_0) & in snd_rme96_setattenuation()
586 rme96->wcreg = (rme96->wcreg & ~RME96_WCR_GAIN_0) | in snd_rme96_setattenuation()
590 rme96->wcreg = (rme96->wcreg | RME96_WCR_GAIN_0) | in snd_rme96_setattenuation()
594 return -EINVAL; in snd_rme96_setattenuation()
596 writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER); in snd_rme96_setattenuation()
604 int n, rate; in snd_rme96_capture_getrate() local
607 if (rme96->areg & RME96_AR_ANALOG) { in snd_rme96_capture_getrate()
609 n = ((rme96->areg >> RME96_AR_BITPOS_F0) & 1) + in snd_rme96_capture_getrate()
610 (((rme96->areg >> RME96_AR_BITPOS_F1) & 1) << 1); in snd_rme96_capture_getrate()
613 rate = 32000; in snd_rme96_capture_getrate()
616 rate = 44100; in snd_rme96_capture_getrate()
619 rate = 48000; in snd_rme96_capture_getrate()
622 return -1; in snd_rme96_capture_getrate()
624 return (rme96->areg & RME96_AR_BITPOS_F2) ? rate << 1 : rate; in snd_rme96_capture_getrate()
627 rme96->rcreg = readl(rme96->iobase + RME96_IO_CONTROL_REGISTER); in snd_rme96_capture_getrate()
628 if (rme96->rcreg & RME96_RCR_LOCK) { in snd_rme96_capture_getrate()
629 /* ADAT rate */ in snd_rme96_capture_getrate()
631 if (rme96->rcreg & RME96_RCR_T_OUT) { in snd_rme96_capture_getrate()
637 if (rme96->rcreg & RME96_RCR_VERF) { in snd_rme96_capture_getrate()
638 return -1; in snd_rme96_capture_getrate()
641 /* S/PDIF rate */ in snd_rme96_capture_getrate()
642 n = ((rme96->rcreg >> RME96_RCR_BITPOS_F0) & 1) + in snd_rme96_capture_getrate()
643 (((rme96->rcreg >> RME96_RCR_BITPOS_F1) & 1) << 1) + in snd_rme96_capture_getrate()
644 (((rme96->rcreg >> RME96_RCR_BITPOS_F2) & 1) << 2); in snd_rme96_capture_getrate()
648 if (rme96->rcreg & RME96_RCR_T_OUT) { in snd_rme96_capture_getrate()
651 return -1; in snd_rme96_capture_getrate()
660 return -1; in snd_rme96_capture_getrate()
666 int rate, dummy; in snd_rme96_playback_getrate() local
668 if (!(rme96->wcreg & RME96_WCR_MASTER) && in snd_rme96_playback_getrate()
670 rate = snd_rme96_capture_getrate(rme96, &dummy); in snd_rme96_playback_getrate()
671 if (rate > 0) { in snd_rme96_playback_getrate()
673 return rate; in snd_rme96_playback_getrate()
677 rate = ((rme96->wcreg >> RME96_WCR_BITPOS_FREQ_0) & 1) + in snd_rme96_playback_getrate()
678 (((rme96->wcreg >> RME96_WCR_BITPOS_FREQ_1) & 1) << 1); in snd_rme96_playback_getrate()
679 switch (rate) { in snd_rme96_playback_getrate()
681 rate = 32000; in snd_rme96_playback_getrate()
684 rate = 44100; in snd_rme96_playback_getrate()
687 rate = 48000; in snd_rme96_playback_getrate()
690 return -1; in snd_rme96_playback_getrate()
692 return (rme96->wcreg & RME96_WCR_DS) ? rate << 1 : rate; in snd_rme96_playback_getrate()
697 int rate) in snd_rme96_playback_setrate() argument
701 ds = rme96->wcreg & RME96_WCR_DS; in snd_rme96_playback_setrate()
702 switch (rate) { in snd_rme96_playback_setrate()
704 rme96->wcreg &= ~RME96_WCR_DS; in snd_rme96_playback_setrate()
705 rme96->wcreg = (rme96->wcreg | RME96_WCR_FREQ_0) & in snd_rme96_playback_setrate()
709 rme96->wcreg &= ~RME96_WCR_DS; in snd_rme96_playback_setrate()
710 rme96->wcreg = (rme96->wcreg | RME96_WCR_FREQ_1) & in snd_rme96_playback_setrate()
714 rme96->wcreg &= ~RME96_WCR_DS; in snd_rme96_playback_setrate()
715 rme96->wcreg = (rme96->wcreg | RME96_WCR_FREQ_0) | in snd_rme96_playback_setrate()
719 rme96->wcreg |= RME96_WCR_DS; in snd_rme96_playback_setrate()
720 rme96->wcreg = (rme96->wcreg | RME96_WCR_FREQ_0) & in snd_rme96_playback_setrate()
724 rme96->wcreg |= RME96_WCR_DS; in snd_rme96_playback_setrate()
725 rme96->wcreg = (rme96->wcreg | RME96_WCR_FREQ_1) & in snd_rme96_playback_setrate()
729 rme96->wcreg |= RME96_WCR_DS; in snd_rme96_playback_setrate()
730 rme96->wcreg = (rme96->wcreg | RME96_WCR_FREQ_0) | in snd_rme96_playback_setrate()
734 return -EINVAL; in snd_rme96_playback_setrate()
736 if ((!ds && rme96->wcreg & RME96_WCR_DS) || in snd_rme96_playback_setrate()
737 (ds && !(rme96->wcreg & RME96_WCR_DS))) in snd_rme96_playback_setrate()
739 /* change to/from double-speed: reset the DAC (if available) */ in snd_rme96_playback_setrate()
743 writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER); in snd_rme96_playback_setrate()
750 int rate) in snd_rme96_capture_analog_setrate() argument
752 switch (rate) { in snd_rme96_capture_analog_setrate()
754 rme96->areg = ((rme96->areg | RME96_AR_FREQPAD_0) & in snd_rme96_capture_analog_setrate()
758 rme96->areg = ((rme96->areg & ~RME96_AR_FREQPAD_0) | in snd_rme96_capture_analog_setrate()
762 rme96->areg = ((rme96->areg | RME96_AR_FREQPAD_0) | in snd_rme96_capture_analog_setrate()
766 if (rme96->rev < 4) { in snd_rme96_capture_analog_setrate()
767 return -EINVAL; in snd_rme96_capture_analog_setrate()
769 rme96->areg = ((rme96->areg | RME96_AR_FREQPAD_0) & in snd_rme96_capture_analog_setrate()
773 if (rme96->rev < 4) { in snd_rme96_capture_analog_setrate()
774 return -EINVAL; in snd_rme96_capture_analog_setrate()
776 rme96->areg = ((rme96->areg & ~RME96_AR_FREQPAD_0) | in snd_rme96_capture_analog_setrate()
780 rme96->areg = ((rme96->areg | RME96_AR_FREQPAD_0) | in snd_rme96_capture_analog_setrate()
784 return -EINVAL; in snd_rme96_capture_analog_setrate()
786 writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG); in snd_rme96_capture_analog_setrate()
797 rme96->wcreg &= ~RME96_WCR_MASTER; in snd_rme96_setclockmode()
798 rme96->areg &= ~RME96_AR_WSEL; in snd_rme96_setclockmode()
802 rme96->wcreg |= RME96_WCR_MASTER; in snd_rme96_setclockmode()
803 rme96->areg &= ~RME96_AR_WSEL; in snd_rme96_setclockmode()
807 rme96->wcreg |= RME96_WCR_MASTER; in snd_rme96_setclockmode()
808 rme96->areg |= RME96_AR_WSEL; in snd_rme96_setclockmode()
811 return -EINVAL; in snd_rme96_setclockmode()
813 writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER); in snd_rme96_setclockmode()
814 writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG); in snd_rme96_setclockmode()
821 if (rme96->areg & RME96_AR_WSEL) { in snd_rme96_getclockmode()
824 return (rme96->wcreg & RME96_WCR_MASTER) ? RME96_CLOCKMODE_MASTER : in snd_rme96_getclockmode()
836 rme96->wcreg = (rme96->wcreg & ~RME96_WCR_INP_0) & in snd_rme96_setinputtype()
840 rme96->wcreg = (rme96->wcreg | RME96_WCR_INP_0) & in snd_rme96_setinputtype()
844 rme96->wcreg = (rme96->wcreg & ~RME96_WCR_INP_0) | in snd_rme96_setinputtype()
848 if ((rme96->pci->device != PCI_DEVICE_ID_RME_DIGI96_8_PAD_OR_PST && in snd_rme96_setinputtype()
849 rme96->pci->device != PCI_DEVICE_ID_RME_DIGI96_8_PRO) || in snd_rme96_setinputtype()
850 (rme96->pci->device == PCI_DEVICE_ID_RME_DIGI96_8_PAD_OR_PST && in snd_rme96_setinputtype()
851 rme96->rev > 4)) in snd_rme96_setinputtype()
854 return -EINVAL; in snd_rme96_setinputtype()
856 rme96->wcreg = (rme96->wcreg | RME96_WCR_INP_0) | in snd_rme96_setinputtype()
861 return -EINVAL; in snd_rme96_setinputtype()
863 rme96->areg |= RME96_AR_ANALOG; in snd_rme96_setinputtype()
864 writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG); in snd_rme96_setinputtype()
865 if (rme96->rev < 4) { in snd_rme96_setinputtype()
879 return -EINVAL; in snd_rme96_setinputtype()
882 rme96->areg &= ~RME96_AR_ANALOG; in snd_rme96_setinputtype()
883 writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG); in snd_rme96_setinputtype()
885 writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER); in snd_rme96_setinputtype()
892 if (rme96->areg & RME96_AR_ANALOG) { in snd_rme96_getinputtype()
895 return ((rme96->wcreg >> RME96_WCR_BITPOS_INP_0) & 1) + in snd_rme96_getinputtype()
896 (((rme96->wcreg >> RME96_WCR_BITPOS_INP_1) & 1) << 1); in snd_rme96_getinputtype()
913 frlog += (rme96->wcreg & RME96_WCR_MODE24) ? 2 : 1; in snd_rme96_setframelog()
914 rme96->playback_frlog = frlog; in snd_rme96_setframelog()
916 frlog += (rme96->wcreg & RME96_WCR_MODE24_2) ? 2 : 1; in snd_rme96_setframelog()
917 rme96->capture_frlog = frlog; in snd_rme96_setframelog()
926 rme96->wcreg &= ~RME96_WCR_MODE24; in snd_rme96_playback_setformat()
929 rme96->wcreg |= RME96_WCR_MODE24; in snd_rme96_playback_setformat()
932 return -EINVAL; in snd_rme96_playback_setformat()
934 writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER); in snd_rme96_playback_setformat()
943 rme96->wcreg &= ~RME96_WCR_MODE24_2; in snd_rme96_capture_setformat()
946 rme96->wcreg |= RME96_WCR_MODE24_2; in snd_rme96_capture_setformat()
949 return -EINVAL; in snd_rme96_capture_setformat()
951 writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER); in snd_rme96_capture_setformat()
961 rme96->wcreg &= ~RME96_WCR_ISEL; in snd_rme96_set_period_properties()
964 rme96->wcreg |= RME96_WCR_ISEL; in snd_rme96_set_period_properties()
970 rme96->wcreg &= ~RME96_WCR_IDIS; in snd_rme96_set_period_properties()
971 writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER); in snd_rme96_set_period_properties()
979 struct snd_pcm_runtime *runtime = substream->runtime; in snd_rme96_playback_hw_params()
980 int err, rate, dummy; in snd_rme96_playback_hw_params() local
983 runtime->dma_area = (void __force *)(rme96->iobase + in snd_rme96_playback_hw_params()
985 runtime->dma_addr = rme96->port + RME96_IO_PLAY_BUFFER; in snd_rme96_playback_hw_params()
986 runtime->dma_bytes = RME96_BUFFER_SIZE; in snd_rme96_playback_hw_params()
988 spin_lock_irq(&rme96->lock); in snd_rme96_playback_hw_params()
989 rate = 0; in snd_rme96_playback_hw_params()
990 if (!(rme96->wcreg & RME96_WCR_MASTER) && in snd_rme96_playback_hw_params()
992 rate = snd_rme96_capture_getrate(rme96, &dummy); in snd_rme96_playback_hw_params()
993 if (rate > 0) { in snd_rme96_playback_hw_params()
995 if ((int)params_rate(params) != rate) { in snd_rme96_playback_hw_params()
996 err = -EIO; in snd_rme96_playback_hw_params()
1010 if (rme96->capture_periodsize != 0) { in snd_rme96_playback_hw_params()
1011 if (params_period_size(params) << rme96->playback_frlog != in snd_rme96_playback_hw_params()
1012 rme96->capture_periodsize) in snd_rme96_playback_hw_params()
1014 err = -EBUSY; in snd_rme96_playback_hw_params()
1018 rme96->playback_periodsize = in snd_rme96_playback_hw_params()
1019 params_period_size(params) << rme96->playback_frlog; in snd_rme96_playback_hw_params()
1020 snd_rme96_set_period_properties(rme96, rme96->playback_periodsize); in snd_rme96_playback_hw_params()
1022 if ((rme96->wcreg & RME96_WCR_ADAT) == 0) { in snd_rme96_playback_hw_params()
1023 rme96->wcreg &= ~(RME96_WCR_PRO | RME96_WCR_DOLBY | RME96_WCR_EMP); in snd_rme96_playback_hw_params()
1024 writel(rme96->wcreg |= rme96->wcreg_spdif_stream, rme96->iobase + RME96_IO_CONTROL_REGISTER); in snd_rme96_playback_hw_params()
1029 spin_unlock_irq(&rme96->lock); in snd_rme96_playback_hw_params()
1043 struct snd_pcm_runtime *runtime = substream->runtime; in snd_rme96_capture_hw_params()
1044 int err, isadat, rate; in snd_rme96_capture_hw_params() local
1046 runtime->dma_area = (void __force *)(rme96->iobase + in snd_rme96_capture_hw_params()
1048 runtime->dma_addr = rme96->port + RME96_IO_REC_BUFFER; in snd_rme96_capture_hw_params()
1049 runtime->dma_bytes = RME96_BUFFER_SIZE; in snd_rme96_capture_hw_params()
1051 spin_lock_irq(&rme96->lock); in snd_rme96_capture_hw_params()
1054 spin_unlock_irq(&rme96->lock); in snd_rme96_capture_hw_params()
1060 spin_unlock_irq(&rme96->lock); in snd_rme96_capture_hw_params()
1064 rate = snd_rme96_capture_getrate(rme96, &isadat); in snd_rme96_capture_hw_params()
1065 if (rate > 0) { in snd_rme96_capture_hw_params()
1066 if ((int)params_rate(params) != rate) { in snd_rme96_capture_hw_params()
1067 spin_unlock_irq(&rme96->lock); in snd_rme96_capture_hw_params()
1068 return -EIO; in snd_rme96_capture_hw_params()
1070 if ((isadat && runtime->hw.channels_min == 2) || in snd_rme96_capture_hw_params()
1071 (!isadat && runtime->hw.channels_min == 8)) { in snd_rme96_capture_hw_params()
1072 spin_unlock_irq(&rme96->lock); in snd_rme96_capture_hw_params()
1073 return -EIO; in snd_rme96_capture_hw_params()
1078 if (rme96->playback_periodsize != 0) { in snd_rme96_capture_hw_params()
1079 if (params_period_size(params) << rme96->capture_frlog != in snd_rme96_capture_hw_params()
1080 rme96->playback_periodsize) in snd_rme96_capture_hw_params()
1082 spin_unlock_irq(&rme96->lock); in snd_rme96_capture_hw_params()
1083 return -EBUSY; in snd_rme96_capture_hw_params()
1086 rme96->capture_periodsize = in snd_rme96_capture_hw_params()
1087 params_period_size(params) << rme96->capture_frlog; in snd_rme96_capture_hw_params()
1088 snd_rme96_set_period_properties(rme96, rme96->capture_periodsize); in snd_rme96_capture_hw_params()
1089 spin_unlock_irq(&rme96->lock); in snd_rme96_capture_hw_params()
1099 writel(0, rme96->iobase + RME96_IO_RESET_PLAY_POS); in snd_rme96_trigger()
1101 writel(0, rme96->iobase + RME96_IO_RESET_REC_POS); in snd_rme96_trigger()
1103 rme96->rcreg = readl(rme96->iobase + RME96_IO_CONTROL_REGISTER); in snd_rme96_trigger()
1104 if (rme96->rcreg & RME96_RCR_IRQ) in snd_rme96_trigger()
1105 writel(0, rme96->iobase + RME96_IO_CONFIRM_PLAY_IRQ); in snd_rme96_trigger()
1108 rme96->rcreg = readl(rme96->iobase + RME96_IO_CONTROL_REGISTER); in snd_rme96_trigger()
1109 if (rme96->rcreg & RME96_RCR_IRQ_2) in snd_rme96_trigger()
1110 writel(0, rme96->iobase + RME96_IO_CONFIRM_REC_IRQ); in snd_rme96_trigger()
1113 rme96->wcreg |= RME96_WCR_START; in snd_rme96_trigger()
1115 rme96->wcreg &= ~RME96_WCR_START; in snd_rme96_trigger()
1117 rme96->wcreg |= RME96_WCR_START_2; in snd_rme96_trigger()
1119 rme96->wcreg &= ~RME96_WCR_START_2; in snd_rme96_trigger()
1120 writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER); in snd_rme96_trigger()
1131 rme96->rcreg = readl(rme96->iobase + RME96_IO_CONTROL_REGISTER); in snd_rme96_interrupt()
1133 if (!((rme96->rcreg & RME96_RCR_IRQ) || in snd_rme96_interrupt()
1134 (rme96->rcreg & RME96_RCR_IRQ_2))) in snd_rme96_interrupt()
1139 if (rme96->rcreg & RME96_RCR_IRQ) { in snd_rme96_interrupt()
1141 snd_pcm_period_elapsed(rme96->playback_substream); in snd_rme96_interrupt()
1142 writel(0, rme96->iobase + RME96_IO_CONFIRM_PLAY_IRQ); in snd_rme96_interrupt()
1144 if (rme96->rcreg & RME96_RCR_IRQ_2) { in snd_rme96_interrupt()
1146 snd_pcm_period_elapsed(rme96->capture_substream); in snd_rme96_interrupt()
1147 writel(0, rme96->iobase + RME96_IO_CONFIRM_REC_IRQ); in snd_rme96_interrupt()
1168 size = rme96->playback_periodsize; in rme96_set_buffer_size_constraint()
1170 size = rme96->capture_periodsize; in rme96_set_buffer_size_constraint()
1184 int rate, dummy; in snd_rme96_playback_spdif_open() local
1186 struct snd_pcm_runtime *runtime = substream->runtime; in snd_rme96_playback_spdif_open()
1189 spin_lock_irq(&rme96->lock); in snd_rme96_playback_spdif_open()
1190 if (rme96->playback_substream) { in snd_rme96_playback_spdif_open()
1191 spin_unlock_irq(&rme96->lock); in snd_rme96_playback_spdif_open()
1192 return -EBUSY; in snd_rme96_playback_spdif_open()
1194 rme96->wcreg &= ~RME96_WCR_ADAT; in snd_rme96_playback_spdif_open()
1195 writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER); in snd_rme96_playback_spdif_open()
1196 rme96->playback_substream = substream; in snd_rme96_playback_spdif_open()
1197 spin_unlock_irq(&rme96->lock); in snd_rme96_playback_spdif_open()
1199 runtime->hw = snd_rme96_playback_spdif_info; in snd_rme96_playback_spdif_open()
1200 if (!(rme96->wcreg & RME96_WCR_MASTER) && in snd_rme96_playback_spdif_open()
1202 rate = snd_rme96_capture_getrate(rme96, &dummy); in snd_rme96_playback_spdif_open()
1203 if (rate > 0) { in snd_rme96_playback_spdif_open()
1205 runtime->hw.rates = snd_pcm_rate_to_rate_bit(rate); in snd_rme96_playback_spdif_open()
1206 runtime->hw.rate_min = rate; in snd_rme96_playback_spdif_open()
1207 runtime->hw.rate_max = rate; in snd_rme96_playback_spdif_open()
1212 rme96->wcreg_spdif_stream = rme96->wcreg_spdif; in snd_rme96_playback_spdif_open()
1213 rme96->spdif_ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE; in snd_rme96_playback_spdif_open()
1214 snd_ctl_notify(rme96->card, SNDRV_CTL_EVENT_MASK_VALUE | in snd_rme96_playback_spdif_open()
1215 SNDRV_CTL_EVENT_MASK_INFO, &rme96->spdif_ctl->id); in snd_rme96_playback_spdif_open()
1222 int isadat, rate; in snd_rme96_capture_spdif_open() local
1224 struct snd_pcm_runtime *runtime = substream->runtime; in snd_rme96_capture_spdif_open()
1227 runtime->hw = snd_rme96_capture_spdif_info; in snd_rme96_capture_spdif_open()
1229 rate = snd_rme96_capture_getrate(rme96, &isadat); in snd_rme96_capture_spdif_open()
1230 if (rate > 0) { in snd_rme96_capture_spdif_open()
1232 return -EIO; in snd_rme96_capture_spdif_open()
1233 runtime->hw.rates = snd_pcm_rate_to_rate_bit(rate); in snd_rme96_capture_spdif_open()
1234 runtime->hw.rate_min = rate; in snd_rme96_capture_spdif_open()
1235 runtime->hw.rate_max = rate; in snd_rme96_capture_spdif_open()
1239 spin_lock_irq(&rme96->lock); in snd_rme96_capture_spdif_open()
1240 if (rme96->capture_substream) { in snd_rme96_capture_spdif_open()
1241 spin_unlock_irq(&rme96->lock); in snd_rme96_capture_spdif_open()
1242 return -EBUSY; in snd_rme96_capture_spdif_open()
1244 rme96->capture_substream = substream; in snd_rme96_capture_spdif_open()
1245 spin_unlock_irq(&rme96->lock); in snd_rme96_capture_spdif_open()
1254 int rate, dummy; in snd_rme96_playback_adat_open() local
1256 struct snd_pcm_runtime *runtime = substream->runtime; in snd_rme96_playback_adat_open()
1259 spin_lock_irq(&rme96->lock); in snd_rme96_playback_adat_open()
1260 if (rme96->playback_substream) { in snd_rme96_playback_adat_open()
1261 spin_unlock_irq(&rme96->lock); in snd_rme96_playback_adat_open()
1262 return -EBUSY; in snd_rme96_playback_adat_open()
1264 rme96->wcreg |= RME96_WCR_ADAT; in snd_rme96_playback_adat_open()
1265 writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER); in snd_rme96_playback_adat_open()
1266 rme96->playback_substream = substream; in snd_rme96_playback_adat_open()
1267 spin_unlock_irq(&rme96->lock); in snd_rme96_playback_adat_open()
1269 runtime->hw = snd_rme96_playback_adat_info; in snd_rme96_playback_adat_open()
1270 if (!(rme96->wcreg & RME96_WCR_MASTER) && in snd_rme96_playback_adat_open()
1272 rate = snd_rme96_capture_getrate(rme96, &dummy); in snd_rme96_playback_adat_open()
1273 if (rate > 0) { in snd_rme96_playback_adat_open()
1275 runtime->hw.rates = snd_pcm_rate_to_rate_bit(rate); in snd_rme96_playback_adat_open()
1276 runtime->hw.rate_min = rate; in snd_rme96_playback_adat_open()
1277 runtime->hw.rate_max = rate; in snd_rme96_playback_adat_open()
1288 int isadat, rate; in snd_rme96_capture_adat_open() local
1290 struct snd_pcm_runtime *runtime = substream->runtime; in snd_rme96_capture_adat_open()
1293 runtime->hw = snd_rme96_capture_adat_info; in snd_rme96_capture_adat_open()
1296 expension cards AEB4/8-I are RME96_INPUT_INTERNAL */ in snd_rme96_capture_adat_open()
1297 return -EIO; in snd_rme96_capture_adat_open()
1299 rate = snd_rme96_capture_getrate(rme96, &isadat); in snd_rme96_capture_adat_open()
1300 if (rate > 0) { in snd_rme96_capture_adat_open()
1302 return -EIO; in snd_rme96_capture_adat_open()
1304 runtime->hw.rates = snd_pcm_rate_to_rate_bit(rate); in snd_rme96_capture_adat_open()
1305 runtime->hw.rate_min = rate; in snd_rme96_capture_adat_open()
1306 runtime->hw.rate_max = rate; in snd_rme96_capture_adat_open()
1309 spin_lock_irq(&rme96->lock); in snd_rme96_capture_adat_open()
1310 if (rme96->capture_substream) { in snd_rme96_capture_adat_open()
1311 spin_unlock_irq(&rme96->lock); in snd_rme96_capture_adat_open()
1312 return -EBUSY; in snd_rme96_capture_adat_open()
1314 rme96->capture_substream = substream; in snd_rme96_capture_adat_open()
1315 spin_unlock_irq(&rme96->lock); in snd_rme96_capture_adat_open()
1327 spin_lock_irq(&rme96->lock); in snd_rme96_playback_close()
1331 rme96->playback_substream = NULL; in snd_rme96_playback_close()
1332 rme96->playback_periodsize = 0; in snd_rme96_playback_close()
1333 spdif = (rme96->wcreg & RME96_WCR_ADAT) == 0; in snd_rme96_playback_close()
1334 spin_unlock_irq(&rme96->lock); in snd_rme96_playback_close()
1336 rme96->spdif_ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE; in snd_rme96_playback_close()
1337 snd_ctl_notify(rme96->card, SNDRV_CTL_EVENT_MASK_VALUE | in snd_rme96_playback_close()
1338 SNDRV_CTL_EVENT_MASK_INFO, &rme96->spdif_ctl->id); in snd_rme96_playback_close()
1348 spin_lock_irq(&rme96->lock); in snd_rme96_capture_close()
1352 rme96->capture_substream = NULL; in snd_rme96_capture_close()
1353 rme96->capture_periodsize = 0; in snd_rme96_capture_close()
1354 spin_unlock_irq(&rme96->lock); in snd_rme96_capture_close()
1363 spin_lock_irq(&rme96->lock); in snd_rme96_playback_prepare()
1367 writel(0, rme96->iobase + RME96_IO_RESET_PLAY_POS); in snd_rme96_playback_prepare()
1368 spin_unlock_irq(&rme96->lock); in snd_rme96_playback_prepare()
1377 spin_lock_irq(&rme96->lock); in snd_rme96_capture_prepare()
1381 writel(0, rme96->iobase + RME96_IO_RESET_REC_POS); in snd_rme96_capture_prepare()
1382 spin_unlock_irq(&rme96->lock); in snd_rme96_capture_prepare()
1399 sync = (rme96->playback_substream && rme96->capture_substream) && in snd_rme96_playback_trigger()
1400 (rme96->playback_substream->group == in snd_rme96_playback_trigger()
1401 rme96->capture_substream->group); in snd_rme96_playback_trigger()
1406 if (substream != rme96->playback_substream) in snd_rme96_playback_trigger()
1407 return -EBUSY; in snd_rme96_playback_trigger()
1416 if (substream != rme96->playback_substream) in snd_rme96_playback_trigger()
1417 return -EBUSY; in snd_rme96_playback_trigger()
1437 return -EINVAL; in snd_rme96_playback_trigger()
1456 sync = (rme96->playback_substream && rme96->capture_substream) && in snd_rme96_capture_trigger()
1457 (rme96->playback_substream->group == in snd_rme96_capture_trigger()
1458 rme96->capture_substream->group); in snd_rme96_capture_trigger()
1463 if (substream != rme96->capture_substream) in snd_rme96_capture_trigger()
1464 return -EBUSY; in snd_rme96_capture_trigger()
1473 if (substream != rme96->capture_substream) in snd_rme96_capture_trigger()
1474 return -EBUSY; in snd_rme96_capture_trigger()
1494 return -EINVAL; in snd_rme96_capture_trigger()
1567 if (rme96->irq >= 0) { in snd_rme96_free()
1569 rme96->areg &= ~RME96_AR_DAC_EN; in snd_rme96_free()
1570 writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG); in snd_rme96_free()
1573 vfree(rme96->playback_suspend_buffer); in snd_rme96_free()
1574 vfree(rme96->capture_suspend_buffer); in snd_rme96_free()
1581 struct rme96 *rme96 = pcm->private_data; in snd_rme96_free_spdif_pcm()
1582 rme96->spdif_pcm = NULL; in snd_rme96_free_spdif_pcm()
1588 struct rme96 *rme96 = pcm->private_data; in snd_rme96_free_adat_pcm()
1589 rme96->adat_pcm = NULL; in snd_rme96_free_adat_pcm()
1595 struct pci_dev *pci = rme96->pci; in snd_rme96_create()
1598 rme96->irq = -1; in snd_rme96_create()
1599 spin_lock_init(&rme96->lock); in snd_rme96_create()
1608 rme96->port = pci_resource_start(rme96->pci, 0); in snd_rme96_create()
1610 rme96->iobase = devm_ioremap(&pci->dev, rme96->port, RME96_IO_SIZE); in snd_rme96_create()
1611 if (!rme96->iobase) { in snd_rme96_create()
1612 dev_err(rme96->card->dev, in snd_rme96_create()
1613 "unable to remap memory region 0x%lx-0x%lx\n", in snd_rme96_create()
1614 rme96->port, rme96->port + RME96_IO_SIZE - 1); in snd_rme96_create()
1615 return -EBUSY; in snd_rme96_create()
1618 if (devm_request_irq(&pci->dev, pci->irq, snd_rme96_interrupt, in snd_rme96_create()
1620 dev_err(rme96->card->dev, "unable to grab IRQ %d\n", pci->irq); in snd_rme96_create()
1621 return -EBUSY; in snd_rme96_create()
1623 rme96->irq = pci->irq; in snd_rme96_create()
1624 rme96->card->sync_irq = rme96->irq; in snd_rme96_create()
1627 pci_read_config_byte(pci, 8, &rme96->rev); in snd_rme96_create()
1630 err = snd_pcm_new(rme96->card, "Digi96 IEC958", 0, in snd_rme96_create()
1631 1, 1, &rme96->spdif_pcm); in snd_rme96_create()
1635 rme96->spdif_pcm->private_data = rme96; in snd_rme96_create()
1636 rme96->spdif_pcm->private_free = snd_rme96_free_spdif_pcm; in snd_rme96_create()
1637 strcpy(rme96->spdif_pcm->name, "Digi96 IEC958"); in snd_rme96_create()
1638 snd_pcm_set_ops(rme96->spdif_pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_rme96_playback_spdif_ops); in snd_rme96_create()
1639 snd_pcm_set_ops(rme96->spdif_pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_rme96_capture_spdif_ops); in snd_rme96_create()
1641 rme96->spdif_pcm->info_flags = 0; in snd_rme96_create()
1644 if (pci->device == PCI_DEVICE_ID_RME_DIGI96) { in snd_rme96_create()
1646 rme96->adat_pcm = NULL; in snd_rme96_create()
1648 err = snd_pcm_new(rme96->card, "Digi96 ADAT", 1, in snd_rme96_create()
1649 1, 1, &rme96->adat_pcm); in snd_rme96_create()
1652 rme96->adat_pcm->private_data = rme96; in snd_rme96_create()
1653 rme96->adat_pcm->private_free = snd_rme96_free_adat_pcm; in snd_rme96_create()
1654 strcpy(rme96->adat_pcm->name, "Digi96 ADAT"); in snd_rme96_create()
1655 snd_pcm_set_ops(rme96->adat_pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_rme96_playback_adat_ops); in snd_rme96_create()
1656 snd_pcm_set_ops(rme96->adat_pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_rme96_capture_adat_ops); in snd_rme96_create()
1658 rme96->adat_pcm->info_flags = 0; in snd_rme96_create()
1661 rme96->playback_periodsize = 0; in snd_rme96_create()
1662 rme96->capture_periodsize = 0; in snd_rme96_create()
1668 rme96->wcreg = in snd_rme96_create()
1674 rme96->areg = RME96_AR_FREQPAD_1; /* set 44.1 kHz analog capture */ in snd_rme96_create()
1676 writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER); in snd_rme96_create()
1677 writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG); in snd_rme96_create()
1680 writel(rme96->areg | RME96_AR_PD2, in snd_rme96_create()
1681 rme96->iobase + RME96_IO_ADDITIONAL_REG); in snd_rme96_create()
1682 writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG); in snd_rme96_create()
1686 rme96->areg |= RME96_AR_DAC_EN; in snd_rme96_create()
1687 writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG); in snd_rme96_create()
1690 writel(0, rme96->iobase + RME96_IO_RESET_PLAY_POS); in snd_rme96_create()
1691 writel(0, rme96->iobase + RME96_IO_RESET_REC_POS); in snd_rme96_create()
1694 rme96->vol[0] = rme96->vol[1] = 0; in snd_rme96_create()
1700 err = snd_rme96_create_switches(rme96->card, rme96); in snd_rme96_create()
1718 struct rme96 *rme96 = entry->private_data; in snd_rme96_proc_read()
1720 rme96->rcreg = readl(rme96->iobase + RME96_IO_CONTROL_REGISTER); in snd_rme96_proc_read()
1722 snd_iprintf(buffer, rme96->card->longname); in snd_rme96_proc_read()
1723 snd_iprintf(buffer, " (index #%d)\n", rme96->card->number + 1); in snd_rme96_proc_read()
1726 if (rme96->wcreg & RME96_WCR_IDIS) { in snd_rme96_proc_read()
1729 } else if (rme96->wcreg & RME96_WCR_ISEL) { in snd_rme96_proc_read()
1753 snd_iprintf(buffer, "\n sample rate: no valid signal\n"); in snd_rme96_proc_read()
1760 snd_iprintf(buffer, " sample rate: %d Hz\n", in snd_rme96_proc_read()
1763 if (rme96->wcreg & RME96_WCR_MODE24_2) { in snd_rme96_proc_read()
1764 snd_iprintf(buffer, " sample format: 24 bit\n"); in snd_rme96_proc_read()
1766 snd_iprintf(buffer, " sample format: 16 bit\n"); in snd_rme96_proc_read()
1770 if (rme96->wcreg & RME96_WCR_SEL) { in snd_rme96_proc_read()
1775 snd_iprintf(buffer, " sample rate: %d Hz\n", in snd_rme96_proc_read()
1777 if (rme96->wcreg & RME96_WCR_MODE24) { in snd_rme96_proc_read()
1778 snd_iprintf(buffer, " sample format: 24 bit\n"); in snd_rme96_proc_read()
1780 snd_iprintf(buffer, " sample format: 16 bit\n"); in snd_rme96_proc_read()
1782 if (rme96->areg & RME96_AR_WSEL) { in snd_rme96_proc_read()
1783 snd_iprintf(buffer, " sample clock source: word clock\n"); in snd_rme96_proc_read()
1784 } else if (rme96->wcreg & RME96_WCR_MASTER) { in snd_rme96_proc_read()
1785 snd_iprintf(buffer, " sample clock source: internal\n"); in snd_rme96_proc_read()
1787 …snd_iprintf(buffer, " sample clock source: autosync (internal anyway due to analog input setting)… in snd_rme96_proc_read()
1789 snd_iprintf(buffer, " sample clock source: autosync (internal anyway due to no valid signal)\n"); in snd_rme96_proc_read()
1791 snd_iprintf(buffer, " sample clock source: autosync\n"); in snd_rme96_proc_read()
1793 if (rme96->wcreg & RME96_WCR_PRO) { in snd_rme96_proc_read()
1798 if (rme96->wcreg & RME96_WCR_EMP) { in snd_rme96_proc_read()
1803 if (rme96->wcreg & RME96_WCR_DOLBY) { in snd_rme96_proc_read()
1804 snd_iprintf(buffer, " non-audio (dolby): on\n"); in snd_rme96_proc_read()
1806 snd_iprintf(buffer, " non-audio (dolby): off\n"); in snd_rme96_proc_read()
1829 snd_iprintf(buffer, " attenuation: -6 dB\n"); in snd_rme96_proc_read()
1832 snd_iprintf(buffer, " attenuation: -12 dB\n"); in snd_rme96_proc_read()
1835 snd_iprintf(buffer, " attenuation: -18 dB\n"); in snd_rme96_proc_read()
1838 snd_iprintf(buffer, " volume left: %u\n", rme96->vol[0]); in snd_rme96_proc_read()
1839 snd_iprintf(buffer, " volume right: %u\n", rme96->vol[1]); in snd_rme96_proc_read()
1845 snd_card_ro_proc_new(rme96->card, "rme96", rme96, snd_rme96_proc_read); in snd_rme96_proc_init()
1859 spin_lock_irq(&rme96->lock); in snd_rme96_get_loopback_control()
1860 ucontrol->value.integer.value[0] = rme96->wcreg & RME96_WCR_SEL ? 0 : 1; in snd_rme96_get_loopback_control()
1861 spin_unlock_irq(&rme96->lock); in snd_rme96_get_loopback_control()
1871 val = ucontrol->value.integer.value[0] ? 0 : RME96_WCR_SEL; in snd_rme96_put_loopback_control()
1872 spin_lock_irq(&rme96->lock); in snd_rme96_put_loopback_control()
1873 val = (rme96->wcreg & ~RME96_WCR_SEL) | val; in snd_rme96_put_loopback_control()
1874 change = val != rme96->wcreg; in snd_rme96_put_loopback_control()
1875 rme96->wcreg = val; in snd_rme96_put_loopback_control()
1876 writel(val, rme96->iobase + RME96_IO_CONTROL_REGISTER); in snd_rme96_put_loopback_control()
1877 spin_unlock_irq(&rme96->lock); in snd_rme96_put_loopback_control()
1893 switch (rme96->pci->device) { in snd_rme96_info_inputtype_control()
1902 if (rme96->rev > 4) { in snd_rme96_info_inputtype_control()
1913 return -EINVAL; in snd_rme96_info_inputtype_control()
1923 spin_lock_irq(&rme96->lock); in snd_rme96_get_inputtype_control()
1924 ucontrol->value.enumerated.item[0] = snd_rme96_getinputtype(rme96); in snd_rme96_get_inputtype_control()
1926 switch (rme96->pci->device) { in snd_rme96_get_inputtype_control()
1935 if (rme96->rev > 4) { in snd_rme96_get_inputtype_control()
1937 if (ucontrol->value.enumerated.item[0] == RME96_INPUT_ANALOG) { in snd_rme96_get_inputtype_control()
1938 ucontrol->value.enumerated.item[0] = RME96_INPUT_XLR; in snd_rme96_get_inputtype_control()
1949 if (ucontrol->value.enumerated.item[0] >= items) { in snd_rme96_get_inputtype_control()
1950 ucontrol->value.enumerated.item[0] = items - 1; in snd_rme96_get_inputtype_control()
1953 spin_unlock_irq(&rme96->lock); in snd_rme96_get_inputtype_control()
1963 switch (rme96->pci->device) { in snd_rme96_put_inputtype_control()
1972 if (rme96->rev > 4) { in snd_rme96_put_inputtype_control()
1982 val = ucontrol->value.enumerated.item[0] % items; in snd_rme96_put_inputtype_control()
1985 if (rme96->pci->device == PCI_DEVICE_ID_RME_DIGI96_8_PAD_OR_PST && rme96->rev > 4) { in snd_rme96_put_inputtype_control()
1991 spin_lock_irq(&rme96->lock); in snd_rme96_put_inputtype_control()
1994 spin_unlock_irq(&rme96->lock); in snd_rme96_put_inputtype_control()
2010 spin_lock_irq(&rme96->lock); in snd_rme96_get_clockmode_control()
2011 ucontrol->value.enumerated.item[0] = snd_rme96_getclockmode(rme96); in snd_rme96_get_clockmode_control()
2012 spin_unlock_irq(&rme96->lock); in snd_rme96_get_clockmode_control()
2022 val = ucontrol->value.enumerated.item[0] % 3; in snd_rme96_put_clockmode_control()
2023 spin_lock_irq(&rme96->lock); in snd_rme96_put_clockmode_control()
2026 spin_unlock_irq(&rme96->lock); in snd_rme96_put_clockmode_control()
2034 "0 dB", "-6 dB", "-12 dB", "-18 dB" in snd_rme96_info_attenuation_control()
2044 spin_lock_irq(&rme96->lock); in snd_rme96_get_attenuation_control()
2045 ucontrol->value.enumerated.item[0] = snd_rme96_getattenuation(rme96); in snd_rme96_get_attenuation_control()
2046 spin_unlock_irq(&rme96->lock); in snd_rme96_get_attenuation_control()
2056 val = ucontrol->value.enumerated.item[0] % 4; in snd_rme96_put_attenuation_control()
2057 spin_lock_irq(&rme96->lock); in snd_rme96_put_attenuation_control()
2061 spin_unlock_irq(&rme96->lock); in snd_rme96_put_attenuation_control()
2077 spin_lock_irq(&rme96->lock); in snd_rme96_get_montracks_control()
2078 ucontrol->value.enumerated.item[0] = snd_rme96_getmontracks(rme96); in snd_rme96_get_montracks_control()
2079 spin_unlock_irq(&rme96->lock); in snd_rme96_get_montracks_control()
2089 val = ucontrol->value.enumerated.item[0] % 4; in snd_rme96_put_montracks_control()
2090 spin_lock_irq(&rme96->lock); in snd_rme96_put_montracks_control()
2093 spin_unlock_irq(&rme96->lock); in snd_rme96_put_montracks_control()
2100 val |= (aes->status[0] & IEC958_AES0_PROFESSIONAL) ? RME96_WCR_PRO : 0; in snd_rme96_convert_from_aes()
2101 val |= (aes->status[0] & IEC958_AES0_NONAUDIO) ? RME96_WCR_DOLBY : 0; in snd_rme96_convert_from_aes()
2103 val |= (aes->status[0] & IEC958_AES0_PRO_EMPHASIS_5015) ? RME96_WCR_EMP : 0; in snd_rme96_convert_from_aes()
2105 val |= (aes->status[0] & IEC958_AES0_CON_EMPHASIS_5015) ? RME96_WCR_EMP : 0; in snd_rme96_convert_from_aes()
2111 aes->status[0] = ((val & RME96_WCR_PRO) ? IEC958_AES0_PROFESSIONAL : 0) | in snd_rme96_convert_to_aes()
2114 aes->status[0] |= (val & RME96_WCR_EMP) ? IEC958_AES0_PRO_EMPHASIS_5015 : 0; in snd_rme96_convert_to_aes()
2116 aes->status[0] |= (val & RME96_WCR_EMP) ? IEC958_AES0_CON_EMPHASIS_5015 : 0; in snd_rme96_convert_to_aes()
2121 uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958; in snd_rme96_control_spdif_info()
2122 uinfo->count = 1; in snd_rme96_control_spdif_info()
2130 snd_rme96_convert_to_aes(&ucontrol->value.iec958, rme96->wcreg_spdif); in snd_rme96_control_spdif_get()
2140 val = snd_rme96_convert_from_aes(&ucontrol->value.iec958); in snd_rme96_control_spdif_put()
2141 spin_lock_irq(&rme96->lock); in snd_rme96_control_spdif_put()
2142 change = val != rme96->wcreg_spdif; in snd_rme96_control_spdif_put()
2143 rme96->wcreg_spdif = val; in snd_rme96_control_spdif_put()
2144 spin_unlock_irq(&rme96->lock); in snd_rme96_control_spdif_put()
2150 uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958; in snd_rme96_control_spdif_stream_info()
2151 uinfo->count = 1; in snd_rme96_control_spdif_stream_info()
2159 snd_rme96_convert_to_aes(&ucontrol->value.iec958, rme96->wcreg_spdif_stream); in snd_rme96_control_spdif_stream_get()
2169 val = snd_rme96_convert_from_aes(&ucontrol->value.iec958); in snd_rme96_control_spdif_stream_put()
2170 spin_lock_irq(&rme96->lock); in snd_rme96_control_spdif_stream_put()
2171 change = val != rme96->wcreg_spdif_stream; in snd_rme96_control_spdif_stream_put()
2172 rme96->wcreg_spdif_stream = val; in snd_rme96_control_spdif_stream_put()
2173 rme96->wcreg &= ~(RME96_WCR_PRO | RME96_WCR_DOLBY | RME96_WCR_EMP); in snd_rme96_control_spdif_stream_put()
2174 rme96->wcreg |= val; in snd_rme96_control_spdif_stream_put()
2175 writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER); in snd_rme96_control_spdif_stream_put()
2176 spin_unlock_irq(&rme96->lock); in snd_rme96_control_spdif_stream_put()
2182 uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958; in snd_rme96_control_spdif_mask_info()
2183 uinfo->count = 1; in snd_rme96_control_spdif_mask_info()
2189 ucontrol->value.iec958.status[0] = kcontrol->private_value; in snd_rme96_control_spdif_mask_get()
2198 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_rme96_dac_volume_info()
2199 uinfo->count = 2; in snd_rme96_dac_volume_info()
2200 uinfo->value.integer.min = 0; in snd_rme96_dac_volume_info()
2201 uinfo->value.integer.max = RME96_185X_MAX_OUT(rme96); in snd_rme96_dac_volume_info()
2210 spin_lock_irq(&rme96->lock); in snd_rme96_dac_volume_get()
2211 u->value.integer.value[0] = rme96->vol[0]; in snd_rme96_dac_volume_get()
2212 u->value.integer.value[1] = rme96->vol[1]; in snd_rme96_dac_volume_get()
2213 spin_unlock_irq(&rme96->lock); in snd_rme96_dac_volume_get()
2227 return -EINVAL; in snd_rme96_dac_volume_put()
2229 spin_lock_irq(&rme96->lock); in snd_rme96_dac_volume_put()
2230 vol = u->value.integer.value[0]; in snd_rme96_dac_volume_put()
2231 if (vol != rme96->vol[0] && vol <= maxvol) { in snd_rme96_dac_volume_put()
2232 rme96->vol[0] = vol; in snd_rme96_dac_volume_put()
2235 vol = u->value.integer.value[1]; in snd_rme96_dac_volume_put()
2236 if (vol != rme96->vol[1] && vol <= maxvol) { in snd_rme96_dac_volume_put()
2237 rme96->vol[1] = vol; in snd_rme96_dac_volume_put()
2242 spin_unlock_irq(&rme96->lock); in snd_rme96_dac_volume_put()
2299 .name = "Sample Clock Source",
2340 rme96->spdif_ctl = kctl; in snd_rme96_create_switches()
2363 struct rme96 *rme96 = card->private_data; in rme96_suspend()
2368 rme96->playback_pointer = readl(rme96->iobase + RME96_IO_GET_PLAY_POS) in rme96_suspend()
2370 rme96->capture_pointer = readl(rme96->iobase + RME96_IO_GET_REC_POS) in rme96_suspend()
2374 memcpy_fromio(rme96->playback_suspend_buffer, in rme96_suspend()
2375 rme96->iobase + RME96_IO_PLAY_BUFFER, RME96_BUFFER_SIZE); in rme96_suspend()
2376 memcpy_fromio(rme96->capture_suspend_buffer, in rme96_suspend()
2377 rme96->iobase + RME96_IO_REC_BUFFER, RME96_BUFFER_SIZE); in rme96_suspend()
2380 rme96->areg &= ~RME96_AR_DAC_EN; in rme96_suspend()
2381 writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG); in rme96_suspend()
2388 struct rme96 *rme96 = card->private_data; in rme96_resume()
2391 writel(0, rme96->iobase + RME96_IO_SET_PLAY_POS in rme96_resume()
2392 + rme96->playback_pointer); in rme96_resume()
2393 writel(0, rme96->iobase + RME96_IO_SET_REC_POS in rme96_resume()
2394 + rme96->capture_pointer); in rme96_resume()
2397 memcpy_toio(rme96->iobase + RME96_IO_PLAY_BUFFER, in rme96_resume()
2398 rme96->playback_suspend_buffer, RME96_BUFFER_SIZE); in rme96_resume()
2399 memcpy_toio(rme96->iobase + RME96_IO_REC_BUFFER, in rme96_resume()
2400 rme96->capture_suspend_buffer, RME96_BUFFER_SIZE); in rme96_resume()
2403 writel(rme96->areg | RME96_AR_PD2, in rme96_resume()
2404 rme96->iobase + RME96_IO_ADDITIONAL_REG); in rme96_resume()
2405 writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG); in rme96_resume()
2409 rme96->areg |= RME96_AR_DAC_EN; in rme96_resume()
2410 writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG); in rme96_resume()
2429 snd_rme96_free(card->private_data); in snd_rme96_card_free()
2443 return -ENODEV; in snd_rme96_probe()
2447 return -ENOENT; in snd_rme96_probe()
2449 err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, in snd_rme96_probe()
2453 card->private_free = snd_rme96_card_free; in snd_rme96_probe()
2454 rme96 = card->private_data; in snd_rme96_probe()
2455 rme96->card = card; in snd_rme96_probe()
2456 rme96->pci = pci; in snd_rme96_probe()
2462 rme96->playback_suspend_buffer = vmalloc(RME96_BUFFER_SIZE); in snd_rme96_probe()
2463 if (!rme96->playback_suspend_buffer) in snd_rme96_probe()
2464 return -ENOMEM; in snd_rme96_probe()
2465 rme96->capture_suspend_buffer = vmalloc(RME96_BUFFER_SIZE); in snd_rme96_probe()
2466 if (!rme96->capture_suspend_buffer) in snd_rme96_probe()
2467 return -ENOMEM; in snd_rme96_probe()
2470 strcpy(card->driver, "Digi96"); in snd_rme96_probe()
2471 switch (rme96->pci->device) { in snd_rme96_probe()
2473 strcpy(card->shortname, "RME Digi96"); in snd_rme96_probe()
2476 strcpy(card->shortname, "RME Digi96/8"); in snd_rme96_probe()
2479 strcpy(card->shortname, "RME Digi96/8 PRO"); in snd_rme96_probe()
2482 pci_read_config_byte(rme96->pci, 8, &val); in snd_rme96_probe()
2484 strcpy(card->shortname, "RME Digi96/8 PAD"); in snd_rme96_probe()
2486 strcpy(card->shortname, "RME Digi96/8 PST"); in snd_rme96_probe()
2490 sprintf(card->longname, "%s at 0x%lx, irq %d", card->shortname, in snd_rme96_probe()
2491 rme96->port, rme96->irq); in snd_rme96_probe()