Commit e1a164d7 authored by Markus Grabner's avatar Markus Grabner Committed by Greg Kroah-Hartman

Staging: line6: another upstream sync

Everything should be in sync now.
Signed-off-by: default avatarMarkus Grabner <grabner@icg.tugraz.at>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 1027f476
/* /*
* Line6 Linux USB driver - 0.9.0 * Line6 Linux USB driver - 0.9.1beta
* *
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at) * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
* *
...@@ -15,11 +15,9 @@ ...@@ -15,11 +15,9 @@
#include "driver.h" #include "driver.h"
#include "audio.h" #include "audio.h"
static int line6_index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; static int line6_index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
static char *line6_id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; static char *line6_id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
/* /*
Initialize the Line6 USB audio system. Initialize the Line6 USB audio system.
*/ */
...@@ -39,8 +37,7 @@ int line6_init_audio(struct usb_line6 *line6) ...@@ -39,8 +37,7 @@ int line6_init_audio(struct usb_line6 *line6)
strcpy(card->id, line6->properties->id); strcpy(card->id, line6->properties->id);
strcpy(card->driver, DRIVER_NAME); strcpy(card->driver, DRIVER_NAME);
strcpy(card->shortname, line6->properties->name); strcpy(card->shortname, line6->properties->name);
sprintf(card->longname, "Line6 %s at USB %s", line6->properties->name, sprintf(card->longname, "Line6 %s at USB %s", line6->properties->name, dev_name(line6->ifcdev)); /* 80 chars - see asound.h */
dev_name(line6->ifcdev)); /* 80 chars - see asound.h */
return 0; return 0;
} }
......
/* /*
* Line6 Linux USB driver - 0.9.0 * Line6 Linux USB driver - 0.9.1beta
* *
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at) * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
* *
...@@ -12,13 +12,10 @@ ...@@ -12,13 +12,10 @@
#ifndef AUDIO_H #ifndef AUDIO_H
#define AUDIO_H #define AUDIO_H
#include "driver.h" #include "driver.h"
extern void line6_cleanup_audio(struct usb_line6 *); extern void line6_cleanup_audio(struct usb_line6 *);
extern int line6_init_audio(struct usb_line6 *); extern int line6_init_audio(struct usb_line6 *);
extern int line6_register_audio(struct usb_line6 *); extern int line6_register_audio(struct usb_line6 *);
#endif #endif
/* /*
* Line6 Linux USB driver - 0.9.0 * Line6 Linux USB driver - 0.9.1beta
* *
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at) * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
* *
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
#include "pcm.h" #include "pcm.h"
#include "pod.h" #include "pod.h"
/* /*
Find a free URB and submit it. Find a free URB and submit it.
*/ */
...@@ -28,6 +27,7 @@ static int submit_audio_in_urb(struct snd_line6_pcm *line6pcm) ...@@ -28,6 +27,7 @@ static int submit_audio_in_urb(struct snd_line6_pcm *line6pcm)
int index; int index;
unsigned long flags; unsigned long flags;
int i, urb_size; int i, urb_size;
int ret;
struct urb *urb_in; struct urb *urb_in;
spin_lock_irqsave(&line6pcm->lock_audio_in, flags); spin_lock_irqsave(&line6pcm->lock_audio_in, flags);
...@@ -57,11 +57,13 @@ static int submit_audio_in_urb(struct snd_line6_pcm *line6pcm) ...@@ -57,11 +57,13 @@ static int submit_audio_in_urb(struct snd_line6_pcm *line6pcm)
urb_in->transfer_buffer_length = urb_size; urb_in->transfer_buffer_length = urb_size;
urb_in->context = line6pcm; urb_in->context = line6pcm;
if (usb_submit_urb(urb_in, GFP_ATOMIC) == 0) ret = usb_submit_urb(urb_in, GFP_ATOMIC);
if (ret == 0)
set_bit(index, &line6pcm->active_urb_in); set_bit(index, &line6pcm->active_urb_in);
else else
dev_err(line6pcm->line6->ifcdev, dev_err(line6pcm->line6->ifcdev,
"URB in #%d submission failed\n", index); "URB in #%d submission failed (%d)\n", index, ret);
spin_unlock_irqrestore(&line6pcm->lock_audio_in, flags); spin_unlock_irqrestore(&line6pcm->lock_audio_in, flags);
return 0; return 0;
...@@ -216,7 +218,7 @@ static void audio_in_callback(struct urb *urb) ...@@ -216,7 +218,7 @@ static void audio_in_callback(struct urb *urb)
int fsize; int fsize;
struct usb_iso_packet_descriptor *fin = &urb->iso_frame_desc[i]; struct usb_iso_packet_descriptor *fin = &urb->iso_frame_desc[i];
if (fin->status == -18) { if (fin->status == -EXDEV) {
shutdown = 1; shutdown = 1;
break; break;
} }
...@@ -258,6 +260,9 @@ static void audio_in_callback(struct urb *urb) ...@@ -258,6 +260,9 @@ static void audio_in_callback(struct urb *urb)
if (!shutdown) { if (!shutdown) {
submit_audio_in_urb(line6pcm); submit_audio_in_urb(line6pcm);
#ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE
if (!(line6pcm->flags & MASK_PCM_IMPULSE))
#endif
if (test_bit(BIT_PCM_ALSA_CAPTURE, &line6pcm->flags)) if (test_bit(BIT_PCM_ALSA_CAPTURE, &line6pcm->flags))
line6_capture_check_period(line6pcm, length); line6_capture_check_period(line6pcm, length);
} }
...@@ -272,8 +277,8 @@ static int snd_line6_capture_open(struct snd_pcm_substream *substream) ...@@ -272,8 +277,8 @@ static int snd_line6_capture_open(struct snd_pcm_substream *substream)
err = snd_pcm_hw_constraint_ratdens(runtime, 0, err = snd_pcm_hw_constraint_ratdens(runtime, 0,
SNDRV_PCM_HW_PARAM_RATE, SNDRV_PCM_HW_PARAM_RATE,
(&line6pcm->properties-> (&line6pcm->
snd_line6_rates)); properties->snd_line6_rates));
if (err < 0) if (err < 0)
return err; return err;
...@@ -396,8 +401,8 @@ int line6_create_audio_in_urbs(struct snd_line6_pcm *line6pcm) ...@@ -396,8 +401,8 @@ int line6_create_audio_in_urbs(struct snd_line6_pcm *line6pcm)
urb->dev = line6pcm->line6->usbdev; urb->dev = line6pcm->line6->usbdev;
urb->pipe = urb->pipe =
usb_rcvisocpipe(line6pcm->line6->usbdev, usb_rcvisocpipe(line6pcm->line6->usbdev,
line6pcm-> line6pcm->ep_audio_read &
ep_audio_read & USB_ENDPOINT_NUMBER_MASK); USB_ENDPOINT_NUMBER_MASK);
urb->transfer_flags = URB_ISO_ASAP; urb->transfer_flags = URB_ISO_ASAP;
urb->start_frame = -1; urb->start_frame = -1;
urb->number_of_packets = LINE6_ISO_PACKETS; urb->number_of_packets = LINE6_ISO_PACKETS;
......
/* /*
* Line6 Linux USB driver - 0.9.0 * Line6 Linux USB driver - 0.9.1beta
* *
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at) * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
* *
...@@ -12,17 +12,17 @@ ...@@ -12,17 +12,17 @@
#ifndef CAPTURE_H #ifndef CAPTURE_H
#define CAPTURE_H #define CAPTURE_H
#include <sound/pcm.h> #include <sound/pcm.h>
#include "driver.h" #include "driver.h"
#include "pcm.h" #include "pcm.h"
extern struct snd_pcm_ops snd_line6_capture_ops; extern struct snd_pcm_ops snd_line6_capture_ops;
extern void line6_capture_copy(struct snd_line6_pcm *line6pcm, char *fbuf, extern void line6_capture_copy(struct snd_line6_pcm *line6pcm, char *fbuf,
int fsize); int fsize);
extern void line6_capture_check_period(struct snd_line6_pcm *line6pcm,
int length);
extern int line6_create_audio_in_urbs(struct snd_line6_pcm *line6pcm); extern int line6_create_audio_in_urbs(struct snd_line6_pcm *line6pcm);
extern int line6_submit_audio_in_all_urbs(struct snd_line6_pcm *line6pcm); extern int line6_submit_audio_in_all_urbs(struct snd_line6_pcm *line6pcm);
extern void line6_unlink_audio_in_urbs(struct snd_line6_pcm *line6pcm); extern void line6_unlink_audio_in_urbs(struct snd_line6_pcm *line6pcm);
......
/* /*
* Line6 Linux USB driver - 0.9.0 * Line6 Linux USB driver - 0.9.1beta
* *
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at) * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
* *
......
/* /*
* Line6 Linux USB driver - 0.9.0 * Line6 Linux USB driver - 0.9.1beta
* *
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at) * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
* *
...@@ -22,7 +22,9 @@ ...@@ -22,7 +22,9 @@
from "control.h", and this process depends on the exact formatting of the from "control.h", and this process depends on the exact formatting of the
code and the comments below! code and the comments below!
*/ */
/* *INDENT-OFF* */ /* *INDENT-OFF* */
enum { enum {
POD_tweak = 1, POD_tweak = 1,
POD_wah_position = 4, POD_wah_position = 4,
...@@ -181,11 +183,13 @@ enum { ...@@ -181,11 +183,13 @@ enum {
VARIAXMIDI_tone = 79, VARIAXMIDI_tone = 79,
}; };
/* *INDENT-ON* */
extern int line6_pod_create_files(int firmware, int type, struct device *dev); extern int line6_pod_create_files(int firmware, int type, struct device *dev);
extern void line6_pod_remove_files(int firmware, int type, struct device *dev); extern void line6_pod_remove_files(int firmware, int type, struct device *dev);
extern int line6_variax_create_files(int firmware, int type, struct device *dev); extern int line6_variax_create_files(int firmware, int type,
extern void line6_variax_remove_files(int firmware, int type, struct device *dev); struct device *dev);
extern void line6_variax_remove_files(int firmware, int type,
struct device *dev);
#endif #endif
This diff is collapsed.
/* /*
* Line6 Linux USB driver - 0.9.0 * Line6 Linux USB driver - 0.9.1beta
* *
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at) * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
* *
...@@ -12,14 +12,12 @@ ...@@ -12,14 +12,12 @@
#ifndef DRIVER_H #ifndef DRIVER_H
#define DRIVER_H #define DRIVER_H
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/usb.h> #include <linux/usb.h>
#include <sound/core.h> #include <sound/core.h>
#include "midi.h" #include "midi.h"
#define DRIVER_NAME "line6usb" #define DRIVER_NAME "line6usb"
#if defined(CONFIG_LINE6_USB_DUMP_CTRL) || defined(CONFIG_LINE6_USB_DUMP_MIDI) || defined(CONFIG_LINE6_USB_DUMP_PCM) #if defined(CONFIG_LINE6_USB_DUMP_CTRL) || defined(CONFIG_LINE6_USB_DUMP_MIDI) || defined(CONFIG_LINE6_USB_DUMP_PCM)
...@@ -61,12 +59,10 @@ ...@@ -61,12 +59,10 @@
#define DEBUG_MESSAGES(x) #define DEBUG_MESSAGES(x)
#endif #endif
#define MISSING_CASE \ #define MISSING_CASE \
printk(KERN_ERR "line6usb driver bug: missing case in %s:%d\n", \ printk(KERN_ERR "line6usb driver bug: missing case in %s:%d\n", \
__FILE__, __LINE__) __FILE__, __LINE__)
#define CHECK_RETURN(x) \ #define CHECK_RETURN(x) \
do { \ do { \
err = x; \ err = x; \
...@@ -79,14 +75,12 @@ do { \ ...@@ -79,14 +75,12 @@ do { \
return; \ return; \
x = (n); x = (n);
extern const unsigned char line6_midi_id[3]; extern const unsigned char line6_midi_id[3];
extern struct usb_line6 *line6_devices[LINE6_MAX_DEVICES]; extern struct usb_line6 *line6_devices[LINE6_MAX_DEVICES];
static const int SYSEX_DATA_OFS = sizeof(line6_midi_id) + 3; static const int SYSEX_DATA_OFS = sizeof(line6_midi_id) + 3;
static const int SYSEX_EXTRA_SIZE = sizeof(line6_midi_id) + 4; static const int SYSEX_EXTRA_SIZE = sizeof(line6_midi_id) + 4;
/** /**
Common properties of Line6 devices. Common properties of Line6 devices.
*/ */
...@@ -202,7 +196,6 @@ struct usb_line6 { ...@@ -202,7 +196,6 @@ struct usb_line6 {
int message_length; int message_length;
}; };
extern char *line6_alloc_sysex_buffer(struct usb_line6 *line6, int code1, extern char *line6_alloc_sysex_buffer(struct usb_line6 *line6, int code1,
int code2, int size); int code2, int size);
extern ssize_t line6_nop_read(struct device *dev, extern ssize_t line6_nop_read(struct device *dev,
...@@ -226,7 +219,8 @@ extern int line6_send_sysex_message_async(struct usb_line6 *line6, ...@@ -226,7 +219,8 @@ extern int line6_send_sysex_message_async(struct usb_line6 *line6,
extern ssize_t line6_set_raw(struct device *dev, struct device_attribute *attr, extern ssize_t line6_set_raw(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count); const char *buf, size_t count);
extern void line6_start_timer(struct timer_list *timer, unsigned int msecs, extern void line6_start_timer(struct timer_list *timer, unsigned int msecs,
void (*function)(unsigned long), unsigned long data); void (*function) (unsigned long),
unsigned long data);
extern int line6_transmit_parameter(struct usb_line6 *line6, int param, extern int line6_transmit_parameter(struct usb_line6 *line6, int param,
int value); int value);
extern int line6_version_request_async(struct usb_line6 *line6); extern int line6_version_request_async(struct usb_line6 *line6);
...@@ -238,5 +232,4 @@ extern void line6_write_hexdump(struct usb_line6 *line6, char dir, ...@@ -238,5 +232,4 @@ extern void line6_write_hexdump(struct usb_line6 *line6, char dir,
const unsigned char *buffer, int size); const unsigned char *buffer, int size);
#endif #endif
#endif #endif
/* /*
* Line6 Linux USB driver - 0.9.0 * Line6 Linux USB driver - 0.9.1beta
* *
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at) * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
* *
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
#include "driver.h" #include "driver.h"
#include "dumprequest.h" #include "dumprequest.h"
/* /*
Set "dump in progress" flag. Set "dump in progress" flag.
*/ */
...@@ -63,7 +62,8 @@ int line6_dump_request_async(struct line6_dump_request *l6dr, ...@@ -63,7 +62,8 @@ int line6_dump_request_async(struct line6_dump_request *l6dr,
*/ */
int line6_dump_wait_interruptible(struct line6_dump_request *l6dr) int line6_dump_wait_interruptible(struct line6_dump_request *l6dr)
{ {
return wait_event_interruptible(l6dr->wait, l6dr->in_progress == LINE6_DUMP_NONE); return wait_event_interruptible(l6dr->wait,
l6dr->in_progress == LINE6_DUMP_NONE);
} }
/* /*
...@@ -79,7 +79,9 @@ void line6_dump_wait(struct line6_dump_request *l6dr) ...@@ -79,7 +79,9 @@ void line6_dump_wait(struct line6_dump_request *l6dr)
*/ */
int line6_dump_wait_timeout(struct line6_dump_request *l6dr, long timeout) int line6_dump_wait_timeout(struct line6_dump_request *l6dr, long timeout)
{ {
return wait_event_timeout(l6dr->wait, l6dr->in_progress == LINE6_DUMP_NONE, timeout); return wait_event_timeout(l6dr->wait,
l6dr->in_progress == LINE6_DUMP_NONE,
timeout);
} }
/* /*
......
/* /*
* Line6 Linux USB driver - 0.9.0 * Line6 Linux USB driver - 0.9.1beta
* *
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at) * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
* *
...@@ -12,18 +12,15 @@ ...@@ -12,18 +12,15 @@
#ifndef DUMPREQUEST_H #ifndef DUMPREQUEST_H
#define DUMPREQUEST_H #define DUMPREQUEST_H
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/wait.h> #include <linux/wait.h>
#include <sound/core.h> #include <sound/core.h>
enum { enum {
LINE6_DUMP_NONE, LINE6_DUMP_NONE,
LINE6_DUMP_CURRENT LINE6_DUMP_CURRENT
}; };
struct line6_dump_reqbuf { struct line6_dump_reqbuf {
/** /**
Buffer for dump requests. Buffer for dump requests.
...@@ -76,5 +73,4 @@ extern int line6_dump_wait_interruptible(struct line6_dump_request *l6dr); ...@@ -76,5 +73,4 @@ extern int line6_dump_wait_interruptible(struct line6_dump_request *l6dr);
extern int line6_dump_wait_timeout(struct line6_dump_request *l6dr, extern int line6_dump_wait_timeout(struct line6_dump_request *l6dr,
long timeout); long timeout);
#endif #endif
/* /*
* Line6 Linux USB driver - 0.9.0 * Line6 Linux USB driver - 0.9.1beta
* *
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at) * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
* *
...@@ -20,15 +20,12 @@ ...@@ -20,15 +20,12 @@
#include "pod.h" #include "pod.h"
#include "usbdefs.h" #include "usbdefs.h"
#define line6_rawmidi_substream_midi(substream) \ #define line6_rawmidi_substream_midi(substream) \
((struct snd_line6_midi *)((substream)->rmidi->private_data)) ((struct snd_line6_midi *)((substream)->rmidi->private_data))
static int send_midi_async(struct usb_line6 *line6, unsigned char *data, static int send_midi_async(struct usb_line6 *line6, unsigned char *data,
int length); int length);
/* /*
Pass data received via USB to MIDI. Pass data received via USB to MIDI.
*/ */
...@@ -45,7 +42,8 @@ void line6_midi_receive(struct usb_line6 *line6, unsigned char *data, ...@@ -45,7 +42,8 @@ void line6_midi_receive(struct usb_line6 *line6, unsigned char *data,
*/ */
static void line6_midi_transmit(struct snd_rawmidi_substream *substream) static void line6_midi_transmit(struct snd_rawmidi_substream *substream)
{ {
struct usb_line6 *line6 = line6_rawmidi_substream_midi(substream)->line6; struct usb_line6 *line6 =
line6_rawmidi_substream_midi(substream)->line6;
struct snd_line6_midi *line6midi = line6->line6midi; struct snd_line6_midi *line6midi = line6->line6midi;
struct MidiBuffer *mb = &line6midi->midibuf_out; struct MidiBuffer *mb = &line6midi->midibuf_out;
unsigned long flags; unsigned long flags;
...@@ -74,7 +72,8 @@ static void line6_midi_transmit(struct snd_rawmidi_substream *substream) ...@@ -74,7 +72,8 @@ static void line6_midi_transmit(struct snd_rawmidi_substream *substream)
if (done == 0) if (done == 0)
break; break;
if (line6_midibuf_skip_message(mb, line6midi->midi_mask_transmit)) if (line6_midibuf_skip_message
(mb, line6midi->midi_mask_transmit))
continue; continue;
send_midi_async(line6, chunk, done); send_midi_async(line6, chunk, done);
...@@ -132,7 +131,6 @@ static int send_midi_async(struct usb_line6 *line6, unsigned char *data, ...@@ -132,7 +131,6 @@ static int send_midi_async(struct usb_line6 *line6, unsigned char *data,
dev_err(line6->ifcdev, "Out of memory\n"); dev_err(line6->ifcdev, "Out of memory\n");
return -ENOMEM; return -ENOMEM;
} }
#ifdef CONFIG_LINE6_USB_DUMP_CTRL #ifdef CONFIG_LINE6_USB_DUMP_CTRL
line6_write_hexdump(line6, 'S', data, length); line6_write_hexdump(line6, 'S', data, length);
#endif #endif
...@@ -174,6 +172,9 @@ static int send_midi_async(struct usb_line6 *line6, unsigned char *data, ...@@ -174,6 +172,9 @@ static int send_midi_async(struct usb_line6 *line6, unsigned char *data,
length); length);
break; break;
case LINE6_DEVID_VARIAX:
break;
default: default:
MISSING_CASE; MISSING_CASE;
} }
...@@ -195,7 +196,8 @@ static void line6_midi_output_trigger(struct snd_rawmidi_substream *substream, ...@@ -195,7 +196,8 @@ static void line6_midi_output_trigger(struct snd_rawmidi_substream *substream,
int up) int up)
{ {
unsigned long flags; unsigned long flags;
struct usb_line6 *line6 = line6_rawmidi_substream_midi(substream)->line6; struct usb_line6 *line6 =
line6_rawmidi_substream_midi(substream)->line6;
line6->line6midi->substream_transmit = substream; line6->line6midi->substream_transmit = substream;
spin_lock_irqsave(&line6->line6midi->send_urb_lock, flags); spin_lock_irqsave(&line6->line6midi->send_urb_lock, flags);
...@@ -208,9 +210,11 @@ static void line6_midi_output_trigger(struct snd_rawmidi_substream *substream, ...@@ -208,9 +210,11 @@ static void line6_midi_output_trigger(struct snd_rawmidi_substream *substream,
static void line6_midi_output_drain(struct snd_rawmidi_substream *substream) static void line6_midi_output_drain(struct snd_rawmidi_substream *substream)
{ {
struct usb_line6 *line6 = line6_rawmidi_substream_midi(substream)->line6; struct usb_line6 *line6 =
line6_rawmidi_substream_midi(substream)->line6;
struct snd_line6_midi *midi = line6->line6midi; struct snd_line6_midi *midi = line6->line6midi;
wait_event_interruptible(midi->send_wait, midi->num_active_send_urbs == 0); wait_event_interruptible(midi->send_wait,
midi->num_active_send_urbs == 0);
} }
static int line6_midi_input_open(struct snd_rawmidi_substream *substream) static int line6_midi_input_open(struct snd_rawmidi_substream *substream)
...@@ -226,7 +230,8 @@ static int line6_midi_input_close(struct snd_rawmidi_substream *substream) ...@@ -226,7 +230,8 @@ static int line6_midi_input_close(struct snd_rawmidi_substream *substream)
static void line6_midi_input_trigger(struct snd_rawmidi_substream *substream, static void line6_midi_input_trigger(struct snd_rawmidi_substream *substream,
int up) int up)
{ {
struct usb_line6 *line6 = line6_rawmidi_substream_midi(substream)->line6; struct usb_line6 *line6 =
line6_rawmidi_substream_midi(substream)->line6;
if (up) if (up)
line6->line6midi->substream_receive = substream; line6->line6midi->substream_receive = substream;
...@@ -272,8 +277,7 @@ static int snd_line6_new_midi(struct snd_line6_midi *line6midi) ...@@ -272,8 +277,7 @@ static int snd_line6_new_midi(struct snd_line6_midi *line6midi)
rmidi->info_flags = rmidi->info_flags =
SNDRV_RAWMIDI_INFO_OUTPUT | SNDRV_RAWMIDI_INFO_OUTPUT |
SNDRV_RAWMIDI_INFO_INPUT | SNDRV_RAWMIDI_INFO_INPUT | SNDRV_RAWMIDI_INFO_DUPLEX;
SNDRV_RAWMIDI_INFO_DUPLEX;
snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_OUTPUT, snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_OUTPUT,
&line6_midi_output_ops); &line6_midi_output_ops);
...@@ -346,15 +350,19 @@ static ssize_t midi_set_midi_mask_receive(struct device *dev, ...@@ -346,15 +350,19 @@ static ssize_t midi_set_midi_mask_receive(struct device *dev,
return count; return count;
} }
static DEVICE_ATTR(midi_mask_transmit, S_IWUGO | S_IRUGO, midi_get_midi_mask_transmit, midi_set_midi_mask_transmit); static DEVICE_ATTR(midi_mask_transmit, S_IWUGO | S_IRUGO,
static DEVICE_ATTR(midi_mask_receive, S_IWUGO | S_IRUGO, midi_get_midi_mask_receive, midi_set_midi_mask_receive); midi_get_midi_mask_transmit, midi_set_midi_mask_transmit);
static DEVICE_ATTR(midi_mask_receive, S_IWUGO | S_IRUGO,
midi_get_midi_mask_receive, midi_set_midi_mask_receive);
/* MIDI device destructor */ /* MIDI device destructor */
static int snd_line6_midi_free(struct snd_device *device) static int snd_line6_midi_free(struct snd_device *device)
{ {
struct snd_line6_midi *line6midi = device->device_data; struct snd_line6_midi *line6midi = device->device_data;
device_remove_file(line6midi->line6->ifcdev, &dev_attr_midi_mask_transmit); device_remove_file(line6midi->line6->ifcdev,
device_remove_file(line6midi->line6->ifcdev, &dev_attr_midi_mask_receive); &dev_attr_midi_mask_transmit);
device_remove_file(line6midi->line6->ifcdev,
&dev_attr_midi_mask_receive);
line6_midibuf_destroy(&line6midi->midibuf_in); line6_midibuf_destroy(&line6midi->midibuf_in);
line6_midibuf_destroy(&line6midi->midibuf_out); line6_midibuf_destroy(&line6midi->midibuf_out);
return 0; return 0;
......
/* /*
* Line6 Linux USB driver - 0.9.0 * Line6 Linux USB driver - 0.9.1beta
* *
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at) * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
* *
...@@ -12,15 +12,12 @@ ...@@ -12,15 +12,12 @@
#ifndef MIDI_H #ifndef MIDI_H
#define MIDI_H #define MIDI_H
#include <sound/rawmidi.h> #include <sound/rawmidi.h>
#include "midibuf.h" #include "midibuf.h"
#define MIDI_BUFFER_SIZE 1024 #define MIDI_BUFFER_SIZE 1024
struct snd_line6_midi { struct snd_line6_midi {
/** /**
Pointer back to the Line6 driver data structure. Pointer back to the Line6 driver data structure.
...@@ -78,10 +75,8 @@ struct snd_line6_midi { ...@@ -78,10 +75,8 @@ struct snd_line6_midi {
struct MidiBuffer midibuf_out; struct MidiBuffer midibuf_out;
}; };
extern int line6_init_midi(struct usb_line6 *line6); extern int line6_init_midi(struct usb_line6 *line6);
extern void line6_midi_receive(struct usb_line6 *line6, unsigned char *data, extern void line6_midi_receive(struct usb_line6 *line6, unsigned char *data,
int length); int length);
#endif #endif
/* /*
* Line6 Linux USB driver - 0.9.0 * Line6 Linux USB driver - 0.9.1beta
* *
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at) * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
* *
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
#include "midibuf.h" #include "midibuf.h"
static int midibuf_message_length(unsigned char code) static int midibuf_message_length(unsigned char code)
{ {
if (code < 0x80) if (code < 0x80)
...@@ -28,7 +27,8 @@ static int midibuf_message_length(unsigned char code) ...@@ -28,7 +27,8 @@ static int midibuf_message_length(unsigned char code)
to send sysex messages to the host. to send sysex messages to the host.
*/ */
static const int length[] = { -1, 2, -1, 2, -1, -1, 1, 1, 1, 1, static const int length[] = { -1, 2, -1, 2, -1, -1, 1, 1, 1, 1,
1, 1, 1, -1, 1, 1 }; 1, 1, 1, -1, 1, 1
};
return length[code & 0x0f]; return length[code & 0x0f];
} }
} }
...@@ -74,7 +74,8 @@ int line6_midibuf_bytes_free(struct MidiBuffer *this) ...@@ -74,7 +74,8 @@ int line6_midibuf_bytes_free(struct MidiBuffer *this)
return return
midibuf_is_full(this) ? midibuf_is_full(this) ?
0 : 0 :
(this->pos_read - this->pos_write + this->size - 1) % this->size + 1; (this->pos_read - this->pos_write + this->size - 1) % this->size +
1;
} }
int line6_midibuf_bytes_used(struct MidiBuffer *this) int line6_midibuf_bytes_used(struct MidiBuffer *this)
...@@ -82,10 +83,12 @@ int line6_midibuf_bytes_used(struct MidiBuffer *this) ...@@ -82,10 +83,12 @@ int line6_midibuf_bytes_used(struct MidiBuffer *this)
return return
midibuf_is_empty(this) ? midibuf_is_empty(this) ?
0 : 0 :
(this->pos_write - this->pos_read + this->size - 1) % this->size + 1; (this->pos_write - this->pos_read + this->size - 1) % this->size +
1;
} }
int line6_midibuf_write(struct MidiBuffer *this, unsigned char *data, int length) int line6_midibuf_write(struct MidiBuffer *this, unsigned char *data,
int length)
{ {
int bytes_free; int bytes_free;
int length1, length2; int length1, length2;
...@@ -158,7 +161,8 @@ int line6_midibuf_read(struct MidiBuffer *this, unsigned char *data, int length) ...@@ -158,7 +161,8 @@ int line6_midibuf_read(struct MidiBuffer *this, unsigned char *data, int length)
this->command_prev = command; this->command_prev = command;
} else { } else {
if (this->command_prev > 0) { if (this->command_prev > 0) {
int midi_length_prev = midibuf_message_length(this->command_prev); int midi_length_prev =
midibuf_message_length(this->command_prev);
if (midi_length_prev > 0) { if (midi_length_prev > 0) {
midi_length = midi_length_prev - 1; midi_length = midi_length_prev - 1;
......
/* /*
* Line6 Linux USB driver - 0.9.0 * Line6 Linux USB driver - 0.9.1beta
* *
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at) * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
* *
...@@ -12,7 +12,6 @@ ...@@ -12,7 +12,6 @@
#ifndef MIDIBUF_H #ifndef MIDIBUF_H
#define MIDIBUF_H #define MIDIBUF_H
struct MidiBuffer { struct MidiBuffer {
unsigned char *buf; unsigned char *buf;
int size; int size;
...@@ -22,18 +21,18 @@ struct MidiBuffer { ...@@ -22,18 +21,18 @@ struct MidiBuffer {
int command_prev; int command_prev;
}; };
extern int line6_midibuf_bytes_used(struct MidiBuffer *mb); extern int line6_midibuf_bytes_used(struct MidiBuffer *mb);
extern int line6_midibuf_bytes_free(struct MidiBuffer *mb); extern int line6_midibuf_bytes_free(struct MidiBuffer *mb);
extern void line6_midibuf_destroy(struct MidiBuffer *mb); extern void line6_midibuf_destroy(struct MidiBuffer *mb);
extern int line6_midibuf_ignore(struct MidiBuffer *mb, int length); extern int line6_midibuf_ignore(struct MidiBuffer *mb, int length);
extern int line6_midibuf_init(struct MidiBuffer *mb, int size, int split); extern int line6_midibuf_init(struct MidiBuffer *mb, int size, int split);
extern int line6_midibuf_read(struct MidiBuffer *mb, unsigned char *data, int length); extern int line6_midibuf_read(struct MidiBuffer *mb, unsigned char *data,
int length);
extern void line6_midibuf_reset(struct MidiBuffer *mb); extern void line6_midibuf_reset(struct MidiBuffer *mb);
extern int line6_midibuf_skip_message(struct MidiBuffer *mb, unsigned short mask); extern int line6_midibuf_skip_message(struct MidiBuffer *mb,
unsigned short mask);
extern void line6_midibuf_status(struct MidiBuffer *mb); extern void line6_midibuf_status(struct MidiBuffer *mb);
extern int line6_midibuf_write(struct MidiBuffer *mb, unsigned char *data, extern int line6_midibuf_write(struct MidiBuffer *mb, unsigned char *data,
int length); int length);
#endif #endif
/* /*
* Line6 Linux USB driver - 0.9.0 * Line6 Linux USB driver - 0.9.1beta
* *
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at) * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
* *
...@@ -21,10 +21,9 @@ ...@@ -21,10 +21,9 @@
#include "playback.h" #include "playback.h"
#include "pod.h" #include "pod.h"
#ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE #ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE
static struct snd_line6_pcm* dev2pcm(struct device *dev) static struct snd_line6_pcm *dev2pcm(struct device *dev)
{ {
struct usb_interface *interface = to_usb_interface(dev); struct usb_interface *interface = to_usb_interface(dev);
struct usb_line6 *line6 = usb_get_intfdata(interface); struct usb_line6 *line6 = usb_get_intfdata(interface);
...@@ -36,8 +35,7 @@ static struct snd_line6_pcm* dev2pcm(struct device *dev) ...@@ -36,8 +35,7 @@ static struct snd_line6_pcm* dev2pcm(struct device *dev)
"read" request on "impulse_volume" special file. "read" request on "impulse_volume" special file.
*/ */
static ssize_t pcm_get_impulse_volume(struct device *dev, static ssize_t pcm_get_impulse_volume(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr, char *buf)
char *buf)
{ {
return sprintf(buf, "%d\n", dev2pcm(dev)->impulse_volume); return sprintf(buf, "%d\n", dev2pcm(dev)->impulse_volume);
} }
...@@ -53,7 +51,7 @@ static ssize_t pcm_set_impulse_volume(struct device *dev, ...@@ -53,7 +51,7 @@ static ssize_t pcm_set_impulse_volume(struct device *dev,
int value = simple_strtoul(buf, NULL, 10); int value = simple_strtoul(buf, NULL, 10);
line6pcm->impulse_volume = value; line6pcm->impulse_volume = value;
if(value > 0) if (value > 0)
line6_pcm_start(line6pcm, MASK_PCM_IMPULSE); line6_pcm_start(line6pcm, MASK_PCM_IMPULSE);
else else
line6_pcm_stop(line6pcm, MASK_PCM_IMPULSE); line6_pcm_stop(line6pcm, MASK_PCM_IMPULSE);
...@@ -65,8 +63,7 @@ static ssize_t pcm_set_impulse_volume(struct device *dev, ...@@ -65,8 +63,7 @@ static ssize_t pcm_set_impulse_volume(struct device *dev,
"read" request on "impulse_period" special file. "read" request on "impulse_period" special file.
*/ */
static ssize_t pcm_get_impulse_period(struct device *dev, static ssize_t pcm_get_impulse_period(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr, char *buf)
char *buf)
{ {
return sprintf(buf, "%d\n", dev2pcm(dev)->impulse_period); return sprintf(buf, "%d\n", dev2pcm(dev)->impulse_period);
} }
...@@ -82,23 +79,29 @@ static ssize_t pcm_set_impulse_period(struct device *dev, ...@@ -82,23 +79,29 @@ static ssize_t pcm_set_impulse_period(struct device *dev,
return count; return count;
} }
static DEVICE_ATTR(impulse_volume, S_IWUGO | S_IRUGO, pcm_get_impulse_volume, pcm_set_impulse_volume); static DEVICE_ATTR(impulse_volume, S_IWUGO | S_IRUGO, pcm_get_impulse_volume,
static DEVICE_ATTR(impulse_period, S_IWUGO | S_IRUGO, pcm_get_impulse_period, pcm_set_impulse_period); pcm_set_impulse_volume);
static DEVICE_ATTR(impulse_period, S_IWUGO | S_IRUGO, pcm_get_impulse_period,
pcm_set_impulse_period);
#endif #endif
int line6_pcm_start(struct snd_line6_pcm *line6pcm, int channels) int line6_pcm_start(struct snd_line6_pcm *line6pcm, int channels)
{ {
unsigned long flags_old = __sync_fetch_and_or(&line6pcm->flags, channels); unsigned long flags_old =
__sync_fetch_and_or(&line6pcm->flags, channels);
unsigned long flags_new = flags_old | channels; unsigned long flags_new = flags_old | channels;
int err = 0; int err = 0;
#if LINE6_BACKUP_MONITOR_SIGNAL #if LINE6_BACKUP_MONITOR_SIGNAL
if (!(line6pcm->line6->properties->capabilities & LINE6_BIT_HWMON)) { if (!(line6pcm->line6->properties->capabilities & LINE6_BIT_HWMON)) {
line6pcm->prev_fbuf = kmalloc(LINE6_ISO_PACKETS * line6pcm->max_packet_size, GFP_KERNEL); line6pcm->prev_fbuf =
kmalloc(LINE6_ISO_PACKETS * line6pcm->max_packet_size,
GFP_KERNEL);
if (!line6pcm->prev_fbuf) { if (!line6pcm->prev_fbuf) {
dev_err(line6pcm->line6->ifcdev, "cannot malloc monitor buffer\n"); dev_err(line6pcm->line6->ifcdev,
"cannot malloc monitor buffer\n");
return -ENOMEM; return -ENOMEM;
} }
} }
...@@ -113,13 +116,16 @@ int line6_pcm_start(struct snd_line6_pcm *line6pcm, int channels) ...@@ -113,13 +116,16 @@ int line6_pcm_start(struct snd_line6_pcm *line6pcm, int channels)
a bug, we therefore report an error if capturing is restarted a bug, we therefore report an error if capturing is restarted
too soon. too soon.
*/ */
if(line6pcm->active_urb_in | line6pcm->unlink_urb_in) if (line6pcm->active_urb_in | line6pcm->unlink_urb_in)
return -EBUSY; return -EBUSY;
line6pcm->buffer_in = kmalloc(LINE6_ISO_BUFFERS * LINE6_ISO_PACKETS * line6pcm->max_packet_size, GFP_KERNEL); line6pcm->buffer_in =
kmalloc(LINE6_ISO_BUFFERS * LINE6_ISO_PACKETS *
line6pcm->max_packet_size, GFP_KERNEL);
if (!line6pcm->buffer_in) { if (!line6pcm->buffer_in) {
dev_err(line6pcm->line6->ifcdev, "cannot malloc capture buffer\n"); dev_err(line6pcm->line6->ifcdev,
"cannot malloc capture buffer\n");
return -ENOMEM; return -ENOMEM;
} }
...@@ -138,13 +144,16 @@ int line6_pcm_start(struct snd_line6_pcm *line6pcm, int channels) ...@@ -138,13 +144,16 @@ int line6_pcm_start(struct snd_line6_pcm *line6pcm, int channels)
/* /*
See comment above regarding PCM restart. See comment above regarding PCM restart.
*/ */
if(line6pcm->active_urb_out | line6pcm->unlink_urb_out) if (line6pcm->active_urb_out | line6pcm->unlink_urb_out)
return -EBUSY; return -EBUSY;
line6pcm->buffer_out = kmalloc(LINE6_ISO_BUFFERS * LINE6_ISO_PACKETS * line6pcm->max_packet_size, GFP_KERNEL); line6pcm->buffer_out =
kmalloc(LINE6_ISO_BUFFERS * LINE6_ISO_PACKETS *
line6pcm->max_packet_size, GFP_KERNEL);
if (!line6pcm->buffer_out) { if (!line6pcm->buffer_out) {
dev_err(line6pcm->line6->ifcdev, "cannot malloc playback buffer\n"); dev_err(line6pcm->line6->ifcdev,
"cannot malloc playback buffer\n");
return -ENOMEM; return -ENOMEM;
} }
...@@ -162,7 +171,8 @@ int line6_pcm_start(struct snd_line6_pcm *line6pcm, int channels) ...@@ -162,7 +171,8 @@ int line6_pcm_start(struct snd_line6_pcm *line6pcm, int channels)
int line6_pcm_stop(struct snd_line6_pcm *line6pcm, int channels) int line6_pcm_stop(struct snd_line6_pcm *line6pcm, int channels)
{ {
unsigned long flags_old = __sync_fetch_and_and(&line6pcm->flags, ~channels); unsigned long flags_old =
__sync_fetch_and_and(&line6pcm->flags, ~channels);
unsigned long flags_new = flags_old & ~channels; unsigned long flags_new = flags_old & ~channels;
if (((flags_old & MASK_CAPTURE) != 0) && if (((flags_old & MASK_CAPTURE) != 0) &&
...@@ -178,7 +188,6 @@ int line6_pcm_stop(struct snd_line6_pcm *line6pcm, int channels) ...@@ -178,7 +188,6 @@ int line6_pcm_stop(struct snd_line6_pcm *line6pcm, int channels)
kfree(line6pcm->buffer_out); kfree(line6pcm->buffer_out);
line6pcm->buffer_out = NULL; line6pcm->buffer_out = NULL;
} }
#if LINE6_BACKUP_MONITOR_SIGNAL #if LINE6_BACKUP_MONITOR_SIGNAL
if (line6pcm->prev_fbuf != NULL) if (line6pcm->prev_fbuf != NULL)
kfree(line6pcm->prev_fbuf); kfree(line6pcm->prev_fbuf);
...@@ -223,8 +232,8 @@ int snd_line6_trigger(struct snd_pcm_substream *substream, int cmd) ...@@ -223,8 +232,8 @@ int snd_line6_trigger(struct snd_pcm_substream *substream, int cmd)
break; break;
default: default:
dev_err(line6pcm->line6->ifcdev, "Unknown stream direction %d\n", dev_err(line6pcm->line6->ifcdev,
s->stream); "Unknown stream direction %d\n", s->stream);
} }
} }
...@@ -264,8 +273,10 @@ static int snd_line6_control_playback_put(struct snd_kcontrol *kcontrol, ...@@ -264,8 +273,10 @@ static int snd_line6_control_playback_put(struct snd_kcontrol *kcontrol,
struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol); struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol);
for (i = 2; i--;) for (i = 2; i--;)
if (line6pcm->volume_playback[i] != ucontrol->value.integer.value[i]) { if (line6pcm->volume_playback[i] !=
line6pcm->volume_playback[i] = ucontrol->value.integer.value[i]; ucontrol->value.integer.value[i]) {
line6pcm->volume_playback[i] =
ucontrol->value.integer.value[i];
changed = 1; changed = 1;
} }
...@@ -328,13 +339,13 @@ static int snd_line6_new_pcm(struct snd_line6_pcm *line6pcm) ...@@ -328,13 +339,13 @@ static int snd_line6_new_pcm(struct snd_line6_pcm *line6pcm)
/* set operators */ /* set operators */
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
&snd_line6_playback_ops); &snd_line6_playback_ops);
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_line6_capture_ops);
&snd_line6_capture_ops);
/* pre-allocation of buffers */ /* pre-allocation of buffers */
snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_CONTINUOUS, snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_CONTINUOUS,
snd_dma_continuous_data(GFP_KERNEL), snd_dma_continuous_data
64 * 1024, 128 * 1024); (GFP_KERNEL), 64 * 1024,
128 * 1024);
return 0; return 0;
} }
...@@ -350,7 +361,7 @@ static int snd_line6_pcm_free(struct snd_device *device) ...@@ -350,7 +361,7 @@ static int snd_line6_pcm_free(struct snd_device *device)
*/ */
static void pcm_disconnect_substream(struct snd_pcm_substream *substream) static void pcm_disconnect_substream(struct snd_pcm_substream *substream)
{ {
if(substream->runtime && snd_pcm_running(substream)) { if (substream->runtime && snd_pcm_running(substream)) {
snd_pcm_stop(substream, SNDRV_PCM_STATE_DISCONNECTED); snd_pcm_stop(substream, SNDRV_PCM_STATE_DISCONNECTED);
} }
} }
...@@ -360,8 +371,10 @@ static void pcm_disconnect_substream(struct snd_pcm_substream *substream) ...@@ -360,8 +371,10 @@ static void pcm_disconnect_substream(struct snd_pcm_substream *substream)
*/ */
void line6_pcm_disconnect(struct snd_line6_pcm *line6pcm) void line6_pcm_disconnect(struct snd_line6_pcm *line6pcm)
{ {
pcm_disconnect_substream(get_substream(line6pcm, SNDRV_PCM_STREAM_CAPTURE)); pcm_disconnect_substream(get_substream
pcm_disconnect_substream(get_substream(line6pcm, SNDRV_PCM_STREAM_PLAYBACK)); (line6pcm, SNDRV_PCM_STREAM_CAPTURE));
pcm_disconnect_substream(get_substream
(line6pcm, SNDRV_PCM_STREAM_PLAYBACK));
line6_unlink_wait_clear_audio_out_urbs(line6pcm); line6_unlink_wait_clear_audio_out_urbs(line6pcm);
line6_unlink_wait_clear_audio_in_urbs(line6pcm); line6_unlink_wait_clear_audio_in_urbs(line6pcm);
} }
...@@ -442,8 +455,7 @@ int line6_init_pcm(struct usb_line6 *line6, ...@@ -442,8 +455,7 @@ int line6_init_pcm(struct usb_line6 *line6,
line6pcm->ep_audio_write = ep_write; line6pcm->ep_audio_write = ep_write;
line6pcm->max_packet_size = usb_maxpacket(line6->usbdev, line6pcm->max_packet_size = usb_maxpacket(line6->usbdev,
usb_rcvintpipe(line6->usbdev, usb_rcvintpipe(line6->usbdev,
ep_read), ep_read), 0);
0);
line6pcm->properties = properties; line6pcm->properties = properties;
line6->line6pcm = line6pcm; line6->line6pcm = line6pcm;
...@@ -471,7 +483,9 @@ int line6_init_pcm(struct usb_line6 *line6, ...@@ -471,7 +483,9 @@ int line6_init_pcm(struct usb_line6 *line6,
return err; return err;
/* mixer: */ /* mixer: */
err = snd_ctl_add(line6->card, snd_ctl_new1(&line6_control_playback, line6pcm)); err =
snd_ctl_add(line6->card,
snd_ctl_new1(&line6_control_playback, line6pcm));
if (err < 0) if (err < 0)
return err; return err;
......
/* /*
* Line6 Linux USB driver - 0.9.0 * Line6 Linux USB driver - 0.9.1beta
* *
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at) * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
* *
...@@ -16,13 +16,11 @@ ...@@ -16,13 +16,11 @@
#ifndef PCM_H #ifndef PCM_H
#define PCM_H #define PCM_H
#include <sound/pcm.h> #include <sound/pcm.h>
#include "driver.h" #include "driver.h"
#include "usbdefs.h" #include "usbdefs.h"
/* number of URBs */ /* number of URBs */
#define LINE6_ISO_BUFFERS 2 #define LINE6_ISO_BUFFERS 2
...@@ -44,13 +42,11 @@ ...@@ -44,13 +42,11 @@
#define LINE6_BACKUP_MONITOR_SIGNAL 0 #define LINE6_BACKUP_MONITOR_SIGNAL 0
#define LINE6_REUSE_DMA_AREA_FOR_PLAYBACK 0 #define LINE6_REUSE_DMA_AREA_FOR_PLAYBACK 0
/* /*
Get substream from Line6 PCM data structure Get substream from Line6 PCM data structure
*/ */
#define get_substream(line6pcm, stream) (line6pcm->pcm->streams[stream].substream) #define get_substream(line6pcm, stream) (line6pcm->pcm->streams[stream].substream)
/* /*
PCM mode bits and masks. PCM mode bits and masks.
"ALSA": operations triggered by applications via ALSA "ALSA": operations triggered by applications via ALSA
...@@ -71,6 +67,7 @@ enum { ...@@ -71,6 +67,7 @@ enum {
BIT_PREPARED, BIT_PREPARED,
/* individual masks: */ /* individual masks: */
/* *INDENT-OFF* */
MASK_PCM_ALSA_PLAYBACK = 1 << BIT_PCM_ALSA_PLAYBACK, MASK_PCM_ALSA_PLAYBACK = 1 << BIT_PCM_ALSA_PLAYBACK,
MASK_PCM_ALSA_CAPTURE = 1 << BIT_PCM_ALSA_CAPTURE, MASK_PCM_ALSA_CAPTURE = 1 << BIT_PCM_ALSA_CAPTURE,
MASK_PCM_MONITOR_PLAYBACK = 1 << BIT_PCM_MONITOR_PLAYBACK, MASK_PCM_MONITOR_PLAYBACK = 1 << BIT_PCM_MONITOR_PLAYBACK,
...@@ -81,6 +78,7 @@ enum { ...@@ -81,6 +78,7 @@ enum {
#endif #endif
MASK_PAUSE_PLAYBACK = 1 << BIT_PAUSE_PLAYBACK, MASK_PAUSE_PLAYBACK = 1 << BIT_PAUSE_PLAYBACK,
MASK_PREPARED = 1 << BIT_PREPARED, MASK_PREPARED = 1 << BIT_PREPARED,
/* *INDENT-ON* */
/* combined masks (by operation): */ /* combined masks (by operation): */
MASK_PCM_ALSA = MASK_PCM_ALSA_PLAYBACK | MASK_PCM_ALSA_CAPTURE, MASK_PCM_ALSA = MASK_PCM_ALSA_PLAYBACK | MASK_PCM_ALSA_CAPTURE,
...@@ -91,8 +89,12 @@ enum { ...@@ -91,8 +89,12 @@ enum {
/* combined masks (by direction): */ /* combined masks (by direction): */
#ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE #ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE
MASK_PLAYBACK = MASK_PCM_ALSA_PLAYBACK | MASK_PCM_MONITOR_PLAYBACK | MASK_PCM_IMPULSE_PLAYBACK, MASK_PLAYBACK =
MASK_CAPTURE = MASK_PCM_ALSA_CAPTURE | MASK_PCM_MONITOR_CAPTURE | MASK_PCM_IMPULSE_CAPTURE MASK_PCM_ALSA_PLAYBACK | MASK_PCM_MONITOR_PLAYBACK |
MASK_PCM_IMPULSE_PLAYBACK,
MASK_CAPTURE =
MASK_PCM_ALSA_CAPTURE | MASK_PCM_MONITOR_CAPTURE |
MASK_PCM_IMPULSE_CAPTURE
#else #else
MASK_PLAYBACK = MASK_PCM_ALSA_PLAYBACK | MASK_PCM_MONITOR_PLAYBACK, MASK_PLAYBACK = MASK_PCM_ALSA_PLAYBACK | MASK_PCM_MONITOR_PLAYBACK,
MASK_CAPTURE = MASK_PCM_ALSA_CAPTURE | MASK_PCM_MONITOR_CAPTURE MASK_CAPTURE = MASK_PCM_ALSA_CAPTURE | MASK_PCM_MONITOR_CAPTURE
...@@ -302,7 +304,6 @@ struct snd_line6_pcm { ...@@ -302,7 +304,6 @@ struct snd_line6_pcm {
int last_frame_in, last_frame_out; int last_frame_in, last_frame_out;
}; };
extern int line6_init_pcm(struct usb_line6 *line6, extern int line6_init_pcm(struct usb_line6 *line6,
struct line6_pcm_properties *properties); struct line6_pcm_properties *properties);
extern int snd_line6_trigger(struct snd_pcm_substream *substream, int cmd); extern int snd_line6_trigger(struct snd_pcm_substream *substream, int cmd);
...@@ -311,7 +312,6 @@ extern void line6_pcm_disconnect(struct snd_line6_pcm *line6pcm); ...@@ -311,7 +312,6 @@ extern void line6_pcm_disconnect(struct snd_line6_pcm *line6pcm);
extern int line6_pcm_start(struct snd_line6_pcm *line6pcm, int channels); extern int line6_pcm_start(struct snd_line6_pcm *line6pcm, int channels);
extern int line6_pcm_stop(struct snd_line6_pcm *line6pcm, int channels); extern int line6_pcm_stop(struct snd_line6_pcm *line6pcm, int channels);
#define PRINT_FRAME_DIFF(op) { \ #define PRINT_FRAME_DIFF(op) { \
static int diff_prev = 1000; \ static int diff_prev = 1000; \
int diff = line6pcm->last_frame_out - line6pcm->last_frame_in; \ int diff = line6pcm->last_frame_out - line6pcm->last_frame_in; \
...@@ -321,5 +321,4 @@ extern int line6_pcm_stop(struct snd_line6_pcm *line6pcm, int channels); ...@@ -321,5 +321,4 @@ extern int line6_pcm_stop(struct snd_line6_pcm *line6pcm, int channels);
} \ } \
} }
#endif #endif
/* /*
* Line6 Linux USB driver - 0.9.0 * Line6 Linux USB driver - 0.9.1beta
* *
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at) * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
* *
...@@ -68,7 +68,16 @@ static void create_impulse_test_signal(struct snd_line6_pcm *line6pcm, ...@@ -68,7 +68,16 @@ static void create_impulse_test_signal(struct snd_line6_pcm *line6pcm,
int frames = urb_out->transfer_buffer_length / bytes_per_frame; int frames = urb_out->transfer_buffer_length / bytes_per_frame;
if (bytes_per_frame == 4) { if (bytes_per_frame == 4) {
/* TODO: add code for TonePort etc. */ int i;
short *pi = (short *)line6pcm->prev_fbuf;
short *po = (short *)urb_out->transfer_buffer;
for (i = 0; i < frames; ++i) {
po[0] = pi[0];
po[1] = 0;
pi += 2;
po += 2;
}
} else if (bytes_per_frame == 6) { } else if (bytes_per_frame == 6) {
int i, j; int i, j;
unsigned char *pi = line6pcm->prev_fbuf; unsigned char *pi = line6pcm->prev_fbuf;
...@@ -84,15 +93,13 @@ static void create_impulse_test_signal(struct snd_line6_pcm *line6pcm, ...@@ -84,15 +93,13 @@ static void create_impulse_test_signal(struct snd_line6_pcm *line6pcm,
pi += bytes_per_frame; pi += bytes_per_frame;
po += bytes_per_frame; po += bytes_per_frame;
} }
}
if (--line6pcm->impulse_count <= 0) { if (--line6pcm->impulse_count <= 0) {
((unsigned char *)(urb_out-> ((unsigned char *)(urb_out->transfer_buffer))[bytes_per_frame -
transfer_buffer))[bytes_per_frame -
1] = 1] =
line6pcm->impulse_volume; line6pcm->impulse_volume;
line6pcm->impulse_count = line6pcm->impulse_period; line6pcm->impulse_count = line6pcm->impulse_period;
} }
}
} }
#endif #endif
...@@ -130,6 +137,7 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm) ...@@ -130,6 +137,7 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm)
int index; int index;
unsigned long flags; unsigned long flags;
int i, urb_size, urb_frames; int i, urb_size, urb_frames;
int ret;
const int bytes_per_frame = line6pcm->properties->bytes_per_frame; const int bytes_per_frame = line6pcm->properties->bytes_per_frame;
const int frame_increment = const int frame_increment =
line6pcm->properties->snd_line6_rates.rats[0].num_min; line6pcm->properties->snd_line6_rates.rats[0].num_min;
...@@ -244,16 +252,20 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm) ...@@ -244,16 +252,20 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm)
create_impulse_test_signal(line6pcm, urb_out, create_impulse_test_signal(line6pcm, urb_out,
bytes_per_frame); bytes_per_frame);
if (line6pcm->flags & MASK_PCM_ALSA_CAPTURE) { if (line6pcm->flags & MASK_PCM_ALSA_CAPTURE) {
line6_capture_copy(line6pcm, urb_out->transfer_buffer, line6_capture_copy(line6pcm,
urb_out->transfer_buffer,
urb_out->
transfer_buffer_length);
line6_capture_check_period(line6pcm,
urb_out->transfer_buffer_length); urb_out->transfer_buffer_length);
} }
} else { } else {
#endif #endif
if (! if (!
(line6pcm->line6->properties-> (line6pcm->line6->
capabilities & LINE6_BIT_HWMON) properties->capabilities & LINE6_BIT_HWMON)
&& (line6pcm->flags & MASK_PLAYBACK) && (line6pcm->flags & MASK_PLAYBACK)
&& (line6pcm->flags & MASK_CAPTURE)) && (line6pcm->flags & MASK_CAPTURE))
add_monitor_signal(urb_out, line6pcm->prev_fbuf, add_monitor_signal(urb_out, line6pcm->prev_fbuf,
line6pcm->volume_monitor, line6pcm->volume_monitor,
bytes_per_frame); bytes_per_frame);
...@@ -271,11 +283,13 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm) ...@@ -271,11 +283,13 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm)
} }
#endif #endif
if (usb_submit_urb(urb_out, GFP_ATOMIC) == 0) ret = usb_submit_urb(urb_out, GFP_ATOMIC);
if (ret == 0)
set_bit(index, &line6pcm->active_urb_out); set_bit(index, &line6pcm->active_urb_out);
else else
dev_err(line6pcm->line6->ifcdev, dev_err(line6pcm->line6->ifcdev,
"URB out #%d submission failed\n", index); "URB out #%d submission failed (%d)\n", index, ret);
spin_unlock_irqrestore(&line6pcm->lock_audio_out, flags); spin_unlock_irqrestore(&line6pcm->lock_audio_out, flags);
return 0; return 0;
...@@ -355,8 +369,7 @@ static void audio_out_callback(struct urb *urb) ...@@ -355,8 +369,7 @@ static void audio_out_callback(struct urb *urb)
int i, index, length = 0, shutdown = 0; int i, index, length = 0, shutdown = 0;
unsigned long flags; unsigned long flags;
struct snd_line6_pcm *line6pcm = struct snd_line6_pcm *line6pcm = (struct snd_line6_pcm *)urb->context;
(struct snd_line6_pcm *)urb->context;
struct snd_pcm_substream *substream = struct snd_pcm_substream *substream =
get_substream(line6pcm, SNDRV_PCM_STREAM_PLAYBACK); get_substream(line6pcm, SNDRV_PCM_STREAM_PLAYBACK);
...@@ -391,7 +404,7 @@ static void audio_out_callback(struct urb *urb) ...@@ -391,7 +404,7 @@ static void audio_out_callback(struct urb *urb)
clear_bit(index, &line6pcm->active_urb_out); clear_bit(index, &line6pcm->active_urb_out);
for (i = LINE6_ISO_PACKETS; i--;) for (i = LINE6_ISO_PACKETS; i--;)
if (urb->iso_frame_desc[i].status == -ESHUTDOWN) { if (urb->iso_frame_desc[i].status == -EXDEV) {
shutdown = 1; shutdown = 1;
break; break;
} }
...@@ -422,8 +435,8 @@ static int snd_line6_playback_open(struct snd_pcm_substream *substream) ...@@ -422,8 +435,8 @@ static int snd_line6_playback_open(struct snd_pcm_substream *substream)
struct snd_line6_pcm *line6pcm = snd_pcm_substream_chip(substream); struct snd_line6_pcm *line6pcm = snd_pcm_substream_chip(substream);
err = snd_pcm_hw_constraint_ratdens(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, err = snd_pcm_hw_constraint_ratdens(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
(&line6pcm->properties-> (&line6pcm->
snd_line6_rates)); properties->snd_line6_rates));
if (err < 0) if (err < 0)
return err; return err;
...@@ -554,8 +567,8 @@ int line6_create_audio_out_urbs(struct snd_line6_pcm *line6pcm) ...@@ -554,8 +567,8 @@ int line6_create_audio_out_urbs(struct snd_line6_pcm *line6pcm)
urb->dev = line6pcm->line6->usbdev; urb->dev = line6pcm->line6->usbdev;
urb->pipe = urb->pipe =
usb_sndisocpipe(line6pcm->line6->usbdev, usb_sndisocpipe(line6pcm->line6->usbdev,
line6pcm-> line6pcm->ep_audio_write &
ep_audio_write & USB_ENDPOINT_NUMBER_MASK); USB_ENDPOINT_NUMBER_MASK);
urb->transfer_flags = URB_ISO_ASAP; urb->transfer_flags = URB_ISO_ASAP;
urb->start_frame = -1; urb->start_frame = -1;
urb->number_of_packets = LINE6_ISO_PACKETS; urb->number_of_packets = LINE6_ISO_PACKETS;
......
/* /*
* Line6 Linux USB driver - 0.9.0 * Line6 Linux USB driver - 0.9.1beta
* *
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at) * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
* *
...@@ -12,12 +12,10 @@ ...@@ -12,12 +12,10 @@
#ifndef PLAYBACK_H #ifndef PLAYBACK_H
#define PLAYBACK_H #define PLAYBACK_H
#include <sound/pcm.h> #include <sound/pcm.h>
#include "driver.h" #include "driver.h"
/* /*
When the TonePort is used with jack in full duplex mode and the outputs are When the TonePort is used with jack in full duplex mode and the outputs are
not connected, the software monitor produces an ugly noise since everything not connected, the software monitor produces an ugly noise since everything
...@@ -28,7 +26,6 @@ ...@@ -28,7 +26,6 @@
*/ */
#define USE_CLEAR_BUFFER_WORKAROUND 1 #define USE_CLEAR_BUFFER_WORKAROUND 1
extern struct snd_pcm_ops snd_line6_playback_ops; extern struct snd_pcm_ops snd_line6_playback_ops;
extern int line6_create_audio_out_urbs(struct snd_line6_pcm *line6pcm); extern int line6_create_audio_out_urbs(struct snd_line6_pcm *line6pcm);
......
This diff is collapsed.
/* /*
* Line6 Linux USB driver - 0.9.0 * Line6 Linux USB driver - 0.9.1beta
* *
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at) * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
* *
...@@ -12,7 +12,6 @@ ...@@ -12,7 +12,6 @@
#ifndef POD_H #ifndef POD_H
#define POD_H #define POD_H
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/usb.h> #include <linux/usb.h>
...@@ -23,7 +22,6 @@ ...@@ -23,7 +22,6 @@
#include "driver.h" #include "driver.h"
#include "dumprequest.h" #include "dumprequest.h"
/* /*
PODxt Live interfaces PODxt Live interfaces
*/ */
...@@ -41,7 +39,19 @@ ...@@ -41,7 +39,19 @@
*/ */
#define POD_CONTROL_SIZE 0x80 #define POD_CONTROL_SIZE 0x80
#define POD_BUFSIZE_DUMPREQ 7 #define POD_BUFSIZE_DUMPREQ 7
#define POD_STARTUP_DELAY 3000 #define POD_STARTUP_DELAY 1000
/*
Stages of POD startup procedure
*/
enum {
POD_STARTUP_INIT = 1,
POD_STARTUP_DUMPREQ,
POD_STARTUP_VERSIONREQ,
POD_STARTUP_WORKQUEUE,
POD_STARTUP_SETUP,
POD_STARTUP_LAST = POD_STARTUP_SETUP - 1
};
/** /**
Data structure for values that need to be requested explicitly. Data structure for values that need to be requested explicitly.
...@@ -183,14 +193,13 @@ struct usb_line6_pod { ...@@ -183,14 +193,13 @@ struct usb_line6_pod {
char midi_postprocess; char midi_postprocess;
}; };
extern void line6_pod_disconnect(struct usb_interface *interface); extern void line6_pod_disconnect(struct usb_interface *interface);
extern int line6_pod_init(struct usb_interface *interface, struct usb_line6_pod *pod); extern int line6_pod_init(struct usb_interface *interface,
struct usb_line6_pod *pod);
extern void line6_pod_midi_postprocess(struct usb_line6_pod *pod, extern void line6_pod_midi_postprocess(struct usb_line6_pod *pod,
unsigned char *data, int length); unsigned char *data, int length);
extern void line6_pod_process_message(struct usb_line6_pod *pod); extern void line6_pod_process_message(struct usb_line6_pod *pod);
extern void line6_pod_transmit_parameter(struct usb_line6_pod *pod, int param, extern void line6_pod_transmit_parameter(struct usb_line6_pod *pod, int param,
int value); int value);
#endif #endif
#ifndef DRIVER_REVISION #ifndef DRIVER_REVISION
/* current subversion revision */ /* current subversion revision */
#define DRIVER_REVISION " (revision 665)" #define DRIVER_REVISION " (revision 684)"
#endif #endif
/* /*
* Line6 Linux USB driver - 0.9.0 * Line6 Linux USB driver - 0.9.1beta
* *
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at) * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
* Emil Myhrman (emil.myhrman@gmail.com) * Emil Myhrman (emil.myhrman@gmail.com)
...@@ -19,13 +19,10 @@ ...@@ -19,13 +19,10 @@
#include "playback.h" #include "playback.h"
#include "toneport.h" #include "toneport.h"
static int toneport_send_cmd(struct usb_device *usbdev, int cmd1, int cmd2); static int toneport_send_cmd(struct usb_device *usbdev, int cmd1, int cmd2);
#define TONEPORT_PCM_DELAY 1 #define TONEPORT_PCM_DELAY 1
static struct snd_ratden toneport_ratden = { static struct snd_ratden toneport_ratden = {
.num_min = 44100, .num_min = 44100,
.num_max = 44100, .num_max = 44100,
...@@ -54,8 +51,7 @@ static struct line6_pcm_properties toneport_pcm_properties = { ...@@ -54,8 +51,7 @@ static struct line6_pcm_properties toneport_pcm_properties = {
.period_bytes_min = 64, .period_bytes_min = 64,
.period_bytes_max = 8192, .period_bytes_max = 8192,
.periods_min = 1, .periods_min = 1,
.periods_max = 1024 .periods_max = 1024},
},
.snd_line6_capture_hw = { .snd_line6_capture_hw = {
.info = (SNDRV_PCM_INFO_MMAP | .info = (SNDRV_PCM_INFO_MMAP |
SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_INTERLEAVED |
...@@ -75,12 +71,10 @@ static struct line6_pcm_properties toneport_pcm_properties = { ...@@ -75,12 +71,10 @@ static struct line6_pcm_properties toneport_pcm_properties = {
.period_bytes_min = 64, .period_bytes_min = 64,
.period_bytes_max = 8192, .period_bytes_max = 8192,
.periods_min = 1, .periods_min = 1,
.periods_max = 1024 .periods_max = 1024},
},
.snd_line6_rates = { .snd_line6_rates = {
.nrats = 1, .nrats = 1,
.rats = &toneport_ratden .rats = &toneport_ratden},
},
.bytes_per_frame = 4 .bytes_per_frame = 4
}; };
...@@ -93,17 +87,16 @@ static struct line6_pcm_properties toneport_pcm_properties = { ...@@ -93,17 +87,16 @@ static struct line6_pcm_properties toneport_pcm_properties = {
static int led_red = 0x00; static int led_red = 0x00;
static int led_green = 0x26; static int led_green = 0x26;
struct ToneportSourceInfo struct ToneportSourceInfo {
{
const char *name; const char *name;
int code; int code;
}; };
static const struct ToneportSourceInfo toneport_source_info[] = { static const struct ToneportSourceInfo toneport_source_info[] = {
{ "Microphone", 0x0a01 }, {"Microphone", 0x0a01},
{ "Line" , 0x0801 }, {"Line", 0x0801},
{ "Instrument", 0x0b01 }, {"Instrument", 0x0b01},
{ "Inst & Mic", 0x0901 } {"Inst & Mic", 0x0901}
}; };
static bool toneport_has_led(short product) static bool toneport_has_led(short product)
...@@ -166,7 +159,6 @@ static DEVICE_ATTR(led_red, S_IWUGO | S_IRUGO, line6_nop_read, ...@@ -166,7 +159,6 @@ static DEVICE_ATTR(led_red, S_IWUGO | S_IRUGO, line6_nop_read,
static DEVICE_ATTR(led_green, S_IWUGO | S_IRUGO, line6_nop_read, static DEVICE_ATTR(led_green, S_IWUGO | S_IRUGO, line6_nop_read,
toneport_set_led_green); toneport_set_led_green);
static int toneport_send_cmd(struct usb_device *usbdev, int cmd1, int cmd2) static int toneport_send_cmd(struct usb_device *usbdev, int cmd1, int cmd2)
{ {
int ret; int ret;
...@@ -209,10 +201,16 @@ static int snd_toneport_monitor_put(struct snd_kcontrol *kcontrol, ...@@ -209,10 +201,16 @@ static int snd_toneport_monitor_put(struct snd_kcontrol *kcontrol,
{ {
struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol); struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol);
if(ucontrol->value.integer.value[0] == line6pcm->volume_monitor) if (ucontrol->value.integer.value[0] == line6pcm->volume_monitor)
return 0; return 0;
line6pcm->volume_monitor = ucontrol->value.integer.value[0]; line6pcm->volume_monitor = ucontrol->value.integer.value[0];
if (line6pcm->volume_monitor > 0)
line6_pcm_start(line6pcm, MASK_PCM_MONITOR);
else
line6_pcm_stop(line6pcm, MASK_PCM_MONITOR);
return 1; return 1;
} }
...@@ -225,7 +223,7 @@ static int snd_toneport_source_info(struct snd_kcontrol *kcontrol, ...@@ -225,7 +223,7 @@ static int snd_toneport_source_info(struct snd_kcontrol *kcontrol,
uinfo->count = 1; uinfo->count = 1;
uinfo->value.enumerated.items = size; uinfo->value.enumerated.items = size;
if(uinfo->value.enumerated.item >= size) if (uinfo->value.enumerated.item >= size)
uinfo->value.enumerated.item = size - 1; uinfo->value.enumerated.item = size - 1;
strcpy(uinfo->value.enumerated.name, strcpy(uinfo->value.enumerated.name,
...@@ -239,7 +237,8 @@ static int snd_toneport_source_get(struct snd_kcontrol *kcontrol, ...@@ -239,7 +237,8 @@ static int snd_toneport_source_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol); struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol);
struct usb_line6_toneport *toneport = (struct usb_line6_toneport *)line6pcm->line6; struct usb_line6_toneport *toneport =
(struct usb_line6_toneport *)line6pcm->line6;
ucontrol->value.enumerated.item[0] = toneport->source; ucontrol->value.enumerated.item[0] = toneport->source;
return 0; return 0;
} }
...@@ -249,13 +248,15 @@ static int snd_toneport_source_put(struct snd_kcontrol *kcontrol, ...@@ -249,13 +248,15 @@ static int snd_toneport_source_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol); struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol);
struct usb_line6_toneport *toneport = (struct usb_line6_toneport *)line6pcm->line6; struct usb_line6_toneport *toneport =
(struct usb_line6_toneport *)line6pcm->line6;
if(ucontrol->value.enumerated.item[0] == toneport->source) if (ucontrol->value.enumerated.item[0] == toneport->source)
return 0; return 0;
toneport->source = ucontrol->value.enumerated.item[0]; toneport->source = ucontrol->value.enumerated.item[0];
toneport_send_cmd(toneport->line6.usbdev, toneport_source_info[toneport->source].code, 0x0000); toneport_send_cmd(toneport->line6.usbdev,
toneport_source_info[toneport->source].code, 0x0000);
return 1; return 1;
} }
...@@ -321,10 +322,12 @@ static void toneport_setup(struct usb_line6_toneport *toneport) ...@@ -321,10 +322,12 @@ static void toneport_setup(struct usb_line6_toneport *toneport)
toneport_send_cmd(usbdev, 0x0301, 0x0000); toneport_send_cmd(usbdev, 0x0301, 0x0000);
/* initialize source select: */ /* initialize source select: */
switch(usbdev->descriptor.idProduct) { switch (usbdev->descriptor.idProduct) {
case LINE6_DEVID_TONEPORT_UX1: case LINE6_DEVID_TONEPORT_UX1:
case LINE6_DEVID_PODSTUDIO_UX1: case LINE6_DEVID_PODSTUDIO_UX1:
toneport_send_cmd(usbdev, toneport_source_info[toneport->source].code, 0x0000); toneport_send_cmd(usbdev,
toneport_source_info[toneport->source].code,
0x0000);
} }
if (toneport_has_led(usbdev->descriptor.idProduct)) if (toneport_has_led(usbdev->descriptor.idProduct))
...@@ -357,16 +360,22 @@ static int toneport_try_init(struct usb_interface *interface, ...@@ -357,16 +360,22 @@ static int toneport_try_init(struct usb_interface *interface,
} }
/* register monitor control: */ /* register monitor control: */
err = snd_ctl_add(line6->card, snd_ctl_new1(&toneport_control_monitor, line6->line6pcm)); err =
snd_ctl_add(line6->card,
snd_ctl_new1(&toneport_control_monitor,
line6->line6pcm));
if (err < 0) { if (err < 0) {
return err; return err;
} }
/* register source select control: */ /* register source select control: */
switch(usbdev->descriptor.idProduct) { switch (usbdev->descriptor.idProduct) {
case LINE6_DEVID_TONEPORT_UX1: case LINE6_DEVID_TONEPORT_UX1:
case LINE6_DEVID_PODSTUDIO_UX1: case LINE6_DEVID_PODSTUDIO_UX1:
err = snd_ctl_add(line6->card, snd_ctl_new1(&toneport_control_source, line6->line6pcm)); err =
snd_ctl_add(line6->card,
snd_ctl_new1(&toneport_control_source,
line6->line6pcm));
if (err < 0) { if (err < 0) {
return err; return err;
} }
...@@ -382,8 +391,10 @@ static int toneport_try_init(struct usb_interface *interface, ...@@ -382,8 +391,10 @@ static int toneport_try_init(struct usb_interface *interface,
line6_read_data(line6, 0x80c2, &toneport->firmware_version, 1); line6_read_data(line6, 0x80c2, &toneport->firmware_version, 1);
if (toneport_has_led(usbdev->descriptor.idProduct)) { if (toneport_has_led(usbdev->descriptor.idProduct)) {
CHECK_RETURN(device_create_file(&interface->dev, &dev_attr_led_red)); CHECK_RETURN(device_create_file
CHECK_RETURN(device_create_file(&interface->dev, &dev_attr_led_green)); (&interface->dev, &dev_attr_led_red));
CHECK_RETURN(device_create_file
(&interface->dev, &dev_attr_led_green));
} }
toneport_setup(toneport); toneport_setup(toneport);
......
/* /*
* Line6 Linux USB driver - 0.9.0 * Line6 Linux USB driver - 0.9.1beta
* *
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at) * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
* *
...@@ -12,13 +12,11 @@ ...@@ -12,13 +12,11 @@
#ifndef TONEPORT_H #ifndef TONEPORT_H
#define TONEPORT_H #define TONEPORT_H
#include <linux/usb.h> #include <linux/usb.h>
#include <sound/core.h> #include <sound/core.h>
#include "driver.h" #include "driver.h"
struct usb_line6_toneport { struct usb_line6_toneport {
/** /**
Generic Line6 USB data. Generic Line6 USB data.
...@@ -46,11 +44,9 @@ struct usb_line6_toneport { ...@@ -46,11 +44,9 @@ struct usb_line6_toneport {
struct timer_list timer; struct timer_list timer;
}; };
extern void line6_toneport_disconnect(struct usb_interface *interface); extern void line6_toneport_disconnect(struct usb_interface *interface);
extern int line6_toneport_init(struct usb_interface *interface, extern int line6_toneport_init(struct usb_interface *interface,
struct usb_line6_toneport *toneport); struct usb_line6_toneport *toneport);
extern void line6_toneport_reset_resume(struct usb_line6_toneport *toneport); extern void line6_toneport_reset_resume(struct usb_line6_toneport *toneport);
#endif #endif
/* /*
* Line6 Linux USB driver - 0.9.0 * Line6 Linux USB driver - 0.9.1beta
* *
* Copyright (C) 2005-2008 Markus Grabner (grabner@icg.tugraz.at) * Copyright (C) 2005-2008 Markus Grabner (grabner@icg.tugraz.at)
* *
...@@ -12,7 +12,6 @@ ...@@ -12,7 +12,6 @@
#ifndef USBDEFS_H #ifndef USBDEFS_H
#define USBDEFS_H #define USBDEFS_H
#define LINE6_VENDOR_ID 0x0e41 #define LINE6_VENDOR_ID 0x0e41
#define USB_INTERVALS_PER_SECOND 1000 #define USB_INTERVALS_PER_SECOND 1000
...@@ -80,5 +79,4 @@ ...@@ -80,5 +79,4 @@
#define LINE6_FALLBACK_INTERVAL 10 #define LINE6_FALLBACK_INTERVAL 10
#define LINE6_FALLBACK_MAXPACKETSIZE 16 #define LINE6_FALLBACK_MAXPACKETSIZE 16
#endif #endif
This diff is collapsed.
/* /*
* Line6 Linux USB driver - 0.9.0 * Line6 Linux USB driver - 0.9.1beta
* *
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at) * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
* *
...@@ -12,7 +12,6 @@ ...@@ -12,7 +12,6 @@
#ifndef VARIAX_H #ifndef VARIAX_H
#define VARIAX_H #define VARIAX_H
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/wait.h> #include <linux/wait.h>
...@@ -21,11 +20,23 @@ ...@@ -21,11 +20,23 @@
#include "driver.h" #include "driver.h"
#include "dumprequest.h" #include "dumprequest.h"
#define VARIAX_STARTUP_DELAY1 1000 #define VARIAX_STARTUP_DELAY1 1000
#define VARIAX_STARTUP_DELAY3 100 #define VARIAX_STARTUP_DELAY3 100
#define VARIAX_STARTUP_DELAY4 100 #define VARIAX_STARTUP_DELAY4 100
/*
Stages of Variax startup procedure
*/
enum {
VARIAX_STARTUP_INIT = 1,
VARIAX_STARTUP_VERSIONREQ,
VARIAX_STARTUP_WAIT,
VARIAX_STARTUP_ACTIVATE,
VARIAX_STARTUP_DUMPREQ,
VARIAX_STARTUP_WORKQUEUE,
VARIAX_STARTUP_SETUP,
VARIAX_STARTUP_LAST = VARIAX_STARTUP_SETUP - 1
};
enum { enum {
VARIAX_DUMP_PASS1 = LINE6_DUMP_CURRENT, VARIAX_DUMP_PASS1 = LINE6_DUMP_CURRENT,
...@@ -33,7 +44,6 @@ enum { ...@@ -33,7 +44,6 @@ enum {
VARIAX_DUMP_PASS3 VARIAX_DUMP_PASS3
}; };
/** /**
Binary Variax model dump Binary Variax model dump
*/ */
...@@ -59,7 +69,8 @@ struct usb_line6_variax { ...@@ -59,7 +69,8 @@ struct usb_line6_variax {
Dump request structure. Dump request structure.
Append two extra buffers for 3-pass data query. Append two extra buffers for 3-pass data query.
*/ */
struct line6_dump_request dumpreq; struct line6_dump_reqbuf extrabuf[2]; struct line6_dump_request dumpreq;
struct line6_dump_reqbuf extrabuf[2];
/** /**
Buffer for activation code. Buffer for activation code.
...@@ -102,9 +113,10 @@ struct usb_line6_variax { ...@@ -102,9 +113,10 @@ struct usb_line6_variax {
struct work_struct startup_work; struct work_struct startup_work;
/** /**
Timer for device initializaton. Timers for device initializaton.
*/ */
struct timer_list startup_timer; struct timer_list startup_timer1;
struct timer_list startup_timer2;
/** /**
Current progress in startup procedure. Current progress in startup procedure.
...@@ -112,11 +124,9 @@ struct usb_line6_variax { ...@@ -112,11 +124,9 @@ struct usb_line6_variax {
int startup_progress; int startup_progress;
}; };
extern void line6_variax_disconnect(struct usb_interface *interface); extern void line6_variax_disconnect(struct usb_interface *interface);
extern int line6_variax_init(struct usb_interface *interface, extern int line6_variax_init(struct usb_interface *interface,
struct usb_line6_variax *variax); struct usb_line6_variax *variax);
extern void line6_variax_process_message(struct usb_line6_variax *variax); extern void line6_variax_process_message(struct usb_line6_variax *variax);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment