xref: /rk3399_rockchip-uboot/board/xilinx/microblaze-generic/microblaze-generic.c (revision 76b00aca4f1c13bc8f91a539e612abc70d0c692f)
152a822edSMichal Simek /*
252a822edSMichal Simek  * (C) Copyright 2007 Michal Simek
352a822edSMichal Simek  *
452a822edSMichal Simek  * Michal  SIMEK <monstr@monstr.eu>
552a822edSMichal Simek  *
61a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
752a822edSMichal Simek  */
852a822edSMichal Simek 
952a822edSMichal Simek /* This is a board specific file.  It's OK to include board specific
1052a822edSMichal Simek  * header files */
1152a822edSMichal Simek 
1252a822edSMichal Simek #include <common.h>
1352a822edSMichal Simek #include <config.h>
14e945f6dcSMichal Simek #include <fdtdec.h>
152380b8f5SMichal Simek #include <asm/processor.h>
1652a822edSMichal Simek #include <asm/microblaze_intc.h>
1752a822edSMichal Simek #include <asm/asm.h>
184e779ad2SMichal Simek #include <asm/gpio.h>
194e779ad2SMichal Simek 
20e945f6dcSMichal Simek DECLARE_GLOBAL_DATA_PTR;
21e945f6dcSMichal Simek 
224e779ad2SMichal Simek #ifdef CONFIG_XILINX_GPIO
234e779ad2SMichal Simek static int reset_pin = -1;
244e779ad2SMichal Simek #endif
2552a822edSMichal Simek 
26e945f6dcSMichal Simek ulong ram_base;
27e945f6dcSMichal Simek 
dram_init_banksize(void)28*76b00acaSSimon Glass int dram_init_banksize(void)
29e945f6dcSMichal Simek {
30e945f6dcSMichal Simek 	gd->bd->bi_dram[0].start = ram_base;
31e945f6dcSMichal Simek 	gd->bd->bi_dram[0].size = get_effective_memsize();
32*76b00acaSSimon Glass 
33*76b00acaSSimon Glass 	return 0;
34e945f6dcSMichal Simek }
35e945f6dcSMichal Simek 
dram_init(void)36e945f6dcSMichal Simek int dram_init(void)
37e945f6dcSMichal Simek {
38e945f6dcSMichal Simek 	int node;
39e945f6dcSMichal Simek 	fdt_addr_t addr;
40e945f6dcSMichal Simek 	fdt_size_t size;
41e945f6dcSMichal Simek 	const void *blob = gd->fdt_blob;
42e945f6dcSMichal Simek 
43e945f6dcSMichal Simek 	node = fdt_node_offset_by_prop_value(blob, -1, "device_type",
44e945f6dcSMichal Simek 					     "memory", 7);
45e945f6dcSMichal Simek 	if (node == -FDT_ERR_NOTFOUND) {
46e945f6dcSMichal Simek 		debug("DRAM: Can't get memory node\n");
47e945f6dcSMichal Simek 		return 1;
48e945f6dcSMichal Simek 	}
49e945f6dcSMichal Simek 	addr = fdtdec_get_addr_size(blob, node, "reg", &size);
50e945f6dcSMichal Simek 	if (addr == FDT_ADDR_T_NONE || size == 0) {
51e945f6dcSMichal Simek 		debug("DRAM: Can't get base address or size\n");
52e945f6dcSMichal Simek 		return 1;
53e945f6dcSMichal Simek 	}
54e945f6dcSMichal Simek 	ram_base = addr;
55e945f6dcSMichal Simek 
56e945f6dcSMichal Simek 	gd->ram_top = addr; /* In setup_dest_addr() is done +ram_size */
57e945f6dcSMichal Simek 	gd->ram_size = size;
58e945f6dcSMichal Simek 
59e945f6dcSMichal Simek 	return 0;
60e945f6dcSMichal Simek };
61e945f6dcSMichal Simek 
do_reset(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])62882b7d72SMike Frysinger int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
6352a822edSMichal Simek {
64b5e9b9a9SMichal Simek #ifndef CONFIG_SPL_BUILD
654e779ad2SMichal Simek #ifdef CONFIG_XILINX_GPIO
664e779ad2SMichal Simek 	if (reset_pin != -1)
674e779ad2SMichal Simek 		gpio_direction_output(reset_pin, 1);
6852a822edSMichal Simek #endif
69b364727aSMichal Simek 
700f21f98dSMichal Simek #ifdef CONFIG_XILINX_TB_WATCHDOG
710f21f98dSMichal Simek 	hw_watchdog_disable();
720f21f98dSMichal Simek #endif
73b5e9b9a9SMichal Simek #endif
7452a822edSMichal Simek 	puts ("Reseting board\n");
758848668eSMichal Simek 	__asm__ __volatile__ ("	mts rmsr, r0;" \
768848668eSMichal Simek 				"bra r0");
77b364727aSMichal Simek 
78882b7d72SMike Frysinger 	return 0;
7952a822edSMichal Simek }
8052a822edSMichal Simek 
gpio_init(void)8138c4761cSMichal Simek static int gpio_init(void)
8252a822edSMichal Simek {
834e779ad2SMichal Simek #ifdef CONFIG_XILINX_GPIO
844e779ad2SMichal Simek 	reset_pin = gpio_alloc(CONFIG_SYS_GPIO_0_ADDR, "reset", 1);
854e779ad2SMichal Simek 	if (reset_pin != -1)
864e779ad2SMichal Simek 		gpio_request(reset_pin, "reset_pin");
8752a822edSMichal Simek #endif
8852a822edSMichal Simek 	return 0;
8952a822edSMichal Simek }
9052a822edSMichal Simek 
board_late_init(void)9138c4761cSMichal Simek int board_late_init(void)
922380b8f5SMichal Simek {
932380b8f5SMichal Simek 	gpio_init();
9438c4761cSMichal Simek 
9538c4761cSMichal Simek 	return 0;
962380b8f5SMichal Simek }
97