linux/drivers/staging/line6/pod.c
<<
>>
Prefs
   1/*
   2 * Line6 Linux USB driver - 0.9.1beta
   3 *
   4 * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
   5 *
   6 *      This program is free software; you can redistribute it and/or
   7 *      modify it under the terms of the GNU General Public License as
   8 *      published by the Free Software Foundation, version 2.
   9 *
  10 */
  11
  12#include <linux/slab.h>
  13#include <linux/wait.h>
  14#include <sound/control.h>
  15
  16#include "audio.h"
  17#include "capture.h"
  18#include "control.h"
  19#include "driver.h"
  20#include "playback.h"
  21#include "pod.h"
  22
  23#define POD_SYSEX_CODE 3
  24#define POD_BYTES_PER_FRAME 6   /* 24bit audio (stereo) */
  25
  26/* *INDENT-OFF* */
  27
  28enum {
  29        POD_SYSEX_CLIP      = 0x0f,
  30        POD_SYSEX_SAVE      = 0x24,
  31        POD_SYSEX_SYSTEM    = 0x56,
  32        POD_SYSEX_SYSTEMREQ = 0x57,
  33        /* POD_SYSEX_UPDATE    = 0x6c, */  /* software update! */
  34        POD_SYSEX_STORE     = 0x71,
  35        POD_SYSEX_FINISH    = 0x72,
  36        POD_SYSEX_DUMPMEM   = 0x73,
  37        POD_SYSEX_DUMP      = 0x74,
  38        POD_SYSEX_DUMPREQ   = 0x75
  39        /* POD_SYSEX_DUMPMEM2  = 0x76 */   /* dumps entire internal memory of PODxt Pro */
  40};
  41
  42enum {
  43        POD_monitor_level  = 0x04,
  44        POD_routing        = 0x05,
  45        POD_tuner_mute     = 0x13,
  46        POD_tuner_freq     = 0x15,
  47        POD_tuner_note     = 0x16,
  48        POD_tuner_pitch    = 0x17,
  49        POD_system_invalid = 0x10000
  50};
  51
  52/* *INDENT-ON* */
  53
  54enum {
  55        POD_DUMP_MEMORY = 2
  56};
  57
  58enum {
  59        POD_BUSY_READ,
  60        POD_BUSY_WRITE,
  61        POD_CHANNEL_DIRTY,
  62        POD_SAVE_PRESSED,
  63        POD_BUSY_MIDISEND
  64};
  65
  66static struct snd_ratden pod_ratden = {
  67        .num_min = 78125,
  68        .num_max = 78125,
  69        .num_step = 1,
  70        .den = 2
  71};
  72
  73static struct line6_pcm_properties pod_pcm_properties = {
  74        .snd_line6_playback_hw = {
  75                                  .info = (SNDRV_PCM_INFO_MMAP |
  76                                           SNDRV_PCM_INFO_INTERLEAVED |
  77                                           SNDRV_PCM_INFO_BLOCK_TRANSFER |
  78                                           SNDRV_PCM_INFO_MMAP_VALID |
  79                                           SNDRV_PCM_INFO_PAUSE |
  80#ifdef CONFIG_PM
  81                                           SNDRV_PCM_INFO_RESUME |
  82#endif
  83                                           SNDRV_PCM_INFO_SYNC_START),
  84                                  .formats = SNDRV_PCM_FMTBIT_S24_3LE,
  85                                  .rates = SNDRV_PCM_RATE_KNOT,
  86                                  .rate_min = 39062,
  87                                  .rate_max = 39063,
  88                                  .channels_min = 2,
  89                                  .channels_max = 2,
  90                                  .buffer_bytes_max = 60000,
  91                                  .period_bytes_min = 64,
  92                                  .period_bytes_max = 8192,
  93                                  .periods_min = 1,
  94                                  .periods_max = 1024},
  95        .snd_line6_capture_hw = {
  96                                 .info = (SNDRV_PCM_INFO_MMAP |
  97                                          SNDRV_PCM_INFO_INTERLEAVED |
  98                                          SNDRV_PCM_INFO_BLOCK_TRANSFER |
  99                                          SNDRV_PCM_INFO_MMAP_VALID |
 100#ifdef CONFIG_PM
 101                                          SNDRV_PCM_INFO_RESUME |
 102#endif
 103                                          SNDRV_PCM_INFO_SYNC_START),
 104                                 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
 105                                 .rates = SNDRV_PCM_RATE_KNOT,
 106                                 .rate_min = 39062,
 107                                 .rate_max = 39063,
 108                                 .channels_min = 2,
 109                                 .channels_max = 2,
 110                                 .buffer_bytes_max = 60000,
 111                                 .period_bytes_min = 64,
 112                                 .period_bytes_max = 8192,
 113                                 .periods_min = 1,
 114                                 .periods_max = 1024},
 115        .snd_line6_rates = {
 116                            .nrats = 1,
 117                            .rats = &pod_ratden},
 118        .bytes_per_frame = POD_BYTES_PER_FRAME
 119};
 120
 121static const char pod_request_channel[] = {
 122        0xf0, 0x00, 0x01, 0x0c, 0x03, 0x75, 0xf7
 123};
 124
 125static const char pod_version_header[] = {
 126        0xf2, 0x7e, 0x7f, 0x06, 0x02
 127};
 128
 129/* forward declarations: */
 130static void pod_startup2(unsigned long data);
 131static void pod_startup3(struct usb_line6_pod *pod);
 132static void pod_startup4(struct usb_line6_pod *pod);
 133
 134/*
 135        Mark all parameters as dirty and notify waiting processes.
 136*/
 137static void pod_mark_batch_all_dirty(struct usb_line6_pod *pod)
 138{
 139        int i;
 140
 141        for (i = 0; i < POD_CONTROL_SIZE; i++)
 142                set_bit(i, pod->param_dirty);
 143}
 144
 145static char *pod_alloc_sysex_buffer(struct usb_line6_pod *pod, int code,
 146                                    int size)
 147{
 148        return line6_alloc_sysex_buffer(&pod->line6, POD_SYSEX_CODE, code,
 149                                        size);
 150}
 151
 152/*
 153        Send channel dump data to the PODxt Pro.
 154*/
 155static void pod_dump(struct usb_line6_pod *pod, const unsigned char *data)
 156{
 157        int size = 1 + sizeof(pod->prog_data);
 158        char *sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_DUMP, size);
 159        if (!sysex)
 160                return;
 161        /* Don't know what this is good for, but PODxt Pro transmits it, so we
 162         * also do... */
 163        sysex[SYSEX_DATA_OFS] = 5;
 164        memcpy(sysex + SYSEX_DATA_OFS + 1, data, sizeof(pod->prog_data));
 165        line6_send_sysex_message(&pod->line6, sysex, size);
 166        memcpy(&pod->prog_data, data, sizeof(pod->prog_data));
 167        pod_mark_batch_all_dirty(pod);
 168        kfree(sysex);
 169}
 170
 171/*
 172        Store parameter value in driver memory and mark it as dirty.
 173*/
 174static void pod_store_parameter(struct usb_line6_pod *pod, int param, int value)
 175{
 176        pod->prog_data.control[param] = value;
 177        set_bit(param, pod->param_dirty);
 178        pod->dirty = 1;
 179}
 180
 181/*
 182        Handle SAVE button.
 183*/
 184static void pod_save_button_pressed(struct usb_line6_pod *pod, int type,
 185                                    int index)
 186{
 187        pod->dirty = 0;
 188        set_bit(POD_SAVE_PRESSED, &pod->atomic_flags);
 189}
 190
 191/*
 192        Process a completely received message.
 193*/
 194void line6_pod_process_message(struct usb_line6_pod *pod)
 195{
 196        const unsigned char *buf = pod->line6.buffer_message;
 197
 198        /* filter messages by type */
 199        switch (buf[0] & 0xf0) {
 200        case LINE6_PARAM_CHANGE:
 201        case LINE6_PROGRAM_CHANGE:
 202        case LINE6_SYSEX_BEGIN:
 203                break;          /* handle these further down */
 204
 205        default:
 206                return;         /* ignore all others */
 207        }
 208
 209        /* process all remaining messages */
 210        switch (buf[0]) {
 211        case LINE6_PARAM_CHANGE | LINE6_CHANNEL_DEVICE:
 212                pod_store_parameter(pod, buf[1], buf[2]);
 213                /* intentionally no break here! */
 214
 215        case LINE6_PARAM_CHANGE | LINE6_CHANNEL_HOST:
 216                if ((buf[1] == POD_amp_model_setup) ||
 217                    (buf[1] == POD_effect_setup))
 218                        /* these also affect other settings */
 219                        line6_dump_request_async(&pod->dumpreq, &pod->line6, 0,
 220                                                 LINE6_DUMP_CURRENT);
 221
 222                break;
 223
 224        case LINE6_PROGRAM_CHANGE | LINE6_CHANNEL_DEVICE:
 225        case LINE6_PROGRAM_CHANGE | LINE6_CHANNEL_HOST:
 226                pod->channel_num = buf[1];
 227                pod->dirty = 0;
 228                set_bit(POD_CHANNEL_DIRTY, &pod->atomic_flags);
 229                line6_dump_request_async(&pod->dumpreq, &pod->line6, 0,
 230                                         LINE6_DUMP_CURRENT);
 231                break;
 232
 233        case LINE6_SYSEX_BEGIN | LINE6_CHANNEL_DEVICE:
 234        case LINE6_SYSEX_BEGIN | LINE6_CHANNEL_UNKNOWN:
 235                if (memcmp(buf + 1, line6_midi_id, sizeof(line6_midi_id)) == 0) {
 236                        switch (buf[5]) {
 237                        case POD_SYSEX_DUMP:
 238                                if (pod->line6.message_length ==
 239                                    sizeof(pod->prog_data) + 7) {
 240                                        switch (pod->dumpreq.in_progress) {
 241                                        case LINE6_DUMP_CURRENT:
 242                                                memcpy(&pod->prog_data, buf + 7,
 243                                                       sizeof(pod->prog_data));
 244                                                pod_mark_batch_all_dirty(pod);
 245                                                break;
 246
 247                                        case POD_DUMP_MEMORY:
 248                                                memcpy(&pod->prog_data_buf,
 249                                                       buf + 7,
 250                                                       sizeof
 251                                                       (pod->prog_data_buf));
 252                                                break;
 253
 254                                        default:
 255                                                DEBUG_MESSAGES(dev_err
 256                                                               (pod->
 257                                                                line6.ifcdev,
 258                                                                "unknown dump code %02X\n",
 259                                                                pod->
 260                                                                dumpreq.in_progress));
 261                                        }
 262
 263                                        line6_dump_finished(&pod->dumpreq);
 264                                        pod_startup3(pod);
 265                                } else
 266                                        DEBUG_MESSAGES(dev_err
 267                                                       (pod->line6.ifcdev,
 268                                                        "wrong size of channel dump message (%d instead of %d)\n",
 269                                                        pod->
 270                                                        line6.message_length,
 271                                                        (int)
 272                                                        sizeof(pod->prog_data) +
 273                                                        7));
 274
 275                                break;
 276
 277                        case POD_SYSEX_SYSTEM:{
 278                                        short value =
 279                                            ((int)buf[7] << 12) | ((int)buf[8]
 280                                                                   << 8) |
 281                                            ((int)buf[9] << 4) | (int)buf[10];
 282
 283#define PROCESS_SYSTEM_PARAM(x) \
 284                                        case POD_ ## x: \
 285                                                pod->x.value = value; \
 286                                                wake_up(&pod->x.wait); \
 287                                                break;
 288
 289                                        switch (buf[6]) {
 290                                                PROCESS_SYSTEM_PARAM
 291                                                    (monitor_level);
 292                                                PROCESS_SYSTEM_PARAM(routing);
 293                                                PROCESS_SYSTEM_PARAM
 294                                                    (tuner_mute);
 295                                                PROCESS_SYSTEM_PARAM
 296                                                    (tuner_freq);
 297                                                PROCESS_SYSTEM_PARAM
 298                                                    (tuner_note);
 299                                                PROCESS_SYSTEM_PARAM
 300                                                    (tuner_pitch);
 301
 302#undef PROCESS_SYSTEM_PARAM
 303
 304                                        default:
 305                                                DEBUG_MESSAGES(dev_err
 306                                                               (pod->
 307                                                                line6.ifcdev,
 308                                                                "unknown tuner/system response %02X\n",
 309                                                                buf[6]));
 310                                        }
 311
 312                                        break;
 313                                }
 314
 315                        case POD_SYSEX_FINISH:
 316                                /* do we need to respond to this? */
 317                                break;
 318
 319                        case POD_SYSEX_SAVE:
 320                                pod_save_button_pressed(pod, buf[6], buf[7]);
 321                                break;
 322
 323                        case POD_SYSEX_CLIP:
 324                                DEBUG_MESSAGES(dev_err
 325                                               (pod->line6.ifcdev,
 326                                                "audio clipped\n"));
 327                                pod->clipping.value = 1;
 328                                wake_up(&pod->clipping.wait);
 329                                break;
 330
 331                        case POD_SYSEX_STORE:
 332                                DEBUG_MESSAGES(dev_err
 333                                               (pod->line6.ifcdev,
 334                                                "message %02X not yet implemented\n",
 335                                                buf[5]));
 336                                break;
 337
 338                        default:
 339                                DEBUG_MESSAGES(dev_err
 340                                               (pod->line6.ifcdev,
 341                                                "unknown sysex message %02X\n",
 342                                                buf[5]));
 343                        }
 344                } else
 345                    if (memcmp
 346                        (buf, pod_version_header,
 347                         sizeof(pod_version_header)) == 0) {
 348                        pod->firmware_version =
 349                            buf[13] * 100 + buf[14] * 10 + buf[15];
 350                        pod->device_id =
 351                            ((int)buf[8] << 16) | ((int)buf[9] << 8) | (int)
 352                            buf[10];
 353                        pod_startup4(pod);
 354                } else
 355                        DEBUG_MESSAGES(dev_err
 356                                       (pod->line6.ifcdev,
 357                                        "unknown sysex header\n"));
 358
 359                break;
 360
 361        case LINE6_SYSEX_END:
 362                break;
 363
 364        default:
 365                DEBUG_MESSAGES(dev_err
 366                               (pod->line6.ifcdev,
 367                                "POD: unknown message %02X\n", buf[0]));
 368        }
 369}
 370
 371/*
 372        Detect some cases that require a channel dump after sending a command to the
 373        device. Important notes:
 374        *) The actual dump request can not be sent here since we are not allowed to
 375        wait for the completion of the first message in this context, and sending
 376        the dump request before completion of the previous message leaves the POD
 377        in an undefined state. The dump request will be sent when the echoed
 378        commands are received.
 379        *) This method fails if a param change message is "chopped" after the first
 380        byte.
 381*/
 382void line6_pod_midi_postprocess(struct usb_line6_pod *pod, unsigned char *data,
 383                                int length)
 384{
 385        int i;
 386
 387        if (!pod->midi_postprocess)
 388                return;
 389
 390        for (i = 0; i < length; ++i) {
 391                if (data[i] == (LINE6_PROGRAM_CHANGE | LINE6_CHANNEL_HOST)) {
 392                        line6_invalidate_current(&pod->dumpreq);
 393                        break;
 394                } else
 395                    if ((data[i] == (LINE6_PARAM_CHANGE | LINE6_CHANNEL_HOST))
 396                        && (i < length - 1))
 397                        if ((data[i + 1] == POD_amp_model_setup)
 398                            || (data[i + 1] == POD_effect_setup)) {
 399                                line6_invalidate_current(&pod->dumpreq);
 400                                break;
 401                        }
 402        }
 403}
 404
 405/*
 406        Send channel number (i.e., switch to a different sound).
 407*/
 408static void pod_send_channel(struct usb_line6_pod *pod, int value)
 409{
 410        line6_invalidate_current(&pod->dumpreq);
 411
 412        if (line6_send_program(&pod->line6, value) == 0)
 413                pod->channel_num = value;
 414        else
 415                line6_dump_finished(&pod->dumpreq);
 416}
 417
 418/*
 419        Transmit PODxt Pro control parameter.
 420*/
 421void line6_pod_transmit_parameter(struct usb_line6_pod *pod, int param,
 422                                  int value)
 423{
 424        if (line6_transmit_parameter(&pod->line6, param, value) == 0)
 425                pod_store_parameter(pod, param, value);
 426
 427        if ((param == POD_amp_model_setup) || (param == POD_effect_setup))      /* these also affect other settings */
 428                line6_invalidate_current(&pod->dumpreq);
 429}
 430
 431/*
 432        Resolve value to memory location.
 433*/
 434static int pod_resolve(const char *buf, short block0, short block1,
 435                       unsigned char *location)
 436{
 437        unsigned long value;
 438        short block;
 439        int ret;
 440
 441        ret = strict_strtoul(buf, 10, &value);
 442        if (ret)
 443                return ret;
 444
 445        block = (value < 0x40) ? block0 : block1;
 446        value &= 0x3f;
 447        location[0] = block >> 7;
 448        location[1] = value | (block & 0x7f);
 449        return 0;
 450}
 451
 452/*
 453        Send command to store channel/effects setup/amp setup to PODxt Pro.
 454*/
 455static ssize_t pod_send_store_command(struct device *dev, const char *buf,
 456                                      size_t count, short block0, short block1)
 457{
 458        struct usb_interface *interface = to_usb_interface(dev);
 459        struct usb_line6_pod *pod = usb_get_intfdata(interface);
 460        int ret;
 461        int size = 3 + sizeof(pod->prog_data_buf);
 462        char *sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_STORE, size);
 463
 464        if (!sysex)
 465                return 0;
 466
 467        sysex[SYSEX_DATA_OFS] = 5;      /* see pod_dump() */
 468        ret = pod_resolve(buf, block0, block1, sysex + SYSEX_DATA_OFS + 1);
 469        if (ret) {
 470                kfree(sysex);
 471                return ret;
 472        }
 473
 474        memcpy(sysex + SYSEX_DATA_OFS + 3, &pod->prog_data_buf,
 475               sizeof(pod->prog_data_buf));
 476
 477        line6_send_sysex_message(&pod->line6, sysex, size);
 478        kfree(sysex);
 479        /* needs some delay here on AMD64 platform */
 480        return count;
 481}
 482
 483/*
 484        Send command to retrieve channel/effects setup/amp setup to PODxt Pro.
 485*/
 486static ssize_t pod_send_retrieve_command(struct device *dev, const char *buf,
 487                                         size_t count, short block0,
 488                                         short block1)
 489{
 490        struct usb_interface *interface = to_usb_interface(dev);
 491        struct usb_line6_pod *pod = usb_get_intfdata(interface);
 492        int ret;
 493        int size = 4;
 494        char *sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_DUMPMEM, size);
 495
 496        if (!sysex)
 497                return 0;
 498
 499        ret = pod_resolve(buf, block0, block1, sysex + SYSEX_DATA_OFS);
 500        if (ret) {
 501                kfree(sysex);
 502                return ret;
 503        }
 504        sysex[SYSEX_DATA_OFS + 2] = 0;
 505        sysex[SYSEX_DATA_OFS + 3] = 0;
 506        line6_dump_started(&pod->dumpreq, POD_DUMP_MEMORY);
 507
 508        if (line6_send_sysex_message(&pod->line6, sysex, size) < size)
 509                line6_dump_finished(&pod->dumpreq);
 510
 511        kfree(sysex);
 512        /* needs some delay here on AMD64 platform */
 513        return count;
 514}
 515
 516/*
 517        Generic get name function.
 518*/
 519static ssize_t get_name_generic(struct usb_line6_pod *pod, const char *str,
 520                                char *buf)
 521{
 522        int length = 0;
 523        const char *p1;
 524        char *p2;
 525        char *last_non_space = buf;
 526
 527        int retval = line6_dump_wait_interruptible(&pod->dumpreq);
 528        if (retval < 0)
 529                return retval;
 530
 531        for (p1 = str, p2 = buf; *p1; ++p1, ++p2) {
 532                *p2 = *p1;
 533                if (*p2 != ' ')
 534                        last_non_space = p2;
 535                if (++length == POD_NAME_LENGTH)
 536                        break;
 537        }
 538
 539        *(last_non_space + 1) = '\n';
 540        return last_non_space - buf + 2;
 541}
 542
 543/*
 544        "read" request on "channel" special file.
 545*/
 546static ssize_t pod_get_channel(struct device *dev,
 547                               struct device_attribute *attr, char *buf)
 548{
 549        struct usb_interface *interface = to_usb_interface(dev);
 550        struct usb_line6_pod *pod = usb_get_intfdata(interface);
 551        return sprintf(buf, "%d\n", pod->channel_num);
 552}
 553
 554/*
 555        "write" request on "channel" special file.
 556*/
 557static ssize_t pod_set_channel(struct device *dev,
 558                               struct device_attribute *attr,
 559                               const char *buf, size_t count)
 560{
 561        struct usb_interface *interface = to_usb_interface(dev);
 562        struct usb_line6_pod *pod = usb_get_intfdata(interface);
 563        unsigned long value;
 564        int ret;
 565
 566        ret = strict_strtoul(buf, 10, &value);
 567        if (ret)
 568                return ret;
 569
 570        pod_send_channel(pod, value);
 571        return count;
 572}
 573
 574/*
 575        "read" request on "name" special file.
 576*/
 577static ssize_t pod_get_name(struct device *dev, struct device_attribute *attr,
 578                            char *buf)
 579{
 580        struct usb_interface *interface = to_usb_interface(dev);
 581        struct usb_line6_pod *pod = usb_get_intfdata(interface);
 582        return get_name_generic(pod, pod->prog_data.header + POD_NAME_OFFSET,
 583                                buf);
 584}
 585
 586/*
 587        "read" request on "name" special file.
 588*/
 589static ssize_t pod_get_name_buf(struct device *dev,
 590                                struct device_attribute *attr, char *buf)
 591{
 592        struct usb_interface *interface = to_usb_interface(dev);
 593        struct usb_line6_pod *pod = usb_get_intfdata(interface);
 594        return get_name_generic(pod,
 595                                pod->prog_data_buf.header + POD_NAME_OFFSET,
 596                                buf);
 597}
 598
 599/*
 600        "read" request on "dump" special file.
 601*/
 602static ssize_t pod_get_dump(struct device *dev, struct device_attribute *attr,
 603                            char *buf)
 604{
 605        struct usb_interface *interface = to_usb_interface(dev);
 606        struct usb_line6_pod *pod = usb_get_intfdata(interface);
 607        int retval = line6_dump_wait_interruptible(&pod->dumpreq);
 608        if (retval < 0)
 609                return retval;
 610        memcpy(buf, &pod->prog_data, sizeof(pod->prog_data));
 611        return sizeof(pod->prog_data);
 612}
 613
 614/*
 615        "write" request on "dump" special file.
 616*/
 617static ssize_t pod_set_dump(struct device *dev, struct device_attribute *attr,
 618                            const char *buf, size_t count)
 619{
 620        struct usb_interface *interface = to_usb_interface(dev);
 621        struct usb_line6_pod *pod = usb_get_intfdata(interface);
 622
 623        if (count != sizeof(pod->prog_data)) {
 624                dev_err(pod->line6.ifcdev,
 625                        "data block must be exactly %d bytes\n",
 626                        (int)sizeof(pod->prog_data));
 627                return -EINVAL;
 628        }
 629
 630        pod_dump(pod, buf);
 631        return sizeof(pod->prog_data);
 632}
 633
 634/*
 635        Identify system parameters related to the tuner.
 636*/
 637static bool pod_is_tuner(int code)
 638{
 639        return
 640            (code == POD_tuner_mute) ||
 641            (code == POD_tuner_freq) ||
 642            (code == POD_tuner_note) || (code == POD_tuner_pitch);
 643}
 644
 645/*
 646        Get system parameter (as integer).
 647        @param tuner non-zero, if code refers to a tuner parameter
 648*/
 649static int pod_get_system_param_int(struct usb_line6_pod *pod, int *value,
 650                                    int code, struct ValueWait *param, int sign)
 651{
 652        char *sysex;
 653        static const int size = 1;
 654        int retval = 0;
 655
 656        if (((pod->prog_data.control[POD_tuner] & 0x40) == 0)
 657            && pod_is_tuner(code))
 658                return -ENODEV;
 659
 660        /* send value request to device: */
 661        param->value = POD_system_invalid;
 662        sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_SYSTEMREQ, size);
 663
 664        if (!sysex)
 665                return -ENOMEM;
 666
 667        sysex[SYSEX_DATA_OFS] = code;
 668        line6_send_sysex_message(&pod->line6, sysex, size);
 669        kfree(sysex);
 670
 671        /* wait for device to respond: */
 672        retval =
 673            wait_event_interruptible(param->wait,
 674                                     param->value != POD_system_invalid);
 675
 676        if (retval < 0)
 677                return retval;
 678
 679        *value = sign ? (int)(signed short)param->value : (int)(unsigned short)
 680            param->value;
 681
 682        if (*value == POD_system_invalid)
 683                *value = 0;     /* don't report uninitialized values */
 684
 685        return 0;
 686}
 687
 688/*
 689        Get system parameter (as string).
 690        @param tuner non-zero, if code refers to a tuner parameter
 691*/
 692static ssize_t pod_get_system_param_string(struct usb_line6_pod *pod, char *buf,
 693                                           int code, struct ValueWait *param,
 694                                           int sign)
 695{
 696        int retval, value = 0;
 697        retval = pod_get_system_param_int(pod, &value, code, param, sign);
 698
 699        if (retval < 0)
 700                return retval;
 701
 702        return sprintf(buf, "%d\n", value);
 703}
 704
 705/*
 706        Send system parameter (from integer).
 707        @param tuner non-zero, if code refers to a tuner parameter
 708*/
 709static int pod_set_system_param_int(struct usb_line6_pod *pod, int value,
 710                                    int code)
 711{
 712        char *sysex;
 713        static const int size = 5;
 714
 715        if (((pod->prog_data.control[POD_tuner] & 0x40) == 0)
 716            && pod_is_tuner(code))
 717                return -EINVAL;
 718
 719        /* send value to tuner: */
 720        sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_SYSTEM, size);
 721        if (!sysex)
 722                return -ENOMEM;
 723        sysex[SYSEX_DATA_OFS] = code;
 724        sysex[SYSEX_DATA_OFS + 1] = (value >> 12) & 0x0f;
 725        sysex[SYSEX_DATA_OFS + 2] = (value >> 8) & 0x0f;
 726        sysex[SYSEX_DATA_OFS + 3] = (value >> 4) & 0x0f;
 727        sysex[SYSEX_DATA_OFS + 4] = (value) & 0x0f;
 728        line6_send_sysex_message(&pod->line6, sysex, size);
 729        kfree(sysex);
 730        return 0;
 731}
 732
 733/*
 734        Send system parameter (from string).
 735        @param tuner non-zero, if code refers to a tuner parameter
 736*/
 737static ssize_t pod_set_system_param_string(struct usb_line6_pod *pod,
 738                                           const char *buf, int count, int code,
 739                                           unsigned short mask)
 740{
 741        int retval;
 742        unsigned short value = simple_strtoul(buf, NULL, 10) & mask;
 743        retval = pod_set_system_param_int(pod, value, code);
 744        return (retval < 0) ? retval : count;
 745}
 746
 747/*
 748        "read" request on "dump_buf" special file.
 749*/
 750static ssize_t pod_get_dump_buf(struct device *dev,
 751                                struct device_attribute *attr, char *buf)
 752{
 753        struct usb_interface *interface = to_usb_interface(dev);
 754        struct usb_line6_pod *pod = usb_get_intfdata(interface);
 755        int retval = line6_dump_wait_interruptible(&pod->dumpreq);
 756        if (retval < 0)
 757                return retval;
 758        memcpy(buf, &pod->prog_data_buf, sizeof(pod->prog_data_buf));
 759        return sizeof(pod->prog_data_buf);
 760}
 761
 762/*
 763        "write" request on "dump_buf" special file.
 764*/
 765static ssize_t pod_set_dump_buf(struct device *dev,
 766                                struct device_attribute *attr,
 767                                const char *buf, size_t count)
 768{
 769        struct usb_interface *interface = to_usb_interface(dev);
 770        struct usb_line6_pod *pod = usb_get_intfdata(interface);
 771
 772        if (count != sizeof(pod->prog_data)) {
 773                dev_err(pod->line6.ifcdev,
 774                        "data block must be exactly %d bytes\n",
 775                        (int)sizeof(pod->prog_data));
 776                return -EINVAL;
 777        }
 778
 779        memcpy(&pod->prog_data_buf, buf, sizeof(pod->prog_data));
 780        return sizeof(pod->prog_data);
 781}
 782
 783/*
 784        "write" request on "finish" special file.
 785*/
 786static ssize_t pod_set_finish(struct device *dev,
 787                              struct device_attribute *attr,
 788                              const char *buf, size_t count)
 789{
 790        struct usb_interface *interface = to_usb_interface(dev);
 791        struct usb_line6_pod *pod = usb_get_intfdata(interface);
 792        int size = 0;
 793        char *sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_FINISH, size);
 794        if (!sysex)
 795                return 0;
 796        line6_send_sysex_message(&pod->line6, sysex, size);
 797        kfree(sysex);
 798        return count;
 799}
 800
 801/*
 802        "write" request on "store_channel" special file.
 803*/
 804static ssize_t pod_set_store_channel(struct device *dev,
 805                                     struct device_attribute *attr,
 806                                     const char *buf, size_t count)
 807{
 808        return pod_send_store_command(dev, buf, count, 0x0000, 0x00c0);
 809}
 810
 811/*
 812        "write" request on "store_effects_setup" special file.
 813*/
 814static ssize_t pod_set_store_effects_setup(struct device *dev,
 815                                           struct device_attribute *attr,
 816                                           const char *buf, size_t count)
 817{
 818        return pod_send_store_command(dev, buf, count, 0x0080, 0x0080);
 819}
 820
 821/*
 822        "write" request on "store_amp_setup" special file.
 823*/
 824static ssize_t pod_set_store_amp_setup(struct device *dev,
 825                                       struct device_attribute *attr,
 826                                       const char *buf, size_t count)
 827{
 828        return pod_send_store_command(dev, buf, count, 0x0040, 0x0100);
 829}
 830
 831/*
 832        "write" request on "retrieve_channel" special file.
 833*/
 834static ssize_t pod_set_retrieve_channel(struct device *dev,
 835                                        struct device_attribute *attr,
 836                                        const char *buf, size_t count)
 837{
 838        return pod_send_retrieve_command(dev, buf, count, 0x0000, 0x00c0);
 839}
 840
 841/*
 842        "write" request on "retrieve_effects_setup" special file.
 843*/
 844static ssize_t pod_set_retrieve_effects_setup(struct device *dev,
 845                                              struct device_attribute *attr,
 846                                              const char *buf, size_t count)
 847{
 848        return pod_send_retrieve_command(dev, buf, count, 0x0080, 0x0080);
 849}
 850
 851/*
 852        "write" request on "retrieve_amp_setup" special file.
 853*/
 854static ssize_t pod_set_retrieve_amp_setup(struct device *dev,
 855                                          struct device_attribute *attr,
 856                                          const char *buf, size_t count)
 857{
 858        return pod_send_retrieve_command(dev, buf, count, 0x0040, 0x0100);
 859}
 860
 861/*
 862        "read" request on "dirty" special file.
 863*/
 864static ssize_t pod_get_dirty(struct device *dev, struct device_attribute *attr,
 865                             char *buf)
 866{
 867        struct usb_interface *interface = to_usb_interface(dev);
 868        struct usb_line6_pod *pod = usb_get_intfdata(interface);
 869        buf[0] = pod->dirty ? '1' : '0';
 870        buf[1] = '\n';
 871        return 2;
 872}
 873
 874/*
 875        "read" request on "midi_postprocess" special file.
 876*/
 877static ssize_t pod_get_midi_postprocess(struct device *dev,
 878                                        struct device_attribute *attr,
 879                                        char *buf)
 880{
 881        struct usb_interface *interface = to_usb_interface(dev);
 882        struct usb_line6_pod *pod = usb_get_intfdata(interface);
 883        return sprintf(buf, "%d\n", pod->midi_postprocess);
 884}
 885
 886/*
 887        "write" request on "midi_postprocess" special file.
 888*/
 889static ssize_t pod_set_midi_postprocess(struct device *dev,
 890                                        struct device_attribute *attr,
 891                                        const char *buf, size_t count)
 892{
 893        struct usb_interface *interface = to_usb_interface(dev);
 894        struct usb_line6_pod *pod = usb_get_intfdata(interface);
 895        unsigned long value;
 896        int ret;
 897
 898        ret = strict_strtoul(buf, 10, &value);
 899        if (ret)
 900                return ret;
 901
 902        pod->midi_postprocess = value ? 1 : 0;
 903        return count;
 904}
 905
 906/*
 907        "read" request on "serial_number" special file.
 908*/
 909static ssize_t pod_get_serial_number(struct device *dev,
 910                                     struct device_attribute *attr, char *buf)
 911{
 912        struct usb_interface *interface = to_usb_interface(dev);
 913        struct usb_line6_pod *pod = usb_get_intfdata(interface);
 914        return sprintf(buf, "%d\n", pod->serial_number);
 915}
 916
 917/*
 918        "read" request on "firmware_version" special file.
 919*/
 920static ssize_t pod_get_firmware_version(struct device *dev,
 921                                        struct device_attribute *attr,
 922                                        char *buf)
 923{
 924        struct usb_interface *interface = to_usb_interface(dev);
 925        struct usb_line6_pod *pod = usb_get_intfdata(interface);
 926        return sprintf(buf, "%d.%02d\n", pod->firmware_version / 100,
 927                       pod->firmware_version % 100);
 928}
 929
 930/*
 931        "read" request on "device_id" special file.
 932*/
 933static ssize_t pod_get_device_id(struct device *dev,
 934                                 struct device_attribute *attr, char *buf)
 935{
 936        struct usb_interface *interface = to_usb_interface(dev);
 937        struct usb_line6_pod *pod = usb_get_intfdata(interface);
 938        return sprintf(buf, "%d\n", pod->device_id);
 939}
 940
 941/*
 942        "read" request on "clip" special file.
 943*/
 944static ssize_t pod_wait_for_clip(struct device *dev,
 945                                 struct device_attribute *attr, char *buf)
 946{
 947        struct usb_interface *interface = to_usb_interface(dev);
 948        struct usb_line6_pod *pod = usb_get_intfdata(interface);
 949        return wait_event_interruptible(pod->clipping.wait,
 950                                        pod->clipping.value != 0);
 951}
 952
 953/*
 954        POD startup procedure.
 955        This is a sequence of functions with special requirements (e.g., must
 956        not run immediately after initialization, must not run in interrupt
 957        context). After the last one has finished, the device is ready to use.
 958*/
 959
 960static void pod_startup1(struct usb_line6_pod *pod)
 961{
 962        CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_INIT);
 963
 964        /* delay startup procedure: */
 965        line6_start_timer(&pod->startup_timer, POD_STARTUP_DELAY, pod_startup2,
 966                          (unsigned long)pod);
 967}
 968
 969static void pod_startup2(unsigned long data)
 970{
 971        struct usb_line6_pod *pod = (struct usb_line6_pod *)data;
 972
 973        /* schedule another startup procedure until startup is complete: */
 974        if (pod->startup_progress >= POD_STARTUP_LAST)
 975                return;
 976
 977        pod->startup_progress = POD_STARTUP_DUMPREQ;
 978        line6_start_timer(&pod->startup_timer, POD_STARTUP_DELAY, pod_startup2,
 979                          (unsigned long)pod);
 980
 981        /* current channel dump: */
 982        line6_dump_request_async(&pod->dumpreq, &pod->line6, 0,
 983                                 LINE6_DUMP_CURRENT);
 984}
 985
 986static void pod_startup3(struct usb_line6_pod *pod)
 987{
 988        struct usb_line6 *line6 = &pod->line6;
 989        CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_VERSIONREQ);
 990
 991        /* request firmware version: */
 992        line6_version_request_async(line6);
 993}
 994
 995static void pod_startup4(struct usb_line6_pod *pod)
 996{
 997        CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_WORKQUEUE);
 998
 999        /* schedule work for global work queue: */
1000        schedule_work(&pod->startup_work);
1001}
1002
1003static void pod_startup5(struct work_struct *work)
1004{
1005        struct usb_line6_pod *pod =
1006            container_of(work, struct usb_line6_pod, startup_work);
1007        struct usb_line6 *line6 = &pod->line6;
1008
1009        CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_SETUP);
1010
1011        /* serial number: */
1012        line6_read_serial_number(&pod->line6, &pod->serial_number);
1013
1014        /* ALSA audio interface: */
1015        line6_register_audio(line6);
1016
1017        /* device files: */
1018        line6_pod_create_files(pod->firmware_version,
1019                               line6->properties->device_bit, line6->ifcdev);
1020}
1021
1022#define POD_GET_SYSTEM_PARAM(code, sign) \
1023static ssize_t pod_get_ ## code(struct device *dev, \
1024                                struct device_attribute *attr, char *buf) \
1025{ \
1026        struct usb_interface *interface = to_usb_interface(dev); \
1027        struct usb_line6_pod *pod = usb_get_intfdata(interface); \
1028        return pod_get_system_param_string(pod, buf, POD_ ## code,      \
1029                                           &pod->code, sign);           \
1030}
1031
1032#define POD_GET_SET_SYSTEM_PARAM(code, mask, sign) \
1033POD_GET_SYSTEM_PARAM(code, sign) \
1034static ssize_t pod_set_ ## code(struct device *dev, \
1035                                struct device_attribute *attr, \
1036                                const char *buf, size_t count) \
1037{ \
1038        struct usb_interface *interface = to_usb_interface(dev); \
1039        struct usb_line6_pod *pod = usb_get_intfdata(interface); \
1040        return pod_set_system_param_string(pod, buf, count, POD_ ## code, mask); \
1041}
1042
1043POD_GET_SET_SYSTEM_PARAM(monitor_level, 0xffff, 0);
1044POD_GET_SET_SYSTEM_PARAM(routing, 0x0003, 0);
1045POD_GET_SET_SYSTEM_PARAM(tuner_mute, 0x0001, 0);
1046POD_GET_SET_SYSTEM_PARAM(tuner_freq, 0xffff, 0);
1047POD_GET_SYSTEM_PARAM(tuner_note, 1);
1048POD_GET_SYSTEM_PARAM(tuner_pitch, 1);
1049
1050#undef GET_SET_SYSTEM_PARAM
1051#undef GET_SYSTEM_PARAM
1052
1053/* POD special files: */
1054static DEVICE_ATTR(channel, S_IWUSR | S_IRUGO, pod_get_channel,
1055                   pod_set_channel);
1056static DEVICE_ATTR(clip, S_IRUGO, pod_wait_for_clip, line6_nop_write);
1057static DEVICE_ATTR(device_id, S_IRUGO, pod_get_device_id, line6_nop_write);
1058static DEVICE_ATTR(dirty, S_IRUGO, pod_get_dirty, line6_nop_write);
1059static DEVICE_ATTR(dump, S_IWUSR | S_IRUGO, pod_get_dump, pod_set_dump);
1060static DEVICE_ATTR(dump_buf, S_IWUSR | S_IRUGO, pod_get_dump_buf,
1061                   pod_set_dump_buf);
1062static DEVICE_ATTR(finish, S_IWUSR, line6_nop_read, pod_set_finish);
1063static DEVICE_ATTR(firmware_version, S_IRUGO, pod_get_firmware_version,
1064                   line6_nop_write);
1065static DEVICE_ATTR(midi_postprocess, S_IWUSR | S_IRUGO,
1066                   pod_get_midi_postprocess, pod_set_midi_postprocess);
1067static DEVICE_ATTR(monitor_level, S_IWUSR | S_IRUGO, pod_get_monitor_level,
1068                   pod_set_monitor_level);
1069static DEVICE_ATTR(name, S_IRUGO, pod_get_name, line6_nop_write);
1070static DEVICE_ATTR(name_buf, S_IRUGO, pod_get_name_buf, line6_nop_write);
1071static DEVICE_ATTR(retrieve_amp_setup, S_IWUSR, line6_nop_read,
1072                   pod_set_retrieve_amp_setup);
1073static DEVICE_ATTR(retrieve_channel, S_IWUSR, line6_nop_read,
1074                   pod_set_retrieve_channel);
1075static DEVICE_ATTR(retrieve_effects_setup, S_IWUSR, line6_nop_read,
1076                   pod_set_retrieve_effects_setup);
1077static DEVICE_ATTR(routing, S_IWUSR | S_IRUGO, pod_get_routing,
1078                   pod_set_routing);
1079static DEVICE_ATTR(serial_number, S_IRUGO, pod_get_serial_number,
1080                   line6_nop_write);
1081static DEVICE_ATTR(store_amp_setup, S_IWUSR, line6_nop_read,
1082                   pod_set_store_amp_setup);
1083static DEVICE_ATTR(store_channel, S_IWUSR, line6_nop_read,
1084                   pod_set_store_channel);
1085static DEVICE_ATTR(store_effects_setup, S_IWUSR, line6_nop_read,
1086                   pod_set_store_effects_setup);
1087static DEVICE_ATTR(tuner_freq, S_IWUSR | S_IRUGO, pod_get_tuner_freq,
1088                   pod_set_tuner_freq);
1089static DEVICE_ATTR(tuner_mute, S_IWUSR | S_IRUGO, pod_get_tuner_mute,
1090                   pod_set_tuner_mute);
1091static DEVICE_ATTR(tuner_note, S_IRUGO, pod_get_tuner_note, line6_nop_write);
1092static DEVICE_ATTR(tuner_pitch, S_IRUGO, pod_get_tuner_pitch, line6_nop_write);
1093
1094#ifdef CONFIG_LINE6_USB_RAW
1095static DEVICE_ATTR(raw, S_IWUSR, line6_nop_read, line6_set_raw);
1096#endif
1097
1098/* control info callback */
1099static int snd_pod_control_monitor_info(struct snd_kcontrol *kcontrol,
1100                                        struct snd_ctl_elem_info *uinfo)
1101{
1102        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1103        uinfo->count = 1;
1104        uinfo->value.integer.min = 0;
1105        uinfo->value.integer.max = 65535;
1106        return 0;
1107}
1108
1109/* control get callback */
1110static int snd_pod_control_monitor_get(struct snd_kcontrol *kcontrol,
1111                                       struct snd_ctl_elem_value *ucontrol)
1112{
1113        struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol);
1114        struct usb_line6_pod *pod = (struct usb_line6_pod *)line6pcm->line6;
1115        ucontrol->value.integer.value[0] = pod->monitor_level.value;
1116        return 0;
1117}
1118
1119/* control put callback */
1120static int snd_pod_control_monitor_put(struct snd_kcontrol *kcontrol,
1121                                       struct snd_ctl_elem_value *ucontrol)
1122{
1123        struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol);
1124        struct usb_line6_pod *pod = (struct usb_line6_pod *)line6pcm->line6;
1125
1126        if (ucontrol->value.integer.value[0] == pod->monitor_level.value)
1127                return 0;
1128
1129        pod->monitor_level.value = ucontrol->value.integer.value[0];
1130        pod_set_system_param_int(pod, ucontrol->value.integer.value[0],
1131                                 POD_monitor_level);
1132        return 1;
1133}
1134
1135/* control definition */
1136static struct snd_kcontrol_new pod_control_monitor = {
1137        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1138        .name = "Monitor Playback Volume",
1139        .index = 0,
1140        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
1141        .info = snd_pod_control_monitor_info,
1142        .get = snd_pod_control_monitor_get,
1143        .put = snd_pod_control_monitor_put
1144};
1145
1146/*
1147        POD destructor.
1148*/
1149static void pod_destruct(struct usb_interface *interface)
1150{
1151        struct usb_line6_pod *pod = usb_get_intfdata(interface);
1152
1153        if (pod == NULL)
1154                return;
1155        line6_cleanup_audio(&pod->line6);
1156
1157        del_timer(&pod->startup_timer);
1158        cancel_work_sync(&pod->startup_work);
1159
1160        /* free dump request data: */
1161        line6_dumpreq_destruct(&pod->dumpreq);
1162}
1163
1164/*
1165        Create sysfs entries.
1166*/
1167static int pod_create_files2(struct device *dev)
1168{
1169        int err;
1170
1171        CHECK_RETURN(device_create_file(dev, &dev_attr_channel));
1172        CHECK_RETURN(device_create_file(dev, &dev_attr_clip));
1173        CHECK_RETURN(device_create_file(dev, &dev_attr_device_id));
1174        CHECK_RETURN(device_create_file(dev, &dev_attr_dirty));
1175        CHECK_RETURN(device_create_file(dev, &dev_attr_dump));
1176        CHECK_RETURN(device_create_file(dev, &dev_attr_dump_buf));
1177        CHECK_RETURN(device_create_file(dev, &dev_attr_finish));
1178        CHECK_RETURN(device_create_file(dev, &dev_attr_firmware_version));
1179        CHECK_RETURN(device_create_file(dev, &dev_attr_midi_postprocess));
1180        CHECK_RETURN(device_create_file(dev, &dev_attr_monitor_level));
1181        CHECK_RETURN(device_create_file(dev, &dev_attr_name));
1182        CHECK_RETURN(device_create_file(dev, &dev_attr_name_buf));
1183        CHECK_RETURN(device_create_file(dev, &dev_attr_retrieve_amp_setup));
1184        CHECK_RETURN(device_create_file(dev, &dev_attr_retrieve_channel));
1185        CHECK_RETURN(device_create_file(dev, &dev_attr_retrieve_effects_setup));
1186        CHECK_RETURN(device_create_file(dev, &dev_attr_routing));
1187        CHECK_RETURN(device_create_file(dev, &dev_attr_serial_number));
1188        CHECK_RETURN(device_create_file(dev, &dev_attr_store_amp_setup));
1189        CHECK_RETURN(device_create_file(dev, &dev_attr_store_channel));
1190        CHECK_RETURN(device_create_file(dev, &dev_attr_store_effects_setup));
1191        CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_freq));
1192        CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_mute));
1193        CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_note));
1194        CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_pitch));
1195
1196#ifdef CONFIG_LINE6_USB_RAW
1197        CHECK_RETURN(device_create_file(dev, &dev_attr_raw));
1198#endif
1199
1200        return 0;
1201}
1202
1203/*
1204         Try to init POD device.
1205*/
1206static int pod_try_init(struct usb_interface *interface,
1207                        struct usb_line6_pod *pod)
1208{
1209        int err;
1210        struct usb_line6 *line6 = &pod->line6;
1211
1212        init_timer(&pod->startup_timer);
1213        INIT_WORK(&pod->startup_work, pod_startup5);
1214
1215        if ((interface == NULL) || (pod == NULL))
1216                return -ENODEV;
1217
1218        pod->channel_num = 255;
1219
1220        /* initialize wait queues: */
1221        init_waitqueue_head(&pod->monitor_level.wait);
1222        init_waitqueue_head(&pod->routing.wait);
1223        init_waitqueue_head(&pod->tuner_mute.wait);
1224        init_waitqueue_head(&pod->tuner_freq.wait);
1225        init_waitqueue_head(&pod->tuner_note.wait);
1226        init_waitqueue_head(&pod->tuner_pitch.wait);
1227        init_waitqueue_head(&pod->clipping.wait);
1228
1229        memset(pod->param_dirty, 0xff, sizeof(pod->param_dirty));
1230
1231        /* initialize USB buffers: */
1232        err = line6_dumpreq_init(&pod->dumpreq, pod_request_channel,
1233                                 sizeof(pod_request_channel));
1234        if (err < 0) {
1235                dev_err(&interface->dev, "Out of memory\n");
1236                return -ENOMEM;
1237        }
1238
1239        /* create sysfs entries: */
1240        err = pod_create_files2(&interface->dev);
1241        if (err < 0)
1242                return err;
1243
1244        /* initialize audio system: */
1245        err = line6_init_audio(line6);
1246        if (err < 0)
1247                return err;
1248
1249        /* initialize MIDI subsystem: */
1250        err = line6_init_midi(line6);
1251        if (err < 0)
1252                return err;
1253
1254        /* initialize PCM subsystem: */
1255        err = line6_init_pcm(line6, &pod_pcm_properties);
1256        if (err < 0)
1257                return err;
1258
1259        /* register monitor control: */
1260        err = snd_ctl_add(line6->card,
1261                          snd_ctl_new1(&pod_control_monitor, line6->line6pcm));
1262        if (err < 0)
1263                return err;
1264
1265        /*
1266           When the sound card is registered at this point, the PODxt Live
1267           displays "Invalid Code Error 07", so we do it later in the event
1268           handler.
1269         */
1270
1271        if (pod->line6.properties->capabilities & LINE6_BIT_CONTROL) {
1272                pod->monitor_level.value = POD_system_invalid;
1273
1274                /* initiate startup procedure: */
1275                pod_startup1(pod);
1276        }
1277
1278        return 0;
1279}
1280
1281/*
1282         Init POD device (and clean up in case of failure).
1283*/
1284int line6_pod_init(struct usb_interface *interface, struct usb_line6_pod *pod)
1285{
1286        int err = pod_try_init(interface, pod);
1287
1288        if (err < 0)
1289                pod_destruct(interface);
1290
1291        return err;
1292}
1293
1294/*
1295        POD device disconnected.
1296*/
1297void line6_pod_disconnect(struct usb_interface *interface)
1298{
1299        struct usb_line6_pod *pod;
1300
1301        if (interface == NULL)
1302                return;
1303        pod = usb_get_intfdata(interface);
1304
1305        if (pod != NULL) {
1306                struct snd_line6_pcm *line6pcm = pod->line6.line6pcm;
1307                struct device *dev = &interface->dev;
1308
1309                if (line6pcm != NULL)
1310                        line6_pcm_disconnect(line6pcm);
1311
1312                if (dev != NULL) {
1313                        /* remove sysfs entries: */
1314                        line6_pod_remove_files(pod->firmware_version,
1315                                               pod->line6.
1316                                               properties->device_bit, dev);
1317
1318                        device_remove_file(dev, &dev_attr_channel);
1319                        device_remove_file(dev, &dev_attr_clip);
1320                        device_remove_file(dev, &dev_attr_device_id);
1321                        device_remove_file(dev, &dev_attr_dirty);
1322                        device_remove_file(dev, &dev_attr_dump);
1323                        device_remove_file(dev, &dev_attr_dump_buf);
1324                        device_remove_file(dev, &dev_attr_finish);
1325                        device_remove_file(dev, &dev_attr_firmware_version);
1326                        device_remove_file(dev, &dev_attr_midi_postprocess);
1327                        device_remove_file(dev, &dev_attr_monitor_level);
1328                        device_remove_file(dev, &dev_attr_name);
1329                        device_remove_file(dev, &dev_attr_name_buf);
1330                        device_remove_file(dev, &dev_attr_retrieve_amp_setup);
1331                        device_remove_file(dev, &dev_attr_retrieve_channel);
1332                        device_remove_file(dev,
1333                                           &dev_attr_retrieve_effects_setup);
1334                        device_remove_file(dev, &dev_attr_routing);
1335                        device_remove_file(dev, &dev_attr_serial_number);
1336                        device_remove_file(dev, &dev_attr_store_amp_setup);
1337                        device_remove_file(dev, &dev_attr_store_channel);
1338                        device_remove_file(dev, &dev_attr_store_effects_setup);
1339                        device_remove_file(dev, &dev_attr_tuner_freq);
1340                        device_remove_file(dev, &dev_attr_tuner_mute);
1341                        device_remove_file(dev, &dev_attr_tuner_note);
1342                        device_remove_file(dev, &dev_attr_tuner_pitch);
1343
1344#ifdef CONFIG_LINE6_USB_RAW
1345                        device_remove_file(dev, &dev_attr_raw);
1346#endif
1347                }
1348        }
1349
1350        pod_destruct(interface);
1351}
1352