driver.c (21806B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Line 6 Linux USB driver 4 * 5 * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at) 6 */ 7 8#include <linux/kernel.h> 9#include <linux/module.h> 10#include <linux/export.h> 11#include <linux/slab.h> 12#include <linux/usb.h> 13 14#include <sound/core.h> 15#include <sound/initval.h> 16#include <sound/hwdep.h> 17 18#include "capture.h" 19#include "driver.h" 20#include "midi.h" 21#include "playback.h" 22 23#define DRIVER_AUTHOR "Markus Grabner <grabner@icg.tugraz.at>" 24#define DRIVER_DESC "Line 6 USB Driver" 25 26/* 27 This is Line 6's MIDI manufacturer ID. 28*/ 29const unsigned char line6_midi_id[3] = { 30 0x00, 0x01, 0x0c 31}; 32EXPORT_SYMBOL_GPL(line6_midi_id); 33 34/* 35 Code to request version of POD, Variax interface 36 (and maybe other devices). 37*/ 38static const char line6_request_version[] = { 39 0xf0, 0x7e, 0x7f, 0x06, 0x01, 0xf7 40}; 41 42/* 43 Class for asynchronous messages. 44*/ 45struct message { 46 struct usb_line6 *line6; 47 const char *buffer; 48 int size; 49 int done; 50}; 51 52/* 53 Forward declarations. 54*/ 55static void line6_data_received(struct urb *urb); 56static int line6_send_raw_message_async_part(struct message *msg, 57 struct urb *urb); 58 59/* 60 Start to listen on endpoint. 61*/ 62static int line6_start_listen(struct usb_line6 *line6) 63{ 64 int err; 65 66 if (line6->properties->capabilities & LINE6_CAP_CONTROL_MIDI) { 67 usb_fill_int_urb(line6->urb_listen, line6->usbdev, 68 usb_rcvintpipe(line6->usbdev, line6->properties->ep_ctrl_r), 69 line6->buffer_listen, LINE6_BUFSIZE_LISTEN, 70 line6_data_received, line6, line6->interval); 71 } else { 72 usb_fill_bulk_urb(line6->urb_listen, line6->usbdev, 73 usb_rcvbulkpipe(line6->usbdev, line6->properties->ep_ctrl_r), 74 line6->buffer_listen, LINE6_BUFSIZE_LISTEN, 75 line6_data_received, line6); 76 } 77 78 /* sanity checks of EP before actually submitting */ 79 if (usb_urb_ep_type_check(line6->urb_listen)) { 80 dev_err(line6->ifcdev, "invalid control EP\n"); 81 return -EINVAL; 82 } 83 84 line6->urb_listen->actual_length = 0; 85 err = usb_submit_urb(line6->urb_listen, GFP_ATOMIC); 86 return err; 87} 88 89/* 90 Stop listening on endpoint. 91*/ 92static void line6_stop_listen(struct usb_line6 *line6) 93{ 94 usb_kill_urb(line6->urb_listen); 95} 96 97/* 98 Send raw message in pieces of wMaxPacketSize bytes. 99*/ 100int line6_send_raw_message(struct usb_line6 *line6, const char *buffer, 101 int size) 102{ 103 int i, done = 0; 104 const struct line6_properties *properties = line6->properties; 105 106 for (i = 0; i < size; i += line6->max_packet_size) { 107 int partial; 108 const char *frag_buf = buffer + i; 109 int frag_size = min(line6->max_packet_size, size - i); 110 int retval; 111 112 if (properties->capabilities & LINE6_CAP_CONTROL_MIDI) { 113 retval = usb_interrupt_msg(line6->usbdev, 114 usb_sndintpipe(line6->usbdev, properties->ep_ctrl_w), 115 (char *)frag_buf, frag_size, 116 &partial, LINE6_TIMEOUT); 117 } else { 118 retval = usb_bulk_msg(line6->usbdev, 119 usb_sndbulkpipe(line6->usbdev, properties->ep_ctrl_w), 120 (char *)frag_buf, frag_size, 121 &partial, LINE6_TIMEOUT); 122 } 123 124 if (retval) { 125 dev_err(line6->ifcdev, 126 "usb_bulk_msg failed (%d)\n", retval); 127 break; 128 } 129 130 done += frag_size; 131 } 132 133 return done; 134} 135EXPORT_SYMBOL_GPL(line6_send_raw_message); 136 137/* 138 Notification of completion of asynchronous request transmission. 139*/ 140static void line6_async_request_sent(struct urb *urb) 141{ 142 struct message *msg = (struct message *)urb->context; 143 144 if (msg->done >= msg->size) { 145 usb_free_urb(urb); 146 kfree(msg); 147 } else 148 line6_send_raw_message_async_part(msg, urb); 149} 150 151/* 152 Asynchronously send part of a raw message. 153*/ 154static int line6_send_raw_message_async_part(struct message *msg, 155 struct urb *urb) 156{ 157 int retval; 158 struct usb_line6 *line6 = msg->line6; 159 int done = msg->done; 160 int bytes = min(msg->size - done, line6->max_packet_size); 161 162 if (line6->properties->capabilities & LINE6_CAP_CONTROL_MIDI) { 163 usb_fill_int_urb(urb, line6->usbdev, 164 usb_sndintpipe(line6->usbdev, line6->properties->ep_ctrl_w), 165 (char *)msg->buffer + done, bytes, 166 line6_async_request_sent, msg, line6->interval); 167 } else { 168 usb_fill_bulk_urb(urb, line6->usbdev, 169 usb_sndbulkpipe(line6->usbdev, line6->properties->ep_ctrl_w), 170 (char *)msg->buffer + done, bytes, 171 line6_async_request_sent, msg); 172 } 173 174 msg->done += bytes; 175 176 /* sanity checks of EP before actually submitting */ 177 retval = usb_urb_ep_type_check(urb); 178 if (retval < 0) 179 goto error; 180 181 retval = usb_submit_urb(urb, GFP_ATOMIC); 182 if (retval < 0) 183 goto error; 184 185 return 0; 186 187 error: 188 dev_err(line6->ifcdev, "%s: usb_submit_urb failed (%d)\n", 189 __func__, retval); 190 usb_free_urb(urb); 191 kfree(msg); 192 return retval; 193} 194 195/* 196 Asynchronously send raw message. 197*/ 198int line6_send_raw_message_async(struct usb_line6 *line6, const char *buffer, 199 int size) 200{ 201 struct message *msg; 202 struct urb *urb; 203 204 /* create message: */ 205 msg = kmalloc(sizeof(struct message), GFP_ATOMIC); 206 if (msg == NULL) 207 return -ENOMEM; 208 209 /* create URB: */ 210 urb = usb_alloc_urb(0, GFP_ATOMIC); 211 212 if (urb == NULL) { 213 kfree(msg); 214 return -ENOMEM; 215 } 216 217 /* set message data: */ 218 msg->line6 = line6; 219 msg->buffer = buffer; 220 msg->size = size; 221 msg->done = 0; 222 223 /* start sending: */ 224 return line6_send_raw_message_async_part(msg, urb); 225} 226EXPORT_SYMBOL_GPL(line6_send_raw_message_async); 227 228/* 229 Send asynchronous device version request. 230*/ 231int line6_version_request_async(struct usb_line6 *line6) 232{ 233 char *buffer; 234 int retval; 235 236 buffer = kmemdup(line6_request_version, 237 sizeof(line6_request_version), GFP_ATOMIC); 238 if (buffer == NULL) 239 return -ENOMEM; 240 241 retval = line6_send_raw_message_async(line6, buffer, 242 sizeof(line6_request_version)); 243 kfree(buffer); 244 return retval; 245} 246EXPORT_SYMBOL_GPL(line6_version_request_async); 247 248/* 249 Send sysex message in pieces of wMaxPacketSize bytes. 250*/ 251int line6_send_sysex_message(struct usb_line6 *line6, const char *buffer, 252 int size) 253{ 254 return line6_send_raw_message(line6, buffer, 255 size + SYSEX_EXTRA_SIZE) - 256 SYSEX_EXTRA_SIZE; 257} 258EXPORT_SYMBOL_GPL(line6_send_sysex_message); 259 260/* 261 Allocate buffer for sysex message and prepare header. 262 @param code sysex message code 263 @param size number of bytes between code and sysex end 264*/ 265char *line6_alloc_sysex_buffer(struct usb_line6 *line6, int code1, int code2, 266 int size) 267{ 268 char *buffer = kmalloc(size + SYSEX_EXTRA_SIZE, GFP_ATOMIC); 269 270 if (!buffer) 271 return NULL; 272 273 buffer[0] = LINE6_SYSEX_BEGIN; 274 memcpy(buffer + 1, line6_midi_id, sizeof(line6_midi_id)); 275 buffer[sizeof(line6_midi_id) + 1] = code1; 276 buffer[sizeof(line6_midi_id) + 2] = code2; 277 buffer[sizeof(line6_midi_id) + 3 + size] = LINE6_SYSEX_END; 278 return buffer; 279} 280EXPORT_SYMBOL_GPL(line6_alloc_sysex_buffer); 281 282/* 283 Notification of data received from the Line 6 device. 284*/ 285static void line6_data_received(struct urb *urb) 286{ 287 struct usb_line6 *line6 = (struct usb_line6 *)urb->context; 288 struct midi_buffer *mb = &line6->line6midi->midibuf_in; 289 int done; 290 291 if (urb->status == -ESHUTDOWN) 292 return; 293 294 if (line6->properties->capabilities & LINE6_CAP_CONTROL_MIDI) { 295 done = 296 line6_midibuf_write(mb, urb->transfer_buffer, urb->actual_length); 297 298 if (done < urb->actual_length) { 299 line6_midibuf_ignore(mb, done); 300 dev_dbg(line6->ifcdev, "%d %d buffer overflow - message skipped\n", 301 done, urb->actual_length); 302 } 303 304 for (;;) { 305 done = 306 line6_midibuf_read(mb, line6->buffer_message, 307 LINE6_MIDI_MESSAGE_MAXLEN); 308 309 if (done <= 0) 310 break; 311 312 line6->message_length = done; 313 line6_midi_receive(line6, line6->buffer_message, done); 314 315 if (line6->process_message) 316 line6->process_message(line6); 317 } 318 } else { 319 line6->buffer_message = urb->transfer_buffer; 320 line6->message_length = urb->actual_length; 321 if (line6->process_message) 322 line6->process_message(line6); 323 line6->buffer_message = NULL; 324 } 325 326 line6_start_listen(line6); 327} 328 329#define LINE6_READ_WRITE_STATUS_DELAY 2 /* milliseconds */ 330#define LINE6_READ_WRITE_MAX_RETRIES 50 331 332/* 333 Read data from device. 334*/ 335int line6_read_data(struct usb_line6 *line6, unsigned address, void *data, 336 unsigned datalen) 337{ 338 struct usb_device *usbdev = line6->usbdev; 339 int ret; 340 u8 len; 341 unsigned count; 342 343 if (address > 0xffff || datalen > 0xff) 344 return -EINVAL; 345 346 /* query the serial number: */ 347 ret = usb_control_msg_send(usbdev, 0, 0x67, 348 USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, 349 (datalen << 8) | 0x21, address, NULL, 0, 350 LINE6_TIMEOUT, GFP_KERNEL); 351 if (ret) { 352 dev_err(line6->ifcdev, "read request failed (error %d)\n", ret); 353 goto exit; 354 } 355 356 /* Wait for data length. We'll get 0xff until length arrives. */ 357 for (count = 0; count < LINE6_READ_WRITE_MAX_RETRIES; count++) { 358 mdelay(LINE6_READ_WRITE_STATUS_DELAY); 359 360 ret = usb_control_msg_recv(usbdev, 0, 0x67, 361 USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, 362 0x0012, 0x0000, &len, 1, 363 LINE6_TIMEOUT, GFP_KERNEL); 364 if (ret) { 365 dev_err(line6->ifcdev, 366 "receive length failed (error %d)\n", ret); 367 goto exit; 368 } 369 370 if (len != 0xff) 371 break; 372 } 373 374 ret = -EIO; 375 if (len == 0xff) { 376 dev_err(line6->ifcdev, "read failed after %d retries\n", 377 count); 378 goto exit; 379 } else if (len != datalen) { 380 /* should be equal or something went wrong */ 381 dev_err(line6->ifcdev, 382 "length mismatch (expected %d, got %d)\n", 383 (int)datalen, len); 384 goto exit; 385 } 386 387 /* receive the result: */ 388 ret = usb_control_msg_recv(usbdev, 0, 0x67, 389 USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, 390 0x0013, 0x0000, data, datalen, LINE6_TIMEOUT, 391 GFP_KERNEL); 392 if (ret) 393 dev_err(line6->ifcdev, "read failed (error %d)\n", ret); 394 395exit: 396 return ret; 397} 398EXPORT_SYMBOL_GPL(line6_read_data); 399 400/* 401 Write data to device. 402*/ 403int line6_write_data(struct usb_line6 *line6, unsigned address, void *data, 404 unsigned datalen) 405{ 406 struct usb_device *usbdev = line6->usbdev; 407 int ret; 408 unsigned char *status; 409 int count; 410 411 if (address > 0xffff || datalen > 0xffff) 412 return -EINVAL; 413 414 status = kmalloc(1, GFP_KERNEL); 415 if (!status) 416 return -ENOMEM; 417 418 ret = usb_control_msg_send(usbdev, 0, 0x67, 419 USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, 420 0x0022, address, data, datalen, LINE6_TIMEOUT, 421 GFP_KERNEL); 422 if (ret) { 423 dev_err(line6->ifcdev, 424 "write request failed (error %d)\n", ret); 425 goto exit; 426 } 427 428 for (count = 0; count < LINE6_READ_WRITE_MAX_RETRIES; count++) { 429 mdelay(LINE6_READ_WRITE_STATUS_DELAY); 430 431 ret = usb_control_msg_recv(usbdev, 0, 0x67, 432 USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, 433 0x0012, 0x0000, status, 1, LINE6_TIMEOUT, 434 GFP_KERNEL); 435 if (ret) { 436 dev_err(line6->ifcdev, 437 "receiving status failed (error %d)\n", ret); 438 goto exit; 439 } 440 441 if (*status != 0xff) 442 break; 443 } 444 445 if (*status == 0xff) { 446 dev_err(line6->ifcdev, "write failed after %d retries\n", 447 count); 448 ret = -EIO; 449 } else if (*status != 0) { 450 dev_err(line6->ifcdev, "write failed (error %d)\n", ret); 451 ret = -EIO; 452 } 453exit: 454 kfree(status); 455 return ret; 456} 457EXPORT_SYMBOL_GPL(line6_write_data); 458 459/* 460 Read Line 6 device serial number. 461 (POD, TonePort, GuitarPort) 462*/ 463int line6_read_serial_number(struct usb_line6 *line6, u32 *serial_number) 464{ 465 return line6_read_data(line6, 0x80d0, serial_number, 466 sizeof(*serial_number)); 467} 468EXPORT_SYMBOL_GPL(line6_read_serial_number); 469 470/* 471 Card destructor. 472*/ 473static void line6_destruct(struct snd_card *card) 474{ 475 struct usb_line6 *line6 = card->private_data; 476 struct usb_device *usbdev = line6->usbdev; 477 478 /* Free buffer memory first. We cannot depend on the existence of private 479 * data from the (podhd) module, it may be gone already during this call 480 */ 481 kfree(line6->buffer_message); 482 483 kfree(line6->buffer_listen); 484 485 /* then free URBs: */ 486 usb_free_urb(line6->urb_listen); 487 line6->urb_listen = NULL; 488 489 /* decrement reference counters: */ 490 usb_put_dev(usbdev); 491} 492 493static void line6_get_usb_properties(struct usb_line6 *line6) 494{ 495 struct usb_device *usbdev = line6->usbdev; 496 const struct line6_properties *properties = line6->properties; 497 int pipe; 498 struct usb_host_endpoint *ep = NULL; 499 500 if (properties->capabilities & LINE6_CAP_CONTROL) { 501 if (properties->capabilities & LINE6_CAP_CONTROL_MIDI) { 502 pipe = usb_rcvintpipe(line6->usbdev, 503 line6->properties->ep_ctrl_r); 504 } else { 505 pipe = usb_rcvbulkpipe(line6->usbdev, 506 line6->properties->ep_ctrl_r); 507 } 508 ep = usbdev->ep_in[usb_pipeendpoint(pipe)]; 509 } 510 511 /* Control data transfer properties */ 512 if (ep) { 513 line6->interval = ep->desc.bInterval; 514 line6->max_packet_size = le16_to_cpu(ep->desc.wMaxPacketSize); 515 } else { 516 if (properties->capabilities & LINE6_CAP_CONTROL) { 517 dev_err(line6->ifcdev, 518 "endpoint not available, using fallback values"); 519 } 520 line6->interval = LINE6_FALLBACK_INTERVAL; 521 line6->max_packet_size = LINE6_FALLBACK_MAXPACKETSIZE; 522 } 523 524 /* Isochronous transfer properties */ 525 if (usbdev->speed == USB_SPEED_LOW) { 526 line6->intervals_per_second = USB_LOW_INTERVALS_PER_SECOND; 527 line6->iso_buffers = USB_LOW_ISO_BUFFERS; 528 } else { 529 line6->intervals_per_second = USB_HIGH_INTERVALS_PER_SECOND; 530 line6->iso_buffers = USB_HIGH_ISO_BUFFERS; 531 } 532} 533 534/* Enable buffering of incoming messages, flush the buffer */ 535static int line6_hwdep_open(struct snd_hwdep *hw, struct file *file) 536{ 537 struct usb_line6 *line6 = hw->private_data; 538 539 /* NOTE: hwdep layer provides atomicity here */ 540 541 line6->messages.active = 1; 542 line6->messages.nonblock = file->f_flags & O_NONBLOCK ? 1 : 0; 543 544 return 0; 545} 546 547/* Stop buffering */ 548static int line6_hwdep_release(struct snd_hwdep *hw, struct file *file) 549{ 550 struct usb_line6 *line6 = hw->private_data; 551 552 line6->messages.active = 0; 553 554 return 0; 555} 556 557/* Read from circular buffer, return to user */ 558static long 559line6_hwdep_read(struct snd_hwdep *hwdep, char __user *buf, long count, 560 loff_t *offset) 561{ 562 struct usb_line6 *line6 = hwdep->private_data; 563 long rv = 0; 564 unsigned int out_count; 565 566 if (mutex_lock_interruptible(&line6->messages.read_lock)) 567 return -ERESTARTSYS; 568 569 while (kfifo_len(&line6->messages.fifo) == 0) { 570 mutex_unlock(&line6->messages.read_lock); 571 572 if (line6->messages.nonblock) 573 return -EAGAIN; 574 575 rv = wait_event_interruptible( 576 line6->messages.wait_queue, 577 kfifo_len(&line6->messages.fifo) != 0); 578 if (rv < 0) 579 return rv; 580 581 if (mutex_lock_interruptible(&line6->messages.read_lock)) 582 return -ERESTARTSYS; 583 } 584 585 if (kfifo_peek_len(&line6->messages.fifo) > count) { 586 /* Buffer too small; allow re-read of the current item... */ 587 rv = -EINVAL; 588 } else { 589 rv = kfifo_to_user(&line6->messages.fifo, buf, count, &out_count); 590 if (rv == 0) 591 rv = out_count; 592 } 593 594 mutex_unlock(&line6->messages.read_lock); 595 return rv; 596} 597 598/* Write directly (no buffering) to device by user*/ 599static long 600line6_hwdep_write(struct snd_hwdep *hwdep, const char __user *data, long count, 601 loff_t *offset) 602{ 603 struct usb_line6 *line6 = hwdep->private_data; 604 int rv; 605 char *data_copy; 606 607 if (count > line6->max_packet_size * LINE6_RAW_MESSAGES_MAXCOUNT) { 608 /* This is an arbitrary limit - still better than nothing... */ 609 return -EINVAL; 610 } 611 612 data_copy = memdup_user(data, count); 613 if (IS_ERR(data_copy)) 614 return PTR_ERR(data_copy); 615 616 rv = line6_send_raw_message(line6, data_copy, count); 617 618 kfree(data_copy); 619 return rv; 620} 621 622static __poll_t 623line6_hwdep_poll(struct snd_hwdep *hwdep, struct file *file, poll_table *wait) 624{ 625 __poll_t rv; 626 struct usb_line6 *line6 = hwdep->private_data; 627 628 poll_wait(file, &line6->messages.wait_queue, wait); 629 630 mutex_lock(&line6->messages.read_lock); 631 rv = kfifo_len(&line6->messages.fifo) == 0 ? 0 : EPOLLIN | EPOLLRDNORM; 632 mutex_unlock(&line6->messages.read_lock); 633 634 return rv; 635} 636 637static const struct snd_hwdep_ops hwdep_ops = { 638 .open = line6_hwdep_open, 639 .release = line6_hwdep_release, 640 .read = line6_hwdep_read, 641 .write = line6_hwdep_write, 642 .poll = line6_hwdep_poll, 643}; 644 645/* Insert into circular buffer */ 646static void line6_hwdep_push_message(struct usb_line6 *line6) 647{ 648 if (!line6->messages.active) 649 return; 650 651 if (kfifo_avail(&line6->messages.fifo) >= line6->message_length) { 652 /* No race condition here, there's only one writer */ 653 kfifo_in(&line6->messages.fifo, 654 line6->buffer_message, line6->message_length); 655 } /* else TODO: signal overflow */ 656 657 wake_up_interruptible(&line6->messages.wait_queue); 658} 659 660static int line6_hwdep_init(struct usb_line6 *line6) 661{ 662 int err; 663 struct snd_hwdep *hwdep; 664 665 /* TODO: usb_driver_claim_interface(); */ 666 line6->process_message = line6_hwdep_push_message; 667 line6->messages.active = 0; 668 init_waitqueue_head(&line6->messages.wait_queue); 669 mutex_init(&line6->messages.read_lock); 670 INIT_KFIFO(line6->messages.fifo); 671 672 err = snd_hwdep_new(line6->card, "config", 0, &hwdep); 673 if (err < 0) 674 goto end; 675 strcpy(hwdep->name, "config"); 676 hwdep->iface = SNDRV_HWDEP_IFACE_LINE6; 677 hwdep->ops = hwdep_ops; 678 hwdep->private_data = line6; 679 hwdep->exclusive = true; 680 681end: 682 return err; 683} 684 685static int line6_init_cap_control(struct usb_line6 *line6) 686{ 687 int ret; 688 689 /* initialize USB buffers: */ 690 line6->buffer_listen = kmalloc(LINE6_BUFSIZE_LISTEN, GFP_KERNEL); 691 if (!line6->buffer_listen) 692 return -ENOMEM; 693 694 line6->urb_listen = usb_alloc_urb(0, GFP_KERNEL); 695 if (!line6->urb_listen) 696 return -ENOMEM; 697 698 if (line6->properties->capabilities & LINE6_CAP_CONTROL_MIDI) { 699 line6->buffer_message = kmalloc(LINE6_MIDI_MESSAGE_MAXLEN, GFP_KERNEL); 700 if (!line6->buffer_message) 701 return -ENOMEM; 702 703 ret = line6_init_midi(line6); 704 if (ret < 0) 705 return ret; 706 } else { 707 ret = line6_hwdep_init(line6); 708 if (ret < 0) 709 return ret; 710 } 711 712 ret = line6_start_listen(line6); 713 if (ret < 0) { 714 dev_err(line6->ifcdev, "cannot start listening: %d\n", ret); 715 return ret; 716 } 717 718 return 0; 719} 720 721static void line6_startup_work(struct work_struct *work) 722{ 723 struct usb_line6 *line6 = 724 container_of(work, struct usb_line6, startup_work.work); 725 726 if (line6->startup) 727 line6->startup(line6); 728} 729 730/* 731 Probe USB device. 732*/ 733int line6_probe(struct usb_interface *interface, 734 const struct usb_device_id *id, 735 const char *driver_name, 736 const struct line6_properties *properties, 737 int (*private_init)(struct usb_line6 *, const struct usb_device_id *id), 738 size_t data_size) 739{ 740 struct usb_device *usbdev = interface_to_usbdev(interface); 741 struct snd_card *card; 742 struct usb_line6 *line6; 743 int interface_number; 744 int ret; 745 746 if (WARN_ON(data_size < sizeof(*line6))) 747 return -EINVAL; 748 749 /* we don't handle multiple configurations */ 750 if (usbdev->descriptor.bNumConfigurations != 1) 751 return -ENODEV; 752 753 ret = snd_card_new(&interface->dev, 754 SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1, 755 THIS_MODULE, data_size, &card); 756 if (ret < 0) 757 return ret; 758 759 /* store basic data: */ 760 line6 = card->private_data; 761 line6->card = card; 762 line6->properties = properties; 763 line6->usbdev = usbdev; 764 line6->ifcdev = &interface->dev; 765 INIT_DELAYED_WORK(&line6->startup_work, line6_startup_work); 766 767 strcpy(card->id, properties->id); 768 strcpy(card->driver, driver_name); 769 strcpy(card->shortname, properties->name); 770 sprintf(card->longname, "Line 6 %s at USB %s", properties->name, 771 dev_name(line6->ifcdev)); 772 card->private_free = line6_destruct; 773 774 usb_set_intfdata(interface, line6); 775 776 /* increment reference counters: */ 777 usb_get_dev(usbdev); 778 779 /* initialize device info: */ 780 dev_info(&interface->dev, "Line 6 %s found\n", properties->name); 781 782 /* query interface number */ 783 interface_number = interface->cur_altsetting->desc.bInterfaceNumber; 784 785 /* TODO reserves the bus bandwidth even without actual transfer */ 786 ret = usb_set_interface(usbdev, interface_number, 787 properties->altsetting); 788 if (ret < 0) { 789 dev_err(&interface->dev, "set_interface failed\n"); 790 goto error; 791 } 792 793 line6_get_usb_properties(line6); 794 795 if (properties->capabilities & LINE6_CAP_CONTROL) { 796 ret = line6_init_cap_control(line6); 797 if (ret < 0) 798 goto error; 799 } 800 801 /* initialize device data based on device: */ 802 ret = private_init(line6, id); 803 if (ret < 0) 804 goto error; 805 806 /* creation of additional special files should go here */ 807 808 dev_info(&interface->dev, "Line 6 %s now attached\n", 809 properties->name); 810 811 return 0; 812 813 error: 814 /* we can call disconnect callback here because no close-sync is 815 * needed yet at this point 816 */ 817 line6_disconnect(interface); 818 return ret; 819} 820EXPORT_SYMBOL_GPL(line6_probe); 821 822/* 823 Line 6 device disconnected. 824*/ 825void line6_disconnect(struct usb_interface *interface) 826{ 827 struct usb_line6 *line6 = usb_get_intfdata(interface); 828 struct usb_device *usbdev = interface_to_usbdev(interface); 829 830 if (!line6) 831 return; 832 833 if (WARN_ON(usbdev != line6->usbdev)) 834 return; 835 836 cancel_delayed_work_sync(&line6->startup_work); 837 838 if (line6->urb_listen != NULL) 839 line6_stop_listen(line6); 840 841 snd_card_disconnect(line6->card); 842 if (line6->line6pcm) 843 line6_pcm_disconnect(line6->line6pcm); 844 if (line6->disconnect) 845 line6->disconnect(line6); 846 847 dev_info(&interface->dev, "Line 6 %s now disconnected\n", 848 line6->properties->name); 849 850 /* make sure the device isn't destructed twice: */ 851 usb_set_intfdata(interface, NULL); 852 853 snd_card_free_when_closed(line6->card); 854} 855EXPORT_SYMBOL_GPL(line6_disconnect); 856 857#ifdef CONFIG_PM 858 859/* 860 Suspend Line 6 device. 861*/ 862int line6_suspend(struct usb_interface *interface, pm_message_t message) 863{ 864 struct usb_line6 *line6 = usb_get_intfdata(interface); 865 struct snd_line6_pcm *line6pcm = line6->line6pcm; 866 867 snd_power_change_state(line6->card, SNDRV_CTL_POWER_D3hot); 868 869 if (line6->properties->capabilities & LINE6_CAP_CONTROL) 870 line6_stop_listen(line6); 871 872 if (line6pcm != NULL) 873 line6pcm->flags = 0; 874 875 return 0; 876} 877EXPORT_SYMBOL_GPL(line6_suspend); 878 879/* 880 Resume Line 6 device. 881*/ 882int line6_resume(struct usb_interface *interface) 883{ 884 struct usb_line6 *line6 = usb_get_intfdata(interface); 885 886 if (line6->properties->capabilities & LINE6_CAP_CONTROL) 887 line6_start_listen(line6); 888 889 snd_power_change_state(line6->card, SNDRV_CTL_POWER_D0); 890 return 0; 891} 892EXPORT_SYMBOL_GPL(line6_resume); 893 894#endif /* CONFIG_PM */ 895 896MODULE_AUTHOR(DRIVER_AUTHOR); 897MODULE_DESCRIPTION(DRIVER_DESC); 898MODULE_LICENSE("GPL"); 899