usb: renesas_usbhs: add usbhs_pipe_clear_without_sequence() function
authorYoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Wed, 6 Dec 2017 08:18:32 +0000 (17:18 +0900)
committerFelipe Balbi <felipe.balbi@linux.intel.com>
Tue, 12 Dec 2017 11:04:09 +0000 (13:04 +0200)
This patch adds usbhs_pipe_clear_without_sequence() function.
The controller has the pipe buffer and the PIPEnCTR.ACLRM can clear
it completely. But, it's also clear the data sequence. So, the driver
needs to get the sequence before.

Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
drivers/usb/renesas_usbhs/pipe.c
drivers/usb/renesas_usbhs/pipe.h

index 093cd8e87335ffb4f814e6894112066f418135f6..9677e0e31475e46cb6267d8f07bb183d96abb5f9 100644 (file)
@@ -590,10 +590,22 @@ void usbhs_pipe_clear(struct usbhs_pipe *pipe)
        }
 }
 
-void usbhs_pipe_config_change_bfre(struct usbhs_pipe *pipe, int enable)
+/* Should call usbhsp_pipe_select() before */
+void usbhs_pipe_clear_without_sequence(struct usbhs_pipe *pipe,
+                                      int needs_bfre, int bfre_enable)
 {
        int sequence;
 
+       usbhsp_pipe_select(pipe);
+       sequence = usbhs_pipe_get_data_sequence(pipe);
+       if (needs_bfre)
+               usbhsp_pipe_cfg_set(pipe, BFRE, bfre_enable ? BFRE : 0);
+       usbhs_pipe_clear(pipe);
+       usbhs_pipe_data_sequence(pipe, sequence);
+}
+
+void usbhs_pipe_config_change_bfre(struct usbhs_pipe *pipe, int enable)
+{
        if (usbhs_pipe_is_dcp(pipe))
                return;
 
@@ -602,10 +614,7 @@ void usbhs_pipe_config_change_bfre(struct usbhs_pipe *pipe, int enable)
        if (!(enable ^ !!(usbhsp_pipe_cfg_get(pipe) & BFRE)))
                return;
 
-       sequence = usbhs_pipe_get_data_sequence(pipe);
-       usbhsp_pipe_cfg_set(pipe, BFRE, enable ? BFRE : 0);
-       usbhs_pipe_clear(pipe);
-       usbhs_pipe_data_sequence(pipe, sequence);
+       usbhs_pipe_clear_without_sequence(pipe, 1, enable);
 }
 
 static struct usbhs_pipe *usbhsp_get_pipe(struct usbhs_priv *priv, u32 type)
index d3d00224489182c69e7a128b9e4848b6c3ad082c..3080423e600c7ec6777a950fde20823a72bfe17b 100644 (file)
@@ -80,6 +80,8 @@ void usbhs_pipe_init(struct usbhs_priv *priv,
                                         struct usbhs_pkt *pkt, int map));
 int usbhs_pipe_get_maxpacket(struct usbhs_pipe *pipe);
 void usbhs_pipe_clear(struct usbhs_pipe *pipe);
+void usbhs_pipe_clear_without_sequence(struct usbhs_pipe *pipe,
+                                      int needs_bfre, int bfre_enable);
 int usbhs_pipe_is_accessible(struct usbhs_pipe *pipe);
 void usbhs_pipe_enable(struct usbhs_pipe *pipe);
 void usbhs_pipe_disable(struct usbhs_pipe *pipe);