Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4
[GitHub/LineageOS/android_kernel_samsung_universal7580.git] / arch / arm / mach-omap2 / board-3430sdp.c
1 /*
2 * linux/arch/arm/mach-omap2/board-3430sdp.c
3 *
4 * Copyright (C) 2007 Texas Instruments
5 *
6 * Modified from mach-omap2/board-generic.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/input.h>
20 #include <linux/spi/spi.h>
21 #include <linux/spi/ads7846.h>
22 #include <linux/i2c/twl4030.h>
23 #include <linux/regulator/machine.h>
24 #include <linux/io.h>
25 #include <linux/gpio.h>
26
27 #include <mach/hardware.h>
28 #include <asm/mach-types.h>
29 #include <asm/mach/arch.h>
30 #include <asm/mach/map.h>
31
32 #include <mach/mcspi.h>
33 #include <mach/mux.h>
34 #include <mach/board.h>
35 #include <mach/usb.h>
36 #include <mach/common.h>
37 #include <mach/dma.h>
38 #include <mach/gpmc.h>
39
40 #include <mach/control.h>
41 #include <mach/keypad.h>
42 #include <mach/gpmc-smc91x.h>
43
44 #include "sdram-qimonda-hyb18m512160af-6.h"
45 #include "mmc-twl4030.h"
46
47 #define CONFIG_DISABLE_HFCLK 1
48
49 #define SDP3430_TS_GPIO_IRQ_SDPV1 3
50 #define SDP3430_TS_GPIO_IRQ_SDPV2 2
51
52 #define ENABLE_VAUX3_DEDICATED 0x03
53 #define ENABLE_VAUX3_DEV_GRP 0x20
54
55 #define TWL4030_MSECURE_GPIO 22
56
57 static int board_keymap[] = {
58 KEY(0, 0, KEY_LEFT),
59 KEY(0, 1, KEY_RIGHT),
60 KEY(0, 2, KEY_A),
61 KEY(0, 3, KEY_B),
62 KEY(0, 4, KEY_C),
63 KEY(1, 0, KEY_DOWN),
64 KEY(1, 1, KEY_UP),
65 KEY(1, 2, KEY_E),
66 KEY(1, 3, KEY_F),
67 KEY(1, 4, KEY_G),
68 KEY(2, 0, KEY_ENTER),
69 KEY(2, 1, KEY_I),
70 KEY(2, 2, KEY_J),
71 KEY(2, 3, KEY_K),
72 KEY(2, 4, KEY_3),
73 KEY(3, 0, KEY_M),
74 KEY(3, 1, KEY_N),
75 KEY(3, 2, KEY_O),
76 KEY(3, 3, KEY_P),
77 KEY(3, 4, KEY_Q),
78 KEY(4, 0, KEY_R),
79 KEY(4, 1, KEY_4),
80 KEY(4, 2, KEY_T),
81 KEY(4, 3, KEY_U),
82 KEY(4, 4, KEY_D),
83 KEY(5, 0, KEY_V),
84 KEY(5, 1, KEY_W),
85 KEY(5, 2, KEY_L),
86 KEY(5, 3, KEY_S),
87 KEY(5, 4, KEY_H),
88 0
89 };
90
91 static struct matrix_keymap_data board_map_data = {
92 .keymap = board_keymap,
93 .keymap_size = ARRAY_SIZE(board_keymap),
94 };
95
96 static struct twl4030_keypad_data sdp3430_kp_data = {
97 .keymap_data = &board_map_data,
98 .rows = 5,
99 .cols = 6,
100 .rep = 1,
101 };
102
103 static int ts_gpio; /* Needed for ads7846_get_pendown_state */
104
105 /**
106 * @brief ads7846_dev_init : Requests & sets GPIO line for pen-irq
107 *
108 * @return - void. If request gpio fails then Flag KERN_ERR.
109 */
110 static void ads7846_dev_init(void)
111 {
112 if (gpio_request(ts_gpio, "ADS7846 pendown") < 0) {
113 printk(KERN_ERR "can't get ads746 pen down GPIO\n");
114 return;
115 }
116
117 gpio_direction_input(ts_gpio);
118
119 omap_set_gpio_debounce(ts_gpio, 1);
120 omap_set_gpio_debounce_time(ts_gpio, 0xa);
121 }
122
123 static int ads7846_get_pendown_state(void)
124 {
125 return !gpio_get_value(ts_gpio);
126 }
127
128 static struct ads7846_platform_data tsc2046_config __initdata = {
129 .get_pendown_state = ads7846_get_pendown_state,
130 .keep_vref_on = 1,
131 };
132
133
134 static struct omap2_mcspi_device_config tsc2046_mcspi_config = {
135 .turbo_mode = 0,
136 .single_channel = 1, /* 0: slave, 1: master */
137 };
138
139 static struct spi_board_info sdp3430_spi_board_info[] __initdata = {
140 [0] = {
141 /*
142 * TSC2046 operates at a max freqency of 2MHz, so
143 * operate slightly below at 1.5MHz
144 */
145 .modalias = "ads7846",
146 .bus_num = 1,
147 .chip_select = 0,
148 .max_speed_hz = 1500000,
149 .controller_data = &tsc2046_mcspi_config,
150 .irq = 0,
151 .platform_data = &tsc2046_config,
152 },
153 };
154
155 static struct platform_device sdp3430_lcd_device = {
156 .name = "sdp2430_lcd",
157 .id = -1,
158 };
159
160 static struct regulator_consumer_supply sdp3430_vdac_supply = {
161 .supply = "vdac",
162 .dev = &sdp3430_lcd_device.dev,
163 };
164
165 static struct regulator_consumer_supply sdp3430_vdvi_supply = {
166 .supply = "vdvi",
167 .dev = &sdp3430_lcd_device.dev,
168 };
169
170 static struct platform_device *sdp3430_devices[] __initdata = {
171 &sdp3430_lcd_device,
172 };
173
174 static struct omap_lcd_config sdp3430_lcd_config __initdata = {
175 .ctrl_name = "internal",
176 };
177
178 static struct omap_board_config_kernel sdp3430_config[] __initdata = {
179 { OMAP_TAG_LCD, &sdp3430_lcd_config },
180 };
181
182 static void __init omap_3430sdp_init_irq(void)
183 {
184 omap_board_config = sdp3430_config;
185 omap_board_config_size = ARRAY_SIZE(sdp3430_config);
186 omap2_init_common_hw(hyb18m512160af6_sdrc_params, NULL);
187 omap_init_irq();
188 omap_gpio_init();
189 }
190
191 static int sdp3430_batt_table[] = {
192 /* 0 C*/
193 30800, 29500, 28300, 27100,
194 26000, 24900, 23900, 22900, 22000, 21100, 20300, 19400, 18700, 17900,
195 17200, 16500, 15900, 15300, 14700, 14100, 13600, 13100, 12600, 12100,
196 11600, 11200, 10800, 10400, 10000, 9630, 9280, 8950, 8620, 8310,
197 8020, 7730, 7460, 7200, 6950, 6710, 6470, 6250, 6040, 5830,
198 5640, 5450, 5260, 5090, 4920, 4760, 4600, 4450, 4310, 4170,
199 4040, 3910, 3790, 3670, 3550
200 };
201
202 static struct twl4030_bci_platform_data sdp3430_bci_data = {
203 .battery_tmp_tbl = sdp3430_batt_table,
204 .tblsize = ARRAY_SIZE(sdp3430_batt_table),
205 };
206
207 static struct twl4030_hsmmc_info mmc[] = {
208 {
209 .mmc = 1,
210 /* 8 bits (default) requires S6.3 == ON,
211 * so the SIM card isn't used; else 4 bits.
212 */
213 .wires = 8,
214 .gpio_wp = 4,
215 },
216 {
217 .mmc = 2,
218 .wires = 8,
219 .gpio_wp = 7,
220 },
221 {} /* Terminator */
222 };
223
224 static struct regulator_consumer_supply sdp3430_vmmc1_supply = {
225 .supply = "vmmc",
226 };
227
228 static struct regulator_consumer_supply sdp3430_vsim_supply = {
229 .supply = "vmmc_aux",
230 };
231
232 static struct regulator_consumer_supply sdp3430_vmmc2_supply = {
233 .supply = "vmmc",
234 };
235
236 static int sdp3430_twl_gpio_setup(struct device *dev,
237 unsigned gpio, unsigned ngpio)
238 {
239 /* gpio + 0 is "mmc0_cd" (input/IRQ),
240 * gpio + 1 is "mmc1_cd" (input/IRQ)
241 */
242 mmc[0].gpio_cd = gpio + 0;
243 mmc[1].gpio_cd = gpio + 1;
244 twl4030_mmc_init(mmc);
245
246 /* link regulators to MMC adapters ... we "know" the
247 * regulators will be set up only *after* we return.
248 */
249 sdp3430_vmmc1_supply.dev = mmc[0].dev;
250 sdp3430_vsim_supply.dev = mmc[0].dev;
251 sdp3430_vmmc2_supply.dev = mmc[1].dev;
252
253 /* gpio + 7 is "sub_lcd_en_bkl" (output/PWM1) */
254 gpio_request(gpio + 7, "sub_lcd_en_bkl");
255 gpio_direction_output(gpio + 7, 0);
256
257 /* gpio + 15 is "sub_lcd_nRST" (output) */
258 gpio_request(gpio + 15, "sub_lcd_nRST");
259 gpio_direction_output(gpio + 15, 0);
260
261 return 0;
262 }
263
264 static struct twl4030_gpio_platform_data sdp3430_gpio_data = {
265 .gpio_base = OMAP_MAX_GPIO_LINES,
266 .irq_base = TWL4030_GPIO_IRQ_BASE,
267 .irq_end = TWL4030_GPIO_IRQ_END,
268 .pulldowns = BIT(2) | BIT(6) | BIT(8) | BIT(13)
269 | BIT(16) | BIT(17),
270 .setup = sdp3430_twl_gpio_setup,
271 };
272
273 static struct twl4030_usb_data sdp3430_usb_data = {
274 .usb_mode = T2_USB_MODE_ULPI,
275 };
276
277 static struct twl4030_madc_platform_data sdp3430_madc_data = {
278 .irq_line = 1,
279 };
280
281 /*
282 * Apply all the fixed voltages since most versions of U-Boot
283 * don't bother with that initialization.
284 */
285
286 /* VAUX1 for mainboard (irda and sub-lcd) */
287 static struct regulator_init_data sdp3430_vaux1 = {
288 .constraints = {
289 .min_uV = 2800000,
290 .max_uV = 2800000,
291 .apply_uV = true,
292 .valid_modes_mask = REGULATOR_MODE_NORMAL
293 | REGULATOR_MODE_STANDBY,
294 .valid_ops_mask = REGULATOR_CHANGE_MODE
295 | REGULATOR_CHANGE_STATUS,
296 },
297 };
298
299 /* VAUX2 for camera module */
300 static struct regulator_init_data sdp3430_vaux2 = {
301 .constraints = {
302 .min_uV = 2800000,
303 .max_uV = 2800000,
304 .apply_uV = true,
305 .valid_modes_mask = REGULATOR_MODE_NORMAL
306 | REGULATOR_MODE_STANDBY,
307 .valid_ops_mask = REGULATOR_CHANGE_MODE
308 | REGULATOR_CHANGE_STATUS,
309 },
310 };
311
312 /* VAUX3 for LCD board */
313 static struct regulator_init_data sdp3430_vaux3 = {
314 .constraints = {
315 .min_uV = 2800000,
316 .max_uV = 2800000,
317 .apply_uV = true,
318 .valid_modes_mask = REGULATOR_MODE_NORMAL
319 | REGULATOR_MODE_STANDBY,
320 .valid_ops_mask = REGULATOR_CHANGE_MODE
321 | REGULATOR_CHANGE_STATUS,
322 },
323 };
324
325 /* VAUX4 for OMAP VDD_CSI2 (camera) */
326 static struct regulator_init_data sdp3430_vaux4 = {
327 .constraints = {
328 .min_uV = 1800000,
329 .max_uV = 1800000,
330 .apply_uV = true,
331 .valid_modes_mask = REGULATOR_MODE_NORMAL
332 | REGULATOR_MODE_STANDBY,
333 .valid_ops_mask = REGULATOR_CHANGE_MODE
334 | REGULATOR_CHANGE_STATUS,
335 },
336 };
337
338 /* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */
339 static struct regulator_init_data sdp3430_vmmc1 = {
340 .constraints = {
341 .min_uV = 1850000,
342 .max_uV = 3150000,
343 .valid_modes_mask = REGULATOR_MODE_NORMAL
344 | REGULATOR_MODE_STANDBY,
345 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
346 | REGULATOR_CHANGE_MODE
347 | REGULATOR_CHANGE_STATUS,
348 },
349 .num_consumer_supplies = 1,
350 .consumer_supplies = &sdp3430_vmmc1_supply,
351 };
352
353 /* VMMC2 for MMC2 card */
354 static struct regulator_init_data sdp3430_vmmc2 = {
355 .constraints = {
356 .min_uV = 1850000,
357 .max_uV = 1850000,
358 .apply_uV = true,
359 .valid_modes_mask = REGULATOR_MODE_NORMAL
360 | REGULATOR_MODE_STANDBY,
361 .valid_ops_mask = REGULATOR_CHANGE_MODE
362 | REGULATOR_CHANGE_STATUS,
363 },
364 .num_consumer_supplies = 1,
365 .consumer_supplies = &sdp3430_vmmc2_supply,
366 };
367
368 /* VSIM for OMAP VDD_MMC1A (i/o for DAT4..DAT7) */
369 static struct regulator_init_data sdp3430_vsim = {
370 .constraints = {
371 .min_uV = 1800000,
372 .max_uV = 3000000,
373 .valid_modes_mask = REGULATOR_MODE_NORMAL
374 | REGULATOR_MODE_STANDBY,
375 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
376 | REGULATOR_CHANGE_MODE
377 | REGULATOR_CHANGE_STATUS,
378 },
379 .num_consumer_supplies = 1,
380 .consumer_supplies = &sdp3430_vsim_supply,
381 };
382
383 /* VDAC for DSS driving S-Video */
384 static struct regulator_init_data sdp3430_vdac = {
385 .constraints = {
386 .min_uV = 1800000,
387 .max_uV = 1800000,
388 .apply_uV = true,
389 .valid_modes_mask = REGULATOR_MODE_NORMAL
390 | REGULATOR_MODE_STANDBY,
391 .valid_ops_mask = REGULATOR_CHANGE_MODE
392 | REGULATOR_CHANGE_STATUS,
393 },
394 .num_consumer_supplies = 1,
395 .consumer_supplies = &sdp3430_vdac_supply,
396 };
397
398 /* VPLL2 for digital video outputs */
399 static struct regulator_init_data sdp3430_vpll2 = {
400 .constraints = {
401 .name = "VDVI",
402 .min_uV = 1800000,
403 .max_uV = 1800000,
404 .valid_modes_mask = REGULATOR_MODE_NORMAL
405 | REGULATOR_MODE_STANDBY,
406 .valid_ops_mask = REGULATOR_CHANGE_MODE
407 | REGULATOR_CHANGE_STATUS,
408 },
409 .num_consumer_supplies = 1,
410 .consumer_supplies = &sdp3430_vdvi_supply,
411 };
412
413 static struct twl4030_platform_data sdp3430_twldata = {
414 .irq_base = TWL4030_IRQ_BASE,
415 .irq_end = TWL4030_IRQ_END,
416
417 /* platform_data for children goes here */
418 .bci = &sdp3430_bci_data,
419 .gpio = &sdp3430_gpio_data,
420 .madc = &sdp3430_madc_data,
421 .keypad = &sdp3430_kp_data,
422 .usb = &sdp3430_usb_data,
423
424 .vaux1 = &sdp3430_vaux1,
425 .vaux2 = &sdp3430_vaux2,
426 .vaux3 = &sdp3430_vaux3,
427 .vaux4 = &sdp3430_vaux4,
428 .vmmc1 = &sdp3430_vmmc1,
429 .vmmc2 = &sdp3430_vmmc2,
430 .vsim = &sdp3430_vsim,
431 .vdac = &sdp3430_vdac,
432 .vpll2 = &sdp3430_vpll2,
433 };
434
435 static struct i2c_board_info __initdata sdp3430_i2c_boardinfo[] = {
436 {
437 I2C_BOARD_INFO("twl4030", 0x48),
438 .flags = I2C_CLIENT_WAKE,
439 .irq = INT_34XX_SYS_NIRQ,
440 .platform_data = &sdp3430_twldata,
441 },
442 };
443
444 static int __init omap3430_i2c_init(void)
445 {
446 /* i2c1 for PMIC only */
447 omap_register_i2c_bus(1, 2600, sdp3430_i2c_boardinfo,
448 ARRAY_SIZE(sdp3430_i2c_boardinfo));
449 /* i2c2 on camera connector (for sensor control) and optional isp1301 */
450 omap_register_i2c_bus(2, 400, NULL, 0);
451 /* i2c3 on display connector (for DVI, tfp410) */
452 omap_register_i2c_bus(3, 400, NULL, 0);
453 return 0;
454 }
455
456 #if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
457
458 static struct omap_smc91x_platform_data board_smc91x_data = {
459 .cs = 3,
460 .flags = GPMC_MUX_ADD_DATA | GPMC_TIMINGS_SMC91C96 |
461 IORESOURCE_IRQ_LOWLEVEL,
462 };
463
464 static void __init board_smc91x_init(void)
465 {
466 if (omap_rev() > OMAP3430_REV_ES1_0)
467 board_smc91x_data.gpio_irq = 6;
468 else
469 board_smc91x_data.gpio_irq = 29;
470
471 gpmc_smc91x_init(&board_smc91x_data);
472 }
473
474 #else
475
476 static inline void board_smc91x_init(void)
477 {
478 }
479
480 #endif
481
482 static void enable_board_wakeup_source(void)
483 {
484 omap_cfg_reg(AF26_34XX_SYS_NIRQ); /* T2 interrupt line (keypad) */
485 }
486
487 static void __init omap_3430sdp_init(void)
488 {
489 omap3430_i2c_init();
490 platform_add_devices(sdp3430_devices, ARRAY_SIZE(sdp3430_devices));
491 if (omap_rev() > OMAP3430_REV_ES1_0)
492 ts_gpio = SDP3430_TS_GPIO_IRQ_SDPV2;
493 else
494 ts_gpio = SDP3430_TS_GPIO_IRQ_SDPV1;
495 sdp3430_spi_board_info[0].irq = gpio_to_irq(ts_gpio);
496 spi_register_board_info(sdp3430_spi_board_info,
497 ARRAY_SIZE(sdp3430_spi_board_info));
498 ads7846_dev_init();
499 omap_serial_init();
500 usb_musb_init();
501 board_smc91x_init();
502 enable_board_wakeup_source();
503 }
504
505 static void __init omap_3430sdp_map_io(void)
506 {
507 omap2_set_globals_343x();
508 omap2_map_common_io();
509 }
510
511 MACHINE_START(OMAP_3430SDP, "OMAP3430 3430SDP board")
512 /* Maintainer: Syed Khasim - Texas Instruments Inc */
513 .phys_io = 0x48000000,
514 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
515 .boot_params = 0x80000100,
516 .map_io = omap_3430sdp_map_io,
517 .init_irq = omap_3430sdp_init_irq,
518 .init_machine = omap_3430sdp_init,
519 .timer = &omap_timer,
520 MACHINE_END