mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
Merge branch 'for-next' into for-linus
Pull 4.15 updates to take over the previous urgent fixes. Signed-off-by: Takashi Iwai <[email protected]>
This commit is contained in:
commit
c429bda21f
171 changed files with 452 additions and 41482 deletions
|
|
@ -174,11 +174,9 @@ destroy_chip:
|
|||
static void usb6fire_chip_disconnect(struct usb_interface *intf)
|
||||
{
|
||||
struct sfire_chip *chip;
|
||||
struct snd_card *card;
|
||||
|
||||
chip = usb_get_intfdata(intf);
|
||||
if (chip) { /* if !chip, fw upload has been performed */
|
||||
card = chip->card;
|
||||
chip->intf_count--;
|
||||
if (!chip->intf_count) {
|
||||
mutex_lock(®ister_mutex);
|
||||
|
|
|
|||
|
|
@ -342,6 +342,13 @@ static int bcd2000_init_midi(struct bcd2000 *bcd2k)
|
|||
bcd2k->midi_out_buf, BUFSIZE,
|
||||
bcd2000_output_complete, bcd2k, 1);
|
||||
|
||||
/* sanity checks of EPs before actually submitting */
|
||||
if (usb_urb_ep_type_check(bcd2k->midi_in_urb) ||
|
||||
usb_urb_ep_type_check(bcd2k->midi_out_urb)) {
|
||||
dev_err(&bcd2k->dev->dev, "invalid MIDI EP\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
bcd2000_init_device(bcd2k);
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -461,6 +461,13 @@ static int init_card(struct snd_usb_caiaqdev *cdev)
|
|||
cdev->midi_out_buf, EP1_BUFSIZE,
|
||||
snd_usb_caiaq_midi_output_done, cdev);
|
||||
|
||||
/* sanity checks of EPs before actually submitting */
|
||||
if (usb_urb_ep_type_check(&cdev->ep1_in_urb) ||
|
||||
usb_urb_ep_type_check(&cdev->midi_out_urb)) {
|
||||
dev_err(dev, "invalid EPs\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
init_waitqueue_head(&cdev->ep1_wait_queue);
|
||||
init_waitqueue_head(&cdev->prepare_wait_queue);
|
||||
|
||||
|
|
|
|||
|
|
@ -718,6 +718,9 @@ int snd_usb_caiaq_input_init(struct snd_usb_caiaqdev *cdev)
|
|||
usb_rcvbulkpipe(usb_dev, 0x4),
|
||||
cdev->ep4_in_buf, EP4_BUFSIZE,
|
||||
snd_usb_caiaq_ep4_reply_dispatch, cdev);
|
||||
ret = usb_urb_ep_type_check(cdev->ep4_in_urb);
|
||||
if (ret < 0)
|
||||
goto exit_free_idev;
|
||||
|
||||
snd_usb_caiaq_set_auto_msg(cdev, 1, 10, 5);
|
||||
|
||||
|
|
@ -757,6 +760,9 @@ int snd_usb_caiaq_input_init(struct snd_usb_caiaqdev *cdev)
|
|||
usb_rcvbulkpipe(usb_dev, 0x4),
|
||||
cdev->ep4_in_buf, EP4_BUFSIZE,
|
||||
snd_usb_caiaq_ep4_reply_dispatch, cdev);
|
||||
ret = usb_urb_ep_type_check(cdev->ep4_in_urb);
|
||||
if (ret < 0)
|
||||
goto exit_free_idev;
|
||||
|
||||
snd_usb_caiaq_set_auto_msg(cdev, 1, 10, 5);
|
||||
|
||||
|
|
@ -802,6 +808,9 @@ int snd_usb_caiaq_input_init(struct snd_usb_caiaqdev *cdev)
|
|||
usb_rcvbulkpipe(usb_dev, 0x4),
|
||||
cdev->ep4_in_buf, EP4_BUFSIZE,
|
||||
snd_usb_caiaq_ep4_reply_dispatch, cdev);
|
||||
ret = usb_urb_ep_type_check(cdev->ep4_in_urb);
|
||||
if (ret < 0)
|
||||
goto exit_free_idev;
|
||||
|
||||
snd_usb_caiaq_set_auto_msg(cdev, 1, 10, 5);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -541,6 +541,8 @@ static int hiface_pcm_init_urb(struct pcm_urb *urb,
|
|||
usb_fill_bulk_urb(&urb->instance, chip->dev,
|
||||
usb_sndbulkpipe(chip->dev, ep), (void *)urb->buffer,
|
||||
PCM_PACKET_SIZE, handler, urb);
|
||||
if (usb_urb_ep_type_check(&urb->instance))
|
||||
return -EINVAL;
|
||||
init_usb_anchor(&urb->submitted);
|
||||
|
||||
return 0;
|
||||
|
|
@ -599,9 +601,12 @@ int hiface_pcm_init(struct hiface_chip *chip, u8 extra_freq)
|
|||
mutex_init(&rt->stream_mutex);
|
||||
spin_lock_init(&rt->playback.lock);
|
||||
|
||||
for (i = 0; i < PCM_N_URBS; i++)
|
||||
hiface_pcm_init_urb(&rt->out_urbs[i], chip, OUT_EP,
|
||||
for (i = 0; i < PCM_N_URBS; i++) {
|
||||
ret = hiface_pcm_init_urb(&rt->out_urbs[i], chip, OUT_EP,
|
||||
hiface_pcm_out_urb_handler);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = snd_pcm_new(chip->card, "USB-SPDIF Audio", 0, 1, 0, &pcm);
|
||||
if (ret < 0) {
|
||||
|
|
|
|||
|
|
@ -248,7 +248,7 @@ static int snd_line6_capture_close(struct snd_pcm_substream *substream)
|
|||
}
|
||||
|
||||
/* capture operators */
|
||||
struct snd_pcm_ops snd_line6_capture_ops = {
|
||||
const struct snd_pcm_ops snd_line6_capture_ops = {
|
||||
.open = snd_line6_capture_open,
|
||||
.close = snd_line6_capture_close,
|
||||
.ioctl = snd_pcm_lib_ioctl,
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
#include "driver.h"
|
||||
#include "pcm.h"
|
||||
|
||||
extern struct snd_pcm_ops snd_line6_capture_ops;
|
||||
extern const struct snd_pcm_ops snd_line6_capture_ops;
|
||||
|
||||
extern void line6_capture_copy(struct snd_line6_pcm *line6pcm, char *fbuf,
|
||||
int fsize);
|
||||
|
|
|
|||
|
|
@ -78,6 +78,13 @@ static int line6_start_listen(struct usb_line6 *line6)
|
|||
line6->buffer_listen, LINE6_BUFSIZE_LISTEN,
|
||||
line6_data_received, line6);
|
||||
}
|
||||
|
||||
/* sanity checks of EP before actually submitting */
|
||||
if (usb_urb_ep_type_check(line6->urb_listen)) {
|
||||
dev_err(line6->ifcdev, "invalid control EP\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
line6->urb_listen->actual_length = 0;
|
||||
err = usb_submit_urb(line6->urb_listen, GFP_ATOMIC);
|
||||
return err;
|
||||
|
|
@ -168,26 +175,33 @@ static int line6_send_raw_message_async_part(struct message *msg,
|
|||
}
|
||||
|
||||
msg->done += bytes;
|
||||
retval = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
|
||||
if (retval < 0) {
|
||||
dev_err(line6->ifcdev, "%s: usb_submit_urb failed (%d)\n",
|
||||
__func__, retval);
|
||||
usb_free_urb(urb);
|
||||
kfree(msg);
|
||||
return retval;
|
||||
}
|
||||
/* sanity checks of EP before actually submitting */
|
||||
retval = usb_urb_ep_type_check(urb);
|
||||
if (retval < 0)
|
||||
goto error;
|
||||
|
||||
retval = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
if (retval < 0)
|
||||
goto error;
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
dev_err(line6->ifcdev, "%s: usb_submit_urb failed (%d)\n",
|
||||
__func__, retval);
|
||||
usb_free_urb(urb);
|
||||
kfree(msg);
|
||||
return retval;
|
||||
}
|
||||
|
||||
/*
|
||||
Setup and start timer.
|
||||
*/
|
||||
void line6_start_timer(struct timer_list *timer, unsigned long msecs,
|
||||
void (*function)(unsigned long), unsigned long data)
|
||||
void (*function)(struct timer_list *t))
|
||||
{
|
||||
setup_timer(timer, function, data);
|
||||
timer->function = (TIMER_FUNC_TYPE)function;
|
||||
mod_timer(timer, jiffies + msecs_to_jiffies(msecs));
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(line6_start_timer);
|
||||
|
|
|
|||
|
|
@ -198,8 +198,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 long msecs,
|
||||
void (*function)(unsigned long),
|
||||
unsigned long data);
|
||||
void (*function)(struct timer_list *t));
|
||||
extern int line6_version_request_async(struct usb_line6 *line6);
|
||||
extern int line6_write_data(struct usb_line6 *line6, unsigned address,
|
||||
void *data, unsigned datalen);
|
||||
|
|
|
|||
|
|
@ -130,16 +130,21 @@ static int send_midi_async(struct usb_line6 *line6, unsigned char *data,
|
|||
transfer_buffer, length, midi_sent, line6,
|
||||
line6->interval);
|
||||
urb->actual_length = 0;
|
||||
retval = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
retval = usb_urb_ep_type_check(urb);
|
||||
if (retval < 0)
|
||||
goto error;
|
||||
|
||||
if (retval < 0) {
|
||||
dev_err(line6->ifcdev, "usb_submit_urb failed\n");
|
||||
usb_free_urb(urb);
|
||||
return retval;
|
||||
}
|
||||
retval = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
if (retval < 0)
|
||||
goto error;
|
||||
|
||||
++line6->line6midi->num_active_send_urbs;
|
||||
return 0;
|
||||
|
||||
error:
|
||||
dev_err(line6->ifcdev, "usb_submit_urb failed\n");
|
||||
usb_free_urb(urb);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int line6_midi_output_open(struct snd_rawmidi_substream *substream)
|
||||
|
|
|
|||
|
|
@ -393,7 +393,7 @@ static int snd_line6_playback_close(struct snd_pcm_substream *substream)
|
|||
}
|
||||
|
||||
/* playback operators */
|
||||
struct snd_pcm_ops snd_line6_playback_ops = {
|
||||
const struct snd_pcm_ops snd_line6_playback_ops = {
|
||||
.open = snd_line6_playback_open,
|
||||
.close = snd_line6_playback_close,
|
||||
.ioctl = snd_pcm_lib_ioctl,
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
*/
|
||||
#define USE_CLEAR_BUFFER_WORKAROUND 1
|
||||
|
||||
extern struct snd_pcm_ops snd_line6_playback_ops;
|
||||
extern const struct snd_pcm_ops snd_line6_playback_ops;
|
||||
|
||||
extern int line6_create_audio_out_urbs(struct snd_line6_pcm *line6pcm);
|
||||
extern int line6_submit_audio_out_all_urbs(struct snd_line6_pcm *line6pcm);
|
||||
|
|
|
|||
|
|
@ -174,7 +174,7 @@ static const char pod_version_header[] = {
|
|||
};
|
||||
|
||||
/* forward declarations: */
|
||||
static void pod_startup2(unsigned long data);
|
||||
static void pod_startup2(struct timer_list *t);
|
||||
static void pod_startup3(struct usb_line6_pod *pod);
|
||||
|
||||
static char *pod_alloc_sysex_buffer(struct usb_line6_pod *pod, int code,
|
||||
|
|
@ -286,13 +286,12 @@ static void pod_startup1(struct usb_line6_pod *pod)
|
|||
CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_INIT);
|
||||
|
||||
/* delay startup procedure: */
|
||||
line6_start_timer(&pod->startup_timer, POD_STARTUP_DELAY, pod_startup2,
|
||||
(unsigned long)pod);
|
||||
line6_start_timer(&pod->startup_timer, POD_STARTUP_DELAY, pod_startup2);
|
||||
}
|
||||
|
||||
static void pod_startup2(unsigned long data)
|
||||
static void pod_startup2(struct timer_list *t)
|
||||
{
|
||||
struct usb_line6_pod *pod = (struct usb_line6_pod *)data;
|
||||
struct usb_line6_pod *pod = from_timer(pod, t, startup_timer);
|
||||
struct usb_line6 *line6 = &pod->line6;
|
||||
|
||||
CHECK_STARTUP_PROGRESS(pod->startup_progress, POD_STARTUP_VERSIONREQ);
|
||||
|
|
@ -413,7 +412,7 @@ static int pod_init(struct usb_line6 *line6,
|
|||
line6->process_message = line6_pod_process_message;
|
||||
line6->disconnect = line6_pod_disconnect;
|
||||
|
||||
init_timer(&pod->startup_timer);
|
||||
timer_setup(&pod->startup_timer, NULL, 0);
|
||||
INIT_WORK(&pod->startup_work, pod_startup4);
|
||||
|
||||
/* create sysfs entries: */
|
||||
|
|
|
|||
|
|
@ -39,7 +39,8 @@ enum {
|
|||
LINE6_PODHD500_1,
|
||||
LINE6_PODX3,
|
||||
LINE6_PODX3LIVE,
|
||||
LINE6_PODHD500X
|
||||
LINE6_PODHD500X,
|
||||
LINE6_PODHDDESKTOP
|
||||
};
|
||||
|
||||
struct usb_line6_podhd {
|
||||
|
|
@ -157,7 +158,7 @@ static struct line6_pcm_properties podx3_pcm_properties = {
|
|||
};
|
||||
static struct usb_driver podhd_driver;
|
||||
|
||||
static void podhd_startup_start_workqueue(unsigned long data);
|
||||
static void podhd_startup_start_workqueue(struct timer_list *t);
|
||||
static void podhd_startup_workqueue(struct work_struct *work);
|
||||
static int podhd_startup_finalize(struct usb_line6_podhd *pod);
|
||||
|
||||
|
|
@ -207,12 +208,12 @@ static void podhd_startup(struct usb_line6_podhd *pod)
|
|||
|
||||
/* delay startup procedure: */
|
||||
line6_start_timer(&pod->startup_timer, PODHD_STARTUP_DELAY,
|
||||
podhd_startup_start_workqueue, (unsigned long)pod);
|
||||
podhd_startup_start_workqueue);
|
||||
}
|
||||
|
||||
static void podhd_startup_start_workqueue(unsigned long data)
|
||||
static void podhd_startup_start_workqueue(struct timer_list *t)
|
||||
{
|
||||
struct usb_line6_podhd *pod = (struct usb_line6_podhd *)data;
|
||||
struct usb_line6_podhd *pod = from_timer(pod, t, startup_timer);
|
||||
|
||||
CHECK_STARTUP_PROGRESS(pod->startup_progress,
|
||||
PODHD_STARTUP_SCHEDULE_WORKQUEUE);
|
||||
|
|
@ -318,7 +319,7 @@ static int podhd_init(struct usb_line6 *line6,
|
|||
|
||||
line6->disconnect = podhd_disconnect;
|
||||
|
||||
init_timer(&pod->startup_timer);
|
||||
timer_setup(&pod->startup_timer, NULL, 0);
|
||||
INIT_WORK(&pod->startup_work, podhd_startup_workqueue);
|
||||
|
||||
if (pod->line6.properties->capabilities & LINE6_CAP_CONTROL) {
|
||||
|
|
@ -379,6 +380,7 @@ static const struct usb_device_id podhd_id_table[] = {
|
|||
{ LINE6_IF_NUM(0x414A, 0), .driver_info = LINE6_PODX3 },
|
||||
{ LINE6_IF_NUM(0x414B, 0), .driver_info = LINE6_PODX3LIVE },
|
||||
{ LINE6_IF_NUM(0x4159, 0), .driver_info = LINE6_PODHD500X },
|
||||
{ LINE6_IF_NUM(0x4156, 0), .driver_info = LINE6_PODHDDESKTOP },
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
@ -465,6 +467,18 @@ static const struct line6_properties podhd_properties_table[] = {
|
|||
.ep_audio_r = 0x86,
|
||||
.ep_audio_w = 0x02,
|
||||
},
|
||||
[LINE6_PODHDDESKTOP] = {
|
||||
.id = "PODHDDESKTOP",
|
||||
.name = "POD HDDESKTOP",
|
||||
.capabilities = LINE6_CAP_CONTROL
|
||||
| LINE6_CAP_PCM | LINE6_CAP_HWMON,
|
||||
.altsetting = 1,
|
||||
.ep_ctrl_r = 0x81,
|
||||
.ep_ctrl_w = 0x01,
|
||||
.ctrl_if = 1,
|
||||
.ep_audio_r = 0x86,
|
||||
.ep_audio_w = 0x02,
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -241,9 +241,9 @@ static int snd_toneport_source_put(struct snd_kcontrol *kcontrol,
|
|||
return 1;
|
||||
}
|
||||
|
||||
static void toneport_start_pcm(unsigned long arg)
|
||||
static void toneport_start_pcm(struct timer_list *t)
|
||||
{
|
||||
struct usb_line6_toneport *toneport = (struct usb_line6_toneport *)arg;
|
||||
struct usb_line6_toneport *toneport = from_timer(toneport, t, timer);
|
||||
struct usb_line6 *line6 = &toneport->line6;
|
||||
|
||||
line6_pcm_acquire(line6->line6pcm, LINE6_STREAM_MONITOR, true);
|
||||
|
|
@ -415,8 +415,7 @@ static int toneport_init(struct usb_line6 *line6,
|
|||
struct usb_line6_toneport *toneport = (struct usb_line6_toneport *) line6;
|
||||
|
||||
toneport->type = id->driver_info;
|
||||
setup_timer(&toneport->timer, toneport_start_pcm,
|
||||
(unsigned long)toneport);
|
||||
timer_setup(&toneport->timer, toneport_start_pcm, 0);
|
||||
|
||||
line6->disconnect = line6_toneport_disconnect;
|
||||
|
||||
|
|
|
|||
|
|
@ -82,9 +82,9 @@ static const char variax_activate[] = {
|
|||
};
|
||||
|
||||
/* forward declarations: */
|
||||
static void variax_startup2(unsigned long data);
|
||||
static void variax_startup4(unsigned long data);
|
||||
static void variax_startup5(unsigned long data);
|
||||
static void variax_startup2(struct timer_list *t);
|
||||
static void variax_startup4(struct timer_list *t);
|
||||
static void variax_startup5(struct timer_list *t);
|
||||
|
||||
static void variax_activate_async(struct usb_line6_variax *variax, int a)
|
||||
{
|
||||
|
|
@ -106,12 +106,12 @@ static void variax_startup1(struct usb_line6_variax *variax)
|
|||
|
||||
/* delay startup procedure: */
|
||||
line6_start_timer(&variax->startup_timer1, VARIAX_STARTUP_DELAY1,
|
||||
variax_startup2, (unsigned long)variax);
|
||||
variax_startup2);
|
||||
}
|
||||
|
||||
static void variax_startup2(unsigned long data)
|
||||
static void variax_startup2(struct timer_list *t)
|
||||
{
|
||||
struct usb_line6_variax *variax = (struct usb_line6_variax *)data;
|
||||
struct usb_line6_variax *variax = from_timer(variax, t, startup_timer1);
|
||||
struct usb_line6 *line6 = &variax->line6;
|
||||
|
||||
/* schedule another startup procedure until startup is complete: */
|
||||
|
|
@ -120,7 +120,7 @@ static void variax_startup2(unsigned long data)
|
|||
|
||||
variax->startup_progress = VARIAX_STARTUP_VERSIONREQ;
|
||||
line6_start_timer(&variax->startup_timer1, VARIAX_STARTUP_DELAY1,
|
||||
variax_startup2, (unsigned long)variax);
|
||||
variax_startup2);
|
||||
|
||||
/* request firmware version: */
|
||||
line6_version_request_async(line6);
|
||||
|
|
@ -132,12 +132,12 @@ static void variax_startup3(struct usb_line6_variax *variax)
|
|||
|
||||
/* delay startup procedure: */
|
||||
line6_start_timer(&variax->startup_timer2, VARIAX_STARTUP_DELAY3,
|
||||
variax_startup4, (unsigned long)variax);
|
||||
variax_startup4);
|
||||
}
|
||||
|
||||
static void variax_startup4(unsigned long data)
|
||||
static void variax_startup4(struct timer_list *t)
|
||||
{
|
||||
struct usb_line6_variax *variax = (struct usb_line6_variax *)data;
|
||||
struct usb_line6_variax *variax = from_timer(variax, t, startup_timer2);
|
||||
|
||||
CHECK_STARTUP_PROGRESS(variax->startup_progress,
|
||||
VARIAX_STARTUP_ACTIVATE);
|
||||
|
|
@ -145,12 +145,12 @@ static void variax_startup4(unsigned long data)
|
|||
/* activate device: */
|
||||
variax_activate_async(variax, 1);
|
||||
line6_start_timer(&variax->startup_timer2, VARIAX_STARTUP_DELAY4,
|
||||
variax_startup5, (unsigned long)variax);
|
||||
variax_startup5);
|
||||
}
|
||||
|
||||
static void variax_startup5(unsigned long data)
|
||||
static void variax_startup5(struct timer_list *t)
|
||||
{
|
||||
struct usb_line6_variax *variax = (struct usb_line6_variax *)data;
|
||||
struct usb_line6_variax *variax = from_timer(variax, t, startup_timer2);
|
||||
|
||||
CHECK_STARTUP_PROGRESS(variax->startup_progress,
|
||||
VARIAX_STARTUP_WORKQUEUE);
|
||||
|
|
@ -190,7 +190,7 @@ static void line6_variax_process_message(struct usb_line6 *line6)
|
|||
} else if (memcmp(buf + 1, variax_init_done + 1,
|
||||
sizeof(variax_init_done) - 1) == 0) {
|
||||
/* notify of complete initialization: */
|
||||
variax_startup4((unsigned long)variax);
|
||||
variax_startup4(&variax->startup_timer2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
@ -222,8 +222,8 @@ static int variax_init(struct usb_line6 *line6,
|
|||
line6->process_message = line6_variax_process_message;
|
||||
line6->disconnect = line6_variax_disconnect;
|
||||
|
||||
init_timer(&variax->startup_timer1);
|
||||
init_timer(&variax->startup_timer2);
|
||||
timer_setup(&variax->startup_timer1, NULL, 0);
|
||||
timer_setup(&variax->startup_timer2, NULL, 0);
|
||||
INIT_WORK(&variax->startup_work, variax_startup6);
|
||||
|
||||
/* initialize USB buffers: */
|
||||
|
|
|
|||
|
|
@ -352,9 +352,9 @@ static void snd_usbmidi_out_tasklet(unsigned long data)
|
|||
}
|
||||
|
||||
/* called after transfers had been interrupted due to some USB error */
|
||||
static void snd_usbmidi_error_timer(unsigned long data)
|
||||
static void snd_usbmidi_error_timer(struct timer_list *t)
|
||||
{
|
||||
struct snd_usb_midi *umidi = (struct snd_usb_midi *)data;
|
||||
struct snd_usb_midi *umidi = from_timer(umidi, t, error_timer);
|
||||
unsigned int i, j;
|
||||
|
||||
spin_lock(&umidi->disc_lock);
|
||||
|
|
@ -1282,6 +1282,7 @@ static int snd_usbmidi_in_endpoint_create(struct snd_usb_midi *umidi,
|
|||
unsigned int pipe;
|
||||
int length;
|
||||
unsigned int i;
|
||||
int err;
|
||||
|
||||
rep->in = NULL;
|
||||
ep = kzalloc(sizeof(*ep), GFP_KERNEL);
|
||||
|
|
@ -1292,8 +1293,8 @@ static int snd_usbmidi_in_endpoint_create(struct snd_usb_midi *umidi,
|
|||
for (i = 0; i < INPUT_URBS; ++i) {
|
||||
ep->urbs[i] = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!ep->urbs[i]) {
|
||||
snd_usbmidi_in_endpoint_delete(ep);
|
||||
return -ENOMEM;
|
||||
err = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
if (ep_info->in_interval)
|
||||
|
|
@ -1305,8 +1306,8 @@ static int snd_usbmidi_in_endpoint_create(struct snd_usb_midi *umidi,
|
|||
buffer = usb_alloc_coherent(umidi->dev, length, GFP_KERNEL,
|
||||
&ep->urbs[i]->transfer_dma);
|
||||
if (!buffer) {
|
||||
snd_usbmidi_in_endpoint_delete(ep);
|
||||
return -ENOMEM;
|
||||
err = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
if (ep_info->in_interval)
|
||||
usb_fill_int_urb(ep->urbs[i], umidi->dev,
|
||||
|
|
@ -1318,10 +1319,20 @@ static int snd_usbmidi_in_endpoint_create(struct snd_usb_midi *umidi,
|
|||
pipe, buffer, length,
|
||||
snd_usbmidi_in_urb_complete, ep);
|
||||
ep->urbs[i]->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
|
||||
err = usb_urb_ep_type_check(ep->urbs[i]);
|
||||
if (err < 0) {
|
||||
dev_err(&umidi->dev->dev, "invalid MIDI in EP %x\n",
|
||||
ep_info->in_ep);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
rep->in = ep;
|
||||
return 0;
|
||||
|
||||
error:
|
||||
snd_usbmidi_in_endpoint_delete(ep);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -1357,6 +1368,7 @@ static int snd_usbmidi_out_endpoint_create(struct snd_usb_midi *umidi,
|
|||
unsigned int i;
|
||||
unsigned int pipe;
|
||||
void *buffer;
|
||||
int err;
|
||||
|
||||
rep->out = NULL;
|
||||
ep = kzalloc(sizeof(*ep), GFP_KERNEL);
|
||||
|
|
@ -1367,8 +1379,8 @@ static int snd_usbmidi_out_endpoint_create(struct snd_usb_midi *umidi,
|
|||
for (i = 0; i < OUTPUT_URBS; ++i) {
|
||||
ep->urbs[i].urb = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!ep->urbs[i].urb) {
|
||||
snd_usbmidi_out_endpoint_delete(ep);
|
||||
return -ENOMEM;
|
||||
err = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
ep->urbs[i].ep = ep;
|
||||
}
|
||||
|
|
@ -1406,8 +1418,8 @@ static int snd_usbmidi_out_endpoint_create(struct snd_usb_midi *umidi,
|
|||
ep->max_transfer, GFP_KERNEL,
|
||||
&ep->urbs[i].urb->transfer_dma);
|
||||
if (!buffer) {
|
||||
snd_usbmidi_out_endpoint_delete(ep);
|
||||
return -ENOMEM;
|
||||
err = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
if (ep_info->out_interval)
|
||||
usb_fill_int_urb(ep->urbs[i].urb, umidi->dev,
|
||||
|
|
@ -1419,6 +1431,12 @@ static int snd_usbmidi_out_endpoint_create(struct snd_usb_midi *umidi,
|
|||
pipe, buffer, ep->max_transfer,
|
||||
snd_usbmidi_out_urb_complete,
|
||||
&ep->urbs[i]);
|
||||
err = usb_urb_ep_type_check(ep->urbs[i].urb);
|
||||
if (err < 0) {
|
||||
dev_err(&umidi->dev->dev, "invalid MIDI out EP %x\n",
|
||||
ep_info->out_ep);
|
||||
goto error;
|
||||
}
|
||||
ep->urbs[i].urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
|
||||
}
|
||||
|
||||
|
|
@ -1437,6 +1455,10 @@ static int snd_usbmidi_out_endpoint_create(struct snd_usb_midi *umidi,
|
|||
|
||||
rep->out = ep;
|
||||
return 0;
|
||||
|
||||
error:
|
||||
snd_usbmidi_out_endpoint_delete(ep);
|
||||
return err;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -2347,8 +2369,7 @@ int __snd_usbmidi_create(struct snd_card *card,
|
|||
usb_id = USB_ID(le16_to_cpu(umidi->dev->descriptor.idVendor),
|
||||
le16_to_cpu(umidi->dev->descriptor.idProduct));
|
||||
umidi->usb_id = usb_id;
|
||||
setup_timer(&umidi->error_timer, snd_usbmidi_error_timer,
|
||||
(unsigned long)umidi);
|
||||
timer_setup(&umidi->error_timer, snd_usbmidi_error_timer, 0);
|
||||
|
||||
/* detect the endpoint(s) to use */
|
||||
memset(endpoints, 0, sizeof(endpoints));
|
||||
|
|
|
|||
|
|
@ -1128,30 +1128,24 @@ bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip)
|
|||
/* devices which do not support reading the sample rate. */
|
||||
switch (chip->usb_id) {
|
||||
case USB_ID(0x041E, 0x4080): /* Creative Live Cam VF0610 */
|
||||
case USB_ID(0x045E, 0x075D): /* MS Lifecam Cinema */
|
||||
case USB_ID(0x045E, 0x076D): /* MS Lifecam HD-5000 */
|
||||
case USB_ID(0x045E, 0x076E): /* MS Lifecam HD-5001 */
|
||||
case USB_ID(0x045E, 0x076F): /* MS Lifecam HD-6000 */
|
||||
case USB_ID(0x045E, 0x0772): /* MS Lifecam Studio */
|
||||
case USB_ID(0x045E, 0x0779): /* MS Lifecam HD-3000 */
|
||||
case USB_ID(0x047F, 0x02F7): /* Plantronics BT-600 */
|
||||
case USB_ID(0x047F, 0x0415): /* Plantronics BT-300 */
|
||||
case USB_ID(0x047F, 0xAA05): /* Plantronics DA45 */
|
||||
case USB_ID(0x047F, 0xC022): /* Plantronics C310 */
|
||||
case USB_ID(0x047F, 0xC02F): /* Plantronics P610 */
|
||||
case USB_ID(0x047F, 0xC036): /* Plantronics C520-M */
|
||||
case USB_ID(0x04D8, 0xFEEA): /* Benchmark DAC1 Pre */
|
||||
case USB_ID(0x0556, 0x0014): /* Phoenix Audio TMX320VC */
|
||||
case USB_ID(0x05A3, 0x9420): /* ELP HD USB Camera */
|
||||
case USB_ID(0x074D, 0x3553): /* Outlaw RR2150 (Micronas UAC3553B) */
|
||||
case USB_ID(0x1395, 0x740a): /* Sennheiser DECT */
|
||||
case USB_ID(0x1901, 0x0191): /* GE B850V3 CP2114 audio interface */
|
||||
case USB_ID(0x1de7, 0x0013): /* Phoenix Audio MT202exe */
|
||||
case USB_ID(0x1de7, 0x0014): /* Phoenix Audio TMX320 */
|
||||
case USB_ID(0x1de7, 0x0114): /* Phoenix Audio MT202pcs */
|
||||
case USB_ID(0x21B4, 0x0081): /* AudioQuest DragonFly */
|
||||
return true;
|
||||
}
|
||||
|
||||
/* devices of these vendors don't support reading rate, either */
|
||||
switch (USB_ID_VENDOR(chip->usb_id)) {
|
||||
case 0x045E: /* MS Lifecam */
|
||||
case 0x047F: /* Plantronics */
|
||||
case 0x1de7: /* Phoenix Audio */
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ check:
|
|||
lb, s->period_size);
|
||||
}
|
||||
|
||||
static void init_pipe_urbs(struct usb_stream_kernel *sk, unsigned use_packsize,
|
||||
static int init_pipe_urbs(struct usb_stream_kernel *sk, unsigned use_packsize,
|
||||
struct urb **urbs, char *transfer,
|
||||
struct usb_device *dev, int pipe)
|
||||
{
|
||||
|
|
@ -77,6 +77,8 @@ static void init_pipe_urbs(struct usb_stream_kernel *sk, unsigned use_packsize,
|
|||
urb->interval = 1;
|
||||
if (usb_pipeout(pipe))
|
||||
continue;
|
||||
if (usb_urb_ep_type_check(urb))
|
||||
return -EINVAL;
|
||||
|
||||
urb->transfer_buffer_length = transfer_length;
|
||||
desc = urb->iso_frame_desc;
|
||||
|
|
@ -87,9 +89,11 @@ static void init_pipe_urbs(struct usb_stream_kernel *sk, unsigned use_packsize,
|
|||
desc[p].length = maxpacket;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void init_urbs(struct usb_stream_kernel *sk, unsigned use_packsize,
|
||||
static int init_urbs(struct usb_stream_kernel *sk, unsigned use_packsize,
|
||||
struct usb_device *dev, int in_pipe, int out_pipe)
|
||||
{
|
||||
struct usb_stream *s = sk->s;
|
||||
|
|
@ -103,9 +107,12 @@ static void init_urbs(struct usb_stream_kernel *sk, unsigned use_packsize,
|
|||
sk->outurb[u] = usb_alloc_urb(sk->n_o_ps, GFP_KERNEL);
|
||||
}
|
||||
|
||||
init_pipe_urbs(sk, use_packsize, sk->inurb, indata, dev, in_pipe);
|
||||
init_pipe_urbs(sk, use_packsize, sk->outurb, sk->write_page, dev,
|
||||
out_pipe);
|
||||
if (init_pipe_urbs(sk, use_packsize, sk->inurb, indata, dev, in_pipe) ||
|
||||
init_pipe_urbs(sk, use_packsize, sk->outurb, sk->write_page, dev,
|
||||
out_pipe))
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -226,7 +233,11 @@ struct usb_stream *usb_stream_new(struct usb_stream_kernel *sk,
|
|||
else
|
||||
sk->freqn = get_usb_high_speed_rate(sample_rate);
|
||||
|
||||
init_urbs(sk, use_packsize, dev, in_pipe, out_pipe);
|
||||
if (init_urbs(sk, use_packsize, dev, in_pipe, out_pipe) < 0) {
|
||||
usb_stream_free(sk);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sk->s->state = usb_stream_stopped;
|
||||
out:
|
||||
return sk->s;
|
||||
|
|
|
|||
|
|
@ -279,6 +279,9 @@ int usX2Y_AsyncSeq04_init(struct usX2Ydev *usX2Y)
|
|||
usX2Y->AS04.buffer + URB_DataLen_AsyncSeq*i, 0,
|
||||
i_usX2Y_Out04Int, usX2Y
|
||||
);
|
||||
err = usb_urb_ep_type_check(usX2Y->AS04.urb[i]);
|
||||
if (err < 0)
|
||||
break;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
|
@ -298,6 +301,8 @@ int usX2Y_In04_init(struct usX2Ydev *usX2Y)
|
|||
usX2Y->In04Buf, 21,
|
||||
i_usX2Y_In04Int, usX2Y,
|
||||
10);
|
||||
if (usb_urb_ep_type_check(usX2Y->In04urb))
|
||||
return -EINVAL;
|
||||
return usb_submit_urb(usX2Y->In04urb, GFP_KERNEL);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -677,6 +677,9 @@ static int usX2Y_rate_set(struct usX2Ydev *usX2Y, int rate)
|
|||
usb_fill_bulk_urb(us->urb[i], usX2Y->dev, usb_sndbulkpipe(usX2Y->dev, 4),
|
||||
usbdata + i, 2, i_usX2Y_04Int, usX2Y);
|
||||
}
|
||||
err = usb_urb_ep_type_check(us->urb[0]);
|
||||
if (err < 0)
|
||||
goto cleanup;
|
||||
us->submitted = 0;
|
||||
us->len = NOOF_SETRATE_URBS;
|
||||
usX2Y->US04 = us;
|
||||
|
|
|
|||
Loading…
Reference in a new issue