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/arch/gpio.h> 11 #include <asm/arch/mmc.h> 12 #include <power/pmic.h> 13 #include <usb/s3c_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 int power_init_board(void) 37 { 38 int ret; 39 40 /* 41 * For PMIC the I2C bus is named as I2C5, but it is connected 42 * to logical I2C adapter 0 43 */ 44 ret = pmic_init(I2C_0); 45 if (ret) 46 return ret; 47 48 return 0; 49 } 50 51 int dram_init(void) 52 { 53 gd->ram_size = PHYS_SDRAM_1_SIZE + PHYS_SDRAM_2_SIZE + 54 PHYS_SDRAM_3_SIZE; 55 56 return 0; 57 } 58 59 void dram_init_banksize(void) 60 { 61 gd->bd->bi_dram[0].start = PHYS_SDRAM_1; 62 gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; 63 gd->bd->bi_dram[1].start = PHYS_SDRAM_2; 64 gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE; 65 gd->bd->bi_dram[2].start = PHYS_SDRAM_3; 66 gd->bd->bi_dram[2].size = PHYS_SDRAM_3_SIZE; 67 } 68 69 #ifdef CONFIG_DISPLAY_BOARDINFO 70 int checkboard(void) 71 { 72 puts("Board:\tGoni\n"); 73 return 0; 74 } 75 #endif 76 77 #ifdef CONFIG_GENERIC_MMC 78 int board_mmc_init(bd_t *bis) 79 { 80 int i, ret, ret_sd = 0; 81 82 /* MASSMEMORY_EN: XMSMDATA7: GPJ2[7] output high */ 83 gpio_direction_output(S5PC110_GPIO_J27, 1); 84 85 /* 86 * MMC0 GPIO 87 * GPG0[0] SD_0_CLK 88 * GPG0[1] SD_0_CMD 89 * GPG0[2] SD_0_CDn -> Not used 90 * GPG0[3:6] SD_0_DATA[0:3] 91 */ 92 for (i = S5PC110_GPIO_G00; i < S5PC110_GPIO_G07; i++) { 93 if (i == S5PC110_GPIO_G02) 94 continue; 95 /* GPG0[0:6] special function 2 */ 96 gpio_cfg_pin(i, 0x2); 97 /* GPG0[0:6] pull disable */ 98 gpio_set_pull(i, S5P_GPIO_PULL_NONE); 99 /* GPG0[0:6] drv 4x */ 100 gpio_set_drv(i, S5P_GPIO_DRV_4X); 101 } 102 103 ret = s5p_mmc_init(0, 4); 104 if (ret) 105 error("MMC: Failed to init MMC:0.\n"); 106 107 /* 108 * SD card (T_FLASH) detect and init 109 * T_FLASH_DETECT: EINT28: GPH3[4] input mode 110 */ 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 int ret; 140 static int status; 141 struct pmic *p = pmic_get("MAX8998_PMIC"); 142 if (!p) 143 return -ENODEV; 144 145 if (pmic_probe(p)) 146 return -1; 147 148 if (on && !status) { 149 ret = pmic_set_output(p, MAX8998_REG_ONOFF1, 150 MAX8998_LDO3, LDO_ON); 151 ret = pmic_set_output(p, MAX8998_REG_ONOFF2, 152 MAX8998_LDO8, LDO_ON); 153 if (ret) { 154 puts("MAX8998 LDO setting error!\n"); 155 return -1; 156 } 157 status = 1; 158 } else if (!on && status) { 159 ret = pmic_set_output(p, MAX8998_REG_ONOFF1, 160 MAX8998_LDO3, LDO_OFF); 161 ret = pmic_set_output(p, MAX8998_REG_ONOFF2, 162 MAX8998_LDO8, LDO_OFF); 163 if (ret) { 164 puts("MAX8998 LDO setting error!\n"); 165 return -1; 166 } 167 status = 0; 168 } 169 udelay(10000); 170 171 return 0; 172 } 173 174 struct s3c_plat_otg_data s5pc110_otg_data = { 175 .phy_control = s5pc1xx_phy_control, 176 .regs_phy = S5PC110_PHY_BASE, 177 .regs_otg = S5PC110_OTG_BASE, 178 .usb_phy_ctrl = S5PC110_USB_PHY_CONTROL, 179 }; 180 181 int board_usb_init(int index, enum usb_init_type init) 182 { 183 debug("USB_udc_probe\n"); 184 return s3c_udc_probe(&s5pc110_otg_data); 185 } 186 #endif 187 188 #ifdef CONFIG_MISC_INIT_R 189 int misc_init_r(void) 190 { 191 #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG 192 set_board_info(); 193 #endif 194 return 0; 195 } 196 #endif 197