diff options
| -rw-r--r-- | drivers/clocksource/Kconfig | 3 | ||||
| -rw-r--r-- | drivers/clocksource/Makefile | 1 | ||||
| -rw-r--r-- | drivers/clocksource/clksrc-of.c | 35 | ||||
| -rw-r--r-- | include/asm-generic/vmlinux.lds.h | 9 | ||||
| -rw-r--r-- | include/linux/clocksource.h | 9 | 
5 files changed, 57 insertions, 0 deletions
diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig index 7fdcbd3f4da..a32b7a9c65d 100644 --- a/drivers/clocksource/Kconfig +++ b/drivers/clocksource/Kconfig @@ -1,3 +1,6 @@ +config CLKSRC_OF +	bool +  config CLKSRC_I8253  	bool diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile index f93453d0167..a33f7924021 100644 --- a/drivers/clocksource/Makefile +++ b/drivers/clocksource/Makefile @@ -1,3 +1,4 @@ +obj-$(CONFIG_CLKSRC_OF)	+= clksrc-of.o  obj-$(CONFIG_ATMEL_TCB_CLKSRC)	+= tcb_clksrc.o  obj-$(CONFIG_X86_CYCLONE_TIMER)	+= cyclone.o  obj-$(CONFIG_X86_PM_TIMER)	+= acpi_pm.o diff --git a/drivers/clocksource/clksrc-of.c b/drivers/clocksource/clksrc-of.c new file mode 100644 index 00000000000..bdabdaa8d00 --- /dev/null +++ b/drivers/clocksource/clksrc-of.c @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/init.h> +#include <linux/of.h> + +extern struct of_device_id __clksrc_of_table[]; + +static const struct of_device_id __clksrc_of_table_sentinel +	__used __section(__clksrc_of_table_end); + +void __init clocksource_of_init(void) +{ +	struct device_node *np; +	const struct of_device_id *match; +	void (*init_func)(void); + +	for_each_matching_node_and_match(np, __clksrc_of_table, &match) { +		init_func = match->data; +		init_func(); +	} +} diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index d1ea7ce0b4c..1e744c5a0ff 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -149,6 +149,14 @@  #define TRACE_SYSCALLS()  #endif +#ifdef CONFIG_CLKSRC_OF +#define CLKSRC_OF_TABLES() . = ALIGN(8);				\ +			   VMLINUX_SYMBOL(__clksrc_of_table) = .;	\ +			   *(__clksrc_of_table)				\ +			   *(__clksrc_of_table_end) +#else +#define CLKSRC_OF_TABLES() +#endif  #define KERNEL_DTB()							\  	STRUCT_ALIGN();							\ @@ -493,6 +501,7 @@  	DEV_DISCARD(init.rodata)					\  	CPU_DISCARD(init.rodata)					\  	MEM_DISCARD(init.rodata)					\ +	CLKSRC_OF_TABLES()						\  	KERNEL_DTB()  #define INIT_TEXT							\ diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index 4dceaf8ae15..7944f14ea94 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h @@ -332,4 +332,13 @@ extern int clocksource_mmio_init(void __iomem *, const char *,  extern int clocksource_i8253_init(void); +#ifdef CONFIG_CLKSRC_OF +extern void clocksource_of_init(void); + +#define CLOCKSOURCE_OF_DECLARE(name, compat, fn)			\ +	static const struct of_device_id __clksrc_of_table_##name	\ +		__used __section(__clksrc_of_table)			\ +		 = { .compatible = compat, .data = fn }; +#endif +  #endif /* _LINUX_CLOCKSOURCE_H */  |