diff options
author | Haavard Skinnemoen <haavard.skinnemoen@atmel.com> | 2008-04-19 20:38:41 -0400 |
---|---|---|
committer | Haavard Skinnemoen <haavard.skinnemoen@atmel.com> | 2008-04-19 20:38:41 -0400 |
commit | e1c25dc638db01600069b3f9167d1b35f8d574b5 (patch) | |
tree | f3b25d6a8344f0d9b7d23c8447d4078a36bb30fd /drivers/usb | |
parent | 03414e57ad9875d0c8bfa5a4a65813cb2157372e (diff) | |
parent | 16a45bc82e61891daec1ffcd057679bdf962aeb8 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/hskinnemoen/usba-2.6.26 into base
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/gadget/Kconfig | 4 | ||||
-rw-r--r-- | drivers/usb/gadget/atmel_usba_udc.c | 156 | ||||
-rw-r--r-- | drivers/usb/gadget/atmel_usba_udc.h | 9 |
3 files changed, 83 insertions, 86 deletions
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index 6f45dd669b33..d681bb27fa58 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig | |||
@@ -118,10 +118,10 @@ config USB_AMD5536UDC | |||
118 | config USB_GADGET_ATMEL_USBA | 118 | config USB_GADGET_ATMEL_USBA |
119 | boolean "Atmel USBA" | 119 | boolean "Atmel USBA" |
120 | select USB_GADGET_DUALSPEED | 120 | select USB_GADGET_DUALSPEED |
121 | depends on AVR32 | 121 | depends on AVR32 || ARCH_AT91CAP9 |
122 | help | 122 | help |
123 | USBA is the integrated high-speed USB Device controller on | 123 | USBA is the integrated high-speed USB Device controller on |
124 | the AT32AP700x processors from Atmel. | 124 | the AT32AP700x and AT91CAP9 processors from Atmel. |
125 | 125 | ||
126 | config USB_ATMEL_USBA | 126 | config USB_ATMEL_USBA |
127 | tristate | 127 | tristate |
diff --git a/drivers/usb/gadget/atmel_usba_udc.c b/drivers/usb/gadget/atmel_usba_udc.c index b0db4c31d018..e756023362c2 100644 --- a/drivers/usb/gadget/atmel_usba_udc.c +++ b/drivers/usb/gadget/atmel_usba_udc.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
19 | #include <linux/usb/ch9.h> | 19 | #include <linux/usb/ch9.h> |
20 | #include <linux/usb/gadget.h> | 20 | #include <linux/usb/gadget.h> |
21 | #include <linux/usb/atmel_usba_udc.h> | ||
21 | #include <linux/delay.h> | 22 | #include <linux/delay.h> |
22 | 23 | ||
23 | #include <asm/gpio.h> | 24 | #include <asm/gpio.h> |
@@ -27,6 +28,7 @@ | |||
27 | 28 | ||
28 | 29 | ||
29 | static struct usba_udc the_udc; | 30 | static struct usba_udc the_udc; |
31 | static struct usba_ep *usba_ep; | ||
30 | 32 | ||
31 | #ifdef CONFIG_USB_GADGET_DEBUG_FS | 33 | #ifdef CONFIG_USB_GADGET_DEBUG_FS |
32 | #include <linux/debugfs.h> | 34 | #include <linux/debugfs.h> |
@@ -324,53 +326,28 @@ static int vbus_is_present(struct usba_udc *udc) | |||
324 | return 1; | 326 | return 1; |
325 | } | 327 | } |
326 | 328 | ||
327 | static void copy_to_fifo(void __iomem *fifo, const void *buf, int len) | 329 | #if defined(CONFIG_AVR32) |
330 | |||
331 | static void toggle_bias(int is_on) | ||
328 | { | 332 | { |
329 | unsigned long tmp; | ||
330 | |||
331 | DBG(DBG_FIFO, "copy to FIFO (len %d):\n", len); | ||
332 | for (; len > 0; len -= 4, buf += 4, fifo += 4) { | ||
333 | tmp = *(unsigned long *)buf; | ||
334 | if (len >= 4) { | ||
335 | DBG(DBG_FIFO, " -> %08lx\n", tmp); | ||
336 | __raw_writel(tmp, fifo); | ||
337 | } else { | ||
338 | do { | ||
339 | DBG(DBG_FIFO, " -> %02lx\n", tmp >> 24); | ||
340 | __raw_writeb(tmp >> 24, fifo); | ||
341 | fifo++; | ||
342 | tmp <<= 8; | ||
343 | } while (--len); | ||
344 | break; | ||
345 | } | ||
346 | } | ||
347 | } | 333 | } |
348 | 334 | ||
349 | static void copy_from_fifo(void *buf, void __iomem *fifo, int len) | 335 | #elif defined(CONFIG_ARCH_AT91) |
336 | |||
337 | #include <asm/arch/at91_pmc.h> | ||
338 | |||
339 | static void toggle_bias(int is_on) | ||
350 | { | 340 | { |
351 | union { | 341 | unsigned int uckr = at91_sys_read(AT91_CKGR_UCKR); |
352 | unsigned long *w; | 342 | |
353 | unsigned char *b; | 343 | if (is_on) |
354 | } p; | 344 | at91_sys_write(AT91_CKGR_UCKR, uckr | AT91_PMC_BIASEN); |
355 | unsigned long tmp; | 345 | else |
356 | 346 | at91_sys_write(AT91_CKGR_UCKR, uckr & ~(AT91_PMC_BIASEN)); | |
357 | DBG(DBG_FIFO, "copy from FIFO (len %d):\n", len); | ||
358 | for (p.w = buf; len > 0; len -= 4, p.w++, fifo += 4) { | ||
359 | if (len >= 4) { | ||
360 | tmp = __raw_readl(fifo); | ||
361 | *p.w = tmp; | ||
362 | DBG(DBG_FIFO, " -> %08lx\n", tmp); | ||
363 | } else { | ||
364 | do { | ||
365 | tmp = __raw_readb(fifo); | ||
366 | *p.b = tmp; | ||
367 | DBG(DBG_FIFO, " -> %02lx\n", tmp); | ||
368 | fifo++, p.b++; | ||
369 | } while (--len); | ||
370 | } | ||
371 | } | ||
372 | } | 347 | } |
373 | 348 | ||
349 | #endif /* CONFIG_ARCH_AT91 */ | ||
350 | |||
374 | static void next_fifo_transaction(struct usba_ep *ep, struct usba_request *req) | 351 | static void next_fifo_transaction(struct usba_ep *ep, struct usba_request *req) |
375 | { | 352 | { |
376 | unsigned int transaction_len; | 353 | unsigned int transaction_len; |
@@ -387,7 +364,7 @@ static void next_fifo_transaction(struct usba_ep *ep, struct usba_request *req) | |||
387 | ep->ep.name, req, transaction_len, | 364 | ep->ep.name, req, transaction_len, |
388 | req->last_transaction ? ", done" : ""); | 365 | req->last_transaction ? ", done" : ""); |
389 | 366 | ||
390 | copy_to_fifo(ep->fifo, req->req.buf + req->req.actual, transaction_len); | 367 | memcpy_toio(ep->fifo, req->req.buf + req->req.actual, transaction_len); |
391 | usba_ep_writel(ep, SET_STA, USBA_TX_PK_RDY); | 368 | usba_ep_writel(ep, SET_STA, USBA_TX_PK_RDY); |
392 | req->req.actual += transaction_len; | 369 | req->req.actual += transaction_len; |
393 | } | 370 | } |
@@ -476,7 +453,7 @@ static void receive_data(struct usba_ep *ep) | |||
476 | bytecount = req->req.length - req->req.actual; | 453 | bytecount = req->req.length - req->req.actual; |
477 | } | 454 | } |
478 | 455 | ||
479 | copy_from_fifo(req->req.buf + req->req.actual, | 456 | memcpy_fromio(req->req.buf + req->req.actual, |
480 | ep->fifo, bytecount); | 457 | ep->fifo, bytecount); |
481 | req->req.actual += bytecount; | 458 | req->req.actual += bytecount; |
482 | 459 | ||
@@ -1029,33 +1006,6 @@ static const struct usb_gadget_ops usba_udc_ops = { | |||
1029 | .set_selfpowered = usba_udc_set_selfpowered, | 1006 | .set_selfpowered = usba_udc_set_selfpowered, |
1030 | }; | 1007 | }; |
1031 | 1008 | ||
1032 | #define EP(nam, idx, maxpkt, maxbk, dma, isoc) \ | ||
1033 | { \ | ||
1034 | .ep = { \ | ||
1035 | .ops = &usba_ep_ops, \ | ||
1036 | .name = nam, \ | ||
1037 | .maxpacket = maxpkt, \ | ||
1038 | }, \ | ||
1039 | .udc = &the_udc, \ | ||
1040 | .queue = LIST_HEAD_INIT(usba_ep[idx].queue), \ | ||
1041 | .fifo_size = maxpkt, \ | ||
1042 | .nr_banks = maxbk, \ | ||
1043 | .index = idx, \ | ||
1044 | .can_dma = dma, \ | ||
1045 | .can_isoc = isoc, \ | ||
1046 | } | ||
1047 | |||
1048 | static struct usba_ep usba_ep[] = { | ||
1049 | EP("ep0", 0, 64, 1, 0, 0), | ||
1050 | EP("ep1in-bulk", 1, 512, 2, 1, 1), | ||
1051 | EP("ep2out-bulk", 2, 512, 2, 1, 1), | ||
1052 | EP("ep3in-int", 3, 64, 3, 1, 0), | ||
1053 | EP("ep4out-int", 4, 64, 3, 1, 0), | ||
1054 | EP("ep5in-iso", 5, 1024, 3, 1, 1), | ||
1055 | EP("ep6out-iso", 6, 1024, 3, 1, 1), | ||
1056 | }; | ||
1057 | #undef EP | ||
1058 | |||
1059 | static struct usb_endpoint_descriptor usba_ep0_desc = { | 1009 | static struct usb_endpoint_descriptor usba_ep0_desc = { |
1060 | .bLength = USB_DT_ENDPOINT_SIZE, | 1010 | .bLength = USB_DT_ENDPOINT_SIZE, |
1061 | .bDescriptorType = USB_DT_ENDPOINT, | 1011 | .bDescriptorType = USB_DT_ENDPOINT, |
@@ -1074,7 +1024,6 @@ static void nop_release(struct device *dev) | |||
1074 | static struct usba_udc the_udc = { | 1024 | static struct usba_udc the_udc = { |
1075 | .gadget = { | 1025 | .gadget = { |
1076 | .ops = &usba_udc_ops, | 1026 | .ops = &usba_udc_ops, |
1077 | .ep0 = &usba_ep[0].ep, | ||
1078 | .ep_list = LIST_HEAD_INIT(the_udc.gadget.ep_list), | 1027 | .ep_list = LIST_HEAD_INIT(the_udc.gadget.ep_list), |
1079 | .is_dualspeed = 1, | 1028 | .is_dualspeed = 1, |
1080 | .name = "atmel_usba_udc", | 1029 | .name = "atmel_usba_udc", |
@@ -1231,7 +1180,7 @@ static int do_test_mode(struct usba_udc *udc) | |||
1231 | } else { | 1180 | } else { |
1232 | usba_ep_writel(ep, CTL_ENB, USBA_EPT_ENABLE); | 1181 | usba_ep_writel(ep, CTL_ENB, USBA_EPT_ENABLE); |
1233 | usba_writel(udc, TST, USBA_TST_PKT_MODE); | 1182 | usba_writel(udc, TST, USBA_TST_PKT_MODE); |
1234 | copy_to_fifo(ep->fifo, test_packet_buffer, | 1183 | memcpy_toio(ep->fifo, test_packet_buffer, |
1235 | sizeof(test_packet_buffer)); | 1184 | sizeof(test_packet_buffer)); |
1236 | usba_ep_writel(ep, SET_STA, USBA_TX_PK_RDY); | 1185 | usba_ep_writel(ep, SET_STA, USBA_TX_PK_RDY); |
1237 | dev_info(dev, "Entering Test_Packet mode...\n"); | 1186 | dev_info(dev, "Entering Test_Packet mode...\n"); |
@@ -1530,13 +1479,13 @@ restart: | |||
1530 | DBG(DBG_HW, "Packet length: %u\n", pkt_len); | 1479 | DBG(DBG_HW, "Packet length: %u\n", pkt_len); |
1531 | if (pkt_len != sizeof(crq)) { | 1480 | if (pkt_len != sizeof(crq)) { |
1532 | pr_warning("udc: Invalid packet length %u " | 1481 | pr_warning("udc: Invalid packet length %u " |
1533 | "(expected %lu)\n", pkt_len, sizeof(crq)); | 1482 | "(expected %zu)\n", pkt_len, sizeof(crq)); |
1534 | set_protocol_stall(udc, ep); | 1483 | set_protocol_stall(udc, ep); |
1535 | return; | 1484 | return; |
1536 | } | 1485 | } |
1537 | 1486 | ||
1538 | DBG(DBG_FIFO, "Copying ctrl request from 0x%p:\n", ep->fifo); | 1487 | DBG(DBG_FIFO, "Copying ctrl request from 0x%p:\n", ep->fifo); |
1539 | copy_from_fifo(crq.data, ep->fifo, sizeof(crq)); | 1488 | memcpy_fromio(crq.data, ep->fifo, sizeof(crq)); |
1540 | 1489 | ||
1541 | /* Free up one bank in the FIFO so that we can | 1490 | /* Free up one bank in the FIFO so that we can |
1542 | * generate or receive a reply right away. */ | 1491 | * generate or receive a reply right away. */ |
@@ -1688,6 +1637,7 @@ static irqreturn_t usba_udc_irq(int irq, void *devid) | |||
1688 | DBG(DBG_INT, "irq, status=%#08x\n", status); | 1637 | DBG(DBG_INT, "irq, status=%#08x\n", status); |
1689 | 1638 | ||
1690 | if (status & USBA_DET_SUSPEND) { | 1639 | if (status & USBA_DET_SUSPEND) { |
1640 | toggle_bias(0); | ||
1691 | usba_writel(udc, INT_CLR, USBA_DET_SUSPEND); | 1641 | usba_writel(udc, INT_CLR, USBA_DET_SUSPEND); |
1692 | DBG(DBG_BUS, "Suspend detected\n"); | 1642 | DBG(DBG_BUS, "Suspend detected\n"); |
1693 | if (udc->gadget.speed != USB_SPEED_UNKNOWN | 1643 | if (udc->gadget.speed != USB_SPEED_UNKNOWN |
@@ -1699,6 +1649,7 @@ static irqreturn_t usba_udc_irq(int irq, void *devid) | |||
1699 | } | 1649 | } |
1700 | 1650 | ||
1701 | if (status & USBA_WAKE_UP) { | 1651 | if (status & USBA_WAKE_UP) { |
1652 | toggle_bias(1); | ||
1702 | usba_writel(udc, INT_CLR, USBA_WAKE_UP); | 1653 | usba_writel(udc, INT_CLR, USBA_WAKE_UP); |
1703 | DBG(DBG_BUS, "Wake Up CPU detected\n"); | 1654 | DBG(DBG_BUS, "Wake Up CPU detected\n"); |
1704 | } | 1655 | } |
@@ -1792,12 +1743,14 @@ static irqreturn_t usba_vbus_irq(int irq, void *devid) | |||
1792 | vbus = gpio_get_value(udc->vbus_pin); | 1743 | vbus = gpio_get_value(udc->vbus_pin); |
1793 | if (vbus != udc->vbus_prev) { | 1744 | if (vbus != udc->vbus_prev) { |
1794 | if (vbus) { | 1745 | if (vbus) { |
1795 | usba_writel(udc, CTRL, USBA_EN_USBA); | 1746 | toggle_bias(1); |
1747 | usba_writel(udc, CTRL, USBA_ENABLE_MASK); | ||
1796 | usba_writel(udc, INT_ENB, USBA_END_OF_RESET); | 1748 | usba_writel(udc, INT_ENB, USBA_END_OF_RESET); |
1797 | } else { | 1749 | } else { |
1798 | udc->gadget.speed = USB_SPEED_UNKNOWN; | 1750 | udc->gadget.speed = USB_SPEED_UNKNOWN; |
1799 | reset_all_endpoints(udc); | 1751 | reset_all_endpoints(udc); |
1800 | usba_writel(udc, CTRL, 0); | 1752 | toggle_bias(0); |
1753 | usba_writel(udc, CTRL, USBA_DISABLE_MASK); | ||
1801 | spin_unlock(&udc->lock); | 1754 | spin_unlock(&udc->lock); |
1802 | udc->driver->disconnect(&udc->gadget); | 1755 | udc->driver->disconnect(&udc->gadget); |
1803 | spin_lock(&udc->lock); | 1756 | spin_lock(&udc->lock); |
@@ -1850,7 +1803,8 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) | |||
1850 | /* If Vbus is present, enable the controller and wait for reset */ | 1803 | /* If Vbus is present, enable the controller and wait for reset */ |
1851 | spin_lock_irqsave(&udc->lock, flags); | 1804 | spin_lock_irqsave(&udc->lock, flags); |
1852 | if (vbus_is_present(udc) && udc->vbus_prev == 0) { | 1805 | if (vbus_is_present(udc) && udc->vbus_prev == 0) { |
1853 | usba_writel(udc, CTRL, USBA_EN_USBA); | 1806 | toggle_bias(1); |
1807 | usba_writel(udc, CTRL, USBA_ENABLE_MASK); | ||
1854 | usba_writel(udc, INT_ENB, USBA_END_OF_RESET); | 1808 | usba_writel(udc, INT_ENB, USBA_END_OF_RESET); |
1855 | } | 1809 | } |
1856 | spin_unlock_irqrestore(&udc->lock, flags); | 1810 | spin_unlock_irqrestore(&udc->lock, flags); |
@@ -1883,7 +1837,8 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) | |||
1883 | spin_unlock_irqrestore(&udc->lock, flags); | 1837 | spin_unlock_irqrestore(&udc->lock, flags); |
1884 | 1838 | ||
1885 | /* This will also disable the DP pullup */ | 1839 | /* This will also disable the DP pullup */ |
1886 | usba_writel(udc, CTRL, 0); | 1840 | toggle_bias(0); |
1841 | usba_writel(udc, CTRL, USBA_DISABLE_MASK); | ||
1887 | 1842 | ||
1888 | driver->unbind(&udc->gadget); | 1843 | driver->unbind(&udc->gadget); |
1889 | udc->gadget.dev.driver = NULL; | 1844 | udc->gadget.dev.driver = NULL; |
@@ -1908,7 +1863,7 @@ static int __init usba_udc_probe(struct platform_device *pdev) | |||
1908 | 1863 | ||
1909 | regs = platform_get_resource(pdev, IORESOURCE_MEM, CTRL_IOMEM_ID); | 1864 | regs = platform_get_resource(pdev, IORESOURCE_MEM, CTRL_IOMEM_ID); |
1910 | fifo = platform_get_resource(pdev, IORESOURCE_MEM, FIFO_IOMEM_ID); | 1865 | fifo = platform_get_resource(pdev, IORESOURCE_MEM, FIFO_IOMEM_ID); |
1911 | if (!regs || !fifo) | 1866 | if (!regs || !fifo || !pdata) |
1912 | return -ENXIO; | 1867 | return -ENXIO; |
1913 | 1868 | ||
1914 | irq = platform_get_irq(pdev, 0); | 1869 | irq = platform_get_irq(pdev, 0); |
@@ -1953,19 +1908,48 @@ static int __init usba_udc_probe(struct platform_device *pdev) | |||
1953 | 1908 | ||
1954 | /* Make sure we start from a clean slate */ | 1909 | /* Make sure we start from a clean slate */ |
1955 | clk_enable(pclk); | 1910 | clk_enable(pclk); |
1956 | usba_writel(udc, CTRL, 0); | 1911 | toggle_bias(0); |
1912 | usba_writel(udc, CTRL, USBA_DISABLE_MASK); | ||
1957 | clk_disable(pclk); | 1913 | clk_disable(pclk); |
1958 | 1914 | ||
1915 | usba_ep = kmalloc(sizeof(struct usba_ep) * pdata->num_ep, | ||
1916 | GFP_KERNEL); | ||
1917 | if (!usba_ep) | ||
1918 | goto err_alloc_ep; | ||
1919 | |||
1920 | the_udc.gadget.ep0 = &usba_ep[0].ep; | ||
1921 | |||
1959 | INIT_LIST_HEAD(&usba_ep[0].ep.ep_list); | 1922 | INIT_LIST_HEAD(&usba_ep[0].ep.ep_list); |
1960 | usba_ep[0].ep_regs = udc->regs + USBA_EPT_BASE(0); | 1923 | usba_ep[0].ep_regs = udc->regs + USBA_EPT_BASE(0); |
1961 | usba_ep[0].dma_regs = udc->regs + USBA_DMA_BASE(0); | 1924 | usba_ep[0].dma_regs = udc->regs + USBA_DMA_BASE(0); |
1962 | usba_ep[0].fifo = udc->fifo + USBA_FIFO_BASE(0); | 1925 | usba_ep[0].fifo = udc->fifo + USBA_FIFO_BASE(0); |
1963 | for (i = 1; i < ARRAY_SIZE(usba_ep); i++) { | 1926 | usba_ep[0].ep.ops = &usba_ep_ops; |
1927 | usba_ep[0].ep.name = pdata->ep[0].name; | ||
1928 | usba_ep[0].ep.maxpacket = pdata->ep[0].fifo_size; | ||
1929 | usba_ep[0].udc = &the_udc; | ||
1930 | INIT_LIST_HEAD(&usba_ep[0].queue); | ||
1931 | usba_ep[0].fifo_size = pdata->ep[0].fifo_size; | ||
1932 | usba_ep[0].nr_banks = pdata->ep[0].nr_banks; | ||
1933 | usba_ep[0].index = pdata->ep[0].index; | ||
1934 | usba_ep[0].can_dma = pdata->ep[0].can_dma; | ||
1935 | usba_ep[0].can_isoc = pdata->ep[0].can_isoc; | ||
1936 | |||
1937 | for (i = 1; i < pdata->num_ep; i++) { | ||
1964 | struct usba_ep *ep = &usba_ep[i]; | 1938 | struct usba_ep *ep = &usba_ep[i]; |
1965 | 1939 | ||
1966 | ep->ep_regs = udc->regs + USBA_EPT_BASE(i); | 1940 | ep->ep_regs = udc->regs + USBA_EPT_BASE(i); |
1967 | ep->dma_regs = udc->regs + USBA_DMA_BASE(i); | 1941 | ep->dma_regs = udc->regs + USBA_DMA_BASE(i); |
1968 | ep->fifo = udc->fifo + USBA_FIFO_BASE(i); | 1942 | ep->fifo = udc->fifo + USBA_FIFO_BASE(i); |
1943 | ep->ep.ops = &usba_ep_ops; | ||
1944 | ep->ep.name = pdata->ep[i].name; | ||
1945 | ep->ep.maxpacket = pdata->ep[i].fifo_size; | ||
1946 | ep->udc = &the_udc; | ||
1947 | INIT_LIST_HEAD(&ep->queue); | ||
1948 | ep->fifo_size = pdata->ep[i].fifo_size; | ||
1949 | ep->nr_banks = pdata->ep[i].nr_banks; | ||
1950 | ep->index = pdata->ep[i].index; | ||
1951 | ep->can_dma = pdata->ep[i].can_dma; | ||
1952 | ep->can_isoc = pdata->ep[i].can_isoc; | ||
1969 | 1953 | ||
1970 | list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list); | 1954 | list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list); |
1971 | } | 1955 | } |
@@ -1984,7 +1968,7 @@ static int __init usba_udc_probe(struct platform_device *pdev) | |||
1984 | goto err_device_add; | 1968 | goto err_device_add; |
1985 | } | 1969 | } |
1986 | 1970 | ||
1987 | if (pdata && pdata->vbus_pin != GPIO_PIN_NONE) { | 1971 | if (pdata->vbus_pin >= 0) { |
1988 | if (!gpio_request(pdata->vbus_pin, "atmel_usba_udc")) { | 1972 | if (!gpio_request(pdata->vbus_pin, "atmel_usba_udc")) { |
1989 | udc->vbus_pin = pdata->vbus_pin; | 1973 | udc->vbus_pin = pdata->vbus_pin; |
1990 | 1974 | ||
@@ -2004,7 +1988,7 @@ static int __init usba_udc_probe(struct platform_device *pdev) | |||
2004 | } | 1988 | } |
2005 | 1989 | ||
2006 | usba_init_debugfs(udc); | 1990 | usba_init_debugfs(udc); |
2007 | for (i = 1; i < ARRAY_SIZE(usba_ep); i++) | 1991 | for (i = 1; i < pdata->num_ep; i++) |
2008 | usba_ep_init_debugfs(udc, &usba_ep[i]); | 1992 | usba_ep_init_debugfs(udc, &usba_ep[i]); |
2009 | 1993 | ||
2010 | return 0; | 1994 | return 0; |
@@ -2012,6 +1996,8 @@ static int __init usba_udc_probe(struct platform_device *pdev) | |||
2012 | err_device_add: | 1996 | err_device_add: |
2013 | free_irq(irq, udc); | 1997 | free_irq(irq, udc); |
2014 | err_request_irq: | 1998 | err_request_irq: |
1999 | kfree(usba_ep); | ||
2000 | err_alloc_ep: | ||
2015 | iounmap(udc->fifo); | 2001 | iounmap(udc->fifo); |
2016 | err_map_fifo: | 2002 | err_map_fifo: |
2017 | iounmap(udc->regs); | 2003 | iounmap(udc->regs); |
@@ -2029,10 +2015,11 @@ static int __exit usba_udc_remove(struct platform_device *pdev) | |||
2029 | { | 2015 | { |
2030 | struct usba_udc *udc; | 2016 | struct usba_udc *udc; |
2031 | int i; | 2017 | int i; |
2018 | struct usba_platform_data *pdata = pdev->dev.platform_data; | ||
2032 | 2019 | ||
2033 | udc = platform_get_drvdata(pdev); | 2020 | udc = platform_get_drvdata(pdev); |
2034 | 2021 | ||
2035 | for (i = 1; i < ARRAY_SIZE(usba_ep); i++) | 2022 | for (i = 1; i < pdata->num_ep; i++) |
2036 | usba_ep_cleanup_debugfs(&usba_ep[i]); | 2023 | usba_ep_cleanup_debugfs(&usba_ep[i]); |
2037 | usba_cleanup_debugfs(udc); | 2024 | usba_cleanup_debugfs(udc); |
2038 | 2025 | ||
@@ -2040,6 +2027,7 @@ static int __exit usba_udc_remove(struct platform_device *pdev) | |||
2040 | gpio_free(udc->vbus_pin); | 2027 | gpio_free(udc->vbus_pin); |
2041 | 2028 | ||
2042 | free_irq(udc->irq, udc); | 2029 | free_irq(udc->irq, udc); |
2030 | kfree(usba_ep); | ||
2043 | iounmap(udc->fifo); | 2031 | iounmap(udc->fifo); |
2044 | iounmap(udc->regs); | 2032 | iounmap(udc->regs); |
2045 | clk_put(udc->hclk); | 2033 | clk_put(udc->hclk); |
diff --git a/drivers/usb/gadget/atmel_usba_udc.h b/drivers/usb/gadget/atmel_usba_udc.h index 08bf6f9aaf7e..f7baea307f0d 100644 --- a/drivers/usb/gadget/atmel_usba_udc.h +++ b/drivers/usb/gadget/atmel_usba_udc.h | |||
@@ -41,6 +41,15 @@ | |||
41 | #define USBA_EN_USBA (1 << 8) | 41 | #define USBA_EN_USBA (1 << 8) |
42 | #define USBA_DETACH (1 << 9) | 42 | #define USBA_DETACH (1 << 9) |
43 | #define USBA_REMOTE_WAKE_UP (1 << 10) | 43 | #define USBA_REMOTE_WAKE_UP (1 << 10) |
44 | #define USBA_PULLD_DIS (1 << 11) | ||
45 | |||
46 | #if defined(CONFIG_AVR32) | ||
47 | #define USBA_ENABLE_MASK USBA_EN_USBA | ||
48 | #define USBA_DISABLE_MASK 0 | ||
49 | #elif defined(CONFIG_ARCH_AT91) | ||
50 | #define USBA_ENABLE_MASK (USBA_EN_USBA | USBA_PULLD_DIS) | ||
51 | #define USBA_DISABLE_MASK USBA_DETACH | ||
52 | #endif /* CONFIG_ARCH_AT91 */ | ||
44 | 53 | ||
45 | /* Bitfields in FNUM */ | 54 | /* Bitfields in FNUM */ |
46 | #define USBA_MICRO_FRAME_NUM_OFFSET 0 | 55 | #define USBA_MICRO_FRAME_NUM_OFFSET 0 |