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

Commit 726a4e41 authored by Manu Gautam's avatar Manu Gautam
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>
parent 450bd44d
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ Optional properties:
 - snps,num-normal-evt-buffs: If present, specifies number of normal event buffers. Default is 1.
 - snps,num-gsi-evt-buffs: If present, specifies number of GSI based hardware accelerated event buffers.
	1 event buffer is needed per h/w accelerated endpoint.
 - xhci-imod-value: Interrupt moderation interval for host mode (in increments of 250nsec).

This is usually a subnode to DWC3 glue to which it is connected.

@@ -39,4 +40,5 @@ dwc3@4a030000 {
	tx-fifo-resize;
	snps,usb3-u1u2-disable;
	snps,num-gsi-evt-buffs = <0x2>;
	xhci-imod-value = <4000>;
};
+5 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ int dwc3_host_init(struct dwc3 *dwc)
	struct platform_device	*xhci;
	struct usb_xhci_pdata	pdata;
	int			ret;
	struct device_node	*node = dwc->dev->of_node;

	xhci = platform_device_alloc("xhci-hcd", PLATFORM_DEVID_AUTO);
	if (!xhci) {
@@ -53,6 +54,10 @@ int dwc3_host_init(struct dwc3 *dwc)
#ifdef CONFIG_DWC3_HOST_USB3_LPM_ENABLE
	pdata.usb3_lpm_capable = 1;
#endif
	ret = of_property_read_u32(node, "xhci-imod-value",
					   &pdata.imod_interval);
	if (ret)
		pdata.imod_interval = 0;	/* use default xhci.c value */

	ret = platform_device_add_data(xhci, &pdata, sizeof(pdata));
	if (ret) {
+14 −0
Original line number Diff line number Diff line
@@ -129,6 +129,8 @@ static int xhci_plat_probe(struct platform_device *pdev)
	struct clk              *clk;
	int			ret;
	int			irq;
	u32			temp, imod;
	unsigned long		flags;

	if (usb_disabled())
		return -ENODEV;
@@ -231,6 +233,18 @@ static int xhci_plat_probe(struct platform_device *pdev)
	if (ret)
		goto put_usb3_hcd;

	/* override imod interval if specified */
	if (pdata && pdata->imod_interval) {
		imod = pdata->imod_interval & ER_IRQ_INTERVAL_MASK;
		spin_lock_irqsave(&xhci->lock, flags);
		temp = readl_relaxed(&xhci->ir_set->irq_control);
		temp &= ~ER_IRQ_INTERVAL_MASK;
		temp |= imod;
		writel_relaxed(temp, &xhci->ir_set->irq_control);
		spin_unlock_irqrestore(&xhci->lock, flags);
		dev_dbg(&pdev->dev, "%s: imod set to %u\n", __func__, imod);
	}

	ret = device_create_file(&pdev->dev, &dev_attr_config_imod);
	if (ret)
		dev_err(&pdev->dev, "%s: unable to create imod sysfs entry\n",
+4 −0
Original line number Diff line number Diff line
@@ -19,9 +19,13 @@
 * @usb3_lpm_capable:	determines if this xhci platform supports USB3
 *			LPM capability
 *
 * @imod_interval:	minimum inter-interrupt interval. Specified in
 *			250nsec increments.
 *
 */
struct usb_xhci_pdata {
	unsigned	usb3_lpm_capable:1;
	unsigned	imod_interval;
};

#endif /* __USB_CORE_XHCI_PDRIVER_H */