Path: blob/master/arch/arm/mach-exynos4/mach-smdkc210.c
10817 views
/* linux/arch/arm/mach-exynos4/mach-smdkc210.c1*2* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.3* http://www.samsung.com4*5* This program is free software; you can redistribute it and/or modify6* it under the terms of the GNU General Public License version 2 as7* published by the Free Software Foundation.8*/910#include <linux/serial_core.h>11#include <linux/gpio.h>12#include <linux/mmc/host.h>13#include <linux/platform_device.h>14#include <linux/smsc911x.h>15#include <linux/io.h>16#include <linux/i2c.h>1718#include <asm/mach/arch.h>19#include <asm/mach-types.h>2021#include <plat/regs-serial.h>22#include <plat/regs-srom.h>23#include <plat/exynos4.h>24#include <plat/cpu.h>25#include <plat/devs.h>26#include <plat/sdhci.h>27#include <plat/iic.h>28#include <plat/pd.h>2930#include <mach/map.h>3132/* Following are default values for UCON, ULCON and UFCON UART registers */33#define SMDKC210_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \34S3C2410_UCON_RXILEVEL | \35S3C2410_UCON_TXIRQMODE | \36S3C2410_UCON_RXIRQMODE | \37S3C2410_UCON_RXFIFO_TOI | \38S3C2443_UCON_RXERR_IRQEN)3940#define SMDKC210_ULCON_DEFAULT S3C2410_LCON_CS84142#define SMDKC210_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE | \43S5PV210_UFCON_TXTRIG4 | \44S5PV210_UFCON_RXTRIG4)4546static struct s3c2410_uartcfg smdkc210_uartcfgs[] __initdata = {47[0] = {48.hwport = 0,49.flags = 0,50.ucon = SMDKC210_UCON_DEFAULT,51.ulcon = SMDKC210_ULCON_DEFAULT,52.ufcon = SMDKC210_UFCON_DEFAULT,53},54[1] = {55.hwport = 1,56.flags = 0,57.ucon = SMDKC210_UCON_DEFAULT,58.ulcon = SMDKC210_ULCON_DEFAULT,59.ufcon = SMDKC210_UFCON_DEFAULT,60},61[2] = {62.hwport = 2,63.flags = 0,64.ucon = SMDKC210_UCON_DEFAULT,65.ulcon = SMDKC210_ULCON_DEFAULT,66.ufcon = SMDKC210_UFCON_DEFAULT,67},68[3] = {69.hwport = 3,70.flags = 0,71.ucon = SMDKC210_UCON_DEFAULT,72.ulcon = SMDKC210_ULCON_DEFAULT,73.ufcon = SMDKC210_UFCON_DEFAULT,74},75};7677static struct s3c_sdhci_platdata smdkc210_hsmmc0_pdata __initdata = {78.cd_type = S3C_SDHCI_CD_GPIO,79.ext_cd_gpio = EXYNOS4_GPK0(2),80.ext_cd_gpio_invert = 1,81.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,82#ifdef CONFIG_EXYNOS4_SDHCI_CH0_8BIT83.max_width = 8,84.host_caps = MMC_CAP_8_BIT_DATA,85#endif86};8788static struct s3c_sdhci_platdata smdkc210_hsmmc1_pdata __initdata = {89.cd_type = S3C_SDHCI_CD_GPIO,90.ext_cd_gpio = EXYNOS4_GPK0(2),91.ext_cd_gpio_invert = 1,92.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,93};9495static struct s3c_sdhci_platdata smdkc210_hsmmc2_pdata __initdata = {96.cd_type = S3C_SDHCI_CD_GPIO,97.ext_cd_gpio = EXYNOS4_GPK2(2),98.ext_cd_gpio_invert = 1,99.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,100#ifdef CONFIG_EXYNOS4_SDHCI_CH2_8BIT101.max_width = 8,102.host_caps = MMC_CAP_8_BIT_DATA,103#endif104};105106static struct s3c_sdhci_platdata smdkc210_hsmmc3_pdata __initdata = {107.cd_type = S3C_SDHCI_CD_GPIO,108.ext_cd_gpio = EXYNOS4_GPK2(2),109.ext_cd_gpio_invert = 1,110.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,111};112113static struct resource smdkc210_smsc911x_resources[] = {114[0] = {115.start = EXYNOS4_PA_SROM_BANK(1),116.end = EXYNOS4_PA_SROM_BANK(1) + SZ_64K - 1,117.flags = IORESOURCE_MEM,118},119[1] = {120.start = IRQ_EINT(5),121.end = IRQ_EINT(5),122.flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW,123},124};125126static struct smsc911x_platform_config smsc9215_config = {127.irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,128.irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,129.flags = SMSC911X_USE_16BIT | SMSC911X_FORCE_INTERNAL_PHY,130.phy_interface = PHY_INTERFACE_MODE_MII,131.mac = {0x00, 0x80, 0x00, 0x23, 0x45, 0x67},132};133134static struct platform_device smdkc210_smsc911x = {135.name = "smsc911x",136.id = -1,137.num_resources = ARRAY_SIZE(smdkc210_smsc911x_resources),138.resource = smdkc210_smsc911x_resources,139.dev = {140.platform_data = &smsc9215_config,141},142};143144static struct i2c_board_info i2c_devs1[] __initdata = {145{I2C_BOARD_INFO("wm8994", 0x1a),},146};147148static struct platform_device *smdkc210_devices[] __initdata = {149&s3c_device_hsmmc0,150&s3c_device_hsmmc1,151&s3c_device_hsmmc2,152&s3c_device_hsmmc3,153&s3c_device_i2c1,154&s3c_device_rtc,155&s3c_device_wdt,156&exynos4_device_ac97,157&exynos4_device_i2s0,158&exynos4_device_pd[PD_MFC],159&exynos4_device_pd[PD_G3D],160&exynos4_device_pd[PD_LCD0],161&exynos4_device_pd[PD_LCD1],162&exynos4_device_pd[PD_CAM],163&exynos4_device_pd[PD_TV],164&exynos4_device_pd[PD_GPS],165&exynos4_device_sysmmu,166&samsung_asoc_dma,167&smdkc210_smsc911x,168};169170static void __init smdkc210_smsc911x_init(void)171{172u32 cs1;173174/* configure nCS1 width to 16 bits */175cs1 = __raw_readl(S5P_SROM_BW) &176~(S5P_SROM_BW__CS_MASK << S5P_SROM_BW__NCS1__SHIFT);177cs1 |= ((1 << S5P_SROM_BW__DATAWIDTH__SHIFT) |178(1 << S5P_SROM_BW__WAITENABLE__SHIFT) |179(1 << S5P_SROM_BW__BYTEENABLE__SHIFT)) <<180S5P_SROM_BW__NCS1__SHIFT;181__raw_writel(cs1, S5P_SROM_BW);182183/* set timing for nCS1 suitable for ethernet chip */184__raw_writel((0x1 << S5P_SROM_BCX__PMC__SHIFT) |185(0x9 << S5P_SROM_BCX__TACP__SHIFT) |186(0xc << S5P_SROM_BCX__TCAH__SHIFT) |187(0x1 << S5P_SROM_BCX__TCOH__SHIFT) |188(0x6 << S5P_SROM_BCX__TACC__SHIFT) |189(0x1 << S5P_SROM_BCX__TCOS__SHIFT) |190(0x1 << S5P_SROM_BCX__TACS__SHIFT), S5P_SROM_BC1);191}192193static void __init smdkc210_map_io(void)194{195s5p_init_io(NULL, 0, S5P_VA_CHIPID);196s3c24xx_init_clocks(24000000);197s3c24xx_init_uarts(smdkc210_uartcfgs, ARRAY_SIZE(smdkc210_uartcfgs));198}199200static void __init smdkc210_machine_init(void)201{202s3c_i2c1_set_platdata(NULL);203i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));204205smdkc210_smsc911x_init();206207s3c_sdhci0_set_platdata(&smdkc210_hsmmc0_pdata);208s3c_sdhci1_set_platdata(&smdkc210_hsmmc1_pdata);209s3c_sdhci2_set_platdata(&smdkc210_hsmmc2_pdata);210s3c_sdhci3_set_platdata(&smdkc210_hsmmc3_pdata);211212platform_add_devices(smdkc210_devices, ARRAY_SIZE(smdkc210_devices));213}214215MACHINE_START(SMDKC210, "SMDKC210")216/* Maintainer: Kukjin Kim <[email protected]> */217.boot_params = S5P_PA_SDRAM + 0x100,218.init_irq = exynos4_init_irq,219.map_io = smdkc210_map_io,220.init_machine = smdkc210_machine_init,221.timer = &exynos4_timer,222MACHINE_END223224225