ALSA: Echoaudio - Add suspend support #1
[linux-2.6.git] / sound / pci / echoaudio / layla24_dsp.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 Foundation.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 59 Temple Place - Suite 330, Boston,
21    MA  02111-1307, USA.
22
23    *************************************************************************
24
25  Translation from C++ and adaptation for use in ALSA-Driver
26  were made by Giuliano Pochini <pochini@shiny.it>
27
28 ****************************************************************************/
29
30
31 static int write_control_reg(struct echoaudio *chip, u32 value, char force);
32 static int set_input_clock(struct echoaudio *chip, u16 clock);
33 static int set_professional_spdif(struct echoaudio *chip, char prof);
34 static int set_digital_mode(struct echoaudio *chip, u8 mode);
35 static int load_asic_generic(struct echoaudio *chip, u32 cmd, short asic);
36 static int check_asic_status(struct echoaudio *chip);
37
38
39 static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
40 {
41         int err;
42
43         DE_INIT(("init_hw() - Layla24\n"));
44         if (snd_BUG_ON((subdevice_id & 0xfff0) != LAYLA24))
45                 return -ENODEV;
46
47         if ((err = init_dsp_comm_page(chip))) {
48                 DE_INIT(("init_hw - could not initialize DSP comm page\n"));
49                 return err;
50         }
51
52         chip->device_id = device_id;
53         chip->subdevice_id = subdevice_id;
54         chip->bad_board = TRUE;
55         chip->has_midi = TRUE;
56         chip->dsp_code_to_load = FW_LAYLA24_DSP;
57         chip->input_clock_types =
58                 ECHO_CLOCK_BIT_INTERNAL | ECHO_CLOCK_BIT_SPDIF |
59                 ECHO_CLOCK_BIT_WORD | ECHO_CLOCK_BIT_ADAT;
60         chip->digital_modes =
61                 ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_RCA |
62                 ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_OPTICAL |
63                 ECHOCAPS_HAS_DIGITAL_MODE_ADAT;
64
65         if ((err = load_firmware(chip)) < 0)
66                 return err;
67         chip->bad_board = FALSE;
68
69         if ((err = init_line_levels(chip)) < 0)
70                 return err;
71
72         DE_INIT(("init_hw done\n"));
73         return err;
74 }
75
76
77
78 static int set_mixer_defaults(struct echoaudio *chip)
79 {
80         chip->digital_mode = DIGITAL_MODE_SPDIF_RCA;
81         chip->professional_spdif = FALSE;
82         chip->digital_in_automute = TRUE;
83         return init_line_levels(chip);
84 }
85
86
87
88 static u32 detect_input_clocks(const struct echoaudio *chip)
89 {
90         u32 clocks_from_dsp, clock_bits;
91
92         /* Map the DSP clock detect bits to the generic driver clock detect bits */
93         clocks_from_dsp = le32_to_cpu(chip->comm_page->status_clocks);
94
95         clock_bits = ECHO_CLOCK_BIT_INTERNAL;
96
97         if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_SPDIF)
98                 clock_bits |= ECHO_CLOCK_BIT_SPDIF;
99
100         if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_ADAT)
101                 clock_bits |= ECHO_CLOCK_BIT_ADAT;
102
103         if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_WORD)
104                 clock_bits |= ECHO_CLOCK_BIT_WORD;
105
106         return clock_bits;
107 }
108
109
110
111 /* Layla24 has an ASIC on the PCI card and another ASIC in the external box;
112 both need to be loaded. */
113 static int load_asic(struct echoaudio *chip)
114 {
115         int err;
116
117         if (chip->asic_loaded)
118                 return 1;
119
120         DE_INIT(("load_asic\n"));
121
122         /* Give the DSP a few milliseconds to settle down */
123         mdelay(10);
124
125         /* Load the ASIC for the PCI card */
126         err = load_asic_generic(chip, DSP_FNC_LOAD_LAYLA24_PCI_CARD_ASIC,
127                                 FW_LAYLA24_1_ASIC);
128         if (err < 0)
129                 return err;
130
131         chip->asic_code = FW_LAYLA24_2S_ASIC;
132
133         /* Now give the new ASIC a little time to set up */
134         mdelay(10);
135
136         /* Do the external one */
137         err = load_asic_generic(chip, DSP_FNC_LOAD_LAYLA24_EXTERNAL_ASIC,
138                                 FW_LAYLA24_2S_ASIC);
139         if (err < 0)
140                 return FALSE;
141
142         /* Now give the external ASIC a little time to set up */
143         mdelay(10);
144
145         /* See if it worked */
146         err = check_asic_status(chip);
147
148         /* Set up the control register if the load succeeded -
149            48 kHz, internal clock, S/PDIF RCA mode */
150         if (!err)
151                 err = write_control_reg(chip, GML_CONVERTER_ENABLE | GML_48KHZ,
152                                         TRUE);
153         
154         DE_INIT(("load_asic() done\n"));
155         return err;
156 }
157
158
159
160 static int set_sample_rate(struct echoaudio *chip, u32 rate)
161 {
162         u32 control_reg, clock, base_rate;
163
164         if (snd_BUG_ON(rate >= 50000 &&
165                        chip->digital_mode == DIGITAL_MODE_ADAT))
166                 return -EINVAL;
167
168         /* Only set the clock for internal mode. */
169         if (chip->input_clock != ECHO_CLOCK_INTERNAL) {
170                 DE_ACT(("set_sample_rate: Cannot set sample rate - "
171                         "clock not set to CLK_CLOCKININTERNAL\n"));
172                 /* Save the rate anyhow */
173                 chip->comm_page->sample_rate = cpu_to_le32(rate);
174                 chip->sample_rate = rate;
175                 return 0;
176         }
177
178         /* Get the control register & clear the appropriate bits */
179         control_reg = le32_to_cpu(chip->comm_page->control_register);
180         control_reg &= GML_CLOCK_CLEAR_MASK & GML_SPDIF_RATE_CLEAR_MASK;
181
182         clock = 0;
183
184         switch (rate) {
185         case 96000:
186                 clock = GML_96KHZ;
187                 break;
188         case 88200:
189                 clock = GML_88KHZ;
190                 break;
191         case 48000:
192                 clock = GML_48KHZ | GML_SPDIF_SAMPLE_RATE1;
193                 break;
194         case 44100:
195                 clock = GML_44KHZ;
196                 /* Professional mode */
197                 if (control_reg & GML_SPDIF_PRO_MODE)
198                         clock |= GML_SPDIF_SAMPLE_RATE0;
199                 break;
200         case 32000:
201                 clock = GML_32KHZ | GML_SPDIF_SAMPLE_RATE0 |
202                         GML_SPDIF_SAMPLE_RATE1;
203                 break;
204         case 22050:
205                 clock = GML_22KHZ;
206                 break;
207         case 16000:
208                 clock = GML_16KHZ;
209                 break;
210         case 11025:
211                 clock = GML_11KHZ;
212                 break;
213         case 8000:
214                 clock = GML_8KHZ;
215                 break;
216         default:
217                 /* If this is a non-standard rate, then the driver needs to
218                 use Layla24's special "continuous frequency" mode */
219                 clock = LAYLA24_CONTINUOUS_CLOCK;
220                 if (rate > 50000) {
221                         base_rate = rate >> 1;
222                         control_reg |= GML_DOUBLE_SPEED_MODE;
223                 } else {
224                         base_rate = rate;
225                 }
226
227                 if (base_rate < 25000)
228                         base_rate = 25000;
229
230                 if (wait_handshake(chip))
231                         return -EIO;
232
233                 chip->comm_page->sample_rate =
234                         cpu_to_le32(LAYLA24_MAGIC_NUMBER / base_rate - 2);
235
236                 clear_handshake(chip);
237                 send_vector(chip, DSP_VC_SET_LAYLA24_FREQUENCY_REG);
238         }
239
240         control_reg |= clock;
241
242         chip->comm_page->sample_rate = cpu_to_le32(rate);       /* ignored by the DSP ? */
243         chip->sample_rate = rate;
244         DE_ACT(("set_sample_rate: %d clock %d\n", rate, control_reg));
245
246         return write_control_reg(chip, control_reg, FALSE);
247 }
248
249
250
251 static int set_input_clock(struct echoaudio *chip, u16 clock)
252 {
253         u32 control_reg, clocks_from_dsp;
254
255         /* Mask off the clock select bits */
256         control_reg = le32_to_cpu(chip->comm_page->control_register) &
257                 GML_CLOCK_CLEAR_MASK;
258         clocks_from_dsp = le32_to_cpu(chip->comm_page->status_clocks);
259
260         /* Pick the new clock */
261         switch (clock) {
262         case ECHO_CLOCK_INTERNAL:
263                 DE_ACT(("Set Layla24 clock to INTERNAL\n"));
264                 chip->input_clock = ECHO_CLOCK_INTERNAL;
265                 return set_sample_rate(chip, chip->sample_rate);
266         case ECHO_CLOCK_SPDIF:
267                 if (chip->digital_mode == DIGITAL_MODE_ADAT)
268                         return -EAGAIN;
269                 control_reg |= GML_SPDIF_CLOCK;
270                 /* Layla24 doesn't support 96KHz S/PDIF */
271                 control_reg &= ~GML_DOUBLE_SPEED_MODE;
272                 DE_ACT(("Set Layla24 clock to SPDIF\n"));
273                 break;
274         case ECHO_CLOCK_WORD:
275                 control_reg |= GML_WORD_CLOCK;
276                 if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_WORD96)
277                         control_reg |= GML_DOUBLE_SPEED_MODE;
278                 else
279                         control_reg &= ~GML_DOUBLE_SPEED_MODE;
280                 DE_ACT(("Set Layla24 clock to WORD\n"));
281                 break;
282         case ECHO_CLOCK_ADAT:
283                 if (chip->digital_mode != DIGITAL_MODE_ADAT)
284                         return -EAGAIN;
285                 control_reg |= GML_ADAT_CLOCK;
286                 control_reg &= ~GML_DOUBLE_SPEED_MODE;
287                 DE_ACT(("Set Layla24 clock to ADAT\n"));
288                 break;
289         default:
290                 DE_ACT(("Input clock 0x%x not supported for Layla24\n", clock));
291                 return -EINVAL;
292         }
293
294         chip->input_clock = clock;
295         return write_control_reg(chip, control_reg, TRUE);
296 }
297
298
299
300 /* Depending on what digital mode you want, Layla24 needs different ASICs
301 loaded.  This function checks the ASIC needed for the new mode and sees
302 if it matches the one already loaded. */
303 static int switch_asic(struct echoaudio *chip, short asic)
304 {
305         s8 *monitors;
306
307         /*  Check to see if this is already loaded */
308         if (asic != chip->asic_code) {
309                 monitors = kmemdup(chip->comm_page->monitors,
310                                         MONITOR_ARRAY_SIZE, GFP_KERNEL);
311                 if (! monitors)
312                         return -ENOMEM;
313
314                 memset(chip->comm_page->monitors, ECHOGAIN_MUTED,
315                        MONITOR_ARRAY_SIZE);
316
317                 /* Load the desired ASIC */
318                 if (load_asic_generic(chip, DSP_FNC_LOAD_LAYLA24_EXTERNAL_ASIC,
319                                       asic) < 0) {
320                         memcpy(chip->comm_page->monitors, monitors,
321                                MONITOR_ARRAY_SIZE);
322                         kfree(monitors);
323                         return -EIO;
324                 }
325                 chip->asic_code = asic;
326                 memcpy(chip->comm_page->monitors, monitors, MONITOR_ARRAY_SIZE);
327                 kfree(monitors);
328         }
329
330         return 0;
331 }
332
333
334
335 static int dsp_set_digital_mode(struct echoaudio *chip, u8 mode)
336 {
337         u32 control_reg;
338         int err, incompatible_clock;
339         short asic;
340
341         /* Set clock to "internal" if it's not compatible with the new mode */
342         incompatible_clock = FALSE;
343         switch (mode) {
344         case DIGITAL_MODE_SPDIF_OPTICAL:
345         case DIGITAL_MODE_SPDIF_RCA:
346                 if (chip->input_clock == ECHO_CLOCK_ADAT)
347                         incompatible_clock = TRUE;
348                 asic = FW_LAYLA24_2S_ASIC;
349                 break;
350         case DIGITAL_MODE_ADAT:
351                 if (chip->input_clock == ECHO_CLOCK_SPDIF)
352                         incompatible_clock = TRUE;
353                 asic = FW_LAYLA24_2A_ASIC;
354                 break;
355         default:
356                 DE_ACT(("Digital mode not supported: %d\n", mode));
357                 return -EINVAL;
358         }
359
360         if (incompatible_clock) {       /* Switch to 48KHz, internal */
361                 chip->sample_rate = 48000;
362                 spin_lock_irq(&chip->lock);
363                 set_input_clock(chip, ECHO_CLOCK_INTERNAL);
364                 spin_unlock_irq(&chip->lock);
365         }
366
367         /* switch_asic() can sleep */
368         if (switch_asic(chip, asic) < 0)
369                 return -EIO;
370
371         spin_lock_irq(&chip->lock);
372
373         /* Tweak the control register */
374         control_reg = le32_to_cpu(chip->comm_page->control_register);
375         control_reg &= GML_DIGITAL_MODE_CLEAR_MASK;
376
377         switch (mode) {
378         case DIGITAL_MODE_SPDIF_OPTICAL:
379                 control_reg |= GML_SPDIF_OPTICAL_MODE;
380                 break;
381         case DIGITAL_MODE_SPDIF_RCA:
382                 /* GML_SPDIF_OPTICAL_MODE bit cleared */
383                 break;
384         case DIGITAL_MODE_ADAT:
385                 control_reg |= GML_ADAT_MODE;
386                 control_reg &= ~GML_DOUBLE_SPEED_MODE;
387                 break;
388         }
389
390         err = write_control_reg(chip, control_reg, TRUE);
391         spin_unlock_irq(&chip->lock);
392         if (err < 0)
393                 return err;
394         chip->digital_mode = mode;
395
396         DE_ACT(("set_digital_mode to %d\n", mode));
397         return incompatible_clock;
398 }