usb: renesas_usbhs: add usbhs_pipe_clear_without_sequence() function
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>
This commit is contained in:
parent
469e297813
commit
8d8a0435d1
@ -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;
|
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))
|
if (usbhs_pipe_is_dcp(pipe))
|
||||||
return;
|
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)))
|
if (!(enable ^ !!(usbhsp_pipe_cfg_get(pipe) & BFRE)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
sequence = usbhs_pipe_get_data_sequence(pipe);
|
usbhs_pipe_clear_without_sequence(pipe, 1, enable);
|
||||||
usbhsp_pipe_cfg_set(pipe, BFRE, enable ? BFRE : 0);
|
|
||||||
usbhs_pipe_clear(pipe);
|
|
||||||
usbhs_pipe_data_sequence(pipe, sequence);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct usbhs_pipe *usbhsp_get_pipe(struct usbhs_priv *priv, u32 type)
|
static struct usbhs_pipe *usbhsp_get_pipe(struct usbhs_priv *priv, u32 type)
|
||||||
|
@ -80,6 +80,8 @@ void usbhs_pipe_init(struct usbhs_priv *priv,
|
|||||||
struct usbhs_pkt *pkt, int map));
|
struct usbhs_pkt *pkt, int map));
|
||||||
int usbhs_pipe_get_maxpacket(struct usbhs_pipe *pipe);
|
int usbhs_pipe_get_maxpacket(struct usbhs_pipe *pipe);
|
||||||
void usbhs_pipe_clear(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);
|
int usbhs_pipe_is_accessible(struct usbhs_pipe *pipe);
|
||||||
void usbhs_pipe_enable(struct usbhs_pipe *pipe);
|
void usbhs_pipe_enable(struct usbhs_pipe *pipe);
|
||||||
void usbhs_pipe_disable(struct usbhs_pipe *pipe);
|
void usbhs_pipe_disable(struct usbhs_pipe *pipe);
|
||||||
|
Loading…
Reference in New Issue
Block a user