Commit 5425191f authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Greg Kroah-Hartman
Browse files

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: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Tested-by: default avatarFerry Toth <fntoth@gmail.com>
Acked-by: default avatarThinh Nguyen <Thinh.Nguyen@synopsys.com>
Link: https://lore.kernel.org/r/20250212193116.2487289-4-andriy.shevchenko@linux.intel.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent eafba020
Loading
Loading
Loading
Loading
+40 −1
Original line number Diff line number Diff line
@@ -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)