Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
mach-cpuimx27.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2009 Eric Benard - [email protected]
3  *
4  * Based on pcm038.c which is :
5  * Copyright 2007 Robert Schwebel <[email protected]>, Pengutronix
6  * Copyright (C) 2008 Juergen Beisert ([email protected])
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
20  * MA 02110-1301, USA.
21  */
22 
23 #include <linux/i2c.h>
24 #include <linux/io.h>
25 #include <linux/mtd/plat-ram.h>
26 #include <linux/mtd/physmap.h>
27 #include <linux/platform_device.h>
28 #include <linux/serial_8250.h>
29 #include <linux/usb/otg.h>
30 #include <linux/usb/ulpi.h>
31 
32 #include <asm/mach-types.h>
33 #include <asm/mach/arch.h>
34 #include <asm/mach/time.h>
35 #include <asm/mach/map.h>
36 
37 #include <mach/eukrea-baseboards.h>
38 #include <mach/common.h>
39 #include <mach/hardware.h>
40 #include <mach/iomux-mx27.h>
41 #include <mach/ulpi.h>
42 
43 #include "devices-imx27.h"
44 
45 static const int eukrea_cpuimx27_pins[] __initconst = {
46  /* UART1 */
51  /* UART4 */
52 #if defined(MACH_EUKREA_CPUIMX27_USEUART4)
57 #endif
58  /* FEC */
77  /* I2C1 */
80  /* SDHC2 */
81 #if defined(CONFIG_MACH_EUKREA_CPUIMX27_USESDHC2)
88 #endif
89 #if defined(CONFIG_SERIAL_8250) || defined(CONFIG_SERIAL_8250_MODULE)
90  /* Quad UART's IRQ */
91  GPIO_PORTB | 22 | GPIO_GPIO | GPIO_IN,
92  GPIO_PORTB | 23 | GPIO_GPIO | GPIO_IN,
93  GPIO_PORTB | 27 | GPIO_GPIO | GPIO_IN,
94  GPIO_PORTB | 30 | GPIO_GPIO | GPIO_IN,
95 #endif
96  /* OTG */
109  /* USBH2 */
122 };
123 
124 static struct physmap_flash_data eukrea_cpuimx27_flash_data = {
125  .width = 2,
126 };
127 
128 static struct resource eukrea_cpuimx27_flash_resource = {
129  .start = 0xc0000000,
130  .end = 0xc3ffffff,
131  .flags = IORESOURCE_MEM,
132 };
133 
134 static struct platform_device eukrea_cpuimx27_nor_mtd_device = {
135  .name = "physmap-flash",
136  .id = 0,
137  .dev = {
138  .platform_data = &eukrea_cpuimx27_flash_data,
139  },
140  .num_resources = 1,
141  .resource = &eukrea_cpuimx27_flash_resource,
142 };
143 
144 static const struct imxuart_platform_data uart_pdata __initconst = {
145  .flags = IMXUART_HAVE_RTSCTS,
146 };
147 
148 static const struct mxc_nand_platform_data
149 cpuimx27_nand_board_info __initconst = {
150  .width = 1,
151  .hw_ecc = 1,
152 };
153 
154 static struct platform_device *platform_devices[] __initdata = {
155  &eukrea_cpuimx27_nor_mtd_device,
156 };
157 
158 static const struct imxi2c_platform_data cpuimx27_i2c1_data __initconst = {
159  .bitrate = 100000,
160 };
161 
162 static struct i2c_board_info eukrea_cpuimx27_i2c_devices[] = {
163  {
164  I2C_BOARD_INFO("pcf8563", 0x51),
165  },
166 };
167 
168 #if defined(CONFIG_SERIAL_8250) || defined(CONFIG_SERIAL_8250_MODULE)
169 static struct plat_serial8250_port serial_platform_data[] = {
170  {
171  .mapbase = (unsigned long)(MX27_CS3_BASE_ADDR + 0x200000),
172  /* irq number is run-time assigned */
173  .uartclk = 14745600,
174  .regshift = 1,
175  .iotype = UPIO_MEM,
177  }, {
178  .mapbase = (unsigned long)(MX27_CS3_BASE_ADDR + 0x400000),
179  /* irq number is run-time assigned */
180  .uartclk = 14745600,
181  .regshift = 1,
182  .iotype = UPIO_MEM,
184  }, {
185  .mapbase = (unsigned long)(MX27_CS3_BASE_ADDR + 0x800000),
186  /* irq number is run-time assigned */
187  .uartclk = 14745600,
188  .regshift = 1,
189  .iotype = UPIO_MEM,
191  }, {
192  .mapbase = (unsigned long)(MX27_CS3_BASE_ADDR + 0x1000000),
193  /* irq number is run-time assigned */
194  .uartclk = 14745600,
195  .regshift = 1,
196  .iotype = UPIO_MEM,
198  }, {
199  }
200 };
201 
202 static struct platform_device serial_device = {
203  .name = "serial8250",
204  .id = 0,
205  .dev = {
206  .platform_data = serial_platform_data,
207  },
208 };
209 #endif
210 
211 static int eukrea_cpuimx27_otg_init(struct platform_device *pdev)
212 {
214 }
215 
216 static struct mxc_usbh_platform_data otg_pdata __initdata = {
217  .init = eukrea_cpuimx27_otg_init,
218  .portsc = MXC_EHCI_MODE_ULPI,
219 };
220 
221 static int eukrea_cpuimx27_usbh2_init(struct platform_device *pdev)
222 {
224 }
225 
226 static struct mxc_usbh_platform_data usbh2_pdata __initdata = {
227  .init = eukrea_cpuimx27_usbh2_init,
228  .portsc = MXC_EHCI_MODE_ULPI,
229 };
230 
231 static const struct fsl_usb2_platform_data otg_device_pdata __initconst = {
232  .operating_mode = FSL_USB2_DR_DEVICE,
233  .phy_mode = FSL_USB2_PHY_ULPI,
234 };
235 
236 static bool otg_mode_host __initdata;
237 
238 static int __init eukrea_cpuimx27_otg_mode(char *options)
239 {
240  if (!strcmp(options, "host"))
241  otg_mode_host = true;
242  else if (!strcmp(options, "device"))
243  otg_mode_host = false;
244  else
245  pr_info("otg_mode neither \"host\" nor \"device\". "
246  "Defaulting to device\n");
247  return 1;
248 }
249 __setup("otg_mode=", eukrea_cpuimx27_otg_mode);
250 
251 static void __init eukrea_cpuimx27_init(void)
252 {
253  imx27_soc_init();
254 
255  mxc_gpio_setup_multiple_pins(eukrea_cpuimx27_pins,
256  ARRAY_SIZE(eukrea_cpuimx27_pins), "CPUIMX27");
257 
258  imx27_add_imx_uart0(&uart_pdata);
259 
260  imx27_add_mxc_nand(&cpuimx27_nand_board_info);
261 
262  i2c_register_board_info(0, eukrea_cpuimx27_i2c_devices,
263  ARRAY_SIZE(eukrea_cpuimx27_i2c_devices));
264 
265  imx27_add_imx_i2c(0, &cpuimx27_i2c1_data);
266 
268  platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
271 
272 #if defined(CONFIG_MACH_EUKREA_CPUIMX27_USESDHC2)
273  /* SDHC2 can be used for Wifi */
275 #endif
276 #if defined(MACH_EUKREA_CPUIMX27_USEUART4)
277  /* in which case UART4 is also used for Bluetooth */
278  imx27_add_imx_uart3(&uart_pdata);
279 #endif
280 
281 #if defined(CONFIG_SERIAL_8250) || defined(CONFIG_SERIAL_8250_MODULE)
282  serial_platform_data[0].irq = IMX_GPIO_NR(2, 23);
283  serial_platform_data[1].irq = IMX_GPIO_NR(2, 22);
284  serial_platform_data[2].irq = IMX_GPIO_NR(2, 27);
285  serial_platform_data[3].irq = IMX_GPIO_NR(2, 30);
286  platform_device_register(&serial_device);
287 #endif
288 
289  if (otg_mode_host) {
290  otg_pdata.otg = imx_otg_ulpi_create(ULPI_OTG_DRVVBUS |
292  if (otg_pdata.otg)
293  imx27_add_mxc_ehci_otg(&otg_pdata);
294  } else {
295  imx27_add_fsl_usb2_udc(&otg_device_pdata);
296  }
297 
298  usbh2_pdata.otg = imx_otg_ulpi_create(ULPI_OTG_DRVVBUS |
300  if (usbh2_pdata.otg)
301  imx27_add_mxc_ehci_hs(2, &usbh2_pdata);
302 
303 #ifdef CONFIG_MACH_EUKREA_MBIMX27_BASEBOARD
305 #endif
306 }
307 
308 static void __init eukrea_cpuimx27_timer_init(void)
309 {
310  mx27_clocks_init(26000000);
311 }
312 
313 static struct sys_timer eukrea_cpuimx27_timer = {
314  .init = eukrea_cpuimx27_timer_init,
315 };
316 
317 MACHINE_START(EUKREA_CPUIMX27, "EUKREA CPUIMX27")
318  .atag_offset = 0x100,
319  .map_io = mx27_map_io,
320  .init_early = imx27_init_early,
321  .init_irq = mx27_init_irq,
322  .handle_irq = imx27_handle_irq,
323  .timer = &eukrea_cpuimx27_timer,
324  .init_machine = eukrea_cpuimx27_init,
325  .restart = mxc_restart,