Commit 0011a33f authored by Takashi Iwai's avatar Takashi Iwai

Merge branch 'for-linus' into for-next

Back-merge for applying the timer API conversion patch for line6
driver that conflicts with the recent fix in upstream.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parents 49815404 99fee508
...@@ -1263,6 +1263,7 @@ static int snd_seq_ioctl_create_port(struct snd_seq_client *client, void *arg) ...@@ -1263,6 +1263,7 @@ static int snd_seq_ioctl_create_port(struct snd_seq_client *client, void *arg)
struct snd_seq_port_info *info = arg; struct snd_seq_port_info *info = arg;
struct snd_seq_client_port *port; struct snd_seq_client_port *port;
struct snd_seq_port_callback *callback; struct snd_seq_port_callback *callback;
int port_idx;
/* it is not allowed to create the port for an another client */ /* it is not allowed to create the port for an another client */
if (info->addr.client != client->number) if (info->addr.client != client->number)
...@@ -1273,7 +1274,9 @@ static int snd_seq_ioctl_create_port(struct snd_seq_client *client, void *arg) ...@@ -1273,7 +1274,9 @@ static int snd_seq_ioctl_create_port(struct snd_seq_client *client, void *arg)
return -ENOMEM; return -ENOMEM;
if (client->type == USER_CLIENT && info->kernel) { if (client->type == USER_CLIENT && info->kernel) {
snd_seq_delete_port(client, port->addr.port); port_idx = port->addr.port;
snd_seq_port_unlock(port);
snd_seq_delete_port(client, port_idx);
return -EINVAL; return -EINVAL;
} }
if (client->type == KERNEL_CLIENT) { if (client->type == KERNEL_CLIENT) {
...@@ -1294,6 +1297,7 @@ static int snd_seq_ioctl_create_port(struct snd_seq_client *client, void *arg) ...@@ -1294,6 +1297,7 @@ static int snd_seq_ioctl_create_port(struct snd_seq_client *client, void *arg)
snd_seq_set_port_info(port, info); snd_seq_set_port_info(port, info);
snd_seq_system_client_ev_port_start(port->addr.client, port->addr.port); snd_seq_system_client_ev_port_start(port->addr.client, port->addr.port);
snd_seq_port_unlock(port);
return 0; return 0;
} }
......
...@@ -122,7 +122,9 @@ static void port_subs_info_init(struct snd_seq_port_subs_info *grp) ...@@ -122,7 +122,9 @@ static void port_subs_info_init(struct snd_seq_port_subs_info *grp)
} }
/* create a port, port number is returned (-1 on failure) */ /* create a port, port number is returned (-1 on failure);
* the caller needs to unref the port via snd_seq_port_unlock() appropriately
*/
struct snd_seq_client_port *snd_seq_create_port(struct snd_seq_client *client, struct snd_seq_client_port *snd_seq_create_port(struct snd_seq_client *client,
int port) int port)
{ {
...@@ -151,6 +153,7 @@ struct snd_seq_client_port *snd_seq_create_port(struct snd_seq_client *client, ...@@ -151,6 +153,7 @@ struct snd_seq_client_port *snd_seq_create_port(struct snd_seq_client *client,
snd_use_lock_init(&new_port->use_lock); snd_use_lock_init(&new_port->use_lock);
port_subs_info_init(&new_port->c_src); port_subs_info_init(&new_port->c_src);
port_subs_info_init(&new_port->c_dest); port_subs_info_init(&new_port->c_dest);
snd_use_lock_use(&new_port->use_lock);
num = port >= 0 ? port : 0; num = port >= 0 ? port : 0;
mutex_lock(&client->ports_mutex); mutex_lock(&client->ports_mutex);
...@@ -165,9 +168,9 @@ struct snd_seq_client_port *snd_seq_create_port(struct snd_seq_client *client, ...@@ -165,9 +168,9 @@ struct snd_seq_client_port *snd_seq_create_port(struct snd_seq_client *client,
list_add_tail(&new_port->list, &p->list); list_add_tail(&new_port->list, &p->list);
client->num_ports++; client->num_ports++;
new_port->addr.port = num; /* store the port number in the port */ new_port->addr.port = num; /* store the port number in the port */
sprintf(new_port->name, "port-%d", num);
write_unlock_irqrestore(&client->ports_lock, flags); write_unlock_irqrestore(&client->ports_lock, flags);
mutex_unlock(&client->ports_mutex); mutex_unlock(&client->ports_mutex);
sprintf(new_port->name, "port-%d", num);
return new_port; return new_port;
} }
......
...@@ -476,10 +476,12 @@ static int init_card(struct snd_usb_caiaqdev *cdev) ...@@ -476,10 +476,12 @@ static int init_card(struct snd_usb_caiaqdev *cdev)
err = snd_usb_caiaq_send_command(cdev, EP1_CMD_GET_DEVICE_INFO, NULL, 0); err = snd_usb_caiaq_send_command(cdev, EP1_CMD_GET_DEVICE_INFO, NULL, 0);
if (err) if (err)
return err; goto err_kill_urb;
if (!wait_event_timeout(cdev->ep1_wait_queue, cdev->spec_received, HZ)) if (!wait_event_timeout(cdev->ep1_wait_queue, cdev->spec_received, HZ)) {
return -ENODEV; err = -ENODEV;
goto err_kill_urb;
}
usb_string(usb_dev, usb_dev->descriptor.iManufacturer, usb_string(usb_dev, usb_dev->descriptor.iManufacturer,
cdev->vendor_name, CAIAQ_USB_STR_LEN); cdev->vendor_name, CAIAQ_USB_STR_LEN);
...@@ -514,6 +516,10 @@ static int init_card(struct snd_usb_caiaqdev *cdev) ...@@ -514,6 +516,10 @@ static int init_card(struct snd_usb_caiaqdev *cdev)
setup_card(cdev); setup_card(cdev);
return 0; return 0;
err_kill_urb:
usb_kill_urb(&cdev->ep1_in_urb);
return err;
} }
static int snd_probe(struct usb_interface *intf, static int snd_probe(struct usb_interface *intf,
......
...@@ -793,9 +793,10 @@ int line6_probe(struct usb_interface *interface, ...@@ -793,9 +793,10 @@ int line6_probe(struct usb_interface *interface,
return 0; return 0;
error: error:
if (line6->disconnect) /* we can call disconnect callback here because no close-sync is
line6->disconnect(line6); * needed yet at this point
snd_card_free(card); */
line6_disconnect(interface);
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(line6_probe); EXPORT_SYMBOL_GPL(line6_probe);
......
...@@ -302,7 +302,8 @@ static void podhd_disconnect(struct usb_line6 *line6) ...@@ -302,7 +302,8 @@ static void podhd_disconnect(struct usb_line6 *line6)
intf = usb_ifnum_to_if(line6->usbdev, intf = usb_ifnum_to_if(line6->usbdev,
pod->line6.properties->ctrl_if); pod->line6.properties->ctrl_if);
usb_driver_release_interface(&podhd_driver, intf); if (intf)
usb_driver_release_interface(&podhd_driver, intf);
} }
} }
...@@ -318,6 +319,9 @@ static int podhd_init(struct usb_line6 *line6, ...@@ -318,6 +319,9 @@ static int podhd_init(struct usb_line6 *line6,
line6->disconnect = podhd_disconnect; line6->disconnect = podhd_disconnect;
init_timer(&pod->startup_timer);
INIT_WORK(&pod->startup_work, podhd_startup_workqueue);
if (pod->line6.properties->capabilities & LINE6_CAP_CONTROL) { if (pod->line6.properties->capabilities & LINE6_CAP_CONTROL) {
/* claim the data interface */ /* claim the data interface */
intf = usb_ifnum_to_if(line6->usbdev, intf = usb_ifnum_to_if(line6->usbdev,
...@@ -359,8 +363,6 @@ static int podhd_init(struct usb_line6 *line6, ...@@ -359,8 +363,6 @@ static int podhd_init(struct usb_line6 *line6,
} }
/* init device and delay registering */ /* init device and delay registering */
init_timer(&pod->startup_timer);
INIT_WORK(&pod->startup_work, podhd_startup_workqueue);
podhd_startup(pod); podhd_startup(pod);
return 0; return 0;
} }
......
...@@ -2234,6 +2234,9 @@ static int parse_audio_unit(struct mixer_build *state, int unitid) ...@@ -2234,6 +2234,9 @@ static int parse_audio_unit(struct mixer_build *state, int unitid)
static void snd_usb_mixer_free(struct usb_mixer_interface *mixer) static void snd_usb_mixer_free(struct usb_mixer_interface *mixer)
{ {
/* kill pending URBs */
snd_usb_mixer_disconnect(mixer);
kfree(mixer->id_elems); kfree(mixer->id_elems);
if (mixer->urb) { if (mixer->urb) {
kfree(mixer->urb->transfer_buffer); kfree(mixer->urb->transfer_buffer);
...@@ -2584,8 +2587,13 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif, ...@@ -2584,8 +2587,13 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif,
void snd_usb_mixer_disconnect(struct usb_mixer_interface *mixer) void snd_usb_mixer_disconnect(struct usb_mixer_interface *mixer)
{ {
usb_kill_urb(mixer->urb); if (mixer->disconnected)
usb_kill_urb(mixer->rc_urb); return;
if (mixer->urb)
usb_kill_urb(mixer->urb);
if (mixer->rc_urb)
usb_kill_urb(mixer->rc_urb);
mixer->disconnected = true;
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM
......
...@@ -22,6 +22,8 @@ struct usb_mixer_interface { ...@@ -22,6 +22,8 @@ struct usb_mixer_interface {
struct urb *rc_urb; struct urb *rc_urb;
struct usb_ctrlrequest *rc_setup_packet; struct usb_ctrlrequest *rc_setup_packet;
u8 rc_buffer[6]; u8 rc_buffer[6];
bool disconnected;
}; };
#define MAX_CHANNELS 16 /* max logical channels */ #define MAX_CHANNELS 16 /* max logical channels */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment