2 * linux/arch/arm/mach-omap2/board-3430sdp.c
4 * Copyright (C) 2007 Texas Instruments
6 * Modified from mach-omap2/board-generic.c
8 * Initial code: Syed Mohammed Khasim
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.
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/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>
26 #include <linux/regulator/machine.h>
29 #include <mach/hardware.h>
30 #include <asm/mach-types.h>
31 #include <asm/mach/arch.h>
32 #include <asm/mach/map.h>
34 #include <mach/mcspi.h>
35 #include <mach/gpio.h>
37 #include <mach/board.h>
39 #include <mach/common.h>
41 #include <mach/gpmc.h>
43 #include <mach/control.h>
45 #include "sdram-qimonda-hyb18m512160af-6.h"
46 #include "mmc-twl4030.h"
48 #define CONFIG_DISABLE_HFCLK 1
50 #define SDP3430_SMC91X_CS 3
52 #define ENABLE_VAUX3_DEDICATED 0x03
53 #define ENABLE_VAUX3_DEV_GRP 0x20
56 #define TWL4030_MSECURE_GPIO 22
58 static struct resource sdp3430_smc91x_resources[] = {
60 .flags = IORESOURCE_MEM,
65 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
69 static struct platform_device sdp3430_smc91x_device = {
72 .num_resources = ARRAY_SIZE(sdp3430_smc91x_resources),
73 .resource = sdp3430_smc91x_resources,
76 static int sdp3430_keymap[] = {
110 static struct twl4030_keypad_data sdp3430_kp_data = {
113 .keymap = sdp3430_keymap,
114 .keymapsize = ARRAY_SIZE(sdp3430_keymap),
120 static int __init msecure_init(void)
124 #ifdef CONFIG_RTC_DRV_TWL4030
125 /* 3430ES2.0 doesn't have msecure/gpio-22 line connected to T2 */
126 if (omap_type() == OMAP2_DEVICE_TYPE_GP &&
127 omap_rev() < OMAP3430_REV_ES2_0) {
128 void __iomem *msecure_pad_config_reg = omap_ctrl_base_get() +
133 ret = gpio_request(TWL4030_MSECURE_GPIO, "msecure");
135 printk(KERN_ERR "msecure_init: can't"
136 "reserve GPIO:%d !\n", TWL4030_MSECURE_GPIO);
140 * TWL4030 will be in secure mode if msecure line from OMAP
141 * is low. Make msecure line high in order to change the
142 * TWL4030 RTC time and calender registers.
144 tmp = __raw_readw(msecure_pad_config_reg);
145 tmp &= 0xF8; /* To enable mux mode 03/04 = GPIO_RTC */
146 tmp |= mux_mask;/* To enable mux mode 03/04 = GPIO_RTC */
147 __raw_writew(tmp, msecure_pad_config_reg);
149 gpio_direction_output(TWL4030_MSECURE_GPIO, 1);
157 * @brief ads7846_dev_init : Requests & sets GPIO line for pen-irq
159 * @return - void. If request gpio fails then Flag KERN_ERR.
161 static void ads7846_dev_init(void)
163 if (gpio_request(ts_gpio, "ADS7846 pendown") < 0) {
164 printk(KERN_ERR "can't get ads746 pen down GPIO\n");
168 gpio_direction_input(ts_gpio);
170 omap_set_gpio_debounce(ts_gpio, 1);
171 omap_set_gpio_debounce_time(ts_gpio, 0xa);
174 static int ads7846_get_pendown_state(void)
176 return !gpio_get_value(ts_gpio);
180 * This enable(1)/disable(0) the voltage for TS: uses twl4030 calls
182 static int ads7846_vaux_control(int vaux_cntrl)
186 #ifdef CONFIG_TWL4030_CORE
187 /* check for return value of ldo_use: if success it returns 0 */
188 if (vaux_cntrl == VAUX_ENABLE) {
189 if (ret != twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
190 ENABLE_VAUX3_DEDICATED, TWL4030_VAUX3_DEDICATED))
192 if (ret != twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
193 ENABLE_VAUX3_DEV_GRP, TWL4030_VAUX3_DEV_GRP))
195 } else if (vaux_cntrl == VAUX_DISABLE) {
196 if (ret != twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
197 0x00, TWL4030_VAUX3_DEDICATED))
199 if (ret != twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
200 0x00, TWL4030_VAUX3_DEV_GRP))
209 static struct ads7846_platform_data tsc2046_config __initdata = {
210 .get_pendown_state = ads7846_get_pendown_state,
212 .vaux_control = ads7846_vaux_control,
216 static struct omap2_mcspi_device_config tsc2046_mcspi_config = {
218 .single_channel = 1, /* 0: slave, 1: master */
221 static struct spi_board_info sdp3430_spi_board_info[] __initdata = {
224 * TSC2046 operates at a max freqency of 2MHz, so
225 * operate slightly below at 1.5MHz
227 .modalias = "ads7846",
230 .max_speed_hz = 1500000,
231 .controller_data = &tsc2046_mcspi_config,
233 .platform_data = &tsc2046_config,
237 static struct platform_device sdp3430_lcd_device = {
238 .name = "sdp2430_lcd",
242 static struct platform_device *sdp3430_devices[] __initdata = {
243 &sdp3430_smc91x_device,
247 static inline void __init sdp3430_init_smc91x(void)
250 unsigned long cs_mem_base;
253 eth_cs = SDP3430_SMC91X_CS;
255 if (gpmc_cs_request(eth_cs, SZ_16M, &cs_mem_base) < 0) {
256 printk(KERN_ERR "Failed to request GPMC mem for smc91x\n");
260 sdp3430_smc91x_resources[0].start = cs_mem_base + 0x300;
261 sdp3430_smc91x_resources[0].end = cs_mem_base + 0x30f;
264 if (omap_rev() > OMAP3430_REV_ES1_0)
265 eth_gpio = OMAP34XX_ETHR_GPIO_IRQ_SDPV2;
267 eth_gpio = OMAP34XX_ETHR_GPIO_IRQ_SDPV1;
269 sdp3430_smc91x_resources[1].start = gpio_to_irq(eth_gpio);
271 if (gpio_request(eth_gpio, "SMC91x irq") < 0) {
272 printk(KERN_ERR "Failed to request GPIO%d for smc91x IRQ\n",
276 gpio_direction_input(eth_gpio);
279 static void __init omap_3430sdp_init_irq(void)
281 omap2_init_common_hw(hyb18m512160af6_sdrc_params);
284 sdp3430_init_smc91x();
287 static struct omap_uart_config sdp3430_uart_config __initdata = {
288 .enabled_uarts = ((1 << 0) | (1 << 1) | (1 << 2)),
291 static struct omap_lcd_config sdp3430_lcd_config __initdata = {
292 .ctrl_name = "internal",
295 static struct omap_board_config_kernel sdp3430_config[] __initdata = {
296 { OMAP_TAG_UART, &sdp3430_uart_config },
297 { OMAP_TAG_LCD, &sdp3430_lcd_config },
300 static int sdp3430_batt_table[] = {
302 30800, 29500, 28300, 27100,
303 26000, 24900, 23900, 22900, 22000, 21100, 20300, 19400, 18700, 17900,
304 17200, 16500, 15900, 15300, 14700, 14100, 13600, 13100, 12600, 12100,
305 11600, 11200, 10800, 10400, 10000, 9630, 9280, 8950, 8620, 8310,
306 8020, 7730, 7460, 7200, 6950, 6710, 6470, 6250, 6040, 5830,
307 5640, 5450, 5260, 5090, 4920, 4760, 4600, 4450, 4310, 4170,
308 4040, 3910, 3790, 3670, 3550
311 static struct twl4030_bci_platform_data sdp3430_bci_data = {
312 .battery_tmp_tbl = sdp3430_batt_table,
313 .tblsize = ARRAY_SIZE(sdp3430_batt_table),
316 static struct twl4030_hsmmc_info mmc[] = {
319 /* 8 bits (default) requires S6.3 == ON,
320 * so the SIM card isn't used; else 4 bits.
333 static struct regulator_consumer_supply sdp3430_vmmc1_supply = {
337 static struct regulator_consumer_supply sdp3430_vsim_supply = {
338 .supply = "vmmc_aux",
341 static struct regulator_consumer_supply sdp3430_vmmc2_supply = {
345 static int sdp3430_twl_gpio_setup(struct device *dev,
346 unsigned gpio, unsigned ngpio)
348 /* gpio + 0 is "mmc0_cd" (input/IRQ),
349 * gpio + 1 is "mmc1_cd" (input/IRQ)
351 mmc[0].gpio_cd = gpio + 0;
352 mmc[1].gpio_cd = gpio + 1;
353 twl4030_mmc_init(mmc);
355 /* link regulators to MMC adapters ... we "know" the
356 * regulators will be set up only *after* we return.
358 sdp3430_vmmc1_supply.dev = mmc[0].dev;
359 sdp3430_vsim_supply.dev = mmc[0].dev;
360 sdp3430_vmmc2_supply.dev = mmc[1].dev;
362 /* gpio + 7 is "sub_lcd_en_bkl" (output/PWM1) */
363 gpio_request(gpio + 7, "sub_lcd_en_bkl");
364 gpio_direction_output(gpio + 7, 0);
366 /* gpio + 15 is "sub_lcd_nRST" (output) */
367 gpio_request(gpio + 15, "sub_lcd_nRST");
368 gpio_direction_output(gpio + 15, 0);
373 static struct twl4030_gpio_platform_data sdp3430_gpio_data = {
374 .gpio_base = OMAP_MAX_GPIO_LINES,
375 .irq_base = TWL4030_GPIO_IRQ_BASE,
376 .irq_end = TWL4030_GPIO_IRQ_END,
377 .pulldowns = BIT(2) | BIT(6) | BIT(8) | BIT(13)
379 .setup = sdp3430_twl_gpio_setup,
382 static struct twl4030_usb_data sdp3430_usb_data = {
383 .usb_mode = T2_USB_MODE_ULPI,
386 static struct twl4030_madc_platform_data sdp3430_madc_data = {
391 static struct twl4030_ins __initdata sleep_on_seq[] = {
393 * Turn off VDD1 and VDD2.
395 {MSG_SINGULAR(DEV_GRP_P1, 0xf, RES_STATE_OFF), 4},
396 {MSG_SINGULAR(DEV_GRP_P1, 0x10, RES_STATE_OFF), 2},
397 #ifdef CONFIG_DISABLE_HFCLK
399 * And also turn off the OMAP3 PLLs and the sysclk output.
401 {MSG_SINGULAR(DEV_GRP_P1, 0x7, RES_STATE_OFF), 3},
402 {MSG_SINGULAR(DEV_GRP_P1, 0x19, RES_STATE_OFF), 3},
406 static struct twl4030_script sleep_on_script __initdata = {
407 .script = sleep_on_seq,
408 .size = ARRAY_SIZE(sleep_on_seq),
409 .flags = TRITON_SLEEP_SCRIPT,
412 static struct twl4030_ins wakeup_seq[] __initdata = {
413 #ifndef CONFIG_DISABLE_HFCLK
415 * Wakeup VDD1 and VDD2.
417 {MSG_SINGULAR(DEV_GRP_P1, 0xf, RES_STATE_ACTIVE), 4},
418 {MSG_SINGULAR(DEV_GRP_P1, 0x10, RES_STATE_ACTIVE), 2},
421 * Reenable the OMAP3 PLLs.
422 * Wakeup VDD1 and VDD2.
423 * Reenable sysclk output.
425 {MSG_SINGULAR(DEV_GRP_P1, 0x7, RES_STATE_ACTIVE), 0x30},
426 {MSG_SINGULAR(DEV_GRP_P1, 0xf, RES_STATE_ACTIVE), 0x30},
427 {MSG_SINGULAR(DEV_GRP_P1, 0x10, RES_STATE_ACTIVE), 0x37},
428 {MSG_SINGULAR(DEV_GRP_P1, 0x19, RES_STATE_ACTIVE), 3},
429 #endif /* #ifndef CONFIG_DISABLE_HFCLK */
432 static struct twl4030_script wakeup_script __initdata = {
433 .script = wakeup_seq,
434 .size = ARRAY_SIZE(wakeup_seq),
435 .flags = TRITON_WAKEUP12_SCRIPT | TRITON_WAKEUP3_SCRIPT,
438 static struct twl4030_ins wrst_seq[] __initdata = {
441 * Reset VDD1 regulator.
442 * Reset VDD2 regulator.
443 * Reset VPLL1 regulator.
444 * Enable sysclk output.
447 {MSG_SINGULAR(DEV_GRP_NULL, 0x1b, RES_STATE_OFF), 2},
448 {MSG_SINGULAR(DEV_GRP_P1, 0xf, RES_STATE_WRST), 15},
449 {MSG_SINGULAR(DEV_GRP_P1, 0x10, RES_STATE_WRST), 15},
450 {MSG_SINGULAR(DEV_GRP_P1, 0x7, RES_STATE_WRST), 0x60},
451 {MSG_SINGULAR(DEV_GRP_P1, 0x19, RES_STATE_ACTIVE), 2},
452 {MSG_SINGULAR(DEV_GRP_NULL, 0x1b, RES_STATE_ACTIVE), 2},
454 static struct twl4030_script wrst_script __initdata = {
456 .size = ARRAY_SIZE(wakeup_seq),
457 .flags = TRITON_WRST_SCRIPT,
460 static struct twl4030_script *twl4030_scripts[] __initdata = {
466 static struct twl4030_power_data sdp3430_t2scripts_data __initdata = {
467 .scripts = twl4030_scripts,
468 .size = ARRAY_SIZE(twl4030_scripts),
472 * Apply all the fixed voltages since most versions of U-Boot
473 * don't bother with that initialization.
476 /* VAUX1 for mainboard (irda and sub-lcd) */
477 static struct regulator_init_data sdp3430_vaux1 = {
482 .valid_modes_mask = REGULATOR_MODE_NORMAL
483 | REGULATOR_MODE_STANDBY,
484 .valid_ops_mask = REGULATOR_CHANGE_MODE
485 | REGULATOR_CHANGE_STATUS,
489 /* VAUX2 for camera module */
490 static struct regulator_init_data sdp3430_vaux2 = {
495 .valid_modes_mask = REGULATOR_MODE_NORMAL
496 | REGULATOR_MODE_STANDBY,
497 .valid_ops_mask = REGULATOR_CHANGE_MODE
498 | REGULATOR_CHANGE_STATUS,
502 /* VAUX3 for LCD board */
503 static struct regulator_init_data sdp3430_vaux3 = {
508 .valid_modes_mask = REGULATOR_MODE_NORMAL
509 | REGULATOR_MODE_STANDBY,
510 .valid_ops_mask = REGULATOR_CHANGE_MODE
511 | REGULATOR_CHANGE_STATUS,
515 /* VAUX4 for OMAP VDD_CSI2 (camera) */
516 static struct regulator_init_data sdp3430_vaux4 = {
521 .valid_modes_mask = REGULATOR_MODE_NORMAL
522 | REGULATOR_MODE_STANDBY,
523 .valid_ops_mask = REGULATOR_CHANGE_MODE
524 | REGULATOR_CHANGE_STATUS,
528 /* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */
529 static struct regulator_init_data sdp3430_vmmc1 = {
533 .valid_modes_mask = REGULATOR_MODE_NORMAL
534 | REGULATOR_MODE_STANDBY,
535 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
536 | REGULATOR_CHANGE_MODE
537 | REGULATOR_CHANGE_STATUS,
539 .num_consumer_supplies = 1,
540 .consumer_supplies = &sdp3430_vmmc1_supply,
543 /* VMMC2 for MMC2 card */
544 static struct regulator_init_data sdp3430_vmmc2 = {
549 .valid_modes_mask = REGULATOR_MODE_NORMAL
550 | REGULATOR_MODE_STANDBY,
551 .valid_ops_mask = REGULATOR_CHANGE_MODE
552 | REGULATOR_CHANGE_STATUS,
554 .num_consumer_supplies = 1,
555 .consumer_supplies = &sdp3430_vmmc2_supply,
558 /* VSIM for OMAP VDD_MMC1A (i/o for DAT4..DAT7) */
559 static struct regulator_init_data sdp3430_vsim = {
563 .valid_modes_mask = REGULATOR_MODE_NORMAL
564 | REGULATOR_MODE_STANDBY,
565 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
566 | REGULATOR_CHANGE_MODE
567 | REGULATOR_CHANGE_STATUS,
569 .num_consumer_supplies = 1,
570 .consumer_supplies = &sdp3430_vsim_supply,
573 /* VDAC for DSS driving S-Video */
574 static struct regulator_init_data sdp3430_vdac = {
579 .valid_modes_mask = REGULATOR_MODE_NORMAL
580 | REGULATOR_MODE_STANDBY,
581 .valid_ops_mask = REGULATOR_CHANGE_MODE
582 | REGULATOR_CHANGE_STATUS,
586 static struct twl4030_platform_data sdp3430_twldata = {
587 .irq_base = TWL4030_IRQ_BASE,
588 .irq_end = TWL4030_IRQ_END,
590 /* platform_data for children goes here */
591 .bci = &sdp3430_bci_data,
592 .gpio = &sdp3430_gpio_data,
593 .madc = &sdp3430_madc_data,
594 .keypad = &sdp3430_kp_data,
595 .power = &sdp3430_t2scripts_data,
596 .usb = &sdp3430_usb_data,
598 .vaux1 = &sdp3430_vaux1,
599 .vaux2 = &sdp3430_vaux2,
600 .vaux3 = &sdp3430_vaux3,
601 .vaux4 = &sdp3430_vaux4,
602 .vmmc1 = &sdp3430_vmmc1,
603 .vmmc2 = &sdp3430_vmmc2,
604 .vsim = &sdp3430_vsim,
605 .vdac = &sdp3430_vdac,
608 static struct i2c_board_info __initdata sdp3430_i2c_boardinfo[] = {
610 I2C_BOARD_INFO("twl4030", 0x48),
611 .flags = I2C_CLIENT_WAKE,
612 .irq = INT_34XX_SYS_NIRQ,
613 .platform_data = &sdp3430_twldata,
617 static int __init omap3430_i2c_init(void)
619 /* i2c1 for PMIC only */
620 omap_register_i2c_bus(1, 2600, sdp3430_i2c_boardinfo,
621 ARRAY_SIZE(sdp3430_i2c_boardinfo));
622 /* i2c2 on camera connector (for sensor control) and optional isp1301 */
623 omap_register_i2c_bus(2, 400, NULL, 0);
624 /* i2c3 on display connector (for DVI, tfp410) */
625 omap_register_i2c_bus(3, 400, NULL, 0);
629 static void __init omap_3430sdp_init(void)
632 platform_add_devices(sdp3430_devices, ARRAY_SIZE(sdp3430_devices));
633 omap_board_config = sdp3430_config;
634 omap_board_config_size = ARRAY_SIZE(sdp3430_config);
635 if (omap_rev() > OMAP3430_REV_ES1_0)
636 ts_gpio = OMAP34XX_TS_GPIO_IRQ_SDPV2;
638 ts_gpio = OMAP34XX_TS_GPIO_IRQ_SDPV1;
639 sdp3430_spi_board_info[0].irq = gpio_to_irq(ts_gpio);
640 spi_register_board_info(sdp3430_spi_board_info,
641 ARRAY_SIZE(sdp3430_spi_board_info));
643 sdp3430_flash_init();
650 static void __init omap_3430sdp_map_io(void)
652 omap2_set_globals_343x();
653 omap2_map_common_io();
656 MACHINE_START(OMAP_3430SDP, "OMAP3430 3430SDP board")
657 /* Maintainer: Syed Khasim - Texas Instruments Inc */
658 .phys_io = 0x48000000,
659 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
660 .boot_params = 0x80000100,
661 .map_io = omap_3430sdp_map_io,
662 .init_irq = omap_3430sdp_init_irq,
663 .init_machine = omap_3430sdp_init,
664 .timer = &omap_timer,