1
0
mirror of https://git.yoctoproject.org/meta-ti synced 2026-06-05 18:30:50 +00:00

linux-ti33x-psp 3.2: merge in 6 musb patches from PSP

Updating the SRCREV would require redoing all boardfile patches due to the
EVM-SK changes. So cherry-pick the 6 patches we need.

Signed-off-by: Koen Kooi <koen@dominion.thruhere.net>
Signed-off-by: Denys Dmytriyenko <denys@ti.com>
This commit is contained in:
Koen Kooi
2012-05-22 08:06:26 +02:00
committed by Denys Dmytriyenko
parent ca33f0eb2d
commit 0dc054072d
7 changed files with 304 additions and 1 deletions
@@ -0,0 +1,103 @@
From c2746810dc7bcaaae2dec493c501eb7213d14858 Mon Sep 17 00:00:00 2001
From: Ajay Kumar Gupta <ajay.gupta@ti.com>
Date: Tue, 8 May 2012 12:05:47 +0530
Subject: [PATCH 1/6] usb: musb: cppi41: revisit the teardown path to fix isoc
issue
Fixes the camera streaming issue when application is stopped and restarted multiple times.
Changes:
- Disable DMAReq of TX/RX endpoints before teardown
- FIFO flush only when RxPktRdy is set
- Clear ReqPkt if in host mode.
---
drivers/usb/musb/cppi41_dma.c | 42 ++++++++++++++++++++++++----------------
drivers/usb/musb/musb_host.c | 2 +-
2 files changed, 26 insertions(+), 18 deletions(-)
diff --git a/drivers/usb/musb/cppi41_dma.c b/drivers/usb/musb/cppi41_dma.c
index e4d3173..4761acd 100644
--- a/drivers/usb/musb/cppi41_dma.c
+++ b/drivers/usb/musb/cppi41_dma.c
@@ -1206,6 +1206,11 @@ static int cppi41_channel_abort(struct dma_channel *channel)
if (cppi_ch->transmit) {
dprintk("Tx channel teardown, cppi_ch = %p\n", cppi_ch);
+ /* disable the DMAreq before teardown */
+ csr = musb_readw(epio, MUSB_TXCSR);
+ csr &= ~MUSB_TXCSR_DMAENAB;
+ musb_writew(epio, MUSB_TXCSR, csr);
+
/* Tear down Tx DMA channel */
usb_tx_ch_teardown(cppi_ch);
@@ -1223,11 +1228,30 @@ static int cppi41_channel_abort(struct dma_channel *channel)
} else { /* Rx */
dprintk("Rx channel teardown, cppi_ch = %p\n", cppi_ch);
+ /* disable the DMAreq and remove reqpkt */
+ csr = musb_readw(epio, MUSB_RXCSR);
+ dev_dbg(musb->controller,
+ "before rx-teardown: rxcsr %x rxcount %x\n", csr,
+ musb_readw(epio, MUSB_RXCOUNT));
+
+ /* For host, clear (just) ReqPkt at end of current packet(s) */
+ if (is_host_active(cppi->musb))
+ csr &= ~MUSB_RXCSR_H_REQPKT;
+
+ csr &= ~MUSB_RXCSR_DMAENAB;
+ musb_writew(epio, MUSB_RXCSR, csr);
+
+
/* Flush FIFO of the endpoint */
csr = musb_readw(epio, MUSB_RXCSR);
- csr |= MUSB_RXCSR_FLUSHFIFO | MUSB_RXCSR_H_WZC_BITS;
+
+ if (csr & MUSB_RXCSR_RXPKTRDY)
+ csr |= MUSB_RXCSR_FLUSHFIFO;
+
+ csr |= MUSB_RXCSR_H_WZC_BITS;
musb_writew(epio, MUSB_RXCSR, csr);
musb_writew(epio, MUSB_RXCSR, csr);
+ csr = musb_readw(epio, MUSB_RXCSR);
/* Issue CPPI FIFO teardown for Rx channel */
td_reg = musb_readl(reg_base, cppi->teardown_reg_offs);
@@ -1246,22 +1270,6 @@ static int cppi41_channel_abort(struct dma_channel *channel)
/* For host, ensure ReqPkt is never set again */
cppi41_autoreq_update(cppi_ch, USB_NO_AUTOREQ);
-
- /* For host, clear (just) ReqPkt at end of current packet(s) */
- if (is_host_active(cppi->musb))
- csr &= ~MUSB_RXCSR_H_REQPKT;
- csr |= MUSB_RXCSR_H_WZC_BITS;
-
- /* Clear DMA enable */
- csr &= ~MUSB_RXCSR_DMAENAB;
- musb_writew(epio, MUSB_RXCSR, csr);
-
- /* Flush the FIFO of endpoint once again */
- csr = musb_readw(epio, MUSB_RXCSR);
- csr |= MUSB_RXCSR_FLUSHFIFO | MUSB_RXCSR_H_WZC_BITS;
- musb_writew(epio, MUSB_RXCSR, csr);
-
- udelay(50);
}
/*
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c
index d805d1b..2195633 100644
--- a/drivers/usb/musb/musb_host.c
+++ b/drivers/usb/musb/musb_host.c
@@ -2224,7 +2224,7 @@ static int musb_cleanup_urb(struct urb *urb, struct musb_qh *qh)
}
/* turn off DMA requests, discard state, stop polling ... */
- if (is_in) {
+ if (is_in && ep->epnum) {
/* giveback saves bulk toggle */
csr = musb_h_flush_rxfifo(ep, 0);
--
1.7.7.6
@@ -0,0 +1,31 @@
From a9e9e758646ee41289c0030645bbdd43c711e9c1 Mon Sep 17 00:00:00 2001
From: Ajay Kumar Gupta <ajay.gupta@ti.com>
Date: Fri, 18 May 2012 14:51:15 +0530
Subject: [PATCH 2/6] usb: musb: fix bug in data toggle sw workaround
Data toggle software workaround for extra IN issue introduced a bug for PIO mode
as data toggle is getting updated even for PIO mode which should not be done.
Merge to:
usb: musb: cppi41: correct data toggle mismatch to fix extra IN token issue
---
drivers/usb/musb/musb_host.c | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c
index 2195633..80d83bd 100644
--- a/drivers/usb/musb/musb_host.c
+++ b/drivers/usb/musb/musb_host.c
@@ -359,7 +359,8 @@ static inline void musb_save_toggle(struct musb_qh *qh, int is_in,
curr_toggle = csr ? 1 : 0;
/* check if data toggle has gone out of sync */
- if (curr_toggle == qh->hw_ep->prev_toggle) {
+ if (is_dma_capable() && qh->hw_ep->rx_channel &&
+ curr_toggle == qh->hw_ep->prev_toggle) {
dev_dbg(musb->controller,
"Data toggle same as previous (=%d) on ep%d\n",
curr_toggle, qh->hw_ep->epnum);
--
1.7.7.6
@@ -0,0 +1,41 @@
From 2eac6057134bcb77edcdc462b810465850caec23 Mon Sep 17 00:00:00 2001
From: Felipe Balbi <balbi@ti.com>
Date: Thu, 15 Mar 2012 16:37:18 +0200
Subject: [PATCH 3/6] usb: gadget: udc-core: stop UDC on device-initiated
disconnect
When we want to do device-initiated disconnect,
let's make sure we stop the UDC in order to
e.g. allow lower power states to be achieved by
turning off unnecessary clocks and/or stoping
PHYs.
When reconnecting, call ->udc_start() again to
make sure UDC is reinitialized.
Cc: stable@vger.kernel.org
Signed-off-by: Felipe Balbi <balbi@ti.com>
---
drivers/usb/gadget/udc-core.c | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/drivers/usb/gadget/udc-core.c b/drivers/usb/gadget/udc-core.c
index 0b0d12c..475c997 100644
--- a/drivers/usb/gadget/udc-core.c
+++ b/drivers/usb/gadget/udc-core.c
@@ -359,8 +359,12 @@ static ssize_t usb_udc_softconn_store(struct device *dev,
struct usb_udc *udc = container_of(dev, struct usb_udc, dev);
if (sysfs_streq(buf, "connect")) {
+ if (udc_is_newstyle(udc))
+ usb_gadget_udc_start(udc->gadget, udc->driver);
usb_gadget_connect(udc->gadget);
} else if (sysfs_streq(buf, "disconnect")) {
+ if (udc_is_newstyle(udc))
+ usb_gadget_udc_stop(udc->gadget, udc->driver);
usb_gadget_disconnect(udc->gadget);
} else {
dev_err(dev, "unsupported command '%s'\n", buf);
--
1.7.7.6
@@ -0,0 +1,43 @@
From fefa8fade565b137ae3d01801196840b6ccfc98f Mon Sep 17 00:00:00 2001
From: Kishon Vijay Abraham I <kishon@ti.com>
Date: Wed, 21 Mar 2012 21:34:30 +0530
Subject: [PATCH 4/6] usb: gadget: udc-core: fix asymmetric calls in
remove_driver
During modprobe of gadget driver, pullup is called after
udc_start. In order to make the exit path symmetric when
removing a gadget driver, call pullup before ->udc_stop.
This is needed to avoid issues with PM where udc_stop
disables the module completely (put IP in reset state,
cut functional and interface clocks, and so on), which
prevents us from accessing the IP's address space,
thus creating the possibility of an abort exception
when we try to access IP's address space after clocks
are off.
Cc: stable@vger.kernel.org
Signed-off-by: Partha Basak <p-basak2@ti.com>
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
---
drivers/usb/gadget/udc-core.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/usb/gadget/udc-core.c b/drivers/usb/gadget/udc-core.c
index 475c997..ec02ed0 100644
--- a/drivers/usb/gadget/udc-core.c
+++ b/drivers/usb/gadget/udc-core.c
@@ -212,8 +212,8 @@ static void usb_gadget_remove_driver(struct usb_udc *udc)
if (udc_is_newstyle(udc)) {
udc->driver->disconnect(udc->gadget);
udc->driver->unbind(udc->gadget);
- usb_gadget_udc_stop(udc->gadget, udc->driver);
usb_gadget_disconnect(udc->gadget);
+ usb_gadget_udc_stop(udc->gadget, udc->driver);
} else {
usb_gadget_stop(udc->gadget, udc->driver);
}
--
1.7.7.6
@@ -0,0 +1,33 @@
From 7a0dcaac06bfffd4df4bf7a006c601b31acc7cb7 Mon Sep 17 00:00:00 2001
From: Felipe Balbi <balbi@ti.com>
Date: Fri, 27 Apr 2012 11:02:15 +0300
Subject: [PATCH 5/6] usb: gadget: udc-core: fix wrong call order
commit 6d258a4 (usb: gadget: udc-core: stop UDC on device-initiated
disconnect) introduced another case of asymmetric calls when issuing
a device-initiated disconnect. Fix it.
Reported-by: Ben Hutchings <ben@decadent.org.uk>
Signed-off-by: Felipe Balbi <balbi@ti.com>
---
drivers/usb/gadget/udc-core.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/usb/gadget/udc-core.c b/drivers/usb/gadget/udc-core.c
index ec02ed0..3ea783d 100644
--- a/drivers/usb/gadget/udc-core.c
+++ b/drivers/usb/gadget/udc-core.c
@@ -363,9 +363,9 @@ static ssize_t usb_udc_softconn_store(struct device *dev,
usb_gadget_udc_start(udc->gadget, udc->driver);
usb_gadget_connect(udc->gadget);
} else if (sysfs_streq(buf, "disconnect")) {
+ usb_gadget_disconnect(udc->gadget);
if (udc_is_newstyle(udc))
usb_gadget_udc_stop(udc->gadget, udc->driver);
- usb_gadget_disconnect(udc->gadget);
} else {
dev_err(dev, "unsupported command '%s'\n", buf);
return -EINVAL;
--
1.7.7.6
@@ -0,0 +1,46 @@
From 91cdc6fbc271e01e231dcf0e9403448aa19433fb Mon Sep 17 00:00:00 2001
From: Alan Stern <stern@rowland.harvard.edu>
Date: Thu, 26 Apr 2012 11:31:57 -0400
Subject: [PATCH 6/6] usb: gadget: udc-core: fix incompatibility with
dummy-hcd
This patch (as1548) fixes a recently-introduced incompatibility
between the UDC core and the dummy-hcd driver. Commit
8ae8090c82eb407267001f75b3d256b3bd4ae691 (usb: gadget: udc-core: fix
asymmetric calls in remove_driver) moved the usb_gadget_udc_stop()
call in usb_gadget_remove_driver() below the usb_gadget_disconnect()
call.
As a result, usb_gadget_disconnect() gets called at a time when the
gadget driver believes it has been unbound but dummy-hcd believes
it has not. A nasty error ensues when dummy-hcd calls the gadget
driver's disconnect method a second time.
To fix the problem, this patch moves the gadget driver's unbind
notification after the usb_gadget_disconnect() call. Now nothing
happens between the two unbind notifications, so nothing goes wrong.
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Tested-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
---
drivers/usb/gadget/udc-core.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/usb/gadget/udc-core.c b/drivers/usb/gadget/udc-core.c
index 3ea783d..4e2e13e 100644
--- a/drivers/usb/gadget/udc-core.c
+++ b/drivers/usb/gadget/udc-core.c
@@ -211,8 +211,8 @@ static void usb_gadget_remove_driver(struct usb_udc *udc)
if (udc_is_newstyle(udc)) {
udc->driver->disconnect(udc->gadget);
- udc->driver->unbind(udc->gadget);
usb_gadget_disconnect(udc->gadget);
+ udc->driver->unbind(udc->gadget);
usb_gadget_udc_stop(udc->gadget, udc->driver);
} else {
usb_gadget_stop(udc->gadget, udc->driver);
--
1.7.7.6
+7 -1
View File
@@ -12,7 +12,7 @@ MULTI_CONFIG_BASE_SUFFIX = ""
BRANCH = "v3.2-staging"
SRCREV = "720e07b4c1f687b61b147b31c698cb6816d72f01"
MACHINE_KERNEL_PR_append = "m+gitr${SRCREV}"
MACHINE_KERNEL_PR_append = "n+gitr${SRCREV}"
COMPATIBLE_MACHINE = "(ti33x)"
@@ -29,6 +29,12 @@ do_compile_prepend() {
}
PATCHES_OVER_PSP = " \
file://usb/0001-usb-musb-cppi41-revisit-the-teardown-path-to-fix-iso.patch \
file://usb/0002-usb-musb-fix-bug-in-data-toggle-sw-workaround.patch \
file://usb/0003-usb-gadget-udc-core-stop-UDC-on-device-initiated-dis.patch \
file://usb/0004-usb-gadget-udc-core-fix-asymmetric-calls-in-remove_d.patch \
file://usb/0005-usb-gadget-udc-core-fix-wrong-call-order.patch \
file://usb/0006-usb-gadget-udc-core-fix-incompatibility-with-dummy-h.patch \
file://3.2.1/0001-MAINTAINERS-stable-Update-address.patch \
file://3.2.1/0002-Documentation-Update-stable-address.patch \
file://3.2.1/0003-firmware-Fix-an-oops-on-reading-fw_priv-fw-in-sysfs-.patch \