diff options
| author | Greg Kroah-Hartman <gregkh@suse.de> | 2008-08-20 13:54:02 -0700 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2008-08-20 13:54:02 -0700 |
| commit | 8e10a786c66b7c42a03f67e002c3772c73544516 (patch) | |
| tree | 25883758a35bcba289517d23dc1dd95cafd122d1 /usb | |
| parent | c797690141696d65fc4d701a84bfd050ca861952 (diff) | |
| download | patches-8e10a786c66b7c42a03f67e002c3772c73544516.tar.gz | |
uio and usb patch.
also fix up a warning in the dev_dbg() patch
Diffstat (limited to 'usb')
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); + } + + /* |
