~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/sound/pci/echoaudio/echoaudio_3g.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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         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 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php