Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 041aaac1 authored by Mayank Rana's avatar Mayank Rana Committed by Jack Pham
Browse files

usb: xhci-plat: Add DT parameter to program xhci imod_interval



XHCI allows interrupt moderation using imod_interval at 250ns
increments. Add DT parameter to specify this imod_value for
targets mainly with single CPU to reduce CPU interrupt loads.
This allows better balance between CPU usage and performance.

CRs-fixed: 1019219
Change-Id: Id479c162da6492caff4dd83de4054fee63b6abc5
Signed-off-by: default avatarManu Gautam <mgautam@codeaurora.org>
Signed-off-by: default avatarMayank Rana <mrana@codeaurora.org>
Signed-off-by: default avatarJack Pham <jackp@codeaurora.org>
parent 15d5e755
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1323,6 +1323,9 @@ static void dwc3_get_properties(struct dwc3 *dwc)
	dwc->dis_metastability_quirk = device_property_read_bool(dev,
				"snps,dis_metastability_quirk");

	device_property_read_u32(dev, "snps,xhci-imod-value",
			&dwc->xhci_imod_value);

	dwc->lpm_nyet_threshold = lpm_nyet_threshold;
	dwc->tx_de_emphasis = tx_de_emphasis;

+2 −0
Original line number Diff line number Diff line
@@ -1032,6 +1032,7 @@ struct dwc3_scratchpad_array {
 * @dis_metastability_quirk: set to disable metastability quirk.
 * @imod_interval: set the interrupt moderation interval in 250ns
 *                 increments or 0 to disable.
 * @xhci_imod_value: imod value to use with xhci
 */
struct dwc3 {
	struct work_struct	drd_work;
@@ -1221,6 +1222,7 @@ struct dwc3 {
	unsigned		dis_metastability_quirk:1;

	u16			imod_interval;
	u32			xhci_imod_value;
};

#define INCRX_BURST_MODE 0
+11 −1
Original line number Diff line number Diff line
@@ -43,12 +43,13 @@ static int dwc3_host_get_irq(struct dwc3 *dwc)

int dwc3_host_init(struct dwc3 *dwc)
{
	struct property_entry	props[4];
	struct property_entry	props[5];
	struct platform_device	*xhci;
	int			ret, irq;
	struct resource		*res;
	struct platform_device	*dwc3_pdev = to_platform_device(dwc->dev);
	int			prop_idx = 0;
	struct property_entry	imod_prop;

	irq = dwc3_host_get_irq(dwc);
	if (irq < 0)
@@ -93,6 +94,15 @@ int dwc3_host_init(struct dwc3 *dwc)
	if (dwc->usb2_lpm_disable)
		props[prop_idx++].name = "usb2-lpm-disable";

	if (dwc->xhci_imod_value) {
		imod_prop.name  = "imod-interval-ns";
		imod_prop.length  = sizeof(u32);
		imod_prop.is_array = false;
		imod_prop.type = DEV_PROP_U32;
		imod_prop.value.u32_data = dwc->xhci_imod_value;
		props[prop_idx++] = imod_prop;
	}

	/**
	 * WORKAROUND: dwc3 revisions <=3.00a have a limitation
	 * where Port Disable command doesn't work.