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 impulse_volume_show(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 impulse_volume_store(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; 52 int ret; 53 54 ret = kstrtoint(buf, 10, &value); 55 if (ret < 0) 56 return ret; 57 58 line6pcm->impulse_volume = value; 59 60 if (value > 0) 61 line6_pcm_acquire(line6pcm, LINE6_BITS_PCM_IMPULSE); 62 else 63 line6_pcm_release(line6pcm, LINE6_BITS_PCM_IMPULSE); 64 65 return count; 66 } 67 static DEVICE_ATTR_RW(impulse_volume); 68 69 /* 70 "read" request on "impulse_period" special file. 71 */ 72 static ssize_t impulse_period_show(struct device *dev, 73 struct device_attribute *attr, char *buf) 74 { 75 return sprintf(buf, "%d\n", dev2pcm(dev)->impulse_period); 76 } 77 78 /* 79 "write" request on "impulse_period" special file. 80 */ 81 static ssize_t impulse_period_store(struct device *dev, 82 struct device_attribute *attr, 83 const char *buf, size_t count) 84 { 85 int value; 86 int ret; 87 88 ret = kstrtoint(buf, 10, &value); 89 if (ret < 0) 90 return ret; 91 92 dev2pcm(dev)->impulse_period = value; 93 return count; 94 } 95 static DEVICE_ATTR_RW(impulse_period); 96 97 #endif 98 99 static bool test_flags(unsigned long flags0, unsigned long flags1, 100 unsigned long mask) 101 { 102 return ((flags0 & mask) == 0) && ((flags1 & mask) != 0); 103 } 104 105 int line6_pcm_acquire(struct snd_line6_pcm *line6pcm, int channels) 106 { 107 unsigned long flags_old, flags_new, flags_final; 108 int err; 109 110 do { 111 flags_old = ACCESS_ONCE(line6pcm->flags); 112 flags_new = flags_old | channels; 113 } while (cmpxchg(&line6pcm->flags, flags_old, flags_new) != flags_old); 114 115 flags_final = flags_old; 116 117 line6pcm->prev_fbuf = NULL; 118 119 if (test_flags(flags_old, flags_new, LINE6_BITS_CAPTURE_BUFFER)) { 120 /* Invoked multiple times in a row so allocate once only */ 121 if (!line6pcm->buffer_in) { 122 line6pcm->buffer_in = 123 kmalloc(LINE6_ISO_BUFFERS * LINE6_ISO_PACKETS * 124 line6pcm->max_packet_size, GFP_KERNEL); 125 if (!line6pcm->buffer_in) { 126 err = -ENOMEM; 127 goto pcm_acquire_error; 128 } 129 130 flags_final |= channels & LINE6_BITS_CAPTURE_BUFFER; 131 } 132 } 133 134 if (test_flags(flags_old, flags_new, LINE6_BITS_CAPTURE_STREAM)) { 135 /* 136 Waiting for completion of active URBs in the stop handler is 137 a bug, we therefore report an error if capturing is restarted 138 too soon. 139 */ 140 if (line6pcm->active_urb_in | line6pcm->unlink_urb_in) { 141 dev_err(line6pcm->line6->ifcdev, "Device not yet ready\n"); 142 return -EBUSY; 143 } 144 145 line6pcm->count_in = 0; 146 line6pcm->prev_fsize = 0; 147 err = line6_submit_audio_in_all_urbs(line6pcm); 148 149 if (err < 0) 150 goto pcm_acquire_error; 151 152 flags_final |= channels & LINE6_BITS_CAPTURE_STREAM; 153 } 154 155 if (test_flags(flags_old, flags_new, LINE6_BITS_PLAYBACK_BUFFER)) { 156 /* Invoked multiple times in a row so allocate once only */ 157 if (!line6pcm->buffer_out) { 158 line6pcm->buffer_out = 159 kmalloc(LINE6_ISO_BUFFERS * LINE6_ISO_PACKETS * 160 line6pcm->max_packet_size, GFP_KERNEL); 161 if (!line6pcm->buffer_out) { 162 err = -ENOMEM; 163 goto pcm_acquire_error; 164 } 165 166 flags_final |= channels & LINE6_BITS_PLAYBACK_BUFFER; 167 } 168 } 169 170 if (test_flags(flags_old, flags_new, LINE6_BITS_PLAYBACK_STREAM)) { 171 /* 172 See comment above regarding PCM restart. 173 */ 174 if (line6pcm->active_urb_out | line6pcm->unlink_urb_out) { 175 dev_err(line6pcm->line6->ifcdev, "Device not yet ready\n"); 176 return -EBUSY; 177 } 178 179 line6pcm->count_out = 0; 180 err = line6_submit_audio_out_all_urbs(line6pcm); 181 182 if (err < 0) 183 goto pcm_acquire_error; 184 185 flags_final |= channels & LINE6_BITS_PLAYBACK_STREAM; 186 } 187 188 return 0; 189 190 pcm_acquire_error: 191 /* 192 If not all requested resources/streams could be obtained, release 193 those which were successfully obtained (if any). 194 */ 195 line6_pcm_release(line6pcm, flags_final & channels); 196 return err; 197 } 198 199 int line6_pcm_release(struct snd_line6_pcm *line6pcm, int channels) 200 { 201 unsigned long flags_old, flags_new; 202 203 do { 204 flags_old = ACCESS_ONCE(line6pcm->flags); 205 flags_new = flags_old & ~channels; 206 } while (cmpxchg(&line6pcm->flags, flags_old, flags_new) != flags_old); 207 208 if (test_flags(flags_new, flags_old, LINE6_BITS_CAPTURE_STREAM)) 209 line6_unlink_audio_in_urbs(line6pcm); 210 211 if (test_flags(flags_new, flags_old, LINE6_BITS_CAPTURE_BUFFER)) { 212 line6_wait_clear_audio_in_urbs(line6pcm); 213 line6_free_capture_buffer(line6pcm); 214 } 215 216 if (test_flags(flags_new, flags_old, LINE6_BITS_PLAYBACK_STREAM)) 217 line6_unlink_audio_out_urbs(line6pcm); 218 219 if (test_flags(flags_new, flags_old, LINE6_BITS_PLAYBACK_BUFFER)) { 220 line6_wait_clear_audio_out_urbs(line6pcm); 221 line6_free_playback_buffer(line6pcm); 222 } 223 224 return 0; 225 } 226 227 /* trigger callback */ 228 int snd_line6_trigger(struct snd_pcm_substream *substream, int cmd) 229 { 230 struct snd_line6_pcm *line6pcm = snd_pcm_substream_chip(substream); 231 struct snd_pcm_substream *s; 232 int err; 233 unsigned long flags; 234 235 spin_lock_irqsave(&line6pcm->lock_trigger, flags); 236 clear_bit(LINE6_INDEX_PREPARED, &line6pcm->flags); 237 238 snd_pcm_group_for_each_entry(s, substream) { 239 switch (s->stream) { 240 case SNDRV_PCM_STREAM_PLAYBACK: 241 err = snd_line6_playback_trigger(line6pcm, cmd); 242 243 if (err < 0) { 244 spin_unlock_irqrestore(&line6pcm->lock_trigger, 245 flags); 246 return err; 247 } 248 249 break; 250 251 case SNDRV_PCM_STREAM_CAPTURE: 252 err = snd_line6_capture_trigger(line6pcm, cmd); 253 254 if (err < 0) { 255 spin_unlock_irqrestore(&line6pcm->lock_trigger, 256 flags); 257 return err; 258 } 259 260 break; 261 262 default: 263 dev_err(line6pcm->line6->ifcdev, 264 "Unknown stream direction %d\n", s->stream); 265 } 266 } 267 268 spin_unlock_irqrestore(&line6pcm->lock_trigger, flags); 269 return 0; 270 } 271 272 /* control info callback */ 273 static int snd_line6_control_playback_info(struct snd_kcontrol *kcontrol, 274 struct snd_ctl_elem_info *uinfo) 275 { 276 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 277 uinfo->count = 2; 278 uinfo->value.integer.min = 0; 279 uinfo->value.integer.max = 256; 280 return 0; 281 } 282 283 /* control get callback */ 284 static int snd_line6_control_playback_get(struct snd_kcontrol *kcontrol, 285 struct snd_ctl_elem_value *ucontrol) 286 { 287 int i; 288 struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol); 289 290 for (i = 2; i--;) 291 ucontrol->value.integer.value[i] = line6pcm->volume_playback[i]; 292 293 return 0; 294 } 295 296 /* control put callback */ 297 static int snd_line6_control_playback_put(struct snd_kcontrol *kcontrol, 298 struct snd_ctl_elem_value *ucontrol) 299 { 300 int i, changed = 0; 301 struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol); 302 303 for (i = 2; i--;) 304 if (line6pcm->volume_playback[i] != 305 ucontrol->value.integer.value[i]) { 306 line6pcm->volume_playback[i] = 307 ucontrol->value.integer.value[i]; 308 changed = 1; 309 } 310 311 return changed; 312 } 313 314 /* control definition */ 315 static struct snd_kcontrol_new line6_control_playback = { 316 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 317 .name = "PCM Playback Volume", 318 .index = 0, 319 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, 320 .info = snd_line6_control_playback_info, 321 .get = snd_line6_control_playback_get, 322 .put = snd_line6_control_playback_put 323 }; 324 325 /* 326 Cleanup the PCM device. 327 */ 328 static void line6_cleanup_pcm(struct snd_pcm *pcm) 329 { 330 int i; 331 struct snd_line6_pcm *line6pcm = snd_pcm_chip(pcm); 332 333 #ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE 334 device_remove_file(line6pcm->line6->ifcdev, &dev_attr_impulse_volume); 335 device_remove_file(line6pcm->line6->ifcdev, &dev_attr_impulse_period); 336 #endif 337 338 for (i = LINE6_ISO_BUFFERS; i--;) { 339 if (line6pcm->urb_audio_out[i]) { 340 usb_kill_urb(line6pcm->urb_audio_out[i]); 341 usb_free_urb(line6pcm->urb_audio_out[i]); 342 } 343 if (line6pcm->urb_audio_in[i]) { 344 usb_kill_urb(line6pcm->urb_audio_in[i]); 345 usb_free_urb(line6pcm->urb_audio_in[i]); 346 } 347 } 348 } 349 350 /* create a PCM device */ 351 static int snd_line6_new_pcm(struct snd_line6_pcm *line6pcm) 352 { 353 struct snd_pcm *pcm; 354 int err; 355 356 err = snd_pcm_new(line6pcm->line6->card, 357 (char *)line6pcm->line6->properties->name, 358 0, 1, 1, &pcm); 359 if (err < 0) 360 return err; 361 362 pcm->private_data = line6pcm; 363 pcm->private_free = line6_cleanup_pcm; 364 line6pcm->pcm = pcm; 365 strcpy(pcm->name, line6pcm->line6->properties->name); 366 367 /* set operators */ 368 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, 369 &snd_line6_playback_ops); 370 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_line6_capture_ops); 371 372 /* pre-allocation of buffers */ 373 snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_CONTINUOUS, 374 snd_dma_continuous_data 375 (GFP_KERNEL), 64 * 1024, 376 128 * 1024); 377 378 return 0; 379 } 380 381 /* PCM device destructor */ 382 static int snd_line6_pcm_free(struct snd_device *device) 383 { 384 return 0; 385 } 386 387 /* 388 Stop substream if still running. 389 */ 390 static void pcm_disconnect_substream(struct snd_pcm_substream *substream) 391 { 392 if (substream->runtime && snd_pcm_running(substream)) { 393 snd_pcm_stream_lock_irq(substream); 394 snd_pcm_stop(substream, SNDRV_PCM_STATE_DISCONNECTED); 395 snd_pcm_stream_unlock_irq(substream); 396 } 397 } 398 399 /* 400 Stop PCM stream. 401 */ 402 void line6_pcm_disconnect(struct snd_line6_pcm *line6pcm) 403 { 404 pcm_disconnect_substream(get_substream 405 (line6pcm, SNDRV_PCM_STREAM_CAPTURE)); 406 pcm_disconnect_substream(get_substream 407 (line6pcm, SNDRV_PCM_STREAM_PLAYBACK)); 408 line6_unlink_wait_clear_audio_out_urbs(line6pcm); 409 line6_unlink_wait_clear_audio_in_urbs(line6pcm); 410 } 411 412 /* 413 Create and register the PCM device and mixer entries. 414 Create URBs for playback and capture. 415 */ 416 int line6_init_pcm(struct usb_line6 *line6, 417 struct line6_pcm_properties *properties) 418 { 419 static struct snd_device_ops pcm_ops = { 420 .dev_free = snd_line6_pcm_free, 421 }; 422 423 int err; 424 unsigned ep_read = line6->properties->ep_audio_r; 425 unsigned ep_write = line6->properties->ep_audio_w; 426 struct snd_line6_pcm *line6pcm; 427 428 if (!(line6->properties->capabilities & LINE6_CAP_PCM)) 429 return 0; /* skip PCM initialization and report success */ 430 431 line6pcm = kzalloc(sizeof(*line6pcm), GFP_KERNEL); 432 433 if (line6pcm == NULL) 434 return -ENOMEM; 435 436 line6pcm->volume_playback[0] = line6pcm->volume_playback[1] = 255; 437 line6pcm->volume_monitor = 255; 438 line6pcm->line6 = line6; 439 440 /* Read and write buffers are sized identically, so choose minimum */ 441 line6pcm->max_packet_size = min( 442 usb_maxpacket(line6->usbdev, 443 usb_rcvisocpipe(line6->usbdev, ep_read), 0), 444 usb_maxpacket(line6->usbdev, 445 usb_sndisocpipe(line6->usbdev, ep_write), 1)); 446 447 line6pcm->properties = properties; 448 line6->line6pcm = line6pcm; 449 450 /* PCM device: */ 451 err = snd_device_new(line6->card, SNDRV_DEV_PCM, line6, &pcm_ops); 452 if (err < 0) 453 return err; 454 455 err = snd_line6_new_pcm(line6pcm); 456 if (err < 0) 457 return err; 458 459 spin_lock_init(&line6pcm->lock_audio_out); 460 spin_lock_init(&line6pcm->lock_audio_in); 461 spin_lock_init(&line6pcm->lock_trigger); 462 463 err = line6_create_audio_out_urbs(line6pcm); 464 if (err < 0) 465 return err; 466 467 err = line6_create_audio_in_urbs(line6pcm); 468 if (err < 0) 469 return err; 470 471 /* mixer: */ 472 err = 473 snd_ctl_add(line6->card, 474 snd_ctl_new1(&line6_control_playback, line6pcm)); 475 if (err < 0) 476 return err; 477 478 #ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE 479 /* impulse response test: */ 480 err = device_create_file(line6->ifcdev, &dev_attr_impulse_volume); 481 if (err < 0) 482 return err; 483 484 err = device_create_file(line6->ifcdev, &dev_attr_impulse_period); 485 if (err < 0) 486 return err; 487 488 line6pcm->impulse_period = LINE6_IMPULSE_DEFAULT_PERIOD; 489 #endif 490 491 return 0; 492 } 493 494 /* prepare pcm callback */ 495 int snd_line6_prepare(struct snd_pcm_substream *substream) 496 { 497 struct snd_line6_pcm *line6pcm = snd_pcm_substream_chip(substream); 498 499 switch (substream->stream) { 500 case SNDRV_PCM_STREAM_PLAYBACK: 501 if ((line6pcm->flags & LINE6_BITS_PLAYBACK_STREAM) == 0) 502 line6_unlink_wait_clear_audio_out_urbs(line6pcm); 503 504 break; 505 506 case SNDRV_PCM_STREAM_CAPTURE: 507 if ((line6pcm->flags & LINE6_BITS_CAPTURE_STREAM) == 0) 508 line6_unlink_wait_clear_audio_in_urbs(line6pcm); 509 510 break; 511 512 default: 513 MISSING_CASE; 514 } 515 516 if (!test_and_set_bit(LINE6_INDEX_PREPARED, &line6pcm->flags)) { 517 line6pcm->count_out = 0; 518 line6pcm->pos_out = 0; 519 line6pcm->pos_out_done = 0; 520 line6pcm->bytes_out = 0; 521 line6pcm->count_in = 0; 522 line6pcm->pos_in_done = 0; 523 line6pcm->bytes_in = 0; 524 } 525 526 return 0; 527 } 528