diff options
-rw-r--r-- | drivers/usb/gadget/m66592-udc.c | 4 | ||||
-rw-r--r-- | drivers/usb/gadget/m66592-udc.h | 38 | ||||
-rw-r--r-- | include/linux/usb/m66592.h | 2 |
3 files changed, 25 insertions, 19 deletions
diff --git a/drivers/usb/gadget/m66592-udc.c b/drivers/usb/gadget/m66592-udc.c index 40c2f7a4f8fb..5c9c04d7aa76 100644 --- a/drivers/usb/gadget/m66592-udc.c +++ b/drivers/usb/gadget/m66592-udc.c | |||
@@ -781,7 +781,7 @@ static void irq_ep0_write(struct m66592_ep *ep, struct m66592_request *req) | |||
781 | /* write fifo */ | 781 | /* write fifo */ |
782 | if (req->req.buf) { | 782 | if (req->req.buf) { |
783 | if (size > 0) | 783 | if (size > 0) |
784 | m66592_write_fifo(m66592, ep->fifoaddr, buf, size); | 784 | m66592_write_fifo(m66592, ep, buf, size); |
785 | if ((size == 0) || ((size % ep->ep.maxpacket) != 0)) | 785 | if ((size == 0) || ((size % ep->ep.maxpacket) != 0)) |
786 | m66592_bset(m66592, M66592_BVAL, ep->fifoctr); | 786 | m66592_bset(m66592, M66592_BVAL, ep->fifoctr); |
787 | } | 787 | } |
@@ -827,7 +827,7 @@ static void irq_packet_write(struct m66592_ep *ep, struct m66592_request *req) | |||
827 | 827 | ||
828 | /* write fifo */ | 828 | /* write fifo */ |
829 | if (req->req.buf) { | 829 | if (req->req.buf) { |
830 | m66592_write_fifo(m66592, ep->fifoaddr, buf, size); | 830 | m66592_write_fifo(m66592, ep, buf, size); |
831 | if ((size == 0) | 831 | if ((size == 0) |
832 | || ((size % ep->ep.maxpacket) != 0) | 832 | || ((size % ep->ep.maxpacket) != 0) |
833 | || ((bufsize != ep->ep.maxpacket) | 833 | || ((bufsize != ep->ep.maxpacket) |
diff --git a/drivers/usb/gadget/m66592-udc.h b/drivers/usb/gadget/m66592-udc.h index b85e05b2e97b..7b93d579af37 100644 --- a/drivers/usb/gadget/m66592-udc.h +++ b/drivers/usb/gadget/m66592-udc.h | |||
@@ -561,11 +561,26 @@ static inline void m66592_write(struct m66592 *m66592, u16 val, | |||
561 | iowrite16(val, m66592->reg + offset); | 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 | static inline void m66592_write_fifo(struct m66592 *m66592, | 579 | static inline void m66592_write_fifo(struct m66592 *m66592, |
565 | unsigned long offset, | 580 | struct m66592_ep *ep, |
566 | void *buf, unsigned long len) | 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 | if (m66592->pdata->on_chip) { | 585 | if (m66592->pdata->on_chip) { |
571 | unsigned long count; | 586 | unsigned long count; |
@@ -591,26 +606,15 @@ static inline void m66592_write_fifo(struct m66592 *m66592, | |||
591 | iowrite16_rep(fifoaddr, buf, len); | 606 | iowrite16_rep(fifoaddr, buf, len); |
592 | if (odd) { | 607 | if (odd) { |
593 | unsigned char *p = buf + len*2; | 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 | iowrite8(*p, fifoaddr); | 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 | 617 | ||
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 | |||
614 | #endif /* ifndef __M66592_UDC_H__ */ | 618 | #endif /* ifndef __M66592_UDC_H__ */ |
615 | 619 | ||
616 | 620 | ||
diff --git a/include/linux/usb/m66592.h b/include/linux/usb/m66592.h index cda9625e7df0..a4ba31ab2fed 100644 --- a/include/linux/usb/m66592.h +++ b/include/linux/usb/m66592.h | |||
@@ -38,6 +38,8 @@ struct m66592_platdata { | |||
38 | /* (external controller only) one = 3.3V, zero = 1.5V */ | 38 | /* (external controller only) one = 3.3V, zero = 1.5V */ |
39 | unsigned vif:1; | 39 | unsigned vif:1; |
40 | 40 | ||
41 | /* (external controller only) set one = WR0_N shorted to WR1_N */ | ||
42 | unsigned wr0_shorted_to_wr1:1; | ||
41 | }; | 43 | }; |
42 | 44 | ||
43 | #endif /* __LINUX_USB_M66592_H */ | 45 | #endif /* __LINUX_USB_M66592_H */ |