Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.9.
   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	struct usb_line6 *line6;
1153
1154	if (pod == NULL)
1155		return;
1156	line6 = &pod->line6;
1157	if (line6 == NULL)
1158		return;
1159	line6_cleanup_audio(line6);
1160
1161	del_timer(&pod->startup_timer);
1162	cancel_work_sync(&pod->startup_work);
1163
1164	/* free dump request data: */
1165	line6_dumpreq_destruct(&pod->dumpreq);
1166}
1167
1168/*
1169	Create sysfs entries.
1170*/
1171static int pod_create_files2(struct device *dev)
1172{
1173	int err;
1174
1175	CHECK_RETURN(device_create_file(dev, &dev_attr_channel));
1176	CHECK_RETURN(device_create_file(dev, &dev_attr_clip));
1177	CHECK_RETURN(device_create_file(dev, &dev_attr_device_id));
1178	CHECK_RETURN(device_create_file(dev, &dev_attr_dirty));
1179	CHECK_RETURN(device_create_file(dev, &dev_attr_dump));
1180	CHECK_RETURN(device_create_file(dev, &dev_attr_dump_buf));
1181	CHECK_RETURN(device_create_file(dev, &dev_attr_finish));
1182	CHECK_RETURN(device_create_file(dev, &dev_attr_firmware_version));
1183	CHECK_RETURN(device_create_file(dev, &dev_attr_midi_postprocess));
1184	CHECK_RETURN(device_create_file(dev, &dev_attr_monitor_level));
1185	CHECK_RETURN(device_create_file(dev, &dev_attr_name));
1186	CHECK_RETURN(device_create_file(dev, &dev_attr_name_buf));
1187	CHECK_RETURN(device_create_file(dev, &dev_attr_retrieve_amp_setup));
1188	CHECK_RETURN(device_create_file(dev, &dev_attr_retrieve_channel));
1189	CHECK_RETURN(device_create_file(dev, &dev_attr_retrieve_effects_setup));
1190	CHECK_RETURN(device_create_file(dev, &dev_attr_routing));
1191	CHECK_RETURN(device_create_file(dev, &dev_attr_serial_number));
1192	CHECK_RETURN(device_create_file(dev, &dev_attr_store_amp_setup));
1193	CHECK_RETURN(device_create_file(dev, &dev_attr_store_channel));
1194	CHECK_RETURN(device_create_file(dev, &dev_attr_store_effects_setup));
1195	CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_freq));
1196	CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_mute));
1197	CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_note));
1198	CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_pitch));
1199
1200#ifdef CONFIG_LINE6_USB_RAW
1201	CHECK_RETURN(device_create_file(dev, &dev_attr_raw));
1202#endif
1203
1204	return 0;
1205}
1206
1207/*
1208	 Try to init POD device.
1209*/
1210static int pod_try_init(struct usb_interface *interface,
1211			struct usb_line6_pod *pod)
1212{
1213	int err;
1214	struct usb_line6 *line6 = &pod->line6;
1215
1216	init_timer(&pod->startup_timer);
1217	INIT_WORK(&pod->startup_work, pod_startup5);
1218
1219	if ((interface == NULL) || (pod == NULL))
1220		return -ENODEV;
1221
1222	pod->channel_num = 255;
1223
1224	/* initialize wait queues: */
1225	init_waitqueue_head(&pod->monitor_level.wait);
1226	init_waitqueue_head(&pod->routing.wait);
1227	init_waitqueue_head(&pod->tuner_mute.wait);
1228	init_waitqueue_head(&pod->tuner_freq.wait);
1229	init_waitqueue_head(&pod->tuner_note.wait);
1230	init_waitqueue_head(&pod->tuner_pitch.wait);
1231	init_waitqueue_head(&pod->clipping.wait);
1232
1233	memset(pod->param_dirty, 0xff, sizeof(pod->param_dirty));
1234
1235	/* initialize USB buffers: */
1236	err = line6_dumpreq_init(&pod->dumpreq, pod_request_channel,
1237				 sizeof(pod_request_channel));
1238	if (err < 0) {
1239		dev_err(&interface->dev, "Out of memory\n");
1240		return -ENOMEM;
1241	}
1242
1243	/* create sysfs entries: */
1244	err = pod_create_files2(&interface->dev);
1245	if (err < 0)
1246		return err;
1247
1248	/* initialize audio system: */
1249	err = line6_init_audio(line6);
1250	if (err < 0)
1251		return err;
1252
1253	/* initialize MIDI subsystem: */
1254	err = line6_init_midi(line6);
1255	if (err < 0)
1256		return err;
1257
1258	/* initialize PCM subsystem: */
1259	err = line6_init_pcm(line6, &pod_pcm_properties);
1260	if (err < 0)
1261		return err;
1262
1263	/* register monitor control: */
1264	err = snd_ctl_add(line6->card,
1265			  snd_ctl_new1(&pod_control_monitor, line6->line6pcm));
1266	if (err < 0)
1267		return err;
1268
1269	/*
1270	   When the sound card is registered at this point, the PODxt Live
1271	   displays "Invalid Code Error 07", so we do it later in the event
1272	   handler.
1273	 */
1274
1275	if (pod->line6.properties->capabilities & LINE6_BIT_CONTROL) {
1276		pod->monitor_level.value = POD_system_invalid;
1277
1278		/* initiate startup procedure: */
1279		pod_startup1(pod);
1280	}
1281
1282	return 0;
1283}
1284
1285/*
1286	 Init POD device (and clean up in case of failure).
1287*/
1288int line6_pod_init(struct usb_interface *interface, struct usb_line6_pod *pod)
1289{
1290	int err = pod_try_init(interface, pod);
1291
1292	if (err < 0)
1293		pod_destruct(interface);
1294
1295	return err;
1296}
1297
1298/*
1299	POD device disconnected.
1300*/
1301void line6_pod_disconnect(struct usb_interface *interface)
1302{
1303	struct usb_line6_pod *pod;
1304
1305	if (interface == NULL)
1306		return;
1307	pod = usb_get_intfdata(interface);
1308
1309	if (pod != NULL) {
1310		struct snd_line6_pcm *line6pcm = pod->line6.line6pcm;
1311		struct device *dev = &interface->dev;
1312
1313		if (line6pcm != NULL)
1314			line6_pcm_disconnect(line6pcm);
1315
1316		if (dev != NULL) {
1317			/* remove sysfs entries: */
1318			line6_pod_remove_files(pod->firmware_version,
1319					       pod->line6.
1320					       properties->device_bit, dev);
1321
1322			device_remove_file(dev, &dev_attr_channel);
1323			device_remove_file(dev, &dev_attr_clip);
1324			device_remove_file(dev, &dev_attr_device_id);
1325			device_remove_file(dev, &dev_attr_dirty);
1326			device_remove_file(dev, &dev_attr_dump);
1327			device_remove_file(dev, &dev_attr_dump_buf);
1328			device_remove_file(dev, &dev_attr_finish);
1329			device_remove_file(dev, &dev_attr_firmware_version);
1330			device_remove_file(dev, &dev_attr_midi_postprocess);
1331			device_remove_file(dev, &dev_attr_monitor_level);
1332			device_remove_file(dev, &dev_attr_name);
1333			device_remove_file(dev, &dev_attr_name_buf);
1334			device_remove_file(dev, &dev_attr_retrieve_amp_setup);
1335			device_remove_file(dev, &dev_attr_retrieve_channel);
1336			device_remove_file(dev,
1337					   &dev_attr_retrieve_effects_setup);
1338			device_remove_file(dev, &dev_attr_routing);
1339			device_remove_file(dev, &dev_attr_serial_number);
1340			device_remove_file(dev, &dev_attr_store_amp_setup);
1341			device_remove_file(dev, &dev_attr_store_channel);
1342			device_remove_file(dev, &dev_attr_store_effects_setup);
1343			device_remove_file(dev, &dev_attr_tuner_freq);
1344			device_remove_file(dev, &dev_attr_tuner_mute);
1345			device_remove_file(dev, &dev_attr_tuner_note);
1346			device_remove_file(dev, &dev_attr_tuner_pitch);
1347
1348#ifdef CONFIG_LINE6_USB_RAW
1349			device_remove_file(dev, &dev_attr_raw);
1350#endif
1351		}
1352	}
1353
1354	pod_destruct(interface);
1355}