mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-31 18:35:42 +01:00 
			
		
		
		
	Microblaze is storing reset vector at address 0x0. It means soft reset can be done by just jumping to this address. This code was in platform code but sysreset interface is providing enough capabilities to have more options how to reset the system. It can go from gpio reset through watchdog reset till soft reset. The driver has not compatible string because this is cpu specific and DM core is not able to detect compatible string in DT root that's why this driver will be instantiated from platform code by calling device_bind_driver(gd->dm_root, "mb_soft_reset", "reset_soft", NULL); It should be bind as the last reset method to ensure that hw reset is called before this. Signed-off-by: Michal Simek <michal.simek@xilinx.com>
		
			
				
	
	
		
			31 lines
		
	
	
		
			634 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			31 lines
		
	
	
		
			634 B
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: GPL-2.0
 | |
| /*
 | |
|  * Copyright (C) 2018 Xilinx, Inc. - Michal Simek
 | |
|  */
 | |
| 
 | |
| #include <common.h>
 | |
| #include <dm.h>
 | |
| #include <errno.h>
 | |
| #include <sysreset.h>
 | |
| #include <linux/err.h>
 | |
| 
 | |
| static int microblaze_sysreset_request(struct udevice *dev,
 | |
| 				       enum sysreset_t type)
 | |
| {
 | |
| 	puts("Microblaze soft reset sysreset\n");
 | |
| 	__asm__ __volatile__ ("	mts rmsr, r0;" \
 | |
| 				"bra r0");
 | |
| 
 | |
| 	return -EINPROGRESS;
 | |
| }
 | |
| 
 | |
| static struct sysreset_ops microblaze_sysreset = {
 | |
| 	.request = microblaze_sysreset_request,
 | |
| };
 | |
| 
 | |
| U_BOOT_DRIVER(sysreset_microblaze) = {
 | |
| 	.id	= UCLASS_SYSRESET,
 | |
| 	.name	= "mb_soft_reset",
 | |
| 	.ops	= µblaze_sysreset,
 | |
| };
 |