diff options
author | Felipe Balbi <felipe.balbi@linux.intel.com> | 2017-06-06 14:47:29 +0300 |
---|---|---|
committer | Felipe Balbi <felipe.balbi@linux.intel.com> | 2017-06-06 14:50:54 +0300 |
commit | 0e3e97526a850f97c9fe8b646937b3a2bef58290 (patch) | |
tree | 52720ccba4e5e84862ef9786d70e371fbcc0e6c8 | |
parent | afbbc7913a288c29616bd31ae612548f6475151a (diff) | |
download | linux-0e3e97526a850f97c9fe8b646937b3a2bef58290.tar.gz linux-0e3e97526a850f97c9fe8b646937b3a2bef58290.tar.bz2 linux-0e3e97526a850f97c9fe8b646937b3a2bef58290.zip |
usb: gadget: composite: make sure to reactivate function on unbind
If a function sets bind_deactivated flag, upon removal we will be left
with an unbalanced deactivation. Let's make sure that we conditionally
call usb_function_activate() from usb_remove_function() and make sure
usb_remove_function() is called from remove_config().
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
-rw-r--r-- | drivers/usb/gadget/composite.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index 49d685ad0da9..45b554032332 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c @@ -315,6 +315,9 @@ void usb_remove_function(struct usb_configuration *c, struct usb_function *f) list_del(&f->list); if (f->unbind) f->unbind(c, f); + + if (f->bind_deactivated) + usb_function_activate(f); } EXPORT_SYMBOL_GPL(usb_remove_function); @@ -956,12 +959,8 @@ static void remove_config(struct usb_composite_dev *cdev, f = list_first_entry(&config->functions, struct usb_function, list); - list_del(&f->list); - if (f->unbind) { - DBG(cdev, "unbind function '%s'/%p\n", f->name, f); - f->unbind(config, f); - /* may free memory for "f" */ - } + + usb_remove_function(config, f); } list_del(&config->list); if (config->unbind) { |