aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/gadget/atmel_usba_udc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/gadget/atmel_usba_udc.c')
-rw-r--r--drivers/usb/gadget/atmel_usba_udc.c71
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
29static struct usba_udc the_udc; 30static struct usba_udc the_udc;
31static 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
1001static 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
1012static struct usb_endpoint_descriptor usba_ep0_desc = { 987static 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)
1027static struct usba_udc the_udc = { 1002static 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)
1965err_device_add: 1967err_device_add:
1966 free_irq(irq, udc); 1968 free_irq(irq, udc);
1967err_request_irq: 1969err_request_irq:
1970 kfree(usba_ep);
1971err_alloc_ep:
1968 iounmap(udc->fifo); 1972 iounmap(udc->fifo);
1969err_map_fifo: 1973err_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