Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / sound / isa / msnd / msnd.h
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*********************************************************************
3  *
4  * msnd.h
5  *
6  * Turtle Beach MultiSound Sound Card Driver for Linux
7  *
8  * Some parts of this header file were derived from the Turtle Beach
9  * MultiSound Driver Development Kit.
10  *
11  * Copyright (C) 1998 Andrew Veliath
12  * Copyright (C) 1993 Turtle Beach Systems, Inc.
13  *
14  ********************************************************************/
15 #ifndef __MSND_H
16 #define __MSND_H
17
18 #define DEFSAMPLERATE           44100
19 #define DEFSAMPLESIZE           SNDRV_PCM_FORMAT_S16
20 #define DEFCHANNELS             1
21
22 #define SRAM_BANK_SIZE          0x8000
23 #define SRAM_CNTL_START         0x7F00
24 #define SMA_STRUCT_START        0x7F40
25
26 #define DSP_BASE_ADDR           0x4000
27 #define DSP_BANK_BASE           0x4000
28
29 #define AGND                    0x01
30 #define SIGNAL                  0x02
31
32 #define EXT_DSP_BIT_DCAL        0x0001
33 #define EXT_DSP_BIT_MIDI_CON    0x0002
34
35 #define BUFFSIZE                0x8000
36 #define HOSTQ_SIZE              0x40
37
38 #define DAP_BUFF_SIZE           0x2400
39
40 #define DAPQ_STRUCT_SIZE        0x10
41 #define DARQ_STRUCT_SIZE        0x10
42 #define DAPQ_BUFF_SIZE          (3 * 0x10)
43 #define DARQ_BUFF_SIZE          (3 * 0x10)
44 #define MODQ_BUFF_SIZE          0x400
45
46 #define DAPQ_DATA_BUFF          0x6C00
47 #define DARQ_DATA_BUFF          0x6C30
48 #define MODQ_DATA_BUFF          0x6C60
49 #define MIDQ_DATA_BUFF          0x7060
50
51 #define DAPQ_OFFSET             SRAM_CNTL_START
52 #define DARQ_OFFSET             (SRAM_CNTL_START + 0x08)
53 #define MODQ_OFFSET             (SRAM_CNTL_START + 0x10)
54 #define MIDQ_OFFSET             (SRAM_CNTL_START + 0x18)
55 #define DSPQ_OFFSET             (SRAM_CNTL_START + 0x20)
56
57 #define HP_ICR                  0x00
58 #define HP_CVR                  0x01
59 #define HP_ISR                  0x02
60 #define HP_IVR                  0x03
61 #define HP_NU                   0x04
62 #define HP_INFO                 0x04
63 #define HP_TXH                  0x05
64 #define HP_RXH                  0x05
65 #define HP_TXM                  0x06
66 #define HP_RXM                  0x06
67 #define HP_TXL                  0x07
68 #define HP_RXL                  0x07
69
70 #define HP_ICR_DEF              0x00
71 #define HP_CVR_DEF              0x12
72 #define HP_ISR_DEF              0x06
73 #define HP_IVR_DEF              0x0f
74 #define HP_NU_DEF               0x00
75
76 #define HP_IRQM                 0x09
77
78 #define HPR_BLRC                0x08
79 #define HPR_SPR1                0x09
80 #define HPR_SPR2                0x0A
81 #define HPR_TCL0                0x0B
82 #define HPR_TCL1                0x0C
83 #define HPR_TCL2                0x0D
84 #define HPR_TCL3                0x0E
85 #define HPR_TCL4                0x0F
86
87 #define HPICR_INIT              0x80
88 #define HPICR_HM1               0x40
89 #define HPICR_HM0               0x20
90 #define HPICR_HF1               0x10
91 #define HPICR_HF0               0x08
92 #define HPICR_TREQ              0x02
93 #define HPICR_RREQ              0x01
94
95 #define HPCVR_HC                0x80
96
97 #define HPISR_HREQ              0x80
98 #define HPISR_DMA               0x40
99 #define HPISR_HF3               0x10
100 #define HPISR_HF2               0x08
101 #define HPISR_TRDY              0x04
102 #define HPISR_TXDE              0x02
103 #define HPISR_RXDF              0x01
104
105 #define HPIO_290                0
106 #define HPIO_260                1
107 #define HPIO_250                2
108 #define HPIO_240                3
109 #define HPIO_230                4
110 #define HPIO_220                5
111 #define HPIO_210                6
112 #define HPIO_3E0                7
113
114 #define HPMEM_NONE              0
115 #define HPMEM_B000              1
116 #define HPMEM_C800              2
117 #define HPMEM_D000              3
118 #define HPMEM_D400              4
119 #define HPMEM_D800              5
120 #define HPMEM_E000              6
121 #define HPMEM_E800              7
122
123 #define HPIRQ_NONE              0
124 #define HPIRQ_5                 1
125 #define HPIRQ_7                 2
126 #define HPIRQ_9                 3
127 #define HPIRQ_10                4
128 #define HPIRQ_11                5
129 #define HPIRQ_12                6
130 #define HPIRQ_15                7
131
132 #define HIMT_PLAY_DONE          0x00
133 #define HIMT_RECORD_DONE        0x01
134 #define HIMT_MIDI_EOS           0x02
135 #define HIMT_MIDI_OUT           0x03
136
137 #define HIMT_MIDI_IN_UCHAR      0x0E
138 #define HIMT_DSP                0x0F
139
140 #define HDEX_BASE               0x92
141 #define HDEX_PLAY_START         (0 + HDEX_BASE)
142 #define HDEX_PLAY_STOP          (1 + HDEX_BASE)
143 #define HDEX_PLAY_PAUSE         (2 + HDEX_BASE)
144 #define HDEX_PLAY_RESUME        (3 + HDEX_BASE)
145 #define HDEX_RECORD_START       (4 + HDEX_BASE)
146 #define HDEX_RECORD_STOP        (5 + HDEX_BASE)
147 #define HDEX_MIDI_IN_START      (6 + HDEX_BASE)
148 #define HDEX_MIDI_IN_STOP       (7 + HDEX_BASE)
149 #define HDEX_MIDI_OUT_START     (8 + HDEX_BASE)
150 #define HDEX_MIDI_OUT_STOP      (9 + HDEX_BASE)
151 #define HDEX_AUX_REQ            (10 + HDEX_BASE)
152
153 #define HDEXAR_CLEAR_PEAKS      1
154 #define HDEXAR_IN_SET_POTS      2
155 #define HDEXAR_AUX_SET_POTS     3
156 #define HDEXAR_CAL_A_TO_D       4
157 #define HDEXAR_RD_EXT_DSP_BITS  5
158
159 /* Pinnacle only HDEXAR defs */
160 #define HDEXAR_SET_ANA_IN       0
161 #define HDEXAR_SET_SYNTH_IN     4
162 #define HDEXAR_READ_DAT_IN      5
163 #define HDEXAR_MIC_SET_POTS     6
164 #define HDEXAR_SET_DAT_IN       7
165
166 #define HDEXAR_SET_SYNTH_48     8
167 #define HDEXAR_SET_SYNTH_44     9
168
169 #define HIWORD(l)               ((u16)((((u32)(l)) >> 16) & 0xFFFF))
170 #define LOWORD(l)               ((u16)(u32)(l))
171 #define HIBYTE(w)               ((u8)(((u16)(w) >> 8) & 0xFF))
172 #define LOBYTE(w)               ((u8)(w))
173 #define MAKELONG(low, hi)       ((long)(((u16)(low))|(((u32)((u16)(hi)))<<16)))
174 #define MAKEWORD(low, hi)       ((u16)(((u8)(low))|(((u16)((u8)(hi)))<<8)))
175
176 #define PCTODSP_OFFSET(w)       (u16)((w)/2)
177 #define PCTODSP_BASED(w)        (u16)(((w)/2) + DSP_BASE_ADDR)
178 #define DSPTOPC_BASED(w)        (((w) - DSP_BASE_ADDR) * 2)
179
180 #ifdef SLOWIO
181 #  undef outb
182 #  undef inb
183 #  define outb                  outb_p
184 #  define inb                   inb_p
185 #endif
186
187 /* JobQueueStruct */
188 #define JQS_wStart              0x00
189 #define JQS_wSize               0x02
190 #define JQS_wHead               0x04
191 #define JQS_wTail               0x06
192 #define JQS__size               0x08
193
194 /* DAQueueDataStruct */
195 #define DAQDS_wStart            0x00
196 #define DAQDS_wSize             0x02
197 #define DAQDS_wFormat           0x04
198 #define DAQDS_wSampleSize       0x06
199 #define DAQDS_wChannels         0x08
200 #define DAQDS_wSampleRate       0x0A
201 #define DAQDS_wIntMsg           0x0C
202 #define DAQDS_wFlags            0x0E
203 #define DAQDS__size             0x10
204
205 #include <sound/pcm.h>
206
207 struct snd_msnd {
208         void __iomem            *mappedbase;
209         int                     play_period_bytes;
210         int                     playLimit;
211         int                     playPeriods;
212         int                     playDMAPos;
213         int                     banksPlayed;
214         int                     captureDMAPos;
215         int                     capturePeriodBytes;
216         int                     captureLimit;
217         int                     capturePeriods;
218         struct snd_card         *card;
219         void                    *msndmidi_mpu;
220         struct snd_rawmidi      *rmidi;
221
222         /* Hardware resources */
223         long io;
224         int memid, irqid;
225         int irq, irq_ref;
226         unsigned long base;
227
228         /* Motorola 56k DSP SMA */
229         void __iomem    *SMA;
230         void __iomem    *DAPQ;
231         void __iomem    *DARQ;
232         void __iomem    *MODQ;
233         void __iomem    *MIDQ;
234         void __iomem    *DSPQ;
235         int dspq_data_buff, dspq_buff_size;
236
237         /* State variables */
238         enum { msndClassic, msndPinnacle } type;
239         fmode_t mode;
240         unsigned long flags;
241 #define F_RESETTING                     0
242 #define F_HAVEDIGITAL                   1
243 #define F_AUDIO_WRITE_INUSE             2
244 #define F_WRITING                       3
245 #define F_WRITEBLOCK                    4
246 #define F_WRITEFLUSH                    5
247 #define F_AUDIO_READ_INUSE              6
248 #define F_READING                       7
249 #define F_READBLOCK                     8
250 #define F_EXT_MIDI_INUSE                9
251 #define F_HDR_MIDI_INUSE                10
252 #define F_DISABLE_WRITE_NDELAY          11
253         spinlock_t lock;
254         spinlock_t mixer_lock;
255         int nresets;
256         unsigned recsrc;
257 #define LEVEL_ENTRIES 32
258         int left_levels[LEVEL_ENTRIES];
259         int right_levels[LEVEL_ENTRIES];
260         int calibrate_signal;
261         int play_sample_size, play_sample_rate, play_channels;
262         int play_ndelay;
263         int capture_sample_size, capture_sample_rate, capture_channels;
264         int capture_ndelay;
265         u8 bCurrentMidiPatch;
266
267         int last_playbank, last_recbank;
268         struct snd_pcm_substream *playback_substream;
269         struct snd_pcm_substream *capture_substream;
270
271 };
272
273 void snd_msnd_init_queue(void __iomem *base, int start, int size);
274
275 int snd_msnd_send_dsp_cmd(struct snd_msnd *chip, u8 cmd);
276 int snd_msnd_send_word(struct snd_msnd *chip,
277                            unsigned char high,
278                            unsigned char mid,
279                            unsigned char low);
280 int snd_msnd_upload_host(struct snd_msnd *chip,
281                              const u8 *bin, int len);
282 int snd_msnd_enable_irq(struct snd_msnd *chip);
283 int snd_msnd_disable_irq(struct snd_msnd *chip);
284 void snd_msnd_dsp_halt(struct snd_msnd *chip, struct file *file);
285 int snd_msnd_DAPQ(struct snd_msnd *chip, int start);
286 int snd_msnd_DARQ(struct snd_msnd *chip, int start);
287 int snd_msnd_pcm(struct snd_card *card, int device);
288
289 int snd_msndmidi_new(struct snd_card *card, int device);
290 void snd_msndmidi_input_read(void *mpu);
291
292 void snd_msndmix_setup(struct snd_msnd *chip);
293 int snd_msndmix_new(struct snd_card *card);
294 int snd_msndmix_force_recsrc(struct snd_msnd *chip, int recsrc);
295 #endif /* __MSND_H */