Commit 3d5a9658 authored by Arnd Bergmann's avatar Arnd Bergmann

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: default avatarArnd Bergmann <arnd@arndb.de>
Acked-by: default avatarRob Herring <rob.herring@calxeda.com>
parent da4a686a
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/clocksource.h>
extern struct of_device_id __clksrc_of_table[]; extern struct of_device_id __clksrc_of_table[];
...@@ -26,7 +27,7 @@ void __init clocksource_of_init(void) ...@@ -26,7 +27,7 @@ void __init clocksource_of_init(void)
{ {
struct device_node *np; struct device_node *np;
const struct of_device_id *match; const struct of_device_id *match;
void (*init_func)(struct device_node *); clocksource_of_init_fn init_func;
for_each_matching_node_and_match(np, __clksrc_of_table, &match) { for_each_matching_node_and_match(np, __clksrc_of_table, &match) {
init_func = match->data; init_func = match->data;
......
...@@ -165,4 +165,4 @@ static void __init vt8500_timer_init(struct device_node *np) ...@@ -165,4 +165,4 @@ static void __init vt8500_timer_init(struct device_node *np)
4, 0xf0000000); 4, 0xf0000000);
} }
CLOCKSOURCE_OF_DECLARE(vt8500, "via,vt8500-timer", vt8500_timer_init) CLOCKSOURCE_OF_DECLARE(vt8500, "via,vt8500-timer", vt8500_timer_init);
...@@ -332,16 +332,23 @@ extern int clocksource_mmio_init(void __iomem *, const char *, ...@@ -332,16 +332,23 @@ extern int clocksource_mmio_init(void __iomem *, const char *,
extern int clocksource_i8253_init(void); extern int clocksource_i8253_init(void);
struct device_node;
typedef void(*clocksource_of_init_fn)(struct device_node *);
#ifdef CONFIG_CLKSRC_OF #ifdef CONFIG_CLKSRC_OF
extern void clocksource_of_init(void); extern void clocksource_of_init(void);
#define CLOCKSOURCE_OF_DECLARE(name, compat, fn) \ #define CLOCKSOURCE_OF_DECLARE(name, compat, fn) \
static const struct of_device_id __clksrc_of_table_##name \ static const struct of_device_id __clksrc_of_table_##name \
__used __section(__clksrc_of_table) \ __used __section(__clksrc_of_table) \
= { .compatible = compat, .data = fn }; = { .compatible = compat, \
.data = (fn == (clocksource_of_init_fn)NULL) ? fn : fn }
#else #else
static inline void clocksource_of_init(void) {} static inline void clocksource_of_init(void) {}
#define CLOCKSOURCE_OF_DECLARE(name, compat, fn) #define CLOCKSOURCE_OF_DECLARE(name, compat, fn) \
static const struct of_device_id __clksrc_of_table_##name \
__attribute__((unused)) \
= { .compatible = compat, \
.data = (fn == (clocksource_of_init_fn)NULL) ? fn : fn }
#endif #endif
#endif /* _LINUX_CLOCKSOURCE_H */ #endif /* _LINUX_CLOCKSOURCE_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment