diff options
-rw-r--r-- | drivers/usb/misc/rio500.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/drivers/usb/misc/rio500.c b/drivers/usb/misc/rio500.c index 7b9adeb3e7aa..1d397d93d127 100644 --- a/drivers/usb/misc/rio500.c +++ b/drivers/usb/misc/rio500.c | |||
@@ -447,15 +447,23 @@ static int probe_rio(struct usb_interface *intf, | |||
447 | { | 447 | { |
448 | struct usb_device *dev = interface_to_usbdev(intf); | 448 | struct usb_device *dev = interface_to_usbdev(intf); |
449 | struct rio_usb_data *rio = &rio_instance; | 449 | struct rio_usb_data *rio = &rio_instance; |
450 | int retval; | 450 | int retval = 0; |
451 | 451 | ||
452 | dev_info(&intf->dev, "USB Rio found at address %d\n", dev->devnum); | 452 | mutex_lock(&rio500_mutex); |
453 | if (rio->present) { | ||
454 | dev_info(&intf->dev, "Second USB Rio at address %d refused\n", dev->devnum); | ||
455 | retval = -EBUSY; | ||
456 | goto bail_out; | ||
457 | } else { | ||
458 | dev_info(&intf->dev, "USB Rio found at address %d\n", dev->devnum); | ||
459 | } | ||
453 | 460 | ||
454 | retval = usb_register_dev(intf, &usb_rio_class); | 461 | retval = usb_register_dev(intf, &usb_rio_class); |
455 | if (retval) { | 462 | if (retval) { |
456 | dev_err(&dev->dev, | 463 | dev_err(&dev->dev, |
457 | "Not able to get a minor for this device.\n"); | 464 | "Not able to get a minor for this device.\n"); |
458 | return -ENOMEM; | 465 | retval = -ENOMEM; |
466 | goto bail_out; | ||
459 | } | 467 | } |
460 | 468 | ||
461 | rio->rio_dev = dev; | 469 | rio->rio_dev = dev; |
@@ -464,7 +472,8 @@ static int probe_rio(struct usb_interface *intf, | |||
464 | dev_err(&dev->dev, | 472 | dev_err(&dev->dev, |
465 | "probe_rio: Not enough memory for the output buffer\n"); | 473 | "probe_rio: Not enough memory for the output buffer\n"); |
466 | usb_deregister_dev(intf, &usb_rio_class); | 474 | usb_deregister_dev(intf, &usb_rio_class); |
467 | return -ENOMEM; | 475 | retval = -ENOMEM; |
476 | goto bail_out; | ||
468 | } | 477 | } |
469 | dev_dbg(&intf->dev, "obuf address:%p\n", rio->obuf); | 478 | dev_dbg(&intf->dev, "obuf address:%p\n", rio->obuf); |
470 | 479 | ||
@@ -473,7 +482,8 @@ static int probe_rio(struct usb_interface *intf, | |||
473 | "probe_rio: Not enough memory for the input buffer\n"); | 482 | "probe_rio: Not enough memory for the input buffer\n"); |
474 | usb_deregister_dev(intf, &usb_rio_class); | 483 | usb_deregister_dev(intf, &usb_rio_class); |
475 | kfree(rio->obuf); | 484 | kfree(rio->obuf); |
476 | return -ENOMEM; | 485 | retval = -ENOMEM; |
486 | goto bail_out; | ||
477 | } | 487 | } |
478 | dev_dbg(&intf->dev, "ibuf address:%p\n", rio->ibuf); | 488 | dev_dbg(&intf->dev, "ibuf address:%p\n", rio->ibuf); |
479 | 489 | ||
@@ -481,8 +491,10 @@ static int probe_rio(struct usb_interface *intf, | |||
481 | 491 | ||
482 | usb_set_intfdata (intf, rio); | 492 | usb_set_intfdata (intf, rio); |
483 | rio->present = 1; | 493 | rio->present = 1; |
494 | bail_out: | ||
495 | mutex_unlock(&rio500_mutex); | ||
484 | 496 | ||
485 | return 0; | 497 | return retval; |
486 | } | 498 | } |
487 | 499 | ||
488 | static void disconnect_rio(struct usb_interface *intf) | 500 | static void disconnect_rio(struct usb_interface *intf) |