Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/pci/echoaudio/echoaudio_3g.c
26424 views
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 <[email protected]>
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
control_reg = le32_to_cpu(chip->comm_page->control_register);
278
control_reg &= E3G_CLOCK_CLEAR_MASK;
279
280
switch (rate) {
281
case 96000:
282
clock = E3G_96KHZ;
283
break;
284
case 88200:
285
clock = E3G_88KHZ;
286
break;
287
case 48000:
288
clock = E3G_48KHZ;
289
break;
290
case 44100:
291
clock = E3G_44KHZ;
292
break;
293
case 32000:
294
clock = E3G_32KHZ;
295
break;
296
default:
297
clock = E3G_CONTINUOUS_CLOCK;
298
if (rate > 50000)
299
clock |= E3G_DOUBLE_SPEED_MODE;
300
break;
301
}
302
303
control_reg |= clock;
304
control_reg = set_spdif_bits(chip, control_reg, rate);
305
306
base_rate = rate;
307
if (base_rate > 50000)
308
base_rate /= 2;
309
if (base_rate < 32000)
310
base_rate = 32000;
311
312
frq_reg = E3G_MAGIC_NUMBER / base_rate - 2;
313
if (frq_reg > E3G_FREQ_REG_MAX)
314
frq_reg = E3G_FREQ_REG_MAX;
315
316
chip->comm_page->sample_rate = cpu_to_le32(rate); /* ignored by the DSP */
317
chip->sample_rate = rate;
318
dev_dbg(chip->card->dev,
319
"SetSampleRate: %d clock %x\n", rate, control_reg);
320
321
/* Tell the DSP about it - DSP reads both control reg & freq reg */
322
return write_control_reg(chip, control_reg, frq_reg, 0);
323
}
324
325
326
327
/* Set the sample clock source to internal, S/PDIF, ADAT */
328
static int set_input_clock(struct echoaudio *chip, u16 clock)
329
{
330
u32 control_reg, clocks_from_dsp;
331
332
333
/* Mask off the clock select bits */
334
control_reg = le32_to_cpu(chip->comm_page->control_register) &
335
E3G_CLOCK_CLEAR_MASK;
336
clocks_from_dsp = le32_to_cpu(chip->comm_page->status_clocks);
337
338
switch (clock) {
339
case ECHO_CLOCK_INTERNAL:
340
chip->input_clock = ECHO_CLOCK_INTERNAL;
341
return set_sample_rate(chip, chip->sample_rate);
342
case ECHO_CLOCK_SPDIF:
343
if (chip->digital_mode == DIGITAL_MODE_ADAT)
344
return -EAGAIN;
345
control_reg |= E3G_SPDIF_CLOCK;
346
if (clocks_from_dsp & E3G_CLOCK_DETECT_BIT_SPDIF96)
347
control_reg |= E3G_DOUBLE_SPEED_MODE;
348
else
349
control_reg &= ~E3G_DOUBLE_SPEED_MODE;
350
break;
351
case ECHO_CLOCK_ADAT:
352
if (chip->digital_mode != DIGITAL_MODE_ADAT)
353
return -EAGAIN;
354
control_reg |= E3G_ADAT_CLOCK;
355
control_reg &= ~E3G_DOUBLE_SPEED_MODE;
356
break;
357
case ECHO_CLOCK_WORD:
358
control_reg |= E3G_WORD_CLOCK;
359
if (clocks_from_dsp & E3G_CLOCK_DETECT_BIT_WORD96)
360
control_reg |= E3G_DOUBLE_SPEED_MODE;
361
else
362
control_reg &= ~E3G_DOUBLE_SPEED_MODE;
363
break;
364
default:
365
dev_err(chip->card->dev,
366
"Input clock 0x%x not supported for Echo3G\n", clock);
367
return -EINVAL;
368
}
369
370
chip->input_clock = clock;
371
return write_control_reg(chip, control_reg, get_frq_reg(chip), 1);
372
}
373
374
375
376
static int dsp_set_digital_mode(struct echoaudio *chip, u8 mode)
377
{
378
u32 control_reg;
379
int err, incompatible_clock;
380
381
/* Set clock to "internal" if it's not compatible with the new mode */
382
incompatible_clock = false;
383
switch (mode) {
384
case DIGITAL_MODE_SPDIF_OPTICAL:
385
case DIGITAL_MODE_SPDIF_RCA:
386
if (chip->input_clock == ECHO_CLOCK_ADAT)
387
incompatible_clock = true;
388
break;
389
case DIGITAL_MODE_ADAT:
390
if (chip->input_clock == ECHO_CLOCK_SPDIF)
391
incompatible_clock = true;
392
break;
393
default:
394
dev_err(chip->card->dev,
395
"Digital mode not supported: %d\n", mode);
396
return -EINVAL;
397
}
398
399
spin_lock_irq(&chip->lock);
400
401
if (incompatible_clock) {
402
chip->sample_rate = 48000;
403
set_input_clock(chip, ECHO_CLOCK_INTERNAL);
404
}
405
406
/* Clear the current digital mode */
407
control_reg = le32_to_cpu(chip->comm_page->control_register);
408
control_reg &= E3G_DIGITAL_MODE_CLEAR_MASK;
409
410
/* Tweak the control reg */
411
switch (mode) {
412
case DIGITAL_MODE_SPDIF_OPTICAL:
413
control_reg |= E3G_SPDIF_OPTICAL_MODE;
414
break;
415
case DIGITAL_MODE_SPDIF_RCA:
416
/* E3G_SPDIF_OPTICAL_MODE bit cleared */
417
break;
418
case DIGITAL_MODE_ADAT:
419
control_reg |= E3G_ADAT_MODE;
420
control_reg &= ~E3G_DOUBLE_SPEED_MODE; /* @@ useless */
421
break;
422
}
423
424
err = write_control_reg(chip, control_reg, get_frq_reg(chip), 1);
425
spin_unlock_irq(&chip->lock);
426
if (err < 0)
427
return err;
428
chip->digital_mode = mode;
429
430
dev_dbg(chip->card->dev, "set_digital_mode(%d)\n", chip->digital_mode);
431
return incompatible_clock;
432
}
433
434