usb: dwc3: gadget: re-factor USB2 test mode to a function
authorFelipe Balbi <balbi@ti.com>
Mon, 2 Jan 2012 16:25:43 +0000 (18:25 +0200)
committerFelipe Balbi <balbi@ti.com>
Mon, 6 Feb 2012 09:48:19 +0000 (11:48 +0200)
There are some situations were we might need to
enable USB Test Modes without having access to a
Host stack. In such situations we cannot rely
solely on USB Control Messages to enable test
features.

For those cases, we will also allow test mode
to be enabled via debugfs and this patch is a
preparation for that.

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

index c8df1dd967efe3e5160fbe8507a8b2bbff972aa5..5eb7095e4005358802bf3e8bd84436bf1a210921 100644 (file)
@@ -315,7 +315,6 @@ static int dwc3_ep0_handle_feature(struct dwc3 *dwc,
        u32                     recip;
        u32                     wValue;
        u32                     wIndex;
-       u32                     reg;
        int                     ret;
        u32                     mode;
 
@@ -357,24 +356,12 @@ static int dwc3_ep0_handle_feature(struct dwc3 *dwc,
                                return -EINVAL;
 
                        mode = wIndex >> 8;
-                       reg = dwc3_readl(dwc->regs, DWC3_DCTL);
-                       reg &= ~DWC3_DCTL_TSTCTRL_MASK;
-
-                       switch (mode) {
-                       case TEST_J:
-                       case TEST_K:
-                       case TEST_SE0_NAK:
-                       case TEST_PACKET:
-                       case TEST_FORCE_EN:
-                               reg |= mode << 1;
-                               break;
-                       default:
-                               return -EINVAL;
+                       ret = dwc3_gadget_set_test_mode(dwc, mode);
+                       if (ret < 0) {
+                               dev_dbg(dwc->dev, "Invalid Test #%d\n",
+                                               mode);
+                               return ret;
                        }
-                       dwc3_writel(dwc->regs, DWC3_DCTL, reg);
-                       break;
-               default:
-                       return -EINVAL;
                }
                break;
 
index 064b6e2cd4118635508a1dcc4eddfd63e3d08189..1dee17e7b778a9beeabd1efad104f96e8f68edd3 100644 (file)
 
 #define        DMA_ADDR_INVALID        (~(dma_addr_t)0)
 
+/**
+ * dwc3_gadget_set_test_mode - Enables USB2 Test Modes
+ * @dwc: pointer to our context structure
+ * @mode: the mode to set (J, K SE0 NAK, Force Enable)
+ *
+ * Caller should take care of locking. This function will
+ * return 0 on success or -EINVAL if wrong Test Selector
+ * is passed
+ */
+int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode)
+{
+       u32             reg;
+
+       reg = dwc3_readl(dwc->regs, DWC3_DCTL);
+       reg &= ~DWC3_DCTL_TSTCTRL_MASK;
+
+       switch (mode) {
+       case TEST_J:
+       case TEST_K:
+       case TEST_SE0_NAK:
+       case TEST_PACKET:
+       case TEST_FORCE_EN:
+               reg |= mode << 1;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       dwc3_writel(dwc->regs, DWC3_DCTL, reg);
+
+       return 0;
+}
+
 void dwc3_map_buffer_to_dma(struct dwc3_request *req)
 {
        struct dwc3                     *dwc = req->dep->dwc;
index d97f467d41cc43a2d536a93248530de33f55c521..2cf6f2989f7375975008096a25a77f11889e8248 100644 (file)
@@ -100,6 +100,8 @@ static inline void dwc3_gadget_move_request_queued(struct dwc3_request *req)
 void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req,
                int status);
 
+int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode);
+
 void dwc3_ep0_interrupt(struct dwc3 *dwc,
                const struct dwc3_event_depevt *event);
 void dwc3_ep0_out_start(struct dwc3 *dwc);