summaryrefslogtreecommitdiffstats
path: root/sound/usb
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2015-01-20 10:08:06 +0100
committerTakashi Iwai <tiwai@suse.de>2015-01-20 10:08:06 +0100
commit86b5f3ec41b5798811ec488fda4865a9781ec8ef (patch)
tree8e9679d8c0c723fdcd6a5a7ace1c4e1a6a1d8a78 /sound/usb
parent2a52b6eef7386cc19dfc0a2e82a7e23d807e51e5 (diff)
parentc078a4aac2944cb9cac5cdb4e9a482623435578b (diff)
Merge branch 'topic/line6' into for-next
Diffstat (limited to 'sound/usb')
-rw-r--r--sound/usb/Makefile2
-rw-r--r--sound/usb/line6/Kconfig42
-rw-r--r--sound/usb/line6/Makefile22
-rw-r--r--sound/usb/line6/audio.c71
-rw-r--r--sound/usb/line6/audio.h21
-rw-r--r--sound/usb/line6/capture.c16
-rw-r--r--sound/usb/line6/capture.h2
-rw-r--r--sound/usb/line6/driver.c626
-rw-r--r--sound/usb/line6/driver.h69
-rw-r--r--sound/usb/line6/midi.c78
-rw-r--r--sound/usb/line6/midi.h4
-rw-r--r--sound/usb/line6/midibuf.c4
-rw-r--r--sound/usb/line6/midibuf.h2
-rw-r--r--sound/usb/line6/pcm.c252
-rw-r--r--sound/usb/line6/pcm.h28
-rw-r--r--sound/usb/line6/playback.c20
-rw-r--r--sound/usb/line6/playback.h2
-rw-r--r--sound/usb/line6/pod.c274
-rw-r--r--sound/usb/line6/pod.h92
-rw-r--r--sound/usb/line6/podhd.c177
-rw-r--r--sound/usb/line6/podhd.h29
-rw-r--r--sound/usb/line6/toneport.c251
-rw-r--r--sound/usb/line6/toneport.h51
-rw-r--r--sound/usb/line6/usbdefs.h2
-rw-r--r--sound/usb/line6/variax.c167
-rw-r--r--sound/usb/line6/variax.h70
26 files changed, 946 insertions, 1428 deletions
diff --git a/sound/usb/Makefile b/sound/usb/Makefile
index 54045b745d11..2d2d122b069f 100644
--- a/sound/usb/Makefile
+++ b/sound/usb/Makefile
@@ -25,4 +25,4 @@ obj-$(CONFIG_SND_USB_USX2Y) += snd-usbmidi-lib.o
obj-$(CONFIG_SND_USB_US122L) += snd-usbmidi-lib.o
obj-$(CONFIG_SND) += misc/ usx2y/ caiaq/ 6fire/ hiface/ bcd2000/
-obj-$(CONFIG_LINE6_USB) += line6/
+obj-$(CONFIG_SND_USB_LINE6) += line6/
diff --git a/sound/usb/line6/Kconfig b/sound/usb/line6/Kconfig
index 4f1219b4c692..af20947e0bda 100644
--- a/sound/usb/line6/Kconfig
+++ b/sound/usb/line6/Kconfig
@@ -1,12 +1,14 @@
-menuconfig LINE6_USB
- tristate "Line6 USB support"
- depends on USB && SND
+config SND_USB_LINE6
+ tristate
select SND_RAWMIDI
select SND_PCM
+
+config SND_USB_POD
+ tristate "Line 6 POD USB support"
+ select SND_USB_LINE6
help
- This is a driver for the guitar amp, cab, and effects modeller
- PODxt Pro by Line6 (and similar devices), supporting the
- following features:
+ This is a driver for PODxt and other similar devices,
+ supporting the following features:
* Reading/writing individual parameters
* Reading/writing complete channel, effects setup, and amp
setup data
@@ -18,21 +20,21 @@ menuconfig LINE6_USB
* Signal routing (record clean/processed guitar signal,
re-amping)
- Preliminary support for the Variax Workbench and TonePort
- devices is included.
-
-if LINE6_USB
+config SND_USB_PODHD
+ tristate "Line 6 POD HD300/400/500 USB support"
+ select SND_USB_LINE6
+ help
+ This is a driver for POD HD300, 400 and 500 devices.
-config LINE6_USB_IMPULSE_RESPONSE
- bool "measure impulse response"
- default n
+config SND_USB_TONEPORT
+ tristate "TonePort GX, UX1 and UX2 USB support"
+ select SND_USB_LINE6
help
- Say Y here to add code to measure the impulse response of a Line6
- device. This is more accurate than user-space methods since it
- bypasses any PCM data buffering (e.g., by ALSA or jack). This is
- useful for assessing the performance of new devices, but is not
- required for normal operation.
+ This is a driver for TonePort GX, UX1 and UX2 devices.
- If unsure, say N.
+config SND_USB_VARIAX
+ tristate "Variax Workbench USB support"
+ select SND_USB_LINE6
+ help
+ This is a driver for Variax Workbench device.
-endif # LINE6_USB
diff --git a/sound/usb/line6/Makefile b/sound/usb/line6/Makefile
index ae5c374b0f87..b8b3b2a543d8 100644
--- a/sound/usb/line6/Makefile
+++ b/sound/usb/line6/Makefile
@@ -1,14 +1,18 @@
-obj-$(CONFIG_LINE6_USB) += line6usb.o
-
-line6usb-y := \
- audio.o \
+snd-usb-line6-y := \
capture.o \
driver.o \
midi.o \
midibuf.o \
pcm.o \
- playback.o \
- pod.o \
- toneport.o \
- variax.o \
- podhd.o
+ playback.o
+
+snd-usb-pod-y := pod.o
+snd-usb-podhd-y := podhd.o
+snd-usb-toneport-y := toneport.o
+snd-usb-variax-y := variax.o
+
+obj-$(CONFIG_SND_USB_LINE6) += snd-usb-line6.o
+obj-$(CONFIG_SND_USB_POD) += snd-usb-pod.o
+obj-$(CONFIG_SND_USB_PODHD) += snd-usb-podhd.o
+obj-$(CONFIG_SND_USB_TONEPORT) += snd-usb-toneport.o
+obj-$(CONFIG_SND_USB_VARIAX) += snd-usb-variax.o
diff --git a/sound/usb/line6/audio.c b/sound/usb/line6/audio.c
deleted file mode 100644
index 171d80c1b020..000000000000
--- a/sound/usb/line6/audio.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Line6 Linux USB driver - 0.9.1beta
- *
- * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, version 2.
- *
- */
-
-#include <sound/core.h>
-#include <sound/initval.h>
-#include <linux/export.h>
-
-#include "driver.h"
-#include "audio.h"
-
-/*
- Initialize the Line6 USB audio system.
-*/
-int line6_init_audio(struct usb_line6 *line6)
-{
- struct snd_card *card;
- int err;
-
- err = snd_card_new(line6->ifcdev,
- SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,
- THIS_MODULE, 0, &card);
- if (err < 0)
- return err;
-
- line6->card = card;
-
- strcpy(card->id, line6->properties->id);
- strcpy(card->driver, DRIVER_NAME);
- strcpy(card->shortname, line6->properties->name);
- /* longname is 80 chars - see asound.h */
- sprintf(card->longname, "Line6 %s at USB %s", line6->properties->name,
- dev_name(line6->ifcdev));
- return 0;
-}
-
-/*
- Register the Line6 USB audio system.
-*/
-int line6_register_audio(struct usb_line6 *line6)
-{
- int err;
-
- err = snd_card_register(line6->card);
- if (err < 0)
- return err;
-
- return 0;
-}
-
-/*
- Cleanup the Line6 USB audio system.
-*/
-void line6_cleanup_audio(struct usb_line6 *line6)
-{
- struct snd_card *card = line6->card;
-
- if (card == NULL)
- return;
-
- snd_card_disconnect(card);
- snd_card_free(card);
- line6->card = NULL;
-}
diff --git a/sound/usb/line6/audio.h b/sound/usb/line6/audio.h
deleted file mode 100644
index 5f8a09a0fa95..000000000000
--- a/sound/usb/line6/audio.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Line6 Linux USB driver - 0.9.1beta
- *
- * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, version 2.
- *
- */
-
-#ifndef AUDIO_H
-#define AUDIO_H
-
-#include "driver.h"
-
-extern void line6_cleanup_audio(struct usb_line6 *);
-extern int line6_init_audio(struct usb_line6 *);
-extern int line6_register_audio(struct usb_line6 *);
-
-#endif
diff --git a/sound/usb/line6/capture.c b/sound/usb/line6/capture.c
index f24c7c5e0a3e..5a010ba163fa 100644
--- a/sound/usb/line6/capture.c
+++ b/sound/usb/line6/capture.c
@@ -1,5 +1,5 @@
/*
- * Line6 Linux USB driver - 0.9.1beta
+ * Line 6 Linux USB driver
*
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
*
@@ -14,11 +14,9 @@
#include <sound/pcm.h>
#include <sound/pcm_params.h>
-#include "audio.h"
#include "capture.h"
#include "driver.h"
#include "pcm.h"
-#include "pod.h"
/*
Find a free URB and submit it.
@@ -245,9 +243,7 @@ static void audio_in_callback(struct urb *urb)
line6pcm->prev_fbuf = fbuf;
line6pcm->prev_fsize = fsize;
-#ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE
if (!(line6pcm->flags & LINE6_BITS_PCM_IMPULSE))
-#endif
if (test_bit(LINE6_INDEX_PCM_ALSA_CAPTURE_STREAM,
&line6pcm->flags) && (fsize > 0))
line6_capture_copy(line6pcm, fbuf, fsize);
@@ -263,9 +259,7 @@ static void audio_in_callback(struct urb *urb)
if (!shutdown) {
submit_audio_in_urb(line6pcm);
-#ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE
if (!(line6pcm->flags & LINE6_BITS_PCM_IMPULSE))
-#endif
if (test_bit(LINE6_INDEX_PCM_ALSA_CAPTURE_STREAM,
&line6pcm->flags))
line6_capture_check_period(line6pcm, length);
@@ -347,9 +341,7 @@ int snd_line6_capture_trigger(struct snd_line6_pcm *line6pcm, int cmd)
switch (cmd) {
case SNDRV_PCM_TRIGGER_START:
-#ifdef CONFIG_PM
case SNDRV_PCM_TRIGGER_RESUME:
-#endif
err = line6_pcm_acquire(line6pcm,
LINE6_BIT_PCM_ALSA_CAPTURE_STREAM);
@@ -359,9 +351,7 @@ int snd_line6_capture_trigger(struct snd_line6_pcm *line6pcm, int cmd)
break;
case SNDRV_PCM_TRIGGER_STOP:
-#ifdef CONFIG_PM
case SNDRV_PCM_TRIGGER_SUSPEND:
-#endif
err = line6_pcm_release(line6pcm,
LINE6_BIT_PCM_ALSA_CAPTURE_STREAM);
@@ -411,10 +401,8 @@ int line6_create_audio_in_urbs(struct snd_line6_pcm *line6pcm)
urb = line6pcm->urb_audio_in[i] =
usb_alloc_urb(LINE6_ISO_PACKETS, GFP_KERNEL);
- if (urb == NULL) {
- dev_err(line6->ifcdev, "Out of memory\n");
+ if (urb == NULL)
return -ENOMEM;
- }
urb->dev = line6->usbdev;
urb->pipe =
diff --git a/sound/usb/line6/capture.h b/sound/usb/line6/capture.h
index 4157bcb598a9..0939f400a405 100644
--- a/sound/usb/line6/capture.h
+++ b/sound/usb/line6/capture.h
@@ -1,5 +1,5 @@
/*
- * Line6 Linux USB driver - 0.9.1beta
+ * Line 6 Linux USB driver
*
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
*
diff --git a/sound/usb/line6/driver.c b/sound/usb/line6/driver.c
index fc852f6ab8bc..93cd4daa56bc 100644
--- a/sound/usb/line6/driver.c
+++ b/sound/usb/line6/driver.c
@@ -1,5 +1,5 @@
/*
- * Line6 Linux USB driver - 0.9.1beta
+ * Line 6 Linux USB driver
*
* Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
*
@@ -11,277 +11,30 @@
#include <linux/kernel.h>
#include <linux/module.h>
+#include <linux/export.h>
#include <linux/slab.h>
#include <linux/usb.h>
-#include "audio.h"
+#include <sound/core.h>
+#include <sound/initval.h>
+
#include "capture.h"
#include "driver.h"
#include "midi.h"
#include "playback.h"
-#include "pod.h"
-#include "podhd.h"
#include "revision.h"
-#include "toneport.h"
#include "usbdefs.h"
-#include "variax.h"
#define DRIVER_AUTHOR "Markus Grabner <grabner@icg.tugraz.at>"
-#define DRIVER_DESC "Line6 USB Driver"
-#define DRIVER_VERSION "0.9.1beta" DRIVER_REVISION
-
-#define LINE6_DEVICE(prod) USB_DEVICE(0x0e41, prod)
-#define LINE6_IF_NUM(prod, n) USB_DEVICE_INTERFACE_NUMBER(0x0e41, prod, n)
-
-/* table of devices that work with this driver */
-static const struct usb_device_id line6_id_table[] = {
- { LINE6_DEVICE(0x4250), .driver_info = LINE6_BASSPODXT },
- { LINE6_DEVICE(0x4642), .driver_info = LINE6_BASSPODXTLIVE },
- { LINE6_DEVICE(0x4252), .driver_info = LINE6_BASSPODXTPRO },
- { LINE6_DEVICE(0x4750), .driver_info = LINE6_GUITARPORT },
- { LINE6_IF_NUM(0x5051, 1), .driver_info = LINE6_POCKETPOD },
- { LINE6_DEVICE(0x5057), .driver_info = LINE6_PODHD300 },
- { LINE6_DEVICE(0x5058), .driver_info = LINE6_PODHD400 },
- { LINE6_IF_NUM(0x414D, 0), .driver_info = LINE6_PODHD500_0 },
- { LINE6_IF_NUM(0x414D, 1), .driver_info = LINE6_PODHD500_1 },
- { LINE6_DEVICE(0x4153), .driver_info = LINE6_PODSTUDIO_GX },
- { LINE6_DEVICE(0x4150), .driver_info = LINE6_PODSTUDIO_UX1 },
- { LINE6_IF_NUM(0x4151, 0), .driver_info = LINE6_PODSTUDIO_UX2 },
- { LINE6_DEVICE(0x5044), .driver_info = LINE6_PODXT },
- { LINE6_IF_NUM(0x4650, 0), .driver_info = LINE6_PODXTLIVE_POD },
- { LINE6_IF_NUM(0x4650, 1), .driver_info = LINE6_PODXTLIVE_VARIAX },
- { LINE6_DEVICE(0x5050), .driver_info = LINE6_PODXTPRO },
- { LINE6_DEVICE(0x4147), .driver_info = LINE6_TONEPORT_GX },
- { LINE6_DEVICE(0x4141), .driver_info = LINE6_TONEPORT_UX1 },
- { LINE6_IF_NUM(0x4142, 0), .driver_info = LINE6_TONEPORT_UX2 },
- { LINE6_DEVICE(0x534d), .driver_info = LINE6_VARIAX },
- {}
-};
-
-MODULE_DEVICE_TABLE(usb, line6_id_table);
-
-static const struct line6_properties line6_properties_table[] = {
- [LINE6_BASSPODXT] = {
- .id = "BassPODxt",
- .name = "BassPODxt",
- .capabilities = LINE6_CAP_CONTROL
- | LINE6_CAP_PCM
- | LINE6_CAP_HWMON,
- .altsetting = 5,
- .ep_ctrl_r = 0x84,
- .ep_ctrl_w = 0x03,
- .ep_audio_r = 0x82,
- .ep_audio_w = 0x01,
- },
- [LINE6_BASSPODXTLIVE] = {
- .id = "BassPODxtLive",
- .name = "BassPODxt Live",
- .capabilities = LINE6_CAP_CONTROL
- | LINE6_CAP_PCM
- | LINE6_CAP_HWMON,
- .altsetting = 1,
- .ep_ctrl_r = 0x84,
- .ep_ctrl_w = 0x03,
- .ep_audio_r = 0x82,
- .ep_audio_w = 0x01,
- },
- [LINE6_BASSPODXTPRO] = {
- .id = "BassPODxtPro",
- .name = "BassPODxt Pro",
- .capabilities = LINE6_CAP_CONTROL
- | LINE6_CAP_PCM
- | LINE6_CAP_HWMON,
- .altsetting = 5,
- .ep_ctrl_r = 0x84,
- .ep_ctrl_w = 0x03,
- .ep_audio_r = 0x82,
- .ep_audio_w = 0x01,
- },
- [LINE6_GUITARPORT] = {
- .id = "GuitarPort",
- .name = "GuitarPort",
- .capabilities = LINE6_CAP_PCM,
- .altsetting = 2, /* 1..4 seem to be ok */
- /* no control channel */
- .ep_audio_r = 0x82,
- .ep_audio_w = 0x01,
- },
- [LINE6_POCKETPOD] = {
- .id = "PocketPOD",
- .name = "Pocket POD",
- .capabilities = LINE6_CAP_CONTROL,
- .altsetting = 0,
- .ep_ctrl_r = 0x82,
- .ep_ctrl_w = 0x02,
- /* no audio channel */
- },
- [LINE6_PODHD300] = {
- .id = "PODHD300",
- .name = "POD HD300",
- .capabilities = LINE6_CAP_CONTROL
- | LINE6_CAP_PCM
- | LINE6_CAP_HWMON,
- .altsetting = 5,
- .ep_ctrl_r = 0x84,
- .ep_ctrl_w = 0x03,
- .ep_audio_r = 0x82,
- .ep_audio_w = 0x01,
- },
- [LINE6_PODHD400] = {
- .id = "PODHD400",
- .name = "POD HD400",
- .capabilities = LINE6_CAP_CONTROL
- | LINE6_CAP_PCM
- | LINE6_CAP_HWMON,
- .altsetting = 5,
- .ep_ctrl_r = 0x84,
- .ep_ctrl_w = 0x03,
- .ep_audio_r = 0x82,
- .ep_audio_w = 0x01,
- },
- [LINE6_PODHD500_0] = {
- .id = "PODHD500",
- .name = "POD HD500",
- .capabilities = LINE6_CAP_CONTROL
- | LINE6_CAP_PCM
- | LINE6_CAP_HWMON,
- .altsetting = 1,
- .ep_ctrl_r = 0x81,
- .ep_ctrl_w = 0x01,
- .ep_audio_r = 0x86,
- .ep_audio_w = 0x02,
- },
- [LINE6_PODHD500_1] = {
- .id = "PODHD500",
- .name = "POD HD500",
- .capabilities = LINE6_CAP_CONTROL
- | LINE6_CAP_PCM
- | LINE6_CAP_HWMON,
- .altsetting = 1,
- .ep_ctrl_r = 0x81,
- .ep_ctrl_w = 0x01,
- .ep_audio_r = 0x86,
- .ep_audio_w = 0x02,
- },
- [LINE6_PODSTUDIO_GX] = {
- .id = "PODStudioGX",
- .name = "POD Studio GX",
- .capabilities = LINE6_CAP_PCM,
- .altsetting = 2, /* 1..4 seem to be ok */
- /* no control channel */
- .ep_audio_r = 0x82,
- .ep_audio_w = 0x01,
- },
- [LINE6_PODSTUDIO_UX1] = {
- .id = "PODStudioUX1",
- .name = "POD Studio UX1",
- .capabilities = LINE6_CAP_PCM,
- .altsetting = 2, /* 1..4 seem to be ok */
- /* no control channel */
- .ep_audio_r = 0x82,
- .ep_audio_w = 0x01,
- },
- [LINE6_PODSTUDIO_UX2] = {
- .id = "PODStudioUX2",
- .name = "POD Studio UX2",
- .capabilities = LINE6_CAP_PCM,
- .altsetting = 2, /* defaults to 44.1kHz, 16-bit */
- /* no control channel */
- .ep_audio_r = 0x82,
- .ep_audio_w = 0x01,
- },
- [LINE6_PODXT] = {
- .id = "PODxt",
- .name = "PODxt",
- .capabilities = LINE6_CAP_CONTROL
- | LINE6_CAP_PCM
- | LINE6_CAP_HWMON,
- .altsetting = 5,
- .ep_ctrl_r = 0x84,
- .ep_ctrl_w = 0x03,
- .ep_audio_r = 0x82,
- .ep_audio_w = 0x01,
- },
- [LINE6_PODXTLIVE_POD] = {
- .id = "PODxtLive",
- .name = "PODxt Live",
- .capabilities = LINE6_CAP_CONTROL
- | LINE6_CAP_PCM
- | LINE6_CAP_HWMON,
- .altsetting = 1,
- .ep_ctrl_r = 0x84,
- .ep_ctrl_w = 0x03,
- .ep_audio_r = 0x82,
- .ep_audio_w = 0x01,
- },
- [LINE6_PODXTLIVE_VARIAX] = {
- .id = "PODxtLive",
- .name = "PODxt Live",
- .capabilities = LINE6_CAP_CONTROL
- | LINE6_CAP_PCM
- | LINE6_CAP_HWMON,
- .altsetting = 1,
- .ep_ctrl_r = 0x86,
- .ep_ctrl_w = 0x05,
- .ep_audio_r = 0x82,
- .ep_audio_w = 0x01,
- },
- [LINE6_PODXTPRO] = {
- .id = "PODxtPro",
- .name = "PODxt Pro",
- .capabilities = LINE6_CAP_CONTROL
- | LINE6_CAP_PCM
- | LINE6_CAP_HWMON,
- .altsetting = 5,
- .ep_ctrl_r = 0x84,
- .ep_ctrl_w = 0x03,
- .ep_audio_r = 0x82,
- .ep_audio_w = 0x01,
- },
- [LINE6_TONEPORT_GX] = {
- .id = "TonePortGX",
- .name = "TonePort GX",
- .capabilities = LINE6_CAP_PCM,
- .altsetting = 2, /* 1..4 seem to be ok */
- /* no control channel */
- .ep_audio_r = 0x82,
- .ep_audio_w = 0x01,
- },
- [LINE6_TONEPORT_UX1] = {
- .id = "TonePortUX1",
- .name = "TonePort UX1",
- .capabilities = LINE6_CAP_PCM,
- .altsetting = 2, /* 1..4 seem to be ok */
- /* no control channel */
- .ep_audio_r = 0x82,
- .ep_audio_w = 0x01,
- },
- [LINE6_TONEPORT_UX2] = {
- .id = "TonePortUX2",
- .name = "TonePort UX2",
- .capabilities = LINE6_CAP_PCM,
- .altsetting = 2, /* defaults to 44.1kHz, 16-bit */
- /* no control channel */
- .ep_audio_r = 0x82,
- .ep_audio_w = 0x01,
- },
- [LINE6_VARIAX] = {
- .id = "Variax",
- .name = "Variax Workbench",
- .capabilities = LINE6_CAP_CONTROL,
- .altsetting = 1,
- .ep_ctrl_r = 0x82,
- .ep_ctrl_w = 0x01,
- /* no audio channel */
- }
-};
+#define DRIVER_DESC "Line 6 USB Driver"
/*
- This is Line6's MIDI manufacturer ID.
+ This is Line 6's MIDI manufacturer ID.
*/
const unsigned char line6_midi_id[] = {
0x00, 0x01, 0x0c
};
+EXPORT_SYMBOL_GPL(line6_midi_id);
/*
Code to request version of POD, Variax interface
@@ -335,8 +88,8 @@ static void line6_stop_listen(struct usb_line6 *line6)
/*
Send raw message in pieces of wMaxPacketSize bytes.
*/
-int line6_send_raw_message(struct usb_line6 *line6, const char *buffer,
- int size)
+static int line6_send_raw_message(struct usb_line6 *line6, const char *buffer,
+ int size)
{
int i, done = 0;
@@ -415,9 +168,9 @@ void line6_start_timer(struct timer_list *timer, unsigned int msecs,
void (*function)(unsigned long), unsigned long data)
{
setup_timer(timer, function, data);
- timer->expires = jiffies + msecs * HZ / 1000;
- add_timer(timer);
+ mod_timer(timer, jiffies + msecs * HZ / 1000);
}
+EXPORT_SYMBOL_GPL(line6_start_timer);
/*
Asynchronously send raw message.
@@ -438,7 +191,6 @@ int line6_send_raw_message_async(struct usb_line6 *line6, const char *buffer,
if (urb == NULL) {
kfree(msg);
- dev_err(line6->ifcdev, "Out of memory\n");
return -ENOMEM;
}
@@ -451,6 +203,7 @@ int line6_send_raw_message_async(struct usb_line6 *line6, const char *buffer,
/* start sending: */
return line6_send_raw_message_async_part(msg, urb);
}
+EXPORT_SYMBOL_GPL(line6_send_raw_message_async);
/*
Send asynchronous device version request.
@@ -462,16 +215,15 @@ int line6_version_request_async(struct usb_line6 *line6)
buffer = kmemdup(line6_request_version,
sizeof(line6_request_version), GFP_ATOMIC);
- if (buffer == NULL) {
- dev_err(line6->ifcdev, "Out of memory");
+ if (buffer == NULL)
return -ENOMEM;
- }
retval = line6_send_raw_message_async(line6, buffer,
sizeof(line6_request_version));
kfree(buffer);
return retval;
}
+EXPORT_SYMBOL_GPL(line6_version_request_async);
/*
Send sysex message in pieces of wMaxPacketSize bytes.
@@ -483,6 +235,7 @@ int line6_send_sysex_message(struct usb_line6 *line6, const char *buffer,
size + SYSEX_EXTRA_SIZE) -
SYSEX_EXTRA_SIZE;
}
+EXPORT_SYMBOL_GPL(line6_send_sysex_message);
/*
Allocate buffer for sysex message and prepare header.
@@ -504,9 +257,10 @@ char *line6_alloc_sysex_buffer(struct usb_line6 *line6, int code1, int code2,
buffer[sizeof(line6_midi_id) + 3 + size] = LINE6_SYSEX_END;
return buffer;
}
+EXPORT_SYMBOL_GPL(line6_alloc_sysex_buffer);
/*
- Notification of data received from the Line6 device.
+ Notification of data received from the Line 6 device.
*/
static void line6_data_received(struct urb *urb)
{
@@ -545,65 +299,6 @@ static void line6_data_received(struct urb *urb)
}
/*
- Send channel number (i.e., switch to a different sound).
-*/
-int line6_send_program(struct usb_line6 *line6, u8 value)
-{
- int retval;
- unsigned char *buffer;
- int partial;
-
- buffer = kmalloc(2, GFP_KERNEL);
- if (!buffer)
- return -ENOMEM;
-
- buffer[0] = LINE6_PROGRAM_CHANGE | LINE6_CHANNEL_HOST;
- buffer[1] = value;
-
- retval = usb_interrupt_msg(line6->usbdev,
- usb_sndintpipe(line6->usbdev,
- line6->properties->ep_ctrl_w),
- buffer, 2, &partial, LINE6_TIMEOUT * HZ);
-
- if (retval)
- dev_err(line6->ifcdev, "usb_interrupt_msg failed (%d)\n",
- retval);
-
- kfree(buffer);
- return retval;
-}
-
-/*
- Transmit Line6 control parameter.
-*/
-int line6_transmit_parameter(struct usb_line6 *line6, int param, u8 value)
-{
- int retval;
- unsigned char *buffer;
- int partial;
-
- buffer = kmalloc(3, GFP_KERNEL);
- if (!buffer)
- return -ENOMEM;
-
- buffer[0] = LINE6_PARAM_CHANGE | LINE6_CHANNEL_HOST;
- buffer[1] = param;
- buffer[2] = value;
-
- retval = usb_interrupt_msg(line6->usbdev,
- usb_sndintpipe(line6->usbdev,
- line6->properties->ep_ctrl_w),
- buffer, 3, &partial, LINE6_TIMEOUT * HZ);
-
- if (retval)
- dev_err(line6->ifcdev, "usb_interrupt_msg failed (%d)\n",
- retval);
-
- kfree(buffer);
- return retval;
-}
-
-/*
Read data from device.
*/
int line6_read_data(struct usb_line6 *line6, int address, void *data,
@@ -659,6 +354,7 @@ int line6_read_data(struct usb_line6 *line6, int address, void *data,
return 0;
}
+EXPORT_SYMBOL_GPL(line6_read_data);
/*
Write data to device.
@@ -703,9 +399,10 @@ int line6_write_data(struct usb_line6 *line6, int address, void *data,
return 0;
}
+EXPORT_SYMBOL_GPL(line6_write_data);
/*
- Read Line6 device serial number.
+ Read Line 6 device serial number.
(POD, TonePort, GuitarPort)
*/
int line6_read_serial_number(struct usb_line6 *line6, int *serial_number)
@@ -713,6 +410,7 @@ int line6_read_serial_number(struct usb_line6 *line6, int *serial_number)
return line6_read_data(line6, 0x80d0, serial_number,
sizeof(*serial_number));
}
+EXPORT_SYMBOL_GPL(line6_read_serial_number);
/*
No operation (i.e., unsupported).
@@ -722,19 +420,19 @@ ssize_t line6_nop_read(struct device *dev, struct device_attribute *attr,
{
return 0;
}
+EXPORT_SYMBOL_GPL(line6_nop_read);
/*
- Generic destructor.
+ Card destructor.
*/
-static void line6_destruct(struct usb_interface *interface)
+static void line6_destruct(struct snd_card *card)
{
- struct usb_line6 *line6;
+ struct usb_line6 *line6 = card->private_data;
+ struct usb_device *usbdev;
- if (interface == NULL)
- return;
- line6 = usb_get_intfdata(interface);
- if (line6 == NULL)
+ if (!line6)
return;
+ usbdev = line6->usbdev;
/* free buffer memory first: */
kfree(line6->buffer_message);
@@ -743,44 +441,34 @@ static void line6_destruct(struct usb_interface *interface)
/* then free URBs: */
usb_free_urb(line6->urb_listen);
- /* make sure the device isn't destructed twice: */
- usb_set_intfdata(interface, NULL);
-
/* free interface data: */
kfree(line6);
+
+ /* decrement reference counters: */
+ usb_put_dev(usbdev);
}
/*
Probe USB device.
*/
-static int line6_probe(struct usb_interface *interface,
- const struct usb_device_id *id)
+int line6_probe(struct usb_interface *interface,
+ struct usb_line6 *line6,
+ const struct line6_properties *properties,
+ int (*private_init)(struct usb_interface *, struct usb_line6 *))
{
- enum line6_device_type devtype;
- struct usb_device *usbdev;
- struct usb_line6 *line6;
- const struct line6_properties *properties;
+ struct usb_device *usbdev = interface_to_usbdev(interface);
+ struct snd_card *card;
int interface_number;
- int size = 0;
int ret;
- if (interface == NULL)
- return -ENODEV;
- usbdev = interface_to_usbdev(interface);
- if (usbdev == NULL)
- return -ENODEV;
-
/* we don't handle multiple configurations */
if (usbdev->descriptor.bNumConfigurations != 1) {
ret = -ENODEV;
goto err_put;
}
- devtype = id->driver_info;
-
/* initialize device info: */
- properties = &line6_properties_table[devtype];
- dev_info(&interface->dev, "Line6 %s found\n", properties->name);
+ dev_info(&interface->dev, "Line 6 %s found\n", properties->name);
/* query interface number */
interface_number = interface->cur_altsetting->desc.bInterfaceNumber;
@@ -792,76 +480,10 @@ static int line6_probe(struct usb_interface *interface,
goto err_put;
}
- /* initialize device data based on device: */
- switch (devtype) {
- case LINE6_BASSPODXT:
- case LINE6_BASSPODXTLIVE:
- case LINE6_BASSPODXTPRO:
- case LINE6_PODXT:
- case LINE6_PODXTPRO:
- size = sizeof(struct usb_line6_pod);
- break;
-
- case LINE6_PODHD300:
- case LINE6_PODHD400:
- size = sizeof(struct usb_line6_podhd);
- break;
-
- case LINE6_PODHD500_0:
- case LINE6_PODHD500_1:
- size = sizeof(struct usb_line6_podhd);
- break;
-
- case LINE6_POCKETPOD:
- size = sizeof(struct usb_line6_pod);
- break;
-
- case LINE6_PODSTUDIO_GX:
- case LINE6_PODSTUDIO_UX1:
- case LINE6_PODSTUDIO_UX2:
- case LINE6_TONEPORT_GX:
- case LINE6_TONEPORT_UX1:
- case LINE6_TONEPORT_UX2:
- case LINE6_GUITARPORT:
- size = sizeof(struct usb_line6_toneport);
- break;
-
- case LINE6_PODXTLIVE_POD:
- size = sizeof(struct usb_line6_pod);
- break;
-
- case LINE6_PODXTLIVE_VARIAX:
- size = sizeof(struct usb_line6_variax);
- break;
-
- case LINE6_VARIAX:
- size = sizeof(struct usb_line6_variax);
- break;
-
- default:
- MISSING_CASE;
- ret = -ENODEV;
- goto err_put;
- }
-
- if (size == 0) {
- dev_err(&interface->dev,
- "driver bug: interface data size not set\n");
- ret = -ENODEV;
- goto err_put;
- }
-
- line6 = kzalloc(size, GFP_KERNEL);
- if (line6 == NULL) {
- ret = -ENODEV;
- goto err_put;
- }
-
/* store basic data: */
line6->properties = properties;
line6->usbdev = usbdev;
line6->ifcdev = &interface->dev;
- line6->type = devtype;
/* get data from endpoint descriptor (see usb_maxpacket): */
{
@@ -882,8 +504,26 @@ static int line6_probe(struct usb_interface *interface,
}
}
+ ret = snd_card_new(line6->ifcdev,
+ SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,
+ THIS_MODULE, 0, &card);
+ if (ret < 0)
+ goto err_put;
+
+ line6->card = card;
+ strcpy(card->id, line6->properties->id);
+ strcpy(card->driver, DRIVER_NAME);
+ strcpy(card->shortname, line6->properties->name);
+ sprintf(card->longname, "Line 6 %s at USB %s", line6->properties->name,
+ dev_name(line6->ifcdev));
+ card->private_data = line6;
+ card->private_free = line6_destruct;
+
usb_set_intfdata(interface, line6);
+ /* increment reference counters: */
+ usb_get_dev(usbdev);
+
if (properties->capabilities & LINE6_CAP_CONTROL) {
/* initialize USB buffers: */
line6->buffer_listen =
@@ -903,8 +543,6 @@ static int line6_probe(struct usb_interface *interface,
line6->urb_listen = usb_alloc_urb(0, GFP_KERNEL);
if (line6->urb_listen == NULL) {
- dev_err(&interface->dev, "Out of memory\n");
- line6_destruct(interface);
ret = -ENOMEM;
goto err_destruct;
}
@@ -918,79 +556,28 @@ static int line6_probe(struct usb_interface *interface,
}
/* initialize device data based on device: */
- switch (devtype) {
- case LINE6_BASSPODXT:
- case LINE6_BASSPODXTLIVE:
- case LINE6_BASSPODXTPRO:
- case LINE6_POCKETPOD:
- case LINE6_PODXT:
- case LINE6_PODXTPRO:
- ret = line6_pod_init(interface, line6);
- break;
-
- case LINE6_PODHD300:
- case LINE6_PODHD400:
- case LINE6_PODHD500_0:
- case LINE6_PODHD500_1:
- ret = line6_podhd_init(interface, line6);
- break;