diff options
Diffstat (limited to 'drivers/usb/gadget/atmel_usba_udc.c')
-rw-r--r-- | drivers/usb/gadget/atmel_usba_udc.c | 71 |
1 files changed, 38 insertions, 33 deletions
diff --git a/drivers/usb/gadget/atmel_usba_udc.c b/drivers/usb/gadget/atmel_usba_udc.c index 39d187fb038a..71d3c5171f89 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> |
@@ -982,33 +984,6 @@ static const struct usb_gadget_ops usba_udc_ops = { | |||
982 | .set_selfpowered = usba_udc_set_selfpowered, | 984 | .set_selfpowered = usba_udc_set_selfpowered, |
983 | }; | 985 | }; |
984 | 986 | ||
985 | #define EP(nam, idx, maxpkt, maxbk, dma, isoc) \ | ||
986 | { \ | ||
987 | .ep = { \ | ||
988 | .ops = &usba_ep_ops, \ | ||
989 | .name = nam, \ | ||
990 | .maxpacket = maxpkt, \ | ||
991 | }, \ | ||
992 | .udc = &the_udc, \ | ||
993 | .queue = LIST_HEAD_INIT(usba_ep[idx].queue), \ | ||
994 | .fifo_size = maxpkt, \ | ||
995 | .nr_banks = maxbk, \ | ||
996 | .index = idx, \ | ||
997 | .can_dma = dma, \ | ||
998 | .can_isoc = isoc, \ | ||
999 | } | ||
1000 | |||
1001 | static struct usba_ep usba_ep[] = { | ||
1002 | EP("ep0", 0, 64, 1, 0, 0), | ||
1003 | EP("ep1", 1, 512, 2, 1, 1), | ||
1004 | EP("ep2", 2, 512, 2, 1, 1), | ||
1005 | EP("ep3-int", 3, 64, 3, 1, 0), | ||
1006 | EP("ep4-int", 4, 64, 3, 1, 0), | ||
1007 | EP("ep5", 5, 1024, 3, 1, 1), | ||
1008 | EP("ep6", 6, 1024, 3, 1, 1), | ||
1009 | }; | ||
1010 | #undef EP | ||
1011 | |||
1012 | static struct usb_endpoint_descriptor usba_ep0_desc = { | 987 | static struct usb_endpoint_descriptor usba_ep0_desc = { |
1013 | .bLength = USB_DT_ENDPOINT_SIZE, | 988 | .bLength = USB_DT_ENDPOINT_SIZE, |
1014 | .bDescriptorType = USB_DT_ENDPOINT, | 989 | .bDescriptorType = USB_DT_ENDPOINT, |
@@ -1027,7 +1002,6 @@ static void nop_release(struct device *dev) | |||
1027 | static struct usba_udc the_udc = { | 1002 | static struct usba_udc the_udc = { |
1028 | .gadget = { | 1003 | .gadget = { |
1029 | .ops = &usba_udc_ops, | 1004 | .ops = &usba_udc_ops, |
1030 | .ep0 = &usba_ep[0].ep, | ||
1031 | .ep_list = LIST_HEAD_INIT(the_udc.gadget.ep_list), | 1005 | .ep_list = LIST_HEAD_INIT(the_udc.gadget.ep_list), |
1032 | .is_dualspeed = 1, | 1006 | .is_dualspeed = 1, |
1033 | .name = "atmel_usba_udc", | 1007 | .name = "atmel_usba_udc", |
@@ -1861,7 +1835,7 @@ static int __init usba_udc_probe(struct platform_device *pdev) | |||
1861 | 1835 | ||
1862 | regs = platform_get_resource(pdev, IORESOURCE_MEM, CTRL_IOMEM_ID); | 1836 | regs = platform_get_resource(pdev, IORESOURCE_MEM, CTRL_IOMEM_ID); |
1863 | fifo = platform_get_resource(pdev, IORESOURCE_MEM, FIFO_IOMEM_ID); | 1837 | fifo = platform_get_resource(pdev, IORESOURCE_MEM, FIFO_IOMEM_ID); |
1864 | if (!regs || !fifo) | 1838 | if (!regs || !fifo || !pdata) |
1865 | return -ENXIO; | 1839 | return -ENXIO; |
1866 | 1840 | ||
1867 | irq = platform_get_irq(pdev, 0); | 1841 | irq = platform_get_irq(pdev, 0); |
@@ -1909,16 +1883,44 @@ static int __init usba_udc_probe(struct platform_device *pdev) | |||
1909 | usba_writel(udc, CTRL, 0); | 1883 | usba_writel(udc, CTRL, 0); |
1910 | clk_disable(pclk); | 1884 | clk_disable(pclk); |
1911 | 1885 | ||
1886 | usba_ep = kmalloc(sizeof(struct usba_ep) * pdata->num_ep, | ||
1887 | GFP_KERNEL); | ||
1888 | if (!usba_ep) | ||
1889 | goto err_alloc_ep; | ||
1890 | |||
1891 | the_udc.gadget.ep0 = &usba_ep[0].ep; | ||
1892 | |||
1912 | INIT_LIST_HEAD(&usba_ep[0].ep.ep_list); | 1893 | INIT_LIST_HEAD(&usba_ep[0].ep.ep_list); |
1913 | usba_ep[0].ep_regs = udc->regs + USBA_EPT_BASE(0); | 1894 | usba_ep[0].ep_regs = udc->regs + USBA_EPT_BASE(0); |
1914 | usba_ep[0].dma_regs = udc->regs + USBA_DMA_BASE(0); | 1895 | usba_ep[0].dma_regs = udc->regs + USBA_DMA_BASE(0); |
1915 | usba_ep[0].fifo = udc->fifo + USBA_FIFO_BASE(0); | 1896 | usba_ep[0].fifo = udc->fifo + USBA_FIFO_BASE(0); |
1916 | for (i = 1; i < ARRAY_SIZE(usba_ep); i++) { | 1897 | usba_ep[0].ep.ops = &usba_ep_ops; |
1898 | usba_ep[0].ep.name = pdata->ep[0].name; | ||
1899 | usba_ep[0].ep.maxpacket = pdata->ep[0].fifo_size; | ||
1900 | usba_ep[0].udc = &the_udc; | ||
1901 | INIT_LIST_HEAD(&usba_ep[0].queue); | ||
1902 | usba_ep[0].fifo_size = pdata->ep[0].fifo_size; | ||
1903 | usba_ep[0].nr_banks = pdata->ep[0].nr_banks; | ||
1904 | usba_ep[0].index = pdata->ep[0].index; | ||
1905 | usba_ep[0].can_dma = pdata->ep[0].can_dma; | ||
1906 | usba_ep[0].can_isoc = pdata->ep[0].can_isoc; | ||
1907 | |||
1908 | for (i = 1; i < pdata->num_ep; i++) { | ||
1917 | struct usba_ep *ep = &usba_ep[i]; | 1909 | struct usba_ep *ep = &usba_ep[i]; |
1918 | 1910 | ||
1919 | ep->ep_regs = udc->regs + USBA_EPT_BASE(i); | 1911 | ep->ep_regs = udc->regs + USBA_EPT_BASE(i); |
1920 | ep->dma_regs = udc->regs + USBA_DMA_BASE(i); | 1912 | ep->dma_regs = udc->regs + USBA_DMA_BASE(i); |
1921 | ep->fifo = udc->fifo + USBA_FIFO_BASE(i); | 1913 | ep->fifo = udc->fifo + USBA_FIFO_BASE(i); |
1914 | ep->ep.ops = &usba_ep_ops; | ||
1915 | ep->ep.name = pdata->ep[i].name; | ||
1916 | ep->ep.maxpacket = pdata->ep[i].fifo_size; | ||
1917 | ep->udc = &the_udc; | ||
1918 | INIT_LIST_HEAD(&ep->queue); | ||
1919 | ep->fifo_size = pdata->ep[i].fifo_size; | ||
1920 | ep->nr_banks = pdata->ep[i].nr_banks; | ||
1921 | ep->index = pdata->ep[i].index; | ||
1922 | ep->can_dma = pdata->ep[i].can_dma; | ||
1923 | ep->can_isoc = pdata->ep[i].can_isoc; | ||
1922 | 1924 | ||
1923 | list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list); | 1925 | list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list); |
1924 | } | 1926 | } |
@@ -1937,7 +1939,7 @@ static int __init usba_udc_probe(struct platform_device *pdev) | |||
1937 | goto err_device_add; | 1939 | goto err_device_add; |
1938 | } | 1940 | } |
1939 | 1941 | ||
1940 | if (pdata && pdata->vbus_pin >= 0) { | 1942 | if (pdata->vbus_pin >= 0) { |
1941 | if (!gpio_request(pdata->vbus_pin, "atmel_usba_udc")) { | 1943 | if (!gpio_request(pdata->vbus_pin, "atmel_usba_udc")) { |
1942 | udc->vbus_pin = pdata->vbus_pin; | 1944 | udc->vbus_pin = pdata->vbus_pin; |
1943 | 1945 | ||
@@ -1957,7 +1959,7 @@ static int __init usba_udc_probe(struct platform_device *pdev) | |||
1957 | } | 1959 | } |
1958 | 1960 | ||
1959 | usba_init_debugfs(udc); | 1961 | usba_init_debugfs(udc); |
1960 | for (i = 1; i < ARRAY_SIZE(usba_ep); i++) | 1962 | for (i = 1; i < pdata->num_ep; i++) |
1961 | usba_ep_init_debugfs(udc, &usba_ep[i]); | 1963 | usba_ep_init_debugfs(udc, &usba_ep[i]); |
1962 | 1964 | ||
1963 | return 0; | 1965 | return 0; |
@@ -1965,6 +1967,8 @@ static int __init usba_udc_probe(struct platform_device *pdev) | |||
1965 | err_device_add: | 1967 | err_device_add: |
1966 | free_irq(irq, udc); | 1968 | free_irq(irq, udc); |
1967 | err_request_irq: | 1969 | err_request_irq: |
1970 | kfree(usba_ep); | ||
1971 | err_alloc_ep: | ||
1968 | iounmap(udc->fifo); | 1972 | iounmap(udc->fifo); |
1969 | err_map_fifo: | 1973 | err_map_fifo: |
1970 | iounmap(udc->regs); | 1974 | iounmap(udc->regs); |
@@ -1982,10 +1986,11 @@ static int __exit usba_udc_remove(struct platform_device *pdev) | |||
1982 | { | 1986 | { |
1983 | struct usba_udc *udc; | 1987 | struct usba_udc *udc; |
1984 | int i; | 1988 | int i; |
1989 | struct usba_platform_data *pdata = pdev->dev.platform_data; | ||
1985 | 1990 | ||
1986 | udc = platform_get_drvdata(pdev); | 1991 | udc = platform_get_drvdata(pdev); |
1987 | 1992 | ||
1988 | for (i = 1; i < ARRAY_SIZE(usba_ep); i++) | 1993 | for (i = 1; i < pdata->num_ep; i++) |
1989 | usba_ep_cleanup_debugfs(&usba_ep[i]); | 1994 | usba_ep_cleanup_debugfs(&usba_ep[i]); |
1990 | usba_cleanup_debugfs(udc); | 1995 | usba_cleanup_debugfs(udc); |
1991 | 1996 | ||