Commit f5aa889f authored by Kuninori Morimoto's avatar Kuninori Morimoto Committed by Felipe Balbi

usb: gadget: renesas_usbhs: remove desc from usbhs_pipe_malloc

Current usbhs_pipe_malloc() used usb_endpoint_descriptor to
get necessary information.
It was very good for mod_gadget which allocate pipe in runtime,
but is not good for mod_host which allocate pipe in initial timing.
This patch remove usb_endpoint_descriptor from usbhs_pipe_malloc()
Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 51b8a021
...@@ -483,11 +483,18 @@ static int usbhsg_ep_enable(struct usb_ep *ep, ...@@ -483,11 +483,18 @@ static int usbhsg_ep_enable(struct usb_ep *ep,
return 0; return 0;
} }
pipe = usbhs_pipe_malloc(priv, desc); pipe = usbhs_pipe_malloc(priv,
usb_endpoint_type(desc),
usb_endpoint_dir_in(desc));
if (pipe) { if (pipe) {
uep->pipe = pipe; uep->pipe = pipe;
pipe->mod_private = uep; pipe->mod_private = uep;
/* set epnum / maxp */
usbhs_pipe_config_update(pipe,
usb_endpoint_num(desc),
usb_endpoint_maxp(desc));
/* /*
* usbhs_fifo_dma_push/pop_handler try to * usbhs_fifo_dma_push/pop_handler try to
* use dmaengine if possible. * use dmaengine if possible.
...@@ -667,6 +674,7 @@ static int usbhsg_try_start(struct usbhs_priv *priv, u32 status) ...@@ -667,6 +674,7 @@ static int usbhsg_try_start(struct usbhs_priv *priv, u32 status)
/* dcp init */ /* dcp init */
dcp->pipe = usbhs_dcp_malloc(priv); dcp->pipe = usbhs_dcp_malloc(priv);
dcp->pipe->mod_private = dcp; dcp->pipe->mod_private = dcp;
usbhs_pipe_config_update(dcp->pipe, 0, 64);
/* /*
* system config enble * system config enble
......
...@@ -311,8 +311,8 @@ static int usbhsp_possible_double_buffer(struct usbhs_pipe *pipe) ...@@ -311,8 +311,8 @@ static int usbhsp_possible_double_buffer(struct usbhs_pipe *pipe)
} }
static u16 usbhsp_setup_pipecfg(struct usbhs_pipe *pipe, static u16 usbhsp_setup_pipecfg(struct usbhs_pipe *pipe,
const struct usb_endpoint_descriptor *desc, int is_host,
int is_host) int dir_in)
{ {
u16 type = 0; u16 type = 0;
u16 bfre = 0; u16 bfre = 0;
...@@ -358,11 +358,11 @@ static u16 usbhsp_setup_pipecfg(struct usbhs_pipe *pipe, ...@@ -358,11 +358,11 @@ static u16 usbhsp_setup_pipecfg(struct usbhs_pipe *pipe,
cntmd = 0; /* FIXME */ cntmd = 0; /* FIXME */
/* DIR */ /* DIR */
if (usb_endpoint_dir_in(desc)) if (dir_in)
usbhsp_flags_set(pipe, IS_DIR_HOST); usbhsp_flags_set(pipe, IS_DIR_HOST);
if ((is_host && usb_endpoint_dir_out(desc)) || if ((is_host && !dir_in) ||
(!is_host && usb_endpoint_dir_in(desc))) (!is_host && dir_in))
dir |= DIR_OUT; dir |= DIR_OUT;
if (!dir) if (!dir)
...@@ -374,7 +374,7 @@ static u16 usbhsp_setup_pipecfg(struct usbhs_pipe *pipe, ...@@ -374,7 +374,7 @@ static u16 usbhsp_setup_pipecfg(struct usbhs_pipe *pipe,
shtnak = SHTNAK; shtnak = SHTNAK;
/* EPNUM */ /* EPNUM */
epnum = 0xF & usb_endpoint_num(desc); epnum = 0; /* see usbhs_pipe_config_update() */
return type | return type |
bfre | bfre |
...@@ -385,19 +385,7 @@ static u16 usbhsp_setup_pipecfg(struct usbhs_pipe *pipe, ...@@ -385,19 +385,7 @@ static u16 usbhsp_setup_pipecfg(struct usbhs_pipe *pipe,
epnum; epnum;
} }
static u16 usbhsp_setup_pipemaxp(struct usbhs_pipe *pipe, static u16 usbhsp_setup_pipebuff(struct usbhs_pipe *pipe)
const struct usb_endpoint_descriptor *desc,
int is_host)
{
/* host should set DEVSEL */
/* reutn MXPS */
return PIPE_MAXP_MASK & usb_endpoint_maxp(desc);
}
static u16 usbhsp_setup_pipebuff(struct usbhs_pipe *pipe,
const struct usb_endpoint_descriptor *desc,
int is_host)
{ {
struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe); struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
struct usbhs_pipe_info *info = usbhs_priv_to_pipeinfo(priv); struct usbhs_pipe_info *info = usbhs_priv_to_pipeinfo(priv);
...@@ -473,6 +461,17 @@ static u16 usbhsp_setup_pipebuff(struct usbhs_pipe *pipe, ...@@ -473,6 +461,17 @@ static u16 usbhsp_setup_pipebuff(struct usbhs_pipe *pipe,
(0xff & bufnmb) << 0; (0xff & bufnmb) << 0;
} }
void usbhs_pipe_config_update(struct usbhs_pipe *pipe, u16 epnum, u16 maxp)
{
usbhsp_pipe_barrier(pipe);
usbhsp_pipe_select(pipe);
usbhsp_pipe_maxp_set(pipe, 0xFFFF, maxp);
if (!usbhs_pipe_is_dcp(pipe))
usbhsp_pipe_cfg_set(pipe, 0x000F, epnum);
}
/* /*
* pipe control * pipe control
*/ */
...@@ -582,19 +581,20 @@ void usbhs_pipe_init(struct usbhs_priv *priv, ...@@ -582,19 +581,20 @@ void usbhs_pipe_init(struct usbhs_priv *priv,
} }
struct usbhs_pipe *usbhs_pipe_malloc(struct usbhs_priv *priv, struct usbhs_pipe *usbhs_pipe_malloc(struct usbhs_priv *priv,
const struct usb_endpoint_descriptor *desc) int endpoint_type,
int dir_in)
{ {
struct device *dev = usbhs_priv_to_dev(priv); struct device *dev = usbhs_priv_to_dev(priv);
struct usbhs_mod *mod = usbhs_mod_get_current(priv); struct usbhs_mod *mod = usbhs_mod_get_current(priv);
struct usbhs_pipe *pipe; struct usbhs_pipe *pipe;
int is_host = usbhs_mod_is_host(priv, mod); int is_host = usbhs_mod_is_host(priv, mod);
int ret; int ret;
u16 pipecfg, pipebuf, pipemaxp; u16 pipecfg, pipebuf;
pipe = usbhsp_get_pipe(priv, usb_endpoint_type(desc)); pipe = usbhsp_get_pipe(priv, endpoint_type);
if (!pipe) { if (!pipe) {
dev_err(dev, "can't get pipe (%s)\n", dev_err(dev, "can't get pipe (%s)\n",
usbhsp_pipe_name[usb_endpoint_type(desc)]); usbhsp_pipe_name[endpoint_type]);
return NULL; return NULL;
} }
...@@ -609,22 +609,25 @@ struct usbhs_pipe *usbhs_pipe_malloc(struct usbhs_priv *priv, ...@@ -609,22 +609,25 @@ struct usbhs_pipe *usbhs_pipe_malloc(struct usbhs_priv *priv,
return NULL; return NULL;
} }
pipecfg = usbhsp_setup_pipecfg(pipe, desc, is_host); pipecfg = usbhsp_setup_pipecfg(pipe, is_host, dir_in);
pipebuf = usbhsp_setup_pipebuff(pipe, desc, is_host); pipebuf = usbhsp_setup_pipebuff(pipe);
pipemaxp = usbhsp_setup_pipemaxp(pipe, desc, is_host);
usbhsp_pipe_select(pipe); usbhsp_pipe_select(pipe);
usbhsp_pipe_cfg_set(pipe, 0xFFFF, pipecfg); usbhsp_pipe_cfg_set(pipe, 0xFFFF, pipecfg);
usbhsp_pipe_buf_set(pipe, 0xFFFF, pipebuf); usbhsp_pipe_buf_set(pipe, 0xFFFF, pipebuf);
usbhsp_pipe_maxp_set(pipe, 0xFFFF, pipemaxp);
usbhs_pipe_clear_sequence(pipe); usbhs_pipe_clear_sequence(pipe);
dev_dbg(dev, "enable pipe %d : %s (%s)\n", dev_dbg(dev, "enable pipe %d : %s (%s)\n",
usbhs_pipe_number(pipe), usbhs_pipe_number(pipe),
usbhsp_pipe_name[usb_endpoint_type(desc)], usbhsp_pipe_name[endpoint_type],
usbhs_pipe_is_dir_in(pipe) ? "in" : "out"); usbhs_pipe_is_dir_in(pipe) ? "in" : "out");
/*
* epnum / maxp are still not set to this pipe.
* call usbhs_pipe_config_update() after this function !!
*/
return pipe; return pipe;
} }
...@@ -651,16 +654,12 @@ struct usbhs_pipe *usbhs_dcp_malloc(struct usbhs_priv *priv) ...@@ -651,16 +654,12 @@ struct usbhs_pipe *usbhs_dcp_malloc(struct usbhs_priv *priv)
if (!pipe) if (!pipe)
return NULL; return NULL;
INIT_LIST_HEAD(&pipe->list);
/* /*
* dcpcfg : default * call usbhs_pipe_config_update() after this function !!
* dcpmaxp : default
* pipebuf : nothing to do
*/ */
usbhsp_pipe_select(pipe);
usbhs_pipe_clear_sequence(pipe);
INIT_LIST_HEAD(&pipe->list);
return pipe; return pipe;
} }
......
...@@ -76,8 +76,7 @@ void usbhs_usbreq_set_val(struct usbhs_priv *priv, struct usb_ctrlrequest *req); ...@@ -76,8 +76,7 @@ void usbhs_usbreq_set_val(struct usbhs_priv *priv, struct usb_ctrlrequest *req);
* pipe control * pipe control
*/ */
struct usbhs_pipe struct usbhs_pipe
*usbhs_pipe_malloc(struct usbhs_priv *priv, *usbhs_pipe_malloc(struct usbhs_priv *priv, int endpoint_type, int dir_in);
const struct usb_endpoint_descriptor *desc);
int usbhs_pipe_probe(struct usbhs_priv *priv); int usbhs_pipe_probe(struct usbhs_priv *priv);
void usbhs_pipe_remove(struct usbhs_priv *priv); void usbhs_pipe_remove(struct usbhs_priv *priv);
int usbhs_pipe_is_dir_in(struct usbhs_pipe *pipe); int usbhs_pipe_is_dir_in(struct usbhs_pipe *pipe);
...@@ -93,6 +92,7 @@ void usbhs_pipe_enable(struct usbhs_pipe *pipe); ...@@ -93,6 +92,7 @@ void usbhs_pipe_enable(struct usbhs_pipe *pipe);
void usbhs_pipe_disable(struct usbhs_pipe *pipe); void usbhs_pipe_disable(struct usbhs_pipe *pipe);
void usbhs_pipe_stall(struct usbhs_pipe *pipe); void usbhs_pipe_stall(struct usbhs_pipe *pipe);
void usbhs_pipe_select_fifo(struct usbhs_pipe *pipe, struct usbhs_fifo *fifo); void usbhs_pipe_select_fifo(struct usbhs_pipe *pipe, struct usbhs_fifo *fifo);
void usbhs_pipe_config_update(struct usbhs_pipe *pipe, u16 epnum, u16 maxp);
#define usbhs_pipe_to_priv(p) ((p)->priv) #define usbhs_pipe_to_priv(p) ((p)->priv)
#define usbhs_pipe_number(p) (int)((p) - (p)->priv->pipe_info.pipe) #define usbhs_pipe_number(p) (int)((p) - (p)->priv->pipe_info.pipe)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment