19e40808cSMinkyu Kang /* 29e40808cSMinkyu Kang * Copyright (C) 2010 Samsung Electronics 39e40808cSMinkyu Kang * Minkyu Kang <mk7.kang@samsung.com> 49e40808cSMinkyu Kang * Kyungmin Park <kyungmin.park@samsung.com> 59e40808cSMinkyu Kang * 61a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 79e40808cSMinkyu Kang */ 89e40808cSMinkyu Kang 99e40808cSMinkyu Kang #include <common.h> 10ff0fedd5SPiotr Wilczek #include <spi.h> 11d984b9f8SPiotr Wilczek #include <lcd.h> 129e40808cSMinkyu Kang #include <asm/io.h> 13ff0fedd5SPiotr Wilczek #include <asm/gpio.h> 149e40808cSMinkyu Kang #include <asm/arch/adc.h> 15ea7991b8SPiotr Wilczek #include <asm/arch/pinmux.h> 1611a44798SPiotr Wilczek #include <asm/arch/watchdog.h> 17d984b9f8SPiotr Wilczek #include <ld9040.h> 18c7336815SŁukasz Majewski #include <power/pmic.h> 193f41ffe4SPiotr Wilczek #include <usb.h> 20ddc7e541SLukasz Majewski #include <usb/s3c_udc.h> 21ddc7e541SLukasz Majewski #include <asm/arch/cpu.h> 22c7336815SŁukasz Majewski #include <power/max8998_pmic.h> 233f41ffe4SPiotr Wilczek #include <libtizen.h> 2482b0a055SPrzemyslaw Marczak #include <samsung/misc.h> 253f41ffe4SPiotr Wilczek #include <usb_mass_storage.h> 269e40808cSMinkyu Kang 279e40808cSMinkyu Kang DECLARE_GLOBAL_DATA_PTR; 289e40808cSMinkyu Kang 299e40808cSMinkyu Kang unsigned int board_rev; 309e40808cSMinkyu Kang 319e40808cSMinkyu Kang u32 get_board_rev(void) 329e40808cSMinkyu Kang { 339e40808cSMinkyu Kang return board_rev; 349e40808cSMinkyu Kang } 359e40808cSMinkyu Kang 369e40808cSMinkyu Kang static int get_hwrev(void) 379e40808cSMinkyu Kang { 389e40808cSMinkyu Kang return board_rev & 0xFF; 399e40808cSMinkyu Kang } 409e40808cSMinkyu Kang 4148e91caeSMinkyu Kang static void init_pmic_lcd(void); 4248e91caeSMinkyu Kang 433f41ffe4SPiotr Wilczek int exynos_power_init(void) 44f5a7004cSŁukasz Majewski { 45f5a7004cSŁukasz Majewski int ret; 46f5a7004cSŁukasz Majewski 472936df1fSŁukasz Majewski /* 482936df1fSŁukasz Majewski * For PMIC the I2C bus is named as I2C5, but it is connected 492936df1fSŁukasz Majewski * to logical I2C adapter 0 502936df1fSŁukasz Majewski */ 51c47817beSPiotr Wilczek ret = pmic_init(I2C_0); 52f5a7004cSŁukasz Majewski if (ret) 53f5a7004cSŁukasz Majewski return ret; 54f5a7004cSŁukasz Majewski 5548e91caeSMinkyu Kang init_pmic_lcd(); 5648e91caeSMinkyu Kang 57f5a7004cSŁukasz Majewski return 0; 58f5a7004cSŁukasz Majewski } 599e40808cSMinkyu Kang 609e40808cSMinkyu Kang static unsigned short get_adc_value(int channel) 619e40808cSMinkyu Kang { 629e40808cSMinkyu Kang struct s5p_adc *adc = (struct s5p_adc *)samsung_get_base_adc(); 639e40808cSMinkyu Kang unsigned short ret = 0; 649e40808cSMinkyu Kang unsigned int reg; 659e40808cSMinkyu Kang unsigned int loop = 0; 669e40808cSMinkyu Kang 679e40808cSMinkyu Kang writel(channel & 0xF, &adc->adcmux); 689e40808cSMinkyu Kang writel((1 << 14) | (49 << 6), &adc->adccon); 699e40808cSMinkyu Kang writel(1000 & 0xffff, &adc->adcdly); 709e40808cSMinkyu Kang writel(readl(&adc->adccon) | (1 << 16), &adc->adccon); /* 12 bit */ 719e40808cSMinkyu Kang udelay(10); 729e40808cSMinkyu Kang writel(readl(&adc->adccon) | (1 << 0), &adc->adccon); /* Enable */ 739e40808cSMinkyu Kang udelay(10); 749e40808cSMinkyu Kang 759e40808cSMinkyu Kang do { 769e40808cSMinkyu Kang udelay(1); 779e40808cSMinkyu Kang reg = readl(&adc->adccon); 789e40808cSMinkyu Kang } while (!(reg & (1 << 15)) && (loop++ < 1000)); 799e40808cSMinkyu Kang 809e40808cSMinkyu Kang ret = readl(&adc->adcdat0) & 0xFFF; 819e40808cSMinkyu Kang 829e40808cSMinkyu Kang return ret; 839e40808cSMinkyu Kang } 849e40808cSMinkyu Kang 854d86bf08SŁukasz Majewski static int adc_power_control(int on) 864d86bf08SŁukasz Majewski { 874d86bf08SŁukasz Majewski int ret; 88c7336815SŁukasz Majewski struct pmic *p = pmic_get("MAX8998_PMIC"); 89c7336815SŁukasz Majewski if (!p) 90c7336815SŁukasz Majewski return -ENODEV; 914d86bf08SŁukasz Majewski 924d86bf08SŁukasz Majewski if (pmic_probe(p)) 934d86bf08SŁukasz Majewski return -1; 944d86bf08SŁukasz Majewski 954d86bf08SŁukasz Majewski ret = pmic_set_output(p, 964d86bf08SŁukasz Majewski MAX8998_REG_ONOFF1, 974d86bf08SŁukasz Majewski MAX8998_LDO4, !!on); 984d86bf08SŁukasz Majewski 994d86bf08SŁukasz Majewski return ret; 1004d86bf08SŁukasz Majewski } 1014d86bf08SŁukasz Majewski 1029e40808cSMinkyu Kang static unsigned int get_hw_revision(void) 1039e40808cSMinkyu Kang { 1049e40808cSMinkyu Kang int hwrev, mode0, mode1; 1059e40808cSMinkyu Kang 1064d86bf08SŁukasz Majewski adc_power_control(1); 1074d86bf08SŁukasz Majewski 1089e40808cSMinkyu Kang mode0 = get_adc_value(1); /* HWREV_MODE0 */ 1099e40808cSMinkyu Kang mode1 = get_adc_value(2); /* HWREV_MODE1 */ 1109e40808cSMinkyu Kang 1119e40808cSMinkyu Kang /* 1129e40808cSMinkyu Kang * XXX Always set the default hwrev as the latest board 1139e40808cSMinkyu Kang * ADC = (voltage) / 3.3 * 4096 1149e40808cSMinkyu Kang */ 1159e40808cSMinkyu Kang hwrev = 3; 1169e40808cSMinkyu Kang 1179e40808cSMinkyu Kang #define IS_RANGE(x, min, max) ((x) > (min) && (x) < (max)) 1189e40808cSMinkyu Kang if (IS_RANGE(mode0, 80, 200) && IS_RANGE(mode1, 80, 200)) 1199e40808cSMinkyu Kang hwrev = 0x0; /* 0.01V 0.01V */ 1209e40808cSMinkyu Kang if (IS_RANGE(mode0, 750, 1000) && IS_RANGE(mode1, 80, 200)) 1219e40808cSMinkyu Kang hwrev = 0x1; /* 610mV 0.01V */ 1229e40808cSMinkyu Kang if (IS_RANGE(mode0, 1300, 1700) && IS_RANGE(mode1, 80, 200)) 1239e40808cSMinkyu Kang hwrev = 0x2; /* 1.16V 0.01V */ 1249e40808cSMinkyu Kang if (IS_RANGE(mode0, 2000, 2400) && IS_RANGE(mode1, 80, 200)) 1259e40808cSMinkyu Kang hwrev = 0x3; /* 1.79V 0.01V */ 1269e40808cSMinkyu Kang #undef IS_RANGE 1279e40808cSMinkyu Kang 1289e40808cSMinkyu Kang debug("mode0: %d, mode1: %d, hwrev 0x%x\n", mode0, mode1, hwrev); 1299e40808cSMinkyu Kang 1304d86bf08SŁukasz Majewski adc_power_control(0); 1314d86bf08SŁukasz Majewski 1329e40808cSMinkyu Kang return hwrev; 1339e40808cSMinkyu Kang } 1349e40808cSMinkyu Kang 1359e40808cSMinkyu Kang static void check_hw_revision(void) 1369e40808cSMinkyu Kang { 1379e40808cSMinkyu Kang int hwrev; 1389e40808cSMinkyu Kang 1399e40808cSMinkyu Kang hwrev = get_hw_revision(); 1409e40808cSMinkyu Kang 1419e40808cSMinkyu Kang board_rev |= hwrev; 1429e40808cSMinkyu Kang } 1439e40808cSMinkyu Kang 144ddc7e541SLukasz Majewski #ifdef CONFIG_USB_GADGET 145ddc7e541SLukasz Majewski static int s5pc210_phy_control(int on) 146ddc7e541SLukasz Majewski { 147e03492c8SAnatolij Gustschin int ret = 0; 148c7336815SŁukasz Majewski struct pmic *p = pmic_get("MAX8998_PMIC"); 149c7336815SŁukasz Majewski if (!p) 150c7336815SŁukasz Majewski return -ENODEV; 151ddc7e541SLukasz Majewski 152ddc7e541SLukasz Majewski if (pmic_probe(p)) 153ddc7e541SLukasz Majewski return -1; 154ddc7e541SLukasz Majewski 155ddc7e541SLukasz Majewski if (on) { 156ddc7e541SLukasz Majewski ret |= pmic_set_output(p, 157ddc7e541SLukasz Majewski MAX8998_REG_BUCK_ACTIVE_DISCHARGE3, 158ddc7e541SLukasz Majewski MAX8998_SAFEOUT1, LDO_ON); 159ddc7e541SLukasz Majewski ret |= pmic_set_output(p, MAX8998_REG_ONOFF1, 160ddc7e541SLukasz Majewski MAX8998_LDO3, LDO_ON); 161ddc7e541SLukasz Majewski ret |= pmic_set_output(p, MAX8998_REG_ONOFF2, 162ddc7e541SLukasz Majewski MAX8998_LDO8, LDO_ON); 163ddc7e541SLukasz Majewski 164ddc7e541SLukasz Majewski } else { 165ddc7e541SLukasz Majewski ret |= pmic_set_output(p, MAX8998_REG_ONOFF2, 166ddc7e541SLukasz Majewski MAX8998_LDO8, LDO_OFF); 167ddc7e541SLukasz Majewski ret |= pmic_set_output(p, MAX8998_REG_ONOFF1, 168ddc7e541SLukasz Majewski MAX8998_LDO3, LDO_OFF); 169ddc7e541SLukasz Majewski ret |= pmic_set_output(p, 170ddc7e541SLukasz Majewski MAX8998_REG_BUCK_ACTIVE_DISCHARGE3, 171ddc7e541SLukasz Majewski MAX8998_SAFEOUT1, LDO_OFF); 172ddc7e541SLukasz Majewski } 173ddc7e541SLukasz Majewski 174ddc7e541SLukasz Majewski if (ret) { 175ddc7e541SLukasz Majewski puts("MAX8998 LDO setting error!\n"); 176ddc7e541SLukasz Majewski return -1; 177ddc7e541SLukasz Majewski } 178ddc7e541SLukasz Majewski 179ddc7e541SLukasz Majewski return 0; 180ddc7e541SLukasz Majewski } 181ddc7e541SLukasz Majewski 182c0982871SMarek Vasut struct dwc2_plat_otg_data s5pc210_otg_data = { 183ddc7e541SLukasz Majewski .phy_control = s5pc210_phy_control, 184ddc7e541SLukasz Majewski .regs_phy = EXYNOS4_USBPHY_BASE, 185ddc7e541SLukasz Majewski .regs_otg = EXYNOS4_USBOTG_BASE, 186ddc7e541SLukasz Majewski .usb_phy_ctrl = EXYNOS4_USBPHY_CONTROL, 187ddc7e541SLukasz Majewski .usb_flags = PHY0_SLEEP, 188ddc7e541SLukasz Majewski }; 189ddc7e541SLukasz Majewski #endif 19011a44798SPiotr Wilczek 1913f41ffe4SPiotr Wilczek int board_usb_init(int index, enum usb_init_type init) 1923f41ffe4SPiotr Wilczek { 1933f41ffe4SPiotr Wilczek debug("USB_udc_probe\n"); 194*a4bb9b36SMarek Vasut return dwc2_udc_probe(&s5pc210_otg_data); 1953f41ffe4SPiotr Wilczek } 1963f41ffe4SPiotr Wilczek 1973f41ffe4SPiotr Wilczek int exynos_early_init_f(void) 19811a44798SPiotr Wilczek { 19911a44798SPiotr Wilczek wdt_stop(); 20011a44798SPiotr Wilczek 20111a44798SPiotr Wilczek return 0; 20211a44798SPiotr Wilczek } 203ff0fedd5SPiotr Wilczek 204d984b9f8SPiotr Wilczek static void init_pmic_lcd(void) 205d984b9f8SPiotr Wilczek { 206d984b9f8SPiotr Wilczek unsigned char val; 207d984b9f8SPiotr Wilczek int ret = 0; 208d984b9f8SPiotr Wilczek 20948e91caeSMinkyu Kang struct pmic *p = pmic_get("MAX8998_PMIC"); 210d984b9f8SPiotr Wilczek 211fbef8e6eSMinkyu Kang if (!p) 212fbef8e6eSMinkyu Kang return; 213fbef8e6eSMinkyu Kang 214d984b9f8SPiotr Wilczek if (pmic_probe(p)) 215d984b9f8SPiotr Wilczek return; 216d984b9f8SPiotr Wilczek 217d984b9f8SPiotr Wilczek /* LDO7 1.8V */ 218d984b9f8SPiotr Wilczek val = 0x02; /* (1800 - 1600) / 100; */ 219d984b9f8SPiotr Wilczek ret |= pmic_reg_write(p, MAX8998_REG_LDO7, val); 220d984b9f8SPiotr Wilczek 221d984b9f8SPiotr Wilczek /* LDO17 3.0V */ 222d984b9f8SPiotr Wilczek val = 0xe; /* (3000 - 1600) / 100; */ 223d984b9f8SPiotr Wilczek ret |= pmic_reg_write(p, MAX8998_REG_LDO17, val); 224d984b9f8SPiotr Wilczek 225d984b9f8SPiotr Wilczek /* Disable unneeded regulators */ 226d984b9f8SPiotr Wilczek /* 227d984b9f8SPiotr Wilczek * ONOFF1 228d984b9f8SPiotr Wilczek * Buck1 ON, Buck2 OFF, Buck3 ON, Buck4 ON 229d984b9f8SPiotr Wilczek * LDO2 ON, LDO3 OFF, LDO4 OFF, LDO5 ON 230d984b9f8SPiotr Wilczek */ 231d984b9f8SPiotr Wilczek val = 0xB9; 232d984b9f8SPiotr Wilczek ret |= pmic_reg_write(p, MAX8998_REG_ONOFF1, val); 233d984b9f8SPiotr Wilczek 234d984b9f8SPiotr Wilczek /* ONOFF2 235d984b9f8SPiotr Wilczek * LDO6 OFF, LDO7 ON, LDO8 OFF, LDO9 ON, 236d984b9f8SPiotr Wilczek * LDO10 OFF, LDO11 OFF, LDO12 OFF, LDO13 OFF 237d984b9f8SPiotr Wilczek */ 238d984b9f8SPiotr Wilczek val = 0x50; 239d984b9f8SPiotr Wilczek ret |= pmic_reg_write(p, MAX8998_REG_ONOFF2, val); 240d984b9f8SPiotr Wilczek 241d984b9f8SPiotr Wilczek /* ONOFF3 242d984b9f8SPiotr Wilczek * LDO14 OFF, LDO15 OFF, LGO16 OFF, LDO17 OFF 243d984b9f8SPiotr Wilczek * EPWRHOLD OFF, EBATTMON OFF, ELBCNFG2 OFF, ELBCNFG1 OFF 244d984b9f8SPiotr Wilczek */ 245d984b9f8SPiotr Wilczek val = 0x00; 246d984b9f8SPiotr Wilczek ret |= pmic_reg_write(p, MAX8998_REG_ONOFF3, val); 247d984b9f8SPiotr Wilczek 248d984b9f8SPiotr Wilczek if (ret) 249d984b9f8SPiotr Wilczek puts("LCD pmic initialisation error!\n"); 250d984b9f8SPiotr Wilczek } 251d984b9f8SPiotr Wilczek 25229fd5704SAjay Kumar void exynos_cfg_lcd_gpio(void) 253d984b9f8SPiotr Wilczek { 254d984b9f8SPiotr Wilczek unsigned int i, f3_end = 4; 255d984b9f8SPiotr Wilczek 256d984b9f8SPiotr Wilczek for (i = 0; i < 8; i++) { 257d984b9f8SPiotr Wilczek /* set GPF0,1,2[0:7] for RGB Interface and Data lines (32bit) */ 258f6ae1ca0SAkshay Saraswat gpio_cfg_pin(EXYNOS4_GPIO_F00 + i, S5P_GPIO_FUNC(2)); 259f6ae1ca0SAkshay Saraswat gpio_cfg_pin(EXYNOS4_GPIO_F10 + i, S5P_GPIO_FUNC(2)); 260f6ae1ca0SAkshay Saraswat gpio_cfg_pin(EXYNOS4_GPIO_F20 + i, S5P_GPIO_FUNC(2)); 261d984b9f8SPiotr Wilczek /* pull-up/down disable */ 262f6ae1ca0SAkshay Saraswat gpio_set_pull(EXYNOS4_GPIO_F00 + i, S5P_GPIO_PULL_NONE); 263f6ae1ca0SAkshay Saraswat gpio_set_pull(EXYNOS4_GPIO_F10 + i, S5P_GPIO_PULL_NONE); 264f6ae1ca0SAkshay Saraswat gpio_set_pull(EXYNOS4_GPIO_F20 + i, S5P_GPIO_PULL_NONE); 265d984b9f8SPiotr Wilczek 266d984b9f8SPiotr Wilczek /* drive strength to max (24bit) */ 267f6ae1ca0SAkshay Saraswat gpio_set_drv(EXYNOS4_GPIO_F00 + i, S5P_GPIO_DRV_4X); 268f6ae1ca0SAkshay Saraswat gpio_set_rate(EXYNOS4_GPIO_F00 + i, S5P_GPIO_DRV_SLOW); 269f6ae1ca0SAkshay Saraswat gpio_set_drv(EXYNOS4_GPIO_F10 + i, S5P_GPIO_DRV_4X); 270f6ae1ca0SAkshay Saraswat gpio_set_rate(EXYNOS4_GPIO_F10 + i, S5P_GPIO_DRV_SLOW); 271f6ae1ca0SAkshay Saraswat gpio_set_drv(EXYNOS4_GPIO_F20 + i, S5P_GPIO_DRV_4X); 272f6ae1ca0SAkshay Saraswat gpio_set_rate(EXYNOS4_GPIO_F00 + i, S5P_GPIO_DRV_SLOW); 273d984b9f8SPiotr Wilczek } 274d984b9f8SPiotr Wilczek 275f6ae1ca0SAkshay Saraswat for (i = EXYNOS4_GPIO_F30; i < (EXYNOS4_GPIO_F30 + f3_end); i++) { 276d984b9f8SPiotr Wilczek /* set GPF3[0:3] for RGB Interface and Data lines (32bit) */ 277f6ae1ca0SAkshay Saraswat gpio_cfg_pin(i, S5P_GPIO_FUNC(2)); 278d984b9f8SPiotr Wilczek /* pull-up/down disable */ 279f6ae1ca0SAkshay Saraswat gpio_set_pull(i, S5P_GPIO_PULL_NONE); 280d984b9f8SPiotr Wilczek /* drive strength to max (24bit) */ 281f6ae1ca0SAkshay Saraswat gpio_set_drv(i, S5P_GPIO_DRV_4X); 282f6ae1ca0SAkshay Saraswat gpio_set_rate(i, S5P_GPIO_DRV_SLOW); 283d984b9f8SPiotr Wilczek } 284d984b9f8SPiotr Wilczek 285d984b9f8SPiotr Wilczek /* gpio pad configuration for LCD reset. */ 2867f196101SSimon Glass gpio_request(EXYNOS4_GPIO_Y45, "lcd_reset"); 287f6ae1ca0SAkshay Saraswat gpio_cfg_pin(EXYNOS4_GPIO_Y45, S5P_GPIO_OUTPUT); 288d984b9f8SPiotr Wilczek } 289d984b9f8SPiotr Wilczek 2903f41ffe4SPiotr Wilczek int mipi_power(void) 2913f41ffe4SPiotr Wilczek { 2923f41ffe4SPiotr Wilczek return 0; 2933f41ffe4SPiotr Wilczek } 2943f41ffe4SPiotr Wilczek 29529fd5704SAjay Kumar void exynos_reset_lcd(void) 296d984b9f8SPiotr Wilczek { 297f6ae1ca0SAkshay Saraswat gpio_set_value(EXYNOS4_GPIO_Y45, 1); 298d984b9f8SPiotr Wilczek udelay(10000); 299f6ae1ca0SAkshay Saraswat gpio_set_value(EXYNOS4_GPIO_Y45, 0); 300d984b9f8SPiotr Wilczek udelay(10000); 301f6ae1ca0SAkshay Saraswat gpio_set_value(EXYNOS4_GPIO_Y45, 1); 302d984b9f8SPiotr Wilczek udelay(100); 303d984b9f8SPiotr Wilczek } 304d984b9f8SPiotr Wilczek 30529fd5704SAjay Kumar void exynos_lcd_power_on(void) 306d984b9f8SPiotr Wilczek { 30748e91caeSMinkyu Kang struct pmic *p = pmic_get("MAX8998_PMIC"); 308d984b9f8SPiotr Wilczek 309fbef8e6eSMinkyu Kang if (!p) 310fbef8e6eSMinkyu Kang return; 311fbef8e6eSMinkyu Kang 312d984b9f8SPiotr Wilczek if (pmic_probe(p)) 313d984b9f8SPiotr Wilczek return; 314d984b9f8SPiotr Wilczek 315d984b9f8SPiotr Wilczek pmic_set_output(p, MAX8998_REG_ONOFF3, MAX8998_LDO17, LDO_ON); 316d984b9f8SPiotr Wilczek pmic_set_output(p, MAX8998_REG_ONOFF2, MAX8998_LDO7, LDO_ON); 317d984b9f8SPiotr Wilczek } 318d984b9f8SPiotr Wilczek 31929fd5704SAjay Kumar void exynos_cfg_ldo(void) 32029fd5704SAjay Kumar { 32129fd5704SAjay Kumar ld9040_cfg_ldo(); 32229fd5704SAjay Kumar } 32329fd5704SAjay Kumar 32429fd5704SAjay Kumar void exynos_enable_ldo(unsigned int onoff) 32529fd5704SAjay Kumar { 32629fd5704SAjay Kumar ld9040_enable_ldo(onoff); 32729fd5704SAjay Kumar } 32829fd5704SAjay Kumar 3293f41ffe4SPiotr Wilczek int exynos_init(void) 330ff0fedd5SPiotr Wilczek { 3314381aad9SPrzemyslaw Marczak char buf[16]; 3324381aad9SPrzemyslaw Marczak 333ff0fedd5SPiotr Wilczek gd->bd->bi_arch_number = MACH_TYPE_UNIVERSAL_C210; 3343f41ffe4SPiotr Wilczek 3353f41ffe4SPiotr Wilczek switch (get_hwrev()) { 3363f41ffe4SPiotr Wilczek case 0: 3373f41ffe4SPiotr Wilczek /* 3383f41ffe4SPiotr Wilczek * Set the low to enable LDO_EN 3393f41ffe4SPiotr Wilczek * But when you use the test board for eMMC booting 3403f41ffe4SPiotr Wilczek * you should set it HIGH since it removes the inverter 3413f41ffe4SPiotr Wilczek */ 3423f41ffe4SPiotr Wilczek /* MASSMEMORY_EN: XMDMDATA_6: GPE3[6] */ 3437f196101SSimon Glass gpio_request(EXYNOS4_GPIO_E36, "ldo_en"); 344f6ae1ca0SAkshay Saraswat gpio_direction_output(EXYNOS4_GPIO_E36, 0); 3453f41ffe4SPiotr Wilczek break; 3463f41ffe4SPiotr Wilczek default: 3473f41ffe4SPiotr Wilczek /* 3483f41ffe4SPiotr Wilczek * Default reset state is High and there's no inverter 3493f41ffe4SPiotr Wilczek * But set it as HIGH to ensure 3503f41ffe4SPiotr Wilczek */ 3513f41ffe4SPiotr Wilczek /* MASSMEMORY_EN: XMDMADDR_3: GPE1[3] */ 3527f196101SSimon Glass gpio_request(EXYNOS4_GPIO_E13, "massmemory_en"); 353f6ae1ca0SAkshay Saraswat gpio_direction_output(EXYNOS4_GPIO_E13, 1); 3543f41ffe4SPiotr Wilczek break; 3553f41ffe4SPiotr Wilczek } 356ff0fedd5SPiotr Wilczek 3574381aad9SPrzemyslaw Marczak /* Request soft I2C gpios */ 3584381aad9SPrzemyslaw Marczak sprintf(buf, "soft_i2c_scl"); 3594381aad9SPrzemyslaw Marczak gpio_request(CONFIG_SOFT_I2C_GPIO_SCL, buf); 3604381aad9SPrzemyslaw Marczak 3614381aad9SPrzemyslaw Marczak sprintf(buf, "soft_i2c_sda"); 3624381aad9SPrzemyslaw Marczak gpio_request(CONFIG_SOFT_I2C_GPIO_SDA, buf); 3634381aad9SPrzemyslaw Marczak 364ff0fedd5SPiotr Wilczek check_hw_revision(); 365ff0fedd5SPiotr Wilczek printf("HW Revision:\t0x%x\n", board_rev); 366ff0fedd5SPiotr Wilczek 367ff0fedd5SPiotr Wilczek return 0; 368ff0fedd5SPiotr Wilczek } 369679549d1SPrzemyslaw Marczak 3703f41ffe4SPiotr Wilczek void exynos_lcd_misc_init(vidinfo_t *vid) 371679549d1SPrzemyslaw Marczak { 3723f41ffe4SPiotr Wilczek #ifdef CONFIG_TIZEN 3733f41ffe4SPiotr Wilczek get_tizen_logo_info(vid); 374815a6072SPiotr Wilczek #endif 3753f41ffe4SPiotr Wilczek 3763f41ffe4SPiotr Wilczek /* for LD9040. */ 3773f41ffe4SPiotr Wilczek vid->pclk_name = 1; /* MPLL */ 3783f41ffe4SPiotr Wilczek vid->sclk_div = 1; 3793f41ffe4SPiotr Wilczek 3803f41ffe4SPiotr Wilczek setenv("lcdinfo", "lcd=ld9040"); 381679549d1SPrzemyslaw Marczak } 382