2 * Line6 Linux USB driver - 0.9.1beta
4 * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
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.
12 #include <linux/slab.h>
13 #include <linux/wait.h>
14 #include <sound/control.h>
23 #define POD_SYSEX_CODE 3
24 #define POD_BYTES_PER_FRAME 6 /* 24bit audio (stereo) */
29 POD_SYSEX_SAVE = 0x24,
30 POD_SYSEX_SYSTEM = 0x56,
31 POD_SYSEX_SYSTEMREQ = 0x57,
32 /* POD_SYSEX_UPDATE = 0x6c, */ /* software update! */
33 POD_SYSEX_STORE = 0x71,
34 POD_SYSEX_FINISH = 0x72,
35 POD_SYSEX_DUMPMEM = 0x73,
36 POD_SYSEX_DUMP = 0x74,
37 POD_SYSEX_DUMPREQ = 0x75
38 /* POD_SYSEX_DUMPMEM2 = 0x76 */ /* dumps entire internal memory of PODxt Pro */
42 POD_monitor_level = 0x04,
44 POD_tuner_mute = 0x13,
45 POD_tuner_freq = 0x15,
46 POD_tuner_note = 0x16,
47 POD_tuner_pitch = 0x17,
48 POD_system_invalid = 0x10000
65 static struct snd_ratden pod_ratden = {
72 static struct line6_pcm_properties pod_pcm_properties = {
73 .snd_line6_playback_hw = {
74 .info = (SNDRV_PCM_INFO_MMAP |
75 SNDRV_PCM_INFO_INTERLEAVED |
76 SNDRV_PCM_INFO_BLOCK_TRANSFER |
77 SNDRV_PCM_INFO_MMAP_VALID |
78 SNDRV_PCM_INFO_PAUSE |
80 SNDRV_PCM_INFO_RESUME |
82 SNDRV_PCM_INFO_SYNC_START),
83 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
84 .rates = SNDRV_PCM_RATE_KNOT,
89 .buffer_bytes_max = 60000,
90 .period_bytes_min = 64,
91 .period_bytes_max = 8192,
94 .snd_line6_capture_hw = {
95 .info = (SNDRV_PCM_INFO_MMAP |
96 SNDRV_PCM_INFO_INTERLEAVED |
97 SNDRV_PCM_INFO_BLOCK_TRANSFER |
98 SNDRV_PCM_INFO_MMAP_VALID |
100 SNDRV_PCM_INFO_RESUME |
102 SNDRV_PCM_INFO_SYNC_START),
103 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
104 .rates = SNDRV_PCM_RATE_KNOT,
109 .buffer_bytes_max = 60000,
110 .period_bytes_min = 64,
111 .period_bytes_max = 8192,
113 .periods_max = 1024},
116 .rats = &pod_ratden},
117 .bytes_per_frame = POD_BYTES_PER_FRAME
120 static const char pod_request_channel[] = {
121 0xf0, 0x00, 0x01, 0x0c, 0x03, 0x75, 0xf7
124 static const char pod_version_header[] = {
125 0xf2, 0x7e, 0x7f, 0x06, 0x02
128 /* forward declarations: */
129 static void pod_startup2(unsigned long data);
130 static void pod_startup3(struct usb_line6_pod *pod);
131 static void pod_startup4(struct usb_line6_pod *pod);
133 static char *pod_alloc_sysex_buffer(struct usb_line6_pod *pod, int code,
136 return line6_alloc_sysex_buffer(&pod->line6, POD_SYSEX_CODE, code,
141 Store parameter value in driver memory.
143 static void pod_store_parameter(struct usb_line6_pod *pod, int param, int value)
145 pod->prog_data.control[param] = value;
151 static void pod_save_button_pressed(struct usb_line6_pod *pod, int type,
154 set_bit(POD_SAVE_PRESSED, &pod->atomic_flags);
158 Process a completely received message.
160 void line6_pod_process_message(struct usb_line6_pod *pod)
162 const unsigned char *buf = pod->line6.buffer_message;
164 /* filter messages by type */
165 switch (buf[0] & 0xf0) {
166 case LINE6_PARAM_CHANGE:
167 case LINE6_PROGRAM_CHANGE:
168 case LINE6_SYSEX_BEGIN:
169 break; /* handle these further down */
172 return; /* ignore all others */
175 /* process all remaining messages */
177 case LINE6_PARAM_CHANGE | LINE6_CHANNEL_DEVICE:
178 pod_store_parameter(pod, buf[1], buf[2]);
179 /* intentionally no break here! */
181 case LINE6_PARAM_CHANGE | LINE6_CHANNEL_HOST:
182 if ((buf[1] == POD_amp_model_setup) ||
183 (buf[1] == POD_effect_setup))
184 /* these also affect other settings */
185 line6_dump_request_async(&pod->dumpreq, &pod->line6, 0,
190 case LINE6_PROGRAM_CHANGE | LINE6_CHANNEL_DEVICE:
191 case LINE6_PROGRAM_CHANGE | LINE6_CHANNEL_HOST:
192 set_bit(POD_CHANNEL_DIRTY, &pod->atomic_flags);
193 line6_dump_request_async(&pod->dumpreq, &pod->line6, 0,
197 case LINE6_SYSEX_BEGIN | LINE6_CHANNEL_DEVICE:
198 case LINE6_SYSEX_BEGIN | LINE6_CHANNEL_UNKNOWN:
199 if (memcmp(buf + 1, line6_midi_id, sizeof(line6_midi_id)) == 0) {
202 if (pod->line6.message_length ==
203 sizeof(pod->prog_data) + 7) {
204 switch (pod->dumpreq.in_progress) {
205 case LINE6_DUMP_CURRENT:
206 memcpy(&pod->prog_data, buf + 7,
207 sizeof(pod->prog_data));
210 case POD_DUMP_MEMORY:
211 memcpy(&pod->prog_data_buf,
214 (pod->prog_data_buf));
218 dev_dbg(pod->line6.ifcdev,
219 "unknown dump code %02X\n",
220 pod->dumpreq.in_progress);
223 line6_dump_finished(&pod->dumpreq);
226 dev_dbg(pod->line6.ifcdev,
227 "wrong size of channel dump message (%d instead of %d)\n",
228 pod->line6.message_length,
229 (int)sizeof(pod->prog_data) +
234 case POD_SYSEX_SYSTEM:{
236 ((int)buf[7] << 12) | ((int)buf[8]
238 ((int)buf[9] << 4) | (int)buf[10];
240 #define PROCESS_SYSTEM_PARAM(x) \
242 pod->x.value = value; \
243 wake_up(&pod->x.wait); \
247 case POD_monitor_level:
248 pod->monitor_level = value;
251 PROCESS_SYSTEM_PARAM(routing);
261 #undef PROCESS_SYSTEM_PARAM
264 dev_dbg(pod->line6.ifcdev,
265 "unknown tuner/system response %02X\n",
272 case POD_SYSEX_FINISH:
273 /* do we need to respond to this? */
277 pod_save_button_pressed(pod, buf[6], buf[7]);
280 case POD_SYSEX_STORE:
281 dev_dbg(pod->line6.ifcdev,
282 "message %02X not yet implemented\n",
287 dev_dbg(pod->line6.ifcdev,
288 "unknown sysex message %02X\n",
293 (buf, pod_version_header,
294 sizeof(pod_version_header)) == 0) {
295 pod->firmware_version =
296 buf[13] * 100 + buf[14] * 10 + buf[15];
298 ((int)buf[8] << 16) | ((int)buf[9] << 8) | (int)
302 dev_dbg(pod->line6.ifcdev, "unknown sysex header\n");
306 case LINE6_SYSEX_END:
310 dev_dbg(pod->line6.ifcdev, "POD: unknown message %02X\n",
316 Detect some cases that require a channel dump after sending a command to the
317 device. Important notes:
318 *) The actual dump request can not be sent here since we are not allowed to
319 wait for the completion of the first message in this context, and sending
320 the dump request before completion of the previous message leaves the POD
321 in an undefined state. The dump request will be sent when the echoed
322 commands are received.
323 *) This method fails if a param change message is "chopped" after the first
326 void line6_pod_midi_postprocess(struct usb_line6_pod *pod, unsigned char *data,
331 if (!pod->midi_postprocess)
334 for (i = 0; i < length; ++i) {
335 if (data[i] == (LINE6_PROGRAM_CHANGE | LINE6_CHANNEL_HOST)) {
336 line6_invalidate_current(&pod->dumpreq);
339 if ((data[i] == (LINE6_PARAM_CHANGE | LINE6_CHANNEL_HOST))
341 if ((data[i + 1] == POD_amp_model_setup)
342 || (data[i + 1] == POD_effect_setup)) {
343 line6_invalidate_current(&pod->dumpreq);
350 Transmit PODxt Pro control parameter.
352 void line6_pod_transmit_parameter(struct usb_line6_pod *pod, int param,
355 if (line6_transmit_parameter(&pod->line6, param, value) == 0)
356 pod_store_parameter(pod, param, value);
358 if ((param == POD_amp_model_setup) || (param == POD_effect_setup)) /* these also affect other settings */
359 line6_invalidate_current(&pod->dumpreq);
363 Resolve value to memory location.
365 static int pod_resolve(const char *buf, short block0, short block1,
366 unsigned char *location)
372 ret = kstrtou8(buf, 10, &value);
376 block = (value < 0x40) ? block0 : block1;
378 location[0] = block >> 7;
379 location[1] = value | (block & 0x7f);
384 Send command to retrieve channel/effects setup/amp setup to PODxt Pro.
386 static ssize_t pod_send_retrieve_command(struct device *dev, const char *buf,
387 size_t count, short block0,
390 struct usb_interface *interface = to_usb_interface(dev);
391 struct usb_line6_pod *pod = usb_get_intfdata(interface);
394 char *sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_DUMPMEM, size);
399 ret = pod_resolve(buf, block0, block1, sysex + SYSEX_DATA_OFS);
404 sysex[SYSEX_DATA_OFS + 2] = 0;
405 sysex[SYSEX_DATA_OFS + 3] = 0;
406 line6_dump_started(&pod->dumpreq, POD_DUMP_MEMORY);
408 if (line6_send_sysex_message(&pod->line6, sysex, size) < size)
409 line6_dump_finished(&pod->dumpreq);
412 /* needs some delay here on AMD64 platform */
417 Identify system parameters related to the tuner.
419 static bool pod_is_tuner(int code)
422 (code == POD_tuner_mute) ||
423 (code == POD_tuner_freq) ||
424 (code == POD_tuner_note) || (code == POD_tuner_pitch);
428 Get system parameter (as integer).
429 @param tuner non-zero, if code refers to a tuner parameter
431 static int pod_get_system_param_int(struct usb_line6_pod *pod, int *value,
432 int code, struct ValueWait *param, int sign)
435 static const int size = 1;
438 if (((pod->prog_data.control[POD_tuner] & 0x40) == 0)
439 && pod_is_tuner(code))
442 /* send value request to device: */
443 param->value = POD_system_invalid;
444 sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_SYSTEMREQ, size);
449 sysex[SYSEX_DATA_OFS] = code;
450 line6_send_sysex_message(&pod->line6, sysex, size);
453 /* wait for device to respond: */
455 wait_event_interruptible(param->wait,
456 param->value != POD_system_invalid);
461 *value = sign ? (int)(signed short)param->value : (int)(unsigned short)
464 if (*value == POD_system_invalid)
465 *value = 0; /* don't report uninitialized values */
471 Get system parameter (as string).
472 @param tuner non-zero, if code refers to a tuner parameter
474 static ssize_t pod_get_system_param_string(struct usb_line6_pod *pod, char *buf,
475 int code, struct ValueWait *param,
478 int retval, value = 0;
479 retval = pod_get_system_param_int(pod, &value, code, param, sign);
484 return sprintf(buf, "%d\n", value);
488 Send system parameter (from integer).
489 @param tuner non-zero, if code refers to a tuner parameter
491 static int pod_set_system_param_int(struct usb_line6_pod *pod, int value,
495 static const int size = 5;
497 if (((pod->prog_data.control[POD_tuner] & 0x40) == 0)
498 && pod_is_tuner(code))
501 /* send value to tuner: */
502 sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_SYSTEM, size);
505 sysex[SYSEX_DATA_OFS] = code;
506 sysex[SYSEX_DATA_OFS + 1] = (value >> 12) & 0x0f;
507 sysex[SYSEX_DATA_OFS + 2] = (value >> 8) & 0x0f;
508 sysex[SYSEX_DATA_OFS + 3] = (value >> 4) & 0x0f;
509 sysex[SYSEX_DATA_OFS + 4] = (value) & 0x0f;
510 line6_send_sysex_message(&pod->line6, sysex, size);
516 Send system parameter (from string).
517 @param tuner non-zero, if code refers to a tuner parameter
519 static ssize_t pod_set_system_param_string(struct usb_line6_pod *pod,
520 const char *buf, int count, int code,
524 unsigned short value = simple_strtoul(buf, NULL, 10) & mask;
525 retval = pod_set_system_param_int(pod, value, code);
526 return (retval < 0) ? retval : count;
530 "write" request on "finish" special file.
532 static ssize_t pod_set_finish(struct device *dev,
533 struct device_attribute *attr,
534 const char *buf, size_t count)
536 struct usb_interface *interface = to_usb_interface(dev);
537 struct usb_line6_pod *pod = usb_get_intfdata(interface);
539 char *sysex = pod_alloc_sysex_buffer(pod, POD_SYSEX_FINISH, size);
542 line6_send_sysex_message(&pod->line6, sysex, size);
548 "write" request on "store_channel" special file.
550 static ssize_t pod_set_store_channel(struct device *dev,
551 struct device_attribute *attr,
552 const char *buf, size_t count)
554 return pod_send_store_command(dev, buf, count, 0x0000, 0x00c0);
558 "write" request on "store_effects_setup" special file.
560 static ssize_t pod_set_store_effects_setup(struct device *dev,
561 struct device_attribute *attr,
562 const char *buf, size_t count)
564 return pod_send_store_command(dev, buf, count, 0x0080, 0x0080);
568 "read" request on "midi_postprocess" special file.
570 static ssize_t pod_get_midi_postprocess(struct device *dev,
571 struct device_attribute *attr,
574 struct usb_interface *interface = to_usb_interface(dev);
575 struct usb_line6_pod *pod = usb_get_intfdata(interface);
576 return sprintf(buf, "%d\n", pod->midi_postprocess);
580 "write" request on "midi_postprocess" special file.
582 static ssize_t pod_set_midi_postprocess(struct device *dev,
583 struct device_attribute *attr,
584 const char *buf, size_t count)
586 struct usb_interface *interface = to_usb_interface(dev);
587 struct usb_line6_pod *pod = usb_get_intfdata(interface);
591 ret = kstrtou8(buf, 10, &value);
595 pod->midi_postprocess = value ? 1 : 0;
600 "read" request on "serial_number" special file.
602 static ssize_t pod_get_serial_number(struct device *dev,
603 struct device_attribute *attr, char *buf)
605 struct usb_interface *interface = to_usb_interface(dev);
606 struct usb_line6_pod *pod = usb_get_intfdata(interface);
607 return sprintf(buf, "%d\n", pod->serial_number);
611 "read" request on "firmware_version" special file.
613 static ssize_t pod_get_firmware_version(struct device *dev,
614 struct device_attribute *attr,
617 struct usb_interface *interface = to_usb_interface(dev);
618 struct usb_line6_pod *pod = usb_get_intfdata(interface);
619 return sprintf(buf, "%d.%02d\n", pod->firmware_version / 100,
620 pod->firmware_version % 100);
624 "read" request on "device_id" special file.
626 static ssize_t pod_get_device_id(struct device *dev,
627 struct device_attribute *attr, char *buf)
629 struct usb_interface *interface = to_usb_interface(dev);
630 struct usb_line6_pod *pod = usb_get_intfdata(interface);
631 return sprintf(buf, "%d\n", pod->device_id);
635 POD startup procedure.
636 This is a sequence of functions with special requirements (e.g., must
637 not run immediately after initialization, must not run in interrupt
638 context). After the last one has finished, the device is ready to use.
641 static void pod_startup1(struct usb_line6_pod *pod)
643 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_INIT);
645 /* delay startup procedure: */
646 line6_start_timer(&pod->startup_timer, POD_STARTUP_DELAY, pod_startup2,
650 static void pod_startup2(unsigned long data)
652 struct usb_line6_pod *pod = (struct usb_line6_pod *)data;
654 /* schedule another startup procedure until startup is complete: */
655 if (pod->startup_progress >= POD_STARTUP_LAST)
658 pod->startup_progress = POD_STARTUP_DUMPREQ;
659 line6_start_timer(&pod->startup_timer, POD_STARTUP_DELAY, pod_startup2,
662 /* current channel dump: */
663 line6_dump_request_async(&pod->dumpreq, &pod->line6, 0,
667 static void pod_startup3(struct usb_line6_pod *pod)
669 struct usb_line6 *line6 = &pod->line6;
670 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_VERSIONREQ);
672 /* request firmware version: */
673 line6_version_request_async(line6);
676 static void pod_startup4(struct usb_line6_pod *pod)
678 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_WORKQUEUE);
680 /* schedule work for global work queue: */
681 schedule_work(&pod->startup_work);
684 static void pod_startup5(struct work_struct *work)
686 struct usb_line6_pod *pod =
687 container_of(work, struct usb_line6_pod, startup_work);
688 struct usb_line6 *line6 = &pod->line6;
690 CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_SETUP);
693 line6_read_serial_number(&pod->line6, &pod->serial_number);
695 /* ALSA audio interface: */
696 line6_register_audio(line6);
699 line6_pod_create_files(pod->firmware_version,
700 line6->properties->device_bit, line6->ifcdev);
703 #define POD_GET_SYSTEM_PARAM(code, sign) \
704 static ssize_t pod_get_ ## code(struct device *dev, \
705 struct device_attribute *attr, char *buf) \
707 struct usb_interface *interface = to_usb_interface(dev); \
708 struct usb_line6_pod *pod = usb_get_intfdata(interface); \
709 return pod_get_system_param_string(pod, buf, POD_ ## code, \
713 #define POD_GET_SET_SYSTEM_PARAM(code, mask, sign) \
714 POD_GET_SYSTEM_PARAM(code, sign) \
715 static ssize_t pod_set_ ## code(struct device *dev, \
716 struct device_attribute *attr, \
717 const char *buf, size_t count) \
719 struct usb_interface *interface = to_usb_interface(dev); \
720 struct usb_line6_pod *pod = usb_get_intfdata(interface); \
721 return pod_set_system_param_string(pod, buf, count, POD_ ## code, mask); \
724 POD_GET_SET_SYSTEM_PARAM(routing, 0x0003, 0);
725 POD_GET_SET_SYSTEM_PARAM(tuner_mute, 0x0001, 0);
726 POD_GET_SET_SYSTEM_PARAM(tuner_freq, 0xffff, 0);
727 POD_GET_SYSTEM_PARAM(tuner_note, 1);
728 POD_GET_SYSTEM_PARAM(tuner_pitch, 1);
730 #undef GET_SET_SYSTEM_PARAM
731 #undef GET_SYSTEM_PARAM
733 /* POD special files: */
734 static DEVICE_ATTR(device_id, S_IRUGO, pod_get_device_id, line6_nop_write);
735 static DEVICE_ATTR(finish, S_IWUSR, line6_nop_read, pod_set_finish);
736 static DEVICE_ATTR(firmware_version, S_IRUGO, pod_get_firmware_version,
738 static DEVICE_ATTR(midi_postprocess, S_IWUSR | S_IRUGO,
739 pod_get_midi_postprocess, pod_set_midi_postprocess);
740 static DEVICE_ATTR(routing, S_IWUSR | S_IRUGO, pod_get_routing,
742 static DEVICE_ATTR(serial_number, S_IRUGO, pod_get_serial_number,
744 static DEVICE_ATTR(store_channel, S_IWUSR, line6_nop_read,
745 pod_set_store_channel);
746 static DEVICE_ATTR(store_effects_setup, S_IWUSR, line6_nop_read,
747 pod_set_store_effects_setup);
748 static DEVICE_ATTR(tuner_freq, S_IWUSR | S_IRUGO, pod_get_tuner_freq,
750 static DEVICE_ATTR(tuner_mute, S_IWUSR | S_IRUGO, pod_get_tuner_mute,
752 static DEVICE_ATTR(tuner_note, S_IRUGO, pod_get_tuner_note, line6_nop_write);
753 static DEVICE_ATTR(tuner_pitch, S_IRUGO, pod_get_tuner_pitch, line6_nop_write);
755 #ifdef CONFIG_LINE6_USB_RAW
756 static DEVICE_ATTR(raw, S_IWUSR, line6_nop_read, line6_set_raw);
759 /* control info callback */
760 static int snd_pod_control_monitor_info(struct snd_kcontrol *kcontrol,
761 struct snd_ctl_elem_info *uinfo)
763 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
765 uinfo->value.integer.min = 0;
766 uinfo->value.integer.max = 65535;
770 /* control get callback */
771 static int snd_pod_control_monitor_get(struct snd_kcontrol *kcontrol,
772 struct snd_ctl_elem_value *ucontrol)
774 struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol);
775 struct usb_line6_pod *pod = (struct usb_line6_pod *)line6pcm->line6;
776 ucontrol->value.integer.value[0] = pod->monitor_level;
780 /* control put callback */
781 static int snd_pod_control_monitor_put(struct snd_kcontrol *kcontrol,
782 struct snd_ctl_elem_value *ucontrol)
784 struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol);
785 struct usb_line6_pod *pod = (struct usb_line6_pod *)line6pcm->line6;
787 if (ucontrol->value.integer.value[0] == pod->monitor_level)
790 pod->monitor_level = ucontrol->value.integer.value[0];
791 pod_set_system_param_int(pod, ucontrol->value.integer.value[0],
796 /* control definition */
797 static struct snd_kcontrol_new pod_control_monitor = {
798 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
799 .name = "Monitor Playback Volume",
801 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
802 .info = snd_pod_control_monitor_info,
803 .get = snd_pod_control_monitor_get,
804 .put = snd_pod_control_monitor_put
810 static void pod_destruct(struct usb_interface *interface)
812 struct usb_line6_pod *pod = usb_get_intfdata(interface);
816 line6_cleanup_audio(&pod->line6);
818 del_timer(&pod->startup_timer);
819 cancel_work_sync(&pod->startup_work);
821 /* free dump request data: */
822 line6_dumpreq_destruct(&pod->dumpreq);
826 Create sysfs entries.
828 static int pod_create_files2(struct device *dev)
832 CHECK_RETURN(device_create_file(dev, &dev_attr_device_id));
833 CHECK_RETURN(device_create_file(dev, &dev_attr_finish));
834 CHECK_RETURN(device_create_file(dev, &dev_attr_firmware_version));
835 CHECK_RETURN(device_create_file(dev, &dev_attr_midi_postprocess));
836 CHECK_RETURN(device_create_file(dev, &dev_attr_routing));
837 CHECK_RETURN(device_create_file(dev, &dev_attr_serial_number));
838 CHECK_RETURN(device_create_file(dev, &dev_attr_store_channel));
839 CHECK_RETURN(device_create_file(dev, &dev_attr_store_effects_setup));
840 CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_freq));
841 CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_mute));
842 CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_note));
843 CHECK_RETURN(device_create_file(dev, &dev_attr_tuner_pitch));
845 #ifdef CONFIG_LINE6_USB_RAW
846 CHECK_RETURN(device_create_file(dev, &dev_attr_raw));
853 Try to init POD device.
855 static int pod_try_init(struct usb_interface *interface,
856 struct usb_line6_pod *pod)
859 struct usb_line6 *line6 = &pod->line6;
861 init_timer(&pod->startup_timer);
862 INIT_WORK(&pod->startup_work, pod_startup5);
864 if ((interface == NULL) || (pod == NULL))
867 /* initialize wait queues: */
868 init_waitqueue_head(&pod->routing.wait);
869 init_waitqueue_head(&pod->tuner_mute.wait);
870 init_waitqueue_head(&pod->tuner_freq.wait);
871 init_waitqueue_head(&pod->tuner_note.wait);
872 init_waitqueue_head(&pod->tuner_pitch.wait);
874 /* initialize USB buffers: */
875 err = line6_dumpreq_init(&pod->dumpreq, pod_request_channel,
876 sizeof(pod_request_channel));
878 dev_err(&interface->dev, "Out of memory\n");
882 /* create sysfs entries: */
883 err = pod_create_files2(&interface->dev);
887 /* initialize audio system: */
888 err = line6_init_audio(line6);
892 /* initialize MIDI subsystem: */
893 err = line6_init_midi(line6);
897 /* initialize PCM subsystem: */
898 err = line6_init_pcm(line6, &pod_pcm_properties);
902 /* register monitor control: */
903 err = snd_ctl_add(line6->card,
904 snd_ctl_new1(&pod_control_monitor, line6->line6pcm));
909 When the sound card is registered at this point, the PODxt Live
910 displays "Invalid Code Error 07", so we do it later in the event
914 if (pod->line6.properties->capabilities & LINE6_BIT_CONTROL) {
915 pod->monitor_level = POD_system_invalid;
917 /* initiate startup procedure: */
925 Init POD device (and clean up in case of failure).
927 int line6_pod_init(struct usb_interface *interface, struct usb_line6_pod *pod)
929 int err = pod_try_init(interface, pod);
932 pod_destruct(interface);
938 POD device disconnected.
940 void line6_pod_disconnect(struct usb_interface *interface)
942 struct usb_line6_pod *pod;
944 if (interface == NULL)
946 pod = usb_get_intfdata(interface);
949 struct snd_line6_pcm *line6pcm = pod->line6.line6pcm;
950 struct device *dev = &interface->dev;
952 if (line6pcm != NULL)
953 line6_pcm_disconnect(line6pcm);
956 /* remove sysfs entries: */
957 line6_pod_remove_files(pod->firmware_version,
959 properties->device_bit, dev);
961 device_remove_file(dev, &dev_attr_device_id);
962 device_remove_file(dev, &dev_attr_finish);
963 device_remove_file(dev, &dev_attr_firmware_version);
964 device_remove_file(dev, &dev_attr_midi_postprocess);
965 device_remove_file(dev, &dev_attr_routing);
966 device_remove_file(dev, &dev_attr_serial_number);
967 device_remove_file(dev, &dev_attr_store_channel);
968 device_remove_file(dev, &dev_attr_store_effects_setup);
969 device_remove_file(dev, &dev_attr_tuner_freq);
970 device_remove_file(dev, &dev_attr_tuner_mute);
971 device_remove_file(dev, &dev_attr_tuner_note);
972 device_remove_file(dev, &dev_attr_tuner_pitch);
974 #ifdef CONFIG_LINE6_USB_RAW
975 device_remove_file(dev, &dev_attr_raw);
980 pod_destruct(interface);