1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * (C) Copyright 2007-2018 Michal Simek 4 * 5 * Michal SIMEK <monstr@monstr.eu> 6 */ 7 8 /* 9 * This is a board specific file. It's OK to include board specific 10 * header files 11 */ 12 13 #include <common.h> 14 #include <config.h> 15 #include <dm.h> 16 #include <dm/lists.h> 17 #include <fdtdec.h> 18 #include <asm/processor.h> 19 #include <asm/microblaze_intc.h> 20 #include <asm/asm.h> 21 #include <asm/gpio.h> 22 #include <dm/uclass.h> 23 #include <wdt.h> 24 25 DECLARE_GLOBAL_DATA_PTR; 26 27 #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_WDT) 28 static struct udevice *watchdog_dev; 29 #endif /* !CONFIG_SPL_BUILD && CONFIG_WDT */ 30 31 ulong ram_base; 32 33 int dram_init_banksize(void) 34 { 35 gd->bd->bi_dram[0].start = ram_base; 36 gd->bd->bi_dram[0].size = get_effective_memsize(); 37 38 return 0; 39 } 40 41 int dram_init(void) 42 { 43 int node; 44 fdt_addr_t addr; 45 fdt_size_t size; 46 const void *blob = gd->fdt_blob; 47 48 node = fdt_node_offset_by_prop_value(blob, -1, "device_type", 49 "memory", 7); 50 if (node == -FDT_ERR_NOTFOUND) { 51 debug("DRAM: Can't get memory node\n"); 52 return 1; 53 } 54 addr = fdtdec_get_addr_size(blob, node, "reg", &size); 55 if (addr == FDT_ADDR_T_NONE || size == 0) { 56 debug("DRAM: Can't get base address or size\n"); 57 return 1; 58 } 59 ram_base = addr; 60 61 gd->ram_top = addr; /* In setup_dest_addr() is done +ram_size */ 62 gd->ram_size = size; 63 64 return 0; 65 }; 66 67 #ifdef CONFIG_WDT 68 /* Called by macro WATCHDOG_RESET */ 69 void watchdog_reset(void) 70 { 71 #if !defined(CONFIG_SPL_BUILD) 72 ulong now; 73 static ulong next_reset; 74 75 if (!watchdog_dev) 76 return; 77 78 now = timer_get_us(); 79 80 /* Do not reset the watchdog too often */ 81 if (now > next_reset) { 82 wdt_reset(watchdog_dev); 83 next_reset = now + 1000; 84 } 85 #endif /* !CONFIG_SPL_BUILD */ 86 } 87 #endif /* CONFIG_WDT */ 88 89 int board_late_init(void) 90 { 91 #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_WDT) 92 watchdog_dev = NULL; 93 94 if (uclass_get_device_by_seq(UCLASS_WDT, 0, &watchdog_dev)) { 95 debug("Watchdog: Not found by seq!\n"); 96 if (uclass_get_device(UCLASS_WDT, 0, &watchdog_dev)) { 97 puts("Watchdog: Not found!\n"); 98 return 0; 99 } 100 } 101 102 wdt_start(watchdog_dev, 0, 0); 103 puts("Watchdog: Started\n"); 104 #endif /* !CONFIG_SPL_BUILD && CONFIG_WDT */ 105 #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_SYSRESET_MICROBLAZE) 106 int ret; 107 108 ret = device_bind_driver(gd->dm_root, "mb_soft_reset", 109 "reset_soft", NULL); 110 if (ret) 111 printf("Warning: No reset driver: ret=%d\n", ret); 112 #endif 113 return 0; 114 } 115