2009-05-29 01:13:28 +04:00
/*
* linux / arch / arm / mach - omap2 / board - omap3evm . c
*
* Copyright ( C ) 2008 Texas Instruments
*
* Modified from mach - omap2 / board - 3430 sdp . c
*
* Initial code : Syed Mohammed Khasim
*
* 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/err.h>
# include <linux/clk.h>
# include <linux/gpio.h>
# include <linux/input.h>
2009-10-23 01:43:17 +04:00
# include <linux/input/matrix_keypad.h>
2009-05-29 01:13:28 +04:00
# include <linux/leds.h>
2009-11-22 21:11:30 +03:00
# include <linux/interrupt.h>
2009-05-29 01:13:28 +04:00
2012-06-20 13:14:49 +04:00
# include <linux/mtd/mtd.h>
# include <linux/mtd/partitions.h>
# include <linux/mtd/nand.h>
2009-05-29 01:13:28 +04:00
# include <linux/spi/spi.h>
# include <linux/spi/ads7846.h>
2009-12-15 17:39:02 +03:00
# include <linux/i2c/twl.h>
2009-07-29 10:28:57 +04:00
# include <linux/usb/otg.h>
2012-10-25 01:26:19 +04:00
# include <linux/usb/musb.h>
2012-07-19 14:32:15 +04:00
# include <linux/usb/nop-usb-xceiv.h>
2009-11-22 21:11:30 +03:00
# include <linux/smsc911x.h>
2009-05-29 01:13:28 +04:00
2011-01-27 12:49:49 +03:00
# include <linux/wl12xx.h>
# include <linux/regulator/fixed.h>
2009-11-22 21:11:29 +03:00
# include <linux/regulator/machine.h>
2010-09-15 18:49:23 +04:00
# include <linux/mmc/host.h>
2011-08-01 00:17:29 +04:00
# include <linux/export.h>
2009-11-22 21:11:29 +03:00
2009-05-29 01:13:28 +04:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/map.h>
2012-08-24 17:21:06 +04:00
# include <linux/platform_data/mtd-nand-omap2.h>
2011-11-11 01:45:17 +04:00
# include "common.h"
2012-08-24 17:21:06 +04:00
# include <linux/platform_data/spi-omap2-mcspi.h>
2011-05-11 15:05:07 +04:00
# include <video/omapdss.h>
2011-12-22 13:12:13 +04:00
# include <video/omap-panel-tfp410.h>
2009-05-29 01:13:28 +04:00
2012-10-06 00:25:59 +04:00
# include "soc.h"
2009-12-12 03:16:32 +03:00
# include "mux.h"
2009-05-29 01:13:28 +04:00
# include "sdram-micron-mt46h32m32lf-6.h"
2010-02-15 21:03:34 +03:00
# include "hsmmc.h"
2011-04-25 02:09:05 +04:00
# include "common-board-devices.h"
2012-02-29 16:41:56 +04:00
# include "board-flash.h"
# define NAND_CS 0
2009-05-29 01:13:28 +04:00
2012-08-07 00:22:15 +04:00
# define OMAP3_EVM_TS_GPIO 175
2009-11-22 21:11:28 +03:00
# define OMAP3_EVM_EHCI_VBUS 22
# define OMAP3_EVM_EHCI_SELECT 61
2009-05-29 01:13:28 +04:00
# define OMAP3EVM_ETHR_START 0x2c000000
# define OMAP3EVM_ETHR_SIZE 1024
2009-11-22 21:11:27 +03:00
# define OMAP3EVM_ETHR_ID_REV 0x50
2009-05-29 01:13:28 +04:00
# define OMAP3EVM_ETHR_GPIO_IRQ 176
2009-11-22 21:11:30 +03:00
# define OMAP3EVM_SMSC911X_CS 5
2011-01-24 22:25:55 +03:00
/*
* Eth Reset signal
* 64 = Generation 1 ( < = RevD )
* 7 = Generation 2 ( > = RevE )
*/
# define OMAP3EVM_GEN1_ETHR_GPIO_RST 64
# define OMAP3EVM_GEN2_ETHR_GPIO_RST 7
2009-05-29 01:13:28 +04:00
2012-08-29 03:18:50 +04:00
/*
* OMAP35x EVM revision
* Run time detection of EVM revision is done by reading Ethernet
* PHY ID -
* GEN_1 = 0x01150000
* GEN_2 = 0x92200000
*/
enum {
OMAP3EVM_BOARD_GEN_1 = 0 , /* EVM Rev between A - D */
OMAP3EVM_BOARD_GEN_2 , /* EVM Rev >= Rev E */
} ;
2009-11-22 21:11:27 +03:00
static u8 omap3_evm_version ;
2012-10-07 23:10:00 +04:00
static u8 get_omap3_evm_rev ( void )
2009-11-22 21:11:27 +03:00
{
return omap3_evm_version ;
}
static void __init omap3_evm_get_revision ( void )
{
void __iomem * ioaddr ;
unsigned int smsc_id ;
/* Ethernet PHY ID is stored at ID_REV register */
ioaddr = ioremap_nocache ( OMAP3EVM_ETHR_START , SZ_1K ) ;
if ( ! ioaddr )
return ;
smsc_id = readl ( ioaddr + OMAP3EVM_ETHR_ID_REV ) & 0xFFFF0000 ;
iounmap ( ioaddr ) ;
switch ( smsc_id ) {
/*SMSC9115 chipset*/
case 0x01150000 :
omap3_evm_version = OMAP3EVM_BOARD_GEN_1 ;
break ;
/*SMSC 9220 chipset*/
case 0x92200000 :
default :
omap3_evm_version = OMAP3EVM_BOARD_GEN_2 ;
}
}
2009-11-22 21:11:30 +03:00
# if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
2012-09-20 22:41:46 +04:00
# include "gpmc-smsc911x.h"
2009-05-29 01:13:28 +04:00
2011-04-17 02:29:30 +04:00
static struct omap_smsc911x_platform_data smsc911x_cfg = {
. cs = OMAP3EVM_SMSC911X_CS ,
. gpio_irq = OMAP3EVM_ETHR_GPIO_IRQ ,
. gpio_reset = - EINVAL ,
. flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS ,
2009-05-29 01:13:28 +04:00
} ;
2009-11-22 21:11:30 +03:00
static inline void __init omap3evm_init_smsc911x ( void )
2009-05-29 01:13:28 +04:00
{
2011-01-24 22:25:55 +03:00
/* Configure ethernet controller reset gpio */
if ( cpu_is_omap3430 ( ) ) {
2011-04-17 02:29:30 +04:00
if ( get_omap3_evm_rev ( ) = = OMAP3EVM_BOARD_GEN_1 )
smsc911x_cfg . gpio_reset = OMAP3EVM_GEN1_ETHR_GPIO_RST ;
else
smsc911x_cfg . gpio_reset = OMAP3EVM_GEN2_ETHR_GPIO_RST ;
2009-05-29 01:13:28 +04:00
}
2011-04-17 02:29:30 +04:00
gpmc_smsc911x_init ( & smsc911x_cfg ) ;
2009-05-29 01:13:28 +04:00
}
2009-11-22 21:11:30 +03:00
# else
static inline void __init omap3evm_init_smsc911x ( void ) { return ; }
# endif
2010-01-04 17:34:16 +03:00
/*
* OMAP3EVM LCD Panel control signals
*/
# define OMAP3EVM_LCD_PANEL_LR 2
# define OMAP3EVM_LCD_PANEL_UD 3
# define OMAP3EVM_LCD_PANEL_INI 152
# define OMAP3EVM_LCD_PANEL_ENVDD 153
# define OMAP3EVM_LCD_PANEL_QVGA 154
# define OMAP3EVM_LCD_PANEL_RESB 155
# define OMAP3EVM_LCD_PANEL_BKLIGHT_GPIO 210
# define OMAP3EVM_DVI_PANEL_EN_GPIO 199
2011-05-03 19:22:09 +04:00
static struct gpio omap3_evm_dss_gpios [ ] __initdata = {
{ OMAP3EVM_LCD_PANEL_RESB , GPIOF_OUT_INIT_HIGH , " lcd_panel_resb " } ,
{ OMAP3EVM_LCD_PANEL_INI , GPIOF_OUT_INIT_HIGH , " lcd_panel_ini " } ,
{ OMAP3EVM_LCD_PANEL_QVGA , GPIOF_OUT_INIT_LOW , " lcd_panel_qvga " } ,
{ OMAP3EVM_LCD_PANEL_LR , GPIOF_OUT_INIT_HIGH , " lcd_panel_lr " } ,
{ OMAP3EVM_LCD_PANEL_UD , GPIOF_OUT_INIT_HIGH , " lcd_panel_ud " } ,
{ OMAP3EVM_LCD_PANEL_ENVDD , GPIOF_OUT_INIT_LOW , " lcd_panel_envdd " } ,
} ;
2010-01-04 17:34:16 +03:00
static int lcd_enabled ;
static int dvi_enabled ;
static void __init omap3_evm_display_init ( void )
{
int r ;
2011-05-03 19:22:09 +04:00
r = gpio_request_array ( omap3_evm_dss_gpios ,
ARRAY_SIZE ( omap3_evm_dss_gpios ) ) ;
if ( r )
printk ( KERN_ERR " failed to get lcd_panel_* gpios \n " ) ;
2010-01-04 17:34:16 +03:00
}
static int omap3_evm_enable_lcd ( struct omap_dss_device * dssdev )
{
if ( dvi_enabled ) {
printk ( KERN_ERR " cannot enable LCD, DVI is enabled \n " ) ;
return - EINVAL ;
}
gpio_set_value ( OMAP3EVM_LCD_PANEL_ENVDD , 0 ) ;
if ( get_omap3_evm_rev ( ) > = OMAP3EVM_BOARD_GEN_2 )
2011-01-25 20:37:37 +03:00
gpio_set_value_cansleep ( OMAP3EVM_LCD_PANEL_BKLIGHT_GPIO , 0 ) ;
2010-01-04 17:34:16 +03:00
else
2011-01-25 20:37:37 +03:00
gpio_set_value_cansleep ( OMAP3EVM_LCD_PANEL_BKLIGHT_GPIO , 1 ) ;
2010-01-04 17:34:16 +03:00
lcd_enabled = 1 ;
return 0 ;
}
static void omap3_evm_disable_lcd ( struct omap_dss_device * dssdev )
{
gpio_set_value ( OMAP3EVM_LCD_PANEL_ENVDD , 1 ) ;
if ( get_omap3_evm_rev ( ) > = OMAP3EVM_BOARD_GEN_2 )
2011-01-25 20:37:37 +03:00
gpio_set_value_cansleep ( OMAP3EVM_LCD_PANEL_BKLIGHT_GPIO , 1 ) ;
2010-01-04 17:34:16 +03:00
else
2011-01-25 20:37:37 +03:00
gpio_set_value_cansleep ( OMAP3EVM_LCD_PANEL_BKLIGHT_GPIO , 0 ) ;
2010-01-04 17:34:16 +03:00
lcd_enabled = 0 ;
}
static struct omap_dss_device omap3_evm_lcd_device = {
. name = " lcd " ,
. driver_name = " sharp_ls_panel " ,
. type = OMAP_DISPLAY_TYPE_DPI ,
. phy . dpi . data_lines = 18 ,
. platform_enable = omap3_evm_enable_lcd ,
. platform_disable = omap3_evm_disable_lcd ,
} ;
static int omap3_evm_enable_tv ( struct omap_dss_device * dssdev )
{
return 0 ;
}
static void omap3_evm_disable_tv ( struct omap_dss_device * dssdev )
{
}
static struct omap_dss_device omap3_evm_tv_device = {
. name = " tv " ,
. driver_name = " venc " ,
. type = OMAP_DISPLAY_TYPE_VENC ,
. phy . venc . type = OMAP_DSS_VENC_TYPE_SVIDEO ,
. platform_enable = omap3_evm_enable_tv ,
. platform_disable = omap3_evm_disable_tv ,
} ;
2012-03-05 16:29:28 +04:00
static struct tfp410_platform_data dvi_panel = {
2012-02-17 15:30:27 +04:00
. power_down_gpio = OMAP3EVM_DVI_PANEL_EN_GPIO ,
2010-11-17 16:34:34 +03:00
} ;
2010-01-04 17:34:16 +03:00
static struct omap_dss_device omap3_evm_dvi_device = {
. name = " dvi " ,
. type = OMAP_DISPLAY_TYPE_DPI ,
2012-03-05 16:29:28 +04:00
. driver_name = " tfp410 " ,
2010-11-17 16:34:34 +03:00
. data = & dvi_panel ,
2010-01-04 17:34:16 +03:00
. phy . dpi . data_lines = 24 ,
} ;
static struct omap_dss_device * omap3_evm_dss_devices [ ] = {
& omap3_evm_lcd_device ,
& omap3_evm_tv_device ,
& omap3_evm_dvi_device ,
} ;
static struct omap_dss_board_info omap3_evm_dss_data = {
. num_devices = ARRAY_SIZE ( omap3_evm_dss_devices ) ,
. devices = omap3_evm_dss_devices ,
. default_device = & omap3_evm_lcd_device ,
} ;
2011-06-06 22:57:07 +04:00
static struct regulator_consumer_supply omap3evm_vmmc1_supply [ ] = {
REGULATOR_SUPPLY ( " vmmc " , " omap_hsmmc.0 " ) ,
2009-11-22 21:11:29 +03:00
} ;
2011-06-06 22:57:07 +04:00
static struct regulator_consumer_supply omap3evm_vsim_supply [ ] = {
REGULATOR_SUPPLY ( " vmmc_aux " , " omap_hsmmc.0 " ) ,
2009-11-22 21:11:29 +03:00
} ;
/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
static struct regulator_init_data omap3evm_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 ,
} ,
2011-06-06 22:57:07 +04:00
. num_consumer_supplies = ARRAY_SIZE ( omap3evm_vmmc1_supply ) ,
. consumer_supplies = omap3evm_vmmc1_supply ,
2009-11-22 21:11:29 +03:00
} ;
/* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */
static struct regulator_init_data omap3evm_vsim = {
. constraints = {
. min_uV = 1800000 ,
. max_uV = 3000000 ,
. valid_modes_mask = REGULATOR_MODE_NORMAL
| REGULATOR_MODE_STANDBY ,
. valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
| REGULATOR_CHANGE_MODE
| REGULATOR_CHANGE_STATUS ,
} ,
2011-06-06 22:57:07 +04:00
. num_consumer_supplies = ARRAY_SIZE ( omap3evm_vsim_supply ) ,
. consumer_supplies = omap3evm_vsim_supply ,
2009-11-22 21:11:29 +03:00
} ;
2010-02-15 21:03:34 +03:00
static struct omap2_hsmmc_info mmc [ ] = {
2009-05-29 01:13:28 +04:00
{
. mmc = 1 ,
2010-09-15 18:49:23 +04:00
. caps = MMC_CAP_4_BIT_DATA ,
2009-05-29 01:13:28 +04:00
. gpio_cd = - EINVAL ,
. gpio_wp = 63 ,
2012-02-20 21:43:29 +04:00
. deferred = true ,
2009-05-29 01:13:28 +04:00
} ,
2011-01-27 12:49:49 +03:00
# ifdef CONFIG_WL12XX_PLATFORM_DATA
{
. name = " wl1271 " ,
2011-02-27 13:45:18 +03:00
. mmc = 2 ,
2011-01-27 12:49:49 +03:00
. caps = MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD ,
. gpio_wp = - EINVAL ,
. gpio_cd = - EINVAL ,
. nonremovable = true ,
} ,
# endif
2009-05-29 01:13:28 +04:00
{ } /* Terminator */
} ;
static struct gpio_led gpio_leds [ ] = {
{
. name = " omap3evm::ledb " ,
/* normally not visible (board underside) */
. default_trigger = " default-on " ,
. gpio = - EINVAL , /* gets replaced */
. active_low = true ,
} ,
} ;
static struct gpio_led_platform_data gpio_led_info = {
. leds = gpio_leds ,
. num_leds = ARRAY_SIZE ( gpio_leds ) ,
} ;
static struct platform_device leds_gpio = {
. name = " leds-gpio " ,
. id = - 1 ,
. dev = {
. platform_data = & gpio_led_info ,
} ,
} ;
static int omap3evm_twl_gpio_setup ( struct device * dev ,
unsigned gpio , unsigned ngpio )
{
2011-05-03 19:22:09 +04:00
int r , lcd_bl_en ;
2011-01-25 20:37:40 +03:00
2009-05-29 01:13:28 +04:00
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
mmc [ 0 ] . gpio_cd = gpio + 0 ;
2012-02-20 21:43:29 +04:00
omap_hsmmc_late_init ( mmc ) ;
2009-05-29 01:13:28 +04:00
/*
* Most GPIOs are for USB OTG . Some are mostly sent to
* the P2 connector ; notably LEDA for the LCD backlight .
*/
2010-01-04 17:34:16 +03:00
/* TWL4030_GPIO_MAX + 0 == ledA, LCD Backlight control */
2011-05-03 19:22:09 +04:00
lcd_bl_en = get_omap3_evm_rev ( ) > = OMAP3EVM_BOARD_GEN_2 ?
GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW ;
r = gpio_request_one ( gpio + TWL4030_GPIO_MAX , lcd_bl_en , " EN_LCD_BKL " ) ;
2011-01-25 20:37:40 +03:00
if ( r )
printk ( KERN_ERR " failed to get/set lcd_bkl gpio \n " ) ;
2010-01-04 17:34:16 +03:00
/* gpio + 7 == DVI Enable */
2011-05-03 19:22:09 +04:00
gpio_request_one ( gpio + 7 , GPIOF_OUT_INIT_LOW , " EN_DVI " ) ;
2010-01-04 17:34:16 +03:00
2009-05-29 01:13:28 +04:00
/* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */
2012-02-13 12:35:22 +04:00
gpio_leds [ 0 ] . gpio = gpio + TWL4030_GPIO_MAX + 1 ;
2009-05-29 01:13:28 +04:00
platform_device_register ( & leds_gpio ) ;
2012-06-20 13:14:51 +04:00
/* Enable VBUS switch by setting TWL4030.GPIO2DIR as output
* for starting USB tranceiver
*/
2012-07-10 10:22:24 +04:00
# ifdef CONFIG_TWL4030_CORE
2012-06-20 13:14:51 +04:00
if ( get_omap3_evm_rev ( ) > = OMAP3EVM_BOARD_GEN_2 ) {
u8 val ;
twl_i2c_read_u8 ( TWL4030_MODULE_GPIO , & val , REG_GPIODATADIR1 ) ;
val | = 0x04 ; /* TWL4030.GPIO2DIR BIT at GPIODATADIR1(0x9B) */
twl_i2c_write_u8 ( TWL4030_MODULE_GPIO , val , REG_GPIODATADIR1 ) ;
}
2012-07-10 10:22:24 +04:00
# endif
2012-06-20 13:14:51 +04:00
2009-05-29 01:13:28 +04:00
return 0 ;
}
static struct twl4030_gpio_platform_data omap3evm_gpio_data = {
. use_leds = true ,
. setup = omap3evm_twl_gpio_setup ,
} ;
2010-10-08 21:01:13 +04:00
static uint32_t board_keymap [ ] = {
2009-05-29 01:13:28 +04:00
KEY ( 0 , 0 , KEY_LEFT ) ,
2010-02-18 01:09:24 +03:00
KEY ( 0 , 1 , KEY_DOWN ) ,
KEY ( 0 , 2 , KEY_ENTER ) ,
KEY ( 0 , 3 , KEY_M ) ,
KEY ( 1 , 0 , KEY_RIGHT ) ,
2009-05-29 01:13:28 +04:00
KEY ( 1 , 1 , KEY_UP ) ,
2010-02-18 01:09:24 +03:00
KEY ( 1 , 2 , KEY_I ) ,
KEY ( 1 , 3 , KEY_N ) ,
KEY ( 2 , 0 , KEY_A ) ,
KEY ( 2 , 1 , KEY_E ) ,
2009-05-29 01:13:28 +04:00
KEY ( 2 , 2 , KEY_J ) ,
2010-02-18 01:09:24 +03:00
KEY ( 2 , 3 , KEY_O ) ,
KEY ( 3 , 0 , KEY_B ) ,
KEY ( 3 , 1 , KEY_F ) ,
KEY ( 3 , 2 , KEY_K ) ,
2009-05-29 01:13:28 +04:00
KEY ( 3 , 3 , KEY_P )
} ;
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:13:28 +04:00
static struct twl4030_keypad_data omap3evm_kp_data = {
2009-09-25 03:23:16 +04:00
. keymap_data = & board_map_data ,
2009-05-29 01:13:28 +04:00
. rows = 4 ,
. cols = 4 ,
. rep = 1 ,
} ;
2011-01-25 20:37:38 +03:00
/* ads7846 on SPI */
2011-06-06 22:57:07 +04:00
static struct regulator_consumer_supply omap3evm_vio_supply [ ] = {
REGULATOR_SUPPLY ( " vcc " , " spi1.0 " ) ,
} ;
2011-01-25 20:37:38 +03:00
/* VIO for ads7846 */
static struct regulator_init_data omap3evm_vio = {
. constraints = {
. min_uV = 1800000 ,
. max_uV = 1800000 ,
. apply_uV = true ,
. valid_modes_mask = REGULATOR_MODE_NORMAL
| REGULATOR_MODE_STANDBY ,
. valid_ops_mask = REGULATOR_CHANGE_MODE
| REGULATOR_CHANGE_STATUS ,
} ,
2011-06-06 22:57:07 +04:00
. num_consumer_supplies = ARRAY_SIZE ( omap3evm_vio_supply ) ,
. consumer_supplies = omap3evm_vio_supply ,
2011-01-25 20:37:38 +03:00
} ;
2011-01-27 12:49:49 +03:00
# ifdef CONFIG_WL12XX_PLATFORM_DATA
# define OMAP3EVM_WLAN_PMENA_GPIO (150)
# define OMAP3EVM_WLAN_IRQ_GPIO (149)
2011-06-06 22:57:07 +04:00
static struct regulator_consumer_supply omap3evm_vmmc2_supply [ ] = {
2011-06-28 14:16:55 +04:00
REGULATOR_SUPPLY ( " vmmc " , " omap_hsmmc.1 " ) ,
2011-06-06 22:57:07 +04:00
} ;
2011-01-27 12:49:49 +03:00
/* VMMC2 for driving the WL12xx module */
static struct regulator_init_data omap3evm_vmmc2 = {
. constraints = {
. valid_ops_mask = REGULATOR_CHANGE_STATUS ,
} ,
2011-06-28 14:16:55 +04:00
. num_consumer_supplies = ARRAY_SIZE ( omap3evm_vmmc2_supply ) ,
2011-06-06 22:57:07 +04:00
. consumer_supplies = omap3evm_vmmc2_supply ,
2011-01-27 12:49:49 +03:00
} ;
static struct fixed_voltage_config omap3evm_vwlan = {
. supply_name = " vwl1271 " ,
. microvolts = 1800000 , /* 1.80V */
. gpio = OMAP3EVM_WLAN_PMENA_GPIO ,
. startup_delay = 70000 , /* 70ms */
. enable_high = 1 ,
. enabled_at_boot = 0 ,
. init_data = & omap3evm_vmmc2 ,
} ;
2011-02-27 13:45:18 +03:00
static struct platform_device omap3evm_wlan_regulator = {
2011-01-27 12:49:49 +03:00
. name = " reg-fixed-voltage " ,
. id = 1 ,
. dev = {
. platform_data = & omap3evm_vwlan ,
} ,
} ;
struct wl12xx_platform_data omap3evm_wlan_data __initdata = {
2011-02-27 13:45:18 +03:00
. board_ref_clock = WL12XX_REFCLOCK_38 , /* 38.4 MHz */
2011-01-27 12:49:49 +03:00
} ;
# endif
2012-06-20 13:14:50 +04:00
/* VAUX2 for USB */
static struct regulator_consumer_supply omap3evm_vaux2_supplies [ ] = {
REGULATOR_SUPPLY ( " VDD_CSIPHY1 " , " omap3isp " ) , /* OMAP ISP */
REGULATOR_SUPPLY ( " VDD_CSIPHY2 " , " omap3isp " ) , /* OMAP ISP */
REGULATOR_SUPPLY ( " hsusb1 " , " ehci-omap.0 " ) ,
REGULATOR_SUPPLY ( " vaux2 " , NULL ) ,
} ;
static struct regulator_init_data omap3evm_vaux2 = {
. constraints = {
. min_uV = 2800000 ,
. max_uV = 2800000 ,
. apply_uV = true ,
. valid_modes_mask = REGULATOR_MODE_NORMAL
| REGULATOR_MODE_STANDBY ,
. valid_ops_mask = REGULATOR_CHANGE_MODE
| REGULATOR_CHANGE_STATUS ,
} ,
. num_consumer_supplies = ARRAY_SIZE ( omap3evm_vaux2_supplies ) ,
. consumer_supplies = omap3evm_vaux2_supplies ,
} ;
2009-05-29 01:13:28 +04:00
static struct twl4030_platform_data omap3evm_twldata = {
/* platform_data for children goes here */
. keypad = & omap3evm_kp_data ,
. gpio = & omap3evm_gpio_data ,
2011-01-25 20:37:38 +03:00
. vio = & omap3evm_vio ,
2011-04-25 02:09:06 +04:00
. vmmc1 = & omap3evm_vmmc1 ,
. vsim = & omap3evm_vsim ,
2009-05-29 01:13:28 +04:00
} ;
static int __init omap3_evm_i2c_init ( void )
{
2011-06-07 11:28:54 +04:00
omap3_pmic_get_config ( & omap3evm_twldata ,
2011-06-07 12:38:24 +04:00
TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_MADC |
TWL_COMMON_PDATA_AUDIO ,
TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2 ) ;
omap3evm_twldata . vdac - > constraints . apply_uV = true ;
omap3evm_twldata . vpll2 - > constraints . apply_uV = true ;
2011-04-25 02:09:06 +04:00
omap3_pmic_init ( " twl4030 " , & omap3evm_twldata ) ;
2009-05-29 01:13:28 +04:00
omap_register_i2c_bus ( 2 , 400 , NULL , 0 ) ;
omap_register_i2c_bus ( 3 , 400 , NULL , 0 ) ;
return 0 ;
}
2011-03-01 17:38:16 +03:00
static struct usbhs_omap_board_data usbhs_bdata __initdata = {
2009-11-22 21:11:01 +03:00
2011-03-01 17:38:16 +03:00
. port_mode [ 0 ] = OMAP_USBHS_PORT_MODE_UNUSED ,
. port_mode [ 1 ] = OMAP_EHCI_PORT_MODE_PHY ,
. port_mode [ 2 ] = OMAP_USBHS_PORT_MODE_UNUSED ,
2009-11-22 21:11:01 +03:00
. phy_reset = true ,
2009-11-22 21:11:28 +03:00
/* PHY reset GPIO will be runtime programmed based on EVM version */
2009-11-22 21:11:01 +03:00
. reset_gpio_port [ 0 ] = - EINVAL ,
2009-11-22 21:11:28 +03:00
. reset_gpio_port [ 1 ] = - EINVAL ,
2009-11-22 21:11:01 +03:00
. reset_gpio_port [ 2 ] = - EINVAL
} ;
2009-12-12 03:16:32 +03:00
# ifdef CONFIG_OMAP_MUX
2011-01-25 20:37:39 +03:00
static struct omap_board_mux omap35x_board_mux [ ] __initdata = {
2010-02-18 01:09:23 +03:00
OMAP3_MUX ( SYS_NIRQ , OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP |
2010-05-03 15:37:51 +04:00
OMAP_PIN_OFF_INPUT_PULLUP | OMAP_PIN_OFF_OUTPUT_LOW |
2010-02-18 01:09:23 +03:00
OMAP_PIN_OFF_WAKEUPENABLE ) ,
2010-02-18 01:09:24 +03:00
OMAP3_MUX ( MCSPI1_CS1 , OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP |
2011-01-25 20:37:41 +03:00
OMAP_PIN_OFF_INPUT_PULLUP | OMAP_PIN_OFF_OUTPUT_LOW |
OMAP_PIN_OFF_WAKEUPENABLE ) ,
2011-01-24 22:25:55 +03:00
OMAP3_MUX ( SYS_BOOT5 , OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP |
OMAP_PIN_OFF_NONE ) ,
OMAP3_MUX ( GPMC_WAIT2 , OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP |
OMAP_PIN_OFF_NONE ) ,
2011-01-27 12:49:49 +03:00
# ifdef CONFIG_WL12XX_PLATFORM_DATA
/* WLAN IRQ - GPIO 149 */
2011-02-27 13:45:18 +03:00
OMAP3_MUX ( UART1_RTS , OMAP_MUX_MODE4 | OMAP_PIN_INPUT ) ,
2011-01-27 12:49:49 +03:00
/* WLAN POWER ENABLE - GPIO 150 */
OMAP3_MUX ( UART1_CTS , OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT ) ,
/* MMC2 SDIO pin muxes for WL12xx */
OMAP3_MUX ( SDMMC2_CLK , OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP ) ,
OMAP3_MUX ( SDMMC2_CMD , OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP ) ,
OMAP3_MUX ( SDMMC2_DAT0 , OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP ) ,
OMAP3_MUX ( SDMMC2_DAT1 , OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP ) ,
OMAP3_MUX ( SDMMC2_DAT2 , OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP ) ,
OMAP3_MUX ( SDMMC2_DAT3 , OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP ) ,
# endif
2009-12-12 03:16:32 +03:00
{ . reg_offset = OMAP_MUX_TERMINATOR } ,
} ;
2011-01-25 20:37:39 +03:00
static struct omap_board_mux omap36x_board_mux [ ] __initdata = {
2010-02-18 01:09:23 +03:00
OMAP3_MUX ( SYS_NIRQ , OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP |
2010-05-03 15:37:51 +04:00
OMAP_PIN_OFF_INPUT_PULLUP | OMAP_PIN_OFF_OUTPUT_LOW |
2010-02-18 01:09:23 +03:00
OMAP_PIN_OFF_WAKEUPENABLE ) ,
2010-02-18 01:09:24 +03:00
OMAP3_MUX ( MCSPI1_CS1 , OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP |
2011-01-25 20:37:41 +03:00
OMAP_PIN_OFF_INPUT_PULLUP | OMAP_PIN_OFF_OUTPUT_LOW |
OMAP_PIN_OFF_WAKEUPENABLE ) ,
2011-01-25 20:37:39 +03:00
/* AM/DM37x EVM: DSS data bus muxed with sys_boot */
OMAP3_MUX ( DSS_DATA18 , OMAP_MUX_MODE3 | OMAP_PIN_OFF_NONE ) ,
OMAP3_MUX ( DSS_DATA19 , OMAP_MUX_MODE3 | OMAP_PIN_OFF_NONE ) ,
OMAP3_MUX ( DSS_DATA22 , OMAP_MUX_MODE3 | OMAP_PIN_OFF_NONE ) ,
OMAP3_MUX ( DSS_DATA21 , OMAP_MUX_MODE3 | OMAP_PIN_OFF_NONE ) ,
OMAP3_MUX ( DSS_DATA22 , OMAP_MUX_MODE3 | OMAP_PIN_OFF_NONE ) ,
OMAP3_MUX ( DSS_DATA23 , OMAP_MUX_MODE3 | OMAP_PIN_OFF_NONE ) ,
OMAP3_MUX ( SYS_BOOT0 , OMAP_MUX_MODE3 | OMAP_PIN_OFF_NONE ) ,
OMAP3_MUX ( SYS_BOOT1 , OMAP_MUX_MODE3 | OMAP_PIN_OFF_NONE ) ,
OMAP3_MUX ( SYS_BOOT3 , OMAP_MUX_MODE3 | OMAP_PIN_OFF_NONE ) ,
OMAP3_MUX ( SYS_BOOT4 , OMAP_MUX_MODE3 | OMAP_PIN_OFF_NONE ) ,
OMAP3_MUX ( SYS_BOOT5 , OMAP_MUX_MODE3 | OMAP_PIN_OFF_NONE ) ,
OMAP3_MUX ( SYS_BOOT6 , OMAP_MUX_MODE3 | OMAP_PIN_OFF_NONE ) ,
2011-02-27 13:45:18 +03:00
# ifdef CONFIG_WL12XX_PLATFORM_DATA
/* WLAN IRQ - GPIO 149 */
OMAP3_MUX ( UART1_RTS , OMAP_MUX_MODE4 | OMAP_PIN_INPUT ) ,
/* WLAN POWER ENABLE - GPIO 150 */
OMAP3_MUX ( UART1_CTS , OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT ) ,
/* MMC2 SDIO pin muxes for WL12xx */
OMAP3_MUX ( SDMMC2_CLK , OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP ) ,
OMAP3_MUX ( SDMMC2_CMD , OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP ) ,
OMAP3_MUX ( SDMMC2_DAT0 , OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP ) ,
OMAP3_MUX ( SDMMC2_DAT1 , OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP ) ,
OMAP3_MUX ( SDMMC2_DAT2 , OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP ) ,
OMAP3_MUX ( SDMMC2_DAT3 , OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP ) ,
# endif
2011-01-25 20:37:39 +03:00
2009-12-12 03:16:32 +03:00
{ . reg_offset = OMAP_MUX_TERMINATOR } ,
} ;
2011-01-25 20:37:39 +03:00
# else
# define omap35x_board_mux NULL
# define omap36x_board_mux NULL
2009-12-12 03:16:32 +03:00
# endif
2010-02-18 01:09:30 +03:00
static struct omap_musb_board_data musb_board_data = {
. interface_type = MUSB_INTERFACE_ULPI ,
. mode = MUSB_OTG ,
. power = 100 ,
} ;
2011-05-03 19:22:09 +04:00
static struct gpio omap3_evm_ehci_gpios [ ] __initdata = {
{ OMAP3_EVM_EHCI_VBUS , GPIOF_OUT_INIT_HIGH , " enable EHCI VBUS " } ,
{ OMAP3_EVM_EHCI_SELECT , GPIOF_OUT_INIT_LOW , " select EHCI port " } ,
} ;
2012-02-07 15:03:23 +04:00
static void __init omap3_evm_wl12xx_init ( void )
{
# ifdef CONFIG_WL12XX_PLATFORM_DATA
int ret ;
/* WL12xx WLAN Init */
2012-03-29 19:41:01 +04:00
omap3evm_wlan_data . irq = gpio_to_irq ( OMAP3EVM_WLAN_IRQ_GPIO ) ;
2012-02-07 15:03:23 +04:00
ret = wl12xx_set_platform_data ( & omap3evm_wlan_data ) ;
if ( ret )
pr_err ( " error setting wl12xx data: %d \n " , ret ) ;
ret = platform_device_register ( & omap3evm_wlan_regulator ) ;
if ( ret )
pr_err ( " error registering wl12xx device: %d \n " , ret ) ;
# endif
}
2012-03-23 13:21:37 +04:00
static struct regulator_consumer_supply dummy_supplies [ ] = {
REGULATOR_SUPPLY ( " vddvario " , " smsc911x.0 " ) ,
REGULATOR_SUPPLY ( " vdd33a " , " smsc911x.0 " ) ,
} ;
2012-06-20 13:14:49 +04:00
static struct mtd_partition omap3evm_nand_partitions [ ] = {
/* All the partition sizes are listed in terms of NAND block size */
{
. name = " X-Loader " ,
. offset = 0 ,
. size = 4 * ( SZ_128K ) ,
. mask_flags = MTD_WRITEABLE
} ,
{
. name = " U-Boot " ,
. offset = MTDPART_OFS_APPEND ,
. size = 14 * ( SZ_128K ) ,
. mask_flags = MTD_WRITEABLE
} ,
{
. name = " U-Boot Env " ,
. offset = MTDPART_OFS_APPEND ,
. size = 2 * ( SZ_128K )
} ,
{
. name = " Kernel " ,
. offset = MTDPART_OFS_APPEND ,
. size = 40 * ( SZ_128K )
} ,
{
. name = " File system " ,
. size = MTDPART_SIZ_FULL ,
. offset = MTDPART_OFS_APPEND ,
} ,
} ;
2009-05-29 01:13:28 +04:00
static void __init omap3_evm_init ( void )
{
2012-04-13 16:34:32 +04:00
struct omap_board_mux * obm ;
2009-11-22 21:11:27 +03:00
omap3_evm_get_revision ( ) ;
2012-03-23 13:21:37 +04:00
regulator_register_fixed ( 0 , dummy_supplies , ARRAY_SIZE ( dummy_supplies ) ) ;
2011-01-25 20:37:39 +03:00
2012-04-13 16:34:32 +04:00
obm = ( cpu_is_omap3630 ( ) ) ? omap36x_board_mux : omap35x_board_mux ;
omap3_mux_init ( obm , OMAP_PACKAGE_CBB ) ;
2009-11-22 21:11:27 +03:00
2012-02-20 21:43:30 +04:00
omap_mux_init_gpio ( 63 , OMAP_PIN_INPUT ) ;
2012-02-20 21:43:29 +04:00
omap_hsmmc_init ( mmc ) ;
2012-02-20 21:43:30 +04:00
2012-06-20 13:14:50 +04:00
if ( get_omap3_evm_rev ( ) > = OMAP3EVM_BOARD_GEN_2 )
omap3evm_twldata . vaux2 = & omap3evm_vaux2 ;
2009-05-29 01:13:28 +04:00
omap3_evm_i2c_init ( ) ;
2011-02-22 12:24:50 +03:00
omap_display_init ( & omap3_evm_dss_data ) ;
2009-05-29 01:13:28 +04:00
omap_serial_init ( ) ;
2011-08-23 10:57:23 +04:00
omap_sdrc_init ( mt46h32m32lf6_sdrc_params , NULL ) ;
2010-02-18 01:09:29 +03:00
2009-07-29 10:28:57 +04:00
/* OMAP3EVM uses ISP1504 phy and so register nop transceiver */
usb_nop_xceiv_register ( ) ;
2010-02-18 01:09:29 +03:00
2009-11-22 21:11:28 +03:00
if ( get_omap3_evm_rev ( ) > = OMAP3EVM_BOARD_GEN_2 ) {
/* enable EHCI VBUS using GPIO22 */
2011-05-03 19:22:09 +04:00
omap_mux_init_gpio ( OMAP3_EVM_EHCI_VBUS , OMAP_PIN_INPUT_PULLUP ) ;
2009-11-22 21:11:28 +03:00
/* Select EHCI port on main board */
2011-05-03 19:22:09 +04:00
omap_mux_init_gpio ( OMAP3_EVM_EHCI_SELECT ,
OMAP_PIN_INPUT_PULLUP ) ;
gpio_request_array ( omap3_evm_ehci_gpios ,
ARRAY_SIZE ( omap3_evm_ehci_gpios ) ) ;
2009-11-22 21:11:28 +03:00
/* setup EHCI phy reset config */
2009-12-12 03:16:32 +03:00
omap_mux_init_gpio ( 21 , OMAP_PIN_INPUT_PULLUP ) ;
2011-03-01 17:38:16 +03:00
usbhs_bdata . reset_gpio_port [ 1 ] = 21 ;
2009-11-22 21:11:28 +03:00
2010-03-25 14:25:27 +03:00
/* EVM REV >= E can supply 500mA with EXTVBUS programming */
musb_board_data . power = 500 ;
musb_board_data . extvbus = 1 ;
2009-11-22 21:11:28 +03:00
} else {
/* setup EHCI phy reset on MDC */
2009-12-12 03:16:32 +03:00
omap_mux_init_gpio ( 135 , OMAP_PIN_OUTPUT ) ;
2011-03-01 17:38:16 +03:00
usbhs_bdata . reset_gpio_port [ 1 ] = 135 ;
2009-11-22 21:11:28 +03:00
}
2010-02-18 01:09:30 +03:00
usb_musb_init ( & musb_board_data ) ;
2011-03-01 17:38:19 +03:00
usbhs_init ( & usbhs_bdata ) ;
2012-02-29 16:41:56 +04:00
board_nand_init ( omap3evm_nand_partitions ,
ARRAY_SIZE ( omap3evm_nand_partitions ) , NAND_CS ,
NAND_BUSWIDTH_16 , NULL ) ;
2012-06-20 13:14:49 +04:00
2011-04-25 02:09:05 +04:00
omap_ads7846_init ( 1 , OMAP3_EVM_TS_GPIO , 310 , NULL ) ;
2009-11-22 21:11:30 +03:00
omap3evm_init_smsc911x ( ) ;
2010-01-04 17:34:16 +03:00
omap3_evm_display_init ( ) ;
2012-02-07 15:03:23 +04:00
omap3_evm_wl12xx_init ( ) ;
2012-08-14 13:07:58 +04:00
omap_twl4030_audio_init ( " omap3evm " ) ;
2009-05-29 01:13:28 +04:00
}
MACHINE_START ( OMAP3EVM , " OMAP3 EVM " )
/* Maintainer: Syed Mohammed Khasim - Texas Instruments */
2011-07-06 06:38:15 +04:00
. atag_offset = 0x100 ,
2010-05-23 13:18:16 +04:00
. reserve = omap_reserve ,
2011-02-15 02:40:20 +03:00
. map_io = omap3_map_io ,
2011-08-23 10:57:24 +04:00
. init_early = omap35xx_init_early ,
2011-05-17 14:51:26 +04:00
. init_irq = omap3_init_irq ,
2011-09-06 13:23:45 +04:00
. handle_irq = omap3_intc_handle_irq ,
2009-05-29 01:13:28 +04:00
. init_machine = omap3_evm_init ,
2012-04-26 12:06:50 +04:00
. init_late = omap35xx_init_late ,
2011-03-30 02:54:48 +04:00
. timer = & omap3_timer ,
2012-10-30 06:56:12 +04:00
. restart = omap3xxx_restart ,
2009-05-29 01:13:28 +04:00
MACHINE_END