Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
board-devkit8000.c
Go to the documentation of this file.
1 /*
2  * board-devkit8000.c - TimLL Devkit8000
3  *
4  * Copyright (C) 2009 Kim Botherway
5  * Copyright (C) 2010 Thomas Weber
6  *
7  * Modified from mach-omap2/board-omap3beagle.c
8  *
9  * Initial code: Syed Mohammed Khasim
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License version 2 as
13  * published by the Free Software Foundation.
14  */
15 
16 #include <linux/kernel.h>
17 #include <linux/init.h>
18 #include <linux/platform_device.h>
19 #include <linux/delay.h>
20 #include <linux/err.h>
21 #include <linux/clk.h>
22 #include <linux/io.h>
23 #include <linux/leds.h>
24 #include <linux/gpio.h>
25 #include <linux/input.h>
26 #include <linux/gpio_keys.h>
27 
28 #include <linux/mtd/mtd.h>
29 #include <linux/mtd/partitions.h>
30 #include <linux/mtd/nand.h>
31 #include <linux/mmc/host.h>
32 
34 #include <linux/i2c/twl.h>
35 #include "id.h"
36 #include <asm/mach-types.h>
37 #include <asm/mach/arch.h>
38 #include <asm/mach/map.h>
39 #include <asm/mach/flash.h>
40 
41 #include "common.h"
42 #include <plat/gpmc.h>
44 #include <plat/usb.h>
45 #include <video/omapdss.h>
48 
51 #include <linux/spi/spi.h>
52 #include <linux/dm9000.h>
53 #include <linux/interrupt.h>
54 
56 #include "mux.h"
57 #include "hsmmc.h"
58 #include "common-board-devices.h"
59 
60 #define OMAP_DM9000_GPIO_IRQ 25
61 #define OMAP3_DEVKIT_TS_GPIO 27
62 
63 static struct mtd_partition devkit8000_nand_partitions[] = {
64  /* All the partition sizes are listed in terms of NAND block size */
65  {
66  .name = "X-Loader",
67  .offset = 0,
68  .size = 4 * NAND_BLOCK_SIZE,
69  .mask_flags = MTD_WRITEABLE, /* force read-only */
70  },
71  {
72  .name = "U-Boot",
73  .offset = MTDPART_OFS_APPEND, /* Offset = 0x80000 */
74  .size = 15 * NAND_BLOCK_SIZE,
75  .mask_flags = MTD_WRITEABLE, /* force read-only */
76  },
77  {
78  .name = "U-Boot Env",
79  .offset = MTDPART_OFS_APPEND, /* Offset = 0x260000 */
80  .size = 1 * NAND_BLOCK_SIZE,
81  },
82  {
83  .name = "Kernel",
84  .offset = MTDPART_OFS_APPEND, /* Offset = 0x280000 */
85  .size = 32 * NAND_BLOCK_SIZE,
86  },
87  {
88  .name = "File System",
89  .offset = MTDPART_OFS_APPEND, /* Offset = 0x680000 */
90  .size = MTDPART_SIZ_FULL,
91  },
92 };
93 
94 static struct omap2_hsmmc_info mmc[] = {
95  {
96  .mmc = 1,
98  .gpio_wp = 29,
99  .deferred = true,
100  },
101  {} /* Terminator */
102 };
103 
104 static int devkit8000_panel_enable_lcd(struct omap_dss_device *dssdev)
105 {
106  if (gpio_is_valid(dssdev->reset_gpio))
108  return 0;
109 }
110 
111 static void devkit8000_panel_disable_lcd(struct omap_dss_device *dssdev)
112 {
113  if (gpio_is_valid(dssdev->reset_gpio))
115 }
116 
117 static struct regulator_consumer_supply devkit8000_vmmc1_supply[] = {
118  REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
119 };
120 
121 /* ads7846 on SPI */
122 static struct regulator_consumer_supply devkit8000_vio_supply[] = {
123  REGULATOR_SUPPLY("vcc", "spi2.0"),
124 };
125 
126 static struct panel_generic_dpi_data lcd_panel = {
127  .name = "innolux_at070tn83",
128  .platform_enable = devkit8000_panel_enable_lcd,
129  .platform_disable = devkit8000_panel_disable_lcd,
130 };
131 
132 static struct omap_dss_device devkit8000_lcd_device = {
133  .name = "lcd",
134  .type = OMAP_DISPLAY_TYPE_DPI,
135  .driver_name = "generic_dpi_panel",
136  .data = &lcd_panel,
137  .phy.dpi.data_lines = 24,
138 };
139 
140 static struct tfp410_platform_data dvi_panel = {
141  .power_down_gpio = -1,
142 };
143 
144 static struct omap_dss_device devkit8000_dvi_device = {
145  .name = "dvi",
146  .type = OMAP_DISPLAY_TYPE_DPI,
147  .driver_name = "tfp410",
148  .data = &dvi_panel,
149  .phy.dpi.data_lines = 24,
150 };
151 
152 static struct omap_dss_device devkit8000_tv_device = {
153  .name = "tv",
154  .driver_name = "venc",
155  .type = OMAP_DISPLAY_TYPE_VENC,
156  .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
157 };
158 
159 
160 static struct omap_dss_device *devkit8000_dss_devices[] = {
161  &devkit8000_lcd_device,
162  &devkit8000_dvi_device,
163  &devkit8000_tv_device,
164 };
165 
166 static struct omap_dss_board_info devkit8000_dss_data = {
167  .num_devices = ARRAY_SIZE(devkit8000_dss_devices),
168  .devices = devkit8000_dss_devices,
169  .default_device = &devkit8000_lcd_device,
170 };
171 
172 static uint32_t board_keymap[] = {
173  KEY(0, 0, KEY_1),
174  KEY(1, 0, KEY_2),
175  KEY(2, 0, KEY_3),
176  KEY(0, 1, KEY_4),
177  KEY(1, 1, KEY_5),
178  KEY(2, 1, KEY_6),
179  KEY(3, 1, KEY_F5),
180  KEY(0, 2, KEY_7),
181  KEY(1, 2, KEY_8),
182  KEY(2, 2, KEY_9),
183  KEY(3, 2, KEY_F6),
184  KEY(0, 3, KEY_F7),
185  KEY(1, 3, KEY_0),
186  KEY(2, 3, KEY_F8),
187  PERSISTENT_KEY(4, 5),
188  KEY(4, 4, KEY_VOLUMEUP),
189  KEY(5, 5, KEY_VOLUMEDOWN),
190  0
191 };
192 
193 static struct matrix_keymap_data board_map_data = {
194  .keymap = board_keymap,
195  .keymap_size = ARRAY_SIZE(board_keymap),
196 };
197 
198 static struct twl4030_keypad_data devkit8000_kp_data = {
199  .keymap_data = &board_map_data,
200  .rows = 6,
201  .cols = 6,
202  .rep = 1,
203 };
204 
205 static struct gpio_led gpio_leds[];
206 
207 static int devkit8000_twl_gpio_setup(struct device *dev,
208  unsigned gpio, unsigned ngpio)
209 {
210  int ret;
211 
212  /* gpio + 0 is "mmc0_cd" (input/IRQ) */
213  mmc[0].gpio_cd = gpio + 0;
214  omap_hsmmc_late_init(mmc);
215 
216  /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
217  gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
218 
219  /* TWL4030_GPIO_MAX + 0 is "LCD_PWREN" (out, active high) */
220  devkit8000_lcd_device.reset_gpio = gpio + TWL4030_GPIO_MAX + 0;
221  ret = gpio_request_one(devkit8000_lcd_device.reset_gpio,
222  GPIOF_OUT_INIT_LOW, "LCD_PWREN");
223  if (ret < 0) {
224  devkit8000_lcd_device.reset_gpio = -EINVAL;
225  printk(KERN_ERR "Failed to request GPIO for LCD_PWRN\n");
226  }
227 
228  /* gpio + 7 is "DVI_PD" (out, active low) */
229  dvi_panel.power_down_gpio = gpio + 7;
230 
231  return 0;
232 }
233 
234 static struct twl4030_gpio_platform_data devkit8000_gpio_data = {
235  .use_leds = true,
236  .pulldowns = BIT(1) | BIT(2) | BIT(6) | BIT(8) | BIT(13)
237  | BIT(15) | BIT(16) | BIT(17),
238  .setup = devkit8000_twl_gpio_setup,
239 };
240 
241 static struct regulator_consumer_supply devkit8000_vpll1_supplies[] = {
242  REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
243  REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi.0"),
244 };
245 
246 /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
247 static struct regulator_init_data devkit8000_vmmc1 = {
248  .constraints = {
249  .min_uV = 1850000,
250  .max_uV = 3150000,
251  .valid_modes_mask = REGULATOR_MODE_NORMAL
253  .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
256  },
257  .num_consumer_supplies = ARRAY_SIZE(devkit8000_vmmc1_supply),
258  .consumer_supplies = devkit8000_vmmc1_supply,
259 };
260 
261 /* VPLL1 for digital video outputs */
262 static struct regulator_init_data devkit8000_vpll1 = {
263  .constraints = {
264  .min_uV = 1800000,
265  .max_uV = 1800000,
266  .valid_modes_mask = REGULATOR_MODE_NORMAL
268  .valid_ops_mask = REGULATOR_CHANGE_MODE
270  },
271  .num_consumer_supplies = ARRAY_SIZE(devkit8000_vpll1_supplies),
272  .consumer_supplies = devkit8000_vpll1_supplies,
273 };
274 
275 /* VAUX4 for ads7846 and nubs */
276 static struct regulator_init_data devkit8000_vio = {
277  .constraints = {
278  .min_uV = 1800000,
279  .max_uV = 1800000,
280  .apply_uV = true,
281  .valid_modes_mask = REGULATOR_MODE_NORMAL
283  .valid_ops_mask = REGULATOR_CHANGE_MODE
285  },
286  .num_consumer_supplies = ARRAY_SIZE(devkit8000_vio_supply),
287  .consumer_supplies = devkit8000_vio_supply,
288 };
289 
290 static struct twl4030_platform_data devkit8000_twldata = {
291  /* platform_data for children goes here */
292  .gpio = &devkit8000_gpio_data,
293  .vmmc1 = &devkit8000_vmmc1,
294  .vpll1 = &devkit8000_vpll1,
295  .vio = &devkit8000_vio,
296  .keypad = &devkit8000_kp_data,
297 };
298 
299 static int __init devkit8000_i2c_init(void)
300 {
301  omap3_pmic_get_config(&devkit8000_twldata,
304  omap3_pmic_init("tps65930", &devkit8000_twldata);
305  /* Bus 3 is attached to the DVI port where devices like the pico DLP
306  * projector don't work reliably with 400kHz */
307  omap_register_i2c_bus(3, 400, NULL, 0);
308  return 0;
309 }
310 
311 static struct gpio_led gpio_leds[] = {
312  {
313  .name = "led1",
314  .default_trigger = "heartbeat",
315  .gpio = 186,
316  .active_low = true,
317  },
318  {
319  .name = "led2",
320  .default_trigger = "mmc0",
321  .gpio = 163,
322  .active_low = true,
323  },
324  {
325  .name = "ledB",
326  .default_trigger = "none",
327  .gpio = 153,
328  .active_low = true,
329  },
330  {
331  .name = "led3",
332  .default_trigger = "none",
333  .gpio = 164,
334  .active_low = true,
335  },
336 };
337 
338 static struct gpio_led_platform_data gpio_led_info = {
339  .leds = gpio_leds,
340  .num_leds = ARRAY_SIZE(gpio_leds),
341 };
342 
343 static struct platform_device leds_gpio = {
344  .name = "leds-gpio",
345  .id = -1,
346  .dev = {
347  .platform_data = &gpio_led_info,
348  },
349 };
350 
351 static struct gpio_keys_button gpio_buttons[] = {
352  {
353  .code = BTN_EXTRA,
354  .gpio = 26,
355  .desc = "user",
356  .wakeup = 1,
357  },
358 };
359 
360 static struct gpio_keys_platform_data gpio_key_info = {
361  .buttons = gpio_buttons,
362  .nbuttons = ARRAY_SIZE(gpio_buttons),
363 };
364 
365 static struct platform_device keys_gpio = {
366  .name = "gpio-keys",
367  .id = -1,
368  .dev = {
369  .platform_data = &gpio_key_info,
370  },
371 };
372 
373 #define OMAP_DM9000_BASE 0x2c000000
374 
375 static struct resource omap_dm9000_resources[] = {
376  [0] = {
377  .start = OMAP_DM9000_BASE,
378  .end = (OMAP_DM9000_BASE + 0x4 - 1),
380  },
381  [1] = {
382  .start = (OMAP_DM9000_BASE + 0x400),
383  .end = (OMAP_DM9000_BASE + 0x400 + 0x4 - 1),
384  .flags = IORESOURCE_MEM,
385  },
386  [2] = {
387  .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW,
388  },
389 };
390 
391 static struct dm9000_plat_data omap_dm9000_platdata = {
393 };
394 
395 static struct platform_device omap_dm9000_dev = {
396  .name = "dm9000",
397  .id = -1,
398  .num_resources = ARRAY_SIZE(omap_dm9000_resources),
399  .resource = omap_dm9000_resources,
400  .dev = {
401  .platform_data = &omap_dm9000_platdata,
402  },
403 };
404 
405 static void __init omap_dm9000_init(void)
406 {
407  unsigned char *eth_addr = omap_dm9000_platdata.dev_addr;
408  struct omap_die_id odi;
409  int ret;
410 
411  ret = gpio_request_one(OMAP_DM9000_GPIO_IRQ, GPIOF_IN, "dm9000 irq");
412  if (ret < 0) {
413  printk(KERN_ERR "Failed to request GPIO%d for dm9000 IRQ\n",
415  return;
416  }
417 
418  /* init the mac address using DIE id */
419  omap_get_die_id(&odi);
420 
421  eth_addr[0] = 0x02; /* locally administered */
422  eth_addr[1] = odi.id_1 & 0xff;
423  eth_addr[2] = (odi.id_0 & 0xff000000) >> 24;
424  eth_addr[3] = (odi.id_0 & 0x00ff0000) >> 16;
425  eth_addr[4] = (odi.id_0 & 0x0000ff00) >> 8;
426  eth_addr[5] = (odi.id_0 & 0x000000ff);
427 }
428 
429 static struct platform_device *devkit8000_devices[] __initdata = {
430  &leds_gpio,
431  &keys_gpio,
432  &omap_dm9000_dev,
433 };
434 
435 static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
436 
438  .port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED,
439  .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
440 
441  .phy_reset = true,
442  .reset_gpio_port[0] = -EINVAL,
443  .reset_gpio_port[1] = -EINVAL,
444  .reset_gpio_port[2] = -EINVAL
445 };
446 
447 #ifdef CONFIG_OMAP_MUX
448 static struct omap_board_mux board_mux[] __initdata = {
449  /* nCS and IRQ for Devkit8000 ethernet */
450  OMAP3_MUX(GPMC_NCS6, OMAP_MUX_MODE0),
452 
453  /* McSPI 2*/
454  OMAP3_MUX(MCSPI2_CLK, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
455  OMAP3_MUX(MCSPI2_SIMO, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
456  OMAP3_MUX(MCSPI2_SOMI, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
459 
460  /* PENDOWN GPIO */
462 
463  /* mUSB */
464  OMAP3_MUX(HSUSB0_CLK, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
466  OMAP3_MUX(HSUSB0_DIR, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
467  OMAP3_MUX(HSUSB0_NXT, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
468  OMAP3_MUX(HSUSB0_DATA0, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
469  OMAP3_MUX(HSUSB0_DATA1, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
470  OMAP3_MUX(HSUSB0_DATA2, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
471  OMAP3_MUX(HSUSB0_DATA3, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
472  OMAP3_MUX(HSUSB0_DATA4, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
473  OMAP3_MUX(HSUSB0_DATA5, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
474  OMAP3_MUX(HSUSB0_DATA6, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
475  OMAP3_MUX(HSUSB0_DATA7, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
476 
477  /* USB 1 */
490 
491  /* MMC 1 */
492  OMAP3_MUX(SDMMC1_CLK, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
493  OMAP3_MUX(SDMMC1_CMD, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
494  OMAP3_MUX(SDMMC1_DAT0, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
495  OMAP3_MUX(SDMMC1_DAT1, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
496  OMAP3_MUX(SDMMC1_DAT2, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
497  OMAP3_MUX(SDMMC1_DAT3, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
498  OMAP3_MUX(SDMMC1_DAT4, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
499  OMAP3_MUX(SDMMC1_DAT5, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
500  OMAP3_MUX(SDMMC1_DAT6, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
501  OMAP3_MUX(SDMMC1_DAT7, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
502 
503  /* McBSP 2 */
508 
509  /* I2C 1 */
512 
513  /* I2C 2 */
516 
517  /* I2C 3 */
520 
521  /* I2C 4 */
524 
525  /* serial ports */
527  OMAP3_MUX(MCBSP3_FSX, OMAP_MUX_MODE1 | OMAP_PIN_INPUT),
530 
531  /* DSS */
560 
561  /* expansion port */
562  /* McSPI 1 */
563  OMAP3_MUX(MCSPI1_CLK, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
564  OMAP3_MUX(MCSPI1_SIMO, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
565  OMAP3_MUX(MCSPI1_SOMI, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
568 
569  /* HDQ */
571 
572  /* McSPI4 */
573  OMAP3_MUX(MCBSP1_CLKR, OMAP_MUX_MODE1 | OMAP_PIN_INPUT),
577 
578  /* MMC 2 */
579  OMAP3_MUX(SDMMC2_DAT4, OMAP_MUX_MODE1 | OMAP_PIN_OUTPUT),
580  OMAP3_MUX(SDMMC2_DAT5, OMAP_MUX_MODE1 | OMAP_PIN_OUTPUT),
581  OMAP3_MUX(SDMMC2_DAT6, OMAP_MUX_MODE1 | OMAP_PIN_OUTPUT),
582  OMAP3_MUX(SDMMC2_DAT7, OMAP_MUX_MODE1 | OMAP_PIN_INPUT),
583 
584  /* I2C3 */
587 
588  OMAP3_MUX(MCBSP1_CLKX, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT),
591 
594 
595  /* TPS IRQ */
596  OMAP3_MUX(SYS_NIRQ, OMAP_MUX_MODE0 | OMAP_WAKEUP_EN | \
598 
599  { .reg_offset = OMAP_MUX_TERMINATOR },
600 };
601 #endif
602 
603 static void __init devkit8000_init(void)
604 {
605  omap3_mux_init(board_mux, OMAP_PACKAGE_CUS);
607  omap_sdrc_init(mt46h32m32lf6_sdrc_params,
608  mt46h32m32lf6_sdrc_params);
609 
610  omap_dm9000_init();
611 
612  omap_hsmmc_init(mmc);
613  devkit8000_i2c_init();
614  omap_dm9000_resources[2].start = gpio_to_irq(OMAP_DM9000_GPIO_IRQ);
615  platform_add_devices(devkit8000_devices,
616  ARRAY_SIZE(devkit8000_devices));
617 
618  omap_display_init(&devkit8000_dss_data);
619 
621 
623  usbhs_init(&usbhs_bdata);
624  omap_nand_flash_init(NAND_BUSWIDTH_16, devkit8000_nand_partitions,
625  ARRAY_SIZE(devkit8000_nand_partitions));
626  omap_twl4030_audio_init("omap3beagle");
627 
628  /* Ensure SDRC pins are mux'd for self-refresh */
629  omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
630  omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT);
631 }
632 
633 MACHINE_START(DEVKIT8000, "OMAP3 Devkit8000")
634  .atag_offset = 0x100,
635  .reserve = omap_reserve,
636  .map_io = omap3_map_io,
637  .init_early = omap35xx_init_early,
638  .init_irq = omap3_init_irq,
639  .handle_irq = omap3_intc_handle_irq,
640  .init_machine = devkit8000_init,
641  .init_late = omap35xx_init_late,
643  .restart = omap_prcm_restart,