diff options
| author | David Cohen <david.a.cohen@linux.intel.com> | 2013-12-09 18:55:35 -0500 |
|---|---|---|
| committer | Felipe Balbi <balbi@ti.com> | 2013-12-09 23:44:05 -0500 |
| commit | 0b2d2bbade59ab2067f326d6dbc2628bee227fd5 (patch) | |
| tree | 8897b37afb209edd04aa0f5773493ec057a6f2ea /include | |
| parent | d8318d7f6bd08eba36ed2a7a23ac5389115958bc (diff) | |
usb: gadget: add quirk_ep_out_aligned_size field to struct usb_gadget
Due to USB controllers may have different restrictions, usb gadget layer
needs to provide a generic way to inform gadget functions to complain
with non-standard requirements.
This patch adds 'quirk_ep_out_aligned_size' field to struct usb_gadget
to inform when controller's epout requires buffer size to be aligned to
MaxPacketSize. A helper is also provided to align buffer size when
necessary.
Cc: Alan Stern <stern@rowland.harvard.edu>
Acked-by: Michal Nazarewicz <mina86@mina86.com>
Signed-off-by: David Cohen <david.a.cohen@linux.intel.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/usb/gadget.h | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index 23b3bfd0a842..cae8a6216551 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h | |||
| @@ -502,6 +502,8 @@ struct usb_gadget_ops { | |||
| 502 | * only supports HNP on a different root port. | 502 | * only supports HNP on a different root port. |
| 503 | * @b_hnp_enable: OTG device feature flag, indicating that the A-Host | 503 | * @b_hnp_enable: OTG device feature flag, indicating that the A-Host |
| 504 | * enabled HNP support. | 504 | * enabled HNP support. |
| 505 | * @quirk_ep_out_aligned_size: epout requires buffer size to be aligned to | ||
| 506 | * MaxPacketSize. | ||
| 505 | * | 507 | * |
| 506 | * Gadgets have a mostly-portable "gadget driver" implementing device | 508 | * Gadgets have a mostly-portable "gadget driver" implementing device |
| 507 | * functions, handling all usb configurations and interfaces. Gadget | 509 | * functions, handling all usb configurations and interfaces. Gadget |
| @@ -541,6 +543,7 @@ struct usb_gadget { | |||
| 541 | unsigned b_hnp_enable:1; | 543 | unsigned b_hnp_enable:1; |
| 542 | unsigned a_hnp_support:1; | 544 | unsigned a_hnp_support:1; |
| 543 | unsigned a_alt_hnp_support:1; | 545 | unsigned a_alt_hnp_support:1; |
| 546 | unsigned quirk_ep_out_aligned_size:1; | ||
| 544 | }; | 547 | }; |
| 545 | #define work_to_gadget(w) (container_of((w), struct usb_gadget, work)) | 548 | #define work_to_gadget(w) (container_of((w), struct usb_gadget, work)) |
| 546 | 549 | ||
| @@ -559,6 +562,23 @@ static inline struct usb_gadget *dev_to_usb_gadget(struct device *dev) | |||
| 559 | 562 | ||
| 560 | 563 | ||
| 561 | /** | 564 | /** |
| 565 | * usb_ep_align_maybe - returns @len aligned to ep's maxpacketsize if gadget | ||
| 566 | * requires quirk_ep_out_aligned_size, otherwise reguens len. | ||
| 567 | * @g: controller to check for quirk | ||
| 568 | * @ep: the endpoint whose maxpacketsize is used to align @len | ||
| 569 | * @len: buffer size's length to align to @ep's maxpacketsize | ||
| 570 | * | ||
| 571 | * This helper is used in case it's required for any reason to check and maybe | ||
| 572 | * align buffer's size to an ep's maxpacketsize. | ||
| 573 | */ | ||
| 574 | static inline size_t | ||
| 575 | usb_ep_align_maybe(struct usb_gadget *g, struct usb_ep *ep, size_t len) | ||
| 576 | { | ||
| 577 | return !g->quirk_ep_out_aligned_size ? len : | ||
| 578 | round_up(len, (size_t)ep->desc->wMaxPacketSize); | ||
| 579 | } | ||
| 580 | |||
| 581 | /** | ||
| 562 | * gadget_is_dualspeed - return true iff the hardware handles high speed | 582 | * gadget_is_dualspeed - return true iff the hardware handles high speed |
| 563 | * @g: controller that might support both high and full speeds | 583 | * @g: controller that might support both high and full speeds |
| 564 | */ | 584 | */ |
