diff options
Diffstat (limited to 'drivers/staging/line6/driver.c')
| -rw-r--r-- | drivers/staging/line6/driver.c | 70 | 
1 files changed, 41 insertions, 29 deletions
diff --git a/drivers/staging/line6/driver.c b/drivers/staging/line6/driver.c index 471c10c116e..ef511c76a6e 100644 --- a/drivers/staging/line6/driver.c +++ b/drivers/staging/line6/driver.c @@ -38,6 +38,7 @@ static const struct usb_device_id line6_id_table[] = {  	{USB_DEVICE(LINE6_VENDOR_ID, LINE6_DEVID_GUITARPORT)},  	{USB_DEVICE(LINE6_VENDOR_ID, LINE6_DEVID_POCKETPOD)},  	{USB_DEVICE(LINE6_VENDOR_ID, LINE6_DEVID_PODHD300)}, +	{USB_DEVICE(LINE6_VENDOR_ID, LINE6_DEVID_PODHD400)},  	{USB_DEVICE(LINE6_VENDOR_ID, LINE6_DEVID_PODHD500)},  	{USB_DEVICE(LINE6_VENDOR_ID, LINE6_DEVID_PODSTUDIO_GX)},  	{USB_DEVICE(LINE6_VENDOR_ID, LINE6_DEVID_PODSTUDIO_UX1)}, @@ -56,27 +57,32 @@ static const struct usb_device_id line6_id_table[] = {  MODULE_DEVICE_TABLE(usb, line6_id_table); +#define L6PROP(dev_bit, dev_id, dev_name, dev_cap)\ +	{.device_bit = LINE6_BIT_##dev_bit, .id = dev_id,\ +	 .name = dev_name, .capabilities = LINE6_BIT_##dev_cap} +  /* *INDENT-OFF* */ -static struct line6_properties line6_properties_table[] = { -	{ LINE6_BIT_BASSPODXT,     "BassPODxt",     "BassPODxt",        LINE6_BIT_CONTROL_PCM_HWMON }, -	{ LINE6_BIT_BASSPODXTLIVE, "BassPODxtLive", "BassPODxt Live",   LINE6_BIT_CONTROL_PCM_HWMON }, -	{ LINE6_BIT_BASSPODXTPRO,  "BassPODxtPro",  "BassPODxt Pro",    LINE6_BIT_CONTROL_PCM_HWMON }, -	{ LINE6_BIT_GUITARPORT,    "GuitarPort",    "GuitarPort",       LINE6_BIT_PCM               }, -	{ LINE6_BIT_POCKETPOD,     "PocketPOD",     "Pocket POD",       LINE6_BIT_CONTROL           }, -	{ LINE6_BIT_PODHD300,      "PODHD300",      "POD HD300",        LINE6_BIT_CONTROL_PCM_HWMON }, -	{ LINE6_BIT_PODHD500,      "PODHD500",      "POD HD500",        LINE6_BIT_CONTROL_PCM_HWMON }, -	{ LINE6_BIT_PODSTUDIO_GX,  "PODStudioGX",   "POD Studio GX",    LINE6_BIT_PCM               }, -	{ LINE6_BIT_PODSTUDIO_UX1, "PODStudioUX1",  "POD Studio UX1",   LINE6_BIT_PCM               }, -	{ LINE6_BIT_PODSTUDIO_UX2, "PODStudioUX2",  "POD Studio UX2",   LINE6_BIT_PCM               }, -	{ LINE6_BIT_PODX3,         "PODX3",         "POD X3",           LINE6_BIT_PCM               }, -	{ LINE6_BIT_PODX3LIVE,     "PODX3Live",     "POD X3 Live",      LINE6_BIT_PCM               }, -	{ LINE6_BIT_PODXT,         "PODxt",         "PODxt",            LINE6_BIT_CONTROL_PCM_HWMON }, -	{ LINE6_BIT_PODXTLIVE,     "PODxtLive",     "PODxt Live",       LINE6_BIT_CONTROL_PCM_HWMON }, -	{ LINE6_BIT_PODXTPRO,      "PODxtPro",      "PODxt Pro",        LINE6_BIT_CONTROL_PCM_HWMON }, -	{ LINE6_BIT_TONEPORT_GX,   "TonePortGX",    "TonePort GX",      LINE6_BIT_PCM               }, -	{ LINE6_BIT_TONEPORT_UX1,  "TonePortUX1",   "TonePort UX1",     LINE6_BIT_PCM               }, -	{ LINE6_BIT_TONEPORT_UX2,  "TonePortUX2",   "TonePort UX2",     LINE6_BIT_PCM               }, -	{ LINE6_BIT_VARIAX,        "Variax",        "Variax Workbench", LINE6_BIT_CONTROL           }, +static const struct line6_properties line6_properties_table[] = { +	L6PROP(BASSPODXT,     "BassPODxt",     "BassPODxt",        CTRL_PCM_HW), +	L6PROP(BASSPODXTLIVE, "BassPODxtLive", "BassPODxt Live",   CTRL_PCM_HW), +	L6PROP(BASSPODXTPRO,  "BassPODxtPro",  "BassPODxt Pro",    CTRL_PCM_HW), +	L6PROP(GUITARPORT,    "GuitarPort",    "GuitarPort",       PCM), +	L6PROP(POCKETPOD,     "PocketPOD",     "Pocket POD",       CONTROL), +	L6PROP(PODHD300,      "PODHD300",      "POD HD300",        CTRL_PCM_HW), +	L6PROP(PODHD400,      "PODHD400",      "POD HD400",        CTRL_PCM_HW), +	L6PROP(PODHD500,      "PODHD500",      "POD HD500",        CTRL_PCM_HW), +	L6PROP(PODSTUDIO_GX,  "PODStudioGX",   "POD Studio GX",    PCM), +	L6PROP(PODSTUDIO_UX1, "PODStudioUX1",  "POD Studio UX1",   PCM), +	L6PROP(PODSTUDIO_UX2, "PODStudioUX2",  "POD Studio UX2",   PCM), +	L6PROP(PODX3,         "PODX3",         "POD X3",           PCM), +	L6PROP(PODX3LIVE,     "PODX3Live",     "POD X3 Live",      PCM), +	L6PROP(PODXT,         "PODxt",         "PODxt",            CTRL_PCM_HW), +	L6PROP(PODXTLIVE,     "PODxtLive",     "PODxt Live",       CTRL_PCM_HW), +	L6PROP(PODXTPRO,      "PODxtPro",      "PODxt Pro",        CTRL_PCM_HW), +	L6PROP(TONEPORT_GX,   "TonePortGX",    "TonePort GX",      PCM), +	L6PROP(TONEPORT_UX1,  "TonePortUX1",   "TonePort UX1",     PCM), +	L6PROP(TONEPORT_UX2,  "TonePortUX2",   "TonePort UX2",     PCM), +	L6PROP(VARIAX,        "Variax",        "Variax Workbench", CONTROL),  };  /* *INDENT-ON* */ @@ -118,6 +124,7 @@ static int line6_send_raw_message_async_part(struct message *msg,  static int line6_start_listen(struct usb_line6 *line6)  {  	int err; +  	usb_fill_int_urb(line6->urb_listen, line6->usbdev,  			 usb_rcvintpipe(line6->usbdev, line6->ep_control_read),  			 line6->buffer_listen, LINE6_BUFSIZE_LISTEN, @@ -150,10 +157,10 @@ int line6_send_raw_message(struct usb_line6 *line6, const char *buffer,  		int retval;  		retval = usb_interrupt_msg(line6->usbdev, -					   usb_sndintpipe(line6->usbdev, -							  line6->ep_control_write), -					   (char *)frag_buf, frag_size, -					   &partial, LINE6_TIMEOUT * HZ); +					usb_sndintpipe(line6->usbdev, +						line6->ep_control_write), +					(char *)frag_buf, frag_size, +					&partial, LINE6_TIMEOUT * HZ);  		if (retval) {  			dev_err(line6->ifcdev, @@ -205,7 +212,7 @@ static int line6_send_raw_message_async_part(struct message *msg,  			__func__, retval);  		usb_free_urb(urb);  		kfree(msg); -		return -EINVAL; +		return retval;  	}  	return 0; @@ -215,7 +222,7 @@ static int line6_send_raw_message_async_part(struct message *msg,  	Setup and start timer.  */  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)  {  	setup_timer(timer, function, data);  	timer->expires = jiffies + msecs * HZ / 1000; @@ -340,7 +347,7 @@ static void line6_data_received(struct urb *urb)  		line6->message_length = done;  		line6_midi_receive(line6, line6->buffer_message, done); -		switch (line6->usbdev->descriptor.idProduct) { +		switch (le16_to_cpu(line6->usbdev->descriptor.idProduct)) {  		case LINE6_DEVID_BASSPODXT:  		case LINE6_DEVID_BASSPODXTLIVE:  		case LINE6_DEVID_BASSPODXTPRO: @@ -352,6 +359,7 @@ static void line6_data_received(struct urb *urb)  			break;  		case LINE6_DEVID_PODHD300: +		case LINE6_DEVID_PODHD400:  		case LINE6_DEVID_PODHD500:  			break; /* let userspace handle MIDI */ @@ -684,6 +692,7 @@ static int line6_probe(struct usb_interface *interface,  	case LINE6_DEVID_PODXT:  	case LINE6_DEVID_PODXTPRO:  	case LINE6_DEVID_PODHD300: +	case LINE6_DEVID_PODHD400:  		alternate = 5;  		break; @@ -738,6 +747,7 @@ static int line6_probe(struct usb_interface *interface,  		break;  	case LINE6_DEVID_PODHD300: +	case LINE6_DEVID_PODHD400:  		size = sizeof(struct usb_line6_podhd);  		ep_read = 0x84;  		ep_write = 0x03; @@ -896,6 +906,7 @@ static int line6_probe(struct usb_interface *interface,  		break;  	case LINE6_DEVID_PODHD300: +	case LINE6_DEVID_PODHD400:  	case LINE6_DEVID_PODHD500:  		ret = line6_podhd_init(interface,  				       (struct usb_line6_podhd *)line6); @@ -1010,7 +1021,7 @@ static void line6_disconnect(struct usb_interface *interface)  			dev_err(line6->ifcdev,  				"driver bug: inconsistent usb device\n"); -		switch (line6->usbdev->descriptor.idProduct) { +		switch (le16_to_cpu(line6->usbdev->descriptor.idProduct)) {  		case LINE6_DEVID_BASSPODXT:  		case LINE6_DEVID_BASSPODXTLIVE:  		case LINE6_DEVID_BASSPODXTPRO: @@ -1023,6 +1034,7 @@ static void line6_disconnect(struct usb_interface *interface)  			break;  		case LINE6_DEVID_PODHD300: +		case LINE6_DEVID_PODHD400:  		case LINE6_DEVID_PODHD500:  			line6_podhd_disconnect(interface);  			break; @@ -1114,7 +1126,7 @@ static int line6_reset_resume(struct usb_interface *interface)  {  	struct usb_line6 *line6 = usb_get_intfdata(interface); -	switch (line6->usbdev->descriptor.idProduct) { +	switch (le16_to_cpu(line6->usbdev->descriptor.idProduct)) {  	case LINE6_DEVID_PODSTUDIO_GX:  	case LINE6_DEVID_PODSTUDIO_UX1:  	case LINE6_DEVID_PODSTUDIO_UX2:  | 
