diff options
author | Stelian Pop <stelian@popies.net> | 2008-04-05 16:15:25 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2008-06-02 10:08:09 -0400 |
commit | 7c8cf66529ebf95f1a5f34d1b69504d442b42630 (patch) | |
tree | 13e3fce73a8ab3fafe1b813e2721795cb50da097 /arch/arm | |
parent | 53d7168026a440c4cba25468a3d926ddd7ab030a (diff) |
[ARM] 4934/1: AT91CAP9 UDPHS driver: board and cpu integration.
This is patch 2 of 2 adding support for the USB High Speed Device Port
on the AT91CAP9 system on chip. The AT91CAP9 uses the same UDPHS IP
as the AVR32 and the AT91SAM9RL.
This patch declares the UDPHS ressources in the at91cap9 (cpu and
adk board) files, wires up the atmel_usba_udc driver to them,
and activates the driver in the defconfig.
Signed-off-by: Stelian Pop <stelian@popies.net>
Acked-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
Acked-by: Andrew Victor <linux@maxim.org.za>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/configs/at91cap9adk_defconfig | 27 | ||||
-rw-r--r-- | arch/arm/mach-at91/at91cap9_devices.c | 99 | ||||
-rw-r--r-- | arch/arm/mach-at91/board-cap9adk.c | 9 |
3 files changed, 134 insertions, 1 deletions
diff --git a/arch/arm/configs/at91cap9adk_defconfig b/arch/arm/configs/at91cap9adk_defconfig index e32e73648129..39ca662c0793 100644 --- a/arch/arm/configs/at91cap9adk_defconfig +++ b/arch/arm/configs/at91cap9adk_defconfig | |||
@@ -907,7 +907,32 @@ CONFIG_USB_MON=y | |||
907 | # | 907 | # |
908 | # USB Gadget Support | 908 | # USB Gadget Support |
909 | # | 909 | # |
910 | # CONFIG_USB_GADGET is not set | 910 | CONFIG_USB_GADGET=y |
911 | # CONFIG_USB_GADGET_DEBUG is not set | ||
912 | # CONFIG_USB_GADGET_DEBUG_FILES is not set | ||
913 | CONFIG_USB_GADGET_SELECTED=y | ||
914 | # CONFIG_USB_GADGET_AMD5536UDC is not set | ||
915 | CONFIG_USB_GADGET_ATMEL_USBA=y | ||
916 | CONFIG_USB_ATMEL_USBA=y | ||
917 | # CONFIG_USB_GADGET_FSL_USB2 is not set | ||
918 | # CONFIG_USB_GADGET_NET2280 is not set | ||
919 | # CONFIG_USB_GADGET_PXA2XX is not set | ||
920 | # CONFIG_USB_GADGET_M66592 is not set | ||
921 | # CONFIG_USB_GADGET_GOKU is not set | ||
922 | # CONFIG_USB_GADGET_LH7A40X is not set | ||
923 | # CONFIG_USB_GADGET_OMAP is not set | ||
924 | # CONFIG_USB_GADGET_S3C2410 is not set | ||
925 | # CONFIG_USB_GADGET_AT91 is not set | ||
926 | # CONFIG_USB_GADGET_DUMMY_HCD is not set | ||
927 | CONFIG_USB_GADGET_DUALSPEED=y | ||
928 | # CONFIG_USB_ZERO is not set | ||
929 | CONFIG_USB_ETH=m | ||
930 | CONFIG_USB_ETH_RNDIS=y | ||
931 | # CONFIG_USB_GADGETFS is not set | ||
932 | CONFIG_USB_FILE_STORAGE=m | ||
933 | # CONFIG_USB_FILE_STORAGE_TEST is not set | ||
934 | # CONFIG_USB_G_SERIAL is not set | ||
935 | # CONFIG_USB_MIDI_GADGET is not set | ||
911 | CONFIG_MMC=y | 936 | CONFIG_MMC=y |
912 | # CONFIG_MMC_DEBUG is not set | 937 | # CONFIG_MMC_DEBUG is not set |
913 | # CONFIG_MMC_UNSAFE_RESUME is not set | 938 | # CONFIG_MMC_UNSAFE_RESUME is not set |
diff --git a/arch/arm/mach-at91/at91cap9_devices.c b/arch/arm/mach-at91/at91cap9_devices.c index be526746e01e..747b9dedab88 100644 --- a/arch/arm/mach-at91/at91cap9_devices.c +++ b/arch/arm/mach-at91/at91cap9_devices.c | |||
@@ -84,6 +84,105 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {} | |||
84 | 84 | ||
85 | 85 | ||
86 | /* -------------------------------------------------------------------- | 86 | /* -------------------------------------------------------------------- |
87 | * USB HS Device (Gadget) | ||
88 | * -------------------------------------------------------------------- */ | ||
89 | |||
90 | #if defined(CONFIG_USB_GADGET_ATMEL_USBA) || defined(CONFIG_USB_GADGET_ATMEL_USBA_MODULE) | ||
91 | |||
92 | static struct resource usba_udc_resources[] = { | ||
93 | [0] = { | ||
94 | .start = AT91CAP9_UDPHS_FIFO, | ||
95 | .end = AT91CAP9_UDPHS_FIFO + SZ_512K - 1, | ||
96 | .flags = IORESOURCE_MEM, | ||
97 | }, | ||
98 | [1] = { | ||
99 | .start = AT91CAP9_BASE_UDPHS, | ||
100 | .end = AT91CAP9_BASE_UDPHS + SZ_1K - 1, | ||
101 | .flags = IORESOURCE_MEM, | ||
102 | }, | ||
103 | [2] = { | ||
104 | .start = AT91CAP9_ID_UDPHS, | ||
105 | .end = AT91CAP9_ID_UDPHS, | ||
106 | .flags = IORESOURCE_IRQ, | ||
107 | }, | ||
108 | }; | ||
109 | |||
110 | #define EP(nam, idx, maxpkt, maxbk, dma, isoc) \ | ||
111 | [idx] = { \ | ||
112 | .name = nam, \ | ||
113 | .index = idx, \ | ||
114 | .fifo_size = maxpkt, \ | ||
115 | .nr_banks = maxbk, \ | ||
116 | .can_dma = dma, \ | ||
117 | .can_isoc = isoc, \ | ||
118 | } | ||
119 | |||
120 | static struct usba_ep_data usba_udc_ep[] = { | ||
121 | EP("ep0", 0, 64, 1, 0, 0), | ||
122 | EP("ep1", 1, 1024, 3, 1, 1), | ||
123 | EP("ep2", 2, 1024, 3, 1, 1), | ||
124 | EP("ep3", 3, 1024, 2, 1, 1), | ||
125 | EP("ep4", 4, 1024, 2, 1, 1), | ||
126 | EP("ep5", 5, 1024, 2, 1, 0), | ||
127 | EP("ep6", 6, 1024, 2, 1, 0), | ||
128 | EP("ep7", 7, 1024, 2, 0, 0), | ||
129 | }; | ||
130 | |||
131 | #undef EP | ||
132 | |||
133 | /* | ||
134 | * pdata doesn't have room for any endpoints, so we need to | ||
135 | * append room for the ones we need right after it. | ||
136 | */ | ||
137 | static struct { | ||
138 | struct usba_platform_data pdata; | ||
139 | struct usba_ep_data ep[8]; | ||
140 | } usba_udc_data; | ||
141 | |||
142 | static struct platform_device at91_usba_udc_device = { | ||
143 | .name = "atmel_usba_udc", | ||
144 | .id = -1, | ||
145 | .dev = { | ||
146 | .platform_data = &usba_udc_data.pdata, | ||
147 | }, | ||
148 | .resource = usba_udc_resources, | ||
149 | .num_resources = ARRAY_SIZE(usba_udc_resources), | ||
150 | }; | ||
151 | |||
152 | void __init at91_add_device_usba(struct usba_platform_data *data) | ||
153 | { | ||
154 | at91_sys_write(AT91_MATRIX_UDPHS, AT91_MATRIX_SELECT_UDPHS | | ||
155 | AT91_MATRIX_UDPHS_BYPASS_LOCK); | ||
156 | |||
157 | /* | ||
158 | * Invalid pins are 0 on AT91, but the usba driver is shared | ||
159 | * with AVR32, which use negative values instead. Once/if | ||
160 | * gpio_is_valid() is ported to AT91, revisit this code. | ||
161 | */ | ||
162 | usba_udc_data.pdata.vbus_pin = -EINVAL; | ||
163 | usba_udc_data.pdata.num_ep = ARRAY_SIZE(usba_udc_ep); | ||
164 | memcpy(usba_udc_data.ep, usba_udc_ep, sizeof(usba_udc_ep));; | ||
165 | |||
166 | if (data && data->vbus_pin > 0) { | ||
167 | at91_set_gpio_input(data->vbus_pin, 0); | ||
168 | at91_set_deglitch(data->vbus_pin, 1); | ||
169 | usba_udc_data.pdata.vbus_pin = data->vbus_pin; | ||
170 | } | ||
171 | |||
172 | /* Pullup pin is handled internally by USB device peripheral */ | ||
173 | |||
174 | /* Clocks */ | ||
175 | at91_clock_associate("utmi_clk", &at91_usba_udc_device.dev, "hclk"); | ||
176 | at91_clock_associate("udphs_clk", &at91_usba_udc_device.dev, "pclk"); | ||
177 | |||
178 | platform_device_register(&at91_usba_udc_device); | ||
179 | } | ||
180 | #else | ||
181 | void __init at91_add_device_usba(struct usba_platform_data *data) {} | ||
182 | #endif | ||
183 | |||
184 | |||
185 | /* -------------------------------------------------------------------- | ||
87 | * Ethernet | 186 | * Ethernet |
88 | * -------------------------------------------------------------------- */ | 187 | * -------------------------------------------------------------------- */ |
89 | 188 | ||
diff --git a/arch/arm/mach-at91/board-cap9adk.c b/arch/arm/mach-at91/board-cap9adk.c index e5512d1ff217..8a2a958639db 100644 --- a/arch/arm/mach-at91/board-cap9adk.c +++ b/arch/arm/mach-at91/board-cap9adk.c | |||
@@ -78,6 +78,12 @@ static struct at91_usbh_data __initdata cap9adk_usbh_data = { | |||
78 | .ports = 2, | 78 | .ports = 2, |
79 | }; | 79 | }; |
80 | 80 | ||
81 | /* | ||
82 | * USB HS Device port | ||
83 | */ | ||
84 | static struct usba_platform_data __initdata cap9adk_usba_udc_data = { | ||
85 | .vbus_pin = AT91_PIN_PB31, | ||
86 | }; | ||
81 | 87 | ||
82 | /* | 88 | /* |
83 | * ADS7846 Touchscreen | 89 | * ADS7846 Touchscreen |
@@ -326,6 +332,9 @@ static void __init cap9adk_board_init(void) | |||
326 | /* USB Host */ | 332 | /* USB Host */ |
327 | set_irq_type(AT91CAP9_ID_UHP, IRQT_HIGH); | 333 | set_irq_type(AT91CAP9_ID_UHP, IRQT_HIGH); |
328 | at91_add_device_usbh(&cap9adk_usbh_data); | 334 | at91_add_device_usbh(&cap9adk_usbh_data); |
335 | /* USB HS */ | ||
336 | set_irq_type(AT91CAP9_ID_UDPHS, IRQT_HIGH); | ||
337 | at91_add_device_usba(&cap9adk_usba_udc_data); | ||
329 | /* SPI */ | 338 | /* SPI */ |
330 | at91_add_device_spi(cap9adk_spi_devices, ARRAY_SIZE(cap9adk_spi_devices)); | 339 | at91_add_device_spi(cap9adk_spi_devices, ARRAY_SIZE(cap9adk_spi_devices)); |
331 | /* Touchscreen */ | 340 | /* Touchscreen */ |