diff options
| author | Felipe Balbi <balbi@ti.com> | 2013-07-17 04:09:49 -0400 |
|---|---|---|
| committer | Felipe Balbi <balbi@ti.com> | 2013-07-29 06:57:02 -0400 |
| commit | 5702f75375aa9ecf8ad3431aef3fe6ce8c8dbd15 (patch) | |
| tree | 92a45aca9238a714ca0472436e3563e6033de1f6 /include/linux/usb | |
| parent | c75f52fb26aa9c10b3f5ee157bc0c6c8e8e9bb1a (diff) | |
usb: gadget: udc-core: move sysfs_notify() to a workqueue
usb_gadget_set_state() will call sysfs_notify()
which might sleep. Some users might want to call
usb_gadget_set_state() from the very IRQ handler
which actually changes the gadget state.
Instead of having every UDC driver add their own
workqueue for such a simple notification, we're
adding it generically to our struct usb_gadget,
so the details are hidden from all UDC drivers.
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'include/linux/usb')
| -rw-r--r-- | include/linux/usb/gadget.h | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index f1b0dca60f12..942ef5e053bf 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/slab.h> | 22 | #include <linux/slab.h> |
| 23 | #include <linux/scatterlist.h> | 23 | #include <linux/scatterlist.h> |
| 24 | #include <linux/types.h> | 24 | #include <linux/types.h> |
| 25 | #include <linux/workqueue.h> | ||
| 25 | #include <linux/usb/ch9.h> | 26 | #include <linux/usb/ch9.h> |
| 26 | 27 | ||
| 27 | struct usb_ep; | 28 | struct usb_ep; |
| @@ -475,6 +476,7 @@ struct usb_gadget_ops { | |||
| 475 | 476 | ||
| 476 | /** | 477 | /** |
| 477 | * struct usb_gadget - represents a usb slave device | 478 | * struct usb_gadget - represents a usb slave device |
| 479 | * @work: (internal use) Workqueue to be used for sysfs_notify() | ||
| 478 | * @ops: Function pointers used to access hardware-specific operations. | 480 | * @ops: Function pointers used to access hardware-specific operations. |
| 479 | * @ep0: Endpoint zero, used when reading or writing responses to | 481 | * @ep0: Endpoint zero, used when reading or writing responses to |
| 480 | * driver setup() requests | 482 | * driver setup() requests |
| @@ -520,6 +522,7 @@ struct usb_gadget_ops { | |||
| 520 | * device is acting as a B-Peripheral (so is_a_peripheral is false). | 522 | * device is acting as a B-Peripheral (so is_a_peripheral is false). |
| 521 | */ | 523 | */ |
| 522 | struct usb_gadget { | 524 | struct usb_gadget { |
| 525 | struct work_struct work; | ||
| 523 | /* readonly to gadget driver */ | 526 | /* readonly to gadget driver */ |
| 524 | const struct usb_gadget_ops *ops; | 527 | const struct usb_gadget_ops *ops; |
| 525 | struct usb_ep *ep0; | 528 | struct usb_ep *ep0; |
| @@ -538,6 +541,7 @@ struct usb_gadget { | |||
| 538 | unsigned out_epnum; | 541 | unsigned out_epnum; |
| 539 | unsigned in_epnum; | 542 | unsigned in_epnum; |
| 540 | }; | 543 | }; |
| 544 | #define work_to_gadget(w) (container_of((w), struct usb_gadget, work)) | ||
| 541 | 545 | ||
| 542 | static inline void set_gadget_data(struct usb_gadget *gadget, void *data) | 546 | static inline void set_gadget_data(struct usb_gadget *gadget, void *data) |
| 543 | { dev_set_drvdata(&gadget->dev, data); } | 547 | { dev_set_drvdata(&gadget->dev, data); } |
