aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/gadget/fsl_usb2_udc.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2008-10-17 18:43:52 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-10-17 18:43:52 -0400
commit0cfd81031a26717fe14380d18275f8e217571615 (patch)
tree78a84e4cb97e7f45eb77dc0fbd8857a5dd717869 /drivers/usb/gadget/fsl_usb2_udc.c
parentf7ea4a4ba84f382e8eb143e435551de0feee5b4b (diff)
parent802f389a2cc6e2771b8de915ac241456d41eb79e (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6: (94 commits) USB: remove err() macro from more usb drivers USB: remove err() macro from usb misc drivers USB: remove err() macro from usb core code USB: remove err() macro from usb class drivers USB: remove use of err() in drivers/usb/serial USB: remove info() macro from usb mtd drivers USB: remove info() macro from usb input drivers USB: remove info() macro from usb network drivers USB: remove info() macro from remaining usb drivers USB: remove info() macro from usb/misc drivers USB: remove info() macro from usb/serial drivers USB: remove warn macro from HID core USB: remove warn() macro from usb drivers USB: remove warn() macro from usb net drivers USB: remove warn() macro from usb media drivers USB: remove warn() macro from usb input drivers usb/fsl_qe_udc: clear data toggle on clear halt request usb/fsl_qe_udc: fix response to get status request fsl_usb2_udc: Fix oops on probe failure. fsl_usb2_udc: Add a wmb before priming endpoint. ...
Diffstat (limited to 'drivers/usb/gadget/fsl_usb2_udc.c')
-rw-r--r--drivers/usb/gadget/fsl_usb2_udc.c176
1 files changed, 78 insertions, 98 deletions
diff --git a/drivers/usb/gadget/fsl_usb2_udc.c b/drivers/usb/gadget/fsl_usb2_udc.c
index 45ad556169f1..091bb55c9aa7 100644
--- a/drivers/usb/gadget/fsl_usb2_udc.c
+++ b/drivers/usb/gadget/fsl_usb2_udc.c
@@ -23,11 +23,8 @@
23#include <linux/ioport.h> 23#include <linux/ioport.h>
24#include <linux/types.h> 24#include <linux/types.h>
25#include <linux/errno.h> 25#include <linux/errno.h>
26#include <linux/delay.h>
27#include <linux/sched.h>
28#include <linux/slab.h> 26#include <linux/slab.h>
29#include <linux/init.h> 27#include <linux/init.h>
30#include <linux/timer.h>
31#include <linux/list.h> 28#include <linux/list.h>
32#include <linux/interrupt.h> 29#include <linux/interrupt.h>
33#include <linux/proc_fs.h> 30#include <linux/proc_fs.h>
@@ -44,11 +41,9 @@
44 41
45#include <asm/byteorder.h> 42#include <asm/byteorder.h>
46#include <asm/io.h> 43#include <asm/io.h>
47#include <asm/irq.h>
48#include <asm/system.h> 44#include <asm/system.h>
49#include <asm/unaligned.h> 45#include <asm/unaligned.h>
50#include <asm/dma.h> 46#include <asm/dma.h>
51#include <asm/cacheflush.h>
52 47
53#include "fsl_usb2_udc.h" 48#include "fsl_usb2_udc.h"
54 49
@@ -61,8 +56,8 @@
61static const char driver_name[] = "fsl-usb2-udc"; 56static const char driver_name[] = "fsl-usb2-udc";
62static const char driver_desc[] = DRIVER_DESC; 57static const char driver_desc[] = DRIVER_DESC;
63 58
64volatile static struct usb_dr_device *dr_regs = NULL; 59static struct usb_dr_device *dr_regs;
65volatile static struct usb_sys_interface *usb_sys_regs = NULL; 60static struct usb_sys_interface *usb_sys_regs;
66 61
67/* it is initialized in probe() */ 62/* it is initialized in probe() */
68static struct fsl_udc *udc_controller = NULL; 63static struct fsl_udc *udc_controller = NULL;
@@ -76,16 +71,14 @@ fsl_ep0_desc = {
76 .wMaxPacketSize = USB_MAX_CTRL_PAYLOAD, 71 .wMaxPacketSize = USB_MAX_CTRL_PAYLOAD,
77}; 72};
78 73
79static int fsl_udc_suspend(struct platform_device *pdev, pm_message_t state);
80static int fsl_udc_resume(struct platform_device *pdev);
81static void fsl_ep_fifo_flush(struct usb_ep *_ep); 74static void fsl_ep_fifo_flush(struct usb_ep *_ep);
82 75
83#ifdef CONFIG_PPC32 76#ifdef CONFIG_PPC32
84#define fsl_readl(addr) in_le32(addr) 77#define fsl_readl(addr) in_le32(addr)
85#define fsl_writel(addr, val32) out_le32(val32, addr) 78#define fsl_writel(val32, addr) out_le32(addr, val32)
86#else 79#else
87#define fsl_readl(addr) readl(addr) 80#define fsl_readl(addr) readl(addr)
88#define fsl_writel(addr, val32) writel(addr, val32) 81#define fsl_writel(val32, addr) writel(val32, addr)
89#endif 82#endif
90 83
91/******************************************************************** 84/********************************************************************
@@ -185,10 +178,6 @@ static int dr_controller_setup(struct fsl_udc *udc)
185 unsigned long timeout; 178 unsigned long timeout;
186#define FSL_UDC_RESET_TIMEOUT 1000 179#define FSL_UDC_RESET_TIMEOUT 1000
187 180
188 /* before here, make sure dr_regs has been initialized */
189 if (!udc)
190 return -EINVAL;
191
192 /* Stop and reset the usb controller */ 181 /* Stop and reset the usb controller */
193 tmp = fsl_readl(&dr_regs->usbcmd); 182 tmp = fsl_readl(&dr_regs->usbcmd);
194 tmp &= ~USB_CMD_RUN_STOP; 183 tmp &= ~USB_CMD_RUN_STOP;
@@ -202,7 +191,7 @@ static int dr_controller_setup(struct fsl_udc *udc)
202 timeout = jiffies + FSL_UDC_RESET_TIMEOUT; 191 timeout = jiffies + FSL_UDC_RESET_TIMEOUT;
203 while (fsl_readl(&dr_regs->usbcmd) & USB_CMD_CTRL_RESET) { 192 while (fsl_readl(&dr_regs->usbcmd) & USB_CMD_CTRL_RESET) {
204 if (time_after(jiffies, timeout)) { 193 if (time_after(jiffies, timeout)) {
205 ERR("udc reset timeout! \n"); 194 ERR("udc reset timeout!\n");
206 return -ETIMEDOUT; 195 return -ETIMEDOUT;
207 } 196 }
208 cpu_relax(); 197 cpu_relax();
@@ -315,7 +304,8 @@ static void dr_controller_stop(struct fsl_udc *udc)
315 return; 304 return;
316} 305}
317 306
318void dr_ep_setup(unsigned char ep_num, unsigned char dir, unsigned char ep_type) 307static void dr_ep_setup(unsigned char ep_num, unsigned char dir,
308 unsigned char ep_type)
319{ 309{
320 unsigned int tmp_epctrl = 0; 310 unsigned int tmp_epctrl = 0;
321 311
@@ -563,7 +553,7 @@ static int fsl_ep_disable(struct usb_ep *_ep)
563 /* nuke all pending requests (does flush) */ 553 /* nuke all pending requests (does flush) */
564 nuke(ep, -ESHUTDOWN); 554 nuke(ep, -ESHUTDOWN);
565 555
566 ep->desc = 0; 556 ep->desc = NULL;
567 ep->stopped = 1; 557 ep->stopped = 1;
568 spin_unlock_irqrestore(&udc->lock, flags); 558 spin_unlock_irqrestore(&udc->lock, flags);
569 559
@@ -602,7 +592,7 @@ static void fsl_free_request(struct usb_ep *_ep, struct usb_request *_req)
602} 592}
603 593
604/*-------------------------------------------------------------------------*/ 594/*-------------------------------------------------------------------------*/
605static int fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req) 595static void fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req)
606{ 596{
607 int i = ep_index(ep) * 2 + ep_is_in(ep); 597 int i = ep_index(ep) * 2 + ep_is_in(ep);
608 u32 temp, bitmask, tmp_stat; 598 u32 temp, bitmask, tmp_stat;
@@ -653,13 +643,16 @@ static int fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req)
653 | EP_QUEUE_HEAD_STATUS_HALT)); 643 | EP_QUEUE_HEAD_STATUS_HALT));
654 dQH->size_ioc_int_sts &= temp; 644 dQH->size_ioc_int_sts &= temp;
655 645
646 /* Ensure that updates to the QH will occure before priming. */
647 wmb();
648
656 /* Prime endpoint by writing 1 to ENDPTPRIME */ 649 /* Prime endpoint by writing 1 to ENDPTPRIME */
657 temp = ep_is_in(ep) 650 temp = ep_is_in(ep)
658 ? (1 << (ep_index(ep) + 16)) 651 ? (1 << (ep_index(ep) + 16))
659 : (1 << (ep_index(ep))); 652 : (1 << (ep_index(ep)));
660 fsl_writel(temp, &dr_regs->endpointprime); 653 fsl_writel(temp, &dr_regs->endpointprime);
661out: 654out:
662 return 0; 655 return;
663} 656}
664 657
665/* Fill in the dTD structure 658/* Fill in the dTD structure
@@ -710,7 +703,7 @@ static struct ep_td_struct *fsl_build_dtd(struct fsl_req *req, unsigned *length,
710 *is_last = 0; 703 *is_last = 0;
711 704
712 if ((*is_last) == 0) 705 if ((*is_last) == 0)
713 VDBG("multi-dtd request!\n"); 706 VDBG("multi-dtd request!");
714 /* Fill in the transfer size; set active bit */ 707 /* Fill in the transfer size; set active bit */
715 swap_temp = ((*length << DTD_LENGTH_BIT_POS) | DTD_STATUS_ACTIVE); 708 swap_temp = ((*length << DTD_LENGTH_BIT_POS) | DTD_STATUS_ACTIVE);
716 709
@@ -773,11 +766,11 @@ fsl_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags)
773 /* catch various bogus parameters */ 766 /* catch various bogus parameters */
774 if (!_req || !req->req.complete || !req->req.buf 767 if (!_req || !req->req.complete || !req->req.buf
775 || !list_empty(&req->queue)) { 768 || !list_empty(&req->queue)) {
776 VDBG("%s, bad params\n", __func__); 769 VDBG("%s, bad params", __func__);
777 return -EINVAL; 770 return -EINVAL;
778 } 771 }
779 if (unlikely(!_ep || !ep->desc)) { 772 if (unlikely(!_ep || !ep->desc)) {
780 VDBG("%s, bad ep\n", __func__); 773 VDBG("%s, bad ep", __func__);
781 return -EINVAL; 774 return -EINVAL;
782 } 775 }
783 if (ep->desc->bmAttributes == USB_ENDPOINT_XFER_ISOC) { 776 if (ep->desc->bmAttributes == USB_ENDPOINT_XFER_ISOC) {
@@ -1069,7 +1062,7 @@ static int fsl_vbus_session(struct usb_gadget *gadget, int is_active)
1069 1062
1070 udc = container_of(gadget, struct fsl_udc, gadget); 1063 udc = container_of(gadget, struct fsl_udc, gadget);
1071 spin_lock_irqsave(&udc->lock, flags); 1064 spin_lock_irqsave(&udc->lock, flags);
1072 VDBG("VBUS %s\n", is_active ? "on" : "off"); 1065 VDBG("VBUS %s", is_active ? "on" : "off");
1073 udc->vbus_active = (is_active != 0); 1066 udc->vbus_active = (is_active != 0);
1074 if (can_pullup(udc)) 1067 if (can_pullup(udc))
1075 fsl_writel((fsl_readl(&dr_regs->usbcmd) | USB_CMD_RUN_STOP), 1068 fsl_writel((fsl_readl(&dr_regs->usbcmd) | USB_CMD_RUN_STOP),
@@ -1146,7 +1139,6 @@ static int ep0_prime_status(struct fsl_udc *udc, int direction)
1146{ 1139{
1147 struct fsl_req *req = udc->status_req; 1140 struct fsl_req *req = udc->status_req;
1148 struct fsl_ep *ep; 1141 struct fsl_ep *ep;
1149 int status = 0;
1150 1142
1151 if (direction == EP_DIR_IN) 1143 if (direction == EP_DIR_IN)
1152 udc->ep0_dir = USB_DIR_IN; 1144 udc->ep0_dir = USB_DIR_IN;
@@ -1164,27 +1156,21 @@ static int ep0_prime_status(struct fsl_udc *udc, int direction)
1164 req->dtd_count = 0; 1156 req->dtd_count = 0;
1165 1157
1166 if (fsl_req_to_dtd(req) == 0) 1158 if (fsl_req_to_dtd(req) == 0)
1167 status = fsl_queue_td(ep, req); 1159 fsl_queue_td(ep, req);
1168 else 1160 else
1169 return -ENOMEM; 1161 return -ENOMEM;
1170 1162
1171 if (status)
1172 ERR("Can't queue ep0 status request \n");
1173 list_add_tail(&req->queue, &ep->queue); 1163 list_add_tail(&req->queue, &ep->queue);
1174 1164
1175 return status; 1165 return 0;
1176} 1166}
1177 1167
1178static inline int udc_reset_ep_queue(struct fsl_udc *udc, u8 pipe) 1168static void udc_reset_ep_queue(struct fsl_udc *udc, u8 pipe)
1179{ 1169{
1180 struct fsl_ep *ep = get_ep_by_pipe(udc, pipe); 1170 struct fsl_ep *ep = get_ep_by_pipe(udc, pipe);
1181 1171
1182 if (!ep->name) 1172 if (ep->name)
1183 return 0; 1173 nuke(ep, -ESHUTDOWN);
1184
1185 nuke(ep, -ESHUTDOWN);
1186
1187 return 0;
1188} 1174}
1189 1175
1190/* 1176/*
@@ -1208,10 +1194,8 @@ static void ch9getstatus(struct fsl_udc *udc, u8 request_type, u16 value,
1208 u16 index, u16 length) 1194 u16 index, u16 length)
1209{ 1195{
1210 u16 tmp = 0; /* Status, cpu endian */ 1196 u16 tmp = 0; /* Status, cpu endian */
1211
1212 struct fsl_req *req; 1197 struct fsl_req *req;
1213 struct fsl_ep *ep; 1198 struct fsl_ep *ep;
1214 int status = 0;
1215 1199
1216 ep = &udc->eps[0]; 1200 ep = &udc->eps[0];
1217 1201
@@ -1250,14 +1234,10 @@ static void ch9getstatus(struct fsl_udc *udc, u8 request_type, u16 value,
1250 1234
1251 /* prime the data phase */ 1235 /* prime the data phase */
1252 if ((fsl_req_to_dtd(req) == 0)) 1236 if ((fsl_req_to_dtd(req) == 0))
1253 status = fsl_queue_td(ep, req); 1237 fsl_queue_td(ep, req);
1254 else /* no mem */ 1238 else /* no mem */
1255 goto stall; 1239 goto stall;
1256 1240
1257 if (status) {
1258 ERR("Can't respond to getstatus request \n");
1259 goto stall;
1260 }
1261 list_add_tail(&req->queue, &ep->queue); 1241 list_add_tail(&req->queue, &ep->queue);
1262 udc->ep0_state = DATA_STATE_XMIT; 1242 udc->ep0_state = DATA_STATE_XMIT;
1263 return; 1243 return;
@@ -1397,7 +1377,7 @@ static void ep0_req_complete(struct fsl_udc *udc, struct fsl_ep *ep0,
1397 udc->ep0_state = WAIT_FOR_SETUP; 1377 udc->ep0_state = WAIT_FOR_SETUP;
1398 break; 1378 break;
1399 case WAIT_FOR_SETUP: 1379 case WAIT_FOR_SETUP:
1400 ERR("Unexpect ep0 packets \n"); 1380 ERR("Unexpect ep0 packets\n");
1401 break; 1381 break;
1402 default: 1382 default:
1403 ep0stall(udc); 1383 ep0stall(udc);
@@ -1476,7 +1456,7 @@ static int process_ep_req(struct fsl_udc *udc, int pipe,
1476 status = -EILSEQ; 1456 status = -EILSEQ;
1477 break; 1457 break;
1478 } else 1458 } else
1479 ERR("Unknown error has occured (0x%x)!\r\n", 1459 ERR("Unknown error has occured (0x%x)!\n",
1480 errors); 1460 errors);
1481 1461
1482 } else if (le32_to_cpu(curr_td->size_ioc_sts) 1462 } else if (le32_to_cpu(curr_td->size_ioc_sts)
@@ -1495,7 +1475,7 @@ static int process_ep_req(struct fsl_udc *udc, int pipe,
1495 } 1475 }
1496 } else { 1476 } else {
1497 td_complete++; 1477 td_complete++;
1498 VDBG("dTD transmitted successful "); 1478 VDBG("dTD transmitted successful");
1499 } 1479 }
1500 1480
1501 if (j != curr_req->dtd_count - 1) 1481 if (j != curr_req->dtd_count - 1)
@@ -1568,9 +1548,6 @@ static void port_change_irq(struct fsl_udc *udc)
1568{ 1548{
1569 u32 speed; 1549 u32 speed;
1570 1550
1571 if (udc->bus_reset)
1572 udc->bus_reset = 0;
1573
1574 /* Bus resetting is finished */ 1551 /* Bus resetting is finished */
1575 if (!(fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_RESET)) { 1552 if (!(fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_RESET)) {
1576 /* Get the speed */ 1553 /* Get the speed */
@@ -1678,8 +1655,6 @@ static void reset_irq(struct fsl_udc *udc)
1678 1655
1679 if (fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_RESET) { 1656 if (fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_RESET) {
1680 VDBG("Bus reset"); 1657 VDBG("Bus reset");
1681 /* Bus is reseting */
1682 udc->bus_reset = 1;
1683 /* Reset all the queues, include XD, dTD, EP queue 1658 /* Reset all the queues, include XD, dTD, EP queue
1684 * head and TR Queue */ 1659 * head and TR Queue */
1685 reset_queues(udc); 1660 reset_queues(udc);
@@ -1768,7 +1743,7 @@ static irqreturn_t fsl_udc_irq(int irq, void *_udc)
1768 } 1743 }
1769 1744
1770 if (irq_src & (USB_STS_ERR | USB_STS_SYS_ERR)) { 1745 if (irq_src & (USB_STS_ERR | USB_STS_SYS_ERR)) {
1771 VDBG("Error IRQ %x ", irq_src); 1746 VDBG("Error IRQ %x", irq_src);
1772 } 1747 }
1773 1748
1774 spin_unlock_irqrestore(&udc->lock, flags); 1749 spin_unlock_irqrestore(&udc->lock, flags);
@@ -1799,7 +1774,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
1799 /* lock is needed but whether should use this lock or another */ 1774 /* lock is needed but whether should use this lock or another */
1800 spin_lock_irqsave(&udc_controller->lock, flags); 1775 spin_lock_irqsave(&udc_controller->lock, flags);
1801 1776
1802 driver->driver.bus = 0; 1777 driver->driver.bus = NULL;
1803 /* hook up the driver */ 1778 /* hook up the driver */
1804 udc_controller->driver = driver; 1779 udc_controller->driver = driver;
1805 udc_controller->gadget.dev.driver = &driver->driver; 1780 udc_controller->gadget.dev.driver = &driver->driver;
@@ -1809,8 +1784,8 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
1809 retval = driver->bind(&udc_controller->gadget); 1784 retval = driver->bind(&udc_controller->gadget);
1810 if (retval) { 1785 if (retval) {
1811 VDBG("bind to %s --> %d", driver->driver.name, retval); 1786 VDBG("bind to %s --> %d", driver->driver.name, retval);
1812 udc_controller->gadget.dev.driver = 0; 1787 udc_controller->gadget.dev.driver = NULL;
1813 udc_controller->driver = 0; 1788 udc_controller->driver = NULL;
1814 goto out; 1789 goto out;
1815 } 1790 }
1816 1791
@@ -1819,12 +1794,12 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
1819 udc_controller->usb_state = USB_STATE_ATTACHED; 1794 udc_controller->usb_state = USB_STATE_ATTACHED;
1820 udc_controller->ep0_state = WAIT_FOR_SETUP; 1795 udc_controller->ep0_state = WAIT_FOR_SETUP;
1821 udc_controller->ep0_dir = 0; 1796 udc_controller->ep0_dir = 0;
1822 printk(KERN_INFO "%s: bind to driver %s \n", 1797 printk(KERN_INFO "%s: bind to driver %s\n",
1823 udc_controller->gadget.name, driver->driver.name); 1798 udc_controller->gadget.name, driver->driver.name);
1824 1799
1825out: 1800out:
1826 if (retval) 1801 if (retval)
1827 printk("retval %d \n", retval); 1802 printk("gadget driver register failed %d\n", retval);
1828 return retval; 1803 return retval;
1829} 1804}
1830EXPORT_SYMBOL(usb_gadget_register_driver); 1805EXPORT_SYMBOL(usb_gadget_register_driver);
@@ -1842,7 +1817,7 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
1842 return -EINVAL; 1817 return -EINVAL;
1843 1818
1844 if (udc_controller->transceiver) 1819 if (udc_controller->transceiver)
1845 (void)otg_set_peripheral(udc_controller->transceiver, 0); 1820 otg_set_peripheral(udc_controller->transceiver, NULL);
1846 1821
1847 /* stop DR, disable intr */ 1822 /* stop DR, disable intr */
1848 dr_controller_stop(udc_controller); 1823 dr_controller_stop(udc_controller);
@@ -1863,10 +1838,10 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
1863 1838
1864 /* unbind gadget and unhook driver. */ 1839 /* unbind gadget and unhook driver. */
1865 driver->unbind(&udc_controller->gadget); 1840 driver->unbind(&udc_controller->gadget);
1866 udc_controller->gadget.dev.driver = 0; 1841 udc_controller->gadget.dev.driver = NULL;
1867 udc_controller->driver = 0; 1842 udc_controller->driver = NULL;
1868 1843
1869 printk("unregistered gadget driver '%s'\r\n", driver->driver.name); 1844 printk("unregistered gadget driver '%s'\n", driver->driver.name);
1870 return 0; 1845 return 0;
1871} 1846}
1872EXPORT_SYMBOL(usb_gadget_unregister_driver); 1847EXPORT_SYMBOL(usb_gadget_unregister_driver);
@@ -1922,7 +1897,7 @@ static int fsl_proc_read(char *page, char **start, off_t off, int count,
1922 tmp_reg = fsl_readl(&dr_regs->usbsts); 1897 tmp_reg = fsl_readl(&dr_regs->usbsts);
1923 t = scnprintf(next, size, 1898 t = scnprintf(next, size,
1924 "USB Status Reg:\n" 1899 "USB Status Reg:\n"
1925 "Dr Suspend: %d" "Reset Received: %d" "System Error: %s" 1900 "Dr Suspend: %d Reset Received: %d System Error: %s "
1926 "USB Error Interrupt: %s\n\n", 1901 "USB Error Interrupt: %s\n\n",
1927 (tmp_reg & USB_STS_SUSPEND) ? 1 : 0, 1902 (tmp_reg & USB_STS_SUSPEND) ? 1 : 0,
1928 (tmp_reg & USB_STS_RESET) ? 1 : 0, 1903 (tmp_reg & USB_STS_RESET) ? 1 : 0,
@@ -1934,11 +1909,11 @@ static int fsl_proc_read(char *page, char **start, off_t off, int count,
1934 tmp_reg = fsl_readl(&dr_regs->usbintr); 1909 tmp_reg = fsl_readl(&dr_regs->usbintr);
1935 t = scnprintf(next, size, 1910 t = scnprintf(next, size,
1936 "USB Intrrupt Enable Reg:\n" 1911 "USB Intrrupt Enable Reg:\n"
1937 "Sleep Enable: %d" "SOF Received Enable: %d" 1912 "Sleep Enable: %d SOF Received Enable: %d "
1938 "Reset Enable: %d\n" 1913 "Reset Enable: %d\n"
1939 "System Error Enable: %d" 1914 "System Error Enable: %d "
1940 "Port Change Dectected Enable: %d\n" 1915 "Port Change Dectected Enable: %d\n"
1941 "USB Error Intr Enable: %d" "USB Intr Enable: %d\n\n", 1916 "USB Error Intr Enable: %d USB Intr Enable: %d\n\n",
1942 (tmp_reg & USB_INTR_DEVICE_SUSPEND) ? 1 : 0, 1917 (tmp_reg & USB_INTR_DEVICE_SUSPEND) ? 1 : 0,
1943 (tmp_reg & USB_INTR_SOF_EN) ? 1 : 0, 1918 (tmp_reg & USB_INTR_SOF_EN) ? 1 : 0,
1944 (tmp_reg & USB_INTR_RESET_EN) ? 1 : 0, 1919 (tmp_reg & USB_INTR_RESET_EN) ? 1 : 0,
@@ -1951,21 +1926,21 @@ static int fsl_proc_read(char *page, char **start, off_t off, int count,
1951 1926
1952 tmp_reg = fsl_readl(&dr_regs->frindex); 1927 tmp_reg = fsl_readl(&dr_regs->frindex);
1953 t = scnprintf(next, size, 1928 t = scnprintf(next, size,
1954 "USB Frame Index Reg:" "Frame Number is 0x%x\n\n", 1929 "USB Frame Index Reg: Frame Number is 0x%x\n\n",
1955 (tmp_reg & USB_FRINDEX_MASKS)); 1930 (tmp_reg & USB_FRINDEX_MASKS));
1956 size -= t; 1931 size -= t;
1957 next += t; 1932 next += t;
1958 1933
1959 tmp_reg = fsl_readl(&dr_regs->deviceaddr); 1934 tmp_reg = fsl_readl(&dr_regs->deviceaddr);
1960 t = scnprintf(next, size, 1935 t = scnprintf(next, size,
1961 "USB Device Address Reg:" "Device Addr is 0x%x\n\n", 1936 "USB Device Address Reg: Device Addr is 0x%x\n\n",
1962 (tmp_reg & USB_DEVICE_ADDRESS_MASK)); 1937 (tmp_reg & USB_DEVICE_ADDRESS_MASK));
1963 size -= t; 1938 size -= t;
1964 next += t; 1939 next += t;
1965 1940
1966 tmp_reg = fsl_readl(&dr_regs->endpointlistaddr); 1941 tmp_reg = fsl_readl(&dr_regs->endpointlistaddr);
1967 t = scnprintf(next, size, 1942 t = scnprintf(next, size,
1968 "USB Endpoint List Address Reg:" 1943 "USB Endpoint List Address Reg: "
1969 "Device Addr is 0x%x\n\n", 1944 "Device Addr is 0x%x\n\n",
1970 (tmp_reg & USB_EP_LIST_ADDRESS_MASK)); 1945 (tmp_reg & USB_EP_LIST_ADDRESS_MASK));
1971 size -= t; 1946 size -= t;
@@ -1974,11 +1949,12 @@ static int fsl_proc_read(char *page, char **start, off_t off, int count,
1974 tmp_reg = fsl_readl(&dr_regs->portsc1); 1949 tmp_reg = fsl_readl(&dr_regs->portsc1);
1975 t = scnprintf(next, size, 1950 t = scnprintf(next, size,
1976 "USB Port Status&Control Reg:\n" 1951 "USB Port Status&Control Reg:\n"
1977 "Port Transceiver Type : %s" "Port Speed: %s \n" 1952 "Port Transceiver Type : %s Port Speed: %s\n"
1978 "PHY Low Power Suspend: %s" "Port Reset: %s" 1953 "PHY Low Power Suspend: %s Port Reset: %s "
1979 "Port Suspend Mode: %s \n" "Over-current Change: %s" 1954 "Port Suspend Mode: %s\n"
1955 "Over-current Change: %s "
1980 "Port Enable/Disable Change: %s\n" 1956 "Port Enable/Disable Change: %s\n"
1981 "Port Enabled/Disabled: %s" 1957 "Port Enabled/Disabled: %s "
1982 "Current Connect Status: %s\n\n", ( { 1958 "Current Connect Status: %s\n\n", ( {
1983 char *s; 1959 char *s;
1984 switch (tmp_reg & PORTSCX_PTS_FSLS) { 1960 switch (tmp_reg & PORTSCX_PTS_FSLS) {
@@ -2023,7 +1999,7 @@ static int fsl_proc_read(char *page, char **start, off_t off, int count,
2023 1999
2024 tmp_reg = fsl_readl(&dr_regs->usbmode); 2000 tmp_reg = fsl_readl(&dr_regs->usbmode);
2025 t = scnprintf(next, size, 2001 t = scnprintf(next, size,
2026 "USB Mode Reg:" "Controller Mode is : %s\n\n", ( { 2002 "USB Mode Reg: Controller Mode is: %s\n\n", ( {
2027 char *s; 2003 char *s;
2028 switch (tmp_reg & USB_MODE_CTRL_MODE_HOST) { 2004 switch (tmp_reg & USB_MODE_CTRL_MODE_HOST) {
2029 case USB_MODE_CTRL_MODE_IDLE: 2005 case USB_MODE_CTRL_MODE_IDLE:
@@ -2042,7 +2018,7 @@ static int fsl_proc_read(char *page, char **start, off_t off, int count,
2042 2018
2043 tmp_reg = fsl_readl(&dr_regs->endptsetupstat); 2019 tmp_reg = fsl_readl(&dr_regs->endptsetupstat);
2044 t = scnprintf(next, size, 2020 t = scnprintf(next, size,
2045 "Endpoint Setup Status Reg:" "SETUP on ep 0x%x\n\n", 2021 "Endpoint Setup Status Reg: SETUP on ep 0x%x\n\n",
2046 (tmp_reg & EP_SETUP_STATUS_MASK)); 2022 (tmp_reg & EP_SETUP_STATUS_MASK));
2047 size -= t; 2023 size -= t;
2048 next += t; 2024 next += t;
@@ -2055,12 +2031,12 @@ static int fsl_proc_read(char *page, char **start, off_t off, int count,
2055 next += t; 2031 next += t;
2056 } 2032 }
2057 tmp_reg = fsl_readl(&dr_regs->endpointprime); 2033 tmp_reg = fsl_readl(&dr_regs->endpointprime);
2058 t = scnprintf(next, size, "EP Prime Reg = [0x%x]\n", tmp_reg); 2034 t = scnprintf(next, size, "EP Prime Reg = [0x%x]\n\n", tmp_reg);
2059 size -= t; 2035 size -= t;
2060 next += t; 2036 next += t;
2061 2037
2062 tmp_reg = usb_sys_regs->snoop1; 2038 tmp_reg = usb_sys_regs->snoop1;
2063 t = scnprintf(next, size, "\nSnoop1 Reg : = [0x%x]\n\n", tmp_reg); 2039 t = scnprintf(next, size, "Snoop1 Reg : = [0x%x]\n\n", tmp_reg);
2064 size -= t; 2040 size -= t;
2065 next += t; 2041 next += t;
2066 2042
@@ -2084,7 +2060,7 @@ static int fsl_proc_read(char *page, char **start, off_t off, int count,
2084 } else { 2060 } else {
2085 list_for_each_entry(req, &ep->queue, queue) { 2061 list_for_each_entry(req, &ep->queue, queue) {
2086 t = scnprintf(next, size, 2062 t = scnprintf(next, size,
2087 "req %p actual 0x%x length 0x%x buf %p\n", 2063 "req %p actual 0x%x length 0x%x buf %p\n",
2088 &req->req, req->req.actual, 2064 &req->req, req->req.actual,
2089 req->req.length, req->req.buf); 2065 req->req.length, req->req.buf);
2090 size -= t; 2066 size -= t;
@@ -2110,7 +2086,7 @@ static int fsl_proc_read(char *page, char **start, off_t off, int count,
2110 } else { 2086 } else {
2111 list_for_each_entry(req, &ep->queue, queue) { 2087 list_for_each_entry(req, &ep->queue, queue) {
2112 t = scnprintf(next, size, 2088 t = scnprintf(next, size,
2113 "req %p actual 0x%x length" 2089 "req %p actual 0x%x length "
2114 "0x%x buf %p\n", 2090 "0x%x buf %p\n",
2115 &req->req, req->req.actual, 2091 &req->req, req->req.actual,
2116 req->req.length, req->req.buf); 2092 req->req.length, req->req.buf);
@@ -2202,7 +2178,6 @@ static int __init struct_udc_setup(struct fsl_udc *udc,
2202 udc->usb_state = USB_STATE_POWERED; 2178 udc->usb_state = USB_STATE_POWERED;
2203 udc->ep0_dir = 0; 2179 udc->ep0_dir = 0;
2204 udc->remote_wakeup = 0; /* default to 0 on reset */ 2180 udc->remote_wakeup = 0; /* default to 0 on reset */
2205 spin_lock_init(&udc->lock);
2206 2181
2207 return 0; 2182 return 0;
2208} 2183}
@@ -2254,7 +2229,7 @@ static int __init fsl_udc_probe(struct platform_device *pdev)
2254 u32 dccparams; 2229 u32 dccparams;
2255 2230
2256 if (strcmp(pdev->name, driver_name)) { 2231 if (strcmp(pdev->name, driver_name)) {
2257 VDBG("Wrong device\n"); 2232 VDBG("Wrong device");
2258 return -ENODEV; 2233 return -ENODEV;
2259 } 2234 }
2260 2235
@@ -2264,23 +2239,26 @@ static int __init fsl_udc_probe(struct platform_device *pdev)
2264 return -ENOMEM; 2239 return -ENOMEM;
2265 } 2240 }
2266 2241
2242 spin_lock_init(&udc_controller->lock);
2243 udc_controller->stopped = 1;
2244
2267 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 2245 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2268 if (!res) { 2246 if (!res) {
2269 kfree(udc_controller); 2247 ret = -ENXIO;
2270 return -ENXIO; 2248 goto err_kfree;
2271 } 2249 }
2272 2250
2273 if (!request_mem_region(res->start, res->end - res->start + 1, 2251 if (!request_mem_region(res->start, res->end - res->start + 1,
2274 driver_name)) { 2252 driver_name)) {
2275 ERR("request mem region for %s failed \n", pdev->name); 2253 ERR("request mem region for %s failed\n", pdev->name);
2276 kfree(udc_controller); 2254 ret = -EBUSY;
2277 return -EBUSY; 2255 goto err_kfree;
2278 } 2256 }
2279 2257
2280 dr_regs = ioremap(res->start, res->end - res->start + 1); 2258 dr_regs = ioremap(res->start, res->end - res->start + 1);
2281 if (!dr_regs) { 2259 if (!dr_regs) {
2282 ret = -ENOMEM; 2260 ret = -ENOMEM;
2283 goto err1; 2261 goto err_release_mem_region;
2284 } 2262 }
2285 2263
2286 usb_sys_regs = (struct usb_sys_interface *) 2264 usb_sys_regs = (struct usb_sys_interface *)
@@ -2291,7 +2269,7 @@ static int __init fsl_udc_probe(struct platform_device *pdev)
2291 if (!(dccparams & DCCPARAMS_DC)) { 2269 if (!(dccparams & DCCPARAMS_DC)) {
2292 ERR("This SOC doesn't support device role\n"); 2270 ERR("This SOC doesn't support device role\n");
2293 ret = -ENODEV; 2271 ret = -ENODEV;
2294 goto err2; 2272 goto err_iounmap;
2295 } 2273 }
2296 /* Get max device endpoints */ 2274 /* Get max device endpoints */
2297 /* DEN is bidirectional ep number, max_ep doubles the number */ 2275 /* DEN is bidirectional ep number, max_ep doubles the number */
@@ -2300,22 +2278,22 @@ static int __init fsl_udc_probe(struct platform_device *pdev)
2300 udc_controller->irq = platform_get_irq(pdev, 0); 2278 udc_controller->irq = platform_get_irq(pdev, 0);
2301 if (!udc_controller->irq) { 2279 if (!udc_controller->irq) {
2302 ret = -ENODEV; 2280 ret = -ENODEV;
2303 goto err2; 2281 goto err_iounmap;
2304 } 2282 }
2305 2283
2306 ret = request_irq(udc_controller->irq, fsl_udc_irq, IRQF_SHARED, 2284 ret = request_irq(udc_controller->irq, fsl_udc_irq, IRQF_SHARED,
2307 driver_name, udc_controller); 2285 driver_name, udc_controller);
2308 if (ret != 0) { 2286 if (ret != 0) {
2309 ERR("cannot request irq %d err %d \n", 2287 ERR("cannot request irq %d err %d\n",
2310 udc_controller->irq, ret); 2288 udc_controller->irq, ret);
2311 goto err2; 2289 goto err_iounmap;
2312 } 2290 }
2313 2291
2314 /* Initialize the udc structure including QH member and other member */ 2292 /* Initialize the udc structure including QH member and other member */
2315 if (struct_udc_setup(udc_controller, pdev)) { 2293 if (struct_udc_setup(udc_controller, pdev)) {
2316 ERR("Can't initialize udc data structure\n"); 2294 ERR("Can't initialize udc data structure\n");
2317 ret = -ENOMEM; 2295 ret = -ENOMEM;
2318 goto err3; 2296 goto err_free_irq;
2319 } 2297 }
2320 2298
2321 /* initialize usb hw reg except for regs for EP, 2299 /* initialize usb hw reg except for regs for EP,
@@ -2336,7 +2314,7 @@ static int __init fsl_udc_probe(struct platform_device *pdev)
2336 udc_controller->gadget.dev.parent = &pdev->dev; 2314 udc_controller->gadget.dev.parent = &pdev->dev;
2337 ret = device_register(&udc_controller->gadget.dev); 2315 ret = device_register(&udc_controller->gadget.dev);
2338 if (ret < 0) 2316 if (ret < 0)
2339 goto err3; 2317 goto err_free_irq;
2340 2318
2341 /* setup QH and epctrl for ep0 */ 2319 /* setup QH and epctrl for ep0 */
2342 ep0_setup(udc_controller); 2320 ep0_setup(udc_controller);
@@ -2366,20 +2344,22 @@ static int __init fsl_udc_probe(struct platform_device *pdev)
2366 DTD_ALIGNMENT, UDC_DMA_BOUNDARY); 2344 DTD_ALIGNMENT, UDC_DMA_BOUNDARY);
2367 if (udc_controller->td_pool == NULL) { 2345 if (udc_controller->td_pool == NULL) {
2368 ret = -ENOMEM; 2346 ret = -ENOMEM;
2369 goto err4; 2347 goto err_unregister;
2370 } 2348 }
2371 create_proc_file(); 2349 create_proc_file();
2372 return 0; 2350 return 0;
2373 2351
2374err4: 2352err_unregister:
2375 device_unregister(&udc_controller->gadget.dev); 2353 device_unregister(&udc_controller->gadget.dev);
2376err3: 2354err_free_irq:
2377 free_irq(udc_controller->irq, udc_controller); 2355 free_irq(udc_controller->irq, udc_controller);
2378err2: 2356err_iounmap:
2379 iounmap(dr_regs); 2357 iounmap(dr_regs);
2380err1: 2358err_release_mem_region:
2381 release_mem_region(res->start, res->end - res->start + 1); 2359 release_mem_region(res->start, res->end - res->start + 1);
2360err_kfree:
2382 kfree(udc_controller); 2361 kfree(udc_controller);
2362 udc_controller = NULL;
2383 return ret; 2363 return ret;
2384} 2364}
2385 2365
@@ -2469,7 +2449,7 @@ module_init(udc_init);
2469static void __exit udc_exit(void) 2449static void __exit udc_exit(void)
2470{ 2450{
2471 platform_driver_unregister(&udc_driver); 2451 platform_driver_unregister(&udc_driver);
2472 printk("%s unregistered \n", driver_desc); 2452 printk("%s unregistered\n", driver_desc);
2473} 2453}
2474 2454
2475module_exit(udc_exit); 2455module_exit(udc_exit);