usb: musb: disable double buffering when it's broken
We know that blackfin doesn't support double buffering feature as of today. So we add a flag set by musb_platform_init() to forcefully disable that feature. Such flag is created and marked as deprecated to force us to find a solution for the missing double buffering support on blackfin. Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
Родитель
9c668079c8
Коммит
0662481855
|
@ -404,6 +404,7 @@ static int bfin_musb_init(struct musb *musb)
|
|||
musb->xceiv->set_power = bfin_musb_set_power;
|
||||
|
||||
musb->isr = blackfin_interrupt;
|
||||
musb->double_buffer_not_ok = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -488,6 +488,18 @@ struct musb {
|
|||
unsigned set_address:1;
|
||||
unsigned test_mode:1;
|
||||
unsigned softconnect:1;
|
||||
/*
|
||||
* FIXME: Remove this flag.
|
||||
*
|
||||
* This is only added to allow Blackfin to work
|
||||
* with current driver. For some unknown reason
|
||||
* Blackfin doesn't work with double buffering
|
||||
* and that's enabled by default.
|
||||
*
|
||||
* We added this flag to forcefully disable double
|
||||
* buffering until we get it working.
|
||||
*/
|
||||
unsigned double_buffer_not_ok:1 __deprecated;
|
||||
|
||||
u8 address;
|
||||
u8 test_mode_nr;
|
||||
|
|
|
@ -989,7 +989,11 @@ static int musb_gadget_enable(struct usb_ep *ep,
|
|||
/* Set TXMAXP with the FIFO size of the endpoint
|
||||
* to disable double buffering mode.
|
||||
*/
|
||||
musb_writew(regs, MUSB_TXMAXP, musb_ep->packet_sz | (musb_ep->hb_mult << 11));
|
||||
if (musb->double_buffer_not_ok)
|
||||
musb_writew(regs, MUSB_TXMAXP, hw_ep->max_packet_sz_tx);
|
||||
else
|
||||
musb_writew(regs, MUSB_TXMAXP, musb_ep->packet_sz
|
||||
| (musb_ep->hb_mult << 11));
|
||||
|
||||
csr = MUSB_TXCSR_MODE | MUSB_TXCSR_CLRDATATOG;
|
||||
if (musb_readw(regs, MUSB_TXCSR)
|
||||
|
@ -1025,7 +1029,11 @@ static int musb_gadget_enable(struct usb_ep *ep,
|
|||
/* Set RXMAXP with the FIFO size of the endpoint
|
||||
* to disable double buffering mode.
|
||||
*/
|
||||
musb_writew(regs, MUSB_RXMAXP, musb_ep->packet_sz | (musb_ep->hb_mult << 11));
|
||||
if (musb->double_buffer_not_ok)
|
||||
musb_writew(regs, MUSB_RXMAXP, hw_ep->max_packet_sz_tx);
|
||||
else
|
||||
musb_writew(regs, MUSB_RXMAXP, musb_ep->packet_sz
|
||||
| (musb_ep->hb_mult << 11));
|
||||
|
||||
/* force shared fifo to OUT-only mode */
|
||||
if (hw_ep->is_shared_fifo) {
|
||||
|
|
|
@ -609,7 +609,7 @@ musb_rx_reinit(struct musb *musb, struct musb_qh *qh, struct musb_hw_ep *ep)
|
|||
/* Set RXMAXP with the FIFO size of the endpoint
|
||||
* to disable double buffer mode.
|
||||
*/
|
||||
if (musb->hwvers < MUSB_HWVERS_2000)
|
||||
if (musb->double_buffer_not_ok)
|
||||
musb_writew(ep->regs, MUSB_RXMAXP, ep->max_packet_sz_rx);
|
||||
else
|
||||
musb_writew(ep->regs, MUSB_RXMAXP,
|
||||
|
@ -784,14 +784,13 @@ static void musb_ep_program(struct musb *musb, u8 epnum,
|
|||
/* protocol/endpoint/interval/NAKlimit */
|
||||
if (epnum) {
|
||||
musb_writeb(epio, MUSB_TXTYPE, qh->type_reg);
|
||||
if (can_bulk_split(musb, qh->type))
|
||||
if (musb->double_buffer_not_ok)
|
||||
musb_writew(epio, MUSB_TXMAXP,
|
||||
packet_sz
|
||||
| ((hw_ep->max_packet_sz_tx /
|
||||
packet_sz) - 1) << 11);
|
||||
hw_ep->max_packet_sz_tx);
|
||||
else
|
||||
musb_writew(epio, MUSB_TXMAXP,
|
||||
packet_sz);
|
||||
qh->maxpacket |
|
||||
((qh->hb_mult - 1) << 11));
|
||||
musb_writeb(epio, MUSB_TXINTERVAL, qh->intv_reg);
|
||||
} else {
|
||||
musb_writeb(epio, MUSB_NAKLIMIT0, qh->intv_reg);
|
||||
|
|
Загрузка…
Ссылка в новой задаче