ALSA: line6: Split to each driver
Split to each individual driver for POD, PODHD, TonePort and Variax with a core LINE6 helper module. The new modules follow the standard ALSA naming rule with snd prefix: snd-usb-pod, snd-usb-podhd, snd-usb-toneport and snd-usb-variax, together with the corresponding CONFIG_SND_USB_* Kconfig items. Tested-by: Chris Rorvick <chris@rorvick.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
@@ -10,10 +10,65 @@
|
||||
*/
|
||||
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/usb.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/module.h>
|
||||
#include <sound/core.h>
|
||||
|
||||
#include "audio.h"
|
||||
#include "driver.h"
|
||||
#include "variax.h"
|
||||
#include "usbdefs.h"
|
||||
|
||||
#define VARIAX_STARTUP_DELAY1 1000
|
||||
#define VARIAX_STARTUP_DELAY3 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_WORKQUEUE,
|
||||
VARIAX_STARTUP_SETUP,
|
||||
VARIAX_STARTUP_LAST = VARIAX_STARTUP_SETUP - 1
|
||||
};
|
||||
|
||||
enum {
|
||||
LINE6_PODXTLIVE_VARIAX,
|
||||
LINE6_VARIAX
|
||||
};
|
||||
|
||||
struct usb_line6_variax {
|
||||
/**
|
||||
Generic Line6 USB data.
|
||||
*/
|
||||
struct usb_line6 line6;
|
||||
|
||||
/**
|
||||
Buffer for activation code.
|
||||
*/
|
||||
unsigned char *buffer_activate;
|
||||
|
||||
/**
|
||||
Handler for device initializaton.
|
||||
*/
|
||||
struct work_struct startup_work;
|
||||
|
||||
/**
|
||||
Timers for device initializaton.
|
||||
*/
|
||||
struct timer_list startup_timer1;
|
||||
struct timer_list startup_timer2;
|
||||
|
||||
/**
|
||||
Current progress in startup procedure.
|
||||
*/
|
||||
int startup_progress;
|
||||
};
|
||||
|
||||
#define VARIAX_OFFSET_ACTIVATE 7
|
||||
|
||||
@@ -228,7 +283,8 @@ static int variax_try_init(struct usb_interface *interface,
|
||||
/*
|
||||
Init workbench device (and clean up in case of failure).
|
||||
*/
|
||||
int line6_variax_init(struct usb_interface *interface, struct usb_line6 *line6)
|
||||
static int variax_init(struct usb_interface *interface,
|
||||
struct usb_line6 *line6)
|
||||
{
|
||||
int err = variax_try_init(interface, line6);
|
||||
|
||||
@@ -237,3 +293,76 @@ int line6_variax_init(struct usb_interface *interface, struct usb_line6 *line6)
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
#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 variax_id_table[] = {
|
||||
{ LINE6_IF_NUM(0x4650, 1), .driver_info = LINE6_PODXTLIVE_VARIAX },
|
||||
{ LINE6_DEVICE(0x534d), .driver_info = LINE6_VARIAX },
|
||||
{}
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(usb, variax_id_table);
|
||||
|
||||
static const struct line6_properties variax_properties_table[] = {
|
||||
[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_VARIAX] = {
|
||||
.id = "Variax",
|
||||
.name = "Variax Workbench",
|
||||
.capabilities = LINE6_CAP_CONTROL,
|
||||
.altsetting = 1,
|
||||
.ep_ctrl_r = 0x82,
|
||||
.ep_ctrl_w = 0x01,
|
||||
/* no audio channel */
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
Probe USB device.
|
||||
*/
|
||||
static int variax_probe(struct usb_interface *interface,
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
struct usb_line6_variax *variax;
|
||||
int err;
|
||||
|
||||
variax = kzalloc(sizeof(*variax), GFP_KERNEL);
|
||||
if (!variax)
|
||||
return -ENODEV;
|
||||
err = line6_probe(interface, &variax->line6,
|
||||
&variax_properties_table[id->driver_info],
|
||||
variax_init);
|
||||
if (err < 0)
|
||||
kfree(variax);
|
||||
return err;
|
||||
}
|
||||
|
||||
static struct usb_driver variax_driver = {
|
||||
.name = KBUILD_MODNAME,
|
||||
.probe = variax_probe,
|
||||
.disconnect = line6_disconnect,
|
||||
#ifdef CONFIG_PM
|
||||
.suspend = line6_suspend,
|
||||
.resume = line6_resume,
|
||||
.reset_resume = line6_resume,
|
||||
#endif
|
||||
.id_table = variax_id_table,
|
||||
};
|
||||
|
||||
module_usb_driver(variax_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Vairax Workbench USB driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
Reference in New Issue
Block a user