Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

atmel_usba_udc: move endpoint declarations into platform data.

The atmel_usba_udc driver is being used by several platforms and arches
(avr32 and at91 ATM), and each platform may have different endpoint
settings.

The patch below moves the endpoint declarations into the platform
data and make the necessary adjustments for AVR32 (improved by
Haavard Skinnemoen <hskinnemoen@atmel.com>).

Signed-off-by: Stelian Pop <stelian@popies.net>
Acked-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>

authored by

Stelian Pop and committed by
Haavard Skinnemoen
8d855317 8d12c32c

+105 -42
+44 -6
arch/avr32/mach-at32ap/at32ap700x.c
··· 11 11 #include <linux/platform_device.h> 12 12 #include <linux/dma-mapping.h> 13 13 #include <linux/spi/spi.h> 14 + #include <linux/usb/atmel_usba_udc.h> 14 15 15 16 #include <asm/io.h> 16 17 #include <asm/irq.h> ··· 1352 1351 .index = 6, 1353 1352 }; 1354 1353 1354 + #define EP(nam, idx, maxpkt, maxbk, dma, isoc) \ 1355 + [idx] = { \ 1356 + .name = nam, \ 1357 + .index = idx, \ 1358 + .fifo_size = maxpkt, \ 1359 + .nr_banks = maxbk, \ 1360 + .can_dma = dma, \ 1361 + .can_isoc = isoc, \ 1362 + } 1363 + 1364 + static struct usba_ep_data at32_usba_ep[] __initdata = { 1365 + EP("ep0", 0, 64, 1, 0, 0), 1366 + EP("ep1", 1, 512, 2, 1, 1), 1367 + EP("ep2", 2, 512, 2, 1, 1), 1368 + EP("ep3-int", 3, 64, 3, 1, 0), 1369 + EP("ep4-int", 4, 64, 3, 1, 0), 1370 + EP("ep5", 5, 1024, 3, 1, 1), 1371 + EP("ep6", 6, 1024, 3, 1, 1), 1372 + }; 1373 + 1374 + #undef EP 1375 + 1355 1376 struct platform_device *__init 1356 1377 at32_add_device_usba(unsigned int id, struct usba_platform_data *data) 1357 1378 { 1379 + /* 1380 + * pdata doesn't have room for any endpoints, so we need to 1381 + * append room for the ones we need right after it. 1382 + */ 1383 + struct { 1384 + struct usba_platform_data pdata; 1385 + struct usba_ep_data ep[7]; 1386 + } usba_data; 1358 1387 struct platform_device *pdev; 1359 1388 1360 1389 if (id != 0) ··· 1398 1367 ARRAY_SIZE(usba0_resource))) 1399 1368 goto out_free_pdev; 1400 1369 1401 - if (data) { 1402 - if (platform_device_add_data(pdev, data, sizeof(*data))) 1403 - goto out_free_pdev; 1370 + if (data) 1371 + usba_data.pdata.vbus_pin = data->vbus_pin; 1372 + else 1373 + usba_data.pdata.vbus_pin = -EINVAL; 1404 1374 1405 - if (data->vbus_pin != GPIO_PIN_NONE) 1406 - at32_select_gpio(data->vbus_pin, 0); 1407 - } 1375 + data = &usba_data.pdata; 1376 + data->num_ep = ARRAY_SIZE(at32_usba_ep); 1377 + memcpy(data->ep, at32_usba_ep, sizeof(at32_usba_ep)); 1378 + 1379 + if (platform_device_add_data(pdev, data, sizeof(usba_data))) 1380 + goto out_free_pdev; 1381 + 1382 + if (data->vbus_pin >= 0) 1383 + at32_select_gpio(data->vbus_pin, 0); 1408 1384 1409 1385 usba0_pclk.dev = &pdev->dev; 1410 1386 usba0_hclk.dev = &pdev->dev;
+38 -33
drivers/usb/gadget/atmel_usba_udc.c
··· 18 18 #include <linux/platform_device.h> 19 19 #include <linux/usb/ch9.h> 20 20 #include <linux/usb/gadget.h> 21 + #include <linux/usb/atmel_usba_udc.h> 21 22 #include <linux/delay.h> 22 23 23 24 #include <asm/gpio.h> ··· 28 27 29 28 30 29 static struct usba_udc the_udc; 30 + static struct usba_ep *usba_ep; 31 31 32 32 #ifdef CONFIG_USB_GADGET_DEBUG_FS 33 33 #include <linux/debugfs.h> ··· 984 982 .set_selfpowered = usba_udc_set_selfpowered, 985 983 }; 986 984 987 - #define EP(nam, idx, maxpkt, maxbk, dma, isoc) \ 988 - { \ 989 - .ep = { \ 990 - .ops = &usba_ep_ops, \ 991 - .name = nam, \ 992 - .maxpacket = maxpkt, \ 993 - }, \ 994 - .udc = &the_udc, \ 995 - .queue = LIST_HEAD_INIT(usba_ep[idx].queue), \ 996 - .fifo_size = maxpkt, \ 997 - .nr_banks = maxbk, \ 998 - .index = idx, \ 999 - .can_dma = dma, \ 1000 - .can_isoc = isoc, \ 1001 - } 1002 - 1003 - static struct usba_ep usba_ep[] = { 1004 - EP("ep0", 0, 64, 1, 0, 0), 1005 - EP("ep1", 1, 512, 2, 1, 1), 1006 - EP("ep2", 2, 512, 2, 1, 1), 1007 - EP("ep3-int", 3, 64, 3, 1, 0), 1008 - EP("ep4-int", 4, 64, 3, 1, 0), 1009 - EP("ep5", 5, 1024, 3, 1, 1), 1010 - EP("ep6", 6, 1024, 3, 1, 1), 1011 - }; 1012 - #undef EP 1013 - 1014 985 static struct usb_endpoint_descriptor usba_ep0_desc = { 1015 986 .bLength = USB_DT_ENDPOINT_SIZE, 1016 987 .bDescriptorType = USB_DT_ENDPOINT, ··· 1002 1027 static struct usba_udc the_udc = { 1003 1028 .gadget = { 1004 1029 .ops = &usba_udc_ops, 1005 - .ep0 = &usba_ep[0].ep, 1006 1030 .ep_list = LIST_HEAD_INIT(the_udc.gadget.ep_list), 1007 1031 .is_dualspeed = 1, 1008 1032 .name = "atmel_usba_udc", ··· 1835 1861 1836 1862 regs = platform_get_resource(pdev, IORESOURCE_MEM, CTRL_IOMEM_ID); 1837 1863 fifo = platform_get_resource(pdev, IORESOURCE_MEM, FIFO_IOMEM_ID); 1838 - if (!regs || !fifo) 1864 + if (!regs || !fifo || !pdata) 1839 1865 return -ENXIO; 1840 1866 1841 1867 irq = platform_get_irq(pdev, 0); ··· 1883 1909 usba_writel(udc, CTRL, 0); 1884 1910 clk_disable(pclk); 1885 1911 1912 + usba_ep = kmalloc(sizeof(struct usba_ep) * pdata->num_ep, 1913 + GFP_KERNEL); 1914 + if (!usba_ep) 1915 + goto err_alloc_ep; 1916 + 1917 + the_udc.gadget.ep0 = &usba_ep[0].ep; 1918 + 1886 1919 INIT_LIST_HEAD(&usba_ep[0].ep.ep_list); 1887 1920 usba_ep[0].ep_regs = udc->regs + USBA_EPT_BASE(0); 1888 1921 usba_ep[0].dma_regs = udc->regs + USBA_DMA_BASE(0); 1889 1922 usba_ep[0].fifo = udc->fifo + USBA_FIFO_BASE(0); 1890 - for (i = 1; i < ARRAY_SIZE(usba_ep); i++) { 1923 + usba_ep[0].ep.ops = &usba_ep_ops; 1924 + usba_ep[0].ep.name = pdata->ep[0].name; 1925 + usba_ep[0].ep.maxpacket = pdata->ep[0].fifo_size; 1926 + usba_ep[0].udc = &the_udc; 1927 + INIT_LIST_HEAD(&usba_ep[0].queue); 1928 + usba_ep[0].fifo_size = pdata->ep[0].fifo_size; 1929 + usba_ep[0].nr_banks = pdata->ep[0].nr_banks; 1930 + usba_ep[0].index = pdata->ep[0].index; 1931 + usba_ep[0].can_dma = pdata->ep[0].can_dma; 1932 + usba_ep[0].can_isoc = pdata->ep[0].can_isoc; 1933 + 1934 + for (i = 1; i < pdata->num_ep; i++) { 1891 1935 struct usba_ep *ep = &usba_ep[i]; 1892 1936 1893 1937 ep->ep_regs = udc->regs + USBA_EPT_BASE(i); 1894 1938 ep->dma_regs = udc->regs + USBA_DMA_BASE(i); 1895 1939 ep->fifo = udc->fifo + USBA_FIFO_BASE(i); 1940 + ep->ep.ops = &usba_ep_ops; 1941 + ep->ep.name = pdata->ep[i].name; 1942 + ep->ep.maxpacket = pdata->ep[i].fifo_size; 1943 + ep->udc = &the_udc; 1944 + INIT_LIST_HEAD(&ep->queue); 1945 + ep->fifo_size = pdata->ep[i].fifo_size; 1946 + ep->nr_banks = pdata->ep[i].nr_banks; 1947 + ep->index = pdata->ep[i].index; 1948 + ep->can_dma = pdata->ep[i].can_dma; 1949 + ep->can_isoc = pdata->ep[i].can_isoc; 1896 1950 1897 1951 list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list); 1898 1952 } ··· 1939 1937 goto err_device_add; 1940 1938 } 1941 1939 1942 - if (pdata && pdata->vbus_pin >= 0) { 1940 + if (pdata->vbus_pin >= 0) { 1943 1941 if (!gpio_request(pdata->vbus_pin, "atmel_usba_udc")) { 1944 1942 udc->vbus_pin = pdata->vbus_pin; 1945 1943 ··· 1959 1957 } 1960 1958 1961 1959 usba_init_debugfs(udc); 1962 - for (i = 1; i < ARRAY_SIZE(usba_ep); i++) 1960 + for (i = 1; i < pdata->num_ep; i++) 1963 1961 usba_ep_init_debugfs(udc, &usba_ep[i]); 1964 1962 1965 1963 return 0; ··· 1967 1965 err_device_add: 1968 1966 free_irq(irq, udc); 1969 1967 err_request_irq: 1968 + kfree(usba_ep); 1969 + err_alloc_ep: 1970 1970 iounmap(udc->fifo); 1971 1971 err_map_fifo: 1972 1972 iounmap(udc->regs); ··· 1986 1982 { 1987 1983 struct usba_udc *udc; 1988 1984 int i; 1985 + struct usba_platform_data *pdata = pdev->dev.platform_data; 1989 1986 1990 1987 udc = platform_get_drvdata(pdev); 1991 1988 1992 - for (i = 1; i < ARRAY_SIZE(usba_ep); i++) 1989 + for (i = 1; i < pdata->num_ep; i++) 1993 1990 usba_ep_cleanup_debugfs(&usba_ep[i]); 1994 1991 usba_cleanup_debugfs(udc); 1995 1992
+1 -3
include/asm-avr32/arch-at32ap/board.h
··· 38 38 at32_add_device_lcdc(unsigned int id, struct atmel_lcdfb_info *data, 39 39 unsigned long fbmem_start, unsigned long fbmem_len); 40 40 41 - struct usba_platform_data { 42 - int vbus_pin; 43 - }; 41 + struct usba_platform_data; 44 42 struct platform_device * 45 43 at32_add_device_usba(unsigned int id, struct usba_platform_data *data); 46 44
+22
include/linux/usb/atmel_usba_udc.h
··· 1 + /* 2 + * Platform data definitions for Atmel USBA gadget driver. 3 + */ 4 + #ifndef __LINUX_USB_USBA_H 5 + #define __LINUX_USB_USBA_H 6 + 7 + struct usba_ep_data { 8 + char *name; 9 + int index; 10 + int fifo_size; 11 + int nr_banks; 12 + int can_dma; 13 + int can_isoc; 14 + }; 15 + 16 + struct usba_platform_data { 17 + int vbus_pin; 18 + int num_ep; 19 + struct usba_ep_data ep[0]; 20 + }; 21 + 22 + #endif /* __LINUX_USB_USBA_H */