1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * (C) Copyright 2016
3*4882a593Smuzhiyun * Vikas Manocha, <vikas.manocha@st.com>
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #include <common.h>
9*4882a593Smuzhiyun #include <dm.h>
10*4882a593Smuzhiyun #include <ram.h>
11*4882a593Smuzhiyun #include <spl.h>
12*4882a593Smuzhiyun #include <asm/io.h>
13*4882a593Smuzhiyun #include <asm/armv7m.h>
14*4882a593Smuzhiyun #include <asm/arch/stm32.h>
15*4882a593Smuzhiyun #include <asm/arch/gpio.h>
16*4882a593Smuzhiyun #include <asm/arch/stm32_periph.h>
17*4882a593Smuzhiyun #include <asm/arch/stm32_defs.h>
18*4882a593Smuzhiyun #include <asm/arch/syscfg.h>
19*4882a593Smuzhiyun #include <asm/gpio.h>
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
22*4882a593Smuzhiyun
get_memory_base_size(fdt_addr_t * mr_base,fdt_addr_t * mr_size)23*4882a593Smuzhiyun int get_memory_base_size(fdt_addr_t *mr_base, fdt_addr_t *mr_size)
24*4882a593Smuzhiyun {
25*4882a593Smuzhiyun int mr_node;
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun mr_node = fdt_path_offset(gd->fdt_blob, "/memory");
28*4882a593Smuzhiyun if (mr_node < 0)
29*4882a593Smuzhiyun return mr_node;
30*4882a593Smuzhiyun *mr_base = fdtdec_get_addr_size_auto_noparent(gd->fdt_blob, mr_node,
31*4882a593Smuzhiyun "reg", 0, mr_size, false);
32*4882a593Smuzhiyun debug("mr_base = %lx, mr_size= %lx\n", *mr_base, *mr_size);
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun return 0;
35*4882a593Smuzhiyun }
dram_init(void)36*4882a593Smuzhiyun int dram_init(void)
37*4882a593Smuzhiyun {
38*4882a593Smuzhiyun int rv;
39*4882a593Smuzhiyun fdt_addr_t mr_base, mr_size;
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun #ifndef CONFIG_SUPPORT_SPL
42*4882a593Smuzhiyun struct udevice *dev;
43*4882a593Smuzhiyun rv = uclass_get_device(UCLASS_RAM, 0, &dev);
44*4882a593Smuzhiyun if (rv) {
45*4882a593Smuzhiyun debug("DRAM init failed: %d\n", rv);
46*4882a593Smuzhiyun return rv;
47*4882a593Smuzhiyun }
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun #endif
50*4882a593Smuzhiyun rv = get_memory_base_size(&mr_base, &mr_size);
51*4882a593Smuzhiyun if (rv)
52*4882a593Smuzhiyun return rv;
53*4882a593Smuzhiyun gd->ram_size = mr_size;
54*4882a593Smuzhiyun gd->ram_top = mr_base;
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun return rv;
57*4882a593Smuzhiyun }
58*4882a593Smuzhiyun
dram_init_banksize(void)59*4882a593Smuzhiyun int dram_init_banksize(void)
60*4882a593Smuzhiyun {
61*4882a593Smuzhiyun fdt_addr_t mr_base, mr_size;
62*4882a593Smuzhiyun get_memory_base_size(&mr_base, &mr_size);
63*4882a593Smuzhiyun /*
64*4882a593Smuzhiyun * Fill in global info with description of SRAM configuration
65*4882a593Smuzhiyun */
66*4882a593Smuzhiyun gd->bd->bi_dram[0].start = mr_base;
67*4882a593Smuzhiyun gd->bd->bi_dram[0].size = mr_size;
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun return 0;
70*4882a593Smuzhiyun }
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun #ifdef CONFIG_ETH_DESIGNWARE
stmmac_setup(void)73*4882a593Smuzhiyun static int stmmac_setup(void)
74*4882a593Smuzhiyun {
75*4882a593Smuzhiyun clock_setup(SYSCFG_CLOCK_CFG);
76*4882a593Smuzhiyun /* Set >RMII mode */
77*4882a593Smuzhiyun STM32_SYSCFG->pmc |= SYSCFG_PMC_MII_RMII_SEL;
78*4882a593Smuzhiyun clock_setup(STMMAC_CLOCK_CFG);
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun return 0;
81*4882a593Smuzhiyun }
82*4882a593Smuzhiyun
board_early_init_f(void)83*4882a593Smuzhiyun int board_early_init_f(void)
84*4882a593Smuzhiyun {
85*4882a593Smuzhiyun stmmac_setup();
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun return 0;
88*4882a593Smuzhiyun }
89*4882a593Smuzhiyun #endif
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun #ifdef CONFIG_SPL_BUILD
92*4882a593Smuzhiyun #ifdef CONFIG_SPL_OS_BOOT
spl_start_uboot(void)93*4882a593Smuzhiyun int spl_start_uboot(void)
94*4882a593Smuzhiyun {
95*4882a593Smuzhiyun debug("SPL: booting kernel\n");
96*4882a593Smuzhiyun /* break into full u-boot on 'c' */
97*4882a593Smuzhiyun return serial_tstc() && serial_getc() == 'c';
98*4882a593Smuzhiyun }
99*4882a593Smuzhiyun #endif
100*4882a593Smuzhiyun
spl_dram_init(void)101*4882a593Smuzhiyun int spl_dram_init(void)
102*4882a593Smuzhiyun {
103*4882a593Smuzhiyun struct udevice *dev;
104*4882a593Smuzhiyun int rv;
105*4882a593Smuzhiyun rv = uclass_get_device(UCLASS_RAM, 0, &dev);
106*4882a593Smuzhiyun if (rv)
107*4882a593Smuzhiyun debug("DRAM init failed: %d\n", rv);
108*4882a593Smuzhiyun return rv;
109*4882a593Smuzhiyun }
spl_board_init(void)110*4882a593Smuzhiyun void spl_board_init(void)
111*4882a593Smuzhiyun {
112*4882a593Smuzhiyun spl_dram_init();
113*4882a593Smuzhiyun preloader_console_init();
114*4882a593Smuzhiyun arch_cpu_init(); /* to configure mpu for sdram rw permissions */
115*4882a593Smuzhiyun }
spl_boot_device(void)116*4882a593Smuzhiyun u32 spl_boot_device(void)
117*4882a593Smuzhiyun {
118*4882a593Smuzhiyun return BOOT_DEVICE_XIP;
119*4882a593Smuzhiyun }
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun #endif
get_board_rev(void)122*4882a593Smuzhiyun u32 get_board_rev(void)
123*4882a593Smuzhiyun {
124*4882a593Smuzhiyun return 0;
125*4882a593Smuzhiyun }
126*4882a593Smuzhiyun
board_late_init(void)127*4882a593Smuzhiyun int board_late_init(void)
128*4882a593Smuzhiyun {
129*4882a593Smuzhiyun struct gpio_desc gpio = {};
130*4882a593Smuzhiyun int node;
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun node = fdt_node_offset_by_compatible(gd->fdt_blob, 0, "st,led1");
133*4882a593Smuzhiyun if (node < 0)
134*4882a593Smuzhiyun return -1;
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun gpio_request_by_name_nodev(offset_to_ofnode(node), "led-gpio", 0, &gpio,
137*4882a593Smuzhiyun GPIOD_IS_OUT);
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun if (dm_gpio_is_valid(&gpio)) {
140*4882a593Smuzhiyun dm_gpio_set_value(&gpio, 0);
141*4882a593Smuzhiyun mdelay(10);
142*4882a593Smuzhiyun dm_gpio_set_value(&gpio, 1);
143*4882a593Smuzhiyun }
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun /* read button 1*/
146*4882a593Smuzhiyun node = fdt_node_offset_by_compatible(gd->fdt_blob, 0, "st,button1");
147*4882a593Smuzhiyun if (node < 0)
148*4882a593Smuzhiyun return -1;
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun gpio_request_by_name_nodev(offset_to_ofnode(node), "button-gpio", 0,
151*4882a593Smuzhiyun &gpio, GPIOD_IS_IN);
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun if (dm_gpio_is_valid(&gpio)) {
154*4882a593Smuzhiyun if (dm_gpio_get_value(&gpio))
155*4882a593Smuzhiyun puts("usr button is at HIGH LEVEL\n");
156*4882a593Smuzhiyun else
157*4882a593Smuzhiyun puts("usr button is at LOW LEVEL\n");
158*4882a593Smuzhiyun }
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun return 0;
161*4882a593Smuzhiyun }
162*4882a593Smuzhiyun
board_init(void)163*4882a593Smuzhiyun int board_init(void)
164*4882a593Smuzhiyun {
165*4882a593Smuzhiyun gd->bd->bi_boot_params = gd->bd->bi_dram[0].start + 0x100;
166*4882a593Smuzhiyun return 0;
167*4882a593Smuzhiyun }
168