189f95492SHeungJun, Kim /* 289f95492SHeungJun, Kim * Copyright (C) 2011 Samsung Electronics 389f95492SHeungJun, Kim * Heungjun Kim <riverful.kim@samsung.com> 489f95492SHeungJun, Kim * Kyungmin Park <kyungmin.park@samsung.com> 551b1cd6dSDonghwa Lee * Donghwa Lee <dh09.lee@samsung.com> 689f95492SHeungJun, Kim * 789f95492SHeungJun, Kim * See file CREDITS for list of people who contributed to this 889f95492SHeungJun, Kim * project. 989f95492SHeungJun, Kim * 1089f95492SHeungJun, Kim * This program is free software; you can redistribute it and/or 1189f95492SHeungJun, Kim * modify it under the terms of the GNU General Public License as 1289f95492SHeungJun, Kim * published by the Free Software Foundation; either version 2 of 1389f95492SHeungJun, Kim * the License, or (at your option) any later version. 1489f95492SHeungJun, Kim * 1589f95492SHeungJun, Kim * This program is distributed in the hope that it will be useful, 1689f95492SHeungJun, Kim * but WITHOUT ANY WARRANTY; without even the implied warranty of 1789f95492SHeungJun, Kim * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1889f95492SHeungJun, Kim * GNU General Public License for more details. 1989f95492SHeungJun, Kim * 2089f95492SHeungJun, Kim * You should have received a copy of the GNU General Public License 2189f95492SHeungJun, Kim * along with this program; if not, write to the Free Software 2289f95492SHeungJun, Kim * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 2389f95492SHeungJun, Kim * MA 02111-1307 USA 2489f95492SHeungJun, Kim */ 2589f95492SHeungJun, Kim 2689f95492SHeungJun, Kim #include <common.h> 2751b1cd6dSDonghwa Lee #include <lcd.h> 2889f95492SHeungJun, Kim #include <asm/io.h> 2989f95492SHeungJun, Kim #include <asm/arch/cpu.h> 3089f95492SHeungJun, Kim #include <asm/arch/gpio.h> 3189f95492SHeungJun, Kim #include <asm/arch/mmc.h> 32d651e88aSPiotr Wilczek #include <asm/arch/pinmux.h> 3389f95492SHeungJun, Kim #include <asm/arch/clock.h> 3451b1cd6dSDonghwa Lee #include <asm/arch/clk.h> 3551b1cd6dSDonghwa Lee #include <asm/arch/mipi_dsim.h> 3689f95492SHeungJun, Kim #include <asm/arch/watchdog.h> 3789f95492SHeungJun, Kim #include <asm/arch/power.h> 3889f95492SHeungJun, Kim #include <pmic.h> 3989f95492SHeungJun, Kim #include <usb/s3c_udc.h> 4004ce68eeSŁukasz Majewski #include <max8997_pmic.h> 4190464971SDonghwa Lee #include <libtizen.h> 4289f95492SHeungJun, Kim 4389f95492SHeungJun, Kim #include "setup.h" 4489f95492SHeungJun, Kim 4589f95492SHeungJun, Kim DECLARE_GLOBAL_DATA_PTR; 4689f95492SHeungJun, Kim 4789f95492SHeungJun, Kim unsigned int board_rev; 4889f95492SHeungJun, Kim 4989f95492SHeungJun, Kim #ifdef CONFIG_REVISION_TAG 5089f95492SHeungJun, Kim u32 get_board_rev(void) 5189f95492SHeungJun, Kim { 5289f95492SHeungJun, Kim return board_rev; 5389f95492SHeungJun, Kim } 5489f95492SHeungJun, Kim #endif 5589f95492SHeungJun, Kim 5689f95492SHeungJun, Kim static void check_hw_revision(void); 5789f95492SHeungJun, Kim 583d024086SDonghwa Lee static int hwrevision(int rev) 593d024086SDonghwa Lee { 603d024086SDonghwa Lee return (board_rev & 0xf) == rev; 613d024086SDonghwa Lee } 623d024086SDonghwa Lee 63a241d6efSLukasz Majewski struct s3c_plat_otg_data s5pc210_otg_data; 64a241d6efSLukasz Majewski 6589f95492SHeungJun, Kim int board_init(void) 6689f95492SHeungJun, Kim { 6789f95492SHeungJun, Kim gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100; 6889f95492SHeungJun, Kim 6989f95492SHeungJun, Kim check_hw_revision(); 7089f95492SHeungJun, Kim printf("HW Revision:\t0x%x\n", board_rev); 7189f95492SHeungJun, Kim 7289f95492SHeungJun, Kim #if defined(CONFIG_PMIC) 7389f95492SHeungJun, Kim pmic_init(); 7489f95492SHeungJun, Kim #endif 7589f95492SHeungJun, Kim 7689f95492SHeungJun, Kim return 0; 7789f95492SHeungJun, Kim } 7889f95492SHeungJun, Kim 79fd8dca83SŁukasz Majewski void i2c_init_board(void) 80fd8dca83SŁukasz Majewski { 81fd8dca83SŁukasz Majewski struct exynos4_gpio_part1 *gpio1 = 82fd8dca83SŁukasz Majewski (struct exynos4_gpio_part1 *)samsung_get_base_gpio_part1(); 83fd8dca83SŁukasz Majewski struct exynos4_gpio_part2 *gpio2 = 84fd8dca83SŁukasz Majewski (struct exynos4_gpio_part2 *)samsung_get_base_gpio_part2(); 85fd8dca83SŁukasz Majewski 86fd8dca83SŁukasz Majewski /* I2C_5 -> PMIC */ 87fd8dca83SŁukasz Majewski s5p_gpio_direction_output(&gpio1->b, 7, 1); 88fd8dca83SŁukasz Majewski s5p_gpio_direction_output(&gpio1->b, 6, 1); 89fd8dca83SŁukasz Majewski /* I2C_9 -> FG */ 90fd8dca83SŁukasz Majewski s5p_gpio_direction_output(&gpio2->y4, 0, 1); 91fd8dca83SŁukasz Majewski s5p_gpio_direction_output(&gpio2->y4, 1, 1); 92fd8dca83SŁukasz Majewski } 93fd8dca83SŁukasz Majewski 9489f95492SHeungJun, Kim int dram_init(void) 9589f95492SHeungJun, Kim { 9689f95492SHeungJun, Kim gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE) + 9711c5bc0bSPiotr Wilczek get_ram_size((long *)PHYS_SDRAM_2, PHYS_SDRAM_2_SIZE) + 9811c5bc0bSPiotr Wilczek get_ram_size((long *)PHYS_SDRAM_3, PHYS_SDRAM_3_SIZE) + 9911c5bc0bSPiotr Wilczek get_ram_size((long *)PHYS_SDRAM_4, PHYS_SDRAM_4_SIZE); 10089f95492SHeungJun, Kim 10189f95492SHeungJun, Kim return 0; 10289f95492SHeungJun, Kim } 10389f95492SHeungJun, Kim 10489f95492SHeungJun, Kim void dram_init_banksize(void) 10589f95492SHeungJun, Kim { 10689f95492SHeungJun, Kim gd->bd->bi_dram[0].start = PHYS_SDRAM_1; 10789f95492SHeungJun, Kim gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; 10889f95492SHeungJun, Kim gd->bd->bi_dram[1].start = PHYS_SDRAM_2; 10989f95492SHeungJun, Kim gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE; 11011c5bc0bSPiotr Wilczek gd->bd->bi_dram[2].start = PHYS_SDRAM_3; 11111c5bc0bSPiotr Wilczek gd->bd->bi_dram[2].size = PHYS_SDRAM_3_SIZE; 11211c5bc0bSPiotr Wilczek gd->bd->bi_dram[3].start = PHYS_SDRAM_4; 11311c5bc0bSPiotr Wilczek gd->bd->bi_dram[3].size = PHYS_SDRAM_4_SIZE; 11489f95492SHeungJun, Kim } 11589f95492SHeungJun, Kim 11689f95492SHeungJun, Kim static unsigned int get_hw_revision(void) 11789f95492SHeungJun, Kim { 11889f95492SHeungJun, Kim struct exynos4_gpio_part1 *gpio = 11989f95492SHeungJun, Kim (struct exynos4_gpio_part1 *)samsung_get_base_gpio_part1(); 12089f95492SHeungJun, Kim int hwrev = 0; 12189f95492SHeungJun, Kim int i; 12289f95492SHeungJun, Kim 12389f95492SHeungJun, Kim /* hw_rev[3:0] == GPE1[3:0] */ 12489f95492SHeungJun, Kim for (i = 0; i < 4; i++) { 12589f95492SHeungJun, Kim s5p_gpio_cfg_pin(&gpio->e1, i, GPIO_INPUT); 12689f95492SHeungJun, Kim s5p_gpio_set_pull(&gpio->e1, i, GPIO_PULL_NONE); 12789f95492SHeungJun, Kim } 12889f95492SHeungJun, Kim 12989f95492SHeungJun, Kim udelay(1); 13089f95492SHeungJun, Kim 13189f95492SHeungJun, Kim for (i = 0; i < 4; i++) 13289f95492SHeungJun, Kim hwrev |= (s5p_gpio_get_value(&gpio->e1, i) << i); 13389f95492SHeungJun, Kim 13489f95492SHeungJun, Kim debug("hwrev 0x%x\n", hwrev); 13589f95492SHeungJun, Kim 13689f95492SHeungJun, Kim return hwrev; 13789f95492SHeungJun, Kim } 13889f95492SHeungJun, Kim 13989f95492SHeungJun, Kim static void check_hw_revision(void) 14089f95492SHeungJun, Kim { 14189f95492SHeungJun, Kim int hwrev; 14289f95492SHeungJun, Kim 14389f95492SHeungJun, Kim hwrev = get_hw_revision(); 14489f95492SHeungJun, Kim 14589f95492SHeungJun, Kim board_rev |= hwrev; 14689f95492SHeungJun, Kim } 14789f95492SHeungJun, Kim 14889f95492SHeungJun, Kim #ifdef CONFIG_DISPLAY_BOARDINFO 14989f95492SHeungJun, Kim int checkboard(void) 15089f95492SHeungJun, Kim { 15189f95492SHeungJun, Kim puts("Board:\tTRATS\n"); 15289f95492SHeungJun, Kim return 0; 15389f95492SHeungJun, Kim } 15489f95492SHeungJun, Kim #endif 15589f95492SHeungJun, Kim 15689f95492SHeungJun, Kim #ifdef CONFIG_GENERIC_MMC 15789f95492SHeungJun, Kim int board_mmc_init(bd_t *bis) 15889f95492SHeungJun, Kim { 15989f95492SHeungJun, Kim struct exynos4_gpio_part2 *gpio = 16089f95492SHeungJun, Kim (struct exynos4_gpio_part2 *)samsung_get_base_gpio_part2(); 161d651e88aSPiotr Wilczek int err; 16289f95492SHeungJun, Kim 16389f95492SHeungJun, Kim /* eMMC_EN: SD_0_CDn: GPK0[2] Output High */ 16489f95492SHeungJun, Kim s5p_gpio_direction_output(&gpio->k0, 2, 1); 16589f95492SHeungJun, Kim s5p_gpio_set_pull(&gpio->k0, 2, GPIO_PULL_NONE); 16689f95492SHeungJun, Kim 16789f95492SHeungJun, Kim /* 16889f95492SHeungJun, Kim * MMC device init 16989f95492SHeungJun, Kim * mmc0 : eMMC (8-bit buswidth) 17089f95492SHeungJun, Kim * mmc2 : SD card (4-bit buswidth) 17189f95492SHeungJun, Kim */ 172d651e88aSPiotr Wilczek err = exynos_pinmux_config(PERIPH_ID_SDMMC0, PINMUX_FLAG_8BIT_MODE); 173d651e88aSPiotr Wilczek if (err) 174d651e88aSPiotr Wilczek debug("SDMMC0 not configured\n"); 175d651e88aSPiotr Wilczek else 17689f95492SHeungJun, Kim err = s5p_mmc_init(0, 8); 17789f95492SHeungJun, Kim 17889f95492SHeungJun, Kim /* T-flash detect */ 17989f95492SHeungJun, Kim s5p_gpio_cfg_pin(&gpio->x3, 4, 0xf); 18089f95492SHeungJun, Kim s5p_gpio_set_pull(&gpio->x3, 4, GPIO_PULL_UP); 18189f95492SHeungJun, Kim 18289f95492SHeungJun, Kim /* 18389f95492SHeungJun, Kim * Check the T-flash detect pin 18489f95492SHeungJun, Kim * GPX3[4] T-flash detect pin 18589f95492SHeungJun, Kim */ 18689f95492SHeungJun, Kim if (!s5p_gpio_get_value(&gpio->x3, 4)) { 187d651e88aSPiotr Wilczek err = exynos_pinmux_config(PERIPH_ID_SDMMC2, PINMUX_FLAG_NONE); 188d651e88aSPiotr Wilczek if (err) 189d651e88aSPiotr Wilczek debug("SDMMC2 not configured\n"); 190d651e88aSPiotr Wilczek else 19189f95492SHeungJun, Kim err = s5p_mmc_init(2, 4); 19289f95492SHeungJun, Kim } 19389f95492SHeungJun, Kim 19489f95492SHeungJun, Kim return err; 19589f95492SHeungJun, Kim } 19689f95492SHeungJun, Kim #endif 19789f95492SHeungJun, Kim 19889f95492SHeungJun, Kim #ifdef CONFIG_USB_GADGET 19989f95492SHeungJun, Kim static int s5pc210_phy_control(int on) 20089f95492SHeungJun, Kim { 20189f95492SHeungJun, Kim int ret = 0; 202a0f5b5a3SŁukasz Majewski u32 val = 0; 20389f95492SHeungJun, Kim struct pmic *p = get_pmic(); 20489f95492SHeungJun, Kim 20589f95492SHeungJun, Kim if (pmic_probe(p)) 20689f95492SHeungJun, Kim return -1; 20789f95492SHeungJun, Kim 20889f95492SHeungJun, Kim if (on) { 20904ce68eeSŁukasz Majewski ret |= pmic_set_output(p, MAX8997_REG_SAFEOUTCTRL, 21004ce68eeSŁukasz Majewski ENSAFEOUT1, LDO_ON); 211a0f5b5a3SŁukasz Majewski ret |= pmic_reg_read(p, MAX8997_REG_LDO3CTRL, &val); 212a0f5b5a3SŁukasz Majewski ret |= pmic_reg_write(p, MAX8997_REG_LDO3CTRL, EN_LDO | val); 213a0f5b5a3SŁukasz Majewski 214a0f5b5a3SŁukasz Majewski ret |= pmic_reg_read(p, MAX8997_REG_LDO8CTRL, &val); 215a0f5b5a3SŁukasz Majewski ret |= pmic_reg_write(p, MAX8997_REG_LDO8CTRL, EN_LDO | val); 21689f95492SHeungJun, Kim } else { 217a0f5b5a3SŁukasz Majewski ret |= pmic_reg_read(p, MAX8997_REG_LDO8CTRL, &val); 218a0f5b5a3SŁukasz Majewski ret |= pmic_reg_write(p, MAX8997_REG_LDO8CTRL, DIS_LDO | val); 219a0f5b5a3SŁukasz Majewski 220a0f5b5a3SŁukasz Majewski ret |= pmic_reg_read(p, MAX8997_REG_LDO3CTRL, &val); 221a0f5b5a3SŁukasz Majewski ret |= pmic_reg_write(p, MAX8997_REG_LDO3CTRL, DIS_LDO | val); 22204ce68eeSŁukasz Majewski ret |= pmic_set_output(p, MAX8997_REG_SAFEOUTCTRL, 22304ce68eeSŁukasz Majewski ENSAFEOUT1, LDO_OFF); 22489f95492SHeungJun, Kim } 22589f95492SHeungJun, Kim 22689f95492SHeungJun, Kim if (ret) { 22704ce68eeSŁukasz Majewski puts("MAX8997 LDO setting error!\n"); 22889f95492SHeungJun, Kim return -1; 22989f95492SHeungJun, Kim } 23089f95492SHeungJun, Kim 23189f95492SHeungJun, Kim return 0; 23289f95492SHeungJun, Kim } 23389f95492SHeungJun, Kim 23489f95492SHeungJun, Kim struct s3c_plat_otg_data s5pc210_otg_data = { 23589f95492SHeungJun, Kim .phy_control = s5pc210_phy_control, 23689f95492SHeungJun, Kim .regs_phy = EXYNOS4_USBPHY_BASE, 23789f95492SHeungJun, Kim .regs_otg = EXYNOS4_USBOTG_BASE, 23889f95492SHeungJun, Kim .usb_phy_ctrl = EXYNOS4_USBPHY_CONTROL, 23989f95492SHeungJun, Kim .usb_flags = PHY0_SLEEP, 24089f95492SHeungJun, Kim }; 241a241d6efSLukasz Majewski 242a241d6efSLukasz Majewski void board_usb_init(void) 243a241d6efSLukasz Majewski { 244a241d6efSLukasz Majewski debug("USB_udc_probe\n"); 245a241d6efSLukasz Majewski s3c_udc_probe(&s5pc210_otg_data); 246a241d6efSLukasz Majewski } 24789f95492SHeungJun, Kim #endif 24889f95492SHeungJun, Kim 24989f95492SHeungJun, Kim static void pmic_reset(void) 25089f95492SHeungJun, Kim { 25189f95492SHeungJun, Kim struct exynos4_gpio_part2 *gpio = 25289f95492SHeungJun, Kim (struct exynos4_gpio_part2 *)samsung_get_base_gpio_part2(); 25389f95492SHeungJun, Kim 25489f95492SHeungJun, Kim s5p_gpio_direction_output(&gpio->x0, 7, 1); 25589f95492SHeungJun, Kim s5p_gpio_set_pull(&gpio->x2, 7, GPIO_PULL_NONE); 25689f95492SHeungJun, Kim } 25789f95492SHeungJun, Kim 25889f95492SHeungJun, Kim static void board_clock_init(void) 25989f95492SHeungJun, Kim { 26089f95492SHeungJun, Kim struct exynos4_clock *clk = 26189f95492SHeungJun, Kim (struct exynos4_clock *)samsung_get_base_clock(); 26289f95492SHeungJun, Kim 26389f95492SHeungJun, Kim writel(CLK_SRC_CPU_VAL, (unsigned int)&clk->src_cpu); 26489f95492SHeungJun, Kim writel(CLK_SRC_TOP0_VAL, (unsigned int)&clk->src_top0); 26589f95492SHeungJun, Kim writel(CLK_SRC_FSYS_VAL, (unsigned int)&clk->src_fsys); 26689f95492SHeungJun, Kim writel(CLK_SRC_PERIL0_VAL, (unsigned int)&clk->src_peril0); 26789f95492SHeungJun, Kim 26889f95492SHeungJun, Kim writel(CLK_DIV_CPU0_VAL, (unsigned int)&clk->div_cpu0); 26989f95492SHeungJun, Kim writel(CLK_DIV_CPU1_VAL, (unsigned int)&clk->div_cpu1); 27089f95492SHeungJun, Kim writel(CLK_DIV_DMC0_VAL, (unsigned int)&clk->div_dmc0); 27189f95492SHeungJun, Kim writel(CLK_DIV_DMC1_VAL, (unsigned int)&clk->div_dmc1); 27289f95492SHeungJun, Kim writel(CLK_DIV_LEFTBUS_VAL, (unsigned int)&clk->div_leftbus); 27389f95492SHeungJun, Kim writel(CLK_DIV_RIGHTBUS_VAL, (unsigned int)&clk->div_rightbus); 27489f95492SHeungJun, Kim writel(CLK_DIV_TOP_VAL, (unsigned int)&clk->div_top); 27589f95492SHeungJun, Kim writel(CLK_DIV_FSYS1_VAL, (unsigned int)&clk->div_fsys1); 27689f95492SHeungJun, Kim writel(CLK_DIV_FSYS2_VAL, (unsigned int)&clk->div_fsys2); 27789f95492SHeungJun, Kim writel(CLK_DIV_FSYS3_VAL, (unsigned int)&clk->div_fsys3); 27889f95492SHeungJun, Kim writel(CLK_DIV_PERIL0_VAL, (unsigned int)&clk->div_peril0); 27989f95492SHeungJun, Kim writel(CLK_DIV_PERIL3_VAL, (unsigned int)&clk->div_peril3); 28089f95492SHeungJun, Kim 28189f95492SHeungJun, Kim writel(PLL_LOCKTIME, (unsigned int)&clk->apll_lock); 28289f95492SHeungJun, Kim writel(PLL_LOCKTIME, (unsigned int)&clk->mpll_lock); 28389f95492SHeungJun, Kim writel(PLL_LOCKTIME, (unsigned int)&clk->epll_lock); 28489f95492SHeungJun, Kim writel(PLL_LOCKTIME, (unsigned int)&clk->vpll_lock); 28589f95492SHeungJun, Kim writel(APLL_CON1_VAL, (unsigned int)&clk->apll_con1); 28689f95492SHeungJun, Kim writel(APLL_CON0_VAL, (unsigned int)&clk->apll_con0); 28789f95492SHeungJun, Kim writel(MPLL_CON1_VAL, (unsigned int)&clk->mpll_con1); 28889f95492SHeungJun, Kim writel(MPLL_CON0_VAL, (unsigned int)&clk->mpll_con0); 28989f95492SHeungJun, Kim writel(EPLL_CON1_VAL, (unsigned int)&clk->epll_con1); 29089f95492SHeungJun, Kim writel(EPLL_CON0_VAL, (unsigned int)&clk->epll_con0); 29189f95492SHeungJun, Kim writel(VPLL_CON1_VAL, (unsigned int)&clk->vpll_con1); 29289f95492SHeungJun, Kim writel(VPLL_CON0_VAL, (unsigned int)&clk->vpll_con0); 29389f95492SHeungJun, Kim 29489f95492SHeungJun, Kim writel(CLK_GATE_IP_CAM_VAL, (unsigned int)&clk->gate_ip_cam); 29589f95492SHeungJun, Kim writel(CLK_GATE_IP_VP_VAL, (unsigned int)&clk->gate_ip_tv); 29689f95492SHeungJun, Kim writel(CLK_GATE_IP_MFC_VAL, (unsigned int)&clk->gate_ip_mfc); 29789f95492SHeungJun, Kim writel(CLK_GATE_IP_G3D_VAL, (unsigned int)&clk->gate_ip_g3d); 29889f95492SHeungJun, Kim writel(CLK_GATE_IP_IMAGE_VAL, (unsigned int)&clk->gate_ip_image); 29989f95492SHeungJun, Kim writel(CLK_GATE_IP_LCD0_VAL, (unsigned int)&clk->gate_ip_lcd0); 30089f95492SHeungJun, Kim writel(CLK_GATE_IP_LCD1_VAL, (unsigned int)&clk->gate_ip_lcd1); 30189f95492SHeungJun, Kim writel(CLK_GATE_IP_FSYS_VAL, (unsigned int)&clk->gate_ip_fsys); 30289f95492SHeungJun, Kim writel(CLK_GATE_IP_GPS_VAL, (unsigned int)&clk->gate_ip_gps); 30389f95492SHeungJun, Kim writel(CLK_GATE_IP_PERIL_VAL, (unsigned int)&clk->gate_ip_peril); 30489f95492SHeungJun, Kim writel(CLK_GATE_IP_PERIR_VAL, (unsigned int)&clk->gate_ip_perir); 30589f95492SHeungJun, Kim writel(CLK_GATE_BLOCK_VAL, (unsigned int)&clk->gate_block); 30689f95492SHeungJun, Kim } 30789f95492SHeungJun, Kim 30889f95492SHeungJun, Kim static void board_power_init(void) 30989f95492SHeungJun, Kim { 31089f95492SHeungJun, Kim struct exynos4_power *pwr = 31189f95492SHeungJun, Kim (struct exynos4_power *)samsung_get_base_power(); 31289f95492SHeungJun, Kim 31389f95492SHeungJun, Kim /* PS HOLD */ 31489f95492SHeungJun, Kim writel(EXYNOS4_PS_HOLD_CON_VAL, (unsigned int)&pwr->ps_hold_control); 31589f95492SHeungJun, Kim 31689f95492SHeungJun, Kim /* Set power down */ 31789f95492SHeungJun, Kim writel(0, (unsigned int)&pwr->cam_configuration); 31889f95492SHeungJun, Kim writel(0, (unsigned int)&pwr->tv_configuration); 31989f95492SHeungJun, Kim writel(0, (unsigned int)&pwr->mfc_configuration); 32089f95492SHeungJun, Kim writel(0, (unsigned int)&pwr->g3d_configuration); 32189f95492SHeungJun, Kim writel(0, (unsigned int)&pwr->lcd1_configuration); 32289f95492SHeungJun, Kim writel(0, (unsigned int)&pwr->gps_configuration); 32389f95492SHeungJun, Kim writel(0, (unsigned int)&pwr->gps_alive_configuration); 324*ab23304dSPiotr Wilczek 325*ab23304dSPiotr Wilczek /* It is necessary to power down core 1 */ 326*ab23304dSPiotr Wilczek /* to successfully boot CPU1 in kernel */ 327*ab23304dSPiotr Wilczek writel(0, (unsigned int)&pwr->arm_core1_configuration); 32889f95492SHeungJun, Kim } 32989f95492SHeungJun, Kim 33089f95492SHeungJun, Kim static void board_uart_init(void) 33189f95492SHeungJun, Kim { 33289f95492SHeungJun, Kim struct exynos4_gpio_part1 *gpio1 = 33389f95492SHeungJun, Kim (struct exynos4_gpio_part1 *)samsung_get_base_gpio_part1(); 33489f95492SHeungJun, Kim struct exynos4_gpio_part2 *gpio2 = 33589f95492SHeungJun, Kim (struct exynos4_gpio_part2 *)samsung_get_base_gpio_part2(); 33689f95492SHeungJun, Kim int i; 33789f95492SHeungJun, Kim 33889f95492SHeungJun, Kim /* 3398aca4d64SMinkyu Kang * UART2 GPIOs 3408aca4d64SMinkyu Kang * GPA1CON[0] = UART_2_RXD(2) 3418aca4d64SMinkyu Kang * GPA1CON[1] = UART_2_TXD(2) 34289f95492SHeungJun, Kim * GPA1CON[2] = I2C_3_SDA (3) 3438aca4d64SMinkyu Kang * GPA1CON[3] = I2C_3_SCL (3) 34489f95492SHeungJun, Kim */ 3458aca4d64SMinkyu Kang 3468aca4d64SMinkyu Kang for (i = 0; i < 4; i++) { 34789f95492SHeungJun, Kim s5p_gpio_set_pull(&gpio1->a1, i, GPIO_PULL_NONE); 3488aca4d64SMinkyu Kang s5p_gpio_cfg_pin(&gpio1->a1, i, GPIO_FUNC((i > 1) ? 0x3 : 0x2)); 34989f95492SHeungJun, Kim } 35089f95492SHeungJun, Kim 35189f95492SHeungJun, Kim /* UART_SEL GPY4[7] (part2) at EXYNOS4 */ 35289f95492SHeungJun, Kim s5p_gpio_set_pull(&gpio2->y4, 7, GPIO_PULL_UP); 35389f95492SHeungJun, Kim s5p_gpio_direction_output(&gpio2->y4, 7, 1); 35489f95492SHeungJun, Kim } 35589f95492SHeungJun, Kim 35689f95492SHeungJun, Kim int board_early_init_f(void) 35789f95492SHeungJun, Kim { 35885948a8bSMinkyu Kang wdt_stop(); 35989f95492SHeungJun, Kim pmic_reset(); 36089f95492SHeungJun, Kim board_clock_init(); 36189f95492SHeungJun, Kim board_uart_init(); 36289f95492SHeungJun, Kim board_power_init(); 36389f95492SHeungJun, Kim 36489f95492SHeungJun, Kim return 0; 36589f95492SHeungJun, Kim } 36651b1cd6dSDonghwa Lee 36751b1cd6dSDonghwa Lee static void lcd_reset(void) 36851b1cd6dSDonghwa Lee { 36951b1cd6dSDonghwa Lee struct exynos4_gpio_part2 *gpio2 = 37051b1cd6dSDonghwa Lee (struct exynos4_gpio_part2 *)samsung_get_base_gpio_part2(); 37151b1cd6dSDonghwa Lee 37251b1cd6dSDonghwa Lee s5p_gpio_direction_output(&gpio2->y4, 5, 1); 37351b1cd6dSDonghwa Lee udelay(10000); 37451b1cd6dSDonghwa Lee s5p_gpio_direction_output(&gpio2->y4, 5, 0); 37551b1cd6dSDonghwa Lee udelay(10000); 37651b1cd6dSDonghwa Lee s5p_gpio_direction_output(&gpio2->y4, 5, 1); 37751b1cd6dSDonghwa Lee } 37851b1cd6dSDonghwa Lee 37951b1cd6dSDonghwa Lee static int lcd_power(void) 38051b1cd6dSDonghwa Lee { 38151b1cd6dSDonghwa Lee int ret = 0; 38251b1cd6dSDonghwa Lee struct pmic *p = get_pmic(); 38351b1cd6dSDonghwa Lee 38451b1cd6dSDonghwa Lee if (pmic_probe(p)) 38551b1cd6dSDonghwa Lee return 0; 38651b1cd6dSDonghwa Lee 38751b1cd6dSDonghwa Lee /* LDO15 voltage: 2.2v */ 38851b1cd6dSDonghwa Lee ret |= pmic_reg_write(p, MAX8997_REG_LDO15CTRL, 0x1c | EN_LDO); 38951b1cd6dSDonghwa Lee /* LDO13 voltage: 3.0v */ 39051b1cd6dSDonghwa Lee ret |= pmic_reg_write(p, MAX8997_REG_LDO13CTRL, 0x2c | EN_LDO); 39151b1cd6dSDonghwa Lee 39251b1cd6dSDonghwa Lee if (ret) { 39351b1cd6dSDonghwa Lee puts("MAX8997 LDO setting error!\n"); 39451b1cd6dSDonghwa Lee return -1; 39551b1cd6dSDonghwa Lee } 39651b1cd6dSDonghwa Lee 39751b1cd6dSDonghwa Lee return 0; 39851b1cd6dSDonghwa Lee } 39951b1cd6dSDonghwa Lee 40051b1cd6dSDonghwa Lee static struct mipi_dsim_config dsim_config = { 40151b1cd6dSDonghwa Lee .e_interface = DSIM_VIDEO, 40251b1cd6dSDonghwa Lee .e_virtual_ch = DSIM_VIRTUAL_CH_0, 40351b1cd6dSDonghwa Lee .e_pixel_format = DSIM_24BPP_888, 40451b1cd6dSDonghwa Lee .e_burst_mode = DSIM_BURST_SYNC_EVENT, 40551b1cd6dSDonghwa Lee .e_no_data_lane = DSIM_DATA_LANE_4, 40651b1cd6dSDonghwa Lee .e_byte_clk = DSIM_PLL_OUT_DIV8, 40751b1cd6dSDonghwa Lee .hfp = 1, 40851b1cd6dSDonghwa Lee 40951b1cd6dSDonghwa Lee .p = 3, 41051b1cd6dSDonghwa Lee .m = 120, 41151b1cd6dSDonghwa Lee .s = 1, 41251b1cd6dSDonghwa Lee 41351b1cd6dSDonghwa Lee /* D-PHY PLL stable time spec :min = 200usec ~ max 400usec */ 41451b1cd6dSDonghwa Lee .pll_stable_time = 500, 41551b1cd6dSDonghwa Lee 41651b1cd6dSDonghwa Lee /* escape clk : 10MHz */ 41751b1cd6dSDonghwa Lee .esc_clk = 20 * 1000000, 41851b1cd6dSDonghwa Lee 41951b1cd6dSDonghwa Lee /* stop state holding counter after bta change count 0 ~ 0xfff */ 42051b1cd6dSDonghwa Lee .stop_holding_cnt = 0x7ff, 42151b1cd6dSDonghwa Lee /* bta timeout 0 ~ 0xff */ 42251b1cd6dSDonghwa Lee .bta_timeout = 0xff, 42351b1cd6dSDonghwa Lee /* lp rx timeout 0 ~ 0xffff */ 42451b1cd6dSDonghwa Lee .rx_timeout = 0xffff, 42551b1cd6dSDonghwa Lee }; 42651b1cd6dSDonghwa Lee 42751b1cd6dSDonghwa Lee static struct exynos_platform_mipi_dsim s6e8ax0_platform_data = { 42851b1cd6dSDonghwa Lee .lcd_panel_info = NULL, 42951b1cd6dSDonghwa Lee .dsim_config = &dsim_config, 43051b1cd6dSDonghwa Lee }; 43151b1cd6dSDonghwa Lee 43251b1cd6dSDonghwa Lee static struct mipi_dsim_lcd_device mipi_lcd_device = { 43351b1cd6dSDonghwa Lee .name = "s6e8ax0", 43451b1cd6dSDonghwa Lee .id = -1, 43551b1cd6dSDonghwa Lee .bus_id = 0, 43651b1cd6dSDonghwa Lee .platform_data = (void *)&s6e8ax0_platform_data, 43751b1cd6dSDonghwa Lee }; 43851b1cd6dSDonghwa Lee 43951b1cd6dSDonghwa Lee static int mipi_power(void) 44051b1cd6dSDonghwa Lee { 44151b1cd6dSDonghwa Lee int ret = 0; 44251b1cd6dSDonghwa Lee struct pmic *p = get_pmic(); 44351b1cd6dSDonghwa Lee 44451b1cd6dSDonghwa Lee if (pmic_probe(p)) 44551b1cd6dSDonghwa Lee return 0; 44651b1cd6dSDonghwa Lee 44751b1cd6dSDonghwa Lee /* LDO3 voltage: 1.1v */ 44851b1cd6dSDonghwa Lee ret |= pmic_reg_write(p, MAX8997_REG_LDO3CTRL, 0x6 | EN_LDO); 44951b1cd6dSDonghwa Lee /* LDO4 voltage: 1.8v */ 45051b1cd6dSDonghwa Lee ret |= pmic_reg_write(p, MAX8997_REG_LDO4CTRL, 0x14 | EN_LDO); 45151b1cd6dSDonghwa Lee 45251b1cd6dSDonghwa Lee if (ret) { 45351b1cd6dSDonghwa Lee puts("MAX8997 LDO setting error!\n"); 45451b1cd6dSDonghwa Lee return -1; 45551b1cd6dSDonghwa Lee } 45651b1cd6dSDonghwa Lee 45751b1cd6dSDonghwa Lee return 0; 45851b1cd6dSDonghwa Lee } 45951b1cd6dSDonghwa Lee 460c2054569SDonghwa Lee vidinfo_t panel_info = { 461c2054569SDonghwa Lee .vl_freq = 60, 462c2054569SDonghwa Lee .vl_col = 720, 463c2054569SDonghwa Lee .vl_row = 1280, 464c2054569SDonghwa Lee .vl_width = 720, 465c2054569SDonghwa Lee .vl_height = 1280, 466c2054569SDonghwa Lee .vl_clkp = CONFIG_SYS_HIGH, 467c2054569SDonghwa Lee .vl_hsp = CONFIG_SYS_LOW, 468c2054569SDonghwa Lee .vl_vsp = CONFIG_SYS_LOW, 469c2054569SDonghwa Lee .vl_dp = CONFIG_SYS_LOW, 470c2054569SDonghwa Lee .vl_bpix = 5, /* Bits per pixel, 2^5 = 32 */ 471c2054569SDonghwa Lee 472c2054569SDonghwa Lee /* s6e8ax0 Panel infomation */ 473c2054569SDonghwa Lee .vl_hspw = 5, 474c2054569SDonghwa Lee .vl_hbpd = 10, 475c2054569SDonghwa Lee .vl_hfpd = 10, 476c2054569SDonghwa Lee 477c2054569SDonghwa Lee .vl_vspw = 2, 478c2054569SDonghwa Lee .vl_vbpd = 1, 479c2054569SDonghwa Lee .vl_vfpd = 13, 480c2054569SDonghwa Lee .vl_cmd_allow_len = 0xf, 481c2054569SDonghwa Lee 482c2054569SDonghwa Lee .win_id = 3, 483c2054569SDonghwa Lee .cfg_gpio = NULL, 484c2054569SDonghwa Lee .backlight_on = NULL, 485c2054569SDonghwa Lee .lcd_power_on = NULL, /* lcd_power_on in mipi dsi driver */ 486c2054569SDonghwa Lee .reset_lcd = lcd_reset, 487c2054569SDonghwa Lee .dual_lcd_enabled = 0, 488c2054569SDonghwa Lee 489c2054569SDonghwa Lee .init_delay = 0, 490c2054569SDonghwa Lee .power_on_delay = 0, 491c2054569SDonghwa Lee .reset_delay = 0, 492c2054569SDonghwa Lee .interface_mode = FIMD_RGB_INTERFACE, 493c2054569SDonghwa Lee .mipi_enabled = 1, 494c2054569SDonghwa Lee }; 495c2054569SDonghwa Lee 49651b1cd6dSDonghwa Lee void init_panel_info(vidinfo_t *vid) 49751b1cd6dSDonghwa Lee { 49890464971SDonghwa Lee vid->logo_on = 1, 49990464971SDonghwa Lee vid->resolution = HD_RESOLUTION, 50090464971SDonghwa Lee vid->rgb_mode = MODE_RGB_P, 50190464971SDonghwa Lee 50290464971SDonghwa Lee #ifdef CONFIG_TIZEN 50390464971SDonghwa Lee get_tizen_logo_info(vid); 50490464971SDonghwa Lee #endif 50551b1cd6dSDonghwa Lee 5063d024086SDonghwa Lee if (hwrevision(2)) 5073d024086SDonghwa Lee mipi_lcd_device.reverse_panel = 1; 5083d024086SDonghwa Lee 50951b1cd6dSDonghwa Lee strcpy(s6e8ax0_platform_data.lcd_panel_name, mipi_lcd_device.name); 51051b1cd6dSDonghwa Lee s6e8ax0_platform_data.lcd_power = lcd_power; 51151b1cd6dSDonghwa Lee s6e8ax0_platform_data.mipi_power = mipi_power; 51251b1cd6dSDonghwa Lee s6e8ax0_platform_data.phy_enable = set_mipi_phy_ctrl; 51351b1cd6dSDonghwa Lee s6e8ax0_platform_data.lcd_panel_info = (void *)vid; 51451b1cd6dSDonghwa Lee exynos_mipi_dsi_register_lcd_device(&mipi_lcd_device); 51551b1cd6dSDonghwa Lee s6e8ax0_init(); 51651b1cd6dSDonghwa Lee exynos_set_dsim_platform_data(&s6e8ax0_platform_data); 51751b1cd6dSDonghwa Lee 51851b1cd6dSDonghwa Lee setenv("lcdinfo", "lcd=s6e8ax0"); 51951b1cd6dSDonghwa Lee } 520