usb: dwc3: calculate the number of endpoints
authorFelipe Balbi <balbi@ti.com>
Thu, 5 May 2011 12:53:10 +0000 (15:53 +0300)
committerFelipe Balbi <balbi@ti.com>
Mon, 18 Mar 2013 09:18:02 +0000 (11:18 +0200)
hwparams2 holds the number of endpoints which
were selected during RTL generation, we can
use that on our driver.

Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/dwc3/core.c
drivers/usb/dwc3/core.h

index c6a46e0efe4fe5997725b2a1808323e573f37a6d..66c05725daf3b3aee5c9f0761eb5a865750199ad 100644 (file)
@@ -260,6 +260,17 @@ static void dwc3_event_buffers_cleanup(struct dwc3 *dwc)
        }
 }
 
+static void dwc3_core_num_eps(struct dwc3 *dwc)
+{
+       struct dwc3_hwparams    *parms = &dwc->hwparams;
+
+       dwc->num_in_eps = DWC3_NUM_IN_EPS(parms);
+       dwc->num_out_eps = DWC3_NUM_EPS(parms) - dwc->num_in_eps;
+
+       dev_vdbg(dwc->dev, "found %d IN and %d OUT endpoints\n",
+                       dwc->num_in_eps, dwc->num_out_eps);
+}
+
 static void dwc3_cache_hwparams(struct dwc3 *dwc)
 {
        struct dwc3_hwparams    *parms = &dwc->hwparams;
@@ -336,6 +347,8 @@ static int dwc3_core_init(struct dwc3 *dwc)
        if (dwc->revision < DWC3_REVISION_190A)
                reg |= DWC3_GCTL_U2RSTECN;
 
+       dwc3_core_num_eps(dwc);
+
        dwc3_writel(dwc->regs, DWC3_GCTL, reg);
 
        return 0;
index ad2ffac71500f9692a9a47faf03b73018a46143c..b42f71cb87dd99f351319872defe6e4264310135 100644 (file)
@@ -575,6 +575,14 @@ struct dwc3_hwparams {
 /* HWPARAMS1 */
 #define DWC3_NUM_INT(n)                (((n) & (0x3f << 15)) >> 15)
 
+/* HWPARAMS3 */
+#define DWC3_NUM_IN_EPS_MASK   (0x1f << 18)
+#define DWC3_NUM_EPS_MASK      (0x3f << 12)
+#define DWC3_NUM_EPS(p)                (((p)->hwparams3 &              \
+                       (DWC3_NUM_EPS_MASK)) >> 12)
+#define DWC3_NUM_IN_EPS(p)     (((p)->hwparams3 &              \
+                       (DWC3_NUM_IN_EPS_MASK)) >> 18)
+
 /* HWPARAMS7 */
 #define DWC3_RAM1_DEPTH(n)     ((n) & 0xffff)
 
@@ -641,6 +649,8 @@ struct dwc3_scratchpad_array {
  * @u2pel: parameter from Set SEL request.
  * @u1sel: parameter from Set SEL request.
  * @u1pel: parameter from Set SEL request.
+ * @num_out_eps: number of out endpoints
+ * @num_in_eps: number of in endpoints
  * @ep0_next_event: hold the next expected event
  * @ep0state: state of endpoint zero
  * @link_state: link state
@@ -658,8 +668,10 @@ struct dwc3 {
        dma_addr_t              ep0_trb_addr;
        dma_addr_t              ep0_bounce_addr;
        struct dwc3_request     ep0_usb_req;
+
        /* device lock */
        spinlock_t              lock;
+
        struct device           *dev;
 
        struct platform_device  *xhci;
@@ -727,6 +739,9 @@ struct dwc3 {
 
        u8                      speed;
 
+       u8                      num_out_eps;
+       u8                      num_in_eps;
+
        void                    *mem;
 
        struct dwc3_hwparams    hwparams;