diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-17 18:43:52 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-17 18:43:52 -0400 |
commit | 0cfd81031a26717fe14380d18275f8e217571615 (patch) | |
tree | 78a84e4cb97e7f45eb77dc0fbd8857a5dd717869 /drivers/usb/gadget/fsl_usb2_udc.c | |
parent | f7ea4a4ba84f382e8eb143e435551de0feee5b4b (diff) | |
parent | 802f389a2cc6e2771b8de915ac241456d41eb79e (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.c | 176 |
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 @@ | |||
61 | static const char driver_name[] = "fsl-usb2-udc"; | 56 | static const char driver_name[] = "fsl-usb2-udc"; |
62 | static const char driver_desc[] = DRIVER_DESC; | 57 | static const char driver_desc[] = DRIVER_DESC; |
63 | 58 | ||
64 | volatile static struct usb_dr_device *dr_regs = NULL; | 59 | static struct usb_dr_device *dr_regs; |
65 | volatile static struct usb_sys_interface *usb_sys_regs = NULL; | 60 | static struct usb_sys_interface *usb_sys_regs; |
66 | 61 | ||
67 | /* it is initialized in probe() */ | 62 | /* it is initialized in probe() */ |
68 | static struct fsl_udc *udc_controller = NULL; | 63 | static 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 | ||
79 | static int fsl_udc_suspend(struct platform_device *pdev, pm_message_t state); | ||
80 | static int fsl_udc_resume(struct platform_device *pdev); | ||
81 | static void fsl_ep_fifo_flush(struct usb_ep *_ep); | 74 | static 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 | ||
318 | void dr_ep_setup(unsigned char ep_num, unsigned char dir, unsigned char ep_type) | 307 | static 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 | /*-------------------------------------------------------------------------*/ |
605 | static int fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req) | 595 | static 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); |
661 | out: | 654 | out: |
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 | ||
1178 | static inline int udc_reset_ep_queue(struct fsl_udc *udc, u8 pipe) | 1168 | static 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 | ||
1825 | out: | 1800 | out: |
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 | } |
1830 | EXPORT_SYMBOL(usb_gadget_register_driver); | 1805 | EXPORT_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 | } |
1872 | EXPORT_SYMBOL(usb_gadget_unregister_driver); | 1847 | EXPORT_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 | ||
2374 | err4: | 2352 | err_unregister: |
2375 | device_unregister(&udc_controller->gadget.dev); | 2353 | device_unregister(&udc_controller->gadget.dev); |
2376 | err3: | 2354 | err_free_irq: |
2377 | free_irq(udc_controller->irq, udc_controller); | 2355 | free_irq(udc_controller->irq, udc_controller); |
2378 | err2: | 2356 | err_iounmap: |
2379 | iounmap(dr_regs); | 2357 | iounmap(dr_regs); |
2380 | err1: | 2358 | err_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); |
2360 | err_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); | |||
2469 | static void __exit udc_exit(void) | 2449 | static 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 | ||
2475 | module_exit(udc_exit); | 2455 | module_exit(udc_exit); |