diff options
author | Eric Bénard <eric@eukrea.com> | 2010-05-19 12:46:02 -0400 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2010-07-26 08:17:43 -0400 |
commit | 9f2270da95aa0d19889d5511b1bb39465669b6aa (patch) | |
tree | c8c3b9c7a2754ec671279a5a2823527f1a4e98d0 /arch/arm/mach-mx2/mach-cpuimx27.c | |
parent | 62d725b1d38856c50aebc5542707c6f5ea07a451 (diff) |
mach-cpuimx27: add USB Host2 and OTG support
support copied from mach-pca100.c
Signed-off-by: Eric Bénard <eric@eukrea.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm/mach-mx2/mach-cpuimx27.c')
-rw-r--r-- | arch/arm/mach-mx2/mach-cpuimx27.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/arch/arm/mach-mx2/mach-cpuimx27.c b/arch/arm/mach-mx2/mach-cpuimx27.c index a3449ed7c45c..19877f13b89b 100644 --- a/arch/arm/mach-mx2/mach-cpuimx27.c +++ b/arch/arm/mach-mx2/mach-cpuimx27.c | |||
@@ -26,6 +26,9 @@ | |||
26 | #include <linux/mtd/physmap.h> | 26 | #include <linux/mtd/physmap.h> |
27 | #include <linux/platform_device.h> | 27 | #include <linux/platform_device.h> |
28 | #include <linux/serial_8250.h> | 28 | #include <linux/serial_8250.h> |
29 | #include <linux/usb/otg.h> | ||
30 | #include <linux/usb/ulpi.h> | ||
31 | #include <linux/fsl_devices.h> | ||
29 | 32 | ||
30 | #include <asm/mach-types.h> | 33 | #include <asm/mach-types.h> |
31 | #include <asm/mach/arch.h> | 34 | #include <asm/mach/arch.h> |
@@ -39,6 +42,8 @@ | |||
39 | #include <mach/iomux-mx27.h> | 42 | #include <mach/iomux-mx27.h> |
40 | #include <mach/imx-uart.h> | 43 | #include <mach/imx-uart.h> |
41 | #include <mach/mxc_nand.h> | 44 | #include <mach/mxc_nand.h> |
45 | #include <mach/mxc_ehci.h> | ||
46 | #include <mach/ulpi.h> | ||
42 | 47 | ||
43 | #include "devices.h" | 48 | #include "devices.h" |
44 | 49 | ||
@@ -93,6 +98,32 @@ static int eukrea_cpuimx27_pins[] = { | |||
93 | GPIO_PORTB | 27 | GPIO_GPIO | GPIO_IN, | 98 | GPIO_PORTB | 27 | GPIO_GPIO | GPIO_IN, |
94 | GPIO_PORTB | 30 | GPIO_GPIO | GPIO_IN, | 99 | GPIO_PORTB | 30 | GPIO_GPIO | GPIO_IN, |
95 | #endif | 100 | #endif |
101 | /* OTG */ | ||
102 | PC7_PF_USBOTG_DATA5, | ||
103 | PC8_PF_USBOTG_DATA6, | ||
104 | PC9_PF_USBOTG_DATA0, | ||
105 | PC10_PF_USBOTG_DATA2, | ||
106 | PC11_PF_USBOTG_DATA1, | ||
107 | PC12_PF_USBOTG_DATA4, | ||
108 | PC13_PF_USBOTG_DATA3, | ||
109 | PE0_PF_USBOTG_NXT, | ||
110 | PE1_PF_USBOTG_STP, | ||
111 | PE2_PF_USBOTG_DIR, | ||
112 | PE24_PF_USBOTG_CLK, | ||
113 | PE25_PF_USBOTG_DATA7, | ||
114 | /* USBH2 */ | ||
115 | PA0_PF_USBH2_CLK, | ||
116 | PA1_PF_USBH2_DIR, | ||
117 | PA2_PF_USBH2_DATA7, | ||
118 | PA3_PF_USBH2_NXT, | ||
119 | PA4_PF_USBH2_STP, | ||
120 | PD19_AF_USBH2_DATA4, | ||
121 | PD20_AF_USBH2_DATA3, | ||
122 | PD21_AF_USBH2_DATA6, | ||
123 | PD22_AF_USBH2_DATA0, | ||
124 | PD23_AF_USBH2_DATA2, | ||
125 | PD24_AF_USBH2_DATA1, | ||
126 | PD26_AF_USBH2_DATA5, | ||
96 | }; | 127 | }; |
97 | 128 | ||
98 | static struct physmap_flash_data eukrea_cpuimx27_flash_data = { | 129 | static struct physmap_flash_data eukrea_cpuimx27_flash_data = { |
@@ -186,6 +217,36 @@ static struct platform_device serial_device = { | |||
186 | }; | 217 | }; |
187 | #endif | 218 | #endif |
188 | 219 | ||
220 | static struct mxc_usbh_platform_data otg_pdata = { | ||
221 | .portsc = MXC_EHCI_MODE_ULPI, | ||
222 | .flags = MXC_EHCI_INTERFACE_DIFF_UNI, | ||
223 | }; | ||
224 | |||
225 | static struct mxc_usbh_platform_data usbh2_pdata = { | ||
226 | .portsc = MXC_EHCI_MODE_ULPI, | ||
227 | .flags = MXC_EHCI_INTERFACE_DIFF_UNI, | ||
228 | }; | ||
229 | |||
230 | static struct fsl_usb2_platform_data otg_device_pdata = { | ||
231 | .operating_mode = FSL_USB2_DR_DEVICE, | ||
232 | .phy_mode = FSL_USB2_PHY_ULPI, | ||
233 | }; | ||
234 | |||
235 | static int otg_mode_host; | ||
236 | |||
237 | static int __init eukrea_cpuimx27_otg_mode(char *options) | ||
238 | { | ||
239 | if (!strcmp(options, "host")) | ||
240 | otg_mode_host = 1; | ||
241 | else if (!strcmp(options, "device")) | ||
242 | otg_mode_host = 0; | ||
243 | else | ||
244 | pr_info("otg_mode neither \"host\" nor \"device\". " | ||
245 | "Defaulting to device\n"); | ||
246 | return 0; | ||
247 | } | ||
248 | __setup("otg_mode=", eukrea_cpuimx27_otg_mode); | ||
249 | |||
189 | static void __init eukrea_cpuimx27_init(void) | 250 | static void __init eukrea_cpuimx27_init(void) |
190 | { | 251 | { |
191 | mxc_gpio_setup_multiple_pins(eukrea_cpuimx27_pins, | 252 | mxc_gpio_setup_multiple_pins(eukrea_cpuimx27_pins, |
@@ -216,6 +277,22 @@ static void __init eukrea_cpuimx27_init(void) | |||
216 | platform_device_register(&serial_device); | 277 | platform_device_register(&serial_device); |
217 | #endif | 278 | #endif |
218 | 279 | ||
280 | #if defined(CONFIG_USB_ULPI) | ||
281 | if (otg_mode_host) { | ||
282 | otg_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops, | ||
283 | USB_OTG_DRV_VBUS | USB_OTG_DRV_VBUS_EXT); | ||
284 | |||
285 | mxc_register_device(&mxc_otg_host, &otg_pdata); | ||
286 | } | ||
287 | |||
288 | usbh2_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops, | ||
289 | USB_OTG_DRV_VBUS | USB_OTG_DRV_VBUS_EXT); | ||
290 | |||
291 | mxc_register_device(&mxc_usbh2, &usbh2_pdata); | ||
292 | #endif | ||
293 | if (!otg_mode_host) | ||
294 | mxc_register_device(&mxc_otg_udc_device, &otg_device_pdata); | ||
295 | |||
219 | #ifdef CONFIG_MACH_EUKREA_MBIMX27_BASEBOARD | 296 | #ifdef CONFIG_MACH_EUKREA_MBIMX27_BASEBOARD |
220 | eukrea_mbimx27_baseboard_init(); | 297 | eukrea_mbimx27_baseboard_init(); |
221 | #endif | 298 | #endif |