Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6
[pandora-kernel.git] / drivers / staging / line6 / pcm.c
1 /*
2  * Line6 Linux USB driver - 0.9.1beta
3  *
4  * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
5  *
6  *      This program is free software; you can redistribute it and/or
7  *      modify it under the terms of the GNU General Public License as
8  *      published by the Free Software Foundation, version 2.
9  *
10  */
11
12 #include <linux/slab.h>
13 #include <sound/core.h>
14 #include <sound/control.h>
15 #include <sound/pcm.h>
16 #include <sound/pcm_params.h>
17
18 #include "audio.h"
19 #include "capture.h"
20 #include "driver.h"
21 #include "playback.h"
22 #include "pod.h"
23
24 #ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE
25
26 static struct snd_line6_pcm *dev2pcm(struct device *dev)
27 {
28         struct usb_interface *interface = to_usb_interface(dev);
29         struct usb_line6 *line6 = usb_get_intfdata(interface);
30         struct snd_line6_pcm *line6pcm = line6->line6pcm;
31         return line6pcm;
32 }
33
34 /*
35         "read" request on "impulse_volume" special file.
36 */
37 static ssize_t pcm_get_impulse_volume(struct device *dev,
38                                       struct device_attribute *attr, char *buf)
39 {
40         return sprintf(buf, "%d\n", dev2pcm(dev)->impulse_volume);
41 }
42
43 /*
44         "write" request on "impulse_volume" special file.
45 */
46 static ssize_t pcm_set_impulse_volume(struct device *dev,
47                                       struct device_attribute *attr,
48                                       const char *buf, size_t count)
49 {
50         struct snd_line6_pcm *line6pcm = dev2pcm(dev);
51         int value = simple_strtoul(buf, NULL, 10);
52         line6pcm->impulse_volume = value;
53
54         if (value > 0)
55                 line6_pcm_start(line6pcm, MASK_PCM_IMPULSE);
56         else
57                 line6_pcm_stop(line6pcm, MASK_PCM_IMPULSE);
58
59         return count;
60 }
61
62 /*
63         "read" request on "impulse_period" special file.
64 */
65 static ssize_t pcm_get_impulse_period(struct device *dev,
66                                       struct device_attribute *attr, char *buf)
67 {
68         return sprintf(buf, "%d\n", dev2pcm(dev)->impulse_period);
69 }
70
71 /*
72         "write" request on "impulse_period" special file.
73 */
74 static ssize_t pcm_set_impulse_period(struct device *dev,
75                                       struct device_attribute *attr,
76                                       const char *buf, size_t count)
77 {
78         dev2pcm(dev)->impulse_period = simple_strtoul(buf, NULL, 10);
79         return count;
80 }
81
82 static DEVICE_ATTR(impulse_volume, S_IWUGO | S_IRUGO, pcm_get_impulse_volume,
83                    pcm_set_impulse_volume);
84 static DEVICE_ATTR(impulse_period, S_IWUGO | S_IRUGO, pcm_get_impulse_period,
85                    pcm_set_impulse_period);
86
87 #endif
88
89 int line6_pcm_start(struct snd_line6_pcm *line6pcm, int channels)
90 {
91         unsigned long flags_old =
92             __sync_fetch_and_or(&line6pcm->flags, channels);
93         unsigned long flags_new = flags_old | channels;
94         int err = 0;
95
96 #if LINE6_BACKUP_MONITOR_SIGNAL
97         if (!(line6pcm->line6->properties->capabilities & LINE6_BIT_HWMON)) {
98                 line6pcm->prev_fbuf =
99                     kmalloc(LINE6_ISO_PACKETS * line6pcm->max_packet_size,
100                             GFP_KERNEL);
101
102                 if (!line6pcm->prev_fbuf) {
103                         dev_err(line6pcm->line6->ifcdev,
104                                 "cannot malloc monitor buffer\n");
105                         return -ENOMEM;
106                 }
107         }
108 #else
109         line6pcm->prev_fbuf = NULL;
110 #endif
111
112         if (((flags_old & MASK_CAPTURE) == 0) &&
113             ((flags_new & MASK_CAPTURE) != 0)) {
114                 /*
115                    Waiting for completion of active URBs in the stop handler is
116                    a bug, we therefore report an error if capturing is restarted
117                    too soon.
118                  */
119                 if (line6pcm->active_urb_in | line6pcm->unlink_urb_in)
120                         return -EBUSY;
121
122                 line6pcm->buffer_in =
123                     kmalloc(LINE6_ISO_BUFFERS * LINE6_ISO_PACKETS *
124                             line6pcm->max_packet_size, GFP_KERNEL);
125
126                 if (!line6pcm->buffer_in) {
127                         dev_err(line6pcm->line6->ifcdev,
128                                 "cannot malloc capture buffer\n");
129                         return -ENOMEM;
130                 }
131
132                 line6pcm->count_in = 0;
133                 line6pcm->prev_fsize = 0;
134                 err = line6_submit_audio_in_all_urbs(line6pcm);
135
136                 if (err < 0) {
137                         __sync_fetch_and_and(&line6pcm->flags, ~channels);
138                         return err;
139                 }
140         }
141
142         if (((flags_old & MASK_PLAYBACK) == 0) &&
143             ((flags_new & MASK_PLAYBACK) != 0)) {
144                 /*
145                    See comment above regarding PCM restart.
146                  */
147                 if (line6pcm->active_urb_out | line6pcm->unlink_urb_out)
148                         return -EBUSY;
149
150                 line6pcm->buffer_out =
151                     kmalloc(LINE6_ISO_BUFFERS * LINE6_ISO_PACKETS *
152                             line6pcm->max_packet_size, GFP_KERNEL);
153
154                 if (!line6pcm->buffer_out) {
155                         dev_err(line6pcm->line6->ifcdev,
156                                 "cannot malloc playback buffer\n");
157                         return -ENOMEM;
158                 }
159
160                 line6pcm->count_out = 0;
161                 err = line6_submit_audio_out_all_urbs(line6pcm);
162
163                 if (err < 0) {
164                         __sync_fetch_and_and(&line6pcm->flags, ~channels);
165                         return err;
166                 }
167         }
168
169         return 0;
170 }
171
172 int line6_pcm_stop(struct snd_line6_pcm *line6pcm, int channels)
173 {
174         unsigned long flags_old =
175             __sync_fetch_and_and(&line6pcm->flags, ~channels);
176         unsigned long flags_new = flags_old & ~channels;
177
178         if (((flags_old & MASK_CAPTURE) != 0) &&
179             ((flags_new & MASK_CAPTURE) == 0)) {
180                 line6_unlink_audio_in_urbs(line6pcm);
181                 kfree(line6pcm->buffer_in);
182                 line6pcm->buffer_in = NULL;
183         }
184
185         if (((flags_old & MASK_PLAYBACK) != 0) &&
186             ((flags_new & MASK_PLAYBACK) == 0)) {
187                 line6_unlink_audio_out_urbs(line6pcm);
188                 kfree(line6pcm->buffer_out);
189                 line6pcm->buffer_out = NULL;
190         }
191 #if LINE6_BACKUP_MONITOR_SIGNAL
192         if (line6pcm->prev_fbuf != NULL)
193                 kfree(line6pcm->prev_fbuf);
194 #endif
195
196         return 0;
197 }
198
199 /* trigger callback */
200 int snd_line6_trigger(struct snd_pcm_substream *substream, int cmd)
201 {
202         struct snd_line6_pcm *line6pcm = snd_pcm_substream_chip(substream);
203         struct snd_pcm_substream *s;
204         int err;
205         unsigned long flags;
206
207         spin_lock_irqsave(&line6pcm->lock_trigger, flags);
208         clear_bit(BIT_PREPARED, &line6pcm->flags);
209
210         snd_pcm_group_for_each_entry(s, substream) {
211                 switch (s->stream) {
212                 case SNDRV_PCM_STREAM_PLAYBACK:
213                         err = snd_line6_playback_trigger(line6pcm, cmd);
214
215                         if (err < 0) {
216                                 spin_unlock_irqrestore(&line6pcm->lock_trigger,
217                                                        flags);
218                                 return err;
219                         }
220
221                         break;
222
223                 case SNDRV_PCM_STREAM_CAPTURE:
224                         err = snd_line6_capture_trigger(line6pcm, cmd);
225
226                         if (err < 0) {
227                                 spin_unlock_irqrestore(&line6pcm->lock_trigger,
228                                                        flags);
229                                 return err;
230                         }
231
232                         break;
233
234                 default:
235                         dev_err(line6pcm->line6->ifcdev,
236                                 "Unknown stream direction %d\n", s->stream);
237                 }
238         }
239
240         spin_unlock_irqrestore(&line6pcm->lock_trigger, flags);
241         return 0;
242 }
243
244 /* control info callback */
245 static int snd_line6_control_playback_info(struct snd_kcontrol *kcontrol,
246                                            struct snd_ctl_elem_info *uinfo)
247 {
248         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
249         uinfo->count = 2;
250         uinfo->value.integer.min = 0;
251         uinfo->value.integer.max = 256;
252         return 0;
253 }
254
255 /* control get callback */
256 static int snd_line6_control_playback_get(struct snd_kcontrol *kcontrol,
257                                           struct snd_ctl_elem_value *ucontrol)
258 {
259         int i;
260         struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol);
261
262         for (i = 2; i--;)
263                 ucontrol->value.integer.value[i] = line6pcm->volume_playback[i];
264
265         return 0;
266 }
267
268 /* control put callback */
269 static int snd_line6_control_playback_put(struct snd_kcontrol *kcontrol,
270                                           struct snd_ctl_elem_value *ucontrol)
271 {
272         int i, changed = 0;
273         struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol);
274
275         for (i = 2; i--;)
276                 if (line6pcm->volume_playback[i] !=
277                     ucontrol->value.integer.value[i]) {
278                         line6pcm->volume_playback[i] =
279                             ucontrol->value.integer.value[i];
280                         changed = 1;
281                 }
282
283         return changed;
284 }
285
286 /* control definition */
287 static struct snd_kcontrol_new line6_control_playback = {
288         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
289         .name = "PCM Playback Volume",
290         .index = 0,
291         .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
292         .info = snd_line6_control_playback_info,
293         .get = snd_line6_control_playback_get,
294         .put = snd_line6_control_playback_put
295 };
296
297 /*
298         Cleanup the PCM device.
299 */
300 static void line6_cleanup_pcm(struct snd_pcm *pcm)
301 {
302         int i;
303         struct snd_line6_pcm *line6pcm = snd_pcm_chip(pcm);
304
305 #ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE
306         device_remove_file(line6pcm->line6->ifcdev, &dev_attr_impulse_volume);
307         device_remove_file(line6pcm->line6->ifcdev, &dev_attr_impulse_period);
308 #endif
309
310         for (i = LINE6_ISO_BUFFERS; i--;) {
311                 if (line6pcm->urb_audio_out[i]) {
312                         usb_kill_urb(line6pcm->urb_audio_out[i]);
313                         usb_free_urb(line6pcm->urb_audio_out[i]);
314                 }
315                 if (line6pcm->urb_audio_in[i]) {
316                         usb_kill_urb(line6pcm->urb_audio_in[i]);
317                         usb_free_urb(line6pcm->urb_audio_in[i]);
318                 }
319         }
320 }
321
322 /* create a PCM device */
323 static int snd_line6_new_pcm(struct snd_line6_pcm *line6pcm)
324 {
325         struct snd_pcm *pcm;
326         int err;
327
328         err = snd_pcm_new(line6pcm->line6->card,
329                           (char *)line6pcm->line6->properties->name,
330                           0, 1, 1, &pcm);
331         if (err < 0)
332                 return err;
333
334         pcm->private_data = line6pcm;
335         pcm->private_free = line6_cleanup_pcm;
336         line6pcm->pcm = pcm;
337         strcpy(pcm->name, line6pcm->line6->properties->name);
338
339         /* set operators */
340         snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
341                         &snd_line6_playback_ops);
342         snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_line6_capture_ops);
343
344         /* pre-allocation of buffers */
345         snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_CONTINUOUS,
346                                               snd_dma_continuous_data
347                                               (GFP_KERNEL), 64 * 1024,
348                                               128 * 1024);
349
350         return 0;
351 }
352
353 /* PCM device destructor */
354 static int snd_line6_pcm_free(struct snd_device *device)
355 {
356         return 0;
357 }
358
359 /*
360         Stop substream if still running.
361 */
362 static void pcm_disconnect_substream(struct snd_pcm_substream *substream)
363 {
364         if (substream->runtime && snd_pcm_running(substream))
365                 snd_pcm_stop(substream, SNDRV_PCM_STATE_DISCONNECTED);
366 }
367
368 /*
369         Stop PCM stream.
370 */
371 void line6_pcm_disconnect(struct snd_line6_pcm *line6pcm)
372 {
373         pcm_disconnect_substream(get_substream
374                                  (line6pcm, SNDRV_PCM_STREAM_CAPTURE));
375         pcm_disconnect_substream(get_substream
376                                  (line6pcm, SNDRV_PCM_STREAM_PLAYBACK));
377         line6_unlink_wait_clear_audio_out_urbs(line6pcm);
378         line6_unlink_wait_clear_audio_in_urbs(line6pcm);
379 }
380
381 /*
382         Create and register the PCM device and mixer entries.
383         Create URBs for playback and capture.
384 */
385 int line6_init_pcm(struct usb_line6 *line6,
386                    struct line6_pcm_properties *properties)
387 {
388         static struct snd_device_ops pcm_ops = {
389                 .dev_free = snd_line6_pcm_free,
390         };
391
392         int err;
393         int ep_read = 0, ep_write = 0;
394         struct snd_line6_pcm *line6pcm;
395
396         if (!(line6->properties->capabilities & LINE6_BIT_PCM))
397                 return 0;       /* skip PCM initialization and report success */
398
399         /* initialize PCM subsystem based on product id: */
400         switch (line6->product) {
401         case LINE6_DEVID_BASSPODXT:
402         case LINE6_DEVID_BASSPODXTLIVE:
403         case LINE6_DEVID_BASSPODXTPRO:
404         case LINE6_DEVID_PODXT:
405         case LINE6_DEVID_PODXTLIVE:
406         case LINE6_DEVID_PODXTPRO:
407                 ep_read = 0x82;
408                 ep_write = 0x01;
409                 break;
410
411         case LINE6_DEVID_PODX3:
412         case LINE6_DEVID_PODX3LIVE:
413                 ep_read = 0x86;
414                 ep_write = 0x02;
415                 break;
416
417         case LINE6_DEVID_POCKETPOD:
418                 ep_read = 0x82;
419                 ep_write = 0x02;
420                 break;
421
422         case LINE6_DEVID_GUITARPORT:
423         case LINE6_DEVID_PODSTUDIO_GX:
424         case LINE6_DEVID_PODSTUDIO_UX1:
425         case LINE6_DEVID_PODSTUDIO_UX2:
426         case LINE6_DEVID_TONEPORT_GX:
427         case LINE6_DEVID_TONEPORT_UX1:
428         case LINE6_DEVID_TONEPORT_UX2:
429                 ep_read = 0x82;
430                 ep_write = 0x01;
431                 break;
432
433                 /* this is for interface_number == 1:
434                    case LINE6_DEVID_TONEPORT_UX2:
435                    case LINE6_DEVID_PODSTUDIO_UX2:
436                    ep_read  = 0x87;
437                    ep_write = 0x00;
438                    break;
439                  */
440
441         default:
442                 MISSING_CASE;
443         }
444
445         line6pcm = kzalloc(sizeof(struct snd_line6_pcm), GFP_KERNEL);
446
447         if (line6pcm == NULL)
448                 return -ENOMEM;
449
450         line6pcm->volume_playback[0] = line6pcm->volume_playback[1] = 255;
451         line6pcm->volume_monitor = 255;
452         line6pcm->line6 = line6;
453         line6pcm->ep_audio_read = ep_read;
454         line6pcm->ep_audio_write = ep_write;
455         line6pcm->max_packet_size = usb_maxpacket(line6->usbdev,
456                                                   usb_rcvintpipe(line6->usbdev,
457                                                                  ep_read), 0);
458         line6pcm->properties = properties;
459         line6->line6pcm = line6pcm;
460
461         /* PCM device: */
462         err = snd_device_new(line6->card, SNDRV_DEV_PCM, line6, &pcm_ops);
463         if (err < 0)
464                 return err;
465
466         snd_card_set_dev(line6->card, line6->ifcdev);
467
468         err = snd_line6_new_pcm(line6pcm);
469         if (err < 0)
470                 return err;
471
472         spin_lock_init(&line6pcm->lock_audio_out);
473         spin_lock_init(&line6pcm->lock_audio_in);
474         spin_lock_init(&line6pcm->lock_trigger);
475
476         err = line6_create_audio_out_urbs(line6pcm);
477         if (err < 0)
478                 return err;
479
480         err = line6_create_audio_in_urbs(line6pcm);
481         if (err < 0)
482                 return err;
483
484         /* mixer: */
485         err =
486             snd_ctl_add(line6->card,
487                         snd_ctl_new1(&line6_control_playback, line6pcm));
488         if (err < 0)
489                 return err;
490
491 #ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE
492         /* impulse response test: */
493         err = device_create_file(line6->ifcdev, &dev_attr_impulse_volume);
494         if (err < 0)
495                 return err;
496
497         err = device_create_file(line6->ifcdev, &dev_attr_impulse_period);
498         if (err < 0)
499                 return err;
500
501         line6pcm->impulse_period = LINE6_IMPULSE_DEFAULT_PERIOD;
502 #endif
503
504         return 0;
505 }
506
507 /* prepare pcm callback */
508 int snd_line6_prepare(struct snd_pcm_substream *substream)
509 {
510         struct snd_line6_pcm *line6pcm = snd_pcm_substream_chip(substream);
511
512         if (!test_and_set_bit(BIT_PREPARED, &line6pcm->flags)) {
513                 line6pcm->count_out = 0;
514                 line6pcm->pos_out = 0;
515                 line6pcm->pos_out_done = 0;
516                 line6pcm->bytes_out = 0;
517                 line6pcm->count_in = 0;
518                 line6pcm->pos_in_done = 0;
519                 line6pcm->bytes_in = 0;
520         }
521
522         return 0;
523 }