mark your calendars: this is the day one kernel supports both boards
[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 #include <asm/mach-types.h>
24
25 #include "devices.h"
26 #include "mx51_pins.h"
27 #include "iomux.h"
28 #include "usb.h"
29
30 #include "mx51_efikamx.h"
31
32 #define POWER_ON        1
33 #define POWER_OFF       0
34
35 #define USB_PAD_CONFIG \
36                         (PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |        \
37                         PAD_CTL_PUE_KEEPER | PAD_CTL_PKE_ENABLE | PAD_CTL_HYS_ENABLE)
38
39 static struct mxc_iomux_pin_cfg __initdata mx51_efikamx_usb_iomux_pins[] = {
40         /* USBH2_DATA0 */
41         {
42          MX51_PIN_EIM_D16, IOMUX_CONFIG_ALT2,
43          (PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH | PAD_CTL_ODE_OPENDRAIN_NONE |
44           PAD_CTL_100K_PU | PAD_CTL_PUE_KEEPER | PAD_CTL_PKE_ENABLE |
45           PAD_CTL_HYS_ENABLE),
46          },
47         /* USBH2_DATA1 */
48         {       MX51_PIN_EIM_D17, IOMUX_CONFIG_ALT2, USB_PAD_CONFIG,    },
49         /* USBH2_DATA2 */
50         {       MX51_PIN_EIM_D18, IOMUX_CONFIG_ALT2, USB_PAD_CONFIG,    },
51         /* USBH2_DATA3 */
52         {       MX51_PIN_EIM_D19, IOMUX_CONFIG_ALT2, USB_PAD_CONFIG,    },
53         /* USBH2_DATA4 */
54         {       MX51_PIN_EIM_D20, IOMUX_CONFIG_ALT2, USB_PAD_CONFIG,    },
55         /* USBH2_DATA5 */
56         {       MX51_PIN_EIM_D21, IOMUX_CONFIG_ALT2, USB_PAD_CONFIG,    },
57         /* USBH2_DATA6 */
58         {       MX51_PIN_EIM_D22, IOMUX_CONFIG_ALT2, USB_PAD_CONFIG,    },
59         /* USBH2_DATA7 */
60         {       MX51_PIN_EIM_D23, IOMUX_CONFIG_ALT2, USB_PAD_CONFIG,    },
61         /* USBH2_CLK */
62         {       MX51_PIN_EIM_A24, IOMUX_CONFIG_ALT2, USB_PAD_CONFIG,    },
63         /* USBH2_DIR */
64         {       MX51_PIN_EIM_A25, IOMUX_CONFIG_ALT2, USB_PAD_CONFIG,    },
65         /* USBH2_STP */
66         {       MX51_PIN_EIM_A26, IOMUX_CONFIG_ALT2, USB_PAD_CONFIG,    },
67         /* USBH2_NXT */
68         {       MX51_PIN_EIM_A27, IOMUX_CONFIG_ALT2, USB_PAD_CONFIG,    },
69         {
70          MX51_PIN_USBH1_STP, IOMUX_CONFIG_ALT0,
71          (PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER |
72           PAD_CTL_PKE_ENABLE | PAD_CTL_HYS_ENABLE),
73          },
74         {
75          MX51_PIN_USBH1_CLK, IOMUX_CONFIG_ALT0,
76          (PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER |
77           PAD_CTL_PKE_ENABLE | PAD_CTL_HYS_ENABLE | PAD_CTL_DDR_INPUT_CMOS),
78          },
79         {
80          MX51_PIN_USBH1_DIR, IOMUX_CONFIG_ALT0,
81          (PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER |
82           PAD_CTL_PKE_ENABLE | PAD_CTL_HYS_ENABLE | PAD_CTL_DDR_INPUT_CMOS),
83          },
84         {
85          MX51_PIN_USBH1_NXT, IOMUX_CONFIG_ALT0,
86          (PAD_CTL_SRE_FAST | PAD_CTL_DRV_HIGH | PAD_CTL_PUE_KEEPER |
87           PAD_CTL_PKE_ENABLE | PAD_CTL_HYS_ENABLE | PAD_CTL_DDR_INPUT_CMOS),
88          },
89         {       MX51_PIN_USBH1_DATA0, IOMUX_CONFIG_ALT0, USB_PAD_CONFIG, },
90         {       MX51_PIN_USBH1_DATA1, IOMUX_CONFIG_ALT0, USB_PAD_CONFIG, },
91         {       MX51_PIN_USBH1_DATA2, IOMUX_CONFIG_ALT0, USB_PAD_CONFIG, },
92         {       MX51_PIN_USBH1_DATA3, IOMUX_CONFIG_ALT0, USB_PAD_CONFIG, },
93         {       MX51_PIN_USBH1_DATA4, IOMUX_CONFIG_ALT0, USB_PAD_CONFIG, },
94         {       MX51_PIN_USBH1_DATA5, IOMUX_CONFIG_ALT0, USB_PAD_CONFIG, },
95         {       MX51_PIN_USBH1_DATA6, IOMUX_CONFIG_ALT0, USB_PAD_CONFIG, },
96         {       MX51_PIN_USBH1_DATA7, IOMUX_CONFIG_ALT0, USB_PAD_CONFIG, },
97 };
98
99 #define EFIKAMX_USB_HUB_RESET   MX51_PIN_GPIO1_5
100 #define EFIKAMX_USB_PHY_RESET   MX51_PIN_EIM_D27
101
102 struct mxc_iomux_pin_cfg mx51_efikamx_usb_control_pins[] = {
103         {
104          EFIKAMX_USB_HUB_RESET, IOMUX_CONFIG_ALT0,
105          (PAD_CTL_DRV_HIGH | PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST),
106         },
107         {
108          EFIKAMX_USB_PHY_RESET, 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 mx51_efikamx_usb_hub_reset(void)
116 {
117         gpio_set_value(IOMUX_TO_GPIO(EFIKAMX_USB_HUB_RESET), 1);
118         msleep(1);
119         gpio_set_value(IOMUX_TO_GPIO(EFIKAMX_USB_HUB_RESET), 0);
120         msleep(1);
121         gpio_set_value(IOMUX_TO_GPIO(EFIKAMX_USB_HUB_RESET), 1);
122 }
123
124 void mx51_efikamx_usb_phy_reset(void)
125 {
126         gpio_direction_output(IOMUX_TO_GPIO(EFIKAMX_USB_PHY_RESET), 1);
127 }
128
129 void __init mx51_efikamx_init_usb(void)
130 {
131         CONFIG_IOMUX(mx51_efikamx_usb_iomux_pins);
132         CONFIG_IOMUX(mx51_efikamx_usb_control_pins);
133
134         gpio_request(IOMUX_TO_GPIO(EFIKAMX_USB_HUB_RESET), "usb:hub_reset");
135         gpio_direction_output(IOMUX_TO_GPIO(EFIKAMX_USB_HUB_RESET), 1);
136
137         gpio_request(IOMUX_TO_GPIO(EFIKAMX_USB_PHY_RESET), "usb:phy_reset");
138         gpio_direction_output(IOMUX_TO_GPIO(EFIKAMX_USB_PHY_RESET), 0);
139
140         mx51_efikamx_usb_hub_reset();
141
142         mx51_efikamx_bluetooth_power(POWER_ON);
143         mx51_efikamx_wifi_power(POWER_ON);
144         mx51_efikamx_wifi_reset();
145
146         mx51_efikamx_usb_phy_reset();
147
148         if (machine_is_mx51_efikasb()) {
149                 mx51_efikamx_wwan_power(POWER_ON);
150                 mx51_efikamx_camera_power(POWER_ON);
151         }
152
153         mx5_usb_dr_init();
154         mx5_usbh1_init();
155
156         if (machine_is_mx51_efikasb()) {
157                 mx51_usbh2_init();
158         }
159 }
160