2011-02-14 14:59:52 +09:00
/* linux/arch/arm/mach-exynos4/mach-smdkv310.c
2010-07-16 12:18:36 +09:00
*
2011-02-14 14:59:52 +09:00
* Copyright ( c ) 2010 - 2011 Samsung Electronics Co . , Ltd .
* http : //www.samsung.com
2010-07-16 12:18:36 +09:00
*
* 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/serial_core.h>
2011-08-18 21:14:28 +09:00
# include <linux/delay.h>
2010-10-06 14:50:20 +09:00
# include <linux/gpio.h>
2011-08-18 21:14:28 +09:00
# include <linux/lcd.h>
2010-10-06 14:50:20 +09:00
# include <linux/mmc/host.h>
# include <linux/platform_device.h>
2010-10-26 12:51:17 +09:00
# include <linux/smsc911x.h>
# include <linux/io.h>
2010-12-21 09:59:05 +09:00
# include <linux/i2c.h>
2011-02-22 17:16:58 +09:00
# include <linux/input.h>
2011-07-20 23:45:21 +09:00
# include <linux/pwm_backlight.h>
2010-07-16 12:18:36 +09:00
# include <asm/mach/arch.h>
2011-05-30 11:04:53 +01:00
# include <asm/hardware/gic.h>
2010-07-16 12:18:36 +09:00
# include <asm/mach-types.h>
2011-08-18 21:14:28 +09:00
# include <video/platform_lcd.h>
2010-07-16 12:18:36 +09:00
# include <plat/regs-serial.h>
2010-11-15 09:18:57 +09:00
# include <plat/regs-srom.h>
2011-08-18 21:14:28 +09:00
# include <plat/regs-fb-v4.h>
2010-07-16 12:18:36 +09:00
# include <plat/cpu.h>
2010-09-20 15:25:51 +09:00
# include <plat/devs.h>
2011-08-18 21:14:28 +09:00
# include <plat/fb.h>
2011-02-22 17:16:58 +09:00
# include <plat/keypad.h>
2010-10-06 14:50:20 +09:00
# include <plat/sdhci.h>
2010-12-21 09:59:05 +09:00
# include <plat/iic.h>
2010-12-03 17:15:40 +09:00
# include <plat/pd.h>
2011-07-20 23:45:21 +09:00
# include <plat/gpio-cfg.h>
# include <plat/backlight.h>
2011-08-12 18:21:27 +09:00
# include <plat/mfc.h>
2011-09-28 10:33:25 +09:00
# include <plat/ehci.h>
# include <plat/clock.h>
2010-07-16 12:18:36 +09:00
# include <mach/map.h>
2011-12-23 11:20:50 +09:00
# include <mach/ohci.h>
2010-07-16 12:18:36 +09:00
2011-12-27 08:18:36 +01:00
# include "common.h"
2010-07-16 12:18:36 +09:00
/* Following are default values for UCON, ULCON and UFCON UART registers */
# define SMDKV310_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \
S3C2410_UCON_RXILEVEL | \
S3C2410_UCON_TXIRQMODE | \
S3C2410_UCON_RXIRQMODE | \
S3C2410_UCON_RXFIFO_TOI | \
S3C2443_UCON_RXERR_IRQEN )
# define SMDKV310_ULCON_DEFAULT S3C2410_LCON_CS8
# define SMDKV310_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE | \
S5PV210_UFCON_TXTRIG4 | \
S5PV210_UFCON_RXTRIG4 )
static struct s3c2410_uartcfg smdkv310_uartcfgs [ ] __initdata = {
[ 0 ] = {
. hwport = 0 ,
. flags = 0 ,
. ucon = SMDKV310_UCON_DEFAULT ,
. ulcon = SMDKV310_ULCON_DEFAULT ,
. ufcon = SMDKV310_UFCON_DEFAULT ,
} ,
[ 1 ] = {
. hwport = 1 ,
. flags = 0 ,
. ucon = SMDKV310_UCON_DEFAULT ,
. ulcon = SMDKV310_ULCON_DEFAULT ,
. ufcon = SMDKV310_UFCON_DEFAULT ,
} ,
[ 2 ] = {
. hwport = 2 ,
. flags = 0 ,
. ucon = SMDKV310_UCON_DEFAULT ,
. ulcon = SMDKV310_ULCON_DEFAULT ,
. ufcon = SMDKV310_UFCON_DEFAULT ,
} ,
[ 3 ] = {
. hwport = 3 ,
. flags = 0 ,
. ucon = SMDKV310_UCON_DEFAULT ,
. ulcon = SMDKV310_ULCON_DEFAULT ,
. ufcon = SMDKV310_UFCON_DEFAULT ,
} ,
} ;
2010-10-06 14:50:20 +09:00
static struct s3c_sdhci_platdata smdkv310_hsmmc0_pdata __initdata = {
2011-06-16 16:12:35 +09:00
. cd_type = S3C_SDHCI_CD_INTERNAL ,
2010-10-08 18:03:27 +09:00
. clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL ,
2011-02-14 14:59:52 +09:00
# ifdef CONFIG_EXYNOS4_SDHCI_CH0_8BIT
2010-10-06 14:50:20 +09:00
. max_width = 8 ,
. host_caps = MMC_CAP_8_BIT_DATA ,
# endif
} ;
static struct s3c_sdhci_platdata smdkv310_hsmmc1_pdata __initdata = {
. cd_type = S3C_SDHCI_CD_GPIO ,
2011-02-14 14:59:52 +09:00
. ext_cd_gpio = EXYNOS4_GPK0 ( 2 ) ,
2010-10-06 14:50:20 +09:00
. ext_cd_gpio_invert = 1 ,
2010-10-08 18:03:27 +09:00
. clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL ,
2010-10-06 14:50:20 +09:00
} ;
static struct s3c_sdhci_platdata smdkv310_hsmmc2_pdata __initdata = {
2011-06-16 16:12:35 +09:00
. cd_type = S3C_SDHCI_CD_INTERNAL ,
2010-10-08 18:03:27 +09:00
. clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL ,
2011-02-14 14:59:52 +09:00
# ifdef CONFIG_EXYNOS4_SDHCI_CH2_8BIT
2010-10-06 14:50:20 +09:00
. max_width = 8 ,
. host_caps = MMC_CAP_8_BIT_DATA ,
# endif
} ;
static struct s3c_sdhci_platdata smdkv310_hsmmc3_pdata __initdata = {
. cd_type = S3C_SDHCI_CD_GPIO ,
2011-02-14 14:59:52 +09:00
. ext_cd_gpio = EXYNOS4_GPK2 ( 2 ) ,
2010-10-06 14:50:20 +09:00
. ext_cd_gpio_invert = 1 ,
2010-10-08 18:03:27 +09:00
. clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL ,
2010-10-06 14:50:20 +09:00
} ;
2011-08-18 21:14:28 +09:00
static void lcd_lte480wv_set_power ( struct plat_lcd_data * pd ,
unsigned int power )
{
if ( power ) {
# if !defined(CONFIG_BACKLIGHT_PWM)
gpio_request_one ( EXYNOS4_GPD0 ( 1 ) , GPIOF_OUT_INIT_HIGH , " GPD0 " ) ;
gpio_free ( EXYNOS4_GPD0 ( 1 ) ) ;
# endif
/* fire nRESET on power up */
2011-12-24 11:58:32 +09:00
gpio_request_one ( EXYNOS4_GPX0 ( 6 ) , GPIOF_OUT_INIT_HIGH , " GPX0 " ) ;
2011-08-18 21:14:28 +09:00
mdelay ( 100 ) ;
gpio_set_value ( EXYNOS4_GPX0 ( 6 ) , 0 ) ;
mdelay ( 10 ) ;
gpio_set_value ( EXYNOS4_GPX0 ( 6 ) , 1 ) ;
mdelay ( 10 ) ;
gpio_free ( EXYNOS4_GPX0 ( 6 ) ) ;
} else {
# if !defined(CONFIG_BACKLIGHT_PWM)
gpio_request_one ( EXYNOS4_GPD0 ( 1 ) , GPIOF_OUT_INIT_LOW , " GPD0 " ) ;
gpio_free ( EXYNOS4_GPD0 ( 1 ) ) ;
# endif
}
}
static struct plat_lcd_data smdkv310_lcd_lte480wv_data = {
. set_power = lcd_lte480wv_set_power ,
} ;
static struct platform_device smdkv310_lcd_lte480wv = {
. name = " platform-lcd " ,
. dev . parent = & s5p_device_fimd0 . dev ,
. dev . platform_data = & smdkv310_lcd_lte480wv_data ,
} ;
static struct s3c_fb_pd_win smdkv310_fb_win0 = {
. win_mode = {
. left_margin = 13 ,
. right_margin = 8 ,
. upper_margin = 7 ,
. lower_margin = 5 ,
. hsync_len = 3 ,
. vsync_len = 1 ,
. xres = 800 ,
. yres = 480 ,
} ,
. max_bpp = 32 ,
. default_bpp = 24 ,
} ;
static struct s3c_fb_platdata smdkv310_lcd0_pdata __initdata = {
. win [ 0 ] = & smdkv310_fb_win0 ,
. vidcon0 = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB ,
. vidcon1 = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC ,
. setup_gpio = exynos4_fimd0_gpio_setup_24bpp ,
} ;
2010-10-26 12:51:17 +09:00
static struct resource smdkv310_smsc911x_resources [ ] = {
[ 0 ] = {
2011-02-14 14:59:52 +09:00
. start = EXYNOS4_PA_SROM_BANK ( 1 ) ,
. end = EXYNOS4_PA_SROM_BANK ( 1 ) + SZ_64K - 1 ,
2010-10-26 12:51:17 +09:00
. flags = IORESOURCE_MEM ,
} ,
[ 1 ] = {
. start = IRQ_EINT ( 5 ) ,
. end = IRQ_EINT ( 5 ) ,
. flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW ,
} ,
} ;
static struct smsc911x_platform_config smsc9215_config = {
2011-03-25 15:48:15 +09:00
. irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW ,
2010-10-26 12:51:17 +09:00
. irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL ,
. flags = SMSC911X_USE_16BIT | SMSC911X_FORCE_INTERNAL_PHY ,
. phy_interface = PHY_INTERFACE_MODE_MII ,
. mac = { 0x00 , 0x80 , 0x00 , 0x23 , 0x45 , 0x67 } ,
} ;
static struct platform_device smdkv310_smsc911x = {
. name = " smsc911x " ,
. id = - 1 ,
. num_resources = ARRAY_SIZE ( smdkv310_smsc911x_resources ) ,
. resource = smdkv310_smsc911x_resources ,
. dev = {
. platform_data = & smsc9215_config ,
} ,
} ;
2011-02-22 17:16:58 +09:00
static uint32_t smdkv310_keymap [ ] __initdata = {
/* KEY(row, col, keycode) */
KEY ( 0 , 3 , KEY_1 ) , KEY ( 0 , 4 , KEY_2 ) , KEY ( 0 , 5 , KEY_3 ) ,
KEY ( 0 , 6 , KEY_4 ) , KEY ( 0 , 7 , KEY_5 ) ,
KEY ( 1 , 3 , KEY_A ) , KEY ( 1 , 4 , KEY_B ) , KEY ( 1 , 5 , KEY_C ) ,
KEY ( 1 , 6 , KEY_D ) , KEY ( 1 , 7 , KEY_E )
} ;
static struct matrix_keymap_data smdkv310_keymap_data __initdata = {
. keymap = smdkv310_keymap ,
. keymap_size = ARRAY_SIZE ( smdkv310_keymap ) ,
} ;
static struct samsung_keypad_platdata smdkv310_keypad_data __initdata = {
. keymap_data = & smdkv310_keymap_data ,
. rows = 2 ,
. cols = 8 ,
} ;
2010-12-21 09:59:05 +09:00
static struct i2c_board_info i2c_devs1 [ ] __initdata = {
{ I2C_BOARD_INFO ( " wm8994 " , 0x1a ) , } ,
} ;
2011-09-28 10:33:25 +09:00
/* USB EHCI */
static struct s5p_ehci_platdata smdkv310_ehci_pdata ;
static void __init smdkv310_ehci_init ( void )
{
struct s5p_ehci_platdata * pdata = & smdkv310_ehci_pdata ;
s5p_ehci_set_platdata ( pdata ) ;
}
2011-12-23 11:20:50 +09:00
/* USB OHCI */
static struct exynos4_ohci_platdata smdkv310_ohci_pdata ;
static void __init smdkv310_ohci_init ( void )
{
struct exynos4_ohci_platdata * pdata = & smdkv310_ohci_pdata ;
exynos4_ohci_set_platdata ( pdata ) ;
}
2010-09-20 15:25:51 +09:00
static struct platform_device * smdkv310_devices [ ] __initdata = {
2010-10-06 14:50:20 +09:00
& s3c_device_hsmmc0 ,
& s3c_device_hsmmc1 ,
& s3c_device_hsmmc2 ,
& s3c_device_hsmmc3 ,
2010-12-31 10:52:05 +09:00
& s3c_device_i2c1 ,
2011-09-27 07:37:18 +09:00
& s5p_device_i2c_hdmiphy ,
2010-09-20 15:25:51 +09:00
& s3c_device_rtc ,
2010-09-20 15:33:04 +09:00
& s3c_device_wdt ,
2011-09-28 10:33:25 +09:00
& s5p_device_ehci ,
2011-09-28 11:13:30 +09:00
& s5p_device_fimc0 ,
& s5p_device_fimc1 ,
& s5p_device_fimc2 ,
& s5p_device_fimc3 ,
2012-01-31 13:28:52 +09:00
& s5p_device_fimc_md ,
2012-03-09 06:51:45 -08:00
& s5p_device_g2d ,
2012-03-09 08:19:21 -08:00
& s5p_device_jpeg ,
2011-02-14 14:59:52 +09:00
& exynos4_device_ac97 ,
& exynos4_device_i2s0 ,
2011-12-23 11:20:50 +09:00
& exynos4_device_ohci ,
2011-02-22 17:16:58 +09:00
& samsung_device_keypad ,
2011-08-12 18:21:27 +09:00
& s5p_device_mfc ,
& s5p_device_mfc_l ,
& s5p_device_mfc_r ,
2011-07-18 15:14:01 +09:00
& exynos4_device_spdif ,
2011-02-14 14:59:52 +09:00
& exynos4_device_sysmmu ,
2011-01-18 14:41:43 +09:00
& samsung_asoc_dma ,
2011-07-21 14:12:19 +09:00
& samsung_asoc_idma ,
2011-08-18 21:14:28 +09:00
& s5p_device_fimd0 ,
& smdkv310_lcd_lte480wv ,
2011-01-18 14:41:43 +09:00
& smdkv310_smsc911x ,
2011-07-04 19:19:36 +09:00
& exynos4_device_ahci ,
2011-09-27 07:37:18 +09:00
& s5p_device_hdmi ,
& s5p_device_mixer ,
2010-09-20 15:25:51 +09:00
} ;
2010-10-26 12:51:17 +09:00
static void __init smdkv310_smsc911x_init ( void )
{
u32 cs1 ;
/* configure nCS1 width to 16 bits */
2010-11-15 09:18:57 +09:00
cs1 = __raw_readl ( S5P_SROM_BW ) &
~ ( S5P_SROM_BW__CS_MASK < < S5P_SROM_BW__NCS1__SHIFT ) ;
cs1 | = ( ( 1 < < S5P_SROM_BW__DATAWIDTH__SHIFT ) |
( 1 < < S5P_SROM_BW__WAITENABLE__SHIFT ) |
( 1 < < S5P_SROM_BW__BYTEENABLE__SHIFT ) ) < <
S5P_SROM_BW__NCS1__SHIFT ;
__raw_writel ( cs1 , S5P_SROM_BW ) ;
2010-10-26 12:51:17 +09:00
/* set timing for nCS1 suitable for ethernet chip */
2010-11-15 09:18:57 +09:00
__raw_writel ( ( 0x1 < < S5P_SROM_BCX__PMC__SHIFT ) |
( 0x9 < < S5P_SROM_BCX__TACP__SHIFT ) |
( 0xc < < S5P_SROM_BCX__TCAH__SHIFT ) |
( 0x1 < < S5P_SROM_BCX__TCOH__SHIFT ) |
( 0x6 < < S5P_SROM_BCX__TACC__SHIFT ) |
( 0x1 < < S5P_SROM_BCX__TCOS__SHIFT ) |
( 0x1 < < S5P_SROM_BCX__TACS__SHIFT ) , S5P_SROM_BC1 ) ;
2010-10-26 12:51:17 +09:00
}
2011-07-20 23:45:21 +09:00
/* LCD Backlight data */
static struct samsung_bl_gpio_info smdkv310_bl_gpio_info = {
. no = EXYNOS4_GPD0 ( 1 ) ,
. func = S3C_GPIO_SFN ( 2 ) ,
} ;
static struct platform_pwm_backlight_data smdkv310_bl_data = {
. pwm_id = 1 ,
. pwm_period_ns = 1000 ,
} ;
2011-09-27 07:37:18 +09:00
static void s5p_tv_setup ( void )
{
/* direct HPD to HDMI chip */
WARN_ON ( gpio_request_one ( EXYNOS4_GPX3 ( 7 ) , GPIOF_IN , " hpd-plug " ) ) ;
s3c_gpio_cfgpin ( EXYNOS4_GPX3 ( 7 ) , S3C_GPIO_SFN ( 0x3 ) ) ;
s3c_gpio_setpull ( EXYNOS4_GPX3 ( 7 ) , S3C_GPIO_PULL_NONE ) ;
}
2010-07-16 12:18:36 +09:00
static void __init smdkv310_map_io ( void )
{
2011-12-27 08:18:36 +01:00
exynos_init_io ( NULL , 0 ) ;
2010-07-16 12:18:36 +09:00
s3c24xx_init_clocks ( 24000000 ) ;
s3c24xx_init_uarts ( smdkv310_uartcfgs , ARRAY_SIZE ( smdkv310_uartcfgs ) ) ;
}
2011-08-12 18:21:27 +09:00
static void __init smdkv310_reserve ( void )
{
s5p_mfc_reserve_mem ( 0x43000000 , 8 < < 20 , 0x51000000 , 8 < < 20 ) ;
}
2010-07-16 12:18:36 +09:00
static void __init smdkv310_machine_init ( void )
{
2010-12-21 09:59:05 +09:00
s3c_i2c1_set_platdata ( NULL ) ;
i2c_register_board_info ( 1 , i2c_devs1 , ARRAY_SIZE ( i2c_devs1 ) ) ;
2010-10-26 12:51:17 +09:00
smdkv310_smsc911x_init ( ) ;
2010-10-06 14:50:20 +09:00
s3c_sdhci0_set_platdata ( & smdkv310_hsmmc0_pdata ) ;
s3c_sdhci1_set_platdata ( & smdkv310_hsmmc1_pdata ) ;
s3c_sdhci2_set_platdata ( & smdkv310_hsmmc2_pdata ) ;
s3c_sdhci3_set_platdata ( & smdkv310_hsmmc3_pdata ) ;
2011-09-27 07:37:18 +09:00
s5p_tv_setup ( ) ;
s5p_i2c_hdmiphy_set_platdata ( NULL ) ;
2011-02-22 17:16:58 +09:00
samsung_keypad_set_platdata ( & smdkv310_keypad_data ) ;
2011-07-20 23:45:21 +09:00
samsung_bl_set ( & smdkv310_bl_gpio_info , & smdkv310_bl_data ) ;
2011-08-18 21:14:28 +09:00
s5p_fimd0_set_platdata ( & smdkv310_lcd0_pdata ) ;
2011-07-20 23:45:21 +09:00
2011-09-28 10:33:25 +09:00
smdkv310_ehci_init ( ) ;
2011-12-23 11:20:50 +09:00
smdkv310_ohci_init ( ) ;
2011-09-28 10:33:25 +09:00
clk_xusbxti . rate = 24000000 ;
2010-09-20 15:25:51 +09:00
platform_add_devices ( smdkv310_devices , ARRAY_SIZE ( smdkv310_devices ) ) ;
2010-07-16 12:18:36 +09:00
}
MACHINE_START ( SMDKV310 , " SMDKV310 " )
/* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
/* Maintainer: Changhwan Youn <chaos.youn@samsung.com> */
2011-09-19 20:09:01 +09:00
. atag_offset = 0x100 ,
2011-02-14 14:59:52 +09:00
. init_irq = exynos4_init_irq ,
2010-07-16 12:18:36 +09:00
. map_io = smdkv310_map_io ,
2011-05-30 11:04:53 +01:00
. handle_irq = gic_handle_irq ,
2010-07-16 12:18:36 +09:00
. init_machine = smdkv310_machine_init ,
2011-02-14 14:59:52 +09:00
. timer = & exynos4_timer ,
2011-08-12 18:21:27 +09:00
. reserve = & smdkv310_reserve ,
2012-01-03 11:56:53 +01:00
. restart = exynos4_restart ,
2010-07-16 12:18:36 +09:00
MACHINE_END
2011-08-18 21:14:28 +09:00
MACHINE_START ( SMDKC210 , " SMDKC210 " )
/* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
2011-09-19 20:09:01 +09:00
. atag_offset = 0x100 ,
2011-08-18 21:14:28 +09:00
. init_irq = exynos4_init_irq ,
. map_io = smdkv310_map_io ,
2011-05-30 11:04:53 +01:00
. handle_irq = gic_handle_irq ,
2011-08-18 21:14:28 +09:00
. init_machine = smdkv310_machine_init ,
. timer = & exynos4_timer ,
2012-01-03 11:56:53 +01:00
. restart = exynos4_restart ,
2011-08-18 21:14:28 +09:00
MACHINE_END