usb: renesas_usbhs: fix usbhs_pipe_clear() for DCP PIPE
PATCH 4/4 usb: renesas_usbhs: fix usbhs_pipe_clear() for DCP PIPE
Since the DCPCTR doesn't have the ACLRM bit, the usbus_pipe_clear() should not call the usbhsp_pipectrl_set() with ACLRM. So, this patch fixes this issue to add the usbhs_fifo_clear_dcp() in fifo.c because the controller needs the CFIFO to clear the DCP PIPE.
Signed-off-by Yoshihiro Shimoda <[email protected]>
--- drivers/usb/renesas_usbhs/fifo.c | 18 ++++++++++++++++++ drivers/usb/renesas_usbhs/fifo.h | 1 + drivers/usb/renesas_usbhs/mod_gadget.c | 2 +- drivers/usb/renesas_usbhs/mod_host.c | 2 +- drivers/usb/renesas_usbhs/pipe.c | 8 ++++++-- 5 files changed, 27 insertions(+), 4 deletions(-)
drivers/usb/renesas_usbhs/fifo.c +18 -0
@@ -1160,6 +1160,24 @@ static void usbhsf_dma_complete(void *arg) usbhs_pipe_number(pipe), ret); } +void usbhs_fifo_clear_dcp (struct usbhs_pipe *pipe) +{ +struct usbhs_priv *priv =usbhs_pipe_to_priv (pipe); +struct usbhs_fifo *fifo =usbhsf_get_cfifo (priv);/* CFIFO */ + +/* clear DCP FIFO of transmission */ +if (usbhsf_fifo_select (pipe, fifo,1 ) <0 ) +return ; +usbhsf_fifo_clear (pipe, fifo); +usbhsf_fifo_unselect (pipe, fifo); + +/* clear DCP FIFO of reception */ +if (usbhsf_fifo_select (pipe, fifo,0 ) <0 ) +return ; +usbhsf_fifo_clear (pipe, fifo); +usbhsf_fifo_unselect (pipe, fifo); +} +/* * fifo init */
drivers/usb/renesas_usbhs/fifo.h +1 -0
@@ -74,6 +74,7 @@ int usbhs_fifo_probe(struct usbhs_priv *priv);void usbhs_fifo_remove (struct usbhs_priv *priv);void usbhs_fifo_init (struct usbhs_priv *priv);void usbhs_fifo_quit (struct usbhs_priv *priv); +void usbhs_fifo_clear_dcp (struct usbhs_pipe *pipe);/* * packet info
drivers/usb/renesas_usbhs/mod_gadget.c +1 -1
@@ -782,9 +782,9 @@ static int usbhsg_try_start(struct usbhs_priv *priv, u32 status)/* * pipe initialize and enable DCP */ +usbhs_fifo_init (priv);usbhs_pipe_init (priv, usbhsg_dma_map_ctrl); -usbhs_fifo_init (priv);/* dcp init instead of usbhsg_ep_enable() */ dcp->pipe =usbhs_dcp_malloc (priv);
drivers/usb/renesas_usbhs/mod_host.c +1 -1
@@ -1474,9 +1474,9 @@ static int usbhsh_start(struct usbhs_priv *priv)/* * pipe initialize and enable DCP */ +usbhs_fifo_init (priv);usbhs_pipe_init (priv, usbhsh_dma_map_ctrl); -usbhs_fifo_init (priv);usbhsh_pipe_init_for_host (priv);/*
drivers/usb/renesas_usbhs/pipe.c +6 -2
@@ -618,8 +618,12 @@ void usbhs_pipe_data_sequence(struct usbhs_pipe *pipe, int sequence)void usbhs_pipe_clear (struct usbhs_pipe *pipe) { -usbhsp_pipectrl_set (pipe,ACLRM ,ACLRM ); -usbhsp_pipectrl_set (pipe,ACLRM ,0 ); +if (usbhs_pipe_is_dcp (pipe)) { +usbhs_fifo_clear_dcp (pipe); + }else { +usbhsp_pipectrl_set (pipe,ACLRM ,ACLRM ); +usbhsp_pipectrl_set (pipe,ACLRM ,0 ); + } }static struct usbhs_pipe *usbhsp_get_pipe (struct usbhs_priv *priv,u32 type)
Signature · 1 line
1.7.9.5
Quoted 7 lines · Yoshihiro Shimoda
Since the DCPCTR doesn't have the ACLRM bit, the
usbus_pipe_clear()should not call theusbhsp_pipectrl_set()with ACLRM. So, this patch fixes this issue to add theusbhs_fifo_clear_dcp()infifo.cbecause the controller needs the CFIFO to clear the DCP PIPE.Signed-off-by Yoshihiro Shimoda <[email protected]>
which commit does this one fix ? Do we need to cc stable ?
Signature · 1 line
balbi