linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: peter.chen@freescale.com (Peter Chen)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 02/12] usb: chipidea: set ITC to 0 for device mode
Date: Thu, 19 Mar 2015 09:19:13 +0800	[thread overview]
Message-ID: <1426727963-32280-3-git-send-email-peter.chen@freescale.com> (raw)
In-Reply-To: <1426727963-32280-1-git-send-email-peter.chen@freescale.com>

ITC (Interrupt Threshold Control) is used to set the maximum rate at which
the host/device controller will issue interrupts. The default value is 8 (1ms)
for it. EHCI core will modify it to 1, but device mode keeps it as default
value.

In some use cases like Android ADB, it only has one usb request for each
direction, and maximum payload data is only 4KB, so the speed is 4MB/s
at most, it needs controller to trigger interrupt as fast as possible
to increase the speed. The USB performance will be better if the interrupt
can be triggered faster.

Reduce ITC value is benefit for USB performance, and the interrupt number
is increased at the same time, it may increase cpu utilization too.
Most of use case cares about performance, but some may care about
cpu utilization, so, we leave a platform interface for user.
We set ITC as 0 (immediate) as default value.

Signed-off-by: Peter Chen <peter.chen@freescale.com>
---
 drivers/usb/chipidea/core.c  | 19 +++++++++++++++++++
 include/linux/usb/chipidea.h |  2 ++
 2 files changed, 21 insertions(+)

diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
index 74fea4f..8af9cbf 100644
--- a/drivers/usb/chipidea/core.c
+++ b/drivers/usb/chipidea/core.c
@@ -463,6 +463,13 @@ int hw_device_reset(struct ci_hdrc *ci)
 	/* HW >= 2.3 */
 	hw_write(ci, OP_USBMODE, USBMODE_SLOM, USBMODE_SLOM);
 
+	/*
+	 * Set interrupt interval for device mode
+	 * host set ITC according to ehci-hcd module parameter log2_irq_thresh
+	 */
+	hw_write(ci, OP_USBCMD, 0xff0000,
+		ci->platdata->gadget_itc_setting << 16);
+
 	if (hw_read(ci, OP_USBMODE, USBMODE_CM) != USBMODE_CM_DC) {
 		pr_err("cannot enter in %s device mode", ci_role(ci)->name);
 		pr_err("lpm = %i", ci->hw_bank.lpm);
@@ -560,6 +567,8 @@ static irqreturn_t ci_irq(int irq, void *data)
 static int ci_get_platdata(struct device *dev,
 		struct ci_hdrc_platform_data *platdata)
 {
+	int ret;
+
 	if (!platdata->phy_mode)
 		platdata->phy_mode = of_usb_get_phy_mode(dev->of_node);
 
@@ -591,6 +600,16 @@ static int ci_get_platdata(struct device *dev,
 	if (of_usb_get_maximum_speed(dev->of_node) == USB_SPEED_FULL)
 		platdata->flags |= CI_HDRC_FORCE_FULLSPEED;
 
+	if (of_find_property(dev->of_node, "gadget-itc-setting", NULL)) {
+		ret = of_property_read_u32(dev->of_node, "gadget-itc-setting",
+			&platdata->gadget_itc_setting);
+		if (ret) {
+			dev_err(dev,
+				"failed to get gadget-itc-setting value\n");
+			return ret;
+		}
+	}
+
 	return 0;
 }
 
diff --git a/include/linux/usb/chipidea.h b/include/linux/usb/chipidea.h
index ab94f78..e69d829 100644
--- a/include/linux/usb/chipidea.h
+++ b/include/linux/usb/chipidea.h
@@ -35,6 +35,8 @@ struct ci_hdrc_platform_data {
 	void	(*notify_event) (struct ci_hdrc *ci, unsigned event);
 	struct regulator	*reg_vbus;
 	bool			tpl_support;
+	/* interrupt threshold value for gadget */
+	u32			gadget_itc_setting;
 };
 
 /* Default offset of capability registers */
-- 
1.9.1

  parent reply	other threads:[~2015-03-19  1:19 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-19  1:19 [PATCH 00/12] USB: chipidea: patchset for performance improvement Peter Chen
2015-03-19  1:19 ` [PATCH 01/12] Doc: usb: ci-hdrc-imx: add gadget-itc-setting for binding doc Peter Chen
2015-03-19  1:19 ` Peter Chen [this message]
2015-03-19  1:19 ` [PATCH 03/12] usb: chipidea: define stream mode disable for both roles Peter Chen
2015-03-19  1:19 ` [PATCH 04/12] usb: chipidea: imx: add stream mode enable for device mode at imx6sl/imx6sx Peter Chen
2015-03-19  1:19 ` [PATCH 05/12] usb: chipidea: introduce ci_platform_config Peter Chen
2015-03-19 10:19   ` Michael Grzeschik
2015-03-20  2:36     ` Peter Chen
2015-03-19  1:19 ` [PATCH 06/12] Doc: usb: ci-hdrc-imx: add ahb-burst-config for binding doc Peter Chen
2015-03-19  1:19 ` [PATCH 07/12] ARM: imx6: set ahb-burst-config as 0 for USB Peter Chen
2015-03-19  1:19 ` [PATCH 08/12] usb: chipidea: add ahb burst configuration Peter Chen
2015-03-19  1:19 ` [PATCH 09/12] usb: chipidea: usbmisc_imx: add unburst setting for imx6 Peter Chen
2015-03-19  1:19 ` [PATCH 10/12] Doc: usb: ci-hdrc-imx: add tx(rx)-burst-config-dword for binding doc Peter Chen
2015-03-19  1:19 ` [PATCH 11/12] ARM: imx6: change default burst size for USB Peter Chen
2015-03-19  1:19 ` [PATCH 12/12] usb: chipidea: add burst size configuration interface Peter Chen
2015-03-19 10:36 ` [PATCH 00/12] USB: chipidea: patchset for performance improvement Jean-Christophe PLAGNIOL-VILLARD
2015-03-20  2:33   ` Peter Chen
2015-03-24 10:32 ` victorascroft at gmail.com
2015-03-24 12:21   ` Peter Chen
2015-03-26  8:34     ` victorascroft at gmail.com

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1426727963-32280-3-git-send-email-peter.chen@freescale.com \
    --to=peter.chen@freescale.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).