usb: gadget: Add match_ep() op to usb_gadget_ops
authorVignesh Raghavendra <vigneshr@ti.com>
Tue, 1 Oct 2019 11:56:31 +0000 (17:26 +0530)
committerMarek Vasut <marek.vasut+renesas@gmail.com>
Wed, 6 Nov 2019 23:24:59 +0000 (00:24 +0100)
Add match_ep() op to usb_gadget_ops similar to Linux kernel which is
useful in finding a suitable ep match for the function driver. This will
avoid adding more gadget_is_xxx() handling code to usb_ep_autoconfig().

Also sync usb_ep_caps struct thats is usually used in the match_ep()
callback by the gadget controller driver

Signed-off-by: Vignesh Raghavendra <vigneshr@ti.com>
drivers/usb/gadget/epautoconf.c
include/linux/usb/gadget.h

index 179b94cdd0ae75759605a2617da9e6a5830de580..e61fe5d11445dccede0bbbb19c7eb10d9622c7f5 100644 (file)
@@ -282,6 +282,9 @@ struct usb_ep *usb_ep_autoconfig(
                        return ep;
        }
 
+       if (gadget->ops->match_ep)
+               ep = gadget->ops->match_ep(gadget, desc, NULL);
+
        /* Second, look at endpoints until an unclaimed one looks usable */
        list_for_each_entry(ep, &gadget->ep_list, ep_list) {
                if (ep_matches(gadget, ep, desc))
index 497798a32a8739b807dc744131ef6a1a1cd900c3..7dba61bac131e59b3e14b9b5a399d331f541f164 100644 (file)
@@ -129,11 +129,30 @@ struct usb_ep_ops {
        void (*fifo_flush) (struct usb_ep *ep);
 };
 
+/**
+ * struct usb_ep_caps - endpoint capabilities description
+ * @type_control:Endpoint supports control type (reserved for ep0).
+ * @type_iso:Endpoint supports isochronous transfers.
+ * @type_bulk:Endpoint supports bulk transfers.
+ * @type_int:Endpoint supports interrupt transfers.
+ * @dir_in:Endpoint supports IN direction.
+ * @dir_out:Endpoint supports OUT direction.
+ */
+struct usb_ep_caps {
+       unsigned type_control:1;
+       unsigned type_iso:1;
+       unsigned type_bulk:1;
+       unsigned type_int:1;
+       unsigned dir_in:1;
+       unsigned dir_out:1;
+};
+
 /**
  * struct usb_ep - device side representation of USB endpoint
  * @name:identifier for the endpoint, such as "ep-a" or "ep9in-bulk"
  * @ops: Function pointers used to access hardware-specific operations.
  * @ep_list:the gadget's ep_list holds all of its endpoints
+ * @caps:The structure describing types and directions supported by endoint.
  * @maxpacket:The maximum packet size used on this endpoint.  The initial
  *     value can sometimes be reduced (hardware allowing), according to
  *      the endpoint descriptor used to configure the endpoint.
@@ -159,6 +178,7 @@ struct usb_ep {
        const char              *name;
        const struct usb_ep_ops *ops;
        struct list_head        ep_list;
+       struct usb_ep_caps      caps;
        unsigned                maxpacket:16;
        unsigned                maxpacket_limit:16;
        unsigned                max_streams:16;
@@ -447,6 +467,9 @@ struct usb_gadget_ops {
        int     (*udc_start)(struct usb_gadget *,
                             struct usb_gadget_driver *);
        int     (*udc_stop)(struct usb_gadget *);
+       struct usb_ep *(*match_ep)(struct usb_gadget *,
+                       struct usb_endpoint_descriptor *,
+                       struct usb_ss_ep_comp_descriptor *);
 };
 
 /**