2008-10-10 12:28:23 +04:00
/*
* linux / arch / arm / mach - omap2 / board - ldp . c
*
* Copyright ( C ) 2008 Texas Instruments Inc .
* Nishant Kamat < nskamat @ ti . com >
*
* Modified from mach - omap2 / board - 3430 sdp . c
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/platform_device.h>
# include <linux/delay.h>
# include <linux/input.h>
2009-10-23 01:43:17 +04:00
# include <linux/input/matrix_keypad.h>
2009-05-29 01:04:00 +04:00
# include <linux/gpio_keys.h>
2008-10-10 12:28:23 +04:00
# include <linux/workqueue.h>
# include <linux/err.h>
# include <linux/clk.h>
# include <linux/spi/spi.h>
# include <linux/spi/ads7846.h>
2009-05-29 01:04:00 +04:00
# include <linux/regulator/machine.h>
2008-12-11 04:37:17 +03:00
# include <linux/i2c/twl4030.h>
2009-03-25 13:21:35 +03:00
# include <linux/io.h>
2009-01-23 20:09:13 +03:00
# include <linux/smsc911x.h>
2008-10-10 12:28:23 +04:00
# include <mach/hardware.h>
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/map.h>
2009-10-20 20:40:47 +04:00
# include <plat/mcspi.h>
2008-10-10 12:28:23 +04:00
# include <mach/gpio.h>
2009-10-20 20:40:47 +04:00
# include <plat/board.h>
# include <plat/common.h>
# include <plat/gpmc.h>
2008-10-10 12:28:23 +04:00
# include <asm/delay.h>
2009-10-20 20:40:47 +04:00
# include <plat/control.h>
# include <plat/usb.h>
2008-10-10 12:28:23 +04:00
2008-12-11 04:37:17 +03:00
# include "mmc-twl4030.h"
2009-01-23 20:09:13 +03:00
# define LDP_SMSC911X_CS 1
# define LDP_SMSC911X_GPIO 152
2009-03-24 04:07:37 +03:00
# define DEBUG_BASE 0x08000000
# define LDP_ETHR_START DEBUG_BASE
2008-12-11 04:36:53 +03:00
2009-01-23 20:09:13 +03:00
static struct resource ldp_smsc911x_resources [ ] = {
2008-12-11 04:36:53 +03:00
[ 0 ] = {
2009-03-24 04:07:37 +03:00
. start = LDP_ETHR_START ,
. end = LDP_ETHR_START + SZ_4K ,
2008-12-11 04:36:53 +03:00
. flags = IORESOURCE_MEM ,
} ,
[ 1 ] = {
. start = 0 ,
. end = 0 ,
. flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL ,
} ,
} ;
2009-01-23 20:09:13 +03:00
static struct smsc911x_platform_config ldp_smsc911x_config = {
. irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW ,
. irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN ,
. flags = SMSC911X_USE_32BIT ,
. phy_interface = PHY_INTERFACE_MODE_MII ,
} ;
static struct platform_device ldp_smsc911x_device = {
. name = " smsc911x " ,
2008-12-11 04:36:53 +03:00
. id = - 1 ,
2009-01-23 20:09:13 +03:00
. num_resources = ARRAY_SIZE ( ldp_smsc911x_resources ) ,
. resource = ldp_smsc911x_resources ,
. dev = {
. platform_data = & ldp_smsc911x_config ,
} ,
2008-12-11 04:36:53 +03:00
} ;
2009-09-25 03:23:16 +04:00
static int board_keymap [ ] = {
2009-05-29 01:04:00 +04:00
KEY ( 0 , 0 , KEY_1 ) ,
KEY ( 1 , 0 , KEY_2 ) ,
KEY ( 2 , 0 , KEY_3 ) ,
KEY ( 0 , 1 , KEY_4 ) ,
KEY ( 1 , 1 , KEY_5 ) ,
KEY ( 2 , 1 , KEY_6 ) ,
KEY ( 3 , 1 , KEY_F5 ) ,
KEY ( 0 , 2 , KEY_7 ) ,
KEY ( 1 , 2 , KEY_8 ) ,
KEY ( 2 , 2 , KEY_9 ) ,
KEY ( 3 , 2 , KEY_F6 ) ,
KEY ( 0 , 3 , KEY_F7 ) ,
KEY ( 1 , 3 , KEY_0 ) ,
KEY ( 2 , 3 , KEY_F8 ) ,
PERSISTENT_KEY ( 4 , 5 ) ,
KEY ( 4 , 4 , KEY_VOLUMEUP ) ,
KEY ( 5 , 5 , KEY_VOLUMEDOWN ) ,
0
} ;
2009-09-25 03:23:16 +04:00
static struct matrix_keymap_data board_map_data = {
. keymap = board_keymap ,
. keymap_size = ARRAY_SIZE ( board_keymap ) ,
} ;
2009-05-29 01:04:00 +04:00
static struct twl4030_keypad_data ldp_kp_twl4030_data = {
2009-09-25 03:23:16 +04:00
. keymap_data = & board_map_data ,
2009-05-29 01:04:00 +04:00
. rows = 6 ,
. cols = 6 ,
. rep = 1 ,
} ;
static struct gpio_keys_button ldp_gpio_keys_buttons [ ] = {
[ 0 ] = {
. code = KEY_ENTER ,
. gpio = 101 ,
. desc = " enter sw " ,
. active_low = 1 ,
. debounce_interval = 30 ,
} ,
[ 1 ] = {
. code = KEY_F1 ,
. gpio = 102 ,
. desc = " func 1 " ,
. active_low = 1 ,
. debounce_interval = 30 ,
} ,
[ 2 ] = {
. code = KEY_F2 ,
. gpio = 103 ,
. desc = " func 2 " ,
. active_low = 1 ,
. debounce_interval = 30 ,
} ,
[ 3 ] = {
. code = KEY_F3 ,
. gpio = 104 ,
. desc = " func 3 " ,
. active_low = 1 ,
. debounce_interval = 30 ,
} ,
[ 4 ] = {
. code = KEY_F4 ,
. gpio = 105 ,
. desc = " func 4 " ,
. active_low = 1 ,
. debounce_interval = 30 ,
} ,
[ 5 ] = {
. code = KEY_LEFT ,
. gpio = 106 ,
. desc = " left sw " ,
. active_low = 1 ,
. debounce_interval = 30 ,
} ,
[ 6 ] = {
. code = KEY_RIGHT ,
. gpio = 107 ,
. desc = " right sw " ,
. active_low = 1 ,
. debounce_interval = 30 ,
} ,
[ 7 ] = {
. code = KEY_UP ,
. gpio = 108 ,
. desc = " up sw " ,
. active_low = 1 ,
. debounce_interval = 30 ,
} ,
[ 8 ] = {
. code = KEY_DOWN ,
. gpio = 109 ,
. desc = " down sw " ,
. active_low = 1 ,
. debounce_interval = 30 ,
} ,
} ;
static struct gpio_keys_platform_data ldp_gpio_keys = {
. buttons = ldp_gpio_keys_buttons ,
. nbuttons = ARRAY_SIZE ( ldp_gpio_keys_buttons ) ,
. rep = 1 ,
} ;
static struct platform_device ldp_gpio_keys_device = {
. name = " gpio-keys " ,
. id = - 1 ,
. dev = {
. platform_data = & ldp_gpio_keys ,
} ,
} ;
static int ts_gpio ;
/**
* @ brief ads7846_dev_init : Requests & sets GPIO line for pen - irq
*
* @ return - void . If request gpio fails then Flag KERN_ERR .
*/
static void ads7846_dev_init ( void )
{
if ( gpio_request ( ts_gpio , " ads7846 irq " ) < 0 ) {
printk ( KERN_ERR " can't get ads746 pen down GPIO \n " ) ;
return ;
}
gpio_direction_input ( ts_gpio ) ;
omap_set_gpio_debounce ( ts_gpio , 1 ) ;
omap_set_gpio_debounce_time ( ts_gpio , 0xa ) ;
}
static int ads7846_get_pendown_state ( void )
{
return ! gpio_get_value ( ts_gpio ) ;
}
static struct ads7846_platform_data tsc2046_config __initdata = {
. get_pendown_state = ads7846_get_pendown_state ,
. keep_vref_on = 1 ,
} ;
static struct omap2_mcspi_device_config tsc2046_mcspi_config = {
. turbo_mode = 0 ,
. single_channel = 1 , /* 0: slave, 1: master */
} ;
static struct spi_board_info ldp_spi_board_info [ ] __initdata = {
[ 0 ] = {
/*
* TSC2046 operates at a max freqency of 2 MHz , so
* operate slightly below at 1.5 MHz
*/
. modalias = " ads7846 " ,
. bus_num = 1 ,
. chip_select = 0 ,
. max_speed_hz = 1500000 ,
. controller_data = & tsc2046_mcspi_config ,
. irq = 0 ,
. platform_data = & tsc2046_config ,
} ,
} ;
2009-01-23 20:09:13 +03:00
static inline void __init ldp_init_smsc911x ( void )
2008-12-11 04:36:53 +03:00
{
int eth_cs ;
unsigned long cs_mem_base ;
int eth_gpio = 0 ;
2009-01-23 20:09:13 +03:00
eth_cs = LDP_SMSC911X_CS ;
2008-12-11 04:36:53 +03:00
if ( gpmc_cs_request ( eth_cs , SZ_16M , & cs_mem_base ) < 0 ) {
2009-01-23 20:09:13 +03:00
printk ( KERN_ERR " Failed to request GPMC mem for smsc911x \n " ) ;
2008-12-11 04:36:53 +03:00
return ;
}
2009-01-23 20:09:13 +03:00
ldp_smsc911x_resources [ 0 ] . start = cs_mem_base + 0x0 ;
ldp_smsc911x_resources [ 0 ] . end = cs_mem_base + 0xff ;
2008-12-11 04:36:53 +03:00
udelay ( 100 ) ;
2009-01-23 20:09:13 +03:00
eth_gpio = LDP_SMSC911X_GPIO ;
2008-12-11 04:36:53 +03:00
2009-01-23 20:09:13 +03:00
ldp_smsc911x_resources [ 1 ] . start = OMAP_GPIO_IRQ ( eth_gpio ) ;
2008-12-11 04:36:53 +03:00
2009-01-23 20:09:13 +03:00
if ( gpio_request ( eth_gpio , " smsc911x irq " ) < 0 ) {
printk ( KERN_ERR " Failed to request GPIO%d for smsc911x IRQ \n " ,
2008-12-11 04:36:53 +03:00
eth_gpio ) ;
return ;
}
gpio_direction_input ( eth_gpio ) ;
}
2009-05-29 01:04:00 +04:00
static struct platform_device ldp_lcd_device = {
. name = " ldp_lcd " ,
. id = - 1 ,
} ;
static struct omap_lcd_config ldp_lcd_config __initdata = {
. ctrl_name = " internal " ,
} ;
2008-10-10 12:28:23 +04:00
static struct omap_board_config_kernel ldp_config [ ] __initdata = {
2009-05-29 01:04:00 +04:00
{ OMAP_TAG_LCD , & ldp_lcd_config } ,
2008-10-10 12:28:23 +04:00
} ;
2009-09-03 21:14:02 +04:00
static void __init omap_ldp_init_irq ( void )
{
omap_board_config = ldp_config ;
omap_board_config_size = ARRAY_SIZE ( ldp_config ) ;
omap2_init_common_hw ( NULL , NULL ) ;
omap_init_irq ( ) ;
omap_gpio_init ( ) ;
ldp_init_smsc911x ( ) ;
}
2009-05-29 01:04:00 +04:00
static struct twl4030_usb_data ldp_usb_data = {
. usb_mode = T2_USB_MODE_ULPI ,
} ;
2008-12-11 04:37:17 +03:00
static struct twl4030_gpio_platform_data ldp_gpio_data = {
. gpio_base = OMAP_MAX_GPIO_LINES ,
. irq_base = TWL4030_GPIO_IRQ_BASE ,
. irq_end = TWL4030_GPIO_IRQ_END ,
} ;
2009-05-29 01:04:00 +04:00
static struct twl4030_madc_platform_data ldp_madc_data = {
. irq_line = 1 ,
} ;
static struct regulator_consumer_supply ldp_vmmc1_supply = {
. supply = " vmmc " ,
} ;
/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
static struct regulator_init_data ldp_vmmc1 = {
. constraints = {
. min_uV = 1850000 ,
. max_uV = 3150000 ,
. valid_modes_mask = REGULATOR_MODE_NORMAL
| REGULATOR_MODE_STANDBY ,
. valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
| REGULATOR_CHANGE_MODE
| REGULATOR_CHANGE_STATUS ,
} ,
. num_consumer_supplies = 1 ,
. consumer_supplies = & ldp_vmmc1_supply ,
} ;
2008-12-11 04:37:17 +03:00
static struct twl4030_platform_data ldp_twldata = {
. irq_base = TWL4030_IRQ_BASE ,
. irq_end = TWL4030_IRQ_END ,
/* platform_data for children goes here */
2009-05-29 01:04:00 +04:00
. madc = & ldp_madc_data ,
. usb = & ldp_usb_data ,
. vmmc1 = & ldp_vmmc1 ,
2008-12-11 04:37:17 +03:00
. gpio = & ldp_gpio_data ,
2009-05-29 01:04:00 +04:00
. keypad = & ldp_kp_twl4030_data ,
2008-12-11 04:37:17 +03:00
} ;
static struct i2c_board_info __initdata ldp_i2c_boardinfo [ ] = {
{
I2C_BOARD_INFO ( " twl4030 " , 0x48 ) ,
. flags = I2C_CLIENT_WAKE ,
. irq = INT_34XX_SYS_NIRQ ,
. platform_data = & ldp_twldata ,
} ,
} ;
2008-10-10 12:28:23 +04:00
static int __init omap_i2c_init ( void )
{
2008-12-11 04:37:17 +03:00
omap_register_i2c_bus ( 1 , 2600 , ldp_i2c_boardinfo ,
ARRAY_SIZE ( ldp_i2c_boardinfo ) ) ;
2008-10-10 12:28:23 +04:00
omap_register_i2c_bus ( 2 , 400 , NULL , 0 ) ;
omap_register_i2c_bus ( 3 , 400 , NULL , 0 ) ;
return 0 ;
}
2008-12-11 04:37:17 +03:00
static struct twl4030_hsmmc_info mmc [ ] __initdata = {
{
. mmc = 1 ,
. wires = 4 ,
. gpio_cd = - EINVAL ,
. gpio_wp = - EINVAL ,
} ,
{ } /* Terminator */
} ;
2009-05-29 01:04:00 +04:00
static struct platform_device * ldp_devices [ ] __initdata = {
& ldp_smsc911x_device ,
& ldp_lcd_device ,
2009-05-29 01:04:00 +04:00
& ldp_gpio_keys_device ,
2009-05-29 01:04:00 +04:00
} ;
2008-10-10 12:28:23 +04:00
static void __init omap_ldp_init ( void )
{
omap_i2c_init ( ) ;
2008-12-11 04:36:53 +03:00
platform_add_devices ( ldp_devices , ARRAY_SIZE ( ldp_devices ) ) ;
2009-05-29 01:04:00 +04:00
ts_gpio = 54 ;
ldp_spi_board_info [ 0 ] . irq = gpio_to_irq ( ts_gpio ) ;
spi_register_board_info ( ldp_spi_board_info ,
ARRAY_SIZE ( ldp_spi_board_info ) ) ;
ads7846_dev_init ( ) ;
2008-10-10 12:28:23 +04:00
omap_serial_init ( ) ;
2009-03-24 04:34:06 +03:00
usb_musb_init ( ) ;
2009-05-29 01:04:00 +04:00
twl4030_mmc_init ( mmc ) ;
/* link regulators to MMC adapters */
ldp_vmmc1_supply . dev = mmc [ 0 ] . dev ;
2008-10-10 12:28:23 +04:00
}
static void __init omap_ldp_map_io ( void )
{
omap2_set_globals_343x ( ) ;
omap2_map_common_io ( ) ;
}
MACHINE_START ( OMAP_LDP , " OMAP LDP board " )
. phys_io = 0x48000000 ,
2009-10-20 04:25:55 +04:00
. io_pg_offst = ( ( 0xfa000000 ) > > 18 ) & 0xfffc ,
2008-10-10 12:28:23 +04:00
. boot_params = 0x80000100 ,
. map_io = omap_ldp_map_io ,
. init_irq = omap_ldp_init_irq ,
. init_machine = omap_ldp_init ,
. timer = & omap_timer ,
MACHINE_END