xref: /rk3399_rockchip-uboot/board/st/stm32f746-disco/stm32f746-disco.c (revision 2d9c33ca3f7ba69eaf4b2b88f36a0f3cf1a1e19f)
1e66c49faSVikas Manocha /*
2e66c49faSVikas Manocha  * (C) Copyright 2016
3e66c49faSVikas Manocha  * Vikas Manocha, <vikas.manocha@st.com>
4e66c49faSVikas Manocha  *
5e66c49faSVikas Manocha  * SPDX-License-Identifier:	GPL-2.0+
6e66c49faSVikas Manocha  */
7e66c49faSVikas Manocha 
8e66c49faSVikas Manocha #include <common.h>
9*2d9c33caSVikas Manocha #include <dm.h>
10*2d9c33caSVikas Manocha #include <ram.h>
11e66c49faSVikas Manocha #include <asm/io.h>
12e66c49faSVikas Manocha #include <asm/armv7m.h>
13e66c49faSVikas Manocha #include <asm/arch/stm32.h>
14e66c49faSVikas Manocha #include <asm/arch/gpio.h>
15e66c49faSVikas Manocha #include <dm/platdata.h>
16e66c49faSVikas Manocha #include <dm/platform_data/serial_stm32x7.h>
17e66c49faSVikas Manocha #include <asm/arch/stm32_periph.h>
18e66c49faSVikas Manocha #include <asm/arch/stm32_defs.h>
19b20b70fcSMichael Kurz #include <asm/arch/syscfg.h>
20e66c49faSVikas Manocha 
21e66c49faSVikas Manocha DECLARE_GLOBAL_DATA_PTR;
22e66c49faSVikas Manocha 
23e66c49faSVikas Manocha const struct stm32_gpio_ctl gpio_ctl_gpout = {
24e66c49faSVikas Manocha 	.mode = STM32_GPIO_MODE_OUT,
25e66c49faSVikas Manocha 	.otype = STM32_GPIO_OTYPE_PP,
26e66c49faSVikas Manocha 	.speed = STM32_GPIO_SPEED_50M,
27e66c49faSVikas Manocha 	.pupd = STM32_GPIO_PUPD_NO,
28e66c49faSVikas Manocha 	.af = STM32_GPIO_AF0
29e66c49faSVikas Manocha };
30e66c49faSVikas Manocha 
3125c1b135SToshifumi NISHINAGA static int fmc_setup_gpio(void)
3225c1b135SToshifumi NISHINAGA {
3325c1b135SToshifumi NISHINAGA 	clock_setup(GPIO_B_CLOCK_CFG);
3425c1b135SToshifumi NISHINAGA 	clock_setup(GPIO_C_CLOCK_CFG);
3525c1b135SToshifumi NISHINAGA 	clock_setup(GPIO_D_CLOCK_CFG);
3625c1b135SToshifumi NISHINAGA 	clock_setup(GPIO_E_CLOCK_CFG);
3725c1b135SToshifumi NISHINAGA 	clock_setup(GPIO_F_CLOCK_CFG);
3825c1b135SToshifumi NISHINAGA 	clock_setup(GPIO_G_CLOCK_CFG);
3925c1b135SToshifumi NISHINAGA 	clock_setup(GPIO_H_CLOCK_CFG);
4025c1b135SToshifumi NISHINAGA 
41*2d9c33caSVikas Manocha 	return 0;
4225c1b135SToshifumi NISHINAGA }
4325c1b135SToshifumi NISHINAGA 
4425c1b135SToshifumi NISHINAGA int dram_init(void)
4525c1b135SToshifumi NISHINAGA {
46*2d9c33caSVikas Manocha 	struct udevice *dev;
47*2d9c33caSVikas Manocha 	struct ram_info ram;
4825c1b135SToshifumi NISHINAGA 	int rv;
4925c1b135SToshifumi NISHINAGA 
5025c1b135SToshifumi NISHINAGA 	rv = fmc_setup_gpio();
5125c1b135SToshifumi NISHINAGA 	if (rv)
5225c1b135SToshifumi NISHINAGA 		return rv;
5325c1b135SToshifumi NISHINAGA 
54081de09dSMichael Kurz 	clock_setup(FMC_CLOCK_CFG);
55*2d9c33caSVikas Manocha 
56*2d9c33caSVikas Manocha 	rv = uclass_get_device(UCLASS_RAM, 0, &dev);
57*2d9c33caSVikas Manocha 	if (rv) {
58*2d9c33caSVikas Manocha 		debug("DRAM init failed: %d\n", rv);
59*2d9c33caSVikas Manocha 		return rv;
60*2d9c33caSVikas Manocha 	}
61*2d9c33caSVikas Manocha 	rv = ram_get_info(dev, &ram);
62*2d9c33caSVikas Manocha 	if (rv) {
63*2d9c33caSVikas Manocha 		debug("Cannot get DRAM size: %d\n", rv);
64*2d9c33caSVikas Manocha 		return rv;
65*2d9c33caSVikas Manocha 	}
66*2d9c33caSVikas Manocha 	debug("SDRAM base=%lx, size=%x\n", ram.base, ram.size);
67*2d9c33caSVikas Manocha 	gd->ram_size = ram.size;
6825c1b135SToshifumi NISHINAGA 
6925c1b135SToshifumi NISHINAGA 	/*
7025c1b135SToshifumi NISHINAGA 	 * Fill in global info with description of SRAM configuration
7125c1b135SToshifumi NISHINAGA 	 */
7225c1b135SToshifumi NISHINAGA 	gd->bd->bi_dram[0].start = CONFIG_SYS_RAM_BASE;
73*2d9c33caSVikas Manocha 	gd->bd->bi_dram[0].size  = ram.size;
7425c1b135SToshifumi NISHINAGA 
7525c1b135SToshifumi NISHINAGA 	return rv;
7625c1b135SToshifumi NISHINAGA }
7725c1b135SToshifumi NISHINAGA 
78e66c49faSVikas Manocha int uart_setup_gpio(void)
79e66c49faSVikas Manocha {
8095d52733STom Rini 	clock_setup(GPIO_A_CLOCK_CFG);
8195d52733STom Rini 	clock_setup(GPIO_B_CLOCK_CFG);
82e34e19feSVikas Manocha 	return 0;
83e66c49faSVikas Manocha }
84e66c49faSVikas Manocha 
85b20b70fcSMichael Kurz #ifdef CONFIG_ETH_DESIGNWARE
86b20b70fcSMichael Kurz 
87b20b70fcSMichael Kurz static int stmmac_setup(void)
88b20b70fcSMichael Kurz {
89b20b70fcSMichael Kurz 	clock_setup(SYSCFG_CLOCK_CFG);
90b20b70fcSMichael Kurz 	/* Set >RMII mode */
91b20b70fcSMichael Kurz 	STM32_SYSCFG->pmc |= SYSCFG_PMC_MII_RMII_SEL;
92b20b70fcSMichael Kurz 
93b20b70fcSMichael Kurz 	clock_setup(GPIO_A_CLOCK_CFG);
94b20b70fcSMichael Kurz 	clock_setup(GPIO_C_CLOCK_CFG);
95b20b70fcSMichael Kurz 	clock_setup(GPIO_G_CLOCK_CFG);
96b20b70fcSMichael Kurz 	clock_setup(STMMAC_CLOCK_CFG);
97b20b70fcSMichael Kurz 
98b20b70fcSMichael Kurz 	return 0;
99b20b70fcSMichael Kurz }
100b20b70fcSMichael Kurz #endif
101b20b70fcSMichael Kurz 
102d4363baaSMichael Kurz #ifdef CONFIG_STM32_QSPI
103d4363baaSMichael Kurz 
104d4363baaSMichael Kurz static int qspi_setup(void)
105d4363baaSMichael Kurz {
106d4363baaSMichael Kurz 	clock_setup(GPIO_B_CLOCK_CFG);
107d4363baaSMichael Kurz 	clock_setup(GPIO_D_CLOCK_CFG);
108d4363baaSMichael Kurz 	clock_setup(GPIO_E_CLOCK_CFG);
109d4363baaSMichael Kurz 	return 0;
110d4363baaSMichael Kurz }
111d4363baaSMichael Kurz #endif
112d4363baaSMichael Kurz 
113e66c49faSVikas Manocha u32 get_board_rev(void)
114e66c49faSVikas Manocha {
115e66c49faSVikas Manocha 	return 0;
116e66c49faSVikas Manocha }
117e66c49faSVikas Manocha 
118e66c49faSVikas Manocha int board_early_init_f(void)
119e66c49faSVikas Manocha {
120e66c49faSVikas Manocha 	int res;
121e66c49faSVikas Manocha 
122e66c49faSVikas Manocha 	res = uart_setup_gpio();
123e66c49faSVikas Manocha 	if (res)
124e66c49faSVikas Manocha 		return res;
125e66c49faSVikas Manocha 
126b20b70fcSMichael Kurz #ifdef CONFIG_ETH_DESIGNWARE
127b20b70fcSMichael Kurz 	res = stmmac_setup();
128b20b70fcSMichael Kurz 	if (res)
129b20b70fcSMichael Kurz 		return res;
130b20b70fcSMichael Kurz #endif
131b20b70fcSMichael Kurz 
132d4363baaSMichael Kurz #ifdef CONFIG_STM32_QSPI
133d4363baaSMichael Kurz 	res = qspi_setup();
134d4363baaSMichael Kurz 	if (res)
135d4363baaSMichael Kurz 		return res;
136d4363baaSMichael Kurz #endif
137d4363baaSMichael Kurz 
138e66c49faSVikas Manocha 	return 0;
139e66c49faSVikas Manocha }
140e66c49faSVikas Manocha 
141e66c49faSVikas Manocha int board_init(void)
142e66c49faSVikas Manocha {
143e66c49faSVikas Manocha 	gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
144e66c49faSVikas Manocha 
145e66c49faSVikas Manocha 	return 0;
146e66c49faSVikas Manocha }
147