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/linux/usb | |
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/linux/usb')
-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 | */ |