linux/sound/usb/line6/driver.c
<<
>>
Prefs
   1/*
   2 * Line 6 Linux USB driver
   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/kernel.h>
  13#include <linux/module.h>
  14#include <linux/export.h>
  15#include <linux/slab.h>
  16#include <linux/usb.h>
  17
  18#include <sound/core.h>
  19#include <sound/initval.h>
  20
  21#include "capture.h"
  22#include "driver.h"
  23#include "midi.h"
  24#include "playback.h"
  25
  26#define DRIVER_AUTHOR  "Markus Grabner <grabner@icg.tugraz.at>"
  27#define DRIVER_DESC    "Line 6 USB Driver"
  28
  29/*
  30        This is Line 6's MIDI manufacturer ID.
  31*/
  32const unsigned char line6_midi_id[] = {
  33        0x00, 0x01, 0x0c
  34};
  35EXPORT_SYMBOL_GPL(line6_midi_id);
  36
  37/*
  38        Code to request version of POD, Variax interface
  39        (and maybe other devices).
  40*/
  41static const char line6_request_version[] = {
  42        0xf0, 0x7e, 0x7f, 0x06, 0x01, 0xf7
  43};
  44
  45/*
  46         Class for asynchronous messages.
  47*/
  48struct message {
  49        struct usb_line6 *line6;
  50        const char *buffer;
  51        int size;
  52        int done;
  53};
  54
  55/*
  56        Forward declarations.
  57*/
  58static void line6_data_received(struct urb *urb);
  59static int line6_send_raw_message_async_part(struct message *msg,
  60                                             struct urb *urb);
  61
  62/*
  63        Start to listen on endpoint.
  64*/
  65static int line6_start_listen(struct usb_line6 *line6)
  66{
  67        int err;
  68
  69        usb_fill_int_urb(line6->urb_listen, line6->usbdev,
  70                usb_rcvintpipe(line6->usbdev, line6->properties->ep_ctrl_r),
  71                line6->buffer_listen, LINE6_BUFSIZE_LISTEN,
  72                line6_data_received, line6, line6->interval);
  73        line6->urb_listen->actual_length = 0;
  74        err = usb_submit_urb(line6->urb_listen, GFP_ATOMIC);
  75        return err;
  76}
  77
  78/*
  79        Stop listening on endpoint.
  80*/
  81static void line6_stop_listen(struct usb_line6 *line6)
  82{
  83        usb_kill_urb(line6->urb_listen);
  84}
  85
  86/*
  87        Send raw message in pieces of wMaxPacketSize bytes.
  88*/
  89static int line6_send_raw_message(struct usb_line6 *line6, const char *buffer,
  90                                  int size)
  91{
  92        int i, done = 0;
  93
  94        for (i = 0; i < size; i += line6->max_packet_size) {
  95                int partial;
  96                const char *frag_buf = buffer + i;
  97                int frag_size = min(line6->max_packet_size, size - i);
  98                int retval;
  99
 100                retval = usb_interrupt_msg(line6->usbdev,
 101                                        usb_sndintpipe(line6->usbdev,
 102                                                line6->properties->ep_ctrl_w),
 103                                        (char *)frag_buf, frag_size,
 104                                        &partial, LINE6_TIMEOUT * HZ);
 105
 106                if (retval) {
 107                        dev_err(line6->ifcdev,
 108                                "usb_interrupt_msg failed (%d)\n", retval);
 109                        break;
 110                }
 111
 112                done += frag_size;
 113        }
 114
 115        return done;
 116}
 117
 118/*
 119        Notification of completion of asynchronous request transmission.
 120*/
 121static void line6_async_request_sent(struct urb *urb)
 122{
 123        struct message *msg = (struct message *)urb->context;
 124
 125        if (msg->done >= msg->size) {
 126                usb_free_urb(urb);
 127                kfree(msg);
 128        } else
 129                line6_send_raw_message_async_part(msg, urb);
 130}
 131
 132/*
 133        Asynchronously send part of a raw message.
 134*/
 135static int line6_send_raw_message_async_part(struct message *msg,
 136                                             struct urb *urb)
 137{
 138        int retval;
 139        struct usb_line6 *line6 = msg->line6;
 140        int done = msg->done;
 141        int bytes = min(msg->size - done, line6->max_packet_size);
 142
 143        usb_fill_int_urb(urb, line6->usbdev,
 144                usb_sndintpipe(line6->usbdev, line6->properties->ep_ctrl_w),
 145                (char *)msg->buffer + done, bytes,
 146                line6_async_request_sent, msg, line6->interval);
 147
 148        msg->done += bytes;
 149        retval = usb_submit_urb(urb, GFP_ATOMIC);
 150
 151        if (retval < 0) {
 152                dev_err(line6->ifcdev, "%s: usb_submit_urb failed (%d)\n",
 153                        __func__, retval);
 154                usb_free_urb(urb);
 155                kfree(msg);
 156                return retval;
 157        }
 158
 159        return 0;
 160}
 161
 162/*
 163        Setup and start timer.
 164*/
 165void line6_start_timer(struct timer_list *timer, unsigned long msecs,
 166                       void (*function)(unsigned long), unsigned long data)
 167{
 168        setup_timer(timer, function, data);
 169        mod_timer(timer, jiffies + msecs_to_jiffies(msecs));
 170}
 171EXPORT_SYMBOL_GPL(line6_start_timer);
 172
 173/*
 174        Asynchronously send raw message.
 175*/
 176int line6_send_raw_message_async(struct usb_line6 *line6, const char *buffer,
 177                                 int size)
 178{
 179        struct message *msg;
 180        struct urb *urb;
 181
 182        /* create message: */
 183        msg = kmalloc(sizeof(struct message), GFP_ATOMIC);
 184        if (msg == NULL)
 185                return -ENOMEM;
 186
 187        /* create URB: */
 188        urb = usb_alloc_urb(0, GFP_ATOMIC);
 189
 190        if (urb == NULL) {
 191                kfree(msg);
 192                return -ENOMEM;
 193        }
 194
 195        /* set message data: */
 196        msg->line6 = line6;
 197        msg->buffer = buffer;
 198        msg->size = size;
 199        msg->done = 0;
 200
 201        /* start sending: */
 202        return line6_send_raw_message_async_part(msg, urb);
 203}
 204EXPORT_SYMBOL_GPL(line6_send_raw_message_async);
 205
 206/*
 207        Send asynchronous device version request.
 208*/
 209int line6_version_request_async(struct usb_line6 *line6)
 210{
 211        char *buffer;
 212        int retval;
 213
 214        buffer = kmemdup(line6_request_version,
 215                        sizeof(line6_request_version), GFP_ATOMIC);
 216        if (buffer == NULL)
 217                return -ENOMEM;
 218
 219        retval = line6_send_raw_message_async(line6, buffer,
 220                                              sizeof(line6_request_version));
 221        kfree(buffer);
 222        return retval;
 223}
 224EXPORT_SYMBOL_GPL(line6_version_request_async);
 225
 226/*
 227        Send sysex message in pieces of wMaxPacketSize bytes.
 228*/
 229int line6_send_sysex_message(struct usb_line6 *line6, const char *buffer,
 230                             int size)
 231{
 232        return line6_send_raw_message(line6, buffer,
 233                                      size + SYSEX_EXTRA_SIZE) -
 234            SYSEX_EXTRA_SIZE;
 235}
 236EXPORT_SYMBOL_GPL(line6_send_sysex_message);
 237
 238/*
 239        Allocate buffer for sysex message and prepare header.
 240        @param code sysex message code
 241        @param size number of bytes between code and sysex end
 242*/
 243char *line6_alloc_sysex_buffer(struct usb_line6 *line6, int code1, int code2,
 244                               int size)
 245{
 246        char *buffer = kmalloc(size + SYSEX_EXTRA_SIZE, GFP_ATOMIC);
 247
 248        if (!buffer)
 249                return NULL;
 250
 251        buffer[0] = LINE6_SYSEX_BEGIN;
 252        memcpy(buffer + 1, line6_midi_id, sizeof(line6_midi_id));
 253        buffer[sizeof(line6_midi_id) + 1] = code1;
 254        buffer[sizeof(line6_midi_id) + 2] = code2;
 255        buffer[sizeof(line6_midi_id) + 3 + size] = LINE6_SYSEX_END;
 256        return buffer;
 257}
 258EXPORT_SYMBOL_GPL(line6_alloc_sysex_buffer);
 259
 260/*
 261        Notification of data received from the Line 6 device.
 262*/
 263static void line6_data_received(struct urb *urb)
 264{
 265        struct usb_line6 *line6 = (struct usb_line6 *)urb->context;
 266        struct midi_buffer *mb = &line6->line6midi->midibuf_in;
 267        int done;
 268
 269        if (urb->status == -ESHUTDOWN)
 270                return;
 271
 272        done =
 273            line6_midibuf_write(mb, urb->transfer_buffer, urb->actual_length);
 274
 275        if (done < urb->actual_length) {
 276                line6_midibuf_ignore(mb, done);
 277                dev_dbg(line6->ifcdev, "%d %d buffer overflow - message skipped\n",
 278                        done, urb->actual_length);
 279        }
 280
 281        for (;;) {
 282                done =
 283                    line6_midibuf_read(mb, line6->buffer_message,
 284                                       LINE6_MESSAGE_MAXLEN);
 285
 286                if (done == 0)
 287                        break;
 288
 289                line6->message_length = done;
 290                line6_midi_receive(line6, line6->buffer_message, done);
 291
 292                if (line6->process_message)
 293                        line6->process_message(line6);
 294        }
 295
 296        line6_start_listen(line6);
 297}
 298
 299#define LINE6_READ_WRITE_STATUS_DELAY 2  /* milliseconds */
 300#define LINE6_READ_WRITE_MAX_RETRIES 50
 301
 302/*
 303        Read data from device.
 304*/
 305int line6_read_data(struct usb_line6 *line6, unsigned address, void *data,
 306                    unsigned datalen)
 307{
 308        struct usb_device *usbdev = line6->usbdev;
 309        int ret;
 310        unsigned char len;
 311        unsigned count;
 312
 313        if (address > 0xffff || datalen > 0xff)
 314                return -EINVAL;
 315
 316        /* query the serial number: */
 317        ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), 0x67,
 318                              USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
 319                              (datalen << 8) | 0x21, address,
 320                              NULL, 0, LINE6_TIMEOUT * HZ);
 321
 322        if (ret < 0) {
 323                dev_err(line6->ifcdev, "read request failed (error %d)\n", ret);
 324                return ret;
 325        }
 326
 327        /* Wait for data length. We'll get 0xff until length arrives. */
 328        for (count = 0; count < LINE6_READ_WRITE_MAX_RETRIES; count++) {
 329                mdelay(LINE6_READ_WRITE_STATUS_DELAY);
 330
 331                ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), 0x67,
 332                                      USB_TYPE_VENDOR | USB_RECIP_DEVICE |
 333                                      USB_DIR_IN,
 334                                      0x0012, 0x0000, &len, 1,
 335                                      LINE6_TIMEOUT * HZ);
 336                if (ret < 0) {
 337                        dev_err(line6->ifcdev,
 338                                "receive length failed (error %d)\n", ret);
 339                        return ret;
 340                }
 341
 342                if (len != 0xff)
 343                        break;
 344        }
 345
 346        if (len == 0xff) {
 347                dev_err(line6->ifcdev, "read failed after %d retries\n",
 348                        count);
 349                return -EIO;
 350        } else if (len != datalen) {
 351                /* should be equal or something went wrong */
 352                dev_err(line6->ifcdev,
 353                        "length mismatch (expected %d, got %d)\n",
 354                        (int)datalen, (int)len);
 355                return -EIO;
 356        }
 357
 358        /* receive the result: */
 359        ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), 0x67,
 360                              USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
 361                              0x0013, 0x0000, data, datalen,
 362                              LINE6_TIMEOUT * HZ);
 363
 364        if (ret < 0) {
 365                dev_err(line6->ifcdev, "read failed (error %d)\n", ret);
 366                return ret;
 367        }
 368
 369        return 0;
 370}
 371EXPORT_SYMBOL_GPL(line6_read_data);
 372
 373/*
 374        Write data to device.
 375*/
 376int line6_write_data(struct usb_line6 *line6, unsigned address, void *data,
 377                     unsigned datalen)
 378{
 379        struct usb_device *usbdev = line6->usbdev;
 380        int ret;
 381        unsigned char status;
 382        int count;
 383
 384        if (address > 0xffff || datalen > 0xffff)
 385                return -EINVAL;
 386
 387        ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), 0x67,
 388                              USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
 389                              0x0022, address, data, datalen,
 390                              LINE6_TIMEOUT * HZ);
 391
 392        if (ret < 0) {
 393                dev_err(line6->ifcdev,
 394                        "write request failed (error %d)\n", ret);
 395                return ret;
 396        }
 397
 398        for (count = 0; count < LINE6_READ_WRITE_MAX_RETRIES; count++) {
 399                mdelay(LINE6_READ_WRITE_STATUS_DELAY);
 400
 401                ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0),
 402                                      0x67,
 403                                      USB_TYPE_VENDOR | USB_RECIP_DEVICE |
 404                                      USB_DIR_IN,
 405                                      0x0012, 0x0000,
 406                                      &status, 1, LINE6_TIMEOUT * HZ);
 407
 408                if (ret < 0) {
 409                        dev_err(line6->ifcdev,
 410                                "receiving status failed (error %d)\n", ret);
 411                        return ret;
 412                }
 413
 414                if (status != 0xff)
 415                        break;
 416        }
 417
 418        if (status == 0xff) {
 419                dev_err(line6->ifcdev, "write failed after %d retries\n",
 420                        count);
 421                return -EIO;
 422        } else if (status != 0) {
 423                dev_err(line6->ifcdev, "write failed (error %d)\n", ret);
 424                return -EIO;
 425        }
 426
 427        return 0;
 428}
 429EXPORT_SYMBOL_GPL(line6_write_data);
 430
 431/*
 432        Read Line 6 device serial number.
 433        (POD, TonePort, GuitarPort)
 434*/
 435int line6_read_serial_number(struct usb_line6 *line6, u32 *serial_number)
 436{
 437        return line6_read_data(line6, 0x80d0, serial_number,
 438                               sizeof(*serial_number));
 439}
 440EXPORT_SYMBOL_GPL(line6_read_serial_number);
 441
 442/*
 443        Card destructor.
 444*/
 445static void line6_destruct(struct snd_card *card)
 446{
 447        struct usb_line6 *line6 = card->private_data;
 448        struct usb_device *usbdev = line6->usbdev;
 449
 450        /* free buffer memory first: */
 451        kfree(line6->buffer_message);
 452        kfree(line6->buffer_listen);
 453
 454        /* then free URBs: */
 455        usb_free_urb(line6->urb_listen);
 456
 457        /* decrement reference counters: */
 458        usb_put_dev(usbdev);
 459}
 460
 461/* get data from endpoint descriptor (see usb_maxpacket): */
 462static void line6_get_interval(struct usb_line6 *line6)
 463{
 464        struct usb_device *usbdev = line6->usbdev;
 465        struct usb_host_endpoint *ep;
 466        unsigned pipe = usb_rcvintpipe(usbdev, line6->properties->ep_ctrl_r);
 467        unsigned epnum = usb_pipeendpoint(pipe);
 468
 469        ep = usbdev->ep_in[epnum];
 470        if (ep) {
 471                line6->interval = ep->desc.bInterval;
 472                line6->max_packet_size = le16_to_cpu(ep->desc.wMaxPacketSize);
 473        } else {
 474                dev_err(line6->ifcdev,
 475                        "endpoint not available, using fallback values");
 476                line6->interval = LINE6_FALLBACK_INTERVAL;
 477                line6->max_packet_size = LINE6_FALLBACK_MAXPACKETSIZE;
 478        }
 479}
 480
 481static int line6_init_cap_control(struct usb_line6 *line6)
 482{
 483        int ret;
 484
 485        /* initialize USB buffers: */
 486        line6->buffer_listen = kmalloc(LINE6_BUFSIZE_LISTEN, GFP_KERNEL);
 487        if (!line6->buffer_listen)
 488                return -ENOMEM;
 489
 490        line6->buffer_message = kmalloc(LINE6_MESSAGE_MAXLEN, GFP_KERNEL);
 491        if (!line6->buffer_message)
 492                return -ENOMEM;
 493
 494        line6->urb_listen = usb_alloc_urb(0, GFP_KERNEL);
 495        if (!line6->urb_listen)
 496                return -ENOMEM;
 497
 498        ret = line6_start_listen(line6);
 499        if (ret < 0) {
 500                dev_err(line6->ifcdev, "cannot start listening: %d\n", ret);
 501                return ret;
 502        }
 503
 504        return 0;
 505}
 506
 507/*
 508        Probe USB device.
 509*/
 510int line6_probe(struct usb_interface *interface,
 511                const struct usb_device_id *id,
 512                const char *driver_name,
 513                const struct line6_properties *properties,
 514                int (*private_init)(struct usb_line6 *, const struct usb_device_id *id),
 515                size_t data_size)
 516{
 517        struct usb_device *usbdev = interface_to_usbdev(interface);
 518        struct snd_card *card;
 519        struct usb_line6 *line6;
 520        int interface_number;
 521        int ret;
 522
 523        if (WARN_ON(data_size < sizeof(*line6)))
 524                return -EINVAL;
 525
 526        /* we don't handle multiple configurations */
 527        if (usbdev->descriptor.bNumConfigurations != 1)
 528                return -ENODEV;
 529
 530        ret = snd_card_new(&interface->dev,
 531                           SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,
 532                           THIS_MODULE, data_size, &card);
 533        if (ret < 0)
 534                return ret;
 535
 536        /* store basic data: */
 537        line6 = card->private_data;
 538        line6->card = card;
 539        line6->properties = properties;
 540        line6->usbdev = usbdev;
 541        line6->ifcdev = &interface->dev;
 542
 543        strcpy(card->id, properties->id);
 544        strcpy(card->driver, driver_name);
 545        strcpy(card->shortname, properties->name);
 546        sprintf(card->longname, "Line 6 %s at USB %s", properties->name,
 547                dev_name(line6->ifcdev));
 548        card->private_free = line6_destruct;
 549
 550        usb_set_intfdata(interface, line6);
 551
 552        /* increment reference counters: */
 553        usb_get_dev(usbdev);
 554
 555        /* initialize device info: */
 556        dev_info(&interface->dev, "Line 6 %s found\n", properties->name);
 557
 558        /* query interface number */
 559        interface_number = interface->cur_altsetting->desc.bInterfaceNumber;
 560
 561        ret = usb_set_interface(usbdev, interface_number,
 562                                properties->altsetting);
 563        if (ret < 0) {
 564                dev_err(&interface->dev, "set_interface failed\n");
 565                goto error;
 566        }
 567
 568        line6_get_interval(line6);
 569
 570        if (properties->capabilities & LINE6_CAP_CONTROL) {
 571                ret = line6_init_cap_control(line6);
 572                if (ret < 0)
 573                        goto error;
 574        }
 575
 576        /* initialize device data based on device: */
 577        ret = private_init(line6, id);
 578        if (ret < 0)
 579                goto error;
 580
 581        /* creation of additional special files should go here */
 582
 583        dev_info(&interface->dev, "Line 6 %s now attached\n",
 584                 properties->name);
 585
 586        return 0;
 587
 588 error:
 589        if (line6->disconnect)
 590                line6->disconnect(line6);
 591        snd_card_free(card);
 592        return ret;
 593}
 594EXPORT_SYMBOL_GPL(line6_probe);
 595
 596/*
 597        Line 6 device disconnected.
 598*/
 599void line6_disconnect(struct usb_interface *interface)
 600{
 601        struct usb_line6 *line6 = usb_get_intfdata(interface);
 602        struct usb_device *usbdev = interface_to_usbdev(interface);
 603
 604        if (!line6)
 605                return;
 606
 607        if (WARN_ON(usbdev != line6->usbdev))
 608                return;
 609
 610        if (line6->urb_listen != NULL)
 611                line6_stop_listen(line6);
 612
 613        snd_card_disconnect(line6->card);
 614        if (line6->line6pcm)
 615                line6_pcm_disconnect(line6->line6pcm);
 616        if (line6->disconnect)
 617                line6->disconnect(line6);
 618
 619        dev_info(&interface->dev, "Line 6 %s now disconnected\n",
 620                 line6->properties->name);
 621
 622        /* make sure the device isn't destructed twice: */
 623        usb_set_intfdata(interface, NULL);
 624
 625        snd_card_free_when_closed(line6->card);
 626}
 627EXPORT_SYMBOL_GPL(line6_disconnect);
 628
 629#ifdef CONFIG_PM
 630
 631/*
 632        Suspend Line 6 device.
 633*/
 634int line6_suspend(struct usb_interface *interface, pm_message_t message)
 635{
 636        struct usb_line6 *line6 = usb_get_intfdata(interface);
 637        struct snd_line6_pcm *line6pcm = line6->line6pcm;
 638
 639        snd_power_change_state(line6->card, SNDRV_CTL_POWER_D3hot);
 640
 641        if (line6->properties->capabilities & LINE6_CAP_CONTROL)
 642                line6_stop_listen(line6);
 643
 644        if (line6pcm != NULL) {
 645                snd_pcm_suspend_all(line6pcm->pcm);
 646                line6pcm->flags = 0;
 647        }
 648
 649        return 0;
 650}
 651EXPORT_SYMBOL_GPL(line6_suspend);
 652
 653/*
 654        Resume Line 6 device.
 655*/
 656int line6_resume(struct usb_interface *interface)
 657{
 658        struct usb_line6 *line6 = usb_get_intfdata(interface);
 659
 660        if (line6->properties->capabilities & LINE6_CAP_CONTROL)
 661                line6_start_listen(line6);
 662
 663        snd_power_change_state(line6->card, SNDRV_CTL_POWER_D0);
 664        return 0;
 665}
 666EXPORT_SYMBOL_GPL(line6_resume);
 667
 668#endif /* CONFIG_PM */
 669
 670MODULE_AUTHOR(DRIVER_AUTHOR);
 671MODULE_DESCRIPTION(DRIVER_DESC);
 672MODULE_LICENSE("GPL");
 673