Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
mx31moboard-devboard.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2009 Valentin Longchamp, EPFL Mobots group
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  */
14 
15 #include <linux/gpio.h>
16 #include <linux/init.h>
17 #include <linux/interrupt.h>
18 #include <linux/delay.h>
19 #include <linux/platform_device.h>
20 #include <linux/slab.h>
21 #include <linux/types.h>
22 
23 #include <linux/usb/otg.h>
24 
25 #include <mach/common.h>
26 #include <mach/iomux-mx3.h>
27 #include <mach/hardware.h>
28 #include <mach/ulpi.h>
29 
30 #include "devices-imx31.h"
31 
32 static unsigned int devboard_pins[] = {
33  /* UART1 */
36  /* SDHC2 */
41  /* USB H1 */
47  /* SEL */
50 };
51 
52 static const struct imxuart_platform_data uart_pdata __initconst = {
53  .flags = IMXUART_HAVE_RTSCTS,
54 };
55 
56 #define SDHC2_CD IOMUX_TO_GPIO(MX31_PIN_ATA_DIOR)
57 #define SDHC2_WP IOMUX_TO_GPIO(MX31_PIN_ATA_DIOW)
58 
59 static int devboard_sdhc2_get_ro(struct device *dev)
60 {
61  return !gpio_get_value(SDHC2_WP);
62 }
63 
64 static int devboard_sdhc2_init(struct device *dev, irq_handler_t detect_irq,
65  void *data)
66 {
67  int ret;
68 
69  ret = gpio_request(SDHC2_CD, "sdhc-detect");
70  if (ret)
71  return ret;
72 
74 
75  ret = gpio_request(SDHC2_WP, "sdhc-wp");
76  if (ret)
77  goto err_gpio_free;
79 
80  ret = request_irq(gpio_to_irq(SDHC2_CD), detect_irq,
82  "sdhc2-card-detect", data);
83  if (ret)
84  goto err_gpio_free_2;
85 
86  return 0;
87 
88 err_gpio_free_2:
90 err_gpio_free:
92 
93  return ret;
94 }
95 
96 static void devboard_sdhc2_exit(struct device *dev, void *data)
97 {
101 }
102 
103 static const struct imxmmc_platform_data sdhc2_pdata __initconst = {
104  .get_ro = devboard_sdhc2_get_ro,
105  .init = devboard_sdhc2_init,
106  .exit = devboard_sdhc2_exit,
107 };
108 
109 #define SEL0 IOMUX_TO_GPIO(MX31_PIN_DTR_DCE1)
110 #define SEL1 IOMUX_TO_GPIO(MX31_PIN_DSR_DCE1)
111 #define SEL2 IOMUX_TO_GPIO(MX31_PIN_RI_DCE1)
112 #define SEL3 IOMUX_TO_GPIO(MX31_PIN_DCD_DCE1)
113 
114 static void devboard_init_sel_gpios(void)
115 {
116  if (!gpio_request(SEL0, "sel0")) {
118  gpio_export(SEL0, true);
119  }
120 
121  if (!gpio_request(SEL1, "sel1")) {
123  gpio_export(SEL1, true);
124  }
125 
126  if (!gpio_request(SEL2, "sel2")) {
128  gpio_export(SEL2, true);
129  }
130 
131  if (!gpio_request(SEL3, "sel3")) {
133  gpio_export(SEL3, true);
134  }
135 }
136 #define USB_PAD_CFG (PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST | PAD_CTL_HYS_CMOS | \
137  PAD_CTL_ODE_CMOS | PAD_CTL_100K_PU)
138 
139 static int devboard_usbh1_hw_init(struct platform_device *pdev)
140 {
142 
151 
152  mdelay(10);
153 
156 }
157 
158 #define USBH1_VBUSEN_B IOMUX_TO_GPIO(MX31_PIN_NFRE_B)
159 #define USBH1_MODE IOMUX_TO_GPIO(MX31_PIN_NFALE)
160 
161 static int devboard_isp1105_init(struct usb_phy *otg)
162 {
163  int ret = gpio_request(USBH1_MODE, "usbh1-mode");
164  if (ret)
165  return ret;
166  /* single ended */
168 
169  ret = gpio_request(USBH1_VBUSEN_B, "usbh1-vbusen");
170  if (ret) {
172  return ret;
173  }
175 
176  return 0;
177 }
178 
179 
180 static int devboard_isp1105_set_vbus(struct usb_otg *otg, bool on)
181 {
182  if (on)
184  else
186 
187  return 0;
188 }
189 
190 static struct mxc_usbh_platform_data usbh1_pdata __initdata = {
191  .init = devboard_usbh1_hw_init,
193 };
194 
195 static int __init devboard_usbh1_init(void)
196 {
197  struct usb_phy *phy;
198  struct platform_device *pdev;
199 
200  phy = kzalloc(sizeof(*phy), GFP_KERNEL);
201  if (!phy)
202  return -ENOMEM;
203 
204  phy->otg = kzalloc(sizeof(struct usb_otg), GFP_KERNEL);
205  if (!phy->otg) {
206  kfree(phy);
207  return -ENOMEM;
208  }
209 
210  phy->label = "ISP1105";
211  phy->init = devboard_isp1105_init;
212  phy->otg->set_vbus = devboard_isp1105_set_vbus;
213 
214  usbh1_pdata.otg = phy;
215 
216  pdev = imx31_add_mxc_ehci_hs(1, &usbh1_pdata);
217  if (IS_ERR(pdev))
218  return PTR_ERR(pdev);
219 
220  return 0;
221 }
222 
223 
224 static const struct fsl_usb2_platform_data usb_pdata __initconst = {
225  .operating_mode = FSL_USB2_DR_DEVICE,
226  .phy_mode = FSL_USB2_PHY_ULPI,
227 };
228 
229 /*
230  * system init for baseboard usage. Will be called by mx31moboard init.
231  */
233 {
234  printk(KERN_INFO "Initializing mx31devboard peripherals\n");
235 
236  mxc_iomux_setup_multiple_pins(devboard_pins, ARRAY_SIZE(devboard_pins),
237  "devboard");
238 
239  imx31_add_imx_uart1(&uart_pdata);
240 
241  imx31_add_mxc_mmc(1, &sdhc2_pdata);
242 
243  devboard_init_sel_gpios();
244 
245  imx31_add_fsl_usb2_udc(&usb_pdata);
246 
247  devboard_usbh1_init();
248 }