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 | 57 | ||||
| -rw-r--r-- | drivers/staging/line6/driver.h | 2 | ||||
| -rw-r--r-- | drivers/staging/line6/midi.c | 9 | ||||
| -rw-r--r-- | drivers/staging/line6/pcm.c | 4 | ||||
| -rw-r--r-- | drivers/staging/line6/playback.c | 11 | ||||
| -rw-r--r-- | drivers/staging/line6/pod.c | 5 | ||||
| -rw-r--r-- | drivers/staging/line6/toneport.c | 3 | ||||
| -rw-r--r-- | drivers/staging/line6/usbdefs.h | 8 | ||||
| -rw-r--r-- | drivers/staging/line6/variax.c | 2 |
11 files changed, 69 insertions, 41 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 7a6d85ebb29..ef511c76a6e 100644 --- a/drivers/staging/line6/driver.c +++ b/drivers/staging/line6/driver.c @@ -57,28 +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_PODHD400, "PODHD400", "POD HD400", 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* */ @@ -120,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, @@ -152,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, @@ -217,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; 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 3f6d78c585f..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; @@ -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); } @@ -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 df8331bce17..a3136b189ee 100644 --- a/drivers/staging/line6/pcm.c +++ b/drivers/staging/line6/pcm.c @@ -475,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; @@ -501,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 41869caf19a..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) { @@ -305,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); } } @@ -358,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); @@ -384,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; @@ -480,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); } @@ -534,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 af2e7e50c13..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); } diff --git a/drivers/staging/line6/usbdefs.h b/drivers/staging/line6/usbdefs.h index 90cadddec56..2d1cc472bea 100644 --- a/drivers/staging/line6/usbdefs.h +++ b/drivers/staging/line6/usbdefs.h @@ -91,9 +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_PODHD400 | - 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 @@ -106,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); |
