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 | 79 | ||||
| -rw-r--r-- | drivers/staging/line6/driver.h | 5 | ||||
| -rw-r--r-- | drivers/staging/line6/midi.c | 13 | ||||
| -rw-r--r-- | drivers/staging/line6/pcm.c | 37 | ||||
| -rw-r--r-- | drivers/staging/line6/playback.c | 16 | ||||
| -rw-r--r-- | drivers/staging/line6/pod.c | 26 | ||||
| -rw-r--r-- | drivers/staging/line6/toneport.c | 27 | ||||
| -rw-r--r-- | drivers/staging/line6/usbdefs.h | 9 | ||||
| -rw-r--r-- | drivers/staging/line6/variax.c | 2 |
11 files changed, 129 insertions, 94 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 6252aca8286..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 */ @@ -568,15 +576,6 @@ ssize_t line6_nop_read(struct device *dev, struct device_attribute *attr, } /* - No operation (i.e., unsupported). -*/ -ssize_t line6_nop_write(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - return count; -} - -/* Generic destructor. */ static void line6_destruct(struct usb_interface *interface) @@ -693,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; @@ -747,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; @@ -905,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); @@ -1019,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: @@ -1032,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; @@ -1123,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 a8341f9fdb9..16e3fc2f1f1 100644 --- a/drivers/staging/line6/driver.h +++ b/drivers/staging/line6/driver.h @@ -190,9 +190,6 @@ extern char *line6_alloc_sysex_buffer(struct usb_line6 *line6, int code1, int code2, int size); extern ssize_t line6_nop_read(struct device *dev, struct device_attribute *attr, char *buf); -extern ssize_t line6_nop_write(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count); extern int line6_read_data(struct usb_line6 *line6, int address, void *data, size_t datalen); extern int line6_read_serial_number(struct usb_line6 *line6, @@ -207,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 4795f128490..a3136b189ee 100644 --- a/drivers/staging/line6/pcm.c +++ b/drivers/staging/line6/pcm.c @@ -34,8 +34,8 @@ static struct snd_line6_pcm *dev2pcm(struct device *dev) /* "read" request on "impulse_volume" special file. */ -static ssize_t pcm_get_impulse_volume(struct device *dev, - struct device_attribute *attr, char *buf) +static ssize_t impulse_volume_show(struct device *dev, + struct device_attribute *attr, char *buf) { return sprintf(buf, "%d\n", dev2pcm(dev)->impulse_volume); } @@ -43,9 +43,9 @@ static ssize_t pcm_get_impulse_volume(struct device *dev, /* "write" request on "impulse_volume" special file. */ -static ssize_t pcm_set_impulse_volume(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) +static ssize_t impulse_volume_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) { struct snd_line6_pcm *line6pcm = dev2pcm(dev); int value; @@ -64,12 +64,13 @@ static ssize_t pcm_set_impulse_volume(struct device *dev, return count; } +static DEVICE_ATTR_RW(impulse_volume); /* "read" request on "impulse_period" special file. */ -static ssize_t pcm_get_impulse_period(struct device *dev, - struct device_attribute *attr, char *buf) +static ssize_t impulse_period_show(struct device *dev, + struct device_attribute *attr, char *buf) { return sprintf(buf, "%d\n", dev2pcm(dev)->impulse_period); } @@ -77,9 +78,9 @@ static ssize_t pcm_get_impulse_period(struct device *dev, /* "write" request on "impulse_period" special file. */ -static ssize_t pcm_set_impulse_period(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) +static ssize_t impulse_period_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) { int value; int ret; @@ -91,11 +92,7 @@ static ssize_t pcm_set_impulse_period(struct device *dev, dev2pcm(dev)->impulse_period = value; return count; } - -static DEVICE_ATTR(impulse_volume, S_IWUSR | S_IRUGO, pcm_get_impulse_volume, - pcm_set_impulse_volume); -static DEVICE_ATTR(impulse_period, S_IWUSR | S_IRUGO, pcm_get_impulse_period, - pcm_set_impulse_period); +static DEVICE_ATTR_RW(impulse_period); #endif @@ -392,8 +389,11 @@ static int snd_line6_pcm_free(struct snd_device *device) */ static void pcm_disconnect_substream(struct snd_pcm_substream *substream) { - if (substream->runtime && snd_pcm_running(substream)) + if (substream->runtime && snd_pcm_running(substream)) { + snd_pcm_stream_lock_irq(substream); snd_pcm_stop(substream, SNDRV_PCM_STATE_DISCONNECTED); + snd_pcm_stream_unlock_irq(substream); + } } /* @@ -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 699b2172506..44f4b2f9857 100644 --- a/drivers/staging/line6/pod.c +++ b/drivers/staging/line6/pod.c @@ -192,23 +192,24 @@ static int pod_set_system_param_int(struct usb_line6_pod *pod, int value, /* "read" request on "serial_number" special file. */ -static ssize_t pod_get_serial_number(struct device *dev, - struct device_attribute *attr, char *buf) +static ssize_t serial_number_show(struct device *dev, + struct device_attribute *attr, char *buf) { 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); } /* "read" request on "firmware_version" special file. */ -static ssize_t pod_get_firmware_version(struct device *dev, - struct device_attribute *attr, - char *buf) +static ssize_t firmware_version_show(struct device *dev, + struct device_attribute *attr, char *buf) { 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); } @@ -216,11 +217,12 @@ static ssize_t pod_get_firmware_version(struct device *dev, /* "read" request on "device_id" special file. */ -static ssize_t pod_get_device_id(struct device *dev, - struct device_attribute *attr, char *buf) +static ssize_t device_id_show(struct device *dev, + struct device_attribute *attr, char *buf) { 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); } @@ -244,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: */ @@ -274,11 +277,9 @@ static void pod_startup4(struct work_struct *work) } /* POD special files: */ -static DEVICE_ATTR(device_id, S_IRUGO, pod_get_device_id, line6_nop_write); -static DEVICE_ATTR(firmware_version, S_IRUGO, pod_get_firmware_version, - line6_nop_write); -static DEVICE_ATTR(serial_number, S_IRUGO, pod_get_serial_number, - line6_nop_write); +static DEVICE_ATTR_RO(device_id); +static DEVICE_ATTR_RO(firmware_version); +static DEVICE_ATTR_RO(serial_number); /* control info callback */ static int snd_pod_control_monitor_info(struct snd_kcontrol *kcontrol, @@ -297,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 2f44d56700a..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; @@ -244,13 +246,17 @@ static int snd_toneport_source_put(struct snd_kcontrol *kcontrol, struct snd_line6_pcm *line6pcm = snd_kcontrol_chip(kcontrol); struct usb_line6_toneport *toneport = (struct usb_line6_toneport *)line6pcm->line6; + unsigned int source; - if (ucontrol->value.enumerated.item[0] == toneport->source) + source = ucontrol->value.enumerated.item[0]; + if (source >= ARRAY_SIZE(toneport_source_info)) + return -EINVAL; + if (source == toneport->source) return 0; - toneport->source = ucontrol->value.enumerated.item[0]; + toneport->source = source; toneport_send_cmd(toneport->line6.usbdev, - toneport_source_info[toneport->source].code, 0x0000); + toneport_source_info[source].code, 0x0000); return 1; } @@ -258,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); } @@ -303,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(); @@ -312,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: @@ -322,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); } @@ -335,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; @@ -357,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: @@ -378,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 @@ -424,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); |
