diff options
author | David Brownell <dbrownell@users.sourceforge.net> | 2008-08-19 00:38:22 (GMT) |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2008-10-17 21:40:53 (GMT) |
commit | 60beed95e38793c0baff7f94433c1f639d8d5efd (patch) | |
tree | f35e277cdd32267772854b481843299564e4f3e8 /include | |
parent | 8066134ff8140ae9d8d15cdad3fc6c60c2a8a4e5 (diff) | |
download | linux-60beed95e38793c0baff7f94433c1f639d8d5efd.tar.xz |
usb gadget: function activation/deactivation
Add a new mechanism to the composite gadget framework, letting
functions deactivate (and reactivate) themselves. Think of it
as a refcounted wrapper for the software pullup control.
A key example of why to use this mechanism involves functions that
require a userspace daemon. Those functions shuld use this new
mechanism to prevent the gadget from enumerating until those daemons
are activated. Without this mechanism, hosts would see devices that
malfunction until the relevant daemons start.
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/usb/composite.h | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h index c932390..935c380 100644 --- a/include/linux/usb/composite.h +++ b/include/linux/usb/composite.h @@ -130,6 +130,9 @@ struct usb_function { int usb_add_function(struct usb_configuration *, struct usb_function *); +int usb_function_deactivate(struct usb_function *); +int usb_function_activate(struct usb_function *); + int usb_interface_id(struct usb_configuration *, struct usb_function *); /** @@ -316,9 +319,13 @@ struct usb_composite_dev { struct usb_composite_driver *driver; u8 next_string_id; - spinlock_t lock; + /* the gadget driver won't enable the data pullup + * while the deactivation count is nonzero. + */ + unsigned deactivations; - /* REVISIT use and existence of lock ... */ + /* protects at least deactivation count */ + spinlock_t lock; }; extern int usb_string_id(struct usb_composite_dev *c); |