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