linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 00/12] usb: dwc2/gadget: fix series
@ 2014-07-16 10:22 Robert Baldyga
  2014-07-16 10:22 ` [PATCH v2 01/12] usb: dwc2/gadget: fix phy disable sequence Robert Baldyga
                   ` (12 more replies)
  0 siblings, 13 replies; 17+ messages in thread
From: Robert Baldyga @ 2014-07-16 10:22 UTC (permalink / raw)
  To: balbi
  Cc: paulz, gregkh, linux-usb, linux-kernel, m.szyprowski, andrzej.p,
	Robert Baldyga

Hello,

This patchset contains fixes for dwc2 gadget driver. It touches PHY,
FIFO configuration, initialization sequence and adds many other small fixes.

Best regards
Robert Baldyga
Samsung R&D Institute Poland

Changelog:
v2:
 - add patch usb: dwc2/gadget: avoid disabling ep0
 - fix FIFO flushing when it's assigned to endpoint dynamically
 - write to proper FIFO in s3c_hsotg_write_fifo() function
 - use real FIFO size in kill_all_requests
 - fix comment in s3c_hsotg_init_fifo() function

v1: https://lkml.org/lkml/2014/6/23/67

Andrzej Pietrasiewicz (1):
  usb: dwc2/gadget: Fix comment text

Kamil Debski (3):
  usb: dwc2/gadget: fix phy disable sequence
  usb: dwc2/gadget: fix phy initialization sequence
  usb: dwc2/gadget: move phy bus legth initialization

Marek Szyprowski (5):
  usb: dwc2/gadget: hide some not really needed debug messages
  usb: dwc2/gadget: ensure that all fifos have correct memory buffers
  usb: dwc2/gadget: break infinite loop in endpoint disable code
  usb: dwc2/gadget: do not call disconnect method in pullup
  usb: dwc2/gadget: delay enabling irq once hardware is configured
    properly

Robert Baldyga (3):
  usb: dwc2/gadget: assign TX FIFO dynamically
  usb: dwc2/gadget: disable clock when it's not needed
  usb: dwc2/gadget: avoid disabling ep0

 drivers/usb/dwc2/core.h   |   3 +
 drivers/usb/dwc2/gadget.c | 183 +++++++++++++++++++++++++++-------------------
 2 files changed, 109 insertions(+), 77 deletions(-)

-- 
1.9.1


^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v2 01/12] usb: dwc2/gadget: fix phy disable sequence
  2014-07-16 10:22 [PATCH v2 00/12] usb: dwc2/gadget: fix series Robert Baldyga
@ 2014-07-16 10:22 ` Robert Baldyga
  2014-07-16 10:22 ` [PATCH v2 02/12] usb: dwc2/gadget: fix phy initialization sequence Robert Baldyga
                   ` (11 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: Robert Baldyga @ 2014-07-16 10:22 UTC (permalink / raw)
  To: balbi
  Cc: paulz, gregkh, linux-usb, linux-kernel, m.szyprowski, andrzej.p,
	Kamil Debski, Robert Baldyga

From: Kamil Debski <k.debski@samsung.com>

When the driver is removed s3c_hsotg_phy_disable is called three times
instead of once. This results in decreasing of the phy reference counter
below zero and thus consecutive inserts of the module fails.

This patch removes calls to s3c_hsotg_phy_disable from s3c_hsotg_remove
and s3c_hsotg_udc_stop.

s3c_hsotg_udc_stop is called from udc-core.c only after
usb_gadget_disconnect, which in turn calls s3c_hsotg_pullup, which
already calls s3c_hsotg_phy_disable.

s3c_hsotg_remove must be called only after udc_stop, so there is no
point in disabling phy once again there.

Signed-off-by: Kamil Debski <k.debski@samsung.com>
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Robert Baldyga <r.baldyga@samsung.com>
---
 drivers/usb/dwc2/gadget.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index f3c56a2..ccef3a7 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -2898,8 +2898,6 @@ static int s3c_hsotg_udc_stop(struct usb_gadget *gadget,
 
 	spin_lock_irqsave(&hsotg->lock, flags);
 
-	s3c_hsotg_phy_disable(hsotg);
-
 	if (!driver)
 		hsotg->driver = NULL;
 
@@ -3586,7 +3584,6 @@ static int s3c_hsotg_remove(struct platform_device *pdev)
 		usb_gadget_unregister_driver(hsotg->driver);
 	}
 
-	s3c_hsotg_phy_disable(hsotg);
 	if (hsotg->phy)
 		phy_exit(hsotg->phy);
 	clk_disable_unprepare(hsotg->clk);
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 02/12] usb: dwc2/gadget: fix phy initialization sequence
  2014-07-16 10:22 [PATCH v2 00/12] usb: dwc2/gadget: fix series Robert Baldyga
  2014-07-16 10:22 ` [PATCH v2 01/12] usb: dwc2/gadget: fix phy disable sequence Robert Baldyga
@ 2014-07-16 10:22 ` Robert Baldyga
  2014-07-16 10:22 ` [PATCH v2 03/12] usb: dwc2/gadget: move phy bus legth initialization Robert Baldyga
                   ` (10 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: Robert Baldyga @ 2014-07-16 10:22 UTC (permalink / raw)
  To: balbi
  Cc: paulz, gregkh, linux-usb, linux-kernel, m.szyprowski, andrzej.p,
	Kamil Debski, Robert Baldyga

From: Kamil Debski <k.debski@samsung.com>

In the Generic PHY Framework a NULL phy is considered to be a valid phy
thus the "if (hsotg->phy)" check does not give us the information whether
the Generic PHY Framework is used.

In addition to the above this patch also removes phy_init from probe and
phy_exit from remove. This is not necessary when init/exit is done in the
s3c_hsotg_phy_enable/disable functions.

Signed-off-by: Kamil Debski <k.debski@samsung.com>
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Robert Baldyga <r.baldyga@samsung.com>
---
 drivers/usb/dwc2/gadget.c | 27 ++++++++++++---------------
 1 file changed, 12 insertions(+), 15 deletions(-)

diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index ccef3a7..70eab95 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -2748,13 +2748,14 @@ static void s3c_hsotg_phy_enable(struct s3c_hsotg *hsotg)
 
 	dev_dbg(hsotg->dev, "pdev 0x%p\n", pdev);
 
-	if (hsotg->phy) {
-		phy_init(hsotg->phy);
-		phy_power_on(hsotg->phy);
-	} else if (hsotg->uphy)
+	if (hsotg->uphy)
 		usb_phy_init(hsotg->uphy);
-	else if (hsotg->plat->phy_init)
+	else if (hsotg->plat && hsotg->plat->phy_init)
 		hsotg->plat->phy_init(pdev, hsotg->plat->phy_type);
+	else {
+		phy_init(hsotg->phy);
+		phy_power_on(hsotg->phy);
+	}
 }
 
 /**
@@ -2768,13 +2769,14 @@ static void s3c_hsotg_phy_disable(struct s3c_hsotg *hsotg)
 {
 	struct platform_device *pdev = to_platform_device(hsotg->dev);
 
-	if (hsotg->phy) {
-		phy_power_off(hsotg->phy);
-		phy_exit(hsotg->phy);
-	} else if (hsotg->uphy)
+	if (hsotg->uphy)
 		usb_phy_shutdown(hsotg->uphy);
-	else if (hsotg->plat->phy_exit)
+	else if (hsotg->plat && hsotg->plat->phy_exit)
 		hsotg->plat->phy_exit(pdev, hsotg->plat->phy_type);
+	else {
+		phy_power_off(hsotg->phy);
+		phy_exit(hsotg->phy);
+	}
 }
 
 /**
@@ -3489,9 +3491,6 @@ static int s3c_hsotg_probe(struct platform_device *pdev)
 	if (hsotg->phy && (phy_get_bus_width(phy) == 8))
 		hsotg->phyif = GUSBCFG_PHYIF8;
 
-	if (hsotg->phy)
-		phy_init(hsotg->phy);
-
 	/* usb phy enable */
 	s3c_hsotg_phy_enable(hsotg);
 
@@ -3584,8 +3583,6 @@ static int s3c_hsotg_remove(struct platform_device *pdev)
 		usb_gadget_unregister_driver(hsotg->driver);
 	}
 
-	if (hsotg->phy)
-		phy_exit(hsotg->phy);
 	clk_disable_unprepare(hsotg->clk);
 
 	return 0;
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 03/12] usb: dwc2/gadget: move phy bus legth initialization
  2014-07-16 10:22 [PATCH v2 00/12] usb: dwc2/gadget: fix series Robert Baldyga
  2014-07-16 10:22 ` [PATCH v2 01/12] usb: dwc2/gadget: fix phy disable sequence Robert Baldyga
  2014-07-16 10:22 ` [PATCH v2 02/12] usb: dwc2/gadget: fix phy initialization sequence Robert Baldyga
@ 2014-07-16 10:22 ` Robert Baldyga
  2014-07-16 10:22 ` [PATCH v2 04/12] usb: dwc2/gadget: Fix comment text Robert Baldyga
                   ` (9 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: Robert Baldyga @ 2014-07-16 10:22 UTC (permalink / raw)
  To: balbi
  Cc: paulz, gregkh, linux-usb, linux-kernel, m.szyprowski, andrzej.p,
	Kamil Debski, Robert Baldyga

From: Kamil Debski <k.debski@samsung.com>

This patch moves the part of code that initializes the PHY bus width.
This results in simpler code and removes the need to check whether
the Generic PHY Framework is used.

Signed-off-by: Kamil Debski <k.debski@samsung.com>
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Robert Baldyga <r.baldyga@samsung.com>
---
 drivers/usb/dwc2/gadget.c | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 70eab95..fc27b4c 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -3395,6 +3395,9 @@ static int s3c_hsotg_probe(struct platform_device *pdev)
 		return -ENOMEM;
 	}
 
+	/* Set default UTMI width */
+	hsotg->phyif = GUSBCFG_PHYIF16;
+
 	/*
 	 * Attempt to find a generic PHY, then look for an old style
 	 * USB PHY, finally fall back to pdata
@@ -3413,8 +3416,15 @@ static int s3c_hsotg_probe(struct platform_device *pdev)
 			hsotg->plat = plat;
 		} else
 			hsotg->uphy = uphy;
-	} else
+	} else {
 		hsotg->phy = phy;
+		/*
+		 * If using the generic PHY framework, check if the PHY bus
+		 * width is 8-bit and set the phyif appropriately.
+		 */
+		if (phy_get_bus_width(phy) == 8)
+			hsotg->phyif = GUSBCFG_PHYIF8;
+	}
 
 	hsotg->dev = dev;
 
@@ -3481,16 +3491,6 @@ static int s3c_hsotg_probe(struct platform_device *pdev)
 		goto err_supplies;
 	}
 
-	/* Set default UTMI width */
-	hsotg->phyif = GUSBCFG_PHYIF16;
-
-	/*
-	 * If using the generic PHY framework, check if the PHY bus
-	 * width is 8-bit and set the phyif appropriately.
-	 */
-	if (hsotg->phy && (phy_get_bus_width(phy) == 8))
-		hsotg->phyif = GUSBCFG_PHYIF8;
-
 	/* usb phy enable */
 	s3c_hsotg_phy_enable(hsotg);
 
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 04/12] usb: dwc2/gadget: Fix comment text
  2014-07-16 10:22 [PATCH v2 00/12] usb: dwc2/gadget: fix series Robert Baldyga
                   ` (2 preceding siblings ...)
  2014-07-16 10:22 ` [PATCH v2 03/12] usb: dwc2/gadget: move phy bus legth initialization Robert Baldyga
@ 2014-07-16 10:22 ` Robert Baldyga
  2014-07-16 10:22 ` [PATCH v2 05/12] usb: dwc2/gadget: hide some not really needed debug messages Robert Baldyga
                   ` (8 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: Robert Baldyga @ 2014-07-16 10:22 UTC (permalink / raw)
  To: balbi
  Cc: paulz, gregkh, linux-usb, linux-kernel, m.szyprowski, andrzej.p,
	Robert Baldyga

From: Andrzej Pietrasiewicz <andrzej.p@samsung.com>

Adjust the debug text to the name of the printed variable.

Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
Signed-off-by: Robert Baldyga <r.baldyga@samsung.com>
---
 drivers/usb/dwc2/gadget.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index fc27b4c..35b4890 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -2935,7 +2935,7 @@ static int s3c_hsotg_pullup(struct usb_gadget *gadget, int is_on)
 	struct s3c_hsotg *hsotg = to_hsotg(gadget);
 	unsigned long flags = 0;
 
-	dev_dbg(hsotg->dev, "%s: is_in: %d\n", __func__, is_on);
+	dev_dbg(hsotg->dev, "%s: is_on: %d\n", __func__, is_on);
 
 	spin_lock_irqsave(&hsotg->lock, flags);
 	if (is_on) {
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 05/12] usb: dwc2/gadget: hide some not really needed debug messages
  2014-07-16 10:22 [PATCH v2 00/12] usb: dwc2/gadget: fix series Robert Baldyga
                   ` (3 preceding siblings ...)
  2014-07-16 10:22 ` [PATCH v2 04/12] usb: dwc2/gadget: Fix comment text Robert Baldyga
@ 2014-07-16 10:22 ` Robert Baldyga
  2014-07-16 10:22 ` [PATCH v2 06/12] usb: dwc2/gadget: ensure that all fifos have correct memory buffers Robert Baldyga
                   ` (7 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: Robert Baldyga @ 2014-07-16 10:22 UTC (permalink / raw)
  To: balbi
  Cc: paulz, gregkh, linux-usb, linux-kernel, m.szyprowski, andrzej.p,
	Robert Baldyga

From: Marek Szyprowski <m.szyprowski@samsung.com>

Some DWC2/s3c-hsotg debug messages are really useless for typical user,
so hide them behind dev_dbg().

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Robert Baldyga <r.baldyga@samsung.com>
---
 drivers/usb/dwc2/gadget.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 35b4890..95b6dcb 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -2568,7 +2568,7 @@ static int s3c_hsotg_ep_disable(struct usb_ep *ep)
 	u32 epctrl_reg;
 	u32 ctrl;
 
-	dev_info(hsotg->dev, "%s(ep %p)\n", __func__, ep);
+	dev_dbg(hsotg->dev, "%s(ep %p)\n", __func__, ep);
 
 	if (ep == &hsotg->eps[0].ep) {
 		dev_err(hsotg->dev, "%s: called for ep0\n", __func__);
@@ -2626,7 +2626,7 @@ static int s3c_hsotg_ep_dequeue(struct usb_ep *ep, struct usb_request *req)
 	struct s3c_hsotg *hs = hs_ep->parent;
 	unsigned long flags;
 
-	dev_info(hs->dev, "ep_dequeue(%p,%p)\n", ep, req);
+	dev_dbg(hs->dev, "ep_dequeue(%p,%p)\n", ep, req);
 
 	spin_lock_irqsave(&hs->lock, flags);
 
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 06/12] usb: dwc2/gadget: ensure that all fifos have correct memory buffers
  2014-07-16 10:22 [PATCH v2 00/12] usb: dwc2/gadget: fix series Robert Baldyga
                   ` (4 preceding siblings ...)
  2014-07-16 10:22 ` [PATCH v2 05/12] usb: dwc2/gadget: hide some not really needed debug messages Robert Baldyga
@ 2014-07-16 10:22 ` Robert Baldyga
  2014-07-16 10:22 ` [PATCH v2 07/12] usb: dwc2/gadget: break infinite loop in endpoint disable code Robert Baldyga
                   ` (6 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: Robert Baldyga @ 2014-07-16 10:22 UTC (permalink / raw)
  To: balbi
  Cc: paulz, gregkh, linux-usb, linux-kernel, m.szyprowski, andrzej.p,
	Robert Baldyga

From: Marek Szyprowski <m.szyprowski@samsung.com>

Print warning if FIFOs are configured in such a way that they don't fit
into the SPRAM available on the s3c hsotg module.

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Robert Baldyga <r.baldyga@samsung.com>
---
 drivers/usb/dwc2/core.h   |  1 +
 drivers/usb/dwc2/gadget.c | 15 ++++++++++-----
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h
index 1efd10c..067390e 100644
--- a/drivers/usb/dwc2/core.h
+++ b/drivers/usb/dwc2/core.h
@@ -194,6 +194,7 @@ struct s3c_hsotg {
 	struct regulator_bulk_data supplies[ARRAY_SIZE(s3c_hsotg_supply_names)];
 
 	u32                     phyif;
+	int			fifo_mem;
 	unsigned int            dedicated_fifos:1;
 	unsigned char           num_of_eps;
 
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 95b6dcb..21d21de 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -194,6 +194,8 @@ static void s3c_hsotg_init_fifo(struct s3c_hsotg *hsotg)
 	for (ep = 1; ep <= 15; ep++) {
 		val = addr;
 		val |= size << FIFOSIZE_DEPTH_SHIFT;
+		WARN_ONCE(addr + size > hsotg->fifo_mem,
+			  "insufficient fifo memory");
 		addr += size;
 
 		writel(val, hsotg->regs + DPTXFSIZN(ep));
@@ -3030,19 +3032,22 @@ static void s3c_hsotg_initep(struct s3c_hsotg *hsotg,
  */
 static void s3c_hsotg_hw_cfg(struct s3c_hsotg *hsotg)
 {
-	u32 cfg2, cfg4;
+	u32 cfg2, cfg3, cfg4;
 	/* check hardware configuration */
 
 	cfg2 = readl(hsotg->regs + 0x48);
 	hsotg->num_of_eps = (cfg2 >> 10) & 0xF;
 
-	dev_info(hsotg->dev, "EPs:%d\n", hsotg->num_of_eps);
+	cfg3 = readl(hsotg->regs + 0x4C);
+	hsotg->fifo_mem = (cfg3 >> 16);
 
 	cfg4 = readl(hsotg->regs + 0x50);
 	hsotg->dedicated_fifos = (cfg4 >> 25) & 1;
 
-	dev_info(hsotg->dev, "%s fifos\n",
-		 hsotg->dedicated_fifos ? "dedicated" : "shared");
+	dev_info(hsotg->dev, "EPs: %d, %s fifos, %d entries in SPRAM\n",
+		 hsotg->num_of_eps,
+		 hsotg->dedicated_fifos ? "dedicated" : "shared",
+		 hsotg->fifo_mem);
 }
 
 /**
@@ -3495,8 +3500,8 @@ static int s3c_hsotg_probe(struct platform_device *pdev)
 	s3c_hsotg_phy_enable(hsotg);
 
 	s3c_hsotg_corereset(hsotg);
-	s3c_hsotg_init(hsotg);
 	s3c_hsotg_hw_cfg(hsotg);
+	s3c_hsotg_init(hsotg);
 
 	/* hsotg->num_of_eps holds number of EPs other than ep0 */
 
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 07/12] usb: dwc2/gadget: break infinite loop in endpoint disable code
  2014-07-16 10:22 [PATCH v2 00/12] usb: dwc2/gadget: fix series Robert Baldyga
                   ` (5 preceding siblings ...)
  2014-07-16 10:22 ` [PATCH v2 06/12] usb: dwc2/gadget: ensure that all fifos have correct memory buffers Robert Baldyga
@ 2014-07-16 10:22 ` Robert Baldyga
  2014-07-16 10:22 ` [PATCH v2 08/12] usb: dwc2/gadget: do not call disconnect method in pullup Robert Baldyga
                   ` (5 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: Robert Baldyga @ 2014-07-16 10:22 UTC (permalink / raw)
  To: balbi
  Cc: paulz, gregkh, linux-usb, linux-kernel, m.szyprowski, andrzej.p,
	Robert Baldyga

From: Marek Szyprowski <m.szyprowski@samsung.com>

This patch fixes possible freeze caused by infinite loop in interrupt
context.

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Robert Baldyga <r.baldyga@samsung.com>
---
 drivers/usb/dwc2/gadget.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 21d21de..2220882 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -1652,6 +1652,7 @@ static void s3c_hsotg_txfifo_flush(struct s3c_hsotg *hsotg, unsigned int idx)
 			dev_err(hsotg->dev,
 				"%s: timeout flushing fifo (GRSTCTL=%08x)\n",
 				__func__, val);
+			break;
 		}
 
 		udelay(1);
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 08/12] usb: dwc2/gadget: do not call disconnect method in pullup
  2014-07-16 10:22 [PATCH v2 00/12] usb: dwc2/gadget: fix series Robert Baldyga
                   ` (6 preceding siblings ...)
  2014-07-16 10:22 ` [PATCH v2 07/12] usb: dwc2/gadget: break infinite loop in endpoint disable code Robert Baldyga
@ 2014-07-16 10:22 ` Robert Baldyga
  2014-07-16 10:22 ` [PATCH v2 09/12] usb: dwc2/gadget: delay enabling irq once hardware is configured properly Robert Baldyga
                   ` (4 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: Robert Baldyga @ 2014-07-16 10:22 UTC (permalink / raw)
  To: balbi
  Cc: paulz, gregkh, linux-usb, linux-kernel, m.szyprowski, andrzej.p,
	Robert Baldyga

From: Marek Szyprowski <m.szyprowski@samsung.com>

This leads to potential spinlock recursion in composite framework, other
udc drivers also don't call it directly from pullup method.

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Robert Baldyga <r.baldyga@samsung.com>
---
 drivers/usb/dwc2/gadget.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 2220882..def4900 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -2945,7 +2945,6 @@ static int s3c_hsotg_pullup(struct usb_gadget *gadget, int is_on)
 		s3c_hsotg_phy_enable(hsotg);
 		s3c_hsotg_core_init(hsotg);
 	} else {
-		s3c_hsotg_disconnect(hsotg);
 		s3c_hsotg_phy_disable(hsotg);
 	}
 
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 09/12] usb: dwc2/gadget: delay enabling irq once hardware is configured properly
  2014-07-16 10:22 [PATCH v2 00/12] usb: dwc2/gadget: fix series Robert Baldyga
                   ` (7 preceding siblings ...)
  2014-07-16 10:22 ` [PATCH v2 08/12] usb: dwc2/gadget: do not call disconnect method in pullup Robert Baldyga
@ 2014-07-16 10:22 ` Robert Baldyga
  2014-07-16 10:22 ` [PATCH v2 10/12] usb: dwc2/gadget: assign TX FIFO dynamically Robert Baldyga
                   ` (3 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: Robert Baldyga @ 2014-07-16 10:22 UTC (permalink / raw)
  To: balbi
  Cc: paulz, gregkh, linux-usb, linux-kernel, m.szyprowski, andrzej.p,
	Robert Baldyga

From: Marek Szyprowski <m.szyprowski@samsung.com>

This patch fixes kernel panic/interrupt storm/etc issues if bootloader
left s3c-hsotg module in enabled state. Now interrupt handler is enabled
only after proper configuration of hardware registers.

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Robert Baldyga <r.baldyga@samsung.com>
---
 drivers/usb/dwc2/gadget.c | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index def4900..3435711 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -3459,13 +3459,6 @@ static int s3c_hsotg_probe(struct platform_device *pdev)
 
 	hsotg->irq = ret;
 
-	ret = devm_request_irq(&pdev->dev, hsotg->irq, s3c_hsotg_irq, 0,
-				dev_name(dev), hsotg);
-	if (ret < 0) {
-		dev_err(dev, "cannot claim IRQ\n");
-		goto err_clk;
-	}
-
 	dev_info(dev, "regs %p, irq %d\n", hsotg->regs, hsotg->irq);
 
 	hsotg->gadget.max_speed = USB_SPEED_HIGH;
@@ -3503,6 +3496,17 @@ static int s3c_hsotg_probe(struct platform_device *pdev)
 	s3c_hsotg_hw_cfg(hsotg);
 	s3c_hsotg_init(hsotg);
 
+	ret = devm_request_irq(&pdev->dev, hsotg->irq, s3c_hsotg_irq, 0,
+				dev_name(dev), hsotg);
+	if (ret < 0) {
+		s3c_hsotg_phy_disable(hsotg);
+		clk_disable_unprepare(hsotg->clk);
+		regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies),
+				       hsotg->supplies);
+		dev_err(dev, "cannot claim IRQ\n");
+		goto err_clk;
+	}
+
 	/* hsotg->num_of_eps holds number of EPs other than ep0 */
 
 	if (hsotg->num_of_eps == 0) {
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 10/12] usb: dwc2/gadget: assign TX FIFO dynamically
  2014-07-16 10:22 [PATCH v2 00/12] usb: dwc2/gadget: fix series Robert Baldyga
                   ` (8 preceding siblings ...)
  2014-07-16 10:22 ` [PATCH v2 09/12] usb: dwc2/gadget: delay enabling irq once hardware is configured properly Robert Baldyga
@ 2014-07-16 10:22 ` Robert Baldyga
  2014-07-16 19:58   ` Paul Zimmerman
  2014-07-16 10:22 ` [PATCH v2 11/12] usb: dwc2/gadget: disable clock when it's not needed Robert Baldyga
                   ` (2 subsequent siblings)
  12 siblings, 1 reply; 17+ messages in thread
From: Robert Baldyga @ 2014-07-16 10:22 UTC (permalink / raw)
  To: balbi
  Cc: paulz, gregkh, linux-usb, linux-kernel, m.szyprowski, andrzej.p,
	Robert Baldyga

Because we have not enough memory to have each TX FIFO of size at least 3072
bytes (the maximum single packet size), we create four FIFOs of lenght 1024,
and four of length 3072 bytes, and assing them to endpoints dynamically
according to maxpacket size value of given endpoint.

It needed to do some small modifications in few places in code, because there
was assumption that TX FIFO numbers assigned to endpoints are the same as
the endpoint numbers, which is not true since we have dynamic FIFO assigning.

Signed-off-by: Robert Baldyga <r.baldyga@samsung.com>
---
 drivers/usb/dwc2/core.h   |  2 ++
 drivers/usb/dwc2/gadget.c | 84 +++++++++++++++++++++++++++++------------------
 2 files changed, 54 insertions(+), 32 deletions(-)

diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h
index 067390e..3b4bd4c 100644
--- a/drivers/usb/dwc2/core.h
+++ b/drivers/usb/dwc2/core.h
@@ -139,6 +139,7 @@ struct s3c_hsotg_ep {
 	unsigned int            last_load;
 	unsigned int            fifo_load;
 	unsigned short          fifo_size;
+	unsigned short		fifo_index;
 
 	unsigned char           dir_in;
 	unsigned char           index;
@@ -197,6 +198,7 @@ struct s3c_hsotg {
 	int			fifo_mem;
 	unsigned int            dedicated_fifos:1;
 	unsigned char           num_of_eps;
+	u32			fifo_map;
 
 	struct dentry           *debug_root;
 	struct dentry           *debug_file;
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 3435711..1b5e9ff 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -184,14 +184,29 @@ static void s3c_hsotg_init_fifo(struct s3c_hsotg *hsotg)
 
 	/* start at the end of the GNPTXFSIZ, rounded up */
 	addr = 2048 + 1024;
-	size = 768;
 
 	/*
-	 * currently we allocate TX FIFOs for all possible endpoints,
-	 * and assume that they are all the same size.
+	 * Because we have not enough memory to have each TX FIFO of size at
+	 * least 3072 bytes (the maximum single packet size), we create four
+	 * FIFOs of lenght 1024, and four of length 3072 bytes, and assing
+	 * them to endpoints dynamically according to maxpacket size value of
+	 * given endpoint.
 	 */
 
-	for (ep = 1; ep <= 15; ep++) {
+	/* 256*4=1024 bytes FIFO length */
+	size = 256;
+	for (ep = 1; ep <= 4; ep++) {
+		val = addr;
+		val |= size << FIFOSIZE_DEPTH_SHIFT;
+		WARN_ONCE(addr + size > hsotg->fifo_mem,
+			  "insufficient fifo memory");
+		addr += size;
+
+		writel(val, hsotg->regs + DPTXFSIZN(ep));
+	}
+	/* 768*4=3072 bytes FIFO length */
+	size = 768;
+	for (ep = 5; ep <= 8; ep++) {
 		val = addr;
 		val |= size << FIFOSIZE_DEPTH_SHIFT;
 		WARN_ONCE(addr + size > hsotg->fifo_mem,
@@ -450,7 +465,7 @@ static int s3c_hsotg_write_fifo(struct s3c_hsotg *hsotg,
 	to_write = DIV_ROUND_UP(to_write, 4);
 	data = hs_req->req.buf + buf_pos;
 
-	iowrite32_rep(hsotg->regs + EPFIFO(hs_ep->index), data, to_write);
+	iowrite32_rep(hsotg->regs + EPFIFO(hs_ep->fifo_index), data, to_write);
 
 	return (to_write >= can_write) ? -ENOSPC : 0;
 }
@@ -1281,7 +1296,7 @@ static void s3c_hsotg_rx_data(struct s3c_hsotg *hsotg, int ep_idx, int size)
 {
 	struct s3c_hsotg_ep *hs_ep = &hsotg->eps[ep_idx];
 	struct s3c_hsotg_req *hs_req = hs_ep->req;
-	void __iomem *fifo = hsotg->regs + EPFIFO(ep_idx);
+	void __iomem *fifo = hsotg->regs + EPFIFO(hs_ep->fifo_index);
 	int to_read;
 	int max_req;
 	int read_ptr;
@@ -1835,7 +1850,7 @@ static void s3c_hsotg_epint(struct s3c_hsotg *hsotg, unsigned int idx,
 		if (dir_in) {
 			int epctl = readl(hsotg->regs + epctl_reg);
 
-			s3c_hsotg_txfifo_flush(hsotg, idx);
+			s3c_hsotg_txfifo_flush(hsotg, hs_ep->fifo_index);
 
 			if ((epctl & DXEPCTL_STALL) &&
 				(epctl & DXEPCTL_EPTYPE_BULK)) {
@@ -1984,6 +1999,7 @@ static void kill_all_requests(struct s3c_hsotg *hsotg,
 			      int result, bool force)
 {
 	struct s3c_hsotg_req *req, *treq;
+	unsigned size;
 
 	list_for_each_entry_safe(req, treq, &ep->queue, queue) {
 		/*
@@ -1997,9 +2013,11 @@ static void kill_all_requests(struct s3c_hsotg *hsotg,
 		s3c_hsotg_complete_request(hsotg, ep, req,
 					   result);
 	}
-	if(hsotg->dedicated_fifos)
-		if ((readl(hsotg->regs + DTXFSTS(ep->index)) & 0xffff) * 4 < 3072)
-			s3c_hsotg_txfifo_flush(hsotg, ep->index);
+	if (hsotg->dedicated_fifos) {
+		size = (readl(hsotg->regs + DTXFSTS(ep->index)) & 0xffff) * 4;
+		if (size < ep->fifo_size)
+			s3c_hsotg_txfifo_flush(hsotg, ep->fifo_index);
+	}
 }
 
 /**
@@ -2440,6 +2458,7 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep,
 	u32 epctrl;
 	u32 mps;
 	int dir_in;
+	int i, val, size;
 	int ret = 0;
 
 	dev_dbg(hsotg->dev,
@@ -2512,17 +2531,8 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep,
 		break;
 
 	case USB_ENDPOINT_XFER_INT:
-		if (dir_in) {
-			/*
-			 * Allocate our TxFNum by simply using the index
-			 * of the endpoint for the moment. We could do
-			 * something better if the host indicates how
-			 * many FIFOs we are expecting to use.
-			 */
-
+		if (dir_in)
 			hs_ep->periodic = 1;
-			epctrl |= DXEPCTL_TXFNUM(index);
-		}
 
 		epctrl |= DXEPCTL_EPTYPE_INTERRUPT;
 		break;
@@ -2536,8 +2546,25 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep,
 	 * if the hardware has dedicated fifos, we must give each IN EP
 	 * a unique tx-fifo even if it is non-periodic.
 	 */
-	if (dir_in && hsotg->dedicated_fifos)
-		epctrl |= DXEPCTL_TXFNUM(index);
+	if (dir_in && hsotg->dedicated_fifos) {
+		size = hs_ep->ep.maxpacket*hs_ep->mc;
+		for (i = 1; i <= 8; ++i) {
+			if (hsotg->fifo_map & (1<<i))
+				continue;
+			val = readl(hsotg->regs + DPTXFSIZN(i));
+			val = (val >> FIFOSIZE_DEPTH_SHIFT)*4;
+			if (val < size)
+				continue;
+			hsotg->fifo_map |= 1<<i;
+
+			epctrl |= DXEPCTL_TXFNUM(i);
+			hs_ep->fifo_index = i;
+			hs_ep->fifo_size = val;
+			break;
+		}
+		if (i == 8)
+			return -ENOMEM;
+	}
 
 	/* for non control endpoints, set PID to D0 */
 	if (index)
@@ -2584,6 +2611,9 @@ static int s3c_hsotg_ep_disable(struct usb_ep *ep)
 	/* terminate all requests with shutdown */
 	kill_all_requests(hsotg, hs_ep, -ESHUTDOWN, false);
 
+	hsotg->fifo_map &= ~(1<<hs_ep->fifo_index);
+	hs_ep->fifo_index = 0;
+	hs_ep->fifo_size = 0;
 
 	ctrl = readl(hsotg->regs + epctrl_reg);
 	ctrl &= ~DXEPCTL_EPENA;
@@ -2975,7 +3005,6 @@ static void s3c_hsotg_initep(struct s3c_hsotg *hsotg,
 				       struct s3c_hsotg_ep *hs_ep,
 				       int epnum)
 {
-	u32 ptxfifo;
 	char *dir;
 
 	if (epnum == 0)
@@ -3004,15 +3033,6 @@ static void s3c_hsotg_initep(struct s3c_hsotg *hsotg,
 	hs_ep->ep.ops = &s3c_hsotg_ep_ops;
 
 	/*
-	 * Read the FIFO size for the Periodic TX FIFO, even if we're
-	 * an OUT endpoint, we may as well do this if in future the
-	 * code is changed to make each endpoint's direction changeable.
-	 */
-
-	ptxfifo = readl(hsotg->regs + DPTXFSIZN(epnum));
-	hs_ep->fifo_size = FIFOSIZE_DEPTH_GET(ptxfifo) * 4;
-
-	/*
 	 * if we're using dma, we need to set the next-endpoint pointer
 	 * to be something valid.
 	 */
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 11/12] usb: dwc2/gadget: disable clock when it's not needed
  2014-07-16 10:22 [PATCH v2 00/12] usb: dwc2/gadget: fix series Robert Baldyga
                   ` (9 preceding siblings ...)
  2014-07-16 10:22 ` [PATCH v2 10/12] usb: dwc2/gadget: assign TX FIFO dynamically Robert Baldyga
@ 2014-07-16 10:22 ` Robert Baldyga
  2014-07-16 10:22 ` [PATCH v2 12/12] usb: dwc2/gadget: avoid disabling ep0 Robert Baldyga
  2014-07-17  0:27 ` [PATCH v2 00/12] usb: dwc2/gadget: fix series Paul Zimmerman
  12 siblings, 0 replies; 17+ messages in thread
From: Robert Baldyga @ 2014-07-16 10:22 UTC (permalink / raw)
  To: balbi
  Cc: paulz, gregkh, linux-usb, linux-kernel, m.szyprowski, andrzej.p,
	Robert Baldyga

When device is stopped or suspended clock is not needed so we
can disable it for this time.

Signed-off-by: Robert Baldyga <r.baldyga@samsung.com>
---
 drivers/usb/dwc2/gadget.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 1b5e9ff..68b764e 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -2894,6 +2894,8 @@ static int s3c_hsotg_udc_start(struct usb_gadget *gadget,
 	hsotg->gadget.dev.of_node = hsotg->dev->of_node;
 	hsotg->gadget.speed = USB_SPEED_UNKNOWN;
 
+	clk_enable(hsotg->clk);
+
 	ret = regulator_bulk_enable(ARRAY_SIZE(hsotg->supplies),
 				    hsotg->supplies);
 	if (ret) {
@@ -2942,6 +2944,8 @@ static int s3c_hsotg_udc_stop(struct usb_gadget *gadget,
 
 	regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies), hsotg->supplies);
 
+	clk_disable(hsotg->clk);
+
 	return 0;
 }
 
@@ -2973,8 +2977,10 @@ static int s3c_hsotg_pullup(struct usb_gadget *gadget, int is_on)
 	spin_lock_irqsave(&hsotg->lock, flags);
 	if (is_on) {
 		s3c_hsotg_phy_enable(hsotg);
+		clk_enable(hsotg->clk);
 		s3c_hsotg_core_init(hsotg);
 	} else {
+		clk_disable(hsotg->clk);
 		s3c_hsotg_phy_disable(hsotg);
 	}
 
@@ -3640,6 +3646,7 @@ static int s3c_hsotg_suspend(struct platform_device *pdev, pm_message_t state)
 
 		ret = regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies),
 					     hsotg->supplies);
+		clk_disable(hsotg->clk);
 	}
 
 	return ret;
@@ -3654,6 +3661,8 @@ static int s3c_hsotg_resume(struct platform_device *pdev)
 	if (hsotg->driver) {
 		dev_info(hsotg->dev, "resuming usb gadget %s\n",
 			 hsotg->driver->driver.name);
+
+		clk_enable(hsotg->clk);
 		ret = regulator_bulk_enable(ARRAY_SIZE(hsotg->supplies),
 				      hsotg->supplies);
 	}
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 12/12] usb: dwc2/gadget: avoid disabling ep0
  2014-07-16 10:22 [PATCH v2 00/12] usb: dwc2/gadget: fix series Robert Baldyga
                   ` (10 preceding siblings ...)
  2014-07-16 10:22 ` [PATCH v2 11/12] usb: dwc2/gadget: disable clock when it's not needed Robert Baldyga
@ 2014-07-16 10:22 ` Robert Baldyga
  2014-07-17  0:27 ` [PATCH v2 00/12] usb: dwc2/gadget: fix series Paul Zimmerman
  12 siblings, 0 replies; 17+ messages in thread
From: Robert Baldyga @ 2014-07-16 10:22 UTC (permalink / raw)
  To: balbi
  Cc: paulz, gregkh, linux-usb, linux-kernel, m.szyprowski, andrzej.p,
	Robert Baldyga

Endpoint 0 should not be disabled, so we start loop counter from number 1.

Signed-off-by: Robert Baldyga <r.baldyga@samsung.com>
---
 drivers/usb/dwc2/gadget.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 68b764e..3e4c3b9 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -2930,7 +2930,7 @@ static int s3c_hsotg_udc_stop(struct usb_gadget *gadget,
 		return -ENODEV;
 
 	/* all endpoints should be shutdown */
-	for (ep = 0; ep < hsotg->num_of_eps; ep++)
+	for (ep = 1; ep < hsotg->num_of_eps; ep++)
 		s3c_hsotg_ep_disable(&hsotg->eps[ep].ep);
 
 	spin_lock_irqsave(&hsotg->lock, flags);
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* RE: [PATCH v2 10/12] usb: dwc2/gadget: assign TX FIFO dynamically
  2014-07-16 10:22 ` [PATCH v2 10/12] usb: dwc2/gadget: assign TX FIFO dynamically Robert Baldyga
@ 2014-07-16 19:58   ` Paul Zimmerman
  2014-07-16 20:22     ` Paul Zimmerman
  2014-07-18 11:07     ` Robert Baldyga
  0 siblings, 2 replies; 17+ messages in thread
From: Paul Zimmerman @ 2014-07-16 19:58 UTC (permalink / raw)
  To: Robert Baldyga, balbi
  Cc: gregkh, linux-usb, linux-kernel, m.szyprowski, andrzej.p

> From: Robert Baldyga [mailto:r.baldyga@samsung.com]
> Sent: Wednesday, July 16, 2014 3:22 AM
> 
> Because we have not enough memory to have each TX FIFO of size at least 3072
> bytes (the maximum single packet size), we create four FIFOs of lenght 1024,
> and four of length 3072 bytes, and assing them to endpoints dynamically
> according to maxpacket size value of given endpoint.

I don't think this commit message entirely explains what you are doing
here.

3072 is actually 3 times the max packet size for an Isoc endpoint. So you
want to have four TX FIFOs of that size, presumably to be assigned to
Isoc endpoints. Where before this change, all TX FIFOs were of size 768,
which is not even 1 max packet size for an Isoc endpoint. So I guess you
were seeing some problem with that?

With a TX FIFO size of 3072, an entire microframe worth of Isoc data
(when MaxBurst=2) can fit in the FIFO. I guess that is why you chose
3072?

Also, after this change, you are only initializing 8 TX FIFOs, where
before you were initializing all 15. So now there can only be a maximum
of 8 IN endpoints active at the same time. That's OK I guess, but I
think you should mention that in the commit message.

-- 
Paul

> It needed to do some small modifications in few places in code, because there
> was assumption that TX FIFO numbers assigned to endpoints are the same as
> the endpoint numbers, which is not true since we have dynamic FIFO assigning.
> 
> Signed-off-by: Robert Baldyga <r.baldyga@samsung.com>
> ---
>  drivers/usb/dwc2/core.h   |  2 ++
>  drivers/usb/dwc2/gadget.c | 84 +++++++++++++++++++++++++++++------------------
>  2 files changed, 54 insertions(+), 32 deletions(-)
> 
> diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h
> index 067390e..3b4bd4c 100644
> --- a/drivers/usb/dwc2/core.h
> +++ b/drivers/usb/dwc2/core.h
> @@ -139,6 +139,7 @@ struct s3c_hsotg_ep {
>  	unsigned int            last_load;
>  	unsigned int            fifo_load;
>  	unsigned short          fifo_size;
> +	unsigned short		fifo_index;
> 
>  	unsigned char           dir_in;
>  	unsigned char           index;
> @@ -197,6 +198,7 @@ struct s3c_hsotg {
>  	int			fifo_mem;
>  	unsigned int            dedicated_fifos:1;
>  	unsigned char           num_of_eps;
> +	u32			fifo_map;
> 
>  	struct dentry           *debug_root;
>  	struct dentry           *debug_file;
> diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
> index 3435711..1b5e9ff 100644
> --- a/drivers/usb/dwc2/gadget.c
> +++ b/drivers/usb/dwc2/gadget.c
> @@ -184,14 +184,29 @@ static void s3c_hsotg_init_fifo(struct s3c_hsotg *hsotg)
> 
>  	/* start at the end of the GNPTXFSIZ, rounded up */
>  	addr = 2048 + 1024;
> -	size = 768;
> 
>  	/*
> -	 * currently we allocate TX FIFOs for all possible endpoints,
> -	 * and assume that they are all the same size.
> +	 * Because we have not enough memory to have each TX FIFO of size at
> +	 * least 3072 bytes (the maximum single packet size), we create four
> +	 * FIFOs of lenght 1024, and four of length 3072 bytes, and assing
> +	 * them to endpoints dynamically according to maxpacket size value of
> +	 * given endpoint.
>  	 */
> 
> -	for (ep = 1; ep <= 15; ep++) {
> +	/* 256*4=1024 bytes FIFO length */
> +	size = 256;
> +	for (ep = 1; ep <= 4; ep++) {
> +		val = addr;
> +		val |= size << FIFOSIZE_DEPTH_SHIFT;
> +		WARN_ONCE(addr + size > hsotg->fifo_mem,
> +			  "insufficient fifo memory");
> +		addr += size;
> +
> +		writel(val, hsotg->regs + DPTXFSIZN(ep));
> +	}
> +	/* 768*4=3072 bytes FIFO length */
> +	size = 768;
> +	for (ep = 5; ep <= 8; ep++) {
>  		val = addr;
>  		val |= size << FIFOSIZE_DEPTH_SHIFT;
>  		WARN_ONCE(addr + size > hsotg->fifo_mem,
> @@ -450,7 +465,7 @@ static int s3c_hsotg_write_fifo(struct s3c_hsotg *hsotg,
>  	to_write = DIV_ROUND_UP(to_write, 4);
>  	data = hs_req->req.buf + buf_pos;
> 
> -	iowrite32_rep(hsotg->regs + EPFIFO(hs_ep->index), data, to_write);
> +	iowrite32_rep(hsotg->regs + EPFIFO(hs_ep->fifo_index), data, to_write);
> 
>  	return (to_write >= can_write) ? -ENOSPC : 0;
>  }
> @@ -1281,7 +1296,7 @@ static void s3c_hsotg_rx_data(struct s3c_hsotg *hsotg, int ep_idx, int size)
>  {
>  	struct s3c_hsotg_ep *hs_ep = &hsotg->eps[ep_idx];
>  	struct s3c_hsotg_req *hs_req = hs_ep->req;
> -	void __iomem *fifo = hsotg->regs + EPFIFO(ep_idx);
> +	void __iomem *fifo = hsotg->regs + EPFIFO(hs_ep->fifo_index);
>  	int to_read;
>  	int max_req;
>  	int read_ptr;
> @@ -1835,7 +1850,7 @@ static void s3c_hsotg_epint(struct s3c_hsotg *hsotg, unsigned int idx,
>  		if (dir_in) {
>  			int epctl = readl(hsotg->regs + epctl_reg);
> 
> -			s3c_hsotg_txfifo_flush(hsotg, idx);
> +			s3c_hsotg_txfifo_flush(hsotg, hs_ep->fifo_index);
> 
>  			if ((epctl & DXEPCTL_STALL) &&
>  				(epctl & DXEPCTL_EPTYPE_BULK)) {
> @@ -1984,6 +1999,7 @@ static void kill_all_requests(struct s3c_hsotg *hsotg,
>  			      int result, bool force)
>  {
>  	struct s3c_hsotg_req *req, *treq;
> +	unsigned size;
> 
>  	list_for_each_entry_safe(req, treq, &ep->queue, queue) {
>  		/*
> @@ -1997,9 +2013,11 @@ static void kill_all_requests(struct s3c_hsotg *hsotg,
>  		s3c_hsotg_complete_request(hsotg, ep, req,
>  					   result);
>  	}
> -	if(hsotg->dedicated_fifos)
> -		if ((readl(hsotg->regs + DTXFSTS(ep->index)) & 0xffff) * 4 < 3072)
> -			s3c_hsotg_txfifo_flush(hsotg, ep->index);
> +	if (hsotg->dedicated_fifos) {
> +		size = (readl(hsotg->regs + DTXFSTS(ep->index)) & 0xffff) * 4;
> +		if (size < ep->fifo_size)
> +			s3c_hsotg_txfifo_flush(hsotg, ep->fifo_index);
> +	}
>  }
> 
>  /**
> @@ -2440,6 +2458,7 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep,
>  	u32 epctrl;
>  	u32 mps;
>  	int dir_in;
> +	int i, val, size;
>  	int ret = 0;
> 
>  	dev_dbg(hsotg->dev,
> @@ -2512,17 +2531,8 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep,
>  		break;
> 
>  	case USB_ENDPOINT_XFER_INT:
> -		if (dir_in) {
> -			/*
> -			 * Allocate our TxFNum by simply using the index
> -			 * of the endpoint for the moment. We could do
> -			 * something better if the host indicates how
> -			 * many FIFOs we are expecting to use.
> -			 */
> -
> +		if (dir_in)
>  			hs_ep->periodic = 1;
> -			epctrl |= DXEPCTL_TXFNUM(index);
> -		}
> 
>  		epctrl |= DXEPCTL_EPTYPE_INTERRUPT;
>  		break;
> @@ -2536,8 +2546,25 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep,
>  	 * if the hardware has dedicated fifos, we must give each IN EP
>  	 * a unique tx-fifo even if it is non-periodic.
>  	 */
> -	if (dir_in && hsotg->dedicated_fifos)
> -		epctrl |= DXEPCTL_TXFNUM(index);
> +	if (dir_in && hsotg->dedicated_fifos) {
> +		size = hs_ep->ep.maxpacket*hs_ep->mc;
> +		for (i = 1; i <= 8; ++i) {
> +			if (hsotg->fifo_map & (1<<i))
> +				continue;
> +			val = readl(hsotg->regs + DPTXFSIZN(i));
> +			val = (val >> FIFOSIZE_DEPTH_SHIFT)*4;
> +			if (val < size)
> +				continue;
> +			hsotg->fifo_map |= 1<<i;
> +
> +			epctrl |= DXEPCTL_TXFNUM(i);
> +			hs_ep->fifo_index = i;
> +			hs_ep->fifo_size = val;
> +			break;
> +		}
> +		if (i == 8)
> +			return -ENOMEM;
> +	}
> 
>  	/* for non control endpoints, set PID to D0 */
>  	if (index)
> @@ -2584,6 +2611,9 @@ static int s3c_hsotg_ep_disable(struct usb_ep *ep)
>  	/* terminate all requests with shutdown */
>  	kill_all_requests(hsotg, hs_ep, -ESHUTDOWN, false);
> 
> +	hsotg->fifo_map &= ~(1<<hs_ep->fifo_index);
> +	hs_ep->fifo_index = 0;
> +	hs_ep->fifo_size = 0;
> 
>  	ctrl = readl(hsotg->regs + epctrl_reg);
>  	ctrl &= ~DXEPCTL_EPENA;
> @@ -2975,7 +3005,6 @@ static void s3c_hsotg_initep(struct s3c_hsotg *hsotg,
>  				       struct s3c_hsotg_ep *hs_ep,
>  				       int epnum)
>  {
> -	u32 ptxfifo;
>  	char *dir;
> 
>  	if (epnum == 0)
> @@ -3004,15 +3033,6 @@ static void s3c_hsotg_initep(struct s3c_hsotg *hsotg,
>  	hs_ep->ep.ops = &s3c_hsotg_ep_ops;
> 
>  	/*
> -	 * Read the FIFO size for the Periodic TX FIFO, even if we're
> -	 * an OUT endpoint, we may as well do this if in future the
> -	 * code is changed to make each endpoint's direction changeable.
> -	 */
> -
> -	ptxfifo = readl(hsotg->regs + DPTXFSIZN(epnum));
> -	hs_ep->fifo_size = FIFOSIZE_DEPTH_GET(ptxfifo) * 4;
> -
> -	/*
>  	 * if we're using dma, we need to set the next-endpoint pointer
>  	 * to be something valid.
>  	 */
> --
> 1.9.1


^ permalink raw reply	[flat|nested] 17+ messages in thread

* RE: [PATCH v2 10/12] usb: dwc2/gadget: assign TX FIFO dynamically
  2014-07-16 19:58   ` Paul Zimmerman
@ 2014-07-16 20:22     ` Paul Zimmerman
  2014-07-18 11:07     ` Robert Baldyga
  1 sibling, 0 replies; 17+ messages in thread
From: Paul Zimmerman @ 2014-07-16 20:22 UTC (permalink / raw)
  To: Robert Baldyga, balbi
  Cc: gregkh, linux-usb, linux-kernel, m.szyprowski, andrzej.p

> With a TX FIFO size of 3072, an entire microframe worth of Isoc data
> (when MaxBurst=2) can fit in the FIFO. I guess that is why you chose

s/MaxBurst/Mult/ i.e. bits 12..11 of wMaxPacketSize.

-- 
Paul

> From: linux-usb-owner@vger.kernel.org [mailto:linux-usb-owner@vger.kernel.org] On Behalf Of Paul Zimmerman
> Sent: Wednesday, July 16, 2014 12:58 PM
> 
> > From: Robert Baldyga [mailto:r.baldyga@samsung.com]
> > Sent: Wednesday, July 16, 2014 3:22 AM
> >
> > Because we have not enough memory to have each TX FIFO of size at least 3072
> > bytes (the maximum single packet size), we create four FIFOs of lenght 1024,
> > and four of length 3072 bytes, and assing them to endpoints dynamically
> > according to maxpacket size value of given endpoint.
> 
> I don't think this commit message entirely explains what you are doing
> here.
> 
> 3072 is actually 3 times the max packet size for an Isoc endpoint. So you
> want to have four TX FIFOs of that size, presumably to be assigned to
> Isoc endpoints. Where before this change, all TX FIFOs were of size 768,
> which is not even 1 max packet size for an Isoc endpoint. So I guess you
> were seeing some problem with that?
> 
> With a TX FIFO size of 3072, an entire microframe worth of Isoc data
> (when MaxBurst=2) can fit in the FIFO. I guess that is why you chose
> 3072?
> 
> Also, after this change, you are only initializing 8 TX FIFOs, where
> before you were initializing all 15. So now there can only be a maximum
> of 8 IN endpoints active at the same time. That's OK I guess, but I
> think you should mention that in the commit message.
> 
> --
> Paul
> 
> > It needed to do some small modifications in few places in code, because there
> > was assumption that TX FIFO numbers assigned to endpoints are the same as
> > the endpoint numbers, which is not true since we have dynamic FIFO assigning.
> >
> > Signed-off-by: Robert Baldyga <r.baldyga@samsung.com>
> > ---
> >  drivers/usb/dwc2/core.h   |  2 ++
> >  drivers/usb/dwc2/gadget.c | 84 +++++++++++++++++++++++++++++------------------
> >  2 files changed, 54 insertions(+), 32 deletions(-)
> >
> > diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h
> > index 067390e..3b4bd4c 100644
> > --- a/drivers/usb/dwc2/core.h
> > +++ b/drivers/usb/dwc2/core.h
> > @@ -139,6 +139,7 @@ struct s3c_hsotg_ep {
> >  	unsigned int            last_load;
> >  	unsigned int            fifo_load;
> >  	unsigned short          fifo_size;
> > +	unsigned short		fifo_index;
> >
> >  	unsigned char           dir_in;
> >  	unsigned char           index;
> > @@ -197,6 +198,7 @@ struct s3c_hsotg {
> >  	int			fifo_mem;
> >  	unsigned int            dedicated_fifos:1;
> >  	unsigned char           num_of_eps;
> > +	u32			fifo_map;
> >
> >  	struct dentry           *debug_root;
> >  	struct dentry           *debug_file;
> > diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
> > index 3435711..1b5e9ff 100644
> > --- a/drivers/usb/dwc2/gadget.c
> > +++ b/drivers/usb/dwc2/gadget.c
> > @@ -184,14 +184,29 @@ static void s3c_hsotg_init_fifo(struct s3c_hsotg *hsotg)
> >
> >  	/* start at the end of the GNPTXFSIZ, rounded up */
> >  	addr = 2048 + 1024;
> > -	size = 768;
> >
> >  	/*
> > -	 * currently we allocate TX FIFOs for all possible endpoints,
> > -	 * and assume that they are all the same size.
> > +	 * Because we have not enough memory to have each TX FIFO of size at
> > +	 * least 3072 bytes (the maximum single packet size), we create four
> > +	 * FIFOs of lenght 1024, and four of length 3072 bytes, and assing
> > +	 * them to endpoints dynamically according to maxpacket size value of
> > +	 * given endpoint.
> >  	 */
> >
> > -	for (ep = 1; ep <= 15; ep++) {
> > +	/* 256*4=1024 bytes FIFO length */
> > +	size = 256;
> > +	for (ep = 1; ep <= 4; ep++) {
> > +		val = addr;
> > +		val |= size << FIFOSIZE_DEPTH_SHIFT;
> > +		WARN_ONCE(addr + size > hsotg->fifo_mem,
> > +			  "insufficient fifo memory");
> > +		addr += size;
> > +
> > +		writel(val, hsotg->regs + DPTXFSIZN(ep));
> > +	}
> > +	/* 768*4=3072 bytes FIFO length */
> > +	size = 768;
> > +	for (ep = 5; ep <= 8; ep++) {
> >  		val = addr;
> >  		val |= size << FIFOSIZE_DEPTH_SHIFT;
> >  		WARN_ONCE(addr + size > hsotg->fifo_mem,
> > @@ -450,7 +465,7 @@ static int s3c_hsotg_write_fifo(struct s3c_hsotg *hsotg,
> >  	to_write = DIV_ROUND_UP(to_write, 4);
> >  	data = hs_req->req.buf + buf_pos;
> >
> > -	iowrite32_rep(hsotg->regs + EPFIFO(hs_ep->index), data, to_write);
> > +	iowrite32_rep(hsotg->regs + EPFIFO(hs_ep->fifo_index), data, to_write);
> >
> >  	return (to_write >= can_write) ? -ENOSPC : 0;
> >  }
> > @@ -1281,7 +1296,7 @@ static void s3c_hsotg_rx_data(struct s3c_hsotg *hsotg, int ep_idx, int size)
> >  {
> >  	struct s3c_hsotg_ep *hs_ep = &hsotg->eps[ep_idx];
> >  	struct s3c_hsotg_req *hs_req = hs_ep->req;
> > -	void __iomem *fifo = hsotg->regs + EPFIFO(ep_idx);
> > +	void __iomem *fifo = hsotg->regs + EPFIFO(hs_ep->fifo_index);
> >  	int to_read;
> >  	int max_req;
> >  	int read_ptr;
> > @@ -1835,7 +1850,7 @@ static void s3c_hsotg_epint(struct s3c_hsotg *hsotg, unsigned int idx,
> >  		if (dir_in) {
> >  			int epctl = readl(hsotg->regs + epctl_reg);
> >
> > -			s3c_hsotg_txfifo_flush(hsotg, idx);
> > +			s3c_hsotg_txfifo_flush(hsotg, hs_ep->fifo_index);
> >
> >  			if ((epctl & DXEPCTL_STALL) &&
> >  				(epctl & DXEPCTL_EPTYPE_BULK)) {
> > @@ -1984,6 +1999,7 @@ static void kill_all_requests(struct s3c_hsotg *hsotg,
> >  			      int result, bool force)
> >  {
> >  	struct s3c_hsotg_req *req, *treq;
> > +	unsigned size;
> >
> >  	list_for_each_entry_safe(req, treq, &ep->queue, queue) {
> >  		/*
> > @@ -1997,9 +2013,11 @@ static void kill_all_requests(struct s3c_hsotg *hsotg,
> >  		s3c_hsotg_complete_request(hsotg, ep, req,
> >  					   result);
> >  	}
> > -	if(hsotg->dedicated_fifos)
> > -		if ((readl(hsotg->regs + DTXFSTS(ep->index)) & 0xffff) * 4 < 3072)
> > -			s3c_hsotg_txfifo_flush(hsotg, ep->index);
> > +	if (hsotg->dedicated_fifos) {
> > +		size = (readl(hsotg->regs + DTXFSTS(ep->index)) & 0xffff) * 4;
> > +		if (size < ep->fifo_size)
> > +			s3c_hsotg_txfifo_flush(hsotg, ep->fifo_index);
> > +	}
> >  }
> >
> >  /**
> > @@ -2440,6 +2458,7 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep,
> >  	u32 epctrl;
> >  	u32 mps;
> >  	int dir_in;
> > +	int i, val, size;
> >  	int ret = 0;
> >
> >  	dev_dbg(hsotg->dev,
> > @@ -2512,17 +2531,8 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep,
> >  		break;
> >
> >  	case USB_ENDPOINT_XFER_INT:
> > -		if (dir_in) {
> > -			/*
> > -			 * Allocate our TxFNum by simply using the index
> > -			 * of the endpoint for the moment. We could do
> > -			 * something better if the host indicates how
> > -			 * many FIFOs we are expecting to use.
> > -			 */
> > -
> > +		if (dir_in)
> >  			hs_ep->periodic = 1;
> > -			epctrl |= DXEPCTL_TXFNUM(index);
> > -		}
> >
> >  		epctrl |= DXEPCTL_EPTYPE_INTERRUPT;
> >  		break;
> > @@ -2536,8 +2546,25 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep,
> >  	 * if the hardware has dedicated fifos, we must give each IN EP
> >  	 * a unique tx-fifo even if it is non-periodic.
> >  	 */
> > -	if (dir_in && hsotg->dedicated_fifos)
> > -		epctrl |= DXEPCTL_TXFNUM(index);
> > +	if (dir_in && hsotg->dedicated_fifos) {
> > +		size = hs_ep->ep.maxpacket*hs_ep->mc;
> > +		for (i = 1; i <= 8; ++i) {
> > +			if (hsotg->fifo_map & (1<<i))
> > +				continue;
> > +			val = readl(hsotg->regs + DPTXFSIZN(i));
> > +			val = (val >> FIFOSIZE_DEPTH_SHIFT)*4;
> > +			if (val < size)
> > +				continue;
> > +			hsotg->fifo_map |= 1<<i;
> > +
> > +			epctrl |= DXEPCTL_TXFNUM(i);
> > +			hs_ep->fifo_index = i;
> > +			hs_ep->fifo_size = val;
> > +			break;
> > +		}
> > +		if (i == 8)
> > +			return -ENOMEM;
> > +	}
> >
> >  	/* for non control endpoints, set PID to D0 */
> >  	if (index)
> > @@ -2584,6 +2611,9 @@ static int s3c_hsotg_ep_disable(struct usb_ep *ep)
> >  	/* terminate all requests with shutdown */
> >  	kill_all_requests(hsotg, hs_ep, -ESHUTDOWN, false);
> >
> > +	hsotg->fifo_map &= ~(1<<hs_ep->fifo_index);
> > +	hs_ep->fifo_index = 0;
> > +	hs_ep->fifo_size = 0;
> >
> >  	ctrl = readl(hsotg->regs + epctrl_reg);
> >  	ctrl &= ~DXEPCTL_EPENA;
> > @@ -2975,7 +3005,6 @@ static void s3c_hsotg_initep(struct s3c_hsotg *hsotg,
> >  				       struct s3c_hsotg_ep *hs_ep,
> >  				       int epnum)
> >  {
> > -	u32 ptxfifo;
> >  	char *dir;
> >
> >  	if (epnum == 0)
> > @@ -3004,15 +3033,6 @@ static void s3c_hsotg_initep(struct s3c_hsotg *hsotg,
> >  	hs_ep->ep.ops = &s3c_hsotg_ep_ops;
> >
> >  	/*
> > -	 * Read the FIFO size for the Periodic TX FIFO, even if we're
> > -	 * an OUT endpoint, we may as well do this if in future the
> > -	 * code is changed to make each endpoint's direction changeable.
> > -	 */
> > -
> > -	ptxfifo = readl(hsotg->regs + DPTXFSIZN(epnum));
> > -	hs_ep->fifo_size = FIFOSIZE_DEPTH_GET(ptxfifo) * 4;
> > -
> > -	/*
> >  	 * if we're using dma, we need to set the next-endpoint pointer
> >  	 * to be something valid.
> >  	 */
> > --
> > 1.9.1
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-usb" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 17+ messages in thread

* RE: [PATCH v2 00/12] usb: dwc2/gadget: fix series
  2014-07-16 10:22 [PATCH v2 00/12] usb: dwc2/gadget: fix series Robert Baldyga
                   ` (11 preceding siblings ...)
  2014-07-16 10:22 ` [PATCH v2 12/12] usb: dwc2/gadget: avoid disabling ep0 Robert Baldyga
@ 2014-07-17  0:27 ` Paul Zimmerman
  12 siblings, 0 replies; 17+ messages in thread
From: Paul Zimmerman @ 2014-07-17  0:27 UTC (permalink / raw)
  To: Robert Baldyga, balbi
  Cc: gregkh, linux-usb, linux-kernel, m.szyprowski, andrzej.p

> From: Robert Baldyga [mailto:r.baldyga@samsung.com]
> Sent: Wednesday, July 16, 2014 3:22 AM
> 
> This patchset contains fixes for dwc2 gadget driver. It touches PHY,
> FIFO configuration, initialization sequence and adds many other small fixes.
> 
> Best regards
> Robert Baldyga
> Samsung R&D Institute Poland
> 
> Changelog:
> v2:
>  - add patch usb: dwc2/gadget: avoid disabling ep0
>  - fix FIFO flushing when it's assigned to endpoint dynamically
>  - write to proper FIFO in s3c_hsotg_write_fifo() function
>  - use real FIFO size in kill_all_requests
>  - fix comment in s3c_hsotg_init_fifo() function
> 
> v1: https://lkml.org/lkml/2014/6/23/67

Hi Robert,

For v1, I gave my Ack for the entire series, but I don't see my Ack on
any of these. Any reason for that?

-- 
Paul


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 10/12] usb: dwc2/gadget: assign TX FIFO dynamically
  2014-07-16 19:58   ` Paul Zimmerman
  2014-07-16 20:22     ` Paul Zimmerman
@ 2014-07-18 11:07     ` Robert Baldyga
  1 sibling, 0 replies; 17+ messages in thread
From: Robert Baldyga @ 2014-07-18 11:07 UTC (permalink / raw)
  To: Paul Zimmerman, balbi
  Cc: gregkh, linux-usb, linux-kernel, m.szyprowski, andrzej.p

On 07/16/2014 09:58 PM, Paul Zimmerman wrote:
>> From: Robert Baldyga [mailto:r.baldyga@samsung.com]
>> Sent: Wednesday, July 16, 2014 3:22 AM
>>
>> Because we have not enough memory to have each TX FIFO of size at least 3072
>> bytes (the maximum single packet size), we create four FIFOs of lenght 1024,
>> and four of length 3072 bytes, and assing them to endpoints dynamically
>> according to maxpacket size value of given endpoint.
> 
> I don't think this commit message entirely explains what you are doing
> here.
> 
> 3072 is actually 3 times the max packet size for an Isoc endpoint. So you
> want to have four TX FIFOs of that size, presumably to be assigned to
> Isoc endpoints. Where before this change, all TX FIFOs were of size 768,
> which is not even 1 max packet size for an Isoc endpoint. So I guess you
> were seeing some problem with that?

FIFO size in DPTXFSIZn register is in terms of 32-bit words, so
768*4=3072 - maximum packet size with 3 transactions per microframe
(Mult=2). The problem is that we have not enough memory to have all
FIFOs of this size, so we split available memory to have at least few
FIFOs of maximum packet size.

> 
> With a TX FIFO size of 3072, an entire microframe worth of Isoc data
> (when MaxBurst=2) can fit in the FIFO. I guess that is why you chose
> 3072?
> 

Yes, this is why I chose this value.

> Also, after this change, you are only initializing 8 TX FIFOs, where
> before you were initializing all 15. So now there can only be a maximum
> of 8 IN endpoints active at the same time. That's OK I guess, but I
> think you should mention that in the commit message.
> 

We use only 8 IN endpoints so there is no need to have more TX FIFOs.

I'm preparing v3 of this patchset so I will supply better description.

Thanks,
Robert Baldyga

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2014-07-18 11:08 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-07-16 10:22 [PATCH v2 00/12] usb: dwc2/gadget: fix series Robert Baldyga
2014-07-16 10:22 ` [PATCH v2 01/12] usb: dwc2/gadget: fix phy disable sequence Robert Baldyga
2014-07-16 10:22 ` [PATCH v2 02/12] usb: dwc2/gadget: fix phy initialization sequence Robert Baldyga
2014-07-16 10:22 ` [PATCH v2 03/12] usb: dwc2/gadget: move phy bus legth initialization Robert Baldyga
2014-07-16 10:22 ` [PATCH v2 04/12] usb: dwc2/gadget: Fix comment text Robert Baldyga
2014-07-16 10:22 ` [PATCH v2 05/12] usb: dwc2/gadget: hide some not really needed debug messages Robert Baldyga
2014-07-16 10:22 ` [PATCH v2 06/12] usb: dwc2/gadget: ensure that all fifos have correct memory buffers Robert Baldyga
2014-07-16 10:22 ` [PATCH v2 07/12] usb: dwc2/gadget: break infinite loop in endpoint disable code Robert Baldyga
2014-07-16 10:22 ` [PATCH v2 08/12] usb: dwc2/gadget: do not call disconnect method in pullup Robert Baldyga
2014-07-16 10:22 ` [PATCH v2 09/12] usb: dwc2/gadget: delay enabling irq once hardware is configured properly Robert Baldyga
2014-07-16 10:22 ` [PATCH v2 10/12] usb: dwc2/gadget: assign TX FIFO dynamically Robert Baldyga
2014-07-16 19:58   ` Paul Zimmerman
2014-07-16 20:22     ` Paul Zimmerman
2014-07-18 11:07     ` Robert Baldyga
2014-07-16 10:22 ` [PATCH v2 11/12] usb: dwc2/gadget: disable clock when it's not needed Robert Baldyga
2014-07-16 10:22 ` [PATCH v2 12/12] usb: dwc2/gadget: avoid disabling ep0 Robert Baldyga
2014-07-17  0:27 ` [PATCH v2 00/12] usb: dwc2/gadget: fix series Paul Zimmerman

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