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>
This commit is contained in:
parent
da4a686a2c
commit
3d5a965823
|
@ -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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
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 *,
|
||||||
|
|
||||||
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 */
|
||||||
|
|
Loading…
Reference in New Issue