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:
Heinrich Schuchardt
2021-11-06 10:54:51 +01:00
committed by Anup Patel
parent 57f094e67e
commit be245acfff
2 changed files with 12 additions and 8 deletions

View File

@@ -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

View File

@@ -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;
}