usb: dwc3: gadget: Add support for snps,reserved-endpoints property

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>
This commit is contained in:
Andy Shevchenko 2025-02-12 21:28:03 +02:00 committed by Greg Kroah-Hartman
parent eafba02054
commit 5425191f85

View 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)