Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
mach-vpr200.c
Go to the documentation of this file.
1 /*
2  * Copyright 2009 Freescale Semiconductor, Inc. All Rights Reserved.
3  * Copyright (C) 2009 Marc Kleine-Budde, Pengutronix
4  * Copyright 2010 Creative Product Design
5  *
6  * Derived from mx35 3stack.
7  * Original author: Fabio Estevam <[email protected]>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  */
19 
20 #include <linux/types.h>
21 #include <linux/init.h>
22 #include <linux/platform_device.h>
23 #include <linux/mtd/physmap.h>
24 #include <linux/memory.h>
25 #include <linux/gpio.h>
26 
27 #include <asm/mach-types.h>
28 #include <asm/mach/arch.h>
29 #include <asm/mach/time.h>
30 
31 #include <mach/hardware.h>
32 #include <mach/common.h>
33 #include <mach/iomux-mx35.h>
34 
35 #include <linux/i2c.h>
36 #include <linux/i2c/at24.h>
37 #include <linux/mfd/mc13xxx.h>
38 
39 #include "devices-imx35.h"
40 
41 #define GPIO_LCDPWR IMX_GPIO_NR(1, 2)
42 #define GPIO_PMIC_INT IMX_GPIO_NR(2, 0)
43 
44 #define GPIO_BUTTON1 IMX_GPIO_NR(1, 4)
45 #define GPIO_BUTTON2 IMX_GPIO_NR(1, 5)
46 #define GPIO_BUTTON3 IMX_GPIO_NR(1, 7)
47 #define GPIO_BUTTON4 IMX_GPIO_NR(1, 8)
48 #define GPIO_BUTTON5 IMX_GPIO_NR(1, 9)
49 #define GPIO_BUTTON6 IMX_GPIO_NR(1, 10)
50 #define GPIO_BUTTON7 IMX_GPIO_NR(1, 11)
51 #define GPIO_BUTTON8 IMX_GPIO_NR(1, 12)
52 
53 static const struct fb_videomode fb_modedb[] = {
54  {
55  /* 800x480 @ 60 Hz */
56  .name = "PT0708048",
57  .refresh = 60,
58  .xres = 800,
59  .yres = 480,
60  .pixclock = KHZ2PICOS(33260),
61  .left_margin = 50,
62  .right_margin = 156,
63  .upper_margin = 10,
64  .lower_margin = 10,
65  .hsync_len = 1, /* note: DE only display */
66  .vsync_len = 1, /* note: DE only display */
68  .vmode = FB_VMODE_NONINTERLACED,
69  .flag = 0,
70  }, {
71  /* 800x480 @ 60 Hz */
72  .name = "CTP-CLAA070LC0ACW",
73  .refresh = 60,
74  .xres = 800,
75  .yres = 480,
76  .pixclock = KHZ2PICOS(27000),
77  .left_margin = 50,
78  .right_margin = 50, /* whole line should have 900 clocks */
79  .upper_margin = 10,
80  .lower_margin = 10, /* whole frame should have 500 lines */
81  .hsync_len = 1, /* note: DE only display */
82  .vsync_len = 1, /* note: DE only display */
84  .vmode = FB_VMODE_NONINTERLACED,
85  .flag = 0,
86  }
87 };
88 
89 static struct mx3fb_platform_data mx3fb_pdata __initdata = {
90  .name = "PT0708048",
91  .mode = fb_modedb,
92  .num_modes = ARRAY_SIZE(fb_modedb),
93 };
94 
95 static struct physmap_flash_data vpr200_flash_data = {
96  .width = 2,
97 };
98 
99 static struct resource vpr200_flash_resource = {
100  .start = MX35_CS0_BASE_ADDR,
101  .end = MX35_CS0_BASE_ADDR + SZ_64M - 1,
102  .flags = IORESOURCE_MEM,
103 };
104 
105 static struct platform_device vpr200_flash = {
106  .name = "physmap-flash",
107  .id = 0,
108  .dev = {
109  .platform_data = &vpr200_flash_data,
110  },
111  .resource = &vpr200_flash_resource,
112  .num_resources = 1,
113 };
114 
115 static const struct mxc_nand_platform_data
116  vpr200_nand_board_info __initconst = {
117  .width = 1,
118  .hw_ecc = 1,
119  .flash_bbt = 1,
120 };
121 
122 #define VPR_KEY_DEBOUNCE 500
123 static struct gpio_keys_button vpr200_gpio_keys_table[] = {
124  {KEY_F2, GPIO_BUTTON1, 1, "vpr-keys: F2", 0, VPR_KEY_DEBOUNCE},
125  {KEY_F3, GPIO_BUTTON2, 1, "vpr-keys: F3", 0, VPR_KEY_DEBOUNCE},
126  {KEY_F4, GPIO_BUTTON3, 1, "vpr-keys: F4", 0, VPR_KEY_DEBOUNCE},
127  {KEY_F5, GPIO_BUTTON4, 1, "vpr-keys: F5", 0, VPR_KEY_DEBOUNCE},
128  {KEY_F6, GPIO_BUTTON5, 1, "vpr-keys: F6", 0, VPR_KEY_DEBOUNCE},
129  {KEY_F7, GPIO_BUTTON6, 1, "vpr-keys: F7", 0, VPR_KEY_DEBOUNCE},
130  {KEY_F8, GPIO_BUTTON7, 1, "vpr-keys: F8", 1, VPR_KEY_DEBOUNCE},
131  {KEY_F9, GPIO_BUTTON8, 1, "vpr-keys: F9", 1, VPR_KEY_DEBOUNCE},
132 };
133 
134 static const struct gpio_keys_platform_data
135  vpr200_gpio_keys_data __initconst = {
136  .buttons = vpr200_gpio_keys_table,
137  .nbuttons = ARRAY_SIZE(vpr200_gpio_keys_table),
138 };
139 
140 static struct mc13xxx_platform_data vpr200_pmic = {
142 };
143 
144 static const struct imxi2c_platform_data vpr200_i2c0_data __initconst = {
145  .bitrate = 50000,
146 };
147 
148 static struct at24_platform_data vpr200_eeprom = {
149  .byte_len = 2048 / 8,
150  .page_size = 1,
151 };
152 
153 static struct i2c_board_info vpr200_i2c_devices[] = {
154  {
155  I2C_BOARD_INFO("at24", 0x50), /* E0=0, E1=0, E2=0 */
156  .platform_data = &vpr200_eeprom,
157  }, {
158  I2C_BOARD_INFO("mc13892", 0x08),
159  .platform_data = &vpr200_pmic,
160  /* irq number is run-time assigned */
161  }
162 };
163 
164 static iomux_v3_cfg_t vpr200_pads[] = {
165  /* UART1 */
168  /* UART3 */
171  /* FEC */
190  /* Display */
212  /* LCD Enable */
214  /* USBOTG */
217  /* SDCARD */
224  /* PMIC */
226  /* GPIO keys */
235 };
236 
237 /* USB Device config */
238 static const struct fsl_usb2_platform_data otg_device_pdata __initconst = {
239  .operating_mode = FSL_USB2_DR_DEVICE,
240  .phy_mode = FSL_USB2_PHY_UTMI,
241  .workaround = FLS_USB2_WORKAROUND_ENGCM09152,
242 };
243 
244 static int vpr200_usbh_init(struct platform_device *pdev)
245 {
246  return mx35_initialize_usb_hw(pdev->id,
248 }
249 
250 /* USB HOST config */
251 static const struct mxc_usbh_platform_data usb_host_pdata __initconst = {
252  .init = vpr200_usbh_init,
253  .portsc = MXC_EHCI_MODE_SERIAL,
254 };
255 
256 static struct platform_device *devices[] __initdata = {
257  &vpr200_flash,
258 };
259 
260 /*
261  * Board specific initialization.
262  */
263 static void __init vpr200_board_init(void)
264 {
265  imx35_soc_init();
266 
267  mxc_iomux_v3_setup_multiple_pads(vpr200_pads, ARRAY_SIZE(vpr200_pads));
268 
271  imx_add_gpio_keys(&vpr200_gpio_keys_data);
272 
273  platform_add_devices(devices, ARRAY_SIZE(devices));
274 
275  if (0 != gpio_request(GPIO_LCDPWR, "LCDPWR"))
276  printk(KERN_WARNING "vpr200: Couldn't get LCDPWR gpio\n");
277  else
279 
280  if (0 != gpio_request(GPIO_PMIC_INT, "PMIC_INT"))
281  printk(KERN_WARNING "vpr200: Couldn't get PMIC_INT gpio\n");
282  else
284 
287 
289  imx35_add_mx3_sdc_fb(&mx3fb_pdata);
290 
291  imx35_add_fsl_usb2_udc(&otg_device_pdata);
292  imx35_add_mxc_ehci_hs(&usb_host_pdata);
293 
294  imx35_add_mxc_nand(&vpr200_nand_board_info);
296 
297  vpr200_i2c_devices[1].irq = gpio_to_irq(GPIO_PMIC_INT);
298  i2c_register_board_info(0, vpr200_i2c_devices,
299  ARRAY_SIZE(vpr200_i2c_devices));
300 
301  imx35_add_imx_i2c0(&vpr200_i2c0_data);
302 }
303 
304 static void __init vpr200_timer_init(void)
305 {
307 }
308 
309 static struct sys_timer vpr200_timer = {
310  .init = vpr200_timer_init,
311 };
312 
313 MACHINE_START(VPR200, "VPR200")
314  /* Maintainer: Creative Product Design */
315  .map_io = mx35_map_io,
316  .init_early = imx35_init_early,
317  .init_irq = mx35_init_irq,
318  .handle_irq = imx35_handle_irq,
319  .timer = &vpr200_timer,
320  .init_machine = vpr200_board_init,
321  .restart = mxc_restart,