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>
40 #include <mach/usb-musb.h>
43 #include <asm/delay.h>
44 #include <mach/control.h>
46 #include "mmc-twl4030.h"
49 #define SDP3430_SMC91X_CS 3
50 #define CONFIG_DISABLE_HFCLK 1
52 #define ENABLE_VAUX1_DEDICATED 0x03
53 #define ENABLE_VAUX1_DEV_GRP 0x20
55 #define TWL4030_MSECURE_GPIO 22
57 static struct resource ldp_smc911x_resources[] = {
59 .start = OMAP34XX_ETHR_START,
60 .end = OMAP34XX_ETHR_START + SZ_4K,
61 .flags = IORESOURCE_MEM,
66 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
70 static struct platform_device ldp_smc911x_device = {
73 .num_resources = ARRAY_SIZE(ldp_smc911x_resources),
74 .resource = ldp_smc911x_resources,
77 static int ldp_twl4030_keymap[] = {
93 KEY(4, 4, KEY_VOLUMEUP),
94 KEY(5, 5, KEY_VOLUMEDOWN),
98 static struct twl4030_keypad_data ldp_kp_twl4030_data = {
101 .keymap = ldp_twl4030_keymap,
102 .keymapsize = ARRAY_SIZE(ldp_twl4030_keymap),
104 .irq = TWL4030_MODIRQ_KEYPAD,
107 static struct gpio_keys_button ldp_gpio_keys_buttons[] = {
113 .debounce_interval = 30,
120 .debounce_interval = 30,
127 .debounce_interval = 30,
134 .debounce_interval = 30,
141 .debounce_interval = 30,
148 .debounce_interval = 30,
155 .debounce_interval = 30,
162 .debounce_interval = 30,
169 .debounce_interval = 30,
173 static struct gpio_keys_platform_data ldp_gpio_keys = {
174 .buttons = ldp_gpio_keys_buttons,
175 .nbuttons = ARRAY_SIZE(ldp_gpio_keys_buttons),
179 static struct platform_device ldp_gpio_keys_device = {
183 .platform_data = &ldp_gpio_keys,
189 static int __init msecure_init(void)
193 #ifdef CONFIG_RTC_DRV_TWL4030
194 /* 3430ES2.0 doesn't have msecure/gpio-22 line connected to T2 */
195 if (omap_type() == OMAP2_DEVICE_TYPE_GP &&
196 omap_rev() < OMAP3430_REV_ES2_0) {
197 void __iomem *msecure_pad_config_reg =
198 omap_ctrl_base_get() + 0xA3C;
202 ret = gpio_request(TWL4030_MSECURE_GPIO, "msecure");
204 printk(KERN_ERR "msecure_init: can't"
205 "reserve GPIO:%d !\n", TWL4030_MSECURE_GPIO);
209 * TWL4030 will be in secure mode if msecure line from OMAP
210 * is low. Make msecure line high in order to change the
211 * TWL4030 RTC time and calender registers.
214 tmp = __raw_readw(msecure_pad_config_reg);
215 tmp &= 0xF8; /* To enable mux mode 03/04 = GPIO_RTC */
216 tmp |= mux_mask;/* To enable mux mode 03/04 = GPIO_RTC */
217 __raw_writew(tmp, msecure_pad_config_reg);
219 gpio_direction_output(TWL4030_MSECURE_GPIO, 1);
227 * @brief ads7846_dev_init : Requests & sets GPIO line for pen-irq
229 * @return - void. If request gpio fails then Flag KERN_ERR.
231 static void ads7846_dev_init(void)
233 if (omap_request_gpio(ts_gpio) < 0) {
234 printk(KERN_ERR "can't get ads746 pen down GPIO\n");
238 gpio_direction_input(ts_gpio);
240 omap_set_gpio_debounce(ts_gpio, 1);
241 omap_set_gpio_debounce_time(ts_gpio, 0xa);
244 static int ads7846_get_pendown_state(void)
246 return !gpio_get_value(ts_gpio);
250 * This enable(1)/disable(0) the voltage for TS: uses twl4030 calls
252 static int ads7846_vaux_control(int vaux_cntrl)
256 #ifdef CONFIG_TWL4030_CORE
257 /* check for return value of ldo_use: if success it returns 0 */
258 if (vaux_cntrl == VAUX_ENABLE) {
259 if (ret != twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
260 ENABLE_VAUX1_DEDICATED, TWL4030_VAUX1_DEDICATED))
262 if (ret != twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
263 ENABLE_VAUX1_DEV_GRP, TWL4030_VAUX1_DEV_GRP))
265 } else if (vaux_cntrl == VAUX_DISABLE) {
266 if (ret != twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
267 0x00, TWL4030_VAUX1_DEDICATED))
269 if (ret != twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
270 0x00, TWL4030_VAUX1_DEV_GRP))
279 static struct ads7846_platform_data tsc2046_config __initdata = {
280 .get_pendown_state = ads7846_get_pendown_state,
282 .vaux_control = ads7846_vaux_control,
286 static struct omap2_mcspi_device_config tsc2046_mcspi_config = {
288 .single_channel = 1, /* 0: slave, 1: master */
291 static struct spi_board_info ldp_spi_board_info[] __initdata = {
294 * TSC2046 operates at a max freqency of 2MHz, so
295 * operate slightly below at 1.5MHz
297 .modalias = "ads7846",
300 .max_speed_hz = 1500000,
301 .controller_data = &tsc2046_mcspi_config,
303 .platform_data = &tsc2046_config,
307 static struct platform_device ldp_lcd_device = {
312 static struct platform_device *ldp_devices[] __initdata = {
315 &ldp_gpio_keys_device,
318 static inline void __init ldp_init_smc911x(void)
321 unsigned long cs_mem_base;
324 eth_cs = LDP_SMC911X_CS;
326 if (gpmc_cs_request(eth_cs, SZ_16M, &cs_mem_base) < 0) {
327 printk(KERN_ERR "Failed to request GPMC mem for smc911x\n");
331 ldp_smc911x_resources[0].start = cs_mem_base + 0x0;
332 ldp_smc911x_resources[0].end = cs_mem_base + 0xf;
335 eth_gpio = LDP_SMC911X_GPIO;
337 ldp_smc911x_resources[1].start = OMAP_GPIO_IRQ(eth_gpio);
339 if (omap_request_gpio(eth_gpio) < 0) {
340 printk(KERN_ERR "Failed to request GPIO%d for smc911x IRQ\n",
344 omap_set_gpio_direction(eth_gpio, 1);
348 static void __init omap_ldp_init_irq(void)
350 omap2_init_common_hw(NULL);
356 static struct omap_uart_config ldp_uart_config __initdata = {
357 .enabled_uarts = ((1 << 0) | (1 << 1) | (1 << 2)),
360 static struct omap_lcd_config ldp_lcd_config __initdata = {
361 .ctrl_name = "internal",
364 static struct omap_board_config_kernel ldp_config[] __initdata = {
365 { OMAP_TAG_UART, &ldp_uart_config },
366 { OMAP_TAG_LCD, &ldp_lcd_config },
369 static int ldp_batt_table[] = {
371 30800, 29500, 28300, 27100,
372 26000, 24900, 23900, 22900, 22000, 21100, 20300, 19400, 18700, 17900,
373 17200, 16500, 15900, 15300, 14700, 14100, 13600, 13100, 12600, 12100,
374 11600, 11200, 10800, 10400, 10000, 9630, 9280, 8950, 8620, 8310,
375 8020, 7730, 7460, 7200, 6950, 6710, 6470, 6250, 6040, 5830,
376 5640, 5450, 5260, 5090, 4920, 4760, 4600, 4450, 4310, 4170,
377 4040, 3910, 3790, 3670, 3550
380 static struct twl4030_ins __initdata sleep_on_seq[] = {
382 * Turn off VDD1 and VDD2.
384 {MSG_SINGULAR(DEV_GRP_P1, 0xf, RES_STATE_OFF), 4},
385 {MSG_SINGULAR(DEV_GRP_P1, 0x10, RES_STATE_OFF), 2},
386 #ifdef CONFIG_DISABLE_HFCLK
388 * And also turn off the OMAP3 PLLs and the sysclk output.
390 {MSG_SINGULAR(DEV_GRP_P1, 0x7, RES_STATE_OFF), 3},
391 {MSG_SINGULAR(DEV_GRP_P1, 0x19, RES_STATE_OFF), 3},
395 static struct twl4030_script sleep_on_script __initdata = {
396 .script = sleep_on_seq,
397 .size = ARRAY_SIZE(sleep_on_seq),
398 .flags = TRITON_SLEEP_SCRIPT,
401 static struct twl4030_ins wakeup_seq[] __initdata = {
402 #ifndef CONFIG_DISABLE_HFCLK
404 * Wakeup VDD1 and VDD2.
406 {MSG_SINGULAR(DEV_GRP_P1, 0xf, RES_STATE_ACTIVE), 4},
407 {MSG_SINGULAR(DEV_GRP_P1, 0x10, RES_STATE_ACTIVE), 2},
410 * Reenable the OMAP3 PLLs.
411 * Wakeup VDD1 and VDD2.
412 * Reenable sysclk output.
414 {MSG_SINGULAR(DEV_GRP_P1, 0x7, RES_STATE_ACTIVE), 0x30},
415 {MSG_SINGULAR(DEV_GRP_P1, 0xf, RES_STATE_ACTIVE), 0x30},
416 {MSG_SINGULAR(DEV_GRP_P1, 0x10, RES_STATE_ACTIVE), 0x37},
417 {MSG_SINGULAR(DEV_GRP_P1, 0x19, RES_STATE_ACTIVE), 3},
418 #endif /* #ifndef CONFIG_DISABLE_HFCLK */
421 static struct twl4030_script wakeup_script __initdata = {
422 .script = wakeup_seq,
423 .size = ARRAY_SIZE(wakeup_seq),
424 .flags = TRITON_WAKEUP12_SCRIPT | TRITON_WAKEUP3_SCRIPT,
427 static struct twl4030_ins wrst_seq[] __initdata = {
430 * Reset VDD1 regulator.
431 * Reset VDD2 regulator.
432 * Reset VPLL1 regulator.
433 * Enable sysclk output.
436 {MSG_SINGULAR(DEV_GRP_NULL, 0x1b, RES_STATE_OFF), 2},
437 {MSG_SINGULAR(DEV_GRP_P1, 0xf, RES_STATE_WRST), 15},
438 {MSG_SINGULAR(DEV_GRP_P1, 0x10, RES_STATE_WRST), 15},
439 {MSG_SINGULAR(DEV_GRP_P1, 0x7, RES_STATE_WRST), 0x60},
440 {MSG_SINGULAR(DEV_GRP_P1, 0x19, RES_STATE_ACTIVE), 2},
441 {MSG_SINGULAR(DEV_GRP_NULL, 0x1b, RES_STATE_ACTIVE), 2},
444 static struct twl4030_script wrst_script __initdata = {
446 .size = ARRAY_SIZE(wakeup_seq),
447 .flags = TRITON_WRST_SCRIPT,
450 static struct twl4030_script *twl4030_scripts[] __initdata = {
456 static struct twl4030_power_data sdp3430_t2scripts_data __initdata = {
457 .scripts = twl4030_scripts,
458 .size = ARRAY_SIZE(twl4030_scripts),
461 static struct twl4030_bci_platform_data ldp_bci_data = {
462 .battery_tmp_tbl = ldp_batt_table,
463 .tblsize = ARRAY_SIZE(ldp_batt_table),
466 static struct twl4030_usb_data ldp_usb_data = {
467 .usb_mode = T2_USB_MODE_ULPI,
470 static struct twl4030_gpio_platform_data ldp_gpio_data = {
471 .gpio_base = OMAP_MAX_GPIO_LINES,
472 .irq_base = TWL4030_GPIO_IRQ_BASE,
473 .irq_end = TWL4030_GPIO_IRQ_END,
476 static struct twl4030_madc_platform_data ldp_madc_data = {
480 static struct twl4030_platform_data ldp_twldata = {
481 .irq_base = TWL4030_IRQ_BASE,
482 .irq_end = TWL4030_IRQ_END,
484 /* platform_data for children goes here */
485 .bci = &ldp_bci_data,
486 .madc = &ldp_madc_data,
487 .usb = &ldp_usb_data,
488 .power = &sdp3430_t2scripts_data,
489 .gpio = &ldp_gpio_data,
490 .keypad = &ldp_kp_twl4030_data,
493 static struct i2c_board_info __initdata ldp_i2c_boardinfo[] = {
495 I2C_BOARD_INFO("twl4030", 0x48),
496 .flags = I2C_CLIENT_WAKE,
497 .irq = INT_34XX_SYS_NIRQ,
498 .platform_data = &ldp_twldata,
502 static int __init omap_i2c_init(void)
504 omap_register_i2c_bus(1, 2600, ldp_i2c_boardinfo,
505 ARRAY_SIZE(ldp_i2c_boardinfo));
506 omap_register_i2c_bus(2, 400, NULL, 0);
507 omap_register_i2c_bus(3, 400, NULL, 0);
511 static struct twl4030_hsmmc_info mmc[] __initdata = {
521 static void __init omap_ldp_init(void)
524 platform_add_devices(ldp_devices, ARRAY_SIZE(ldp_devices));
525 omap_board_config = ldp_config;
526 omap_board_config_size = ARRAY_SIZE(ldp_config);
528 ldp_spi_board_info[0].irq = gpio_to_irq(ts_gpio);
529 spi_register_board_info(ldp_spi_board_info,
530 ARRAY_SIZE(ldp_spi_board_info));
538 static void __init omap_ldp_map_io(void)
540 omap2_set_globals_343x();
541 omap2_map_common_io();
544 MACHINE_START(OMAP_LDP, "OMAP LDP board")
545 .phys_io = 0x48000000,
546 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
547 .boot_params = 0x80000100,
548 .map_io = omap_ldp_map_io,
549 .init_irq = omap_ldp_init_irq,
550 .init_machine = omap_ldp_init,
551 .timer = &omap_timer,