usb: gadget: qdss: Add support for CI 2.0 gadget
QDSS function driver currently works only with DWC3
core which uses DBM APIs for bam2bam mode of opearation.
Allow this driver to work with CI gadget by determining
the type of gadget it is operating with (DWC3 or CI) at
runtime and then submit the usb_request accordingly.
Change-Id: I2f0ce4092e55c6d2cabbfcc74251637a540be61f
Signed-off-by: Manu Gautam <mgautam@codeaurora.org>
diff --git a/drivers/usb/gadget/u_qdss.c b/drivers/usb/gadget/u_qdss.c
index c468f0a..d227c62 100644
--- a/drivers/usb/gadget/u_qdss.c
+++ b/drivers/usb/gadget/u_qdss.c
@@ -30,6 +30,7 @@
{
struct usb_request *req = NULL;
struct f_qdss *qdss = data_ep->driver_data;
+ struct usb_gadget *gadget = qdss->cdev->gadget;
u32 sps_params = 0;
pr_debug("send_sps_req\n");
@@ -40,10 +41,16 @@
return -ENOMEM;
}
- req->length = 32*1024;
-
- sps_params = MSM_SPS_MODE | MSM_DISABLE_WB | MSM_INTERNAL_MEM |
- bam_info.usb_bam_pipe_idx;
+ if (gadget_is_dwc3(gadget)) {
+ req->length = 32*1024;
+ sps_params = MSM_SPS_MODE | MSM_DISABLE_WB | MSM_INTERNAL_MEM |
+ bam_info.usb_bam_pipe_idx;
+ } else {
+ /* non DWC3 BAM requires req->length to be 0 */
+ req->length = 0;
+ sps_params = (MSM_SPS_MODE | bam_info.usb_bam_pipe_idx |
+ MSM_VENDOR_ID) & ~MSM_IS_FINITE_TRANSFER;
+ }
req->udc_priv = sps_params;
qdss->endless_req = req;
if (usb_ep_queue(data_ep, req, GFP_ATOMIC)) {
@@ -94,25 +101,36 @@
int init_data(struct usb_ep *ep)
{
+ struct f_qdss *qdss = ep->driver_data;
+ struct usb_gadget *gadget = qdss->cdev->gadget;
int res = 0;
pr_debug("init_data\n");
- res = msm_ep_config(ep);
- if (res)
- pr_err("msm_ep_config failed\n");
+ if (gadget_is_dwc3(gadget)) {
+ res = msm_ep_config(ep);
+ if (res)
+ pr_err("msm_ep_config failed\n");
+ } else {
+ pr_debug("QDSS is used with non DWC3 core\n");
+ }
return res;
}
int uninit_data(struct usb_ep *ep)
{
+ struct f_qdss *qdss = ep->driver_data;
+ struct usb_gadget *gadget = qdss->cdev->gadget;
int res = 0;
pr_err("uninit_data\n");
- res = msm_ep_unconfig(ep);
- if (res)
- pr_err("msm_ep_config failed\n");
+ if (gadget_is_dwc3(gadget)) {
+ res = msm_ep_unconfig(ep);
+ if (res)
+ pr_err("msm_ep_config failed\n");
+ }
+
return res;
}