usb: gadget: renesas_usbhs: modify pipe sequence settings
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Tue, 11 Oct 2011 05:05:30 +0000 (22:05 -0700)
committerFelipe Balbi <balbi@ti.com>
Thu, 13 Oct 2011 17:41:46 +0000 (20:41 +0300)
renesas_usbhs can manually set DATA0/DATA1.
This patch is prepare for mod_host support

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/renesas_usbhs/common.h
drivers/usb/renesas_usbhs/mod_gadget.c
drivers/usb/renesas_usbhs/pipe.c
drivers/usb/renesas_usbhs/pipe.h

index 3b23380..7822b0b 100644 (file)
@@ -187,8 +187,9 @@ struct usbhs_priv;
 #define BSTS           (1 << 15)       /* Buffer Status */
 #define SUREQ          (1 << 14)       /* Sending SETUP Token */
 #define CSSTS          (1 << 12)       /* CSSTS Status */
-#define SQCLR          (1 << 8)        /* Toggle Bit Clear */
 #define        ACLRM           (1 << 9)        /* Buffer Auto-Clear Mode */
+#define SQCLR          (1 << 8)        /* Toggle Bit Clear */
+#define SQSET          (1 << 7)        /* Toggle Bit Set */
 #define PBUSY          (1 << 5)        /* Pipe Busy */
 #define PID_MASK       (0x3)           /* Response PID */
 #define  PID_NAK       0
index d3d833b..4cc7ee0 100644 (file)
@@ -265,7 +265,7 @@ static int usbhsg_recip_handler_std_clear_endpoint(struct usbhs_priv *priv,
 
        if (!usbhsg_status_has(gpriv, USBHSG_STATUS_WEDGE)) {
                usbhs_pipe_disable(pipe);
-               usbhs_pipe_clear_sequence(pipe);
+               usbhs_pipe_sequence_data0(pipe);
                usbhs_pipe_enable(pipe);
        }
 
@@ -479,7 +479,7 @@ static int usbhsg_ep_enable(struct usb_ep *ep,
         */
        if (uep->pipe) {
                usbhs_pipe_clear(uep->pipe);
-               usbhs_pipe_clear_sequence(uep->pipe);
+               usbhs_pipe_sequence_data0(uep->pipe);
                return 0;
        }
 
index 6bc9e33..1acbe29 100644 (file)
@@ -471,9 +471,12 @@ int usbhs_pipe_is_dir_host(struct usbhs_pipe *pipe)
        return usbhsp_flags_has(pipe, IS_DIR_HOST);
 }
 
-void usbhs_pipe_clear_sequence(struct usbhs_pipe *pipe)
+void usbhs_pipe_data_sequence(struct usbhs_pipe *pipe, int data)
 {
-       usbhsp_pipectrl_set(pipe, SQCLR, SQCLR);
+       u16 mask = (SQCLR | SQSET);
+       u16 val = (data) ? SQSET : SQCLR;
+
+       usbhsp_pipectrl_set(pipe, mask, val);
 }
 
 void usbhs_pipe_clear(struct usbhs_pipe *pipe)
@@ -584,7 +587,7 @@ struct usbhs_pipe *usbhs_pipe_malloc(struct usbhs_priv *priv,
        usbhsp_pipe_cfg_set(pipe, 0xFFFF, pipecfg);
        usbhsp_pipe_buf_set(pipe, 0xFFFF, pipebuf);
 
-       usbhs_pipe_clear_sequence(pipe);
+       usbhs_pipe_sequence_data0(pipe);
 
        dev_dbg(dev, "enable pipe %d : %s (%s)\n",
                usbhs_pipe_number(pipe),
index ddbd319..6334fc6 100644 (file)
@@ -82,7 +82,6 @@ int usbhs_pipe_is_dir_host(struct usbhs_pipe *pipe);
 void usbhs_pipe_init(struct usbhs_priv *priv,
                     int (*dma_map_ctrl)(struct usbhs_pkt *pkt, int map));
 int usbhs_pipe_get_maxpacket(struct usbhs_pipe *pipe);
-void usbhs_pipe_clear_sequence(struct usbhs_pipe *pipe);
 void usbhs_pipe_clear(struct usbhs_pipe *pipe);
 int usbhs_pipe_is_accessible(struct usbhs_pipe *pipe);
 void usbhs_pipe_enable(struct usbhs_pipe *pipe);
@@ -92,6 +91,10 @@ void usbhs_pipe_select_fifo(struct usbhs_pipe *pipe, struct usbhs_fifo *fifo);
 void usbhs_pipe_config_update(struct usbhs_pipe *pipe, u16 devsel,
                              u16 epnum, u16 maxp);
 
+#define usbhs_pipe_sequence_data0(pipe)        usbhs_pipe_data_sequence(pipe, 0)
+#define usbhs_pipe_sequence_data1(pipe)        usbhs_pipe_data_sequence(pipe, 1)
+void usbhs_pipe_data_sequence(struct usbhs_pipe *pipe, int data);
+
 #define usbhs_pipe_to_priv(p)  ((p)->priv)
 #define usbhs_pipe_number(p)   (int)((p) - (p)->priv->pipe_info.pipe)
 #define usbhs_pipe_is_dcp(p)   ((p)->priv->pipe_info.pipe == (p))