Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
board-ldp.c
Go to the documentation of this file.
1 /*
2  * linux/arch/arm/mach-omap2/board-ldp.c
3  *
4  * Copyright (C) 2008 Texas Instruments Inc.
5  * Nishant Kamat <[email protected]>
6  *
7  * Modified from mach-omap2/board-3430sdp.c
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 version 2 as
11  * published by the Free Software Foundation.
12  */
13 #include <linux/gpio.h>
14 #include <linux/kernel.h>
15 #include <linux/init.h>
16 #include <linux/platform_device.h>
17 #include <linux/delay.h>
18 #include <linux/input.h>
20 #include <linux/gpio_keys.h>
21 #include <linux/workqueue.h>
22 #include <linux/err.h>
23 #include <linux/clk.h>
24 #include <linux/spi/spi.h>
25 #include <linux/regulator/fixed.h>
27 #include <linux/i2c/twl.h>
28 #include <linux/io.h>
29 #include <linux/smsc911x.h>
30 #include <linux/mmc/host.h>
32 
33 #include <asm/mach-types.h>
34 #include <asm/mach/arch.h>
35 #include <asm/mach/map.h>
36 
37 #include "common.h"
38 #include <plat/gpmc.h>
39 #include <mach/board-zoom.h>
40 #include <plat/usb.h>
41 #include "gpmc-smsc911x.h"
42 
43 #include <video/omapdss.h>
45 
46 #include "board-flash.h"
47 #include "mux.h"
48 #include "hsmmc.h"
49 #include "control.h"
50 #include "common-board-devices.h"
51 
52 #define LDP_SMSC911X_CS 1
53 #define LDP_SMSC911X_GPIO 152
54 #define DEBUG_BASE 0x08000000
55 #define LDP_ETHR_START DEBUG_BASE
56 
57 static uint32_t board_keymap[] = {
58  KEY(0, 0, KEY_1),
59  KEY(1, 0, KEY_2),
60  KEY(2, 0, KEY_3),
61  KEY(0, 1, KEY_4),
62  KEY(1, 1, KEY_5),
63  KEY(2, 1, KEY_6),
64  KEY(3, 1, KEY_F5),
65  KEY(0, 2, KEY_7),
66  KEY(1, 2, KEY_8),
67  KEY(2, 2, KEY_9),
68  KEY(3, 2, KEY_F6),
69  KEY(0, 3, KEY_F7),
70  KEY(1, 3, KEY_0),
71  KEY(2, 3, KEY_F8),
72  PERSISTENT_KEY(4, 5),
73  KEY(4, 4, KEY_VOLUMEUP),
74  KEY(5, 5, KEY_VOLUMEDOWN),
75  0
76 };
77 
78 static struct matrix_keymap_data board_map_data = {
79  .keymap = board_keymap,
80  .keymap_size = ARRAY_SIZE(board_keymap),
81 };
82 
83 static struct twl4030_keypad_data ldp_kp_twl4030_data = {
84  .keymap_data = &board_map_data,
85  .rows = 6,
86  .cols = 6,
87  .rep = 1,
88 };
89 
90 static struct gpio_keys_button ldp_gpio_keys_buttons[] = {
91  [0] = {
92  .code = KEY_ENTER,
93  .gpio = 101,
94  .desc = "enter sw",
95  .active_low = 1,
96  .debounce_interval = 30,
97  },
98  [1] = {
99  .code = KEY_F1,
100  .gpio = 102,
101  .desc = "func 1",
102  .active_low = 1,
103  .debounce_interval = 30,
104  },
105  [2] = {
106  .code = KEY_F2,
107  .gpio = 103,
108  .desc = "func 2",
109  .active_low = 1,
110  .debounce_interval = 30,
111  },
112  [3] = {
113  .code = KEY_F3,
114  .gpio = 104,
115  .desc = "func 3",
116  .active_low = 1,
117  .debounce_interval = 30,
118  },
119  [4] = {
120  .code = KEY_F4,
121  .gpio = 105,
122  .desc = "func 4",
123  .active_low = 1,
124  .debounce_interval = 30,
125  },
126  [5] = {
127  .code = KEY_LEFT,
128  .gpio = 106,
129  .desc = "left sw",
130  .active_low = 1,
131  .debounce_interval = 30,
132  },
133  [6] = {
134  .code = KEY_RIGHT,
135  .gpio = 107,
136  .desc = "right sw",
137  .active_low = 1,
138  .debounce_interval = 30,
139  },
140  [7] = {
141  .code = KEY_UP,
142  .gpio = 108,
143  .desc = "up sw",
144  .active_low = 1,
145  .debounce_interval = 30,
146  },
147  [8] = {
148  .code = KEY_DOWN,
149  .gpio = 109,
150  .desc = "down sw",
151  .active_low = 1,
152  .debounce_interval = 30,
153  },
154 };
155 
156 static struct gpio_keys_platform_data ldp_gpio_keys = {
157  .buttons = ldp_gpio_keys_buttons,
158  .nbuttons = ARRAY_SIZE(ldp_gpio_keys_buttons),
159  .rep = 1,
160 };
161 
162 static struct platform_device ldp_gpio_keys_device = {
163  .name = "gpio-keys",
164  .id = -1,
165  .dev = {
166  .platform_data = &ldp_gpio_keys,
167  },
168 };
169 
170 static struct omap_smsc911x_platform_data smsc911x_cfg = {
171  .cs = LDP_SMSC911X_CS,
172  .gpio_irq = LDP_SMSC911X_GPIO,
173  .gpio_reset = -EINVAL,
174  .flags = SMSC911X_USE_32BIT,
175 };
176 
177 static inline void __init ldp_init_smsc911x(void)
178 {
179  gpmc_smsc911x_init(&smsc911x_cfg);
180 }
181 
182 /* LCD */
183 
184 static int ldp_backlight_gpio;
185 static int ldp_lcd_enable_gpio;
186 
187 #define LCD_PANEL_RESET_GPIO 55
188 #define LCD_PANEL_QVGA_GPIO 56
189 
190 static int ldp_panel_enable_lcd(struct omap_dss_device *dssdev)
191 {
192  if (gpio_is_valid(ldp_lcd_enable_gpio))
193  gpio_direction_output(ldp_lcd_enable_gpio, 1);
194  if (gpio_is_valid(ldp_backlight_gpio))
195  gpio_direction_output(ldp_backlight_gpio, 1);
196 
197  return 0;
198 }
199 
200 static void ldp_panel_disable_lcd(struct omap_dss_device *dssdev)
201 {
202  if (gpio_is_valid(ldp_lcd_enable_gpio))
203  gpio_direction_output(ldp_lcd_enable_gpio, 0);
204  if (gpio_is_valid(ldp_backlight_gpio))
205  gpio_direction_output(ldp_backlight_gpio, 0);
206 }
207 
208 static struct panel_generic_dpi_data ldp_panel_data = {
209  .name = "nec_nl2432dr22-11b",
210  .platform_enable = ldp_panel_enable_lcd,
211  .platform_disable = ldp_panel_disable_lcd,
212 };
213 
214 static struct omap_dss_device ldp_lcd_device = {
215  .name = "lcd",
216  .driver_name = "generic_dpi_panel",
217  .type = OMAP_DISPLAY_TYPE_DPI,
218  .phy.dpi.data_lines = 18,
219  .data = &ldp_panel_data,
220 };
221 
222 static struct omap_dss_device *ldp_dss_devices[] = {
223  &ldp_lcd_device,
224 };
225 
226 static struct omap_dss_board_info ldp_dss_data = {
227  .num_devices = ARRAY_SIZE(ldp_dss_devices),
228  .devices = ldp_dss_devices,
229  .default_device = &ldp_lcd_device,
230 };
231 
232 static void __init ldp_display_init(void)
233 {
234  int r;
235 
236  static struct gpio gpios[] __initdata = {
239  };
240 
241  r = gpio_request_array(gpios, ARRAY_SIZE(gpios));
242  if (r) {
243  pr_err("Cannot request LCD GPIOs, error %d\n", r);
244  return;
245  }
246 
247  omap_display_init(&ldp_dss_data);
248 }
249 
250 static int ldp_twl_gpio_setup(struct device *dev, unsigned gpio, unsigned ngpio)
251 {
252  int r;
253 
254  struct gpio gpios[] = {
255  {gpio + 7 , GPIOF_OUT_INIT_LOW, "LCD ENABLE"},
256  {gpio + 15, GPIOF_OUT_INIT_LOW, "LCD BACKLIGHT"},
257  };
258 
259  r = gpio_request_array(gpios, ARRAY_SIZE(gpios));
260  if (r) {
261  pr_err("Cannot request LCD GPIOs, error %d\n", r);
262  ldp_backlight_gpio = -EINVAL;
263  ldp_lcd_enable_gpio = -EINVAL;
264  return r;
265  }
266 
267  ldp_backlight_gpio = gpio + 15;
268  ldp_lcd_enable_gpio = gpio + 7;
269 
270  return 0;
271 }
272 
273 static struct twl4030_gpio_platform_data ldp_gpio_data = {
274  .setup = ldp_twl_gpio_setup,
275 };
276 
277 static struct regulator_consumer_supply ldp_vmmc1_supply[] = {
278  REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
279 };
280 
281 /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
282 static struct regulator_init_data ldp_vmmc1 = {
283  .constraints = {
284  .min_uV = 1850000,
285  .max_uV = 3150000,
286  .valid_modes_mask = REGULATOR_MODE_NORMAL
288  .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
291  },
292  .num_consumer_supplies = ARRAY_SIZE(ldp_vmmc1_supply),
293  .consumer_supplies = ldp_vmmc1_supply,
294 };
295 
296 /* ads7846 on SPI */
297 static struct regulator_consumer_supply ldp_vaux1_supplies[] = {
298  REGULATOR_SUPPLY("vcc", "spi1.0"),
299 };
300 
301 /* VAUX1 */
302 static struct regulator_init_data ldp_vaux1 = {
303  .constraints = {
304  .min_uV = 3000000,
305  .max_uV = 3000000,
306  .apply_uV = true,
307  .valid_modes_mask = REGULATOR_MODE_NORMAL
309  .valid_ops_mask = REGULATOR_CHANGE_MODE
311  },
312  .num_consumer_supplies = ARRAY_SIZE(ldp_vaux1_supplies),
313  .consumer_supplies = ldp_vaux1_supplies,
314 };
315 
316 static struct regulator_consumer_supply ldp_vpll2_supplies[] = {
317  REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
318  REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
319 };
320 
321 static struct regulator_init_data ldp_vpll2 = {
322  .constraints = {
323  .name = "VDVI",
324  .min_uV = 1800000,
325  .max_uV = 1800000,
326  .apply_uV = true,
327  .valid_modes_mask = REGULATOR_MODE_NORMAL
329  .valid_ops_mask = REGULATOR_CHANGE_MODE
331  },
332  .num_consumer_supplies = ARRAY_SIZE(ldp_vpll2_supplies),
333  .consumer_supplies = ldp_vpll2_supplies,
334 };
335 
336 static struct twl4030_platform_data ldp_twldata = {
337  /* platform_data for children goes here */
338  .vmmc1 = &ldp_vmmc1,
339  .vaux1 = &ldp_vaux1,
340  .vpll2 = &ldp_vpll2,
341  .gpio = &ldp_gpio_data,
342  .keypad = &ldp_kp_twl4030_data,
343 };
344 
345 static int __init omap_i2c_init(void)
346 {
347  omap3_pmic_get_config(&ldp_twldata,
349  omap3_pmic_init("twl4030", &ldp_twldata);
350  omap_register_i2c_bus(2, 400, NULL, 0);
351  omap_register_i2c_bus(3, 400, NULL, 0);
352  return 0;
353 }
354 
355 static struct omap2_hsmmc_info mmc[] __initdata = {
356  {
357  .mmc = 1,
358  .caps = MMC_CAP_4_BIT_DATA,
359  .gpio_cd = -EINVAL,
360  .gpio_wp = -EINVAL,
361  },
362  {} /* Terminator */
363 };
364 
365 static struct platform_device *ldp_devices[] __initdata = {
366  &ldp_gpio_keys_device,
367 };
368 
369 #ifdef CONFIG_OMAP_MUX
370 static struct omap_board_mux board_mux[] __initdata = {
371  { .reg_offset = OMAP_MUX_TERMINATOR },
372 };
373 #endif
374 
375 static struct mtd_partition ldp_nand_partitions[] = {
376  /* All the partition sizes are listed in terms of NAND block size */
377  {
378  .name = "X-Loader-NAND",
379  .offset = 0,
380  .size = 4 * (64 * 2048), /* 512KB, 0x80000 */
381  .mask_flags = MTD_WRITEABLE, /* force read-only */
382  },
383  {
384  .name = "U-Boot-NAND",
385  .offset = MTDPART_OFS_APPEND, /* Offset = 0x80000 */
386  .size = 10 * (64 * 2048), /* 1.25MB, 0x140000 */
387  .mask_flags = MTD_WRITEABLE, /* force read-only */
388  },
389  {
390  .name = "Boot Env-NAND",
391  .offset = MTDPART_OFS_APPEND, /* Offset = 0x1c0000 */
392  .size = 2 * (64 * 2048), /* 256KB, 0x40000 */
393  },
394  {
395  .name = "Kernel-NAND",
396  .offset = MTDPART_OFS_APPEND, /* Offset = 0x0200000*/
397  .size = 240 * (64 * 2048), /* 30M, 0x1E00000 */
398  },
399  {
400  .name = "File System - NAND",
401  .offset = MTDPART_OFS_APPEND, /* Offset = 0x2000000 */
402  .size = MTDPART_SIZ_FULL, /* 96MB, 0x6000000 */
403  },
404 
405 };
406 
407 static struct regulator_consumer_supply dummy_supplies[] = {
408  REGULATOR_SUPPLY("vddvario", "smsc911x.0"),
409  REGULATOR_SUPPLY("vdd33a", "smsc911x.0"),
410 };
411 
412 static void __init omap_ldp_init(void)
413 {
414  regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies));
416  ldp_init_smsc911x();
417  omap_i2c_init();
418  platform_add_devices(ldp_devices, ARRAY_SIZE(ldp_devices));
419  omap_ads7846_init(1, 54, 310, NULL);
423  board_nand_init(ldp_nand_partitions,
424  ARRAY_SIZE(ldp_nand_partitions), ZOOM_NAND_CS, 0);
425 
426  omap_hsmmc_init(mmc);
427  ldp_display_init();
428 }
429 
430 MACHINE_START(OMAP_LDP, "OMAP LDP board")
431  .atag_offset = 0x100,
432  .reserve = omap_reserve,
433  .map_io = omap3_map_io,
434  .init_early = omap3430_init_early,
435  .init_irq = omap3_init_irq,
436  .handle_irq = omap3_intc_handle_irq,
437  .init_machine = omap_ldp_init,
438  .init_late = omap3430_init_late,
439  .timer = &omap3_timer,
440  .restart = omap_prcm_restart,