]> www.infradead.org Git - users/willy/xarray.git/commitdiff
usb: dwc3: gadget: Add support for snps,reserved-endpoints property
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Wed, 12 Feb 2025 19:28:03 +0000 (21:28 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 14 Feb 2025 08:29:20 +0000 (09:29 +0100)
The snps,reserved-endpoints property lists the reserved endpoints
that shouldn't be used for normal transfers. Add support for that
to the driver.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Tested-by: Ferry Toth <fntoth@gmail.com>
Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Link: https://lore.kernel.org/r/20250212193116.2487289-4-andriy.shevchenko@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/dwc3/gadget.c

index 73cebb7d90c243c3c1c4cbe04d7f8fc129cc9853..f3ad8434366e943e1055bfbc0ea25a79eb6a22df 100644 (file)
@@ -3403,14 +3403,53 @@ static int dwc3_gadget_init_endpoint(struct dwc3 *dwc, u8 epnum)
        return 0;
 }
 
+static int dwc3_gadget_get_reserved_endpoints(struct dwc3 *dwc, const char *propname,
+                                             u8 *eps, u8 num)
+{
+       u8 count;
+       int ret;
+
+       if (!device_property_present(dwc->dev, propname))
+               return 0;
+
+       ret = device_property_count_u8(dwc->dev, propname);
+       if (ret < 0)
+               return ret;
+       count = ret;
+
+       ret = device_property_read_u8_array(dwc->dev, propname, eps, min(num, count));
+       if (ret)
+               return ret;
+
+       return count;
+}
+
 static int dwc3_gadget_init_endpoints(struct dwc3 *dwc, u8 total)
 {
+       const char                      *propname = "snps,reserved-endpoints";
        u8                              epnum;
+       u8                              reserved_eps[DWC3_ENDPOINTS_NUM];
+       u8                              count;
+       u8                              num;
+       int                             ret;
 
        INIT_LIST_HEAD(&dwc->gadget->ep_list);
 
+       ret = dwc3_gadget_get_reserved_endpoints(dwc, propname,
+                                                reserved_eps, ARRAY_SIZE(reserved_eps));
+       if (ret < 0) {
+               dev_err(dwc->dev, "failed to read %s\n", propname);
+               return ret;
+       }
+       count = ret;
+
        for (epnum = 0; epnum < total; epnum++) {
-               int                     ret;
+               for (num = 0; num < count; num++) {
+                       if (epnum == reserved_eps[num])
+                               break;
+               }
+               if (num < count)
+                       continue;
 
                ret = dwc3_gadget_init_endpoint(dwc, epnum);
                if (ret)