diff options
| author | Arnd Bergmann <arnd@arndb.de> | 2013-03-19 10:38:50 -0400 |
|---|---|---|
| committer | Arnd Bergmann <arnd@arndb.de> | 2013-03-19 17:57:40 -0400 |
| commit | 4d10f054f7df600ec8a388091c93b2d976920de0 (patch) | |
| tree | 0b76d66daa1006ca9af5ec060bfd3b4c026bafcd | |
| parent | da4a686a2cfb077a8bfc1697f597e7f86235b822 (diff) | |
clocksource: make CLOCKSOURCE_OF_DECLARE type safe
This ensures that a function pointer passed into CLOCKSOURCE_OF_DECLARE
takes the same arguments that we use for calling that function later.
Also fix the extraneous semicolon at end of the CLOCKSOURCE_OF_DECLARE
definition.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Rob Herring <rob.herring@calxeda.com>
| -rw-r--r-- | drivers/clocksource/clksrc-of.c | 3 | ||||
| -rw-r--r-- | drivers/clocksource/vt8500_timer.c | 2 | ||||
| -rw-r--r-- | include/linux/clocksource.h | 11 |
3 files changed, 12 insertions, 4 deletions
diff --git a/drivers/clocksource/clksrc-of.c b/drivers/clocksource/clksrc-of.c index 3ef11fba781c..37f5325bec95 100644 --- a/drivers/clocksource/clksrc-of.c +++ b/drivers/clocksource/clksrc-of.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | 16 | ||
| 17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
| 18 | #include <linux/of.h> | 18 | #include <linux/of.h> |
| 19 | #include <linux/clocksource.h> | ||
| 19 | 20 | ||
| 20 | extern struct of_device_id __clksrc_of_table[]; | 21 | extern struct of_device_id __clksrc_of_table[]; |
| 21 | 22 | ||
| @@ -26,7 +27,7 @@ void __init clocksource_of_init(void) | |||
| 26 | { | 27 | { |
| 27 | struct device_node *np; | 28 | struct device_node *np; |
| 28 | const struct of_device_id *match; | 29 | const struct of_device_id *match; |
| 29 | void (*init_func)(struct device_node *); | 30 | clocksource_of_init_fn init_func; |
| 30 | 31 | ||
| 31 | for_each_matching_node_and_match(np, __clksrc_of_table, &match) { | 32 | for_each_matching_node_and_match(np, __clksrc_of_table, &match) { |
| 32 | init_func = match->data; | 33 | init_func = match->data; |
diff --git a/drivers/clocksource/vt8500_timer.c b/drivers/clocksource/vt8500_timer.c index 242255285597..64f553f04fa4 100644 --- a/drivers/clocksource/vt8500_timer.c +++ b/drivers/clocksource/vt8500_timer.c | |||
| @@ -165,4 +165,4 @@ static void __init vt8500_timer_init(struct device_node *np) | |||
| 165 | 4, 0xf0000000); | 165 | 4, 0xf0000000); |
| 166 | } | 166 | } |
| 167 | 167 | ||
| 168 | CLOCKSOURCE_OF_DECLARE(vt8500, "via,vt8500-timer", vt8500_timer_init) | 168 | CLOCKSOURCE_OF_DECLARE(vt8500, "via,vt8500-timer", vt8500_timer_init); |
diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index 08ed5e19d8c6..ac33184b14fd 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h | |||
| @@ -332,16 +332,23 @@ extern int clocksource_mmio_init(void __iomem *, const char *, | |||
| 332 | 332 | ||
| 333 | extern int clocksource_i8253_init(void); | 333 | extern int clocksource_i8253_init(void); |
| 334 | 334 | ||
| 335 | struct device_node; | ||
| 336 | typedef void(*clocksource_of_init_fn)(struct device_node *); | ||
| 335 | #ifdef CONFIG_CLKSRC_OF | 337 | #ifdef CONFIG_CLKSRC_OF |
| 336 | extern void clocksource_of_init(void); | 338 | extern void clocksource_of_init(void); |
| 337 | 339 | ||
| 338 | #define CLOCKSOURCE_OF_DECLARE(name, compat, fn) \ | 340 | #define CLOCKSOURCE_OF_DECLARE(name, compat, fn) \ |
| 339 | static const struct of_device_id __clksrc_of_table_##name \ | 341 | static const struct of_device_id __clksrc_of_table_##name \ |
| 340 | __used __section(__clksrc_of_table) \ | 342 | __used __section(__clksrc_of_table) \ |
| 341 | = { .compatible = compat, .data = fn }; | 343 | = { .compatible = compat, \ |
| 344 | .data = (fn == (clocksource_of_init_fn)NULL) ? fn : fn } | ||
| 342 | #else | 345 | #else |
| 343 | static inline void clocksource_of_init(void) {} | 346 | static inline void clocksource_of_init(void) {} |
| 344 | #define CLOCKSOURCE_OF_DECLARE(name, compat, fn) | 347 | #define CLOCKSOURCE_OF_DECLARE(name, compat, fn) \ |
| 348 | static const struct of_device_id __clksrc_of_table_##name \ | ||
| 349 | __unused __section(__clksrc_of_table) \ | ||
| 350 | = { .compatible = compat, \ | ||
| 351 | .data = (fn == (clocksource_of_init_fn)NULL) ? fn : fn } | ||
| 345 | #endif | 352 | #endif |
| 346 | 353 | ||
| 347 | #endif /* _LINUX_CLOCKSOURCE_H */ | 354 | #endif /* _LINUX_CLOCKSOURCE_H */ |
