usb: gadget: renesas_usbhs: add device select support in usbhs_pipe_config_update()
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Tue, 11 Oct 2011 05:04:00 +0000 (22:04 -0700)
committerFelipe Balbi <balbi@ti.com>
Thu, 13 Oct 2011 17:41:42 +0000 (20:41 +0300)
device select method will be used on mod_host

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

index dd4ca37fbab386ccbb814325fad179d661406037..d5f80c4457e53f95916b339f25283b82b6fd7475 100644 (file)
@@ -489,7 +489,7 @@ static int usbhsg_ep_enable(struct usb_ep *ep,
                pipe->mod_private       = uep;
 
                /* set epnum / maxp */
-               usbhs_pipe_config_update(pipe,
+               usbhs_pipe_config_update(pipe, 0,
                                         usb_endpoint_num(desc),
                                         usb_endpoint_maxp(desc));
 
@@ -672,7 +672,7 @@ static int usbhsg_try_start(struct usbhs_priv *priv, u32 status)
        /* dcp init */
        dcp->pipe               = usbhs_dcp_malloc(priv);
        dcp->pipe->mod_private  = dcp;
-       usbhs_pipe_config_update(dcp->pipe, 0, 64);
+       usbhs_pipe_config_update(dcp->pipe, 0, 0, 64);
 
        /*
         * system config enble
index 08d11b0cab4304e2e901e57119c332e21d2df808..4235a2ecebf9c7348315ba54e43b0bf5a8a6d6c4 100644 (file)
@@ -418,14 +418,26 @@ static u16 usbhsp_setup_pipebuff(struct usbhs_pipe *pipe)
                (0xff & bufnmb)         <<  0;
 }
 
-void usbhs_pipe_config_update(struct usbhs_pipe *pipe, u16 epnum, u16 maxp)
+void usbhs_pipe_config_update(struct usbhs_pipe *pipe, u16 devsel,
+                             u16 epnum, u16 maxp)
 {
+       if (devsel > 0xA) {
+               struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
+               struct device *dev = usbhs_priv_to_dev(priv);
+
+               dev_err(dev, "devsel error %d\n", devsel);
+
+               devsel = 0;
+       }
+
        usbhsp_pipe_barrier(pipe);
 
        pipe->maxp = maxp;
 
        usbhsp_pipe_select(pipe);
-       usbhsp_pipe_maxp_set(pipe, 0xFFFF, maxp);
+       usbhsp_pipe_maxp_set(pipe, 0xFFFF,
+                            (devsel << 12) |
+                            maxp);
 
        if (!usbhs_pipe_is_dcp(pipe))
                usbhsp_pipe_cfg_set(pipe,  0x000F, epnum);
index 05b706a09e56a72d326135e1e95e940a973b03c9..aff8bfa207d311befd9b791423e6259c4d948972 100644 (file)
@@ -91,7 +91,8 @@ void usbhs_pipe_enable(struct usbhs_pipe *pipe);
 void usbhs_pipe_disable(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_config_update(struct usbhs_pipe *pipe, u16 epnum, u16 maxp);
+void usbhs_pipe_config_update(struct usbhs_pipe *pipe, u16 devsel,
+                             u16 epnum, u16 maxp);
 
 #define usbhs_pipe_to_priv(p)  ((p)->priv)
 #define usbhs_pipe_number(p)   (int)((p) - (p)->priv->pipe_info.pipe)