Commit bb59dbff4e5fb0ac14e3ee47d3f688490f128155
Committed by
Felipe Balbi
1 parent
8ca137562a
Exists in
master
and in
6 other branches
usb: gadget: m66592-udc: add function for external controller
M66592 has the pin of WR0 and WR1. So, if one write-pin of CPU connects to the pins, we have to change the setting of FIFOSEL register in the controller. If we don't change the setting, the controller cannot send the data of odd length. Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
Showing 3 changed files with 25 additions and 19 deletions Side-by-side Diff
drivers/usb/gadget/m66592-udc.c
... | ... | @@ -781,7 +781,7 @@ |
781 | 781 | /* write fifo */ |
782 | 782 | if (req->req.buf) { |
783 | 783 | if (size > 0) |
784 | - m66592_write_fifo(m66592, ep->fifoaddr, buf, size); | |
784 | + m66592_write_fifo(m66592, ep, buf, size); | |
785 | 785 | if ((size == 0) || ((size % ep->ep.maxpacket) != 0)) |
786 | 786 | m66592_bset(m66592, M66592_BVAL, ep->fifoctr); |
787 | 787 | } |
... | ... | @@ -827,7 +827,7 @@ |
827 | 827 | |
828 | 828 | /* write fifo */ |
829 | 829 | if (req->req.buf) { |
830 | - m66592_write_fifo(m66592, ep->fifoaddr, buf, size); | |
830 | + m66592_write_fifo(m66592, ep, buf, size); | |
831 | 831 | if ((size == 0) |
832 | 832 | || ((size % ep->ep.maxpacket) != 0) |
833 | 833 | || ((bufsize != ep->ep.maxpacket) |
drivers/usb/gadget/m66592-udc.h
... | ... | @@ -561,11 +561,26 @@ |
561 | 561 | iowrite16(val, m66592->reg + offset); |
562 | 562 | } |
563 | 563 | |
564 | +static inline void m66592_mdfy(struct m66592 *m66592, u16 val, u16 pat, | |
565 | + unsigned long offset) | |
566 | +{ | |
567 | + u16 tmp; | |
568 | + tmp = m66592_read(m66592, offset); | |
569 | + tmp = tmp & (~pat); | |
570 | + tmp = tmp | val; | |
571 | + m66592_write(m66592, tmp, offset); | |
572 | +} | |
573 | + | |
574 | +#define m66592_bclr(m66592, val, offset) \ | |
575 | + m66592_mdfy(m66592, 0, val, offset) | |
576 | +#define m66592_bset(m66592, val, offset) \ | |
577 | + m66592_mdfy(m66592, val, 0, offset) | |
578 | + | |
564 | 579 | static inline void m66592_write_fifo(struct m66592 *m66592, |
565 | - unsigned long offset, | |
580 | + struct m66592_ep *ep, | |
566 | 581 | void *buf, unsigned long len) |
567 | 582 | { |
568 | - void __iomem *fifoaddr = m66592->reg + offset; | |
583 | + void __iomem *fifoaddr = m66592->reg + ep->fifoaddr; | |
569 | 584 | |
570 | 585 | if (m66592->pdata->on_chip) { |
571 | 586 | unsigned long count; |
572 | 587 | |
573 | 588 | |
... | ... | @@ -591,25 +606,14 @@ |
591 | 606 | iowrite16_rep(fifoaddr, buf, len); |
592 | 607 | if (odd) { |
593 | 608 | unsigned char *p = buf + len*2; |
609 | + if (m66592->pdata->wr0_shorted_to_wr1) | |
610 | + m66592_bclr(m66592, M66592_MBW_16, ep->fifosel); | |
594 | 611 | iowrite8(*p, fifoaddr); |
612 | + if (m66592->pdata->wr0_shorted_to_wr1) | |
613 | + m66592_bset(m66592, M66592_MBW_16, ep->fifosel); | |
595 | 614 | } |
596 | 615 | } |
597 | 616 | } |
598 | - | |
599 | -static inline void m66592_mdfy(struct m66592 *m66592, u16 val, u16 pat, | |
600 | - unsigned long offset) | |
601 | -{ | |
602 | - u16 tmp; | |
603 | - tmp = m66592_read(m66592, offset); | |
604 | - tmp = tmp & (~pat); | |
605 | - tmp = tmp | val; | |
606 | - m66592_write(m66592, tmp, offset); | |
607 | -} | |
608 | - | |
609 | -#define m66592_bclr(m66592, val, offset) \ | |
610 | - m66592_mdfy(m66592, 0, val, offset) | |
611 | -#define m66592_bset(m66592, val, offset) \ | |
612 | - m66592_mdfy(m66592, val, 0, offset) | |
613 | 617 | |
614 | 618 | #endif /* ifndef __M66592_UDC_H__ */ |
include/linux/usb/m66592.h