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 <power/pmic.h> 13 #include <usb/dwc2_udc.h> 14 #include <asm/arch/cpu.h> 15 #include <power/max8998_pmic.h> 16 #include <samsung/misc.h> 17 #include <usb.h> 18 #include <usb_mass_storage.h> 19 20 DECLARE_GLOBAL_DATA_PTR; 21 22 u32 get_board_rev(void) 23 { 24 return 0; 25 } 26 27 int board_init(void) 28 { 29 /* Set Initial global variables */ 30 gd->bd->bi_arch_number = MACH_TYPE_GONI; 31 gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100; 32 33 return 0; 34 } 35 36 #ifdef CONFIG_SYS_I2C_INIT_BOARD 37 void i2c_init_board(void) 38 { 39 gpio_request(S5PC110_GPIO_J43, "i2c_clk"); 40 gpio_request(S5PC110_GPIO_J40, "i2c_data"); 41 gpio_direction_output(S5PC110_GPIO_J43, 1); 42 gpio_direction_output(S5PC110_GPIO_J40, 1); 43 } 44 #endif 45 46 int power_init_board(void) 47 { 48 int ret; 49 50 /* 51 * For PMIC the I2C bus is named as I2C5, but it is connected 52 * to logical I2C adapter 0 53 */ 54 ret = pmic_init(I2C_0); 55 if (ret) 56 return ret; 57 58 return 0; 59 } 60 61 int dram_init(void) 62 { 63 gd->ram_size = PHYS_SDRAM_1_SIZE + PHYS_SDRAM_2_SIZE + 64 PHYS_SDRAM_3_SIZE; 65 66 return 0; 67 } 68 69 void dram_init_banksize(void) 70 { 71 gd->bd->bi_dram[0].start = PHYS_SDRAM_1; 72 gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; 73 gd->bd->bi_dram[1].start = PHYS_SDRAM_2; 74 gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE; 75 gd->bd->bi_dram[2].start = PHYS_SDRAM_3; 76 gd->bd->bi_dram[2].size = PHYS_SDRAM_3_SIZE; 77 } 78 79 #ifdef CONFIG_DISPLAY_BOARDINFO 80 int checkboard(void) 81 { 82 puts("Board:\tGoni\n"); 83 return 0; 84 } 85 #endif 86 87 #ifdef CONFIG_GENERIC_MMC 88 int board_mmc_init(bd_t *bis) 89 { 90 int i, ret, ret_sd = 0; 91 92 /* MASSMEMORY_EN: XMSMDATA7: GPJ2[7] output high */ 93 gpio_request(S5PC110_GPIO_J27, "massmemory_en"); 94 gpio_direction_output(S5PC110_GPIO_J27, 1); 95 96 /* 97 * MMC0 GPIO 98 * GPG0[0] SD_0_CLK 99 * GPG0[1] SD_0_CMD 100 * GPG0[2] SD_0_CDn -> Not used 101 * GPG0[3:6] SD_0_DATA[0:3] 102 */ 103 for (i = S5PC110_GPIO_G00; i < S5PC110_GPIO_G07; i++) { 104 if (i == S5PC110_GPIO_G02) 105 continue; 106 /* GPG0[0:6] special function 2 */ 107 gpio_cfg_pin(i, 0x2); 108 /* GPG0[0:6] pull disable */ 109 gpio_set_pull(i, S5P_GPIO_PULL_NONE); 110 /* GPG0[0:6] drv 4x */ 111 gpio_set_drv(i, S5P_GPIO_DRV_4X); 112 } 113 114 ret = s5p_mmc_init(0, 4); 115 if (ret) 116 error("MMC: Failed to init MMC:0.\n"); 117 118 /* 119 * SD card (T_FLASH) detect and init 120 * T_FLASH_DETECT: EINT28: GPH3[4] input mode 121 */ 122 gpio_request(S5PC110_GPIO_H34, "t_flash_detect"); 123 gpio_cfg_pin(S5PC110_GPIO_H34, S5P_GPIO_INPUT); 124 gpio_set_pull(S5PC110_GPIO_H34, S5P_GPIO_PULL_UP); 125 126 if (!gpio_get_value(S5PC110_GPIO_H34)) { 127 for (i = S5PC110_GPIO_G20; i < S5PC110_GPIO_G27; i++) { 128 if (i == S5PC110_GPIO_G22) 129 continue; 130 131 /* GPG2[0:6] special function 2 */ 132 gpio_cfg_pin(i, 0x2); 133 /* GPG2[0:6] pull disable */ 134 gpio_set_pull(i, S5P_GPIO_PULL_NONE); 135 /* GPG2[0:6] drv 4x */ 136 gpio_set_drv(i, S5P_GPIO_DRV_4X); 137 } 138 139 ret_sd = s5p_mmc_init(2, 4); 140 if (ret_sd) 141 error("MMC: Failed to init SD card (MMC:2).\n"); 142 } 143 144 return ret & ret_sd; 145 } 146 #endif 147 148 #ifdef CONFIG_USB_GADGET 149 static int s5pc1xx_phy_control(int on) 150 { 151 int ret; 152 static int status; 153 struct pmic *p = pmic_get("MAX8998_PMIC"); 154 if (!p) 155 return -ENODEV; 156 157 if (pmic_probe(p)) 158 return -1; 159 160 if (on && !status) { 161 ret = pmic_set_output(p, MAX8998_REG_ONOFF1, 162 MAX8998_LDO3, LDO_ON); 163 ret = pmic_set_output(p, MAX8998_REG_ONOFF2, 164 MAX8998_LDO8, LDO_ON); 165 if (ret) { 166 puts("MAX8998 LDO setting error!\n"); 167 return -1; 168 } 169 status = 1; 170 } else if (!on && status) { 171 ret = pmic_set_output(p, MAX8998_REG_ONOFF1, 172 MAX8998_LDO3, LDO_OFF); 173 ret = pmic_set_output(p, MAX8998_REG_ONOFF2, 174 MAX8998_LDO8, LDO_OFF); 175 if (ret) { 176 puts("MAX8998 LDO setting error!\n"); 177 return -1; 178 } 179 status = 0; 180 } 181 udelay(10000); 182 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