summaryrefslogtreecommitdiff
path: root/drivers/clocksource/clksrc-probe.c
diff options
context:
space:
mode:
authorDaniel Lezcano <daniel.lezcano@linaro.org>2016-05-31 16:25:59 +0200
committerDaniel Lezcano <daniel.lezcano@linaro.org>2016-06-28 10:19:17 +0200
commitb7c4db861683af5fc50ac3cb3751cf847d765211 (patch)
treed99dd70e66b503d06d933f12e2ab3b994ba30dab /drivers/clocksource/clksrc-probe.c
parentc35d9292fee0474a1a037f75b0b85af32200c76f (diff)
clocksource/drivers/clksrc-probe: Introduce init functions with return code
Currently, the clksrc-probe is not able to handle any error from the init functions. There are different issues with the current code: - the code is duplicated in the init functions by writing error - every driver tends to panic in its own init function - counting the number of clocksources is not reliable This patch adds another table to store the functions returning an error. The table is temporary while we convert all the drivers to return an error and will disappear. Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Diffstat (limited to 'drivers/clocksource/clksrc-probe.c')
-rw-r--r--drivers/clocksource/clksrc-probe.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/drivers/clocksource/clksrc-probe.c b/drivers/clocksource/clksrc-probe.c
index 7cb6c923a836..5fa6a555b35c 100644
--- a/drivers/clocksource/clksrc-probe.c
+++ b/drivers/clocksource/clksrc-probe.c
@@ -20,16 +20,22 @@
#include <linux/clocksource.h>
extern struct of_device_id __clksrc_of_table[];
+extern struct of_device_id __clksrc_ret_of_table[];
static const struct of_device_id __clksrc_of_table_sentinel
__used __section(__clksrc_of_table_end);
+static const struct of_device_id __clksrc_ret_of_table_sentinel
+ __used __section(__clksrc_ret_of_table_end);
+
void __init clocksource_probe(void)
{
struct device_node *np;
const struct of_device_id *match;
of_init_fn_1 init_func;
+ of_init_fn_1_ret init_func_ret;
unsigned clocksources = 0;
+ int ret;
for_each_matching_node_and_match(np, __clksrc_of_table, &match) {
if (!of_device_is_available(np))
@@ -40,6 +46,22 @@ void __init clocksource_probe(void)
clocksources++;
}
+ for_each_matching_node_and_match(np, __clksrc_ret_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 '%s': %d",
+ of_node_full_name(np), ret);
+ continue;
+ }
+
+ clocksources++;
+ }
+
clocksources += acpi_probe_device_table(clksrc);
if (!clocksources)