Commit 5c7e7d58 authored by Johan Hovold's avatar Johan Hovold Committed by Takashi Iwai

ALSA: us122l: clean up US144 handling

Use the device-id table and a private flag to determine the device type
(US122 or US144) rather than spreading product-id conditionals
throughout the driver.

This USB driver currently depends on X86 (why?), but we should still add
the missing endianness conversions when accessing the USB
device-descriptor fields.

Compile-tested only.
Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent f83914fd
...@@ -46,8 +46,10 @@ MODULE_PARM_DESC(id, "ID string for "NAME_ALLCAPS"."); ...@@ -46,8 +46,10 @@ MODULE_PARM_DESC(id, "ID string for "NAME_ALLCAPS".");
module_param_array(enable, bool, NULL, 0444); module_param_array(enable, bool, NULL, 0444);
MODULE_PARM_DESC(enable, "Enable "NAME_ALLCAPS"."); MODULE_PARM_DESC(enable, "Enable "NAME_ALLCAPS".");
static int snd_us122l_card_used[SNDRV_CARDS]; /* driver_info flags */
#define US122L_FLAG_US144 BIT(0)
static int snd_us122l_card_used[SNDRV_CARDS];
static int us122l_create_usbmidi(struct snd_card *card) static int us122l_create_usbmidi(struct snd_card *card)
{ {
...@@ -198,8 +200,7 @@ static int usb_stream_hwdep_open(struct snd_hwdep *hw, struct file *file) ...@@ -198,8 +200,7 @@ static int usb_stream_hwdep_open(struct snd_hwdep *hw, struct file *file)
if (!us122l->first) if (!us122l->first)
us122l->first = file; us122l->first = file;
if (us122l->dev->descriptor.idProduct == USB_ID_US144 || if (us122l->is_us144) {
us122l->dev->descriptor.idProduct == USB_ID_US144MKII) {
iface = usb_ifnum_to_if(us122l->dev, 0); iface = usb_ifnum_to_if(us122l->dev, 0);
usb_autopm_get_interface(iface); usb_autopm_get_interface(iface);
} }
...@@ -214,8 +215,7 @@ static int usb_stream_hwdep_release(struct snd_hwdep *hw, struct file *file) ...@@ -214,8 +215,7 @@ static int usb_stream_hwdep_release(struct snd_hwdep *hw, struct file *file)
struct usb_interface *iface; struct usb_interface *iface;
snd_printdd(KERN_DEBUG "%p %p\n", hw, file); snd_printdd(KERN_DEBUG "%p %p\n", hw, file);
if (us122l->dev->descriptor.idProduct == USB_ID_US144 || if (us122l->is_us144) {
us122l->dev->descriptor.idProduct == USB_ID_US144MKII) {
iface = usb_ifnum_to_if(us122l->dev, 0); iface = usb_ifnum_to_if(us122l->dev, 0);
usb_autopm_put_interface(iface); usb_autopm_put_interface(iface);
} }
...@@ -483,8 +483,7 @@ static bool us122l_create_card(struct snd_card *card) ...@@ -483,8 +483,7 @@ static bool us122l_create_card(struct snd_card *card)
int err; int err;
struct us122l *us122l = US122L(card); struct us122l *us122l = US122L(card);
if (us122l->dev->descriptor.idProduct == USB_ID_US144 || if (us122l->is_us144) {
us122l->dev->descriptor.idProduct == USB_ID_US144MKII) {
err = usb_set_interface(us122l->dev, 0, 1); err = usb_set_interface(us122l->dev, 0, 1);
if (err) { if (err) {
snd_printk(KERN_ERR "usb_set_interface error \n"); snd_printk(KERN_ERR "usb_set_interface error \n");
...@@ -503,8 +502,7 @@ static bool us122l_create_card(struct snd_card *card) ...@@ -503,8 +502,7 @@ static bool us122l_create_card(struct snd_card *card)
if (!us122l_start(us122l, 44100, 256)) if (!us122l_start(us122l, 44100, 256))
return false; return false;
if (us122l->dev->descriptor.idProduct == USB_ID_US144 || if (us122l->is_us144)
us122l->dev->descriptor.idProduct == USB_ID_US144MKII)
err = us144_create_usbmidi(card); err = us144_create_usbmidi(card);
else else
err = us122l_create_usbmidi(card); err = us122l_create_usbmidi(card);
...@@ -536,7 +534,8 @@ static void snd_us122l_free(struct snd_card *card) ...@@ -536,7 +534,8 @@ static void snd_us122l_free(struct snd_card *card)
static int usx2y_create_card(struct usb_device *device, static int usx2y_create_card(struct usb_device *device,
struct usb_interface *intf, struct usb_interface *intf,
struct snd_card **cardp) struct snd_card **cardp,
unsigned long flags)
{ {
int dev; int dev;
struct snd_card *card; struct snd_card *card;
...@@ -556,6 +555,7 @@ static int usx2y_create_card(struct usb_device *device, ...@@ -556,6 +555,7 @@ static int usx2y_create_card(struct usb_device *device,
US122L(card)->dev = device; US122L(card)->dev = device;
mutex_init(&US122L(card)->mutex); mutex_init(&US122L(card)->mutex);
init_waitqueue_head(&US122L(card)->sk.sleep); init_waitqueue_head(&US122L(card)->sk.sleep);
US122L(card)->is_us144 = flags & US122L_FLAG_US144;
INIT_LIST_HEAD(&US122L(card)->midi_list); INIT_LIST_HEAD(&US122L(card)->midi_list);
strcpy(card->driver, "USB "NAME_ALLCAPS""); strcpy(card->driver, "USB "NAME_ALLCAPS"");
sprintf(card->shortname, "TASCAM "NAME_ALLCAPS""); sprintf(card->shortname, "TASCAM "NAME_ALLCAPS"");
...@@ -579,7 +579,7 @@ static int us122l_usb_probe(struct usb_interface *intf, ...@@ -579,7 +579,7 @@ static int us122l_usb_probe(struct usb_interface *intf,
struct snd_card *card; struct snd_card *card;
int err; int err;
err = usx2y_create_card(device, intf, &card); err = usx2y_create_card(device, intf, &card, device_id->driver_info);
if (err < 0) if (err < 0)
return err; return err;
...@@ -607,9 +607,8 @@ static int snd_us122l_probe(struct usb_interface *intf, ...@@ -607,9 +607,8 @@ static int snd_us122l_probe(struct usb_interface *intf,
struct snd_card *card; struct snd_card *card;
int err; int err;
if ((device->descriptor.idProduct == USB_ID_US144 || if (id->driver_info & US122L_FLAG_US144 &&
device->descriptor.idProduct == USB_ID_US144MKII) device->speed == USB_SPEED_HIGH) {
&& device->speed == USB_SPEED_HIGH) {
snd_printk(KERN_ERR "disable ehci-hcd to run US-144 \n"); snd_printk(KERN_ERR "disable ehci-hcd to run US-144 \n");
return -ENODEV; return -ENODEV;
} }
...@@ -703,8 +702,7 @@ static int snd_us122l_resume(struct usb_interface *intf) ...@@ -703,8 +702,7 @@ static int snd_us122l_resume(struct usb_interface *intf)
mutex_lock(&us122l->mutex); mutex_lock(&us122l->mutex);
/* needed, doesn't restart without: */ /* needed, doesn't restart without: */
if (us122l->dev->descriptor.idProduct == USB_ID_US144 || if (us122l->is_us144) {
us122l->dev->descriptor.idProduct == USB_ID_US144MKII) {
err = usb_set_interface(us122l->dev, 0, 1); err = usb_set_interface(us122l->dev, 0, 1);
if (err) { if (err) {
snd_printk(KERN_ERR "usb_set_interface error \n"); snd_printk(KERN_ERR "usb_set_interface error \n");
...@@ -747,7 +745,8 @@ static struct usb_device_id snd_us122l_usb_id_table[] = { ...@@ -747,7 +745,8 @@ static struct usb_device_id snd_us122l_usb_id_table[] = {
{ /* US-144 only works at USB1.1! Disable module ehci-hcd. */ { /* US-144 only works at USB1.1! Disable module ehci-hcd. */
.match_flags = USB_DEVICE_ID_MATCH_DEVICE, .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
.idVendor = 0x0644, .idVendor = 0x0644,
.idProduct = USB_ID_US144 .idProduct = USB_ID_US144,
.driver_info = US122L_FLAG_US144
}, },
{ {
.match_flags = USB_DEVICE_ID_MATCH_DEVICE, .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
...@@ -757,7 +756,8 @@ static struct usb_device_id snd_us122l_usb_id_table[] = { ...@@ -757,7 +756,8 @@ static struct usb_device_id snd_us122l_usb_id_table[] = {
{ {
.match_flags = USB_DEVICE_ID_MATCH_DEVICE, .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
.idVendor = 0x0644, .idVendor = 0x0644,
.idProduct = USB_ID_US144MKII .idProduct = USB_ID_US144MKII,
.driver_info = US122L_FLAG_US144
}, },
{ /* terminator */ } { /* terminator */ }
}; };
......
...@@ -16,6 +16,8 @@ struct us122l { ...@@ -16,6 +16,8 @@ struct us122l {
struct list_head midi_list; struct list_head midi_list;
atomic_t mmap_count; atomic_t mmap_count;
bool is_us144;
}; };
......
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