Linux-libre 5.4.49-gnu
[librecmc/linux-libre.git] / sound / pci / echoaudio / echoaudio_3g.c
1 /****************************************************************************
2
3    Copyright Echo Digital Audio Corporation (c) 1998 - 2004
4    All rights reserved
5    www.echoaudio.com
6
7    This file is part of Echo Digital Audio's generic driver library.
8
9    Echo Digital Audio's generic driver library is free software;
10    you can redistribute it and/or modify it under the terms of
11    the GNU General Public License as published by the Free Software
12    Foundation.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 59 Temple Place - Suite 330, Boston,
22    MA  02111-1307, USA.
23
24    *************************************************************************
25
26  Translation from C++ and adaptation for use in ALSA-Driver
27  were made by Giuliano Pochini <pochini@shiny.it>
28
29 ****************************************************************************/
30
31
32
33 /* These functions are common for all "3G" cards */
34
35
36 static int check_asic_status(struct echoaudio *chip)
37 {
38         u32 box_status;
39
40         if (wait_handshake(chip))
41                 return -EIO;
42
43         chip->comm_page->ext_box_status = cpu_to_le32(E3G_ASIC_NOT_LOADED);
44         chip->asic_loaded = false;
45         clear_handshake(chip);
46         send_vector(chip, DSP_VC_TEST_ASIC);
47
48         if (wait_handshake(chip)) {
49                 chip->dsp_code = NULL;
50                 return -EIO;
51         }
52
53         box_status = le32_to_cpu(chip->comm_page->ext_box_status);
54         dev_dbg(chip->card->dev, "box_status=%x\n", box_status);
55         if (box_status == E3G_ASIC_NOT_LOADED)
56                 return -ENODEV;
57
58         chip->asic_loaded = true;
59         return box_status & E3G_BOX_TYPE_MASK;
60 }
61
62
63
64 static inline u32 get_frq_reg(struct echoaudio *chip)
65 {
66         return le32_to_cpu(chip->comm_page->e3g_frq_register);
67 }
68
69
70
71 /* Most configuration of 3G cards is accomplished by writing the control
72 register. write_control_reg sends the new control register value to the DSP. */
73 static int write_control_reg(struct echoaudio *chip, u32 ctl, u32 frq,
74                              char force)
75 {
76         __le32 ctl_reg, frq_reg;
77
78         if (wait_handshake(chip))
79                 return -EIO;
80
81         dev_dbg(chip->card->dev,
82                 "WriteControlReg: Setting 0x%x, 0x%x\n", ctl, frq);
83
84         ctl_reg = cpu_to_le32(ctl);
85         frq_reg = cpu_to_le32(frq);
86
87         if (ctl_reg != chip->comm_page->control_register ||
88             frq_reg != chip->comm_page->e3g_frq_register || force) {
89                 chip->comm_page->e3g_frq_register = frq_reg;
90                 chip->comm_page->control_register = ctl_reg;
91                 clear_handshake(chip);
92                 return send_vector(chip, DSP_VC_WRITE_CONTROL_REG);
93         }
94
95         dev_dbg(chip->card->dev, "WriteControlReg: not written, no change\n");
96         return 0;
97 }
98
99
100
101 /* Set the digital mode - currently for Gina24, Layla24, Mona, 3G */
102 static int set_digital_mode(struct echoaudio *chip, u8 mode)
103 {
104         u8 previous_mode;
105         int err, i, o;
106
107         /* All audio channels must be closed before changing the digital mode */
108         if (snd_BUG_ON(chip->pipe_alloc_mask))
109                 return -EAGAIN;
110
111         if (snd_BUG_ON(!(chip->digital_modes & (1 << mode))))
112                 return -EINVAL;
113
114         previous_mode = chip->digital_mode;
115         err = dsp_set_digital_mode(chip, mode);
116
117         /* If we successfully changed the digital mode from or to ADAT,
118          * then make sure all output, input and monitor levels are
119          * updated by the DSP comm object. */
120         if (err >= 0 && previous_mode != mode &&
121             (previous_mode == DIGITAL_MODE_ADAT || mode == DIGITAL_MODE_ADAT)) {
122                 spin_lock_irq(&chip->lock);
123                 for (o = 0; o < num_busses_out(chip); o++)
124                         for (i = 0; i < num_busses_in(chip); i++)
125                                 set_monitor_gain(chip, o, i,
126                                                  chip->monitor_gain[o][i]);
127
128 #ifdef ECHOCARD_HAS_INPUT_GAIN
129                 for (i = 0; i < num_busses_in(chip); i++)
130                         set_input_gain(chip, i, chip->input_gain[i]);
131                 update_input_line_level(chip);
132 #endif
133
134                 for (o = 0; o < num_busses_out(chip); o++)
135                         set_output_gain(chip, o, chip->output_gain[o]);
136                 update_output_line_level(chip);
137                 spin_unlock_irq(&chip->lock);
138         }
139
140         return err;
141 }
142
143
144
145 static u32 set_spdif_bits(struct echoaudio *chip, u32 control_reg, u32 rate)
146 {
147         control_reg &= E3G_SPDIF_FORMAT_CLEAR_MASK;
148
149         switch (rate) {
150         case 32000 :
151                 control_reg |= E3G_SPDIF_SAMPLE_RATE0 | E3G_SPDIF_SAMPLE_RATE1;
152                 break;
153         case 44100 :
154                 if (chip->professional_spdif)
155                         control_reg |= E3G_SPDIF_SAMPLE_RATE0;
156                 break;
157         case 48000 :
158                 control_reg |= E3G_SPDIF_SAMPLE_RATE1;
159                 break;
160         }
161
162         if (chip->professional_spdif)
163                 control_reg |= E3G_SPDIF_PRO_MODE;
164
165         if (chip->non_audio_spdif)
166                 control_reg |= E3G_SPDIF_NOT_AUDIO;
167
168         control_reg |= E3G_SPDIF_24_BIT | E3G_SPDIF_TWO_CHANNEL |
169                 E3G_SPDIF_COPY_PERMIT;
170
171         return control_reg;
172 }
173
174
175
176 /* Set the S/PDIF output format */
177 static int set_professional_spdif(struct echoaudio *chip, char prof)
178 {
179         u32 control_reg;
180
181         control_reg = le32_to_cpu(chip->comm_page->control_register);
182         chip->professional_spdif = prof;
183         control_reg = set_spdif_bits(chip, control_reg, chip->sample_rate);
184         return write_control_reg(chip, control_reg, get_frq_reg(chip), 0);
185 }
186
187
188
189 /* detect_input_clocks() returns a bitmask consisting of all the input clocks
190 currently connected to the hardware; this changes as the user connects and
191 disconnects clock inputs. You should use this information to determine which
192 clocks the user is allowed to select. */
193 static u32 detect_input_clocks(const struct echoaudio *chip)
194 {
195         u32 clocks_from_dsp, clock_bits;
196
197         /* Map the DSP clock detect bits to the generic driver clock
198          * detect bits */
199         clocks_from_dsp = le32_to_cpu(chip->comm_page->status_clocks);
200
201         clock_bits = ECHO_CLOCK_BIT_INTERNAL;
202
203         if (clocks_from_dsp & E3G_CLOCK_DETECT_BIT_WORD)
204                 clock_bits |= ECHO_CLOCK_BIT_WORD;
205
206         switch(chip->digital_mode) {
207         case DIGITAL_MODE_SPDIF_RCA:
208         case DIGITAL_MODE_SPDIF_OPTICAL:
209                 if (clocks_from_dsp & E3G_CLOCK_DETECT_BIT_SPDIF)
210                         clock_bits |= ECHO_CLOCK_BIT_SPDIF;
211                 break;
212         case DIGITAL_MODE_ADAT:
213                 if (clocks_from_dsp & E3G_CLOCK_DETECT_BIT_ADAT)
214                         clock_bits |= ECHO_CLOCK_BIT_ADAT;
215                 break;
216         }
217
218         return clock_bits;
219 }
220
221
222
223 static int load_asic(struct echoaudio *chip)
224 {
225         int box_type, err;
226
227         if (chip->asic_loaded)
228                 return 0;
229
230         /* Give the DSP a few milliseconds to settle down */
231         mdelay(2);
232
233         err = load_asic_generic(chip, DSP_FNC_LOAD_3G_ASIC, FW_3G_ASIC);
234         if (err < 0)
235                 return err;
236
237         chip->asic_code = FW_3G_ASIC;
238
239         /* Now give the new ASIC some time to set up */
240         msleep(1000);
241         /* See if it worked */
242         box_type = check_asic_status(chip);
243
244         /* Set up the control register if the load succeeded -
245          * 48 kHz, internal clock, S/PDIF RCA mode */
246         if (box_type >= 0) {
247                 err = write_control_reg(chip, E3G_48KHZ,
248                                         E3G_FREQ_REG_DEFAULT, true);
249                 if (err < 0)
250                         return err;
251         }
252
253         return box_type;
254 }
255
256
257
258 static int set_sample_rate(struct echoaudio *chip, u32 rate)
259 {
260         u32 control_reg, clock, base_rate, frq_reg;
261
262         /* Only set the clock for internal mode. */
263         if (chip->input_clock != ECHO_CLOCK_INTERNAL) {
264                 dev_warn(chip->card->dev,
265                          "Cannot set sample rate - clock not set to CLK_CLOCKININTERNAL\n");
266                 /* Save the rate anyhow */
267                 chip->comm_page->sample_rate = cpu_to_le32(rate);
268                 chip->sample_rate = rate;
269                 set_input_clock(chip, chip->input_clock);
270                 return 0;
271         }
272
273         if (snd_BUG_ON(rate >= 50000 &&
274                        chip->digital_mode == DIGITAL_MODE_ADAT))
275                 return -EINVAL;
276
277         clock = 0;
278         control_reg = le32_to_cpu(chip->comm_page->control_register);
279         control_reg &= E3G_CLOCK_CLEAR_MASK;
280
281         switch (rate) {
282         case 96000:
283                 clock = E3G_96KHZ;
284                 break;
285         case 88200:
286                 clock = E3G_88KHZ;
287                 break;
288         case 48000:
289                 clock = E3G_48KHZ;
290                 break;
291         case 44100:
292                 clock = E3G_44KHZ;
293                 break;
294         case 32000:
295                 clock = E3G_32KHZ;
296                 break;
297         default:
298                 clock = E3G_CONTINUOUS_CLOCK;
299                 if (rate > 50000)
300                         clock |= E3G_DOUBLE_SPEED_MODE;
301                 break;
302         }
303
304         control_reg |= clock;
305         control_reg = set_spdif_bits(chip, control_reg, rate);
306
307         base_rate = rate;
308         if (base_rate > 50000)
309                 base_rate /= 2;
310         if (base_rate < 32000)
311                 base_rate = 32000;
312
313         frq_reg = E3G_MAGIC_NUMBER / base_rate - 2;
314         if (frq_reg > E3G_FREQ_REG_MAX)
315                 frq_reg = E3G_FREQ_REG_MAX;
316
317         chip->comm_page->sample_rate = cpu_to_le32(rate);       /* ignored by the DSP */
318         chip->sample_rate = rate;
319         dev_dbg(chip->card->dev,
320                 "SetSampleRate: %d clock %x\n", rate, control_reg);
321
322         /* Tell the DSP about it - DSP reads both control reg & freq reg */
323         return write_control_reg(chip, control_reg, frq_reg, 0);
324 }
325
326
327
328 /* Set the sample clock source to internal, S/PDIF, ADAT */
329 static int set_input_clock(struct echoaudio *chip, u16 clock)
330 {
331         u32 control_reg, clocks_from_dsp;
332
333
334         /* Mask off the clock select bits */
335         control_reg = le32_to_cpu(chip->comm_page->control_register) &
336                 E3G_CLOCK_CLEAR_MASK;
337         clocks_from_dsp = le32_to_cpu(chip->comm_page->status_clocks);
338
339         switch (clock) {
340         case ECHO_CLOCK_INTERNAL:
341                 chip->input_clock = ECHO_CLOCK_INTERNAL;
342                 return set_sample_rate(chip, chip->sample_rate);
343         case ECHO_CLOCK_SPDIF:
344                 if (chip->digital_mode == DIGITAL_MODE_ADAT)
345                         return -EAGAIN;
346                 control_reg |= E3G_SPDIF_CLOCK;
347                 if (clocks_from_dsp & E3G_CLOCK_DETECT_BIT_SPDIF96)
348                         control_reg |= E3G_DOUBLE_SPEED_MODE;
349                 else
350                         control_reg &= ~E3G_DOUBLE_SPEED_MODE;
351                 break;
352         case ECHO_CLOCK_ADAT:
353                 if (chip->digital_mode != DIGITAL_MODE_ADAT)
354                         return -EAGAIN;
355                 control_reg |= E3G_ADAT_CLOCK;
356                 control_reg &= ~E3G_DOUBLE_SPEED_MODE;
357                 break;
358         case ECHO_CLOCK_WORD:
359                 control_reg |= E3G_WORD_CLOCK;
360                 if (clocks_from_dsp & E3G_CLOCK_DETECT_BIT_WORD96)
361                         control_reg |= E3G_DOUBLE_SPEED_MODE;
362                 else
363                         control_reg &= ~E3G_DOUBLE_SPEED_MODE;
364                 break;
365         default:
366                 dev_err(chip->card->dev,
367                         "Input clock 0x%x not supported for Echo3G\n", clock);
368                 return -EINVAL;
369         }
370
371         chip->input_clock = clock;
372         return write_control_reg(chip, control_reg, get_frq_reg(chip), 1);
373 }
374
375
376
377 static int dsp_set_digital_mode(struct echoaudio *chip, u8 mode)
378 {
379         u32 control_reg;
380         int err, incompatible_clock;
381
382         /* Set clock to "internal" if it's not compatible with the new mode */
383         incompatible_clock = false;
384         switch (mode) {
385         case DIGITAL_MODE_SPDIF_OPTICAL:
386         case DIGITAL_MODE_SPDIF_RCA:
387                 if (chip->input_clock == ECHO_CLOCK_ADAT)
388                         incompatible_clock = true;
389                 break;
390         case DIGITAL_MODE_ADAT:
391                 if (chip->input_clock == ECHO_CLOCK_SPDIF)
392                         incompatible_clock = true;
393                 break;
394         default:
395                 dev_err(chip->card->dev,
396                         "Digital mode not supported: %d\n", mode);
397                 return -EINVAL;
398         }
399
400         spin_lock_irq(&chip->lock);
401
402         if (incompatible_clock) {
403                 chip->sample_rate = 48000;
404                 set_input_clock(chip, ECHO_CLOCK_INTERNAL);
405         }
406
407         /* Clear the current digital mode */
408         control_reg = le32_to_cpu(chip->comm_page->control_register);
409         control_reg &= E3G_DIGITAL_MODE_CLEAR_MASK;
410
411         /* Tweak the control reg */
412         switch (mode) {
413         case DIGITAL_MODE_SPDIF_OPTICAL:
414                 control_reg |= E3G_SPDIF_OPTICAL_MODE;
415                 break;
416         case DIGITAL_MODE_SPDIF_RCA:
417                 /* E3G_SPDIF_OPTICAL_MODE bit cleared */
418                 break;
419         case DIGITAL_MODE_ADAT:
420                 control_reg |= E3G_ADAT_MODE;
421                 control_reg &= ~E3G_DOUBLE_SPEED_MODE;  /* @@ useless */
422                 break;
423         }
424
425         err = write_control_reg(chip, control_reg, get_frq_reg(chip), 1);
426         spin_unlock_irq(&chip->lock);
427         if (err < 0)
428                 return err;
429         chip->digital_mode = mode;
430
431         dev_dbg(chip->card->dev, "set_digital_mode(%d)\n", chip->digital_mode);
432         return incompatible_clock;
433 }