2 * linux/arch/arm/mach-omap2/board-ldp.c
4 * Copyright (C) 2008 Texas Instruments Inc.
5 * Nishant Kamat <nskamat@ti.com>
7 * Modified from mach-omap2/board-3430sdp.c
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
14 #include <linux/kernel.h>
15 #include <linux/init.h>
16 #include <linux/platform_device.h>
17 #include <linux/delay.h>
18 #include <linux/input.h>
19 #include <linux/gpio_keys.h>
20 #include <linux/workqueue.h>
21 #include <linux/err.h>
22 #include <linux/clk.h>
23 #include <linux/spi/spi.h>
24 #include <linux/spi/ads7846.h>
25 #include <linux/i2c/twl4030.h>
27 #include <mach/hardware.h>
28 #include <asm/mach-types.h>
29 #include <asm/mach/arch.h>
30 #include <asm/mach/map.h>
32 #include <mach/board-ldp.h>
33 #include <mach/mcspi.h>
34 #include <mach/gpio.h>
35 #include <mach/board.h>
36 #include <mach/common.h>
37 #include <mach/keypad.h>
38 #include <mach/gpmc.h>
39 #include <mach/usb-musb.h>
42 #include <asm/delay.h>
43 #include <mach/control.h>
45 #include "mmc-twl4030.h"
48 #define SDP3430_SMC91X_CS 3
49 #define CONFIG_DISABLE_HFCLK 1
51 #define ENABLE_VAUX1_DEDICATED 0x03
52 #define ENABLE_VAUX1_DEV_GRP 0x20
54 #define TWL4030_MSECURE_GPIO 22
56 static struct resource ldp_smc911x_resources[] = {
58 .start = OMAP34XX_ETHR_START,
59 .end = OMAP34XX_ETHR_START + SZ_4K,
60 .flags = IORESOURCE_MEM,
65 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
69 static struct platform_device ldp_smc911x_device = {
72 .num_resources = ARRAY_SIZE(ldp_smc911x_resources),
73 .resource = ldp_smc911x_resources,
76 static int ldp_twl4030_keymap[] = {
92 KEY(4, 4, KEY_VOLUMEUP),
93 KEY(5, 5, KEY_VOLUMEDOWN),
97 static struct twl4030_keypad_data ldp_kp_twl4030_data = {
100 .keymap = ldp_twl4030_keymap,
101 .keymapsize = ARRAY_SIZE(ldp_twl4030_keymap),
105 static struct gpio_keys_button ldp_gpio_keys_buttons[] = {
111 .debounce_interval = 30,
118 .debounce_interval = 30,
125 .debounce_interval = 30,
132 .debounce_interval = 30,
139 .debounce_interval = 30,
146 .debounce_interval = 30,
153 .debounce_interval = 30,
160 .debounce_interval = 30,
167 .debounce_interval = 30,
171 static struct gpio_keys_platform_data ldp_gpio_keys = {
172 .buttons = ldp_gpio_keys_buttons,
173 .nbuttons = ARRAY_SIZE(ldp_gpio_keys_buttons),
177 static struct platform_device ldp_gpio_keys_device = {
181 .platform_data = &ldp_gpio_keys,
187 static int __init msecure_init(void)
191 #ifdef CONFIG_RTC_DRV_TWL4030
192 /* 3430ES2.0 doesn't have msecure/gpio-22 line connected to T2 */
193 if (omap_type() == OMAP2_DEVICE_TYPE_GP &&
194 omap_rev() < OMAP3430_REV_ES2_0) {
195 void __iomem *msecure_pad_config_reg =
196 omap_ctrl_base_get() + 0xA3C;
200 ret = gpio_request(TWL4030_MSECURE_GPIO, "msecure");
202 printk(KERN_ERR "msecure_init: can't"
203 "reserve GPIO:%d !\n", TWL4030_MSECURE_GPIO);
207 * TWL4030 will be in secure mode if msecure line from OMAP
208 * is low. Make msecure line high in order to change the
209 * TWL4030 RTC time and calender registers.
212 tmp = __raw_readw(msecure_pad_config_reg);
213 tmp &= 0xF8; /* To enable mux mode 03/04 = GPIO_RTC */
214 tmp |= mux_mask;/* To enable mux mode 03/04 = GPIO_RTC */
215 __raw_writew(tmp, msecure_pad_config_reg);
217 gpio_direction_output(TWL4030_MSECURE_GPIO, 1);
225 * @brief ads7846_dev_init : Requests & sets GPIO line for pen-irq
227 * @return - void. If request gpio fails then Flag KERN_ERR.
229 static void ads7846_dev_init(void)
231 if (gpio_request(ts_gpio, "ads7846 irq") < 0) {
232 printk(KERN_ERR "can't get ads746 pen down GPIO\n");
236 gpio_direction_input(ts_gpio);
238 omap_set_gpio_debounce(ts_gpio, 1);
239 omap_set_gpio_debounce_time(ts_gpio, 0xa);
242 static int ads7846_get_pendown_state(void)
244 return !gpio_get_value(ts_gpio);
248 * This enable(1)/disable(0) the voltage for TS: uses twl4030 calls
250 static int ads7846_vaux_control(int vaux_cntrl)
254 #ifdef CONFIG_TWL4030_CORE
255 /* check for return value of ldo_use: if success it returns 0 */
256 if (vaux_cntrl == VAUX_ENABLE) {
257 if (ret != twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
258 ENABLE_VAUX1_DEDICATED, TWL4030_VAUX1_DEDICATED))
260 if (ret != twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
261 ENABLE_VAUX1_DEV_GRP, TWL4030_VAUX1_DEV_GRP))
263 } else if (vaux_cntrl == VAUX_DISABLE) {
264 if (ret != twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
265 0x00, TWL4030_VAUX1_DEDICATED))
267 if (ret != twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
268 0x00, TWL4030_VAUX1_DEV_GRP))
277 static struct ads7846_platform_data tsc2046_config __initdata = {
278 .get_pendown_state = ads7846_get_pendown_state,
280 .vaux_control = ads7846_vaux_control,
284 static struct omap2_mcspi_device_config tsc2046_mcspi_config = {
286 .single_channel = 1, /* 0: slave, 1: master */
289 static struct spi_board_info ldp_spi_board_info[] __initdata = {
292 * TSC2046 operates at a max freqency of 2MHz, so
293 * operate slightly below at 1.5MHz
295 .modalias = "ads7846",
298 .max_speed_hz = 1500000,
299 .controller_data = &tsc2046_mcspi_config,
301 .platform_data = &tsc2046_config,
305 static struct platform_device ldp_lcd_device = {
310 static struct platform_device *ldp_devices[] __initdata = {
313 &ldp_gpio_keys_device,
316 static inline void __init ldp_init_smc911x(void)
319 unsigned long cs_mem_base;
322 eth_cs = LDP_SMC911X_CS;
324 if (gpmc_cs_request(eth_cs, SZ_16M, &cs_mem_base) < 0) {
325 printk(KERN_ERR "Failed to request GPMC mem for smc911x\n");
329 ldp_smc911x_resources[0].start = cs_mem_base + 0x0;
330 ldp_smc911x_resources[0].end = cs_mem_base + 0xf;
333 eth_gpio = LDP_SMC911X_GPIO;
335 ldp_smc911x_resources[1].start = OMAP_GPIO_IRQ(eth_gpio);
337 if (gpio_request(eth_gpio, "smc911x irq") < 0) {
338 printk(KERN_ERR "Failed to request GPIO%d for smc911x IRQ\n",
342 gpio_direction_input(eth_gpio);
346 static void __init omap_ldp_init_irq(void)
348 omap2_init_common_hw(NULL);
354 static struct omap_uart_config ldp_uart_config __initdata = {
355 .enabled_uarts = ((1 << 0) | (1 << 1) | (1 << 2)),
358 static struct omap_lcd_config ldp_lcd_config __initdata = {
359 .ctrl_name = "internal",
362 static struct omap_board_config_kernel ldp_config[] __initdata = {
363 { OMAP_TAG_UART, &ldp_uart_config },
364 { OMAP_TAG_LCD, &ldp_lcd_config },
367 static int ldp_batt_table[] = {
369 30800, 29500, 28300, 27100,
370 26000, 24900, 23900, 22900, 22000, 21100, 20300, 19400, 18700, 17900,
371 17200, 16500, 15900, 15300, 14700, 14100, 13600, 13100, 12600, 12100,
372 11600, 11200, 10800, 10400, 10000, 9630, 9280, 8950, 8620, 8310,
373 8020, 7730, 7460, 7200, 6950, 6710, 6470, 6250, 6040, 5830,
374 5640, 5450, 5260, 5090, 4920, 4760, 4600, 4450, 4310, 4170,
375 4040, 3910, 3790, 3670, 3550
378 static struct twl4030_ins __initdata sleep_on_seq[] = {
380 * Turn off VDD1 and VDD2.
382 {MSG_SINGULAR(DEV_GRP_P1, 0xf, RES_STATE_OFF), 4},
383 {MSG_SINGULAR(DEV_GRP_P1, 0x10, RES_STATE_OFF), 2},
384 #ifdef CONFIG_DISABLE_HFCLK
386 * And also turn off the OMAP3 PLLs and the sysclk output.
388 {MSG_SINGULAR(DEV_GRP_P1, 0x7, RES_STATE_OFF), 3},
389 {MSG_SINGULAR(DEV_GRP_P1, 0x19, RES_STATE_OFF), 3},
393 static struct twl4030_script sleep_on_script __initdata = {
394 .script = sleep_on_seq,
395 .size = ARRAY_SIZE(sleep_on_seq),
396 .flags = TRITON_SLEEP_SCRIPT,
399 static struct twl4030_ins wakeup_seq[] __initdata = {
400 #ifndef CONFIG_DISABLE_HFCLK
402 * Wakeup VDD1 and VDD2.
404 {MSG_SINGULAR(DEV_GRP_P1, 0xf, RES_STATE_ACTIVE), 4},
405 {MSG_SINGULAR(DEV_GRP_P1, 0x10, RES_STATE_ACTIVE), 2},
408 * Reenable the OMAP3 PLLs.
409 * Wakeup VDD1 and VDD2.
410 * Reenable sysclk output.
412 {MSG_SINGULAR(DEV_GRP_P1, 0x7, RES_STATE_ACTIVE), 0x30},
413 {MSG_SINGULAR(DEV_GRP_P1, 0xf, RES_STATE_ACTIVE), 0x30},
414 {MSG_SINGULAR(DEV_GRP_P1, 0x10, RES_STATE_ACTIVE), 0x37},
415 {MSG_SINGULAR(DEV_GRP_P1, 0x19, RES_STATE_ACTIVE), 3},
416 #endif /* #ifndef CONFIG_DISABLE_HFCLK */
419 static struct twl4030_script wakeup_script __initdata = {
420 .script = wakeup_seq,
421 .size = ARRAY_SIZE(wakeup_seq),
422 .flags = TRITON_WAKEUP12_SCRIPT | TRITON_WAKEUP3_SCRIPT,
425 static struct twl4030_ins wrst_seq[] __initdata = {
428 * Reset VDD1 regulator.
429 * Reset VDD2 regulator.
430 * Reset VPLL1 regulator.
431 * Enable sysclk output.
434 {MSG_SINGULAR(DEV_GRP_NULL, 0x1b, RES_STATE_OFF), 2},
435 {MSG_SINGULAR(DEV_GRP_P1, 0xf, RES_STATE_WRST), 15},
436 {MSG_SINGULAR(DEV_GRP_P1, 0x10, RES_STATE_WRST), 15},
437 {MSG_SINGULAR(DEV_GRP_P1, 0x7, RES_STATE_WRST), 0x60},
438 {MSG_SINGULAR(DEV_GRP_P1, 0x19, RES_STATE_ACTIVE), 2},
439 {MSG_SINGULAR(DEV_GRP_NULL, 0x1b, RES_STATE_ACTIVE), 2},
442 static struct twl4030_script wrst_script __initdata = {
444 .size = ARRAY_SIZE(wakeup_seq),
445 .flags = TRITON_WRST_SCRIPT,
448 static struct twl4030_script *twl4030_scripts[] __initdata = {
454 static struct twl4030_power_data sdp3430_t2scripts_data __initdata = {
455 .scripts = twl4030_scripts,
456 .size = ARRAY_SIZE(twl4030_scripts),
459 static struct twl4030_bci_platform_data ldp_bci_data = {
460 .battery_tmp_tbl = ldp_batt_table,
461 .tblsize = ARRAY_SIZE(ldp_batt_table),
464 static struct twl4030_usb_data ldp_usb_data = {
465 .usb_mode = T2_USB_MODE_ULPI,
468 static struct twl4030_gpio_platform_data ldp_gpio_data = {
469 .gpio_base = OMAP_MAX_GPIO_LINES,
470 .irq_base = TWL4030_GPIO_IRQ_BASE,
471 .irq_end = TWL4030_GPIO_IRQ_END,
474 static struct twl4030_madc_platform_data ldp_madc_data = {
478 static struct twl4030_platform_data ldp_twldata = {
479 .irq_base = TWL4030_IRQ_BASE,
480 .irq_end = TWL4030_IRQ_END,
482 /* platform_data for children goes here */
483 .bci = &ldp_bci_data,
484 .madc = &ldp_madc_data,
485 .usb = &ldp_usb_data,
486 .power = &sdp3430_t2scripts_data,
487 .gpio = &ldp_gpio_data,
488 .keypad = &ldp_kp_twl4030_data,
491 static struct i2c_board_info __initdata ldp_i2c_boardinfo[] = {
493 I2C_BOARD_INFO("twl4030", 0x48),
494 .flags = I2C_CLIENT_WAKE,
495 .irq = INT_34XX_SYS_NIRQ,
496 .platform_data = &ldp_twldata,
500 static int __init omap_i2c_init(void)
502 omap_register_i2c_bus(1, 2600, ldp_i2c_boardinfo,
503 ARRAY_SIZE(ldp_i2c_boardinfo));
504 omap_register_i2c_bus(2, 400, NULL, 0);
505 omap_register_i2c_bus(3, 400, NULL, 0);
509 static struct twl4030_hsmmc_info mmc[] __initdata = {
519 static void __init omap_ldp_init(void)
522 platform_add_devices(ldp_devices, ARRAY_SIZE(ldp_devices));
523 omap_board_config = ldp_config;
524 omap_board_config_size = ARRAY_SIZE(ldp_config);
526 ldp_spi_board_info[0].irq = gpio_to_irq(ts_gpio);
527 spi_register_board_info(ldp_spi_board_info,
528 ARRAY_SIZE(ldp_spi_board_info));
533 twl4030_mmc_init(mmc);
536 static void __init omap_ldp_map_io(void)
538 omap2_set_globals_343x();
539 omap2_map_common_io();
542 MACHINE_START(OMAP_LDP, "OMAP LDP board")
543 .phys_io = 0x48000000,
544 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
545 .boot_params = 0x80000100,
546 .map_io = omap_ldp_map_io,
547 .init_irq = omap_ldp_init_irq,
548 .init_machine = omap_ldp_init,
549 .timer = &omap_timer,