2009-11-19 05:41:09 +03:00
/*
* linux / arch / arm / mach - omap2 / board - am3517evm . c
*
* Copyright ( C ) 2009 Texas Instruments Incorporated
* Author : Ranjith Lohithakshan < ranjithl @ ti . com >
*
* Based on mach - omap2 / board - omap3evm . c
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation version 2.
*
* This program is distributed " as is " WITHOUT ANY WARRANTY of any kind ,
* whether express or implied ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*/
# include <linux/kernel.h>
# include <linux/init.h>
2010-09-15 18:11:23 +04:00
# include <linux/clk.h>
2009-11-19 05:41:09 +03:00
# include <linux/platform_device.h>
# include <linux/gpio.h>
2010-02-13 14:47:57 +03:00
# include <linux/i2c/pca953x.h>
2010-05-11 01:29:16 +04:00
# include <linux/can/platform/ti_hecc.h>
2010-05-11 01:29:17 +04:00
# include <linux/davinci_emac.h>
2011-12-10 00:27:55 +04:00
# include <linux/mmc/host.h>
2012-08-31 02:37:24 +04:00
# include <linux/platform_data/gpio-omap.h>
2009-11-19 05:41:09 +03:00
2012-09-20 22:40:52 +04:00
# include "am35xx.h"
2009-11-19 05:41:09 +03:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/map.h>
2011-11-11 01:45:17 +04:00
# include "common.h"
2011-05-11 15:05:07 +04:00
# include <video/omapdss.h>
2011-05-10 20:48:10 +04:00
# include <video/omap-panel-generic-dpi.h>
2011-12-22 13:12:13 +04:00
# include <video/omap-panel-tfp410.h>
2009-11-19 05:41:09 +03:00
2012-03-05 23:08:36 +04:00
# include "am35xx-emac.h"
2009-12-12 03:16:32 +03:00
# include "mux.h"
2010-10-08 21:40:20 +04:00
# include "control.h"
2011-12-10 00:27:55 +04:00
# include "hsmmc.h"
2009-12-12 03:16:32 +03:00
2010-01-13 14:47:10 +03:00
# define LCD_PANEL_PWR 176
# define LCD_PANEL_BKLIGHT_PWR 182
# define LCD_PANEL_PWM 181
2010-05-13 16:39:29 +04:00
static struct i2c_board_info __initdata am3517evm_i2c1_boardinfo [ ] = {
2010-02-13 14:47:56 +03:00
{
I2C_BOARD_INFO ( " s35390a " , 0x30 ) ,
} ,
} ;
/*
* RTC - S35390A
*/
# define GPIO_RTCS35390A_IRQ 55
static void __init am3517_evm_rtc_init ( void )
{
int r ;
omap_mux_init_gpio ( GPIO_RTCS35390A_IRQ , OMAP_PIN_INPUT_PULLUP ) ;
2011-05-03 19:22:09 +04:00
r = gpio_request_one ( GPIO_RTCS35390A_IRQ , GPIOF_IN , " rtcs35390a-irq " ) ;
2010-02-13 14:47:56 +03:00
if ( r < 0 ) {
printk ( KERN_WARNING " failed to request GPIO#%d \n " ,
GPIO_RTCS35390A_IRQ ) ;
return ;
}
2011-05-03 19:22:09 +04:00
2010-05-13 16:39:29 +04:00
am3517evm_i2c1_boardinfo [ 0 ] . irq = gpio_to_irq ( GPIO_RTCS35390A_IRQ ) ;
2010-02-13 14:47:56 +03:00
}
2010-02-13 14:47:57 +03:00
/*
* I2C GPIO Expander - TCA6416
*/
/* Mounted on Base-Board */
static struct pca953x_platform_data am3517evm_gpio_expander_info_0 = {
. gpio_base = OMAP_MAX_GPIO_LINES ,
} ;
2010-05-13 16:39:29 +04:00
static struct i2c_board_info __initdata am3517evm_i2c2_boardinfo [ ] = {
2011-03-08 18:13:24 +03:00
{
I2C_BOARD_INFO ( " tlv320aic23 " , 0x1A ) ,
} ,
2010-02-13 14:47:57 +03:00
{
I2C_BOARD_INFO ( " tca6416 " , 0x21 ) ,
. platform_data = & am3517evm_gpio_expander_info_0 ,
} ,
} ;
/* Mounted on UI Card */
static struct pca953x_platform_data am3517evm_ui_gpio_expander_info_1 = {
. gpio_base = OMAP_MAX_GPIO_LINES + 16 ,
} ;
static struct pca953x_platform_data am3517evm_ui_gpio_expander_info_2 = {
. gpio_base = OMAP_MAX_GPIO_LINES + 32 ,
} ;
2010-05-13 16:39:29 +04:00
static struct i2c_board_info __initdata am3517evm_i2c3_boardinfo [ ] = {
2010-02-13 14:47:57 +03:00
{
I2C_BOARD_INFO ( " tca6416 " , 0x20 ) ,
. platform_data = & am3517evm_ui_gpio_expander_info_1 ,
} ,
{
I2C_BOARD_INFO ( " tca6416 " , 0x21 ) ,
. platform_data = & am3517evm_ui_gpio_expander_info_2 ,
} ,
} ;
2010-02-18 01:09:28 +03:00
static int __init am3517_evm_i2c_init ( void )
{
omap_register_i2c_bus ( 1 , 400 , NULL , 0 ) ;
2010-05-13 16:39:29 +04:00
omap_register_i2c_bus ( 2 , 400 , am3517evm_i2c2_boardinfo ,
ARRAY_SIZE ( am3517evm_i2c2_boardinfo ) ) ;
omap_register_i2c_bus ( 3 , 400 , am3517evm_i2c3_boardinfo ,
ARRAY_SIZE ( am3517evm_i2c3_boardinfo ) ) ;
2010-02-18 01:09:28 +03:00
return 0 ;
}
2010-01-13 14:47:10 +03:00
static int lcd_enabled ;
static int dvi_enabled ;
2010-05-11 01:29:19 +04:00
# if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \
defined ( CONFIG_PANEL_SHARP_LQ043T1DG01_MODULE )
2011-05-03 19:22:09 +04:00
static struct gpio am3517_evm_dss_gpios [ ] __initdata = {
/* GPIO 182 = LCD Backlight Power */
{ LCD_PANEL_BKLIGHT_PWR , GPIOF_OUT_INIT_HIGH , " lcd_backlight_pwr " } ,
/* GPIO 181 = LCD Panel PWM */
{ LCD_PANEL_PWM , GPIOF_OUT_INIT_HIGH , " lcd bl enable " } ,
/* GPIO 176 = LCD Panel Power enable pin */
{ LCD_PANEL_PWR , GPIOF_OUT_INIT_HIGH , " dvi enable " } ,
} ;
2010-01-13 14:47:10 +03:00
static void __init am3517_evm_display_init ( void )
{
int r ;
omap_mux_init_gpio ( LCD_PANEL_PWR , OMAP_PIN_INPUT_PULLUP ) ;
omap_mux_init_gpio ( LCD_PANEL_BKLIGHT_PWR , OMAP_PIN_INPUT_PULLDOWN ) ;
omap_mux_init_gpio ( LCD_PANEL_PWM , OMAP_PIN_INPUT_PULLDOWN ) ;
2011-05-03 19:22:09 +04:00
r = gpio_request_array ( am3517_evm_dss_gpios ,
ARRAY_SIZE ( am3517_evm_dss_gpios ) ) ;
2010-01-13 14:47:10 +03:00
if ( r ) {
2011-05-03 19:22:09 +04:00
printk ( KERN_ERR " failed to get DSS panel control GPIOs \n " ) ;
2010-01-13 14:47:10 +03:00
return ;
}
printk ( KERN_INFO " Display initialized successfully \n " ) ;
}
2010-05-11 01:29:19 +04:00
# else
static void __init am3517_evm_display_init ( void ) { }
# endif
2010-01-13 14:47:10 +03:00
static int am3517_evm_panel_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 ( LCD_PANEL_PWR , 1 ) ;
lcd_enabled = 1 ;
return 0 ;
}
static void am3517_evm_panel_disable_lcd ( struct omap_dss_device * dssdev )
{
gpio_set_value ( LCD_PANEL_PWR , 0 ) ;
lcd_enabled = 0 ;
}
2010-11-17 16:34:34 +03:00
static struct panel_generic_dpi_data lcd_panel = {
. name = " sharp_lq " ,
. platform_enable = am3517_evm_panel_enable_lcd ,
. platform_disable = am3517_evm_panel_disable_lcd ,
} ;
2010-01-13 14:47:10 +03:00
static struct omap_dss_device am3517_evm_lcd_device = {
. type = OMAP_DISPLAY_TYPE_DPI ,
. name = " lcd " ,
2010-11-17 16:34:34 +03:00
. driver_name = " generic_dpi_panel " ,
. data = & lcd_panel ,
2010-01-13 14:47:10 +03:00
. phy . dpi . data_lines = 16 ,
} ;
static int am3517_evm_panel_enable_tv ( struct omap_dss_device * dssdev )
{
return 0 ;
}
static void am3517_evm_panel_disable_tv ( struct omap_dss_device * dssdev )
{
}
static struct omap_dss_device am3517_evm_tv_device = {
. type = OMAP_DISPLAY_TYPE_VENC ,
. name = " tv " ,
. driver_name = " venc " ,
. phy . venc . type = OMAP_DSS_VENC_TYPE_SVIDEO ,
. platform_enable = am3517_evm_panel_enable_tv ,
. platform_disable = am3517_evm_panel_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 = - 1 ,
2010-11-17 16:34:34 +03:00
} ;
2010-01-13 14:47:10 +03:00
static struct omap_dss_device am3517_evm_dvi_device = {
. type = OMAP_DISPLAY_TYPE_DPI ,
. name = " dvi " ,
2012-03-05 16:29:28 +04:00
. driver_name = " tfp410 " ,
2010-11-17 16:34:34 +03:00
. data = & dvi_panel ,
2010-01-13 14:47:10 +03:00
. phy . dpi . data_lines = 24 ,
} ;
static struct omap_dss_device * am3517_evm_dss_devices [ ] = {
& am3517_evm_lcd_device ,
& am3517_evm_tv_device ,
& am3517_evm_dvi_device ,
} ;
static struct omap_dss_board_info am3517_evm_dss_data = {
. num_devices = ARRAY_SIZE ( am3517_evm_dss_devices ) ,
. devices = am3517_evm_dss_devices ,
. default_device = & am3517_evm_lcd_device ,
} ;
2009-11-19 05:41:09 +03:00
/*
* Board initialization
*/
2010-10-19 11:08:11 +04:00
static struct omap_musb_board_data musb_board_data = {
. interface_type = MUSB_INTERFACE_ULPI ,
. mode = MUSB_OTG ,
. power = 500 ,
2011-02-16 15:04:40 +03:00
. set_phy_power = am35x_musb_phy_power ,
. clear_irq = am35x_musb_clear_irq ,
2011-05-02 13:45:05 +04:00
. set_mode = am35x_set_mode ,
2011-02-16 15:04:40 +03:00
. reset = am35x_musb_reset ,
2010-10-19 11:08:11 +04:00
} ;
static __init void am3517_evm_musb_init ( void )
{
u32 devconf2 ;
/*
* Set up USB clock / mode in the DEVCONF2 register .
*/
devconf2 = omap_ctrl_readl ( AM35XX_CONTROL_DEVCONF2 ) ;
/* USB2.0 PHY reference clock is 13 MHz */
devconf2 & = ~ ( CONF2_REFFREQ | CONF2_OTGMODE | CONF2_PHY_GPIOMODE ) ;
devconf2 | = CONF2_REFFREQ_13MHZ | CONF2_SESENDEN | CONF2_VBDTCTEN
| CONF2_DATPOL ;
omap_ctrl_writel ( devconf2 , AM35XX_CONTROL_DEVCONF2 ) ;
usb_musb_init ( & musb_board_data ) ;
}
2012-08-16 17:41:02 +04:00
static __init void am3517_evm_mcbsp1_init ( void )
{
u32 devconf0 ;
/* McBSP1 CLKR/FSR signal to be connected to CLKX/FSX pin */
devconf0 = omap_ctrl_readl ( OMAP2_CONTROL_DEVCONF0 ) ;
devconf0 | = OMAP2_MCBSP1_CLKR_MASK | OMAP2_MCBSP1_FSR_MASK ;
omap_ctrl_writel ( devconf0 , OMAP2_CONTROL_DEVCONF0 ) ;
}
2011-03-01 17:38:16 +03:00
static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
. port_mode [ 0 ] = OMAP_EHCI_PORT_MODE_PHY ,
2010-05-11 01:29:19 +04:00
# if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \
defined ( CONFIG_PANEL_SHARP_LQ043T1DG01_MODULE )
2011-03-01 17:38:16 +03:00
. port_mode [ 1 ] = OMAP_USBHS_PORT_MODE_UNUSED ,
2010-05-11 01:29:19 +04:00
# else
2011-03-01 17:38:16 +03:00
. port_mode [ 1 ] = OMAP_EHCI_PORT_MODE_PHY ,
2010-05-11 01:29:19 +04:00
# endif
2011-03-01 17:38:16 +03:00
. port_mode [ 2 ] = OMAP_USBHS_PORT_MODE_UNUSED ,
2009-11-19 05:41:09 +03:00
. phy_reset = true ,
. reset_gpio_port [ 0 ] = 57 ,
. reset_gpio_port [ 1 ] = - EINVAL ,
. reset_gpio_port [ 2 ] = - EINVAL
} ;
2009-12-12 03:16:32 +03:00
# ifdef CONFIG_OMAP_MUX
static struct omap_board_mux board_mux [ ] __initdata = {
2010-10-19 11:08:11 +04:00
/* USB OTG DRVVBUS offset = 0x212 */
OMAP3_MUX ( SAD2D_MCAD23 , OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLDOWN ) ,
2009-12-12 03:16:32 +03:00
{ . reg_offset = OMAP_MUX_TERMINATOR } ,
} ;
# endif
2010-05-11 01:29:16 +04:00
static struct resource am3517_hecc_resources [ ] = {
{
. start = AM35XX_IPSS_HECC_BASE ,
. end = AM35XX_IPSS_HECC_BASE + 0x3FFF ,
. flags = IORESOURCE_MEM ,
} ,
{
2012-08-28 04:43:01 +04:00
. start = 24 + OMAP_INTC_START ,
2010-05-11 01:29:16 +04:00
. flags = IORESOURCE_IRQ ,
} ,
} ;
static struct platform_device am3517_hecc_device = {
. name = " ti_hecc " ,
. id = - 1 ,
. num_resources = ARRAY_SIZE ( am3517_hecc_resources ) ,
. resource = am3517_hecc_resources ,
} ;
static struct ti_hecc_platform_data am3517_evm_hecc_pdata = {
. scc_hecc_offset = AM35XX_HECC_SCC_HECC_OFFSET ,
. scc_ram_offset = AM35XX_HECC_SCC_RAM_OFFSET ,
. hecc_ram_offset = AM35XX_HECC_RAM_OFFSET ,
. mbx_offset = AM35XX_HECC_MBOX_OFFSET ,
. int_line = AM35XX_HECC_INT_LINE ,
. version = AM35XX_HECC_VERSION ,
} ;
static void am3517_evm_hecc_init ( struct ti_hecc_platform_data * pdata )
{
am3517_hecc_device . dev . platform_data = pdata ;
platform_device_register ( & am3517_hecc_device ) ;
}
2011-12-10 00:27:55 +04:00
static struct omap2_hsmmc_info mmc [ ] = {
{
. mmc = 1 ,
. caps = MMC_CAP_4_BIT_DATA ,
. gpio_cd = 127 ,
. gpio_wp = 126 ,
} ,
{
. mmc = 2 ,
. caps = MMC_CAP_4_BIT_DATA ,
. gpio_cd = 128 ,
. gpio_wp = 129 ,
} ,
{ } /* Terminator */
} ;
2009-11-19 05:41:09 +03:00
static void __init am3517_evm_init ( void )
{
2009-12-12 03:16:32 +03:00
omap3_mux_init ( board_mux , OMAP_PACKAGE_CBB ) ;
2010-04-20 10:33:29 +04:00
am3517_evm_i2c_init ( ) ;
2011-02-22 12:24:50 +03:00
omap_display_init ( & am3517_evm_dss_data ) ;
2009-11-19 05:41:09 +03:00
omap_serial_init ( ) ;
2011-08-23 10:57:23 +04:00
omap_sdrc_init ( NULL , NULL ) ;
2010-02-22 13:21:12 +03:00
/* Configure GPIO for EHCI port */
omap_mux_init_gpio ( 57 , OMAP_PIN_OUTPUT ) ;
2011-03-01 17:38:19 +03:00
usbhs_init ( & usbhs_bdata ) ;
2010-05-11 01:29:16 +04:00
am3517_evm_hecc_init ( & am3517_evm_hecc_pdata ) ;
2010-01-13 14:47:10 +03:00
/* DSS */
am3517_evm_display_init ( ) ;
2010-02-13 14:47:56 +03:00
/* RTC - S35390A */
am3517_evm_rtc_init ( ) ;
2010-05-13 16:39:29 +04:00
i2c_register_board_info ( 1 , am3517evm_i2c1_boardinfo ,
ARRAY_SIZE ( am3517evm_i2c1_boardinfo ) ) ;
2010-05-11 01:29:17 +04:00
/*Ethernet*/
2012-03-05 23:08:36 +04:00
am35xx_emac_init ( AM35XX_DEFAULT_MDIO_FREQUENCY , 1 ) ;
2010-10-19 11:08:11 +04:00
/* MUSB */
am3517_evm_musb_init ( ) ;
2011-12-10 00:27:55 +04:00
2012-08-16 17:41:02 +04:00
/* McBSP1 */
am3517_evm_mcbsp1_init ( ) ;
2011-12-10 00:27:55 +04:00
/* MMC init function */
2012-02-20 21:43:29 +04:00
omap_hsmmc_init ( mmc ) ;
2009-11-19 05:41:09 +03:00
}
MACHINE_START ( OMAP3517EVM , " OMAP3517/AM3517 EVM " )
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 = am35xx_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-11-19 05:41:09 +03:00
. init_machine = am3517_evm_init ,
2012-04-26 12:06:50 +04:00
. init_late = am35xx_init_late ,
2011-03-30 02:54:48 +04:00
. timer = & omap3_timer ,
2011-11-05 21:06:28 +04:00
. restart = omap_prcm_restart ,
2009-11-19 05:41:09 +03:00
MACHINE_END