diff options
Diffstat (limited to 'arch/arm/mach-mx3/mx31moboard-devboard.c')
-rw-r--r-- | arch/arm/mach-mx3/mx31moboard-devboard.c | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/arch/arm/mach-mx3/mx31moboard-devboard.c b/arch/arm/mach-mx3/mx31moboard-devboard.c index 5592cdb8d0ad..11b906ce7eae 100644 --- a/arch/arm/mach-mx3/mx31moboard-devboard.c +++ b/arch/arm/mach-mx3/mx31moboard-devboard.c | |||
@@ -20,13 +20,18 @@ | |||
20 | #include <linux/init.h> | 20 | #include <linux/init.h> |
21 | #include <linux/interrupt.h> | 21 | #include <linux/interrupt.h> |
22 | #include <linux/platform_device.h> | 22 | #include <linux/platform_device.h> |
23 | #include <linux/slab.h> | ||
23 | #include <linux/types.h> | 24 | #include <linux/types.h> |
24 | 25 | ||
26 | #include <linux/usb/otg.h> | ||
27 | |||
25 | #include <mach/common.h> | 28 | #include <mach/common.h> |
26 | #include <mach/imx-uart.h> | 29 | #include <mach/imx-uart.h> |
27 | #include <mach/iomux-mx3.h> | 30 | #include <mach/iomux-mx3.h> |
28 | #include <mach/hardware.h> | 31 | #include <mach/hardware.h> |
29 | #include <mach/mmc.h> | 32 | #include <mach/mmc.h> |
33 | #include <mach/mxc_ehci.h> | ||
34 | #include <mach/ulpi.h> | ||
30 | 35 | ||
31 | #include "devices.h" | 36 | #include "devices.h" |
32 | 37 | ||
@@ -39,6 +44,15 @@ static unsigned int devboard_pins[] = { | |||
39 | MX31_PIN_PC_READY__SD2_DATA1, MX31_PIN_PC_WAIT_B__SD2_DATA0, | 44 | MX31_PIN_PC_READY__SD2_DATA1, MX31_PIN_PC_WAIT_B__SD2_DATA0, |
40 | MX31_PIN_PC_CD2_B__SD2_CLK, MX31_PIN_PC_CD1_B__SD2_CMD, | 45 | MX31_PIN_PC_CD2_B__SD2_CLK, MX31_PIN_PC_CD1_B__SD2_CMD, |
41 | MX31_PIN_ATA_DIOR__GPIO3_28, MX31_PIN_ATA_DIOW__GPIO3_29, | 46 | MX31_PIN_ATA_DIOR__GPIO3_28, MX31_PIN_ATA_DIOW__GPIO3_29, |
47 | /* USB H1 */ | ||
48 | MX31_PIN_CSPI1_MISO__USBH1_RXDP, MX31_PIN_CSPI1_MOSI__USBH1_RXDM, | ||
49 | MX31_PIN_CSPI1_SS0__USBH1_TXDM, MX31_PIN_CSPI1_SS1__USBH1_TXDP, | ||
50 | MX31_PIN_CSPI1_SS2__USBH1_RCV, MX31_PIN_CSPI1_SCLK__USBH1_OEB, | ||
51 | MX31_PIN_CSPI1_SPI_RDY__USBH1_FS, MX31_PIN_SFS6__USBH1_SUSPEND, | ||
52 | MX31_PIN_NFRE_B__GPIO1_11, MX31_PIN_NFALE__GPIO1_12, | ||
53 | /* SEL */ | ||
54 | MX31_PIN_DTR_DCE1__GPIO2_8, MX31_PIN_DSR_DCE1__GPIO2_9, | ||
55 | MX31_PIN_RI_DCE1__GPIO2_10, MX31_PIN_DCD_DCE1__GPIO2_11, | ||
42 | }; | 56 | }; |
43 | 57 | ||
44 | static struct imxuart_platform_data uart_pdata = { | 58 | static struct imxuart_platform_data uart_pdata = { |
@@ -98,6 +112,107 @@ static struct imxmmc_platform_data sdhc2_pdata = { | |||
98 | .exit = devboard_sdhc2_exit, | 112 | .exit = devboard_sdhc2_exit, |
99 | }; | 113 | }; |
100 | 114 | ||
115 | #define SEL0 IOMUX_TO_GPIO(MX31_PIN_DTR_DCE1) | ||
116 | #define SEL1 IOMUX_TO_GPIO(MX31_PIN_DSR_DCE1) | ||
117 | #define SEL2 IOMUX_TO_GPIO(MX31_PIN_RI_DCE1) | ||
118 | #define SEL3 IOMUX_TO_GPIO(MX31_PIN_DCD_DCE1) | ||
119 | |||
120 | static void devboard_init_sel_gpios(void) | ||
121 | { | ||
122 | if (!gpio_request(SEL0, "sel0")) { | ||
123 | gpio_direction_input(SEL0); | ||
124 | gpio_export(SEL0, true); | ||
125 | } | ||
126 | |||
127 | if (!gpio_request(SEL1, "sel1")) { | ||
128 | gpio_direction_input(SEL1); | ||
129 | gpio_export(SEL1, true); | ||
130 | } | ||
131 | |||
132 | if (!gpio_request(SEL2, "sel2")) { | ||
133 | gpio_direction_input(SEL2); | ||
134 | gpio_export(SEL2, true); | ||
135 | } | ||
136 | |||
137 | if (!gpio_request(SEL3, "sel3")) { | ||
138 | gpio_direction_input(SEL3); | ||
139 | gpio_export(SEL3, true); | ||
140 | } | ||
141 | } | ||
142 | #define USB_PAD_CFG (PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST | PAD_CTL_HYS_CMOS | \ | ||
143 | PAD_CTL_ODE_CMOS | PAD_CTL_100K_PU) | ||
144 | |||
145 | static int devboard_usbh1_hw_init(struct platform_device *pdev) | ||
146 | { | ||
147 | mxc_iomux_set_gpr(MUX_PGP_USB_SUSPEND, true); | ||
148 | |||
149 | mxc_iomux_set_pad(MX31_PIN_CSPI1_MISO, USB_PAD_CFG); | ||
150 | mxc_iomux_set_pad(MX31_PIN_CSPI1_MOSI, USB_PAD_CFG); | ||
151 | mxc_iomux_set_pad(MX31_PIN_CSPI1_SS0, USB_PAD_CFG); | ||
152 | mxc_iomux_set_pad(MX31_PIN_CSPI1_SS1, USB_PAD_CFG); | ||
153 | mxc_iomux_set_pad(MX31_PIN_CSPI1_SS2, USB_PAD_CFG); | ||
154 | mxc_iomux_set_pad(MX31_PIN_CSPI1_SCLK, USB_PAD_CFG); | ||
155 | mxc_iomux_set_pad(MX31_PIN_CSPI1_SPI_RDY, USB_PAD_CFG); | ||
156 | mxc_iomux_set_pad(MX31_PIN_SFS6, USB_PAD_CFG); | ||
157 | |||
158 | return 0; | ||
159 | } | ||
160 | |||
161 | #define USBH1_VBUSEN_B IOMUX_TO_GPIO(MX31_PIN_NFRE_B) | ||
162 | #define USBH1_MODE IOMUX_TO_GPIO(MX31_PIN_NFALE) | ||
163 | |||
164 | static int devboard_isp1105_init(struct otg_transceiver *otg) | ||
165 | { | ||
166 | int ret = gpio_request(USBH1_MODE, "usbh1-mode"); | ||
167 | if (ret) | ||
168 | return ret; | ||
169 | /* single ended */ | ||
170 | gpio_direction_output(USBH1_MODE, 0); | ||
171 | |||
172 | ret = gpio_request(USBH1_VBUSEN_B, "usbh1-vbusen"); | ||
173 | if (ret) { | ||
174 | gpio_free(USBH1_MODE); | ||
175 | return ret; | ||
176 | } | ||
177 | gpio_direction_output(USBH1_VBUSEN_B, 1); | ||
178 | |||
179 | return 0; | ||
180 | } | ||
181 | |||
182 | |||
183 | static int devboard_isp1105_set_vbus(struct otg_transceiver *otg, bool on) | ||
184 | { | ||
185 | if (on) | ||
186 | gpio_set_value(USBH1_VBUSEN_B, 0); | ||
187 | else | ||
188 | gpio_set_value(USBH1_VBUSEN_B, 1); | ||
189 | |||
190 | return 0; | ||
191 | } | ||
192 | |||
193 | static struct mxc_usbh_platform_data usbh1_pdata = { | ||
194 | .init = devboard_usbh1_hw_init, | ||
195 | .portsc = MXC_EHCI_MODE_UTMI | MXC_EHCI_SERIAL, | ||
196 | .flags = MXC_EHCI_POWER_PINS_ENABLED | MXC_EHCI_INTERFACE_SINGLE_UNI, | ||
197 | }; | ||
198 | |||
199 | static int __init devboard_usbh1_init(void) | ||
200 | { | ||
201 | struct otg_transceiver *otg; | ||
202 | |||
203 | otg = kzalloc(sizeof(*otg), GFP_KERNEL); | ||
204 | if (!otg) | ||
205 | return -ENOMEM; | ||
206 | |||
207 | otg->label = "ISP1105"; | ||
208 | otg->init = devboard_isp1105_init; | ||
209 | otg->set_vbus = devboard_isp1105_set_vbus; | ||
210 | |||
211 | usbh1_pdata.otg = otg; | ||
212 | |||
213 | return mxc_register_device(&mxc_usbh1, &usbh1_pdata); | ||
214 | } | ||
215 | |||
101 | /* | 216 | /* |
102 | * system init for baseboard usage. Will be called by mx31moboard init. | 217 | * system init for baseboard usage. Will be called by mx31moboard init. |
103 | */ | 218 | */ |
@@ -111,4 +226,8 @@ void __init mx31moboard_devboard_init(void) | |||
111 | mxc_register_device(&mxc_uart_device1, &uart_pdata); | 226 | mxc_register_device(&mxc_uart_device1, &uart_pdata); |
112 | 227 | ||
113 | mxc_register_device(&mxcsdhc_device1, &sdhc2_pdata); | 228 | mxc_register_device(&mxcsdhc_device1, &sdhc2_pdata); |
229 | |||
230 | devboard_init_sel_gpios(); | ||
231 | |||
232 | devboard_usbh1_init(); | ||
114 | } | 233 | } |