]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/commitdiff
usb: gadget: m66592-udc: add function for external controller
authorYoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Thu, 7 Jul 2011 00:58:43 +0000 (09:58 +0900)
committerFelipe Balbi <balbi@ti.com>
Fri, 8 Jul 2011 22:08:39 +0000 (01:08 +0300)
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>
drivers/usb/gadget/m66592-udc.c
drivers/usb/gadget/m66592-udc.h
include/linux/usb/m66592.h

index 40c2f7a4f8fbcdb267545b316de9fe1905b8749e..5c9c04d7aa76cfda2b46ef46089aabebf082a097 100644 (file)
@@ -781,7 +781,7 @@ static void irq_ep0_write(struct m66592_ep *ep, struct m66592_request *req)
        /* write fifo */
        if (req->req.buf) {
                if (size > 0)
-                       m66592_write_fifo(m66592, ep->fifoaddr, buf, size);
+                       m66592_write_fifo(m66592, ep, buf, size);
                if ((size == 0) || ((size % ep->ep.maxpacket) != 0))
                        m66592_bset(m66592, M66592_BVAL, ep->fifoctr);
        }
@@ -827,7 +827,7 @@ static void irq_packet_write(struct m66592_ep *ep, struct m66592_request *req)
 
        /* write fifo */
        if (req->req.buf) {
-               m66592_write_fifo(m66592, ep->fifoaddr, buf, size);
+               m66592_write_fifo(m66592, ep, buf, size);
                if ((size == 0)
                                || ((size % ep->ep.maxpacket) != 0)
                                || ((bufsize != ep->ep.maxpacket)
index b85e05b2e97b397f30ea02172c1fbfe3fe94f358..7b93d579af372e713e945652393f749c7320f18e 100644 (file)
@@ -561,11 +561,26 @@ static inline void m66592_write(struct m66592 *m66592, u16 val,
        iowrite16(val, m66592->reg + offset);
 }
 
+static inline void m66592_mdfy(struct m66592 *m66592, u16 val, u16 pat,
+               unsigned long offset)
+{
+       u16 tmp;
+       tmp = m66592_read(m66592, offset);
+       tmp = tmp & (~pat);
+       tmp = tmp | val;
+       m66592_write(m66592, tmp, offset);
+}
+
+#define m66592_bclr(m66592, val, offset)       \
+                       m66592_mdfy(m66592, 0, val, offset)
+#define m66592_bset(m66592, val, offset)       \
+                       m66592_mdfy(m66592, val, 0, offset)
+
 static inline void m66592_write_fifo(struct m66592 *m66592,
-               unsigned long offset,
+               struct m66592_ep *ep,
                void *buf, unsigned long len)
 {
-       void __iomem *fifoaddr = m66592->reg + offset;
+       void __iomem *fifoaddr = m66592->reg + ep->fifoaddr;
 
        if (m66592->pdata->on_chip) {
                unsigned long count;
@@ -591,26 +606,15 @@ static inline void m66592_write_fifo(struct m66592 *m66592,
                iowrite16_rep(fifoaddr, buf, len);
                if (odd) {
                        unsigned char *p = buf + len*2;
+                       if (m66592->pdata->wr0_shorted_to_wr1)
+                               m66592_bclr(m66592, M66592_MBW_16, ep->fifosel);
                        iowrite8(*p, fifoaddr);
+                       if (m66592->pdata->wr0_shorted_to_wr1)
+                               m66592_bset(m66592, M66592_MBW_16, ep->fifosel);
                }
        }
 }
 
-static inline void m66592_mdfy(struct m66592 *m66592, u16 val, u16 pat,
-               unsigned long offset)
-{
-       u16 tmp;
-       tmp = m66592_read(m66592, offset);
-       tmp = tmp & (~pat);
-       tmp = tmp | val;
-       m66592_write(m66592, tmp, offset);
-}
-
-#define m66592_bclr(m66592, val, offset)       \
-                       m66592_mdfy(m66592, 0, val, offset)
-#define m66592_bset(m66592, val, offset)       \
-                       m66592_mdfy(m66592, val, 0, offset)
-
 #endif /* ifndef __M66592_UDC_H__ */
 
 
index cda9625e7df0683bfaff1cd2486d05d1a9986995..a4ba31ab2fedd7bc656facf01309930f83a7434f 100644 (file)
@@ -38,6 +38,8 @@ struct m66592_platdata {
        /* (external controller only) one = 3.3V, zero = 1.5V */
        unsigned        vif:1;
 
+       /* (external controller only) set one = WR0_N shorted to WR1_N */
+       unsigned        wr0_shorted_to_wr1:1;
 };
 
 #endif /* __LINUX_USB_M66592_H */