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*/
 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 * 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}
 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 * HZ, 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 * HZ, 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 * HZ,
 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 * HZ,
 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 * HZ,
 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
 900