diff --git a/drivers/usb/gadget/msm72k_udc.c b/drivers/usb/gadget/msm72k_udc.c
index 9b0e697f972b391fc577eacbf8ddc4e90894541d..ac1b9ecb0de9b301de0bb3905a30f6e2d4ee09bd 100644
--- a/drivers/usb/gadget/msm72k_udc.c
+++ b/drivers/usb/gadget/msm72k_udc.c
@@ -54,6 +54,7 @@ static const char driver_name[] = "msm72k_udc";
 
 #define SETUP_BUF_SIZE      4096
 
+typedef void (*completion_func)(struct usb_ep *ep, struct usb_request *req);
 
 static const char *const ep_name[] = {
 	"ep0out", "ep1out", "ep2out", "ep3out",
@@ -73,9 +74,7 @@ struct msm_request {
 	struct usb_request req;
 
 	/* saved copy of req.complete */
-	void	(*gadget_complete)(struct usb_ep *ep,
-					struct usb_request *req);
-
+	completion_func gadget_complete;
 
 	struct usb_info *ui;
 	struct msm_request *next;
@@ -508,7 +507,7 @@ static void ep0_complete(struct usb_ep *ep, struct usb_request *req)
 	struct usb_info *ui = ept->ui;
 
 	req->complete = r->gadget_complete;
-	r->gadget_complete = 0;
+	r->gadget_complete = NULL;
 	if	(req->complete)
 		req->complete(&ui->ep0in.ep, req);
 }
@@ -516,6 +515,13 @@ static void ep0_complete(struct usb_ep *ep, struct usb_request *req)
 static void ep0_queue_ack_complete(struct usb_ep *ep, struct usb_request *req)
 {
 	struct msm_endpoint *ept = to_msm_endpoint(ep);
+	struct msm_request *r = to_msm_request(req);
+	completion_func gadget_complete = r->gadget_complete;
+
+	if (gadget_complete) {
+		r->gadget_complete = NULL;
+		gadget_complete(ep, req);
+	}
 
 	/* queue up the receive of the ACK response from the host */
 	if (req->status == 0) {
@@ -587,7 +593,7 @@ static void ep0_setup_send(struct usb_info *ui, unsigned length)
 
 	req->length = length;
 	req->complete = ep0_queue_ack_complete;
-	r->gadget_complete = 0;
+	r->gadget_complete = NULL;
 	usb_ept_queue_xfer(ept, req);
 }