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 #ifndef CONFIG_DM_I2C /* TODO(maintainer): Convert to driver model */ 49 /* 50 * For PMIC the I2C bus is named as I2C5, but it is connected 51 * to logical I2C adapter 0 52 */ 53 return pmic_init(I2C_0); 54 #else 55 return 0; 56 #endif 57 } 58 59 int dram_init(void) 60 { 61 gd->ram_size = PHYS_SDRAM_1_SIZE + PHYS_SDRAM_2_SIZE + 62 PHYS_SDRAM_3_SIZE; 63 64 return 0; 65 } 66 67 void dram_init_banksize(void) 68 { 69 gd->bd->bi_dram[0].start = PHYS_SDRAM_1; 70 gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; 71 gd->bd->bi_dram[1].start = PHYS_SDRAM_2; 72 gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE; 73 gd->bd->bi_dram[2].start = PHYS_SDRAM_3; 74 gd->bd->bi_dram[2].size = PHYS_SDRAM_3_SIZE; 75 } 76 77 #ifdef CONFIG_DISPLAY_BOARDINFO 78 int checkboard(void) 79 { 80 puts("Board:\tGoni\n"); 81 return 0; 82 } 83 #endif 84 85 #ifdef CONFIG_GENERIC_MMC 86 int board_mmc_init(bd_t *bis) 87 { 88 int i, ret, ret_sd = 0; 89 90 /* MASSMEMORY_EN: XMSMDATA7: GPJ2[7] output high */ 91 gpio_request(S5PC110_GPIO_J27, "massmemory_en"); 92 gpio_direction_output(S5PC110_GPIO_J27, 1); 93 94 /* 95 * MMC0 GPIO 96 * GPG0[0] SD_0_CLK 97 * GPG0[1] SD_0_CMD 98 * GPG0[2] SD_0_CDn -> Not used 99 * GPG0[3:6] SD_0_DATA[0:3] 100 */ 101 for (i = S5PC110_GPIO_G00; i < S5PC110_GPIO_G07; i++) { 102 if (i == S5PC110_GPIO_G02) 103 continue; 104 /* GPG0[0:6] special function 2 */ 105 gpio_cfg_pin(i, 0x2); 106 /* GPG0[0:6] pull disable */ 107 gpio_set_pull(i, S5P_GPIO_PULL_NONE); 108 /* GPG0[0:6] drv 4x */ 109 gpio_set_drv(i, S5P_GPIO_DRV_4X); 110 } 111 112 ret = s5p_mmc_init(0, 4); 113 if (ret) 114 error("MMC: Failed to init MMC:0.\n"); 115 116 /* 117 * SD card (T_FLASH) detect and init 118 * T_FLASH_DETECT: EINT28: GPH3[4] input mode 119 */ 120 gpio_request(S5PC110_GPIO_H34, "t_flash_detect"); 121 gpio_cfg_pin(S5PC110_GPIO_H34, S5P_GPIO_INPUT); 122 gpio_set_pull(S5PC110_GPIO_H34, S5P_GPIO_PULL_UP); 123 124 if (!gpio_get_value(S5PC110_GPIO_H34)) { 125 for (i = S5PC110_GPIO_G20; i < S5PC110_GPIO_G27; i++) { 126 if (i == S5PC110_GPIO_G22) 127 continue; 128 129 /* GPG2[0:6] special function 2 */ 130 gpio_cfg_pin(i, 0x2); 131 /* GPG2[0:6] pull disable */ 132 gpio_set_pull(i, S5P_GPIO_PULL_NONE); 133 /* GPG2[0:6] drv 4x */ 134 gpio_set_drv(i, S5P_GPIO_DRV_4X); 135 } 136 137 ret_sd = s5p_mmc_init(2, 4); 138 if (ret_sd) 139 error("MMC: Failed to init SD card (MMC:2).\n"); 140 } 141 142 return ret & ret_sd; 143 } 144 #endif 145 146 #ifdef CONFIG_USB_GADGET 147 static int s5pc1xx_phy_control(int on) 148 { 149 #ifndef CONFIG_DM_I2C /* TODO(maintainer): Convert to driver model */ 150 int ret; 151 static int status; 152 struct pmic *p = pmic_get("MAX8998_PMIC"); 153 if (!p) 154 return -ENODEV; 155 156 if (pmic_probe(p)) 157 return -1; 158 159 if (on && !status) { 160 ret = pmic_set_output(p, MAX8998_REG_ONOFF1, 161 MAX8998_LDO3, LDO_ON); 162 ret = pmic_set_output(p, MAX8998_REG_ONOFF2, 163 MAX8998_LDO8, LDO_ON); 164 if (ret) { 165 puts("MAX8998 LDO setting error!\n"); 166 return -1; 167 } 168 status = 1; 169 } else if (!on && status) { 170 ret = pmic_set_output(p, MAX8998_REG_ONOFF1, 171 MAX8998_LDO3, LDO_OFF); 172 ret = pmic_set_output(p, MAX8998_REG_ONOFF2, 173 MAX8998_LDO8, LDO_OFF); 174 if (ret) { 175 puts("MAX8998 LDO setting error!\n"); 176 return -1; 177 } 178 status = 0; 179 } 180 udelay(10000); 181 #endif 182 return 0; 183 } 184 185 struct dwc2_plat_otg_data s5pc110_otg_data = { 186 .phy_control = s5pc1xx_phy_control, 187 .regs_phy = S5PC110_PHY_BASE, 188 .regs_otg = S5PC110_OTG_BASE, 189 .usb_phy_ctrl = S5PC110_USB_PHY_CONTROL, 190 }; 191 192 int board_usb_init(int index, enum usb_init_type init) 193 { 194 debug("USB_udc_probe\n"); 195 return dwc2_udc_probe(&s5pc110_otg_data); 196 } 197 #endif 198 199 #ifdef CONFIG_MISC_INIT_R 200 int misc_init_r(void) 201 { 202 #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG 203 set_board_info(); 204 #endif 205 return 0; 206 } 207 #endif 208 209 int board_usb_cleanup(int index, enum usb_init_type init) 210 { 211 return 0; 212 } 213