diff options
Diffstat (limited to 'drivers/staging/line6')
| -rw-r--r-- | drivers/staging/line6/audio.c | 5 | ||||
| -rw-r--r-- | drivers/staging/line6/capture.c | 4 | ||||
| -rw-r--r-- | drivers/staging/line6/driver.c | 70 | ||||
| -rw-r--r-- | drivers/staging/line6/driver.h | 2 | ||||
| -rw-r--r-- | drivers/staging/line6/midi.c | 13 | ||||
| -rw-r--r-- | drivers/staging/line6/pcm.c | 5 | ||||
| -rw-r--r-- | drivers/staging/line6/playback.c | 16 | ||||
| -rw-r--r-- | drivers/staging/line6/pod.c | 5 | ||||
| -rw-r--r-- | drivers/staging/line6/toneport.c | 17 | ||||
| -rw-r--r-- | drivers/staging/line6/usbdefs.h | 9 | ||||
| -rw-r--r-- | drivers/staging/line6/variax.c | 2 | 
11 files changed, 97 insertions, 51 deletions
diff --git a/drivers/staging/line6/audio.c b/drivers/staging/line6/audio.c index a92e21f7d55..171d80c1b02 100644 --- a/drivers/staging/line6/audio.c +++ b/drivers/staging/line6/audio.c @@ -24,8 +24,9 @@ int line6_init_audio(struct usb_line6 *line6)  	struct snd_card *card;  	int err; -	err = snd_card_create(SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1, -			      THIS_MODULE, 0, &card); +	err = snd_card_new(line6->ifcdev, +			   SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1, +			   THIS_MODULE, 0, &card);  	if (err < 0)  		return err; diff --git a/drivers/staging/line6/capture.c b/drivers/staging/line6/capture.c index f8316b71f13..e6ca631e3f7 100644 --- a/drivers/staging/line6/capture.c +++ b/drivers/staging/line6/capture.c @@ -97,6 +97,7 @@ void line6_unlink_audio_in_urbs(struct snd_line6_pcm *line6pcm)  		if (test_bit(i, &line6pcm->active_urb_in)) {  			if (!test_and_set_bit(i, &line6pcm->unlink_urb_in)) {  				struct urb *u = line6pcm->urb_audio_in[i]; +  				usb_unlink_urb(u);  			}  		} @@ -157,6 +158,7 @@ void line6_capture_copy(struct snd_line6_pcm *line6pcm, char *fbuf, int fsize)  		   copy two separate chunks.  		 */  		int len; +  		len = runtime->buffer_size - line6pcm->pos_in_done;  		if (len > 0) { @@ -333,6 +335,7 @@ static int snd_line6_capture_hw_params(struct snd_pcm_substream *substream,  static int snd_line6_capture_hw_free(struct snd_pcm_substream *substream)  {  	struct snd_line6_pcm *line6pcm = snd_pcm_substream_chip(substream); +  	line6_pcm_release(line6pcm, LINE6_BIT_PCM_ALSA_CAPTURE_BUFFER);  	return snd_pcm_lib_free_pages(substream);  } @@ -379,6 +382,7 @@ static snd_pcm_uframes_t  snd_line6_capture_pointer(struct snd_pcm_substream *substream)  {  	struct snd_line6_pcm *line6pcm = snd_pcm_substream_chip(substream); +  	return line6pcm->pos_in_done;  } 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: diff --git a/drivers/staging/line6/driver.h b/drivers/staging/line6/driver.h index 34ae95e7e51..16e3fc2f1f1 100644 --- a/drivers/staging/line6/driver.h +++ b/drivers/staging/line6/driver.h @@ -204,7 +204,7 @@ extern int line6_send_sysex_message(struct usb_line6 *line6,  extern ssize_t line6_set_raw(struct device *dev, struct device_attribute *attr,  			     const char *buf, size_t count);  extern void line6_start_timer(struct timer_list *timer, unsigned int msecs, -			      void (*function) (unsigned long), +			      void (*function)(unsigned long),  			      unsigned long data);  extern int line6_transmit_parameter(struct usb_line6 *line6, int param,  				    u8 value); diff --git a/drivers/staging/line6/midi.c b/drivers/staging/line6/midi.c index e3f9a53dbd9..1ac343b649c 100644 --- a/drivers/staging/line6/midi.c +++ b/drivers/staging/line6/midi.c @@ -47,7 +47,7 @@ static void line6_midi_transmit(struct snd_rawmidi_substream *substream)  	struct snd_line6_midi *line6midi = line6->line6midi;  	struct midi_buffer *mb = &line6midi->midibuf_out;  	unsigned long flags; -	unsigned char chunk[line6->max_packet_size]; +	unsigned char chunk[LINE6_FALLBACK_MAXPACKETSIZE];  	int req, done;  	spin_lock_irqsave(&line6->line6midi->midi_transmit_lock, flags); @@ -64,7 +64,8 @@ static void line6_midi_transmit(struct snd_rawmidi_substream *substream)  	}  	for (;;) { -		done = line6_midibuf_read(mb, chunk, line6->max_packet_size); +		done = line6_midibuf_read(mb, chunk, +					  LINE6_FALLBACK_MAXPACKETSIZE);  		if (done == 0)  			break; @@ -144,7 +145,7 @@ static int send_midi_async(struct usb_line6 *line6, unsigned char *data,  	if (retval < 0) {  		dev_err(line6->ifcdev, "usb_submit_urb failed\n");  		usb_free_urb(urb); -		return -EINVAL; +		return retval;  	}  	++line6->line6midi->num_active_send_urbs; @@ -182,6 +183,7 @@ static void line6_midi_output_drain(struct snd_rawmidi_substream *substream)  	struct usb_line6 *line6 =  	    line6_rawmidi_substream_midi(substream)->line6;  	struct snd_line6_midi *midi = line6->line6midi; +  	wait_event_interruptible(midi->send_wait,  				 midi->num_active_send_urbs == 0);  } @@ -205,7 +207,7 @@ static void line6_midi_input_trigger(struct snd_rawmidi_substream *substream,  	if (up)  		line6->line6midi->substream_receive = substream;  	else -		line6->line6midi->substream_receive = 0; +		line6->line6midi->substream_receive = NULL;  }  static struct snd_rawmidi_ops line6_midi_output_ops = { @@ -259,6 +261,7 @@ static int snd_line6_new_midi(struct snd_line6_midi *line6midi)  static int snd_line6_midi_free(struct snd_device *device)  {  	struct snd_line6_midi *line6midi = device->device_data; +  	line6_midibuf_destroy(&line6midi->midibuf_in);  	line6_midibuf_destroy(&line6midi->midibuf_out);  	return 0; @@ -307,8 +310,6 @@ int line6_init_midi(struct usb_line6 *line6)  	if (err < 0)  		return err; -	snd_card_set_dev(line6->card, line6->ifcdev); -  	err = snd_line6_new_midi(line6midi);  	if (err < 0)  		return err; diff --git a/drivers/staging/line6/pcm.c b/drivers/staging/line6/pcm.c index 6a0648cd03a..a3136b189ee 100644 --- a/drivers/staging/line6/pcm.c +++ b/drivers/staging/line6/pcm.c @@ -436,6 +436,7 @@ int line6_init_pcm(struct usb_line6 *line6,  	case LINE6_DEVID_PODXTLIVE:  	case LINE6_DEVID_PODXTPRO:  	case LINE6_DEVID_PODHD300: +	case LINE6_DEVID_PODHD400:  		ep_read = 0x82;  		ep_write = 0x01;  		break; @@ -474,7 +475,7 @@ int line6_init_pcm(struct usb_line6 *line6,  		MISSING_CASE;  	} -	line6pcm = kzalloc(sizeof(struct snd_line6_pcm), GFP_KERNEL); +	line6pcm = kzalloc(sizeof(*line6pcm), GFP_KERNEL);  	if (line6pcm == NULL)  		return -ENOMEM; @@ -500,8 +501,6 @@ int line6_init_pcm(struct usb_line6 *line6,  	if (err < 0)  		return err; -	snd_card_set_dev(line6->card, line6->ifcdev); -  	err = snd_line6_new_pcm(line6pcm);  	if (err < 0)  		return err; diff --git a/drivers/staging/line6/playback.c b/drivers/staging/line6/playback.c index f9135c7cb19..2ca8900e68c 100644 --- a/drivers/staging/line6/playback.c +++ b/drivers/staging/line6/playback.c @@ -34,6 +34,7 @@ static void change_volume(struct urb *urb_out, int volume[],  	if (bytes_per_frame == 4) {  		short *p, *buf_end; +  		p = (short *)urb_out->transfer_buffer;  		buf_end = p + urb_out->transfer_buffer_length / sizeof(*p); @@ -43,11 +44,13 @@ static void change_volume(struct urb *urb_out, int volume[],  		}  	} else if (bytes_per_frame == 6) {  		unsigned char *p, *buf_end; +  		p = (unsigned char *)urb_out->transfer_buffer;  		buf_end = p + urb_out->transfer_buffer_length;  		for (; p < buf_end; p += 3) {  			int val; +  			val = p[0] + (p[1] << 8) + ((signed char)p[2] << 16);  			val = (val * volume[chn & 1]) >> 8;  			p[0] = val; @@ -116,6 +119,7 @@ static void add_monitor_signal(struct urb *urb_out, unsigned char *signal,  	if (bytes_per_frame == 4) {  		short *pi, *po, *buf_end; +  		pi = (short *)signal;  		po = (short *)urb_out->transfer_buffer;  		buf_end = po + urb_out->transfer_buffer_length / sizeof(*po); @@ -171,6 +175,7 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm)  		if (fsize == 0) {  			int n; +  			line6pcm->count_out += frame_increment;  			n = line6pcm->count_out / frame_factor;  			line6pcm->count_out -= n * frame_factor; @@ -207,6 +212,7 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm)  			   copy the data to the temp buffer.  			 */  			int len; +  			len = runtime->buffer_size - line6pcm->pos_out;  			if (len > 0) { @@ -242,13 +248,14 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm)  		if (line6pcm->flags & LINE6_BITS_PCM_IMPULSE) {  			create_impulse_test_signal(line6pcm, urb_out,  						   bytes_per_frame); -			if (line6pcm->flags & LINE6_BIT_PCM_ALSA_CAPTURE_STREAM) { +			if (line6pcm->flags & +			    LINE6_BIT_PCM_ALSA_CAPTURE_STREAM) {  				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 {  #endif @@ -304,6 +311,7 @@ void line6_unlink_audio_out_urbs(struct snd_line6_pcm *line6pcm)  		if (test_bit(i, &line6pcm->active_urb_out)) {  			if (!test_and_set_bit(i, &line6pcm->unlink_urb_out)) {  				struct urb *u = line6pcm->urb_audio_out[i]; +  				usb_unlink_urb(u);  			}  		} @@ -357,7 +365,6 @@ static void audio_out_callback(struct urb *urb)  {  	int i, index, length = 0, shutdown = 0;  	unsigned long flags; -  	struct snd_line6_pcm *line6pcm = (struct snd_line6_pcm *)urb->context;  	struct snd_pcm_substream *substream =  	    get_substream(line6pcm, SNDRV_PCM_STREAM_PLAYBACK); @@ -383,6 +390,7 @@ static void audio_out_callback(struct urb *urb)  	if (test_bit(LINE6_INDEX_PCM_ALSA_PLAYBACK_STREAM, &line6pcm->flags)) {  		struct snd_pcm_runtime *runtime = substream->runtime; +  		line6pcm->pos_out_done +=  		    length / line6pcm->properties->bytes_per_frame; @@ -479,6 +487,7 @@ static int snd_line6_playback_hw_params(struct snd_pcm_substream *substream,  static int snd_line6_playback_hw_free(struct snd_pcm_substream *substream)  {  	struct snd_line6_pcm *line6pcm = snd_pcm_substream_chip(substream); +  	line6_pcm_release(line6pcm, LINE6_BIT_PCM_ALSA_PLAYBACK_BUFFER);  	return snd_pcm_lib_free_pages(substream);  } @@ -533,6 +542,7 @@ static snd_pcm_uframes_t  snd_line6_playback_pointer(struct snd_pcm_substream *substream)  {  	struct snd_line6_pcm *line6pcm = snd_pcm_substream_chip(substream); +  	return line6pcm->pos_out_done;  } diff --git a/drivers/staging/line6/pod.c b/drivers/staging/line6/pod.c index f4e95a614e3..44f4b2f9857 100644 --- a/drivers/staging/line6/pod.c +++ b/drivers/staging/line6/pod.c @@ -197,6 +197,7 @@ static ssize_t serial_number_show(struct device *dev,  {  	struct usb_interface *interface = to_usb_interface(dev);  	struct usb_line6_pod *pod = usb_get_intfdata(interface); +  	return sprintf(buf, "%d\n", pod->serial_number);  } @@ -208,6 +209,7 @@ static ssize_t firmware_version_show(struct device *dev,  {  	struct usb_interface *interface = to_usb_interface(dev);  	struct usb_line6_pod *pod = usb_get_intfdata(interface); +  	return sprintf(buf, "%d.%02d\n", pod->firmware_version / 100,  		       pod->firmware_version % 100);  } @@ -220,6 +222,7 @@ static ssize_t device_id_show(struct device *dev,  {  	struct usb_interface *interface = to_usb_interface(dev);  	struct usb_line6_pod *pod = usb_get_intfdata(interface); +  	return sprintf(buf, "%d\n", pod->device_id);  } @@ -243,6 +246,7 @@ static void pod_startup2(unsigned long data)  {  	struct usb_line6_pod *pod = (struct usb_line6_pod *)data;  	struct usb_line6 *line6 = &pod->line6; +  	CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_VERSIONREQ);  	/* request firmware version: */ @@ -294,6 +298,7 @@ static int snd_pod_control_monitor_get(struct snd_kcontrol *kcontrol,  {  	struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol);  	struct usb_line6_pod *pod = (struct usb_line6_pod *)line6pcm->line6; +  	ucontrol->value.integer.value[0] = pod->monitor_level;  	return 0;  } diff --git a/drivers/staging/line6/toneport.c b/drivers/staging/line6/toneport.c index 776d3632dc7..69437158d38 100644 --- a/drivers/staging/line6/toneport.c +++ b/drivers/staging/line6/toneport.c @@ -185,6 +185,7 @@ static int snd_toneport_monitor_get(struct snd_kcontrol *kcontrol,  				    struct snd_ctl_elem_value *ucontrol)  {  	struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol); +  	ucontrol->value.integer.value[0] = line6pcm->volume_monitor;  	return 0;  } @@ -213,6 +214,7 @@ static int snd_toneport_source_info(struct snd_kcontrol *kcontrol,  				    struct snd_ctl_elem_info *uinfo)  {  	const int size = ARRAY_SIZE(toneport_source_info); +  	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;  	uinfo->count = 1;  	uinfo->value.enumerated.items = size; @@ -262,6 +264,7 @@ static void toneport_start_pcm(unsigned long arg)  {  	struct usb_line6_toneport *toneport = (struct usb_line6_toneport *)arg;  	struct usb_line6 *line6 = &toneport->line6; +  	line6_pcm_acquire(line6->line6pcm, LINE6_BITS_PCM_MONITOR);  } @@ -307,6 +310,7 @@ static void toneport_setup(struct usb_line6_toneport *toneport)  	int ticks;  	struct usb_line6 *line6 = &toneport->line6;  	struct usb_device *usbdev = line6->usbdev; +	u16 idProduct = le16_to_cpu(usbdev->descriptor.idProduct);  	/* sync time on device with host: */  	ticks = (int)get_seconds(); @@ -316,7 +320,7 @@ static void toneport_setup(struct usb_line6_toneport *toneport)  	toneport_send_cmd(usbdev, 0x0301, 0x0000);  	/* initialize source select: */ -	switch (usbdev->descriptor.idProduct) { +	switch (le16_to_cpu(usbdev->descriptor.idProduct)) {  	case LINE6_DEVID_TONEPORT_UX1:  	case LINE6_DEVID_TONEPORT_UX2:  	case LINE6_DEVID_PODSTUDIO_UX1: @@ -326,7 +330,7 @@ static void toneport_setup(struct usb_line6_toneport *toneport)  				  0x0000);  	} -	if (toneport_has_led(usbdev->descriptor.idProduct)) +	if (toneport_has_led(idProduct))  		toneport_update_led(&usbdev->dev);  } @@ -339,6 +343,7 @@ static int toneport_try_init(struct usb_interface *interface,  	int err;  	struct usb_line6 *line6 = &toneport->line6;  	struct usb_device *usbdev = line6->usbdev; +	u16 idProduct = le16_to_cpu(usbdev->descriptor.idProduct);  	if ((interface == NULL) || (toneport == NULL))  		return -ENODEV; @@ -361,7 +366,7 @@ static int toneport_try_init(struct usb_interface *interface,  		return err;  	/* register source select control: */ -	switch (usbdev->descriptor.idProduct) { +	switch (le16_to_cpu(usbdev->descriptor.idProduct)) {  	case LINE6_DEVID_TONEPORT_UX1:  	case LINE6_DEVID_TONEPORT_UX2:  	case LINE6_DEVID_PODSTUDIO_UX1: @@ -382,7 +387,7 @@ static int toneport_try_init(struct usb_interface *interface,  	line6_read_serial_number(line6, &toneport->serial_number);  	line6_read_data(line6, 0x80c2, &toneport->firmware_version, 1); -	if (toneport_has_led(usbdev->descriptor.idProduct)) { +	if (toneport_has_led(idProduct)) {  		CHECK_RETURN(device_create_file  			     (&interface->dev, &dev_attr_led_red));  		CHECK_RETURN(device_create_file @@ -428,14 +433,16 @@ void line6_toneport_reset_resume(struct usb_line6_toneport *toneport)  void line6_toneport_disconnect(struct usb_interface *interface)  {  	struct usb_line6_toneport *toneport; +	u16 idProduct;  	if (interface == NULL)  		return;  	toneport = usb_get_intfdata(interface);  	del_timer_sync(&toneport->timer); +	idProduct = le16_to_cpu(toneport->line6.usbdev->descriptor.idProduct); -	if (toneport_has_led(toneport->line6.usbdev->descriptor.idProduct)) { +	if (toneport_has_led(idProduct)) {  		device_remove_file(&interface->dev, &dev_attr_led_red);  		device_remove_file(&interface->dev, &dev_attr_led_green);  	} diff --git a/drivers/staging/line6/usbdefs.h b/drivers/staging/line6/usbdefs.h index 43eb54008a2..2d1cc472bea 100644 --- a/drivers/staging/line6/usbdefs.h +++ b/drivers/staging/line6/usbdefs.h @@ -25,6 +25,7 @@  #define LINE6_DEVID_GUITARPORT    0x4750  #define LINE6_DEVID_POCKETPOD     0x5051  #define LINE6_DEVID_PODHD300      0x5057 +#define LINE6_DEVID_PODHD400      0x5058  #define LINE6_DEVID_PODHD500      0x414D  #define LINE6_DEVID_PODSTUDIO_GX  0x4153  #define LINE6_DEVID_PODSTUDIO_UX1 0x4150 @@ -48,6 +49,7 @@ enum {  	LINE6_INDEX_GUITARPORT,  	LINE6_INDEX_POCKETPOD,  	LINE6_INDEX_PODHD300, +	LINE6_INDEX_PODHD400,  	LINE6_INDEX_PODHD500,  	LINE6_INDEX_PODSTUDIO_GX,  	LINE6_INDEX_PODSTUDIO_UX1, @@ -68,6 +70,7 @@ enum {  	LINE6_BIT(GUITARPORT),  	LINE6_BIT(POCKETPOD),  	LINE6_BIT(PODHD300), +	LINE6_BIT(PODHD400),  	LINE6_BIT(PODHD500),  	LINE6_BIT(PODSTUDIO_GX),  	LINE6_BIT(PODSTUDIO_UX1), @@ -88,7 +91,9 @@ enum {  	LINE6_BITS_PODXTALL = LINE6_BIT_PODXT | LINE6_BIT_PODXTLIVE |  			      LINE6_BIT_PODXTPRO,  	LINE6_BITS_PODX3ALL = LINE6_BIT_PODX3 | LINE6_BIT_PODX3LIVE, -	LINE6_BITS_PODHDALL = LINE6_BIT_PODHD300 | LINE6_BIT_PODHD500, +	LINE6_BITS_PODHDALL = LINE6_BIT_PODHD300 | +			      LINE6_BIT_PODHD400 | +			      LINE6_BIT_PODHD500,  	LINE6_BITS_BASSPODXTALL	= LINE6_BIT_BASSPODXT |  				  LINE6_BIT_BASSPODXTLIVE |  				  LINE6_BIT_BASSPODXTPRO @@ -101,7 +106,7 @@ enum {  /* device support hardware monitoring */  #define LINE6_BIT_HWMON (1 << 2) -#define LINE6_BIT_CONTROL_PCM_HWMON	(LINE6_BIT_CONTROL |	\ +#define LINE6_BIT_CTRL_PCM_HW	(LINE6_BIT_CONTROL |	\  					 LINE6_BIT_PCM |	\  					 LINE6_BIT_HWMON) diff --git a/drivers/staging/line6/variax.c b/drivers/staging/line6/variax.c index bd0f694fa8d..ae2be99f9a9 100644 --- a/drivers/staging/line6/variax.c +++ b/drivers/staging/line6/variax.c @@ -95,6 +95,7 @@ static void variax_startup3(struct usb_line6_variax *variax)  static void variax_startup4(unsigned long data)  {  	struct usb_line6_variax *variax = (struct usb_line6_variax *)data; +  	CHECK_STARTUP_PROGRESS(variax->startup_progress,  			       VARIAX_STARTUP_ACTIVATE); @@ -107,6 +108,7 @@ static void variax_startup4(unsigned long data)  static void variax_startup5(unsigned long data)  {  	struct usb_line6_variax *variax = (struct usb_line6_variax *)data; +  	CHECK_STARTUP_PROGRESS(variax->startup_progress,  			       VARIAX_STARTUP_WORKQUEUE);  | 
