Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
indigoio_dsp.c
Go to the documentation of this file.
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 static int set_vmixer_gain(struct echoaudio *chip, u16 output, u16 pipe,
33  int gain);
34 static int update_vmixer_level(struct echoaudio *chip);
35 
36 
37 static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
38 {
39  int err;
40 
41  DE_INIT(("init_hw() - Indigo IO\n"));
42  if (snd_BUG_ON((subdevice_id & 0xfff0) != INDIGO_IO))
43  return -ENODEV;
44 
45  if ((err = init_dsp_comm_page(chip))) {
46  DE_INIT(("init_hw - could not initialize DSP comm page\n"));
47  return err;
48  }
49 
50  chip->device_id = device_id;
51  chip->subdevice_id = subdevice_id;
52  chip->bad_board = TRUE;
54  /* Since this card has no ASIC, mark it as loaded so everything
55  works OK */
56  chip->asic_loaded = TRUE;
58 
59  if ((err = load_firmware(chip)) < 0)
60  return err;
61  chip->bad_board = FALSE;
62 
63  DE_INIT(("init_hw done\n"));
64  return err;
65 }
66 
67 
68 
69 static int set_mixer_defaults(struct echoaudio *chip)
70 {
71  return init_line_levels(chip);
72 }
73 
74 
75 
76 static u32 detect_input_clocks(const struct echoaudio *chip)
77 {
79 }
80 
81 
82 
83 /* The IndigoIO has no ASIC. Just do nothing */
84 static int load_asic(struct echoaudio *chip)
85 {
86  return 0;
87 }
88 
89 
90 
91 static int set_sample_rate(struct echoaudio *chip, u32 rate)
92 {
93  if (wait_handshake(chip))
94  return -EIO;
95 
96  chip->sample_rate = rate;
97  chip->comm_page->sample_rate = cpu_to_le32(rate);
98  clear_handshake(chip);
99  return send_vector(chip, DSP_VC_UPDATE_CLOCKS);
100 }
101 
102 
103 
104 /* This function routes the sound from a virtual channel to a real output */
105 static int set_vmixer_gain(struct echoaudio *chip, u16 output, u16 pipe,
106  int gain)
107 {
108  int index;
109 
110  if (snd_BUG_ON(pipe >= num_pipes_out(chip) ||
111  output >= num_busses_out(chip)))
112  return -EINVAL;
113 
114  if (wait_handshake(chip))
115  return -EIO;
116 
117  chip->vmixer_gain[output][pipe] = gain;
118  index = output * num_pipes_out(chip) + pipe;
119  chip->comm_page->vmixer[index] = gain;
120 
121  DE_ACT(("set_vmixer_gain: pipe %d, out %d = %d\n", pipe, output, gain));
122  return 0;
123 }
124 
125 
126 
127 /* Tell the DSP to read and update virtual mixer levels in comm page. */
128 static int update_vmixer_level(struct echoaudio *chip)
129 {
130  if (wait_handshake(chip))
131  return -EIO;
132  clear_handshake(chip);
133  return send_vector(chip, DSP_VC_SET_VMIXER_GAIN);
134 }
135