From 122f2260b350e94e4e79439ea289f08a329eb14a Mon Sep 17 00:00:00 2001 From: Xiang W Date: Mon, 22 May 2023 13:18:09 +0800 Subject: [PATCH] lib: utils: Improve fdt_timer Remove dummy driver. Optimize fdt_timer_cold_init to exit the loop early. Signed-off-by: Xiang W Reviewed-by: Anup Patel --- lib/utils/timer/fdt_timer.c | 43 +++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/lib/utils/timer/fdt_timer.c b/lib/utils/timer/fdt_timer.c index 4695c0f..62426a7 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; - } - current_driver = drv; - } + /* drv->cold_init must not be NULL */ + if (drv->cold_init == NULL) + return SBI_EFAIL; - if (current_driver != &dummy) - break; + rc = drv->cold_init(fdt, noff, match); + if (rc == SBI_ENODEV) + continue; + if (rc) + return rc; + current_driver = drv; + + /* + * 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; }