From ebd561bc14a9a0883ad7c0ef2a6560ec9ae6824a Mon Sep 17 00:00:00 2001 From: Koen Kooi Date: Thu, 19 Mar 2009 11:32:06 +0100 Subject: linux-omap-pm: add 2.6.28 recipe so git can move to .29rc --- .../musb-support-high-bandwidth.patch.eml | 134 +++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 recipes/linux/linux-omap-pm-2.6.28/musb-support-high-bandwidth.patch.eml (limited to 'recipes/linux/linux-omap-pm-2.6.28/musb-support-high-bandwidth.patch.eml') diff --git a/recipes/linux/linux-omap-pm-2.6.28/musb-support-high-bandwidth.patch.eml b/recipes/linux/linux-omap-pm-2.6.28/musb-support-high-bandwidth.patch.eml new file mode 100644 index 0000000000..0264a97045 --- /dev/null +++ b/recipes/linux/linux-omap-pm-2.6.28/musb-support-high-bandwidth.patch.eml @@ -0,0 +1,134 @@ +Enables support for camera (as creative) requiring high bandwidth +isochronous transfer. + +Signed-off-by: Ajay Kumar Gupta +--- + drivers/usb/musb/musb_core.c | 18 +++++++++--------- + drivers/usb/musb/musb_host.c | 32 +++++++++++++++++++++----------- + 2 files changed, 30 insertions(+), 20 deletions(-) + +diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c +index c939f81..9914f70 100644 +--- a/drivers/usb/musb/musb_core.c ++++ b/drivers/usb/musb/musb_core.c +@@ -1063,17 +1063,17 @@ static struct fifo_cfg __initdata mode_4_cfg[] = { + { .hw_ep_num = 7, .style = FIFO_TX, .maxpacket = 512, }, + { .hw_ep_num = 7, .style = FIFO_RX, .maxpacket = 512, }, + { .hw_ep_num = 8, .style = FIFO_TX, .maxpacket = 512, }, +-{ .hw_ep_num = 8, .style = FIFO_RX, .maxpacket = 512, }, ++{ .hw_ep_num = 8, .style = FIFO_RX, .maxpacket = 64, }, + { .hw_ep_num = 9, .style = FIFO_TX, .maxpacket = 512, }, +-{ .hw_ep_num = 9, .style = FIFO_RX, .maxpacket = 512, }, ++{ .hw_ep_num = 9, .style = FIFO_RX, .maxpacket = 64, }, + { .hw_ep_num = 10, .style = FIFO_TX, .maxpacket = 512, }, +-{ .hw_ep_num = 10, .style = FIFO_RX, .maxpacket = 512, }, +-{ .hw_ep_num = 11, .style = FIFO_TX, .maxpacket = 512, }, +-{ .hw_ep_num = 11, .style = FIFO_RX, .maxpacket = 512, }, +-{ .hw_ep_num = 12, .style = FIFO_TX, .maxpacket = 512, }, +-{ .hw_ep_num = 12, .style = FIFO_RX, .maxpacket = 512, }, +-{ .hw_ep_num = 13, .style = FIFO_TX, .maxpacket = 512, }, +-{ .hw_ep_num = 13, .style = FIFO_RX, .maxpacket = 512, }, ++{ .hw_ep_num = 10, .style = FIFO_RX, .maxpacket = 64, }, ++{ .hw_ep_num = 11, .style = FIFO_TX, .maxpacket = 256, }, ++{ .hw_ep_num = 11, .style = FIFO_RX, .maxpacket = 256, }, ++{ .hw_ep_num = 12, .style = FIFO_TX, .maxpacket = 256, }, ++{ .hw_ep_num = 12, .style = FIFO_RX, .maxpacket = 256, }, ++{ .hw_ep_num = 13, .style = FIFO_TX, .maxpacket = 256, }, ++{ .hw_ep_num = 13, .style = FIFO_RX, .maxpacket = 4096, }, + { .hw_ep_num = 14, .style = FIFO_RXTX, .maxpacket = 1024, }, + { .hw_ep_num = 15, .style = FIFO_RXTX, .maxpacket = 1024, }, + }; +diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c +index 08e421f..84173df 100644 +--- a/drivers/usb/musb/musb_host.c ++++ b/drivers/usb/musb/musb_host.c +@@ -1443,6 +1443,10 @@ void musb_host_rx(struct musb *musb, u8 epnum) + /* packet error reported later */ + iso_err = true; + } ++ } else if (rx_csr & MUSB_RXCSR_INCOMPRX) { ++ DBG(3, "end %d Highbandwidth incomplete ISO packet received\n" ++ , epnum); ++ status = -EPROTO; + } + + /* faults abort the transfer */ +@@ -1595,7 +1599,13 @@ void musb_host_rx(struct musb *musb, u8 epnum) + val &= ~MUSB_RXCSR_H_AUTOREQ; + else + val |= MUSB_RXCSR_H_AUTOREQ; +- val |= MUSB_RXCSR_AUTOCLEAR | MUSB_RXCSR_DMAENAB; ++ ++ if (qh->maxpacket & ~0x7ff) ++ /* Autoclear doesn't work in high bandwidth iso */ ++ val |= MUSB_RXCSR_DMAENAB; ++ else ++ val |= MUSB_RXCSR_AUTOCLEAR ++ | MUSB_RXCSR_DMAENAB; + + musb_writew(epio, MUSB_RXCSR, + MUSB_RXCSR_H_WZC_BITS | val); +@@ -1666,6 +1676,7 @@ static int musb_schedule( + int best_end, epnum; + struct musb_hw_ep *hw_ep = NULL; + struct list_head *head = NULL; ++ u16 maxpacket; + + /* use fixed hardware for control and bulk */ + switch (qh->type) { +@@ -1708,6 +1719,13 @@ static int musb_schedule( + best_diff = 4096; + best_end = -1; + ++ if (qh->maxpacket & (1<<11)) ++ maxpacket = 2 * (qh->maxpacket & 0x7ff); ++ else if (qh->maxpacket & (1<<12)) ++ maxpacket = 3 * (qh->maxpacket & 0x7ff); ++ else ++ maxpacket = (qh->maxpacket & 0x7ff); ++ + for (epnum = 1; epnum < musb->nr_endpoints; epnum++) { + int diff; + +@@ -1718,9 +1736,9 @@ static int musb_schedule( + continue; + + if (is_in) +- diff = hw_ep->max_packet_sz_rx - qh->maxpacket; ++ diff = hw_ep->max_packet_sz_rx - maxpacket; + else +- diff = hw_ep->max_packet_sz_tx - qh->maxpacket; ++ diff = hw_ep->max_packet_sz_tx - maxpacket; + + if (diff > 0 && best_diff > diff) { + best_diff = diff; +@@ -1797,13 +1815,6 @@ static int musb_urb_enqueue( + qh->is_ready = 1; + + qh->maxpacket = le16_to_cpu(epd->wMaxPacketSize); +- +- /* no high bandwidth support yet */ +- if (qh->maxpacket & ~0x7ff) { +- ret = -EMSGSIZE; +- goto done; +- } +- + qh->epnum = epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; + qh->type = epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; + +@@ -1897,7 +1908,6 @@ static int musb_urb_enqueue( + } + spin_unlock_irqrestore(&musb->lock, flags); + +-done: + if (ret != 0) { + usb_hcd_unlink_urb_from_ep(hcd, urb); + kfree(qh); +-- +1.5.6 + +-- +To unsubscribe from this list: send the line "unsubscribe linux-omap" in +the body of a message to majordomo@vger.kernel.org +More majordomo info at http://vger.kernel.org/majordomo-info.html + -- cgit v1.2.3