|
@@ -1,4 +1,4 @@
|
|
|
-/**
|
|
|
+/*
|
|
|
* gadget.c - DesignWare USB3 DRD Controller Gadget Framework Link
|
|
|
*
|
|
|
* Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com
|
|
@@ -36,13 +36,12 @@
|
|
|
#include "io.h"
|
|
|
|
|
|
/**
|
|
|
- * dwc3_gadget_set_test_mode - Enables USB2 Test Modes
|
|
|
+ * 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
|
|
|
+ * 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)
|
|
|
{
|
|
@@ -69,7 +68,7 @@ int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * dwc3_gadget_get_link_state - Gets current state of USB Link
|
|
|
+ * dwc3_gadget_get_link_state - gets current state of usb link
|
|
|
* @dwc: pointer to our context structure
|
|
|
*
|
|
|
* Caller should take care of locking. This function will
|
|
@@ -85,7 +84,7 @@ int dwc3_gadget_get_link_state(struct dwc3 *dwc)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * dwc3_gadget_set_link_state - Sets USB Link to a particular State
|
|
|
+ * dwc3_gadget_set_link_state - sets usb link to a particular state
|
|
|
* @dwc: pointer to our context structure
|
|
|
* @state: the state to put link into
|
|
|
*
|
|
@@ -143,8 +142,8 @@ int dwc3_gadget_set_link_state(struct dwc3 *dwc, enum dwc3_link_state state)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * dwc3_ep_inc_trb() - Increment a TRB index.
|
|
|
- * @index - Pointer to the TRB index to increment.
|
|
|
+ * dwc3_ep_inc_trb - increment a trb index.
|
|
|
+ * @index: Pointer to the TRB index to increment.
|
|
|
*
|
|
|
* The index should never point to the link TRB. After incrementing,
|
|
|
* if it is point to the link TRB, wrap around to the beginning. The
|
|
@@ -157,16 +156,34 @@ static void dwc3_ep_inc_trb(u8 *index)
|
|
|
*index = 0;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * dwc3_ep_inc_enq - increment endpoint's enqueue pointer
|
|
|
+ * @dep: The endpoint whose enqueue pointer we're incrementing
|
|
|
+ */
|
|
|
static void dwc3_ep_inc_enq(struct dwc3_ep *dep)
|
|
|
{
|
|
|
dwc3_ep_inc_trb(&dep->trb_enqueue);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * dwc3_ep_inc_deq - increment endpoint's dequeue pointer
|
|
|
+ * @dep: The endpoint whose enqueue pointer we're incrementing
|
|
|
+ */
|
|
|
static void dwc3_ep_inc_deq(struct dwc3_ep *dep)
|
|
|
{
|
|
|
dwc3_ep_inc_trb(&dep->trb_dequeue);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * dwc3_gadget_giveback - call struct usb_request's ->complete callback
|
|
|
+ * @dep: The endpoint to whom the request belongs to
|
|
|
+ * @req: The request we're giving back
|
|
|
+ * @status: completion code for the request
|
|
|
+ *
|
|
|
+ * Must be called with controller's lock held and interrupts disabled. This
|
|
|
+ * function will unmap @req and call its ->complete() callback to notify upper
|
|
|
+ * layers that it has completed.
|
|
|
+ */
|
|
|
void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req,
|
|
|
int status)
|
|
|
{
|
|
@@ -193,6 +210,15 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req,
|
|
|
pm_runtime_put(dwc->dev);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * dwc3_send_gadget_generic_command - issue a generic command for the controller
|
|
|
+ * @dwc: pointer to the controller context
|
|
|
+ * @cmd: the command to be issued
|
|
|
+ * @param: command parameter
|
|
|
+ *
|
|
|
+ * Caller should take care of locking. Issue @cmd with a given @param to @dwc
|
|
|
+ * and wait for its completion.
|
|
|
+ */
|
|
|
int dwc3_send_gadget_generic_command(struct dwc3 *dwc, unsigned cmd, u32 param)
|
|
|
{
|
|
|
u32 timeout = 500;
|
|
@@ -225,6 +251,15 @@ int dwc3_send_gadget_generic_command(struct dwc3 *dwc, unsigned cmd, u32 param)
|
|
|
|
|
|
static int __dwc3_gadget_wakeup(struct dwc3 *dwc);
|
|
|
|
|
|
+/**
|
|
|
+ * dwc3_send_gadget_ep_cmd - issue an endpoint command
|
|
|
+ * @dep: the endpoint to which the command is going to be issued
|
|
|
+ * @cmd: the command to be issued
|
|
|
+ * @params: parameters to the command
|
|
|
+ *
|
|
|
+ * Caller should handle locking. This function will issue @cmd with given
|
|
|
+ * @params to @dep and wait for its completion.
|
|
|
+ */
|
|
|
int dwc3_send_gadget_ep_cmd(struct dwc3_ep *dep, unsigned cmd,
|
|
|
struct dwc3_gadget_ep_cmd_params *params)
|
|
|
{
|
|
@@ -422,36 +457,38 @@ static void dwc3_free_trb_pool(struct dwc3_ep *dep)
|
|
|
static int dwc3_gadget_set_xfer_resource(struct dwc3 *dwc, struct dwc3_ep *dep);
|
|
|
|
|
|
/**
|
|
|
- * dwc3_gadget_start_config - Configure EP resources
|
|
|
+ * dwc3_gadget_start_config - configure ep resources
|
|
|
* @dwc: pointer to our controller context structure
|
|
|
* @dep: endpoint that is being enabled
|
|
|
*
|
|
|
- * The assignment of transfer resources cannot perfectly follow the
|
|
|
- * data book due to the fact that the controller driver does not have
|
|
|
- * all knowledge of the configuration in advance. It is given this
|
|
|
- * information piecemeal by the composite gadget framework after every
|
|
|
- * SET_CONFIGURATION and SET_INTERFACE. Trying to follow the databook
|
|
|
- * programming model in this scenario can cause errors. For two
|
|
|
- * reasons:
|
|
|
+ * Issue a %DWC3_DEPCMD_DEPSTARTCFG command to @dep. After the command's
|
|
|
+ * completion, it will set Transfer Resource for all available endpoints.
|
|
|
*
|
|
|
- * 1) The databook says to do DEPSTARTCFG for every SET_CONFIGURATION
|
|
|
- * and SET_INTERFACE (8.1.5). This is incorrect in the scenario of
|
|
|
- * multiple interfaces.
|
|
|
+ * The assignment of transfer resources cannot perfectly follow the data book
|
|
|
+ * due to the fact that the controller driver does not have all knowledge of the
|
|
|
+ * configuration in advance. It is given this information piecemeal by the
|
|
|
+ * composite gadget framework after every SET_CONFIGURATION and
|
|
|
+ * SET_INTERFACE. Trying to follow the databook programming model in this
|
|
|
+ * scenario can cause errors. For two reasons:
|
|
|
*
|
|
|
- * 2) The databook does not mention doing more DEPXFERCFG for new
|
|
|
+ * 1) The databook says to do %DWC3_DEPCMD_DEPSTARTCFG for every
|
|
|
+ * %USB_REQ_SET_CONFIGURATION and %USB_REQ_SET_INTERFACE (8.1.5). This is
|
|
|
+ * incorrect in the scenario of multiple interfaces.
|
|
|
+ *
|
|
|
+ * 2) The databook does not mention doing more %DWC3_DEPCMD_DEPXFERCFG for new
|
|
|
* endpoint on alt setting (8.1.6).
|
|
|
*
|
|
|
* The following simplified method is used instead:
|
|
|
*
|
|
|
- * All hardware endpoints can be assigned a transfer resource and this
|
|
|
- * setting will stay persistent until either a core reset or
|
|
|
- * hibernation. So whenever we do a DEPSTARTCFG(0) we can go ahead and
|
|
|
- * do DEPXFERCFG for every hardware endpoint as well. We are
|
|
|
+ * All hardware endpoints can be assigned a transfer resource and this setting
|
|
|
+ * will stay persistent until either a core reset or hibernation. So whenever we
|
|
|
+ * do a %DWC3_DEPCMD_DEPSTARTCFG(0) we can go ahead and do
|
|
|
+ * %DWC3_DEPCMD_DEPXFERCFG for every hardware endpoint as well. We are
|
|
|
* guaranteed that there are as many transfer resources as endpoints.
|
|
|
*
|
|
|
- * This function is called for each endpoint when it is being enabled
|
|
|
- * but is triggered only when called for EP0-out, which always happens
|
|
|
- * first, and which should only happen in one of the above conditions.
|
|
|
+ * This function is called for each endpoint when it is being enabled but is
|
|
|
+ * triggered only when called for EP0-out, which always happens first, and which
|
|
|
+ * should only happen in one of the above conditions.
|
|
|
*/
|
|
|
static int dwc3_gadget_start_config(struct dwc3 *dwc, struct dwc3_ep *dep)
|
|
|
{
|
|
@@ -569,11 +606,13 @@ static int dwc3_gadget_set_xfer_resource(struct dwc3 *dwc, struct dwc3_ep *dep)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * __dwc3_gadget_ep_enable - Initializes a HW endpoint
|
|
|
+ * __dwc3_gadget_ep_enable - initializes a hw endpoint
|
|
|
* @dep: endpoint to be initialized
|
|
|
- * @desc: USB Endpoint Descriptor
|
|
|
+ * @modify: if true, modify existing endpoint configuration
|
|
|
+ * @restore: if true, restore endpoint configuration from scratch buffer
|
|
|
*
|
|
|
- * Caller should take care of locking
|
|
|
+ * Caller should take care of locking. Execute all necessary commands to
|
|
|
+ * initialize a HW endpoint so it can be used by a gadget driver.
|
|
|
*/
|
|
|
static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep,
|
|
|
bool modify, bool restore)
|
|
@@ -685,11 +724,13 @@ static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * __dwc3_gadget_ep_disable - Disables a HW endpoint
|
|
|
+ * __dwc3_gadget_ep_disable - disables a hw endpoint
|
|
|
* @dep: the endpoint to disable
|
|
|
*
|
|
|
- * This function also removes requests which are currently processed ny the
|
|
|
- * hardware and those which are not yet scheduled.
|
|
|
+ * This function undoes what __dwc3_gadget_ep_enable did and also removes
|
|
|
+ * requests which are currently being processed by the hardware and those which
|
|
|
+ * are not yet scheduled.
|
|
|
+ *
|
|
|
* Caller should take care of locking.
|
|
|
*/
|
|
|
static int __dwc3_gadget_ep_disable(struct dwc3_ep *dep)
|
|
@@ -932,7 +973,7 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep,
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * dwc3_ep_prev_trb() - Returns the previous TRB in the ring
|
|
|
+ * dwc3_ep_prev_trb - returns the previous TRB in the ring
|
|
|
* @dep: The endpoint with the TRB ring
|
|
|
* @index: The index of the current TRB in the ring
|
|
|
*
|
|
@@ -1729,8 +1770,8 @@ static irqreturn_t dwc3_interrupt(int irq, void *_dwc);
|
|
|
static irqreturn_t dwc3_thread_interrupt(int irq, void *_dwc);
|
|
|
|
|
|
/**
|
|
|
- * dwc3_gadget_setup_nump - Calculate and initialize NUMP field of DCFG
|
|
|
- * dwc: pointer to our context structure
|
|
|
+ * dwc3_gadget_setup_nump - calculate and initialize NUMP field of %DWC3_DCFG
|
|
|
+ * @dwc: pointer to our context structure
|
|
|
*
|
|
|
* The following looks like complex but it's actually very simple. In order to
|
|
|
* calculate the number of packets we can burst at once on OUT transfers, we're
|
|
@@ -1789,7 +1830,7 @@ static int __dwc3_gadget_start(struct dwc3 *dwc)
|
|
|
reg = dwc3_readl(dwc->regs, DWC3_DCFG);
|
|
|
reg &= ~(DWC3_DCFG_SPEED_MASK);
|
|
|
|
|
|
- /**
|
|
|
+ /*
|
|
|
* WORKAROUND: DWC3 revision < 2.20a have an issue
|
|
|
* which would cause metastability state on Run/Stop
|
|
|
* bit if we try to force the IP to USB2-only mode.
|
|
@@ -2859,7 +2900,7 @@ static void dwc3_gadget_hibernation_interrupt(struct dwc3 *dwc,
|
|
|
{
|
|
|
unsigned int is_ss = evtinfo & BIT(4);
|
|
|
|
|
|
- /**
|
|
|
+ /*
|
|
|
* WORKAROUND: DWC3 revison 2.20a with hibernation support
|
|
|
* have a known issue which can cause USB CV TD.9.23 to fail
|
|
|
* randomly.
|
|
@@ -3089,7 +3130,7 @@ out:
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * dwc3_gadget_init - Initializes gadget related registers
|
|
|
+ * dwc3_gadget_init - initializes gadget related registers
|
|
|
* @dwc: pointer to our controller context structure
|
|
|
*
|
|
|
* Returns 0 on success otherwise negative errno.
|