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>
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>
33 #include <mach/gpio.h>
35 #include <mach/board.h>
36 #include <mach/usb-musb.h>
37 #include <mach/usb-ehci.h>
38 #include <mach/hsmmc.h>
39 #include <mach/common.h>
40 #include <mach/keypad.h>
42 #include <mach/gpmc.h>
45 #include <asm/delay.h>
46 #include <mach/control.h>
48 #include "sdram-qimonda-hyb18m512160af-6.h"
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 .start = OMAP34XX_ETHR_START,
61 .end = OMAP34XX_ETHR_START + SZ_4K,
62 .flags = IORESOURCE_MEM,
67 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
71 static struct platform_device sdp3430_smc91x_device = {
74 .num_resources = ARRAY_SIZE(sdp3430_smc91x_resources),
75 .resource = sdp3430_smc91x_resources,
78 static int sdp3430_keymap[] = {
112 static struct twl4030_keypad_data sdp3430_kp_data = {
115 .keymap = sdp3430_keymap,
116 .keymapsize = ARRAY_SIZE(sdp3430_keymap),
118 .irq = TWL4030_MODIRQ_KEYPAD,
123 static int __init msecure_init(void)
127 #ifdef CONFIG_RTC_DRV_TWL4030
128 /* 3430ES2.0 doesn't have msecure/gpio-22 line connected to T2 */
129 if (omap_type() == OMAP2_DEVICE_TYPE_GP &&
130 system_rev < OMAP3430_REV_ES2_0) {
131 u32 msecure_pad_config_reg = omap_ctrl_base_get() + 0xA3C;
135 ret = gpio_request(TWL4030_MSECURE_GPIO, "msecure");
137 printk(KERN_ERR "msecure_init: can't"
138 "reserve GPIO:%d !\n", TWL4030_MSECURE_GPIO);
142 * TWL4030 will be in secure mode if msecure line from OMAP
143 * is low. Make msecure line high in order to change the
144 * TWL4030 RTC time and calender registers.
146 tmp = omap_readw(msecure_pad_config_reg);
147 tmp &= 0xF8; /* To enable mux mode 03/04 = GPIO_RTC */
148 tmp |= mux_mask;/* To enable mux mode 03/04 = GPIO_RTC */
149 omap_writew(tmp, msecure_pad_config_reg);
151 gpio_direction_output(TWL4030_MSECURE_GPIO, 1);
159 * @brief ads7846_dev_init : Requests & sets GPIO line for pen-irq
161 * @return - void. If request gpio fails then Flag KERN_ERR.
163 static void ads7846_dev_init(void)
165 if (omap_request_gpio(ts_gpio) < 0) {
166 printk(KERN_ERR "can't get ads746 pen down GPIO\n");
170 omap_set_gpio_direction(ts_gpio, 1);
172 omap_set_gpio_debounce(ts_gpio, 1);
173 omap_set_gpio_debounce_time(ts_gpio, 0xa);
176 static int ads7846_get_pendown_state(void)
178 return !omap_get_gpio_datain(ts_gpio);
182 * This enable(1)/disable(0) the voltage for TS: uses twl4030 calls
184 static int ads7846_vaux_control(int vaux_cntrl)
188 #ifdef CONFIG_TWL4030_CORE
189 /* check for return value of ldo_use: if success it returns 0 */
190 if (vaux_cntrl == VAUX_ENABLE) {
191 if (ret != twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
192 ENABLE_VAUX3_DEDICATED, TWL4030_VAUX3_DEDICATED))
194 if (ret != twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
195 ENABLE_VAUX3_DEV_GRP, TWL4030_VAUX3_DEV_GRP))
197 } else if (vaux_cntrl == VAUX_DISABLE) {
198 if (ret != twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
199 0x00, TWL4030_VAUX3_DEDICATED))
201 if (ret != twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
202 0x00, TWL4030_VAUX3_DEV_GRP))
211 static struct ads7846_platform_data tsc2046_config __initdata = {
212 .get_pendown_state = ads7846_get_pendown_state,
214 .vaux_control = ads7846_vaux_control,
218 static struct omap2_mcspi_device_config tsc2046_mcspi_config = {
220 .single_channel = 1, /* 0: slave, 1: master */
223 static struct spi_board_info sdp3430_spi_board_info[] __initdata = {
226 * TSC2046 operates at a max freqency of 2MHz, so
227 * operate slightly below at 1.5MHz
229 .modalias = "ads7846",
232 .max_speed_hz = 1500000,
233 .controller_data = &tsc2046_mcspi_config,
235 .platform_data = &tsc2046_config,
239 static struct platform_device sdp3430_lcd_device = {
240 .name = "sdp2430_lcd",
244 static struct platform_device *sdp3430_devices[] __initdata = {
245 &sdp3430_smc91x_device,
249 static inline void __init sdp3430_init_smc91x(void)
252 unsigned long cs_mem_base;
255 eth_cs = SDP3430_SMC91X_CS;
257 if (gpmc_cs_request(eth_cs, SZ_16M, &cs_mem_base) < 0) {
258 printk(KERN_ERR "Failed to request GPMC mem for smc91x\n");
262 sdp3430_smc91x_resources[0].start = cs_mem_base + 0x0;
263 sdp3430_smc91x_resources[0].end = cs_mem_base + 0xf;
266 if (system_rev > OMAP3430_REV_ES1_0)
267 eth_gpio = OMAP34XX_ETHR_GPIO_IRQ_SDPV2;
269 eth_gpio = OMAP34XX_ETHR_GPIO_IRQ_SDPV1;
271 sdp3430_smc91x_resources[1].start = OMAP_GPIO_IRQ(eth_gpio);
273 if (omap_request_gpio(eth_gpio) < 0) {
274 printk(KERN_ERR "Failed to request GPIO%d for smc91x IRQ\n",
278 omap_set_gpio_direction(eth_gpio, 1);
281 static void __init omap_3430sdp_init_irq(void)
283 omap2_init_common_hw(hyb18m512160af6_sdrc_params);
286 sdp3430_init_smc91x();
289 static struct omap_uart_config sdp3430_uart_config __initdata = {
290 .enabled_uarts = ((1 << 0) | (1 << 1) | (1 << 2)),
293 static struct omap_lcd_config sdp3430_lcd_config __initdata = {
294 .ctrl_name = "internal",
297 static struct omap_board_config_kernel sdp3430_config[] __initdata = {
298 { OMAP_TAG_UART, &sdp3430_uart_config },
299 { OMAP_TAG_LCD, &sdp3430_lcd_config },
302 static int sdp3430_batt_table[] = {
304 30800, 29500, 28300, 27100,
305 26000, 24900, 23900, 22900, 22000, 21100, 20300, 19400, 18700, 17900,
306 17200, 16500, 15900, 15300, 14700, 14100, 13600, 13100, 12600, 12100,
307 11600, 11200, 10800, 10400, 10000, 9630, 9280, 8950, 8620, 8310,
308 8020, 7730, 7460, 7200, 6950, 6710, 6470, 6250, 6040, 5830,
309 5640, 5450, 5260, 5090, 4920, 4760, 4600, 4450, 4310, 4170,
310 4040, 3910, 3790, 3670, 3550
313 static struct twl4030_bci_platform_data sdp3430_bci_data = {
314 .battery_tmp_tbl = sdp3430_batt_table,
315 .tblsize = ARRAY_SIZE(sdp3430_batt_table),
318 static struct twl4030_gpio_platform_data sdp3430_gpio_data = {
319 .gpio_base = OMAP_MAX_GPIO_LINES,
320 .irq_base = TWL4030_GPIO_IRQ_BASE,
321 .irq_end = TWL4030_GPIO_IRQ_END,
324 static struct twl4030_usb_data sdp3430_usb_data = {
325 .usb_mode = T2_USB_MODE_ULPI,
328 static struct twl4030_madc_platform_data sdp3430_madc_data = {
332 static struct twl4030_platform_data sdp3430_twldata = {
333 .irq_base = TWL4030_IRQ_BASE,
334 .irq_end = TWL4030_IRQ_END,
336 /* platform_data for children goes here */
337 .bci = &sdp3430_bci_data,
338 .gpio = &sdp3430_gpio_data,
339 .madc = &sdp3430_madc_data,
340 .keypad = &sdp3430_kp_data,
341 .usb = &sdp3430_usb_data,
344 static struct i2c_board_info __initdata sdp3430_i2c_boardinfo[] = {
346 I2C_BOARD_INFO("twl4030", 0x48),
347 .flags = I2C_CLIENT_WAKE,
348 .irq = INT_34XX_SYS_NIRQ,
349 .platform_data = &sdp3430_twldata,
353 static int __init omap3430_i2c_init(void)
355 omap_register_i2c_bus(1, 2600, sdp3430_i2c_boardinfo,
356 ARRAY_SIZE(sdp3430_i2c_boardinfo));
357 omap_register_i2c_bus(2, 400, NULL, 0);
358 omap_register_i2c_bus(3, 400, NULL, 0);
362 extern void __init sdp3430_flash_init(void);
364 static void __init omap_3430sdp_init(void)
367 platform_add_devices(sdp3430_devices, ARRAY_SIZE(sdp3430_devices));
368 omap_board_config = sdp3430_config;
369 omap_board_config_size = ARRAY_SIZE(sdp3430_config);
370 if (system_rev > OMAP3430_REV_ES1_0)
371 ts_gpio = OMAP34XX_TS_GPIO_IRQ_SDPV2;
373 ts_gpio = OMAP34XX_TS_GPIO_IRQ_SDPV1;
374 sdp3430_spi_board_info[0].irq = OMAP_GPIO_IRQ(ts_gpio);
375 spi_register_board_info(sdp3430_spi_board_info,
376 ARRAY_SIZE(sdp3430_spi_board_info));
378 sdp3430_flash_init();
386 static void __init omap_3430sdp_map_io(void)
388 omap2_set_globals_343x();
389 omap2_map_common_io();
392 MACHINE_START(OMAP_3430SDP, "OMAP3430 3430SDP board")
393 /* Maintainer: Syed Khasim - Texas Instruments Inc */
394 .phys_io = 0x48000000,
395 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
396 .boot_params = 0x80000100,
397 .map_io = omap_3430sdp_map_io,
398 .init_irq = omap_3430sdp_init_irq,
399 .init_machine = omap_3430sdp_init,
400 .timer = &omap_timer,