Blame view

arch/arm/mach-omap2/board-omap3touchbook.c 9.53 KB
7a079cab4   Gregoire Gentil   omap3: Board file...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  /*
   * linux/arch/arm/mach-omap2/board-omap3touchbook.c
   *
   * Copyright (C) 2009 Always Innovating
   *
   * Modified from mach-omap2/board-omap3beagleboard.c
   *
   * Initial code: Grégoire Gentil, Tim Yamin
   *
   * 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.
   */
  
  #include <linux/kernel.h>
  #include <linux/init.h>
  #include <linux/platform_device.h>
  #include <linux/delay.h>
  #include <linux/err.h>
  #include <linux/clk.h>
  #include <linux/io.h>
  #include <linux/leds.h>
  #include <linux/gpio.h>
  #include <linux/input.h>
  #include <linux/gpio_keys.h>
  
  #include <linux/mtd/mtd.h>
  #include <linux/mtd/partitions.h>
  #include <linux/mtd/nand.h>
3a63833ec   Sukumar Ghorai   omap: mmc: extend...
30
  #include <linux/mmc/host.h>
7a079cab4   Gregoire Gentil   omap3: Board file...
31
32
33
34
35
36
37
  
  #include <plat/mcspi.h>
  #include <linux/spi/spi.h>
  
  #include <linux/spi/ads7846.h>
  
  #include <linux/regulator/machine.h>
ebeb53e1e   Balaji T K   mfd: twl: fix twl...
38
  #include <linux/i2c/twl.h>
7a079cab4   Gregoire Gentil   omap3: Board file...
39
40
41
42
43
44
45
46
  
  #include <mach/hardware.h>
  #include <asm/mach-types.h>
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
  #include <asm/mach/flash.h>
  
  #include <plat/board.h>
4e65331c6   Tony Lindgren   ARM: 7159/1: OMAP...
47
  #include "common.h"
7a079cab4   Gregoire Gentil   omap3: Board file...
48
49
50
  #include <plat/gpmc.h>
  #include <plat/nand.h>
  #include <plat/usb.h>
7a079cab4   Gregoire Gentil   omap3: Board file...
51
52
  
  #include "mux.h"
d02a900b5   Adrian Hunter   omap: Rename mmc-...
53
  #include "hsmmc.h"
96974a249   Mike Rapoport   omap: consolidate...
54
  #include "common-board-devices.h"
7a079cab4   Gregoire Gentil   omap3: Board file...
55
56
  
  #include <asm/setup.h>
7a079cab4   Gregoire Gentil   omap3: Board file...
57
58
59
60
  #define OMAP3_AC_GPIO		136
  #define OMAP3_TS_GPIO		162
  #define TB_BL_PWM_TIMER		9
  #define TB_KILL_POWER_GPIO	168
388157339   Manjunath Kondaiah G   OMAP: mach-omap2:...
61
  static unsigned long touchbook_revision;
7a079cab4   Gregoire Gentil   omap3: Board file...
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
  
  static struct mtd_partition omap3touchbook_nand_partitions[] = {
  	/* All the partition sizes are listed in terms of NAND block size */
  	{
  		.name		= "X-Loader",
  		.offset		= 0,
  		.size		= 4 * NAND_BLOCK_SIZE,
  		.mask_flags	= MTD_WRITEABLE,	/* force read-only */
  	},
  	{
  		.name		= "U-Boot",
  		.offset		= MTDPART_OFS_APPEND,	/* Offset = 0x80000 */
  		.size		= 15 * NAND_BLOCK_SIZE,
  		.mask_flags	= MTD_WRITEABLE,	/* force read-only */
  	},
  	{
  		.name		= "U-Boot Env",
  		.offset		= MTDPART_OFS_APPEND,	/* Offset = 0x260000 */
  		.size		= 1 * NAND_BLOCK_SIZE,
  	},
  	{
  		.name		= "Kernel",
  		.offset		= MTDPART_OFS_APPEND,	/* Offset = 0x280000 */
  		.size		= 32 * NAND_BLOCK_SIZE,
  	},
  	{
  		.name		= "File System",
  		.offset		= MTDPART_OFS_APPEND,	/* Offset = 0x680000 */
  		.size		= MTDPART_SIZ_FULL,
  	},
  };
7a079cab4   Gregoire Gentil   omap3: Board file...
93
  #include "sdram-micron-mt46h32m32lf-6.h"
68ff04231   Adrian Hunter   omap: Rename hsmm...
94
  static struct omap2_hsmmc_info mmc[] = {
7a079cab4   Gregoire Gentil   omap3: Board file...
95
96
  	{
  		.mmc		= 1,
3a63833ec   Sukumar Ghorai   omap: mmc: extend...
97
  		.caps		= MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
7a079cab4   Gregoire Gentil   omap3: Board file...
98
99
100
101
  		.gpio_wp	= 29,
  	},
  	{}	/* Terminator */
  };
786b01a8c   Oleg Drokin   cleanup regulator...
102
103
  static struct regulator_consumer_supply touchbook_vmmc1_supply[] = {
  	REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
7a079cab4   Gregoire Gentil   omap3: Board file...
104
  };
786b01a8c   Oleg Drokin   cleanup regulator...
105
106
  static struct regulator_consumer_supply touchbook_vsim_supply[] = {
  	REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.0"),
7a079cab4   Gregoire Gentil   omap3: Board file...
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
  };
  
  static struct gpio_led gpio_leds[];
  
  static int touchbook_twl_gpio_setup(struct device *dev,
  		unsigned gpio, unsigned ngpio)
  {
  	if (system_rev >= 0x20 && system_rev <= 0x34301000) {
  		omap_mux_init_gpio(23, OMAP_PIN_INPUT);
  		mmc[0].gpio_wp = 23;
  	} else {
  		omap_mux_init_gpio(29, OMAP_PIN_INPUT);
  	}
  	/* gpio + 0 is "mmc0_cd" (input/IRQ) */
  	mmc[0].gpio_cd = gpio + 0;
68ff04231   Adrian Hunter   omap: Rename hsmm...
122
  	omap2_hsmmc_init(mmc);
7a079cab4   Gregoire Gentil   omap3: Board file...
123

7a079cab4   Gregoire Gentil   omap3: Board file...
124
125
126
  	/* REVISIT: need ehci-omap hooks for external VBUS
  	 * power switch and overcurrent detect
  	 */
bc593f5d7   Igor Grinberg   arm: omap2plus: G...
127
  	gpio_request_one(gpio + 1, GPIOF_IN, "EHCI_nOC");
7a079cab4   Gregoire Gentil   omap3: Board file...
128
129
  
  	/* TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, active low) */
bc593f5d7   Igor Grinberg   arm: omap2plus: G...
130
131
  	gpio_request_one(gpio + TWL4030_GPIO_MAX, GPIOF_OUT_INIT_LOW,
  			 "nEN_USB_PWR");
7a079cab4   Gregoire Gentil   omap3: Board file...
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
  
  	/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
  	gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
  
  	return 0;
  }
  
  static struct twl4030_gpio_platform_data touchbook_gpio_data = {
  	.gpio_base	= OMAP_MAX_GPIO_LINES,
  	.irq_base	= TWL4030_GPIO_IRQ_BASE,
  	.irq_end	= TWL4030_GPIO_IRQ_END,
  	.use_leds	= true,
  	.pullups	= BIT(1),
  	.pulldowns	= BIT(2) | BIT(6) | BIT(7) | BIT(8) | BIT(13)
  				| BIT(15) | BIT(16) | BIT(17),
  	.setup		= touchbook_twl_gpio_setup,
  };
786b01a8c   Oleg Drokin   cleanup regulator...
149
150
  static struct regulator_consumer_supply touchbook_vdac_supply[] = {
  {
7a079cab4   Gregoire Gentil   omap3: Board file...
151
  	.supply		= "vdac",
786b01a8c   Oleg Drokin   cleanup regulator...
152
  },
7a079cab4   Gregoire Gentil   omap3: Board file...
153
  };
786b01a8c   Oleg Drokin   cleanup regulator...
154
155
  static struct regulator_consumer_supply touchbook_vdvi_supply[] = {
  {
7a079cab4   Gregoire Gentil   omap3: Board file...
156
  	.supply		= "vdvi",
786b01a8c   Oleg Drokin   cleanup regulator...
157
  },
7a079cab4   Gregoire Gentil   omap3: Board file...
158
159
160
161
162
163
164
165
166
167
168
169
170
  };
  
  /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
  static struct regulator_init_data touchbook_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...
171
172
  	.num_consumer_supplies	= ARRAY_SIZE(touchbook_vmmc1_supply),
  	.consumer_supplies	= touchbook_vmmc1_supply,
7a079cab4   Gregoire Gentil   omap3: Board file...
173
174
175
176
177
178
179
180
181
182
183
184
185
  };
  
  /* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */
  static struct regulator_init_data touchbook_vsim = {
  	.constraints = {
  		.min_uV			= 1800000,
  		.max_uV			= 3000000,
  		.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...
186
187
  	.num_consumer_supplies	= ARRAY_SIZE(touchbook_vsim_supply),
  	.consumer_supplies	= touchbook_vsim_supply,
7a079cab4   Gregoire Gentil   omap3: Board file...
188
  };
7a079cab4   Gregoire Gentil   omap3: Board file...
189
  static struct twl4030_platform_data touchbook_twldata = {
7a079cab4   Gregoire Gentil   omap3: Board file...
190
  	/* platform_data for children goes here */
7a079cab4   Gregoire Gentil   omap3: Board file...
191
  	.gpio		= &touchbook_gpio_data,
7a079cab4   Gregoire Gentil   omap3: Board file...
192
193
  	.vmmc1		= &touchbook_vmmc1,
  	.vsim		= &touchbook_vsim,
7a079cab4   Gregoire Gentil   omap3: Board file...
194
  };
7a079cab4   Gregoire Gentil   omap3: Board file...
195
196
197
198
199
200
201
202
203
  static struct i2c_board_info __initdata touchBook_i2c_boardinfo[] = {
  	{
  		I2C_BOARD_INFO("bq27200", 0x55),
  	},
  };
  
  static int __init omap3_touchbook_i2c_init(void)
  {
  	/* Standard TouchBook bus */
827ed9aef   Peter Ujfalusi   OMAP3: Move commo...
204
  	omap3_pmic_get_config(&touchbook_twldata,
b252b0efb   Peter Ujfalusi   OMAP3: Move commo...
205
206
207
208
209
210
211
212
213
214
215
  			TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_AUDIO,
  			TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2);
  
  	touchbook_twldata.vdac->num_consumer_supplies =
  					ARRAY_SIZE(touchbook_vdac_supply);
  	touchbook_twldata.vdac->consumer_supplies = touchbook_vdac_supply;
  
  	touchbook_twldata.vpll2->constraints.name = "VDVI";
  	touchbook_twldata.vpll2->num_consumer_supplies =
  					ARRAY_SIZE(touchbook_vdvi_supply);
  	touchbook_twldata.vpll2->consumer_supplies = touchbook_vdvi_supply;
fbd8071c1   Mike Rapoport   omap: use common ...
216
  	omap3_pmic_init("twl4030", &touchbook_twldata);
7a079cab4   Gregoire Gentil   omap3: Board file...
217
218
219
220
221
222
  	/* Additional TouchBook bus */
  	omap_register_i2c_bus(3, 100, touchBook_i2c_boardinfo,
  			ARRAY_SIZE(touchBook_i2c_boardinfo));
  
  	return 0;
  }
96974a249   Mike Rapoport   omap: consolidate...
223
  static struct ads7846_platform_data ads7846_pdata = {
7a079cab4   Gregoire Gentil   omap3: Board file...
224
225
226
227
228
229
230
231
232
233
234
235
  	.x_min			= 100,
  	.y_min			= 265,
  	.x_max			= 3950,
  	.y_max			= 3750,
  	.x_plate_ohms		= 40,
  	.pressure_max		= 255,
  	.debounce_max		= 10,
  	.debounce_tol		= 5,
  	.debounce_rep		= 1,
  	.gpio_pendown		= OMAP3_TS_GPIO,
  	.keep_vref_on		= 1,
  };
7a079cab4   Gregoire Gentil   omap3: Board file...
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
  static struct gpio_led gpio_leds[] = {
  	{
  		.name			= "touchbook::usr0",
  		.default_trigger	= "heartbeat",
  		.gpio			= 150,
  	},
  	{
  		.name			= "touchbook::usr1",
  		.default_trigger	= "mmc0",
  		.gpio			= 149,
  	},
  	{
  		.name			= "touchbook::pmu_stat",
  		.gpio			= -EINVAL,	/* gets replaced */
  		.active_low		= true,
  	},
  };
  
  static struct gpio_led_platform_data gpio_led_info = {
  	.leds		= gpio_leds,
  	.num_leds	= ARRAY_SIZE(gpio_leds),
  };
  
  static struct platform_device leds_gpio = {
  	.name	= "leds-gpio",
  	.id	= -1,
  	.dev	= {
  		.platform_data	= &gpio_led_info,
  	},
  };
  
  static struct gpio_keys_button gpio_buttons[] = {
  	{
  		.code			= BTN_EXTRA,
  		.gpio			= 7,
  		.desc			= "user",
  		.wakeup			= 1,
  	},
  	{
  		.code			= KEY_POWER,
  		.gpio			= 183,
  		.desc			= "power",
  		.wakeup			= 1,
  	},
  };
  
  static struct gpio_keys_platform_data gpio_key_info = {
  	.buttons	= gpio_buttons,
  	.nbuttons	= ARRAY_SIZE(gpio_buttons),
  };
  
  static struct platform_device keys_gpio = {
  	.name	= "gpio-keys",
  	.id	= -1,
  	.dev	= {
  		.platform_data	= &gpio_key_info,
  	},
  };
7a079cab4   Gregoire Gentil   omap3: Board file...
294
295
296
297
  #ifdef CONFIG_OMAP_MUX
  static struct omap_board_mux board_mux[] __initdata = {
  	{ .reg_offset = OMAP_MUX_TERMINATOR },
  };
7a079cab4   Gregoire Gentil   omap3: Board file...
298
  #endif
7a079cab4   Gregoire Gentil   omap3: Board file...
299
  static struct platform_device *omap3_touchbook_devices[] __initdata = {
7a079cab4   Gregoire Gentil   omap3: Board file...
300
301
302
  	&leds_gpio,
  	&keys_gpio,
  };
181b250cf   Keshava Munegowda   arm: omap: usb: c...
303
  static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
7a079cab4   Gregoire Gentil   omap3: Board file...
304

181b250cf   Keshava Munegowda   arm: omap: usb: c...
305
306
307
  	.port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
  	.port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
  	.port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
7a079cab4   Gregoire Gentil   omap3: Board file...
308
309
310
311
312
313
314
315
316
  
  	.phy_reset  = true,
  	.reset_gpio_port[0]  = -EINVAL,
  	.reset_gpio_port[1]  = 147,
  	.reset_gpio_port[2]  = -EINVAL
  };
  
  static void omap3_touchbook_poweroff(void)
  {
bc593f5d7   Igor Grinberg   arm: omap2plus: G...
317
  	int pwr_off = TB_KILL_POWER_GPIO;
7a079cab4   Gregoire Gentil   omap3: Board file...
318

bc593f5d7   Igor Grinberg   arm: omap2plus: G...
319
  	if (gpio_request_one(pwr_off, GPIOF_OUT_INIT_LOW, "DVI reset") < 0)
7a079cab4   Gregoire Gentil   omap3: Board file...
320
321
  		printk(KERN_ERR "Unable to get kill power GPIO
  ");
7a079cab4   Gregoire Gentil   omap3: Board file...
322
  }
d2197e1e6   Tony Lindgren   omap3: Fix compil...
323
  static int __init early_touchbook_revision(char *p)
7a079cab4   Gregoire Gentil   omap3: Board file...
324
  {
d2197e1e6   Tony Lindgren   omap3: Fix compil...
325
326
  	if (!p)
  		return 0;
7a079cab4   Gregoire Gentil   omap3: Board file...
327

d2197e1e6   Tony Lindgren   omap3: Fix compil...
328
  	return strict_strtoul(p, 10, &touchbook_revision);
7a079cab4   Gregoire Gentil   omap3: Board file...
329
  }
d2197e1e6   Tony Lindgren   omap3: Fix compil...
330
  early_param("tbr", early_touchbook_revision);
7a079cab4   Gregoire Gentil   omap3: Board file...
331
332
333
  
  static void __init omap3_touchbook_init(void)
  {
e0530460f   Radek Pilař (Mrkva)   OMAP3 Touchbook: ...
334
  	omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
e41cccfe7   Tony Lindgren   omap2+: Minimize ...
335

7a079cab4   Gregoire Gentil   omap3: Board file...
336
337
338
339
340
341
  	pm_power_off = omap3_touchbook_poweroff;
  
  	omap3_touchbook_i2c_init();
  	platform_add_devices(omap3_touchbook_devices,
  			ARRAY_SIZE(omap3_touchbook_devices));
  	omap_serial_init();
a4ca9dbe4   Tony Lindgren   ARM: OMAP: Move o...
342
343
  	omap_sdrc_init(mt46h32m32lf6_sdrc_params,
  				  mt46h32m32lf6_sdrc_params);
7a079cab4   Gregoire Gentil   omap3: Board file...
344
345
  
  	omap_mux_init_gpio(170, OMAP_PIN_INPUT);
7a079cab4   Gregoire Gentil   omap3: Board file...
346
  	/* REVISIT leave DVI powered down until it's needed ... */
bc593f5d7   Igor Grinberg   arm: omap2plus: G...
347
  	gpio_request_one(176, GPIOF_OUT_INIT_HIGH, "DVI_nPD");
7a079cab4   Gregoire Gentil   omap3: Board file...
348
349
  
  	/* Touchscreen and accelerometer */
96974a249   Mike Rapoport   omap: consolidate...
350
  	omap_ads7846_init(4, OMAP3_TS_GPIO, 310, &ads7846_pdata);
9e18630b6   Mike Rapoport   omap: musb: intro...
351
  	usb_musb_init(NULL);
9e64bb1e9   Keshava Munegowda   arm: omap: usb: I...
352
  	usbhs_init(&usbhs_bdata);
9a3f39ff3   Mike Rapoport   omap: move detect...
353
354
  	omap_nand_flash_init(NAND_BUSWIDTH_16, omap3touchbook_nand_partitions,
  			     ARRAY_SIZE(omap3touchbook_nand_partitions));
7a079cab4   Gregoire Gentil   omap3: Board file...
355
356
357
358
359
  
  	/* Ensure SDRC pins are mux'd for self-refresh */
  	omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
  	omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT);
  }
7a079cab4   Gregoire Gentil   omap3: Board file...
360
361
  MACHINE_START(TOUCHBOOK, "OMAP3 touchbook Board")
  	/* Maintainer: Gregoire Gentil - http://www.alwaysinnovating.com */
5e52b435b   Nicolas Pitre   ARM: mach-omap2: ...
362
  	.atag_offset	= 0x100,
71ee7dad9   Russell King   ARM: OMAP: Conver...
363
  	.reserve	= omap_reserve,
3dc3bad6f   Russell King - ARM Linux   ARM: OMAP2: use e...
364
  	.map_io		= omap3_map_io,
8f5b5a41e   Tony Lindgren   ARM: OMAP: Introd...
365
  	.init_early	= omap3430_init_early,
be7324605   Tony Lindgren   ARM: OMAP2+: Remo...
366
  	.init_irq	= omap3_init_irq,
6b2f55d78   Marc Zyngier   ARM: omap2plus: c...
367
  	.handle_irq	= omap3_intc_handle_irq,
7a079cab4   Gregoire Gentil   omap3: Board file...
368
  	.init_machine	= omap3_touchbook_init,
e74984e46   Tony Lindgren   omap: Set separat...
369
  	.timer		= &omap3_secure_timer,
baa958834   Russell King   ARM: restart: oma...
370
  	.restart	= omap_prcm_restart,
7a079cab4   Gregoire Gentil   omap3: Board file...
371
  MACHINE_END