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:
committed by
Denys Dmytriyenko
parent
ca33f0eb2d
commit
0dc054072d
+103
@@ -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
|
||||
|
||||
+31
@@ -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
|
||||
|
||||
+41
@@ -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
|
||||
|
||||
+43
@@ -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
|
||||
|
||||
+33
@@ -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
|
||||
|
||||
+46
@@ -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
|
||||
|
||||
@@ -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 \
|
||||
|
||||
Reference in New Issue
Block a user