aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-mx3/mx31moboard-devboard.c
diff options
context:
space:
mode:
authorAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
committerAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
commitada47b5fe13d89735805b566185f4885f5a3f750 (patch)
tree644b88f8a71896307d71438e9b3af49126ffb22b /arch/arm/mach-mx3/mx31moboard-devboard.c
parent43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff)
parent3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff)
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'arch/arm/mach-mx3/mx31moboard-devboard.c')
-rw-r--r--arch/arm/mach-mx3/mx31moboard-devboard.c119
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
44static struct imxuart_platform_data uart_pdata = { 58static 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
120static 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
145static 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
164static 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
183static 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
193static 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
199static 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}