Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
board-omap3beagle.c
Go to the documentation of this file.
1 /*
2  * linux/arch/arm/mach-omap2/board-omap3beagle.c
3  *
4  * Copyright (C) 2008 Texas Instruments
5  *
6  * Modified from mach-omap2/board-3430sdp.c
7  *
8  * Initial code: Syed Mohammed Khasim
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License version 2 as
12  * published by the Free Software Foundation.
13  */
14 
15 #include <linux/kernel.h>
16 #include <linux/init.h>
17 #include <linux/platform_device.h>
18 #include <linux/delay.h>
19 #include <linux/err.h>
20 #include <linux/clk.h>
21 #include <linux/io.h>
22 #include <linux/leds.h>
23 #include <linux/gpio.h>
24 #include <linux/input.h>
25 #include <linux/gpio_keys.h>
26 #include <linux/opp.h>
27 #include <linux/cpu.h>
28 
29 #include <linux/mtd/mtd.h>
30 #include <linux/mtd/partitions.h>
31 #include <linux/mtd/nand.h>
32 #include <linux/mmc/host.h>
33 
35 #include <linux/i2c/twl.h>
36 
37 #include <asm/mach-types.h>
38 #include <asm/mach/arch.h>
39 #include <asm/mach/map.h>
40 #include <asm/mach/flash.h>
41 
42 #include "common.h"
43 #include <video/omapdss.h>
45 #include <plat/gpmc.h>
47 #include <plat/usb.h>
48 #include <plat/omap_device.h>
49 
50 #include "mux.h"
51 #include "hsmmc.h"
52 #include "pm.h"
53 #include "common-board-devices.h"
54 
55 /*
56  * OMAP3 Beagle revision
57  * Run time detection of Beagle revision is done by reading GPIO.
58  * GPIO ID -
59  * AXBX = GPIO173, GPIO172, GPIO171: 1 1 1
60  * C1_3 = GPIO173, GPIO172, GPIO171: 1 1 0
61  * C4 = GPIO173, GPIO172, GPIO171: 1 0 1
62  * XMA/XMB = GPIO173, GPIO172, GPIO171: 0 0 0
63  * XMC = GPIO173, GPIO172, GPIO171: 0 1 0
64  */
65 enum {
72 };
73 
74 static u8 omap3_beagle_version;
75 
76 /*
77  * Board-specific configuration
78  * Defaults to BeagleBoard-xMC
79  */
80 static struct {
85  int mmc_caps;
86 } beagle_config = {
87  .mmc1_gpio_wp = -EINVAL,
88  .usb_pwr_level = GPIOF_OUT_INIT_LOW,
89  .dvi_pd_gpio = -EINVAL,
90  .usr_button_gpio = 4,
92 };
93 
94 static struct gpio omap3_beagle_rev_gpios[] __initdata = {
95  { 171, GPIOF_IN, "rev_id_0" },
96  { 172, GPIOF_IN, "rev_id_1" },
97  { 173, GPIOF_IN, "rev_id_2" },
98 };
99 
100 static void __init omap3_beagle_init_rev(void)
101 {
102  int ret;
103  u16 beagle_rev = 0;
104 
105  omap_mux_init_gpio(171, OMAP_PIN_INPUT_PULLUP);
106  omap_mux_init_gpio(172, OMAP_PIN_INPUT_PULLUP);
107  omap_mux_init_gpio(173, OMAP_PIN_INPUT_PULLUP);
108 
109  ret = gpio_request_array(omap3_beagle_rev_gpios,
110  ARRAY_SIZE(omap3_beagle_rev_gpios));
111  if (ret < 0) {
112  printk(KERN_ERR "Unable to get revision detection GPIO pins\n");
113  omap3_beagle_version = OMAP3BEAGLE_BOARD_UNKN;
114  return;
115  }
116 
117  beagle_rev = gpio_get_value(171) | (gpio_get_value(172) << 1)
118  | (gpio_get_value(173) << 2);
119 
120  gpio_free_array(omap3_beagle_rev_gpios,
121  ARRAY_SIZE(omap3_beagle_rev_gpios));
122 
123  switch (beagle_rev) {
124  case 7:
125  printk(KERN_INFO "OMAP3 Beagle Rev: Ax/Bx\n");
126  omap3_beagle_version = OMAP3BEAGLE_BOARD_AXBX;
127  beagle_config.mmc1_gpio_wp = 29;
128  beagle_config.dvi_pd_gpio = 170;
129  beagle_config.usr_button_gpio = 7;
130  break;
131  case 6:
132  printk(KERN_INFO "OMAP3 Beagle Rev: C1/C2/C3\n");
133  omap3_beagle_version = OMAP3BEAGLE_BOARD_C1_3;
134  beagle_config.mmc1_gpio_wp = 23;
135  beagle_config.dvi_pd_gpio = 170;
136  beagle_config.usr_button_gpio = 7;
137  break;
138  case 5:
139  printk(KERN_INFO "OMAP3 Beagle Rev: C4\n");
140  omap3_beagle_version = OMAP3BEAGLE_BOARD_C4;
141  beagle_config.mmc1_gpio_wp = 23;
142  beagle_config.dvi_pd_gpio = 170;
143  beagle_config.usr_button_gpio = 7;
144  break;
145  case 0:
146  printk(KERN_INFO "OMAP3 Beagle Rev: xM Ax/Bx\n");
147  omap3_beagle_version = OMAP3BEAGLE_BOARD_XM;
148  beagle_config.usb_pwr_level = GPIOF_OUT_INIT_HIGH;
149  beagle_config.mmc_caps &= ~MMC_CAP_8_BIT_DATA;
150  break;
151  case 2:
152  printk(KERN_INFO "OMAP3 Beagle Rev: xM C\n");
153  omap3_beagle_version = OMAP3BEAGLE_BOARD_XMC;
154  beagle_config.mmc_caps &= ~MMC_CAP_8_BIT_DATA;
155  break;
156  default:
157  printk(KERN_INFO "OMAP3 Beagle Rev: unknown %hd\n", beagle_rev);
158  omap3_beagle_version = OMAP3BEAGLE_BOARD_UNKN;
159  }
160 }
161 
162 static struct mtd_partition omap3beagle_nand_partitions[] = {
163  /* All the partition sizes are listed in terms of NAND block size */
164  {
165  .name = "X-Loader",
166  .offset = 0,
167  .size = 4 * NAND_BLOCK_SIZE,
168  .mask_flags = MTD_WRITEABLE, /* force read-only */
169  },
170  {
171  .name = "U-Boot",
172  .offset = MTDPART_OFS_APPEND, /* Offset = 0x80000 */
173  .size = 15 * NAND_BLOCK_SIZE,
174  .mask_flags = MTD_WRITEABLE, /* force read-only */
175  },
176  {
177  .name = "U-Boot Env",
178  .offset = MTDPART_OFS_APPEND, /* Offset = 0x260000 */
179  .size = 1 * NAND_BLOCK_SIZE,
180  },
181  {
182  .name = "Kernel",
183  .offset = MTDPART_OFS_APPEND, /* Offset = 0x280000 */
184  .size = 32 * NAND_BLOCK_SIZE,
185  },
186  {
187  .name = "File System",
188  .offset = MTDPART_OFS_APPEND, /* Offset = 0x680000 */
189  .size = MTDPART_SIZ_FULL,
190  },
191 };
192 
193 /* DSS */
194 
195 static struct tfp410_platform_data dvi_panel = {
196  .i2c_bus_num = 3,
197  .power_down_gpio = -1,
198 };
199 
200 static struct omap_dss_device beagle_dvi_device = {
201  .type = OMAP_DISPLAY_TYPE_DPI,
202  .name = "dvi",
203  .driver_name = "tfp410",
204  .data = &dvi_panel,
205  .phy.dpi.data_lines = 24,
206 };
207 
208 static struct omap_dss_device beagle_tv_device = {
209  .name = "tv",
210  .driver_name = "venc",
211  .type = OMAP_DISPLAY_TYPE_VENC,
212  .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
213 };
214 
215 static struct omap_dss_device *beagle_dss_devices[] = {
216  &beagle_dvi_device,
217  &beagle_tv_device,
218 };
219 
220 static struct omap_dss_board_info beagle_dss_data = {
221  .num_devices = ARRAY_SIZE(beagle_dss_devices),
222  .devices = beagle_dss_devices,
223  .default_device = &beagle_dvi_device,
224 };
225 
227 
228 static struct omap2_hsmmc_info mmc[] = {
229  {
230  .mmc = 1,
231  .caps = MMC_CAP_4_BIT_DATA,
232  .gpio_wp = -EINVAL,
233  .deferred = true,
234  },
235  {} /* Terminator */
236 };
237 
238 static struct regulator_consumer_supply beagle_vmmc1_supply[] = {
239  REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
240 };
241 
242 static struct regulator_consumer_supply beagle_vsim_supply[] = {
243  REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.0"),
244 };
245 
246 static struct gpio_led gpio_leds[];
247 
248 static int beagle_twl_gpio_setup(struct device *dev,
249  unsigned gpio, unsigned ngpio)
250 {
251  int r;
252 
253  mmc[0].gpio_wp = beagle_config.mmc1_gpio_wp;
254  /* gpio + 0 is "mmc0_cd" (input/IRQ) */
255  mmc[0].gpio_cd = gpio + 0;
256  omap_hsmmc_late_init(mmc);
257 
258  /*
259  * TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, XM active
260  * high / others active low)
261  * DVI reset GPIO is different between beagle revisions
262  */
263  /* Valid for all -xM revisions */
264  if (cpu_is_omap3630()) {
265  /*
266  * gpio + 1 on Xm controls the TFP410's enable line (active low)
267  * gpio + 2 control varies depending on the board rev as below:
268  * P7/P8 revisions(prototype): Camera EN
269  * A2+ revisions (production): LDO (DVI, serial, led blocks)
270  */
271  r = gpio_request_one(gpio + 1, GPIOF_OUT_INIT_LOW,
272  "nDVI_PWR_EN");
273  if (r)
274  pr_err("%s: unable to configure nDVI_PWR_EN\n",
275  __func__);
276 
277  beagle_config.dvi_pd_gpio = gpio + 2;
278 
279  } else {
280  /*
281  * REVISIT: need ehci-omap hooks for external VBUS
282  * power switch and overcurrent detect
283  */
284  if (gpio_request_one(gpio + 1, GPIOF_IN, "EHCI_nOC"))
285  pr_err("%s: unable to configure EHCI_nOC\n", __func__);
286  }
287  dvi_panel.power_down_gpio = beagle_config.dvi_pd_gpio;
288 
289  gpio_request_one(gpio + TWL4030_GPIO_MAX, beagle_config.usb_pwr_level,
290  "nEN_USB_PWR");
291 
292  /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
293  gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
294 
295  return 0;
296 }
297 
298 static struct twl4030_gpio_platform_data beagle_gpio_data = {
299  .use_leds = true,
300  .pullups = BIT(1),
301  .pulldowns = BIT(2) | BIT(6) | BIT(7) | BIT(8) | BIT(13)
302  | BIT(15) | BIT(16) | BIT(17),
303  .setup = beagle_twl_gpio_setup,
304 };
305 
306 /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
307 static struct regulator_init_data beagle_vmmc1 = {
308  .constraints = {
309  .min_uV = 1850000,
310  .max_uV = 3150000,
311  .valid_modes_mask = REGULATOR_MODE_NORMAL
313  .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
316  },
317  .num_consumer_supplies = ARRAY_SIZE(beagle_vmmc1_supply),
318  .consumer_supplies = beagle_vmmc1_supply,
319 };
320 
321 /* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */
322 static struct regulator_init_data beagle_vsim = {
323  .constraints = {
324  .min_uV = 1800000,
325  .max_uV = 3000000,
326  .valid_modes_mask = REGULATOR_MODE_NORMAL
328  .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
331  },
332  .num_consumer_supplies = ARRAY_SIZE(beagle_vsim_supply),
333  .consumer_supplies = beagle_vsim_supply,
334 };
335 
336 static struct twl4030_platform_data beagle_twldata = {
337  /* platform_data for children goes here */
338  .gpio = &beagle_gpio_data,
339  .vmmc1 = &beagle_vmmc1,
340  .vsim = &beagle_vsim,
341 };
342 
343 static struct i2c_board_info __initdata beagle_i2c_eeprom[] = {
344  {
345  I2C_BOARD_INFO("eeprom", 0x50),
346  },
347 };
348 
349 static int __init omap3_beagle_i2c_init(void)
350 {
351  omap3_pmic_get_config(&beagle_twldata,
355 
356  beagle_twldata.vpll2->constraints.name = "VDVI";
357 
358  omap3_pmic_init("twl4030", &beagle_twldata);
359  /* Bus 3 is attached to the DVI port where devices like the pico DLP
360  * projector don't work reliably with 400kHz */
361  omap_register_i2c_bus(3, 100, beagle_i2c_eeprom, ARRAY_SIZE(beagle_i2c_eeprom));
362  return 0;
363 }
364 
365 static struct gpio_led gpio_leds[] = {
366  {
367  .name = "beagleboard::usr0",
368  .default_trigger = "heartbeat",
369  .gpio = 150,
370  },
371  {
372  .name = "beagleboard::usr1",
373  .default_trigger = "mmc0",
374  .gpio = 149,
375  },
376  {
377  .name = "beagleboard::pmu_stat",
378  .gpio = -EINVAL, /* gets replaced */
379  .active_low = true,
380  },
381 };
382 
383 static struct gpio_led_platform_data gpio_led_info = {
384  .leds = gpio_leds,
385  .num_leds = ARRAY_SIZE(gpio_leds),
386 };
387 
388 static struct platform_device leds_gpio = {
389  .name = "leds-gpio",
390  .id = -1,
391  .dev = {
392  .platform_data = &gpio_led_info,
393  },
394 };
395 
396 static struct gpio_keys_button gpio_buttons[] = {
397  {
398  .code = BTN_EXTRA,
399  /* Dynamically assigned depending on board */
400  .gpio = -EINVAL,
401  .desc = "user",
402  .wakeup = 1,
403  },
404 };
405 
406 static struct gpio_keys_platform_data gpio_key_info = {
407  .buttons = gpio_buttons,
408  .nbuttons = ARRAY_SIZE(gpio_buttons),
409 };
410 
411 static struct platform_device keys_gpio = {
412  .name = "gpio-keys",
413  .id = -1,
414  .dev = {
415  .platform_data = &gpio_key_info,
416  },
417 };
418 
419 static struct platform_device madc_hwmon = {
420  .name = "twl4030_madc_hwmon",
421  .id = -1,
422 };
423 
424 static struct platform_device *omap3_beagle_devices[] __initdata = {
425  &leds_gpio,
426  &keys_gpio,
427  &madc_hwmon,
428 };
429 
430 static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
431 
432  .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED,
433  .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
434  .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
435 
436  .phy_reset = true,
437  .reset_gpio_port[0] = -EINVAL,
438  .reset_gpio_port[1] = 147,
439  .reset_gpio_port[2] = -EINVAL
440 };
441 
442 #ifdef CONFIG_OMAP_MUX
443 static struct omap_board_mux board_mux[] __initdata = {
444  { .reg_offset = OMAP_MUX_TERMINATOR },
445 };
446 #endif
447 
448 static int __init beagle_opp_init(void)
449 {
450  int r = 0;
451 
452  if (!machine_is_omap3_beagle())
453  return 0;
454 
455  /* Initialize the omap3 opp table if not already created. */
456  r = omap3_opp_init();
457  if (IS_ERR_VALUE(r) && (r != -EEXIST)) {
458  pr_err("%s: opp default init failed\n", __func__);
459  return r;
460  }
461 
462  /* Custom OPP enabled for all xM versions */
463  if (cpu_is_omap3630()) {
464  struct device *mpu_dev, *iva_dev;
465 
466  mpu_dev = get_cpu_device(0);
467  iva_dev = omap_device_get_by_hwmod_name("iva");
468 
469  if (IS_ERR(mpu_dev) || IS_ERR(iva_dev)) {
470  pr_err("%s: Aiee.. no mpu/dsp devices? %p %p\n",
471  __func__, mpu_dev, iva_dev);
472  return -ENODEV;
473  }
474  /* Enable MPU 1GHz and lower opps */
475  r = opp_enable(mpu_dev, 800000000);
476  /* TODO: MPU 1GHz needs SR and ABB */
477 
478  /* Enable IVA 800MHz and lower opps */
479  r |= opp_enable(iva_dev, 660000000);
480  /* TODO: DSP 800MHz needs SR and ABB */
481  if (r) {
482  pr_err("%s: failed to enable higher opp %d\n",
483  __func__, r);
484  /*
485  * Cleanup - disable the higher freqs - we dont care
486  * about the results
487  */
488  opp_disable(mpu_dev, 800000000);
489  opp_disable(iva_dev, 660000000);
490  }
491  }
492  return 0;
493 }
494 device_initcall(beagle_opp_init);
495 
496 static void __init omap3_beagle_init(void)
497 {
499  omap3_beagle_init_rev();
500 
501  if (gpio_is_valid(beagle_config.mmc1_gpio_wp))
502  omap_mux_init_gpio(beagle_config.mmc1_gpio_wp, OMAP_PIN_INPUT);
503  mmc[0].caps = beagle_config.mmc_caps;
504  omap_hsmmc_init(mmc);
505 
506  omap3_beagle_i2c_init();
507 
508  gpio_buttons[0].gpio = beagle_config.usr_button_gpio;
509 
510  platform_add_devices(omap3_beagle_devices,
511  ARRAY_SIZE(omap3_beagle_devices));
512  if (gpio_is_valid(beagle_config.dvi_pd_gpio))
513  omap_mux_init_gpio(beagle_config.dvi_pd_gpio, OMAP_PIN_OUTPUT);
514  omap_display_init(&beagle_dss_data);
516  omap_sdrc_init(mt46h32m32lf6_sdrc_params,
517  mt46h32m32lf6_sdrc_params);
518 
520  usbhs_init(&usbhs_bdata);
521  omap_nand_flash_init(NAND_BUSWIDTH_16, omap3beagle_nand_partitions,
522  ARRAY_SIZE(omap3beagle_nand_partitions));
523  omap_twl4030_audio_init("omap3beagle");
524 
525  /* Ensure msecure is mux'd to be able to set the RTC. */
526  omap_mux_init_signal("sys_drm_msecure", OMAP_PIN_OFF_OUTPUT_HIGH);
527 
528  /* Ensure SDRC pins are mux'd for self-refresh */
529  omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
530  omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT);
531 }
532 
533 MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board")
534  /* Maintainer: Syed Mohammed Khasim - http://beagleboard.org */
535  .atag_offset = 0x100,
536  .reserve = omap_reserve,
537  .map_io = omap3_map_io,
538  .init_early = omap3_init_early,
539  .init_irq = omap3_init_irq,
540  .handle_irq = omap3_intc_handle_irq,
541  .init_machine = omap3_beagle_init,
542  .init_late = omap3_init_late,
544  .restart = omap_prcm_restart,