1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * ALSA driver for RME Digi96, Digi96/8 and Digi96/8 PRO/PAD/PST audio
4*4882a593Smuzhiyun * interfaces
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * Copyright (c) 2000, 2001 Anders Torger <torger@ludd.luth.se>
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * Thanks to Henk Hesselink <henk@anda.nl> for the analog volume control
9*4882a593Smuzhiyun * code.
10*4882a593Smuzhiyun */
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun #include <linux/delay.h>
13*4882a593Smuzhiyun #include <linux/init.h>
14*4882a593Smuzhiyun #include <linux/interrupt.h>
15*4882a593Smuzhiyun #include <linux/pci.h>
16*4882a593Smuzhiyun #include <linux/module.h>
17*4882a593Smuzhiyun #include <linux/vmalloc.h>
18*4882a593Smuzhiyun #include <linux/io.h>
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun #include <sound/core.h>
21*4882a593Smuzhiyun #include <sound/info.h>
22*4882a593Smuzhiyun #include <sound/control.h>
23*4882a593Smuzhiyun #include <sound/pcm.h>
24*4882a593Smuzhiyun #include <sound/pcm_params.h>
25*4882a593Smuzhiyun #include <sound/asoundef.h>
26*4882a593Smuzhiyun #include <sound/initval.h>
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun /* note, two last pcis should be equal, it is not a bug */
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun MODULE_AUTHOR("Anders Torger <torger@ludd.luth.se>");
31*4882a593Smuzhiyun MODULE_DESCRIPTION("RME Digi96, Digi96/8, Digi96/8 PRO, Digi96/8 PST, "
32*4882a593Smuzhiyun "Digi96/8 PAD");
33*4882a593Smuzhiyun MODULE_LICENSE("GPL");
34*4882a593Smuzhiyun MODULE_SUPPORTED_DEVICE("{{RME,Digi96},"
35*4882a593Smuzhiyun "{RME,Digi96/8},"
36*4882a593Smuzhiyun "{RME,Digi96/8 PRO},"
37*4882a593Smuzhiyun "{RME,Digi96/8 PST},"
38*4882a593Smuzhiyun "{RME,Digi96/8 PAD}}");
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
41*4882a593Smuzhiyun static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */
42*4882a593Smuzhiyun static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun module_param_array(index, int, NULL, 0444);
45*4882a593Smuzhiyun MODULE_PARM_DESC(index, "Index value for RME Digi96 soundcard.");
46*4882a593Smuzhiyun module_param_array(id, charp, NULL, 0444);
47*4882a593Smuzhiyun MODULE_PARM_DESC(id, "ID string for RME Digi96 soundcard.");
48*4882a593Smuzhiyun module_param_array(enable, bool, NULL, 0444);
49*4882a593Smuzhiyun MODULE_PARM_DESC(enable, "Enable RME Digi96 soundcard.");
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun /*
52*4882a593Smuzhiyun * Defines for RME Digi96 series, from internal RME reference documents
53*4882a593Smuzhiyun * dated 12.01.00
54*4882a593Smuzhiyun */
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun #define RME96_SPDIF_NCHANNELS 2
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun /* Playback and capture buffer size */
59*4882a593Smuzhiyun #define RME96_BUFFER_SIZE 0x10000
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun /* IO area size */
62*4882a593Smuzhiyun #define RME96_IO_SIZE 0x60000
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun /* IO area offsets */
65*4882a593Smuzhiyun #define RME96_IO_PLAY_BUFFER 0x0
66*4882a593Smuzhiyun #define RME96_IO_REC_BUFFER 0x10000
67*4882a593Smuzhiyun #define RME96_IO_CONTROL_REGISTER 0x20000
68*4882a593Smuzhiyun #define RME96_IO_ADDITIONAL_REG 0x20004
69*4882a593Smuzhiyun #define RME96_IO_CONFIRM_PLAY_IRQ 0x20008
70*4882a593Smuzhiyun #define RME96_IO_CONFIRM_REC_IRQ 0x2000C
71*4882a593Smuzhiyun #define RME96_IO_SET_PLAY_POS 0x40000
72*4882a593Smuzhiyun #define RME96_IO_RESET_PLAY_POS 0x4FFFC
73*4882a593Smuzhiyun #define RME96_IO_SET_REC_POS 0x50000
74*4882a593Smuzhiyun #define RME96_IO_RESET_REC_POS 0x5FFFC
75*4882a593Smuzhiyun #define RME96_IO_GET_PLAY_POS 0x20000
76*4882a593Smuzhiyun #define RME96_IO_GET_REC_POS 0x30000
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun /* Write control register bits */
79*4882a593Smuzhiyun #define RME96_WCR_START (1 << 0)
80*4882a593Smuzhiyun #define RME96_WCR_START_2 (1 << 1)
81*4882a593Smuzhiyun #define RME96_WCR_GAIN_0 (1 << 2)
82*4882a593Smuzhiyun #define RME96_WCR_GAIN_1 (1 << 3)
83*4882a593Smuzhiyun #define RME96_WCR_MODE24 (1 << 4)
84*4882a593Smuzhiyun #define RME96_WCR_MODE24_2 (1 << 5)
85*4882a593Smuzhiyun #define RME96_WCR_BM (1 << 6)
86*4882a593Smuzhiyun #define RME96_WCR_BM_2 (1 << 7)
87*4882a593Smuzhiyun #define RME96_WCR_ADAT (1 << 8)
88*4882a593Smuzhiyun #define RME96_WCR_FREQ_0 (1 << 9)
89*4882a593Smuzhiyun #define RME96_WCR_FREQ_1 (1 << 10)
90*4882a593Smuzhiyun #define RME96_WCR_DS (1 << 11)
91*4882a593Smuzhiyun #define RME96_WCR_PRO (1 << 12)
92*4882a593Smuzhiyun #define RME96_WCR_EMP (1 << 13)
93*4882a593Smuzhiyun #define RME96_WCR_SEL (1 << 14)
94*4882a593Smuzhiyun #define RME96_WCR_MASTER (1 << 15)
95*4882a593Smuzhiyun #define RME96_WCR_PD (1 << 16)
96*4882a593Smuzhiyun #define RME96_WCR_INP_0 (1 << 17)
97*4882a593Smuzhiyun #define RME96_WCR_INP_1 (1 << 18)
98*4882a593Smuzhiyun #define RME96_WCR_THRU_0 (1 << 19)
99*4882a593Smuzhiyun #define RME96_WCR_THRU_1 (1 << 20)
100*4882a593Smuzhiyun #define RME96_WCR_THRU_2 (1 << 21)
101*4882a593Smuzhiyun #define RME96_WCR_THRU_3 (1 << 22)
102*4882a593Smuzhiyun #define RME96_WCR_THRU_4 (1 << 23)
103*4882a593Smuzhiyun #define RME96_WCR_THRU_5 (1 << 24)
104*4882a593Smuzhiyun #define RME96_WCR_THRU_6 (1 << 25)
105*4882a593Smuzhiyun #define RME96_WCR_THRU_7 (1 << 26)
106*4882a593Smuzhiyun #define RME96_WCR_DOLBY (1 << 27)
107*4882a593Smuzhiyun #define RME96_WCR_MONITOR_0 (1 << 28)
108*4882a593Smuzhiyun #define RME96_WCR_MONITOR_1 (1 << 29)
109*4882a593Smuzhiyun #define RME96_WCR_ISEL (1 << 30)
110*4882a593Smuzhiyun #define RME96_WCR_IDIS (1 << 31)
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun #define RME96_WCR_BITPOS_GAIN_0 2
113*4882a593Smuzhiyun #define RME96_WCR_BITPOS_GAIN_1 3
114*4882a593Smuzhiyun #define RME96_WCR_BITPOS_FREQ_0 9
115*4882a593Smuzhiyun #define RME96_WCR_BITPOS_FREQ_1 10
116*4882a593Smuzhiyun #define RME96_WCR_BITPOS_INP_0 17
117*4882a593Smuzhiyun #define RME96_WCR_BITPOS_INP_1 18
118*4882a593Smuzhiyun #define RME96_WCR_BITPOS_MONITOR_0 28
119*4882a593Smuzhiyun #define RME96_WCR_BITPOS_MONITOR_1 29
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun /* Read control register bits */
122*4882a593Smuzhiyun #define RME96_RCR_AUDIO_ADDR_MASK 0xFFFF
123*4882a593Smuzhiyun #define RME96_RCR_IRQ_2 (1 << 16)
124*4882a593Smuzhiyun #define RME96_RCR_T_OUT (1 << 17)
125*4882a593Smuzhiyun #define RME96_RCR_DEV_ID_0 (1 << 21)
126*4882a593Smuzhiyun #define RME96_RCR_DEV_ID_1 (1 << 22)
127*4882a593Smuzhiyun #define RME96_RCR_LOCK (1 << 23)
128*4882a593Smuzhiyun #define RME96_RCR_VERF (1 << 26)
129*4882a593Smuzhiyun #define RME96_RCR_F0 (1 << 27)
130*4882a593Smuzhiyun #define RME96_RCR_F1 (1 << 28)
131*4882a593Smuzhiyun #define RME96_RCR_F2 (1 << 29)
132*4882a593Smuzhiyun #define RME96_RCR_AUTOSYNC (1 << 30)
133*4882a593Smuzhiyun #define RME96_RCR_IRQ (1 << 31)
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun #define RME96_RCR_BITPOS_F0 27
136*4882a593Smuzhiyun #define RME96_RCR_BITPOS_F1 28
137*4882a593Smuzhiyun #define RME96_RCR_BITPOS_F2 29
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun /* Additional register bits */
140*4882a593Smuzhiyun #define RME96_AR_WSEL (1 << 0)
141*4882a593Smuzhiyun #define RME96_AR_ANALOG (1 << 1)
142*4882a593Smuzhiyun #define RME96_AR_FREQPAD_0 (1 << 2)
143*4882a593Smuzhiyun #define RME96_AR_FREQPAD_1 (1 << 3)
144*4882a593Smuzhiyun #define RME96_AR_FREQPAD_2 (1 << 4)
145*4882a593Smuzhiyun #define RME96_AR_PD2 (1 << 5)
146*4882a593Smuzhiyun #define RME96_AR_DAC_EN (1 << 6)
147*4882a593Smuzhiyun #define RME96_AR_CLATCH (1 << 7)
148*4882a593Smuzhiyun #define RME96_AR_CCLK (1 << 8)
149*4882a593Smuzhiyun #define RME96_AR_CDATA (1 << 9)
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun #define RME96_AR_BITPOS_F0 2
152*4882a593Smuzhiyun #define RME96_AR_BITPOS_F1 3
153*4882a593Smuzhiyun #define RME96_AR_BITPOS_F2 4
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun /* Monitor tracks */
156*4882a593Smuzhiyun #define RME96_MONITOR_TRACKS_1_2 0
157*4882a593Smuzhiyun #define RME96_MONITOR_TRACKS_3_4 1
158*4882a593Smuzhiyun #define RME96_MONITOR_TRACKS_5_6 2
159*4882a593Smuzhiyun #define RME96_MONITOR_TRACKS_7_8 3
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun /* Attenuation */
162*4882a593Smuzhiyun #define RME96_ATTENUATION_0 0
163*4882a593Smuzhiyun #define RME96_ATTENUATION_6 1
164*4882a593Smuzhiyun #define RME96_ATTENUATION_12 2
165*4882a593Smuzhiyun #define RME96_ATTENUATION_18 3
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun /* Input types */
168*4882a593Smuzhiyun #define RME96_INPUT_OPTICAL 0
169*4882a593Smuzhiyun #define RME96_INPUT_COAXIAL 1
170*4882a593Smuzhiyun #define RME96_INPUT_INTERNAL 2
171*4882a593Smuzhiyun #define RME96_INPUT_XLR 3
172*4882a593Smuzhiyun #define RME96_INPUT_ANALOG 4
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun /* Clock modes */
175*4882a593Smuzhiyun #define RME96_CLOCKMODE_SLAVE 0
176*4882a593Smuzhiyun #define RME96_CLOCKMODE_MASTER 1
177*4882a593Smuzhiyun #define RME96_CLOCKMODE_WORDCLOCK 2
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun /* Block sizes in bytes */
180*4882a593Smuzhiyun #define RME96_SMALL_BLOCK_SIZE 2048
181*4882a593Smuzhiyun #define RME96_LARGE_BLOCK_SIZE 8192
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun /* Volume control */
184*4882a593Smuzhiyun #define RME96_AD1852_VOL_BITS 14
185*4882a593Smuzhiyun #define RME96_AD1855_VOL_BITS 10
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun /* Defines for snd_rme96_trigger */
188*4882a593Smuzhiyun #define RME96_TB_START_PLAYBACK 1
189*4882a593Smuzhiyun #define RME96_TB_START_CAPTURE 2
190*4882a593Smuzhiyun #define RME96_TB_STOP_PLAYBACK 4
191*4882a593Smuzhiyun #define RME96_TB_STOP_CAPTURE 8
192*4882a593Smuzhiyun #define RME96_TB_RESET_PLAYPOS 16
193*4882a593Smuzhiyun #define RME96_TB_RESET_CAPTUREPOS 32
194*4882a593Smuzhiyun #define RME96_TB_CLEAR_PLAYBACK_IRQ 64
195*4882a593Smuzhiyun #define RME96_TB_CLEAR_CAPTURE_IRQ 128
196*4882a593Smuzhiyun #define RME96_RESUME_PLAYBACK (RME96_TB_START_PLAYBACK)
197*4882a593Smuzhiyun #define RME96_RESUME_CAPTURE (RME96_TB_START_CAPTURE)
198*4882a593Smuzhiyun #define RME96_RESUME_BOTH (RME96_RESUME_PLAYBACK \
199*4882a593Smuzhiyun | RME96_RESUME_CAPTURE)
200*4882a593Smuzhiyun #define RME96_START_PLAYBACK (RME96_TB_START_PLAYBACK \
201*4882a593Smuzhiyun | RME96_TB_RESET_PLAYPOS)
202*4882a593Smuzhiyun #define RME96_START_CAPTURE (RME96_TB_START_CAPTURE \
203*4882a593Smuzhiyun | RME96_TB_RESET_CAPTUREPOS)
204*4882a593Smuzhiyun #define RME96_START_BOTH (RME96_START_PLAYBACK \
205*4882a593Smuzhiyun | RME96_START_CAPTURE)
206*4882a593Smuzhiyun #define RME96_STOP_PLAYBACK (RME96_TB_STOP_PLAYBACK \
207*4882a593Smuzhiyun | RME96_TB_CLEAR_PLAYBACK_IRQ)
208*4882a593Smuzhiyun #define RME96_STOP_CAPTURE (RME96_TB_STOP_CAPTURE \
209*4882a593Smuzhiyun | RME96_TB_CLEAR_CAPTURE_IRQ)
210*4882a593Smuzhiyun #define RME96_STOP_BOTH (RME96_STOP_PLAYBACK \
211*4882a593Smuzhiyun | RME96_STOP_CAPTURE)
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun struct rme96 {
214*4882a593Smuzhiyun spinlock_t lock;
215*4882a593Smuzhiyun int irq;
216*4882a593Smuzhiyun unsigned long port;
217*4882a593Smuzhiyun void __iomem *iobase;
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun u32 wcreg; /* cached write control register value */
220*4882a593Smuzhiyun u32 wcreg_spdif; /* S/PDIF setup */
221*4882a593Smuzhiyun u32 wcreg_spdif_stream; /* S/PDIF setup (temporary) */
222*4882a593Smuzhiyun u32 rcreg; /* cached read control register value */
223*4882a593Smuzhiyun u32 areg; /* cached additional register value */
224*4882a593Smuzhiyun u16 vol[2]; /* cached volume of analog output */
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun u8 rev; /* card revision number */
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun #ifdef CONFIG_PM_SLEEP
229*4882a593Smuzhiyun u32 playback_pointer;
230*4882a593Smuzhiyun u32 capture_pointer;
231*4882a593Smuzhiyun void *playback_suspend_buffer;
232*4882a593Smuzhiyun void *capture_suspend_buffer;
233*4882a593Smuzhiyun #endif
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun struct snd_pcm_substream *playback_substream;
236*4882a593Smuzhiyun struct snd_pcm_substream *capture_substream;
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun int playback_frlog; /* log2 of framesize */
239*4882a593Smuzhiyun int capture_frlog;
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun size_t playback_periodsize; /* in bytes, zero if not used */
242*4882a593Smuzhiyun size_t capture_periodsize; /* in bytes, zero if not used */
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun struct snd_card *card;
245*4882a593Smuzhiyun struct snd_pcm *spdif_pcm;
246*4882a593Smuzhiyun struct snd_pcm *adat_pcm;
247*4882a593Smuzhiyun struct pci_dev *pci;
248*4882a593Smuzhiyun struct snd_kcontrol *spdif_ctl;
249*4882a593Smuzhiyun };
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun static const struct pci_device_id snd_rme96_ids[] = {
252*4882a593Smuzhiyun { PCI_VDEVICE(XILINX, PCI_DEVICE_ID_RME_DIGI96), 0, },
253*4882a593Smuzhiyun { PCI_VDEVICE(XILINX, PCI_DEVICE_ID_RME_DIGI96_8), 0, },
254*4882a593Smuzhiyun { PCI_VDEVICE(XILINX, PCI_DEVICE_ID_RME_DIGI96_8_PRO), 0, },
255*4882a593Smuzhiyun { PCI_VDEVICE(XILINX, PCI_DEVICE_ID_RME_DIGI96_8_PAD_OR_PST), 0, },
256*4882a593Smuzhiyun { 0, }
257*4882a593Smuzhiyun };
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun MODULE_DEVICE_TABLE(pci, snd_rme96_ids);
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun #define RME96_ISPLAYING(rme96) ((rme96)->wcreg & RME96_WCR_START)
262*4882a593Smuzhiyun #define RME96_ISRECORDING(rme96) ((rme96)->wcreg & RME96_WCR_START_2)
263*4882a593Smuzhiyun #define RME96_HAS_ANALOG_IN(rme96) ((rme96)->pci->device == PCI_DEVICE_ID_RME_DIGI96_8_PAD_OR_PST)
264*4882a593Smuzhiyun #define RME96_HAS_ANALOG_OUT(rme96) ((rme96)->pci->device == PCI_DEVICE_ID_RME_DIGI96_8_PRO || \
265*4882a593Smuzhiyun (rme96)->pci->device == PCI_DEVICE_ID_RME_DIGI96_8_PAD_OR_PST)
266*4882a593Smuzhiyun #define RME96_DAC_IS_1852(rme96) (RME96_HAS_ANALOG_OUT(rme96) && (rme96)->rev >= 4)
267*4882a593Smuzhiyun #define RME96_DAC_IS_1855(rme96) (((rme96)->pci->device == PCI_DEVICE_ID_RME_DIGI96_8_PAD_OR_PST && (rme96)->rev < 4) || \
268*4882a593Smuzhiyun ((rme96)->pci->device == PCI_DEVICE_ID_RME_DIGI96_8_PRO && (rme96)->rev == 2))
269*4882a593Smuzhiyun #define RME96_185X_MAX_OUT(rme96) ((1 << (RME96_DAC_IS_1852(rme96) ? RME96_AD1852_VOL_BITS : RME96_AD1855_VOL_BITS)) - 1)
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun static int
272*4882a593Smuzhiyun snd_rme96_playback_prepare(struct snd_pcm_substream *substream);
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun static int
275*4882a593Smuzhiyun snd_rme96_capture_prepare(struct snd_pcm_substream *substream);
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun static int
278*4882a593Smuzhiyun snd_rme96_playback_trigger(struct snd_pcm_substream *substream,
279*4882a593Smuzhiyun int cmd);
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun static int
282*4882a593Smuzhiyun snd_rme96_capture_trigger(struct snd_pcm_substream *substream,
283*4882a593Smuzhiyun int cmd);
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun static snd_pcm_uframes_t
286*4882a593Smuzhiyun snd_rme96_playback_pointer(struct snd_pcm_substream *substream);
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun static snd_pcm_uframes_t
289*4882a593Smuzhiyun snd_rme96_capture_pointer(struct snd_pcm_substream *substream);
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun static void snd_rme96_proc_init(struct rme96 *rme96);
292*4882a593Smuzhiyun
293*4882a593Smuzhiyun static int
294*4882a593Smuzhiyun snd_rme96_create_switches(struct snd_card *card,
295*4882a593Smuzhiyun struct rme96 *rme96);
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun static int
298*4882a593Smuzhiyun snd_rme96_getinputtype(struct rme96 *rme96);
299*4882a593Smuzhiyun
300*4882a593Smuzhiyun static inline unsigned int
snd_rme96_playback_ptr(struct rme96 * rme96)301*4882a593Smuzhiyun snd_rme96_playback_ptr(struct rme96 *rme96)
302*4882a593Smuzhiyun {
303*4882a593Smuzhiyun return (readl(rme96->iobase + RME96_IO_GET_PLAY_POS)
304*4882a593Smuzhiyun & RME96_RCR_AUDIO_ADDR_MASK) >> rme96->playback_frlog;
305*4882a593Smuzhiyun }
306*4882a593Smuzhiyun
307*4882a593Smuzhiyun static inline unsigned int
snd_rme96_capture_ptr(struct rme96 * rme96)308*4882a593Smuzhiyun snd_rme96_capture_ptr(struct rme96 *rme96)
309*4882a593Smuzhiyun {
310*4882a593Smuzhiyun return (readl(rme96->iobase + RME96_IO_GET_REC_POS)
311*4882a593Smuzhiyun & RME96_RCR_AUDIO_ADDR_MASK) >> rme96->capture_frlog;
312*4882a593Smuzhiyun }
313*4882a593Smuzhiyun
314*4882a593Smuzhiyun static int
snd_rme96_playback_silence(struct snd_pcm_substream * substream,int channel,unsigned long pos,unsigned long count)315*4882a593Smuzhiyun snd_rme96_playback_silence(struct snd_pcm_substream *substream,
316*4882a593Smuzhiyun int channel, unsigned long pos, unsigned long count)
317*4882a593Smuzhiyun {
318*4882a593Smuzhiyun struct rme96 *rme96 = snd_pcm_substream_chip(substream);
319*4882a593Smuzhiyun
320*4882a593Smuzhiyun memset_io(rme96->iobase + RME96_IO_PLAY_BUFFER + pos,
321*4882a593Smuzhiyun 0, count);
322*4882a593Smuzhiyun return 0;
323*4882a593Smuzhiyun }
324*4882a593Smuzhiyun
325*4882a593Smuzhiyun static int
snd_rme96_playback_copy(struct snd_pcm_substream * substream,int channel,unsigned long pos,void __user * src,unsigned long count)326*4882a593Smuzhiyun snd_rme96_playback_copy(struct snd_pcm_substream *substream,
327*4882a593Smuzhiyun int channel, unsigned long pos,
328*4882a593Smuzhiyun void __user *src, unsigned long count)
329*4882a593Smuzhiyun {
330*4882a593Smuzhiyun struct rme96 *rme96 = snd_pcm_substream_chip(substream);
331*4882a593Smuzhiyun
332*4882a593Smuzhiyun return copy_from_user_toio(rme96->iobase + RME96_IO_PLAY_BUFFER + pos,
333*4882a593Smuzhiyun src, count);
334*4882a593Smuzhiyun }
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun static int
snd_rme96_playback_copy_kernel(struct snd_pcm_substream * substream,int channel,unsigned long pos,void * src,unsigned long count)337*4882a593Smuzhiyun snd_rme96_playback_copy_kernel(struct snd_pcm_substream *substream,
338*4882a593Smuzhiyun int channel, unsigned long pos,
339*4882a593Smuzhiyun void *src, unsigned long count)
340*4882a593Smuzhiyun {
341*4882a593Smuzhiyun struct rme96 *rme96 = snd_pcm_substream_chip(substream);
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun memcpy_toio(rme96->iobase + RME96_IO_PLAY_BUFFER + pos, src, count);
344*4882a593Smuzhiyun return 0;
345*4882a593Smuzhiyun }
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun static int
snd_rme96_capture_copy(struct snd_pcm_substream * substream,int channel,unsigned long pos,void __user * dst,unsigned long count)348*4882a593Smuzhiyun snd_rme96_capture_copy(struct snd_pcm_substream *substream,
349*4882a593Smuzhiyun int channel, unsigned long pos,
350*4882a593Smuzhiyun void __user *dst, unsigned long count)
351*4882a593Smuzhiyun {
352*4882a593Smuzhiyun struct rme96 *rme96 = snd_pcm_substream_chip(substream);
353*4882a593Smuzhiyun
354*4882a593Smuzhiyun return copy_to_user_fromio(dst,
355*4882a593Smuzhiyun rme96->iobase + RME96_IO_REC_BUFFER + pos,
356*4882a593Smuzhiyun count);
357*4882a593Smuzhiyun }
358*4882a593Smuzhiyun
359*4882a593Smuzhiyun static int
snd_rme96_capture_copy_kernel(struct snd_pcm_substream * substream,int channel,unsigned long pos,void * dst,unsigned long count)360*4882a593Smuzhiyun snd_rme96_capture_copy_kernel(struct snd_pcm_substream *substream,
361*4882a593Smuzhiyun int channel, unsigned long pos,
362*4882a593Smuzhiyun void *dst, unsigned long count)
363*4882a593Smuzhiyun {
364*4882a593Smuzhiyun struct rme96 *rme96 = snd_pcm_substream_chip(substream);
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun memcpy_fromio(dst, rme96->iobase + RME96_IO_REC_BUFFER + pos, count);
367*4882a593Smuzhiyun return 0;
368*4882a593Smuzhiyun }
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun /*
371*4882a593Smuzhiyun * Digital output capabilities (S/PDIF)
372*4882a593Smuzhiyun */
373*4882a593Smuzhiyun static const struct snd_pcm_hardware snd_rme96_playback_spdif_info =
374*4882a593Smuzhiyun {
375*4882a593Smuzhiyun .info = (SNDRV_PCM_INFO_MMAP_IOMEM |
376*4882a593Smuzhiyun SNDRV_PCM_INFO_MMAP_VALID |
377*4882a593Smuzhiyun SNDRV_PCM_INFO_SYNC_START |
378*4882a593Smuzhiyun SNDRV_PCM_INFO_RESUME |
379*4882a593Smuzhiyun SNDRV_PCM_INFO_INTERLEAVED |
380*4882a593Smuzhiyun SNDRV_PCM_INFO_PAUSE),
381*4882a593Smuzhiyun .formats = (SNDRV_PCM_FMTBIT_S16_LE |
382*4882a593Smuzhiyun SNDRV_PCM_FMTBIT_S32_LE),
383*4882a593Smuzhiyun .rates = (SNDRV_PCM_RATE_32000 |
384*4882a593Smuzhiyun SNDRV_PCM_RATE_44100 |
385*4882a593Smuzhiyun SNDRV_PCM_RATE_48000 |
386*4882a593Smuzhiyun SNDRV_PCM_RATE_64000 |
387*4882a593Smuzhiyun SNDRV_PCM_RATE_88200 |
388*4882a593Smuzhiyun SNDRV_PCM_RATE_96000),
389*4882a593Smuzhiyun .rate_min = 32000,
390*4882a593Smuzhiyun .rate_max = 96000,
391*4882a593Smuzhiyun .channels_min = 2,
392*4882a593Smuzhiyun .channels_max = 2,
393*4882a593Smuzhiyun .buffer_bytes_max = RME96_BUFFER_SIZE,
394*4882a593Smuzhiyun .period_bytes_min = RME96_SMALL_BLOCK_SIZE,
395*4882a593Smuzhiyun .period_bytes_max = RME96_LARGE_BLOCK_SIZE,
396*4882a593Smuzhiyun .periods_min = RME96_BUFFER_SIZE / RME96_LARGE_BLOCK_SIZE,
397*4882a593Smuzhiyun .periods_max = RME96_BUFFER_SIZE / RME96_SMALL_BLOCK_SIZE,
398*4882a593Smuzhiyun .fifo_size = 0,
399*4882a593Smuzhiyun };
400*4882a593Smuzhiyun
401*4882a593Smuzhiyun /*
402*4882a593Smuzhiyun * Digital input capabilities (S/PDIF)
403*4882a593Smuzhiyun */
404*4882a593Smuzhiyun static const struct snd_pcm_hardware snd_rme96_capture_spdif_info =
405*4882a593Smuzhiyun {
406*4882a593Smuzhiyun .info = (SNDRV_PCM_INFO_MMAP_IOMEM |
407*4882a593Smuzhiyun SNDRV_PCM_INFO_MMAP_VALID |
408*4882a593Smuzhiyun SNDRV_PCM_INFO_SYNC_START |
409*4882a593Smuzhiyun SNDRV_PCM_INFO_RESUME |
410*4882a593Smuzhiyun SNDRV_PCM_INFO_INTERLEAVED |
411*4882a593Smuzhiyun SNDRV_PCM_INFO_PAUSE),
412*4882a593Smuzhiyun .formats = (SNDRV_PCM_FMTBIT_S16_LE |
413*4882a593Smuzhiyun SNDRV_PCM_FMTBIT_S32_LE),
414*4882a593Smuzhiyun .rates = (SNDRV_PCM_RATE_32000 |
415*4882a593Smuzhiyun SNDRV_PCM_RATE_44100 |
416*4882a593Smuzhiyun SNDRV_PCM_RATE_48000 |
417*4882a593Smuzhiyun SNDRV_PCM_RATE_64000 |
418*4882a593Smuzhiyun SNDRV_PCM_RATE_88200 |
419*4882a593Smuzhiyun SNDRV_PCM_RATE_96000),
420*4882a593Smuzhiyun .rate_min = 32000,
421*4882a593Smuzhiyun .rate_max = 96000,
422*4882a593Smuzhiyun .channels_min = 2,
423*4882a593Smuzhiyun .channels_max = 2,
424*4882a593Smuzhiyun .buffer_bytes_max = RME96_BUFFER_SIZE,
425*4882a593Smuzhiyun .period_bytes_min = RME96_SMALL_BLOCK_SIZE,
426*4882a593Smuzhiyun .period_bytes_max = RME96_LARGE_BLOCK_SIZE,
427*4882a593Smuzhiyun .periods_min = RME96_BUFFER_SIZE / RME96_LARGE_BLOCK_SIZE,
428*4882a593Smuzhiyun .periods_max = RME96_BUFFER_SIZE / RME96_SMALL_BLOCK_SIZE,
429*4882a593Smuzhiyun .fifo_size = 0,
430*4882a593Smuzhiyun };
431*4882a593Smuzhiyun
432*4882a593Smuzhiyun /*
433*4882a593Smuzhiyun * Digital output capabilities (ADAT)
434*4882a593Smuzhiyun */
435*4882a593Smuzhiyun static const struct snd_pcm_hardware snd_rme96_playback_adat_info =
436*4882a593Smuzhiyun {
437*4882a593Smuzhiyun .info = (SNDRV_PCM_INFO_MMAP_IOMEM |
438*4882a593Smuzhiyun SNDRV_PCM_INFO_MMAP_VALID |
439*4882a593Smuzhiyun SNDRV_PCM_INFO_SYNC_START |
440*4882a593Smuzhiyun SNDRV_PCM_INFO_RESUME |
441*4882a593Smuzhiyun SNDRV_PCM_INFO_INTERLEAVED |
442*4882a593Smuzhiyun SNDRV_PCM_INFO_PAUSE),
443*4882a593Smuzhiyun .formats = (SNDRV_PCM_FMTBIT_S16_LE |
444*4882a593Smuzhiyun SNDRV_PCM_FMTBIT_S32_LE),
445*4882a593Smuzhiyun .rates = (SNDRV_PCM_RATE_44100 |
446*4882a593Smuzhiyun SNDRV_PCM_RATE_48000),
447*4882a593Smuzhiyun .rate_min = 44100,
448*4882a593Smuzhiyun .rate_max = 48000,
449*4882a593Smuzhiyun .channels_min = 8,
450*4882a593Smuzhiyun .channels_max = 8,
451*4882a593Smuzhiyun .buffer_bytes_max = RME96_BUFFER_SIZE,
452*4882a593Smuzhiyun .period_bytes_min = RME96_SMALL_BLOCK_SIZE,
453*4882a593Smuzhiyun .period_bytes_max = RME96_LARGE_BLOCK_SIZE,
454*4882a593Smuzhiyun .periods_min = RME96_BUFFER_SIZE / RME96_LARGE_BLOCK_SIZE,
455*4882a593Smuzhiyun .periods_max = RME96_BUFFER_SIZE / RME96_SMALL_BLOCK_SIZE,
456*4882a593Smuzhiyun .fifo_size = 0,
457*4882a593Smuzhiyun };
458*4882a593Smuzhiyun
459*4882a593Smuzhiyun /*
460*4882a593Smuzhiyun * Digital input capabilities (ADAT)
461*4882a593Smuzhiyun */
462*4882a593Smuzhiyun static const struct snd_pcm_hardware snd_rme96_capture_adat_info =
463*4882a593Smuzhiyun {
464*4882a593Smuzhiyun .info = (SNDRV_PCM_INFO_MMAP_IOMEM |
465*4882a593Smuzhiyun SNDRV_PCM_INFO_MMAP_VALID |
466*4882a593Smuzhiyun SNDRV_PCM_INFO_SYNC_START |
467*4882a593Smuzhiyun SNDRV_PCM_INFO_RESUME |
468*4882a593Smuzhiyun SNDRV_PCM_INFO_INTERLEAVED |
469*4882a593Smuzhiyun SNDRV_PCM_INFO_PAUSE),
470*4882a593Smuzhiyun .formats = (SNDRV_PCM_FMTBIT_S16_LE |
471*4882a593Smuzhiyun SNDRV_PCM_FMTBIT_S32_LE),
472*4882a593Smuzhiyun .rates = (SNDRV_PCM_RATE_44100 |
473*4882a593Smuzhiyun SNDRV_PCM_RATE_48000),
474*4882a593Smuzhiyun .rate_min = 44100,
475*4882a593Smuzhiyun .rate_max = 48000,
476*4882a593Smuzhiyun .channels_min = 8,
477*4882a593Smuzhiyun .channels_max = 8,
478*4882a593Smuzhiyun .buffer_bytes_max = RME96_BUFFER_SIZE,
479*4882a593Smuzhiyun .period_bytes_min = RME96_SMALL_BLOCK_SIZE,
480*4882a593Smuzhiyun .period_bytes_max = RME96_LARGE_BLOCK_SIZE,
481*4882a593Smuzhiyun .periods_min = RME96_BUFFER_SIZE / RME96_LARGE_BLOCK_SIZE,
482*4882a593Smuzhiyun .periods_max = RME96_BUFFER_SIZE / RME96_SMALL_BLOCK_SIZE,
483*4882a593Smuzhiyun .fifo_size = 0,
484*4882a593Smuzhiyun };
485*4882a593Smuzhiyun
486*4882a593Smuzhiyun /*
487*4882a593Smuzhiyun * The CDATA, CCLK and CLATCH bits can be used to write to the SPI interface
488*4882a593Smuzhiyun * of the AD1852 or AD1852 D/A converter on the board. CDATA must be set up
489*4882a593Smuzhiyun * on the falling edge of CCLK and be stable on the rising edge. The rising
490*4882a593Smuzhiyun * edge of CLATCH after the last data bit clocks in the whole data word.
491*4882a593Smuzhiyun * A fast processor could probably drive the SPI interface faster than the
492*4882a593Smuzhiyun * DAC can handle (3MHz for the 1855, unknown for the 1852). The udelay(1)
493*4882a593Smuzhiyun * limits the data rate to 500KHz and only causes a delay of 33 microsecs.
494*4882a593Smuzhiyun *
495*4882a593Smuzhiyun * NOTE: increased delay from 1 to 10, since there where problems setting
496*4882a593Smuzhiyun * the volume.
497*4882a593Smuzhiyun */
498*4882a593Smuzhiyun static void
snd_rme96_write_SPI(struct rme96 * rme96,u16 val)499*4882a593Smuzhiyun snd_rme96_write_SPI(struct rme96 *rme96, u16 val)
500*4882a593Smuzhiyun {
501*4882a593Smuzhiyun int i;
502*4882a593Smuzhiyun
503*4882a593Smuzhiyun for (i = 0; i < 16; i++) {
504*4882a593Smuzhiyun if (val & 0x8000) {
505*4882a593Smuzhiyun rme96->areg |= RME96_AR_CDATA;
506*4882a593Smuzhiyun } else {
507*4882a593Smuzhiyun rme96->areg &= ~RME96_AR_CDATA;
508*4882a593Smuzhiyun }
509*4882a593Smuzhiyun rme96->areg &= ~(RME96_AR_CCLK | RME96_AR_CLATCH);
510*4882a593Smuzhiyun writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG);
511*4882a593Smuzhiyun udelay(10);
512*4882a593Smuzhiyun rme96->areg |= RME96_AR_CCLK;
513*4882a593Smuzhiyun writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG);
514*4882a593Smuzhiyun udelay(10);
515*4882a593Smuzhiyun val <<= 1;
516*4882a593Smuzhiyun }
517*4882a593Smuzhiyun rme96->areg &= ~(RME96_AR_CCLK | RME96_AR_CDATA);
518*4882a593Smuzhiyun rme96->areg |= RME96_AR_CLATCH;
519*4882a593Smuzhiyun writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG);
520*4882a593Smuzhiyun udelay(10);
521*4882a593Smuzhiyun rme96->areg &= ~RME96_AR_CLATCH;
522*4882a593Smuzhiyun writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG);
523*4882a593Smuzhiyun }
524*4882a593Smuzhiyun
525*4882a593Smuzhiyun static void
snd_rme96_apply_dac_volume(struct rme96 * rme96)526*4882a593Smuzhiyun snd_rme96_apply_dac_volume(struct rme96 *rme96)
527*4882a593Smuzhiyun {
528*4882a593Smuzhiyun if (RME96_DAC_IS_1852(rme96)) {
529*4882a593Smuzhiyun snd_rme96_write_SPI(rme96, (rme96->vol[0] << 2) | 0x0);
530*4882a593Smuzhiyun snd_rme96_write_SPI(rme96, (rme96->vol[1] << 2) | 0x2);
531*4882a593Smuzhiyun } else if (RME96_DAC_IS_1855(rme96)) {
532*4882a593Smuzhiyun snd_rme96_write_SPI(rme96, (rme96->vol[0] & 0x3FF) | 0x000);
533*4882a593Smuzhiyun snd_rme96_write_SPI(rme96, (rme96->vol[1] & 0x3FF) | 0x400);
534*4882a593Smuzhiyun }
535*4882a593Smuzhiyun }
536*4882a593Smuzhiyun
537*4882a593Smuzhiyun static void
snd_rme96_reset_dac(struct rme96 * rme96)538*4882a593Smuzhiyun snd_rme96_reset_dac(struct rme96 *rme96)
539*4882a593Smuzhiyun {
540*4882a593Smuzhiyun writel(rme96->wcreg | RME96_WCR_PD,
541*4882a593Smuzhiyun rme96->iobase + RME96_IO_CONTROL_REGISTER);
542*4882a593Smuzhiyun writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER);
543*4882a593Smuzhiyun }
544*4882a593Smuzhiyun
545*4882a593Smuzhiyun static int
snd_rme96_getmontracks(struct rme96 * rme96)546*4882a593Smuzhiyun snd_rme96_getmontracks(struct rme96 *rme96)
547*4882a593Smuzhiyun {
548*4882a593Smuzhiyun return ((rme96->wcreg >> RME96_WCR_BITPOS_MONITOR_0) & 1) +
549*4882a593Smuzhiyun (((rme96->wcreg >> RME96_WCR_BITPOS_MONITOR_1) & 1) << 1);
550*4882a593Smuzhiyun }
551*4882a593Smuzhiyun
552*4882a593Smuzhiyun static int
snd_rme96_setmontracks(struct rme96 * rme96,int montracks)553*4882a593Smuzhiyun snd_rme96_setmontracks(struct rme96 *rme96,
554*4882a593Smuzhiyun int montracks)
555*4882a593Smuzhiyun {
556*4882a593Smuzhiyun if (montracks & 1) {
557*4882a593Smuzhiyun rme96->wcreg |= RME96_WCR_MONITOR_0;
558*4882a593Smuzhiyun } else {
559*4882a593Smuzhiyun rme96->wcreg &= ~RME96_WCR_MONITOR_0;
560*4882a593Smuzhiyun }
561*4882a593Smuzhiyun if (montracks & 2) {
562*4882a593Smuzhiyun rme96->wcreg |= RME96_WCR_MONITOR_1;
563*4882a593Smuzhiyun } else {
564*4882a593Smuzhiyun rme96->wcreg &= ~RME96_WCR_MONITOR_1;
565*4882a593Smuzhiyun }
566*4882a593Smuzhiyun writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER);
567*4882a593Smuzhiyun return 0;
568*4882a593Smuzhiyun }
569*4882a593Smuzhiyun
570*4882a593Smuzhiyun static int
snd_rme96_getattenuation(struct rme96 * rme96)571*4882a593Smuzhiyun snd_rme96_getattenuation(struct rme96 *rme96)
572*4882a593Smuzhiyun {
573*4882a593Smuzhiyun return ((rme96->wcreg >> RME96_WCR_BITPOS_GAIN_0) & 1) +
574*4882a593Smuzhiyun (((rme96->wcreg >> RME96_WCR_BITPOS_GAIN_1) & 1) << 1);
575*4882a593Smuzhiyun }
576*4882a593Smuzhiyun
577*4882a593Smuzhiyun static int
snd_rme96_setattenuation(struct rme96 * rme96,int attenuation)578*4882a593Smuzhiyun snd_rme96_setattenuation(struct rme96 *rme96,
579*4882a593Smuzhiyun int attenuation)
580*4882a593Smuzhiyun {
581*4882a593Smuzhiyun switch (attenuation) {
582*4882a593Smuzhiyun case 0:
583*4882a593Smuzhiyun rme96->wcreg = (rme96->wcreg & ~RME96_WCR_GAIN_0) &
584*4882a593Smuzhiyun ~RME96_WCR_GAIN_1;
585*4882a593Smuzhiyun break;
586*4882a593Smuzhiyun case 1:
587*4882a593Smuzhiyun rme96->wcreg = (rme96->wcreg | RME96_WCR_GAIN_0) &
588*4882a593Smuzhiyun ~RME96_WCR_GAIN_1;
589*4882a593Smuzhiyun break;
590*4882a593Smuzhiyun case 2:
591*4882a593Smuzhiyun rme96->wcreg = (rme96->wcreg & ~RME96_WCR_GAIN_0) |
592*4882a593Smuzhiyun RME96_WCR_GAIN_1;
593*4882a593Smuzhiyun break;
594*4882a593Smuzhiyun case 3:
595*4882a593Smuzhiyun rme96->wcreg = (rme96->wcreg | RME96_WCR_GAIN_0) |
596*4882a593Smuzhiyun RME96_WCR_GAIN_1;
597*4882a593Smuzhiyun break;
598*4882a593Smuzhiyun default:
599*4882a593Smuzhiyun return -EINVAL;
600*4882a593Smuzhiyun }
601*4882a593Smuzhiyun writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER);
602*4882a593Smuzhiyun return 0;
603*4882a593Smuzhiyun }
604*4882a593Smuzhiyun
605*4882a593Smuzhiyun static int
snd_rme96_capture_getrate(struct rme96 * rme96,int * is_adat)606*4882a593Smuzhiyun snd_rme96_capture_getrate(struct rme96 *rme96,
607*4882a593Smuzhiyun int *is_adat)
608*4882a593Smuzhiyun {
609*4882a593Smuzhiyun int n, rate;
610*4882a593Smuzhiyun
611*4882a593Smuzhiyun *is_adat = 0;
612*4882a593Smuzhiyun if (rme96->areg & RME96_AR_ANALOG) {
613*4882a593Smuzhiyun /* Analog input, overrides S/PDIF setting */
614*4882a593Smuzhiyun n = ((rme96->areg >> RME96_AR_BITPOS_F0) & 1) +
615*4882a593Smuzhiyun (((rme96->areg >> RME96_AR_BITPOS_F1) & 1) << 1);
616*4882a593Smuzhiyun switch (n) {
617*4882a593Smuzhiyun case 1:
618*4882a593Smuzhiyun rate = 32000;
619*4882a593Smuzhiyun break;
620*4882a593Smuzhiyun case 2:
621*4882a593Smuzhiyun rate = 44100;
622*4882a593Smuzhiyun break;
623*4882a593Smuzhiyun case 3:
624*4882a593Smuzhiyun rate = 48000;
625*4882a593Smuzhiyun break;
626*4882a593Smuzhiyun default:
627*4882a593Smuzhiyun return -1;
628*4882a593Smuzhiyun }
629*4882a593Smuzhiyun return (rme96->areg & RME96_AR_BITPOS_F2) ? rate << 1 : rate;
630*4882a593Smuzhiyun }
631*4882a593Smuzhiyun
632*4882a593Smuzhiyun rme96->rcreg = readl(rme96->iobase + RME96_IO_CONTROL_REGISTER);
633*4882a593Smuzhiyun if (rme96->rcreg & RME96_RCR_LOCK) {
634*4882a593Smuzhiyun /* ADAT rate */
635*4882a593Smuzhiyun *is_adat = 1;
636*4882a593Smuzhiyun if (rme96->rcreg & RME96_RCR_T_OUT) {
637*4882a593Smuzhiyun return 48000;
638*4882a593Smuzhiyun }
639*4882a593Smuzhiyun return 44100;
640*4882a593Smuzhiyun }
641*4882a593Smuzhiyun
642*4882a593Smuzhiyun if (rme96->rcreg & RME96_RCR_VERF) {
643*4882a593Smuzhiyun return -1;
644*4882a593Smuzhiyun }
645*4882a593Smuzhiyun
646*4882a593Smuzhiyun /* S/PDIF rate */
647*4882a593Smuzhiyun n = ((rme96->rcreg >> RME96_RCR_BITPOS_F0) & 1) +
648*4882a593Smuzhiyun (((rme96->rcreg >> RME96_RCR_BITPOS_F1) & 1) << 1) +
649*4882a593Smuzhiyun (((rme96->rcreg >> RME96_RCR_BITPOS_F2) & 1) << 2);
650*4882a593Smuzhiyun
651*4882a593Smuzhiyun switch (n) {
652*4882a593Smuzhiyun case 0:
653*4882a593Smuzhiyun if (rme96->rcreg & RME96_RCR_T_OUT) {
654*4882a593Smuzhiyun return 64000;
655*4882a593Smuzhiyun }
656*4882a593Smuzhiyun return -1;
657*4882a593Smuzhiyun case 3: return 96000;
658*4882a593Smuzhiyun case 4: return 88200;
659*4882a593Smuzhiyun case 5: return 48000;
660*4882a593Smuzhiyun case 6: return 44100;
661*4882a593Smuzhiyun case 7: return 32000;
662*4882a593Smuzhiyun default:
663*4882a593Smuzhiyun break;
664*4882a593Smuzhiyun }
665*4882a593Smuzhiyun return -1;
666*4882a593Smuzhiyun }
667*4882a593Smuzhiyun
668*4882a593Smuzhiyun static int
snd_rme96_playback_getrate(struct rme96 * rme96)669*4882a593Smuzhiyun snd_rme96_playback_getrate(struct rme96 *rme96)
670*4882a593Smuzhiyun {
671*4882a593Smuzhiyun int rate, dummy;
672*4882a593Smuzhiyun
673*4882a593Smuzhiyun if (!(rme96->wcreg & RME96_WCR_MASTER) &&
674*4882a593Smuzhiyun snd_rme96_getinputtype(rme96) != RME96_INPUT_ANALOG &&
675*4882a593Smuzhiyun (rate = snd_rme96_capture_getrate(rme96, &dummy)) > 0)
676*4882a593Smuzhiyun {
677*4882a593Smuzhiyun /* slave clock */
678*4882a593Smuzhiyun return rate;
679*4882a593Smuzhiyun }
680*4882a593Smuzhiyun rate = ((rme96->wcreg >> RME96_WCR_BITPOS_FREQ_0) & 1) +
681*4882a593Smuzhiyun (((rme96->wcreg >> RME96_WCR_BITPOS_FREQ_1) & 1) << 1);
682*4882a593Smuzhiyun switch (rate) {
683*4882a593Smuzhiyun case 1:
684*4882a593Smuzhiyun rate = 32000;
685*4882a593Smuzhiyun break;
686*4882a593Smuzhiyun case 2:
687*4882a593Smuzhiyun rate = 44100;
688*4882a593Smuzhiyun break;
689*4882a593Smuzhiyun case 3:
690*4882a593Smuzhiyun rate = 48000;
691*4882a593Smuzhiyun break;
692*4882a593Smuzhiyun default:
693*4882a593Smuzhiyun return -1;
694*4882a593Smuzhiyun }
695*4882a593Smuzhiyun return (rme96->wcreg & RME96_WCR_DS) ? rate << 1 : rate;
696*4882a593Smuzhiyun }
697*4882a593Smuzhiyun
698*4882a593Smuzhiyun static int
snd_rme96_playback_setrate(struct rme96 * rme96,int rate)699*4882a593Smuzhiyun snd_rme96_playback_setrate(struct rme96 *rme96,
700*4882a593Smuzhiyun int rate)
701*4882a593Smuzhiyun {
702*4882a593Smuzhiyun int ds;
703*4882a593Smuzhiyun
704*4882a593Smuzhiyun ds = rme96->wcreg & RME96_WCR_DS;
705*4882a593Smuzhiyun switch (rate) {
706*4882a593Smuzhiyun case 32000:
707*4882a593Smuzhiyun rme96->wcreg &= ~RME96_WCR_DS;
708*4882a593Smuzhiyun rme96->wcreg = (rme96->wcreg | RME96_WCR_FREQ_0) &
709*4882a593Smuzhiyun ~RME96_WCR_FREQ_1;
710*4882a593Smuzhiyun break;
711*4882a593Smuzhiyun case 44100:
712*4882a593Smuzhiyun rme96->wcreg &= ~RME96_WCR_DS;
713*4882a593Smuzhiyun rme96->wcreg = (rme96->wcreg | RME96_WCR_FREQ_1) &
714*4882a593Smuzhiyun ~RME96_WCR_FREQ_0;
715*4882a593Smuzhiyun break;
716*4882a593Smuzhiyun case 48000:
717*4882a593Smuzhiyun rme96->wcreg &= ~RME96_WCR_DS;
718*4882a593Smuzhiyun rme96->wcreg = (rme96->wcreg | RME96_WCR_FREQ_0) |
719*4882a593Smuzhiyun RME96_WCR_FREQ_1;
720*4882a593Smuzhiyun break;
721*4882a593Smuzhiyun case 64000:
722*4882a593Smuzhiyun rme96->wcreg |= RME96_WCR_DS;
723*4882a593Smuzhiyun rme96->wcreg = (rme96->wcreg | RME96_WCR_FREQ_0) &
724*4882a593Smuzhiyun ~RME96_WCR_FREQ_1;
725*4882a593Smuzhiyun break;
726*4882a593Smuzhiyun case 88200:
727*4882a593Smuzhiyun rme96->wcreg |= RME96_WCR_DS;
728*4882a593Smuzhiyun rme96->wcreg = (rme96->wcreg | RME96_WCR_FREQ_1) &
729*4882a593Smuzhiyun ~RME96_WCR_FREQ_0;
730*4882a593Smuzhiyun break;
731*4882a593Smuzhiyun case 96000:
732*4882a593Smuzhiyun rme96->wcreg |= RME96_WCR_DS;
733*4882a593Smuzhiyun rme96->wcreg = (rme96->wcreg | RME96_WCR_FREQ_0) |
734*4882a593Smuzhiyun RME96_WCR_FREQ_1;
735*4882a593Smuzhiyun break;
736*4882a593Smuzhiyun default:
737*4882a593Smuzhiyun return -EINVAL;
738*4882a593Smuzhiyun }
739*4882a593Smuzhiyun if ((!ds && rme96->wcreg & RME96_WCR_DS) ||
740*4882a593Smuzhiyun (ds && !(rme96->wcreg & RME96_WCR_DS)))
741*4882a593Smuzhiyun {
742*4882a593Smuzhiyun /* change to/from double-speed: reset the DAC (if available) */
743*4882a593Smuzhiyun snd_rme96_reset_dac(rme96);
744*4882a593Smuzhiyun return 1; /* need to restore volume */
745*4882a593Smuzhiyun } else {
746*4882a593Smuzhiyun writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER);
747*4882a593Smuzhiyun return 0;
748*4882a593Smuzhiyun }
749*4882a593Smuzhiyun }
750*4882a593Smuzhiyun
751*4882a593Smuzhiyun static int
snd_rme96_capture_analog_setrate(struct rme96 * rme96,int rate)752*4882a593Smuzhiyun snd_rme96_capture_analog_setrate(struct rme96 *rme96,
753*4882a593Smuzhiyun int rate)
754*4882a593Smuzhiyun {
755*4882a593Smuzhiyun switch (rate) {
756*4882a593Smuzhiyun case 32000:
757*4882a593Smuzhiyun rme96->areg = ((rme96->areg | RME96_AR_FREQPAD_0) &
758*4882a593Smuzhiyun ~RME96_AR_FREQPAD_1) & ~RME96_AR_FREQPAD_2;
759*4882a593Smuzhiyun break;
760*4882a593Smuzhiyun case 44100:
761*4882a593Smuzhiyun rme96->areg = ((rme96->areg & ~RME96_AR_FREQPAD_0) |
762*4882a593Smuzhiyun RME96_AR_FREQPAD_1) & ~RME96_AR_FREQPAD_2;
763*4882a593Smuzhiyun break;
764*4882a593Smuzhiyun case 48000:
765*4882a593Smuzhiyun rme96->areg = ((rme96->areg | RME96_AR_FREQPAD_0) |
766*4882a593Smuzhiyun RME96_AR_FREQPAD_1) & ~RME96_AR_FREQPAD_2;
767*4882a593Smuzhiyun break;
768*4882a593Smuzhiyun case 64000:
769*4882a593Smuzhiyun if (rme96->rev < 4) {
770*4882a593Smuzhiyun return -EINVAL;
771*4882a593Smuzhiyun }
772*4882a593Smuzhiyun rme96->areg = ((rme96->areg | RME96_AR_FREQPAD_0) &
773*4882a593Smuzhiyun ~RME96_AR_FREQPAD_1) | RME96_AR_FREQPAD_2;
774*4882a593Smuzhiyun break;
775*4882a593Smuzhiyun case 88200:
776*4882a593Smuzhiyun if (rme96->rev < 4) {
777*4882a593Smuzhiyun return -EINVAL;
778*4882a593Smuzhiyun }
779*4882a593Smuzhiyun rme96->areg = ((rme96->areg & ~RME96_AR_FREQPAD_0) |
780*4882a593Smuzhiyun RME96_AR_FREQPAD_1) | RME96_AR_FREQPAD_2;
781*4882a593Smuzhiyun break;
782*4882a593Smuzhiyun case 96000:
783*4882a593Smuzhiyun rme96->areg = ((rme96->areg | RME96_AR_FREQPAD_0) |
784*4882a593Smuzhiyun RME96_AR_FREQPAD_1) | RME96_AR_FREQPAD_2;
785*4882a593Smuzhiyun break;
786*4882a593Smuzhiyun default:
787*4882a593Smuzhiyun return -EINVAL;
788*4882a593Smuzhiyun }
789*4882a593Smuzhiyun writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG);
790*4882a593Smuzhiyun return 0;
791*4882a593Smuzhiyun }
792*4882a593Smuzhiyun
793*4882a593Smuzhiyun static int
snd_rme96_setclockmode(struct rme96 * rme96,int mode)794*4882a593Smuzhiyun snd_rme96_setclockmode(struct rme96 *rme96,
795*4882a593Smuzhiyun int mode)
796*4882a593Smuzhiyun {
797*4882a593Smuzhiyun switch (mode) {
798*4882a593Smuzhiyun case RME96_CLOCKMODE_SLAVE:
799*4882a593Smuzhiyun /* AutoSync */
800*4882a593Smuzhiyun rme96->wcreg &= ~RME96_WCR_MASTER;
801*4882a593Smuzhiyun rme96->areg &= ~RME96_AR_WSEL;
802*4882a593Smuzhiyun break;
803*4882a593Smuzhiyun case RME96_CLOCKMODE_MASTER:
804*4882a593Smuzhiyun /* Internal */
805*4882a593Smuzhiyun rme96->wcreg |= RME96_WCR_MASTER;
806*4882a593Smuzhiyun rme96->areg &= ~RME96_AR_WSEL;
807*4882a593Smuzhiyun break;
808*4882a593Smuzhiyun case RME96_CLOCKMODE_WORDCLOCK:
809*4882a593Smuzhiyun /* Word clock is a master mode */
810*4882a593Smuzhiyun rme96->wcreg |= RME96_WCR_MASTER;
811*4882a593Smuzhiyun rme96->areg |= RME96_AR_WSEL;
812*4882a593Smuzhiyun break;
813*4882a593Smuzhiyun default:
814*4882a593Smuzhiyun return -EINVAL;
815*4882a593Smuzhiyun }
816*4882a593Smuzhiyun writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER);
817*4882a593Smuzhiyun writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG);
818*4882a593Smuzhiyun return 0;
819*4882a593Smuzhiyun }
820*4882a593Smuzhiyun
821*4882a593Smuzhiyun static int
snd_rme96_getclockmode(struct rme96 * rme96)822*4882a593Smuzhiyun snd_rme96_getclockmode(struct rme96 *rme96)
823*4882a593Smuzhiyun {
824*4882a593Smuzhiyun if (rme96->areg & RME96_AR_WSEL) {
825*4882a593Smuzhiyun return RME96_CLOCKMODE_WORDCLOCK;
826*4882a593Smuzhiyun }
827*4882a593Smuzhiyun return (rme96->wcreg & RME96_WCR_MASTER) ? RME96_CLOCKMODE_MASTER :
828*4882a593Smuzhiyun RME96_CLOCKMODE_SLAVE;
829*4882a593Smuzhiyun }
830*4882a593Smuzhiyun
831*4882a593Smuzhiyun static int
snd_rme96_setinputtype(struct rme96 * rme96,int type)832*4882a593Smuzhiyun snd_rme96_setinputtype(struct rme96 *rme96,
833*4882a593Smuzhiyun int type)
834*4882a593Smuzhiyun {
835*4882a593Smuzhiyun int n;
836*4882a593Smuzhiyun
837*4882a593Smuzhiyun switch (type) {
838*4882a593Smuzhiyun case RME96_INPUT_OPTICAL:
839*4882a593Smuzhiyun rme96->wcreg = (rme96->wcreg & ~RME96_WCR_INP_0) &
840*4882a593Smuzhiyun ~RME96_WCR_INP_1;
841*4882a593Smuzhiyun break;
842*4882a593Smuzhiyun case RME96_INPUT_COAXIAL:
843*4882a593Smuzhiyun rme96->wcreg = (rme96->wcreg | RME96_WCR_INP_0) &
844*4882a593Smuzhiyun ~RME96_WCR_INP_1;
845*4882a593Smuzhiyun break;
846*4882a593Smuzhiyun case RME96_INPUT_INTERNAL:
847*4882a593Smuzhiyun rme96->wcreg = (rme96->wcreg & ~RME96_WCR_INP_0) |
848*4882a593Smuzhiyun RME96_WCR_INP_1;
849*4882a593Smuzhiyun break;
850*4882a593Smuzhiyun case RME96_INPUT_XLR:
851*4882a593Smuzhiyun if ((rme96->pci->device != PCI_DEVICE_ID_RME_DIGI96_8_PAD_OR_PST &&
852*4882a593Smuzhiyun rme96->pci->device != PCI_DEVICE_ID_RME_DIGI96_8_PRO) ||
853*4882a593Smuzhiyun (rme96->pci->device == PCI_DEVICE_ID_RME_DIGI96_8_PAD_OR_PST &&
854*4882a593Smuzhiyun rme96->rev > 4))
855*4882a593Smuzhiyun {
856*4882a593Smuzhiyun /* Only Digi96/8 PRO and Digi96/8 PAD supports XLR */
857*4882a593Smuzhiyun return -EINVAL;
858*4882a593Smuzhiyun }
859*4882a593Smuzhiyun rme96->wcreg = (rme96->wcreg | RME96_WCR_INP_0) |
860*4882a593Smuzhiyun RME96_WCR_INP_1;
861*4882a593Smuzhiyun break;
862*4882a593Smuzhiyun case RME96_INPUT_ANALOG:
863*4882a593Smuzhiyun if (!RME96_HAS_ANALOG_IN(rme96)) {
864*4882a593Smuzhiyun return -EINVAL;
865*4882a593Smuzhiyun }
866*4882a593Smuzhiyun rme96->areg |= RME96_AR_ANALOG;
867*4882a593Smuzhiyun writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG);
868*4882a593Smuzhiyun if (rme96->rev < 4) {
869*4882a593Smuzhiyun /*
870*4882a593Smuzhiyun * Revision less than 004 does not support 64 and
871*4882a593Smuzhiyun * 88.2 kHz
872*4882a593Smuzhiyun */
873*4882a593Smuzhiyun if (snd_rme96_capture_getrate(rme96, &n) == 88200) {
874*4882a593Smuzhiyun snd_rme96_capture_analog_setrate(rme96, 44100);
875*4882a593Smuzhiyun }
876*4882a593Smuzhiyun if (snd_rme96_capture_getrate(rme96, &n) == 64000) {
877*4882a593Smuzhiyun snd_rme96_capture_analog_setrate(rme96, 32000);
878*4882a593Smuzhiyun }
879*4882a593Smuzhiyun }
880*4882a593Smuzhiyun return 0;
881*4882a593Smuzhiyun default:
882*4882a593Smuzhiyun return -EINVAL;
883*4882a593Smuzhiyun }
884*4882a593Smuzhiyun if (type != RME96_INPUT_ANALOG && RME96_HAS_ANALOG_IN(rme96)) {
885*4882a593Smuzhiyun rme96->areg &= ~RME96_AR_ANALOG;
886*4882a593Smuzhiyun writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG);
887*4882a593Smuzhiyun }
888*4882a593Smuzhiyun writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER);
889*4882a593Smuzhiyun return 0;
890*4882a593Smuzhiyun }
891*4882a593Smuzhiyun
892*4882a593Smuzhiyun static int
snd_rme96_getinputtype(struct rme96 * rme96)893*4882a593Smuzhiyun snd_rme96_getinputtype(struct rme96 *rme96)
894*4882a593Smuzhiyun {
895*4882a593Smuzhiyun if (rme96->areg & RME96_AR_ANALOG) {
896*4882a593Smuzhiyun return RME96_INPUT_ANALOG;
897*4882a593Smuzhiyun }
898*4882a593Smuzhiyun return ((rme96->wcreg >> RME96_WCR_BITPOS_INP_0) & 1) +
899*4882a593Smuzhiyun (((rme96->wcreg >> RME96_WCR_BITPOS_INP_1) & 1) << 1);
900*4882a593Smuzhiyun }
901*4882a593Smuzhiyun
902*4882a593Smuzhiyun static void
snd_rme96_setframelog(struct rme96 * rme96,int n_channels,int is_playback)903*4882a593Smuzhiyun snd_rme96_setframelog(struct rme96 *rme96,
904*4882a593Smuzhiyun int n_channels,
905*4882a593Smuzhiyun int is_playback)
906*4882a593Smuzhiyun {
907*4882a593Smuzhiyun int frlog;
908*4882a593Smuzhiyun
909*4882a593Smuzhiyun if (n_channels == 2) {
910*4882a593Smuzhiyun frlog = 1;
911*4882a593Smuzhiyun } else {
912*4882a593Smuzhiyun /* assume 8 channels */
913*4882a593Smuzhiyun frlog = 3;
914*4882a593Smuzhiyun }
915*4882a593Smuzhiyun if (is_playback) {
916*4882a593Smuzhiyun frlog += (rme96->wcreg & RME96_WCR_MODE24) ? 2 : 1;
917*4882a593Smuzhiyun rme96->playback_frlog = frlog;
918*4882a593Smuzhiyun } else {
919*4882a593Smuzhiyun frlog += (rme96->wcreg & RME96_WCR_MODE24_2) ? 2 : 1;
920*4882a593Smuzhiyun rme96->capture_frlog = frlog;
921*4882a593Smuzhiyun }
922*4882a593Smuzhiyun }
923*4882a593Smuzhiyun
924*4882a593Smuzhiyun static int
snd_rme96_playback_setformat(struct rme96 * rme96,snd_pcm_format_t format)925*4882a593Smuzhiyun snd_rme96_playback_setformat(struct rme96 *rme96, snd_pcm_format_t format)
926*4882a593Smuzhiyun {
927*4882a593Smuzhiyun switch (format) {
928*4882a593Smuzhiyun case SNDRV_PCM_FORMAT_S16_LE:
929*4882a593Smuzhiyun rme96->wcreg &= ~RME96_WCR_MODE24;
930*4882a593Smuzhiyun break;
931*4882a593Smuzhiyun case SNDRV_PCM_FORMAT_S32_LE:
932*4882a593Smuzhiyun rme96->wcreg |= RME96_WCR_MODE24;
933*4882a593Smuzhiyun break;
934*4882a593Smuzhiyun default:
935*4882a593Smuzhiyun return -EINVAL;
936*4882a593Smuzhiyun }
937*4882a593Smuzhiyun writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER);
938*4882a593Smuzhiyun return 0;
939*4882a593Smuzhiyun }
940*4882a593Smuzhiyun
941*4882a593Smuzhiyun static int
snd_rme96_capture_setformat(struct rme96 * rme96,snd_pcm_format_t format)942*4882a593Smuzhiyun snd_rme96_capture_setformat(struct rme96 *rme96, snd_pcm_format_t format)
943*4882a593Smuzhiyun {
944*4882a593Smuzhiyun switch (format) {
945*4882a593Smuzhiyun case SNDRV_PCM_FORMAT_S16_LE:
946*4882a593Smuzhiyun rme96->wcreg &= ~RME96_WCR_MODE24_2;
947*4882a593Smuzhiyun break;
948*4882a593Smuzhiyun case SNDRV_PCM_FORMAT_S32_LE:
949*4882a593Smuzhiyun rme96->wcreg |= RME96_WCR_MODE24_2;
950*4882a593Smuzhiyun break;
951*4882a593Smuzhiyun default:
952*4882a593Smuzhiyun return -EINVAL;
953*4882a593Smuzhiyun }
954*4882a593Smuzhiyun writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER);
955*4882a593Smuzhiyun return 0;
956*4882a593Smuzhiyun }
957*4882a593Smuzhiyun
958*4882a593Smuzhiyun static void
snd_rme96_set_period_properties(struct rme96 * rme96,size_t period_bytes)959*4882a593Smuzhiyun snd_rme96_set_period_properties(struct rme96 *rme96,
960*4882a593Smuzhiyun size_t period_bytes)
961*4882a593Smuzhiyun {
962*4882a593Smuzhiyun switch (period_bytes) {
963*4882a593Smuzhiyun case RME96_LARGE_BLOCK_SIZE:
964*4882a593Smuzhiyun rme96->wcreg &= ~RME96_WCR_ISEL;
965*4882a593Smuzhiyun break;
966*4882a593Smuzhiyun case RME96_SMALL_BLOCK_SIZE:
967*4882a593Smuzhiyun rme96->wcreg |= RME96_WCR_ISEL;
968*4882a593Smuzhiyun break;
969*4882a593Smuzhiyun default:
970*4882a593Smuzhiyun snd_BUG();
971*4882a593Smuzhiyun break;
972*4882a593Smuzhiyun }
973*4882a593Smuzhiyun rme96->wcreg &= ~RME96_WCR_IDIS;
974*4882a593Smuzhiyun writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER);
975*4882a593Smuzhiyun }
976*4882a593Smuzhiyun
977*4882a593Smuzhiyun static int
snd_rme96_playback_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params)978*4882a593Smuzhiyun snd_rme96_playback_hw_params(struct snd_pcm_substream *substream,
979*4882a593Smuzhiyun struct snd_pcm_hw_params *params)
980*4882a593Smuzhiyun {
981*4882a593Smuzhiyun struct rme96 *rme96 = snd_pcm_substream_chip(substream);
982*4882a593Smuzhiyun struct snd_pcm_runtime *runtime = substream->runtime;
983*4882a593Smuzhiyun int err, rate, dummy;
984*4882a593Smuzhiyun bool apply_dac_volume = false;
985*4882a593Smuzhiyun
986*4882a593Smuzhiyun runtime->dma_area = (void __force *)(rme96->iobase +
987*4882a593Smuzhiyun RME96_IO_PLAY_BUFFER);
988*4882a593Smuzhiyun runtime->dma_addr = rme96->port + RME96_IO_PLAY_BUFFER;
989*4882a593Smuzhiyun runtime->dma_bytes = RME96_BUFFER_SIZE;
990*4882a593Smuzhiyun
991*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
992*4882a593Smuzhiyun if (!(rme96->wcreg & RME96_WCR_MASTER) &&
993*4882a593Smuzhiyun snd_rme96_getinputtype(rme96) != RME96_INPUT_ANALOG &&
994*4882a593Smuzhiyun (rate = snd_rme96_capture_getrate(rme96, &dummy)) > 0)
995*4882a593Smuzhiyun {
996*4882a593Smuzhiyun /* slave clock */
997*4882a593Smuzhiyun if ((int)params_rate(params) != rate) {
998*4882a593Smuzhiyun err = -EIO;
999*4882a593Smuzhiyun goto error;
1000*4882a593Smuzhiyun }
1001*4882a593Smuzhiyun } else {
1002*4882a593Smuzhiyun err = snd_rme96_playback_setrate(rme96, params_rate(params));
1003*4882a593Smuzhiyun if (err < 0)
1004*4882a593Smuzhiyun goto error;
1005*4882a593Smuzhiyun apply_dac_volume = err > 0; /* need to restore volume later? */
1006*4882a593Smuzhiyun }
1007*4882a593Smuzhiyun
1008*4882a593Smuzhiyun err = snd_rme96_playback_setformat(rme96, params_format(params));
1009*4882a593Smuzhiyun if (err < 0)
1010*4882a593Smuzhiyun goto error;
1011*4882a593Smuzhiyun snd_rme96_setframelog(rme96, params_channels(params), 1);
1012*4882a593Smuzhiyun if (rme96->capture_periodsize != 0) {
1013*4882a593Smuzhiyun if (params_period_size(params) << rme96->playback_frlog !=
1014*4882a593Smuzhiyun rme96->capture_periodsize)
1015*4882a593Smuzhiyun {
1016*4882a593Smuzhiyun err = -EBUSY;
1017*4882a593Smuzhiyun goto error;
1018*4882a593Smuzhiyun }
1019*4882a593Smuzhiyun }
1020*4882a593Smuzhiyun rme96->playback_periodsize =
1021*4882a593Smuzhiyun params_period_size(params) << rme96->playback_frlog;
1022*4882a593Smuzhiyun snd_rme96_set_period_properties(rme96, rme96->playback_periodsize);
1023*4882a593Smuzhiyun /* S/PDIF setup */
1024*4882a593Smuzhiyun if ((rme96->wcreg & RME96_WCR_ADAT) == 0) {
1025*4882a593Smuzhiyun rme96->wcreg &= ~(RME96_WCR_PRO | RME96_WCR_DOLBY | RME96_WCR_EMP);
1026*4882a593Smuzhiyun writel(rme96->wcreg |= rme96->wcreg_spdif_stream, rme96->iobase + RME96_IO_CONTROL_REGISTER);
1027*4882a593Smuzhiyun }
1028*4882a593Smuzhiyun
1029*4882a593Smuzhiyun err = 0;
1030*4882a593Smuzhiyun error:
1031*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
1032*4882a593Smuzhiyun if (apply_dac_volume) {
1033*4882a593Smuzhiyun usleep_range(3000, 10000);
1034*4882a593Smuzhiyun snd_rme96_apply_dac_volume(rme96);
1035*4882a593Smuzhiyun }
1036*4882a593Smuzhiyun
1037*4882a593Smuzhiyun return err;
1038*4882a593Smuzhiyun }
1039*4882a593Smuzhiyun
1040*4882a593Smuzhiyun static int
snd_rme96_capture_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params)1041*4882a593Smuzhiyun snd_rme96_capture_hw_params(struct snd_pcm_substream *substream,
1042*4882a593Smuzhiyun struct snd_pcm_hw_params *params)
1043*4882a593Smuzhiyun {
1044*4882a593Smuzhiyun struct rme96 *rme96 = snd_pcm_substream_chip(substream);
1045*4882a593Smuzhiyun struct snd_pcm_runtime *runtime = substream->runtime;
1046*4882a593Smuzhiyun int err, isadat, rate;
1047*4882a593Smuzhiyun
1048*4882a593Smuzhiyun runtime->dma_area = (void __force *)(rme96->iobase +
1049*4882a593Smuzhiyun RME96_IO_REC_BUFFER);
1050*4882a593Smuzhiyun runtime->dma_addr = rme96->port + RME96_IO_REC_BUFFER;
1051*4882a593Smuzhiyun runtime->dma_bytes = RME96_BUFFER_SIZE;
1052*4882a593Smuzhiyun
1053*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
1054*4882a593Smuzhiyun if ((err = snd_rme96_capture_setformat(rme96, params_format(params))) < 0) {
1055*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
1056*4882a593Smuzhiyun return err;
1057*4882a593Smuzhiyun }
1058*4882a593Smuzhiyun if (snd_rme96_getinputtype(rme96) == RME96_INPUT_ANALOG) {
1059*4882a593Smuzhiyun if ((err = snd_rme96_capture_analog_setrate(rme96,
1060*4882a593Smuzhiyun params_rate(params))) < 0)
1061*4882a593Smuzhiyun {
1062*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
1063*4882a593Smuzhiyun return err;
1064*4882a593Smuzhiyun }
1065*4882a593Smuzhiyun } else if ((rate = snd_rme96_capture_getrate(rme96, &isadat)) > 0) {
1066*4882a593Smuzhiyun if ((int)params_rate(params) != rate) {
1067*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
1068*4882a593Smuzhiyun return -EIO;
1069*4882a593Smuzhiyun }
1070*4882a593Smuzhiyun if ((isadat && runtime->hw.channels_min == 2) ||
1071*4882a593Smuzhiyun (!isadat && runtime->hw.channels_min == 8))
1072*4882a593Smuzhiyun {
1073*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
1074*4882a593Smuzhiyun return -EIO;
1075*4882a593Smuzhiyun }
1076*4882a593Smuzhiyun }
1077*4882a593Smuzhiyun snd_rme96_setframelog(rme96, params_channels(params), 0);
1078*4882a593Smuzhiyun if (rme96->playback_periodsize != 0) {
1079*4882a593Smuzhiyun if (params_period_size(params) << rme96->capture_frlog !=
1080*4882a593Smuzhiyun rme96->playback_periodsize)
1081*4882a593Smuzhiyun {
1082*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
1083*4882a593Smuzhiyun return -EBUSY;
1084*4882a593Smuzhiyun }
1085*4882a593Smuzhiyun }
1086*4882a593Smuzhiyun rme96->capture_periodsize =
1087*4882a593Smuzhiyun params_period_size(params) << rme96->capture_frlog;
1088*4882a593Smuzhiyun snd_rme96_set_period_properties(rme96, rme96->capture_periodsize);
1089*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
1090*4882a593Smuzhiyun
1091*4882a593Smuzhiyun return 0;
1092*4882a593Smuzhiyun }
1093*4882a593Smuzhiyun
1094*4882a593Smuzhiyun static void
snd_rme96_trigger(struct rme96 * rme96,int op)1095*4882a593Smuzhiyun snd_rme96_trigger(struct rme96 *rme96,
1096*4882a593Smuzhiyun int op)
1097*4882a593Smuzhiyun {
1098*4882a593Smuzhiyun if (op & RME96_TB_RESET_PLAYPOS)
1099*4882a593Smuzhiyun writel(0, rme96->iobase + RME96_IO_RESET_PLAY_POS);
1100*4882a593Smuzhiyun if (op & RME96_TB_RESET_CAPTUREPOS)
1101*4882a593Smuzhiyun writel(0, rme96->iobase + RME96_IO_RESET_REC_POS);
1102*4882a593Smuzhiyun if (op & RME96_TB_CLEAR_PLAYBACK_IRQ) {
1103*4882a593Smuzhiyun rme96->rcreg = readl(rme96->iobase + RME96_IO_CONTROL_REGISTER);
1104*4882a593Smuzhiyun if (rme96->rcreg & RME96_RCR_IRQ)
1105*4882a593Smuzhiyun writel(0, rme96->iobase + RME96_IO_CONFIRM_PLAY_IRQ);
1106*4882a593Smuzhiyun }
1107*4882a593Smuzhiyun if (op & RME96_TB_CLEAR_CAPTURE_IRQ) {
1108*4882a593Smuzhiyun rme96->rcreg = readl(rme96->iobase + RME96_IO_CONTROL_REGISTER);
1109*4882a593Smuzhiyun if (rme96->rcreg & RME96_RCR_IRQ_2)
1110*4882a593Smuzhiyun writel(0, rme96->iobase + RME96_IO_CONFIRM_REC_IRQ);
1111*4882a593Smuzhiyun }
1112*4882a593Smuzhiyun if (op & RME96_TB_START_PLAYBACK)
1113*4882a593Smuzhiyun rme96->wcreg |= RME96_WCR_START;
1114*4882a593Smuzhiyun if (op & RME96_TB_STOP_PLAYBACK)
1115*4882a593Smuzhiyun rme96->wcreg &= ~RME96_WCR_START;
1116*4882a593Smuzhiyun if (op & RME96_TB_START_CAPTURE)
1117*4882a593Smuzhiyun rme96->wcreg |= RME96_WCR_START_2;
1118*4882a593Smuzhiyun if (op & RME96_TB_STOP_CAPTURE)
1119*4882a593Smuzhiyun rme96->wcreg &= ~RME96_WCR_START_2;
1120*4882a593Smuzhiyun writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER);
1121*4882a593Smuzhiyun }
1122*4882a593Smuzhiyun
1123*4882a593Smuzhiyun
1124*4882a593Smuzhiyun
1125*4882a593Smuzhiyun static irqreturn_t
snd_rme96_interrupt(int irq,void * dev_id)1126*4882a593Smuzhiyun snd_rme96_interrupt(int irq,
1127*4882a593Smuzhiyun void *dev_id)
1128*4882a593Smuzhiyun {
1129*4882a593Smuzhiyun struct rme96 *rme96 = (struct rme96 *)dev_id;
1130*4882a593Smuzhiyun
1131*4882a593Smuzhiyun rme96->rcreg = readl(rme96->iobase + RME96_IO_CONTROL_REGISTER);
1132*4882a593Smuzhiyun /* fastpath out, to ease interrupt sharing */
1133*4882a593Smuzhiyun if (!((rme96->rcreg & RME96_RCR_IRQ) ||
1134*4882a593Smuzhiyun (rme96->rcreg & RME96_RCR_IRQ_2)))
1135*4882a593Smuzhiyun {
1136*4882a593Smuzhiyun return IRQ_NONE;
1137*4882a593Smuzhiyun }
1138*4882a593Smuzhiyun
1139*4882a593Smuzhiyun if (rme96->rcreg & RME96_RCR_IRQ) {
1140*4882a593Smuzhiyun /* playback */
1141*4882a593Smuzhiyun snd_pcm_period_elapsed(rme96->playback_substream);
1142*4882a593Smuzhiyun writel(0, rme96->iobase + RME96_IO_CONFIRM_PLAY_IRQ);
1143*4882a593Smuzhiyun }
1144*4882a593Smuzhiyun if (rme96->rcreg & RME96_RCR_IRQ_2) {
1145*4882a593Smuzhiyun /* capture */
1146*4882a593Smuzhiyun snd_pcm_period_elapsed(rme96->capture_substream);
1147*4882a593Smuzhiyun writel(0, rme96->iobase + RME96_IO_CONFIRM_REC_IRQ);
1148*4882a593Smuzhiyun }
1149*4882a593Smuzhiyun return IRQ_HANDLED;
1150*4882a593Smuzhiyun }
1151*4882a593Smuzhiyun
1152*4882a593Smuzhiyun static const unsigned int period_bytes[] = { RME96_SMALL_BLOCK_SIZE, RME96_LARGE_BLOCK_SIZE };
1153*4882a593Smuzhiyun
1154*4882a593Smuzhiyun static const struct snd_pcm_hw_constraint_list hw_constraints_period_bytes = {
1155*4882a593Smuzhiyun .count = ARRAY_SIZE(period_bytes),
1156*4882a593Smuzhiyun .list = period_bytes,
1157*4882a593Smuzhiyun .mask = 0
1158*4882a593Smuzhiyun };
1159*4882a593Smuzhiyun
1160*4882a593Smuzhiyun static void
rme96_set_buffer_size_constraint(struct rme96 * rme96,struct snd_pcm_runtime * runtime)1161*4882a593Smuzhiyun rme96_set_buffer_size_constraint(struct rme96 *rme96,
1162*4882a593Smuzhiyun struct snd_pcm_runtime *runtime)
1163*4882a593Smuzhiyun {
1164*4882a593Smuzhiyun unsigned int size;
1165*4882a593Smuzhiyun
1166*4882a593Smuzhiyun snd_pcm_hw_constraint_single(runtime, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
1167*4882a593Smuzhiyun RME96_BUFFER_SIZE);
1168*4882a593Smuzhiyun if ((size = rme96->playback_periodsize) != 0 ||
1169*4882a593Smuzhiyun (size = rme96->capture_periodsize) != 0)
1170*4882a593Smuzhiyun snd_pcm_hw_constraint_single(runtime,
1171*4882a593Smuzhiyun SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
1172*4882a593Smuzhiyun size);
1173*4882a593Smuzhiyun else
1174*4882a593Smuzhiyun snd_pcm_hw_constraint_list(runtime, 0,
1175*4882a593Smuzhiyun SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
1176*4882a593Smuzhiyun &hw_constraints_period_bytes);
1177*4882a593Smuzhiyun }
1178*4882a593Smuzhiyun
1179*4882a593Smuzhiyun static int
snd_rme96_playback_spdif_open(struct snd_pcm_substream * substream)1180*4882a593Smuzhiyun snd_rme96_playback_spdif_open(struct snd_pcm_substream *substream)
1181*4882a593Smuzhiyun {
1182*4882a593Smuzhiyun int rate, dummy;
1183*4882a593Smuzhiyun struct rme96 *rme96 = snd_pcm_substream_chip(substream);
1184*4882a593Smuzhiyun struct snd_pcm_runtime *runtime = substream->runtime;
1185*4882a593Smuzhiyun
1186*4882a593Smuzhiyun snd_pcm_set_sync(substream);
1187*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
1188*4882a593Smuzhiyun if (rme96->playback_substream) {
1189*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
1190*4882a593Smuzhiyun return -EBUSY;
1191*4882a593Smuzhiyun }
1192*4882a593Smuzhiyun rme96->wcreg &= ~RME96_WCR_ADAT;
1193*4882a593Smuzhiyun writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER);
1194*4882a593Smuzhiyun rme96->playback_substream = substream;
1195*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
1196*4882a593Smuzhiyun
1197*4882a593Smuzhiyun runtime->hw = snd_rme96_playback_spdif_info;
1198*4882a593Smuzhiyun if (!(rme96->wcreg & RME96_WCR_MASTER) &&
1199*4882a593Smuzhiyun snd_rme96_getinputtype(rme96) != RME96_INPUT_ANALOG &&
1200*4882a593Smuzhiyun (rate = snd_rme96_capture_getrate(rme96, &dummy)) > 0)
1201*4882a593Smuzhiyun {
1202*4882a593Smuzhiyun /* slave clock */
1203*4882a593Smuzhiyun runtime->hw.rates = snd_pcm_rate_to_rate_bit(rate);
1204*4882a593Smuzhiyun runtime->hw.rate_min = rate;
1205*4882a593Smuzhiyun runtime->hw.rate_max = rate;
1206*4882a593Smuzhiyun }
1207*4882a593Smuzhiyun rme96_set_buffer_size_constraint(rme96, runtime);
1208*4882a593Smuzhiyun
1209*4882a593Smuzhiyun rme96->wcreg_spdif_stream = rme96->wcreg_spdif;
1210*4882a593Smuzhiyun rme96->spdif_ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
1211*4882a593Smuzhiyun snd_ctl_notify(rme96->card, SNDRV_CTL_EVENT_MASK_VALUE |
1212*4882a593Smuzhiyun SNDRV_CTL_EVENT_MASK_INFO, &rme96->spdif_ctl->id);
1213*4882a593Smuzhiyun return 0;
1214*4882a593Smuzhiyun }
1215*4882a593Smuzhiyun
1216*4882a593Smuzhiyun static int
snd_rme96_capture_spdif_open(struct snd_pcm_substream * substream)1217*4882a593Smuzhiyun snd_rme96_capture_spdif_open(struct snd_pcm_substream *substream)
1218*4882a593Smuzhiyun {
1219*4882a593Smuzhiyun int isadat, rate;
1220*4882a593Smuzhiyun struct rme96 *rme96 = snd_pcm_substream_chip(substream);
1221*4882a593Smuzhiyun struct snd_pcm_runtime *runtime = substream->runtime;
1222*4882a593Smuzhiyun
1223*4882a593Smuzhiyun snd_pcm_set_sync(substream);
1224*4882a593Smuzhiyun runtime->hw = snd_rme96_capture_spdif_info;
1225*4882a593Smuzhiyun if (snd_rme96_getinputtype(rme96) != RME96_INPUT_ANALOG &&
1226*4882a593Smuzhiyun (rate = snd_rme96_capture_getrate(rme96, &isadat)) > 0)
1227*4882a593Smuzhiyun {
1228*4882a593Smuzhiyun if (isadat) {
1229*4882a593Smuzhiyun return -EIO;
1230*4882a593Smuzhiyun }
1231*4882a593Smuzhiyun runtime->hw.rates = snd_pcm_rate_to_rate_bit(rate);
1232*4882a593Smuzhiyun runtime->hw.rate_min = rate;
1233*4882a593Smuzhiyun runtime->hw.rate_max = rate;
1234*4882a593Smuzhiyun }
1235*4882a593Smuzhiyun
1236*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
1237*4882a593Smuzhiyun if (rme96->capture_substream) {
1238*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
1239*4882a593Smuzhiyun return -EBUSY;
1240*4882a593Smuzhiyun }
1241*4882a593Smuzhiyun rme96->capture_substream = substream;
1242*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
1243*4882a593Smuzhiyun
1244*4882a593Smuzhiyun rme96_set_buffer_size_constraint(rme96, runtime);
1245*4882a593Smuzhiyun return 0;
1246*4882a593Smuzhiyun }
1247*4882a593Smuzhiyun
1248*4882a593Smuzhiyun static int
snd_rme96_playback_adat_open(struct snd_pcm_substream * substream)1249*4882a593Smuzhiyun snd_rme96_playback_adat_open(struct snd_pcm_substream *substream)
1250*4882a593Smuzhiyun {
1251*4882a593Smuzhiyun int rate, dummy;
1252*4882a593Smuzhiyun struct rme96 *rme96 = snd_pcm_substream_chip(substream);
1253*4882a593Smuzhiyun struct snd_pcm_runtime *runtime = substream->runtime;
1254*4882a593Smuzhiyun
1255*4882a593Smuzhiyun snd_pcm_set_sync(substream);
1256*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
1257*4882a593Smuzhiyun if (rme96->playback_substream) {
1258*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
1259*4882a593Smuzhiyun return -EBUSY;
1260*4882a593Smuzhiyun }
1261*4882a593Smuzhiyun rme96->wcreg |= RME96_WCR_ADAT;
1262*4882a593Smuzhiyun writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER);
1263*4882a593Smuzhiyun rme96->playback_substream = substream;
1264*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
1265*4882a593Smuzhiyun
1266*4882a593Smuzhiyun runtime->hw = snd_rme96_playback_adat_info;
1267*4882a593Smuzhiyun if (!(rme96->wcreg & RME96_WCR_MASTER) &&
1268*4882a593Smuzhiyun snd_rme96_getinputtype(rme96) != RME96_INPUT_ANALOG &&
1269*4882a593Smuzhiyun (rate = snd_rme96_capture_getrate(rme96, &dummy)) > 0)
1270*4882a593Smuzhiyun {
1271*4882a593Smuzhiyun /* slave clock */
1272*4882a593Smuzhiyun runtime->hw.rates = snd_pcm_rate_to_rate_bit(rate);
1273*4882a593Smuzhiyun runtime->hw.rate_min = rate;
1274*4882a593Smuzhiyun runtime->hw.rate_max = rate;
1275*4882a593Smuzhiyun }
1276*4882a593Smuzhiyun rme96_set_buffer_size_constraint(rme96, runtime);
1277*4882a593Smuzhiyun return 0;
1278*4882a593Smuzhiyun }
1279*4882a593Smuzhiyun
1280*4882a593Smuzhiyun static int
snd_rme96_capture_adat_open(struct snd_pcm_substream * substream)1281*4882a593Smuzhiyun snd_rme96_capture_adat_open(struct snd_pcm_substream *substream)
1282*4882a593Smuzhiyun {
1283*4882a593Smuzhiyun int isadat, rate;
1284*4882a593Smuzhiyun struct rme96 *rme96 = snd_pcm_substream_chip(substream);
1285*4882a593Smuzhiyun struct snd_pcm_runtime *runtime = substream->runtime;
1286*4882a593Smuzhiyun
1287*4882a593Smuzhiyun snd_pcm_set_sync(substream);
1288*4882a593Smuzhiyun runtime->hw = snd_rme96_capture_adat_info;
1289*4882a593Smuzhiyun if (snd_rme96_getinputtype(rme96) == RME96_INPUT_ANALOG) {
1290*4882a593Smuzhiyun /* makes no sense to use analog input. Note that analog
1291*4882a593Smuzhiyun expension cards AEB4/8-I are RME96_INPUT_INTERNAL */
1292*4882a593Smuzhiyun return -EIO;
1293*4882a593Smuzhiyun }
1294*4882a593Smuzhiyun if ((rate = snd_rme96_capture_getrate(rme96, &isadat)) > 0) {
1295*4882a593Smuzhiyun if (!isadat) {
1296*4882a593Smuzhiyun return -EIO;
1297*4882a593Smuzhiyun }
1298*4882a593Smuzhiyun runtime->hw.rates = snd_pcm_rate_to_rate_bit(rate);
1299*4882a593Smuzhiyun runtime->hw.rate_min = rate;
1300*4882a593Smuzhiyun runtime->hw.rate_max = rate;
1301*4882a593Smuzhiyun }
1302*4882a593Smuzhiyun
1303*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
1304*4882a593Smuzhiyun if (rme96->capture_substream) {
1305*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
1306*4882a593Smuzhiyun return -EBUSY;
1307*4882a593Smuzhiyun }
1308*4882a593Smuzhiyun rme96->capture_substream = substream;
1309*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
1310*4882a593Smuzhiyun
1311*4882a593Smuzhiyun rme96_set_buffer_size_constraint(rme96, runtime);
1312*4882a593Smuzhiyun return 0;
1313*4882a593Smuzhiyun }
1314*4882a593Smuzhiyun
1315*4882a593Smuzhiyun static int
snd_rme96_playback_close(struct snd_pcm_substream * substream)1316*4882a593Smuzhiyun snd_rme96_playback_close(struct snd_pcm_substream *substream)
1317*4882a593Smuzhiyun {
1318*4882a593Smuzhiyun struct rme96 *rme96 = snd_pcm_substream_chip(substream);
1319*4882a593Smuzhiyun int spdif = 0;
1320*4882a593Smuzhiyun
1321*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
1322*4882a593Smuzhiyun if (RME96_ISPLAYING(rme96)) {
1323*4882a593Smuzhiyun snd_rme96_trigger(rme96, RME96_STOP_PLAYBACK);
1324*4882a593Smuzhiyun }
1325*4882a593Smuzhiyun rme96->playback_substream = NULL;
1326*4882a593Smuzhiyun rme96->playback_periodsize = 0;
1327*4882a593Smuzhiyun spdif = (rme96->wcreg & RME96_WCR_ADAT) == 0;
1328*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
1329*4882a593Smuzhiyun if (spdif) {
1330*4882a593Smuzhiyun rme96->spdif_ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
1331*4882a593Smuzhiyun snd_ctl_notify(rme96->card, SNDRV_CTL_EVENT_MASK_VALUE |
1332*4882a593Smuzhiyun SNDRV_CTL_EVENT_MASK_INFO, &rme96->spdif_ctl->id);
1333*4882a593Smuzhiyun }
1334*4882a593Smuzhiyun return 0;
1335*4882a593Smuzhiyun }
1336*4882a593Smuzhiyun
1337*4882a593Smuzhiyun static int
snd_rme96_capture_close(struct snd_pcm_substream * substream)1338*4882a593Smuzhiyun snd_rme96_capture_close(struct snd_pcm_substream *substream)
1339*4882a593Smuzhiyun {
1340*4882a593Smuzhiyun struct rme96 *rme96 = snd_pcm_substream_chip(substream);
1341*4882a593Smuzhiyun
1342*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
1343*4882a593Smuzhiyun if (RME96_ISRECORDING(rme96)) {
1344*4882a593Smuzhiyun snd_rme96_trigger(rme96, RME96_STOP_CAPTURE);
1345*4882a593Smuzhiyun }
1346*4882a593Smuzhiyun rme96->capture_substream = NULL;
1347*4882a593Smuzhiyun rme96->capture_periodsize = 0;
1348*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
1349*4882a593Smuzhiyun return 0;
1350*4882a593Smuzhiyun }
1351*4882a593Smuzhiyun
1352*4882a593Smuzhiyun static int
snd_rme96_playback_prepare(struct snd_pcm_substream * substream)1353*4882a593Smuzhiyun snd_rme96_playback_prepare(struct snd_pcm_substream *substream)
1354*4882a593Smuzhiyun {
1355*4882a593Smuzhiyun struct rme96 *rme96 = snd_pcm_substream_chip(substream);
1356*4882a593Smuzhiyun
1357*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
1358*4882a593Smuzhiyun if (RME96_ISPLAYING(rme96)) {
1359*4882a593Smuzhiyun snd_rme96_trigger(rme96, RME96_STOP_PLAYBACK);
1360*4882a593Smuzhiyun }
1361*4882a593Smuzhiyun writel(0, rme96->iobase + RME96_IO_RESET_PLAY_POS);
1362*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
1363*4882a593Smuzhiyun return 0;
1364*4882a593Smuzhiyun }
1365*4882a593Smuzhiyun
1366*4882a593Smuzhiyun static int
snd_rme96_capture_prepare(struct snd_pcm_substream * substream)1367*4882a593Smuzhiyun snd_rme96_capture_prepare(struct snd_pcm_substream *substream)
1368*4882a593Smuzhiyun {
1369*4882a593Smuzhiyun struct rme96 *rme96 = snd_pcm_substream_chip(substream);
1370*4882a593Smuzhiyun
1371*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
1372*4882a593Smuzhiyun if (RME96_ISRECORDING(rme96)) {
1373*4882a593Smuzhiyun snd_rme96_trigger(rme96, RME96_STOP_CAPTURE);
1374*4882a593Smuzhiyun }
1375*4882a593Smuzhiyun writel(0, rme96->iobase + RME96_IO_RESET_REC_POS);
1376*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
1377*4882a593Smuzhiyun return 0;
1378*4882a593Smuzhiyun }
1379*4882a593Smuzhiyun
1380*4882a593Smuzhiyun static int
snd_rme96_playback_trigger(struct snd_pcm_substream * substream,int cmd)1381*4882a593Smuzhiyun snd_rme96_playback_trigger(struct snd_pcm_substream *substream,
1382*4882a593Smuzhiyun int cmd)
1383*4882a593Smuzhiyun {
1384*4882a593Smuzhiyun struct rme96 *rme96 = snd_pcm_substream_chip(substream);
1385*4882a593Smuzhiyun struct snd_pcm_substream *s;
1386*4882a593Smuzhiyun bool sync;
1387*4882a593Smuzhiyun
1388*4882a593Smuzhiyun snd_pcm_group_for_each_entry(s, substream) {
1389*4882a593Smuzhiyun if (snd_pcm_substream_chip(s) == rme96)
1390*4882a593Smuzhiyun snd_pcm_trigger_done(s, substream);
1391*4882a593Smuzhiyun }
1392*4882a593Smuzhiyun
1393*4882a593Smuzhiyun sync = (rme96->playback_substream && rme96->capture_substream) &&
1394*4882a593Smuzhiyun (rme96->playback_substream->group ==
1395*4882a593Smuzhiyun rme96->capture_substream->group);
1396*4882a593Smuzhiyun
1397*4882a593Smuzhiyun switch (cmd) {
1398*4882a593Smuzhiyun case SNDRV_PCM_TRIGGER_START:
1399*4882a593Smuzhiyun if (!RME96_ISPLAYING(rme96)) {
1400*4882a593Smuzhiyun if (substream != rme96->playback_substream)
1401*4882a593Smuzhiyun return -EBUSY;
1402*4882a593Smuzhiyun snd_rme96_trigger(rme96, sync ? RME96_START_BOTH
1403*4882a593Smuzhiyun : RME96_START_PLAYBACK);
1404*4882a593Smuzhiyun }
1405*4882a593Smuzhiyun break;
1406*4882a593Smuzhiyun
1407*4882a593Smuzhiyun case SNDRV_PCM_TRIGGER_SUSPEND:
1408*4882a593Smuzhiyun case SNDRV_PCM_TRIGGER_STOP:
1409*4882a593Smuzhiyun if (RME96_ISPLAYING(rme96)) {
1410*4882a593Smuzhiyun if (substream != rme96->playback_substream)
1411*4882a593Smuzhiyun return -EBUSY;
1412*4882a593Smuzhiyun snd_rme96_trigger(rme96, sync ? RME96_STOP_BOTH
1413*4882a593Smuzhiyun : RME96_STOP_PLAYBACK);
1414*4882a593Smuzhiyun }
1415*4882a593Smuzhiyun break;
1416*4882a593Smuzhiyun
1417*4882a593Smuzhiyun case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
1418*4882a593Smuzhiyun if (RME96_ISPLAYING(rme96))
1419*4882a593Smuzhiyun snd_rme96_trigger(rme96, sync ? RME96_STOP_BOTH
1420*4882a593Smuzhiyun : RME96_STOP_PLAYBACK);
1421*4882a593Smuzhiyun break;
1422*4882a593Smuzhiyun
1423*4882a593Smuzhiyun case SNDRV_PCM_TRIGGER_RESUME:
1424*4882a593Smuzhiyun case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
1425*4882a593Smuzhiyun if (!RME96_ISPLAYING(rme96))
1426*4882a593Smuzhiyun snd_rme96_trigger(rme96, sync ? RME96_RESUME_BOTH
1427*4882a593Smuzhiyun : RME96_RESUME_PLAYBACK);
1428*4882a593Smuzhiyun break;
1429*4882a593Smuzhiyun
1430*4882a593Smuzhiyun default:
1431*4882a593Smuzhiyun return -EINVAL;
1432*4882a593Smuzhiyun }
1433*4882a593Smuzhiyun
1434*4882a593Smuzhiyun return 0;
1435*4882a593Smuzhiyun }
1436*4882a593Smuzhiyun
1437*4882a593Smuzhiyun static int
snd_rme96_capture_trigger(struct snd_pcm_substream * substream,int cmd)1438*4882a593Smuzhiyun snd_rme96_capture_trigger(struct snd_pcm_substream *substream,
1439*4882a593Smuzhiyun int cmd)
1440*4882a593Smuzhiyun {
1441*4882a593Smuzhiyun struct rme96 *rme96 = snd_pcm_substream_chip(substream);
1442*4882a593Smuzhiyun struct snd_pcm_substream *s;
1443*4882a593Smuzhiyun bool sync;
1444*4882a593Smuzhiyun
1445*4882a593Smuzhiyun snd_pcm_group_for_each_entry(s, substream) {
1446*4882a593Smuzhiyun if (snd_pcm_substream_chip(s) == rme96)
1447*4882a593Smuzhiyun snd_pcm_trigger_done(s, substream);
1448*4882a593Smuzhiyun }
1449*4882a593Smuzhiyun
1450*4882a593Smuzhiyun sync = (rme96->playback_substream && rme96->capture_substream) &&
1451*4882a593Smuzhiyun (rme96->playback_substream->group ==
1452*4882a593Smuzhiyun rme96->capture_substream->group);
1453*4882a593Smuzhiyun
1454*4882a593Smuzhiyun switch (cmd) {
1455*4882a593Smuzhiyun case SNDRV_PCM_TRIGGER_START:
1456*4882a593Smuzhiyun if (!RME96_ISRECORDING(rme96)) {
1457*4882a593Smuzhiyun if (substream != rme96->capture_substream)
1458*4882a593Smuzhiyun return -EBUSY;
1459*4882a593Smuzhiyun snd_rme96_trigger(rme96, sync ? RME96_START_BOTH
1460*4882a593Smuzhiyun : RME96_START_CAPTURE);
1461*4882a593Smuzhiyun }
1462*4882a593Smuzhiyun break;
1463*4882a593Smuzhiyun
1464*4882a593Smuzhiyun case SNDRV_PCM_TRIGGER_SUSPEND:
1465*4882a593Smuzhiyun case SNDRV_PCM_TRIGGER_STOP:
1466*4882a593Smuzhiyun if (RME96_ISRECORDING(rme96)) {
1467*4882a593Smuzhiyun if (substream != rme96->capture_substream)
1468*4882a593Smuzhiyun return -EBUSY;
1469*4882a593Smuzhiyun snd_rme96_trigger(rme96, sync ? RME96_STOP_BOTH
1470*4882a593Smuzhiyun : RME96_STOP_CAPTURE);
1471*4882a593Smuzhiyun }
1472*4882a593Smuzhiyun break;
1473*4882a593Smuzhiyun
1474*4882a593Smuzhiyun case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
1475*4882a593Smuzhiyun if (RME96_ISRECORDING(rme96))
1476*4882a593Smuzhiyun snd_rme96_trigger(rme96, sync ? RME96_STOP_BOTH
1477*4882a593Smuzhiyun : RME96_STOP_CAPTURE);
1478*4882a593Smuzhiyun break;
1479*4882a593Smuzhiyun
1480*4882a593Smuzhiyun case SNDRV_PCM_TRIGGER_RESUME:
1481*4882a593Smuzhiyun case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
1482*4882a593Smuzhiyun if (!RME96_ISRECORDING(rme96))
1483*4882a593Smuzhiyun snd_rme96_trigger(rme96, sync ? RME96_RESUME_BOTH
1484*4882a593Smuzhiyun : RME96_RESUME_CAPTURE);
1485*4882a593Smuzhiyun break;
1486*4882a593Smuzhiyun
1487*4882a593Smuzhiyun default:
1488*4882a593Smuzhiyun return -EINVAL;
1489*4882a593Smuzhiyun }
1490*4882a593Smuzhiyun
1491*4882a593Smuzhiyun return 0;
1492*4882a593Smuzhiyun }
1493*4882a593Smuzhiyun
1494*4882a593Smuzhiyun static snd_pcm_uframes_t
snd_rme96_playback_pointer(struct snd_pcm_substream * substream)1495*4882a593Smuzhiyun snd_rme96_playback_pointer(struct snd_pcm_substream *substream)
1496*4882a593Smuzhiyun {
1497*4882a593Smuzhiyun struct rme96 *rme96 = snd_pcm_substream_chip(substream);
1498*4882a593Smuzhiyun return snd_rme96_playback_ptr(rme96);
1499*4882a593Smuzhiyun }
1500*4882a593Smuzhiyun
1501*4882a593Smuzhiyun static snd_pcm_uframes_t
snd_rme96_capture_pointer(struct snd_pcm_substream * substream)1502*4882a593Smuzhiyun snd_rme96_capture_pointer(struct snd_pcm_substream *substream)
1503*4882a593Smuzhiyun {
1504*4882a593Smuzhiyun struct rme96 *rme96 = snd_pcm_substream_chip(substream);
1505*4882a593Smuzhiyun return snd_rme96_capture_ptr(rme96);
1506*4882a593Smuzhiyun }
1507*4882a593Smuzhiyun
1508*4882a593Smuzhiyun static const struct snd_pcm_ops snd_rme96_playback_spdif_ops = {
1509*4882a593Smuzhiyun .open = snd_rme96_playback_spdif_open,
1510*4882a593Smuzhiyun .close = snd_rme96_playback_close,
1511*4882a593Smuzhiyun .hw_params = snd_rme96_playback_hw_params,
1512*4882a593Smuzhiyun .prepare = snd_rme96_playback_prepare,
1513*4882a593Smuzhiyun .trigger = snd_rme96_playback_trigger,
1514*4882a593Smuzhiyun .pointer = snd_rme96_playback_pointer,
1515*4882a593Smuzhiyun .copy_user = snd_rme96_playback_copy,
1516*4882a593Smuzhiyun .copy_kernel = snd_rme96_playback_copy_kernel,
1517*4882a593Smuzhiyun .fill_silence = snd_rme96_playback_silence,
1518*4882a593Smuzhiyun .mmap = snd_pcm_lib_mmap_iomem,
1519*4882a593Smuzhiyun };
1520*4882a593Smuzhiyun
1521*4882a593Smuzhiyun static const struct snd_pcm_ops snd_rme96_capture_spdif_ops = {
1522*4882a593Smuzhiyun .open = snd_rme96_capture_spdif_open,
1523*4882a593Smuzhiyun .close = snd_rme96_capture_close,
1524*4882a593Smuzhiyun .hw_params = snd_rme96_capture_hw_params,
1525*4882a593Smuzhiyun .prepare = snd_rme96_capture_prepare,
1526*4882a593Smuzhiyun .trigger = snd_rme96_capture_trigger,
1527*4882a593Smuzhiyun .pointer = snd_rme96_capture_pointer,
1528*4882a593Smuzhiyun .copy_user = snd_rme96_capture_copy,
1529*4882a593Smuzhiyun .copy_kernel = snd_rme96_capture_copy_kernel,
1530*4882a593Smuzhiyun .mmap = snd_pcm_lib_mmap_iomem,
1531*4882a593Smuzhiyun };
1532*4882a593Smuzhiyun
1533*4882a593Smuzhiyun static const struct snd_pcm_ops snd_rme96_playback_adat_ops = {
1534*4882a593Smuzhiyun .open = snd_rme96_playback_adat_open,
1535*4882a593Smuzhiyun .close = snd_rme96_playback_close,
1536*4882a593Smuzhiyun .hw_params = snd_rme96_playback_hw_params,
1537*4882a593Smuzhiyun .prepare = snd_rme96_playback_prepare,
1538*4882a593Smuzhiyun .trigger = snd_rme96_playback_trigger,
1539*4882a593Smuzhiyun .pointer = snd_rme96_playback_pointer,
1540*4882a593Smuzhiyun .copy_user = snd_rme96_playback_copy,
1541*4882a593Smuzhiyun .copy_kernel = snd_rme96_playback_copy_kernel,
1542*4882a593Smuzhiyun .fill_silence = snd_rme96_playback_silence,
1543*4882a593Smuzhiyun .mmap = snd_pcm_lib_mmap_iomem,
1544*4882a593Smuzhiyun };
1545*4882a593Smuzhiyun
1546*4882a593Smuzhiyun static const struct snd_pcm_ops snd_rme96_capture_adat_ops = {
1547*4882a593Smuzhiyun .open = snd_rme96_capture_adat_open,
1548*4882a593Smuzhiyun .close = snd_rme96_capture_close,
1549*4882a593Smuzhiyun .hw_params = snd_rme96_capture_hw_params,
1550*4882a593Smuzhiyun .prepare = snd_rme96_capture_prepare,
1551*4882a593Smuzhiyun .trigger = snd_rme96_capture_trigger,
1552*4882a593Smuzhiyun .pointer = snd_rme96_capture_pointer,
1553*4882a593Smuzhiyun .copy_user = snd_rme96_capture_copy,
1554*4882a593Smuzhiyun .copy_kernel = snd_rme96_capture_copy_kernel,
1555*4882a593Smuzhiyun .mmap = snd_pcm_lib_mmap_iomem,
1556*4882a593Smuzhiyun };
1557*4882a593Smuzhiyun
1558*4882a593Smuzhiyun static void
snd_rme96_free(void * private_data)1559*4882a593Smuzhiyun snd_rme96_free(void *private_data)
1560*4882a593Smuzhiyun {
1561*4882a593Smuzhiyun struct rme96 *rme96 = (struct rme96 *)private_data;
1562*4882a593Smuzhiyun
1563*4882a593Smuzhiyun if (!rme96)
1564*4882a593Smuzhiyun return;
1565*4882a593Smuzhiyun
1566*4882a593Smuzhiyun if (rme96->irq >= 0) {
1567*4882a593Smuzhiyun snd_rme96_trigger(rme96, RME96_STOP_BOTH);
1568*4882a593Smuzhiyun rme96->areg &= ~RME96_AR_DAC_EN;
1569*4882a593Smuzhiyun writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG);
1570*4882a593Smuzhiyun free_irq(rme96->irq, (void *)rme96);
1571*4882a593Smuzhiyun rme96->irq = -1;
1572*4882a593Smuzhiyun }
1573*4882a593Smuzhiyun if (rme96->iobase) {
1574*4882a593Smuzhiyun iounmap(rme96->iobase);
1575*4882a593Smuzhiyun rme96->iobase = NULL;
1576*4882a593Smuzhiyun }
1577*4882a593Smuzhiyun if (rme96->port) {
1578*4882a593Smuzhiyun pci_release_regions(rme96->pci);
1579*4882a593Smuzhiyun rme96->port = 0;
1580*4882a593Smuzhiyun }
1581*4882a593Smuzhiyun #ifdef CONFIG_PM_SLEEP
1582*4882a593Smuzhiyun vfree(rme96->playback_suspend_buffer);
1583*4882a593Smuzhiyun vfree(rme96->capture_suspend_buffer);
1584*4882a593Smuzhiyun #endif
1585*4882a593Smuzhiyun pci_disable_device(rme96->pci);
1586*4882a593Smuzhiyun }
1587*4882a593Smuzhiyun
1588*4882a593Smuzhiyun static void
snd_rme96_free_spdif_pcm(struct snd_pcm * pcm)1589*4882a593Smuzhiyun snd_rme96_free_spdif_pcm(struct snd_pcm *pcm)
1590*4882a593Smuzhiyun {
1591*4882a593Smuzhiyun struct rme96 *rme96 = pcm->private_data;
1592*4882a593Smuzhiyun rme96->spdif_pcm = NULL;
1593*4882a593Smuzhiyun }
1594*4882a593Smuzhiyun
1595*4882a593Smuzhiyun static void
snd_rme96_free_adat_pcm(struct snd_pcm * pcm)1596*4882a593Smuzhiyun snd_rme96_free_adat_pcm(struct snd_pcm *pcm)
1597*4882a593Smuzhiyun {
1598*4882a593Smuzhiyun struct rme96 *rme96 = pcm->private_data;
1599*4882a593Smuzhiyun rme96->adat_pcm = NULL;
1600*4882a593Smuzhiyun }
1601*4882a593Smuzhiyun
1602*4882a593Smuzhiyun static int
snd_rme96_create(struct rme96 * rme96)1603*4882a593Smuzhiyun snd_rme96_create(struct rme96 *rme96)
1604*4882a593Smuzhiyun {
1605*4882a593Smuzhiyun struct pci_dev *pci = rme96->pci;
1606*4882a593Smuzhiyun int err;
1607*4882a593Smuzhiyun
1608*4882a593Smuzhiyun rme96->irq = -1;
1609*4882a593Smuzhiyun spin_lock_init(&rme96->lock);
1610*4882a593Smuzhiyun
1611*4882a593Smuzhiyun if ((err = pci_enable_device(pci)) < 0)
1612*4882a593Smuzhiyun return err;
1613*4882a593Smuzhiyun
1614*4882a593Smuzhiyun if ((err = pci_request_regions(pci, "RME96")) < 0)
1615*4882a593Smuzhiyun return err;
1616*4882a593Smuzhiyun rme96->port = pci_resource_start(rme96->pci, 0);
1617*4882a593Smuzhiyun
1618*4882a593Smuzhiyun rme96->iobase = ioremap(rme96->port, RME96_IO_SIZE);
1619*4882a593Smuzhiyun if (!rme96->iobase) {
1620*4882a593Smuzhiyun dev_err(rme96->card->dev,
1621*4882a593Smuzhiyun "unable to remap memory region 0x%lx-0x%lx\n",
1622*4882a593Smuzhiyun rme96->port, rme96->port + RME96_IO_SIZE - 1);
1623*4882a593Smuzhiyun return -ENOMEM;
1624*4882a593Smuzhiyun }
1625*4882a593Smuzhiyun
1626*4882a593Smuzhiyun if (request_irq(pci->irq, snd_rme96_interrupt, IRQF_SHARED,
1627*4882a593Smuzhiyun KBUILD_MODNAME, rme96)) {
1628*4882a593Smuzhiyun dev_err(rme96->card->dev, "unable to grab IRQ %d\n", pci->irq);
1629*4882a593Smuzhiyun return -EBUSY;
1630*4882a593Smuzhiyun }
1631*4882a593Smuzhiyun rme96->irq = pci->irq;
1632*4882a593Smuzhiyun rme96->card->sync_irq = rme96->irq;
1633*4882a593Smuzhiyun
1634*4882a593Smuzhiyun /* read the card's revision number */
1635*4882a593Smuzhiyun pci_read_config_byte(pci, 8, &rme96->rev);
1636*4882a593Smuzhiyun
1637*4882a593Smuzhiyun /* set up ALSA pcm device for S/PDIF */
1638*4882a593Smuzhiyun if ((err = snd_pcm_new(rme96->card, "Digi96 IEC958", 0,
1639*4882a593Smuzhiyun 1, 1, &rme96->spdif_pcm)) < 0)
1640*4882a593Smuzhiyun {
1641*4882a593Smuzhiyun return err;
1642*4882a593Smuzhiyun }
1643*4882a593Smuzhiyun rme96->spdif_pcm->private_data = rme96;
1644*4882a593Smuzhiyun rme96->spdif_pcm->private_free = snd_rme96_free_spdif_pcm;
1645*4882a593Smuzhiyun strcpy(rme96->spdif_pcm->name, "Digi96 IEC958");
1646*4882a593Smuzhiyun snd_pcm_set_ops(rme96->spdif_pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_rme96_playback_spdif_ops);
1647*4882a593Smuzhiyun snd_pcm_set_ops(rme96->spdif_pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_rme96_capture_spdif_ops);
1648*4882a593Smuzhiyun
1649*4882a593Smuzhiyun rme96->spdif_pcm->info_flags = 0;
1650*4882a593Smuzhiyun
1651*4882a593Smuzhiyun /* set up ALSA pcm device for ADAT */
1652*4882a593Smuzhiyun if (pci->device == PCI_DEVICE_ID_RME_DIGI96) {
1653*4882a593Smuzhiyun /* ADAT is not available on the base model */
1654*4882a593Smuzhiyun rme96->adat_pcm = NULL;
1655*4882a593Smuzhiyun } else {
1656*4882a593Smuzhiyun if ((err = snd_pcm_new(rme96->card, "Digi96 ADAT", 1,
1657*4882a593Smuzhiyun 1, 1, &rme96->adat_pcm)) < 0)
1658*4882a593Smuzhiyun {
1659*4882a593Smuzhiyun return err;
1660*4882a593Smuzhiyun }
1661*4882a593Smuzhiyun rme96->adat_pcm->private_data = rme96;
1662*4882a593Smuzhiyun rme96->adat_pcm->private_free = snd_rme96_free_adat_pcm;
1663*4882a593Smuzhiyun strcpy(rme96->adat_pcm->name, "Digi96 ADAT");
1664*4882a593Smuzhiyun snd_pcm_set_ops(rme96->adat_pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_rme96_playback_adat_ops);
1665*4882a593Smuzhiyun snd_pcm_set_ops(rme96->adat_pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_rme96_capture_adat_ops);
1666*4882a593Smuzhiyun
1667*4882a593Smuzhiyun rme96->adat_pcm->info_flags = 0;
1668*4882a593Smuzhiyun }
1669*4882a593Smuzhiyun
1670*4882a593Smuzhiyun rme96->playback_periodsize = 0;
1671*4882a593Smuzhiyun rme96->capture_periodsize = 0;
1672*4882a593Smuzhiyun
1673*4882a593Smuzhiyun /* make sure playback/capture is stopped, if by some reason active */
1674*4882a593Smuzhiyun snd_rme96_trigger(rme96, RME96_STOP_BOTH);
1675*4882a593Smuzhiyun
1676*4882a593Smuzhiyun /* set default values in registers */
1677*4882a593Smuzhiyun rme96->wcreg =
1678*4882a593Smuzhiyun RME96_WCR_FREQ_1 | /* set 44.1 kHz playback */
1679*4882a593Smuzhiyun RME96_WCR_SEL | /* normal playback */
1680*4882a593Smuzhiyun RME96_WCR_MASTER | /* set to master clock mode */
1681*4882a593Smuzhiyun RME96_WCR_INP_0; /* set coaxial input */
1682*4882a593Smuzhiyun
1683*4882a593Smuzhiyun rme96->areg = RME96_AR_FREQPAD_1; /* set 44.1 kHz analog capture */
1684*4882a593Smuzhiyun
1685*4882a593Smuzhiyun writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER);
1686*4882a593Smuzhiyun writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG);
1687*4882a593Smuzhiyun
1688*4882a593Smuzhiyun /* reset the ADC */
1689*4882a593Smuzhiyun writel(rme96->areg | RME96_AR_PD2,
1690*4882a593Smuzhiyun rme96->iobase + RME96_IO_ADDITIONAL_REG);
1691*4882a593Smuzhiyun writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG);
1692*4882a593Smuzhiyun
1693*4882a593Smuzhiyun /* reset and enable the DAC (order is important). */
1694*4882a593Smuzhiyun snd_rme96_reset_dac(rme96);
1695*4882a593Smuzhiyun rme96->areg |= RME96_AR_DAC_EN;
1696*4882a593Smuzhiyun writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG);
1697*4882a593Smuzhiyun
1698*4882a593Smuzhiyun /* reset playback and record buffer pointers */
1699*4882a593Smuzhiyun writel(0, rme96->iobase + RME96_IO_RESET_PLAY_POS);
1700*4882a593Smuzhiyun writel(0, rme96->iobase + RME96_IO_RESET_REC_POS);
1701*4882a593Smuzhiyun
1702*4882a593Smuzhiyun /* reset volume */
1703*4882a593Smuzhiyun rme96->vol[0] = rme96->vol[1] = 0;
1704*4882a593Smuzhiyun if (RME96_HAS_ANALOG_OUT(rme96)) {
1705*4882a593Smuzhiyun snd_rme96_apply_dac_volume(rme96);
1706*4882a593Smuzhiyun }
1707*4882a593Smuzhiyun
1708*4882a593Smuzhiyun /* init switch interface */
1709*4882a593Smuzhiyun if ((err = snd_rme96_create_switches(rme96->card, rme96)) < 0) {
1710*4882a593Smuzhiyun return err;
1711*4882a593Smuzhiyun }
1712*4882a593Smuzhiyun
1713*4882a593Smuzhiyun /* init proc interface */
1714*4882a593Smuzhiyun snd_rme96_proc_init(rme96);
1715*4882a593Smuzhiyun
1716*4882a593Smuzhiyun return 0;
1717*4882a593Smuzhiyun }
1718*4882a593Smuzhiyun
1719*4882a593Smuzhiyun /*
1720*4882a593Smuzhiyun * proc interface
1721*4882a593Smuzhiyun */
1722*4882a593Smuzhiyun
1723*4882a593Smuzhiyun static void
snd_rme96_proc_read(struct snd_info_entry * entry,struct snd_info_buffer * buffer)1724*4882a593Smuzhiyun snd_rme96_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer)
1725*4882a593Smuzhiyun {
1726*4882a593Smuzhiyun int n;
1727*4882a593Smuzhiyun struct rme96 *rme96 = entry->private_data;
1728*4882a593Smuzhiyun
1729*4882a593Smuzhiyun rme96->rcreg = readl(rme96->iobase + RME96_IO_CONTROL_REGISTER);
1730*4882a593Smuzhiyun
1731*4882a593Smuzhiyun snd_iprintf(buffer, rme96->card->longname);
1732*4882a593Smuzhiyun snd_iprintf(buffer, " (index #%d)\n", rme96->card->number + 1);
1733*4882a593Smuzhiyun
1734*4882a593Smuzhiyun snd_iprintf(buffer, "\nGeneral settings\n");
1735*4882a593Smuzhiyun if (rme96->wcreg & RME96_WCR_IDIS) {
1736*4882a593Smuzhiyun snd_iprintf(buffer, " period size: N/A (interrupts "
1737*4882a593Smuzhiyun "disabled)\n");
1738*4882a593Smuzhiyun } else if (rme96->wcreg & RME96_WCR_ISEL) {
1739*4882a593Smuzhiyun snd_iprintf(buffer, " period size: 2048 bytes\n");
1740*4882a593Smuzhiyun } else {
1741*4882a593Smuzhiyun snd_iprintf(buffer, " period size: 8192 bytes\n");
1742*4882a593Smuzhiyun }
1743*4882a593Smuzhiyun snd_iprintf(buffer, "\nInput settings\n");
1744*4882a593Smuzhiyun switch (snd_rme96_getinputtype(rme96)) {
1745*4882a593Smuzhiyun case RME96_INPUT_OPTICAL:
1746*4882a593Smuzhiyun snd_iprintf(buffer, " input: optical");
1747*4882a593Smuzhiyun break;
1748*4882a593Smuzhiyun case RME96_INPUT_COAXIAL:
1749*4882a593Smuzhiyun snd_iprintf(buffer, " input: coaxial");
1750*4882a593Smuzhiyun break;
1751*4882a593Smuzhiyun case RME96_INPUT_INTERNAL:
1752*4882a593Smuzhiyun snd_iprintf(buffer, " input: internal");
1753*4882a593Smuzhiyun break;
1754*4882a593Smuzhiyun case RME96_INPUT_XLR:
1755*4882a593Smuzhiyun snd_iprintf(buffer, " input: XLR");
1756*4882a593Smuzhiyun break;
1757*4882a593Smuzhiyun case RME96_INPUT_ANALOG:
1758*4882a593Smuzhiyun snd_iprintf(buffer, " input: analog");
1759*4882a593Smuzhiyun break;
1760*4882a593Smuzhiyun }
1761*4882a593Smuzhiyun if (snd_rme96_capture_getrate(rme96, &n) < 0) {
1762*4882a593Smuzhiyun snd_iprintf(buffer, "\n sample rate: no valid signal\n");
1763*4882a593Smuzhiyun } else {
1764*4882a593Smuzhiyun if (n) {
1765*4882a593Smuzhiyun snd_iprintf(buffer, " (8 channels)\n");
1766*4882a593Smuzhiyun } else {
1767*4882a593Smuzhiyun snd_iprintf(buffer, " (2 channels)\n");
1768*4882a593Smuzhiyun }
1769*4882a593Smuzhiyun snd_iprintf(buffer, " sample rate: %d Hz\n",
1770*4882a593Smuzhiyun snd_rme96_capture_getrate(rme96, &n));
1771*4882a593Smuzhiyun }
1772*4882a593Smuzhiyun if (rme96->wcreg & RME96_WCR_MODE24_2) {
1773*4882a593Smuzhiyun snd_iprintf(buffer, " sample format: 24 bit\n");
1774*4882a593Smuzhiyun } else {
1775*4882a593Smuzhiyun snd_iprintf(buffer, " sample format: 16 bit\n");
1776*4882a593Smuzhiyun }
1777*4882a593Smuzhiyun
1778*4882a593Smuzhiyun snd_iprintf(buffer, "\nOutput settings\n");
1779*4882a593Smuzhiyun if (rme96->wcreg & RME96_WCR_SEL) {
1780*4882a593Smuzhiyun snd_iprintf(buffer, " output signal: normal playback\n");
1781*4882a593Smuzhiyun } else {
1782*4882a593Smuzhiyun snd_iprintf(buffer, " output signal: same as input\n");
1783*4882a593Smuzhiyun }
1784*4882a593Smuzhiyun snd_iprintf(buffer, " sample rate: %d Hz\n",
1785*4882a593Smuzhiyun snd_rme96_playback_getrate(rme96));
1786*4882a593Smuzhiyun if (rme96->wcreg & RME96_WCR_MODE24) {
1787*4882a593Smuzhiyun snd_iprintf(buffer, " sample format: 24 bit\n");
1788*4882a593Smuzhiyun } else {
1789*4882a593Smuzhiyun snd_iprintf(buffer, " sample format: 16 bit\n");
1790*4882a593Smuzhiyun }
1791*4882a593Smuzhiyun if (rme96->areg & RME96_AR_WSEL) {
1792*4882a593Smuzhiyun snd_iprintf(buffer, " sample clock source: word clock\n");
1793*4882a593Smuzhiyun } else if (rme96->wcreg & RME96_WCR_MASTER) {
1794*4882a593Smuzhiyun snd_iprintf(buffer, " sample clock source: internal\n");
1795*4882a593Smuzhiyun } else if (snd_rme96_getinputtype(rme96) == RME96_INPUT_ANALOG) {
1796*4882a593Smuzhiyun snd_iprintf(buffer, " sample clock source: autosync (internal anyway due to analog input setting)\n");
1797*4882a593Smuzhiyun } else if (snd_rme96_capture_getrate(rme96, &n) < 0) {
1798*4882a593Smuzhiyun snd_iprintf(buffer, " sample clock source: autosync (internal anyway due to no valid signal)\n");
1799*4882a593Smuzhiyun } else {
1800*4882a593Smuzhiyun snd_iprintf(buffer, " sample clock source: autosync\n");
1801*4882a593Smuzhiyun }
1802*4882a593Smuzhiyun if (rme96->wcreg & RME96_WCR_PRO) {
1803*4882a593Smuzhiyun snd_iprintf(buffer, " format: AES/EBU (professional)\n");
1804*4882a593Smuzhiyun } else {
1805*4882a593Smuzhiyun snd_iprintf(buffer, " format: IEC958 (consumer)\n");
1806*4882a593Smuzhiyun }
1807*4882a593Smuzhiyun if (rme96->wcreg & RME96_WCR_EMP) {
1808*4882a593Smuzhiyun snd_iprintf(buffer, " emphasis: on\n");
1809*4882a593Smuzhiyun } else {
1810*4882a593Smuzhiyun snd_iprintf(buffer, " emphasis: off\n");
1811*4882a593Smuzhiyun }
1812*4882a593Smuzhiyun if (rme96->wcreg & RME96_WCR_DOLBY) {
1813*4882a593Smuzhiyun snd_iprintf(buffer, " non-audio (dolby): on\n");
1814*4882a593Smuzhiyun } else {
1815*4882a593Smuzhiyun snd_iprintf(buffer, " non-audio (dolby): off\n");
1816*4882a593Smuzhiyun }
1817*4882a593Smuzhiyun if (RME96_HAS_ANALOG_IN(rme96)) {
1818*4882a593Smuzhiyun snd_iprintf(buffer, "\nAnalog output settings\n");
1819*4882a593Smuzhiyun switch (snd_rme96_getmontracks(rme96)) {
1820*4882a593Smuzhiyun case RME96_MONITOR_TRACKS_1_2:
1821*4882a593Smuzhiyun snd_iprintf(buffer, " monitored ADAT tracks: 1+2\n");
1822*4882a593Smuzhiyun break;
1823*4882a593Smuzhiyun case RME96_MONITOR_TRACKS_3_4:
1824*4882a593Smuzhiyun snd_iprintf(buffer, " monitored ADAT tracks: 3+4\n");
1825*4882a593Smuzhiyun break;
1826*4882a593Smuzhiyun case RME96_MONITOR_TRACKS_5_6:
1827*4882a593Smuzhiyun snd_iprintf(buffer, " monitored ADAT tracks: 5+6\n");
1828*4882a593Smuzhiyun break;
1829*4882a593Smuzhiyun case RME96_MONITOR_TRACKS_7_8:
1830*4882a593Smuzhiyun snd_iprintf(buffer, " monitored ADAT tracks: 7+8\n");
1831*4882a593Smuzhiyun break;
1832*4882a593Smuzhiyun }
1833*4882a593Smuzhiyun switch (snd_rme96_getattenuation(rme96)) {
1834*4882a593Smuzhiyun case RME96_ATTENUATION_0:
1835*4882a593Smuzhiyun snd_iprintf(buffer, " attenuation: 0 dB\n");
1836*4882a593Smuzhiyun break;
1837*4882a593Smuzhiyun case RME96_ATTENUATION_6:
1838*4882a593Smuzhiyun snd_iprintf(buffer, " attenuation: -6 dB\n");
1839*4882a593Smuzhiyun break;
1840*4882a593Smuzhiyun case RME96_ATTENUATION_12:
1841*4882a593Smuzhiyun snd_iprintf(buffer, " attenuation: -12 dB\n");
1842*4882a593Smuzhiyun break;
1843*4882a593Smuzhiyun case RME96_ATTENUATION_18:
1844*4882a593Smuzhiyun snd_iprintf(buffer, " attenuation: -18 dB\n");
1845*4882a593Smuzhiyun break;
1846*4882a593Smuzhiyun }
1847*4882a593Smuzhiyun snd_iprintf(buffer, " volume left: %u\n", rme96->vol[0]);
1848*4882a593Smuzhiyun snd_iprintf(buffer, " volume right: %u\n", rme96->vol[1]);
1849*4882a593Smuzhiyun }
1850*4882a593Smuzhiyun }
1851*4882a593Smuzhiyun
snd_rme96_proc_init(struct rme96 * rme96)1852*4882a593Smuzhiyun static void snd_rme96_proc_init(struct rme96 *rme96)
1853*4882a593Smuzhiyun {
1854*4882a593Smuzhiyun snd_card_ro_proc_new(rme96->card, "rme96", rme96, snd_rme96_proc_read);
1855*4882a593Smuzhiyun }
1856*4882a593Smuzhiyun
1857*4882a593Smuzhiyun /*
1858*4882a593Smuzhiyun * control interface
1859*4882a593Smuzhiyun */
1860*4882a593Smuzhiyun
1861*4882a593Smuzhiyun #define snd_rme96_info_loopback_control snd_ctl_boolean_mono_info
1862*4882a593Smuzhiyun
1863*4882a593Smuzhiyun static int
snd_rme96_get_loopback_control(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)1864*4882a593Smuzhiyun snd_rme96_get_loopback_control(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1865*4882a593Smuzhiyun {
1866*4882a593Smuzhiyun struct rme96 *rme96 = snd_kcontrol_chip(kcontrol);
1867*4882a593Smuzhiyun
1868*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
1869*4882a593Smuzhiyun ucontrol->value.integer.value[0] = rme96->wcreg & RME96_WCR_SEL ? 0 : 1;
1870*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
1871*4882a593Smuzhiyun return 0;
1872*4882a593Smuzhiyun }
1873*4882a593Smuzhiyun static int
snd_rme96_put_loopback_control(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)1874*4882a593Smuzhiyun snd_rme96_put_loopback_control(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1875*4882a593Smuzhiyun {
1876*4882a593Smuzhiyun struct rme96 *rme96 = snd_kcontrol_chip(kcontrol);
1877*4882a593Smuzhiyun unsigned int val;
1878*4882a593Smuzhiyun int change;
1879*4882a593Smuzhiyun
1880*4882a593Smuzhiyun val = ucontrol->value.integer.value[0] ? 0 : RME96_WCR_SEL;
1881*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
1882*4882a593Smuzhiyun val = (rme96->wcreg & ~RME96_WCR_SEL) | val;
1883*4882a593Smuzhiyun change = val != rme96->wcreg;
1884*4882a593Smuzhiyun rme96->wcreg = val;
1885*4882a593Smuzhiyun writel(val, rme96->iobase + RME96_IO_CONTROL_REGISTER);
1886*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
1887*4882a593Smuzhiyun return change;
1888*4882a593Smuzhiyun }
1889*4882a593Smuzhiyun
1890*4882a593Smuzhiyun static int
snd_rme96_info_inputtype_control(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)1891*4882a593Smuzhiyun snd_rme96_info_inputtype_control(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1892*4882a593Smuzhiyun {
1893*4882a593Smuzhiyun static const char * const _texts[5] = {
1894*4882a593Smuzhiyun "Optical", "Coaxial", "Internal", "XLR", "Analog"
1895*4882a593Smuzhiyun };
1896*4882a593Smuzhiyun struct rme96 *rme96 = snd_kcontrol_chip(kcontrol);
1897*4882a593Smuzhiyun const char *texts[5] = {
1898*4882a593Smuzhiyun _texts[0], _texts[1], _texts[2], _texts[3], _texts[4]
1899*4882a593Smuzhiyun };
1900*4882a593Smuzhiyun int num_items;
1901*4882a593Smuzhiyun
1902*4882a593Smuzhiyun switch (rme96->pci->device) {
1903*4882a593Smuzhiyun case PCI_DEVICE_ID_RME_DIGI96:
1904*4882a593Smuzhiyun case PCI_DEVICE_ID_RME_DIGI96_8:
1905*4882a593Smuzhiyun num_items = 3;
1906*4882a593Smuzhiyun break;
1907*4882a593Smuzhiyun case PCI_DEVICE_ID_RME_DIGI96_8_PRO:
1908*4882a593Smuzhiyun num_items = 4;
1909*4882a593Smuzhiyun break;
1910*4882a593Smuzhiyun case PCI_DEVICE_ID_RME_DIGI96_8_PAD_OR_PST:
1911*4882a593Smuzhiyun if (rme96->rev > 4) {
1912*4882a593Smuzhiyun /* PST */
1913*4882a593Smuzhiyun num_items = 4;
1914*4882a593Smuzhiyun texts[3] = _texts[4]; /* Analog instead of XLR */
1915*4882a593Smuzhiyun } else {
1916*4882a593Smuzhiyun /* PAD */
1917*4882a593Smuzhiyun num_items = 5;
1918*4882a593Smuzhiyun }
1919*4882a593Smuzhiyun break;
1920*4882a593Smuzhiyun default:
1921*4882a593Smuzhiyun snd_BUG();
1922*4882a593Smuzhiyun return -EINVAL;
1923*4882a593Smuzhiyun }
1924*4882a593Smuzhiyun return snd_ctl_enum_info(uinfo, 1, num_items, texts);
1925*4882a593Smuzhiyun }
1926*4882a593Smuzhiyun static int
snd_rme96_get_inputtype_control(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)1927*4882a593Smuzhiyun snd_rme96_get_inputtype_control(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1928*4882a593Smuzhiyun {
1929*4882a593Smuzhiyun struct rme96 *rme96 = snd_kcontrol_chip(kcontrol);
1930*4882a593Smuzhiyun unsigned int items = 3;
1931*4882a593Smuzhiyun
1932*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
1933*4882a593Smuzhiyun ucontrol->value.enumerated.item[0] = snd_rme96_getinputtype(rme96);
1934*4882a593Smuzhiyun
1935*4882a593Smuzhiyun switch (rme96->pci->device) {
1936*4882a593Smuzhiyun case PCI_DEVICE_ID_RME_DIGI96:
1937*4882a593Smuzhiyun case PCI_DEVICE_ID_RME_DIGI96_8:
1938*4882a593Smuzhiyun items = 3;
1939*4882a593Smuzhiyun break;
1940*4882a593Smuzhiyun case PCI_DEVICE_ID_RME_DIGI96_8_PRO:
1941*4882a593Smuzhiyun items = 4;
1942*4882a593Smuzhiyun break;
1943*4882a593Smuzhiyun case PCI_DEVICE_ID_RME_DIGI96_8_PAD_OR_PST:
1944*4882a593Smuzhiyun if (rme96->rev > 4) {
1945*4882a593Smuzhiyun /* for handling PST case, (INPUT_ANALOG is moved to INPUT_XLR */
1946*4882a593Smuzhiyun if (ucontrol->value.enumerated.item[0] == RME96_INPUT_ANALOG) {
1947*4882a593Smuzhiyun ucontrol->value.enumerated.item[0] = RME96_INPUT_XLR;
1948*4882a593Smuzhiyun }
1949*4882a593Smuzhiyun items = 4;
1950*4882a593Smuzhiyun } else {
1951*4882a593Smuzhiyun items = 5;
1952*4882a593Smuzhiyun }
1953*4882a593Smuzhiyun break;
1954*4882a593Smuzhiyun default:
1955*4882a593Smuzhiyun snd_BUG();
1956*4882a593Smuzhiyun break;
1957*4882a593Smuzhiyun }
1958*4882a593Smuzhiyun if (ucontrol->value.enumerated.item[0] >= items) {
1959*4882a593Smuzhiyun ucontrol->value.enumerated.item[0] = items - 1;
1960*4882a593Smuzhiyun }
1961*4882a593Smuzhiyun
1962*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
1963*4882a593Smuzhiyun return 0;
1964*4882a593Smuzhiyun }
1965*4882a593Smuzhiyun static int
snd_rme96_put_inputtype_control(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)1966*4882a593Smuzhiyun snd_rme96_put_inputtype_control(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1967*4882a593Smuzhiyun {
1968*4882a593Smuzhiyun struct rme96 *rme96 = snd_kcontrol_chip(kcontrol);
1969*4882a593Smuzhiyun unsigned int val;
1970*4882a593Smuzhiyun int change, items = 3;
1971*4882a593Smuzhiyun
1972*4882a593Smuzhiyun switch (rme96->pci->device) {
1973*4882a593Smuzhiyun case PCI_DEVICE_ID_RME_DIGI96:
1974*4882a593Smuzhiyun case PCI_DEVICE_ID_RME_DIGI96_8:
1975*4882a593Smuzhiyun items = 3;
1976*4882a593Smuzhiyun break;
1977*4882a593Smuzhiyun case PCI_DEVICE_ID_RME_DIGI96_8_PRO:
1978*4882a593Smuzhiyun items = 4;
1979*4882a593Smuzhiyun break;
1980*4882a593Smuzhiyun case PCI_DEVICE_ID_RME_DIGI96_8_PAD_OR_PST:
1981*4882a593Smuzhiyun if (rme96->rev > 4) {
1982*4882a593Smuzhiyun items = 4;
1983*4882a593Smuzhiyun } else {
1984*4882a593Smuzhiyun items = 5;
1985*4882a593Smuzhiyun }
1986*4882a593Smuzhiyun break;
1987*4882a593Smuzhiyun default:
1988*4882a593Smuzhiyun snd_BUG();
1989*4882a593Smuzhiyun break;
1990*4882a593Smuzhiyun }
1991*4882a593Smuzhiyun val = ucontrol->value.enumerated.item[0] % items;
1992*4882a593Smuzhiyun
1993*4882a593Smuzhiyun /* special case for PST */
1994*4882a593Smuzhiyun if (rme96->pci->device == PCI_DEVICE_ID_RME_DIGI96_8_PAD_OR_PST && rme96->rev > 4) {
1995*4882a593Smuzhiyun if (val == RME96_INPUT_XLR) {
1996*4882a593Smuzhiyun val = RME96_INPUT_ANALOG;
1997*4882a593Smuzhiyun }
1998*4882a593Smuzhiyun }
1999*4882a593Smuzhiyun
2000*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
2001*4882a593Smuzhiyun change = (int)val != snd_rme96_getinputtype(rme96);
2002*4882a593Smuzhiyun snd_rme96_setinputtype(rme96, val);
2003*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
2004*4882a593Smuzhiyun return change;
2005*4882a593Smuzhiyun }
2006*4882a593Smuzhiyun
2007*4882a593Smuzhiyun static int
snd_rme96_info_clockmode_control(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)2008*4882a593Smuzhiyun snd_rme96_info_clockmode_control(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
2009*4882a593Smuzhiyun {
2010*4882a593Smuzhiyun static const char * const texts[3] = { "AutoSync", "Internal", "Word" };
2011*4882a593Smuzhiyun
2012*4882a593Smuzhiyun return snd_ctl_enum_info(uinfo, 1, 3, texts);
2013*4882a593Smuzhiyun }
2014*4882a593Smuzhiyun static int
snd_rme96_get_clockmode_control(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)2015*4882a593Smuzhiyun snd_rme96_get_clockmode_control(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2016*4882a593Smuzhiyun {
2017*4882a593Smuzhiyun struct rme96 *rme96 = snd_kcontrol_chip(kcontrol);
2018*4882a593Smuzhiyun
2019*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
2020*4882a593Smuzhiyun ucontrol->value.enumerated.item[0] = snd_rme96_getclockmode(rme96);
2021*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
2022*4882a593Smuzhiyun return 0;
2023*4882a593Smuzhiyun }
2024*4882a593Smuzhiyun static int
snd_rme96_put_clockmode_control(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)2025*4882a593Smuzhiyun snd_rme96_put_clockmode_control(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2026*4882a593Smuzhiyun {
2027*4882a593Smuzhiyun struct rme96 *rme96 = snd_kcontrol_chip(kcontrol);
2028*4882a593Smuzhiyun unsigned int val;
2029*4882a593Smuzhiyun int change;
2030*4882a593Smuzhiyun
2031*4882a593Smuzhiyun val = ucontrol->value.enumerated.item[0] % 3;
2032*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
2033*4882a593Smuzhiyun change = (int)val != snd_rme96_getclockmode(rme96);
2034*4882a593Smuzhiyun snd_rme96_setclockmode(rme96, val);
2035*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
2036*4882a593Smuzhiyun return change;
2037*4882a593Smuzhiyun }
2038*4882a593Smuzhiyun
2039*4882a593Smuzhiyun static int
snd_rme96_info_attenuation_control(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)2040*4882a593Smuzhiyun snd_rme96_info_attenuation_control(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
2041*4882a593Smuzhiyun {
2042*4882a593Smuzhiyun static const char * const texts[4] = {
2043*4882a593Smuzhiyun "0 dB", "-6 dB", "-12 dB", "-18 dB"
2044*4882a593Smuzhiyun };
2045*4882a593Smuzhiyun
2046*4882a593Smuzhiyun return snd_ctl_enum_info(uinfo, 1, 4, texts);
2047*4882a593Smuzhiyun }
2048*4882a593Smuzhiyun static int
snd_rme96_get_attenuation_control(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)2049*4882a593Smuzhiyun snd_rme96_get_attenuation_control(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2050*4882a593Smuzhiyun {
2051*4882a593Smuzhiyun struct rme96 *rme96 = snd_kcontrol_chip(kcontrol);
2052*4882a593Smuzhiyun
2053*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
2054*4882a593Smuzhiyun ucontrol->value.enumerated.item[0] = snd_rme96_getattenuation(rme96);
2055*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
2056*4882a593Smuzhiyun return 0;
2057*4882a593Smuzhiyun }
2058*4882a593Smuzhiyun static int
snd_rme96_put_attenuation_control(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)2059*4882a593Smuzhiyun snd_rme96_put_attenuation_control(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2060*4882a593Smuzhiyun {
2061*4882a593Smuzhiyun struct rme96 *rme96 = snd_kcontrol_chip(kcontrol);
2062*4882a593Smuzhiyun unsigned int val;
2063*4882a593Smuzhiyun int change;
2064*4882a593Smuzhiyun
2065*4882a593Smuzhiyun val = ucontrol->value.enumerated.item[0] % 4;
2066*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
2067*4882a593Smuzhiyun
2068*4882a593Smuzhiyun change = (int)val != snd_rme96_getattenuation(rme96);
2069*4882a593Smuzhiyun snd_rme96_setattenuation(rme96, val);
2070*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
2071*4882a593Smuzhiyun return change;
2072*4882a593Smuzhiyun }
2073*4882a593Smuzhiyun
2074*4882a593Smuzhiyun static int
snd_rme96_info_montracks_control(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)2075*4882a593Smuzhiyun snd_rme96_info_montracks_control(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
2076*4882a593Smuzhiyun {
2077*4882a593Smuzhiyun static const char * const texts[4] = { "1+2", "3+4", "5+6", "7+8" };
2078*4882a593Smuzhiyun
2079*4882a593Smuzhiyun return snd_ctl_enum_info(uinfo, 1, 4, texts);
2080*4882a593Smuzhiyun }
2081*4882a593Smuzhiyun static int
snd_rme96_get_montracks_control(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)2082*4882a593Smuzhiyun snd_rme96_get_montracks_control(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2083*4882a593Smuzhiyun {
2084*4882a593Smuzhiyun struct rme96 *rme96 = snd_kcontrol_chip(kcontrol);
2085*4882a593Smuzhiyun
2086*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
2087*4882a593Smuzhiyun ucontrol->value.enumerated.item[0] = snd_rme96_getmontracks(rme96);
2088*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
2089*4882a593Smuzhiyun return 0;
2090*4882a593Smuzhiyun }
2091*4882a593Smuzhiyun static int
snd_rme96_put_montracks_control(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)2092*4882a593Smuzhiyun snd_rme96_put_montracks_control(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2093*4882a593Smuzhiyun {
2094*4882a593Smuzhiyun struct rme96 *rme96 = snd_kcontrol_chip(kcontrol);
2095*4882a593Smuzhiyun unsigned int val;
2096*4882a593Smuzhiyun int change;
2097*4882a593Smuzhiyun
2098*4882a593Smuzhiyun val = ucontrol->value.enumerated.item[0] % 4;
2099*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
2100*4882a593Smuzhiyun change = (int)val != snd_rme96_getmontracks(rme96);
2101*4882a593Smuzhiyun snd_rme96_setmontracks(rme96, val);
2102*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
2103*4882a593Smuzhiyun return change;
2104*4882a593Smuzhiyun }
2105*4882a593Smuzhiyun
snd_rme96_convert_from_aes(struct snd_aes_iec958 * aes)2106*4882a593Smuzhiyun static u32 snd_rme96_convert_from_aes(struct snd_aes_iec958 *aes)
2107*4882a593Smuzhiyun {
2108*4882a593Smuzhiyun u32 val = 0;
2109*4882a593Smuzhiyun val |= (aes->status[0] & IEC958_AES0_PROFESSIONAL) ? RME96_WCR_PRO : 0;
2110*4882a593Smuzhiyun val |= (aes->status[0] & IEC958_AES0_NONAUDIO) ? RME96_WCR_DOLBY : 0;
2111*4882a593Smuzhiyun if (val & RME96_WCR_PRO)
2112*4882a593Smuzhiyun val |= (aes->status[0] & IEC958_AES0_PRO_EMPHASIS_5015) ? RME96_WCR_EMP : 0;
2113*4882a593Smuzhiyun else
2114*4882a593Smuzhiyun val |= (aes->status[0] & IEC958_AES0_CON_EMPHASIS_5015) ? RME96_WCR_EMP : 0;
2115*4882a593Smuzhiyun return val;
2116*4882a593Smuzhiyun }
2117*4882a593Smuzhiyun
snd_rme96_convert_to_aes(struct snd_aes_iec958 * aes,u32 val)2118*4882a593Smuzhiyun static void snd_rme96_convert_to_aes(struct snd_aes_iec958 *aes, u32 val)
2119*4882a593Smuzhiyun {
2120*4882a593Smuzhiyun aes->status[0] = ((val & RME96_WCR_PRO) ? IEC958_AES0_PROFESSIONAL : 0) |
2121*4882a593Smuzhiyun ((val & RME96_WCR_DOLBY) ? IEC958_AES0_NONAUDIO : 0);
2122*4882a593Smuzhiyun if (val & RME96_WCR_PRO)
2123*4882a593Smuzhiyun aes->status[0] |= (val & RME96_WCR_EMP) ? IEC958_AES0_PRO_EMPHASIS_5015 : 0;
2124*4882a593Smuzhiyun else
2125*4882a593Smuzhiyun aes->status[0] |= (val & RME96_WCR_EMP) ? IEC958_AES0_CON_EMPHASIS_5015 : 0;
2126*4882a593Smuzhiyun }
2127*4882a593Smuzhiyun
snd_rme96_control_spdif_info(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)2128*4882a593Smuzhiyun static int snd_rme96_control_spdif_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
2129*4882a593Smuzhiyun {
2130*4882a593Smuzhiyun uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
2131*4882a593Smuzhiyun uinfo->count = 1;
2132*4882a593Smuzhiyun return 0;
2133*4882a593Smuzhiyun }
2134*4882a593Smuzhiyun
snd_rme96_control_spdif_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)2135*4882a593Smuzhiyun static int snd_rme96_control_spdif_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2136*4882a593Smuzhiyun {
2137*4882a593Smuzhiyun struct rme96 *rme96 = snd_kcontrol_chip(kcontrol);
2138*4882a593Smuzhiyun
2139*4882a593Smuzhiyun snd_rme96_convert_to_aes(&ucontrol->value.iec958, rme96->wcreg_spdif);
2140*4882a593Smuzhiyun return 0;
2141*4882a593Smuzhiyun }
2142*4882a593Smuzhiyun
snd_rme96_control_spdif_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)2143*4882a593Smuzhiyun static int snd_rme96_control_spdif_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2144*4882a593Smuzhiyun {
2145*4882a593Smuzhiyun struct rme96 *rme96 = snd_kcontrol_chip(kcontrol);
2146*4882a593Smuzhiyun int change;
2147*4882a593Smuzhiyun u32 val;
2148*4882a593Smuzhiyun
2149*4882a593Smuzhiyun val = snd_rme96_convert_from_aes(&ucontrol->value.iec958);
2150*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
2151*4882a593Smuzhiyun change = val != rme96->wcreg_spdif;
2152*4882a593Smuzhiyun rme96->wcreg_spdif = val;
2153*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
2154*4882a593Smuzhiyun return change;
2155*4882a593Smuzhiyun }
2156*4882a593Smuzhiyun
snd_rme96_control_spdif_stream_info(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)2157*4882a593Smuzhiyun static int snd_rme96_control_spdif_stream_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
2158*4882a593Smuzhiyun {
2159*4882a593Smuzhiyun uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
2160*4882a593Smuzhiyun uinfo->count = 1;
2161*4882a593Smuzhiyun return 0;
2162*4882a593Smuzhiyun }
2163*4882a593Smuzhiyun
snd_rme96_control_spdif_stream_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)2164*4882a593Smuzhiyun static int snd_rme96_control_spdif_stream_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2165*4882a593Smuzhiyun {
2166*4882a593Smuzhiyun struct rme96 *rme96 = snd_kcontrol_chip(kcontrol);
2167*4882a593Smuzhiyun
2168*4882a593Smuzhiyun snd_rme96_convert_to_aes(&ucontrol->value.iec958, rme96->wcreg_spdif_stream);
2169*4882a593Smuzhiyun return 0;
2170*4882a593Smuzhiyun }
2171*4882a593Smuzhiyun
snd_rme96_control_spdif_stream_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)2172*4882a593Smuzhiyun static int snd_rme96_control_spdif_stream_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2173*4882a593Smuzhiyun {
2174*4882a593Smuzhiyun struct rme96 *rme96 = snd_kcontrol_chip(kcontrol);
2175*4882a593Smuzhiyun int change;
2176*4882a593Smuzhiyun u32 val;
2177*4882a593Smuzhiyun
2178*4882a593Smuzhiyun val = snd_rme96_convert_from_aes(&ucontrol->value.iec958);
2179*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
2180*4882a593Smuzhiyun change = val != rme96->wcreg_spdif_stream;
2181*4882a593Smuzhiyun rme96->wcreg_spdif_stream = val;
2182*4882a593Smuzhiyun rme96->wcreg &= ~(RME96_WCR_PRO | RME96_WCR_DOLBY | RME96_WCR_EMP);
2183*4882a593Smuzhiyun rme96->wcreg |= val;
2184*4882a593Smuzhiyun writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER);
2185*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
2186*4882a593Smuzhiyun return change;
2187*4882a593Smuzhiyun }
2188*4882a593Smuzhiyun
snd_rme96_control_spdif_mask_info(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)2189*4882a593Smuzhiyun static int snd_rme96_control_spdif_mask_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
2190*4882a593Smuzhiyun {
2191*4882a593Smuzhiyun uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
2192*4882a593Smuzhiyun uinfo->count = 1;
2193*4882a593Smuzhiyun return 0;
2194*4882a593Smuzhiyun }
2195*4882a593Smuzhiyun
snd_rme96_control_spdif_mask_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)2196*4882a593Smuzhiyun static int snd_rme96_control_spdif_mask_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2197*4882a593Smuzhiyun {
2198*4882a593Smuzhiyun ucontrol->value.iec958.status[0] = kcontrol->private_value;
2199*4882a593Smuzhiyun return 0;
2200*4882a593Smuzhiyun }
2201*4882a593Smuzhiyun
2202*4882a593Smuzhiyun static int
snd_rme96_dac_volume_info(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)2203*4882a593Smuzhiyun snd_rme96_dac_volume_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
2204*4882a593Smuzhiyun {
2205*4882a593Smuzhiyun struct rme96 *rme96 = snd_kcontrol_chip(kcontrol);
2206*4882a593Smuzhiyun
2207*4882a593Smuzhiyun uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2208*4882a593Smuzhiyun uinfo->count = 2;
2209*4882a593Smuzhiyun uinfo->value.integer.min = 0;
2210*4882a593Smuzhiyun uinfo->value.integer.max = RME96_185X_MAX_OUT(rme96);
2211*4882a593Smuzhiyun return 0;
2212*4882a593Smuzhiyun }
2213*4882a593Smuzhiyun
2214*4882a593Smuzhiyun static int
snd_rme96_dac_volume_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * u)2215*4882a593Smuzhiyun snd_rme96_dac_volume_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *u)
2216*4882a593Smuzhiyun {
2217*4882a593Smuzhiyun struct rme96 *rme96 = snd_kcontrol_chip(kcontrol);
2218*4882a593Smuzhiyun
2219*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
2220*4882a593Smuzhiyun u->value.integer.value[0] = rme96->vol[0];
2221*4882a593Smuzhiyun u->value.integer.value[1] = rme96->vol[1];
2222*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
2223*4882a593Smuzhiyun
2224*4882a593Smuzhiyun return 0;
2225*4882a593Smuzhiyun }
2226*4882a593Smuzhiyun
2227*4882a593Smuzhiyun static int
snd_rme96_dac_volume_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * u)2228*4882a593Smuzhiyun snd_rme96_dac_volume_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *u)
2229*4882a593Smuzhiyun {
2230*4882a593Smuzhiyun struct rme96 *rme96 = snd_kcontrol_chip(kcontrol);
2231*4882a593Smuzhiyun int change = 0;
2232*4882a593Smuzhiyun unsigned int vol, maxvol;
2233*4882a593Smuzhiyun
2234*4882a593Smuzhiyun
2235*4882a593Smuzhiyun if (!RME96_HAS_ANALOG_OUT(rme96))
2236*4882a593Smuzhiyun return -EINVAL;
2237*4882a593Smuzhiyun maxvol = RME96_185X_MAX_OUT(rme96);
2238*4882a593Smuzhiyun spin_lock_irq(&rme96->lock);
2239*4882a593Smuzhiyun vol = u->value.integer.value[0];
2240*4882a593Smuzhiyun if (vol != rme96->vol[0] && vol <= maxvol) {
2241*4882a593Smuzhiyun rme96->vol[0] = vol;
2242*4882a593Smuzhiyun change = 1;
2243*4882a593Smuzhiyun }
2244*4882a593Smuzhiyun vol = u->value.integer.value[1];
2245*4882a593Smuzhiyun if (vol != rme96->vol[1] && vol <= maxvol) {
2246*4882a593Smuzhiyun rme96->vol[1] = vol;
2247*4882a593Smuzhiyun change = 1;
2248*4882a593Smuzhiyun }
2249*4882a593Smuzhiyun if (change)
2250*4882a593Smuzhiyun snd_rme96_apply_dac_volume(rme96);
2251*4882a593Smuzhiyun spin_unlock_irq(&rme96->lock);
2252*4882a593Smuzhiyun
2253*4882a593Smuzhiyun return change;
2254*4882a593Smuzhiyun }
2255*4882a593Smuzhiyun
2256*4882a593Smuzhiyun static const struct snd_kcontrol_new snd_rme96_controls[] = {
2257*4882a593Smuzhiyun {
2258*4882a593Smuzhiyun .iface = SNDRV_CTL_ELEM_IFACE_PCM,
2259*4882a593Smuzhiyun .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT),
2260*4882a593Smuzhiyun .info = snd_rme96_control_spdif_info,
2261*4882a593Smuzhiyun .get = snd_rme96_control_spdif_get,
2262*4882a593Smuzhiyun .put = snd_rme96_control_spdif_put
2263*4882a593Smuzhiyun },
2264*4882a593Smuzhiyun {
2265*4882a593Smuzhiyun .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
2266*4882a593Smuzhiyun .iface = SNDRV_CTL_ELEM_IFACE_PCM,
2267*4882a593Smuzhiyun .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,PCM_STREAM),
2268*4882a593Smuzhiyun .info = snd_rme96_control_spdif_stream_info,
2269*4882a593Smuzhiyun .get = snd_rme96_control_spdif_stream_get,
2270*4882a593Smuzhiyun .put = snd_rme96_control_spdif_stream_put
2271*4882a593Smuzhiyun },
2272*4882a593Smuzhiyun {
2273*4882a593Smuzhiyun .access = SNDRV_CTL_ELEM_ACCESS_READ,
2274*4882a593Smuzhiyun .iface = SNDRV_CTL_ELEM_IFACE_PCM,
2275*4882a593Smuzhiyun .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,CON_MASK),
2276*4882a593Smuzhiyun .info = snd_rme96_control_spdif_mask_info,
2277*4882a593Smuzhiyun .get = snd_rme96_control_spdif_mask_get,
2278*4882a593Smuzhiyun .private_value = IEC958_AES0_NONAUDIO |
2279*4882a593Smuzhiyun IEC958_AES0_PROFESSIONAL |
2280*4882a593Smuzhiyun IEC958_AES0_CON_EMPHASIS
2281*4882a593Smuzhiyun },
2282*4882a593Smuzhiyun {
2283*4882a593Smuzhiyun .access = SNDRV_CTL_ELEM_ACCESS_READ,
2284*4882a593Smuzhiyun .iface = SNDRV_CTL_ELEM_IFACE_PCM,
2285*4882a593Smuzhiyun .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,PRO_MASK),
2286*4882a593Smuzhiyun .info = snd_rme96_control_spdif_mask_info,
2287*4882a593Smuzhiyun .get = snd_rme96_control_spdif_mask_get,
2288*4882a593Smuzhiyun .private_value = IEC958_AES0_NONAUDIO |
2289*4882a593Smuzhiyun IEC958_AES0_PROFESSIONAL |
2290*4882a593Smuzhiyun IEC958_AES0_PRO_EMPHASIS
2291*4882a593Smuzhiyun },
2292*4882a593Smuzhiyun {
2293*4882a593Smuzhiyun .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2294*4882a593Smuzhiyun .name = "Input Connector",
2295*4882a593Smuzhiyun .info = snd_rme96_info_inputtype_control,
2296*4882a593Smuzhiyun .get = snd_rme96_get_inputtype_control,
2297*4882a593Smuzhiyun .put = snd_rme96_put_inputtype_control
2298*4882a593Smuzhiyun },
2299*4882a593Smuzhiyun {
2300*4882a593Smuzhiyun .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2301*4882a593Smuzhiyun .name = "Loopback Input",
2302*4882a593Smuzhiyun .info = snd_rme96_info_loopback_control,
2303*4882a593Smuzhiyun .get = snd_rme96_get_loopback_control,
2304*4882a593Smuzhiyun .put = snd_rme96_put_loopback_control
2305*4882a593Smuzhiyun },
2306*4882a593Smuzhiyun {
2307*4882a593Smuzhiyun .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2308*4882a593Smuzhiyun .name = "Sample Clock Source",
2309*4882a593Smuzhiyun .info = snd_rme96_info_clockmode_control,
2310*4882a593Smuzhiyun .get = snd_rme96_get_clockmode_control,
2311*4882a593Smuzhiyun .put = snd_rme96_put_clockmode_control
2312*4882a593Smuzhiyun },
2313*4882a593Smuzhiyun {
2314*4882a593Smuzhiyun .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2315*4882a593Smuzhiyun .name = "Monitor Tracks",
2316*4882a593Smuzhiyun .info = snd_rme96_info_montracks_control,
2317*4882a593Smuzhiyun .get = snd_rme96_get_montracks_control,
2318*4882a593Smuzhiyun .put = snd_rme96_put_montracks_control
2319*4882a593Smuzhiyun },
2320*4882a593Smuzhiyun {
2321*4882a593Smuzhiyun .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2322*4882a593Smuzhiyun .name = "Attenuation",
2323*4882a593Smuzhiyun .info = snd_rme96_info_attenuation_control,
2324*4882a593Smuzhiyun .get = snd_rme96_get_attenuation_control,
2325*4882a593Smuzhiyun .put = snd_rme96_put_attenuation_control
2326*4882a593Smuzhiyun },
2327*4882a593Smuzhiyun {
2328*4882a593Smuzhiyun .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2329*4882a593Smuzhiyun .name = "DAC Playback Volume",
2330*4882a593Smuzhiyun .info = snd_rme96_dac_volume_info,
2331*4882a593Smuzhiyun .get = snd_rme96_dac_volume_get,
2332*4882a593Smuzhiyun .put = snd_rme96_dac_volume_put
2333*4882a593Smuzhiyun }
2334*4882a593Smuzhiyun };
2335*4882a593Smuzhiyun
2336*4882a593Smuzhiyun static int
snd_rme96_create_switches(struct snd_card * card,struct rme96 * rme96)2337*4882a593Smuzhiyun snd_rme96_create_switches(struct snd_card *card,
2338*4882a593Smuzhiyun struct rme96 *rme96)
2339*4882a593Smuzhiyun {
2340*4882a593Smuzhiyun int idx, err;
2341*4882a593Smuzhiyun struct snd_kcontrol *kctl;
2342*4882a593Smuzhiyun
2343*4882a593Smuzhiyun for (idx = 0; idx < 7; idx++) {
2344*4882a593Smuzhiyun if ((err = snd_ctl_add(card, kctl = snd_ctl_new1(&snd_rme96_controls[idx], rme96))) < 0)
2345*4882a593Smuzhiyun return err;
2346*4882a593Smuzhiyun if (idx == 1) /* IEC958 (S/PDIF) Stream */
2347*4882a593Smuzhiyun rme96->spdif_ctl = kctl;
2348*4882a593Smuzhiyun }
2349*4882a593Smuzhiyun
2350*4882a593Smuzhiyun if (RME96_HAS_ANALOG_OUT(rme96)) {
2351*4882a593Smuzhiyun for (idx = 7; idx < 10; idx++)
2352*4882a593Smuzhiyun if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_rme96_controls[idx], rme96))) < 0)
2353*4882a593Smuzhiyun return err;
2354*4882a593Smuzhiyun }
2355*4882a593Smuzhiyun
2356*4882a593Smuzhiyun return 0;
2357*4882a593Smuzhiyun }
2358*4882a593Smuzhiyun
2359*4882a593Smuzhiyun /*
2360*4882a593Smuzhiyun * Card initialisation
2361*4882a593Smuzhiyun */
2362*4882a593Smuzhiyun
2363*4882a593Smuzhiyun #ifdef CONFIG_PM_SLEEP
2364*4882a593Smuzhiyun
rme96_suspend(struct device * dev)2365*4882a593Smuzhiyun static int rme96_suspend(struct device *dev)
2366*4882a593Smuzhiyun {
2367*4882a593Smuzhiyun struct snd_card *card = dev_get_drvdata(dev);
2368*4882a593Smuzhiyun struct rme96 *rme96 = card->private_data;
2369*4882a593Smuzhiyun
2370*4882a593Smuzhiyun snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
2371*4882a593Smuzhiyun
2372*4882a593Smuzhiyun /* save capture & playback pointers */
2373*4882a593Smuzhiyun rme96->playback_pointer = readl(rme96->iobase + RME96_IO_GET_PLAY_POS)
2374*4882a593Smuzhiyun & RME96_RCR_AUDIO_ADDR_MASK;
2375*4882a593Smuzhiyun rme96->capture_pointer = readl(rme96->iobase + RME96_IO_GET_REC_POS)
2376*4882a593Smuzhiyun & RME96_RCR_AUDIO_ADDR_MASK;
2377*4882a593Smuzhiyun
2378*4882a593Smuzhiyun /* save playback and capture buffers */
2379*4882a593Smuzhiyun memcpy_fromio(rme96->playback_suspend_buffer,
2380*4882a593Smuzhiyun rme96->iobase + RME96_IO_PLAY_BUFFER, RME96_BUFFER_SIZE);
2381*4882a593Smuzhiyun memcpy_fromio(rme96->capture_suspend_buffer,
2382*4882a593Smuzhiyun rme96->iobase + RME96_IO_REC_BUFFER, RME96_BUFFER_SIZE);
2383*4882a593Smuzhiyun
2384*4882a593Smuzhiyun /* disable the DAC */
2385*4882a593Smuzhiyun rme96->areg &= ~RME96_AR_DAC_EN;
2386*4882a593Smuzhiyun writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG);
2387*4882a593Smuzhiyun return 0;
2388*4882a593Smuzhiyun }
2389*4882a593Smuzhiyun
rme96_resume(struct device * dev)2390*4882a593Smuzhiyun static int rme96_resume(struct device *dev)
2391*4882a593Smuzhiyun {
2392*4882a593Smuzhiyun struct snd_card *card = dev_get_drvdata(dev);
2393*4882a593Smuzhiyun struct rme96 *rme96 = card->private_data;
2394*4882a593Smuzhiyun
2395*4882a593Smuzhiyun /* reset playback and record buffer pointers */
2396*4882a593Smuzhiyun writel(0, rme96->iobase + RME96_IO_SET_PLAY_POS
2397*4882a593Smuzhiyun + rme96->playback_pointer);
2398*4882a593Smuzhiyun writel(0, rme96->iobase + RME96_IO_SET_REC_POS
2399*4882a593Smuzhiyun + rme96->capture_pointer);
2400*4882a593Smuzhiyun
2401*4882a593Smuzhiyun /* restore playback and capture buffers */
2402*4882a593Smuzhiyun memcpy_toio(rme96->iobase + RME96_IO_PLAY_BUFFER,
2403*4882a593Smuzhiyun rme96->playback_suspend_buffer, RME96_BUFFER_SIZE);
2404*4882a593Smuzhiyun memcpy_toio(rme96->iobase + RME96_IO_REC_BUFFER,
2405*4882a593Smuzhiyun rme96->capture_suspend_buffer, RME96_BUFFER_SIZE);
2406*4882a593Smuzhiyun
2407*4882a593Smuzhiyun /* reset the ADC */
2408*4882a593Smuzhiyun writel(rme96->areg | RME96_AR_PD2,
2409*4882a593Smuzhiyun rme96->iobase + RME96_IO_ADDITIONAL_REG);
2410*4882a593Smuzhiyun writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG);
2411*4882a593Smuzhiyun
2412*4882a593Smuzhiyun /* reset and enable DAC, restore analog volume */
2413*4882a593Smuzhiyun snd_rme96_reset_dac(rme96);
2414*4882a593Smuzhiyun rme96->areg |= RME96_AR_DAC_EN;
2415*4882a593Smuzhiyun writel(rme96->areg, rme96->iobase + RME96_IO_ADDITIONAL_REG);
2416*4882a593Smuzhiyun if (RME96_HAS_ANALOG_OUT(rme96)) {
2417*4882a593Smuzhiyun usleep_range(3000, 10000);
2418*4882a593Smuzhiyun snd_rme96_apply_dac_volume(rme96);
2419*4882a593Smuzhiyun }
2420*4882a593Smuzhiyun
2421*4882a593Smuzhiyun snd_power_change_state(card, SNDRV_CTL_POWER_D0);
2422*4882a593Smuzhiyun
2423*4882a593Smuzhiyun return 0;
2424*4882a593Smuzhiyun }
2425*4882a593Smuzhiyun
2426*4882a593Smuzhiyun static SIMPLE_DEV_PM_OPS(rme96_pm, rme96_suspend, rme96_resume);
2427*4882a593Smuzhiyun #define RME96_PM_OPS &rme96_pm
2428*4882a593Smuzhiyun #else
2429*4882a593Smuzhiyun #define RME96_PM_OPS NULL
2430*4882a593Smuzhiyun #endif /* CONFIG_PM_SLEEP */
2431*4882a593Smuzhiyun
snd_rme96_card_free(struct snd_card * card)2432*4882a593Smuzhiyun static void snd_rme96_card_free(struct snd_card *card)
2433*4882a593Smuzhiyun {
2434*4882a593Smuzhiyun snd_rme96_free(card->private_data);
2435*4882a593Smuzhiyun }
2436*4882a593Smuzhiyun
2437*4882a593Smuzhiyun static int
snd_rme96_probe(struct pci_dev * pci,const struct pci_device_id * pci_id)2438*4882a593Smuzhiyun snd_rme96_probe(struct pci_dev *pci,
2439*4882a593Smuzhiyun const struct pci_device_id *pci_id)
2440*4882a593Smuzhiyun {
2441*4882a593Smuzhiyun static int dev;
2442*4882a593Smuzhiyun struct rme96 *rme96;
2443*4882a593Smuzhiyun struct snd_card *card;
2444*4882a593Smuzhiyun int err;
2445*4882a593Smuzhiyun u8 val;
2446*4882a593Smuzhiyun
2447*4882a593Smuzhiyun if (dev >= SNDRV_CARDS) {
2448*4882a593Smuzhiyun return -ENODEV;
2449*4882a593Smuzhiyun }
2450*4882a593Smuzhiyun if (!enable[dev]) {
2451*4882a593Smuzhiyun dev++;
2452*4882a593Smuzhiyun return -ENOENT;
2453*4882a593Smuzhiyun }
2454*4882a593Smuzhiyun err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
2455*4882a593Smuzhiyun sizeof(struct rme96), &card);
2456*4882a593Smuzhiyun if (err < 0)
2457*4882a593Smuzhiyun return err;
2458*4882a593Smuzhiyun card->private_free = snd_rme96_card_free;
2459*4882a593Smuzhiyun rme96 = card->private_data;
2460*4882a593Smuzhiyun rme96->card = card;
2461*4882a593Smuzhiyun rme96->pci = pci;
2462*4882a593Smuzhiyun err = snd_rme96_create(rme96);
2463*4882a593Smuzhiyun if (err)
2464*4882a593Smuzhiyun goto free_card;
2465*4882a593Smuzhiyun
2466*4882a593Smuzhiyun #ifdef CONFIG_PM_SLEEP
2467*4882a593Smuzhiyun rme96->playback_suspend_buffer = vmalloc(RME96_BUFFER_SIZE);
2468*4882a593Smuzhiyun if (!rme96->playback_suspend_buffer) {
2469*4882a593Smuzhiyun err = -ENOMEM;
2470*4882a593Smuzhiyun goto free_card;
2471*4882a593Smuzhiyun }
2472*4882a593Smuzhiyun rme96->capture_suspend_buffer = vmalloc(RME96_BUFFER_SIZE);
2473*4882a593Smuzhiyun if (!rme96->capture_suspend_buffer) {
2474*4882a593Smuzhiyun err = -ENOMEM;
2475*4882a593Smuzhiyun goto free_card;
2476*4882a593Smuzhiyun }
2477*4882a593Smuzhiyun #endif
2478*4882a593Smuzhiyun
2479*4882a593Smuzhiyun strcpy(card->driver, "Digi96");
2480*4882a593Smuzhiyun switch (rme96->pci->device) {
2481*4882a593Smuzhiyun case PCI_DEVICE_ID_RME_DIGI96:
2482*4882a593Smuzhiyun strcpy(card->shortname, "RME Digi96");
2483*4882a593Smuzhiyun break;
2484*4882a593Smuzhiyun case PCI_DEVICE_ID_RME_DIGI96_8:
2485*4882a593Smuzhiyun strcpy(card->shortname, "RME Digi96/8");
2486*4882a593Smuzhiyun break;
2487*4882a593Smuzhiyun case PCI_DEVICE_ID_RME_DIGI96_8_PRO:
2488*4882a593Smuzhiyun strcpy(card->shortname, "RME Digi96/8 PRO");
2489*4882a593Smuzhiyun break;
2490*4882a593Smuzhiyun case PCI_DEVICE_ID_RME_DIGI96_8_PAD_OR_PST:
2491*4882a593Smuzhiyun pci_read_config_byte(rme96->pci, 8, &val);
2492*4882a593Smuzhiyun if (val < 5) {
2493*4882a593Smuzhiyun strcpy(card->shortname, "RME Digi96/8 PAD");
2494*4882a593Smuzhiyun } else {
2495*4882a593Smuzhiyun strcpy(card->shortname, "RME Digi96/8 PST");
2496*4882a593Smuzhiyun }
2497*4882a593Smuzhiyun break;
2498*4882a593Smuzhiyun }
2499*4882a593Smuzhiyun sprintf(card->longname, "%s at 0x%lx, irq %d", card->shortname,
2500*4882a593Smuzhiyun rme96->port, rme96->irq);
2501*4882a593Smuzhiyun err = snd_card_register(card);
2502*4882a593Smuzhiyun if (err)
2503*4882a593Smuzhiyun goto free_card;
2504*4882a593Smuzhiyun
2505*4882a593Smuzhiyun pci_set_drvdata(pci, card);
2506*4882a593Smuzhiyun dev++;
2507*4882a593Smuzhiyun return 0;
2508*4882a593Smuzhiyun free_card:
2509*4882a593Smuzhiyun snd_card_free(card);
2510*4882a593Smuzhiyun return err;
2511*4882a593Smuzhiyun }
2512*4882a593Smuzhiyun
snd_rme96_remove(struct pci_dev * pci)2513*4882a593Smuzhiyun static void snd_rme96_remove(struct pci_dev *pci)
2514*4882a593Smuzhiyun {
2515*4882a593Smuzhiyun snd_card_free(pci_get_drvdata(pci));
2516*4882a593Smuzhiyun }
2517*4882a593Smuzhiyun
2518*4882a593Smuzhiyun static struct pci_driver rme96_driver = {
2519*4882a593Smuzhiyun .name = KBUILD_MODNAME,
2520*4882a593Smuzhiyun .id_table = snd_rme96_ids,
2521*4882a593Smuzhiyun .probe = snd_rme96_probe,
2522*4882a593Smuzhiyun .remove = snd_rme96_remove,
2523*4882a593Smuzhiyun .driver = {
2524*4882a593Smuzhiyun .pm = RME96_PM_OPS,
2525*4882a593Smuzhiyun },
2526*4882a593Smuzhiyun };
2527*4882a593Smuzhiyun
2528*4882a593Smuzhiyun module_pci_driver(rme96_driver);
2529