2 * Copyright (C) 2014 Samsung Electronics
3 * Przemyslaw Marczak <p.marczak@samsung.com>
5 * SPDX-License-Identifier: GPL-2.0+
9 #include <asm/arch/pinmux.h>
10 #include <asm/arch/power.h>
11 #include <asm/arch/clock.h>
12 #include <asm/arch/gpio.h>
14 #include <asm/arch/cpu.h>
15 #include <power/pmic.h>
16 #include <power/max77686_pmic.h>
19 #include <usb/s3c_udc.h>
20 #include <samsung/misc.h>
23 DECLARE_GLOBAL_DATA_PTR
;
25 #ifdef CONFIG_BOARD_TYPES
26 /* Odroid board types */
33 void set_board_type(void)
35 /* Set GPA1 pin 1 to HI - enable XCL205 output */
36 writel(XCL205_EN_GPIO_CON_CFG
, XCL205_EN_GPIO_CON
);
37 writel(XCL205_EN_GPIO_DAT_CFG
, XCL205_EN_GPIO_CON
+ 0x4);
38 writel(XCL205_EN_GPIO_PUD_CFG
, XCL205_EN_GPIO_CON
+ 0x8);
39 writel(XCL205_EN_GPIO_DRV_CFG
, XCL205_EN_GPIO_CON
+ 0xc);
41 /* Set GPC1 pin 2 to IN - check XCL205 output state */
42 writel(XCL205_STATE_GPIO_CON_CFG
, XCL205_STATE_GPIO_CON
);
43 writel(XCL205_STATE_GPIO_PUD_CFG
, XCL205_STATE_GPIO_CON
+ 0x8);
45 /* XCL205 - needs some latch time */
48 /* Check GPC1 pin2 - LED supplied by XCL205 - X2 only */
49 if (readl(XCL205_STATE_GPIO_DAT
) & (1 << XCL205_STATE_GPIO_PIN
))
50 gd
->board_type
= ODROID_TYPE_X2
;
52 gd
->board_type
= ODROID_TYPE_U3
;
55 const char *get_board_type(void)
57 const char *board_type
[] = {"u3", "x2"};
59 return board_type
[gd
->board_type
];
63 #ifdef CONFIG_SET_DFU_ALT_INFO
64 char *get_dfu_alt_system(void)
66 return getenv("dfu_alt_system");
69 char *get_dfu_alt_boot(void)
73 switch (get_boot_mode()) {
75 alt_boot
= CONFIG_DFU_ALT_BOOT_SD
;
78 case BOOT_MODE_EMMC_SD
:
79 alt_boot
= CONFIG_DFU_ALT_BOOT_EMMC
;
89 static void board_clock_init(void)
91 unsigned int set
, clr
, clr_src_cpu
, clr_pll_con0
, clr_src_dmc
;
92 struct exynos4x12_clock
*clk
= (struct exynos4x12_clock
*)
93 samsung_get_base_clock();
96 * CMU_CPU clocks src to MPLL
98 * MUX_APLL_SEL: FIN_PLL ; FOUT_APLL
99 * MUX_CORE_SEL: MOUT_APLL ; SCLK_MPLL
100 * MUX_HPM_SEL: MOUT_APLL ; SCLK_MPLL_USER_C
101 * MUX_MPLL_USER_SEL_C: FIN_PLL ; SCLK_MPLL
103 clr_src_cpu
= MUX_APLL_SEL(1) | MUX_CORE_SEL(1) |
104 MUX_HPM_SEL(1) | MUX_MPLL_USER_SEL_C(1);
105 set
= MUX_APLL_SEL(0) | MUX_CORE_SEL(1) | MUX_HPM_SEL(1) |
106 MUX_MPLL_USER_SEL_C(1);
108 clrsetbits_le32(&clk
->src_cpu
, clr_src_cpu
, set
);
110 /* Wait for mux change */
111 while (readl(&clk
->mux_stat_cpu
) & MUX_STAT_CPU_CHANGING
)
114 /* Set APLL to 1000MHz */
115 clr_pll_con0
= SDIV(7) | PDIV(63) | MDIV(1023) | FSEL(1);
116 set
= SDIV(0) | PDIV(3) | MDIV(125) | FSEL(1);
118 clrsetbits_le32(&clk
->apll_con0
, clr_pll_con0
, set
);
120 /* Wait for PLL to be locked */
121 while (!(readl(&clk
->apll_con0
) & PLL_LOCKED_BIT
))
124 /* Set CMU_CPU clocks src to APLL */
125 set
= MUX_APLL_SEL(1) | MUX_CORE_SEL(0) | MUX_HPM_SEL(0) |
126 MUX_MPLL_USER_SEL_C(1);
127 clrsetbits_le32(&clk
->src_cpu
, clr_src_cpu
, set
);
129 /* Wait for mux change */
130 while (readl(&clk
->mux_stat_cpu
) & MUX_STAT_CPU_CHANGING
)
133 set
= CORE_RATIO(0) | COREM0_RATIO(2) | COREM1_RATIO(5) |
134 PERIPH_RATIO(0) | ATB_RATIO(4) | PCLK_DBG_RATIO(1) |
135 APLL_RATIO(0) | CORE2_RATIO(0);
137 * Set dividers for MOUTcore = 1000 MHz
138 * coreout = MOUT / (ratio + 1) = 1000 MHz (0)
139 * corem0 = armclk / (ratio + 1) = 333 MHz (2)
140 * corem1 = armclk / (ratio + 1) = 166 MHz (5)
141 * periph = armclk / (ratio + 1) = 1000 MHz (0)
142 * atbout = MOUT / (ratio + 1) = 200 MHz (4)
143 * pclkdbgout = atbout / (ratio + 1) = 100 MHz (1)
144 * sclkapll = MOUTapll / (ratio + 1) = 1000 MHz (0)
145 * core2out = core_out / (ratio + 1) = 1000 MHz (0) (armclk)
147 clr
= CORE_RATIO(7) | COREM0_RATIO(7) | COREM1_RATIO(7) |
148 PERIPH_RATIO(7) | ATB_RATIO(7) | PCLK_DBG_RATIO(7) |
149 APLL_RATIO(7) | CORE2_RATIO(7);
151 clrsetbits_le32(&clk
->div_cpu0
, clr
, set
);
153 /* Wait for divider ready status */
154 while (readl(&clk
->div_stat_cpu0
) & DIV_STAT_CPU0_CHANGING
)
158 * For MOUThpm = 1000 MHz (MOUTapll)
159 * doutcopy = MOUThpm / (ratio + 1) = 200 (4)
160 * sclkhpm = doutcopy / (ratio + 1) = 200 (4)
161 * cores_out = armclk / (ratio + 1) = 1000 (0)
163 clr
= COPY_RATIO(7) | HPM_RATIO(7) | CORES_RATIO(7);
164 set
= COPY_RATIO(4) | HPM_RATIO(4) | CORES_RATIO(0);
166 clrsetbits_le32(&clk
->div_cpu1
, clr
, set
);
168 /* Wait for divider ready status */
169 while (readl(&clk
->div_stat_cpu1
) & DIV_STAT_CPU1_CHANGING
)
173 * Set CMU_DMC clocks src to APLL
175 * MUX_C2C_SEL: SCLKMPLL ; SCLKAPLL
176 * MUX_DMC_BUS_SEL: SCLKMPLL ; SCLKAPLL
177 * MUX_DPHY_SEL: SCLKMPLL ; SCLKAPLL
178 * MUX_MPLL_SEL: FINPLL ; MOUT_MPLL_FOUT
179 * MUX_PWI_SEL: 0110 (MPLL); 0111 (EPLL); 1000 (VPLL); 0(XXTI)
180 * MUX_G2D_ACP0_SEL: SCLKMPLL ; SCLKAPLL
181 * MUX_G2D_ACP1_SEL: SCLKEPLL ; SCLKVPLL
182 * MUX_G2D_ACP_SEL: OUT_ACP0 ; OUT_ACP1
184 clr_src_dmc
= MUX_C2C_SEL(1) | MUX_DMC_BUS_SEL(1) |
185 MUX_DPHY_SEL(1) | MUX_MPLL_SEL(1) |
186 MUX_PWI_SEL(15) | MUX_G2D_ACP0_SEL(1) |
187 MUX_G2D_ACP1_SEL(1) | MUX_G2D_ACP_SEL(1);
188 set
= MUX_C2C_SEL(1) | MUX_DMC_BUS_SEL(1) | MUX_DPHY_SEL(1) |
189 MUX_MPLL_SEL(0) | MUX_PWI_SEL(0) | MUX_G2D_ACP0_SEL(1) |
190 MUX_G2D_ACP1_SEL(1) | MUX_G2D_ACP_SEL(1);
192 clrsetbits_le32(&clk
->src_dmc
, clr_src_dmc
, set
);
194 /* Wait for mux change */
195 while (readl(&clk
->mux_stat_dmc
) & MUX_STAT_DMC_CHANGING
)
198 /* Set MPLL to 880MHz */
199 set
= SDIV(0) | PDIV(3) | MDIV(110) | FSEL(0) | PLL_ENABLE(1);
201 clrsetbits_le32(&clk
->mpll_con0
, clr_pll_con0
, set
);
203 /* Wait for PLL to be locked */
204 while (!(readl(&clk
->mpll_con0
) & PLL_LOCKED_BIT
))
207 /* Switch back CMU_DMC mux */
208 set
= MUX_C2C_SEL(0) | MUX_DMC_BUS_SEL(0) | MUX_DPHY_SEL(0) |
209 MUX_MPLL_SEL(1) | MUX_PWI_SEL(8) | MUX_G2D_ACP0_SEL(0) |
210 MUX_G2D_ACP1_SEL(0) | MUX_G2D_ACP_SEL(0);
212 clrsetbits_le32(&clk
->src_dmc
, clr_src_dmc
, set
);
214 /* Wait for mux change */
215 while (readl(&clk
->mux_stat_dmc
) & MUX_STAT_DMC_CHANGING
)
219 clr
= ACP_RATIO(7) | ACP_PCLK_RATIO(7) | DPHY_RATIO(7) |
220 DMC_RATIO(7) | DMCD_RATIO(7) | DMCP_RATIO(7);
226 * aclk_acp = MOUTdmc / (ratio + 1) = 220 (3)
227 * pclk_acp = aclk_acp / (ratio + 1) = 110 (1)
228 * sclk_dphy = MOUTdphy / (ratio + 1) = 440 (1)
229 * sclk_dmc = MOUTdmc / (ratio + 1) = 440 (1)
230 * aclk_dmcd = sclk_dmc / (ratio + 1) = 220 (1)
231 * aclk_dmcp = aclk_dmcd / (ratio + 1) = 110 (1)
233 set
= ACP_RATIO(3) | ACP_PCLK_RATIO(1) | DPHY_RATIO(1) |
234 DMC_RATIO(1) | DMCD_RATIO(1) | DMCP_RATIO(1);
236 clrsetbits_le32(&clk
->div_dmc0
, clr
, set
);
238 /* Wait for divider ready status */
239 while (readl(&clk
->div_stat_dmc0
) & DIV_STAT_DMC0_CHANGING
)
243 clr
= G2D_ACP_RATIO(15) | C2C_RATIO(7) | PWI_RATIO(15) |
244 C2C_ACLK_RATIO(7) | DVSEM_RATIO(127) | DPM_RATIO(127);
251 * sclk_g2d_acp = MOUTg2d / (ratio + 1) = 440 (1)
252 * sclk_c2c = MOUTc2c / (ratio + 1) = 440 (1)
253 * aclk_c2c = sclk_c2c / (ratio + 1) = 220 (1)
254 * sclk_pwi = MOUTpwi / (ratio + 1) = 18 (5)
256 set
= G2D_ACP_RATIO(1) | C2C_RATIO(1) | PWI_RATIO(5) |
257 C2C_ACLK_RATIO(1) | DVSEM_RATIO(1) | DPM_RATIO(1);
259 clrsetbits_le32(&clk
->div_dmc1
, clr
, set
);
261 /* Wait for divider ready status */
262 while (readl(&clk
->div_stat_dmc1
) & DIV_STAT_DMC1_CHANGING
)
266 clr
= UART0_SEL(15) | UART1_SEL(15) | UART2_SEL(15) |
267 UART3_SEL(15) | UART4_SEL(15);
269 * Set CLK_SRC_PERIL0 clocks src to MPLL
270 * src values: 0(XXTI); 1(XusbXTI); 2(SCLK_HDMI24M); 3(SCLK_USBPHY0);
271 * 5(SCLK_HDMIPHY); 6(SCLK_MPLL_USER_T); 7(SCLK_EPLL);
274 * Set all to SCLK_MPLL_USER_T
276 set
= UART0_SEL(6) | UART1_SEL(6) | UART2_SEL(6) | UART3_SEL(6) |
279 clrsetbits_le32(&clk
->src_peril0
, clr
, set
);
282 clr
= UART0_RATIO(15) | UART1_RATIO(15) | UART2_RATIO(15) |
283 UART3_RATIO(15) | UART4_RATIO(15);
285 * For MOUTuart0-4: 880MHz
287 * SCLK_UARTx = MOUTuartX / (ratio + 1) = 110 (7)
289 set
= UART0_RATIO(7) | UART1_RATIO(7) | UART2_RATIO(7) |
290 UART3_RATIO(7) | UART4_RATIO(7);
292 clrsetbits_le32(&clk
->div_peril0
, clr
, set
);
294 while (readl(&clk
->div_stat_peril0
) & DIV_STAT_PERIL0_CHANGING
)
298 clr
= MMC0_RATIO(15) | MMC0_PRE_RATIO(255) | MMC1_RATIO(15) |
301 * For MOUTmmc0-3 = 880 MHz (MPLL)
303 * DOUTmmc1 = MOUTmmc1 / (ratio + 1) = 110 (7)
304 * sclk_mmc1 = DOUTmmc1 / (ratio + 1) = 60 (1)
305 * DOUTmmc0 = MOUTmmc0 / (ratio + 1) = 110 (7)
306 * sclk_mmc0 = DOUTmmc0 / (ratio + 1) = 60 (1)
308 set
= MMC0_RATIO(7) | MMC0_PRE_RATIO(1) | MMC1_RATIO(7) |
311 clrsetbits_le32(&clk
->div_fsys1
, clr
, set
);
313 /* Wait for divider ready status */
314 while (readl(&clk
->div_stat_fsys1
) & DIV_STAT_FSYS1_CHANGING
)
318 clr
= MMC2_RATIO(15) | MMC2_PRE_RATIO(255) | MMC3_RATIO(15) |
321 * For MOUTmmc0-3 = 880 MHz (MPLL)
323 * DOUTmmc3 = MOUTmmc3 / (ratio + 1) = 110 (7)
324 * sclk_mmc3 = DOUTmmc3 / (ratio + 1) = 60 (1)
325 * DOUTmmc2 = MOUTmmc2 / (ratio + 1) = 110 (7)
326 * sclk_mmc2 = DOUTmmc2 / (ratio + 1) = 60 (1)
328 set
= MMC2_RATIO(7) | MMC2_PRE_RATIO(1) | MMC3_RATIO(7) |
331 clrsetbits_le32(&clk
->div_fsys2
, clr
, set
);
333 /* Wait for divider ready status */
334 while (readl(&clk
->div_stat_fsys2
) & DIV_STAT_FSYS2_CHANGING
)
338 clr
= MMC4_RATIO(15) | MMC4_PRE_RATIO(255);
340 * For MOUTmmc4 = 880 MHz (MPLL)
342 * DOUTmmc4 = MOUTmmc4 / (ratio + 1) = 110 (7)
343 * sclk_mmc4 = DOUTmmc4 / (ratio + 1) = 110 (0)
345 set
= MMC4_RATIO(7) | MMC4_PRE_RATIO(0);
347 clrsetbits_le32(&clk
->div_fsys3
, clr
, set
);
349 /* Wait for divider ready status */
350 while (readl(&clk
->div_stat_fsys3
) & DIV_STAT_FSYS3_CHANGING
)
356 static void board_gpio_init(void)
359 gpio_cfg_pin(EXYNOS4X12_GPIO_K12
, S5P_GPIO_FUNC(0x1));
360 gpio_set_pull(EXYNOS4X12_GPIO_K12
, S5P_GPIO_PULL_NONE
);
361 gpio_set_drv(EXYNOS4X12_GPIO_K12
, S5P_GPIO_DRV_4X
);
363 /* Enable FAN (Odroid U3) */
364 gpio_set_pull(EXYNOS4X12_GPIO_D00
, S5P_GPIO_PULL_UP
);
365 gpio_set_drv(EXYNOS4X12_GPIO_D00
, S5P_GPIO_DRV_4X
);
366 gpio_direction_output(EXYNOS4X12_GPIO_D00
, 1);
368 /* OTG Vbus output (Odroid U3+) */
369 gpio_set_pull(EXYNOS4X12_GPIO_L20
, S5P_GPIO_PULL_NONE
);
370 gpio_set_drv(EXYNOS4X12_GPIO_L20
, S5P_GPIO_DRV_4X
);
371 gpio_direction_output(EXYNOS4X12_GPIO_L20
, 0);
373 /* OTG INT (Odroid U3+) */
374 gpio_set_pull(EXYNOS4X12_GPIO_X31
, S5P_GPIO_PULL_UP
);
375 gpio_set_drv(EXYNOS4X12_GPIO_X31
, S5P_GPIO_DRV_4X
);
376 gpio_direction_input(EXYNOS4X12_GPIO_X31
);
379 static int pmic_init_max77686(void)
381 struct pmic
*p
= pmic_get("MAX77686_PMIC");
386 /* Set LDO Voltage */
387 max77686_set_ldo_voltage(p
, 20, 1800000); /* LDO20 eMMC */
388 max77686_set_ldo_voltage(p
, 21, 2800000); /* LDO21 SD */
389 max77686_set_ldo_voltage(p
, 22, 2800000); /* LDO22 eMMC */
394 #ifdef CONFIG_SYS_I2C_INIT_BOARD
395 static void board_init_i2c(void)
398 if (exynos_pinmux_config(PERIPH_ID_I2C0
, PINMUX_FLAG_NONE
))
399 debug("I2C%d not configured\n", (I2C_0
));
403 int exynos_early_init_f(void)
411 int exynos_init(void)
413 /* The last MB of memory is reserved for secure firmware */
414 gd
->ram_size
-= SZ_1M
;
415 gd
->bd
->bi_dram
[CONFIG_NR_DRAM_BANKS
- 1].size
-= SZ_1M
;
420 int exynos_power_init(void)
422 #ifdef CONFIG_SYS_I2C_INIT_BOARD
426 pmic_init_max77686();
431 #ifdef CONFIG_USB_GADGET
432 static int s5pc210_phy_control(int on
)
436 p_pmic
= pmic_get("MAX77686_PMIC");
440 if (pmic_probe(p_pmic
))
444 return max77686_set_ldo_mode(p_pmic
, 12, OPMODE_ON
);
446 return max77686_set_ldo_mode(p_pmic
, 12, OPMODE_LPM
);
449 struct s3c_plat_otg_data s5pc210_otg_data
= {
450 .phy_control
= s5pc210_phy_control
,
451 .regs_phy
= EXYNOS4X12_USBPHY_BASE
,
452 .regs_otg
= EXYNOS4X12_USBOTG_BASE
,
453 .usb_phy_ctrl
= EXYNOS4X12_USBPHY_CONTROL
,
454 .usb_flags
= PHY0_SLEEP
,
457 int board_usb_init(int index
, enum usb_init_type init
)
459 debug("USB_udc_probe\n");
460 return s3c_udc_probe(&s5pc210_otg_data
);
464 void reset_misc(void)
467 gpio_set_value(EXYNOS4X12_GPIO_K12
, 0);
469 gpio_set_value(EXYNOS4X12_GPIO_K12
, 1);