1 /* 2 * Copyright (C) 2008-2009 Samsung Electronics 3 * Minkyu Kang <mk7.kang@samsung.com> 4 * Kyungmin Park <kyungmin.park@samsung.com> 5 * 6 * SPDX-License-Identifier: GPL-2.0+ 7 */ 8 9 #include <common.h> 10 #include <asm/gpio.h> 11 #include <asm/arch/mmc.h> 12 #include <dm.h> 13 #include <power/pmic.h> 14 #include <usb/dwc2_udc.h> 15 #include <asm/arch/cpu.h> 16 #include <power/max8998_pmic.h> 17 #include <samsung/misc.h> 18 #include <usb.h> 19 #include <usb_mass_storage.h> 20 21 DECLARE_GLOBAL_DATA_PTR; 22 23 u32 get_board_rev(void) 24 { 25 return 0; 26 } 27 28 int board_init(void) 29 { 30 /* Set Initial global variables */ 31 gd->bd->bi_arch_number = MACH_TYPE_GONI; 32 gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100; 33 34 return 0; 35 } 36 37 #ifdef CONFIG_SYS_I2C_INIT_BOARD 38 void i2c_init_board(void) 39 { 40 gpio_request(S5PC110_GPIO_J43, "i2c_clk"); 41 gpio_request(S5PC110_GPIO_J40, "i2c_data"); 42 gpio_direction_output(S5PC110_GPIO_J43, 1); 43 gpio_direction_output(S5PC110_GPIO_J40, 1); 44 } 45 #endif 46 47 int dram_init(void) 48 { 49 gd->ram_size = PHYS_SDRAM_1_SIZE + PHYS_SDRAM_2_SIZE + 50 PHYS_SDRAM_3_SIZE; 51 52 return 0; 53 } 54 55 int dram_init_banksize(void) 56 { 57 gd->bd->bi_dram[0].start = PHYS_SDRAM_1; 58 gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; 59 gd->bd->bi_dram[1].start = PHYS_SDRAM_2; 60 gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE; 61 gd->bd->bi_dram[2].start = PHYS_SDRAM_3; 62 gd->bd->bi_dram[2].size = PHYS_SDRAM_3_SIZE; 63 64 return 0; 65 } 66 67 #ifdef CONFIG_DISPLAY_BOARDINFO 68 int checkboard(void) 69 { 70 puts("Board:\tGoni\n"); 71 return 0; 72 } 73 #endif 74 75 #ifdef CONFIG_MMC 76 int board_mmc_init(bd_t *bis) 77 { 78 int i, ret, ret_sd = 0; 79 80 /* MASSMEMORY_EN: XMSMDATA7: GPJ2[7] output high */ 81 gpio_request(S5PC110_GPIO_J27, "massmemory_en"); 82 gpio_direction_output(S5PC110_GPIO_J27, 1); 83 84 /* 85 * MMC0 GPIO 86 * GPG0[0] SD_0_CLK 87 * GPG0[1] SD_0_CMD 88 * GPG0[2] SD_0_CDn -> Not used 89 * GPG0[3:6] SD_0_DATA[0:3] 90 */ 91 for (i = S5PC110_GPIO_G00; i < S5PC110_GPIO_G07; i++) { 92 if (i == S5PC110_GPIO_G02) 93 continue; 94 /* GPG0[0:6] special function 2 */ 95 gpio_cfg_pin(i, 0x2); 96 /* GPG0[0:6] pull disable */ 97 gpio_set_pull(i, S5P_GPIO_PULL_NONE); 98 /* GPG0[0:6] drv 4x */ 99 gpio_set_drv(i, S5P_GPIO_DRV_4X); 100 } 101 102 ret = s5p_mmc_init(0, 4); 103 if (ret) 104 error("MMC: Failed to init MMC:0.\n"); 105 106 /* 107 * SD card (T_FLASH) detect and init 108 * T_FLASH_DETECT: EINT28: GPH3[4] input mode 109 */ 110 gpio_request(S5PC110_GPIO_H34, "t_flash_detect"); 111 gpio_cfg_pin(S5PC110_GPIO_H34, S5P_GPIO_INPUT); 112 gpio_set_pull(S5PC110_GPIO_H34, S5P_GPIO_PULL_UP); 113 114 if (!gpio_get_value(S5PC110_GPIO_H34)) { 115 for (i = S5PC110_GPIO_G20; i < S5PC110_GPIO_G27; i++) { 116 if (i == S5PC110_GPIO_G22) 117 continue; 118 119 /* GPG2[0:6] special function 2 */ 120 gpio_cfg_pin(i, 0x2); 121 /* GPG2[0:6] pull disable */ 122 gpio_set_pull(i, S5P_GPIO_PULL_NONE); 123 /* GPG2[0:6] drv 4x */ 124 gpio_set_drv(i, S5P_GPIO_DRV_4X); 125 } 126 127 ret_sd = s5p_mmc_init(2, 4); 128 if (ret_sd) 129 error("MMC: Failed to init SD card (MMC:2).\n"); 130 } 131 132 return ret & ret_sd; 133 } 134 #endif 135 136 #ifdef CONFIG_USB_GADGET 137 static int s5pc1xx_phy_control(int on) 138 { 139 struct udevice *dev; 140 static int status; 141 int reg, ret; 142 143 ret = pmic_get("max8998-pmic", &dev); 144 if (ret) 145 return ret; 146 147 if (on && !status) { 148 reg = pmic_reg_read(dev, MAX8998_REG_ONOFF1); 149 reg |= MAX8998_LDO3; 150 ret = pmic_reg_write(dev, MAX8998_REG_ONOFF1, reg); 151 if (ret) { 152 puts("MAX8998 LDO setting error!\n"); 153 return -EINVAL; 154 } 155 156 reg = pmic_reg_read(dev, MAX8998_REG_ONOFF2); 157 reg |= MAX8998_LDO8; 158 ret = pmic_reg_write(dev, MAX8998_REG_ONOFF2, reg); 159 if (ret) { 160 puts("MAX8998 LDO setting error!\n"); 161 return -EINVAL; 162 } 163 status = 1; 164 } else if (!on && status) { 165 reg = pmic_reg_read(dev, MAX8998_REG_ONOFF1); 166 reg &= ~MAX8998_LDO3; 167 ret = pmic_reg_write(dev, MAX8998_REG_ONOFF1, reg); 168 if (ret) { 169 puts("MAX8998 LDO setting error!\n"); 170 return -EINVAL; 171 } 172 173 reg = pmic_reg_read(dev, MAX8998_REG_ONOFF2); 174 reg &= ~MAX8998_LDO8; 175 ret = pmic_reg_write(dev, MAX8998_REG_ONOFF2, reg); 176 if (ret) { 177 puts("MAX8998 LDO setting error!\n"); 178 return -EINVAL; 179 } 180 status = 0; 181 } 182 udelay(10000); 183 return 0; 184 } 185 186 struct dwc2_plat_otg_data s5pc110_otg_data = { 187 .phy_control = s5pc1xx_phy_control, 188 .regs_phy = S5PC110_PHY_BASE, 189 .regs_otg = S5PC110_OTG_BASE, 190 .usb_phy_ctrl = S5PC110_USB_PHY_CONTROL, 191 }; 192 193 int board_usb_init(int index, enum usb_init_type init) 194 { 195 debug("USB_udc_probe\n"); 196 return dwc2_udc_probe(&s5pc110_otg_data); 197 } 198 #endif 199 200 #ifdef CONFIG_MISC_INIT_R 201 int misc_init_r(void) 202 { 203 #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG 204 set_board_info(); 205 #endif 206 return 0; 207 } 208 #endif 209 210 int board_usb_cleanup(int index, enum usb_init_type init) 211 { 212 return 0; 213 } 214