Commit 04a9bfcd authored by Felipe Balbi's avatar Felipe Balbi

usb: dwc3: gadget: re-factor USB2 test mode to a function

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: default avatarFelipe Balbi <balbi@ti.com>
parent 62aa2b53
...@@ -315,7 +315,6 @@ static int dwc3_ep0_handle_feature(struct dwc3 *dwc, ...@@ -315,7 +315,6 @@ static int dwc3_ep0_handle_feature(struct dwc3 *dwc,
u32 recip; u32 recip;
u32 wValue; u32 wValue;
u32 wIndex; u32 wIndex;
u32 reg;
int ret; int ret;
u32 mode; u32 mode;
...@@ -357,24 +356,12 @@ static int dwc3_ep0_handle_feature(struct dwc3 *dwc, ...@@ -357,24 +356,12 @@ static int dwc3_ep0_handle_feature(struct dwc3 *dwc,
return -EINVAL; return -EINVAL;
mode = wIndex >> 8; mode = wIndex >> 8;
reg = dwc3_readl(dwc->regs, DWC3_DCTL); ret = dwc3_gadget_set_test_mode(dwc, mode);
reg &= ~DWC3_DCTL_TSTCTRL_MASK; if (ret < 0) {
dev_dbg(dwc->dev, "Invalid Test #%d\n",
switch (mode) { mode);
case TEST_J: return ret;
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);
break;
default:
return -EINVAL;
} }
break; break;
......
...@@ -56,6 +56,39 @@ ...@@ -56,6 +56,39 @@
#define DMA_ADDR_INVALID (~(dma_addr_t)0) #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) void dwc3_map_buffer_to_dma(struct dwc3_request *req)
{ {
struct dwc3 *dwc = req->dep->dwc; struct dwc3 *dwc = req->dep->dwc;
......
...@@ -100,6 +100,8 @@ static inline void dwc3_gadget_move_request_queued(struct dwc3_request *req) ...@@ -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, void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req,
int status); int status);
int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode);
void dwc3_ep0_interrupt(struct dwc3 *dwc, void dwc3_ep0_interrupt(struct dwc3 *dwc,
const struct dwc3_event_depevt *event); const struct dwc3_event_depevt *event);
void dwc3_ep0_out_start(struct dwc3 *dwc); void dwc3_ep0_out_start(struct dwc3 *dwc);
......
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