1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved. 4 */ 5 6 #include <linux/acpi.h> 7 #include <linux/init.h> 8 #include <linux/of.h> 9 #include <linux/clocksource.h> 10 11 extern struct of_device_id __timer_of_table[]; 12 13 static const struct of_device_id __timer_of_table_sentinel 14 __used __section(__timer_of_table_end); 15 16 void __init timer_probe(void) 17 { 18 struct device_node *np; 19 const struct of_device_id *match; 20 of_init_fn_1_ret init_func_ret; 21 unsigned timers = 0; 22 int ret; 23 24 for_each_matching_node_and_match(np, __timer_of_table, &match) { 25 if (!of_device_is_available(np)) 26 continue; 27 28 init_func_ret = match->data; 29 30 of_node_set_flag(np, OF_POPULATED); 31 ret = init_func_ret(np); 32 if (ret) { 33 of_node_clear_flag(np, OF_POPULATED); 34 if (ret != -EPROBE_DEFER) 35 pr_err("Failed to initialize '%pOF': %d\n", np, 36 ret); 37 continue; 38 } 39 40 timers++; 41 } 42 43 timers += acpi_probe_device_table(timer); 44 45 if (!timers) 46 pr_crit("%s: no matching timers found\n", __func__); 47 } 48