Efika MX platform support
[efikamx:linux-kernel.git] / arch / arm / mach-mx5 / mx51_efikamx_usb.c
1 /*
2  * Copyright 2009 Pegatron Corporation. All Rights Reserved.
3  * Copyright 2009-2010 Genesi USA, Inc. All Rights Reserved.
4  */
5
6 /*
7  * The code contained herein is licensed under the GNU General Public
8  * License. You may obtain a copy of the GNU General Public License
9  * Version 2 or later at the following locations:
10  *
11  * http://www.opensource.org/licenses/gpl-license.html
12  * http://www.gnu.org/copyleft/gpl.html
13  */
14
15 #include <linux/errno.h>
16 #include <linux/module.h>
17 #include <linux/platform_device.h>
18 #include <linux/delay.h>
19 #include <linux/fsl_devices.h>
20 #include <mach/hardware.h>
21 #include <mach/gpio.h>
22 #include <mach/common.h>
23
24 #include "devices.h"
25 #include "mx51_pins.h"
26 #include "iomux.h"
27 #include "usb.h"
28
29 #include "mx51_efikamx.h"
30
31
32 #define USB_PAD_CONFIG \
33                         (PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |        \
34                         PAD_CTL_PUE_KEEPER | PAD_CTL_PKE_ENABLE | PAD_CTL_HYS_ENABLE)
35
36 static struct mxc_iomux_pin_cfg __initdata mx51_efikamx_usb_iomux_pins[] = {
37         /* USBH2_DATA0 */
38         {
39          MX51_PIN_EIM_D16, IOMUX_CONFIG_ALT2,
40          (PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH | PAD_CTL_ODE_OPENDRAIN_NONE |
41           PAD_CTL_100K_PU | PAD_CTL_PUE_KEEPER | PAD_CTL_PKE_ENABLE |
42           PAD_CTL_HYS_ENABLE),
43          },
44         /* USBH2_DATA1 */
45         {       MX51_PIN_EIM_D17, IOMUX_CONFIG_ALT2, USB_PAD_CONFIG,    },
46         /* USBH2_DATA2 */
47         {       MX51_PIN_EIM_D18, IOMUX_CONFIG_ALT2, USB_PAD_CONFIG,    },
48         /* USBH2_DATA3 */
49         {       MX51_PIN_EIM_D19, IOMUX_CONFIG_ALT2, USB_PAD_CONFIG,    },
50         /* USBH2_DATA4 */
51         {       MX51_PIN_EIM_D20, IOMUX_CONFIG_ALT2, USB_PAD_CONFIG,    },
52         /* USBH2_DATA5 */
53         {       MX51_PIN_EIM_D21, IOMUX_CONFIG_ALT2, USB_PAD_CONFIG,    },
54         /* USBH2_DATA6 */
55         {       MX51_PIN_EIM_D22, IOMUX_CONFIG_ALT2, USB_PAD_CONFIG,    },
56         /* USBH2_DATA7 */
57         {       MX51_PIN_EIM_D23, IOMUX_CONFIG_ALT2, USB_PAD_CONFIG,    },
58         /* USBH2_CLK */
59         {       MX51_PIN_EIM_A24, IOMUX_CONFIG_ALT2, USB_PAD_CONFIG,    },
60         /* USBH2_DIR */
61         {       MX51_PIN_EIM_A25, IOMUX_CONFIG_ALT2, USB_PAD_CONFIG,    },
62         /* USBH2_STP */
63         {       MX51_PIN_EIM_A26, IOMUX_CONFIG_ALT2, USB_PAD_CONFIG,    },
64         /* USBH2_NXT */
65         {       MX51_PIN_EIM_A27, IOMUX_CONFIG_ALT2, USB_PAD_CONFIG,    },
66         {
67          MX51_PIN_USBH1_STP, IOMUX_CONFIG_ALT0,
68          (PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER |
69           PAD_CTL_PKE_ENABLE | PAD_CTL_HYS_ENABLE),
70          },
71         {
72          MX51_PIN_USBH1_CLK, IOMUX_CONFIG_ALT0,
73          (PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER |
74           PAD_CTL_PKE_ENABLE | PAD_CTL_HYS_ENABLE | PAD_CTL_DDR_INPUT_CMOS),
75          },
76         {
77          MX51_PIN_USBH1_DIR, IOMUX_CONFIG_ALT0,
78          (PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER |
79           PAD_CTL_PKE_ENABLE | PAD_CTL_HYS_ENABLE | PAD_CTL_DDR_INPUT_CMOS),
80          },
81         {
82          MX51_PIN_USBH1_NXT, IOMUX_CONFIG_ALT0,
83          (PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER |
84           PAD_CTL_PKE_ENABLE | PAD_CTL_HYS_ENABLE | PAD_CTL_DDR_INPUT_CMOS),
85          },
86         {       MX51_PIN_USBH1_DATA0, IOMUX_CONFIG_ALT0, USB_PAD_CONFIG, },
87         {       MX51_PIN_USBH1_DATA1, IOMUX_CONFIG_ALT0, USB_PAD_CONFIG, },
88         {       MX51_PIN_USBH1_DATA2, IOMUX_CONFIG_ALT0, USB_PAD_CONFIG, },
89         {       MX51_PIN_USBH1_DATA3, IOMUX_CONFIG_ALT0, USB_PAD_CONFIG, },
90         {       MX51_PIN_USBH1_DATA4, IOMUX_CONFIG_ALT0, USB_PAD_CONFIG, },
91         {       MX51_PIN_USBH1_DATA5, IOMUX_CONFIG_ALT0, USB_PAD_CONFIG, },
92         {       MX51_PIN_USBH1_DATA6, IOMUX_CONFIG_ALT0, USB_PAD_CONFIG, },
93         {       MX51_PIN_USBH1_DATA7, IOMUX_CONFIG_ALT0, USB_PAD_CONFIG, },
94
95         /* USB HUB RESET  */
96         {       MX51_PIN_GPIO1_5, IOMUX_CONFIG_ALT0,
97                 (PAD_CTL_DRV_HIGH | PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST),
98         },
99
100         /* Wireless enable (active low) */
101         { MX51_PIN_EIM_A22, IOMUX_CONFIG_GPIO, },
102         /* Wireless reset */
103         { MX51_PIN_EIM_A16, IOMUX_CONFIG_GPIO, },
104         /* Bluetooth enable (active low) */
105         { MX51_PIN_EIM_A17, IOMUX_CONFIG_GPIO, },
106         /* USB PHY reset */
107         {
108          MX51_PIN_EIM_D27, IOMUX_CONFIG_ALT1,
109          (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_NONE | PAD_CTL_PUE_KEEPER |
110           PAD_CTL_100K_PU | PAD_CTL_ODE_OPENDRAIN_NONE |
111           PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST),
112         },
113 };
114
115 void __init mx51_efikamx_init_usb(void)
116 {
117         DBG(("IOMUX for USB (%d pins)\n", ARRAY_SIZE(mx51_efikamx_usb_iomux_pins)));
118         CONFIG_IOMUX(mx51_efikamx_usb_iomux_pins);
119
120         gpio_request(IOMUX_TO_GPIO(MX51_PIN_GPIO1_5), "usb_hub_reset");
121         gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_GPIO1_5), 1);
122         msleep(1);
123         gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_GPIO1_5), 0);
124         msleep(1);
125         gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_GPIO1_5), 1);
126
127         /* enable BlueTooth */
128         gpio_request(IOMUX_TO_GPIO(MX51_PIN_EIM_A17), "bluetooth_enable");
129         gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_EIM_A17), 0);
130         msleep(10);
131         gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_EIM_A17), 1);
132
133         /* pull low wlan_on# */
134         gpio_request(IOMUX_TO_GPIO(MX51_PIN_EIM_A22), "wlan_on");
135         gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_EIM_A22), 0);
136         msleep(10);
137
138         /* pull low-high pulse wlan_rst# */
139         gpio_request(IOMUX_TO_GPIO(MX51_PIN_EIM_A16), "wlan_rst");
140         gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_EIM_A16), 0);
141         msleep(10);
142         gpio_set_value(IOMUX_TO_GPIO(MX51_PIN_EIM_A16), 1);
143
144         /* De-assert USB PHY RESETB */
145         gpio_request(IOMUX_TO_GPIO(MX51_PIN_EIM_D27), "usb_phy_resetb");
146         gpio_direction_output(IOMUX_TO_GPIO(MX51_PIN_EIM_D27), 1);
147
148         mx5_usb_dr_init();
149         mx5_usbh1_init();
150 }