Blame view

arch/arm/mach-omap2/board-omap3pandora.c 16 KB
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  /*
   * board-omap3pandora.c (Pandora Handheld Console)
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License
   * version 2 as published by the Free Software Foundation.
   *
   * This program is distributed in the hope that it will be useful, but
   * WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
   * 02110-1301 USA
   *
   */
  
  #include <linux/init.h>
  #include <linux/kernel.h>
  #include <linux/platform_device.h>
  
  #include <linux/spi/spi.h>
64f535a87   Grazvydas Ignotas   ARM: OMAP3: pando...
25
  #include <linux/regulator/machine.h>
b07682b60   Santosh Shilimkar   mfd: Rename twl40...
26
  #include <linux/i2c/twl.h>
c1f9a0956   Ohad Ben-Cohen   wl12xx: make wl12...
27
  #include <linux/wl12xx.h>
79ccf549b   Grazvydas Ignotas   omap3: pandora: a...
28
29
  #include <linux/mtd/partitions.h>
  #include <linux/mtd/nand.h>
741904501   Grazvydas Ignotas   ARM: OMAP3: pando...
30
31
  #include <linux/leds.h>
  #include <linux/input.h>
6135434a5   Janusz Krzysztofik   omap: Fix omap-ke...
32
  #include <linux/input/matrix_keypad.h>
f9fa1bb9d   Axel Lin   ARM: OMAP2: Add m...
33
  #include <linux/gpio.h>
741904501   Grazvydas Ignotas   ARM: OMAP3: pando...
34
  #include <linux/gpio_keys.h>
3a63833ec   Sukumar Ghorai   omap: mmc: extend...
35
  #include <linux/mmc/host.h>
ed199f7e7   Grazvydas Ignotas   omap: pandora: pa...
36
  #include <linux/mmc/card.h>
690a4a39b   Grazvydas Ignotas   omap: pandora: ad...
37
  #include <linux/regulator/fixed.h>
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
38
39
40
41
  
  #include <asm/mach-types.h>
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
ce491cf85   Tony Lindgren   omap: headers: Mo...
42
  #include <plat/board.h>
4e65331c6   Tony Lindgren   ARM: 7159/1: OMAP...
43
  #include "common.h"
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
44
  #include <mach/hardware.h>
ce491cf85   Tony Lindgren   omap: headers: Mo...
45
46
  #include <plat/mcspi.h>
  #include <plat/usb.h>
a0b38cc4d   Tomi Valkeinen   OMAP: DSS2: Move ...
47
  #include <video/omapdss.h>
79ccf549b   Grazvydas Ignotas   omap3: pandora: a...
48
  #include <plat/nand.h>
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
49

ca5742bdb   Tony Lindgren   omap: mux: Add ne...
50
  #include "mux.h"
2e12bd7ef   Paul Walmsley   ARM: OMAP3: SDRC:...
51
  #include "sdram-micron-mt46h32m32lf-6.h"
d02a900b5   Adrian Hunter   omap: Rename mmc-...
52
  #include "hsmmc.h"
96974a249   Mike Rapoport   omap: consolidate...
53
  #include "common-board-devices.h"
90c62bf08   Tony Lindgren   omap mmc: Add low...
54

79ccf549b   Grazvydas Ignotas   omap3: pandora: a...
55
56
  #define PANDORA_WIFI_IRQ_GPIO		21
  #define PANDORA_WIFI_NRESET_GPIO	23
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
57
  #define OMAP3_PANDORA_TS_GPIO		94
79ccf549b   Grazvydas Ignotas   omap3: pandora: a...
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
  static struct mtd_partition omap3pandora_nand_partitions[] = {
  	{
  		.name           = "xloader",
  		.offset         = 0,
  		.size           = 4 * NAND_BLOCK_SIZE,
  		.mask_flags     = MTD_WRITEABLE
  	}, {
  		.name           = "uboot",
  		.offset         = MTDPART_OFS_APPEND,
  		.size           = 15 * NAND_BLOCK_SIZE,
  	}, {
  		.name           = "uboot-env",
  		.offset         = MTDPART_OFS_APPEND,
  		.size           = 1 * NAND_BLOCK_SIZE,
  	}, {
  		.name           = "boot",
  		.offset         = MTDPART_OFS_APPEND,
  		.size           = 80 * NAND_BLOCK_SIZE,
  	}, {
  		.name           = "rootfs",
  		.offset         = MTDPART_OFS_APPEND,
  		.size           = MTDPART_SIZ_FULL,
  	},
  };
  
  static struct omap_nand_platform_data pandora_nand_data = {
  	.cs		= 0,
9d5ae7cd6   Grazvydas Ignotas   omap: pandora: fi...
85
86
  	.devsize	= NAND_BUSWIDTH_16,
  	.xfer_type	= NAND_OMAP_PREFETCH_DMA,
79ccf549b   Grazvydas Ignotas   omap3: pandora: a...
87
88
89
  	.parts		= omap3pandora_nand_partitions,
  	.nr_parts	= ARRAY_SIZE(omap3pandora_nand_partitions),
  };
741904501   Grazvydas Ignotas   ARM: OMAP3: pando...
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
  static struct gpio_led pandora_gpio_leds[] = {
  	{
  		.name			= "pandora::sd1",
  		.default_trigger	= "mmc0",
  		.gpio			= 128,
  	}, {
  		.name			= "pandora::sd2",
  		.default_trigger	= "mmc1",
  		.gpio			= 129,
  	}, {
  		.name			= "pandora::bluetooth",
  		.gpio			= 158,
  	}, {
  		.name			= "pandora::wifi",
  		.gpio			= 159,
  	},
  };
  
  static struct gpio_led_platform_data pandora_gpio_led_data = {
  	.leds		= pandora_gpio_leds,
  	.num_leds	= ARRAY_SIZE(pandora_gpio_leds),
  };
  
  static struct platform_device pandora_leds_gpio = {
  	.name	= "leds-gpio",
  	.id	= -1,
  	.dev	= {
  		.platform_data	= &pandora_gpio_led_data,
  	},
  };
  
  #define GPIO_BUTTON(gpio_num, ev_type, ev_code, act_low, descr)	\
  {								\
  	.gpio		= gpio_num,				\
  	.type		= ev_type,				\
  	.code		= ev_code,				\
  	.active_low	= act_low,				\
ad74db604   Grazvydas Ignotas   omap3: pandora: u...
127
  	.debounce_interval = 4,					\
741904501   Grazvydas Ignotas   ARM: OMAP3: pando...
128
129
130
131
132
133
134
135
136
137
138
  	.desc		= "btn " descr,				\
  }
  
  #define GPIO_BUTTON_LOW(gpio_num, event_code, description)	\
  	GPIO_BUTTON(gpio_num, EV_KEY, event_code, 1, description)
  
  static struct gpio_keys_button pandora_gpio_keys[] = {
  	GPIO_BUTTON_LOW(110,	KEY_UP,		"up"),
  	GPIO_BUTTON_LOW(103,	KEY_DOWN,	"down"),
  	GPIO_BUTTON_LOW(96,	KEY_LEFT,	"left"),
  	GPIO_BUTTON_LOW(98,	KEY_RIGHT,	"right"),
ad74db604   Grazvydas Ignotas   omap3: pandora: u...
139
140
141
142
143
144
145
146
  	GPIO_BUTTON_LOW(109,	KEY_PAGEUP,	"game 1"),
  	GPIO_BUTTON_LOW(111,	KEY_END,	"game 2"),
  	GPIO_BUTTON_LOW(106,	KEY_PAGEDOWN,	"game 3"),
  	GPIO_BUTTON_LOW(101,	KEY_HOME,	"game 4"),
  	GPIO_BUTTON_LOW(102,	KEY_RIGHTSHIFT,	"l"),
  	GPIO_BUTTON_LOW(97,	KEY_KPPLUS,	"l2"),
  	GPIO_BUTTON_LOW(105,	KEY_RIGHTCTRL,	"r"),
  	GPIO_BUTTON_LOW(107,	KEY_KPMINUS,	"r2"),
741904501   Grazvydas Ignotas   ARM: OMAP3: pando...
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
  	GPIO_BUTTON_LOW(104,	KEY_LEFTCTRL,	"ctrl"),
  	GPIO_BUTTON_LOW(99,	KEY_MENU,	"menu"),
  	GPIO_BUTTON_LOW(176,	KEY_COFFEE,	"hold"),
  	GPIO_BUTTON(100, EV_KEY, KEY_LEFTALT, 0, "alt"),
  	GPIO_BUTTON(108, EV_SW, SW_LID, 1, "lid"),
  };
  
  static struct gpio_keys_platform_data pandora_gpio_key_info = {
  	.buttons	= pandora_gpio_keys,
  	.nbuttons	= ARRAY_SIZE(pandora_gpio_keys),
  };
  
  static struct platform_device pandora_keys_gpio = {
  	.name	= "gpio-keys",
  	.id	= -1,
  	.dev	= {
  		.platform_data	= &pandora_gpio_key_info,
  	},
  };
ad74db604   Grazvydas Ignotas   omap3: pandora: u...
166
  static const uint32_t board_keymap[] = {
24de042ca   Grazvydas Ignotas   omap3: pandora: F...
167
  	/* row, col, code */
741904501   Grazvydas Ignotas   ARM: OMAP3: pando...
168
  	KEY(0, 0, KEY_9),
24de042ca   Grazvydas Ignotas   omap3: pandora: F...
169
170
171
172
173
174
  	KEY(0, 1, KEY_8),
  	KEY(0, 2, KEY_I),
  	KEY(0, 3, KEY_J),
  	KEY(0, 4, KEY_N),
  	KEY(0, 5, KEY_M),
  	KEY(1, 0, KEY_0),
741904501   Grazvydas Ignotas   ARM: OMAP3: pando...
175
  	KEY(1, 1, KEY_7),
24de042ca   Grazvydas Ignotas   omap3: pandora: F...
176
177
178
179
180
181
  	KEY(1, 2, KEY_U),
  	KEY(1, 3, KEY_H),
  	KEY(1, 4, KEY_B),
  	KEY(1, 5, KEY_SPACE),
  	KEY(2, 0, KEY_BACKSPACE),
  	KEY(2, 1, KEY_6),
741904501   Grazvydas Ignotas   ARM: OMAP3: pando...
182
  	KEY(2, 2, KEY_Y),
24de042ca   Grazvydas Ignotas   omap3: pandora: F...
183
184
185
186
187
188
  	KEY(2, 3, KEY_G),
  	KEY(2, 4, KEY_V),
  	KEY(2, 5, KEY_FN),
  	KEY(3, 0, KEY_O),
  	KEY(3, 1, KEY_5),
  	KEY(3, 2, KEY_T),
741904501   Grazvydas Ignotas   ARM: OMAP3: pando...
189
  	KEY(3, 3, KEY_F),
24de042ca   Grazvydas Ignotas   omap3: pandora: F...
190
191
192
193
194
  	KEY(3, 4, KEY_C),
  	KEY(4, 0, KEY_P),
  	KEY(4, 1, KEY_4),
  	KEY(4, 2, KEY_R),
  	KEY(4, 3, KEY_D),
741904501   Grazvydas Ignotas   ARM: OMAP3: pando...
195
  	KEY(4, 4, KEY_X),
24de042ca   Grazvydas Ignotas   omap3: pandora: F...
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
  	KEY(5, 0, KEY_K),
  	KEY(5, 1, KEY_3),
  	KEY(5, 2, KEY_E),
  	KEY(5, 3, KEY_S),
  	KEY(5, 4, KEY_Z),
  	KEY(6, 0, KEY_L),
  	KEY(6, 1, KEY_2),
  	KEY(6, 2, KEY_W),
  	KEY(6, 3, KEY_A),
  	KEY(6, 4, KEY_DOT),
  	KEY(7, 0, KEY_ENTER),
  	KEY(7, 1, KEY_1),
  	KEY(7, 2, KEY_Q),
  	KEY(7, 3, KEY_LEFTSHIFT),
  	KEY(7, 4, KEY_COMMA),
741904501   Grazvydas Ignotas   ARM: OMAP3: pando...
211
  };
4f5433324   Tony Lindgren   omap: Fix matrix_...
212
213
214
215
  static struct matrix_keymap_data board_map_data = {
  	.keymap			= board_keymap,
  	.keymap_size		= ARRAY_SIZE(board_keymap),
  };
741904501   Grazvydas Ignotas   ARM: OMAP3: pando...
216
  static struct twl4030_keypad_data pandora_kp_data = {
4f5433324   Tony Lindgren   omap: Fix matrix_...
217
  	.keymap_data	= &board_map_data,
741904501   Grazvydas Ignotas   ARM: OMAP3: pando...
218
219
  	.rows		= 8,
  	.cols		= 6,
741904501   Grazvydas Ignotas   ARM: OMAP3: pando...
220
221
  	.rep		= 1,
  };
7b097896e   Grazvydas Ignotas   OMAP: pandora: ad...
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
  static struct omap_dss_device pandora_lcd_device = {
  	.name			= "lcd",
  	.driver_name		= "tpo_td043mtea1_panel",
  	.type			= OMAP_DISPLAY_TYPE_DPI,
  	.phy.dpi.data_lines	= 24,
  	.reset_gpio		= 157,
  };
  
  static struct omap_dss_device pandora_tv_device = {
  	.name			= "tv",
  	.driver_name		= "venc",
  	.type			= OMAP_DISPLAY_TYPE_VENC,
  	.phy.venc.type		= OMAP_DSS_VENC_TYPE_SVIDEO,
  };
  
  static struct omap_dss_device *pandora_dss_devices[] = {
  	&pandora_lcd_device,
  	&pandora_tv_device,
  };
  
  static struct omap_dss_board_info pandora_dss_data = {
  	.num_devices	= ARRAY_SIZE(pandora_dss_devices),
  	.devices	= pandora_dss_devices,
  	.default_device	= &pandora_lcd_device,
  };
ed199f7e7   Grazvydas Ignotas   omap: pandora: pa...
247
248
249
250
251
252
253
254
255
256
257
258
259
  static void pandora_wl1251_init_card(struct mmc_card *card)
  {
  	/*
  	 * We have TI wl1251 attached to MMC3. Pass this information to
  	 * SDIO core because it can't be probed by normal methods.
  	 */
  	card->quirks |= MMC_QUIRK_NONSTD_SDIO;
  	card->cccr.wide_bus = 1;
  	card->cis.vendor = 0x104c;
  	card->cis.device = 0x9066;
  	card->cis.blksize = 512;
  	card->cis.max_dtr = 20000000;
  }
68ff04231   Adrian Hunter   omap: Rename hsmm...
260
  static struct omap2_hsmmc_info omap3pandora_mmc[] = {
90c62bf08   Tony Lindgren   omap mmc: Add low...
261
262
  	{
  		.mmc		= 1,
3a63833ec   Sukumar Ghorai   omap: mmc: extend...
263
  		.caps		= MMC_CAP_4_BIT_DATA,
90c62bf08   Tony Lindgren   omap mmc: Add low...
264
265
266
267
268
269
  		.gpio_cd	= -EINVAL,
  		.gpio_wp	= 126,
  		.ext_clock	= 0,
  	},
  	{
  		.mmc		= 2,
3a63833ec   Sukumar Ghorai   omap: mmc: extend...
270
  		.caps		= MMC_CAP_4_BIT_DATA,
90c62bf08   Tony Lindgren   omap mmc: Add low...
271
272
273
  		.gpio_cd	= -EINVAL,
  		.gpio_wp	= 127,
  		.ext_clock	= 1,
0329c3773   David Brownell   ARM: OMAP3: mmc-t...
274
  		.transceiver	= true,
90c62bf08   Tony Lindgren   omap mmc: Add low...
275
  	},
07d83cc9c   Grazvydas Ignotas   ARM: OMAP3: mmc-t...
276
277
  	{
  		.mmc		= 3,
f861fc176   Grazvydas Ignotas   omap: pandora: fi...
278
  		.caps		= MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD,
07d83cc9c   Grazvydas Ignotas   ARM: OMAP3: mmc-t...
279
280
  		.gpio_cd	= -EINVAL,
  		.gpio_wp	= -EINVAL,
ed199f7e7   Grazvydas Ignotas   omap: pandora: pa...
281
  		.init_card	= pandora_wl1251_init_card,
07d83cc9c   Grazvydas Ignotas   ARM: OMAP3: mmc-t...
282
  	},
90c62bf08   Tony Lindgren   omap mmc: Add low...
283
284
  	{}	/* Terminator */
  };
90c62bf08   Tony Lindgren   omap mmc: Add low...
285
286
287
  static int omap3pandora_twl_gpio_setup(struct device *dev,
  		unsigned gpio, unsigned ngpio)
  {
79ccf549b   Grazvydas Ignotas   omap3: pandora: a...
288
  	int ret, gpio_32khz;
90c62bf08   Tony Lindgren   omap mmc: Add low...
289
290
291
  	/* gpio + {0,1} is "mmc{0,1}_cd" (input/IRQ) */
  	omap3pandora_mmc[0].gpio_cd = gpio + 0;
  	omap3pandora_mmc[1].gpio_cd = gpio + 1;
68ff04231   Adrian Hunter   omap: Rename hsmm...
292
  	omap2_hsmmc_init(omap3pandora_mmc);
90c62bf08   Tony Lindgren   omap mmc: Add low...
293

79ccf549b   Grazvydas Ignotas   omap3: pandora: a...
294
295
  	/* gpio + 13 drives 32kHz buffer for wifi module */
  	gpio_32khz = gpio + 13;
bc593f5d7   Igor Grinberg   arm: omap2plus: G...
296
  	ret = gpio_request_one(gpio_32khz, GPIOF_OUT_INIT_HIGH, "wifi 32kHz");
79ccf549b   Grazvydas Ignotas   omap3: pandora: a...
297
298
299
  	if (ret < 0) {
  		pr_err("Cannot get GPIO line %d, ret=%d
  ", gpio_32khz, ret);
bc593f5d7   Igor Grinberg   arm: omap2plus: G...
300
  		return -ENODEV;
79ccf549b   Grazvydas Ignotas   omap3: pandora: a...
301
  	}
90c62bf08   Tony Lindgren   omap mmc: Add low...
302
303
  	return 0;
  }
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
304
305
306
307
  static struct twl4030_gpio_platform_data omap3pandora_gpio_data = {
  	.gpio_base	= OMAP_MAX_GPIO_LINES,
  	.irq_base	= TWL4030_GPIO_IRQ_BASE,
  	.irq_end	= TWL4030_GPIO_IRQ_END,
90c62bf08   Tony Lindgren   omap mmc: Add low...
308
  	.setup		= omap3pandora_twl_gpio_setup,
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
309
  };
786b01a8c   Oleg Drokin   cleanup regulator...
310
311
312
  static struct regulator_consumer_supply pandora_vmmc1_supply[] = {
  	REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
  };
f6873eedd   Grazvydas Ignotas   omap3: pandora: u...
313

786b01a8c   Oleg Drokin   cleanup regulator...
314
315
316
  static struct regulator_consumer_supply pandora_vmmc2_supply[] = {
  	REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1")
  };
f6873eedd   Grazvydas Ignotas   omap3: pandora: u...
317

786b01a8c   Oleg Drokin   cleanup regulator...
318
319
320
  static struct regulator_consumer_supply pandora_vmmc3_supply[] = {
  	REGULATOR_SUPPLY("vmmc", "omap_hsmmc.2"),
  };
690a4a39b   Grazvydas Ignotas   omap: pandora: ad...
321

f6873eedd   Grazvydas Ignotas   omap3: pandora: u...
322
323
324
  static struct regulator_consumer_supply pandora_vdds_supplies[] = {
  	REGULATOR_SUPPLY("vdds_sdi", "omapdss"),
  	REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
7c68dd96d   Tomi Valkeinen   OMAP: DSS2: Chang...
325
  	REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi.0"),
f6873eedd   Grazvydas Ignotas   omap3: pandora: u...
326
  };
786b01a8c   Oleg Drokin   cleanup regulator...
327
328
329
  static struct regulator_consumer_supply pandora_vcc_lcd_supply[] = {
  	REGULATOR_SUPPLY("vcc", "display0"),
  };
f6873eedd   Grazvydas Ignotas   omap3: pandora: u...
330

786b01a8c   Oleg Drokin   cleanup regulator...
331
332
333
  static struct regulator_consumer_supply pandora_usb_phy_supply[] = {
  	REGULATOR_SUPPLY("hsusb0", "ehci-omap.0"),
  };
f6873eedd   Grazvydas Ignotas   omap3: pandora: u...
334
335
336
337
338
339
340
  
  /* ads7846 on SPI and 2 nub controllers on I2C */
  static struct regulator_consumer_supply pandora_vaux4_supplies[] = {
  	REGULATOR_SUPPLY("vcc", "spi1.0"),
  	REGULATOR_SUPPLY("vcc", "3-0066"),
  	REGULATOR_SUPPLY("vcc", "3-0067"),
  };
786b01a8c   Oleg Drokin   cleanup regulator...
341
342
343
  static struct regulator_consumer_supply pandora_adac_supply[] = {
  	REGULATOR_SUPPLY("vcc", "soc-audio"),
  };
f6873eedd   Grazvydas Ignotas   omap3: pandora: u...
344

64f535a87   Grazvydas Ignotas   ARM: OMAP3: pando...
345
346
347
348
349
350
351
352
353
354
355
  /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
  static struct regulator_init_data pandora_vmmc1 = {
  	.constraints = {
  		.min_uV			= 1850000,
  		.max_uV			= 3150000,
  		.valid_modes_mask	= REGULATOR_MODE_NORMAL
  					| REGULATOR_MODE_STANDBY,
  		.valid_ops_mask		= REGULATOR_CHANGE_VOLTAGE
  					| REGULATOR_CHANGE_MODE
  					| REGULATOR_CHANGE_STATUS,
  	},
786b01a8c   Oleg Drokin   cleanup regulator...
356
357
  	.num_consumer_supplies	= ARRAY_SIZE(pandora_vmmc1_supply),
  	.consumer_supplies	= pandora_vmmc1_supply,
64f535a87   Grazvydas Ignotas   ARM: OMAP3: pando...
358
359
360
361
362
363
364
365
366
367
368
369
370
  };
  
  /* VMMC2 for MMC2 pins CMD, CLK, DAT0..DAT3 (max 100 mA) */
  static struct regulator_init_data pandora_vmmc2 = {
  	.constraints = {
  		.min_uV			= 1850000,
  		.max_uV			= 3150000,
  		.valid_modes_mask	= REGULATOR_MODE_NORMAL
  					| REGULATOR_MODE_STANDBY,
  		.valid_ops_mask		= REGULATOR_CHANGE_VOLTAGE
  					| REGULATOR_CHANGE_MODE
  					| REGULATOR_CHANGE_STATUS,
  	},
786b01a8c   Oleg Drokin   cleanup regulator...
371
372
  	.num_consumer_supplies	= ARRAY_SIZE(pandora_vmmc2_supply),
  	.consumer_supplies	= pandora_vmmc2_supply,
64f535a87   Grazvydas Ignotas   ARM: OMAP3: pando...
373
  };
7b097896e   Grazvydas Ignotas   OMAP: pandora: ad...
374
375
376
377
378
379
380
381
382
383
384
  /* VAUX1 for LCD */
  static struct regulator_init_data pandora_vaux1 = {
  	.constraints = {
  		.min_uV			= 3000000,
  		.max_uV			= 3000000,
  		.apply_uV		= true,
  		.valid_modes_mask	= REGULATOR_MODE_NORMAL
  					| REGULATOR_MODE_STANDBY,
  		.valid_ops_mask		= REGULATOR_CHANGE_MODE
  					| REGULATOR_CHANGE_STATUS,
  	},
786b01a8c   Oleg Drokin   cleanup regulator...
385
386
  	.num_consumer_supplies	= ARRAY_SIZE(pandora_vcc_lcd_supply),
  	.consumer_supplies	= pandora_vcc_lcd_supply,
7b097896e   Grazvydas Ignotas   OMAP: pandora: ad...
387
  };
f6873eedd   Grazvydas Ignotas   omap3: pandora: u...
388
389
390
391
392
393
394
395
396
397
398
  /* VAUX2 for USB host PHY */
  static struct regulator_init_data pandora_vaux2 = {
  	.constraints = {
  		.min_uV			= 1800000,
  		.max_uV			= 1800000,
  		.apply_uV		= true,
  		.valid_modes_mask	= REGULATOR_MODE_NORMAL
  					| REGULATOR_MODE_STANDBY,
  		.valid_ops_mask		= REGULATOR_CHANGE_MODE
  					| REGULATOR_CHANGE_STATUS,
  	},
786b01a8c   Oleg Drokin   cleanup regulator...
399
400
  	.num_consumer_supplies	= ARRAY_SIZE(pandora_usb_phy_supply),
  	.consumer_supplies	= pandora_usb_phy_supply,
f6873eedd   Grazvydas Ignotas   omap3: pandora: u...
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
  };
  
  /* VAUX4 for ads7846 and nubs */
  static struct regulator_init_data pandora_vaux4 = {
  	.constraints = {
  		.min_uV			= 2800000,
  		.max_uV			= 2800000,
  		.apply_uV		= true,
  		.valid_modes_mask	= REGULATOR_MODE_NORMAL
  					| REGULATOR_MODE_STANDBY,
  		.valid_ops_mask		= REGULATOR_CHANGE_MODE
  					| REGULATOR_CHANGE_STATUS,
  	},
  	.num_consumer_supplies	= ARRAY_SIZE(pandora_vaux4_supplies),
  	.consumer_supplies	= pandora_vaux4_supplies,
  };
  
  /* VSIM for audio DAC */
  static struct regulator_init_data pandora_vsim = {
  	.constraints = {
  		.min_uV			= 2800000,
  		.max_uV			= 2800000,
  		.apply_uV		= true,
  		.valid_modes_mask	= REGULATOR_MODE_NORMAL
  					| REGULATOR_MODE_STANDBY,
  		.valid_ops_mask		= REGULATOR_CHANGE_MODE
  					| REGULATOR_CHANGE_STATUS,
  	},
786b01a8c   Oleg Drokin   cleanup regulator...
429
430
  	.num_consumer_supplies	= ARRAY_SIZE(pandora_adac_supply),
  	.consumer_supplies	= pandora_adac_supply,
f6873eedd   Grazvydas Ignotas   omap3: pandora: u...
431
  };
690a4a39b   Grazvydas Ignotas   omap: pandora: ad...
432
433
434
435
436
  /* Fixed regulator internal to Wifi module */
  static struct regulator_init_data pandora_vmmc3 = {
  	.constraints = {
  		.valid_ops_mask		= REGULATOR_CHANGE_STATUS,
  	},
786b01a8c   Oleg Drokin   cleanup regulator...
437
438
  	.num_consumer_supplies	= ARRAY_SIZE(pandora_vmmc3_supply),
  	.consumer_supplies	= pandora_vmmc3_supply,
690a4a39b   Grazvydas Ignotas   omap: pandora: ad...
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
  };
  
  static struct fixed_voltage_config pandora_vwlan = {
  	.supply_name		= "vwlan",
  	.microvolts		= 1800000, /* 1.8V */
  	.gpio			= PANDORA_WIFI_NRESET_GPIO,
  	.startup_delay		= 50000, /* 50ms */
  	.enable_high		= 1,
  	.enabled_at_boot	= 0,
  	.init_data		= &pandora_vmmc3,
  };
  
  static struct platform_device pandora_vwlan_device = {
  	.name		= "reg-fixed-voltage",
  	.id		= 1,
  	.dev = {
  		.platform_data = &pandora_vwlan,
  	},
  };
e13bb34bd   Grazvydas Ignotas   omap: pandora: en...
458
  static struct twl4030_bci_platform_data pandora_bci_data;
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
459
  static struct twl4030_platform_data omap3pandora_twldata = {
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
460
  	.gpio		= &omap3pandora_gpio_data,
64f535a87   Grazvydas Ignotas   ARM: OMAP3: pando...
461
462
  	.vmmc1		= &pandora_vmmc1,
  	.vmmc2		= &pandora_vmmc2,
7b097896e   Grazvydas Ignotas   OMAP: pandora: ad...
463
  	.vaux1		= &pandora_vaux1,
f6873eedd   Grazvydas Ignotas   omap3: pandora: u...
464
465
466
  	.vaux2		= &pandora_vaux2,
  	.vaux4		= &pandora_vaux4,
  	.vsim		= &pandora_vsim,
741904501   Grazvydas Ignotas   ARM: OMAP3: pando...
467
  	.keypad		= &pandora_kp_data,
e13bb34bd   Grazvydas Ignotas   omap: pandora: en...
468
  	.bci		= &pandora_bci_data,
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
469
  };
03d5671dd   Grazvydas Ignotas   omap3: pandora: a...
470
471
472
473
474
475
  static struct i2c_board_info __initdata omap3pandora_i2c3_boardinfo[] = {
  	{
  		I2C_BOARD_INFO("bq27500", 0x55),
  		.flags = I2C_CLIENT_WAKE,
  	},
  };
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
476
477
  static int __init omap3pandora_i2c_init(void)
  {
827ed9aef   Peter Ujfalusi   OMAP3: Move commo...
478
  	omap3_pmic_get_config(&omap3pandora_twldata,
b252b0efb   Peter Ujfalusi   OMAP3: Move commo...
479
480
481
482
483
484
485
486
487
  			TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_AUDIO,
  			TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2);
  
  	omap3pandora_twldata.vdac->constraints.apply_uV = true;
  
  	omap3pandora_twldata.vpll2->constraints.apply_uV = true;
  	omap3pandora_twldata.vpll2->num_consumer_supplies =
  					ARRAY_SIZE(pandora_vdds_supplies);
  	omap3pandora_twldata.vpll2->consumer_supplies = pandora_vdds_supplies;
fbd8071c1   Mike Rapoport   omap: use common ...
488
  	omap3_pmic_init("tps65950", &omap3pandora_twldata);
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
489
  	/* i2c2 pins are not connected */
03d5671dd   Grazvydas Ignotas   omap3: pandora: a...
490
491
  	omap_register_i2c_bus(3, 100, omap3pandora_i2c3_boardinfo,
  			ARRAY_SIZE(omap3pandora_i2c3_boardinfo));
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
492
493
  	return 0;
  }
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
494
495
  static struct spi_board_info omap3pandora_spi_board_info[] __initdata = {
  	{
7b097896e   Grazvydas Ignotas   OMAP: pandora: ad...
496
497
498
499
500
  		.modalias		= "tpo_td043mtea1_panel_spi",
  		.bus_num		= 1,
  		.chip_select		= 1,
  		.max_speed_hz		= 375000,
  		.platform_data		= &pandora_lcd_device,
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
501
502
  	}
  };
e4b3fdb80   Grazvydas Ignotas   wl1251: use wl12x...
503
  static void __init pandora_wl1251_init(void)
79ccf549b   Grazvydas Ignotas   omap3: pandora: a...
504
  {
e4b3fdb80   Grazvydas Ignotas   wl1251: use wl12x...
505
  	struct wl12xx_platform_data pandora_wl1251_pdata;
79ccf549b   Grazvydas Ignotas   omap3: pandora: a...
506
  	int ret;
e4b3fdb80   Grazvydas Ignotas   wl1251: use wl12x...
507
  	memset(&pandora_wl1251_pdata, 0, sizeof(pandora_wl1251_pdata));
bc593f5d7   Igor Grinberg   arm: omap2plus: G...
508
  	ret = gpio_request_one(PANDORA_WIFI_IRQ_GPIO, GPIOF_IN, "wl1251 irq");
79ccf549b   Grazvydas Ignotas   omap3: pandora: a...
509
510
  	if (ret < 0)
  		goto fail;
79ccf549b   Grazvydas Ignotas   omap3: pandora: a...
511
512
513
  	pandora_wl1251_pdata.irq = gpio_to_irq(PANDORA_WIFI_IRQ_GPIO);
  	if (pandora_wl1251_pdata.irq < 0)
  		goto fail_irq;
e4b3fdb80   Grazvydas Ignotas   wl1251: use wl12x...
514
515
516
517
  	pandora_wl1251_pdata.use_eeprom = true;
  	ret = wl12xx_set_platform_data(&pandora_wl1251_pdata);
  	if (ret < 0)
  		goto fail_irq;
79ccf549b   Grazvydas Ignotas   omap3: pandora: a...
518
  	return;
79ccf549b   Grazvydas Ignotas   omap3: pandora: a...
519
520
521
522
523
524
  fail_irq:
  	gpio_free(PANDORA_WIFI_IRQ_GPIO);
  fail:
  	printk(KERN_ERR "wl1251 board initialisation failed
  ");
  }
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
525
  static struct platform_device *omap3pandora_devices[] __initdata = {
741904501   Grazvydas Ignotas   ARM: OMAP3: pando...
526
527
  	&pandora_leds_gpio,
  	&pandora_keys_gpio,
690a4a39b   Grazvydas Ignotas   omap: pandora: ad...
528
  	&pandora_vwlan_device,
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
529
  };
181b250cf   Keshava Munegowda   arm: omap: usb: c...
530
  static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
58a5491c9   Felipe Balbi   omap: Add platfor...
531

181b250cf   Keshava Munegowda   arm: omap: usb: c...
532
533
534
  	.port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
  	.port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED,
  	.port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
58a5491c9   Felipe Balbi   omap: Add platfor...
535
536
537
538
539
540
  
  	.phy_reset  = true,
  	.reset_gpio_port[0]  = 16,
  	.reset_gpio_port[1]  = -EINVAL,
  	.reset_gpio_port[2]  = -EINVAL
  };
ca5742bdb   Tony Lindgren   omap: mux: Add ne...
541
542
543
544
  #ifdef CONFIG_OMAP_MUX
  static struct omap_board_mux board_mux[] __initdata = {
  	{ .reg_offset = OMAP_MUX_TERMINATOR },
  };
ca5742bdb   Tony Lindgren   omap: mux: Add ne...
545
  #endif
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
546
547
  static void __init omap3pandora_init(void)
  {
ca5742bdb   Tony Lindgren   omap: mux: Add ne...
548
  	omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
549
  	omap3pandora_i2c_init();
79ccf549b   Grazvydas Ignotas   omap3: pandora: a...
550
  	pandora_wl1251_init();
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
551
552
  	platform_add_devices(omap3pandora_devices,
  			ARRAY_SIZE(omap3pandora_devices));
d5e13227c   Senthilvadivu Guruswamy   OMAP2, 3: DSS2: b...
553
  	omap_display_init(&pandora_dss_data);
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
554
  	omap_serial_init();
a4ca9dbe4   Tony Lindgren   ARM: OMAP: Move o...
555
556
  	omap_sdrc_init(mt46h32m32lf6_sdrc_params,
  				  mt46h32m32lf6_sdrc_params);
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
557
558
  	spi_register_board_info(omap3pandora_spi_board_info,
  			ARRAY_SIZE(omap3pandora_spi_board_info));
96974a249   Mike Rapoport   omap: consolidate...
559
  	omap_ads7846_init(1, OMAP3_PANDORA_TS_GPIO, 0, NULL);
9e64bb1e9   Keshava Munegowda   arm: omap: usb: I...
560
  	usbhs_init(&usbhs_bdata);
9e18630b6   Mike Rapoport   omap: musb: intro...
561
  	usb_musb_init(NULL);
79ccf549b   Grazvydas Ignotas   omap3: pandora: a...
562
  	gpmc_nand_init(&pandora_nand_data);
9fb97412c   Jean Pihet   OMAP3: Setup MUX ...
563
564
  
  	/* Ensure SDRC pins are mux'd for self-refresh */
4896e3940   Tony Lindgren   omap: mux: Replac...
565
566
  	omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
  	omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT);
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
567
  }
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
568
  MACHINE_START(OMAP3_PANDORA, "Pandora Handheld Console")
5e52b435b   Nicolas Pitre   ARM: mach-omap2: ...
569
  	.atag_offset	= 0x100,
71ee7dad9   Russell King   ARM: OMAP: Conver...
570
  	.reserve	= omap_reserve,
3dc3bad6f   Russell King - ARM Linux   ARM: OMAP2: use e...
571
  	.map_io		= omap3_map_io,
8f5b5a41e   Tony Lindgren   ARM: OMAP: Introd...
572
  	.init_early	= omap35xx_init_early,
741e3a89d   Tony Lindgren   omap: Use separat...
573
  	.init_irq	= omap3_init_irq,
6b2f55d78   Marc Zyngier   ARM: omap2plus: c...
574
  	.handle_irq	= omap3_intc_handle_irq,
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
575
  	.init_machine	= omap3pandora_init,
e74984e46   Tony Lindgren   omap: Set separat...
576
  	.timer		= &omap3_timer,
baa958834   Russell King   ARM: restart: oma...
577
  	.restart	= omap_prcm_restart,
da177247e   Grazvydas Ignotas   ARM: OMAP3: Add b...
578
  MACHINE_END