Skip to content

Commit

Permalink
clocksource/drivers/clksrc-probe: Introduce init functions with retur…
Browse files Browse the repository at this point in the history
…n 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>
  • Loading branch information
Daniel Lezcano committed Jun 28, 2016
1 parent c35d929 commit b7c4db8
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 0 deletions.
22 changes: 22 additions & 0 deletions drivers/clocksource/clksrc-probe.c
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand All @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions include/asm-generic/vmlinux.lds.h
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,7 @@
*(__##name##_of_table_end)

#define CLKSRC_OF_TABLES() OF_TABLE(CONFIG_CLKSRC_OF, clksrc)
#define CLKSRC_RET_OF_TABLES() OF_TABLE(CONFIG_CLKSRC_OF, clksrc_ret)
#define IRQCHIP_OF_MATCH_TABLE() OF_TABLE(CONFIG_IRQCHIP, irqchip)
#define CLK_OF_TABLES() OF_TABLE(CONFIG_COMMON_CLK, clk)
#define IOMMU_OF_TABLES() OF_TABLE(CONFIG_OF_IOMMU, iommu)
Expand Down Expand Up @@ -531,6 +532,7 @@
CLK_OF_TABLES() \
RESERVEDMEM_OF_TABLES() \
CLKSRC_OF_TABLES() \
CLKSRC_RET_OF_TABLES() \
IOMMU_OF_TABLES() \
CPU_METHOD_OF_TABLES() \
CPUIDLE_METHOD_OF_TABLES() \
Expand Down
3 changes: 3 additions & 0 deletions include/linux/clocksource.h
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,9 @@ extern int clocksource_i8253_init(void);
#define CLOCKSOURCE_OF_DECLARE(name, compat, fn) \
OF_DECLARE_1(clksrc, name, compat, fn)

#define CLOCKSOURCE_OF_DECLARE_RET(name, compat, fn) \
OF_DECLARE_1_RET(clksrc_ret, name, compat, fn)

#ifdef CONFIG_CLKSRC_PROBE
extern void clocksource_probe(void);
#else
Expand Down

0 comments on commit b7c4db8

Please sign in to comment.