diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c
index d41d07a..fd3787e 100644
--- a/drivers/usb/gadget/udc/core.c
+++ b/drivers/usb/gadget/udc/core.c
@@ -867,6 +867,7 @@ void usb_gadget_unmap_request(struct usb_gadget *gadget,
void usb_gadget_giveback_request(struct usb_ep *ep,
struct usb_request *req)
{
+pr_err("usb_gadget_giveback_request into\n");
if (likely(req->status == 0))
usb_led_activity(USB_LED_EVENT_GADGET);
diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
index 7653ea6..2affb1e 100644
--- a/include/linux/dma-mapping.h
+++ b/include/linux/dma-mapping.h
@@ -506,12 +506,14 @@ static inline void *dma_alloc_attrs(struct device *dev, size_t size,
static inline void *dma_alloc_attrs(struct device *dev, size_t size,
dma_addr_t *dma_handle, gfp_t flag,
unsigned long attrs)
{
const struct dma_map_ops *ops = get_dma_ops(dev);
void *cpu_addr;
BUG_ON(!ops);
+pr_err("dma_alloc_attrs into\n");
if (dma_alloc_from_dev_coherent(dev, size, dma_handle, &cpu_addr))
return cpu_addr;
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
index 7870d32..6045fa8 100644
--- a/drivers/usb/musb/musb_core.c
+++ b/drivers/usb/musb/musb_core.c
@@ -2254,8 +2254,7 @@ static void musb_deassert_reset(struct work_struct *work)
* the dma function in arm64, otherwise dma_alloc_coherent will failed.
*/
if (get_dma_ops(musb->controller) == get_dma_ops(NULL))
-// musb->controller->archdata.dma_ops = get_dma_ops(dev->parent);
- musb->controller->archdata.dev_dma_ops = get_dma_ops(dev->parent);
+ musb->controller->dma_ops = get_dma_ops(dev->parent);
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
index bc6d171..1a5c3a9 100644
--- a/drivers/usb/musb/musb_gadget.c
+++ b/drivers/usb/musb/musb_gadget.c
@@ -45,7 +45,9 @@
#include "musb_core.h"
#include "musb_trace.h"
-
+#ifdef CONFIG_USB_SPRD_DMA
+#include "sprd_musbhsdma.h"
+#endif
/* ----------------------------------------------------------------------- */
@@ -102,6 +104,7 @@ static inline void map_dma_buffer(struct musb_request *request,
: DMA_FROM_DEVICE);
request->map_state = PRE_MAPPED;
}
+ printk("%s %d 0x%p 0x%llx\n",__func__, __LINE__,request->request.buf,request->request.dma);
}
/* Unmap the buffer from dma and maps it back to cpu */
@@ -157,6 +160,9 @@ void musb_g_giveback(
req = to_musb_request(request);
+printk("%s req->request.buf:%p", __func__, req->request.buf);
+printk("%s req->request.buf:%s", __func__, (char *)req->request.buf);
+
list_del(&req->list);
if (req->request.status == -EINPROGRESS)
req->request.status = status;
@@ -165,8 +171,10 @@ void musb_g_giveback(
ep->busy = 1;
spin_unlock(&musb->lock);
- if (!dma_mapping_error(&musb->g.dev, request->dma))
+ if (!dma_mapping_error(musb->controller, request->dma)) {
+ printk("%s into unmap_dma_buffer\n", __func__);
unmap_dma_buffer(req, musb);
+ }
static int musb_ep_restart_resume_work(struct musb *musb, void *data)
@@ -1319,6 +1349,17 @@ static int musb_gadget_dequeue(struct usb_ep *ep, struct usb_request *request)
spin_lock_irqsave(&musb->lock, flags);
+ if (list_empty(&musb_ep->req_list)) {
+ if (musb_ep->dma) {
+ struct dma_controller *c = musb->dma_controller;
+
+ musb_ep_select(musb->mregs, musb_ep->current_epnum);
+ if (c->channel_abort)
+ status = c->channel_abort(musb_ep->dma);
+ goto done;
+ }
+ }
+
list_for_each_entry(r, &musb_ep->req_list, list) {
if (r == req)
break;
/* NOTE: this assumes we are sensing vbus; we'd rather
@@ -1800,6 +1868,19 @@ static int musb_gadget_start(struct usb_gadget *g,
list_add_tail(&ep->end_point.ep_list, &musb->g.ep_list);
}
+#ifdef CONFIG_USB_SPRD_DMA
+ if (epnum) {
+ ep->dma_linklist = dma_alloc_coherent(musb->controller,
+ sizeof(struct linklist_node_s) * LISTNODE_NUM,
+ &ep->list_dma_addr, GFP_KERNEL);
+
+pr_err("%s:%p,%llx\n",__func__, ep->dma_linklist, ep->list_dma_addr);
+
+ if (!ep->dma_linklist)
+ dev_err(musb->controller, "failed to allocate dma linklist\n");
+ }
+#endif
+
if (!epnum || hw_ep->is_shared_fifo) {
ep->end_point.caps.dir_in = true;
ep->end_point.caps.dir_out = true;