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/spi/spi.h>
21 #include <linux/spi/ads7846.h>
22 #include <linux/i2c/twl4030.h>
23 #include <linux/regulator/machine.h>
25 #include <linux/gpio.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/mcspi.h>
34 #include <mach/board.h>
36 #include <mach/common.h>
38 #include <mach/gpmc.h>
40 #include <mach/control.h>
41 #include <mach/keypad.h>
43 #include "mmc-twl4030.h"
45 #define CONFIG_DISABLE_HFCLK 1
47 #define SDP3430_ETHR_GPIO_IRQ_SDPV1 29
48 #define SDP3430_ETHR_GPIO_IRQ_SDPV2 6
49 #define SDP3430_SMC91X_CS 3
51 #define SDP3430_TS_GPIO_IRQ_SDPV1 3
52 #define SDP3430_TS_GPIO_IRQ_SDPV2 2
54 #define ENABLE_VAUX3_DEDICATED 0x03
55 #define ENABLE_VAUX3_DEV_GRP 0x20
57 #define TWL4030_MSECURE_GPIO 22
59 static struct resource sdp3430_smc91x_resources[] = {
61 .flags = IORESOURCE_MEM,
66 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
70 static struct platform_device sdp3430_smc91x_device = {
73 .num_resources = ARRAY_SIZE(sdp3430_smc91x_resources),
74 .resource = sdp3430_smc91x_resources,
77 static int sdp3430_keymap[] = {
111 static struct twl4030_keypad_data sdp3430_kp_data = {
114 .keymap = sdp3430_keymap,
115 .keymapsize = ARRAY_SIZE(sdp3430_keymap),
119 static int ts_gpio; /* Needed for ads7846_get_pendown_state */
122 * @brief ads7846_dev_init : Requests & sets GPIO line for pen-irq
124 * @return - void. If request gpio fails then Flag KERN_ERR.
126 static void ads7846_dev_init(void)
128 if (gpio_request(ts_gpio, "ADS7846 pendown") < 0) {
129 printk(KERN_ERR "can't get ads746 pen down GPIO\n");
133 gpio_direction_input(ts_gpio);
135 omap_set_gpio_debounce(ts_gpio, 1);
136 omap_set_gpio_debounce_time(ts_gpio, 0xa);
139 static int ads7846_get_pendown_state(void)
141 return !gpio_get_value(ts_gpio);
144 static struct ads7846_platform_data tsc2046_config __initdata = {
145 .get_pendown_state = ads7846_get_pendown_state,
150 static struct omap2_mcspi_device_config tsc2046_mcspi_config = {
152 .single_channel = 1, /* 0: slave, 1: master */
155 static struct spi_board_info sdp3430_spi_board_info[] __initdata = {
158 * TSC2046 operates at a max freqency of 2MHz, so
159 * operate slightly below at 1.5MHz
161 .modalias = "ads7846",
164 .max_speed_hz = 1500000,
165 .controller_data = &tsc2046_mcspi_config,
167 .platform_data = &tsc2046_config,
171 static struct platform_device sdp3430_lcd_device = {
172 .name = "sdp2430_lcd",
176 static struct regulator_consumer_supply sdp3430_vdac_supply = {
178 .dev = &sdp3430_lcd_device.dev,
181 static struct regulator_consumer_supply sdp3430_vdvi_supply = {
183 .dev = &sdp3430_lcd_device.dev,
186 static struct platform_device *sdp3430_devices[] __initdata = {
187 &sdp3430_smc91x_device,
191 static inline void __init sdp3430_init_smc91x(void)
194 unsigned long cs_mem_base;
197 eth_cs = SDP3430_SMC91X_CS;
199 if (gpmc_cs_request(eth_cs, SZ_16M, &cs_mem_base) < 0) {
200 printk(KERN_ERR "Failed to request GPMC mem for smc91x\n");
204 sdp3430_smc91x_resources[0].start = cs_mem_base + 0x300;
205 sdp3430_smc91x_resources[0].end = cs_mem_base + 0x30f;
208 if (omap_rev() > OMAP3430_REV_ES1_0)
209 eth_gpio = SDP3430_ETHR_GPIO_IRQ_SDPV2;
211 eth_gpio = SDP3430_ETHR_GPIO_IRQ_SDPV1;
213 sdp3430_smc91x_resources[1].start = gpio_to_irq(eth_gpio);
215 if (gpio_request(eth_gpio, "SMC91x irq") < 0) {
216 printk(KERN_ERR "Failed to request GPIO%d for smc91x IRQ\n",
220 gpio_direction_input(eth_gpio);
223 static void __init omap_3430sdp_init_irq(void)
225 omap2_init_common_hw();
228 sdp3430_init_smc91x();
231 static struct omap_uart_config sdp3430_uart_config __initdata = {
232 .enabled_uarts = ((1 << 0) | (1 << 1) | (1 << 2)),
235 static struct omap_lcd_config sdp3430_lcd_config __initdata = {
236 .ctrl_name = "internal",
239 static struct omap_board_config_kernel sdp3430_config[] __initdata = {
240 { OMAP_TAG_UART, &sdp3430_uart_config },
241 { OMAP_TAG_LCD, &sdp3430_lcd_config },
244 static int sdp3430_batt_table[] = {
246 30800, 29500, 28300, 27100,
247 26000, 24900, 23900, 22900, 22000, 21100, 20300, 19400, 18700, 17900,
248 17200, 16500, 15900, 15300, 14700, 14100, 13600, 13100, 12600, 12100,
249 11600, 11200, 10800, 10400, 10000, 9630, 9280, 8950, 8620, 8310,
250 8020, 7730, 7460, 7200, 6950, 6710, 6470, 6250, 6040, 5830,
251 5640, 5450, 5260, 5090, 4920, 4760, 4600, 4450, 4310, 4170,
252 4040, 3910, 3790, 3670, 3550
255 static struct twl4030_bci_platform_data sdp3430_bci_data = {
256 .battery_tmp_tbl = sdp3430_batt_table,
257 .tblsize = ARRAY_SIZE(sdp3430_batt_table),
260 static struct twl4030_hsmmc_info mmc[] = {
263 /* 8 bits (default) requires S6.3 == ON,
264 * so the SIM card isn't used; else 4 bits.
277 static struct regulator_consumer_supply sdp3430_vmmc1_supply = {
281 static struct regulator_consumer_supply sdp3430_vsim_supply = {
282 .supply = "vmmc_aux",
285 static struct regulator_consumer_supply sdp3430_vmmc2_supply = {
289 static int sdp3430_twl_gpio_setup(struct device *dev,
290 unsigned gpio, unsigned ngpio)
292 /* gpio + 0 is "mmc0_cd" (input/IRQ),
293 * gpio + 1 is "mmc1_cd" (input/IRQ)
295 mmc[0].gpio_cd = gpio + 0;
296 mmc[1].gpio_cd = gpio + 1;
297 twl4030_mmc_init(mmc);
299 /* link regulators to MMC adapters ... we "know" the
300 * regulators will be set up only *after* we return.
302 sdp3430_vmmc1_supply.dev = mmc[0].dev;
303 sdp3430_vsim_supply.dev = mmc[0].dev;
304 sdp3430_vmmc2_supply.dev = mmc[1].dev;
306 /* gpio + 7 is "sub_lcd_en_bkl" (output/PWM1) */
307 gpio_request(gpio + 7, "sub_lcd_en_bkl");
308 gpio_direction_output(gpio + 7, 0);
310 /* gpio + 15 is "sub_lcd_nRST" (output) */
311 gpio_request(gpio + 15, "sub_lcd_nRST");
312 gpio_direction_output(gpio + 15, 0);
317 static struct twl4030_gpio_platform_data sdp3430_gpio_data = {
318 .gpio_base = OMAP_MAX_GPIO_LINES,
319 .irq_base = TWL4030_GPIO_IRQ_BASE,
320 .irq_end = TWL4030_GPIO_IRQ_END,
321 .pulldowns = BIT(2) | BIT(6) | BIT(8) | BIT(13)
323 .setup = sdp3430_twl_gpio_setup,
326 static struct twl4030_usb_data sdp3430_usb_data = {
327 .usb_mode = T2_USB_MODE_ULPI,
330 static struct twl4030_madc_platform_data sdp3430_madc_data = {
335 * Apply all the fixed voltages since most versions of U-Boot
336 * don't bother with that initialization.
339 /* VAUX1 for mainboard (irda and sub-lcd) */
340 static struct regulator_init_data sdp3430_vaux1 = {
345 .valid_modes_mask = REGULATOR_MODE_NORMAL
346 | REGULATOR_MODE_STANDBY,
347 .valid_ops_mask = REGULATOR_CHANGE_MODE
348 | REGULATOR_CHANGE_STATUS,
352 /* VAUX2 for camera module */
353 static struct regulator_init_data sdp3430_vaux2 = {
358 .valid_modes_mask = REGULATOR_MODE_NORMAL
359 | REGULATOR_MODE_STANDBY,
360 .valid_ops_mask = REGULATOR_CHANGE_MODE
361 | REGULATOR_CHANGE_STATUS,
365 /* VAUX3 for LCD board */
366 static struct regulator_init_data sdp3430_vaux3 = {
371 .valid_modes_mask = REGULATOR_MODE_NORMAL
372 | REGULATOR_MODE_STANDBY,
373 .valid_ops_mask = REGULATOR_CHANGE_MODE
374 | REGULATOR_CHANGE_STATUS,
378 /* VAUX4 for OMAP VDD_CSI2 (camera) */
379 static struct regulator_init_data sdp3430_vaux4 = {
384 .valid_modes_mask = REGULATOR_MODE_NORMAL
385 | REGULATOR_MODE_STANDBY,
386 .valid_ops_mask = REGULATOR_CHANGE_MODE
387 | REGULATOR_CHANGE_STATUS,
391 /* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */
392 static struct regulator_init_data sdp3430_vmmc1 = {
396 .valid_modes_mask = REGULATOR_MODE_NORMAL
397 | REGULATOR_MODE_STANDBY,
398 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
399 | REGULATOR_CHANGE_MODE
400 | REGULATOR_CHANGE_STATUS,
402 .num_consumer_supplies = 1,
403 .consumer_supplies = &sdp3430_vmmc1_supply,
406 /* VMMC2 for MMC2 card */
407 static struct regulator_init_data sdp3430_vmmc2 = {
412 .valid_modes_mask = REGULATOR_MODE_NORMAL
413 | REGULATOR_MODE_STANDBY,
414 .valid_ops_mask = REGULATOR_CHANGE_MODE
415 | REGULATOR_CHANGE_STATUS,
417 .num_consumer_supplies = 1,
418 .consumer_supplies = &sdp3430_vmmc2_supply,
421 /* VSIM for OMAP VDD_MMC1A (i/o for DAT4..DAT7) */
422 static struct regulator_init_data sdp3430_vsim = {
426 .valid_modes_mask = REGULATOR_MODE_NORMAL
427 | REGULATOR_MODE_STANDBY,
428 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
429 | REGULATOR_CHANGE_MODE
430 | REGULATOR_CHANGE_STATUS,
432 .num_consumer_supplies = 1,
433 .consumer_supplies = &sdp3430_vsim_supply,
436 /* VDAC for DSS driving S-Video */
437 static struct regulator_init_data sdp3430_vdac = {
442 .valid_modes_mask = REGULATOR_MODE_NORMAL
443 | REGULATOR_MODE_STANDBY,
444 .valid_ops_mask = REGULATOR_CHANGE_MODE
445 | REGULATOR_CHANGE_STATUS,
447 .num_consumer_supplies = 1,
448 .consumer_supplies = &sdp3430_vdac_supply,
451 /* VPLL2 for digital video outputs */
452 static struct regulator_init_data sdp3430_vpll2 = {
457 .valid_modes_mask = REGULATOR_MODE_NORMAL
458 | REGULATOR_MODE_STANDBY,
459 .valid_ops_mask = REGULATOR_CHANGE_MODE
460 | REGULATOR_CHANGE_STATUS,
462 .num_consumer_supplies = 1,
463 .consumer_supplies = &sdp3430_vdvi_supply,
466 static struct twl4030_platform_data sdp3430_twldata = {
467 .irq_base = TWL4030_IRQ_BASE,
468 .irq_end = TWL4030_IRQ_END,
470 /* platform_data for children goes here */
471 .bci = &sdp3430_bci_data,
472 .gpio = &sdp3430_gpio_data,
473 .madc = &sdp3430_madc_data,
474 .keypad = &sdp3430_kp_data,
475 .usb = &sdp3430_usb_data,
477 .vaux1 = &sdp3430_vaux1,
478 .vaux2 = &sdp3430_vaux2,
479 .vaux3 = &sdp3430_vaux3,
480 .vaux4 = &sdp3430_vaux4,
481 .vmmc1 = &sdp3430_vmmc1,
482 .vmmc2 = &sdp3430_vmmc2,
483 .vsim = &sdp3430_vsim,
484 .vdac = &sdp3430_vdac,
485 .vpll2 = &sdp3430_vpll2,
488 static struct i2c_board_info __initdata sdp3430_i2c_boardinfo[] = {
490 I2C_BOARD_INFO("twl4030", 0x48),
491 .flags = I2C_CLIENT_WAKE,
492 .irq = INT_34XX_SYS_NIRQ,
493 .platform_data = &sdp3430_twldata,
497 static int __init omap3430_i2c_init(void)
499 /* i2c1 for PMIC only */
500 omap_register_i2c_bus(1, 2600, sdp3430_i2c_boardinfo,
501 ARRAY_SIZE(sdp3430_i2c_boardinfo));
502 /* i2c2 on camera connector (for sensor control) and optional isp1301 */
503 omap_register_i2c_bus(2, 400, NULL, 0);
504 /* i2c3 on display connector (for DVI, tfp410) */
505 omap_register_i2c_bus(3, 400, NULL, 0);
509 static void __init omap_3430sdp_init(void)
512 platform_add_devices(sdp3430_devices, ARRAY_SIZE(sdp3430_devices));
513 omap_board_config = sdp3430_config;
514 omap_board_config_size = ARRAY_SIZE(sdp3430_config);
515 if (omap_rev() > OMAP3430_REV_ES1_0)
516 ts_gpio = SDP3430_TS_GPIO_IRQ_SDPV2;
518 ts_gpio = SDP3430_TS_GPIO_IRQ_SDPV1;
519 sdp3430_spi_board_info[0].irq = gpio_to_irq(ts_gpio);
520 spi_register_board_info(sdp3430_spi_board_info,
521 ARRAY_SIZE(sdp3430_spi_board_info));
527 static void __init omap_3430sdp_map_io(void)
529 omap2_set_globals_343x();
530 omap2_map_common_io();
533 MACHINE_START(OMAP_3430SDP, "OMAP3430 3430SDP board")
534 /* Maintainer: Syed Khasim - Texas Instruments Inc */
535 .phys_io = 0x48000000,
536 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
537 .boot_params = 0x80000100,
538 .map_io = omap_3430sdp_map_io,
539 .init_irq = omap_3430sdp_init_irq,
540 .init_machine = omap_3430sdp_init,
541 .timer = &omap_timer,