183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
252a822edSMichal Simek /*
34a693669SMichal Simek  * (C) Copyright 2007-2018 Michal Simek
452a822edSMichal Simek  *
552a822edSMichal Simek  * Michal SIMEK <monstr@monstr.eu>
652a822edSMichal Simek  */
752a822edSMichal Simek 
835912528SShreenidhi Shedi /*
935912528SShreenidhi Shedi  * This is a board specific file.  It's OK to include board specific
1035912528SShreenidhi Shedi  * header files
1135912528SShreenidhi Shedi  */
1252a822edSMichal Simek 
1352a822edSMichal Simek #include <common.h>
1452a822edSMichal Simek #include <config.h>
154a693669SMichal Simek #include <dm.h>
164a693669SMichal Simek #include <dm/lists.h>
17e945f6dcSMichal Simek #include <fdtdec.h>
182380b8f5SMichal Simek #include <asm/processor.h>
1952a822edSMichal Simek #include <asm/microblaze_intc.h>
2052a822edSMichal Simek #include <asm/asm.h>
214e779ad2SMichal Simek #include <asm/gpio.h>
226ec6f584SShreenidhi Shedi #include <dm/uclass.h>
236ec6f584SShreenidhi Shedi #include <wdt.h>
244e779ad2SMichal Simek 
25e945f6dcSMichal Simek DECLARE_GLOBAL_DATA_PTR;
26e945f6dcSMichal Simek 
276ec6f584SShreenidhi Shedi #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_WDT)
28*ccd063e9SStefan Roese static struct udevice *watchdog_dev __attribute__((section(".data"))) = NULL;
296ec6f584SShreenidhi Shedi #endif /* !CONFIG_SPL_BUILD && CONFIG_WDT */
306ec6f584SShreenidhi Shedi 
31e945f6dcSMichal Simek ulong ram_base;
32e945f6dcSMichal Simek 
dram_init_banksize(void)3376b00acaSSimon Glass int dram_init_banksize(void)
34e945f6dcSMichal Simek {
35656185a5SMichal Simek 	return fdtdec_setup_memory_banksize();
36e945f6dcSMichal Simek }
37e945f6dcSMichal Simek 
dram_init(void)38e945f6dcSMichal Simek int dram_init(void)
39e945f6dcSMichal Simek {
40656185a5SMichal Simek 	if (fdtdec_setup_mem_size_base() != 0)
41656185a5SMichal Simek 		return -EINVAL;
42e945f6dcSMichal Simek 
43e945f6dcSMichal Simek 	return 0;
44e945f6dcSMichal Simek };
45e945f6dcSMichal Simek 
466ec6f584SShreenidhi Shedi #ifdef CONFIG_WDT
476ec6f584SShreenidhi Shedi /* Called by macro WATCHDOG_RESET */
watchdog_reset(void)486ec6f584SShreenidhi Shedi void watchdog_reset(void)
496ec6f584SShreenidhi Shedi {
506ec6f584SShreenidhi Shedi #if !defined(CONFIG_SPL_BUILD)
516ec6f584SShreenidhi Shedi 	ulong now;
526ec6f584SShreenidhi Shedi 	static ulong next_reset;
536ec6f584SShreenidhi Shedi 
546ec6f584SShreenidhi Shedi 	if (!watchdog_dev)
556ec6f584SShreenidhi Shedi 		return;
566ec6f584SShreenidhi Shedi 
576ec6f584SShreenidhi Shedi 	now = timer_get_us();
586ec6f584SShreenidhi Shedi 
596ec6f584SShreenidhi Shedi 	/* Do not reset the watchdog too often */
606ec6f584SShreenidhi Shedi 	if (now > next_reset) {
616ec6f584SShreenidhi Shedi 		wdt_reset(watchdog_dev);
626ec6f584SShreenidhi Shedi 		next_reset = now + 1000;
636ec6f584SShreenidhi Shedi 	}
646ec6f584SShreenidhi Shedi #endif /* !CONFIG_SPL_BUILD */
656ec6f584SShreenidhi Shedi }
666ec6f584SShreenidhi Shedi #endif /* CONFIG_WDT */
676ec6f584SShreenidhi Shedi 
board_late_init(void)6838c4761cSMichal Simek int board_late_init(void)
692380b8f5SMichal Simek {
706ec6f584SShreenidhi Shedi #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_WDT)
716ec6f584SShreenidhi Shedi 	watchdog_dev = NULL;
726ec6f584SShreenidhi Shedi 
736ec6f584SShreenidhi Shedi 	if (uclass_get_device_by_seq(UCLASS_WDT, 0, &watchdog_dev)) {
746ec6f584SShreenidhi Shedi 		debug("Watchdog: Not found by seq!\n");
756ec6f584SShreenidhi Shedi 		if (uclass_get_device(UCLASS_WDT, 0, &watchdog_dev)) {
766ec6f584SShreenidhi Shedi 			puts("Watchdog: Not found!\n");
776ec6f584SShreenidhi Shedi 			return 0;
786ec6f584SShreenidhi Shedi 		}
796ec6f584SShreenidhi Shedi 	}
806ec6f584SShreenidhi Shedi 
816ec6f584SShreenidhi Shedi 	wdt_start(watchdog_dev, 0, 0);
826ec6f584SShreenidhi Shedi 	puts("Watchdog: Started\n");
836ec6f584SShreenidhi Shedi #endif /* !CONFIG_SPL_BUILD && CONFIG_WDT */
844a693669SMichal Simek #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_SYSRESET_MICROBLAZE)
854a693669SMichal Simek 	int ret;
866ec6f584SShreenidhi Shedi 
874a693669SMichal Simek 	ret = device_bind_driver(gd->dm_root, "mb_soft_reset",
884a693669SMichal Simek 				 "reset_soft", NULL);
894a693669SMichal Simek 	if (ret)
904a693669SMichal Simek 		printf("Warning: No reset driver: ret=%d\n", ret);
914a693669SMichal Simek #endif
9238c4761cSMichal Simek 	return 0;
932380b8f5SMichal Simek }
94