diff options
| author | Xiang W <wxjstz@126.com> | 2023-05-22 13:18:09 +0800 |
|---|---|---|
| committer | Anup Patel <anup@brainfault.org> | 2023-05-26 12:47:22 +0530 |
| commit | 122f2260b350e94e4e79439ea289f08a329eb14a (patch) | |
| tree | e7fe5cdafa5da8c5c97f8733a9598d2c0e7eb13e | |
| parent | 9a0bdd0c844ea87a7b83c313e1dd8e8152d508e7 (diff) | |
| download | opensbi-122f2260b350e94e4e79439ea289f08a329eb14a.tar.gz opensbi-122f2260b350e94e4e79439ea289f08a329eb14a.zip | |
lib: utils: Improve fdt_timer
Remove dummy driver. Optimize fdt_timer_cold_init to exit the
loop early.
Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
| -rw-r--r-- | lib/utils/timer/fdt_timer.c | 41 |
1 files changed, 21 insertions, 20 deletions
diff --git a/lib/utils/timer/fdt_timer.c b/lib/utils/timer/fdt_timer.c index 4695c0f0..62426a70 100644 --- a/lib/utils/timer/fdt_timer.c +++ b/lib/utils/timer/fdt_timer.c @@ -16,24 +16,17 @@ extern struct fdt_timer *fdt_timer_drivers[]; extern unsigned long fdt_timer_drivers_size; -static struct fdt_timer dummy = { - .match_table = NULL, - .cold_init = NULL, - .warm_init = NULL, - .exit = NULL, -}; - -static struct fdt_timer *current_driver = &dummy; +static struct fdt_timer *current_driver = NULL; void fdt_timer_exit(void) { - if (current_driver->exit) + if (current_driver && current_driver->exit) current_driver->exit(); } static int fdt_timer_warm_init(void) { - if (current_driver->warm_init) + if (current_driver && current_driver->warm_init) return current_driver->warm_init(); return 0; } @@ -51,20 +44,28 @@ static int fdt_timer_cold_init(void) noff = -1; while ((noff = fdt_find_match(fdt, noff, drv->match_table, &match)) >= 0) { - if (drv->cold_init) { - rc = drv->cold_init(fdt, noff, match); - if (rc == SBI_ENODEV) - continue; - if (rc) - return rc; - } + /* drv->cold_init must not be NULL */ + if (drv->cold_init == NULL) + return SBI_EFAIL; + + rc = drv->cold_init(fdt, noff, match); + if (rc == SBI_ENODEV) + continue; + if (rc) + return rc; current_driver = drv; - } - if (current_driver != &dummy) - break; + /* + * We will have multiple timer devices on multi-die or + * multi-socket systems so we cannot break here. + */ + } } + /* + * We can't fail here since systems with Sstc might not provide + * mtimer/clint DT node in the device tree. + */ return 0; } |
