Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
board-rm680.c
Go to the documentation of this file.
1 /*
2  * Board support file for Nokia RM-680/696.
3  *
4  * Copyright (C) 2010 Nokia
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  */
10 
11 #include <linux/io.h>
12 #include <linux/i2c.h>
13 #include <linux/gpio.h>
14 #include <linux/init.h>
15 #include <linux/i2c/twl.h>
16 #include <linux/platform_device.h>
17 #include <linux/regulator/fixed.h>
21 
22 #include <asm/mach/arch.h>
23 #include <asm/mach-types.h>
24 
25 #include <plat/i2c.h>
26 #include <plat/mmc.h>
27 #include <plat/usb.h>
28 #include <plat/gpmc.h>
29 #include "common.h"
30 #include <plat/serial.h>
31 
32 #include "mux.h"
33 #include "hsmmc.h"
34 #include "sdram-nokia.h"
35 #include "common-board-devices.h"
36 
37 static struct regulator_consumer_supply rm680_vemmc_consumers[] = {
38  REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"),
39 };
40 
41 /* Fixed regulator for internal eMMC */
42 static struct regulator_init_data rm680_vemmc = {
43  .constraints = {
44  .name = "rm680_vemmc",
45  .valid_modes_mask = REGULATOR_MODE_NORMAL
47  .valid_ops_mask = REGULATOR_CHANGE_STATUS
49  },
50  .num_consumer_supplies = ARRAY_SIZE(rm680_vemmc_consumers),
51  .consumer_supplies = rm680_vemmc_consumers,
52 };
53 
54 static struct fixed_voltage_config rm680_vemmc_config = {
55  .supply_name = "VEMMC",
56  .microvolts = 2900000,
57  .gpio = 157,
58  .startup_delay = 150,
59  .enable_high = 1,
60  .init_data = &rm680_vemmc,
61 };
62 
63 static struct platform_device rm680_vemmc_device = {
64  .name = "reg-fixed-voltage",
65  .dev = {
66  .platform_data = &rm680_vemmc_config,
67  },
68 };
69 
70 static struct platform_device *rm680_peripherals_devices[] __initdata = {
71  &rm680_vemmc_device,
72 };
73 
74 /* TWL */
75 static struct twl4030_gpio_platform_data rm680_gpio_data = {
76  .pullups = BIT(0),
77  .pulldowns = BIT(1) | BIT(2) | BIT(8) | BIT(15),
78 };
79 
80 static struct twl4030_platform_data rm680_twl_data = {
81  .gpio = &rm680_gpio_data,
82  /* add rest of the children here */
83 };
84 
85 static void __init rm680_i2c_init(void)
86 {
87  omap3_pmic_get_config(&rm680_twl_data, TWL_COMMON_PDATA_USB, 0);
88  omap_pmic_init(1, 2900, "twl5031", 7 + OMAP_INTC_START, &rm680_twl_data);
89  omap_register_i2c_bus(2, 400, NULL, 0);
90  omap_register_i2c_bus(3, 400, NULL, 0);
91 }
92 
93 #if defined(CONFIG_MTD_ONENAND_OMAP2) || \
94  defined(CONFIG_MTD_ONENAND_OMAP2_MODULE)
96  {
97  .gpio_irq = 65,
98  .flags = ONENAND_SYNC_READWRITE,
99  }
100 };
101 #endif
102 
103 /* eMMC */
104 static struct omap2_hsmmc_info mmc[] __initdata = {
105  {
106  .name = "internal",
107  .mmc = 2,
109  .gpio_cd = -EINVAL,
110  .gpio_wp = -EINVAL,
111  },
112  { /* Terminator */ }
113 };
114 
115 static void __init rm680_peripherals_init(void)
116 {
117  platform_add_devices(rm680_peripherals_devices,
118  ARRAY_SIZE(rm680_peripherals_devices));
119  rm680_i2c_init();
120  gpmc_onenand_init(board_onenand_data);
121  omap_hsmmc_init(mmc);
122 }
123 
124 #ifdef CONFIG_OMAP_MUX
125 static struct omap_board_mux board_mux[] __initdata = {
126  { .reg_offset = OMAP_MUX_TERMINATOR },
127 };
128 #endif
129 
130 static void __init rm680_init(void)
131 {
132  struct omap_sdrc_params *sdrc_params;
133 
136 
137  sdrc_params = nokia_get_sdram_timings();
138  omap_sdrc_init(sdrc_params, sdrc_params);
139 
141  rm680_peripherals_init();
142 }
143 
144 MACHINE_START(NOKIA_RM680, "Nokia RM-680 board")
145  .atag_offset = 0x100,
146  .reserve = omap_reserve,
147  .map_io = omap3_map_io,
148  .init_early = omap3630_init_early,
149  .init_irq = omap3_init_irq,
150  .handle_irq = omap3_intc_handle_irq,
151  .init_machine = rm680_init,
152  .init_late = omap3630_init_late,
153  .timer = &omap3_timer,
154  .restart = omap_prcm_restart,
156 
157 MACHINE_START(NOKIA_RM696, "Nokia RM-696 board")
158  .atag_offset = 0x100,
159  .reserve = omap_reserve,
160  .map_io = omap3_map_io,
161  .init_early = omap3630_init_early,
162  .init_irq = omap3_init_irq,
163  .handle_irq = omap3_intc_handle_irq,
164  .init_machine = rm680_init,
165  .init_late = omap3630_init_late,
166  .timer = &omap3_timer,
167  .restart = omap_prcm_restart,