172b81d39SMinkyu Kang /* 272b81d39SMinkyu Kang * Copyright (C) 2008-2009 Samsung Electronics 372b81d39SMinkyu Kang * Minkyu Kang <mk7.kang@samsung.com> 472b81d39SMinkyu Kang * Kyungmin Park <kyungmin.park@samsung.com> 572b81d39SMinkyu Kang * 61a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 772b81d39SMinkyu Kang */ 872b81d39SMinkyu Kang 972b81d39SMinkyu Kang #include <common.h> 1087f314e9SMinkyu Kang #include <asm/arch/gpio.h> 1187f314e9SMinkyu Kang #include <asm/arch/mmc.h> 12c7336815SŁukasz Majewski #include <power/pmic.h> 13a954da29SLukasz Majewski #include <usb/s3c_udc.h> 14a954da29SLukasz Majewski #include <asm/arch/cpu.h> 15c7336815SŁukasz Majewski #include <power/max8998_pmic.h> 1672b81d39SMinkyu Kang DECLARE_GLOBAL_DATA_PTR; 1772b81d39SMinkyu Kang 1887f314e9SMinkyu Kang static struct s5pc110_gpio *s5pc110_gpio; 1987f314e9SMinkyu Kang 2072b81d39SMinkyu Kang int board_init(void) 2172b81d39SMinkyu Kang { 2287f314e9SMinkyu Kang /* Set Initial global variables */ 2387f314e9SMinkyu Kang s5pc110_gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE; 2487f314e9SMinkyu Kang 2572b81d39SMinkyu Kang gd->bd->bi_arch_number = MACH_TYPE_GONI; 2672b81d39SMinkyu Kang gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100; 2772b81d39SMinkyu Kang 280ecdab68SŁukasz Majewski return 0; 290ecdab68SŁukasz Majewski } 300ecdab68SŁukasz Majewski 310ecdab68SŁukasz Majewski int power_init_board(void) 320ecdab68SŁukasz Majewski { 330ecdab68SŁukasz Majewski int ret; 340ecdab68SŁukasz Majewski 350ecdab68SŁukasz Majewski ret = pmic_init(I2C_5); 360ecdab68SŁukasz Majewski if (ret) 370ecdab68SŁukasz Majewski return ret; 38c7336815SŁukasz Majewski 3972b81d39SMinkyu Kang return 0; 4072b81d39SMinkyu Kang } 4172b81d39SMinkyu Kang 4272b81d39SMinkyu Kang int dram_init(void) 4372b81d39SMinkyu Kang { 44177feff3SMinkyu Kang gd->ram_size = PHYS_SDRAM_1_SIZE + PHYS_SDRAM_2_SIZE + 45177feff3SMinkyu Kang PHYS_SDRAM_3_SIZE; 46177feff3SMinkyu Kang 47177feff3SMinkyu Kang return 0; 48177feff3SMinkyu Kang } 49177feff3SMinkyu Kang 50177feff3SMinkyu Kang void dram_init_banksize(void) 51177feff3SMinkyu Kang { 5272b81d39SMinkyu Kang gd->bd->bi_dram[0].start = PHYS_SDRAM_1; 5372b81d39SMinkyu Kang gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; 5472b81d39SMinkyu Kang gd->bd->bi_dram[1].start = PHYS_SDRAM_2; 5572b81d39SMinkyu Kang gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE; 5672b81d39SMinkyu Kang gd->bd->bi_dram[2].start = PHYS_SDRAM_3; 5772b81d39SMinkyu Kang gd->bd->bi_dram[2].size = PHYS_SDRAM_3_SIZE; 5872b81d39SMinkyu Kang } 5972b81d39SMinkyu Kang 6072b81d39SMinkyu Kang #ifdef CONFIG_DISPLAY_BOARDINFO 6172b81d39SMinkyu Kang int checkboard(void) 6272b81d39SMinkyu Kang { 6372b81d39SMinkyu Kang puts("Board:\tGoni\n"); 6472b81d39SMinkyu Kang return 0; 6572b81d39SMinkyu Kang } 6672b81d39SMinkyu Kang #endif 6787f314e9SMinkyu Kang 6887f314e9SMinkyu Kang #ifdef CONFIG_GENERIC_MMC 6987f314e9SMinkyu Kang int board_mmc_init(bd_t *bis) 7087f314e9SMinkyu Kang { 71*5c18a1cfSPrzemyslaw Marczak int i, ret, ret_sd = 0; 7287f314e9SMinkyu Kang 7387f314e9SMinkyu Kang /* MASSMEMORY_EN: XMSMDATA7: GPJ2[7] output high */ 74ef5d9eb9SŁukasz Majewski s5p_gpio_direction_output(&s5pc110_gpio->j2, 7, 1); 7587f314e9SMinkyu Kang 7687f314e9SMinkyu Kang /* 7787f314e9SMinkyu Kang * MMC0 GPIO 7887f314e9SMinkyu Kang * GPG0[0] SD_0_CLK 7987f314e9SMinkyu Kang * GPG0[1] SD_0_CMD 8087f314e9SMinkyu Kang * GPG0[2] SD_0_CDn -> Not used 8187f314e9SMinkyu Kang * GPG0[3:6] SD_0_DATA[0:3] 8287f314e9SMinkyu Kang */ 8387f314e9SMinkyu Kang for (i = 0; i < 7; i++) { 8487f314e9SMinkyu Kang if (i == 2) 8587f314e9SMinkyu Kang continue; 8687f314e9SMinkyu Kang /* GPG0[0:6] special function 2 */ 87ef5d9eb9SŁukasz Majewski s5p_gpio_cfg_pin(&s5pc110_gpio->g0, i, 0x2); 8887f314e9SMinkyu Kang /* GPG0[0:6] pull disable */ 89ef5d9eb9SŁukasz Majewski s5p_gpio_set_pull(&s5pc110_gpio->g0, i, GPIO_PULL_NONE); 9087f314e9SMinkyu Kang /* GPG0[0:6] drv 4x */ 91ef5d9eb9SŁukasz Majewski s5p_gpio_set_drv(&s5pc110_gpio->g0, i, GPIO_DRV_4X); 9287f314e9SMinkyu Kang } 9387f314e9SMinkyu Kang 94*5c18a1cfSPrzemyslaw Marczak ret = s5p_mmc_init(0, 4); 95*5c18a1cfSPrzemyslaw Marczak if (ret) 96*5c18a1cfSPrzemyslaw Marczak error("MMC: Failed to init MMC:0.\n"); 97*5c18a1cfSPrzemyslaw Marczak 98*5c18a1cfSPrzemyslaw Marczak /* 99*5c18a1cfSPrzemyslaw Marczak * SD card (T_FLASH) detect and init 100*5c18a1cfSPrzemyslaw Marczak * T_FLASH_DETECT: EINT28: GPH3[4] input mode 101*5c18a1cfSPrzemyslaw Marczak */ 102*5c18a1cfSPrzemyslaw Marczak s5p_gpio_cfg_pin(&s5pc110_gpio->h3, 4, GPIO_INPUT); 103*5c18a1cfSPrzemyslaw Marczak s5p_gpio_set_pull(&s5pc110_gpio->h3, 4, GPIO_PULL_UP); 104*5c18a1cfSPrzemyslaw Marczak 105*5c18a1cfSPrzemyslaw Marczak if (!s5p_gpio_get_value(&s5pc110_gpio->h3, 4)) { 106*5c18a1cfSPrzemyslaw Marczak for (i = 0; i < 7; i++) { 107*5c18a1cfSPrzemyslaw Marczak if (i == 2) 108*5c18a1cfSPrzemyslaw Marczak continue; 109*5c18a1cfSPrzemyslaw Marczak 110*5c18a1cfSPrzemyslaw Marczak /* GPG2[0:6] special function 2 */ 111*5c18a1cfSPrzemyslaw Marczak s5p_gpio_cfg_pin(&s5pc110_gpio->g2, i, 0x2); 112*5c18a1cfSPrzemyslaw Marczak /* GPG2[0:6] pull disable */ 113*5c18a1cfSPrzemyslaw Marczak s5p_gpio_set_pull(&s5pc110_gpio->g2, i, GPIO_PULL_NONE); 114*5c18a1cfSPrzemyslaw Marczak /* GPG2[0:6] drv 4x */ 115*5c18a1cfSPrzemyslaw Marczak s5p_gpio_set_drv(&s5pc110_gpio->g2, i, GPIO_DRV_4X); 116*5c18a1cfSPrzemyslaw Marczak } 117*5c18a1cfSPrzemyslaw Marczak 118*5c18a1cfSPrzemyslaw Marczak ret_sd = s5p_mmc_init(2, 4); 119*5c18a1cfSPrzemyslaw Marczak if (ret_sd) 120*5c18a1cfSPrzemyslaw Marczak error("MMC: Failed to init SD card (MMC:2).\n"); 121*5c18a1cfSPrzemyslaw Marczak } 122*5c18a1cfSPrzemyslaw Marczak 123*5c18a1cfSPrzemyslaw Marczak return ret & ret_sd; 12487f314e9SMinkyu Kang } 12587f314e9SMinkyu Kang #endif 126a954da29SLukasz Majewski 127a954da29SLukasz Majewski #ifdef CONFIG_USB_GADGET 128a954da29SLukasz Majewski static int s5pc1xx_phy_control(int on) 129a954da29SLukasz Majewski { 130a954da29SLukasz Majewski int ret; 131a954da29SLukasz Majewski static int status; 132c7336815SŁukasz Majewski struct pmic *p = pmic_get("MAX8998_PMIC"); 133c7336815SŁukasz Majewski if (!p) 134c7336815SŁukasz Majewski return -ENODEV; 135a954da29SLukasz Majewski 136a954da29SLukasz Majewski if (pmic_probe(p)) 137a954da29SLukasz Majewski return -1; 138a954da29SLukasz Majewski 139a954da29SLukasz Majewski if (on && !status) { 140a954da29SLukasz Majewski ret = pmic_set_output(p, MAX8998_REG_ONOFF1, 141a954da29SLukasz Majewski MAX8998_LDO3, LDO_ON); 142a954da29SLukasz Majewski ret = pmic_set_output(p, MAX8998_REG_ONOFF2, 143a954da29SLukasz Majewski MAX8998_LDO8, LDO_ON); 144a954da29SLukasz Majewski if (ret) { 145a954da29SLukasz Majewski puts("MAX8998 LDO setting error!\n"); 146a954da29SLukasz Majewski return -1; 147a954da29SLukasz Majewski } 148a954da29SLukasz Majewski status = 1; 149a954da29SLukasz Majewski } else if (!on && status) { 150a954da29SLukasz Majewski ret = pmic_set_output(p, MAX8998_REG_ONOFF1, 151a954da29SLukasz Majewski MAX8998_LDO3, LDO_OFF); 152a954da29SLukasz Majewski ret = pmic_set_output(p, MAX8998_REG_ONOFF2, 153a954da29SLukasz Majewski MAX8998_LDO8, LDO_OFF); 154a954da29SLukasz Majewski if (ret) { 155a954da29SLukasz Majewski puts("MAX8998 LDO setting error!\n"); 156a954da29SLukasz Majewski return -1; 157a954da29SLukasz Majewski } 158a954da29SLukasz Majewski status = 0; 159a954da29SLukasz Majewski } 160a954da29SLukasz Majewski udelay(10000); 161a954da29SLukasz Majewski 162a954da29SLukasz Majewski return 0; 163a954da29SLukasz Majewski } 164a954da29SLukasz Majewski 165a954da29SLukasz Majewski struct s3c_plat_otg_data s5pc110_otg_data = { 166a954da29SLukasz Majewski .phy_control = s5pc1xx_phy_control, 167a954da29SLukasz Majewski .regs_phy = S5PC110_PHY_BASE, 168a954da29SLukasz Majewski .regs_otg = S5PC110_OTG_BASE, 169a954da29SLukasz Majewski .usb_phy_ctrl = S5PC110_USB_PHY_CONTROL, 170a954da29SLukasz Majewski }; 171a954da29SLukasz Majewski #endif 172