forked from Mirrors/opensbi
		
	lib: sbi: error handling in fdt_reset_init()
The initialization of a reset driver may fail for various reasons, like a PMIC based reset driver not finding the required I2C driver. The return code of the init routine may take other error values than -ENODEV. If the initialization of a reset driver fails, this should not lead to the board hanging. It is enough that the reset driver does not call sbi_system_reset_add_device() to avoid invoking the driver for a device that could not be initialized. Change the return type of fdt_reset_init() to void. Print a message if an error occurs. Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> Reviewed-by: Dong Du <Dd_nirvana@sjtu.edu.cn> Reviewed-by: Anup Patel <anup.patel@wdc.com>
This commit is contained in:
		
				
					committed by
					
						
						Anup Patel
					
				
			
			
				
	
			
			
			
						parent
						
							57f094e67e
						
					
				
				
					commit
					be245acfff
				
			@@ -17,6 +17,11 @@ struct fdt_reset {
 | 
			
		||||
	int (*init)(void *fdt, int nodeoff, const struct fdt_match *match);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int fdt_reset_init(void);
 | 
			
		||||
/**
 | 
			
		||||
 * fdt_reset_init() - initialize reset drivers based on the device-tree
 | 
			
		||||
 *
 | 
			
		||||
 * This function shall be invoked in final init.
 | 
			
		||||
 */
 | 
			
		||||
void fdt_reset_init(void);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@
 | 
			
		||||
 *   Anup Patel <anup.patel@wdc.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <sbi/sbi_console.h>
 | 
			
		||||
#include <sbi/sbi_error.h>
 | 
			
		||||
#include <sbi/sbi_scratch.h>
 | 
			
		||||
#include <sbi_utils/fdt/fdt_helper.h>
 | 
			
		||||
@@ -28,7 +29,7 @@ static struct fdt_reset *reset_drivers[] = {
 | 
			
		||||
	&fdt_reset_thead,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int fdt_reset_init(void)
 | 
			
		||||
void fdt_reset_init(void)
 | 
			
		||||
{
 | 
			
		||||
	int pos, noff, rc;
 | 
			
		||||
	struct fdt_reset *drv;
 | 
			
		||||
@@ -44,12 +45,10 @@ int fdt_reset_init(void)
 | 
			
		||||
 | 
			
		||||
		if (drv->init) {
 | 
			
		||||
			rc = drv->init(fdt, noff, match);
 | 
			
		||||
			if (rc == SBI_ENODEV)
 | 
			
		||||
				continue;
 | 
			
		||||
			if (rc)
 | 
			
		||||
				return rc;
 | 
			
		||||
			if (rc && rc != SBI_ENODEV) {
 | 
			
		||||
				sbi_printf("%s: %s init failed, %d\n",
 | 
			
		||||
					   __func__, match->compatible, rc);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user