On 02/10/2018 07:40, Guo Ren wrote: [ ... ] >> >> irq = irq_of_parse_and_map(np, 0); >> if (irq <= 0) >> return -EINVAL; > panic(); > I want a panic here. Return will make debug confused and directly tell > the people where is wrong. It's root-timer for us and it must bootup. > > If it's a co-timer, I also think return is good. We don't need a panic in case of failure. If the board as an alternate timer it should be able to boot, that is the general rule of thumb for these drivers in this directory. The init timer functions will be called via the timer_probe() which browse the timer_of_table (the one with all entries for the TIMER_OF_DECLARE macros). You can see in the code below (from timer_probe.c), there is an error message emitted if the driver fails to initialize and another one much stronger if no timer was initialize. This is enough trace IMO. void __init timer_probe(void) { struct device_node *np; const struct of_device_id *match; of_init_fn_1_ret init_func_ret; unsigned timers = 0; int ret; for_each_matching_node_and_match(np, __timer_of_table, &match) { if (!of_device_is_available(np)) continue; init_func_ret = match->data; ret = init_func_ret(np); if (ret) { pr_err("Failed to initialize '%pOF': %d\n", np, ret); continue; } timers++; } timers += acpi_probe_device_table(timer); if (!timers) pr_crit("%s: no matching timers found\n", __func__); } -- <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog