aboutsummaryrefslogtreecommitdiffstats
path: root/usb
diff options
authorGreg Kroah-Hartman <gregkh@suse.de>2008-08-20 13:54:02 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2008-08-20 13:54:02 -0700
commit8e10a786c66b7c42a03f67e002c3772c73544516 (patch)
tree25883758a35bcba289517d23dc1dd95cafd122d1 /usb
parentc797690141696d65fc4d701a84bfd050ca861952 (diff)
downloadpatches-8e10a786c66b7c42a03f67e002c3772c73544516.tar.gz
uio and usb patch.
also fix up a warning in the dev_dbg() patch
Diffstat (limited to 'usb')
-rw-r--r--usb/fsl_usb2_udc-add-a-wmb-before-priming-endpoint.patch36
-rw-r--r--usb/fsl_usb2_udc-clean-up-whitespace-in-errors-and-warnings.patch177
-rw-r--r--usb/fsl_usb2_udc-clean-up-whitespace-in-proc-debugging-output.patch140
-rw-r--r--usb/fsl_usb2_udc-fix-oops-on-probe-failure.patch126
-rw-r--r--usb/fsl_usb2_udc-fix-some-sparse-warnings-and-remove-redundant-code.patch181
-rw-r--r--usb/fsl_usb2_udc-initialize-spinlock-earlier.patch41
-rw-r--r--usb/fsl_usb2_udc-make-dr_ep_setup-function-static.patch32
-rw-r--r--usb/fsl_usb2_udc-make-fsl_queue_td-return-type-void.patch95
-rw-r--r--usb/fsl_usb2_udc-remove-check-for-udc-null-in-dr_controller_setup.patch34
-rw-r--r--usb/fsl_usb2_udc-rename-the-arguments-of-the-fsl_writel-macro.patch43
-rw-r--r--usb/fsl_usb2_udc-uninline-udc_reset_ep_queue.patch43
11 files changed, 948 insertions, 0 deletions
diff --git a/usb/fsl_usb2_udc-add-a-wmb-before-priming-endpoint.patch b/usb/fsl_usb2_udc-add-a-wmb-before-priming-endpoint.patch
new file mode 100644
index 00000000000000..6bf78f6a0bda68
--- /dev/null
+++ b/usb/fsl_usb2_udc-add-a-wmb-before-priming-endpoint.patch
@@ -0,0 +1,36 @@
+From will.newton@imgtec.com Wed Aug 20 13:42:22 2008
+From: Will Newton <will.newton@imgtec.com>
+Date: Tue, 12 Aug 2008 15:39:16 +0100
+Subject: fsl_usb2_udc: Add a wmb before priming endpoint.
+To: gregkh@suse.de
+Cc: linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, leoli@freescale.com, Will Newton <will.newton@gmail.com>
+Message-ID: <1218551957-17091-11-git-send-email-will.newton@imgtec.com>
+
+
+From: Will Newton <will.newton@gmail.com>
+
+Add a wmb to fsl_queue_td before priming the endpoint. This ensures that the
+modifications to the QH are seen by the hardware.
+
+Added comment as suggested by Felipe Balbi.
+
+Signed-off-by: Will Newton <will.newton@gmail.com>
+Acked-by: Li Yang <leoli@freescale.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/gadget/fsl_usb2_udc.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/drivers/usb/gadget/fsl_usb2_udc.c
++++ b/drivers/usb/gadget/fsl_usb2_udc.c
+@@ -643,6 +643,9 @@ static void fsl_queue_td(struct fsl_ep *
+ | EP_QUEUE_HEAD_STATUS_HALT));
+ dQH->size_ioc_int_sts &= temp;
+
++ /* Ensure that updates to the QH will occure before priming. */
++ wmb();
++
+ /* Prime endpoint by writing 1 to ENDPTPRIME */
+ temp = ep_is_in(ep)
+ ? (1 << (ep_index(ep) + 16))
diff --git a/usb/fsl_usb2_udc-clean-up-whitespace-in-errors-and-warnings.patch b/usb/fsl_usb2_udc-clean-up-whitespace-in-errors-and-warnings.patch
new file mode 100644
index 00000000000000..b325ff565ac5d9
--- /dev/null
+++ b/usb/fsl_usb2_udc-clean-up-whitespace-in-errors-and-warnings.patch
@@ -0,0 +1,177 @@
+From will.newton@imgtec.com Wed Aug 20 13:40:06 2008
+From: Will Newton <will.newton@imgtec.com>
+Date: Tue, 12 Aug 2008 15:39:10 +0100
+Subject: fsl_usb2_udc: Clean up whitespace in errors and warnings.
+To: gregkh@suse.de
+Cc: linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, leoli@freescale.com, Will Newton <will.newton@imgtec.com>
+Message-ID: <1218551957-17091-5-git-send-email-will.newton@imgtec.com>
+
+From: Will Newton <will.newton@imgtec.com>
+
+VDBG always outputs a trailing \n.
+
+Signed-off-by: Will Newton <will.newton@gmail.com>
+Acked-by: Li Yang <leoli@freescale.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/gadget/fsl_usb2_udc.c | 36 ++++++++++++++++++------------------
+ 1 file changed, 18 insertions(+), 18 deletions(-)
+
+--- a/drivers/usb/gadget/fsl_usb2_udc.c
++++ b/drivers/usb/gadget/fsl_usb2_udc.c
+@@ -193,7 +193,7 @@ static int dr_controller_setup(struct fs
+ timeout = jiffies + FSL_UDC_RESET_TIMEOUT;
+ while (fsl_readl(&dr_regs->usbcmd) & USB_CMD_CTRL_RESET) {
+ if (time_after(jiffies, timeout)) {
+- ERR("udc reset timeout! \n");
++ ERR("udc reset timeout!\n");
+ return -ETIMEDOUT;
+ }
+ cpu_relax();
+@@ -702,7 +702,7 @@ static struct ep_td_struct *fsl_build_dt
+ *is_last = 0;
+
+ if ((*is_last) == 0)
+- VDBG("multi-dtd request!\n");
++ VDBG("multi-dtd request!");
+ /* Fill in the transfer size; set active bit */
+ swap_temp = ((*length << DTD_LENGTH_BIT_POS) | DTD_STATUS_ACTIVE);
+
+@@ -765,11 +765,11 @@ fsl_ep_queue(struct usb_ep *_ep, struct
+ /* catch various bogus parameters */
+ if (!_req || !req->req.complete || !req->req.buf
+ || !list_empty(&req->queue)) {
+- VDBG("%s, bad params\n", __func__);
++ VDBG("%s, bad params", __func__);
+ return -EINVAL;
+ }
+ if (unlikely(!_ep || !ep->desc)) {
+- VDBG("%s, bad ep\n", __func__);
++ VDBG("%s, bad ep", __func__);
+ return -EINVAL;
+ }
+ if (ep->desc->bmAttributes == USB_ENDPOINT_XFER_ISOC) {
+@@ -1061,7 +1061,7 @@ static int fsl_vbus_session(struct usb_g
+
+ udc = container_of(gadget, struct fsl_udc, gadget);
+ spin_lock_irqsave(&udc->lock, flags);
+- VDBG("VBUS %s\n", is_active ? "on" : "off");
++ VDBG("VBUS %s", is_active ? "on" : "off");
+ udc->vbus_active = (is_active != 0);
+ if (can_pullup(udc))
+ fsl_writel((fsl_readl(&dr_regs->usbcmd) | USB_CMD_RUN_STOP),
+@@ -1161,7 +1161,7 @@ static int ep0_prime_status(struct fsl_u
+ return -ENOMEM;
+
+ if (status)
+- ERR("Can't queue ep0 status request \n");
++ ERR("Can't queue ep0 status request\n");
+ list_add_tail(&req->queue, &ep->queue);
+
+ return status;
+@@ -1247,7 +1247,7 @@ static void ch9getstatus(struct fsl_udc
+ goto stall;
+
+ if (status) {
+- ERR("Can't respond to getstatus request \n");
++ ERR("Can't respond to getstatus request\n");
+ goto stall;
+ }
+ list_add_tail(&req->queue, &ep->queue);
+@@ -1389,7 +1389,7 @@ static void ep0_req_complete(struct fsl_
+ udc->ep0_state = WAIT_FOR_SETUP;
+ break;
+ case WAIT_FOR_SETUP:
+- ERR("Unexpect ep0 packets \n");
++ ERR("Unexpect ep0 packets\n");
+ break;
+ default:
+ ep0stall(udc);
+@@ -1468,7 +1468,7 @@ static int process_ep_req(struct fsl_udc
+ status = -EILSEQ;
+ break;
+ } else
+- ERR("Unknown error has occured (0x%x)!\r\n",
++ ERR("Unknown error has occured (0x%x)!\n",
+ errors);
+
+ } else if (le32_to_cpu(curr_td->size_ioc_sts)
+@@ -1487,7 +1487,7 @@ static int process_ep_req(struct fsl_udc
+ }
+ } else {
+ td_complete++;
+- VDBG("dTD transmitted successful ");
++ VDBG("dTD transmitted successful");
+ }
+
+ if (j != curr_req->dtd_count - 1)
+@@ -1755,7 +1755,7 @@ static irqreturn_t fsl_udc_irq(int irq,
+ }
+
+ if (irq_src & (USB_STS_ERR | USB_STS_SYS_ERR)) {
+- VDBG("Error IRQ %x ", irq_src);
++ VDBG("Error IRQ %x", irq_src);
+ }
+
+ spin_unlock_irqrestore(&udc->lock, flags);
+@@ -1806,12 +1806,12 @@ int usb_gadget_register_driver(struct us
+ udc_controller->usb_state = USB_STATE_ATTACHED;
+ udc_controller->ep0_state = WAIT_FOR_SETUP;
+ udc_controller->ep0_dir = 0;
+- printk(KERN_INFO "%s: bind to driver %s \n",
++ printk(KERN_INFO "%s: bind to driver %s\n",
+ udc_controller->gadget.name, driver->driver.name);
+
+ out:
+ if (retval)
+- printk("retval %d \n", retval);
++ printk("gadget driver register failed %d\n", retval);
+ return retval;
+ }
+ EXPORT_SYMBOL(usb_gadget_register_driver);
+@@ -1853,7 +1853,7 @@ int usb_gadget_unregister_driver(struct
+ udc_controller->gadget.dev.driver = NULL;
+ udc_controller->driver = NULL;
+
+- printk("unregistered gadget driver '%s'\r\n", driver->driver.name);
++ printk("unregistered gadget driver '%s'\n", driver->driver.name);
+ return 0;
+ }
+ EXPORT_SYMBOL(usb_gadget_unregister_driver);
+@@ -2241,7 +2241,7 @@ static int __init fsl_udc_probe(struct p
+ u32 dccparams;
+
+ if (strcmp(pdev->name, driver_name)) {
+- VDBG("Wrong device\n");
++ VDBG("Wrong device");
+ return -ENODEV;
+ }
+
+@@ -2259,7 +2259,7 @@ static int __init fsl_udc_probe(struct p
+
+ if (!request_mem_region(res->start, res->end - res->start + 1,
+ driver_name)) {
+- ERR("request mem region for %s failed \n", pdev->name);
++ ERR("request mem region for %s failed\n", pdev->name);
+ kfree(udc_controller);
+ return -EBUSY;
+ }
+@@ -2293,7 +2293,7 @@ static int __init fsl_udc_probe(struct p
+ ret = request_irq(udc_controller->irq, fsl_udc_irq, IRQF_SHARED,
+ driver_name, udc_controller);
+ if (ret != 0) {
+- ERR("cannot request irq %d err %d \n",
++ ERR("cannot request irq %d err %d\n",
+ udc_controller->irq, ret);
+ goto err2;
+ }
+@@ -2456,7 +2456,7 @@ module_init(udc_init);
+ static void __exit udc_exit(void)
+ {
+ platform_driver_unregister(&udc_driver);
+- printk("%s unregistered \n", driver_desc);
++ printk("%s unregistered\n", driver_desc);
+ }
+
+ module_exit(udc_exit);
diff --git a/usb/fsl_usb2_udc-clean-up-whitespace-in-proc-debugging-output.patch b/usb/fsl_usb2_udc-clean-up-whitespace-in-proc-debugging-output.patch
new file mode 100644
index 00000000000000..37cd876fb047bd
--- /dev/null
+++ b/usb/fsl_usb2_udc-clean-up-whitespace-in-proc-debugging-output.patch
@@ -0,0 +1,140 @@
+From will.newton@imgtec.com Wed Aug 20 13:40:25 2008
+From: Will Newton <will.newton@imgtec.com>
+Date: Tue, 12 Aug 2008 15:39:11 +0100
+Subject: fsl_usb2_udc: Clean up whitespace in /proc debugging output.
+To: gregkh@suse.de
+Cc: linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, leoli@freescale.com, Will Newton <will.newton@imgtec.com>
+Message-ID: <1218551957-17091-6-git-send-email-will.newton@imgtec.com>
+
+From: Will Newton <will.newton@imgtec.com>
+
+Missing spaces were causing the /proc debugging output to be rather
+unreadable.
+
+Signed-off-by: Will Newton <will.newton@gmail.com>
+Acked-by: Li Yang <leoli@freescale.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/gadget/fsl_usb2_udc.c | 35 ++++++++++++++++++-----------------
+ 1 file changed, 18 insertions(+), 17 deletions(-)
+
+--- a/drivers/usb/gadget/fsl_usb2_udc.c
++++ b/drivers/usb/gadget/fsl_usb2_udc.c
+@@ -1909,7 +1909,7 @@ static int fsl_proc_read(char *page, cha
+ tmp_reg = fsl_readl(&dr_regs->usbsts);
+ t = scnprintf(next, size,
+ "USB Status Reg:\n"
+- "Dr Suspend: %d" "Reset Received: %d" "System Error: %s"
++ "Dr Suspend: %d Reset Received: %d System Error: %s "
+ "USB Error Interrupt: %s\n\n",
+ (tmp_reg & USB_STS_SUSPEND) ? 1 : 0,
+ (tmp_reg & USB_STS_RESET) ? 1 : 0,
+@@ -1921,11 +1921,11 @@ static int fsl_proc_read(char *page, cha
+ tmp_reg = fsl_readl(&dr_regs->usbintr);
+ t = scnprintf(next, size,
+ "USB Intrrupt Enable Reg:\n"
+- "Sleep Enable: %d" "SOF Received Enable: %d"
++ "Sleep Enable: %d SOF Received Enable: %d "
+ "Reset Enable: %d\n"
+- "System Error Enable: %d"
++ "System Error Enable: %d "
+ "Port Change Dectected Enable: %d\n"
+- "USB Error Intr Enable: %d" "USB Intr Enable: %d\n\n",
++ "USB Error Intr Enable: %d USB Intr Enable: %d\n\n",
+ (tmp_reg & USB_INTR_DEVICE_SUSPEND) ? 1 : 0,
+ (tmp_reg & USB_INTR_SOF_EN) ? 1 : 0,
+ (tmp_reg & USB_INTR_RESET_EN) ? 1 : 0,
+@@ -1938,21 +1938,21 @@ static int fsl_proc_read(char *page, cha
+
+ tmp_reg = fsl_readl(&dr_regs->frindex);
+ t = scnprintf(next, size,
+- "USB Frame Index Reg:" "Frame Number is 0x%x\n\n",
++ "USB Frame Index Reg: Frame Number is 0x%x\n\n",
+ (tmp_reg & USB_FRINDEX_MASKS));
+ size -= t;
+ next += t;
+
+ tmp_reg = fsl_readl(&dr_regs->deviceaddr);
+ t = scnprintf(next, size,
+- "USB Device Address Reg:" "Device Addr is 0x%x\n\n",
++ "USB Device Address Reg: Device Addr is 0x%x\n\n",
+ (tmp_reg & USB_DEVICE_ADDRESS_MASK));
+ size -= t;
+ next += t;
+
+ tmp_reg = fsl_readl(&dr_regs->endpointlistaddr);
+ t = scnprintf(next, size,
+- "USB Endpoint List Address Reg:"
++ "USB Endpoint List Address Reg: "
+ "Device Addr is 0x%x\n\n",
+ (tmp_reg & USB_EP_LIST_ADDRESS_MASK));
+ size -= t;
+@@ -1961,11 +1961,12 @@ static int fsl_proc_read(char *page, cha
+ tmp_reg = fsl_readl(&dr_regs->portsc1);
+ t = scnprintf(next, size,
+ "USB Port Status&Control Reg:\n"
+- "Port Transceiver Type : %s" "Port Speed: %s \n"
+- "PHY Low Power Suspend: %s" "Port Reset: %s"
+- "Port Suspend Mode: %s \n" "Over-current Change: %s"
++ "Port Transceiver Type : %s Port Speed: %s\n"
++ "PHY Low Power Suspend: %s Port Reset: %s "
++ "Port Suspend Mode: %s\n"
++ "Over-current Change: %s "
+ "Port Enable/Disable Change: %s\n"
+- "Port Enabled/Disabled: %s"
++ "Port Enabled/Disabled: %s "
+ "Current Connect Status: %s\n\n", ( {
+ char *s;
+ switch (tmp_reg & PORTSCX_PTS_FSLS) {
+@@ -2010,7 +2011,7 @@ static int fsl_proc_read(char *page, cha
+
+ tmp_reg = fsl_readl(&dr_regs->usbmode);
+ t = scnprintf(next, size,
+- "USB Mode Reg:" "Controller Mode is : %s\n\n", ( {
++ "USB Mode Reg: Controller Mode is: %s\n\n", ( {
+ char *s;
+ switch (tmp_reg & USB_MODE_CTRL_MODE_HOST) {
+ case USB_MODE_CTRL_MODE_IDLE:
+@@ -2029,7 +2030,7 @@ static int fsl_proc_read(char *page, cha
+
+ tmp_reg = fsl_readl(&dr_regs->endptsetupstat);
+ t = scnprintf(next, size,
+- "Endpoint Setup Status Reg:" "SETUP on ep 0x%x\n\n",
++ "Endpoint Setup Status Reg: SETUP on ep 0x%x\n\n",
+ (tmp_reg & EP_SETUP_STATUS_MASK));
+ size -= t;
+ next += t;
+@@ -2042,12 +2043,12 @@ static int fsl_proc_read(char *page, cha
+ next += t;
+ }
+ tmp_reg = fsl_readl(&dr_regs->endpointprime);
+- t = scnprintf(next, size, "EP Prime Reg = [0x%x]\n", tmp_reg);
++ t = scnprintf(next, size, "EP Prime Reg = [0x%x]\n\n", tmp_reg);
+ size -= t;
+ next += t;
+
+ tmp_reg = usb_sys_regs->snoop1;
+- t = scnprintf(next, size, "\nSnoop1 Reg : = [0x%x]\n\n", tmp_reg);
++ t = scnprintf(next, size, "Snoop1 Reg : = [0x%x]\n\n", tmp_reg);
+ size -= t;
+ next += t;
+
+@@ -2071,7 +2072,7 @@ static int fsl_proc_read(char *page, cha
+ } else {
+ list_for_each_entry(req, &ep->queue, queue) {
+ t = scnprintf(next, size,
+- "req %p actual 0x%x length 0x%x buf %p\n",
++ "req %p actual 0x%x length 0x%x buf %p\n",
+ &req->req, req->req.actual,
+ req->req.length, req->req.buf);
+ size -= t;
+@@ -2097,7 +2098,7 @@ static int fsl_proc_read(char *page, cha
+ } else {
+ list_for_each_entry(req, &ep->queue, queue) {
+ t = scnprintf(next, size,
+- "req %p actual 0x%x length"
++ "req %p actual 0x%x length "
+ "0x%x buf %p\n",
+ &req->req, req->req.actual,
+ req->req.length, req->req.buf);
diff --git a/usb/fsl_usb2_udc-fix-oops-on-probe-failure.patch b/usb/fsl_usb2_udc-fix-oops-on-probe-failure.patch
new file mode 100644
index 00000000000000..09432500c64ae4
--- /dev/null
+++ b/usb/fsl_usb2_udc-fix-oops-on-probe-failure.patch
@@ -0,0 +1,126 @@
+From will.newton@imgtec.com Wed Aug 20 13:42:34 2008
+From: Will Newton <will.newton@imgtec.com>
+Date: Tue, 12 Aug 2008 15:39:17 +0100
+Subject: fsl_usb2_udc: Fix oops on probe failure.
+To: gregkh@suse.de
+Cc: linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, leoli@freescale.com, Will Newton <will.newton@gmail.com>
+Message-ID: <1218551957-17091-12-git-send-email-will.newton@imgtec.com>
+
+
+From: Will Newton <will.newton@gmail.com>
+
+In some circumstances when fsl_udc_probe fails udc_controller is freed but
+the pointer remains non-NULL. fsl_udc_remove will then try and teardown
+the partly initialized and freed controller structure resulting in an oops.
+This patch ensures udc_controller is either NULL or fully initialized after
+fsl_udc_probe.
+
+Signed-off-by: Will Newton <will.newton@gmail.com>
+Acked-by: Li Yang <leoli@freescale.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/gadget/fsl_usb2_udc.c | 32 +++++++++++++++++---------------
+ 1 file changed, 17 insertions(+), 15 deletions(-)
+
+--- a/drivers/usb/gadget/fsl_usb2_udc.c
++++ b/drivers/usb/gadget/fsl_usb2_udc.c
+@@ -2244,21 +2244,21 @@ static int __init fsl_udc_probe(struct p
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res) {
+- kfree(udc_controller);
+- return -ENXIO;
++ ret = -ENXIO;
++ goto err_kfree;
+ }
+
+ if (!request_mem_region(res->start, res->end - res->start + 1,
+ driver_name)) {
+ ERR("request mem region for %s failed\n", pdev->name);
+- kfree(udc_controller);
+- return -EBUSY;
++ ret = -EBUSY;
++ goto err_kfree;
+ }
+
+ dr_regs = ioremap(res->start, res->end - res->start + 1);
+ if (!dr_regs) {
+ ret = -ENOMEM;
+- goto err1;
++ goto err_release_mem_region;
+ }
+
+ usb_sys_regs = (struct usb_sys_interface *)
+@@ -2269,7 +2269,7 @@ static int __init fsl_udc_probe(struct p
+ if (!(dccparams & DCCPARAMS_DC)) {
+ ERR("This SOC doesn't support device role\n");
+ ret = -ENODEV;
+- goto err2;
++ goto err_iounmap;
+ }
+ /* Get max device endpoints */
+ /* DEN is bidirectional ep number, max_ep doubles the number */
+@@ -2278,7 +2278,7 @@ static int __init fsl_udc_probe(struct p
+ udc_controller->irq = platform_get_irq(pdev, 0);
+ if (!udc_controller->irq) {
+ ret = -ENODEV;
+- goto err2;
++ goto err_iounmap;
+ }
+
+ ret = request_irq(udc_controller->irq, fsl_udc_irq, IRQF_SHARED,
+@@ -2286,14 +2286,14 @@ static int __init fsl_udc_probe(struct p
+ if (ret != 0) {
+ ERR("cannot request irq %d err %d\n",
+ udc_controller->irq, ret);
+- goto err2;
++ goto err_iounmap;
+ }
+
+ /* Initialize the udc structure including QH member and other member */
+ if (struct_udc_setup(udc_controller, pdev)) {
+ ERR("Can't initialize udc data structure\n");
+ ret = -ENOMEM;
+- goto err3;
++ goto err_free_irq;
+ }
+
+ /* initialize usb hw reg except for regs for EP,
+@@ -2314,7 +2314,7 @@ static int __init fsl_udc_probe(struct p
+ udc_controller->gadget.dev.parent = &pdev->dev;
+ ret = device_register(&udc_controller->gadget.dev);
+ if (ret < 0)
+- goto err3;
++ goto err_free_irq;
+
+ /* setup QH and epctrl for ep0 */
+ ep0_setup(udc_controller);
+@@ -2344,20 +2344,22 @@ static int __init fsl_udc_probe(struct p
+ DTD_ALIGNMENT, UDC_DMA_BOUNDARY);
+ if (udc_controller->td_pool == NULL) {
+ ret = -ENOMEM;
+- goto err4;
++ goto err_unregister;
+ }
+ create_proc_file();
+ return 0;
+
+-err4:
++err_unregister:
+ device_unregister(&udc_controller->gadget.dev);
+-err3:
++err_free_irq:
+ free_irq(udc_controller->irq, udc_controller);
+-err2:
++err_iounmap:
+ iounmap(dr_regs);
+-err1:
++err_release_mem_region:
+ release_mem_region(res->start, res->end - res->start + 1);
++err_kfree:
+ kfree(udc_controller);
++ udc_controller = NULL;
+ return ret;
+ }
+
diff --git a/usb/fsl_usb2_udc-fix-some-sparse-warnings-and-remove-redundant-code.patch b/usb/fsl_usb2_udc-fix-some-sparse-warnings-and-remove-redundant-code.patch
new file mode 100644
index 00000000000000..23b109aa471be6
--- /dev/null
+++ b/usb/fsl_usb2_udc-fix-some-sparse-warnings-and-remove-redundant-code.patch
@@ -0,0 +1,181 @@
+From will.newton@imgtec.com Wed Aug 20 13:39:50 2008
+From: Will Newton <will.newton@imgtec.com>
+Date: Tue, 12 Aug 2008 15:39:09 +0100
+Subject: fsl_usb2_udc: Fix some sparse warnings and remove redundant code.
+To: gregkh@suse.de
+Cc: linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, leoli@freescale.com, Will Newton <will.newton@imgtec.com>
+Message-ID: <1218551957-17091-4-git-send-email-will.newton@imgtec.com>
+
+From: Will Newton <will.newton@imgtec.com>
+
+Fix some sparse "integer used as NULL pointer" warnings.
+Remove some unnecessary volatiles and static initialization.
+Remove some unused struct members and reorder to improve packing.
+Remove a few unneeded includes.
+
+Signed-off-by: Will Newton <will.newton@gmail.com>
+Acked-by: Li Yang <leoli@freescale.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/gadget/fsl_usb2_udc.c | 28 +++++++++-------------------
+ drivers/usb/gadget/fsl_usb2_udc.h | 21 ++-------------------
+ 2 files changed, 11 insertions(+), 38 deletions(-)
+
+--- a/drivers/usb/gadget/fsl_usb2_udc.c
++++ b/drivers/usb/gadget/fsl_usb2_udc.c
+@@ -23,11 +23,8 @@
+ #include <linux/ioport.h>
+ #include <linux/types.h>
+ #include <linux/errno.h>
+-#include <linux/delay.h>
+-#include <linux/sched.h>
+ #include <linux/slab.h>
+ #include <linux/init.h>
+-#include <linux/timer.h>
+ #include <linux/list.h>
+ #include <linux/interrupt.h>
+ #include <linux/proc_fs.h>
+@@ -44,11 +41,9 @@
+
+ #include <asm/byteorder.h>
+ #include <asm/io.h>
+-#include <asm/irq.h>
+ #include <asm/system.h>
+ #include <asm/unaligned.h>
+ #include <asm/dma.h>
+-#include <asm/cacheflush.h>
+
+ #include "fsl_usb2_udc.h"
+
+@@ -61,8 +56,8 @@
+ static const char driver_name[] = "fsl-usb2-udc";
+ static const char driver_desc[] = DRIVER_DESC;
+
+-volatile static struct usb_dr_device *dr_regs = NULL;
+-volatile static struct usb_sys_interface *usb_sys_regs = NULL;
++static struct usb_dr_device *dr_regs;
++static struct usb_sys_interface *usb_sys_regs;
+
+ /* it is initialized in probe() */
+ static struct fsl_udc *udc_controller = NULL;
+@@ -560,7 +555,7 @@ static int fsl_ep_disable(struct usb_ep
+ /* nuke all pending requests (does flush) */
+ nuke(ep, -ESHUTDOWN);
+
+- ep->desc = 0;
++ ep->desc = NULL;
+ ep->stopped = 1;
+ spin_unlock_irqrestore(&udc->lock, flags);
+
+@@ -1565,9 +1560,6 @@ static void port_change_irq(struct fsl_u
+ {
+ u32 speed;
+
+- if (udc->bus_reset)
+- udc->bus_reset = 0;
+-
+ /* Bus resetting is finished */
+ if (!(fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_RESET)) {
+ /* Get the speed */
+@@ -1675,8 +1667,6 @@ static void reset_irq(struct fsl_udc *ud
+
+ if (fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_RESET) {
+ VDBG("Bus reset");
+- /* Bus is reseting */
+- udc->bus_reset = 1;
+ /* Reset all the queues, include XD, dTD, EP queue
+ * head and TR Queue */
+ reset_queues(udc);
+@@ -1796,7 +1786,7 @@ int usb_gadget_register_driver(struct us
+ /* lock is needed but whether should use this lock or another */
+ spin_lock_irqsave(&udc_controller->lock, flags);
+
+- driver->driver.bus = 0;
++ driver->driver.bus = NULL;
+ /* hook up the driver */
+ udc_controller->driver = driver;
+ udc_controller->gadget.dev.driver = &driver->driver;
+@@ -1806,8 +1796,8 @@ int usb_gadget_register_driver(struct us
+ retval = driver->bind(&udc_controller->gadget);
+ if (retval) {
+ VDBG("bind to %s --> %d", driver->driver.name, retval);
+- udc_controller->gadget.dev.driver = 0;
+- udc_controller->driver = 0;
++ udc_controller->gadget.dev.driver = NULL;
++ udc_controller->driver = NULL;
+ goto out;
+ }
+
+@@ -1839,7 +1829,7 @@ int usb_gadget_unregister_driver(struct
+ return -EINVAL;
+
+ if (udc_controller->transceiver)
+- (void)otg_set_peripheral(udc_controller->transceiver, 0);
++ otg_set_peripheral(udc_controller->transceiver, NULL);
+
+ /* stop DR, disable intr */
+ dr_controller_stop(udc_controller);
+@@ -1860,8 +1850,8 @@ int usb_gadget_unregister_driver(struct
+
+ /* unbind gadget and unhook driver. */
+ driver->unbind(&udc_controller->gadget);
+- udc_controller->gadget.dev.driver = 0;
+- udc_controller->driver = 0;
++ udc_controller->gadget.dev.driver = NULL;
++ udc_controller->driver = NULL;
+
+ printk("unregistered gadget driver '%s'\r\n", driver->driver.name);
+ return 0;
+--- a/drivers/usb/gadget/fsl_usb2_udc.h
++++ b/drivers/usb/gadget/fsl_usb2_udc.h
+@@ -424,16 +424,6 @@ struct ep_td_struct {
+ /* Controller dma boundary */
+ #define UDC_DMA_BOUNDARY 0x1000
+
+-/* -----------------------------------------------------------------------*/
+-/* ##### enum data
+-*/
+-typedef enum {
+- e_ULPI,
+- e_UTMI_8BIT,
+- e_UTMI_16BIT,
+- e_SERIAL
+-} e_PhyInterface;
+-
+ /*-------------------------------------------------------------------------*/
+
+ /* ### driver private data
+@@ -469,9 +459,9 @@ struct fsl_ep {
+ #define EP_DIR_OUT 0
+
+ struct fsl_udc {
+-
+ struct usb_gadget gadget;
+ struct usb_gadget_driver *driver;
++ struct completion *done; /* to make sure release() is done */
+ struct fsl_ep *eps;
+ unsigned int max_ep;
+ unsigned int irq;
+@@ -492,20 +482,13 @@ struct fsl_udc {
+ size_t ep_qh_size; /* size after alignment adjustment*/
+ dma_addr_t ep_qh_dma; /* dma address of QH */
+
+- u32 max_pipes; /* Device max pipes */
+- u32 max_use_endpts; /* Max endpointes to be used */
+- u32 bus_reset; /* Device is bus reseting */
++ u32 max_pipes; /* Device max pipes */
+ u32 resume_state; /* USB state to resume */
+ u32 usb_state; /* USB current state */
+- u32 usb_next_state; /* USB next state */
+ u32 ep0_state; /* Endpoint zero state */
+ u32 ep0_dir; /* Endpoint zero direction: can be
+ USB_DIR_IN or USB_DIR_OUT */
+- u32 usb_sof_count; /* SOF count */
+- u32 errors; /* USB ERRORs count */
+ u8 device_address; /* Device USB address */
+-
+- struct completion *done; /* to make sure release() is done */
+ };
+
+ /*-------------------------------------------------------------------------*/
diff --git a/usb/fsl_usb2_udc-initialize-spinlock-earlier.patch b/usb/fsl_usb2_udc-initialize-spinlock-earlier.patch
new file mode 100644
index 00000000000000..d8b178ec8060df
--- /dev/null
+++ b/usb/fsl_usb2_udc-initialize-spinlock-earlier.patch
@@ -0,0 +1,41 @@
+From will.newton@imgtec.com Wed Aug 20 13:41:16 2008
+From: Will Newton <will.newton@imgtec.com>
+Date: Tue, 12 Aug 2008 15:39:12 +0100
+Subject: fsl_usb2_udc: Initialize spinlock earlier.
+To: gregkh@suse.de
+Cc: linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, leoli@freescale.com, Will Newton <will.newton@imgtec.com>
+Message-ID: <1218551957-17091-7-git-send-email-will.newton@imgtec.com>
+
+From: Will Newton <will.newton@imgtec.com>
+
+Move spinlock initialization earlier so we can turn shared irq handler
+debugging on safely.
+
+Signed-off-by: Will Newton <will.newton@gmail.com>
+Acked-by: Li Yang <leoli@freescale.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/gadget/fsl_usb2_udc.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+--- a/drivers/usb/gadget/fsl_usb2_udc.c
++++ b/drivers/usb/gadget/fsl_usb2_udc.c
+@@ -2190,7 +2190,6 @@ static int __init struct_udc_setup(struc
+ udc->usb_state = USB_STATE_POWERED;
+ udc->ep0_dir = 0;
+ udc->remote_wakeup = 0; /* default to 0 on reset */
+- spin_lock_init(&udc->lock);
+
+ return 0;
+ }
+@@ -2252,6 +2251,9 @@ static int __init fsl_udc_probe(struct p
+ return -ENOMEM;
+ }
+
++ spin_lock_init(&udc_controller->lock);
++ udc_controller->stopped = 1;
++
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res) {
+ kfree(udc_controller);
diff --git a/usb/fsl_usb2_udc-make-dr_ep_setup-function-static.patch b/usb/fsl_usb2_udc-make-dr_ep_setup-function-static.patch
new file mode 100644
index 00000000000000..936f6c0d13bd93
--- /dev/null
+++ b/usb/fsl_usb2_udc-make-dr_ep_setup-function-static.patch
@@ -0,0 +1,32 @@
+From will.newton@imgtec.com Wed Aug 20 13:39:06 2008
+From: Will Newton <will.newton@imgtec.com>
+Date: Tue, 12 Aug 2008 15:39:07 +0100
+Subject: fsl_usb2_udc: Make dr_ep_setup function static.
+To: gregkh@suse.de
+Cc: linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, leoli@freescale.com, Will Newton <will.newton@imgtec.com>
+Message-ID: <1218551957-17091-2-git-send-email-will.newton@imgtec.com>
+
+From: Will Newton <will.newton@imgtec.com>
+
+Make dr_ep_setup function static as it's never used outside this file.
+
+Signed-off-by: Will Newton <will.newton@gmail.com>
+Acked-by: Li Yang <leoli@freescale.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/gadget/fsl_usb2_udc.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/drivers/usb/gadget/fsl_usb2_udc.c
++++ b/drivers/usb/gadget/fsl_usb2_udc.c
+@@ -315,7 +315,8 @@ static void dr_controller_stop(struct fs
+ return;
+ }
+
+-void dr_ep_setup(unsigned char ep_num, unsigned char dir, unsigned char ep_type)
++static void dr_ep_setup(unsigned char ep_num, unsigned char dir,
++ unsigned char ep_type)
+ {
+ unsigned int tmp_epctrl = 0;
+
diff --git a/usb/fsl_usb2_udc-make-fsl_queue_td-return-type-void.patch b/usb/fsl_usb2_udc-make-fsl_queue_td-return-type-void.patch
new file mode 100644
index 00000000000000..0bb351d20b9e6f
--- /dev/null
+++ b/usb/fsl_usb2_udc-make-fsl_queue_td-return-type-void.patch
@@ -0,0 +1,95 @@
+From will.newton@imgtec.com Wed Aug 20 13:42:12 2008
+From: Will Newton <will.newton@imgtec.com>
+Date: Tue, 12 Aug 2008 15:39:15 +0100
+Subject: fsl_usb2_udc: Make fsl_queue_td return type void.
+To: gregkh@suse.de
+Cc: linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, leoli@freescale.com, Will Newton <will.newton@gmail.com>
+Message-ID: <1218551957-17091-10-git-send-email-will.newton@imgtec.com>
+
+
+From: Will Newton <will.newton@gmail.com>
+
+fsl_queue_td always returns 0. Make it void and remove checks for non-zero
+return in callers.
+
+Signed-off-by: Will Newton <will.newton@gmail.com>
+Acked-by: Li Yang <leoli@freescale.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/gadget/fsl_usb2_udc.c | 19 +++++--------------
+ 1 file changed, 5 insertions(+), 14 deletions(-)
+
+--- a/drivers/usb/gadget/fsl_usb2_udc.c
++++ b/drivers/usb/gadget/fsl_usb2_udc.c
+@@ -592,7 +592,7 @@ static void fsl_free_request(struct usb_
+ }
+
+ /*-------------------------------------------------------------------------*/
+-static int fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req)
++static void fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req)
+ {
+ int i = ep_index(ep) * 2 + ep_is_in(ep);
+ u32 temp, bitmask, tmp_stat;
+@@ -649,7 +649,7 @@ static int fsl_queue_td(struct fsl_ep *e
+ : (1 << (ep_index(ep)));
+ fsl_writel(temp, &dr_regs->endpointprime);
+ out:
+- return 0;
++ return;
+ }
+
+ /* Fill in the dTD structure
+@@ -1136,7 +1136,6 @@ static int ep0_prime_status(struct fsl_u
+ {
+ struct fsl_req *req = udc->status_req;
+ struct fsl_ep *ep;
+- int status = 0;
+
+ if (direction == EP_DIR_IN)
+ udc->ep0_dir = USB_DIR_IN;
+@@ -1154,15 +1153,13 @@ static int ep0_prime_status(struct fsl_u
+ req->dtd_count = 0;
+
+ if (fsl_req_to_dtd(req) == 0)
+- status = fsl_queue_td(ep, req);
++ fsl_queue_td(ep, req);
+ else
+ return -ENOMEM;
+
+- if (status)
+- ERR("Can't queue ep0 status request\n");
+ list_add_tail(&req->queue, &ep->queue);
+
+- return status;
++ return 0;
+ }
+
+ static void udc_reset_ep_queue(struct fsl_udc *udc, u8 pipe)
+@@ -1194,10 +1191,8 @@ static void ch9getstatus(struct fsl_udc
+ u16 index, u16 length)
+ {
+ u16 tmp = 0; /* Status, cpu endian */
+-
+ struct fsl_req *req;
+ struct fsl_ep *ep;
+- int status = 0;
+
+ ep = &udc->eps[0];
+
+@@ -1236,14 +1231,10 @@ static void ch9getstatus(struct fsl_udc
+
+ /* prime the data phase */
+ if ((fsl_req_to_dtd(req) == 0))
+- status = fsl_queue_td(ep, req);
++ fsl_queue_td(ep, req);
+ else /* no mem */
+ goto stall;
+
+- if (status) {
+- ERR("Can't respond to getstatus request\n");
+- goto stall;
+- }
+ list_add_tail(&req->queue, &ep->queue);
+ udc->ep0_state = DATA_STATE_XMIT;
+ return;
diff --git a/usb/fsl_usb2_udc-remove-check-for-udc-null-in-dr_controller_setup.patch b/usb/fsl_usb2_udc-remove-check-for-udc-null-in-dr_controller_setup.patch
new file mode 100644
index 00000000000000..132fa264603d25
--- /dev/null
+++ b/usb/fsl_usb2_udc-remove-check-for-udc-null-in-dr_controller_setup.patch
@@ -0,0 +1,34 @@
+From will.newton@imgtec.com Wed Aug 20 13:39:27 2008
+From: Will Newton <will.newton@imgtec.com>
+Date: Tue, 12 Aug 2008 15:39:08 +0100
+Subject: fsl_usb2_udc: Remove check for udc == NULL in dr_controller_setup.
+To: gregkh@suse.de
+Cc: linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, leoli@freescale.com, Will Newton <will.newton@imgtec.com>
+Message-ID: <1218551957-17091-3-git-send-email-will.newton@imgtec.com>
+
+From: Will Newton <will.newton@imgtec.com>
+
+Remove check for udc == NULL in dr_controller_setup. All callers of
+this function have already dereferenced udc at some point.
+
+Signed-off-by: Will Newton <will.newton@gmail.com>
+Acked-by: Li Yang <leoli@freescale.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/gadget/fsl_usb2_udc.c | 4 ----
+ 1 file changed, 4 deletions(-)
+
+--- a/drivers/usb/gadget/fsl_usb2_udc.c
++++ b/drivers/usb/gadget/fsl_usb2_udc.c
+@@ -185,10 +185,6 @@ static int dr_controller_setup(struct fs
+ unsigned long timeout;
+ #define FSL_UDC_RESET_TIMEOUT 1000
+
+- /* before here, make sure dr_regs has been initialized */
+- if (!udc)
+- return -EINVAL;
+-
+ /* Stop and reset the usb controller */
+ tmp = fsl_readl(&dr_regs->usbcmd);
+ tmp &= ~USB_CMD_RUN_STOP;
diff --git a/usb/fsl_usb2_udc-rename-the-arguments-of-the-fsl_writel-macro.patch b/usb/fsl_usb2_udc-rename-the-arguments-of-the-fsl_writel-macro.patch
new file mode 100644
index 00000000000000..8464f7b566b74c
--- /dev/null
+++ b/usb/fsl_usb2_udc-rename-the-arguments-of-the-fsl_writel-macro.patch
@@ -0,0 +1,43 @@
+From will.newton@imgtec.com Wed Aug 20 13:41:31 2008
+From: Will Newton <will.newton@imgtec.com>
+Date: Tue, 12 Aug 2008 15:39:13 +0100
+Subject: fsl_usb2_udc: Rename the arguments of the fsl_writel macro.
+To: gregkh@suse.de
+Cc: linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, leoli@freescale.com, Will Newton <will.newton@gmail.com>
+Message-ID: <1218551957-17091-8-git-send-email-will.newton@imgtec.com>
+
+
+From: Will Newton <will.newton@gmail.com>
+
+Rename the arguments of the fsl_writel macro to match their use.
+Remove a couple of unnecessary prototypes.
+
+Signed-off-by: Will Newton <will.newton@gmail.com>
+Acked-by: Li Yang <leoli@freescale.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/gadget/fsl_usb2_udc.c | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+--- a/drivers/usb/gadget/fsl_usb2_udc.c
++++ b/drivers/usb/gadget/fsl_usb2_udc.c
+@@ -71,16 +71,14 @@ fsl_ep0_desc = {
+ .wMaxPacketSize = USB_MAX_CTRL_PAYLOAD,
+ };
+
+-static int fsl_udc_suspend(struct platform_device *pdev, pm_message_t state);
+-static int fsl_udc_resume(struct platform_device *pdev);
+ static void fsl_ep_fifo_flush(struct usb_ep *_ep);
+
+ #ifdef CONFIG_PPC32
+ #define fsl_readl(addr) in_le32(addr)
+-#define fsl_writel(addr, val32) out_le32(val32, addr)
++#define fsl_writel(val32, addr) out_le32(addr, val32)
+ #else
+ #define fsl_readl(addr) readl(addr)
+-#define fsl_writel(addr, val32) writel(addr, val32)
++#define fsl_writel(val32, addr) writel(val32, addr)
+ #endif
+
+ /********************************************************************
diff --git a/usb/fsl_usb2_udc-uninline-udc_reset_ep_queue.patch b/usb/fsl_usb2_udc-uninline-udc_reset_ep_queue.patch
new file mode 100644
index 00000000000000..f1389ce628c8af
--- /dev/null
+++ b/usb/fsl_usb2_udc-uninline-udc_reset_ep_queue.patch
@@ -0,0 +1,43 @@
+From will.newton@imgtec.com Wed Aug 20 13:41:59 2008
+From: Will Newton <will.newton@imgtec.com>
+Date: Tue, 12 Aug 2008 15:39:14 +0100
+Subject: fsl_usb2_udc: Uninline udc_reset_ep_queue.
+To: gregkh@suse.de
+Cc: linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, leoli@freescale.com, Will Newton <will.newton@gmail.com>
+Message-ID: <1218551957-17091-9-git-send-email-will.newton@imgtec.com>
+
+
+From: Will Newton <will.newton@gmail.com>
+
+Uninline udc_reset_ep_queue and remove it's unused return value.
+
+Signed-off-by: Will Newton <will.newton@gmail.com>
+Acked-by: Li Yang <leoli@freescale.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/gadget/fsl_usb2_udc.c | 10 +++-------
+ 1 file changed, 3 insertions(+), 7 deletions(-)
+
+--- a/drivers/usb/gadget/fsl_usb2_udc.c
++++ b/drivers/usb/gadget/fsl_usb2_udc.c
+@@ -1165,16 +1165,12 @@ static int ep0_prime_status(struct fsl_u
+ return status;
+ }
+
+-static inline int udc_reset_ep_queue(struct fsl_udc *udc, u8 pipe)
++static void udc_reset_ep_queue(struct fsl_udc *udc, u8 pipe)
+ {
+ struct fsl_ep *ep = get_ep_by_pipe(udc, pipe);
+
+- if (!ep->name)
+- return 0;
+-
+- nuke(ep, -ESHUTDOWN);
+-
+- return 0;
++ if (ep->name)
++ nuke(ep, -ESHUTDOWN);
+ }
+
+ /*